]> git.ipfire.org Git - ipfire-2.x.git/commitdiff
Imported linux-2.6.27.39 suse/xen patches.
authorArne Fitzenreiter <arne_f@ipfire.org>
Mon, 16 Nov 2009 19:54:01 +0000 (20:54 +0100)
committerArne Fitzenreiter <arne_f@ipfire.org>
Mon, 16 Nov 2009 19:54:01 +0000 (20:54 +0100)
Enabled Xen-Kernel/Images build.

1876 files changed:
make.sh
src/patches/suse-2.6.27.31/patches.apparmor/add-path_permission.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-2.6.25.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-audit.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-intree.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-lsm.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-main.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-misc.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-module_interface.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-network.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-ptrace-2.6.27.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/apparmor-rlimits.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path_oops_fix.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/do_path_lookup-nameidata.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/file-handle-ops.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fix-complain.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fix-deleted-leak.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fix-security-param.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fix-vfs_rmdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fork-tracking.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-reintro-ATTR_FILE.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-restore-ia_file.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/fsetattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/remove_suid.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-create.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-getxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-link.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-listxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-mkdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-mknod.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-readlink.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-removexattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-rename.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-rmdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-setattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-setxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-symlink.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-unlink.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/security-xattr-file.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/sysctl-pathname.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/unambiguous-__d_path.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-getxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-link.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-listxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-mkdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-notify_change.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-removexattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-rename.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-rmdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-setxattr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-symlink.diff [deleted file]
src/patches/suse-2.6.27.31/patches.apparmor/vfs-unlink.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/ia64-node_mem_map-node_start_pfn.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/ppc-axon-missing-msi-workaround-5.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/ppc-dynamic-reconfiguration.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/ppc-vmcoreinfo.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-04-06-cio-sac-update.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-07-01-zfcp-port-failed-message.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-07-02-zfcp-unchained-fsf.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-07-03-topology-fix.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-08-01-cio-fix-mp-mode.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-08-02-zfcp-gpn-align-fix.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-08-03-iucv-cpu-hotremove.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-08-04-compat-sigaltstack.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-09-04-topology.diff [deleted file]
src/patches/suse-2.6.27.31/patches.arch/s390-15-09-idle-accounting.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc269-fix-vmaster [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-change-fcoe_sw-sg_tablesi.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-check-return-for-fc_set_m.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-frame-length-validati.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-incorrect-use-of-struct-module.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-improved-load-balancing-i.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-logoff-of-the-fabric-when.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-remove-warn_on-in-fc_set.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/fcoe-user_mfs-is-never-used.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-add-fc_disc-c-locking-co.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-check-for-err-when-recv-state-is-incorrect.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-ensure-correct-device_pu.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-handle-rrq-exch-timeout.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_lport-c-locki.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_rport-c-locki.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-make-fc_disc-inline-with.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-make-rscn-parsing-more-r.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-make-sure-we-access-the.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-pass-lport-in-exch_mgr_r.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-set-the-release-function.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-comment-for-orde.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-libfc-fcoe-modul.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-use-an-operations-struct.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc-when-rport-goes-away-re.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc_locking.diff [deleted file]
src/patches/suse-2.6.27.31/patches.drivers/libfc_rport.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/altstack-avoid-copying-stack_t-as-a-structure-to-userspace [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/b43legacy-fix-led_device_naming.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ext2_mtime_update_on_rename.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ext3_false_EIO_fix.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ia64-sparse-fixes.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_partition_id.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_watchlist.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-3945_led_device_naming.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-led_device_naming.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/kdb-kdump.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/kdb-oops-panic.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/kdb-read-CR.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/kdump-x86-sparsemem.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/kvm-vmx-dont-allow-uninhibited-access-to-EFER-on-i386 [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/make-note_interrupt-fast.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/nfs-acl-caching.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/ocfs2-initialize-the-cluster-we-re-writing-to.patch [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/proc-scsi-scsi-fix.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/rt2x00-fix-led_device_naming.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/sd_liberal_28_sense_invalid.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/taskstats-alignment [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/udf-last_block_fix.patch [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_memprotect.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_partition.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_reserve_page.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_watchlist.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-bios_common.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-efi_bios.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-sn_region_size.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-sysfs.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-xp-change_memprotect.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-xpc-get_sn_info.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_create_gru_mq_uv.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_get_part_rsvd_page.diff [deleted file]
src/patches/suse-2.6.27.31/patches.fixes/uv_setup_irq.diff [deleted file]
src/patches/suse-2.6.27.31/patches.kernel.org/ipmi-section-conflict.diff [deleted file]
src/patches/suse-2.6.27.31/patches.kernel.org/psmouse-section-conflict.diff [deleted file]
src/patches/suse-2.6.27.31/patches.rpmify/cloneconfig.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/apm_setup_UP.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/crasher-26.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/file-capabilities-add-file_caps-switch.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/file-capabilities-disable-by-default.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/fs-knows-MAY_APPEND.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/fs-may_iops.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/genksyms-add-override-flag.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/genksyms-override.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/genksyms-reference.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/kdb-resolve-uv-conflict.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ai.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/nfs4acl-common.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ext3.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/nfsacl-client-cache-CHECK.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/novfs-map-drives-correctly.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/novfs-merge-changes.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/panic-on-io-nmi.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/parser-match_string.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/raw_device_max_minors_param.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-add-reiserfs_error.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-buffer-info-for-balance.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-cleanup-path-funcs.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-consistent-messages.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-eliminate-per-super-xattr-lock.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-journaled-xattrs.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-kill-xattr-readdir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-make-per-inode-xattr-locking-more-fine-grained.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rearrange-journal-abort.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs-warning.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_info.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_panic.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-i_has_xattr_dir.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-link-detection.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-._.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_._.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_bh.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_inode.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_sb.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_tb.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-selinux.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-buffer-info.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-xattr-internal-file-lookups-opens.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-strip-whitespace.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-generic-xattr-handlers.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-reiserfs_error.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/s390-Kerntypes.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/s390-System.map.diff [deleted file]
src/patches/suse-2.6.27.31/patches.suse/usb_correct_config_ti_04b3_4543.diff [deleted file]
src/patches/suse-2.6.27.31/patches.trace/ftrace-framepointer.diff [deleted file]
src/patches/suse-2.6.27.31/patches.trace/s390-syscall-get-nr.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-i386.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86_64.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-common.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-include-xen-interface.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-arch.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-drivers.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-kconfig.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-panic-on-io-nmi.diff [deleted file]
src/patches/suse-2.6.27.31/patches.xen/xen3-uv_setup_irq.diff [deleted file]
src/patches/suse-2.6.27.39/arch-symbols [moved from src/patches/suse-2.6.27.31/arch-symbols with 100% similarity]
src/patches/suse-2.6.27.39/guards [moved from src/patches/suse-2.6.27.31/guards with 100% similarity]
src/patches/suse-2.6.27.39/patches.apparmor/add-security_path_permission [moved from src/patches/suse-2.6.27.31/patches.apparmor/add-security_path_permission with 100% similarity]
src/patches/suse-2.6.27.39/patches.apparmor/apparmor-path_permission [moved from src/patches/suse-2.6.27.31/patches.apparmor/apparmor-path_permission with 100% similarity]
src/patches/suse-2.6.27.39/patches.apparmor/export-security_inode_permission-for-aufs [moved from src/patches/suse-2.6.27.31/patches.apparmor/export-security_inode_permission-for-aufs with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0000-ACPI-video-Ignore-devices-not-present.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0000-ACPI-video-Ignore-devices-not-present.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0001-Check-for-ACPI-backlight-support.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0001-Check-for-ACPI-backlight-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0002-Acer-WMI-fingers-off-backlight-video.ko.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0002-Acer-WMI-fingers-off-backlight-video.ko.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0003-Asus-acpi-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0003-Asus-acpi-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0004-Compal-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0004-Compal-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0005-eeepc-laptop-fingers-off.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0005-eeepc-laptop-fingers-off.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0006-fujitsu-laptop-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0006-fujitsu-laptop-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0007-msi-laptop-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0007-msi-laptop-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0008-sony-laptop-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0008-sony-laptop-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/0009-thinkpad_acpi-fingers-off-backlight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/0009-thinkpad_acpi-fingers-off-backlight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-bay-remove-from-makefile [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-bay-remove-from-makefile with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-bay-remove-useless-code.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-bay-remove-useless-code.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-Fix-duplicate-notification-handler-register.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-Fix-duplicate-notification-handler-register.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-_LCK-support-for-dock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-_LCK-support-for-dock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-add-type-sysfs-file-for-dock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-add-type-sysfs-file-for-dock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-don-t-eval-_sta-on-every-show_docked-sysfs-read.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-don-t-eval-_sta-on-every-show_docked-sysfs-read.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-fix-eject-request-process.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-fix-eject-request-process.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-fix-for-bay-in-a-dock-station.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-fix-for-bay-in-a-dock-station.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-fix-hotplug-race.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-fix-hotplug-race.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-introduce-.uevent-for-devices-in-dock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-introduce-.uevent-for-devices-in-dock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-dock-makeing-dock-driver-supports-bay-and-battery-hotplug.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-dock-makeing-dock-driver-supports-bay-and-battery-hotplug.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-export-hotplug_execute [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-export-hotplug_execute with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi-libata-hotplug-to-align-with-dock-driver.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi-libata-hotplug-to-align-with-dock-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_behave_uniquely_based_on_processor_declaration.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_behave_uniquely_based_on_processor_declaration.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_disambiguate_processor_declaration_type.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_disambiguate_processor_declaration_type.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_ec_provide_non_interrupt_mode_boot_param.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_ec_provide_non_interrupt_mode_boot_param.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_processor_cleanups.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_processor_cleanups.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_srat-pxm-rev-ia64.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_srat-pxm-rev-ia64.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_srat-pxm-rev-store.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_srat-pxm-rev-store.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_srat-pxm-rev-x86-64.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_srat-pxm-rev-x86-64.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_thermal_passive_blacklist.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_thermal_passive_blacklist.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_thinkpad_introduce_acpi_root_table_boot_param.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_thinkpad_introduce_acpi_root_table_boot_param.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_thinkpad_introduce_acpica_rsdt_global_variable.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_thinkpad_introduce_acpica_rsdt_global_variable.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_thinkpad_remove_R40e_c-state_blacklist.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_thinkpad_remove_R40e_c-state_blacklist.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_video_thinkpad_exclude_IGD_devices.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_video_thinkpad_exclude_IGD_devices.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/acpi_x2APIC_madt_enhancements.patch [moved from src/patches/suse-2.6.27.31/patches.arch/acpi_x2APIC_madt_enhancements.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix_1.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/bug-535380-x86-change-some-messages-to-debug.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/check-for-acpi-resource-conflicts-in-hwmon-drivers.patch [moved from src/patches/suse-2.6.27.31/patches.arch/check-for-acpi-resource-conflicts-in-hwmon-drivers.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/compat-sys-swapcontext [moved from src/patches/suse-2.6.27.31/patches.arch/compat-sys-swapcontext with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/disable-apic-error [moved from src/patches/suse-2.6.27.31/patches.arch/disable-apic-error with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-cpu_disable-fix [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-cpu_disable-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-fix-csum_ipv6_magic.patch [new file with mode: 0755]
src/patches/suse-2.6.27.39/patches.arch/ia64-page-migration [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-page-migration with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-page-migration.fix [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-page-migration.fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-rwlocks-enable-interrupts [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-rwlocks-enable-interrupts with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-smp_flush_tlb_mm-IPI-fix [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-smp_flush_tlb_mm-IPI-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-sn-BTE_MAX_XFER [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-sn-BTE_MAX_XFER with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-sn-fix-pci-attribute-propagation-bug.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-sn-fix-pci-attribute-propagation-bug.patch with 98% similarity]
src/patches/suse-2.6.27.39/patches.arch/ia64-sn-specific-version-of-dma_get_required_mask [moved from src/patches/suse-2.6.27.31/patches.arch/ia64-sn-specific-version-of-dma_get_required_mask with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/mm-avoid-bad-page-on-lru [moved from src/patches/suse-2.6.27.31/patches.arch/mm-avoid-bad-page-on-lru with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/powerpc-pseries-cmo-unused-page-hinting.patch [moved from src/patches/suse-2.6.27.31/patches.arch/powerpc-pseries-cmo-unused-page-hinting.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-altivec-VSX-ctxswitch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-altivec-VSX-ctxswitch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-cell-gdb-watchpoints.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-cell-gdb-watchpoints.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-clock_gettime-nanoseconds.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-clock_gettime-nanoseconds.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-efika-bestcomm-ata-dma.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-efika-bestcomm-ata-dma.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-efika-mpc52xx-ac97.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-efika-mpc52xx-ac97.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-efika-psc-console-autodetection.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-efika-psc-console-autodetection.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-fix-ppc-insn-emulation_mr.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-fix-ppc-insn-emulation_mr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ipic-suspend-without-83xx-fix [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ipic-suspend-without-83xx-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-memoryless-nodes.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-memoryless-nodes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-of-irq-map.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-of-irq-map.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-oprofile-spu-mutex-locking.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-oprofile-spu-mutex-locking.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-oprofile-spu.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-oprofile-spu.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-optimize-sync.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-optimize-sync.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pcibios_allocate_bus_resources.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pcibios_allocate_bus_resources.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pegasos-console-autodetection.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pegasos-console-autodetection.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-powerpc-debug-pci-hotplug.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-powerpc-debug-pci-hotplug.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-powerpc-fix-pci-unmap-io.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-powerpc-fix-pci-unmap-io.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-prom-nodisplay.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-prom-nodisplay.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ps3-add-passthrough-support-for-non-audio-streams.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ps3-add-passthrough-support-for-non-audio-streams.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ps3-add-ps3av-audio-mute-analog.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ps3-add-ps3av-audio-mute-analog.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ps3-add-support-for-SPDIF-HDMI-passthrough.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ps3-add-support-for-SPDIF-HDMI-passthrough.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ps3-introduce-ps3_gpu_mutex.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ps3-introduce-ps3_gpu_mutex.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-ps3-ps3vram-mtd.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-ps3-ps3vram-mtd.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-bsr-4k.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-bsr-4k.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-bsr-multinode.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-bsr-multinode.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-cmm-pagecounter.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-cmm-pagecounter.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-cpu-migrate.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-cpu-migrate.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-migration_hang_fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-migration_hang_fix.patch with 86% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries_pfn-mem-rm.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries_pfn-mem-rm.patch with 98% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-pseries_remove_lmb-PAGE_SHIFTT.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries_remove_lmb-PAGE_SHIFTT.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-select [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-select with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-01-use-inc_nlink.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-01-use-inc_nlink.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-03-sputrace-Only-enable-logging-on-open.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-04-sputrace-Don-t-block-until-the-read.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-04-sputrace-Don-t-block-until-the-read.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-05-Use-state_mutex-for-switch_log-lockin.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-05-Use-state_mutex-for-switch_log-lockin.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-06-Don-t-require-full-buffer-in-switch_l.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-06-Don-t-require-full-buffer-in-switch_l.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-07-Don-t-spu_acquire_saved-unnecessarily.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-07-Don-t-spu_acquire_saved-unnecessarily.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-08-Use-kmalloc-rather-than-kzalloc-for-s.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-08-Use-kmalloc-rather-than-kzalloc-for-s.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-09-Improve-search-of-node-for-contexts-w.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-09-Improve-search-of-node-for-contexts-w.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-spufs-10-Explain-conditional-decrement-of-aff_.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-spufs-10-Explain-conditional-decrement-of-aff_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-syscall-xer.so.1.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-syscall-xer.so.1.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-valid-hugepage-size-hugetlb_get_unmapped_area.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-valid-hugepage-size-hugetlb_get_unmapped_area.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-vio-modalias.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-vio-modalias.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc-xics-EOI-unmapped-irqs.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc-xics-EOI-unmapped-irqs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc32-fix-ptrace-compat-wrapper-for-fpu-register-access [moved from src/patches/suse-2.6.27.31/patches.arch/ppc32-fix-ptrace-compat-wrapper-for-fpu-register-access with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc64-eeh-msix-irq [moved from src/patches/suse-2.6.27.31/patches.arch/ppc64-eeh-msix-irq with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc64-reduce-hashtable-size-for-64k-pages.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc64-reduce-hashtable-size-for-64k-pages.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/ppc64-xmon-dmesg-printing.patch [moved from src/patches/suse-2.6.27.31/patches.arch/ppc64-xmon-dmesg-printing.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/pseries-set-error_state-correctly-in-eeh_report_reset [moved from src/patches/suse-2.6.27.31/patches.arch/pseries-set-error_state-correctly-in-eeh_report_reset with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-02-dcss-64-v2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-02-dcss-64-v2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-04-fcpperf-1.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-1.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-04-fcpperf-2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-04-fcpperf-3-v2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-3-v2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-04-fcpperf-4-v2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-04-fcpperf-4-v2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-05-kmsg-v3.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-05-kmsg-v3.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-01-06-zfcp-cleanup-v2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-01-06-zfcp-cleanup-v2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-01-xpram.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-01-xpram.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-03-zfcp.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-03-zfcp.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-04-qeth-mac.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-04-qeth-mac.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-05-qeth-recovery.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-05-qeth-recovery.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-06-qeth-offset.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-06-qeth-offset.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-07-qeth-ipv6check.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-07-qeth-ipv6check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-08-qeth-panic.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-08-qeth-panic.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-09-tape-lock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-09-tape-lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-02-10-zfcp-scan-online.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-02-10-zfcp-scan-online.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-01-stp-init.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-01-stp-init.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-02-setup_memory.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-02-setup_memory.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-03-dasd_unsolicited_interrupt.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-03-dasd_unsolicited_interrupt.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-04-qdio_multicast_performance.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-04-qdio_multicast_performance.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-05-dasd-block-uevent.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-05-dasd-block-uevent.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-06-zfcp-hexdump.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-06-zfcp-hexdump.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-07-qeth_hsi_mcl_string.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-07-qeth_hsi_mcl_string.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-08-zfcp-abort-race.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-08-zfcp-abort-race.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-03-09-zfcp-oops-during-target-scan.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-03-09-zfcp-oops-during-target-scan.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-01-qdio_prevent_double_shutdown.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-01-qdio_prevent_double_shutdown.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-02-qdio-osa-port-count.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-02-qdio-osa-port-count.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-03-kmsg.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-03-kmsg.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-04-dasd_fatal_error_log_sense.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-04-dasd_fatal_error_log_sense.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-07-als.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-07-als.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-08-cio-ungroup-race-fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-08-cio-ungroup-race-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-04-09-zfcp-host-busy-count-fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-04-09-zfcp-host-busy-count-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-01-zfcp-message-linebreak.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-01-zfcp-message-linebreak.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-02-zfcp-invalid-non-null-return.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-02-zfcp-invalid-non-null-return.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-03-zfcp-wka-port.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-03-zfcp-wka-port.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-04-fix_rport_status_check.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-04-fix_rport_status_check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-05-stp-etr-stop-machine.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-05-stp-etr-stop-machine.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-06-stp-etr-mutex.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-06-stp-etr-mutex.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-07-generic-ipi.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-07-generic-ipi.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-08-topology.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-08-topology.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-05-09-cleanup-of-portopen-requests.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-05-09-cleanup-of-portopen-requests.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-01-qeth-ext-src-mac-addr.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-01-qeth-ext-src-mac-addr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-02-qeth-layercrash.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-02-qeth-layercrash.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-03-dasd_sim_sense_condition.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-03-dasd_sim_sense_condition.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-04-qdio_ssqd_memcpy.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-04-qdio_ssqd_memcpy.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-05-qdio_s390dbf.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-05-qdio_s390dbf.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-06-qdio_inbound_ack.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-06-qdio_inbound_ack.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-06-07-cio-attach_detach.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-06-07-cio-attach_detach.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-07-04-dasd-failfast.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-07-04-dasd-failfast.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-08-05-af_iucv-msgpeek-fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-08-05-af_iucv-msgpeek-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-08-06-personality.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-08-06-personality.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-08-07-compat_wrappers.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-08-07-compat_wrappers.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-08-08-add_qdio_utilization.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-08-08-add_qdio_utilization.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-08-09-switch-amode-off.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-08-09-switch-amode-off.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-09-01-cio_disable_notoper.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-09-01-cio_disable_notoper.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-09-02-sclp-handle-empty-evbufs.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-09-02-sclp-handle-empty-evbufs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-09-03-sclp-mem.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-09-03-sclp-mem.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-01-airq_fix_array_boundary.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-01-airq_fix_array_boundary.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-02-zfcp_wait_sbal.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-02-zfcp_wait_sbal.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-03-zfcp_els_thread_context.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-03-zfcp_els_thread_context.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-04-zfcp_change_adisc_processing.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-04-zfcp_change_adisc_processing.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-05-zfcp_remote_port_handling.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-05-zfcp_remote_port_handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-06-zfcp_slave_destroy.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-06-zfcp_slave_destroy.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-07-zfcp_refc_work_inflight.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-07-zfcp_refc_work_inflight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-08-iucv-2ndparm.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-08-iucv-2ndparm.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-09-dasd-fix-timer-add.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-09-dasd-fix-timer-add.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-10-10-ccwgroup_fix_unbind.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-10-10-ccwgroup_fix_unbind.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-01-kernel_ds_pgtable_walk.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-01-kernel_ds_pgtable_walk.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-02-kernel_pfn_valid_uaccess.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-02-kernel_pfn_valid_uaccess.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-03-qeth_recovery_drop_mac.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-03-qeth_recovery_drop_mac.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-04-lcs_hard_sx_rc.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-04-lcs_hard_sx_rc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-05-qdio_error_reporting_hs.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-05-qdio_error_reporting_hs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-06-qdio_tiq_list_lock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-06-qdio_tiq_list_lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-07-qdio_kill_tasklets.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-07-qdio_kill_tasklets.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-08-qdio_free_shutdown.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-08-qdio_free_shutdown.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-09-qdio_ack_newest_and_seperate_polling.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-09-qdio_ack_newest_and_seperate_polling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-10-zfcp_nameserver_state_on_adapter_offline.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-10-zfcp_nameserver_state_on_adapter_offline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-11-zfcp_req_free.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-11-zfcp_req_free.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-12-zfcp_scsi_scan.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-12-zfcp_scsi_scan.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-13-zfcp_avoid_semaphore_race.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-13-zfcp_avoid_semaphore_race.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-14-zfcp_unit_remove.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-14-zfcp_unit_remove.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-15-kernel_task_size.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-15-kernel_task_size.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-11-16-qeth_siga_error_handling.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-11-16-qeth_siga_error_handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-01-cio-reprobe-deadlock-fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-01-cio-reprobe-deadlock-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-02-zfcp_scsi_queue_erp_deadlock.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-02-zfcp_scsi_queue_erp_deadlock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-03-zfcp_adjust_test_link_pre_reqs.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-03-zfcp_adjust_test_link_pre_reqs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-04-zfcp_rport_handling_on_error_inject.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-04-zfcp_rport_handling_on_error_inject.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-05-cio_introduce_ccw_device_boxed_notify.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-05-cio_introduce_ccw_device_boxed_notify.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-06-zfcp_actcli_error.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-06-zfcp_actcli_error.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-07-ctcm_remove_crash.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-07-ctcm_remove_crash.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-08-kernel_appldata_vtimer.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-08-kernel_appldata_vtimer.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-09-qeth_lan_offline.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-09-qeth_lan_offline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-10-kernel_appldata_mutex.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-10-kernel_appldata_mutex.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-11-zfcp_fcp_port_handling.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-11-zfcp_fcp_port_handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-12-zfcp_wka_wait_refcount.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-12-zfcp_wka_wait_refcount.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-13-zfcp_deadlock_port_scan_ERP.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-13-zfcp_deadlock_port_scan_ERP.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-14-zfcp_port_reference_counting.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-14-zfcp_port_reference_counting.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-15-zfcp_abort_handler_for_completions_in_progress.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-15-zfcp_abort_handler_for_completions_in_progress.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-12-16-zfcp_reference_counting_for_cfdc_requests.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-12-16-zfcp_reference_counting_for_cfdc_requests.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-13-01-af_iucv-fix-race-msgpending.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-13-01-af_iucv-fix-race-msgpending.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-13-02-zfcp_changed_port_did.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-13-02-zfcp_changed_port_did.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-13-03-qeth_checksum.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-13-03-qeth_checksum.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-13-04-qeth-port-isolation.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-13-04-qeth-port-isolation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-14-01-af_iucv-connect-free-path.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-14-01-af_iucv-connect-free-path.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-01-zfcp-erp-escalation.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-01-zfcp-erp-escalation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-02-phys-port-close.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-02-phys-port-close.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-03-zfcp-recover-stall.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-03-zfcp-recover-stall.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-04-zfcp-unchained-sbals.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-04-zfcp-unchained-sbals.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-05-zfcp-erp-notify.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-05-zfcp-erp-notify.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-06-zfcp-recovery-wait.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-06-zfcp-recovery-wait.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-07-zfcp-fc-rport.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-07-zfcp-fc-rport.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-08-zfcp-fc-wka-opening.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-08-zfcp-fc-wka-opening.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-10-zcrypt-hrtimer-scheduling.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-10-zcrypt-hrtimer-scheduling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-11-cio-vary-unregister.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-11-cio-vary-unregister.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-15-12-zfcp-wka-work.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-15-12-zfcp-wka-work.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-16-01-zfcp-link-test.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-16-01-zfcp-link-test.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-01-framepointer.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-02-schedframepointer.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-03-qdio_inline_qdio_perf_stat_inc.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-04-qdio_move_adapter_interrupt_tasklet_code.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-05-qdio_extract_all_primed_SBALs_at_once.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-07-qdio_sanitize_do_QDIO_sanity_checks.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-08-qdio_merge_AI_tasklet_into_interrupt_handler.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-09-module-plt.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-10-cio-scsw-helper.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-11-csum-fold.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-12-get_clock_monotonic.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-13-dasd-goodcase-perf.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-14-zfcp-optimize-qdio_account.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-15-zfcp-move-debug-data.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-16-zfcp-scsi-trace-only-matching-debug-data.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-17-zfcp-fsfhba-trace-only-matching-debug-data.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-18-01-cio-retries.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-18-02-cio-race.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-18-03-iucv-query-maxconn.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-add-FREE_PTE_NR [moved from src/patches/suse-2.6.27.31/patches.arch/s390-add-FREE_PTE_NR with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-dasd-eckd_write_r0.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/s390-disable-etr-stp [moved from src/patches/suse-2.6.27.31/patches.arch/s390-disable-etr-stp with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-personality-mask.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-personality-mask.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-symmetrix-ioctl.patch [moved from src/patches/suse-2.6.27.31/patches.arch/s390-symmetrix-ioctl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/s390-zfcp-synchronize-scsi-register [moved from src/patches/suse-2.6.27.31/patches.arch/s390-zfcp-synchronize-scsi-register with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/thinkpad_acpi-hotkey-notify-fix [moved from src/patches/suse-2.6.27.31/patches.arch/thinkpad_acpi-hotkey-notify-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/thinkpad_fingers_off_backlight_igd.patch [moved from src/patches/suse-2.6.27.31/patches.arch/thinkpad_fingers_off_backlight_igd.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_01_0f4896665a02b465ddca59a560983b24ec28c64b [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_01_0f4896665a02b465ddca59a560983b24ec28c64b with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_01_of_41_e61d98d8dad0048619bb138b0ff996422ffae53b [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_01_of_41_e61d98d8dad0048619bb138b0ff996422ffae53b with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_02_228324076234ca6a8cd34be89be78022773459f1 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_02_228324076234ca6a8cd34be89be78022773459f1 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_02_of_41_c42d9f32443397aed2d37d37df161392e6a5862f [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_02_of_41_c42d9f32443397aed2d37d37df161392e6a5862f with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_03_3f1fdb3673bb5638fa94186dc391cbc4879590bc [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_03_3f1fdb3673bb5638fa94186dc391cbc4879590bc with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_03_of_41_1886e8a90a580f3ad343f2065c84c1b9e1dac9ef [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_03_of_41_1886e8a90a580f3ad343f2065c84c1b9e1dac9ef with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_04_f12c73e7fa7ebf9ad6defee2c4fb2664e743e970 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_04_f12c73e7fa7ebf9ad6defee2c4fb2664e743e970 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_04_of_41_aaa9d1dd63bf89b62f4ea9f46de376ab1a3fbc6c [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_04_of_41_aaa9d1dd63bf89b62f4ea9f46de376ab1a3fbc6c with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_05_7be42004065ce4df193aeef5befd26805267d0d9 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_05_7be42004065ce4df193aeef5befd26805267d0d9 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_06_caf43bf7c6a55e89b6df5179df434d67e24aa32e [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_06_caf43bf7c6a55e89b6df5179df434d67e24aa32e with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_06_of_41_ad3ad3f6a2caebf56869b83b69e23eb9fa5e0ab6 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_06_of_41_ad3ad3f6a2caebf56869b83b69e23eb9fa5e0ab6 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_07_511d9d34183662aada3890883e860b151d707e22 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_07_511d9d34183662aada3890883e860b151d707e22 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_07_of_41_cf1337f0447e5be8e66daa944f0ea3bcac2b6179 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_07_of_41_cf1337f0447e5be8e66daa944f0ea3bcac2b6179 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_08_of_41_fe962e90cb17a8426e144dee970e77ed789d98ee [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_08_of_41_fe962e90cb17a8426e144dee970e77ed789d98ee with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_09_94a8c3c2437c8946f1b6c8e0b2c560a7db8ed3c6 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_09_94a8c3c2437c8946f1b6c8e0b2c560a7db8ed3c6 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_09_of_41_2ae21010694e56461a63bfc80e960090ce0a5ed9 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_09_of_41_2ae21010694e56461a63bfc80e960090ce0a5ed9 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_10_of_41_b6fcb33ad6c05f152a672f7c96c1fab006527b80 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_10_of_41_b6fcb33ad6c05f152a672f7c96c1fab006527b80 with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_11_of_41_72b1e22dfcad1daca6906148fd956ffe404bb0bc [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_11_of_41_72b1e22dfcad1daca6906148fd956ffe404bb0bc with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_12_of_41_d94d93ca5cc36cd78c532def62772c98fe8ba5d7 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_12_of_41_d94d93ca5cc36cd78c532def62772c98fe8ba5d7 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_13_of_41_4dc2f96cacd1e74c688f94348a3bfd0a980817d5 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_13_of_41_4dc2f96cacd1e74c688f94348a3bfd0a980817d5 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_14_of_41_0c81c746f9bdbfaafe64322d540c8b7b59c27314 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_14_of_41_0c81c746f9bdbfaafe64322d540c8b7b59c27314 with 73% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_15_of_41_2d7a66d02e11af9ab8e16c76d22767e622b4e3d7 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_15_of_41_2d7a66d02e11af9ab8e16c76d22767e622b4e3d7 with 89% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_16_of_41_1b374e4d6f8b3eb2fcd034fcc24ea8ba1dfde7aa [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_16_of_41_1b374e4d6f8b3eb2fcd034fcc24ea8ba1dfde7aa with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_17_of_41_32e1d0a0651004f5fe47f85a2a5c725ad579a90c [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_17_of_41_32e1d0a0651004f5fe47f85a2a5c725ad579a90c with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_18_of_41_1cb11583a6c4ceda7426eb36f7bf0419da8dfbc2 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_18_of_41_1cb11583a6c4ceda7426eb36f7bf0419da8dfbc2 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_19_of_41_13c88fb58d0112d47f7839f24a755715c6218822 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_19_of_41_13c88fb58d0112d47f7839f24a755715c6218822 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_20_of_41_cff73a6ffaed726780b001937d2a42efde553922 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_20_of_41_cff73a6ffaed726780b001937d2a42efde553922 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_21_of_41_12a67cf6851871ca8df42025c94f140c303d0f7f [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_21_of_41_12a67cf6851871ca8df42025c94f140c303d0f7f with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_22_of_41_5c520a6724e912a7e6153b7597192edad6752750 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_22_of_41_5c520a6724e912a7e6153b7597192edad6752750 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_23_of_41_89027d35aa5b8f45ce0f7fa0911db85b46563da0 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_23_of_41_89027d35aa5b8f45ce0f7fa0911db85b46563da0 with 99% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_24_of_41_75c46fa61bc5b4ccd20a168ff325c58771248fcd [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_24_of_41_75c46fa61bc5b4ccd20a168ff325c58771248fcd with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_25_1_of_41_4c9961d56ec20c27ec5d02e49fd7427748312741 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_25_1_of_41_4c9961d56ec20c27ec5d02e49fd7427748312741 with 97% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_25_2_of_41_c535b6a1a685eb23f96e2c221777d6c1e05080d5 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_25_2_of_41_c535b6a1a685eb23f96e2c221777d6c1e05080d5 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_25_of_41_6e1cb38a2aef7680975e71f23de187859ee8b158 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_25_of_41_6e1cb38a2aef7680975e71f23de187859ee8b158 with 95% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_26_of_41_2d9579a124d746a3e0e0ba45e57d80800ee80807 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_26_of_41_2d9579a124d746a3e0e0ba45e57d80800ee80807 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_27_of_41_9fa8c481b55e80edd8c637573f87853bb6b600f5 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_27_of_41_9fa8c481b55e80edd8c637573f87853bb6b600f5 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_28_1_of_41_f910a9dc7c865896815e2a95fe33363e9522f277 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_28_1_of_41_f910a9dc7c865896815e2a95fe33363e9522f277 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_29_of_41_277d1f5846d84e16760131a93b7a67ebfa8eded4 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_29_of_41_277d1f5846d84e16760131a93b7a67ebfa8eded4 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_30_of_41_ad66dd340f561bdde2285992314d9e4fd9b6191e [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_30_of_41_ad66dd340f561bdde2285992314d9e4fd9b6191e with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_34_of_41_1b9b89e7f163336ad84200b66a17284dbf26aced [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_34_of_41_1b9b89e7f163336ad84200b66a17284dbf26aced with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_35_of_41_d25ae38b7e005af03843833bbd811ffe8c5f8cb4 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_35_of_41_d25ae38b7e005af03843833bbd811ffe8c5f8cb4 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_36_of_41_276605dddb74cbf1b77696e32c4a947e42cec52d [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_36_of_41_276605dddb74cbf1b77696e32c4a947e42cec52d with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_40_of_41_bbb65d2d365efe9951290e61678dcf81ec60add4 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_40_of_41_bbb65d2d365efe9951290e61678dcf81ec60add4 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_41_of_41_11c231a962c740b3216eb6565149ae5a7944cba7 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_41_of_41_11c231a962c740b3216eb6565149ae5a7944cba7 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_42_of_41_77322deb4bc676a5ee645444e7ed1a89f854473d [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_42_of_41_77322deb4bc676a5ee645444e7ed1a89f854473d with 81% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_43_of_41_2c72d93f6593f386f5760ca8e7ac7026948c31d7 [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_43_of_41_2c72d93f6593f386f5760ca8e7ac7026948c31d7 with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_x86-mach_apicdef.h-need-to-include-before-smp.h.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_x86-mach_apicdef.h-need-to-include-before-smp.h.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x2APIC_fix_section_mismatch.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x2APIC_fix_section_mismatch.patch with 65% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-acpi-reroute-PCI-interrupt-to-legacy-boot-interrupt.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-acpi-reroute-PCI-interrupt-to-legacy-boot-interrupt.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-add-PCI-IDs-for-devices-that-need-boot-irq-quirk.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-add-PCI-IDs-for-devices-that-need-boot-irq-quirk.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-apic-force-bigsmp-apic-on-IBM-EXA3-4.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-apic-force-bigsmp-apic-on-IBM-EXA3-4.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-call-boot-IRQ-quirks-at-end-of-device-init-and-during-resume.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-call-boot-IRQ-quirks-at-end-of-device-init-and-during-resume.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-disable-AMD-ATI-boot-interrupt-generation.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-disable-AMD-ATI-boot-interrupt-generation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-disable-broadcomm-boot-interrupt-generation.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-disable-broadcomm-boot-interrupt-generation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-disable-intel-boot-interrupt-generation.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-disable-intel-boot-interrupt-generation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-fix-kmap-contig.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-fix-kmap-contig.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-fix-nodac [moved from src/patches/suse-2.6.27.31/patches.arch/x86-fix-nodac with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-hpet-pre-read [moved from src/patches/suse-2.6.27.31/patches.arch/x86-hpet-pre-read with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-introduce-config-option-for-pci-reroute-quirks.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-introduce-config-option-for-pci-reroute-quirks.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-introduce-pci-ioapicreroute-kernel-cmdline.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-introduce-pci-ioapicreroute-kernel-cmdline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-introduce-pci-noioapicquirk-kernel-cmdline.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-introduce-pci-noioapicquirk-kernel-cmdline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-mce-make-polling-timer-interval-per-cpu [moved from src/patches/suse-2.6.27.31/patches.arch/x86-mce-make-polling-timer-interval-per-cpu with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-mce-switch-machine-check-polling-to-per-cpu-timer [moved from src/patches/suse-2.6.27.31/patches.arch/x86-mce-switch-machine-check-polling-to-per-cpu-timer with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-mce-use-round_jiffies-instead-round_jiffies_relative [moved from src/patches/suse-2.6.27.31/patches.arch/x86-mce-use-round_jiffies-instead-round_jiffies_relative with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-mcp51-no-dac [moved from src/patches/suse-2.6.27.31/patches.arch/x86-mcp51-no-dac with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-pageattr-pmd-permission-fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-pageattr-pmd-permission-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-self-ptrace.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86-self-ptrace.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-tracehook [moved from src/patches/suse-2.6.27.31/patches.arch/x86-tracehook with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-01-add-TSC_RELIABLE [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-01-add-TSC_RELIABLE with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-02-add-X86_FEATURE_HYPERVISOR [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-02-add-X86_FEATURE_HYPERVISOR with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-03-detect-from-hypervisor [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-03-detect-from-hypervisor with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-04-use-TSC_RELIABLE [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-04-use-TSC_RELIABLE with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-05-skip-tsc-clocksource [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-05-skip-tsc-clocksource with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-06-fix-vmware_get_tsc [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-06-fix-vmware_get_tsc with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86-vmware-tsc-07-DMI-product-serial-key [moved from src/patches/suse-2.6.27.31/patches.arch/x86-vmware-tsc-07-DMI-product-serial-key with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_64-hpet-64bit-timer.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_64-hpet-64bit-timer.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_64-unwind-annotations [moved from src/patches/suse-2.6.27.31/patches.arch/x86_64-unwind-annotations with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_agpgart-g33-stoeln-fix-2.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_agpgart-g33-stoeln-fix-2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_cpufreq_intel_blacklist.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.arch/x86_fix_llc_shared_map__cpu_llc_id_anomolies.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_fix_llc_shared_map__cpu_llc_id_anomolies.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_intel_cacheinfo_fix.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_intel_cacheinfo_fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_restrict_pci_early_quirks_to_root_bridges.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_restrict_pci_early_quirks_to_root_bridges.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi-uv-scir.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi-uv-scir.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-01-fix-smp_call_function.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-01-fix-smp_call_function.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-02-fix-send_call_func_ip.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-02-fix-send_call_func_ip.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-04-add-for_each_cpu_mask_and.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-04-add-for_each_cpu_mask_and.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-05-update-send_IPI_mask.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-05-update-send_IPI_mask.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-06-optimize-cpumask-in-sched_c.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-06-optimize-cpumask-in-sched_c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_cpus4096-07_pae_compile_fixups.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_cpus4096-07_pae_compile_fixups.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_sgi_uv_early_detect_oem.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_sgi_uv_early_detect_oem.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.arch/x86_uv_early_detect.patch [moved from src/patches/suse-2.6.27.31/patches.arch/x86_uv_early_detect.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0001-IB-ehca-Fix-problem-with-max-number-of-QPs-and-CQs.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0001-IB-ehca-Fix-problem-with-max-number-of-QPs-and-CQs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0001-Staging-add-TAINT_CRAP-for-all-drivers-staging-code.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0001-Staging-add-TAINT_CRAP-for-all-drivers-staging-code.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0002-Staging-add-TAINT_CRAP-flag-to-drivers-staging-modu.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0002-Staging-add-TAINT_CRAP-flag-to-drivers-staging-modu.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0003-Staging-add-Kconfig-entries-and-Makefile-infrastruc.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0003-Staging-add-Kconfig-entries-and-Makefile-infrastruc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0004-Staging-add-MAINTAINERS-entry.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0004-Staging-add-MAINTAINERS-entry.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0005-Staging-add-et131x-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0005-Staging-add-et131x-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0006-Staging-add-Alacritech-slicoss-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0006-Staging-add-Alacritech-slicoss-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0007-Staging-add-sxg-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0007-Staging-add-sxg-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0008-Staging-add-me4000-firmware-files.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0008-Staging-add-me4000-firmware-files.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0009-Staging-add-me4000-pci-data-collection-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0009-Staging-add-me4000-pci-data-collection-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0010-Staging-add-the-go7007-video-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0010-Staging-add-the-go7007-video-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0011-Staging-USB-IP-add-common-functions-needed.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0011-Staging-USB-IP-add-common-functions-needed.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0012-Staging-USB-IP-add-client-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0012-Staging-USB-IP-add-client-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0013-Staging-USB-IP-add-host-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0013-Staging-USB-IP-add-host-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0014-Staging-add-w35und-wifi-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0014-Staging-add-w35und-wifi-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0015-Staging-add-wlan-ng-prism2-usb-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0015-Staging-add-wlan-ng-prism2-usb-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0016-Staging-add-echo-cancelation-module.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0016-Staging-add-echo-cancelation-module.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0017-Staging-Fix-gcc-warnings-in-sxg.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0017-Staging-Fix-gcc-warnings-in-sxg.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0018-Staging-go7007-v4l-fixes.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0018-Staging-go7007-v4l-fixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0019-Staging-SLICOSS-lots-of-checkpatch-fixes.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0019-Staging-SLICOSS-lots-of-checkpatch-fixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0020-Staging-SLICOSS-Fix-warnings-due-to-static-usage.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0020-Staging-SLICOSS-Fix-warnings-due-to-static-usage.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0021-Staging-SLICOSS-Fix-remaining-type-names.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0021-Staging-SLICOSS-Fix-remaining-type-names.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0022-Staging-SLICOSS-Call-pci_release_regions-at-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0022-Staging-SLICOSS-Call-pci_release_regions-at-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/0023-Staging-Lindent-sxg.c.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/0023-Staging-Lindent-sxg.c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/Out-of-order-tx-frames-was-causing-several-check-con.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/Out-of-order-tx-frames-was-causing-several-check-con.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/aacraid-24701-update [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-call-_osc-support-during-root-bridge-discovery.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-call-_osc-support-during-root-bridge-discovery.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-change-pci_osc_control_set-to-query-control-bits-first.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-change-pci_osc_control_set-to-query-control-bits-first.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-fix-possible-race-condition-on-_osc-evaluation.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-fix-possible-race-condition-on-_osc-evaluation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-include-missing-acpi.h-file-in-pci-acpi.h.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-include-missing-acpi.h-file-in-pci-acpi.h.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-pci-extended-config-_osc-support-called-when-root-bridge-added.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-pci-extended-config-_osc-support-called-when-root-bridge-added.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-pci-msi-_osc-support-capabilities-called-when-root-bridge-added.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-pci-msi-_osc-support-capabilities-called-when-root-bridge-added.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-pcie-aer-_osc-support-capabilities-called-when-root-bridge-added.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-pcie-aer-_osc-support-capabilities-called-when-root-bridge-added.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-pcie-aspm-_osc-support-capabilities-called-when-root-bridge-added.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-pcie-aspm-_osc-support-capabilities-called-when-root-bridge-added.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/acpi-pci-remove-obsolete-_osc-capability-support-functions.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/acpi-pci-remove-obsolete-_osc-capability-support-functions.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/add-via-chrome9-drm-support.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/add-via-chrome9-drm-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-ad1984-hp-volume-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-ad1984-hp-volume-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-ca0106-capture-no-44khz [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-ca0106-capture-no-44khz with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-ca0106-pm-support [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-ca0106-pm-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-emu10k1-audigy-fixes [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-emu10k1-audigy-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-92hd73x-desktop-fixes [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-92hd73x-desktop-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-ad1882-id-typo-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-ad1882-id-typo-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-add-volume-offset [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-add-volume-offset with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-alc269-fsc-amilo [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-alc269-fsc-amilo with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-analog-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-analog-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-atihdmi-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-atihdmi-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-beep [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-beep with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-beep-dig-switch [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-beep-dig-switch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-beep-null-check-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-beep-null-check-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-dell-92hd73xx-models [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-dell-92hd73xx-models with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-dell-studio-probe-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-dell-studio-probe-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-gateway-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-gateway-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-gateway-fix2 [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-gateway-fix2 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-gateway-t1616-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-gateway-t1616-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-3013-master-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-3013-master-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-dv4-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-dv4-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-dv5-mic-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-dv5-mic-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-dv5-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-dv5-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-dv7-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-dv7-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp-zenith-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp-zenith-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp2230s-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp2230s-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-hp6530b-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-hp6530b-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-idt92hd83-fix-typo [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-idt92hd83-fix-typo with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-intel-d945-ref-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-intel-d945-ref-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-nvidia-hdmi [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-nvidia-hdmi with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-probe-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-probe-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-proc-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-proc-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-proc-gpio-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-proc-gpio-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-realtek-acer-dmic [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-realtek-acer-dmic with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-realtek-alc269-dmic [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-realtek-alc269-dmic with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-realtek-mic-automute-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-realtek-mic-automute-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-realtek-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-realtek-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-seek-for-codec-id [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-seek-for-codec-id with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sigmatel-add-missing-terminators [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sigmatel-add-missing-terminators with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sigmatel-hp-m4-check-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sigmatel-hp-m4-check-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sigmatel-spdif-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sigmatel-spdif-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sigmatel-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sigmatel-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sigmatel-vref-event-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sigmatel-vref-event-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-sony-vaio-vgn-sr19xn-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-sony-vaio-vgn-sr19xn-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-spdif-bits-cache-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-spdif-bits-cache-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-spdif-slave [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-spdif-slave with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-92hd71bxx-gpio-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-92hd71bxx-gpio-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-dell-m4-3-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-dell-m4-3-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-gpio-unsol-resume-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-gpio-unsol-resume-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-hp-detect-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-hp-detect-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-hp-gpio-switch-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-hp-gpio-switch-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-hp-pavilion-quirks [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-hp-pavilion-quirks with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-reduce-volume-scale [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-reduce-volume-scale with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac-yet-more-fixes [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac-yet-more-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac9200-missing-mux-capture [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac9200-missing-mux-capture with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac925x-init-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac925x-init-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-stac92xx-mic-pin-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-stac92xx-mic-pin-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-via-rec-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-via-rec-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-hda-via-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-hda-via-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-ad1884a-mobile-init-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-ad1884a-mobile-init-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc268-mono-output-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc268-mono-output-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc888-coef-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc888-coef-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc888-hp-3stack-auto-mute [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc888-hp-3stack-auto-mute with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc888-hp-4ch-mode [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc888-hp-4ch-mode with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc888-hp-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc888-hp-quirk with 95% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-alc269-lenovo-capture-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-alc269-lenovo-capture-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-analog-updates [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-ati-pos-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-ati-pos-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-codec-bus-intapi-change [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-codec-bus-intapi-change with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-codec-limit-verb-retry [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-codec-limit-verb-retry with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-codec-verb-retry [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-codec-verb-retry with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-forced-codec-slots [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-forced-codec-slots with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-ad1984a-more-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-hp-ad1984a-more-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-ad1984a-more-quirk2 [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-hp-ad1984a-more-quirk2 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-bseries-mute-led-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-more-quirks [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-hp-more-quirks with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-xw-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-hp-xw-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hwptr-stabilize [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-hwptr-stabilize with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-idt92hd8x-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-idt92hd8x-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-intel-cleanup [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-intel-cleanup with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-intelhdmi [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-intelhdmi with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-internal-binary-compat [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-internal-binary-compat with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-own-workq [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-own-workq with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-pb-rs65-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-pb-rs65-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-quirk-ext [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-quirk-ext with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-reboot-notify [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-reduce-click-noise [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-reduce-click-noise with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-robust-codec-probe [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-robust-codec-probe with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-sigmatel-update [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-sigmatel-update with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-sigmatel-update2 [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-sigmatel-update2 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-sigmatel-update3 [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-sigmatel-update3 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-single-cmd-concurrent-access [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-single-cmd-concurrent-access with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-single-cmd-sync-write [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-single-cmd-sync-write with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-snd-array [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-snd-array with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd-hp-fixes [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd73-fixes [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-automic [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-stac-automic with 92% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-automic-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-lo-detect-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-stac-lo-detect-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-shutup-at-free [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-dell-volknob-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-fsc-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac9872-inputsrc-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-sync-verbs [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-sync-verbs with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hp-ad1984a-mobile-mute-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-ad1984a-mobile-mute-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hp-dv6736-mic-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-dv6736-mic-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hp-piaget-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hp-piaget-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-ideapad-44khz-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-ideapad-44khz-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-lenovo-x200-quirk [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-lenovo-x200-quirk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-stac-hp-detect-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-stac-hp-detect-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/alsa-powermac-ibook-g4-mic-fix [moved from src/patches/suse-2.6.27.31/patches.drivers/alsa-powermac-ibook-g4-mic-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/atl1-add-device_set_wakeup_enable-to-atl1-_set_wol.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/atl1-add-device_set_wakeup_enable-to-atl1-_set_wol.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/atl2-add-atl2-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/atl2-add-atl2-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-added-flush_disk [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-added-flush_disk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-adjust-block-device-size [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-adjust-block-device-size with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-call-flush_disk [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-call-flush_disk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-check-for-device-resize [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-check-for-device-resize with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-sd-driver-calls [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-sd-driver-calls with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bdev-resize-wrapper-for-revalidate_disk [moved from src/patches/suse-2.6.27.31/patches.drivers/bdev-resize-wrapper-for-revalidate_disk with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/blk-request-based-multipath-update [moved from src/patches/suse-2.6.27.31/patches.drivers/blk-request-based-multipath-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-abort-queue [moved from src/patches/suse-2.6.27.31/patches.drivers/block-abort-queue with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-abort-request-rq-complete-marking [moved from src/patches/suse-2.6.27.31/patches.drivers/block-abort-request-rq-complete-marking with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-add-timeout-on-dequeue [moved from src/patches/suse-2.6.27.31/patches.drivers/block-add-timeout-on-dequeue with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-call-sync-on-cleanup [moved from src/patches/suse-2.6.27.31/patches.drivers/block-call-sync-on-cleanup with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-del-timer-after-dequeue [moved from src/patches/suse-2.6.27.31/patches.drivers/block-del-timer-after-dequeue with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-internal-dequeue-shouldnt-start-timer [moved from src/patches/suse-2.6.27.31/patches.drivers/block-internal-dequeue-shouldnt-start-timer with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/block-timeout-handling [moved from src/patches/suse-2.6.27.31/patches.drivers/block-timeout-handling with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2-Add-PCI-ID-for-5716S [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2-Add-PCI-ID-for-5716S with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2-Add-bnx2_shutdown_chip [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2-Add-bnx2_shutdown_chip with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2-Fix-bug-in-bnx2_free_rx_mem_ [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2-Fix-bug-in-bnx2_free_rx_mem_ with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2-check-running.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2-check-running.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-1G-10G-toggling-race.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-1G-10G-toggling-race.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Adding-restriction-on-sge_buf_size.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Adding-restriction-on-sge_buf_size.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Barriers-for-the-compiler.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Barriers-for-the-compiler.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Calling-napi_del.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Calling-napi_del.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Carrier-off-first-call.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Carrier-off-first-call.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Casting-page-alignment.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Casting-page-alignment.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Disable-napi.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Disable-napi.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Driver-description-update.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Driver-description-update.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Endianness-issues.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Endianness-issues.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-First-slow-path-interrupt-race.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-First-slow-path-interrupt-race.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Fixing-the-doorbell-size.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Fixing-the-doorbell-size.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Flow-control-updated-before-reporting-the-lin.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Flow-control-updated-before-reporting-the-lin.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Free-IRQ.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Free-IRQ.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Handling-PHY-FW-load-failure.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Handling-PHY-FW-load-failure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Handling-load-failures.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Handling-load-failures.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Handling-probe-failures.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Handling-probe-failures.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Indirection-table-initialization-index.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Indirection-table-initialization-index.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Legacy-speeds-autoneg-failures.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Legacy-speeds-autoneg-failures.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-MTU-Filter.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-MTU-Filter.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Missing-brackets.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Missing-brackets.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Missing-mask-when-calculating-flow-control.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Missing-mask-when-calculating-flow-control.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Missing-memory-barriers.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Missing-memory-barriers.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Missing-rmb-when-waiting-for-FW-response.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Missing-rmb-when-waiting-for-FW-response.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Overstepping-array-bounds.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Overstepping-array-bounds.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Potential-race-after-iSCSI-boot.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Potential-race-after-iSCSI-boot.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Prevent-self-test-loopback-failures.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Prevent-self-test-loopback-failures.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Protecting-the-link-change-indication.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Protecting-the-link-change-indication.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Read-chip-ID.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Read-chip-ID.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Reset-HW-before-use.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Reset-HW-before-use.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Using-DMAE-to-initialize-the-chip.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Using-DMAE-to-initialize-the-chip.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Using-singlethread-work-queue.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Using-singlethread-work-queue.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Using-system-page-size-for-SGE.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Using-system-page-size-for-SGE.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-VLAN-tagged-packets-without-VLAN-offload.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-VLAN-tagged-packets-without-VLAN-offload.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Version-update.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Version-update.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Version.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Version.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-Wrong-HDR-offset-in-CAM.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-Wrong-HDR-offset-in-CAM.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-eeh.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-eeh.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-loopback-test-failure.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-loopback-test-failure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-tx_has_work-should-not-wait-for-FW.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-tx_has_work-should-not-wait-for-FW.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/bnx2x-version-update.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/bnx2x-version-update.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/broadcom-Add-support-for-the-57780-integrated-PHY.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/broadcom-Add-support-for-the-57780-integrated-PHY.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cciss-driver-panic-on-volume-delete [moved from src/patches/suse-2.6.27.31/patches.drivers/cciss-driver-panic-on-volume-delete with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cciss-ignore-stale-commands [moved from src/patches/suse-2.6.27.31/patches.drivers/cciss-ignore-stale-commands with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_add_cpu_number_paramater_1.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_add_cpu_number_paramater_1.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_add_idle_microaccounting_6.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_add_idle_microaccounting_6.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_change_load_calculation_2.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_change_load_calculation_2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_changes_to_get_cpu_idle_us_5.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_changes_to_get_cpu_idle_us_5.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_get_cpu_idle_time_changes_3.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_get_cpu_idle_time_changes_3.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cpufreq_parameterize_down_differential_4.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cpufreq_parameterize_down_differential_4.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-Add-1G-fiber-support [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-Add-1G-fiber-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-Allocate-multiqueues-at-init-time [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-Allocate-multiqueues-at-init-time with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-More-flexible-support-for-PHY-interrupts [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-More-flexible-support-for-PHY-interrupts with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-Support-for-Aeluros-2005-PHY [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-Support-for-Aeluros-2005-PHY with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-allow-for-PHY-reset-status [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-allow-for-PHY-reset-status with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-commnonize-LASI-phy-code [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-commnonize-LASI-phy-code with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-eeprom-read-fixes.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-eeprom-read-fixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-enable-lro-through-ethtool [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-enable-lro-through-ethtool with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-fix_lro_alignment.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-fix_lro_alignment.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-fix_lro_switch.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-fix_lro_switch.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-get_drvinfo-deadlock.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-get_drvinfo-deadlock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-handle-err-inject.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-handle-err-inject.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-private-iscsi-ip-addresses [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-private-iscsi-ip-addresses with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-ser.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-ser.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-simplify-port-type-struct-and-usage [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-simplify-port-type-struct-and-usage with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3-update-driver-version [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3-update-driver-version with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3i [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3i-fix-skb-overrun [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i-fix-skb-overrun with 90% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3i-fixed-offload-array-size [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i-fixed-offload-array-size with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3i-mainline.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i-mainline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/cxgb3i_ddp.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i_ddp.patch with 97% similarity]
src/patches/suse-2.6.27.39/patches.drivers/disable-catas_reset-by-default-to-avoid-problems-with-eeh.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/disable-catas_reset-by-default-to-avoid-problems-with-eeh.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/dm-abort-queue-on-failed-paths [moved from src/patches/suse-2.6.27.31/patches.drivers/dm-abort-queue-on-failed-paths with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/dmi-introduce-dmi_first_match [moved from src/patches/suse-2.6.27.31/patches.drivers/dmi-introduce-dmi_first_match with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/driver-core-add-newlines-to-debugging-enabled-disabled-messages.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/driver-core-add-newlines-to-debugging-enabled-disabled-messages.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/driver-core-basic-infrastructure-for-per-module-dynamic-debug-messages.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/driver-core-basic-infrastructure-for-per-module-dynamic-debug-messages.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/driver-core-fix-dynamic_debug-cmd-line-parameter.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/driver-core-fix-dynamic_debug-cmd-line-parameter.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/driver-core-fix-using-ret-variable-in-unregister_dynamic_debug_module.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/driver-core-fix-using-ret-variable-in-unregister_dynamic_debug_module.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e100-adapt-to-the-reworked-PCI-PM.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/e100-adapt-to-the-reworked-PCI-PM.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e1000-return-pci_ers_result_disconnect-on-permanent-error.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/e1000e-Fixes-possible-phy-corrupton-on-82571-design.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/e1000e-Fixes-possible-phy-corrupton-on-82571-design.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e1000e-io_error_detected-callback-should-return-PCI_.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/e1000e_add_82574L.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/e1000e_add_82574L.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e1000e_add_ECC [moved from src/patches/suse-2.6.27.31/patches.drivers/e1000e_add_ECC with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e1000e_add_ICH9_BM.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/e1000e_add_ICH9_BM.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/e1000e_add_LOM_devices.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/e1000e_add_LOM_devices.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehca-fix-possible-nullpointer-access-v2.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ehca-fix-possible-nullpointer-access-v2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehca-flush-cqe.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ehca-flush-cqe.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehca-malloc-speedup [moved from src/patches/suse-2.6.27.31/patches.drivers/ehca-malloc-speedup with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehca-rejecting-dynamic-mem-add-remove.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ehca-rejecting-dynamic-mem-add-remove.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehea-modinfo.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ehea-modinfo.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ehea.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ehea.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/elousb.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/elousb.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/fcoe-exch-mgr-is-freed-while-lport-still-retrying-s.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/fcoe-exch-mgr-is-freed-while-lport-still-retrying-s.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/fcoe-fix-handling-of-pending-queue [moved from src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-handling-of-pending-queue with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/fcoe-fix-kfree-skb.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-kfree-skb.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc-abort-response.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc-abort-response.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc-add_sync.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc-add_sync.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc-async-events-oops [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc-async-events-oops with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc_class3.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_class3.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc_default_timeout.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_default_timeout.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc_prli_initiator_fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_prli_initiator_fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc_relogin_fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_relogin_fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ibmvfc_tasklet.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ibmvfc_tasklet.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ide-tape-flags-fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ide-tape-flags-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ide-tape-ignore_dsc-flags-fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ide-tape-ignore_dsc-flags-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/igp-fix-ring-on-suspend.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/igp-fix-ring-on-suspend.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/input-usbtouchscreen-hw-calibration.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/input-usbtouchscreen-hw-calibration.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/intel-hp-newchips-nokms [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/intel-ibex-peak-device-ids.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/intel-ibex-peak-device-ids.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/intel-ibex-peak-device-support.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/intel-ibex-peak-device-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ipoib_null_skb_on_free.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ipoib_null_skb_on_free.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ipr-slave-alloc-crash [moved from src/patches/suse-2.6.27.31/patches.drivers/ipr-slave-alloc-crash with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe-add-bcna-support [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-add-bcna-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe-copper_pond.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-copper_pond.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe-dcb-setstate.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-dcb-setstate.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe-fcoe-bugfixes [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-fcoe-bugfixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe-sfp.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-sfp.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe_DCB_compile_err.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe_DCB_compile_err.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ixgbe_pagesize_fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/ixgbe_pagesize_fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-6gbps-message [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-6gbps-message with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-add-and-use-HORKAGE_ATAPI_MOD16_DMA with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-add-waits-for-govault [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-add-waits-for-govault with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-Withdraw-IGN_SERR_INTERNAL-for-SB800 [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ahci-Withdraw-IGN_SERR_INTERNAL-for-SB800 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-aspire-3810t-noncq [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-blacklist-double-spin-off [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ahci-blacklist-double-spin-off with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-correct-enclosure-LED-state-save [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ahci-correct-enclosure-LED-state-save with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-enclosure-management-bios-workaround [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ahci-enclosure-management-bios-workaround with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-sb600-srst-workaround-soften-msg [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ahci-sb600-srst-workaround-soften-msg with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-add-Hercules-EC-900-mini-to-laptop-tbl [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-add-Hercules-EC-900-mini-to-laptop-tbl with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-add-VGN-BX297XP-to-broken-suspend-list [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-add-VGN-BX297XP-to-broken-suspend-list with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-add-intel-ibex-pci-ids [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-add-intel-ibex-pci-ids with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-blacklist-double-spin-off [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-blacklist-double-spin-off with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-borked-tecra-m4-broken-suspend [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-borked-tecra-m4-broken-suspend with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-clear-spurious-IRQ [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-clear-spurious-IRQ with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ata_piix-use-slave_link [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ata_piix-use-slave_link with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-clear-ering-on-resume [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-clear-ering-on-resume with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-dont-restore-DET-on-detach [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-dont-restore-DET-on-detach with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-eh-fix-slave-link-EH-action-mask-handling [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-eh-fix-slave-link-EH-action-mask-handling with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-implement-NO_SPINDOWN [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-implement-NO_SPINDOWN with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-implement-slave_link [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-implement-slave_link with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-make-SCR-access-ops-per-link [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-make-SCR-access-ops-per-link with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-misc-updates-to-prepare-for-slave-link [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-misc-updates-to-prepare-for-slave-link with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-ocz-vertex-no-hpa [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-ocz-vertex-no-hpa with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-pata_hpt366-fix-cable-detection [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-pata_hpt366-fix-cable-detection with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-pata_hpt366-fix-clock-detection [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-pata_hpt366-fix-clock-detection with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-pata_hpt366-no-ATAPI-DMA [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-pata_hpt366-no-ATAPI-DMA with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-pata_hpt366-reimplement-mode-programming [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-pata_hpt366-reimplement-mode-programming with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-pata_sch-slave-poss [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-pata_sch-slave-poss with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-prefer-over-ide [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-prefer-over-ide with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-reimplement-link-iterator [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-reimplement-link-iterator with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-sata_sil-blacklist-double-spin-off [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-sata_sil-blacklist-double-spin-off with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-sata_via-add-vt8261-support.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-sata_via-add-vt8261-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-sata_via-fix-support-for-5287 [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-sata_via-fix-support-for-5287 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-sata_via-load-DEVICE-register-when-CTL-changes [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-sata_via-load-DEVICE-register-when-CTL-changes with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-sata_via-restore-vt-_prepare_host-error-handling [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-sata_via-restore-vt-_prepare_host-error-handling with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-set-device-class-to-NONE-if-phys_offline [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-set-device-class-to-NONE-if-phys_offline with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-transfer-EHI-control-flags-to-slave-ehc.i [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-transfer-EHI-control-flags-to-slave-ehc.i with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-unlock-hpa-by-default [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-unlock-hpa-by-default with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libata-whitelist-good-bridges [moved from src/patches/suse-2.6.27.31/patches.drivers/libata-whitelist-good-bridges with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libfc-cancel_delayed_work_sync-called-improperly.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/libfc-cancel_delayed_work_sync-called-improperly.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/libfc-fix-read-IO-data-integrity [moved from src/patches/suse-2.6.27.31/patches.drivers/libfc-fix-read-IO-data-integrity with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.1-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.1-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.10-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.10-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.11-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.11-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.12-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.12-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.13-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.13-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.14-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.14-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.3-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.3-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.4-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.4-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.7-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.7-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/lpfc-8.2.8.9-update [moved from src/patches/suse-2.6.27.31/patches.drivers/lpfc-8.2.8.9-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/megaraid-mbox-fix-SG_IO [moved from src/patches/suse-2.6.27.31/patches.drivers/megaraid-mbox-fix-SG_IO with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/mpt-fusion-4.00.43.00-update [moved from src/patches/suse-2.6.27.31/patches.drivers/mpt-fusion-4.00.43.00-update with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/mpt-fusion-4.16.00.00-update [moved from src/patches/suse-2.6.27.31/patches.drivers/mpt-fusion-4.16.00.00-update with 97% similarity]
src/patches/suse-2.6.27.39/patches.drivers/mpt-return-all-sense-data [moved from src/patches/suse-2.6.27.31/patches.drivers/mpt-return-all-sense-data with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/mptsas-discover-all-devices [moved from src/patches/suse-2.6.27.31/patches.drivers/mptsas-discover-all-devices with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-avoid-invalid-iounmap.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-avoid-invalid-iounmap.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-cleanup-mac-list-on-driver-unload.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-cleanup-mac-list-on-driver-unload.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-enable-msi-x-for-quad-gig-boards.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-enable-msi-x-for-quad-gig-boards.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-firmware-init-fix.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-firmware-init-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-fix-endianness-in-firmware-commands.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-fix-endianness-in-firmware-commands.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-fix-ipv6-offload-and-tx-cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-fix-ipv6-offload-and-tx-cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-fix-link-speed-reporting-for-some-boards.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-fix-link-speed-reporting-for-some-boards.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-fix-memory-leak-in-drivers-net-netxen_nic_in.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-fix-memory-leak-in-drivers-net-netxen_nic_in.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-fix-vlan-tso-checksum-offload.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-fix-vlan-tso-checksum-offload.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-handle-dma-mapping-failures.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-handle-dma-mapping-failures.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-hold-tx-lock-while-sending-firmware-commands.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-hold-tx-lock-while-sending-firmware-commands.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-include-ipv6.h-fixes-build-failure.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-include-ipv6.h-fixes-build-failure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-reduce-memory-footprint.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-reduce-memory-footprint.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/netxen-revert-jumbo-ringsize.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/netxen-revert-jumbo-ringsize.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta3-update [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta3-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta4-update [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta4-update with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta5-update [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta5-update with 99% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta6-update [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta6-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-dcb-support [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-dcb-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-driver [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-driver with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-fnic-patches [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-fnic-patches with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-header-files [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-header-files with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-libfc [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-libfc with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-rc1-update [moved from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-rc1-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/open-iscsi-offloading-support [moved from src/patches/suse-2.6.27.31/patches.drivers/open-iscsi-offloading-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/panasonic-laptop-add-panasonic-let-s-note-laptop-extras-driver-v0.94.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/panasonic-laptop-add-panasonic-let-s-note-laptop-extras-driver-v0.94.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/power-introduce-system_entering_hibernation [moved from src/patches/suse-2.6.27.31/patches.drivers/power-introduce-system_entering_hibernation with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/ppc64-adb [moved from src/patches/suse-2.6.27.31/patches.drivers/ppc64-adb with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla1280-eh-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla1280-eh-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-8.02.01-k8-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-8.02.01-k8-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-8.02.01-k9-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-8.02.01-k9-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-8.02.01.02.11.0-k9-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-8.02.01.02.11.0-k9-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-correct-endianness-issue-during-flash [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-correct-endianness-issue-during-flash with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-eeh-recovery [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-eeh-recovery with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla2xxx-extend-address-range-of-option-rom-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla2xxx-extend-address-range-of-option-rom-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-5.01.00-k8_sles11-03-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-5.01.00-k8_sles11-03-update with 95% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-5.01.00-k8_sles11-04-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-5.01.00-k8_sles11-04-update with 97% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors [moved from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-correct-extended-sense-data-errors with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors-update [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-sles11-update [moved from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-sles11-update with 97% similarity]
src/patches/suse-2.6.27.39/patches.drivers/quickcam_messenger.c-add-support-for-all-quickcam.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/quickcam_messenger.c-add-support-for-all-quickcam.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-Tx-performance-tweak-helper [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-Tx-performance-tweak-helper with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-add-8168-8101-registers-description [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-add-8168-8101-registers-description with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-add-hw-start-helpers-for-the-8168-and-the-8101 [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-add-hw-start-helpers-for-the-8168-and-the-8101 with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-additional-8101-and-8102-support [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-additional-8101-and-8102-support with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-allow-true-forced-mode-setting.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-allow-true-forced-mode-setting.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/r8169-use-pci_find_capability-for-the-PCI-E-features [moved from src/patches/suse-2.6.27.31/patches.drivers/r8169-use-pci_find_capability-for-the-PCI-E-features with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/sgi-ioc4-request-submodules [moved from src/patches/suse-2.6.27.31/patches.drivers/sgi-ioc4-request-submodules with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/sgi-xp-no-uv [moved from src/patches/suse-2.6.27.31/patches.drivers/sgi-xp-no-uv with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/sky2-no-link-at-probe.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-agnx-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-agnx-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-otus-atheros-wireless-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-otus-atheros-wireless-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-realtek-8192-pci-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-realtek-8192-pci-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-rt2860-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-rt2860-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-rt2870-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-rt2870-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-rt3070-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-rt3070-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-rtl8187se-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-rtl8187se-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-add-serverengines-benet-10gb-ethernet-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-add-serverengines-benet-10gb-ethernet-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-at76_usb-wireless-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-at76_usb-wireless-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-a-todo-file.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-a-todo-file.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-driver-header-files.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-driver-header-files.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver-to-the-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver-to-the-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-bus-to-the-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-bus-to-the-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-bus.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-bus.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver-to-the-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver-to-the-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-scsi-driver-to-the-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-scsi-driver-to-the-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-add-the-hyper-v-virtual-storage-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-add-the-hyper-v-virtual-storage-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-blkvsc-fix-up-driver_data-usage.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-blkvsc-fix-up-driver_data-usage.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-make-the-hyper-v-virtual-block-driver-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-make-the-hyper-v-virtual-block-driver-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-make-the-hyper-v-virtual-bus-code-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-make-the-hyper-v-virtual-bus-code-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-make-the-hyper-v-virtual-network-driver-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-make-the-hyper-v-virtual-network-driver-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-make-the-hyper-v-virtual-storage-driver-build.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-make-the-hyper-v-virtual-storage-driver-build.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-storvsc-fix-up-driver_data-usage.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-storvsc-fix-up-driver_data-usage.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-hv-use-the-correct-ifdef-for-x86-64.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-hv-use-the-correct-ifdef-for-x86-64.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-rt2860-enable-wpa_supplicant-support.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-rt2860-enable-wpa_supplicant-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-rt2860-sync-driver-up-with-2.6.30-version.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-rt2860-sync-driver-up-with-2.6.30-version.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-rtl8192e-backport-net_device_ops-conversion.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-rtl8192e-backport-net_device_ops-conversion.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/staging-workaround-build-system-bug.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/staging-workaround-build-system-bug.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/sysfs-crash-debugging.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/sysfs-crash-debugging.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/tg3-Add-57780-ASIC-revision.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/tg3-Add-57780-ASIC-revision.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/tg3_libphy_workaround [moved from src/patches/suse-2.6.27.31/patches.drivers/tg3_libphy_workaround with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/tpm-bcm0102-workaround.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/tpm-bcm0102-workaround.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/tpm-correct-timeouts.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/tpm-correct-timeouts.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/usb-serial-add-qualcomm-wireless-modem-driver.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/usb-serial-add-qualcomm-wireless-modem-driver.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/usb-storage-increase-the-bcd-range-in-sony-s-bad-device-table.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/usb-storage-increase-the-bcd-range-in-sony-s-bad-device-table.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/uvcvideo-ignore-hue-control-for-5986-0241.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/uvcvideo-ignore-hue-control-for-5986-0241.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/v4l-dvb-uvcvideo-implement-the-usb-power-management-reset_resume-method.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/v4l-dvb-uvcvideo-implement-the-usb-power-management-reset_resume-method.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.drivers/via-unichrome-drm-bugfixes.patch [moved from src/patches/suse-2.6.27.31/patches.drivers/via-unichrome-drm-bugfixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0001-md-Relax-minimum-size-restrictions-on-chunk_size.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0001-md-Relax-minimum-size-restrictions-on-chunk_size.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0002-md-fix-input-truncation-in-safe_delay_store.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0002-md-fix-input-truncation-in-safe_delay_store.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0003-md-don-t-retry-recovery-of-raid1-that-fails-due-to-e.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0003-md-don-t-retry-recovery-of-raid1-that-fails-due-to-e.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0004-md-fix-deadlock-when-stopping-arrays.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0004-md-fix-deadlock-when-stopping-arrays.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0005-md-Fix-is_mddev_idle-test-again.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0005-md-Fix-is_mddev_idle-test-again.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0006-md-never-clear-bit-from-the-write-intent-bitmap-when.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0006-md-never-clear-bit-from-the-write-intent-bitmap-when.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0007-md-write-bitmap-information-to-devices-that-are-unde.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0007-md-write-bitmap-information-to-devices-that-are-unde.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0008-md-be-more-consistent-about-setting-WriteMostly-flag.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0008-md-be-more-consistent-about-setting-WriteMostly-flag.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0009-md-raid5-simplify-interface-for-init_stripe-and-get_.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0009-md-raid5-simplify-interface-for-init_stripe-and-get_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0010-md-raid5-change-raid5_compute_sector-and-stripe_to_p.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0010-md-raid5-change-raid5_compute_sector-and-stripe_to_p.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0011-md-raid6-remove-expectation-that-Q-device-is-immedia.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0011-md-raid6-remove-expectation-that-Q-device-is-immedia.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0012-md-raid5-simplify-raid5_compute_sector-interface.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0012-md-raid5-simplify-raid5_compute_sector-interface.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0013-md-raid5-Add-support-for-new-layouts-for-raid5-and-r.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0013-md-raid5-Add-support-for-new-layouts-for-raid5-and-r.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0014-md-raid5-finish-support-for-DDF-raid6.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0014-md-raid5-finish-support-for-DDF-raid6.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0015-md-add-size-as-a-personality-method.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0015-md-add-size-as-a-personality-method.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0016-md-centralize-array_sectors-modifications.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0016-md-centralize-array_sectors-modifications.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0017-md-array_size-sysfs-attribute.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0017-md-array_size-sysfs-attribute.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0017A-md-array_size-sysfs-arrtibute.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0017A-md-array_size-sysfs-arrtibute.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0018-md-raid5-run-Fix-max_degraded-for-raid-level-4.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0018-md-raid5-run-Fix-max_degraded-for-raid-level-4.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0019-md-allow-setting-newly-added-device-to-in_sync-via-s.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0019-md-allow-setting-newly-added-device-to-in_sync-via-s.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0020-md-support-bitmaps-on-RAID10-arrays-larger-then-2-te.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0020-md-support-bitmaps-on-RAID10-arrays-larger-then-2-te.patch with 95% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0024-md-tidy-up-status_resync-to-handle-large-arrays.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0024-md-tidy-up-status_resync-to-handle-large-arrays.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0026-md-remove-rd-d-links-immediately-after-stopping-an-a.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0026-md-remove-rd-d-links-immediately-after-stopping-an-a.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0027-md-improve-errno-return-when-setting-array_size.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0027-md-improve-errno-return-when-setting-array_size.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/0028-md-add-explicit-method-to-signal-the-end-of-a-reshap.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/0028-md-add-explicit-method-to-signal-the-end-of-a-reshap.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/Hibernate-Take-overlapping-zones-into-account-rev-2.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/Hibernate-Take-overlapping-zones-into-account-rev-2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/NFSv4-Fix-an-Oops-in-nfs4_free_lock_state.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/NFSv4-Fix-an-Oops-in-nfs4_free_lock_state.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/acpi_assure_unique_processor_proc_creation.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/acpi_assure_unique_processor_proc_creation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/acpi_use_acpi_exception.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/acpi_use_acpi_exception.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/aggressive-zone-reclaim.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/aggressive-zone-reclaim.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/aic7xxx-leaves-timer-running-on-init-failure [moved from src/patches/suse-2.6.27.31/patches.fixes/aic7xxx-leaves-timer-running-on-init-failure with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ath5k-5211-protected-fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ath5k-5211-protected-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ath5k-aspire-one-led.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ath5k-aspire-one-led.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ath5k-ignore-calibration-return-value.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ath5k-ignore-calibration-return-value.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-dont-invoke-request_fn-on-stopped-queue [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-dont-invoke-request_fn-on-stopped-queue with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-get-extra-reference-before-unmap [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-get-extra-reference-before-unmap with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-leave-sync-timer-running [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-leave-sync-timer-running with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-move-unplug_work-init [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-move-unplug_work-init with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-set-segment-boundary-mask [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-set-segment-boundary-mask with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-timeout-readd-timeout-list [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-timeout-readd-timeout-list with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/blk-timeout-splice-timeout-list [moved from src/patches/suse-2.6.27.31/patches.fixes/blk-timeout-splice-timeout-list with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-add-comment-in-blk_rq_timed_out [moved from src/patches/suse-2.6.27.31/patches.fixes/block-add-comment-in-blk_rq_timed_out with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-discard-requests [moved from src/patches/suse-2.6.27.31/patches.fixes/block-discard-requests with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-failfast-merge-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/block-failfast-merge-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-fix-blk_start_queueing [moved from src/patches/suse-2.6.27.31/patches.fixes/block-fix-blk_start_queueing with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-get-rid-of-the-manual-directory-counting-in-blktrace.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/block-get-rid-of-the-manual-directory-counting-in-blktrace.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-git-fixes [moved from src/patches/suse-2.6.27.31/patches.fixes/block-git-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-integrity-update [moved from src/patches/suse-2.6.27.31/patches.fixes/block-integrity-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-optimizations-in-blk_rq_timed_out_timer [moved from src/patches/suse-2.6.27.31/patches.fixes/block-optimizations-in-blk_rq_timed_out_timer with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-rq-affinity [moved from src/patches/suse-2.6.27.31/patches.fixes/block-rq-affinity with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-sanitize-invalid-partition-table-entries [moved from src/patches/suse-2.6.27.31/patches.fixes/block-sanitize-invalid-partition-table-entries with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-suppress-buffer-IO-errors [moved from src/patches/suse-2.6.27.31/patches.fixes/block-suppress-buffer-IO-errors with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-use-bio_has_data [moved from src/patches/suse-2.6.27.31/patches.fixes/block-use-bio_has_data with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/block-use-round_jiffies_up [moved from src/patches/suse-2.6.27.31/patches.fixes/block-use-round_jiffies_up with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bnx2x-block-nvram-access-when-device-is-inactive [moved from src/patches/suse-2.6.27.31/patches.fixes/bnx2x-block-nvram-access-when-device-is-inactive with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bonding-net-move-last_rx-update-into-bonding-recv-logic [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/bridge-module-get-put.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bridge-module-get-put.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bug-437171_1_sched_clock_lock.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bug-437171_1_sched_clock_lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bug-437171_2_sched_delta_weight.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bug-437171_2_sched_delta_weight.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bug-437171_3_rework_wakeup_preemption.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bug-437171_3_rework_wakeup_preemption.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bug-437171_4_sched_reinstate_vruntime_wakeup.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bug-437171_4_sched_reinstate_vruntime_wakeup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/bug-502026_fix_apicid_panic.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/bug-502026_fix_apicid_panic.patch with 98% similarity]
src/patches/suse-2.6.27.39/patches.fixes/cgroups-suppress-cloning-warning.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/cgroups-suppress-cloning-warning.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/cifs-fix-ssh-tunneled-mounts [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/cpufreq_export_latency.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/cpufreq_export_latency.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/cpufreq_ondemand_adjust_sampling_rate_limit.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/cpufreq_ondemand_adjust_sampling_rate_limit.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/cpufreq_ondemand_performance_optimise_default_settings.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/cpufreq_ondemand_performance_optimise_default_settings.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dcb-fix-setpfcstate [moved from src/patches/suse-2.6.27.31/patches.fixes/dcb-fix-setpfcstate with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dcb-setting-pg-will-cause-tx-hang [moved from src/patches/suse-2.6.27.31/patches.fixes/dcb-setting-pg-will-cause-tx-hang with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-Fix-uninitialised-variable-warning-in-lock.c.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-Fix-uninitialised-variable-warning-in-lock.c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-allow-multiple-lockspaces.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-allow-multiple-lockspaces.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-close-connection-2.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/dlm-connect-to-nodes-earlier.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-connect-to-nodes-earlier.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-enable-debug.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/dlm-fix-plock-use-after-free.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-fix-plock-use-after-free.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-fix-shutdown-cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-fix-shutdown-cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-fix-use-count-with-multiple-joins.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-fix-use-count-with-multiple-joins.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-free-socket-in-error-exit-path.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-free-socket-in-error-exit-path.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dlm-use-more-NOFS-allocation.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/dlm-use-more-NOFS-allocation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-avoid-put-table-dm_any_congested [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-avoid-put-table-dm_any_congested with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-mpath-leastpending-correction [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-mpath-leastpending-correction with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-mpath-reattach-dh [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-mpath-reattach-dh with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-mpath-remove-is_active [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-mpath-remove-is_active with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-mpath-send-activate-to-every-path [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-mpath-send-activate-to-every-path with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-mpath-skip-inactive-paths-during-activation [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-mpath-skip-inactive-paths-during-activation with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-path-selector-ref-count [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-path-selector-ref-count with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-release-map_lock-before-set_disk_ro [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-release-map_lock-before-set_disk_ro with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-table-ref-count [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-table-ref-count with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-table-switch-to-readonly [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-table-switch-to-readonly with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-table-upgrade-mode-race-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-table-upgrade-mode-race-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm-unbind-drop-ref [moved from src/patches/suse-2.6.27.31/patches.fixes/dm-unbind-drop-ref with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/dm_flag_queue_barrier_support [moved from src/patches/suse-2.6.27.31/patches.fixes/dm_flag_queue_barrier_support with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/do_anonymous_page-race [moved from src/patches/suse-2.6.27.31/patches.fixes/do_anonymous_page-race with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/drm-r128-add-test-for-initialisation-to-all-ioctls-that-require-it [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ds1682-build-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/ds1682-build-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext3-mark-super-uptodate [moved from src/patches/suse-2.6.27.31/patches.fixes/ext3-mark-super-uptodate with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-avoid-corrupting-the-uninitialized-bit-in-the-extent-during-truncate [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-avoid-corrupting-the-uninitialized-bit-in-the-extent-during-truncate with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-clear-unwritten-flag-after-extent-initialization [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-clear-unwritten-flag-after-extent-initialization with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-fix-sub-block-zeroing-for-preallocated-writes [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-fix-sub-block-zeroing-for-preallocated-writes with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-fixes-2.6.28-rc8.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-fixes-2.6.28-rc8.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-mballoc-preallocate.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-mballoc-preallocate.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ext4-use-a-fake-block-number-for-delayed-new-buffer_head [moved from src/patches/suse-2.6.27.31/patches.fixes/ext4-use-a-fake-block-number-for-delayed-new-buffer_head with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/fc_transport-devloss-callback-restore [moved from src/patches/suse-2.6.27.31/patches.fixes/fc_transport-devloss-callback-restore with 99% similarity]
src/patches/suse-2.6.27.39/patches.fixes/fix-balance-alb-bonding-receive [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/fix-device-number-in-blktrace.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/fix-device-number-in-blktrace.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/fix-nf_conntrack_slp [moved from src/patches/suse-2.6.27.31/patches.fixes/fix-nf_conntrack_slp with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/fix-nr_uninterruptible-accounting-of-frozen-tasks [moved from src/patches/suse-2.6.27.31/patches.fixes/fix-nr_uninterruptible-accounting-of-frozen-tasks with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/fujisu_laptop_fix_section_mismatch.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/fujisu_laptop_fix_section_mismatch.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/grab-swap-token-oops [moved from src/patches/suse-2.6.27.31/patches.fixes/grab-swap-token-oops with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/hfs-corrupt-extent-tree-mount-oops-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/hid-rdesc-quirk-for-sony-vaio-VGX-TP1E.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/hid-rdesc-quirk-for-sony-vaio-VGX-TP1E.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/hpet-correct-periodic-intr.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/hpet-fix-for-LS21-boot-hang [moved from src/patches/suse-2.6.27.31/patches.fixes/hpet-fix-for-LS21-boot-hang with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/hpilo-open-close-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/hpilo-open-close-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ia64-configure-HAVE_UNSTABLE_SCHED_CLOCK-for-SGI_SN.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ia64-configure-HAVE_UNSTABLE_SCHED_CLOCK-for-SGI_SN.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ib-ipath-fix-hang-on-module-unload [moved from src/patches/suse-2.6.27.31/patches.fixes/ib-ipath-fix-hang-on-module-unload with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ieee1394-sbp2_long_sysfs_ieee1394_id.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ieee1394-sbp2_long_sysfs_ieee1394_id.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/initialize-dev-power-entry [moved from src/patches/suse-2.6.27.31/patches.fixes/initialize-dev-power-entry with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/input-add-acer-aspire-5710-to-nomux.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/input-add-acer-aspire-5710-to-nomux.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/input-add-nomux-dell-vostro-1510.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/input-add-nomux-dell-vostro-1510.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ipw2200-send-noassoc.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ipw2200-send-noassoc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Evaluate-socket-state-in-data_ready [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-1-second-send-timeout [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-last_recv-to-track-xmits [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-propogate-EAGAIN-from-sendpage-to-libiscsi [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-return-a-descriptive-error-value [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iwl3945-fix-crash-on-rmmod.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwl3945-fix-crash-on-rmmod.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwl3945-fix-rfkill.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwl3945-fix-rfkill.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwlagn-debug-build-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/iwlagn-fix-error-path.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwlagn-fix-error-path.patch with 95% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwlagn-fix-rfkill.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwlagn-fix-rfkill.patch with 83% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwlwifi-dont-clean-static-wep-keys.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-dont-clean-static-wep-keys.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwlwifi-fix-rs_get_rate-oops.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-rs_get_rate-oops.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/iwlwifi-fix-updating-key-flags.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-updating-key-flags.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/kdb-Commited_AS-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/kdb-Commited_AS-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/kdb-bb_all-fixes [moved from src/patches/suse-2.6.27.31/patches.fixes/kdb-bb_all-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/kdb-fix-stack-overflow.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/kdb-fix-stack-overflow.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-Update-queuecommand-return-codes-for-multipath [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-check-suspend-bit-before-each-call-to-xmit [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-don-t-increment-cmdsn-if-cmd-is-not-sent [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed [moved from src/patches/suse-2.6.27.31/patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-data-corruption [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-iscsi-transport-checks [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-locking-in-eh_device_reset [moved from src/patches/suse-2.6.27.31/patches.fixes/libiscsi-fix-locking-in-eh_device_reset with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-nop-response-reply-and-session-cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/libiscsi-fix-nop-response-reply-and-session-cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-null-pointer-in-fail-all-commands [moved from src/patches/suse-2.6.27.31/patches.fixes/libiscsi-fix-null-pointer-in-fail-all-commands with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-immediate-command-rejections [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-param-allocation-failure [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/libiscsi-have-iscsi_data_in_rsp-call-iscsi_update_cmdsn [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/mac80211-add-direct-probe.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/mac80211-add-direct-probe.patch with 92% similarity]
src/patches/suse-2.6.27.39/patches.fixes/md-disable-recovery-on-faulty-degraded-array [moved from src/patches/suse-2.6.27.31/patches.fixes/md-disable-recovery-on-faulty-degraded-array with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/md-raid1-chunksize [moved from src/patches/suse-2.6.27.31/patches.fixes/md-raid1-chunksize with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/md-raid1-handle-read-error.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/md-raid1-handle-read-error.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/md-update-size [moved from src/patches/suse-2.6.27.31/patches.fixes/md-update-size with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/md-utime-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/md-utime-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/mm-fix-Commited_AS-underflow-on-large-NR_CPUS [moved from src/patches/suse-2.6.27.31/patches.fixes/mm-fix-Commited_AS-underflow-on-large-NR_CPUS with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/mm-madvise-fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/mm-madvise-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/mm-nr_pdflush-race-fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/mm-nr_pdflush-race-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/multiq-requeue-should-rewind-current_band [moved from src/patches/suse-2.6.27.31/patches.fixes/multiq-requeue-should-rewind-current_band with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-01-Uninline-the-function-put_mnt_ns [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-01-Uninline-the-function-put_mnt_ns with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-02-Add-VFS-helper-functions-for-setting-up-private-namespaces [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-02-Add-VFS-helper-functions-for-setting-up-private-namespaces with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-03-NFSv4-Replace-nfs4_path_walk-with-VFS-path-lookup-in-private-namespace [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-03-NFSv4-Replace-nfs4_path_walk-with-VFS-path-lookup-in-private-namespace with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-04-Fix-nfs_path-to-always-return-a-slash-at-the-beginning-of-the-path [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-04-Fix-nfs_path-to-always-return-a-slash-at-the-beginning-of-the-path with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-05-Correct-the-NFS-mount-path-when-following-a-referral [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-05-Correct-the-NFS-mount-path-when-following-a-referral with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-06-dont-bother-with-check_mnt-in-do_add_mount-on-shrinkable-ones [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-06-dont-bother-with-check_mnt-in-do_add_mount-on-shrinkable-ones with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-file-cred-context-null [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-file-cred-context-null with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-fix-nfs3_xdr_setaclargs [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-fix-nfs3_xdr_setaclargs with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-fix-posix-acl [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-fix-posix-acl with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-handle-ESTALE-on-ACCESS [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-handle-ESTALE-on-ACCESS with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-honour-server-preferred-io-size [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/nfs-lock-release-lockargs [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-lock-release-lockargs with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfs-slot-table-alloc [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/nfs-write.c-bug-removal.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfs-write.c-bug-removal.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-01-sunrpc-cache-simplify-cache_fresh_locked-and-cache_f.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-01-sunrpc-cache-simplify-cache_fresh_locked-and-cache_f.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-02-sunrpc-cache-recheck-cache-validity-after-cache_defe.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-02-sunrpc-cache-recheck-cache-validity-after-cache_defe.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-03-sunrpc-cache-use-list_del_init-for-the-list_head-ent.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-03-sunrpc-cache-use-list_del_init-for-the-list_head-ent.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-04-sunrpc-cache-avoid-variable-over-loading-in-cache_de.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-04-sunrpc-cache-avoid-variable-over-loading-in-cache_de.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-05-sunrpc-cache-allow-thread-to-block-while-waiting-for.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-05-sunrpc-cache-allow-thread-to-block-while-waiting-for.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-06-sunrpc-cache-retry-cache-lookups-that-return-ETIMEDO.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-06-sunrpc-cache-retry-cache-lookups-that-return-ETIMEDO.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-07-nfsd-idmap-drop-special-request-deferal-in-favour-of.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-07-nfsd-idmap-drop-special-request-deferal-in-favour-of.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-08-sunrpc-fix-memory-leak-in-unix_gid-cache.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-08-sunrpc-fix-memory-leak-in-unix_gid-cache.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-09-fix-kabi [moved from src/patches/suse-2.6.27.31/patches.fixes/nfsd-09-fix-kabi with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-acl.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/nfsd-exclusive-create-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/no-sys_uv-on-non-uv-systems [moved from src/patches/suse-2.6.27.31/patches.fixes/no-sys_uv-on-non-uv-systems with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/nr-irqs-file [moved from src/patches/suse-2.6.27.31/patches.fixes/nr-irqs-file with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/numa-enable-hashdist-default.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/numa-enable-hashdist-default.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-1.4-git-4e8a301929bfa017e6ffe11e3cf78ccaf8492801 [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-1.4-git-4e8a301929bfa017e6ffe11e3cf78ccaf8492801 with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-1.4-git-65bac575e35915801ea518b9d8d8824367d125c8 [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-1.4-git-65bac575e35915801ea518b9d8d8824367d125c8 with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-1.4-git-80d73f15d12f087f3fe074f8a4d6e5c5624f2b47 [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-1.4-git-80d73f15d12f087f3fe074f8a4d6e5c5624f2b47 with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6 [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-1.4-git-b4c30de39a2596503e888a7b47d19792f25913d6 with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Add-JBD2-compat-feature-bit.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Add-JBD2-compat-feature-bit.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Always-update-xattr-search-when-creating-buck.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Always-update-xattr-search-when-creating-buck.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Check-errors-from-ocfs2_xattr_update_xattr_se.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Check-errors-from-ocfs2_xattr_update_xattr_se.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Check-search-result-in-ocfs2_xattr_block_get.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Check-search-result-in-ocfs2_xattr_block_get.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Check-xattr-block-signatures-properly.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Check-xattr-block-signatures-properly.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Don-t-repeat-ocfs2_xattr_block_find.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Don-t-repeat-ocfs2_xattr_block_find.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Don-t-return-EFAULT-from-a-corrupt-xattr-ent.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Don-t-return-EFAULT-from-a-corrupt-xattr-ent.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Fix-check-of-return-value-of-ocfs2_start_tran.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Fix-check-of-return-value-of-ocfs2_start_tran.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Fix-checking-of-return-value-of-new_inode.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Fix-checking-of-return-value-of-new_inode.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Fix-some-typos-in-xattr-annotations.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Fix-some-typos-in-xattr-annotations.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Let-inode-be-really-deleted-when-ocfs2_mknod_.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Let-inode-be-really-deleted-when-ocfs2_mknod_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Remove-unused-ocfs2_restore_xattr_block.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Remove-unused-ocfs2_restore_xattr_block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Set-journal-descriptor-to-NULL-after-journal.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Set-journal-descriptor-to-NULL-after-journal.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-Specify-appropriate-journal-access-for-new-xa.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-Specify-appropriate-journal-access-for-new-xa.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-access-and-dirty-the-buffer_head-in-mark_writ.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-access-and-dirty-the-buffer_head-in-mark_writ.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-extra-credits-and-access-the-modified-bh.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-handler_map-array-bounds-checking.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-add-handler_map-array-bounds-checking.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-io-error-check-in-ocfs2_get_sector.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-add-io-error-check-in-ocfs2_get_sector.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-quota-call-to-ocfs2_remove_btree_range.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-add-quota-call-to-ocfs2_remove_btree_range.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-adjust-rightmost-path-in-ocfs2_add_branch.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-comments-typo-fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-comments-typo-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-Hold-off-sending-lockres-drop-ref-message.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-Hold-off-sending-lockres-drop-ref-message.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-activate-dlm-master_hash-for-master-list.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-activate-dlm-master_hash-for-master-list.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-clean-up-struct-dlm_lock_name.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-clean-up-struct-dlm_lock_name.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-create-and-destroy-the-dlm-master_hash.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-create-and-destroy-the-dlm-master_hash.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-dlm_set_lockres_owner-and-dlm_change_lo.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-dlm_set_lockres_owner-and-dlm_change_lo.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-do-not-purge-lockres-that-is-being-migrat.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-do-not-purge-lockres-that-is-being-migrat.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-encapsulate-adding-and-removing-of-mle-fr.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-encapsulate-adding-and-removing-of-mle-fr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-fix-race-in-adding-removing-lockres-to-f.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-fix-race-in-adding-removing-lockres-to-f.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-improve-lockres-counts.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-improve-lockres-counts.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-indent-dlm_cleanup_master_list.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-indent-dlm_cleanup_master_list.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-make-dlm_assert_master_handler-kill-its.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-make-dlm_assert_master_handler-kill-its.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-refactor-dlm_clean_master_list.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-refactor-dlm_clean_master_list.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-remove-struct-dlm_lock_name-in-struct-dlm.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-remove-struct-dlm_lock_name-in-struct-dlm.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-show-the-number-of-lockres-mles-in-dlm_st.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-show-the-number-of-lockres-mles-in-dlm_st.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-track-number-of-mles.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-track-number-of-mles.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-tweak-mle_state-output.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-tweak-mle_state-output.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-use-ast_lock-to-protect-ast_list.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-dlm-use-ast_lock-to-protect-ast_list.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-wait-on-lockres-instead-of-err-during-cancel.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-a-bug-found-by-sparse-check.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-a-bug-found-by-sparse-check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-check-for-osb-in-kill_sb.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-function-declaration-and-definition-in-xa.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-function-declaration-and-definition-in-xa.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-license-in-xattr.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-license-in-xattr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-printk-related-build-warnings-in-xattr.c.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-printk-related-build-warnings-in-xattr.c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-regression-in-ocfs2_read_blocks_sync.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-regression-in-ocfs2_read_blocks_sync.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-return-value-set-in-init_dlmfs_fs.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-return-value-set-in-init_dlmfs_fs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-wake_up-in-unlock_ast.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-fix-wake_up-in-unlock_ast.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-initialize-count-before-generic_write_checks [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-initialize-count-before-generic_write_checks with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-initialize-stack_user-lvbptr.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-initialize-stack_user-lvbptr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-more_start_tran_fixes.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-more_start_tran_fixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-push-out-dropping-of-dentry-lock-to-ocfs2_wq.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-push-out-dropping-of-dentry-lock-to-ocfs2_wq.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-quota-Initialize-blocks-allocated-to-local-quota-fi.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-quota-Initialize-blocks-allocated-to-local-quota-fi.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-quota-Make-global-quota-files-blocksize-aligned.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-quota-Make-global-quota-files-blocksize-aligned.patch with 95% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-quota-Mark-buffer-uptodate-before-calling-ocfs2_jou.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-quota-Mark-buffer-uptodate-before-calling-ocfs2_jou.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-quota-Remove-syncjiff-field-from-quota-info.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-quota-Remove-syncjiff-field-from-quota-info.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-really-add-ACL-Kconfig.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-really-add-ACL-Kconfig.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-release-the-buffer-head-in-ocfs2_do_truncate.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-remove-duplicate-definition-in-xattr.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-remove-duplicate-definition-in-xattr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-remove-prepare_write-commit_write.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-remove-prepare_write-commit_write.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-remove-undefined-xattr-handlers.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-remove-undefined-xattr-handlers.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-reserve-xattr-block-for-new-directory-with-in.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-reserve-xattr-block-for-new-directory-with-in.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-return-0-in-page_mkwrite-to-let-VFS-retry.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-return-0-in-page_mkwrite-to-let-VFS-retry.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-set-gap-to-seperate-entry-and-value-when-xatt.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-set-gap-to-seperate-entry-and-value-when-xatt.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-truncate-outstanding-block-after-direct-io-fa.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-truncate-outstanding-block-after-direct-io-fa.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-tweak-to-get-the-maximum-inline-data-size-wit.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-tweak-to-get-the-maximum-inline-data-size-wit.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-use-ocfs2_rec_clusters-in-ocfs2_adjust_adjace.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-use-xs-bucket-to-set-xattr-value-outside.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-use-xs-bucket-to-set-xattr-value-outside.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-wakeup-the-downconvert-thread-after-a-success.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-wakeup-the-downconvert-thread-after-a-success.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ocfs2-xattr-Proper-hash-collision-handle-in-bucket.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-xattr-Proper-hash-collision-handle-in-bucket.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/oom-warning [moved from src/patches/suse-2.6.27.31/patches.fixes/oom-warning with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/open-iscsi-git-update [moved from src/patches/suse-2.6.27.31/patches.fixes/open-iscsi-git-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/open-iscsi-mv-transport-eh-setting [moved from src/patches/suse-2.6.27.31/patches.fixes/open-iscsi-mv-transport-eh-setting with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/parport-mutex [moved from src/patches/suse-2.6.27.31/patches.fixes/parport-mutex with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/pci-amd-813x-b2-devices-do-not-need-quirk.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/pci-amd-813x-b2-devices-do-not-need-quirk.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/percpu_counter_sum_cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/percpu_counter_sum_cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/pkt_action-skbedit [moved from src/patches/suse-2.6.27.31/patches.fixes/pkt_action-skbedit with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/pkt_sched_multiq_support [moved from src/patches/suse-2.6.27.31/patches.fixes/pkt_sched_multiq_support with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/ptrace-getsiginfo [moved from src/patches/suse-2.6.27.31/patches.fixes/ptrace-getsiginfo with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/qla2xxx-check-fc-rport-validity [moved from src/patches/suse-2.6.27.31/patches.fixes/qla2xxx-check-fc-rport-validity with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/qla2xxx-devtbl-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/qla2xxx-devtbl-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/qla2xxx-disable-automatic-queue-tracking [moved from src/patches/suse-2.6.27.31/patches.fixes/qla2xxx-disable-automatic-queue-tracking with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-commit-ids-unsigned-ints [moved from src/patches/suse-2.6.27.31/patches.fixes/reiserfs-commit-ids-unsigned-ints with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-debug-1036 [moved from src/patches/suse-2.6.27.31/patches.fixes/reiserfs-debug-1036 with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-error-buffer-locking [moved from src/patches/suse-2.6.27.31/patches.fixes/reiserfs-error-buffer-locking with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-prealloc-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/reiserfs-prealloc-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-truncate-failed-write [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/reiserfs-varargs-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/reiserfs-varargs-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/remount-no-shrink-dcache [moved from src/patches/suse-2.6.27.31/patches.fixes/remount-no-shrink-dcache with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/remove_kernel_physical_mapping_init_from_init [moved from src/patches/suse-2.6.27.31/patches.fixes/remove_kernel_physical_mapping_init_from_init with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/round-jiffies-up [moved from src/patches/suse-2.6.27.31/patches.fixes/round-jiffies-up with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/rt2x00-fix-race-conditions.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/rt2x00-fix-race-conditions.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/saa7134-fix-resource-map-sanity-check-conflict.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/saa7134-fix-resource-map-sanity-check-conflict.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sched-fix-__load_balance_iterator-for-cfs-with-on.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/sched-fix-__load_balance_iterator-for-cfs-with-on.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-add-tgps-setting [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-add-tgps-setting with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-call-unprep_request-under-lock [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-call-unprep_request-under-lock with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-check-host-lookup-failure [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-check-host-lookup-failure with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-alua-group-id-mask [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-alua-group-id-mask with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-alua-retry-UA [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-alua-retry-UA with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-alua-send-stpg [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-alua-send-stpg with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-emc-mode-select-10-size [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-emc-mode-select-10-size with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-emc-rw-mismatch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-emc-rw-mismatch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-queuedata-accessors [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-queuedata-accessors with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-add-stk [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-add-stk with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-initialize-passive-path [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-initialize-passive-path with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-retry-UA [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-UA with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-retry-for-not-ready [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-for-not-ready with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-retry-mode-select [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-retry-mode-select with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-set-default-ownership [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-dh-rdac-set-default-ownership with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-sles10sp3-fixes [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-dont-call-blk_plug_device-from-scsi_target_queue_ready [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-eh-timed-out-missing-braces [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-eh-timed-out-missing-braces with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-enhance-error-codes [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-enhance-error-codes with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-fix-hang-in-starved-list-processing [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-fix-hang-in-starved-list-processing with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-fixup-failfast-definitions [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-fixup-failfast-definitions with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-fixup-recovered-error [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-fixup-scsi_host_lookup-return-value [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-fixup-scsi_host_lookup-return-value with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ibmvscsi-can_queue_fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-ibmvscsi-can_queue_fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ibmvscsi-module_alias.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-ibmvscsi-module_alias.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ibmvscsi-show-config.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-ibmvscsi-show-config.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ibmvscsi-vio_leak.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-ibmvscsi-vio_leak.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-initialize-max_targets_blocked [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-initialize-max_targets_blocked with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-inquiry-too-short-ratelimit [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-inquiry-too-short-ratelimit with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ipr-fix-PCI-permanent-error-handler [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-ipr-fix-PCI-permanent-error-handler with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-lib-string_get_size-don-t-hang-on-zero-no-decimals-on-exact.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-lib-string_get_size-don-t-hang-on-zero-no-decimals-on-exact.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-misc-git-update [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-misc-git-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-refactor-busy-processing [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-refactor-busy-processing with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-remove-scmd-timeout [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-remove-scmd-timeout with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-reservation-conflict-after-timeout [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-restart-lookup-by-target [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-restart-lookup-by-target with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-ADD_TO_MLQUEUE-return-values [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-TASK_ABORTED [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-retry-TASK_ABORTED with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-alua-transition-in-progress [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-retry-alua-transition-in-progress with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-transport-error [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-retry-transport-error with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-scan-blist-update [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-scan-blist-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-scan-set-SDEV_DEL-on-destroy [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-scan-set-SDEV_DEL-on-destroy with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-ses-hotplug-fix [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi-skip-nonscsi-device-for-dma [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-skip-nonscsi-device-for-dma with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi-terminate-target-reset [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi-terminate-target-reset with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi_dh-add-del-ids-to-rdac [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/scsi_dh-add-lsi-ids-to-rdac [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi_dh-add-lsi-ids-to-rdac with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/scsi_dh-retry-on-UNIT_ATTENTION [moved from src/patches/suse-2.6.27.31/patches.fixes/scsi_dh-retry-on-UNIT_ATTENTION with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sd-needs-updating [moved from src/patches/suse-2.6.27.31/patches.fixes/sd-needs-updating with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sd-no-spinup-on-standby-ports [moved from src/patches/suse-2.6.27.31/patches.fixes/sd-no-spinup-on-standby-ports with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/seccomp-disable-tsc-option [moved from src/patches/suse-2.6.27.31/patches.fixes/seccomp-disable-tsc-option with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/slab-alloc_slabmgmt-fix.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/slab-alloc_slabmgmt-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sn-irq-affinity [moved from src/patches/suse-2.6.27.31/patches.fixes/sn-irq-affinity with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sparsemem-maxmem-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/sparsemem-maxmem-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sunrpc-fix-oops-not-setup-socket [moved from src/patches/suse-2.6.27.31/patches.fixes/sunrpc-fix-oops-not-setup-socket with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/sunrpc-tcp-reconnect [moved from src/patches/suse-2.6.27.31/patches.fixes/sunrpc-tcp-reconnect with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/taskstats-align [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/tc-fix-unitialized-kernel-memory-leak [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/tg3-fix-default-wol.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/tg3-fix-default-wol.patch with 96% similarity]
src/patches/suse-2.6.27.39/patches.fixes/tiocgdev [moved from src/patches/suse-2.6.27.31/patches.fixes/tiocgdev with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/tulip-quad-NIC-ifdown [moved from src/patches/suse-2.6.27.31/patches.fixes/tulip-quad-NIC-ifdown with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/udf-faster_anchor_detection.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/udf-faster_anchor_detection.patch with 94% similarity]
src/patches/suse-2.6.27.39/patches.fixes/usb-hid-ncr-no-init-reports.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/use-totalram_pages [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.fixes/uv-redundant-creation-of-proc-dir [moved from src/patches/suse-2.6.27.31/patches.fixes/uv-redundant-creation-of-proc-dir with 97% similarity]
src/patches/suse-2.6.27.39/patches.fixes/uv_zalias_support [moved from src/patches/suse-2.6.27.31/patches.fixes/uv_zalias_support with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/video-vesa-bad-mode [moved from src/patches/suse-2.6.27.31/patches.fixes/video-vesa-bad-mode with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/vlan-gso-size-fix [moved from src/patches/suse-2.6.27.31/patches.fixes/vlan-gso-size-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/x86_cpufreq_powernow-k8_acpi_latency_values.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/x86_cpufreq_powernow-k8_acpi_latency_values.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs-dmapi-fixes [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs-dmapi-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs-fix-overflow-in-xfs_growfs_data_private [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs-fix-overflow-in-xfs_growfs_data_private with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs-kern_32215a_Clean-up-dquot-pincount-code.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs-kern_32215a_Clean-up-dquot-pincount-code.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs-more-sb-checks [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs-more-sb-checks with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs-redirty-ENOSPC.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs-redirty-ENOSPC.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xfs_file_last_byte-needs-to-acquire-ilock.patch [moved from src/patches/suse-2.6.27.31/patches.fixes/xfs_file_last_byte-needs-to-acquire-ilock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/xpc-pass-physical [moved from src/patches/suse-2.6.27.31/patches.fixes/xpc-pass-physical with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/zfcp-make-queue_depth-adjustable [moved from src/patches/suse-2.6.27.31/patches.fixes/zfcp-make-queue_depth-adjustable with 100% similarity]
src/patches/suse-2.6.27.39/patches.fixes/zisofs-large-pagesize-read.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kabi/abi-add-back-skb_truesize_bug-and-skb_truesize_check.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-add-back-skb_truesize_bug-and-skb_truesize_check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/abi-fix-add-epoll_devs-back-to-struct-user_struct.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-fix-add-epoll_devs-back-to-struct-user_struct.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/abi-fix-add-s_syncing-back-to-struct-super_block.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-fix-add-s_syncing-back-to-struct-super_block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/abi-fix-add-vc_scrl_erase_char-back-to-struct-vc_data.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-fix-add-vc_scrl_erase_char-back-to-struct-vc_data.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/abi-fix-add-wb_sync_hold-enum-writeback_sync_modes.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-fix-add-wb_sync_hold-enum-writeback_sync_modes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/abi-fix-for-struct-seq_file-change.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/abi-fix-for-struct-seq_file-change.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/export-iwl_rx_allocate [moved from src/patches/suse-2.6.27.31/patches.kabi/export-iwl_rx_allocate with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/ftrace-dummy-export [moved from src/patches/suse-2.6.27.31/patches.kabi/ftrace-dummy-export with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/ia64-sn-specific-version-of-dma_get_required_mask-kabi-fix [moved from src/patches/suse-2.6.27.31/patches.kabi/ia64-sn-specific-version-of-dma_get_required_mask-kabi-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/kabi-fix-struct-parport-abi-change.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kabi/mm-page_mkwrite-compat.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/mm-page_mkwrite-compat.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/mm-page_mkwrite-rename.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/mm-page_mkwrite-rename.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/move-aarp_send_ddp-export-back [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kabi/sched-kabi-compat-hack.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/sched-kabi-compat-hack.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/splice-kabi-fix.patch [moved from src/patches/suse-2.6.27.31/patches.kabi/splice-kabi-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/xen-x86_64-note-init-p2m [moved from src/patches/suse-2.6.27.31/patches.kabi/xen-x86_64-note-init-p2m with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/xen3-e1000e_Export_set_memory_ro-rw [moved from src/patches/suse-2.6.27.31/patches.kabi/xen3-e1000e_Export_set_memory_ro-rw with 78% similarity]
src/patches/suse-2.6.27.39/patches.kabi/xen3-patch-2.6.27.18-19 [moved from src/patches/suse-2.6.27.31/patches.kabi/xen3-patch-2.6.27.18-19 with 100% similarity]
src/patches/suse-2.6.27.39/patches.kabi/xfs-dquot-pincount-kabi.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kabi/xpc-pass-physical [moved from src/patches/suse-2.6.27.31/patches.kabi/xpc-pass-physical with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/arch-include-asm-fixes [moved from src/patches/suse-2.6.27.31/patches.kernel.org/arch-include-asm-fixes with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/carmine-section-mismatch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/carmine-section-mismatch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/gdth-section-conflict [moved from src/patches/suse-2.6.27.31/patches.kernel.org/gdth-section-conflict with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/md-section-conflict [moved from src/patches/suse-2.6.27.31/patches.kernel.org/md-section-conflict with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1-2 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.10-11 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.11-12 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.12-13 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.13-14 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.14-15 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.15-16 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.16-17 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.17-18 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.18-19 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.19-20 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.2-3 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.20-21 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.21-22 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.22-23 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.23-24 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.24-25 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.25-26 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.26-27 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.27-28 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.28-29 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.29-30 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.3-4 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.30-31 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.31-32 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.32-33 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.33-34 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.34-35 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.35-36 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.36-37 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.37-38 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.38-39 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.4-5 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.5-6 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.6-7 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.7-8 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.8-9 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.9-10 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.kernel.org/revert-ext4-changes-in-2.6.27.19-and-2.6.27.20-and-2.6.27.25.patch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/revert-ext4-changes-in-2.6.27.19-and-2.6.27.20-and-2.6.27.25.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/revert-scsi-qla2xxx-correct-atmel-flash-part-handling.patch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/revert-scsi-qla2xxx-correct-atmel-flash-part-handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/revert-scsi-qla2xxx-do-not-honour-max_vports-from-firmware-for-2g-isps-and-below.patch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/revert-scsi-qla2xxx-do-not-honour-max_vports-from-firmware-for-2g-isps-and-below.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/revert-scsi-qla2xxx-return-a-failed-status-when-abort-mailbox-command-fails.patch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/revert-scsi-qla2xxx-return-a-failed-status-when-abort-mailbox-command-fails.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/setup_APIC_timer-section-mismatch [moved from src/patches/suse-2.6.27.31/patches.kernel.org/setup_APIC_timer-section-mismatch with 100% similarity]
src/patches/suse-2.6.27.39/patches.kernel.org/spu_profiler-include [moved from src/patches/suse-2.6.27.31/patches.kernel.org/spu_profiler-include with 100% similarity]
src/patches/suse-2.6.27.39/patches.rpmify/buildhost [moved from src/patches/suse-2.6.27.31/patches.rpmify/buildhost with 100% similarity]
src/patches/suse-2.6.27.39/patches.rpmify/firmware-path [moved from src/patches/suse-2.6.27.31/patches.rpmify/firmware-path with 100% similarity]
src/patches/suse-2.6.27.39/patches.rpmify/no-include-asm [moved from src/patches/suse-2.6.27.31/patches.rpmify/no-include-asm with 100% similarity]
src/patches/suse-2.6.27.39/patches.rpmify/rpm-kernel-config [moved from src/patches/suse-2.6.27.31/patches.rpmify/rpm-kernel-config with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/8250-sysrq-ctrl_o.patch [moved from src/patches/suse-2.6.27.31/patches.suse/8250-sysrq-ctrl_o.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-01-mm-gfp-to-alloc_flags.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-01-mm-gfp-to-alloc_flags.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-02-mm-setup_per_zone_pages_min.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-02-mm-setup_per_zone_pages_min.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-03-net-ipv6-route-cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-03-net-ipv6-route-cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-04-net-ipv6-route-cleanup-sysctl.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-04-net-ipv6-route-cleanup-sysctl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-05-doc.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-05-doc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-06-mm-gfp-to-alloc_flags-expose.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-06-mm-gfp-to-alloc_flags-expose.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-07-page_alloc-reserve.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-07-page_alloc-reserve.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-08-reserve-slub.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-08-reserve-slub.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-09-mm-kmem_estimate_pages.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-09-mm-kmem_estimate_pages.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-10-mm-PF_MEMALLOC-softirq.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-10-mm-PF_MEMALLOC-softirq.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-11-mm-page_alloc-emerg.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-11-mm-page_alloc-emerg.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-12-global-ALLOC_NO_WATERMARKS.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-12-global-ALLOC_NO_WATERMARKS.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-13-mm-page_alloc-GFP_EMERGENCY.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-13-mm-page_alloc-GFP_EMERGENCY.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-14-mm-reserve.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-14-mm-reserve.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-15-mm-selinux-emergency.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-15-mm-selinux-emergency.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-16-net-backlog.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-16-net-backlog.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-17-net-ps_rx.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-17-net-ps_rx.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-18-net-sk_allocation.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-18-net-sk_allocation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-19-netvm-reserve.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-19-netvm-reserve.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-20-netvm-reserve-inet.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-20-netvm-reserve-inet.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-20-netvm-reserve-inet.patch-fix [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-20-netvm-reserve-inet.patch-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-21-netvm-skbuff-reserve.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-21-netvm-skbuff-reserve.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-22-netvm-sk_filter.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-22-netvm-sk_filter.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-23-netvm-tcp-deadlock.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-23-netvm-tcp-deadlock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-24-emergency-nf_queue.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-24-emergency-nf_queue.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-25-netvm.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-25-netvm.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-26-mm-swapfile.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-26-mm-swapfile.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-27-mm-page_file_methods.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-27-mm-page_file_methods.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-28-nfs-swapcache.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-28-nfs-swapcache.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-29-nfs-swapper.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-29-nfs-swapper.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-30-nfs-swap_ops.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-30-nfs-swap_ops.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-31-nfs-alloc-recursions.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-31-nfs-alloc-recursions.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-fix-sync [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-fix-sync with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/SoN-fix-uninitialized-variable.patch [moved from src/patches/suse-2.6.27.31/patches.suse/SoN-fix-uninitialized-variable.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/acpi-dsdt-initrd-v0.9a-2.6.25.patch [moved from src/patches/suse-2.6.27.31/patches.suse/acpi-dsdt-initrd-v0.9a-2.6.25.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/acpi_osi_sle11_ident.patch [moved from src/patches/suse-2.6.27.31/patches.suse/acpi_osi_sle11_ident.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/bootsplash [moved from src/patches/suse-2.6.27.31/patches.suse/bootsplash with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/bug-504646-acpi-enable-root-bridge-to-wakeup.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.suse/cfq-ioc-race [moved from src/patches/suse-2.6.27.31/patches.suse/cfq-ioc-race with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/cgroup-disable-memory.patch [moved from src/patches/suse-2.6.27.31/patches.suse/cgroup-disable-memory.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/cgroup-freezer.patch [moved from src/patches/suse-2.6.27.31/patches.suse/cgroup-freezer.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/connector-read-mostly [moved from src/patches/suse-2.6.27.31/patches.suse/connector-read-mostly with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/convert-novfs-to-open-soure-coding-standards.patch [moved from src/patches/suse-2.6.27.31/patches.suse/convert-novfs-to-open-soure-coding-standards.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/coredump_filter-add-elfhdr-default.patch [moved from src/patches/suse-2.6.27.31/patches.suse/coredump_filter-add-elfhdr-default.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-Change-rwlock-which-is-only-used-in-write-mode-to-a-spinlock.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-Change-rwlock-which-is-only-used-in-write-mode-to-a-spinlock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-add-new-debugfs-entry.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-add-new-debugfs-entry.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-add-time-stamp-of-blocking-callback.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-add-time-stamp-of-blocking-callback.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-change-lock-time-stamping.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-change-lock-time-stamping.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-change-rsbtbl-rwlock-to-spinlock.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-change-rsbtbl-rwlock-to-spinlock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-choose-better-identifiers.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-choose-better-identifiers.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-clear-defunct-cancel-state.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-clear-defunct-cancel-state.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-comment-typo-fixes.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-comment-typo-fixes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-detect-available-userspace-daemon.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-detect-available-userspace-daemon.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-address-compare.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-address-compare.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-length-calculation-in-compat-code.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-length-calculation-in-compat-code.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-locking-of-lockspace-list-in-dlm_scand.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-locking-of-lockspace-list-in-dlm_scand.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-plock-notify-callback-to-lockd.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-plock-notify-callback-to-lockd.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-seq_file-usage-in-debugfs-lock-dump.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-seq_file-usage-in-debugfs-lock-dump.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fix-up-memory-allocation-flags.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-up-memory-allocation-flags.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-fsdlm-ast.c-fix-warning.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-fsdlm-ast.c-fix-warning.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-ignore-cancel-on-granted-lock.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-ignore-cancel-on-granted-lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-improve-how-bast-mode-handling.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-improve-how-bast-mode-handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-remove-bkl.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-remove-bkl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-remove-extra-blocking-callback-check.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-remove-extra-blocking-callback-check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-remove-kmap-and-kunmap.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-remove-kmap-and-kunmap.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-replace-idr-with-hash-table-for-connections.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-replace-idr-with-hash-table-for-connections.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-replace-schedule-with-cond_resched.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-replace-schedule-with-cond_resched.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-trivial-annotation-of-be16-value.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-trivial-annotation-of-be16-value.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm-use-ipv6_addr_copy.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm-use-ipv6_addr_copy.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dlm_lock_data-make-most-exported-headers-use-strict-integer-types.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dlm_lock_data-make-most-exported-headers-use-strict-integer-types.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-barrier-single-device [moved from src/patches/suse-2.6.27.31/patches.suse/dm-barrier-single-device with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-block-integrity [moved from src/patches/suse-2.6.27.31/patches.suse/dm-block-integrity with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-emulate-blkrrpart-ioctl [moved from src/patches/suse-2.6.27.31/patches.suse/dm-emulate-blkrrpart-ioctl with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-accept-failed-paths [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-accept-failed-paths with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-add-start-io [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-add-start-io with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-check-info-before-access [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-check-info-before-access with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-leastpending-path-update [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-leastpending-path-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-lockdep-irqsave [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-lockdep-irqsave with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-no-activate-for-offlined-paths [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-no-activate-for-offlined-paths with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-no-partitions-feature [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-no-partitions-feature with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-null-pgs [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-null-pgs with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-queue-length-load-balancing [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-queue-length-load-balancing with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-requeue-for-stopped-queue [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-requeue-for-stopped-queue with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-service-time-load-balancing [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-service-time-load-balancing with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-mpath-tracking-nr-bytes [moved from src/patches/suse-2.6.27.31/patches.suse/dm-mpath-tracking-nr-bytes with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-raid45_2.6.27_20081027.patch [moved from src/patches/suse-2.6.27.31/patches.suse/dm-raid45_2.6.27_20081027.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-table-change-mode-to-ro [moved from src/patches/suse-2.6.27.31/patches.suse/dm-table-change-mode-to-ro with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/dm-use-md-for-free_bio_clone [moved from src/patches/suse-2.6.27.31/patches.suse/dm-use-md-for-free_bio_clone with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/e1000e_Export_set_memory_ro-rw [moved from src/patches/suse-2.6.27.31/patches.suse/e1000e_Export_set_memory_ro-rw with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/export-release_open_intent [moved from src/patches/suse-2.6.27.31/patches.suse/export-release_open_intent with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ext2-fsync-err [moved from src/patches/suse-2.6.27.31/patches.suse/ext2-fsync-err with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ext3-Use-sb_any_quota_loaded-instead-of-sb_any_qu.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ext3-Use-sb_any_quota_loaded-instead-of-sb_any_qu.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ext3-barrier-default [moved from src/patches/suse-2.6.27.31/patches.suse/ext3-barrier-default with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/fix-warning-in-fsdlm-netlink.c.patch [moved from src/patches/suse-2.6.27.31/patches.suse/fix-warning-in-fsdlm-netlink.c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/genhd-disk-ro-uevents [moved from src/patches/suse-2.6.27.31/patches.suse/genhd-disk-ro-uevents with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/headers_check-fix-linux-dlm_plock.h.patch [moved from src/patches/suse-2.6.27.31/patches.suse/headers_check-fix-linux-dlm_plock.h.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/hp_backlight_blacklist_6530b.patch [moved from src/patches/suse-2.6.27.31/patches.suse/hp_backlight_blacklist_6530b.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kbd-ignore-gfx.patch [moved from src/patches/suse-2.6.27.31/patches.suse/kbd-ignore-gfx.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kdb-common [moved from src/patches/suse-2.6.27.31/patches.suse/kdb-common with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kdb-ia64 [moved from src/patches/suse-2.6.27.31/patches.suse/kdb-ia64 with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kdb-serial-8250 [moved from src/patches/suse-2.6.27.31/patches.suse/kdb-serial-8250 with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kdb-x86 [moved from src/patches/suse-2.6.27.31/patches.suse/kdb-x86 with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kdump-dump_after_notifier.patch [moved from src/patches/suse-2.6.27.31/patches.suse/kdump-dump_after_notifier.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/kvm-as-kmp [moved from src/patches/suse-2.6.27.31/patches.suse/kvm-as-kmp with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/led_classdev.sysfs-name.patch [moved from src/patches/suse-2.6.27.31/patches.suse/led_classdev.sysfs-name.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/md-bitmap-sub-page-chunks [moved from src/patches/suse-2.6.27.31/patches.suse/md-bitmap-sub-page-chunks with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/md-notify-when-stopped [moved from src/patches/suse-2.6.27.31/patches.suse/md-notify-when-stopped with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/md-raid-metadata-PAGE_SIZE.patch [moved from src/patches/suse-2.6.27.31/patches.suse/md-raid-metadata-PAGE_SIZE.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mem_cgroup_stat-dynamic-alloc [moved from src/patches/suse-2.6.27.31/patches.suse/mem_cgroup_stat-dynamic-alloc with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mm-devzero-optimisation.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mm-devzero-optimisation.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/mm-do-not-disable-memory-hotplug-when-hibernation-is-enabled.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mm-do-not-disable-memory-hotplug-when-hibernation-is-enabled.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mm-increase-dirty-limits.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mm-increase-dirty-limits.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mm-vmalloc-fail-dump-stack.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mm-vmalloc-fail-dump-stack.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mnt-want-write-speedup.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mnt-want-write-speedup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/mnt_clone_write.patch [moved from src/patches/suse-2.6.27.31/patches.suse/mnt_clone_write.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/modpost-filter-out-built-in-depends [moved from src/patches/suse-2.6.27.31/patches.suse/modpost-filter-out-built-in-depends with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/module-ref-dynamic-alloc [moved from src/patches/suse-2.6.27.31/patches.suse/module-ref-dynamic-alloc with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/nameif-track-rename.patch [moved from src/patches/suse-2.6.27.31/patches.suse/nameif-track-rename.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/netfilter-ip_conntrack_slp.patch [moved from src/patches/suse-2.6.27.31/patches.suse/netfilter-ip_conntrack_slp.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/netfilter-ipt_LOG-mac [moved from src/patches/suse-2.6.27.31/patches.suse/netfilter-ipt_LOG-mac with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/netfilter-ipv4options [moved from src/patches/suse-2.6.27.31/patches.suse/netfilter-ipv4options with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/no-frame-pointer-select [moved from src/patches/suse-2.6.27.31/patches.suse/no-frame-pointer-select with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/no-partition-scan [moved from src/patches/suse-2.6.27.31/patches.suse/no-partition-scan with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/novfs-add-the-novell-filesystem-client-kernel-module.patch [moved from src/patches/suse-2.6.27.31/patches.suse/novfs-add-the-novell-filesystem-client-kernel-module.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/novfs-clear-mappeddrives.patch [moved from src/patches/suse-2.6.27.31/patches.suse/novfs-clear-mappeddrives.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/novfs-gregorian-day-fix [moved from src/patches/suse-2.6.27.31/patches.suse/novfs-gregorian-day-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/novfs-patch-2.6.27 [moved from src/patches/suse-2.6.27.31/patches.suse/novfs-patch-2.6.27 with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Abstract-ocfs2_extent_tree-in-b.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Abstract-ocfs2_extent_tree-in-b.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-an-insertion-check-to-ocfs2_extent_tree_o.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-an-insertion-check-to-ocfs2_extent_tree_o.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-clusters-free-in-dealloc_ctxt.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-clusters-free-in-dealloc_ctxt.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-empty-bucket-support-in-xattr.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-empty-bucket-support-in-xattr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-extended-attribute-support.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-extended-attribute-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-extent-tree-operation-for-x.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-extent-tree-operation-for-x.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-helper-function-in-uptodate.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-helper-function-in-uptodate.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-incompatible-flag-for-exten.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-incompatible-flag-for-exten.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-quota-calls-for-allocation-and-freeing-of.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-quota-calls-for-allocation-and-freeing-of.patch with 90% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-the-basic-xattr-disk-layout-in-ocf.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-the-basic-xattr-disk-layout-in-ocf.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-the-inode64-mount-option.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-the-inode64-mount-option.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-xattr-bucket-iteration-for.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-xattr-bucket-iteration-for.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-xattr-index-tree-operations.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-xattr-index-tree-operations.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-xattr-lookup-code-xattr-btr.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-xattr-lookup-code-xattr-btr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-xattr-mount-option-in-ocfs2_show_options.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-xattr-mount-option-in-ocfs2_show_options.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Assign-feature-bits-and-system-inodes-to-quot.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Assign-feature-bits-and-system-inodes-to-quot.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Calculate-EA-hash-only-by-its-suffix.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Calculate-EA-hash-only-by-its-suffix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Change-ocfs2_get_-_extent_tree-to-ocfs2_ini.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Change-ocfs2_get_-_extent_tree-to-ocfs2_ini.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Change-quotafile-names.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Change-quotafile-names.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Comment-struct-ocfs2_extent_tree_operations.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Comment-struct-ocfs2_extent_tree_operations.patch with 95% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Convenient-access-to-an-xattr-bucket-s-block.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Convenient-access-to-an-xattr-bucket-s-block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Convenient-access-to-an-xattr-bucket-s-header.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Convenient-access-to-an-xattr-bucket-s-header.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Convenient-access-to-xattr-bucket-data-blocks.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Convenient-access-to-xattr-bucket-data-blocks.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Copy-xattr-buckets-with-a-dedicated-function.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Copy-xattr-buckets-with-a-dedicated-function.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Create-specific-get_extent_tree-functions.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Create-specific-get_extent_tree-functions.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Delete-all-xattr-buckets-during.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Delete-all-xattr-buckets-during.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Determine-an-extent-tree-s-max_leaf_clusters.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Determine-an-extent-tree-s-max_leaf_clusters.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Documentation-update-for-user_xattr-nouser_.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Documentation-update-for-user_xattr-nouser_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Don-t-check-for-NULL-before-brelse.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Don-t-check-for-NULL-before-brelse.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Enable-quota-accounting-on-mount-disable-on.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Enable-quota-accounting-on-mount-disable-on.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Enable-xattr-set-in-index-btree.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Enable-xattr-set-in-index-btree.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Field-prefixes-for-the-xattr_bucket-structure.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Field-prefixes-for-the-xattr_bucket-structure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Fix-grace-time-syncing.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Fix-grace-time-syncing.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Fix-hang-in-quota-recovery-code.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Fix-hang-in-quota-recovery-code.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Fix-mount-cleanup-after-quota-failure.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Fix-mount-cleanup-after-quota-failure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Fix-oop-in-recovery-without-quotas [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Fix-oop-in-recovery-without-quotas with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Fix-oops-when-one-quotatype-enabled [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Fix-oops-when-one-quotatype-enabled with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Implement-quota-recovery.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Implement-quota-recovery.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Implement-quota-syncing-thread.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Implement-quota-syncing-thread.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Implementation-of-local-and-global-quota-file.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Implementation-of-local-and-global-quota-file.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Improve-ocfs2_read_xattr_bucket.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Improve-ocfs2_read_xattr_bucket.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Kill-the-last-naked-wait_on_buffer-for-cach.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Kill-the-last-naked-wait_on_buffer-for-cach.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Limit-inode-allocation-to-32bits.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Limit-inode-allocation-to-32bits.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-cached-block-reads-the-common-case.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-cached-block-reads-the-common-case.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-high-level-btree-extend-co.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-high-level-btree-extend-co.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-ocfs2_extent_tree-get-put-instead-of-all.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-ocfs2_extent_tree-get-put-instead-of-all.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-ocfs2_extent_tree-the-first-class-repres.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-ocfs2_extent_tree-the-first-class-repres.patch with 95% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-private-into-object-on-ocfs2_extent_.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-private-into-object-on-ocfs2_extent_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Mark-system-files-as-not-subject-to-quota-acc.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Mark-system-files-as-not-subject-to-quota-acc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Modify-ocfs2_num_free_extents-f.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Modify-ocfs2_num_free_extents-f.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Move-ocfs2_bread-into-dir.c.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Move-ocfs2_bread-into-dir.c.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Move-trusted-and-user-attribute-support-into.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Move-trusted-and-user-attribute-support-into.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Optionally-limit-extent-size-in.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Optionally-limit-extent-size-in.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-POSIX-file-locks-support.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-POSIX-file-locks-support.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Prefix-the-extent-tree-operations-structure.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Prefix-the-extent-tree-operations-structure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Prefix-the-ocfs2_extent_tree-structure.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Prefix-the-ocfs2_extent_tree-structure.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Provide-a-wrapper-to-brelse-xattr-bucket-bu.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Provide-a-wrapper-to-brelse-xattr-bucket-bu.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Provide-the-get_root_el-method-to-ocfs2_ext.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Provide-the-get_root_el-method-to-ocfs2_ext.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Refactor-xattr-list-and-remove-ocfs2_xattr_ha.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Refactor-xattr-list-and-remove-ocfs2_xattr_ha.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Remove-pointless.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Remove-pointless.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Require-an-inode-for-ocfs2_read_block-s.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Require-an-inode-for-ocfs2_read_block-s.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Resolve-deadlock-in-ocfs2_xattr_free_.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Resolve-deadlock-in-ocfs2_xattr_free_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Separate-out-sync-reads-from-ocfs2_read_block.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Separate-out-sync-reads-from-ocfs2_read_block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Simplify-ocfs2_read_block.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Simplify-ocfs2_read_block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Support-nested-transactions.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Support-nested-transactions.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Switch-over-to-JBD2.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Switch-over-to-JBD2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Take-ocfs2_xattr_bucket-structures-off-of-the.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Take-ocfs2_xattr_bucket-structures-off-of-the.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Track-local-alloc-bits-internally.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Track-local-alloc-bits-internally.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Uninline-ocfs2_xattr_name_hash.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Uninline-ocfs2_xattr_name_hash.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-buckets-in-ocfs2_defrag_xattr_bucket.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-buckets-in-ocfs2_defrag_xattr_bucket.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_bucket_find.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_bucket_find.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_create_index_block.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_create_index_block.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_set_entry_in_bucke.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-buckets-in-ocfs2_xattr_set_entry_in_bucke.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-ocfs2_extent_list-instead-o.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Use-struct-ocfs2_extent_tree-in-ocfs2_num_fre.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Use-struct-ocfs2_extent_tree-in-ocfs2_num_fre.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-Wrap-journal_access-journal_dirty-for-xattr-b.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Wrap-journal_access-journal_dirty-for-xattr-b.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-POSIX-ACL-API.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-POSIX-ACL-API.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-mount-option-and-Kconfig-option-for-acl.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-mount-option-and-Kconfig-option-for-acl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_acl_chmod.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_acl_chmod.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_check_acl.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_check_acl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_init_acl-in-mknod.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_init_acl-in-mknod.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_init_security-in-during-file-create.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_init_security-in-during-file-create.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_xattr_get_nolock.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_xattr_get_nolock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-ocfs2_xattr_set_handle.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-ocfs2_xattr_set_handle.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-add-security-xattr-API.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-add-security-xattr-API.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-bug-fix-for-journal-extend-in-xattr.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-bug-fix-for-journal-extend-in-xattr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-fix-build-error.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-fix-build-error.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-fix-printk-format-warnings.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-fix-printk-format-warnings.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-make-la_debug_mutex-static.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-make-la_debug_mutex-static.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-move-new-inode-allocation-out-of-the-transact.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-move-new-inode-allocation-out-of-the-transact.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-reserve-inline-space-for-extend.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-reserve-inline-space-for-extend.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-throttle-back-local-alloc-when-low-on-disk-sp.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-throttle-back-local-alloc-when-low-on-disk-sp.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-track-local-alloc-state-via-debugfs.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-track-local-alloc-state-via-debugfs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-turn-__ocfs2_remove_inode_range-into-ocfs2_.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-turn-__ocfs2_remove_inode_range-into-ocfs2_.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-use-smaller-counters-in-ocfs2_remove_xattr_cl.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-use-smaller-counters-in-ocfs2_remove_xattr_cl.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Merge-xattr-set-transaction.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Merge-xattr-set-transaction.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Move-clusters-free-into-dealloc.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Move-clusters-free-into-dealloc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Only-extend-xattr-bucket-in-need.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Only-extend-xattr-bucket-in-need.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Only-set-buffer-update-if-it-doesn-t-ex.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Only-set-buffer-update-if-it-doesn-t-ex.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Remove-additional-bucket-allocation-in.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Remove-additional-bucket-allocation-in.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr-Reserve-meta-data-at-the-beginning-of-o.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr-Reserve-meta-data-at-the-beginning-of-o.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ocfs2-xattr.c-Fix-a-bug-when-inserting-xattr.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ocfs2-xattr.c-Fix-a-bug-when-inserting-xattr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/of_platform_driver.module-owner.patch [moved from src/patches/suse-2.6.27.31/patches.suse/of_platform_driver.module-owner.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/osync-error [moved from src/patches/suse-2.6.27.31/patches.suse/osync-error with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/perfmon2-add_ioctl_interface.patch [moved from src/patches/suse-2.6.27.31/patches.suse/perfmon2-add_ioctl_interface.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/perfmon2-fix_disabled.patch [moved from src/patches/suse-2.6.27.31/patches.suse/perfmon2-fix_disabled.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/perfmon2-remove_get_base_syscall_attr.patch [moved from src/patches/suse-2.6.27.31/patches.suse/perfmon2-remove_get_base_syscall_attr.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/perfmon2-remove_syscalls.patch [moved from src/patches/suse-2.6.27.31/patches.suse/perfmon2-remove_syscalls.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/perfmon2.patch [moved from src/patches/suse-2.6.27.31/patches.suse/perfmon2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ppc-no-LDFLAGS_MODULE.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ppc-no-LDFLAGS_MODULE.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/ppc-powerbook-usb-fn-key-default.patch [moved from src/patches/suse-2.6.27.31/patches.suse/ppc-powerbook-usb-fn-key-default.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Add-callbacks-for-allocating-and-destroying-d.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Add-callbacks-for-allocating-and-destroying-d.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Add-helpers-to-allow-ocfs2-specific-quota-ini.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Add-helpers-to-allow-ocfs2-specific-quota-ini.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Allow-negative-usage-of-space-and-inodes.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Allow-negative-usage-of-space-and-inodes.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Allow-to-separately-enable-quota-accounting-a.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Allow-to-separately-enable-quota-accounting-a.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Convert-union-in-mem_dqinfo-to-a-pointer.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Convert-union-in-mem_dqinfo-to-a-pointer.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Implement-function-for-scanning-active-dquots.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Implement-function-for-scanning-active-dquots.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Increase-size-of-variables-for-limits-and-ino.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Increase-size-of-variables-for-limits-and-ino.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Introduce-DQUOT_QUOTA_SYS_FILE-flag.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Introduce-DQUOT_QUOTA_SYS_FILE-flag.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Keep-which-entries-were-set-by-SETQUOTA-quota.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Keep-which-entries-were-set-by-SETQUOTA-quota.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Make-_SUSPENDED-just-a-flag.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Make-_SUSPENDED-just-a-flag.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Move-quotaio_v-12-.h-from-include-linux-to-f.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Move-quotaio_v-12-.h-from-include-linux-to-f.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Remove-bogus-optimization-in-check_idq-an.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Remove-bogus-optimization-in-check_idq-an.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Remove-compatibility-function-sb_any_quota_en.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Remove-compatibility-function-sb_any_quota_en.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/quota-Split-off-quota-tree-handling-into-a-separate.patch [moved from src/patches/suse-2.6.27.31/patches.suse/quota-Split-off-quota-tree-handling-into-a-separate.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/radeon-monitor-jsxx-quirk.patch [moved from src/patches/suse-2.6.27.31/patches.suse/radeon-monitor-jsxx-quirk.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiser4-exports [moved from src/patches/suse-2.6.27.31/patches.suse/reiser4-exports with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiser4-sync_inodes [moved from src/patches/suse-2.6.27.31/patches.suse/reiser4-sync_inodes with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-Use-sb_any_quota_loaded-instead-of-sb_an.patch [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-Use-sb_any_quota_loaded-instead-of-sb_an.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-barrier-default [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-barrier-default with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-clean-up-xattrs [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-clean-up-xattrs with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-inode-init [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-inode-init with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-mount-count [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-mount-count with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-remove-xinode [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-xinode with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-xattr-S_PRIVATE [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-xattr-S_PRIVATE with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs-xattr-get-page [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs-xattr-get-page with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/reiserfs_warning-reentrant [moved from src/patches/suse-2.6.27.31/patches.suse/reiserfs_warning-reentrant with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/rlimit-memlock-64k.patch [moved from src/patches/suse-2.6.27.31/patches.suse/rlimit-memlock-64k.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/rq-based-multipath [moved from src/patches/suse-2.6.27.31/patches.suse/rq-based-multipath with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/rwlocks-enable-interrupts [moved from src/patches/suse-2.6.27.31/patches.suse/rwlocks-enable-interrupts with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/scsi-check-removed-device-for-offline [moved from src/patches/suse-2.6.27.31/patches.suse/scsi-check-removed-device-for-offline with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/scsi-error-test-unit-ready-timeout [moved from src/patches/suse-2.6.27.31/patches.suse/scsi-error-test-unit-ready-timeout with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/scsi-netlink-ml [moved from src/patches/suse-2.6.27.31/patches.suse/scsi-netlink-ml with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/self-ptrace.patch [moved from src/patches/suse-2.6.27.31/patches.suse/self-ptrace.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/setuid-dumpable-wrongdir [moved from src/patches/suse-2.6.27.31/patches.suse/setuid-dumpable-wrongdir with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/shmall-bigger [moved from src/patches/suse-2.6.27.31/patches.suse/shmall-bigger with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/silent-stack-overflow [moved from src/patches/suse-2.6.27.31/patches.suse/silent-stack-overflow with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/silent-stack-overflow-2.patch [moved from src/patches/suse-2.6.27.31/patches.suse/silent-stack-overflow-2.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/squashfs-3.4.patch [moved from src/patches/suse-2.6.27.31/patches.suse/squashfs-3.4.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/stack-unwind [moved from src/patches/suse-2.6.27.31/patches.suse/stack-unwind with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/supported-flag [moved from src/patches/suse-2.6.27.31/patches.suse/supported-flag with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/supported-flag-sysfs [moved from src/patches/suse-2.6.27.31/patches.suse/supported-flag-sysfs with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-BIT [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-BIT with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-get-property [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-get-property with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-handle-mm-fault [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-handle-mm-fault with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-ioctl [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-ioctl with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-kbuild.patch [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-kbuild.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-semaphore [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-semaphore with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol-sheep [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol-sheep with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol.patch [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol.patch with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/suse-ppc64-branding [moved from src/patches/suse-2.6.27.31/patches.suse/suse-ppc64-branding with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/sysctl-add-affinity_load_balancing [moved from src/patches/suse-2.6.27.31/patches.suse/sysctl-add-affinity_load_balancing with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/twofish-2.6 [moved from src/patches/suse-2.6.27.31/patches.suse/twofish-2.6 with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/unlock_page-speedup.patch [moved from src/patches/suse-2.6.27.31/patches.suse/unlock_page-speedup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/unmap_vmas-lat [moved from src/patches/suse-2.6.27.31/patches.suse/unmap_vmas-lat with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/usb-move-ehci-reg-def.patch [moved from src/patches/suse-2.6.27.31/patches.suse/usb-move-ehci-reg-def.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/usb-storage-disable-delay.patch [moved from src/patches/suse-2.6.27.31/patches.suse/usb-storage-disable-delay.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/wireless-no-aes-select [moved from src/patches/suse-2.6.27.31/patches.suse/wireless-no-aes-select with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/x86-gb-linear-map.patch [moved from src/patches/suse-2.6.27.31/patches.suse/x86-gb-linear-map.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/x86-mark_rodata_rw-2.patch [moved from src/patches/suse-2.6.27.31/patches.suse/x86-mark_rodata_rw-2.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/x86-mark_rodata_rw.patch [moved from src/patches/suse-2.6.27.31/patches.suse/x86-mark_rodata_rw.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/x86-usb-debug-port-early-console-v4.patch [moved from src/patches/suse-2.6.27.31/patches.suse/x86-usb-debug-port-early-console-v4.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-account-for-allocated-blocks-when-expanding-directories [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-account-for-allocated-blocks-when-expanding-directories with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-check-for-valid-transaction-headers-in-recovery [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-check-for-valid-transaction-headers-in-recovery with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-dmapi-enable [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-dmapi-enable with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-dmapi-src [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-dmapi-src with 99% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-dmapi-xfs-enable [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-dmapi-xfs-enable with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-handle-memory-allocation-failures-during-log-initialisation [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-handle-memory-allocation-failures-during-log-initialisation with 100% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-nfsd-dmapi-aware [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-nfsd-dmapi-aware with 98% similarity]
src/patches/suse-2.6.27.39/patches.suse/xfs-wait-for-all-IO-on-truncate-to-zero [moved from src/patches/suse-2.6.27.31/patches.suse/xfs-wait-for-all-IO-on-truncate-to-zero with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/ftrace-port-to-tracepoints.patch [moved from src/patches/suse-2.6.27.31/patches.trace/ftrace-port-to-tracepoints.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-filemap.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-filemap.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-fs.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-fs.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-hugetlb.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-hugetlb.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-ipc.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-ipc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-ipv4.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-ipv4.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-ipv6.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-ipv6.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-irq.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-irq.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-kernel.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-kernel.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-memory.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-memory.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-net.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-net.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-page_alloc.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-page_alloc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-scheduler.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-scheduler.patch with 97% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-socket.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-socket.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-swap.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-swap.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-timer.patch [moved from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-timer.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/markers-use-rcu-read-lock-sched.patch [moved from src/patches/suse-2.6.27.31/patches.trace/markers-use-rcu-read-lock-sched.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/rcu-read-sched.patch [moved from src/patches/suse-2.6.27.31/patches.trace/rcu-read-sched.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/s390-utrace-enablement.patch [moved from src/patches/suse-2.6.27.31/patches.trace/s390-utrace-enablement.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-documentation-fix-teardown.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-documentation-fix-teardown.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-documentation.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-documentation.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-samples-fix-teardown.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-samples-fix-teardown.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-samples.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-samples.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-tracepoint-synchronize-unregister.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-tracepoint-synchronize-unregister.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints-use-table-size-macro.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints-use-table-size-macro.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/tracepoints.patch [moved from src/patches/suse-2.6.27.31/patches.trace/tracepoints.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.trace/utrace-core [moved from src/patches/suse-2.6.27.31/patches.trace/utrace-core with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/735-balloon-exit.patch [moved from src/patches/suse-2.6.27.31/patches.xen/735-balloon-exit.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/737-kexec-free.patch [moved from src/patches/suse-2.6.27.31/patches.xen/737-kexec-free.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/740-blkback-resource-leak.patch [moved from src/patches/suse-2.6.27.31/patches.xen/740-blkback-resource-leak.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/746-pirq-status-page.patch [moved from src/patches/suse-2.6.27.31/patches.xen/746-pirq-status-page.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/747-x86-undo-mfn-limit.patch [moved from src/patches/suse-2.6.27.31/patches.xen/747-x86-undo-mfn-limit.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/748-x86-ioapic-cleanup.patch [moved from src/patches/suse-2.6.27.31/patches.xen/748-x86-ioapic-cleanup.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/761-highpte.patch [moved from src/patches/suse-2.6.27.31/patches.xen/761-highpte.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/762-xencons-hvc.patch [moved from src/patches/suse-2.6.27.31/patches.xen/762-xencons-hvc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/764-netback-foreign-pages.patch [moved from src/patches/suse-2.6.27.31/patches.xen/764-netback-foreign-pages.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/769-evtchn-CPU-offline.patch [moved from src/patches/suse-2.6.27.31/patches.xen/769-evtchn-CPU-offline.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/781-fbfront-bogus-rect.patch [moved from src/patches/suse-2.6.27.31/patches.xen/781-fbfront-bogus-rect.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/782-netback-error-handling.patch [moved from src/patches/suse-2.6.27.31/patches.xen/782-netback-error-handling.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/791-x86-pcifront-register-pirq.patch [moved from src/patches/suse-2.6.27.31/patches.xen/791-x86-pcifront-register-pirq.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/797-pirq-range-check.patch [moved from src/patches/suse-2.6.27.31/patches.xen/797-pirq-range-check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/801-pciback-no-pci_match_id.patch [moved from src/patches/suse-2.6.27.31/patches.xen/801-pciback-no-pci_match_id.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/803-netfront-unregister-notifier.patch [moved from src/patches/suse-2.6.27.31/patches.xen/803-netfront-unregister-notifier.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/805-blkfront-map-sg.patch [moved from src/patches/suse-2.6.27.31/patches.xen/805-blkfront-map-sg.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/821-xenbus-state-strings.patch [moved from src/patches/suse-2.6.27.31/patches.xen/821-xenbus-state-strings.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/832-ntp-interaction.patch [moved from src/patches/suse-2.6.27.31/patches.xen/832-ntp-interaction.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/844-swiotlb-alloc.patch [moved from src/patches/suse-2.6.27.31/patches.xen/844-swiotlb-alloc.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/848-sfc-vif-states-lock.patch [moved from src/patches/suse-2.6.27.31/patches.xen/848-sfc-vif-states-lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/849-sfc-tx-skb-lock.patch [moved from src/patches/suse-2.6.27.31/patches.xen/849-sfc-tx-skb-lock.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/863-blktap-vma-close.patch [moved from src/patches/suse-2.6.27.31/patches.xen/863-blktap-vma-close.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/870-i386-critical-section.patch [moved from src/patches/suse-2.6.27.31/patches.xen/870-i386-critical-section.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/897-balloon-keep-trying.patch [moved from src/patches/suse-2.6.27.31/patches.xen/897-balloon-keep-trying.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/899-kbuild-extmod.patch [moved from src/patches/suse-2.6.27.31/patches.xen/899-kbuild-extmod.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/914-dynamic-Cx-change.patch [moved from src/patches/suse-2.6.27.31/patches.xen/914-dynamic-Cx-change.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/932-edac.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/933-usb-mon-dma.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/add-console-use-vt [moved from src/patches/suse-2.6.27.31/patches.xen/add-console-use-vt with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/gso-size-check.patch [moved from src/patches/suse-2.6.27.31/patches.xen/gso-size-check.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/ipv6-no-autoconf [moved from src/patches/suse-2.6.27.31/patches.xen/ipv6-no-autoconf with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/linux-2.6.19-rc1-kexec-move_segment_code-i386.patch [moved from src/patches/suse-2.6.27.31/patches.xen/linux-2.6.19-rc1-kexec-move_segment_code-i386.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch [moved from src/patches/suse-2.6.27.31/patches.xen/linux-2.6.19-rc1-kexec-move_segment_code-x86_64.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/pci-reassign-resources [moved from src/patches/suse-2.6.27.31/patches.xen/pci-reassign-resources with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/sfc-driverlink [moved from src/patches/suse-2.6.27.31/patches.xen/sfc-driverlink with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/sfc-driverlink-conditional [moved from src/patches/suse-2.6.27.31/patches.xen/sfc-driverlink-conditional with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/sfc-external-sram [moved from src/patches/suse-2.6.27.31/patches.xen/sfc-external-sram with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/sfc-resource-driver [moved from src/patches/suse-2.6.27.31/patches.xen/sfc-resource-driver with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/sfc-sync-headers [moved from src/patches/suse-2.6.27.31/patches.xen/sfc-sync-headers with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-S3-MSI [moved from src/patches/suse-2.6.27.31/patches.xen/xen-S3-MSI with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-balloon-accounting [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen-balloon-max-target [moved from src/patches/suse-2.6.27.31/patches.xen/xen-balloon-max-target with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blkback-bimodal-suse [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blkback-bimodal-suse with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blkback-cdrom [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blkback-cdrom with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blkfront-cdrom [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blkfront-cdrom with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blkif-protocol-fallback-hack [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blkif-protocol-fallback-hack with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blktap-vma-close-fix [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blktap-vma-close-fix with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-blktap-write-barriers [moved from src/patches/suse-2.6.27.31/patches.xen/xen-blktap-write-barriers with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-configurable-guest-devices [moved from src/patches/suse-2.6.27.31/patches.xen/xen-configurable-guest-devices with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-cpufreq-report [moved from src/patches/suse-2.6.27.31/patches.xen/xen-cpufreq-report with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-i386-panic-on-oops [moved from src/patches/suse-2.6.27.31/patches.xen/xen-i386-panic-on-oops with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-ipi-per-cpu-irq [moved from src/patches/suse-2.6.27.31/patches.xen/xen-ipi-per-cpu-irq with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-kconfig-compat-3.2.0 [moved from src/patches/suse-2.6.27.31/patches.xen/xen-kconfig-compat-3.2.0 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-modular-blktap [moved from src/patches/suse-2.6.27.31/patches.xen/xen-modular-blktap with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-netback-notify-multi [moved from src/patches/suse-2.6.27.31/patches.xen/xen-netback-notify-multi with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-netback-nr-irqs [moved from src/patches/suse-2.6.27.31/patches.xen/xen-netback-nr-irqs with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-op-packet [moved from src/patches/suse-2.6.27.31/patches.xen/xen-op-packet with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-rt2860-build [moved from src/patches/suse-2.6.27.31/patches.xen/xen-rt2860-build with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-scsifront-block-timeout-update [moved from src/patches/suse-2.6.27.31/patches.xen/xen-scsifront-block-timeout-update with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-sections [moved from src/patches/suse-2.6.27.31/patches.xen/xen-sections with 77% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-swiotlb-heuristics [moved from src/patches/suse-2.6.27.31/patches.xen/xen-swiotlb-heuristics with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-sysdev-suspend [moved from src/patches/suse-2.6.27.31/patches.xen/xen-sysdev-suspend with 87% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-virq-per-cpu-irq [moved from src/patches/suse-2.6.27.31/patches.xen/xen-virq-per-cpu-irq with 93% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-bigmem [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-bigmem with 70% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-consistent-nmi [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-consistent-nmi with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-dcr-fallback [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-dcr-fallback with 83% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-exit-mmap [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-exit-mmap with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-exports [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-exports with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-machphys-prediction [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-machphys-prediction with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-no-lapic [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-no-lapic with 86% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-no-lazy-tlb [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-no-lazy-tlb with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-panic-no-reboot [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-panic-no-reboot with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86-pmd-handling [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86-pmd-handling with 92% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86_64-dump-user-pgt [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86_64-dump-user-pgt with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86_64-note-init-p2m [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86_64-note-init-p2m with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86_64-pgd-alloc-order [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86_64-pgd-alloc-order with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen-x86_64-pgd-pin [moved from src/patches/suse-2.6.27.31/patches.xen/xen-x86_64-pgd-pin with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-acpi-pci-pci-msi-_osc-support-capabilities-called-when-root-bridge-added.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-acpi-pci-pci-msi-_osc-support-capabilities-called-when-root-bridge-added.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-acpi_assure_unique_processor_proc_creation.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen3-add-via-chrome9-drm-support.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen3-bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-arch-x86 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-arch-x86 with 53% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-common [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-common with 86% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-kconfig [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-kconfig with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-xen [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-xen with 95% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-intel-ibex-peak-device-ids.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-intel-ibex-peak-device-ids.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-kdb-x86 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-kdb-x86 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.18 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.18 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.19 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.19 with 95% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.20 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.20 with 94% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.21 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.21 with 92% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.22 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.22 with 94% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.23 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.23 with 90% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.24 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.24 with 94% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.25 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.25 with 98% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.26 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.26 with 97% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27 with 97% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.1-2 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.1-2 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.11-12 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.11-12 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.14-15 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.14-15 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.15-16 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.15-16 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.18-19 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.18-19 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.19-20 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.19-20 with 74% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.24-25 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.24-25 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.25-26 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.25-26 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.3-4 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.3-4 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.36-37 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.38-39 [new file with mode: 0644]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.4-5 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.4-5 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.5-6 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.5-6 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.7-8 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.7-8 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.8-9 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.8-9 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.9-10 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.9-10 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-perfmon2-remove_syscalls.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-perfmon2-remove_syscalls.patch with 79% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-perfmon2.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-perfmon2.patch with 77% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-remove_kernel_physical_mapping_init_from_init [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-remove_kernel_physical_mapping_init_from_init with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-rwlocks-enable-interrupts [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-rwlocks-enable-interrupts with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-seccomp-disable-tsc-option [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-seccomp-disable-tsc-option with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-silent-stack-overflow [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-silent-stack-overflow with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-stack-unwind [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-stack-unwind with 87% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-sysfs-crash-debugging.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-sysfs-crash-debugging.patch with 58% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x2APIC_PATCH_20_of_41_cff73a6ffaed726780b001937d2a42efde553922 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x2APIC_PATCH_20_of_41_cff73a6ffaed726780b001937d2a42efde553922 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x2APIC_PATCH_27_of_41_9fa8c481b55e80edd8c637573f87853bb6b600f5 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x2APIC_PATCH_27_of_41_9fa8c481b55e80edd8c637573f87853bb6b600f5 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x2APIC_PATCH_40_of_41_bbb65d2d365efe9951290e61678dcf81ec60add4 [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x2APIC_PATCH_40_of_41_bbb65d2d365efe9951290e61678dcf81ec60add4 with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-fix-kmap-contig.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-fix-kmap-contig.patch with 92% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-fix-nodac [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-fix-nodac with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-mark_rodata_rw-2.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-mark_rodata_rw-2.patch with 96% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-mark_rodata_rw.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-mark_rodata_rw.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-mcp51-no-dac [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-mcp51-no-dac with 86% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-pageattr-pmd-permission-fix.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-pageattr-pmd-permission-fix.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-usb-debug-port-early-console-v4.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-usb-debug-port-early-console-v4.patch with 98% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86-vmware-tsc-03-detect-from-hypervisor [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-vmware-tsc-03-detect-from-hypervisor with 80% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86_64-unwind-annotations [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86_64-unwind-annotations with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86_sgi_cpus4096-02-fix-send_call_func_ip.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86_sgi_cpus4096-02-fix-send_call_func_ip.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86_sgi_cpus4096-05-update-send_IPI_mask.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86_sgi_cpus4096-05-update-send_IPI_mask.patch with 100% similarity]
src/patches/suse-2.6.27.39/patches.xen/xen3-x86_sgi_uv_early_detect_oem.patch [moved from src/patches/suse-2.6.27.31/patches.xen/xen3-x86_sgi_uv_early_detect_oem.patch with 100% similarity]
src/patches/suse-2.6.27.39/series.conf [moved from src/patches/suse-2.6.27.31/series.conf with 91% similarity]

diff --git a/make.sh b/make.sh
index d13e8aac872cac1579172ab98f38181dd2e0fcd0..8c0d5bafe75b205498214f8f90951de6f6b534b7 100755 (executable)
--- a/make.sh
+++ b/make.sh
@@ -340,20 +340,21 @@ buildipfire() {
   ipfiremake pptp
   ipfiremake unzip
   ipfiremake which
-#  ipfiremake linux                    XEN=1
-#  ipfiremake atl2                     XEN=1
-#  ipfiremake hso                      XEN=1
-#  ipfiremake e1000e                   XEN=1
-#  ipfiremake r8101                    XEN=1
-#  ipfiremake r8169                    XEN=1
-#  ipfiremake r8168                    XEN=1
-#  ipfiremake kqemu                    XEN=1
-#  ipfiremake v4l-dvb                  XEN=1
-#  ipfiremake madwifi                  XEN=1
-##  ipfiremake alsa                    XEN=1 KMOD=1
-#  ipfiremake openswan                 XEN=1 KMOD=1
-#  ipfiremake mISDN                    XEN=1
-#  ipfiremake compat-wireless          XEN=1
+  ipfiremake linux                     XEN=1
+  ipfiremake atl2                      XEN=1
+  ipfiremake hso                       XEN=1
+  ipfiremake e1000e                    XEN=1
+  ipfiremake r8101                     XEN=1
+  ipfiremake r8169                     XEN=1
+  ipfiremake r8168                     XEN=1
+  ipfiremake kqemu                     XEN=1
+  #ipfiremake kvm-kmod                 XEN=1
+  ipfiremake v4l-dvb                   XEN=1
+  ipfiremake madwifi                   XEN=1
+  #ipfiremake alsa                     XEN=1 KMOD=1
+  ipfiremake openswan                  XEN=1 KMOD=1
+  ipfiremake mISDN                     XEN=1
+  ipfiremake compat-wireless           XEN=1
   ipfiremake linux
   ipfiremake atl2
   ipfiremake hso
@@ -728,14 +729,14 @@ buildpackages() {
 
   ipfirepackages
 
-#  # Check if there is a loop device for building in virtual environments
-#  if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
-#        cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
-#        cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
-#      ipfiremake xen-image ED=$IPFVER
-#      rm -rf $LFS/install/packages/linux-xen-*.ipfire
-#      rm -rf $LFS/install/packages/meta-linux-xen
-# fi
+  # Check if there is a loop device for building in virtual environments
+  if [ -e /dev/loop/0 ] || [ -e /dev/loop0 ]; then
+        cp -f $BASEDIR/packages/linux-xen-*.ipfire $LFS/install/packages/
+        cp -f $BASEDIR/packages/meta-linux-xen $LFS/install/packages/
+       ipfiremake xen-image ED=$IPFVER
+       rm -rf $LFS/install/packages/linux-xen-*.ipfire
+       rm -rf $LFS/install/packages/meta-linux-xen
+  fi
   mv $LFS/install/images/*.bz2 $BASEDIR >> $LOGFILE 2>&1
 
   # Cleanup
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/add-path_permission.diff b/src/patches/suse-2.6.27.31/patches.apparmor/add-path_permission.diff
deleted file mode 100644 (file)
index 0eb796d..0000000
+++ /dev/null
@@ -1,201 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH] vfs: introduce path_permission()
-
- 2.6.27 eliminated the nameidata parameter from permission and replaced
- several call sites with inode_permission. This keeps the information
- required by AppArmor from reaching it.
-
- The following patch factors out the permission assessment part of
- inode_permission into __inode_permission and adds a path_permission
- function that takes a struct path instead of a struct inode and passes
- it to security_path_permission instead of security_inode_permission.
-
- All of the call sites that had access to a struct path whether by
- itself or via a file or nameidata (and used it) in 2.6.26 are changed
- to use the path_permission call.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
----
- fs/inotify_user.c  |    2 +-
- fs/namei.c         |   32 ++++++++++++++++++++++++--------
- fs/open.c          |   10 +++++-----
- include/linux/fs.h |    5 +++++
- 4 files changed, 35 insertions(+), 14 deletions(-)
-
---- a/fs/inotify_user.c
-+++ b/fs/inotify_user.c
-@@ -372,7 +372,7 @@ static int find_inode(const char __user
-       if (error)
-               return error;
-       /* you can only watch an inode if you have read permissions on it */
--      error = inode_permission(path->dentry->d_inode, MAY_READ);
-+      error = path_permission(path, MAY_READ);
-       if (error)
-               path_put(path);
-       return error;
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -227,7 +227,7 @@ int generic_permission(struct inode *ino
-       return -EACCES;
- }
--int inode_permission(struct inode *inode, int mask)
-+static int __inode_permission(struct inode *inode, int mask)
- {
-       int retval;
-       int submask = mask;
-@@ -273,7 +273,12 @@ int inode_permission(struct inode *inode
-       if (retval)
-               return retval;
--      retval = devcgroup_inode_permission(inode, mask);
-+      return devcgroup_inode_permission(inode, mask);
-+}
-+
-+int inode_permission(struct inode *inode, int mask)
-+{
-+      int retval = __inode_permission(inode, mask);
-       if (retval)
-               return retval;
-@@ -281,6 +286,15 @@ int inode_permission(struct inode *inode
-                       mask & (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND));
- }
-+int path_permission(struct path *path, int mask)
-+{
-+      int retval = __inode_permission(path->dentry->d_inode, mask);
-+      if (retval)
-+              return retval;
-+      return security_path_permission(path,
-+                      mask & (MAY_READ|MAY_WRITE|MAY_EXEC|MAY_APPEND));
-+}
-+
- /**
-  * vfs_permission  -  check for access rights to a given path
-  * @nd:               lookup result that describes the path
-@@ -293,7 +307,7 @@ int inode_permission(struct inode *inode
-  */
- int vfs_permission(struct nameidata *nd, int mask)
- {
--      return inode_permission(nd->path.dentry->d_inode, mask);
-+      return path_permission(&nd->path, mask);
- }
- /**
-@@ -310,7 +324,7 @@ int vfs_permission(struct nameidata *nd,
-  */
- int file_permission(struct file *file, int mask)
- {
--      return inode_permission(file->f_path.dentry->d_inode, mask);
-+      return path_permission(&file->f_path, mask);
- }
- /*
-@@ -452,8 +466,9 @@ static struct dentry * cached_lookup(str
-  * short-cut DAC fails, then call permission() to do more
-  * complete permission check.
-  */
--static int exec_permission_lite(struct inode *inode)
-+static int exec_permission_lite(struct path *path)
- {
-+      struct inode *inode = path->dentry->d_inode;
-       umode_t mode = inode->i_mode;
-       if (inode->i_op && inode->i_op->permission)
-@@ -478,7 +493,7 @@ static int exec_permission_lite(struct i
-       return -EACCES;
- ok:
--      return security_inode_permission(inode, MAY_EXEC);
-+      return security_path_permission(path, MAY_EXEC);
- }
- /*
-@@ -875,7 +890,7 @@ static int __link_path_walk(const char *
-               unsigned int c;
-               nd->flags |= LOOKUP_CONTINUE;
--              err = exec_permission_lite(inode);
-+              err = exec_permission_lite(&nd->path);
-               if (err == -EAGAIN)
-                       err = vfs_permission(nd, MAY_EXEC);
-               if (err)
-@@ -1250,7 +1265,7 @@ static struct dentry *lookup_hash(struct
- {
-       int err;
--      err = inode_permission(nd->path.dentry->d_inode, MAY_EXEC);
-+      err = path_permission(&nd->path, MAY_EXEC);
-       if (err)
-               return ERR_PTR(err);
-       return __lookup_hash(&nd->last, nd->path.dentry, nd);
-@@ -2907,6 +2922,7 @@ EXPORT_SYMBOL(page_symlink_inode_operati
- EXPORT_SYMBOL(path_lookup);
- EXPORT_SYMBOL(vfs_path_lookup);
- EXPORT_SYMBOL(inode_permission);
-+EXPORT_SYMBOL(path_permission);
- EXPORT_SYMBOL(vfs_permission);
- EXPORT_SYMBOL(file_permission);
- EXPORT_SYMBOL(unlock_rename);
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -248,7 +248,7 @@ static long do_sys_truncate(const char _
-       if (error)
-               goto dput_and_out;
--      error = inode_permission(inode, MAY_WRITE);
-+      error = path_permission(&path, MAY_WRITE);
-       if (error)
-               goto mnt_drop_write_and_out;
-@@ -493,7 +493,7 @@ SYSCALL_DEFINE3(faccessat, int, dfd, con
-                       goto out_path_release;
-       }
--      res = inode_permission(inode, mode | MAY_ACCESS);
-+      res = path_permission(&path, mode | MAY_ACCESS);
-       /* SuS v2 requires we report a read only fs too */
-       if (res || !(mode & S_IWOTH) || special_file(inode->i_mode))
-               goto out_path_release;
-@@ -536,7 +536,7 @@ SYSCALL_DEFINE1(chdir, const char __user
-       if (error)
-               goto out;
--      error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
-+      error = path_permission(&path, MAY_EXEC | MAY_ACCESS);
-       if (error)
-               goto dput_and_out;
-@@ -565,7 +565,7 @@ SYSCALL_DEFINE1(fchdir, unsigned int, fd
-       if (!S_ISDIR(inode->i_mode))
-               goto out_putf;
--      error = inode_permission(inode, MAY_EXEC | MAY_ACCESS);
-+      error = path_permission(&file->f_path, MAY_EXEC | MAY_ACCESS);
-       if (!error)
-               set_fs_pwd(current->fs, &file->f_path);
- out_putf:
-@@ -583,7 +583,7 @@ SYSCALL_DEFINE1(chroot, const char __use
-       if (error)
-               goto out;
--      error = inode_permission(path.dentry->d_inode, MAY_EXEC | MAY_ACCESS);
-+      error = path_permission(&path, MAY_EXEC | MAY_ACCESS);
-       if (error)
-               goto dput_and_out;
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1201,6 +1201,11 @@ extern void dentry_unhash(struct dentry
- extern int file_permission(struct file *, int);
- /*
-+ * VFS path helper functions.
-+ */
-+extern int path_permission(struct path *, int);
-+
-+/*
-  * File types
-  *
-  * NOTE! These match bits 12..15 of stat.st_mode
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-2.6.25.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-2.6.25.diff
deleted file mode 100644 (file)
index 56bf22a..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: Patch AppArmor for 2.6.25 kernel
-
-Add 64 bit capabilities support to AppArmor.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- security/apparmor/module_interface.c |   22 ++++++++++++++++++----
- 1 file changed, 18 insertions(+), 4 deletions(-)
-
---- a/security/apparmor/module_interface.c
-+++ b/security/apparmor/module_interface.c
-@@ -395,15 +395,29 @@ static struct aa_profile *aa_unpack_prof
-       if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-               goto fail;
--      if (!aa_is_u32(e, &(profile->capabilities), NULL))
-+      if (!aa_is_u32(e, &(profile->capabilities.cap[0]), NULL))
-               goto fail;
--      if (!aa_is_u32(e, &(profile->audit_caps), NULL))
-+      if (!aa_is_u32(e, &(profile->audit_caps.cap[0]), NULL))
-               goto fail;
--      if (!aa_is_u32(e, &(profile->quiet_caps), NULL))
-+      if (!aa_is_u32(e, &(profile->quiet_caps.cap[0]), NULL))
-               goto fail;
--      if (!aa_is_u32(e, &(profile->set_caps), NULL))
-+      if (!aa_is_u32(e, &(profile->set_caps.cap[0]), NULL))
-               goto fail;
-+      if (aa_is_nameX(e, AA_STRUCT, "caps64")) {
-+              /* optional upper half of 64 bit caps */
-+              if (!aa_is_u32(e, &(profile->capabilities.cap[1]), NULL))
-+                      goto fail;
-+              if (!aa_is_u32(e, &(profile->audit_caps.cap[1]), NULL))
-+                      goto fail;
-+              if (!aa_is_u32(e, &(profile->quiet_caps.cap[1]), NULL))
-+                      goto fail;
-+              if (!aa_is_u32(e, &(profile->set_caps.cap[1]), NULL))
-+                      goto fail;
-+              if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-+                      goto fail;
-+      }
-+
-       if (!aa_unpack_rlimits(e, profile))
-               goto fail;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-audit.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-audit.diff
deleted file mode 100644 (file)
index 37ee484..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Export audit subsystem for use by modules
-
-Update kenel audit range comments to show AppArmor's registered range of
-1500-1599.  This range used to be reserved for LSPP but LSPP uses the
-SE Linux range and the range was given to AppArmor.
-Adds necessary export symbols for audit subsystem routines.
-Changes audit_log_vformat to be externally visible (analagous to vprintf)
-Patch is not in mainline -- pending AppArmor code submission to lkml
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- include/linux/audit.h |   12 +++++++++++-
- kernel/audit.c        |    6 ++++--
- 2 files changed, 15 insertions(+), 3 deletions(-)
-
---- a/include/linux/audit.h
-+++ b/include/linux/audit.h
-@@ -33,7 +33,7 @@
-  * 1200 - 1299 messages internal to the audit daemon
-  * 1300 - 1399 audit event messages
-  * 1400 - 1499 SE Linux use
-- * 1500 - 1599 kernel LSPP events
-+ * 1500 - 1599 AppArmor use
-  * 1600 - 1699 kernel crypto events
-  * 1700 - 1799 kernel anomaly records
-  * 1800 - 1999 future kernel use (maybe integrity labels and related events)
-@@ -119,6 +119,13 @@
- #define AUDIT_MAC_UNLBL_STCADD        1416    /* NetLabel: add a static label */
- #define AUDIT_MAC_UNLBL_STCDEL        1417    /* NetLabel: del a static label */
-+#define AUDIT_APPARMOR_AUDIT  1501    /* AppArmor audited grants */
-+#define AUDIT_APPARMOR_ALLOWED        1502    /* Allowed Access for learning */
-+#define AUDIT_APPARMOR_DENIED 1503
-+#define AUDIT_APPARMOR_HINT   1504    /* Process Tracking information */
-+#define AUDIT_APPARMOR_STATUS 1505    /* Changes in config */
-+#define AUDIT_APPARMOR_ERROR  1506    /* Internal AppArmor Errors */
-+
- #define AUDIT_FIRST_KERN_ANOM_MSG   1700
- #define AUDIT_LAST_KERN_ANOM_MSG    1799
- #define AUDIT_ANOM_PROMISCUOUS      1700 /* Device changed promiscuous mode */
-@@ -545,6 +552,9 @@ extern void                    audit_log(struct audit_
-                                     __attribute__((format(printf,4,5)));
- extern struct audit_buffer *audit_log_start(struct audit_context *ctx, gfp_t gfp_mask, int type);
-+extern void               audit_log_vformat(struct audit_buffer *ab,
-+                                            const char *fmt, va_list args)
-+                          __attribute__((format(printf,2,0)));
- extern void               audit_log_format(struct audit_buffer *ab,
-                                            const char *fmt, ...)
-                           __attribute__((format(printf,2,3)));
---- a/kernel/audit.c
-+++ b/kernel/audit.c
-@@ -1231,8 +1231,7 @@ static inline int audit_expand(struct au
-  * will be called a second time.  Currently, we assume that a printk
-  * can't format message larger than 1024 bytes, so we don't either.
-  */
--static void audit_log_vformat(struct audit_buffer *ab, const char *fmt,
--                            va_list args)
-+void audit_log_vformat(struct audit_buffer *ab, const char *fmt, va_list args)
- {
-       int len, avail;
-       struct sk_buff *skb;
-@@ -1506,3 +1505,6 @@ EXPORT_SYMBOL(audit_log_start);
- EXPORT_SYMBOL(audit_log_end);
- EXPORT_SYMBOL(audit_log_format);
- EXPORT_SYMBOL(audit_log);
-+EXPORT_SYMBOL_GPL(audit_log_vformat);
-+EXPORT_SYMBOL_GPL(audit_log_untrustedstring);
-+EXPORT_SYMBOL_GPL(audit_log_d_path);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-intree.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-intree.diff
deleted file mode 100644 (file)
index 7c29501..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: Add AppArmor LSM to security/Makefile
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- security/Kconfig  |    1 +
- security/Makefile |    3 ++-
- 2 files changed, 3 insertions(+), 1 deletion(-)
-
---- a/security/Kconfig
-+++ b/security/Kconfig
-@@ -97,6 +97,7 @@ config SECURITY_ROOTPLUG
- source security/selinux/Kconfig
- source security/smack/Kconfig
-+source security/apparmor/Kconfig
- endmenu
---- a/security/Makefile
-+++ b/security/Makefile
-@@ -14,5 +14,6 @@ obj-$(CONFIG_SECURITY)                       += security.o c
- # Must precede capability.o in order to stack properly.
- obj-$(CONFIG_SECURITY_SELINUX)                += selinux/built-in.o
- obj-$(CONFIG_SECURITY_SMACK)          += smack/built-in.o
--obj-$(CONFIG_SECURITY_ROOTPLUG)               += root_plug.o
-+obj-$(CONFIG_SECURITY_APPARMOR)         += commoncap.o apparmor/
-+ obj-$(CONFIG_SECURITY_ROOTPLUG)              += root_plug.o
- obj-$(CONFIG_CGROUP_DEVICE)           += device_cgroup.o
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-lsm.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-lsm.diff
deleted file mode 100644 (file)
index 410099a..0000000
+++ /dev/null
@@ -1,910 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: Module and LSM hooks
-
-Module parameters, LSM hooks, initialization and teardown.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- security/apparmor/lsm.c |  895 ++++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 895 insertions(+)
-
---- /dev/null
-+++ b/security/apparmor/lsm.c
-@@ -0,0 +1,895 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor LSM interface
-+ */
-+
-+#include <linux/security.h>
-+#include <linux/module.h>
-+#include <linux/mm.h>
-+#include <linux/mman.h>
-+#include <linux/mount.h>
-+#include <linux/namei.h>
-+#include <linux/ctype.h>
-+#include <linux/sysctl.h>
-+#include <linux/audit.h>
-+
-+#include "apparmor.h"
-+#include "inline.h"
-+
-+/* Flag indicating whether initialization completed */
-+int apparmor_initialized = 0;
-+
-+static int param_set_aabool(const char *val, struct kernel_param *kp);
-+static int param_get_aabool(char *buffer, struct kernel_param *kp);
-+#define param_check_aabool(name, p) __param_check(name, p, int)
-+
-+static int param_set_aauint(const char *val, struct kernel_param *kp);
-+static int param_get_aauint(char *buffer, struct kernel_param *kp);
-+#define param_check_aauint(name, p) __param_check(name, p, int)
-+
-+/* Flag values, also controllable via /sys/module/apparmor/parameters
-+ * We define special types as we want to do additional mediation.
-+ *
-+ * Complain mode -- in complain mode access failures result in auditing only
-+ * and task is allowed access.  audit events are processed by userspace to
-+ * generate policy.  Default is 'enforce' (0).
-+ * Value is also togglable per profile and referenced when global value is
-+ * enforce.
-+ */
-+int apparmor_complain = 0;
-+module_param_named(complain, apparmor_complain, aabool, S_IRUSR | S_IWUSR);
-+MODULE_PARM_DESC(apparmor_complain, "Toggle AppArmor complain mode");
-+
-+/* Debug mode */
-+int apparmor_debug = 0;
-+module_param_named(debug, apparmor_debug, aabool, S_IRUSR | S_IWUSR);
-+MODULE_PARM_DESC(apparmor_debug, "Toggle AppArmor debug mode");
-+
-+/* Audit mode */
-+int apparmor_audit = 0;
-+module_param_named(audit, apparmor_audit, aabool, S_IRUSR | S_IWUSR);
-+MODULE_PARM_DESC(apparmor_audit, "Toggle AppArmor audit mode");
-+
-+/* Syscall logging mode */
-+int apparmor_logsyscall = 0;
-+module_param_named(logsyscall, apparmor_logsyscall, aabool, S_IRUSR | S_IWUSR);
-+MODULE_PARM_DESC(apparmor_logsyscall, "Toggle AppArmor logsyscall mode");
-+
-+/* Maximum pathname length before accesses will start getting rejected */
-+unsigned int apparmor_path_max = 2 * PATH_MAX;
-+module_param_named(path_max, apparmor_path_max, aauint, S_IRUSR | S_IWUSR);
-+MODULE_PARM_DESC(apparmor_path_max, "Maximum pathname length allowed");
-+
-+/* Boot time disable flag */
-+#ifdef CONFIG_SECURITY_APPARMOR_DISABLE
-+#define AA_ENABLED_PERMS 0600
-+#else
-+#define AA_ENABLED_PERMS 0400
-+#endif
-+static int param_set_aa_enabled(const char *val, struct kernel_param *kp);
-+unsigned int apparmor_enabled = CONFIG_SECURITY_APPARMOR_BOOTPARAM_VALUE;
-+module_param_call(enabled, param_set_aa_enabled, param_get_aauint,
-+                &apparmor_enabled, AA_ENABLED_PERMS);
-+MODULE_PARM_DESC(apparmor_enabled, "Enable/Disable Apparmor on boot");
-+
-+static int __init apparmor_enabled_setup(char *str)
-+{
-+      apparmor_enabled = simple_strtol(str, NULL, 0);
-+      return 1;
-+}
-+__setup("apparmor=", apparmor_enabled_setup);
-+
-+static int param_set_aabool(const char *val, struct kernel_param *kp)
-+{
-+      if (aa_task_context(current))
-+              return -EPERM;
-+      return param_set_bool(val, kp);
-+}
-+
-+static int param_get_aabool(char *buffer, struct kernel_param *kp)
-+{
-+      if (aa_task_context(current))
-+              return -EPERM;
-+      return param_get_bool(buffer, kp);
-+}
-+
-+static int param_set_aauint(const char *val, struct kernel_param *kp)
-+{
-+      if (aa_task_context(current))
-+              return -EPERM;
-+      return param_set_uint(val, kp);
-+}
-+
-+static int param_get_aauint(char *buffer, struct kernel_param *kp)
-+{
-+      if (aa_task_context(current))
-+              return -EPERM;
-+      return param_get_uint(buffer, kp);
-+}
-+
-+/* allow run time disabling of apparmor */
-+static int param_set_aa_enabled(const char *val, struct kernel_param *kp)
-+{
-+      char *endp;
-+      unsigned long l;
-+
-+      if (!apparmor_initialized) {
-+              apparmor_enabled = 0;
-+              return 0;
-+      }
-+
-+      if (aa_task_context(current))
-+              return -EPERM;
-+
-+      if (!apparmor_enabled)
-+              return -EINVAL;
-+
-+      if (!val)
-+              return -EINVAL;
-+
-+      l = simple_strtoul(val, &endp, 0);
-+      if (endp == val || l != 0)
-+              return -EINVAL;
-+
-+      apparmor_enabled = 0;
-+      apparmor_disable();
-+      return 0;
-+}
-+
-+static int aa_reject_syscall(struct task_struct *task, gfp_t flags,
-+                           const char *name)
-+{
-+      struct aa_profile *profile = aa_get_profile(task);
-+      int error = 0;
-+
-+      if (profile) {
-+              error = aa_audit_syscallreject(profile, flags, name);
-+              aa_put_profile(profile);
-+      }
-+
-+      return error;
-+}
-+
-+static int apparmor_ptrace(struct task_struct *parent,
-+                         struct task_struct *child, unsigned int mode)
-+{
-+      struct aa_task_context *cxt;
-+      int error = 0;
-+
-+      /*
-+       * parent can ptrace child when
-+       * - parent is unconfined
-+       * - parent & child are in the same namespace &&
-+       *   - parent is in complain mode
-+       *   - parent and child are confined by the same profile
-+       *   - parent profile has CAP_SYS_PTRACE
-+       */
-+
-+      rcu_read_lock();
-+      cxt = aa_task_context(parent);
-+      if (cxt) {
-+              if (parent->nsproxy != child->nsproxy) {
-+                      struct aa_audit sa;
-+                      memset(&sa, 0, sizeof(sa));
-+                      sa.operation = "ptrace";
-+                      sa.gfp_mask = GFP_ATOMIC;
-+                      sa.parent = parent->pid;
-+                      sa.task = child->pid;
-+                      sa.info = "different namespaces";
-+                      aa_audit_reject(cxt->profile, &sa);
-+                      error = -EPERM;
-+              } else {
-+                      struct aa_task_context *child_cxt =
-+                              aa_task_context(child);
-+
-+                      error = aa_may_ptrace(cxt, child_cxt ?
-+                                                 child_cxt->profile : NULL);
-+                      if (PROFILE_COMPLAIN(cxt->profile)) {
-+                              struct aa_audit sa;
-+                              memset(&sa, 0, sizeof(sa));
-+                              sa.operation = "ptrace";
-+                              sa.gfp_mask = GFP_ATOMIC;
-+                              sa.parent = parent->pid;
-+                              sa.task = child->pid;
-+                              aa_audit_hint(cxt->profile, &sa);
-+                      }
-+              }
-+      }
-+      rcu_read_unlock();
-+
-+      return error;
-+}
-+
-+static int apparmor_capable(struct task_struct *task, int cap)
-+{
-+      int error;
-+      struct aa_task_context *cxt;
-+
-+      /* cap_capable returns 0 on success, else -EPERM */
-+      error = cap_capable(task, cap);
-+
-+      rcu_read_lock();
-+      cxt = aa_task_context(task);
-+      if (cxt && (!error || cap_raised(cxt->profile->set_caps, cap)))
-+              error = aa_capability(cxt, cap);
-+      rcu_read_unlock();
-+
-+      return error;
-+}
-+
-+static int apparmor_sysctl(struct ctl_table *table, int op)
-+{
-+      struct aa_profile *profile = aa_get_profile(current);
-+      int error = 0;
-+
-+      if (profile) {
-+              char *buffer, *name;
-+              int mask;
-+
-+              mask = 0;
-+              if (op & 4)
-+                      mask |= MAY_READ;
-+              if (op & 2)
-+                      mask |= MAY_WRITE;
-+
-+              error = -ENOMEM;
-+              buffer = (char*)__get_free_page(GFP_KERNEL);
-+              if (!buffer)
-+                      goto out;
-+              name = sysctl_pathname(table, buffer, PAGE_SIZE);
-+              if (name && name - buffer >= 5) {
-+                      name -= 5;
-+                      memcpy(name, "/proc", 5);
-+                      error = aa_perm_path(profile, "sysctl", name, mask, 0);
-+              }
-+              free_page((unsigned long)buffer);
-+      }
-+
-+out:
-+      aa_put_profile(profile);
-+      return error;
-+}
-+
-+static int apparmor_bprm_set_security(struct linux_binprm *bprm)
-+{
-+      /* handle capability bits with setuid, etc */
-+      cap_bprm_set_security(bprm);
-+      /* already set based on script name */
-+      if (bprm->sh_bang)
-+              return 0;
-+      return aa_register(bprm);
-+}
-+
-+static int apparmor_bprm_secureexec(struct linux_binprm *bprm)
-+{
-+      int ret = cap_bprm_secureexec(bprm);
-+
-+      if (!ret && (unsigned long)bprm->security & AA_SECURE_EXEC_NEEDED) {
-+              AA_DEBUG("%s: secureexec required for %s\n",
-+                       __FUNCTION__, bprm->filename);
-+              ret = 1;
-+      }
-+
-+      return ret;
-+}
-+
-+static int apparmor_sb_mount(char *dev_name, struct path *path, char *type,
-+                            unsigned long flags, void *data)
-+{
-+      return aa_reject_syscall(current, GFP_KERNEL, "mount");
-+}
-+
-+static int apparmor_umount(struct vfsmount *mnt, int flags)
-+{
-+      return aa_reject_syscall(current, GFP_KERNEL, "umount");
-+}
-+
-+static int apparmor_inode_mkdir(struct inode *dir, struct dentry *dentry,
-+                              struct vfsmount *mnt, int mask)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      if (!mnt || !mediated_filesystem(dir))
-+              goto out;
-+
-+      profile = aa_get_profile(current);
-+
-+      if (profile)
-+              error = aa_perm_dir(profile, "inode_mkdir", dentry, mnt,
-+                                  MAY_WRITE);
-+
-+      aa_put_profile(profile);
-+
-+out:
-+      return error;
-+}
-+
-+static int apparmor_inode_rmdir(struct inode *dir, struct dentry *dentry,
-+                              struct vfsmount *mnt)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      if (!mnt || !mediated_filesystem(dir))
-+              goto out;
-+
-+      profile = aa_get_profile(current);
-+
-+      if (profile)
-+              error = aa_perm_dir(profile, "inode_rmdir", dentry, mnt,
-+                                  MAY_WRITE);
-+
-+      aa_put_profile(profile);
-+
-+out:
-+      return error;
-+}
-+
-+static int aa_permission(const char *operation, struct inode *inode,
-+                       struct dentry *dentry, struct vfsmount *mnt,
-+                       int mask, int check)
-+{
-+      int error = 0;
-+
-+      if (mnt && mediated_filesystem(inode)) {
-+              struct aa_profile *profile;
-+
-+              profile = aa_get_profile(current);
-+              if (profile)
-+                      error = aa_perm(profile, operation, dentry, mnt, mask,
-+                                      check);
-+              aa_put_profile(profile);
-+      }
-+      return error;
-+}
-+
-+static inline int aa_mask_permissions(int mask)
-+{
-+      if (mask & MAY_APPEND)
-+              mask &= (MAY_READ | MAY_APPEND | MAY_EXEC);
-+      else
-+              mask &= (MAY_READ | MAY_WRITE | MAY_EXEC);
-+      return mask;
-+}
-+
-+static int apparmor_inode_create(struct inode *dir, struct dentry *dentry,
-+                               struct vfsmount *mnt, int mask)
-+{
-+      return aa_permission("inode_create", dir, dentry, mnt, MAY_APPEND, 0);
-+}
-+
-+static int apparmor_inode_link(struct dentry *old_dentry,
-+                             struct vfsmount *old_mnt, struct inode *dir,
-+                             struct dentry *new_dentry,
-+                             struct vfsmount *new_mnt)
-+{
-+      int error = 0;
-+      struct aa_profile *profile;
-+
-+      if (!old_mnt || !new_mnt || !mediated_filesystem(dir))
-+              goto out;
-+
-+      profile = aa_get_profile(current);
-+
-+      if (profile)
-+              error = aa_link(profile, new_dentry, new_mnt,
-+                              old_dentry, old_mnt);
-+
-+      aa_put_profile(profile);
-+
-+out:
-+      return error;
-+}
-+
-+static int apparmor_inode_unlink(struct inode *dir, struct dentry *dentry,
-+                               struct vfsmount *mnt)
-+{
-+      int check = 0;
-+
-+      if (S_ISDIR(dentry->d_inode->i_mode))
-+              check |= AA_CHECK_DIR;
-+      return aa_permission("inode_unlink", dir, dentry, mnt, MAY_WRITE,
-+                           check);
-+}
-+
-+static int apparmor_inode_symlink(struct inode *dir, struct dentry *dentry,
-+                                struct vfsmount *mnt, const char *old_name)
-+{
-+      return aa_permission("inode_symlink", dir, dentry, mnt, MAY_WRITE, 0);
-+}
-+
-+static int apparmor_inode_mknod(struct inode *dir, struct dentry *dentry,
-+                              struct vfsmount *mnt, int mode, dev_t dev)
-+{
-+      return aa_permission("inode_mknod", dir, dentry, mnt, MAY_WRITE, 0);
-+}
-+
-+static int apparmor_inode_rename(struct inode *old_dir,
-+                               struct dentry *old_dentry,
-+                               struct vfsmount *old_mnt,
-+                               struct inode *new_dir,
-+                               struct dentry *new_dentry,
-+                               struct vfsmount *new_mnt)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      if ((!old_mnt && !new_mnt) || !mediated_filesystem(old_dir))
-+              goto out;
-+
-+      profile = aa_get_profile(current);
-+
-+      if (profile) {
-+              struct inode *inode = old_dentry->d_inode;
-+              int check = 0;
-+
-+              if (inode && S_ISDIR(inode->i_mode))
-+                      check |= AA_CHECK_DIR;
-+              if (old_mnt)
-+                      error = aa_perm(profile, "inode_rename", old_dentry,
-+                                      old_mnt, MAY_READ | MAY_WRITE, check);
-+
-+              if (!error && new_mnt) {
-+                      error = aa_perm(profile, "inode_rename", new_dentry,
-+                                      new_mnt, MAY_WRITE, check);
-+              }
-+      }
-+
-+      aa_put_profile(profile);
-+
-+out:
-+      return error;
-+}
-+
-+static int apparmor_inode_permission(struct inode *inode, int mask,
-+                                   struct nameidata *nd)
-+{
-+      int check = 0;
-+
-+      if (!nd || nd->flags & (LOOKUP_PARENT | LOOKUP_CONTINUE))
-+              return 0;
-+      mask = aa_mask_permissions(mask);
-+      if (S_ISDIR(inode->i_mode)) {
-+              check |= AA_CHECK_DIR;
-+              /* allow traverse accesses to directories */
-+              mask &= ~MAY_EXEC;
-+      }
-+      return aa_permission("inode_permission", inode, nd->dentry, nd->mnt,
-+                           mask, check);
-+}
-+
-+static int apparmor_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                struct iattr *iattr)
-+{
-+      int error = 0;
-+
-+      if (!mnt)
-+              goto out;
-+
-+      if (mediated_filesystem(dentry->d_inode)) {
-+              struct aa_profile *profile;
-+
-+              profile = aa_get_profile(current);
-+              /*
-+               * Mediate any attempt to change attributes of a file
-+               * (chmod, chown, chgrp, etc)
-+               */
-+              if (profile)
-+                      error = aa_attr(profile, dentry, mnt, iattr);
-+
-+              aa_put_profile(profile);
-+      }
-+
-+out:
-+      return error;
-+}
-+
-+static int aa_xattr_permission(struct dentry *dentry, struct vfsmount *mnt,
-+                             const char *operation, int mask,
-+                             struct file *file)
-+{
-+      int error = 0;
-+
-+      if (mnt && mediated_filesystem(dentry->d_inode)) {
-+              struct aa_profile *profile = aa_get_profile(current);
-+              int check = file ? AA_CHECK_FD : 0;
-+
-+              if (profile)
-+                      error = aa_perm_xattr(profile, operation, dentry, mnt,
-+                                            mask, check);
-+              aa_put_profile(profile);
-+      }
-+
-+      return error;
-+}
-+
-+static int apparmor_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                 const char *name, const void *value,
-+                                 size_t size, int flags, struct file *file)
-+{
-+      int error = cap_inode_setxattr(dentry, mnt, name, value, size, flags,
-+                                     file);
-+
-+      if (!error)
-+              error = aa_xattr_permission(dentry, mnt, "xattr set",
-+                                          MAY_WRITE, file);
-+      return error;
-+}
-+
-+static int apparmor_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                 const char *name, struct file *file)
-+{
-+      return aa_xattr_permission(dentry, mnt, "xattr get", MAY_READ, file);
-+}
-+
-+static int apparmor_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                  struct file *file)
-+{
-+      return aa_xattr_permission(dentry, mnt, "xattr list", MAY_READ, file);
-+}
-+
-+static int apparmor_inode_removexattr(struct dentry *dentry,
-+                                    struct vfsmount *mnt, const char *name,
-+                                    struct file *file)
-+{
-+      return aa_xattr_permission(dentry, mnt, "xattr remove", MAY_WRITE,
-+                                 file);
-+}
-+
-+static int aa_file_permission(const char *op, struct file *file, int mask)
-+{
-+      struct aa_profile *profile;
-+      struct aa_profile *file_profile = (struct aa_profile*)file->f_security;
-+      int error = 0;
-+
-+      if (!file_profile)
-+              goto out;
-+
-+      /*
-+       * If this file was opened under a different profile, we
-+       * revalidate the access against the current profile.
-+       */
-+      profile = aa_get_profile(current);
-+      if (profile && (file_profile != profile || mask & AA_MAY_LOCK)) {
-+              struct dentry *dentry = file->f_dentry;
-+              struct vfsmount *mnt = file->f_vfsmnt;
-+              struct inode *inode = dentry->d_inode;
-+              int check = AA_CHECK_FD;
-+
-+              /*
-+               * FIXME: We should remember which profiles we revalidated
-+               *        against.
-+               */
-+              if (S_ISDIR(inode->i_mode))
-+                      check |= AA_CHECK_DIR;
-+              error = aa_permission(op, inode, dentry, mnt, mask, check);
-+      }
-+      aa_put_profile(profile);
-+
-+out:
-+      return error;
-+}
-+
-+static int apparmor_file_permission(struct file *file, int mask)
-+{
-+      return aa_file_permission("file_permission", file,
-+                                aa_mask_permissions(mask));
-+}
-+
-+static inline int apparmor_file_lock (struct file *file, unsigned int cmd)
-+{
-+      int mask = AA_MAY_LOCK;
-+      if (cmd == F_WRLCK)
-+              mask |= MAY_WRITE;
-+      return aa_file_permission("file_lock", file, mask);
-+}
-+
-+static int apparmor_file_alloc_security(struct file *file)
-+{
-+      struct aa_profile *profile;
-+
-+      profile = aa_get_profile(current);
-+      if (profile)
-+              file->f_security = profile;
-+
-+      return 0;
-+}
-+
-+static void apparmor_file_free_security(struct file *file)
-+{
-+      struct aa_profile *file_profile = (struct aa_profile*)file->f_security;
-+
-+      aa_put_profile(file_profile);
-+}
-+
-+static inline int aa_mmap(struct file *file, const char *operation,
-+                        unsigned long prot, unsigned long flags)
-+{
-+      struct dentry *dentry;
-+      int mask = 0;
-+
-+      if (!file || !file->f_security)
-+              return 0;
-+
-+      if (prot & PROT_READ)
-+              mask |= MAY_READ;
-+      /* Private mappings don't require write perms since they don't
-+       * write back to the files */
-+      if ((prot & PROT_WRITE) && !(flags & MAP_PRIVATE))
-+              mask |= MAY_WRITE;
-+      if (prot & PROT_EXEC)
-+              mask |= AA_EXEC_MMAP;
-+
-+      dentry = file->f_dentry;
-+      return aa_permission(operation, dentry->d_inode, dentry,
-+                           file->f_vfsmnt, mask, AA_CHECK_FD);
-+}
-+
-+static int apparmor_file_mmap(struct file *file, unsigned long reqprot,
-+                            unsigned long prot, unsigned long flags,
-+                            unsigned long addr, unsigned long addr_only)
-+{
-+      if ((addr < mmap_min_addr) && !capable(CAP_SYS_RAWIO)) {
-+              struct aa_profile *profile = aa_get_profile(current);
-+              if (profile)
-+                      /* future control check here */
-+                      return -EACCES;
-+              else
-+                      return -EACCES;
-+              aa_put_profile(profile);
-+      }
-+
-+      return aa_mmap(file, "file_mmap", prot, flags);
-+}
-+
-+static int apparmor_file_mprotect(struct vm_area_struct *vma,
-+                                unsigned long reqprot, unsigned long prot)
-+{
-+      return aa_mmap(vma->vm_file, "file_mprotect", prot,
-+                     !(vma->vm_flags & VM_SHARED) ? MAP_PRIVATE : 0);
-+}
-+
-+static int apparmor_task_alloc_security(struct task_struct *task)
-+{
-+      return aa_clone(task);
-+}
-+
-+/*
-+ * Called from IRQ context from RCU callback.
-+ */
-+static void apparmor_task_free_security(struct task_struct *task)
-+{
-+      aa_release(task);
-+}
-+
-+static int apparmor_getprocattr(struct task_struct *task, char *name,
-+                              char **value)
-+{
-+      unsigned len;
-+      int error;
-+      struct aa_profile *profile;
-+
-+      /* AppArmor only supports the "current" process attribute */
-+      if (strcmp(name, "current") != 0)
-+              return -EINVAL;
-+
-+      /* must be task querying itself or admin */
-+      if (current != task && !capable(CAP_SYS_ADMIN))
-+              return -EPERM;
-+
-+      profile = aa_get_profile(task);
-+      error = aa_getprocattr(profile, value, &len);
-+      aa_put_profile(profile);
-+      if (!error)
-+              error = len;
-+
-+      return error;
-+}
-+
-+static int apparmor_setprocattr(struct task_struct *task, char *name,
-+                              void *value, size_t size)
-+{
-+      char *command, *args;
-+      int error;
-+
-+      if (strcmp(name, "current") != 0 || size == 0 || size >= PAGE_SIZE)
-+              return -EINVAL;
-+      args = value;
-+      args[size] = '\0';
-+      args = strstrip(args);
-+      command = strsep(&args, " ");
-+      if (!args)
-+              return -EINVAL;
-+      while (isspace(*args))
-+              args++;
-+      if (!*args)
-+              return -EINVAL;
-+
-+      if (strcmp(command, "changehat") == 0) {
-+              if (current != task)
-+                      return -EACCES;
-+              error = aa_setprocattr_changehat(args);
-+      } else if (strcmp(command, "changeprofile") == 0) {
-+              if (current != task)
-+                      return -EACCES;
-+              error = aa_setprocattr_changeprofile(args);
-+      } else if (strcmp(command, "setprofile") == 0) {
-+              struct aa_profile *profile;
-+
-+              /* Only an unconfined process with admin capabilities
-+               * may change the profile of another task.
-+               */
-+
-+              if (!capable(CAP_SYS_ADMIN))
-+                      return -EACCES;
-+
-+              profile = aa_get_profile(current);
-+              if (profile) {
-+                      struct aa_audit sa;
-+                      memset(&sa, 0, sizeof(sa));
-+                      sa.operation = "profile_set";
-+                      sa.gfp_mask = GFP_KERNEL;
-+                      sa.task = task->pid;
-+                      sa.info = "from confined process";
-+                      aa_audit_reject(profile, &sa);
-+                      aa_put_profile(profile);
-+                      return -EACCES;
-+              }
-+              error = aa_setprocattr_setprofile(task, args);
-+      } else {
-+              struct aa_audit sa;
-+              memset(&sa, 0, sizeof(sa));
-+              sa.operation = "setprocattr";
-+              sa.gfp_mask = GFP_KERNEL;
-+              sa.info = "invalid command";
-+              sa.name = command;
-+              sa.task = task->pid;
-+              aa_audit_reject(NULL, &sa);
-+              return -EINVAL;
-+      }
-+
-+      if (!error)
-+              error = size;
-+      return error;
-+}
-+
-+struct security_operations apparmor_ops = {
-+      .ptrace =                       apparmor_ptrace,
-+      .capget =                       cap_capget,
-+      .capset_check =                 cap_capset_check,
-+      .capset_set =                   cap_capset_set,
-+      .sysctl =                       apparmor_sysctl,
-+      .capable =                      apparmor_capable,
-+      .syslog =                       cap_syslog,
-+
-+      .netlink_send =                 cap_netlink_send,
-+      .netlink_recv =                 cap_netlink_recv,
-+
-+      .bprm_apply_creds =             cap_bprm_apply_creds,
-+      .bprm_set_security =            apparmor_bprm_set_security,
-+      .bprm_secureexec =              apparmor_bprm_secureexec,
-+
-+      .sb_mount =                     apparmor_sb_mount,
-+      .sb_umount =                    apparmor_umount,
-+
-+      .inode_mkdir =                  apparmor_inode_mkdir,
-+      .inode_rmdir =                  apparmor_inode_rmdir,
-+      .inode_create =                 apparmor_inode_create,
-+      .inode_link =                   apparmor_inode_link,
-+      .inode_unlink =                 apparmor_inode_unlink,
-+      .inode_symlink =                apparmor_inode_symlink,
-+      .inode_mknod =                  apparmor_inode_mknod,
-+      .inode_rename =                 apparmor_inode_rename,
-+      .inode_permission =             apparmor_inode_permission,
-+      .inode_setattr =                apparmor_inode_setattr,
-+      .inode_setxattr =               apparmor_inode_setxattr,
-+      .inode_getxattr =               apparmor_inode_getxattr,
-+      .inode_listxattr =              apparmor_inode_listxattr,
-+      .inode_removexattr =            apparmor_inode_removexattr,
-+      .file_permission =              apparmor_file_permission,
-+      .file_alloc_security =          apparmor_file_alloc_security,
-+      .file_free_security =           apparmor_file_free_security,
-+      .file_mmap =                    apparmor_file_mmap,
-+      .file_mprotect =                apparmor_file_mprotect,
-+      .file_lock =                    apparmor_file_lock,
-+
-+      .task_alloc_security =          apparmor_task_alloc_security,
-+      .task_free_security =           apparmor_task_free_security,
-+      .task_post_setuid =             cap_task_post_setuid,
-+      .task_reparent_to_init =        cap_task_reparent_to_init,
-+
-+      .getprocattr =                  apparmor_getprocattr,
-+      .setprocattr =                  apparmor_setprocattr,
-+};
-+
-+void info_message(const char *str)
-+{
-+      struct aa_audit sa;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.info = str;
-+      printk(KERN_INFO "AppArmor: %s\n", str);
-+      if (audit_enabled)
-+              aa_audit_message(NULL, &sa, AUDIT_APPARMOR_STATUS);
-+}
-+
-+static int __init apparmor_init(void)
-+{
-+      int error;
-+
-+      if (!apparmor_enabled) {
-+              info_message("AppArmor disabled by boottime parameter\n");
-+              return 0;
-+      }
-+
-+      if ((error = create_apparmorfs())) {
-+              AA_ERROR("Unable to activate AppArmor filesystem\n");
-+              goto createfs_out;
-+      }
-+
-+      if ((error = alloc_default_namespace())){
-+              AA_ERROR("Unable to allocate default profile namespace\n");
-+              goto alloc_out;
-+      }
-+
-+      if ((error = register_security(&apparmor_ops))) {
-+              AA_ERROR("Unable to register AppArmor\n");
-+              goto register_security_out;
-+      }
-+
-+      /* Report that AppArmor successfully initialized */
-+      apparmor_initialized = 1;
-+      if (apparmor_complain)
-+              info_message("AppArmor initialized: complainmode enabled");
-+      else
-+              info_message("AppArmor initialized");
-+
-+      return error;
-+
-+register_security_out:
-+      free_default_namespace();
-+
-+alloc_out:
-+      destroy_apparmorfs();
-+
-+createfs_out:
-+      return error;
-+
-+}
-+
-+security_initcall(apparmor_init);
-+
-+void apparmor_disable(void)
-+{
-+      /* Remove and release all the profiles on the profile list. */
-+      mutex_lock(&aa_interface_lock);
-+      aa_profile_ns_list_release();
-+
-+      /* FIXME: cleanup profiles references on files */
-+      free_default_namespace();
-+
-+      /*
-+       * Delay for an rcu cycle to make sure that all active task
-+       * context readers have finished, and all profiles have been
-+       * freed by their rcu callbacks.
-+       */
-+      synchronize_rcu();
-+
-+      destroy_apparmorfs();
-+      mutex_unlock(&aa_interface_lock);
-+
-+      apparmor_initialized = 0;
-+
-+      info_message("AppArmor protection removed");
-+}
-+
-+MODULE_DESCRIPTION("AppArmor process confinement");
-+MODULE_AUTHOR("Novell/Immunix, http://bugs.opensuse.org");
-+MODULE_LICENSE("GPL");
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-main.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-main.diff
deleted file mode 100644 (file)
index 04734fd..0000000
+++ /dev/null
@@ -1,1493 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: Main Part
-
-The underlying functions by which the AppArmor LSM hooks are implemented.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- security/apparmor/main.c | 1478 +++++++++++++++++++++++++++++++++++++++++++++++
- 1 file changed, 1478 insertions(+)
-
---- /dev/null
-+++ b/security/apparmor/main.c
-@@ -0,0 +1,1478 @@
-+/*
-+ *    Copyright (C) 2002-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor Core
-+ */
-+
-+#include <linux/security.h>
-+#include <linux/namei.h>
-+#include <linux/audit.h>
-+#include <linux/mount.h>
-+#include <linux/ptrace.h>
-+
-+#include "apparmor.h"
-+
-+#include "inline.h"
-+
-+/*
-+ * Table of capability names: we generate it from capabilities.h.
-+ */
-+static const char *capability_names[] = {
-+#include "capability_names.h"
-+};
-+
-+struct aa_namespace *default_namespace;
-+
-+static int aa_inode_mode(struct inode *inode)
-+{
-+      /* if the inode doesn't exist the user is creating it */
-+      if (!inode || current->fsuid == inode->i_uid)
-+              return AA_USER_SHIFT;
-+      return AA_OTHER_SHIFT;
-+}
-+
-+int alloc_default_namespace(void)
-+{
-+      struct aa_namespace *ns;
-+      char *name = kstrdup("default", GFP_KERNEL);
-+      if (!name)
-+              return -ENOMEM;
-+      ns = alloc_aa_namespace(name);
-+      if (!ns) {
-+              kfree(name);
-+              return -ENOMEM;
-+      }
-+
-+      write_lock(&profile_ns_list_lock);
-+      default_namespace = ns;
-+      aa_get_namespace(ns);
-+      list_add(&ns->list, &profile_ns_list);
-+      write_unlock(&profile_ns_list_lock);
-+
-+      return 0;
-+}
-+
-+void free_default_namespace(void)
-+{
-+      write_lock(&profile_ns_list_lock);
-+      list_del_init(&default_namespace->list);
-+      write_unlock(&profile_ns_list_lock);
-+      aa_put_namespace(default_namespace);
-+      default_namespace = NULL;
-+}
-+
-+static void aa_audit_file_sub_mask(struct audit_buffer *ab, char *buffer,
-+                                 int mask)
-+{
-+      const char unsafex[] = "upcn";
-+      const char safex[] = "UPCN";
-+      char *m = buffer;
-+
-+      if (mask & AA_EXEC_MMAP)
-+              *m++ = 'm';
-+      if (mask & MAY_READ)
-+              *m++ = 'r';
-+      if (mask & MAY_WRITE)
-+              *m++ = 'w';
-+      else if (mask & MAY_APPEND)
-+              *m++ = 'a';
-+      if (mask & MAY_EXEC) {
-+              int index = AA_EXEC_INDEX(mask);
-+              /* all indexes > 4 are also named transitions */
-+              if (index > 4)
-+                      index = 4;
-+              if (index > 0) {
-+                      if (mask & AA_EXEC_UNSAFE)
-+                              *m++ = unsafex[index - 1];
-+                      else
-+                              *m++ = safex[index - 1];
-+              }
-+              if (mask & AA_EXEC_INHERIT)
-+                      *m++ = 'i';
-+              *m++ = 'x';
-+      }
-+      if (mask & AA_MAY_LINK)
-+              *m++ = 'l';
-+      if (mask & AA_MAY_LOCK)
-+              *m++ = 'k';
-+      *m++ = '\0';
-+}
-+
-+static void aa_audit_file_mask(struct audit_buffer *ab, const char *name,
-+                             int mask)
-+{
-+      char user[10], other[10];
-+
-+      aa_audit_file_sub_mask(ab, user,
-+                             (mask & AA_USER_PERMS) >> AA_USER_SHIFT);
-+      aa_audit_file_sub_mask(ab, other,
-+                             (mask & AA_OTHER_PERMS) >> AA_OTHER_SHIFT);
-+
-+      audit_log_format(ab, " %s=\"%s::%s\"", name, user, other);
-+}
-+
-+/**
-+ * aa_audit - Log an audit event to the audit subsystem
-+ * @profile: profile to check against
-+ * @sa: audit event
-+ * @audit_cxt: audit context to log message to
-+ * @type: audit event number
-+ */
-+static int aa_audit_base(struct aa_profile *profile, struct aa_audit *sa,
-+                       struct audit_context *audit_cxt, int type)
-+{
-+      struct audit_buffer *ab = NULL;
-+
-+      ab = audit_log_start(audit_cxt, sa->gfp_mask, type);
-+
-+      if (!ab) {
-+              AA_ERROR("Unable to log event (%d) to audit subsys\n",
-+                       type);
-+               /* don't fail operations in complain mode even if logging
-+                * fails */
-+              return type == AUDIT_APPARMOR_ALLOWED ? 0 : -ENOMEM;
-+      }
-+
-+      if (sa->operation)
-+              audit_log_format(ab, "operation=\"%s\"", sa->operation);
-+
-+      if (sa->info) {
-+              audit_log_format(ab, " info=\"%s\"", sa->info);
-+              if (sa->error_code)
-+                      audit_log_format(ab, " error=%d", sa->error_code);
-+      }
-+
-+      if (sa->request_mask)
-+              aa_audit_file_mask(ab, "requested_mask", sa->request_mask);
-+
-+      if (sa->denied_mask)
-+              aa_audit_file_mask(ab, "denied_mask", sa->denied_mask);
-+
-+      if (sa->request_mask)
-+              audit_log_format(ab, " fsuid=%d", current->fsuid);
-+
-+      if (sa->iattr) {
-+              struct iattr *iattr = sa->iattr;
-+
-+              audit_log_format(ab, " attribute=\"%s%s%s%s%s%s%s\"",
-+                      iattr->ia_valid & ATTR_MODE ? "mode," : "",
-+                      iattr->ia_valid & ATTR_UID ? "uid," : "",
-+                      iattr->ia_valid & ATTR_GID ? "gid," : "",
-+                      iattr->ia_valid & ATTR_SIZE ? "size," : "",
-+                      iattr->ia_valid & (ATTR_ATIME | ATTR_ATIME_SET) ?
-+                              "atime," : "",
-+                      iattr->ia_valid & (ATTR_MTIME | ATTR_MTIME_SET) ?
-+                              "mtime," : "",
-+                      iattr->ia_valid & ATTR_CTIME ? "ctime," : "");
-+      }
-+
-+      if (sa->task)
-+              audit_log_format(ab, " task=%d", sa->task);
-+
-+      if (sa->parent)
-+              audit_log_format(ab, " parent=%d", sa->parent);
-+
-+      if (sa->name) {
-+              audit_log_format(ab, " name=");
-+              audit_log_untrustedstring(ab, sa->name);
-+      }
-+
-+      if (sa->name2) {
-+              audit_log_format(ab, " name2=");
-+              audit_log_untrustedstring(ab, sa->name2);
-+      }
-+
-+      audit_log_format(ab, " pid=%d", current->pid);
-+
-+      if (profile) {
-+              audit_log_format(ab, " profile=");
-+              audit_log_untrustedstring(ab, profile->name);
-+
-+              if (profile->ns != default_namespace) {
-+                      audit_log_format(ab, " namespace=");
-+                      audit_log_untrustedstring(ab, profile->ns->name);
-+              }
-+      }
-+
-+      audit_log_end(ab);
-+
-+      return type == AUDIT_APPARMOR_ALLOWED ? 0 : sa->error_code;
-+}
-+
-+/**
-+ * aa_audit_syscallreject - Log a syscall rejection to the audit subsystem
-+ * @profile: profile to check against
-+ * @gfp: memory allocation flags
-+ * @msg: string describing syscall being rejected
-+ */
-+int aa_audit_syscallreject(struct aa_profile *profile, gfp_t gfp,
-+                         const char *msg)
-+{
-+      struct aa_audit sa;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "syscall";
-+      sa.name = msg;
-+      sa.gfp_mask = gfp;
-+      sa.error_code = -EPERM;
-+
-+      return aa_audit_base(profile, &sa, current->audit_context,
-+                           AUDIT_APPARMOR_DENIED);
-+}
-+
-+int aa_audit_message(struct aa_profile *profile, struct aa_audit *sa,
-+                    int type)
-+{
-+      struct audit_context *audit_cxt;
-+
-+      audit_cxt = apparmor_logsyscall ? current->audit_context : NULL;
-+      return aa_audit_base(profile, sa, audit_cxt, type);
-+}
-+
-+void aa_audit_hint(struct aa_profile *profile, struct aa_audit *sa)
-+{
-+      aa_audit_message(profile, sa, AUDIT_APPARMOR_HINT);
-+}
-+
-+void aa_audit_status(struct aa_profile *profile, struct aa_audit *sa)
-+{
-+      aa_audit_message(profile, sa, AUDIT_APPARMOR_STATUS);
-+}
-+
-+int aa_audit_reject(struct aa_profile *profile, struct aa_audit *sa)
-+{
-+      return aa_audit_message(profile, sa, AUDIT_APPARMOR_DENIED);
-+}
-+
-+/**
-+ * aa_audit - Log an audit event to the audit subsystem
-+ * @profile: profile to check against
-+ * @sa: audit event
-+ */
-+int aa_audit(struct aa_profile *profile, struct aa_audit *sa)
-+{
-+      int type = AUDIT_APPARMOR_DENIED;
-+      struct audit_context *audit_cxt;
-+
-+      if (likely(!sa->error_code))
-+              type = AUDIT_APPARMOR_AUDIT;
-+      else if (PROFILE_COMPLAIN(profile))
-+              type = AUDIT_APPARMOR_ALLOWED;
-+
-+      audit_cxt = apparmor_logsyscall ? current->audit_context : NULL;
-+      return aa_audit_base(profile, sa, audit_cxt, type);
-+}
-+
-+static int aa_audit_file(struct aa_profile *profile, struct aa_audit *sa)
-+{
-+      if (likely(!sa->error_code)) {
-+              int mask = sa->audit_mask & AUDIT_FILE_MASK;
-+
-+              if (unlikely(PROFILE_AUDIT(profile)))
-+                      mask |= AUDIT_FILE_MASK;
-+
-+              if (likely(!(sa->request_mask & mask)))
-+                      return 0;
-+
-+              /* mask off perms that are not being force audited */
-+              sa->request_mask &= mask | ALL_AA_EXEC_TYPE;
-+      } else {
-+              int mask = AUDIT_QUIET_MASK(sa->audit_mask);
-+
-+              if (!(sa->denied_mask & ~mask))
-+                      return sa->error_code;
-+
-+              /* mask off perms whose denial is being silenced */
-+              sa->denied_mask &= (~mask) | ALL_AA_EXEC_TYPE;
-+      }
-+
-+      return aa_audit(profile, sa);
-+}
-+
-+static int aa_audit_caps(struct aa_profile *profile, struct aa_audit *sa,
-+                       int cap)
-+{
-+      if (likely(!sa->error_code)) {
-+              if (likely(!PROFILE_AUDIT(profile) &&
-+                         !cap_raised(profile->audit_caps, cap)))
-+                      return 0;
-+      }
-+
-+      /* quieting of capabilities is handled the caps_logged cache */
-+      return aa_audit(profile, sa);
-+}
-+
-+/**
-+ * aa_file_denied - check for @mask access on a file
-+ * @profile: profile to check against
-+ * @name: pathname of file
-+ * @mask: permission mask requested for file
-+ * @audit_mask: return audit mask for the match
-+ *
-+ * Return %0 on success, or else the permissions in @mask that the
-+ * profile denies.
-+ */
-+static int aa_file_denied(struct aa_profile *profile, const char *name,
-+                        int mask, int *audit_mask)
-+{
-+      return (mask & ~aa_match(profile->file_rules, name, audit_mask));
-+}
-+
-+/**
-+ * aa_link_denied - check for permission to link a file
-+ * @profile: profile to check against
-+ * @link: pathname of link being created
-+ * @target: pathname of target to be linked to
-+ * @target_mode: UGO shift for target inode
-+ * @request_mask: the permissions subset valid only if link succeeds
-+ * @audit_mask: return the audit_mask for the link permission
-+ * Return %0 on success, or else the permissions that the profile denies.
-+ */
-+static int aa_link_denied(struct aa_profile *profile, const char *link,
-+                        const char *target, int target_mode,
-+                        int *request_mask, int *audit_mask)
-+{
-+      unsigned int state;
-+      int l_mode, t_mode, l_x, t_x, denied_mask = 0;
-+      int link_mask = AA_MAY_LINK << target_mode;
-+
-+      *request_mask = link_mask;
-+
-+      l_mode = aa_match_state(profile->file_rules, DFA_START, link, &state);
-+
-+      if (l_mode & link_mask) {
-+              int mode;
-+              /* test to see if target can be paired with link */
-+              state = aa_dfa_null_transition(profile->file_rules, state);
-+              mode = aa_match_state(profile->file_rules, state, target,
-+                                    &state);
-+
-+              if (!(mode & link_mask))
-+                      denied_mask |= link_mask;
-+
-+              *audit_mask = dfa_audit_mask(profile->file_rules, state);
-+
-+              /* return if link subset test is not required */
-+              if (!(mode & (AA_LINK_SUBSET_TEST << target_mode)))
-+                      return denied_mask;
-+      }
-+
-+      /* Do link perm subset test requiring permission on link are a
-+       * subset of the permissions on target.
-+       * If a subset test is required a permission subset test of the
-+       * perms for the link are done against the user::other of the
-+       * target's 'r', 'w', 'x', 'a', 'k', and 'm' permissions.
-+       *
-+       * If the link has 'x', an exact match of all the execute flags
-+       * must match.
-+       */
-+      denied_mask |= ~l_mode & link_mask;
-+
-+      t_mode = aa_match(profile->file_rules, target, NULL);
-+
-+      l_x = l_mode & (ALL_AA_EXEC_TYPE | AA_EXEC_BITS);
-+      t_x = t_mode & (ALL_AA_EXEC_TYPE | AA_EXEC_BITS);
-+
-+      /* For actual subset test ignore valid-profile-transition flags,
-+       * and link bits
-+       */
-+      l_mode &= AA_FILE_PERMS & ~AA_LINK_BITS;
-+      t_mode &= AA_FILE_PERMS & ~AA_LINK_BITS;
-+
-+      *request_mask = l_mode | link_mask;
-+
-+      if (l_mode) {
-+              int x = l_x | (t_x & ALL_AA_EXEC_UNSAFE);
-+              denied_mask |= l_mode & ~t_mode;
-+              /* mask off x modes not used by link */
-+
-+              /* handle exec subset
-+               * - link safe exec issubset of unsafe exec
-+               * - no link x perm is subset of target having x perm
-+               */
-+              if ((l_mode & AA_USER_EXEC) &&
-+                  (x & AA_USER_EXEC_TYPE) != (t_x & AA_USER_EXEC_TYPE))
-+                      denied_mask = AA_USER_EXEC | (l_x & AA_USER_EXEC_TYPE);
-+              if ((l_mode & AA_OTHER_EXEC) &&
-+                  (x & AA_OTHER_EXEC_TYPE) != (t_x & AA_OTHER_EXEC_TYPE))
-+                      denied_mask = AA_OTHER_EXEC | (l_x & AA_OTHER_EXEC_TYPE);
-+      }
-+
-+      return denied_mask;
-+}
-+
-+/**
-+ * aa_get_name - compute the pathname of a file
-+ * @dentry: dentry of the file
-+ * @mnt: vfsmount of the file
-+ * @buffer: buffer that aa_get_name() allocated
-+ * @check: AA_CHECK_DIR is set if the file is a directory
-+ *
-+ * Returns a pointer to the beginning of the pathname (which usually differs
-+ * from the beginning of the buffer), or an error code.
-+ *
-+ * We need @check to indicate whether the file is a directory or not because
-+ * the file may not yet exist, and so we cannot check the inode's file type.
-+ */
-+static char *aa_get_name(struct dentry *dentry, struct vfsmount *mnt,
-+                       char **buffer, int check)
-+{
-+      char *name;
-+      int is_dir, size = 256;
-+
-+      is_dir = (check & AA_CHECK_DIR) ? 1 : 0;
-+
-+      for (;;) {
-+              char *buf = kmalloc(size, GFP_KERNEL);
-+              if (!buf)
-+                      return ERR_PTR(-ENOMEM);
-+
-+              name = d_namespace_path(dentry, mnt, buf, size - is_dir);
-+              if (!IS_ERR(name)) {
-+                      if (name[0] != '/') {
-+                              /*
-+                               * This dentry is not connected to the
-+                               * namespace root -- reject access.
-+                               */
-+                              kfree(buf);
-+                              return ERR_PTR(-ENOENT);
-+                      }
-+                      if (is_dir && name[1] != '\0') {
-+                              /*
-+                               * Append "/" to the pathname. The root
-+                               * directory is a special case; it already
-+                               * ends in slash.
-+                               */
-+                              buf[size - 2] = '/';
-+                              buf[size - 1] = '\0';
-+                      }
-+
-+                      *buffer = buf;
-+                      return name;
-+              }
-+              if (PTR_ERR(name) != -ENAMETOOLONG)
-+                      return name;
-+
-+              kfree(buf);
-+              size <<= 1;
-+              if (size > apparmor_path_max)
-+                      return ERR_PTR(-ENAMETOOLONG);
-+      }
-+}
-+
-+static char *new_compound_name(const char *n1, const char *n2)
-+{
-+      char *name = kmalloc(strlen(n1) + strlen(n2) + 3, GFP_KERNEL);
-+      if (name)
-+              sprintf(name, "%s//%s", n1, n2);
-+      return name;
-+}
-+static inline void aa_put_name_buffer(char *buffer)
-+{
-+      kfree(buffer);
-+}
-+
-+/**
-+ * aa_perm_dentry - check if @profile allows @mask for a file
-+ * @profile: profile to check against
-+ * @dentry: dentry of the file
-+ * @mnt: vfsmount o the file
-+ * @sa: audit context
-+ * @mask: requested profile permissions
-+ * @check: kind of check to perform
-+ *
-+ * Returns 0 upon success, or else an error code.
-+ *
-+ * @check indicates the file type, and whether the file was accessed through
-+ * an open file descriptor (AA_CHECK_FD) or not.
-+ */
-+static int aa_perm_dentry(struct aa_profile *profile, struct dentry *dentry,
-+                        struct vfsmount *mnt, struct aa_audit *sa, int check)
-+{
-+      int error;
-+      char *buffer = NULL;
-+
-+      sa->name = aa_get_name(dentry, mnt, &buffer, check);
-+      sa->request_mask <<= aa_inode_mode(dentry->d_inode);
-+      if (IS_ERR(sa->name)) {
-+              /*
-+               * deleted files are given a pass on permission checks when
-+               * accessed through a file descriptor.
-+               */
-+              if (PTR_ERR(sa->name) == -ENOENT && (check & AA_CHECK_FD))
-+                      sa->denied_mask = 0;
-+              else {
-+                      sa->denied_mask = sa->request_mask;
-+                      sa->error_code = PTR_ERR(sa->name);
-+                      if (sa->error_code == -ENOENT)
-+                              sa->info = "Failed name resolution - object not a valid entry";
-+                      else if (sa->error_code == -ENAMETOOLONG)
-+                              sa->info = "Failed name resolution - name too long";
-+                      else
-+                              sa->info = "Failed name resolution";
-+              }
-+              sa->name = NULL;
-+      } else
-+              sa->denied_mask = aa_file_denied(profile, sa->name,
-+                                               sa->request_mask,
-+                                               &sa->audit_mask);
-+
-+      if (!sa->denied_mask)
-+              sa->error_code = 0;
-+
-+      error = aa_audit_file(profile, sa);
-+      aa_put_name_buffer(buffer);
-+
-+      return error;
-+}
-+
-+/**
-+ * aa_attr - check if attribute change is allowed
-+ * @profile: profile to check against
-+ * @dentry: dentry of the file to check
-+ * @mnt: vfsmount of the file to check
-+ * @iattr: attribute changes requested
-+ */
-+int aa_attr(struct aa_profile *profile, struct dentry *dentry,
-+          struct vfsmount *mnt, struct iattr *iattr)
-+{
-+      struct inode *inode = dentry->d_inode;
-+      int error, check;
-+      struct aa_audit sa;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "setattr";
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.iattr = iattr;
-+      sa.request_mask = MAY_WRITE;
-+      sa.error_code = -EACCES;
-+
-+      check = 0;
-+      if (inode && S_ISDIR(inode->i_mode))
-+              check |= AA_CHECK_DIR;
-+      if (iattr->ia_valid & ATTR_FILE)
-+              check |= AA_CHECK_FD;
-+
-+      error = aa_perm_dentry(profile, dentry, mnt, &sa, check);
-+
-+      return error;
-+}
-+
-+/**
-+ * aa_perm_xattr - check if xattr attribute change is allowed
-+ * @profile: profile to check against
-+ * @dentry: dentry of the file to check
-+ * @mnt: vfsmount of the file to check
-+ * @operation: xattr operation being done
-+ * @mask: access mode requested
-+ * @check: kind of check to perform
-+ */
-+int aa_perm_xattr(struct aa_profile *profile, const char *operation,
-+                struct dentry *dentry, struct vfsmount *mnt, int mask,
-+                int check)
-+{
-+      struct inode *inode = dentry->d_inode;
-+      int error;
-+      struct aa_audit sa;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = operation;
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.request_mask = mask;
-+      sa.error_code = -EACCES;
-+
-+      if (inode && S_ISDIR(inode->i_mode))
-+              check |= AA_CHECK_DIR;
-+
-+      error = aa_perm_dentry(profile, dentry, mnt, &sa, check);
-+
-+      return error;
-+}
-+
-+/**
-+ * aa_perm - basic apparmor permissions check
-+ * @profile: profile to check against
-+ * @dentry: dentry of the file to check
-+ * @mnt: vfsmount of the file to check
-+ * @mask: access mode requested
-+ * @check: kind of check to perform
-+ *
-+ * Determine if access @mask for the file is authorized by @profile.
-+ * Returns 0 on success, or else an error code.
-+ */
-+int aa_perm(struct aa_profile *profile, const char *operation,
-+          struct dentry *dentry, struct vfsmount *mnt, int mask, int check)
-+{
-+      struct aa_audit sa;
-+      int error = 0;
-+
-+      if (mask == 0)
-+              goto out;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = operation;
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.request_mask = mask;
-+      sa.error_code = -EACCES;
-+
-+      error = aa_perm_dentry(profile, dentry, mnt, &sa, check);
-+
-+out:
-+      return error;
-+}
-+
-+/**
-+ * aa_perm_dir
-+ * @profile: profile to check against
-+ * @dentry: dentry of directory to check
-+ * @mnt: vfsmount of directory to check
-+ * @operation: directory operation being performed
-+ * @mask: access mode requested
-+ *
-+ * Determine if directory operation (make/remove) for dentry is authorized
-+ * by @profile.
-+ * Returns 0 on success, or else an error code.
-+ */
-+int aa_perm_dir(struct aa_profile *profile, const char *operation,
-+              struct dentry *dentry, struct vfsmount *mnt, int mask)
-+{
-+      struct aa_audit sa;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = operation;
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.request_mask = mask;
-+      sa.error_code = -EACCES;
-+
-+      return aa_perm_dentry(profile, dentry, mnt, &sa, AA_CHECK_DIR);
-+}
-+
-+int aa_perm_path(struct aa_profile *profile, const char *operation,
-+               const char *name, int mask, uid_t uid)
-+{
-+      struct aa_audit sa;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = operation;
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.request_mask = mask;
-+      sa.name = name;
-+      if (current->fsuid == uid)
-+              sa.request_mask = mask << AA_USER_SHIFT;
-+      else
-+              sa.request_mask = mask << AA_OTHER_SHIFT;
-+
-+      sa.denied_mask = aa_file_denied(profile, name, sa.request_mask,
-+                                      &sa.audit_mask) ;
-+      sa.error_code = sa.denied_mask ? -EACCES : 0;
-+
-+      return aa_audit_file(profile, &sa);
-+}
-+
-+/**
-+ * aa_capability - test permission to use capability
-+ * @cxt: aa_task_context with profile to check against
-+ * @cap: capability to be tested
-+ *
-+ * Look up capability in profile capability set.
-+ * Returns 0 on success, or else an error code.
-+ */
-+int aa_capability(struct aa_task_context *cxt, int cap)
-+{
-+      int error = cap_raised(cxt->profile->capabilities, cap) ? 0 : -EPERM;
-+      struct aa_audit sa;
-+
-+      /* test if cap has alread been logged */
-+      if (cap_raised(cxt->caps_logged, cap)) {
-+              if (PROFILE_COMPLAIN(cxt->profile))
-+                      error = 0;
-+              return error;
-+      } else
-+              /* don't worry about rcu replacement of the cxt here.
-+               * caps_logged is a cache to reduce the occurence of
-+               * duplicate messages in the log.  The worst that can
-+               * happen is duplicate capability messages shows up in
-+               * the audit log
-+               */
-+              cap_raise(cxt->caps_logged, cap);
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "capable";
-+      sa.gfp_mask = GFP_ATOMIC;
-+      sa.name = capability_names[cap];
-+      sa.error_code = error;
-+
-+      error = aa_audit_caps(cxt->profile, &sa, cap);
-+
-+      return error;
-+}
-+
-+/* must be used inside rcu_read_lock or task_lock */
-+int aa_may_ptrace(struct aa_task_context *cxt, struct aa_profile *tracee)
-+{
-+      if (!cxt || cxt->profile == tracee)
-+              return 0;
-+      return aa_capability(cxt, CAP_SYS_PTRACE);
-+}
-+
-+/**
-+ * aa_link - hard link check
-+ * @profile: profile to check against
-+ * @link: dentry of link being created
-+ * @link_mnt: vfsmount of link being created
-+ * @target: dentry of link target
-+ * @target_mnt: vfsmunt of link target
-+ *
-+ * Returns 0 on success, or else an error code.
-+ */
-+int aa_link(struct aa_profile *profile,
-+          struct dentry *link, struct vfsmount *link_mnt,
-+          struct dentry *target, struct vfsmount *target_mnt)
-+{
-+      int error;
-+      struct aa_audit sa;
-+      char *buffer = NULL, *buffer2 = NULL;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "inode_link";
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.name = aa_get_name(link, link_mnt, &buffer, 0);
-+      sa.name2 = aa_get_name(target, target_mnt, &buffer2, 0);
-+
-+      if (IS_ERR(sa.name)) {
-+              sa.error_code = PTR_ERR(sa.name);
-+              sa.name = NULL;
-+      }
-+      if (IS_ERR(sa.name2)) {
-+              sa.error_code = PTR_ERR(sa.name2);
-+              sa.name2 = NULL;
-+      }
-+
-+      if (sa.name && sa.name2) {
-+              sa.denied_mask = aa_link_denied(profile, sa.name, sa.name2,
-+                                              aa_inode_mode(target->d_inode),
-+                                              &sa.request_mask,
-+                                              &sa.audit_mask);
-+              sa.error_code = sa.denied_mask ? -EACCES : 0;
-+      }
-+
-+      error = aa_audit_file(profile, &sa);
-+
-+      aa_put_name_buffer(buffer);
-+      aa_put_name_buffer(buffer2);
-+
-+      return error;
-+}
-+
-+/*******************************
-+ * Global task related functions
-+ *******************************/
-+
-+/**
-+ * aa_clone - initialize the task context for a new task
-+ * @child: task that is being created
-+ *
-+ * Returns 0 on success, or else an error code.
-+ */
-+int aa_clone(struct task_struct *child)
-+{
-+      struct aa_task_context *cxt, *child_cxt;
-+      struct aa_profile *profile;
-+
-+      if (!aa_task_context(current))
-+              return 0;
-+      child_cxt = aa_alloc_task_context(GFP_KERNEL);
-+      if (!child_cxt)
-+              return -ENOMEM;
-+
-+repeat:
-+      profile = aa_get_profile(current);
-+      if (profile) {
-+              lock_profile(profile);
-+              cxt = aa_task_context(current);
-+              if (unlikely(profile->isstale || !cxt ||
-+                           cxt->profile != profile)) {
-+                      /**
-+                       * Race with profile replacement or removal, or with
-+                       * task context removal.
-+                       */
-+                      unlock_profile(profile);
-+                      aa_put_profile(profile);
-+                      goto repeat;
-+              }
-+
-+              /* No need to grab the child's task lock here. */
-+              aa_change_task_context(child, child_cxt, profile,
-+                                     cxt->cookie, cxt->previous_profile);
-+              unlock_profile(profile);
-+
-+              if (APPARMOR_COMPLAIN(child_cxt) &&
-+                  profile == profile->ns->null_complain_profile) {
-+                      struct aa_audit sa;
-+                      memset(&sa, 0, sizeof(sa));
-+                      sa.operation = "clone";
-+                      sa.gfp_mask = GFP_KERNEL;
-+                      sa.task = child->pid;
-+                      aa_audit_hint(profile, &sa);
-+              }
-+              aa_put_profile(profile);
-+      } else
-+              aa_free_task_context(child_cxt);
-+
-+      return 0;
-+}
-+
-+static struct aa_profile *
-+aa_register_find(struct aa_profile *profile, const char* ns_name,
-+               const char *name, int mandatory, int complain,
-+               struct aa_audit *sa)
-+{
-+      struct aa_namespace *ns;
-+      struct aa_profile *new_profile;
-+      int ns_ref = 0;
-+
-+      if (profile)
-+              ns = profile->ns;
-+      else
-+              ns = default_namespace;
-+
-+      if (ns_name) {
-+              /* locate the profile namespace */
-+              ns = aa_find_namespace(ns_name);
-+              if (!ns) {
-+                      if (mandatory) {
-+                              sa->info = "profile namespace not found";
-+                              sa->denied_mask = sa->request_mask;
-+                              sa->error_code = -ENOENT;
-+                              return ERR_PTR(-ENOENT);
-+                      } else {
-+                              return NULL;
-+                      }
-+              }
-+              ns_ref++;
-+      }
-+
-+      /* Locate new profile */
-+      new_profile = aa_find_profile(ns, name);
-+
-+      if (new_profile) {
-+              AA_DEBUG("%s: setting profile %s\n",
-+                       __FUNCTION__, new_profile->name);
-+      } else if (mandatory && profile) {
-+              sa->info = "mandatory profile missing";
-+              sa->denied_mask = sa->request_mask;     /* shifted MAY_EXEC */
-+              if (complain) {
-+                      aa_audit_hint(profile, sa);
-+                      new_profile =
-+                          aa_dup_profile(profile->ns->null_complain_profile);
-+              } else {
-+                      sa->error_code = -EACCES;
-+                      if (ns_ref)
-+                              aa_put_namespace(ns);
-+                      return ERR_PTR(-EACCES);
-+              }
-+      } else {
-+              /* Only way we can get into this code is if task
-+               * is unconfined, pix, nix.
-+               */
-+              AA_DEBUG("%s: No profile found for exec image '%s'\n",
-+                       __FUNCTION__,
-+                       name);
-+      }
-+      if (ns_ref)
-+              aa_put_namespace(ns);
-+      return new_profile;
-+}
-+
-+static struct aa_profile *
-+aa_x_to_profile(struct aa_profile *profile, const char *filename, int xmode,
-+              struct aa_audit *sa, char **child)
-+{
-+      struct aa_profile *new_profile = NULL;
-+      int ix = xmode & AA_EXEC_INHERIT;
-+      int complain = PROFILE_COMPLAIN(profile);
-+      int index;
-+
-+      *child = NULL;
-+      switch (xmode & AA_EXEC_MODIFIERS) {
-+      case 0:
-+              /* only valid with ix flag */
-+              ix = 1;
-+              break;
-+      case AA_EXEC_UNCONFINED:
-+              /* only valid without ix flag */
-+              ix = 0;
-+              break;
-+      case AA_EXEC_PROFILE:
-+              new_profile = aa_register_find(profile, NULL, filename, !ix,
-+                                             complain, sa);
-+              break;
-+      case AA_EXEC_CHILD:
-+              *child = new_compound_name(profile->name, filename);
-+              sa->name2 = *child;
-+              if (!*child) {
-+                      sa->info = "Failed name resolution - exec failed";
-+                      sa->error_code = -ENOMEM;
-+                      new_profile = ERR_PTR(-ENOMEM);
-+              } else {
-+                      new_profile = aa_register_find(profile, NULL, *child,
-+                                                     !ix, complain, sa);
-+              }
-+              break;
-+      default:
-+              /* all other indexes are named transitions */
-+              index = AA_EXEC_INDEX(xmode);
-+              if (index - 4 > profile->exec_table_size) {
-+                      sa->info = "invalid named transition - exec failed";
-+                      sa->error_code = -EACCES;
-+                      new_profile = ERR_PTR(-EACCES);
-+              } else {
-+                      char *ns_name = NULL;
-+                      char *name = profile->exec_table[index - 4];
-+                      if (*name == ':') {
-+                              ns_name = name + 1;
-+                              name = ns_name + strlen(ns_name) + 1;
-+                      }
-+                      sa->name2 = name;
-+                      sa->name3 = ns_name;
-+                      new_profile =
-+                              aa_register_find(profile, ns_name, name,
-+                                               !ix, complain, sa);
-+              }
-+      }
-+      if (IS_ERR(new_profile))
-+              /* all these failures must be audited - no quieting */
-+              return ERR_PTR(aa_audit_reject(profile, sa));
-+      return new_profile;
-+}
-+
-+/**
-+ * aa_register - register a new program
-+ * @bprm: binprm of program being registered
-+ *
-+ * Try to register a new program during execve().  This should give the
-+ * new program a valid aa_task_context if confined.
-+ */
-+int aa_register(struct linux_binprm *bprm)
-+{
-+      const char *filename;
-+      char  *buffer = NULL, *child = NULL;
-+      struct file *filp = bprm->file;
-+      struct aa_profile *profile, *old_profile, *new_profile = NULL;
-+      int exec_mode, complain = 0, shift;
-+      struct aa_audit sa;
-+
-+      AA_DEBUG("%s\n", __FUNCTION__);
-+
-+      profile = aa_get_profile(current);
-+
-+      shift = aa_inode_mode(filp->f_dentry->d_inode);
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "exec";
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.request_mask = MAY_EXEC << shift;
-+
-+      filename = aa_get_name(filp->f_dentry, filp->f_vfsmnt, &buffer, 0);
-+      if (IS_ERR(filename)) {
-+              if (profile) {
-+                      sa.info = "Failed name resolution - exec failed";
-+                      sa.error_code = PTR_ERR(filename);
-+                      aa_audit_file(profile, &sa);
-+                      return sa.error_code;
-+              } else
-+                      return 0;
-+      }
-+      sa.name = filename;
-+
-+      exec_mode = AA_EXEC_UNSAFE << shift;
-+
-+repeat:
-+      if (profile) {
-+              complain = PROFILE_COMPLAIN(profile);
-+
-+              /* Confined task, determine what mode inherit, unconfined or
-+               * mandatory to load new profile
-+               */
-+              exec_mode = aa_match(profile->file_rules, filename,
-+                                   &sa.audit_mask);
-+
-+
-+              if (exec_mode & sa.request_mask) {
-+                      int xm = exec_mode >> shift;
-+                      new_profile = aa_x_to_profile(profile, filename,
-+                                                    xm, &sa, &child);
-+
-+                      if (!new_profile && (xm & AA_EXEC_INHERIT))
-+                              /* (p|c|n|)ix - don't change profile */
-+                              goto cleanup;
-+                      /* error case caught below */
-+
-+              } else if (sa.request_mask & AUDIT_QUIET_MASK(sa.audit_mask)) {
-+                      /* quiet failed exit */
-+                      new_profile = ERR_PTR(-EACCES);
-+              } else if (complain) {
-+                      /* There was no entry in calling profile
-+                       * describing mode to execute image in.
-+                       * Drop into null-profile (disabling secure exec).
-+                       */
-+                      new_profile =
-+                          aa_dup_profile(profile->ns->null_complain_profile);
-+                      exec_mode |= AA_EXEC_UNSAFE << shift;
-+              } else {
-+                      sa.denied_mask = sa.request_mask;
-+                      sa.error_code = -EACCES;
-+                      new_profile = ERR_PTR(aa_audit_file(profile, &sa));
-+              }
-+      } else {
-+              /* Unconfined task, load profile if it exists */
-+              new_profile = aa_register_find(NULL, NULL, filename, 0, 0, &sa);
-+              if (new_profile == NULL)
-+                      goto cleanup;
-+      }
-+
-+      if (IS_ERR(new_profile))
-+              goto cleanup;
-+
-+      old_profile = __aa_replace_profile(current, new_profile);
-+      if (IS_ERR(old_profile)) {
-+              aa_put_profile(new_profile);
-+              aa_put_profile(profile);
-+              if (PTR_ERR(old_profile) == -ESTALE) {
-+                      profile = aa_get_profile(current);
-+                      goto repeat;
-+              }
-+              if (PTR_ERR(old_profile) == -EPERM) {
-+                      sa.denied_mask = sa.request_mask;
-+                      sa.info = "unable to set profile due to ptrace";
-+                      sa.task = current->parent->pid;
-+                      aa_audit_reject(profile, &sa);
-+              }
-+              new_profile = old_profile;
-+              goto cleanup;
-+      }
-+      aa_put_profile(old_profile);
-+      aa_put_profile(profile);
-+
-+      /* Handle confined exec.
-+       * Can be at this point for the following reasons:
-+       * 1. unconfined switching to confined
-+       * 2. confined switching to different confinement
-+       * 3. confined switching to unconfined
-+       *
-+       * Cases 2 and 3 are marked as requiring secure exec
-+       * (unless policy specified "unsafe exec")
-+       */
-+      if (!(exec_mode & (AA_EXEC_UNSAFE << shift))) {
-+              unsigned long bprm_flags;
-+
-+              bprm_flags = AA_SECURE_EXEC_NEEDED;
-+              bprm->security = (void*)
-+                      ((unsigned long)bprm->security | bprm_flags);
-+      }
-+
-+      if (complain && new_profile &&
-+          new_profile == new_profile->ns->null_complain_profile) {
-+              sa.request_mask = 0;
-+              sa.name = NULL;
-+              sa.info = "set profile";
-+              aa_audit_hint(new_profile, &sa);
-+      }
-+
-+cleanup:
-+      aa_put_name_buffer(child);
-+      aa_put_name_buffer(buffer);
-+      if (IS_ERR(new_profile))
-+              return PTR_ERR(new_profile);
-+      aa_put_profile(new_profile);
-+      return 0;
-+}
-+
-+/**
-+ * aa_release - release a task context
-+ * @task: task being released
-+ *
-+ * This is called after a task has exited and the parent has reaped it.
-+ */
-+void aa_release(struct task_struct *task)
-+{
-+      struct aa_task_context *cxt;
-+      struct aa_profile *profile;
-+      /*
-+       * While the task context is still on a profile's task context
-+       * list, another process could replace the profile under us,
-+       * leaving us with a locked profile that is no longer attached
-+       * to this task. So after locking the profile, we check that
-+       * the profile is still attached.  The profile lock is
-+       * sufficient to prevent the replacement race so we do not lock
-+       * the task.
-+       *
-+       * Use lock subtyping to avoid lockdep reporting a false irq
-+       * possible inversion between the task_lock and profile_lock
-+       *
-+       * We also avoid taking the task_lock here because lock_dep
-+       * would report another false {softirq-on-W} potential irq_lock
-+       * inversion.
-+       *
-+       * If the task does not have a profile attached we are safe;
-+       * nothing can race with us at this point.
-+       */
-+
-+repeat:
-+      profile = aa_get_profile(task);
-+      if (profile) {
-+              lock_profile_nested(profile, aa_lock_task_release);
-+              cxt = aa_task_context(task);
-+              if (unlikely(!cxt || cxt->profile != profile)) {
-+                      unlock_profile(profile);
-+                      aa_put_profile(profile);
-+                      goto repeat;
-+              }
-+              aa_change_task_context(task, NULL, NULL, 0, NULL);
-+              unlock_profile(profile);
-+              aa_put_profile(profile);
-+      }
-+}
-+
-+static int do_change_profile(struct aa_profile *expected,
-+                           struct aa_namespace *ns, const char *name,
-+                           u64 cookie, int restore, int hat,
-+                           struct aa_audit *sa)
-+{
-+      struct aa_profile *new_profile = NULL, *old_profile = NULL,
-+              *previous_profile = NULL;
-+      struct aa_task_context *new_cxt, *cxt;
-+      int error = 0;
-+
-+      sa->name = name;
-+
-+      new_cxt = aa_alloc_task_context(GFP_KERNEL);
-+      if (!new_cxt)
-+              return -ENOMEM;
-+
-+      new_profile = aa_find_profile(ns, name);
-+      if (!new_profile && !restore) {
-+              if (!PROFILE_COMPLAIN(expected)) {
-+                      aa_free_task_context(new_cxt);
-+                      return -ENOENT;
-+              }
-+              new_profile = aa_dup_profile(ns->null_complain_profile);
-+      } else if (new_profile && hat && !PROFILE_IS_HAT(new_profile)) {
-+              aa_free_task_context(new_cxt);
-+              aa_put_profile(new_profile);
-+              return error;
-+      }
-+
-+      cxt = lock_task_and_profiles(current, new_profile);
-+      if (!cxt) {
-+              error = -EPERM;
-+              goto out;
-+      }
-+      old_profile = cxt->profile;
-+
-+      if (cxt->profile != expected || (new_profile && new_profile->isstale)) {
-+              error = -ESTALE;
-+              goto out;
-+      }
-+
-+      if (cxt->previous_profile) {
-+              if (cxt->cookie != cookie) {
-+                      error = -EACCES;
-+                      sa->info = "killing process";
-+                      aa_audit_reject(cxt->profile, sa);
-+                      /* terminate process */
-+                      (void)send_sig_info(SIGKILL, NULL, current);
-+                      goto out;
-+              }
-+
-+              if (!restore)
-+                      previous_profile = cxt->previous_profile;
-+      } else
-+              previous_profile = cxt->profile;
-+
-+      if ((current->ptrace & PT_PTRACED) && aa_may_ptrace(cxt, new_profile)) {
-+              error = -EACCES;
-+              goto out;
-+      }
-+
-+      if (new_profile == ns->null_complain_profile)
-+              aa_audit_hint(cxt->profile, sa);
-+
-+      if (APPARMOR_AUDIT(cxt))
-+              aa_audit_message(cxt->profile, sa, AUDIT_APPARMOR_AUDIT);
-+
-+      if (!restore && cookie)
-+              aa_change_task_context(current, new_cxt, new_profile, cookie,
-+                                     previous_profile);
-+      else
-+              /* either return to previous_profile, or a permanent change */
-+              aa_change_task_context(current, new_cxt, new_profile, 0, NULL);
-+
-+out:
-+      if (aa_task_context(current) != new_cxt)
-+              aa_free_task_context(new_cxt);
-+      task_unlock(current);
-+      unlock_both_profiles(old_profile, new_profile);
-+      aa_put_profile(new_profile);
-+      return error;
-+}
-+
-+/**
-+ * aa_change_profile - perform a one-way profile transition
-+ * @ns_name: name of the profile namespace to change to
-+ * @name: name of profile to change to
-+ * Change to new profile @name.  Unlike with hats, there is no way
-+ * to change back.
-+ *
-+ * Returns %0 on success, error otherwise.
-+ */
-+int aa_change_profile(const char *ns_name, const char *name)
-+{
-+      struct aa_task_context *cxt;
-+      struct aa_profile *profile = NULL;
-+      struct aa_namespace *ns = NULL;
-+      struct aa_audit sa;
-+      unsigned int state;
-+      int error = -EINVAL;
-+
-+      if (!name)
-+              return -EINVAL;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.gfp_mask = GFP_ATOMIC;
-+      sa.operation = "change_profile";
-+
-+repeat:
-+      task_lock(current);
-+      cxt = aa_task_context(current);
-+      if (cxt)
-+              profile = aa_dup_profile(cxt->profile);
-+      task_unlock(current);
-+
-+      if (ns_name)
-+              ns = aa_find_namespace(ns_name);
-+      else if (profile)
-+              ns = aa_get_namespace(profile->ns);
-+      else
-+              ns = aa_get_namespace(default_namespace);
-+
-+      if (!ns) {
-+              aa_put_profile(profile);
-+              return -ENOENT;
-+      }
-+
-+      if (!profile || PROFILE_COMPLAIN(profile) ||
-+          (ns == profile->ns &&
-+           (aa_match(profile->file_rules, name, NULL) & AA_CHANGE_PROFILE)))
-+              error = do_change_profile(profile, ns, name, 0, 0, 0, &sa);
-+      else {
-+              /* check for a rule with a namespace prepended */
-+              aa_match_state(profile->file_rules, DFA_START, ns->name,
-+                             &state);
-+              state = aa_dfa_null_transition(profile->file_rules, state);
-+              if ((aa_match_state(profile->file_rules, state, name, NULL) &
-+                    AA_CHANGE_PROFILE))
-+                      error = do_change_profile(profile, ns, name, 0, 0, 0,
-+                                                &sa);
-+              else
-+                      /* no permission to transition to profile @name */
-+                      error = -EACCES;
-+      }
-+
-+      aa_put_namespace(ns);
-+      aa_put_profile(profile);
-+      if (error == -ESTALE)
-+              goto repeat;
-+
-+      return error;
-+}
-+
-+/**
-+ * aa_change_hat - change hat to/from subprofile
-+ * @hat_name: hat to change to
-+ * @cookie: magic value to validate the hat change
-+ *
-+ * Change to new @hat_name, and store the @hat_magic in the current task
-+ * context.  If the new @hat_name is %NULL and the @cookie matches that
-+ * stored in the current task context and is not 0, return to the top level
-+ * profile.
-+ * Returns %0 on success, error otherwise.
-+ */
-+int aa_change_hat(const char *hat_name, u64 cookie)
-+{
-+      struct aa_task_context *cxt;
-+      struct aa_profile *profile, *previous_profile;
-+      struct aa_audit sa;
-+      int error = 0;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.gfp_mask = GFP_ATOMIC;
-+      sa.operation = "change_hat";
-+
-+repeat:
-+      task_lock(current);
-+      cxt = aa_task_context(current);
-+      if (!cxt) {
-+              task_unlock(current);
-+              return -EPERM;
-+      }
-+      profile = aa_dup_profile(cxt->profile);
-+      previous_profile = aa_dup_profile(cxt->previous_profile);
-+      task_unlock(current);
-+
-+      if (hat_name) {
-+              char *name, *profile_name;
-+
-+              if (previous_profile)
-+                      profile_name = previous_profile->name;
-+              else
-+                      profile_name = profile->name;
-+
-+              name = new_compound_name(profile_name, hat_name);
-+              if (!name) {
-+                      error = -ENOMEM;
-+                      goto out;
-+              }
-+              error = do_change_profile(profile, profile->ns, name, cookie,
-+                                        0, 1, &sa);
-+              aa_put_name_buffer(name);
-+      } else if (previous_profile)
-+              error = do_change_profile(profile, profile->ns,
-+                                        previous_profile->name, cookie, 1, 0,
-+                                        &sa);
-+      /* else ignore restores when there is no saved profile */
-+
-+out:
-+      aa_put_profile(previous_profile);
-+      aa_put_profile(profile);
-+      if (error == -ESTALE)
-+              goto repeat;
-+
-+      return error;
-+}
-+
-+/**
-+ * __aa_replace_profile - replace a task's profile
-+ * @task: task to switch the profile of
-+ * @profile: profile to switch to
-+ *
-+ * Returns a handle to the previous profile upon success, or else an
-+ * error code.
-+ */
-+struct aa_profile *__aa_replace_profile(struct task_struct *task,
-+                                      struct aa_profile *profile)
-+{
-+      struct aa_task_context *cxt, *new_cxt = NULL;
-+      struct aa_profile *old_profile = NULL;
-+
-+      if (profile) {
-+              new_cxt = aa_alloc_task_context(GFP_KERNEL);
-+              if (!new_cxt)
-+                      return ERR_PTR(-ENOMEM);
-+      }
-+
-+      cxt = lock_task_and_profiles(task, profile);
-+      if (unlikely(profile && profile->isstale)) {
-+              task_unlock(task);
-+              unlock_both_profiles(profile, cxt ? cxt->profile : NULL);
-+              aa_free_task_context(new_cxt);
-+              return ERR_PTR(-ESTALE);
-+      }
-+
-+      if ((current->ptrace & PT_PTRACED) && aa_may_ptrace(cxt, profile)) {
-+              task_unlock(task);
-+              unlock_both_profiles(profile, cxt ? cxt->profile : NULL);
-+              aa_free_task_context(new_cxt);
-+              return ERR_PTR(-EPERM);
-+      }
-+
-+      if (cxt)
-+              old_profile = aa_dup_profile(cxt->profile);
-+      aa_change_task_context(task, new_cxt, profile, 0, NULL);
-+
-+      task_unlock(task);
-+      unlock_both_profiles(profile, old_profile);
-+      return old_profile;
-+}
-+
-+/**
-+ * lock_task_and_profiles - lock the task and confining profiles and @profile
-+ * @task: task to lock
-+ * @profile: extra profile to lock in addition to the current profile
-+ *
-+ * Handle the spinning on locking to make sure the task context and
-+ * profile are consistent once all locks are aquired.
-+ *
-+ * return the aa_task_context currently confining the task.  The task lock
-+ * will be held whether or not the task is confined.
-+ */
-+struct aa_task_context *
-+lock_task_and_profiles(struct task_struct *task, struct aa_profile *profile)
-+{
-+      struct aa_task_context *cxt;
-+      struct aa_profile *old_profile = NULL;
-+
-+      rcu_read_lock();
-+repeat:
-+      cxt = aa_task_context(task);
-+      if (cxt)
-+              old_profile = cxt->profile;
-+
-+      lock_both_profiles(profile, old_profile);
-+      task_lock(task);
-+
-+      /* check for race with profile transition, replacement or removal */
-+      if (unlikely(cxt != aa_task_context(task))) {
-+              task_unlock(task);
-+              unlock_both_profiles(profile, old_profile);
-+              old_profile = NULL;
-+              goto repeat;
-+      }
-+      rcu_read_unlock();
-+      return cxt;
-+}
-+
-+static void free_aa_task_context_rcu_callback(struct rcu_head *head)
-+{
-+      struct aa_task_context *cxt;
-+
-+      cxt = container_of(head, struct aa_task_context, rcu);
-+      aa_free_task_context(cxt);
-+}
-+
-+/**
-+ * aa_change_task_context - switch a task to use a new context and profile
-+ * @task: task that is having its task context changed
-+ * @new_cxt: new task context to use after the switch
-+ * @profile: new profile to use after the switch
-+ * @cookie: magic value to switch to
-+ * @previous_profile: profile the task can return to
-+ */
-+void aa_change_task_context(struct task_struct *task,
-+                          struct aa_task_context *new_cxt,
-+                          struct aa_profile *profile, u64 cookie,
-+                          struct aa_profile *previous_profile)
-+{
-+      struct aa_task_context *old_cxt = aa_task_context(task);
-+
-+      if (old_cxt) {
-+              list_del_init(&old_cxt->list);
-+              call_rcu(&old_cxt->rcu, free_aa_task_context_rcu_callback);
-+      }
-+      if (new_cxt) {
-+              /* set the caps_logged cache to the quiet_caps mask
-+               * this has the effect of quieting caps that are not
-+               * supposed to be logged
-+               */
-+              new_cxt->caps_logged = profile->quiet_caps;
-+              new_cxt->cookie = cookie;
-+              new_cxt->task = task;
-+              new_cxt->profile = aa_dup_profile(profile);
-+              new_cxt->previous_profile = aa_dup_profile(previous_profile);
-+              list_move(&new_cxt->list, &profile->task_contexts);
-+      }
-+      rcu_assign_pointer(task->security, new_cxt);
-+}
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-misc.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-misc.diff
deleted file mode 100644 (file)
index abffd1c..0000000
+++ /dev/null
@@ -1,1441 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: all the rest
-
-All the things that didn't nicely fit in a category on their own: kbuild
-code, declararions and inline functions, /sys/kernel/security/apparmor
-filesystem for controlling apparmor from user space, profile list
-functions, locking documentation, /proc/$pid/task/$tid/attr/current
-access.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- security/apparmor/Kconfig      |   42 ++++
- security/apparmor/Makefile     |   13 +
- security/apparmor/apparmor.h   |  371 +++++++++++++++++++++++++++++++++++++++++
- security/apparmor/apparmorfs.c |  281 +++++++++++++++++++++++++++++++
- security/apparmor/inline.h     |  250 +++++++++++++++++++++++++++
- security/apparmor/list.c       |  174 +++++++++++++++++++
- security/apparmor/locking.txt  |   68 +++++++
- security/apparmor/procattr.c   |  195 +++++++++++++++++++++
- 8 files changed, 1394 insertions(+)
-
---- /dev/null
-+++ b/security/apparmor/Kconfig
-@@ -0,0 +1,42 @@
-+config SECURITY_APPARMOR
-+      bool "AppArmor support"
-+      depends on SECURITY
-+      select AUDIT
-+      help
-+        This enables the AppArmor security module.
-+        Required userspace tools (if they are not included in your
-+        distribution) and further information may be found at
-+        <http://forge.novell.com/modules/xfmod/project/?apparmor>
-+
-+        If you are unsure how to answer this question, answer N.
-+
-+config SECURITY_APPARMOR_BOOTPARAM_VALUE
-+      int "AppArmor boot parameter default value"
-+      depends on SECURITY_APPARMOR
-+      range 0 1
-+      default 1
-+      help
-+        This option sets the default value for the kernel parameter
-+        'apparmor', which allows AppArmor to be enabled or disabled
-+          at boot.  If this option is set to 0 (zero), the AppArmor
-+        kernel parameter will default to 0, disabling AppArmor at
-+        bootup.  If this option is set to 1 (one), the AppArmor
-+        kernel parameter will default to 1, enabling AppArmor at
-+        bootup.
-+
-+        If you are unsure how to answer this question, answer 1.
-+
-+config SECURITY_APPARMOR_DISABLE
-+      bool "AppArmor runtime disable"
-+      depends on SECURITY_APPARMOR
-+      default n
-+      help
-+        This option enables writing to a apparmorfs node 'disable', which
-+        allows AppArmor to be disabled at runtime prior to the policy load.
-+        AppArmor will then remain disabled until the next boot.
-+        This option is similar to the apparmor.enabled=0 boot parameter,
-+        but is to support runtime disabling of AppArmor, e.g. from
-+        /sbin/init, for portability across platforms where boot
-+        parameters are difficult to employ.
-+
-+        If you are unsure how to answer this question, answer N.
---- /dev/null
-+++ b/security/apparmor/Makefile
-@@ -0,0 +1,13 @@
-+# Makefile for AppArmor Linux Security Module
-+#
-+obj-$(CONFIG_SECURITY_APPARMOR) += apparmor.o
-+
-+apparmor-y := main.o list.o procattr.o lsm.o apparmorfs.o \
-+            module_interface.o match.o
-+
-+quiet_cmd_make-caps = GEN     $@
-+cmd_make-caps = sed -n -e "/CAP_FS_MASK/d" -e "s/^\#define[ \\t]\\+CAP_\\([A-Z0-9_]\\+\\)[ \\t]\\+\\([0-9]\\+\\)\$$/[\\2]  = \"\\1\",/p" $< | tr A-Z a-z > $@
-+
-+$(obj)/main.o : $(obj)/capability_names.h
-+$(obj)/capability_names.h : $(srctree)/include/linux/capability.h
-+      $(call cmd,make-caps)
---- /dev/null
-+++ b/security/apparmor/apparmor.h
-@@ -0,0 +1,371 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor internal prototypes
-+ */
-+
-+#ifndef __APPARMOR_H
-+#define __APPARMOR_H
-+
-+#include <linux/sched.h>
-+#include <linux/fs.h>
-+#include <linux/binfmts.h>
-+#include <linux/rcupdate.h>
-+
-+/*
-+ * We use MAY_READ, MAY_WRITE, MAY_EXEC, MAY_APPEND and the following flags
-+ * for profile permissions
-+ */
-+#define AA_MAY_LINK                   0x0010
-+#define AA_MAY_LOCK                   0x0020
-+#define AA_EXEC_MMAP                  0x0040
-+#define AA_MAY_MOUNT                  0x0080  /* no direct audit mapping */
-+#define AA_EXEC_UNSAFE                        0x0100
-+#define AA_EXEC_INHERIT                       0x0200
-+#define AA_EXEC_MOD_0                 0x0400
-+#define AA_EXEC_MOD_1                 0x0800
-+#define AA_EXEC_MOD_2                 0x1000
-+#define AA_EXEC_MOD_3                 0x2000
-+
-+#define AA_BASE_PERMS                 (MAY_READ | MAY_WRITE | MAY_EXEC | \
-+                                       MAY_APPEND | AA_MAY_LINK | \
-+                                       AA_MAY_LOCK | AA_EXEC_MMAP | \
-+                                       AA_MAY_MOUNT | AA_EXEC_UNSAFE | \
-+                                       AA_EXEC_INHERIT | AA_EXEC_MOD_0 | \
-+                                       AA_EXEC_MOD_1 | AA_EXEC_MOD_2 | \
-+                                       AA_EXEC_MOD_3)
-+
-+#define AA_EXEC_MODIFIERS             (AA_EXEC_MOD_0 | AA_EXEC_MOD_1 | \
-+                                       AA_EXEC_MOD_2 | AA_EXEC_MOD_3)
-+
-+#define AA_EXEC_TYPE                  (AA_EXEC_UNSAFE | AA_EXEC_INHERIT | \
-+                                       AA_EXEC_MODIFIERS)
-+
-+#define AA_EXEC_UNCONFINED            AA_EXEC_MOD_0
-+#define AA_EXEC_PROFILE                       AA_EXEC_MOD_1
-+#define AA_EXEC_CHILD                 (AA_EXEC_MOD_0 | AA_EXEC_MOD_1)
-+/* remaining exec modes are index into profile name table */
-+#define AA_EXEC_INDEX(mode)           ((mode & AA_EXEC_MODIFIERS) >> 10)
-+
-+#define AA_USER_SHIFT                 0
-+#define AA_OTHER_SHIFT                        14
-+
-+#define AA_USER_PERMS                 (AA_BASE_PERMS << AA_USER_SHIFT)
-+#define AA_OTHER_PERMS                        (AA_BASE_PERMS << AA_OTHER_SHIFT)
-+
-+#define AA_FILE_PERMS                 (AA_USER_PERMS | AA_OTHER_PERMS)
-+
-+#define AA_LINK_BITS                  ((AA_MAY_LINK << AA_USER_SHIFT) | \
-+                                       (AA_MAY_LINK << AA_OTHER_SHIFT))
-+
-+#define AA_USER_EXEC                  (MAY_EXEC << AA_USER_SHIFT)
-+#define AA_OTHER_EXEC                 (MAY_EXEC << AA_OTHER_SHIFT)
-+
-+#define AA_USER_EXEC_TYPE             (AA_EXEC_TYPE << AA_USER_SHIFT)
-+#define AA_OTHER_EXEC_TYPE            (AA_EXEC_TYPE << AA_OTHER_SHIFT)
-+
-+#define AA_EXEC_BITS                  (AA_USER_EXEC | AA_OTHER_EXEC)
-+
-+#define ALL_AA_EXEC_UNSAFE            ((AA_EXEC_UNSAFE << AA_USER_SHIFT) | \
-+                                       (AA_EXEC_UNSAFE << AA_OTHER_SHIFT))
-+
-+#define ALL_AA_EXEC_TYPE              (AA_USER_EXEC_TYPE | AA_OTHER_EXEC_TYPE)
-+
-+/* overloaded permissions for link pairs */
-+#define AA_LINK_SUBSET_TEST           0x0020
-+
-+#define AA_USER_PTRACE                        0x10000000
-+#define AA_OTHER_PTRACE                       0x20000000
-+#define AA_PTRACE_PERMS                       (AA_USER_PTRACE | AA_OTHER_PTRACE)
-+
-+/* shared permissions that are not duplicated in user::other */
-+#define AA_CHANGE_HAT                 0x40000000
-+#define AA_CHANGE_PROFILE             0x80000000
-+
-+#define AA_SHARED_PERMS                       (AA_CHANGE_HAT | AA_CHANGE_PROFILE)
-+
-+#define AA_VALID_PERM_MASK            (AA_FILE_PERMS | AA_PTRACE_PERMS | \
-+                                       AA_SHARED_PERMS)
-+
-+/* audit bits for the second accept field */
-+#define AUDIT_FILE_MASK 0x1fc07f
-+#define AUDIT_QUIET_MASK(mask)                ((mask >> 7) & AUDIT_FILE_MASK)
-+#define AA_VALID_PERM2_MASK           0x0fffffff
-+
-+#define AA_SECURE_EXEC_NEEDED         1
-+
-+/* Control parameters (0 or 1), settable thru module/boot flags or
-+ * via /sys/kernel/security/apparmor/control */
-+extern int apparmor_complain;
-+extern int apparmor_debug;
-+extern int apparmor_audit;
-+extern int apparmor_logsyscall;
-+extern unsigned int apparmor_path_max;
-+
-+#define PROFILE_COMPLAIN(_profile) \
-+      (apparmor_complain == 1 || ((_profile) && (_profile)->flags.complain))
-+
-+#define APPARMOR_COMPLAIN(_cxt) \
-+      (apparmor_complain == 1 || \
-+       ((_cxt) && (_cxt)->profile && (_cxt)->profile->flags.complain))
-+
-+#define PROFILE_AUDIT(_profile) \
-+      (apparmor_audit == 1 || ((_profile) && (_profile)->flags.audit))
-+
-+#define APPARMOR_AUDIT(_cxt) \
-+      (apparmor_audit == 1 || \
-+       ((_cxt) && (_cxt)->profile && (_cxt)->profile->flags.audit))
-+
-+#define PROFILE_IS_HAT(_profile) \
-+      ((_profile) && (_profile)->flags.hat)
-+
-+/*
-+ * DEBUG remains global (no per profile flag) since it is mostly used in sysctl
-+ * which is not related to profile accesses.
-+ */
-+
-+#define AA_DEBUG(fmt, args...)                                                \
-+      do {                                                            \
-+              if (apparmor_debug)                                     \
-+                      printk(KERN_DEBUG "AppArmor: " fmt, ##args);    \
-+      } while (0)
-+
-+#define AA_ERROR(fmt, args...)        printk(KERN_ERR "AppArmor: " fmt, ##args)
-+
-+struct aa_profile;
-+
-+/* struct aa_namespace - namespace for a set of profiles
-+ * @name: the name of the namespace
-+ * @list: list the namespace is on
-+ * @profiles: list of profile in the namespace
-+ * @profile_count: the number of profiles in the namespace
-+ * @null_complain_profile: special profile used for learning in this namespace
-+ * @count: reference count on the namespace
-+ * @lock: lock for adding/removing profile to the namespace
-+ */
-+struct aa_namespace {
-+      char *name;
-+      struct list_head list;
-+      struct list_head profiles;
-+      int profile_count;
-+      struct aa_profile *null_complain_profile;
-+
-+      struct kref count;
-+      rwlock_t lock;
-+};
-+
-+/* struct aa_profile - basic confinement data
-+ * @name: the profiles name
-+ * @list: list this profile is on
-+ * @ns: namespace the profile is in
-+ * @file_rules: dfa containing the profiles file rules
-+ * @flags: flags controlling profile behavior
-+ * @isstale: flag indicating if profile is stale
-+ * @set_caps: capabilities that are being set
-+ * @capabilities: capabilities mask
-+ * @audit_caps: caps that are to be audited
-+ * @quiet_caps: caps that should not be audited
-+ * @capabilities: capabilities granted by the process
-+ * @count: reference count of the profile
-+ * @task_contexts: list of tasks confined by profile
-+ * @lock: lock for the task_contexts list
-+ * @network_families: basic network permissions
-+ * @audit_network: which network permissions to force audit
-+ * @quiet_network: which network permissions to quiet rejects
-+ *
-+ * The AppArmor profile contains the basic confinement data.  Each profile
-+ * has a name, and all nonstale profile are in a profile namespace.
-+ *
-+ * The task_contexts list and the isstale flag are protected by the
-+ * profile lock.
-+ *
-+ * If a task context is moved between two profiles, we first need to grab
-+ * both profile locks. lock_both_profiles() does that in a deadlock-safe
-+ * way.
-+ */
-+struct aa_profile {
-+      char *name;
-+      struct list_head list;
-+      struct aa_namespace *ns;
-+
-+      int exec_table_size;
-+      char **exec_table;
-+      struct aa_dfa *file_rules;
-+      struct {
-+              int hat;
-+              int complain;
-+              int audit;
-+      } flags;
-+      int isstale;
-+
-+      kernel_cap_t set_caps;
-+      kernel_cap_t capabilities;
-+      kernel_cap_t audit_caps;
-+      kernel_cap_t quiet_caps;
-+
-+      struct kref count;
-+      struct list_head task_contexts;
-+      spinlock_t lock;
-+      unsigned long int_flags;
-+};
-+
-+extern struct list_head profile_ns_list;
-+extern rwlock_t profile_ns_list_lock;
-+extern struct mutex aa_interface_lock;
-+
-+/**
-+ * struct aa_task_context - primary label for confined tasks
-+ * @profile: the current profile
-+ * @previous_profile: profile the task may return to
-+ * @cookie: magic value the task must know for returning to @previous_profile
-+ * @list: list this aa_task_context is on
-+ * @task: task that the aa_task_context confines
-+ * @rcu: rcu head used when freeing the aa_task_context
-+ * @caps_logged: caps that have previously generated log entries
-+ *
-+ * Contains the task's current profile (which could change due to
-+ * change_hat).  Plus the hat_magic needed during change_hat.
-+ */
-+struct aa_task_context {
-+      struct aa_profile *profile;
-+      struct aa_profile *previous_profile;
-+      u64 cookie;
-+      struct list_head list;
-+      struct task_struct *task;
-+      struct rcu_head rcu;
-+      kernel_cap_t caps_logged;
-+};
-+
-+extern struct aa_namespace *default_namespace;
-+
-+/* aa_audit - AppArmor auditing structure
-+ * Structure is populated by access control code and passed to aa_audit which
-+ * provides for a single point of logging.
-+ */
-+
-+struct aa_audit {
-+      const char *operation;
-+      gfp_t gfp_mask;
-+      const char *info;
-+      const char *name;
-+      const char *name2;
-+      const char *name3;
-+      int request_mask, denied_mask, audit_mask;
-+      struct iattr *iattr;
-+      pid_t task, parent;
-+      int error_code;
-+};
-+
-+/* Flags for the permission check functions */
-+#define AA_CHECK_FD   1  /* coming from a file descriptor */
-+#define AA_CHECK_DIR  2  /* file type is directory */
-+
-+/* lock subtypes so lockdep does not raise false dependencies */
-+enum aa_lock_class {
-+      aa_lock_normal,
-+      aa_lock_nested,
-+      aa_lock_task_release
-+};
-+
-+/* main.c */
-+extern int alloc_default_namespace(void);
-+extern void free_default_namespace(void);
-+extern int aa_audit_message(struct aa_profile *profile, struct aa_audit *sa,
-+                          int type);
-+void aa_audit_hint(struct aa_profile *profile, struct aa_audit *sa);
-+void aa_audit_status(struct aa_profile *profile, struct aa_audit *sa);
-+int aa_audit_reject(struct aa_profile *profile, struct aa_audit *sa);
-+extern int aa_audit_syscallreject(struct aa_profile *profile, gfp_t gfp,
-+                                const char *);
-+extern int aa_audit(struct aa_profile *profile, struct aa_audit *);
-+
-+extern int aa_attr(struct aa_profile *profile, struct dentry *dentry,
-+                 struct vfsmount *mnt, struct iattr *iattr);
-+extern int aa_perm_xattr(struct aa_profile *profile, const char *operation,
-+                       struct dentry *dentry, struct vfsmount *mnt,
-+                       int mask, int check);
-+extern int aa_capability(struct aa_task_context *cxt, int cap);
-+extern int aa_perm(struct aa_profile *profile, const char *operation,
-+                 struct dentry *dentry, struct vfsmount *mnt, int mask,
-+                 int check);
-+extern int aa_perm_dir(struct aa_profile *profile, const char *operation,
-+                     struct dentry *dentry, struct vfsmount *mnt,
-+                     int mask);
-+extern int aa_perm_path(struct aa_profile *, const char *operation,
-+                      const char *name, int mask, uid_t uid);
-+extern int aa_link(struct aa_profile *profile,
-+                 struct dentry *link, struct vfsmount *link_mnt,
-+                 struct dentry *target, struct vfsmount *target_mnt);
-+extern int aa_clone(struct task_struct *task);
-+extern int aa_register(struct linux_binprm *bprm);
-+extern void aa_release(struct task_struct *task);
-+extern int aa_change_hat(const char *id, u64 hat_magic);
-+extern int aa_change_profile(const char *ns_name, const char *name);
-+extern struct aa_profile *__aa_replace_profile(struct task_struct *task,
-+                                             struct aa_profile *profile);
-+extern struct aa_task_context *lock_task_and_profiles(struct task_struct *task,
-+                                                    struct aa_profile *profile);
-+extern void unlock_task_and_profiles(struct task_struct *task,
-+                                   struct aa_task_context *cxt,
-+                                   struct aa_profile *profile);
-+extern void aa_change_task_context(struct task_struct *task,
-+                                 struct aa_task_context *new_cxt,
-+                                 struct aa_profile *profile, u64 cookie,
-+                                 struct aa_profile *previous_profile);
-+extern int aa_may_ptrace(struct aa_task_context *cxt,
-+                       struct aa_profile *tracee);
-+
-+/* lsm.c */
-+extern int apparmor_initialized;
-+extern void info_message(const char *str);
-+extern void apparmor_disable(void);
-+
-+/* list.c */
-+extern struct aa_namespace *__aa_find_namespace(const char *name,
-+                                              struct list_head *list);
-+extern struct aa_profile *__aa_find_profile(const char *name,
-+                                          struct list_head *list);
-+extern void aa_profile_ns_list_release(void);
-+
-+/* module_interface.c */
-+extern ssize_t aa_add_profile(void *, size_t);
-+extern ssize_t aa_replace_profile(void *, size_t);
-+extern ssize_t aa_remove_profile(char *, size_t);
-+extern struct aa_namespace *alloc_aa_namespace(char *name);
-+extern void free_aa_namespace(struct aa_namespace *ns);
-+extern void free_aa_namespace_kref(struct kref *kref);
-+extern struct aa_profile *alloc_aa_profile(void);
-+extern void free_aa_profile(struct aa_profile *profile);
-+extern void free_aa_profile_kref(struct kref *kref);
-+extern void aa_unconfine_tasks(struct aa_profile *profile);
-+
-+/* procattr.c */
-+extern int aa_getprocattr(struct aa_profile *profile, char **string,
-+                        unsigned *len);
-+extern int aa_setprocattr_changehat(char *args);
-+extern int aa_setprocattr_changeprofile(char *args);
-+extern int aa_setprocattr_setprofile(struct task_struct *task, char *args);
-+
-+/* apparmorfs.c */
-+extern int create_apparmorfs(void);
-+extern void destroy_apparmorfs(void);
-+
-+/* match.c */
-+extern struct aa_dfa *aa_match_alloc(void);
-+extern void aa_match_free(struct aa_dfa *dfa);
-+extern int unpack_dfa(struct aa_dfa *dfa, void *blob, size_t size);
-+extern int verify_dfa(struct aa_dfa *dfa);
-+extern unsigned int aa_dfa_match(struct aa_dfa *dfa, const char *str, int *);
-+extern unsigned int aa_dfa_next_state(struct aa_dfa *dfa, unsigned int start,
-+                                    const char *str);
-+extern unsigned int aa_match_state(struct aa_dfa *dfa, unsigned int start,
-+                                 const char *str, unsigned int *final);
-+extern unsigned int aa_dfa_null_transition(struct aa_dfa *dfa,
-+                                         unsigned int start);
-+
-+#endif  /* __APPARMOR_H */
---- /dev/null
-+++ b/security/apparmor/apparmorfs.c
-@@ -0,0 +1,281 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor filesystem (part of securityfs)
-+ */
-+
-+#include <linux/security.h>
-+#include <linux/vmalloc.h>
-+#include <linux/module.h>
-+#include <linux/seq_file.h>
-+#include <asm/uaccess.h>
-+#include <linux/namei.h>
-+
-+#include "apparmor.h"
-+#include "inline.h"
-+
-+static char *aa_simple_write_to_buffer(const char __user *userbuf,
-+                                     size_t alloc_size, size_t copy_size,
-+                                     loff_t *pos, const char *operation)
-+{
-+      struct aa_profile *profile;
-+      char *data;
-+
-+      if (*pos != 0) {
-+              /* only writes from pos 0, that is complete writes */
-+              data = ERR_PTR(-ESPIPE);
-+              goto out;
-+      }
-+
-+      /*
-+       * Don't allow confined processes to load/replace/remove profiles.
-+       * No sane person would add rules allowing this to a profile
-+       * but we enforce the restriction anyways.
-+       */
-+      profile = aa_get_profile(current);
-+      if (profile) {
-+              struct aa_audit sa;
-+              memset(&sa, 0, sizeof(sa));
-+              sa.operation = operation;
-+              sa.gfp_mask = GFP_KERNEL;
-+              sa.error_code = -EACCES;
-+              data = ERR_PTR(aa_audit_reject(profile, &sa));
-+              aa_put_profile(profile);
-+              goto out;
-+      }
-+
-+      data = vmalloc(alloc_size);
-+      if (data == NULL) {
-+              data = ERR_PTR(-ENOMEM);
-+              goto out;
-+      }
-+
-+      if (copy_from_user(data, userbuf, copy_size)) {
-+              vfree(data);
-+              data = ERR_PTR(-EFAULT);
-+              goto out;
-+      }
-+
-+out:
-+      return data;
-+}
-+
-+/* apparmor/profiles */
-+extern struct seq_operations apparmorfs_profiles_op;
-+
-+static int aa_profiles_open(struct inode *inode, struct file *file)
-+{
-+      return seq_open(file, &apparmorfs_profiles_op);
-+}
-+
-+
-+static int aa_profiles_release(struct inode *inode, struct file *file)
-+{
-+      return seq_release(inode, file);
-+}
-+
-+static struct file_operations apparmorfs_profiles_fops = {
-+      .open =         aa_profiles_open,
-+      .read =         seq_read,
-+      .llseek =       seq_lseek,
-+      .release =      aa_profiles_release,
-+};
-+
-+/* apparmor/matching */
-+static ssize_t aa_matching_read(struct file *file, char __user *buf,
-+                             size_t size, loff_t *ppos)
-+{
-+      const char *matching = "pattern=aadfa audit perms=rwxamlk/ user::other";
-+
-+      return simple_read_from_buffer(buf, size, ppos, matching,
-+                                     strlen(matching));
-+}
-+
-+static struct file_operations apparmorfs_matching_fops = {
-+      .read =         aa_matching_read,
-+};
-+
-+/* apparmor/features */
-+static ssize_t aa_features_read(struct file *file, char __user *buf,
-+                              size_t size, loff_t *ppos)
-+{
-+      const char *features = "file=3.0 capability=2.0 network=1.0 "
-+                             "change_hat=1.5 change_profile=1.0 "
-+                             "aanamespaces=1.0";
-+
-+      return simple_read_from_buffer(buf, size, ppos, features,
-+                                     strlen(features));
-+}
-+
-+static struct file_operations apparmorfs_features_fops = {
-+      .read =         aa_features_read,
-+};
-+
-+/* apparmor/.load */
-+static ssize_t aa_profile_load(struct file *f, const char __user *buf,
-+                             size_t size, loff_t *pos)
-+{
-+      char *data;
-+      ssize_t error;
-+
-+      data = aa_simple_write_to_buffer(buf, size, size, pos, "profile_load");
-+
-+      error = PTR_ERR(data);
-+      if (!IS_ERR(data)) {
-+              error = aa_add_profile(data, size);
-+              vfree(data);
-+      }
-+
-+      return error;
-+}
-+
-+
-+static struct file_operations apparmorfs_profile_load = {
-+      .write = aa_profile_load
-+};
-+
-+/* apparmor/.replace */
-+static ssize_t aa_profile_replace(struct file *f, const char __user *buf,
-+                                size_t size, loff_t *pos)
-+{
-+      char *data;
-+      ssize_t error;
-+
-+      data = aa_simple_write_to_buffer(buf, size, size, pos,
-+                                       "profile_replace");
-+
-+      error = PTR_ERR(data);
-+      if (!IS_ERR(data)) {
-+              error = aa_replace_profile(data, size);
-+              vfree(data);
-+      }
-+
-+      return error;
-+}
-+
-+
-+static struct file_operations apparmorfs_profile_replace = {
-+      .write = aa_profile_replace
-+};
-+
-+/* apparmor/.remove */
-+static ssize_t aa_profile_remove(struct file *f, const char __user *buf,
-+                                size_t size, loff_t *pos)
-+{
-+      char *data;
-+      ssize_t error;
-+
-+      /*
-+       * aa_remove_profile needs a null terminated string so 1 extra
-+       * byte is allocated and the copied data is null terminated.
-+       */
-+      data = aa_simple_write_to_buffer(buf, size + 1, size, pos,
-+                                       "profile_remove");
-+
-+      error = PTR_ERR(data);
-+      if (!IS_ERR(data)) {
-+              data[size] = 0;
-+              error = aa_remove_profile(data, size);
-+              vfree(data);
-+      }
-+
-+      return error;
-+}
-+
-+static struct file_operations apparmorfs_profile_remove = {
-+      .write = aa_profile_remove
-+};
-+
-+static struct dentry *apparmor_dentry;
-+
-+static void aafs_remove(const char *name)
-+{
-+      struct dentry *dentry;
-+
-+      dentry = lookup_one_len(name, apparmor_dentry, strlen(name));
-+      if (!IS_ERR(dentry)) {
-+              securityfs_remove(dentry);
-+              dput(dentry);
-+      }
-+}
-+
-+static int aafs_create(const char *name, int mask, struct file_operations *fops)
-+{
-+      struct dentry *dentry;
-+
-+      dentry = securityfs_create_file(name, S_IFREG | mask, apparmor_dentry,
-+                                      NULL, fops);
-+
-+      return IS_ERR(dentry) ? PTR_ERR(dentry) : 0;
-+}
-+
-+void destroy_apparmorfs(void)
-+{
-+      if (apparmor_dentry) {
-+              aafs_remove(".remove");
-+              aafs_remove(".replace");
-+              aafs_remove(".load");
-+              aafs_remove("matching");
-+              aafs_remove("features");
-+              aafs_remove("profiles");
-+              securityfs_remove(apparmor_dentry);
-+              apparmor_dentry = NULL;
-+      }
-+}
-+
-+int create_apparmorfs(void)
-+{
-+      int error;
-+
-+      if (!apparmor_initialized)
-+              return 0;
-+
-+      if (apparmor_dentry) {
-+              AA_ERROR("%s: AppArmor securityfs already exists\n",
-+                      __FUNCTION__);
-+              return -EEXIST;
-+      }
-+
-+      apparmor_dentry = securityfs_create_dir("apparmor", NULL);
-+      if (IS_ERR(apparmor_dentry)) {
-+              error = PTR_ERR(apparmor_dentry);
-+              apparmor_dentry = NULL;
-+              goto error;
-+      }
-+      error = aafs_create("profiles", 0440, &apparmorfs_profiles_fops);
-+      if (error)
-+              goto error;
-+      error = aafs_create("matching", 0444, &apparmorfs_matching_fops);
-+      if (error)
-+              goto error;
-+      error = aafs_create("features", 0444, &apparmorfs_features_fops);
-+      if (error)
-+              goto error;
-+      error = aafs_create(".load", 0640, &apparmorfs_profile_load);
-+      if (error)
-+              goto error;
-+      error = aafs_create(".replace", 0640, &apparmorfs_profile_replace);
-+      if (error)
-+              goto error;
-+      error = aafs_create(".remove", 0640, &apparmorfs_profile_remove);
-+      if (error)
-+              goto error;
-+
-+      /* Report that AppArmor fs is enabled */
-+      info_message("AppArmor Filesystem Enabled");
-+      return 0;
-+
-+error:
-+      destroy_apparmorfs();
-+      AA_ERROR("Error creating AppArmor securityfs\n");
-+      apparmor_disable();
-+      return error;
-+}
-+
-+fs_initcall(create_apparmorfs);
-+
---- /dev/null
-+++ b/security/apparmor/inline.h
-@@ -0,0 +1,250 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ */
-+
-+#ifndef __INLINE_H
-+#define __INLINE_H
-+
-+#include <linux/sched.h>
-+
-+#include "match.h"
-+
-+static inline int mediated_filesystem(struct inode *inode)
-+{
-+      return !(inode->i_sb->s_flags & MS_NOUSER);
-+}
-+
-+static inline struct aa_task_context *aa_task_context(struct task_struct *task)
-+{
-+      return (struct aa_task_context *) rcu_dereference(task->security);
-+}
-+
-+static inline struct aa_namespace *aa_get_namespace(struct aa_namespace *ns)
-+{
-+      if (ns)
-+              kref_get(&(ns->count));
-+
-+      return ns;
-+}
-+
-+static inline void aa_put_namespace(struct aa_namespace *ns)
-+{
-+      if (ns)
-+              kref_put(&ns->count, free_aa_namespace_kref);
-+}
-+
-+
-+static inline struct aa_namespace *aa_find_namespace(const char *name)
-+{
-+      struct aa_namespace *ns = NULL;
-+
-+      read_lock(&profile_ns_list_lock);
-+      ns = aa_get_namespace(__aa_find_namespace(name, &profile_ns_list));
-+      read_unlock(&profile_ns_list_lock);
-+
-+      return ns;
-+}
-+
-+/**
-+ * aa_dup_profile - increment refcount on profile @p
-+ * @p: profile
-+ */
-+static inline struct aa_profile *aa_dup_profile(struct aa_profile *p)
-+{
-+      if (p)
-+              kref_get(&(p->count));
-+
-+      return p;
-+}
-+
-+/**
-+ * aa_put_profile - decrement refcount on profile @p
-+ * @p: profile
-+ */
-+static inline void aa_put_profile(struct aa_profile *p)
-+{
-+      if (p)
-+              kref_put(&p->count, free_aa_profile_kref);
-+}
-+
-+static inline struct aa_profile *aa_get_profile(struct task_struct *task)
-+{
-+      struct aa_task_context *cxt;
-+      struct aa_profile *profile = NULL;
-+
-+      rcu_read_lock();
-+      cxt = aa_task_context(task);
-+      if (cxt) {
-+              profile = cxt->profile;
-+              aa_dup_profile(profile);
-+      }
-+      rcu_read_unlock();
-+
-+      return profile;
-+}
-+
-+static inline struct aa_profile *aa_find_profile(struct aa_namespace *ns,
-+                                               const char *name)
-+{
-+      struct aa_profile *profile = NULL;
-+
-+      read_lock(&ns->lock);
-+      profile = aa_dup_profile(__aa_find_profile(name, &ns->profiles));
-+      read_unlock(&ns->lock);
-+
-+      return profile;
-+}
-+
-+static inline struct aa_task_context *aa_alloc_task_context(gfp_t flags)
-+{
-+      struct aa_task_context *cxt;
-+
-+      cxt = kzalloc(sizeof(*cxt), flags);
-+      if (cxt) {
-+              INIT_LIST_HEAD(&cxt->list);
-+              INIT_RCU_HEAD(&cxt->rcu);
-+      }
-+
-+      return cxt;
-+}
-+
-+static inline void aa_free_task_context(struct aa_task_context *cxt)
-+{
-+      if (cxt) {
-+              aa_put_profile(cxt->profile);
-+              aa_put_profile(cxt->previous_profile);
-+              kfree(cxt);
-+      }
-+}
-+
-+/**
-+ * lock_profile - lock a profile
-+ * @profile: the profile to lock
-+ *
-+ * While the profile is locked, local interrupts are disabled. This also
-+ * gives us RCU reader safety.
-+ */
-+static inline void lock_profile_nested(struct aa_profile *profile,
-+                                     enum aa_lock_class lock_class)
-+{
-+      /*
-+       * Lock the profile.
-+       *
-+       * Need to disable interrupts here because this lock is used in
-+       * the task_free_security hook, which may run in RCU context.
-+       */
-+      if (profile)
-+              spin_lock_irqsave_nested(&profile->lock, profile->int_flags,
-+                                       lock_class);
-+}
-+
-+static inline void lock_profile(struct aa_profile *profile)
-+{
-+      lock_profile_nested(profile, aa_lock_normal);
-+}
-+
-+/**
-+ * unlock_profile - unlock a profile
-+ * @profile: the profile to unlock
-+ */
-+static inline void unlock_profile(struct aa_profile *profile)
-+{
-+      /* Unlock the profile. */
-+      if (profile)
-+              spin_unlock_irqrestore(&profile->lock, profile->int_flags);
-+}
-+
-+/**
-+ * lock_both_profiles  -  lock two profiles in a deadlock-free way
-+ * @profile1: profile to lock (may be NULL)
-+ * @profile2: profile to lock (may be NULL)
-+ *
-+ * The order in which profiles are passed into lock_both_profiles() /
-+ * unlock_both_profiles() does not matter.
-+ * While the profile is locked, local interrupts are disabled. This also
-+ * gives us RCU reader safety.
-+ */
-+static inline void lock_both_profiles(struct aa_profile *profile1,
-+                                    struct aa_profile *profile2)
-+{
-+      /*
-+       * Lock the two profiles.
-+       *
-+       * We need to disable interrupts because the profile locks are
-+       * used in the task_free_security hook, which may run in RCU
-+       * context.
-+       *
-+       * Do not nest spin_lock_irqsave()/spin_unlock_irqresore():
-+       * interrupts only need to be turned off once.
-+       */
-+      if (!profile1 || profile1 == profile2) {
-+              if (profile2)
-+                      spin_lock_irqsave_nested(&profile2->lock,
-+                                               profile2->int_flags,
-+                                               aa_lock_normal);
-+      } else if (profile1 > profile2) {
-+              /* profile1 cannot be NULL here. */
-+              spin_lock_irqsave_nested(&profile1->lock, profile1->int_flags,
-+                                       aa_lock_normal);
-+              if (profile2)
-+                      spin_lock_nested(&profile2->lock, aa_lock_nested);
-+
-+      } else {
-+              /* profile2 cannot be NULL here. */
-+              spin_lock_irqsave_nested(&profile2->lock, profile2->int_flags,
-+                                       aa_lock_normal);
-+              spin_lock_nested(&profile1->lock, aa_lock_nested);
-+      }
-+}
-+
-+/**
-+ * unlock_both_profiles  -  unlock two profiles in a deadlock-free way
-+ * @profile1: profile to unlock (may be NULL)
-+ * @profile2: profile to unlock (may be NULL)
-+ *
-+ * The order in which profiles are passed into lock_both_profiles() /
-+ * unlock_both_profiles() does not matter.
-+ * While the profile is locked, local interrupts are disabled. This also
-+ * gives us RCU reader safety.
-+ */
-+static inline void unlock_both_profiles(struct aa_profile *profile1,
-+                                      struct aa_profile *profile2)
-+{
-+      /* Unlock the two profiles. */
-+      if (!profile1 || profile1 == profile2) {
-+              if (profile2)
-+                      spin_unlock_irqrestore(&profile2->lock,
-+                                             profile2->int_flags);
-+      } else if (profile1 > profile2) {
-+              /* profile1 cannot be NULL here. */
-+              if (profile2)
-+                      spin_unlock(&profile2->lock);
-+              spin_unlock_irqrestore(&profile1->lock, profile1->int_flags);
-+      } else {
-+              /* profile2 cannot be NULL here. */
-+              spin_unlock(&profile1->lock);
-+              spin_unlock_irqrestore(&profile2->lock, profile2->int_flags);
-+      }
-+}
-+
-+static inline unsigned int aa_match(struct aa_dfa *dfa, const char *pathname,
-+                                  int *audit_mask)
-+{
-+      if (dfa)
-+              return aa_dfa_match(dfa, pathname, audit_mask);
-+      if (audit_mask)
-+              *audit_mask = 0;
-+      return 0;
-+}
-+
-+static inline int dfa_audit_mask(struct aa_dfa *dfa, unsigned int state)
-+{
-+      return  ACCEPT_TABLE2(dfa)[state];
-+}
-+
-+#endif /* __INLINE_H__ */
---- /dev/null
-+++ b/security/apparmor/list.c
-@@ -0,0 +1,174 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor Profile List Management
-+ */
-+
-+#include <linux/seq_file.h>
-+#include "apparmor.h"
-+#include "inline.h"
-+
-+/* list of profile namespaces and lock */
-+LIST_HEAD(profile_ns_list);
-+rwlock_t profile_ns_list_lock = RW_LOCK_UNLOCKED;
-+
-+/**
-+ * __aa_find_namespace  -  look up a profile namespace on the namespace list
-+ * @name: name of namespace to find
-+ * @head: list to search
-+ *
-+ * Returns a pointer to the namespace on the list, or NULL if no namespace
-+ * called @name exists. The caller must hold the profile_ns_list_lock.
-+ */
-+struct aa_namespace *__aa_find_namespace(const char *name,
-+                                     struct list_head *head)
-+{
-+      struct aa_namespace *ns;
-+
-+      list_for_each_entry(ns, head, list) {
-+              if (!strcmp(ns->name, name))
-+                      return ns;
-+      }
-+
-+      return NULL;
-+}
-+
-+/**
-+ * __aa_find_profile  -  look up a profile on the profile list
-+ * @name: name of profile to find
-+ * @head: list to search
-+ *
-+ * Returns a pointer to the profile on the list, or NULL if no profile
-+ * called @name exists. The caller must hold the profile_list_lock.
-+ */
-+struct aa_profile *__aa_find_profile(const char *name, struct list_head *head)
-+{
-+      struct aa_profile *profile;
-+
-+      list_for_each_entry(profile, head, list) {
-+              if (!strcmp(profile->name, name))
-+                      return profile;
-+      }
-+
-+      return NULL;
-+}
-+
-+static void aa_profile_list_release(struct list_head *head)
-+{
-+      struct aa_profile *profile, *tmp;
-+      list_for_each_entry_safe(profile, tmp, head, list) {
-+              /* Remove the profile from each task context it is on. */
-+              lock_profile(profile);
-+              profile->isstale = 1;
-+              aa_unconfine_tasks(profile);
-+              list_del_init(&profile->list);
-+              unlock_profile(profile);
-+              aa_put_profile(profile);
-+      }
-+}
-+
-+/**
-+ * aa_profilelist_release - Remove all profiles from profile_list
-+ */
-+void aa_profile_ns_list_release(void)
-+{
-+      struct aa_namespace *ns, *tmp;
-+
-+      /* Remove and release all the profiles on namespace profile lists. */
-+      write_lock(&profile_ns_list_lock);
-+      list_for_each_entry_safe(ns, tmp, &profile_ns_list, list) {
-+              write_lock(&ns->lock);
-+              aa_profile_list_release(&ns->profiles);
-+              list_del_init(&ns->list);
-+              write_unlock(&ns->lock);
-+              aa_put_namespace(ns);
-+      }
-+      write_unlock(&profile_ns_list_lock);
-+}
-+
-+
-+static struct aa_profile *next_profile(struct aa_profile *profile)
-+{
-+      struct aa_profile *next = profile;
-+      struct aa_namespace *ns;
-+
-+      list_for_each_entry_continue(next, &profile->ns->profiles, list)
-+              return next;
-+
-+      ns = profile->ns;
-+      read_unlock(&ns->lock);
-+      list_for_each_entry_continue(ns, &profile_ns_list, list) {
-+              read_lock(&ns->lock);
-+              list_for_each_entry(profile, &ns->profiles, list)
-+                      return profile;
-+              read_unlock(&ns->lock);
-+      }
-+      return NULL;
-+}
-+
-+static void *p_start(struct seq_file *f, loff_t *pos)
-+{
-+      struct aa_namespace *ns;
-+      loff_t l = *pos;
-+
-+      read_lock(&profile_ns_list_lock);
-+      if (!list_empty(&profile_ns_list)) {
-+              struct aa_profile *profile = NULL;
-+              ns = list_first_entry(&profile_ns_list, typeof(*ns), list);
-+              read_lock(&ns->lock);
-+              if (!list_empty(&ns->profiles))
-+                      profile = list_first_entry(&ns->profiles,
-+                                                 typeof(*profile), list);
-+              else
-+                      read_unlock(&ns->lock);
-+              for ( ; profile && l > 0; l--)
-+                      profile = next_profile(profile);
-+              return profile;
-+      }
-+      return NULL;
-+}
-+
-+static void *p_next(struct seq_file *f, void *p, loff_t *pos)
-+{
-+      struct aa_profile *profile = (struct aa_profile *) p;
-+
-+      (*pos)++;
-+      profile = next_profile(profile);
-+
-+      return profile;
-+}
-+
-+static void p_stop(struct seq_file *f, void *p)
-+{
-+      struct aa_profile *profile = (struct aa_profile *) p;
-+
-+      if (profile)
-+              read_unlock(&profile->ns->lock);
-+      read_unlock(&profile_ns_list_lock);
-+}
-+
-+static int seq_show_profile(struct seq_file *f, void *p)
-+{
-+      struct aa_profile *profile = (struct aa_profile *)p;
-+
-+      if (profile->ns == default_namespace)
-+          seq_printf(f, "%s (%s)\n", profile->name,
-+                     PROFILE_COMPLAIN(profile) ? "complain" : "enforce");
-+      else
-+          seq_printf(f, ":%s:%s (%s)\n", profile->ns->name, profile->name,
-+                     PROFILE_COMPLAIN(profile) ? "complain" : "enforce");
-+      return 0;
-+}
-+
-+/* Used in apparmorfs.c */
-+struct seq_operations apparmorfs_profiles_op = {
-+      .start =        p_start,
-+      .next =         p_next,
-+      .stop =         p_stop,
-+      .show =         seq_show_profile,
-+};
---- /dev/null
-+++ b/security/apparmor/locking.txt
-@@ -0,0 +1,68 @@
-+Locking in AppArmor
-+===================
-+
-+Lock hierarchy:
-+
-+      aa_interface_lock
-+        profile_list_lock
-+          aa_profile->lock
-+            task_lock()
-+
-+
-+Which lock protects what?
-+
-+      /-----------------------+-------------------------------\
-+      | Variable              | Lock                          |
-+      >-----------------------+-------------------------------<
-+      | profile_list          | profile_list_lock             |
-+      +-----------------------+-------------------------------+
-+      | aa_profile            | (reference count)             |
-+      +-----------------------+-------------------------------+
-+      | aa_profile->          | aa_profile->lock              |
-+      |   isstale,            |                               |
-+      |   task_contexts       |                               |
-+      +-----------------------+-------------------------------+
-+      | task_struct->security | read: RCU                     |
-+      |                       | write: task_lock()            |
-+      +-----------------------+-------------------------------+
-+      | aa_profile->sub       | handle on the profile (list   |
-+      |                       | is never modified)            |
-+      \-----------------------+-------------------------------/
-+
-+(Obviously, the list_heads embedded in data structures are always
-+protected with the lock that also protects the list.)
-+
-+When moving a task context from one profile to another, we grab both
-+profile locks with lock_both_profiles(). This ensures that both locks
-+are always taken in the same order, and so we won't deadlock.
-+
-+Since task_struct->security is RCU protected the aa_task_struct it
-+references is only guarenteed to exist for the rcu cycle.  Where
-+aa_task_context->profile is needed in blocking operations the
-+profile's reference count is incremented and the profile reference
-+is used.
-+
-+Profiles on profile_list are never stale: when a profile becomes stale,
-+it is removed from profile_list at the same time (under profile_list_lock
-+and aa_profile->lock).
-+
-+The aa_interface_lock is taken whenever user-space modifies the profile
-+list, and can sleep. This ensures that profile loading/replacement/removal
-+won't race with itself. We release the profile_list_lock as soon as
-+possible to avoid stalling exec during profile loading/replacement/removal.
-+
-+AppArmor uses lock subtyping to avoid false positives from lockdep.  The
-+profile lock is often taken nested, but it is guaranteed to be in a lock
-+safe order and not the same lock when done, so it is safe.
-+
-+A third lock type (aa_lock_task_release) is given to the profile lock
-+when it is taken in soft irq context during task release (aa_release).
-+This is to avoid a false positive between the task lock and the profile
-+lock.  In task context the profile lock wraps the task lock with irqs
-+off, but the kernel takes the task lock with irqs enabled.  This won't
-+result in a deadlock because for a deadlock to occur the kernel must
-+take dead task A's lock (irqs on), the rcu callback hook freeing
-+dead task A must be run and AppArmor must be changing the profile on
-+dead task A.  The kernel should not be taking a dead task's task_lock
-+at the same time the task is being freed by task rcu cleanup other wise
-+the task would not be out of its quiescent period.
---- /dev/null
-+++ b/security/apparmor/procattr.c
-@@ -0,0 +1,195 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor /proc/pid/attr handling
-+ */
-+
-+#include "apparmor.h"
-+#include "inline.h"
-+
-+int aa_getprocattr(struct aa_profile *profile, char **string, unsigned *len)
-+{
-+      char *str;
-+
-+      if (profile) {
-+              const char *mode_str = PROFILE_COMPLAIN(profile) ?
-+                      " (complain)" : " (enforce)";
-+              int mode_len, name_len, ns_len = 0;
-+
-+              mode_len = strlen(mode_str);
-+              name_len = strlen(profile->name);
-+              if (profile->ns != default_namespace)
-+                      ns_len = strlen(profile->ns->name) + 2;
-+              *len = mode_len + ns_len + name_len + 1;
-+              str = kmalloc(*len, GFP_ATOMIC);
-+              if (!str)
-+                      return -ENOMEM;
-+
-+              if (ns_len) {
-+                      *str++ = ':';
-+                      memcpy(str, profile->ns->name, ns_len - 2);
-+                      str += ns_len - 2;
-+                      *str++ = ':';
-+              }
-+              memcpy(str, profile->name, name_len);
-+              str += name_len;
-+              memcpy(str, mode_str, mode_len);
-+              str += mode_len;
-+              *str++ = '\n';
-+              str -= *len;
-+      } else {
-+              const char *unconfined_str = "unconfined\n";
-+
-+              *len = strlen(unconfined_str);
-+              str = kmalloc(*len, GFP_ATOMIC);
-+              if (!str)
-+                      return -ENOMEM;
-+
-+              memcpy(str, unconfined_str, *len);
-+      }
-+      *string = str;
-+
-+      return 0;
-+}
-+
-+static char *split_token_from_name(const char *op, char *args, u64 *cookie)
-+{
-+      char *name;
-+
-+      *cookie = simple_strtoull(args, &name, 16);
-+      if ((name == args) || *name != '^') {
-+              AA_ERROR("%s: Invalid input '%s'", op, args);
-+              return ERR_PTR(-EINVAL);
-+      }
-+
-+      name++;  /* skip ^ */
-+      if (!*name)
-+              name = NULL;
-+      return name;
-+}
-+
-+int aa_setprocattr_changehat(char *args)
-+{
-+      char *hat;
-+      u64 cookie;
-+
-+      hat = split_token_from_name("change_hat", args, &cookie);
-+      if (IS_ERR(hat))
-+              return PTR_ERR(hat);
-+
-+      if (!hat && !cookie) {
-+              AA_ERROR("change_hat: Invalid input, NULL hat and NULL magic");
-+              return -EINVAL;
-+      }
-+
-+      AA_DEBUG("%s: Magic 0x%llx Hat '%s'\n",
-+               __FUNCTION__, cookie, hat ? hat : NULL);
-+
-+      return aa_change_hat(hat, cookie);
-+}
-+
-+int aa_setprocattr_changeprofile(char *args)
-+{
-+      char *name = args, *ns_name = NULL;
-+
-+      if (name[0] == ':') {
-+              char *split = strchr(&name[1], ':');
-+              if (split) {
-+                      *split = 0;
-+                      ns_name = &name[1];
-+                      name = split + 1;
-+              }
-+      }
-+
-+      return aa_change_profile(ns_name, name);
-+}
-+
-+int aa_setprocattr_setprofile(struct task_struct *task, char *args)
-+{
-+      struct aa_profile *old_profile, *new_profile;
-+      struct aa_namespace *ns;
-+      struct aa_audit sa;
-+      char *name, *ns_name = NULL;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "profile_set";
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.task = task->pid;
-+
-+      AA_DEBUG("%s: current %d\n",
-+               __FUNCTION__, current->pid);
-+
-+      name = args;
-+      if (args[0] != '/') {
-+              char *split = strchr(args, ':');
-+              if (split) {
-+                      *split = 0;
-+                      ns_name = args;
-+                      name = split + 1;
-+              }
-+      }
-+      if (ns_name)
-+              ns = aa_find_namespace(ns_name);
-+      else
-+              ns = aa_get_namespace(default_namespace);
-+      if (!ns) {
-+              sa.name = ns_name;
-+              sa.info = "unknown namespace";
-+              aa_audit_reject(NULL, &sa);
-+              aa_put_namespace(ns);
-+              return -EINVAL;
-+      }
-+
-+repeat:
-+      if (strcmp(name, "unconfined") == 0)
-+              new_profile = NULL;
-+      else {
-+              new_profile = aa_find_profile(ns, name);
-+              if (!new_profile) {
-+                      sa.name = ns_name;
-+                      sa.name2 = name;
-+                      sa.info = "unknown profile";
-+                      aa_audit_reject(NULL, &sa);
-+                      aa_put_namespace(ns);
-+                      return -EINVAL;
-+              }
-+      }
-+
-+      old_profile = __aa_replace_profile(task, new_profile);
-+      if (IS_ERR(old_profile)) {
-+              int error;
-+
-+              aa_put_profile(new_profile);
-+              error = PTR_ERR(old_profile);
-+              if (error == -ESTALE)
-+                      goto repeat;
-+              aa_put_namespace(ns);
-+              return error;
-+      }
-+
-+      if (new_profile) {
-+              sa.name = ns_name;
-+              sa.name2 = name;
-+              sa.name3 = old_profile ? old_profile->name :
-+                      "unconfined";
-+              aa_audit_status(NULL, &sa);
-+      } else {
-+              if (old_profile) {
-+                      sa.name = "unconfined";
-+                      sa.name2 = old_profile->name;
-+                      aa_audit_status(NULL, &sa);
-+              } else {
-+                      sa.info = "task is unconfined";
-+                      aa_audit_status(NULL, &sa);
-+              }
-+      }
-+      aa_put_namespace(ns);
-+      aa_put_profile(old_profile);
-+      aa_put_profile(new_profile);
-+      return 0;
-+}
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-module_interface.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-module_interface.diff
deleted file mode 100644 (file)
index f373428..0000000
+++ /dev/null
@@ -1,1350 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: Profile loading and manipulation, pathname matching
-
-Pathname matching, transition table loading, profile loading and
-manipulation.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- security/apparmor/match.c            |  364 ++++++++++++++
- security/apparmor/match.h            |   87 +++
- security/apparmor/module_interface.c |  875 +++++++++++++++++++++++++++++++++++
- 3 files changed, 1326 insertions(+)
-
---- /dev/null
-+++ b/security/apparmor/match.c
-@@ -0,0 +1,364 @@
-+/*
-+ *    Copyright (C) 2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    Regular expression transition table matching
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/slab.h>
-+#include <linux/errno.h>
-+#include "apparmor.h"
-+#include "match.h"
-+#include "inline.h"
-+
-+static struct table_header *unpack_table(void *blob, size_t bsize)
-+{
-+      struct table_header *table = NULL;
-+      struct table_header th;
-+      size_t tsize;
-+
-+      if (bsize < sizeof(struct table_header))
-+              goto out;
-+
-+      th.td_id = be16_to_cpu(*(u16 *) (blob));
-+      th.td_flags = be16_to_cpu(*(u16 *) (blob + 2));
-+      th.td_lolen = be32_to_cpu(*(u32 *) (blob + 8));
-+      blob += sizeof(struct table_header);
-+
-+      if (!(th.td_flags == YYTD_DATA16 || th.td_flags == YYTD_DATA32 ||
-+              th.td_flags == YYTD_DATA8))
-+              goto out;
-+
-+      tsize = table_size(th.td_lolen, th.td_flags);
-+      if (bsize < tsize)
-+              goto out;
-+
-+      table = kmalloc(tsize, GFP_KERNEL);
-+      if (table) {
-+              *table = th;
-+              if (th.td_flags == YYTD_DATA8)
-+                      UNPACK_ARRAY(table->td_data, blob, th.td_lolen,
-+                                   u8, byte_to_byte);
-+              else if (th.td_flags == YYTD_DATA16)
-+                      UNPACK_ARRAY(table->td_data, blob, th.td_lolen,
-+                                   u16, be16_to_cpu);
-+              else
-+                      UNPACK_ARRAY(table->td_data, blob, th.td_lolen,
-+                                   u32, be32_to_cpu);
-+      }
-+
-+out:
-+      return table;
-+}
-+
-+int unpack_dfa(struct aa_dfa *dfa, void *blob, size_t size)
-+{
-+      int hsize, i;
-+      int error = -ENOMEM;
-+
-+      /* get dfa table set header */
-+      if (size < sizeof(struct table_set_header))
-+              goto fail;
-+
-+      if (ntohl(*(u32 *)blob) != YYTH_MAGIC)
-+              goto fail;
-+
-+      hsize = ntohl(*(u32 *)(blob + 4));
-+      if (size < hsize)
-+              goto fail;
-+
-+      blob += hsize;
-+      size -= hsize;
-+
-+      error = -EPROTO;
-+      while (size > 0) {
-+              struct table_header *table;
-+              table = unpack_table(blob, size);
-+              if (!table)
-+                      goto fail;
-+
-+              switch(table->td_id) {
-+              case YYTD_ID_ACCEPT:
-+              case YYTD_ID_ACCEPT2:
-+              case YYTD_ID_BASE:
-+                      dfa->tables[table->td_id - 1] = table;
-+                      if (table->td_flags != YYTD_DATA32)
-+                              goto fail;
-+                      break;
-+              case YYTD_ID_DEF:
-+              case YYTD_ID_NXT:
-+              case YYTD_ID_CHK:
-+                      dfa->tables[table->td_id - 1] = table;
-+                      if (table->td_flags != YYTD_DATA16)
-+                              goto fail;
-+                      break;
-+              case YYTD_ID_EC:
-+                      dfa->tables[table->td_id - 1] = table;
-+                      if (table->td_flags != YYTD_DATA8)
-+                              goto fail;
-+                      break;
-+              default:
-+                      kfree(table);
-+                      goto fail;
-+              }
-+
-+              blob += table_size(table->td_lolen, table->td_flags);
-+              size -= table_size(table->td_lolen, table->td_flags);
-+      }
-+
-+      return 0;
-+
-+fail:
-+      for (i = 0; i < ARRAY_SIZE(dfa->tables); i++) {
-+              if (dfa->tables[i]) {
-+                      kfree(dfa->tables[i]);
-+                      dfa->tables[i] = NULL;
-+              }
-+      }
-+      return error;
-+}
-+
-+/**
-+ * verify_dfa - verify that all the transitions and states in the dfa tables
-+ *              are in bounds.
-+ * @dfa: dfa to test
-+ *
-+ * assumes dfa has gone through the verification done by unpacking
-+ */
-+int verify_dfa(struct aa_dfa *dfa)
-+{
-+      size_t i, state_count, trans_count;
-+      int error = -EPROTO;
-+
-+      /* check that required tables exist */
-+      if (!(dfa->tables[YYTD_ID_ACCEPT - 1] &&
-+            dfa->tables[YYTD_ID_ACCEPT2 - 1] &&
-+            dfa->tables[YYTD_ID_DEF - 1] &&
-+            dfa->tables[YYTD_ID_BASE - 1] &&
-+            dfa->tables[YYTD_ID_NXT - 1] &&
-+            dfa->tables[YYTD_ID_CHK - 1]))
-+              goto out;
-+
-+      /* accept.size == default.size == base.size */
-+      state_count = dfa->tables[YYTD_ID_BASE - 1]->td_lolen;
-+      if (!(state_count == dfa->tables[YYTD_ID_DEF - 1]->td_lolen &&
-+            state_count == dfa->tables[YYTD_ID_ACCEPT - 1]->td_lolen &&
-+            state_count == dfa->tables[YYTD_ID_ACCEPT2 - 1]->td_lolen))
-+              goto out;
-+
-+      /* next.size == chk.size */
-+      trans_count = dfa->tables[YYTD_ID_NXT - 1]->td_lolen;
-+      if (trans_count != dfa->tables[YYTD_ID_CHK - 1]->td_lolen)
-+              goto out;
-+
-+      /* if equivalence classes then its table size must be 256 */
-+      if (dfa->tables[YYTD_ID_EC - 1] &&
-+          dfa->tables[YYTD_ID_EC - 1]->td_lolen != 256)
-+              goto out;
-+
-+      for (i = 0; i < state_count; i++) {
-+              if (DEFAULT_TABLE(dfa)[i] >= state_count)
-+                      goto out;
-+              if (BASE_TABLE(dfa)[i] >= trans_count + 256)
-+                      goto out;
-+      }
-+
-+      for (i = 0; i < trans_count ; i++) {
-+              if (NEXT_TABLE(dfa)[i] >= state_count)
-+                      goto out;
-+              if (CHECK_TABLE(dfa)[i] >= state_count)
-+                      goto out;
-+      }
-+
-+      /* verify accept permissions */
-+      for (i = 0; i < state_count; i++) {
-+              int mode = ACCEPT_TABLE(dfa)[i];
-+
-+              if (mode & ~AA_VALID_PERM_MASK)
-+                      goto out;
-+              if (ACCEPT_TABLE2(dfa)[i] & ~AA_VALID_PERM2_MASK)
-+                      goto out;
-+
-+              /* if any exec modifier is set MAY_EXEC must be set */
-+              if ((mode & AA_USER_EXEC_TYPE) && !(mode & AA_USER_EXEC))
-+                      goto out;
-+              if ((mode & AA_OTHER_EXEC_TYPE) && !(mode & AA_OTHER_EXEC))
-+                      goto out;
-+      }
-+
-+      error = 0;
-+out:
-+      return error;
-+}
-+
-+struct aa_dfa *aa_match_alloc(void)
-+{
-+      return kzalloc(sizeof(struct aa_dfa), GFP_KERNEL);
-+}
-+
-+void aa_match_free(struct aa_dfa *dfa)
-+{
-+      if (dfa) {
-+              int i;
-+
-+              for (i = 0; i < ARRAY_SIZE(dfa->tables); i++)
-+                      kfree(dfa->tables[i]);
-+      }
-+      kfree(dfa);
-+}
-+
-+/**
-+ * aa_dfa_next_state_len - traverse @dfa to find state @str stops at
-+ * @dfa: the dfa to match @str against
-+ * @start: the state of the dfa to start matching in
-+ * @str: the string of bytes to match against the dfa
-+ * @len: length of the string of bytes to match
-+ *
-+ * aa_dfa_next_state will match @str against the dfa and return the state it
-+ * finished matching in. The final state can be used to look up the accepting
-+ * label, or as the start state of a continuing match.
-+ *
-+ * aa_dfa_next_state could be implement using this function by doing
-+ * return aa_dfa_next_state_len(dfa, start, str, strlen(str));
-+ * but that would require traversing the string twice and be slightly
-+ * slower.
-+ */
-+unsigned int aa_dfa_next_state_len(struct aa_dfa *dfa, unsigned int start,
-+                                 const char *str, int len)
-+{
-+      u16 *def = DEFAULT_TABLE(dfa);
-+      u32 *base = BASE_TABLE(dfa);
-+      u16 *next = NEXT_TABLE(dfa);
-+      u16 *check = CHECK_TABLE(dfa);
-+      unsigned int state = start, pos;
-+
-+      if (state == 0)
-+              return 0;
-+
-+      /* current state is <state>, matching character *str */
-+      if (dfa->tables[YYTD_ID_EC - 1]) {
-+              u8 *equiv = EQUIV_TABLE(dfa);
-+              for (; len; len--) {
-+                      pos = base[state] + equiv[(u8)*str++];
-+                      if (check[pos] == state)
-+                              state = next[pos];
-+                      else
-+                              state = def[state];
-+              }
-+      } else {
-+              for (; len; len--) {
-+                      pos = base[state] + (u8)*str++;
-+                      if (check[pos] == state)
-+                              state = next[pos];
-+                      else
-+                              state = def[state];
-+              }
-+      }
-+      return state;
-+}
-+
-+/**
-+ * aa_dfa_next_state - traverse @dfa to find state @str stops at
-+ * @dfa: the dfa to match @str against
-+ * @start: the state of the dfa to start matching in
-+ * @str: the null terminated string of bytes to match against the dfa
-+ *
-+ * aa_dfa_next_state will match @str against the dfa and return the state it
-+ * finished matching in. The final state can be used to look up the accepting
-+ * label, or as the start state of a continuing match.
-+ */
-+unsigned int aa_dfa_next_state(struct aa_dfa *dfa, unsigned int start,
-+                             const char *str)
-+{
-+      u16 *def = DEFAULT_TABLE(dfa);
-+      u32 *base = BASE_TABLE(dfa);
-+      u16 *next = NEXT_TABLE(dfa);
-+      u16 *check = CHECK_TABLE(dfa);
-+      unsigned int state = start, pos;
-+
-+      if (state == 0)
-+              return 0;
-+
-+      /* current state is <state>, matching character *str */
-+      if (dfa->tables[YYTD_ID_EC - 1]) {
-+              u8 *equiv = EQUIV_TABLE(dfa);
-+              while (*str) {
-+                      pos = base[state] + equiv[(u8)*str++];
-+                      if (check[pos] == state)
-+                              state = next[pos];
-+                      else
-+                              state = def[state];
-+              }
-+      } else {
-+              while (*str) {
-+                      pos = base[state] + (u8)*str++;
-+                      if (check[pos] == state)
-+                              state = next[pos];
-+                      else
-+                              state = def[state];
-+              }
-+      }
-+      return state;
-+}
-+
-+/**
-+ * aa_dfa_null_transition - step to next state after null character
-+ * @dfa: the dfa to match against
-+ * @start: the state of the dfa to start matching in
-+ *
-+ * aa_dfa_null_transition transitions to the next state after a null
-+ * character which is not used in standard matching and is only
-+ * used to seperate pairs.
-+ */
-+unsigned int aa_dfa_null_transition(struct aa_dfa *dfa, unsigned int start)
-+{
-+      return aa_dfa_next_state_len(dfa, start, "", 1);
-+}
-+
-+/**
-+ * aa_dfa_match - find accept perm for @str in @dfa
-+ * @dfa: the dfa to match @str against
-+ * @str: the string to match against the dfa
-+ * @audit_mask: the audit_mask for the final state
-+ *
-+ * aa_dfa_match will match @str and return the accept perms for the
-+ * final state.
-+ */
-+unsigned int aa_dfa_match(struct aa_dfa *dfa, const char *str, int *audit_mask)
-+{
-+      int state = aa_dfa_next_state(dfa, DFA_START, str);
-+      if (audit_mask)
-+              *audit_mask = dfa_audit_mask(dfa, state);
-+      return ACCEPT_TABLE(dfa)[state];
-+}
-+
-+/**
-+ * aa_match_state - find accept perm and state for @str in @dfa
-+ * @dfa: the dfa to match @str against
-+ * @start: the state to start the match from
-+ * @str: the string to match against the dfa
-+ * @final: the state that the match finished in
-+ *
-+ * aa_match_state will match @str and return the accept perms, and @final
-+ * state, the match occured in.
-+ */
-+unsigned int aa_match_state(struct aa_dfa *dfa, unsigned int start,
-+                          const char *str, unsigned int *final)
-+{
-+      unsigned int state;
-+      if (dfa) {
-+              state = aa_dfa_next_state(dfa, start, str);
-+              if (final)
-+                      *final = state;
-+              return ACCEPT_TABLE(dfa)[state];
-+      }
-+      if (final)
-+              *final = 0;
-+      return 0;
-+}
-+
---- /dev/null
-+++ b/security/apparmor/match.h
-@@ -0,0 +1,87 @@
-+/*
-+ *    Copyright (C) 2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor submodule (match) prototypes
-+ */
-+
-+#ifndef __MATCH_H
-+#define __MATCH_H
-+
-+#define DFA_START                     1
-+
-+/**
-+ * The format used for transition tables is based on the GNU flex table
-+ * file format (--tables-file option; see Table File Format in the flex
-+ * info pages and the flex sources for documentation). The magic number
-+ * used in the header is 0x1B5E783D insted of 0xF13C57B1 though, because
-+ * the YY_ID_CHK (check) and YY_ID_DEF (default) tables are used
-+ * slightly differently (see the apparmor-parser package).
-+ */
-+
-+#define YYTH_MAGIC    0x1B5E783D
-+
-+struct table_set_header {
-+      u32             th_magic;       /* YYTH_MAGIC */
-+      u32             th_hsize;
-+      u32             th_ssize;
-+      u16             th_flags;
-+      char            th_version[];
-+};
-+
-+#define       YYTD_ID_ACCEPT  1
-+#define YYTD_ID_BASE  2
-+#define YYTD_ID_CHK   3
-+#define YYTD_ID_DEF   4
-+#define YYTD_ID_EC    5
-+#define YYTD_ID_META  6
-+#define YYTD_ID_ACCEPT2 7
-+#define YYTD_ID_NXT   8
-+
-+
-+#define YYTD_DATA8    1
-+#define YYTD_DATA16   2
-+#define YYTD_DATA32   4
-+
-+struct table_header {
-+      u16             td_id;
-+      u16             td_flags;
-+      u32             td_hilen;
-+      u32             td_lolen;
-+      char            td_data[];
-+};
-+
-+#define DEFAULT_TABLE(DFA) ((u16 *)((DFA)->tables[YYTD_ID_DEF - 1]->td_data))
-+#define BASE_TABLE(DFA) ((u32 *)((DFA)->tables[YYTD_ID_BASE - 1]->td_data))
-+#define NEXT_TABLE(DFA) ((u16 *)((DFA)->tables[YYTD_ID_NXT - 1]->td_data))
-+#define CHECK_TABLE(DFA) ((u16 *)((DFA)->tables[YYTD_ID_CHK - 1]->td_data))
-+#define EQUIV_TABLE(DFA) ((u8 *)((DFA)->tables[YYTD_ID_EC - 1]->td_data))
-+#define ACCEPT_TABLE(DFA) ((u32 *)((DFA)->tables[YYTD_ID_ACCEPT - 1]->td_data))
-+#define ACCEPT_TABLE2(DFA) ((u32 *)((DFA)->tables[YYTD_ID_ACCEPT2 -1]->td_data))
-+
-+struct aa_dfa {
-+      struct table_header *tables[YYTD_ID_NXT];
-+};
-+
-+#define byte_to_byte(X) (X)
-+
-+#define UNPACK_ARRAY(TABLE, BLOB, LEN, TYPE, NTOHX) \
-+      do { \
-+              typeof(LEN) __i; \
-+              TYPE *__t = (TYPE *) TABLE; \
-+              TYPE *__b = (TYPE *) BLOB; \
-+              for (__i = 0; __i < LEN; __i++) { \
-+                      __t[__i] = NTOHX(__b[__i]); \
-+              } \
-+      } while (0)
-+
-+static inline size_t table_size(size_t len, size_t el_size)
-+{
-+      return ALIGN(sizeof(struct table_header) + len * el_size, 8);
-+}
-+
-+#endif /* __MATCH_H */
---- /dev/null
-+++ b/security/apparmor/module_interface.c
-@@ -0,0 +1,875 @@
-+/*
-+ *    Copyright (C) 1998-2007 Novell/SUSE
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License as
-+ *    published by the Free Software Foundation, version 2 of the
-+ *    License.
-+ *
-+ *    AppArmor userspace policy interface
-+ */
-+
-+#include <asm/unaligned.h>
-+
-+#include "apparmor.h"
-+#include "inline.h"
-+
-+/*
-+ * This mutex is used to synchronize profile adds, replacements, and
-+ * removals: we only allow one of these operations at a time.
-+ * We do not use the profile list lock here in order to avoid blocking
-+ * exec during those operations.  (Exec involves a profile list lookup
-+ * for named-profile transitions.)
-+ */
-+DEFINE_MUTEX(aa_interface_lock);
-+
-+/*
-+ * The AppArmor interface treats data as a type byte followed by the
-+ * actual data.  The interface has the notion of a a named entry
-+ * which has a name (AA_NAME typecode followed by name string) followed by
-+ * the entries typecode and data.  Named types allow for optional
-+ * elements and extensions to be added and tested for without breaking
-+ * backwards compatability.
-+ */
-+
-+enum aa_code {
-+      AA_U8,
-+      AA_U16,
-+      AA_U32,
-+      AA_U64,
-+      AA_NAME,        /* same as string except it is items name */
-+      AA_STRING,
-+      AA_BLOB,
-+      AA_STRUCT,
-+      AA_STRUCTEND,
-+      AA_LIST,
-+      AA_LISTEND,
-+      AA_ARRAY,
-+      AA_ARRAYEND,
-+};
-+
-+/*
-+ * aa_ext is the read of the buffer containing the serialized profile.  The
-+ * data is copied into a kernel buffer in apparmorfs and then handed off to
-+ * the unpack routines.
-+ */
-+struct aa_ext {
-+      void *start;
-+      void *end;
-+      void *pos;      /* pointer to current position in the buffer */
-+      u32 version;
-+      char *ns_name;
-+};
-+
-+static inline int aa_inbounds(struct aa_ext *e, size_t size)
-+{
-+      return (size <= e->end - e->pos);
-+}
-+
-+/**
-+ * aa_u16_chunck - test and do bounds checking for a u16 size based chunk
-+ * @e: serialized data read head
-+ * @chunk: start address for chunk of data
-+ *
-+ * return the size of chunk found with the read head at the end of
-+ * the chunk.
-+ */
-+static size_t aa_is_u16_chunk(struct aa_ext *e, char **chunk)
-+{
-+      void *pos = e->pos;
-+      size_t size = 0;
-+
-+      if (!aa_inbounds(e, sizeof(u16)))
-+              goto fail;
-+      size = le16_to_cpu(get_unaligned((u16 *)e->pos));
-+      e->pos += sizeof(u16);
-+      if (!aa_inbounds(e, size))
-+              goto fail;
-+      *chunk = e->pos;
-+      e->pos += size;
-+      return size;
-+
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static inline int aa_is_X(struct aa_ext *e, enum aa_code code)
-+{
-+      if (!aa_inbounds(e, 1))
-+              return 0;
-+      if (*(u8 *) e->pos != code)
-+              return 0;
-+      e->pos++;
-+      return 1;
-+}
-+
-+/**
-+ * aa_is_nameX - check is the next element is of type X with a name of @name
-+ * @e: serialized data extent information
-+ * @code: type code
-+ * @name: name to match to the serialized element.
-+ *
-+ * check that the next serialized data element is of type X and has a tag
-+ * name @name.  If @name is specified then there must be a matching
-+ * name element in the stream.  If @name is NULL any name element will be
-+ * skipped and only the typecode will be tested.
-+ * returns 1 on success (both type code and name tests match) and the read
-+ * head is advanced past the headers
-+ * returns %0 if either match failes, the read head does not move
-+ */
-+static int aa_is_nameX(struct aa_ext *e, enum aa_code code, const char *name)
-+{
-+      void *pos = e->pos;
-+      /*
-+       * Check for presence of a tagname, and if present name size
-+       * AA_NAME tag value is a u16.
-+       */
-+      if (aa_is_X(e, AA_NAME)) {
-+              char *tag;
-+              size_t size = aa_is_u16_chunk(e, &tag);
-+              /* if a name is specified it must match. otherwise skip tag */
-+              if (name && (!size || strcmp(name, tag)))
-+                      goto fail;
-+      } else if (name) {
-+              /* if a name is specified and there is no name tag fail */
-+              goto fail;
-+      }
-+
-+      /* now check if type code matches */
-+      if (aa_is_X(e, code))
-+              return 1;
-+
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static int aa_is_u16(struct aa_ext *e, u16 *data, const char *name)
-+{
-+      void *pos = e->pos;
-+      if (aa_is_nameX(e, AA_U16, name)) {
-+              if (!aa_inbounds(e, sizeof(u16)))
-+                      goto fail;
-+              if (data)
-+                      *data = le16_to_cpu(get_unaligned((u16 *)e->pos));
-+              e->pos += sizeof(u16);
-+              return 1;
-+      }
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static int aa_is_u32(struct aa_ext *e, u32 *data, const char *name)
-+{
-+      void *pos = e->pos;
-+      if (aa_is_nameX(e, AA_U32, name)) {
-+              if (!aa_inbounds(e, sizeof(u32)))
-+                      goto fail;
-+              if (data)
-+                      *data = le32_to_cpu(get_unaligned((u32 *)e->pos));
-+              e->pos += sizeof(u32);
-+              return 1;
-+      }
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static size_t aa_is_array(struct aa_ext *e, const char *name)
-+{
-+      void *pos = e->pos;
-+      if (aa_is_nameX(e, AA_ARRAY, name)) {
-+              int size;
-+              if (!aa_inbounds(e, sizeof(u16)))
-+                      goto fail;
-+              size = (int) le16_to_cpu(get_unaligned((u16 *)e->pos));
-+              e->pos += sizeof(u16);
-+              return size;
-+      }
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static size_t aa_is_blob(struct aa_ext *e, char **blob, const char *name)
-+{
-+      void *pos = e->pos;
-+      if (aa_is_nameX(e, AA_BLOB, name)) {
-+              u32 size;
-+              if (!aa_inbounds(e, sizeof(u32)))
-+                      goto fail;
-+              size = le32_to_cpu(get_unaligned((u32 *)e->pos));
-+              e->pos += sizeof(u32);
-+              if (aa_inbounds(e, (size_t) size)) {
-+                      * blob = e->pos;
-+                      e->pos += size;
-+                      return size;
-+              }
-+      }
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+static int aa_is_dynstring(struct aa_ext *e, char **string, const char *name)
-+{
-+      char *src_str;
-+      size_t size = 0;
-+      void *pos = e->pos;
-+      *string = NULL;
-+      if (aa_is_nameX(e, AA_STRING, name) &&
-+          (size = aa_is_u16_chunk(e, &src_str))) {
-+              char *str;
-+              if (!(str = kmalloc(size, GFP_KERNEL)))
-+                      goto fail;
-+              memcpy(str, src_str, size);
-+              *string = str;
-+      }
-+
-+      return size;
-+
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+/**
-+ * aa_unpack_dfa - unpack a file rule dfa
-+ * @e: serialized data extent information
-+ *
-+ * returns dfa or ERR_PTR
-+ */
-+static struct aa_dfa *aa_unpack_dfa(struct aa_ext *e)
-+{
-+      char *blob = NULL;
-+      size_t size, error = 0;
-+      struct aa_dfa *dfa = NULL;
-+
-+      size = aa_is_blob(e, &blob, "aadfa");
-+      if (size) {
-+              dfa = aa_match_alloc();
-+              if (dfa) {
-+                      /*
-+                       * The dfa is aligned with in the blob to 8 bytes
-+                       * from the beginning of the stream.
-+                       */
-+                      size_t sz = blob - (char *) e->start;
-+                      size_t pad = ALIGN(sz, 8) - sz;
-+                      error = unpack_dfa(dfa, blob + pad, size - pad);
-+                      if (!error)
-+                              error = verify_dfa(dfa);
-+              } else {
-+                      error = -ENOMEM;
-+              }
-+
-+              if (error) {
-+                      aa_match_free(dfa);
-+                      dfa = ERR_PTR(error);
-+              }
-+      }
-+
-+      return dfa;
-+}
-+
-+static int aa_unpack_exec_table(struct aa_ext *e, struct aa_profile *profile)
-+{
-+      void *pos = e->pos;
-+
-+      /* exec table is optional */
-+      if (aa_is_nameX(e, AA_STRUCT, "xtable")) {
-+              int i, size;
-+
-+              size = aa_is_array(e, NULL);
-+              /* currently 4 exec bits and entries 0-3 are reserved iupcx */
-+              if (size > 16 - 4)
-+                      goto fail;
-+              profile->exec_table = kzalloc(sizeof(char *) * size,
-+                                            GFP_KERNEL);
-+              if (!profile->exec_table)
-+                      goto fail;
-+
-+              for (i = 0; i < size; i++) {
-+                  char *tmp;
-+                      if (!aa_is_dynstring(e, &tmp, NULL))
-+                              goto fail;
-+                      /* note: strings beginning with a : have an embedded
-+                         \0 seperating the profile ns name from the profile
-+                         name */
-+                      profile->exec_table[i] = tmp;
-+              }
-+              if (!aa_is_nameX(e, AA_ARRAYEND, NULL))
-+                      goto fail;
-+              if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-+                      goto fail;
-+              profile->exec_table_size = size;
-+      }
-+      return 1;
-+
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
-+/**
-+ * aa_unpack_profile - unpack a serialized profile
-+ * @e: serialized data extent information
-+ * @sa: audit struct for the operation
-+ */
-+static struct aa_profile *aa_unpack_profile(struct aa_ext *e,
-+                                          struct aa_audit *sa)
-+{
-+      struct aa_profile *profile = NULL;
-+
-+      int error = -EPROTO;
-+
-+      profile = alloc_aa_profile();
-+      if (!profile)
-+              return ERR_PTR(-ENOMEM);
-+
-+      /* check that we have the right struct being passed */
-+      if (!aa_is_nameX(e, AA_STRUCT, "profile"))
-+              goto fail;
-+      if (!aa_is_dynstring(e, &profile->name, NULL))
-+              goto fail;
-+
-+      /* per profile debug flags (complain, audit) */
-+      if (!aa_is_nameX(e, AA_STRUCT, "flags"))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->flags.hat), NULL))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->flags.complain), NULL))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->flags.audit), NULL))
-+              goto fail;
-+      if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-+              goto fail;
-+
-+      if (!aa_is_u32(e, &(profile->capabilities), NULL))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->audit_caps), NULL))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->quiet_caps), NULL))
-+              goto fail;
-+      if (!aa_is_u32(e, &(profile->set_caps), NULL))
-+              goto fail;
-+
-+      /* get file rules */
-+      profile->file_rules = aa_unpack_dfa(e);
-+      if (IS_ERR(profile->file_rules)) {
-+              error = PTR_ERR(profile->file_rules);
-+              profile->file_rules = NULL;
-+              goto fail;
-+      }
-+
-+      if (!aa_unpack_exec_table(e, profile))
-+              goto fail;
-+
-+      if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-+              goto fail;
-+
-+      return profile;
-+
-+fail:
-+      sa->name = profile && profile->name ? profile->name : "unknown";
-+      if (!sa->info)
-+              sa->info = "failed to unpack profile";
-+      aa_audit_status(NULL, sa);
-+
-+      if (profile)
-+              free_aa_profile(profile);
-+
-+      return ERR_PTR(error);
-+}
-+
-+/**
-+ * aa_verify_head - unpack serialized stream header
-+ * @e: serialized data read head
-+ * @operation: operation header is being verified for
-+ *
-+ * returns error or 0 if header is good
-+ */
-+static int aa_verify_header(struct aa_ext *e, struct aa_audit *sa)
-+{
-+      /* get the interface version */
-+      if (!aa_is_u32(e, &e->version, "version")) {
-+              sa->info = "invalid profile format";
-+              aa_audit_status(NULL, sa);
-+              return -EPROTONOSUPPORT;
-+      }
-+
-+      /* check that the interface version is currently supported */
-+      if (e->version != 5) {
-+              sa->info = "unsupported interface version";
-+              aa_audit_status(NULL, sa);
-+              return -EPROTONOSUPPORT;
-+      }
-+
-+      /* read the namespace if present */
-+      if (!aa_is_dynstring(e, &e->ns_name, "namespace")) {
-+              e->ns_name = NULL;
-+      }
-+
-+      return 0;
-+}
-+
-+/**
-+ * aa_add_profile - Unpack and add a new profile to the profile list
-+ * @data: serialized data stream
-+ * @size: size of the serialized data stream
-+ */
-+ssize_t aa_add_profile(void *data, size_t size)
-+{
-+      struct aa_profile *profile = NULL;
-+      struct aa_namespace *ns = NULL;
-+      struct aa_ext e = {
-+              .start = data,
-+              .end = data + size,
-+              .pos = data,
-+              .ns_name = NULL
-+      };
-+      ssize_t error;
-+      struct aa_audit sa;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "profile_load";
-+      sa.gfp_mask = GFP_KERNEL;
-+
-+      error = aa_verify_header(&e, &sa);
-+      if (error)
-+              return error;
-+
-+      profile = aa_unpack_profile(&e, &sa);
-+      if (IS_ERR(profile))
-+              return PTR_ERR(profile);
-+
-+      mutex_lock(&aa_interface_lock);
-+      write_lock(&profile_ns_list_lock);
-+      if (e.ns_name)
-+              ns = __aa_find_namespace(e.ns_name, &profile_ns_list);
-+      else
-+              ns = default_namespace;
-+      if (!ns) {
-+              struct aa_namespace *new_ns;
-+              write_unlock(&profile_ns_list_lock);
-+              new_ns = alloc_aa_namespace(e.ns_name);
-+              if (!new_ns) {
-+                      mutex_unlock(&aa_interface_lock);
-+                      return -ENOMEM;
-+              }
-+              write_lock(&profile_ns_list_lock);
-+              ns = __aa_find_namespace(e.ns_name, &profile_ns_list);
-+              if (!ns) {
-+                      list_add(&new_ns->list, &profile_ns_list);
-+                      ns = new_ns;
-+              } else
-+                      free_aa_namespace(new_ns);
-+      }
-+
-+      write_lock(&ns->lock);
-+      if (__aa_find_profile(profile->name, &ns->profiles)) {
-+              /* A profile with this name exists already. */
-+              write_unlock(&ns->lock);
-+              write_unlock(&profile_ns_list_lock);
-+              sa.name = profile->name;
-+              sa.name2 = ns->name;
-+              sa.info = "failed: profile already loaded";
-+              aa_audit_status(NULL, &sa);
-+              mutex_unlock(&aa_interface_lock);
-+              aa_put_profile(profile);
-+              return -EEXIST;
-+      }
-+      profile->ns = aa_get_namespace(ns);
-+      ns->profile_count++;
-+      list_add(&profile->list, &ns->profiles);
-+      write_unlock(&ns->lock);
-+      write_unlock(&profile_ns_list_lock);
-+
-+      sa.name = profile->name;
-+      sa.name2 = ns->name;
-+      aa_audit_status(NULL, &sa);
-+      mutex_unlock(&aa_interface_lock);
-+      return size;
-+}
-+
-+/**
-+ * task_replace - replace a task's profile
-+ * @task: task to replace profile on
-+ * @new_cxt: new aa_task_context to do replacement with
-+ * @new_profile: new profile
-+ */
-+static inline void task_replace(struct task_struct *task,
-+                              struct aa_task_context *new_cxt,
-+                              struct aa_profile *new_profile)
-+{
-+      struct aa_task_context *cxt = aa_task_context(task);
-+
-+      AA_DEBUG("%s: replacing profile for task %d "
-+               "profile=%s (%p)\n",
-+               __FUNCTION__,
-+               cxt->task->pid,
-+               cxt->profile->name, cxt->profile);
-+
-+      aa_change_task_context(task, new_cxt, new_profile, cxt->cookie,
-+                             cxt->previous_profile);
-+}
-+
-+/**
-+ * aa_replace_profile - replace a profile on the profile list
-+ * @udata: serialized data stream
-+ * @size: size of the serialized data stream
-+ *
-+ * unpack and replace a profile on the profile list and uses of that profile
-+ * by any aa_task_context.  If the profile does not exist on the profile list
-+ * it is added.  Return %0 or error.
-+ */
-+ssize_t aa_replace_profile(void *udata, size_t size)
-+{
-+      struct aa_profile *old_profile, *new_profile;
-+      struct aa_namespace *ns;
-+      struct aa_task_context *new_cxt;
-+      struct aa_ext e = {
-+              .start = udata,
-+              .end = udata + size,
-+              .pos = udata,
-+              .ns_name = NULL
-+      };
-+      ssize_t error;
-+      struct aa_audit sa;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "profile_replace";
-+      sa.gfp_mask = GFP_KERNEL;
-+
-+      error = aa_verify_header(&e, &sa);
-+      if (error)
-+              return error;
-+
-+      new_profile = aa_unpack_profile(&e, &sa);
-+      if (IS_ERR(new_profile))
-+              return PTR_ERR(new_profile);
-+
-+      mutex_lock(&aa_interface_lock);
-+      write_lock(&profile_ns_list_lock);
-+      if (e.ns_name)
-+              ns = __aa_find_namespace(e.ns_name, &profile_ns_list);
-+      else
-+              ns = default_namespace;
-+      if (!ns) {
-+              struct aa_namespace *new_ns;
-+              write_unlock(&profile_ns_list_lock);
-+              new_ns = alloc_aa_namespace(e.ns_name);
-+              if (!new_ns) {
-+                      mutex_unlock(&aa_interface_lock);
-+                      return -ENOMEM;
-+              }
-+              write_lock(&profile_ns_list_lock);
-+              ns = __aa_find_namespace(e.ns_name, &profile_ns_list);
-+              if (!ns) {
-+                      list_add(&new_ns->list, &profile_ns_list);
-+                      ns = new_ns;
-+              } else
-+                      free_aa_namespace(new_ns);
-+      }
-+
-+      write_lock(&ns->lock);
-+      old_profile = __aa_find_profile(new_profile->name, &ns->profiles);
-+      if (old_profile) {
-+              lock_profile(old_profile);
-+              old_profile->isstale = 1;
-+              list_del_init(&old_profile->list);
-+              unlock_profile(old_profile);
-+              ns->profile_count--;
-+      }
-+      new_profile->ns = aa_get_namespace(ns);
-+      ns->profile_count++;
-+      /* not don't need an extra ref count to keep new_profile as
-+       * it is protect by the interface mutex */
-+      list_add(&new_profile->list, &ns->profiles);
-+      write_unlock(&ns->lock);
-+      write_unlock(&profile_ns_list_lock);
-+
-+      if (!old_profile) {
-+              sa.operation = "profile_load";
-+              goto out;
-+      }
-+      /*
-+       * Replacement needs to allocate a new aa_task_context for each
-+       * task confined by old_profile.  To do this the profile locks
-+       * are only held when the actual switch is done per task.  While
-+       * looping to allocate a new aa_task_context the old_task list
-+       * may get shorter if tasks exit/change their profile but will
-+       * not get longer as new task will not use old_profile detecting
-+       * that is stale.
-+       */
-+      do {
-+              new_cxt = aa_alloc_task_context(GFP_KERNEL | __GFP_NOFAIL);
-+
-+              lock_both_profiles(old_profile, new_profile);
-+              if (!list_empty(&old_profile->task_contexts)) {
-+                      struct task_struct *task =
-+                              list_entry(old_profile->task_contexts.next,
-+                                         struct aa_task_context, list)->task;
-+                      task_lock(task);
-+                      task_replace(task, new_cxt, new_profile);
-+                      task_unlock(task);
-+                      new_cxt = NULL;
-+              }
-+              unlock_both_profiles(old_profile, new_profile);
-+      } while (!new_cxt);
-+      aa_free_task_context(new_cxt);
-+      aa_put_profile(old_profile);
-+
-+out:
-+      sa.name = new_profile->name;
-+      sa.name2 = ns->name;
-+      aa_audit_status(NULL, &sa);
-+      mutex_unlock(&aa_interface_lock);
-+      return size;
-+}
-+
-+/**
-+ * aa_remove_profile - remove a profile from the system
-+ * @name: name of the profile to remove
-+ * @size: size of the name
-+ *
-+ * remove a profile from the profile list and all aa_task_context references
-+ * to said profile.
-+ */
-+ssize_t aa_remove_profile(char *name, size_t size)
-+{
-+      struct aa_namespace *ns;
-+      struct aa_profile *profile;
-+      struct aa_audit sa;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "profile_remove";
-+      sa.gfp_mask = GFP_KERNEL;
-+
-+      mutex_lock(&aa_interface_lock);
-+      write_lock(&profile_ns_list_lock);
-+
-+      if (name[0] == ':') {
-+              char *split = strchr(name + 1, ':');
-+              if (!split)
-+                      goto noent;
-+              *split = 0;
-+              ns = __aa_find_namespace(name + 1, &profile_ns_list);
-+              name = split + 1;
-+      } else {
-+              ns = default_namespace;
-+      }
-+
-+      if (!ns)
-+              goto noent;
-+      sa.name2 = ns->name;
-+      write_lock(&ns->lock);
-+      profile = __aa_find_profile(name, &ns->profiles);
-+      if (!profile) {
-+              write_unlock(&ns->lock);
-+              goto noent;
-+      }
-+      sa.name = profile->name;
-+
-+      /* Remove the profile from each task context it is on. */
-+      lock_profile(profile);
-+      profile->isstale = 1;
-+      aa_unconfine_tasks(profile);
-+      list_del_init(&profile->list);
-+      ns->profile_count--;
-+      unlock_profile(profile);
-+      /* Release the profile itself. */
-+      write_unlock(&ns->lock);
-+      /* check to see if the namespace has become stale */
-+      if (ns != default_namespace && ns->profile_count == 0) {
-+              list_del_init(&ns->list);
-+              aa_put_namespace(ns);
-+      }
-+      write_unlock(&profile_ns_list_lock);
-+
-+      aa_audit_status(NULL, &sa);
-+      mutex_unlock(&aa_interface_lock);
-+      aa_put_profile(profile);
-+
-+      return size;
-+
-+noent:
-+      write_unlock(&profile_ns_list_lock);
-+      sa.info = "failed: profile does not exist";
-+      aa_audit_status(NULL, &sa);
-+      mutex_unlock(&aa_interface_lock);
-+      return -ENOENT;
-+}
-+
-+/**
-+ * free_aa_namespace_kref - free aa_namespace by kref (see aa_put_namespace)
-+ * @kr: kref callback for freeing of a namespace
-+ */
-+void free_aa_namespace_kref(struct kref *kref)
-+{
-+      struct aa_namespace *ns=container_of(kref, struct aa_namespace, count);
-+
-+      free_aa_namespace(ns);
-+}
-+
-+/**
-+ * alloc_aa_namespace - allocate, initialize and return a new namespace
-+ * @name: a preallocated name
-+ * Returns NULL on failure.
-+ */
-+struct aa_namespace *alloc_aa_namespace(char *name)
-+{
-+      struct aa_namespace *ns;
-+
-+      ns = kzalloc(sizeof(*ns), GFP_KERNEL);
-+      AA_DEBUG("%s(%p)\n", __FUNCTION__, ns);
-+      if (ns) {
-+              ns->name = name;
-+              INIT_LIST_HEAD(&ns->list);
-+              INIT_LIST_HEAD(&ns->profiles);
-+              kref_init(&ns->count);
-+              rwlock_init(&ns->lock);
-+
-+              ns->null_complain_profile = alloc_aa_profile();
-+              if (!ns->null_complain_profile) {
-+                      if (!name)
-+                              kfree(ns->name);
-+                      kfree(ns);
-+                      return NULL;
-+              }
-+              ns->null_complain_profile->name =
-+                      kstrdup("null-complain-profile", GFP_KERNEL);
-+              if (!ns->null_complain_profile->name) {
-+                      free_aa_profile(ns->null_complain_profile);
-+                      if (!name)
-+                              kfree(ns->name);
-+                      kfree(ns);
-+                      return NULL;
-+              }
-+              ns->null_complain_profile->flags.complain = 1;
-+              /* null_complain_profile doesn't contribute to ns ref count */
-+              ns->null_complain_profile->ns = ns;
-+      }
-+      return ns;
-+}
-+
-+/**
-+ * free_aa_namespace - free a profile namespace
-+ * @namespace: the namespace to free
-+ *
-+ * Free a namespace.  All references to the namespace must have been put.
-+ * If the namespace was referenced by a profile confining a task,
-+ * free_aa_namespace will be called indirectly (through free_aa_profile)
-+ * from an rcu callback routine, so we must not sleep here.
-+ */
-+void free_aa_namespace(struct aa_namespace *ns)
-+{
-+      AA_DEBUG("%s(%p)\n", __FUNCTION__, ns);
-+
-+      if (!ns)
-+              return;
-+
-+      /* namespace still contains profiles -- invalid */
-+      if (!list_empty(&ns->profiles)) {
-+              AA_ERROR("%s: internal error, "
-+                       "namespace '%s' still contains profiles\n",
-+                       __FUNCTION__,
-+                       ns->name);
-+              BUG();
-+      }
-+      if (!list_empty(&ns->list)) {
-+              AA_ERROR("%s: internal error, "
-+                       "namespace '%s' still on list\n",
-+                       __FUNCTION__,
-+                       ns->name);
-+              BUG();
-+      }
-+      /* null_complain_profile doesn't contribute to ns ref counting */
-+      ns->null_complain_profile->ns = NULL;
-+      aa_put_profile(ns->null_complain_profile);
-+      kfree(ns->name);
-+      kfree(ns);
-+}
-+
-+/**
-+ * free_aa_profile_kref - free aa_profile by kref (called by aa_put_profile)
-+ * @kr: kref callback for freeing of a profile
-+ */
-+void free_aa_profile_kref(struct kref *kref)
-+{
-+      struct aa_profile *p=container_of(kref, struct aa_profile, count);
-+
-+      free_aa_profile(p);
-+}
-+
-+/**
-+ * alloc_aa_profile - allocate, initialize and return a new profile
-+ * Returns NULL on failure.
-+ */
-+struct aa_profile *alloc_aa_profile(void)
-+{
-+      struct aa_profile *profile;
-+
-+      profile = kzalloc(sizeof(*profile), GFP_KERNEL);
-+      AA_DEBUG("%s(%p)\n", __FUNCTION__, profile);
-+      if (profile) {
-+              INIT_LIST_HEAD(&profile->list);
-+              kref_init(&profile->count);
-+              INIT_LIST_HEAD(&profile->task_contexts);
-+              spin_lock_init(&profile->lock);
-+      }
-+      return profile;
-+}
-+
-+/**
-+ * free_aa_profile - free a profile
-+ * @profile: the profile to free
-+ *
-+ * Free a profile, its hats and null_profile. All references to the profile,
-+ * its hats and null_profile must have been put.
-+ *
-+ * If the profile was referenced from a task context, free_aa_profile() will
-+ * be called from an rcu callback routine, so we must not sleep here.
-+ */
-+void free_aa_profile(struct aa_profile *profile)
-+{
-+      AA_DEBUG("%s(%p)\n", __FUNCTION__, profile);
-+
-+      if (!profile)
-+              return;
-+
-+      /* profile is still on profile namespace list -- invalid */
-+      if (!list_empty(&profile->list)) {
-+              AA_ERROR("%s: internal error, "
-+                       "profile '%s' still on global list\n",
-+                       __FUNCTION__,
-+                       profile->name);
-+              BUG();
-+      }
-+      aa_put_namespace(profile->ns);
-+
-+      aa_match_free(profile->file_rules);
-+
-+      if (profile->name) {
-+              AA_DEBUG("%s: %s\n", __FUNCTION__, profile->name);
-+              kfree(profile->name);
-+      }
-+
-+      kfree(profile);
-+}
-+
-+/**
-+ * aa_unconfine_tasks - remove tasks on a profile's task context list
-+ * @profile: profile to remove tasks from
-+ *
-+ * Assumes that @profile lock is held.
-+ */
-+void aa_unconfine_tasks(struct aa_profile *profile)
-+{
-+      while (!list_empty(&profile->task_contexts)) {
-+              struct task_struct *task =
-+                      list_entry(profile->task_contexts.next,
-+                                 struct aa_task_context, list)->task;
-+              task_lock(task);
-+              aa_change_task_context(task, NULL, NULL, 0, NULL);
-+              task_unlock(task);
-+      }
-+}
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-network.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-network.diff
deleted file mode 100644 (file)
index d906459..0000000
+++ /dev/null
@@ -1,408 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: Simplified network controls for AppArmor
-
-Simple network control determining which network families a confined
-application has access to.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- security/apparmor/Makefile           |    7 +
- security/apparmor/apparmor.h         |    9 ++
- security/apparmor/lsm.c              |  129 ++++++++++++++++++++++++++++++++++-
- security/apparmor/main.c             |  107 ++++++++++++++++++++++++++++-
- security/apparmor/module_interface.c |   26 ++++++-
- 5 files changed, 271 insertions(+), 7 deletions(-)
-
---- a/security/apparmor/Makefile
-+++ b/security/apparmor/Makefile
-@@ -8,6 +8,11 @@ apparmor-y := main.o list.o procattr.o l
- quiet_cmd_make-caps = GEN     $@
- cmd_make-caps = sed -n -e "/CAP_FS_MASK/d" -e "s/^\#define[ \\t]\\+CAP_\\([A-Z0-9_]\\+\\)[ \\t]\\+\\([0-9]\\+\\)\$$/[\\2]  = \"\\1\",/p" $< | tr A-Z a-z > $@
--$(obj)/main.o : $(obj)/capability_names.h
-+quiet_cmd_make-af = GEN     $@
-+cmd_make-af = sed -n -e "/AF_MAX/d" -e "/AF_LOCAL/d" -e "s/^\#define[ \\t]\\+AF_\\([A-Z0-9_]\\+\\)[ \\t]\\+\\([0-9]\\+\\)\\(.*\\)\$$/[\\2]  = \"\\1\",/p" $< | tr A-Z a-z > $@
-+
-+$(obj)/main.o : $(obj)/capability_names.h $(obj)/af_names.h
- $(obj)/capability_names.h : $(srctree)/include/linux/capability.h
-       $(call cmd,make-caps)
-+$(obj)/af_names.h : $(srctree)/include/linux/socket.h
-+      $(call cmd,make-af)
---- a/security/apparmor/apparmor.h
-+++ b/security/apparmor/apparmor.h
-@@ -16,6 +16,8 @@
- #include <linux/fs.h>
- #include <linux/binfmts.h>
- #include <linux/rcupdate.h>
-+#include <linux/socket.h>
-+#include <net/sock.h>
- /*
-  * We use MAY_READ, MAY_WRITE, MAY_EXEC, MAY_APPEND and the following flags
-@@ -212,6 +214,9 @@ struct aa_profile {
-       struct list_head task_contexts;
-       spinlock_t lock;
-       unsigned long int_flags;
-+      u16 network_families[AF_MAX];
-+      u16 audit_network[AF_MAX];
-+      u16 quiet_network[AF_MAX];
- };
- extern struct list_head profile_ns_list;
-@@ -258,6 +263,7 @@ struct aa_audit {
-       int request_mask, denied_mask, audit_mask;
-       struct iattr *iattr;
-       pid_t task, parent;
-+      int family, type, protocol;
-       int error_code;
- };
-@@ -319,6 +325,9 @@ extern void aa_change_task_context(struc
-                                  struct aa_profile *previous_profile);
- extern int aa_may_ptrace(struct aa_task_context *cxt,
-                        struct aa_profile *tracee);
-+extern int aa_net_perm(struct aa_profile *profile, char *operation,
-+                      int family, int type, int protocol);
-+extern int aa_revalidate_sk(struct sock *sk, char *operation);
- /* lsm.c */
- extern int apparmor_initialized;
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -18,6 +18,7 @@
- #include <linux/ctype.h>
- #include <linux/sysctl.h>
- #include <linux/audit.h>
-+#include <net/sock.h>
- #include "apparmor.h"
- #include "inline.h"
-@@ -680,6 +681,117 @@ static void apparmor_task_free_security(
-       aa_release(task);
- }
-+static int apparmor_socket_create(int family, int type, int protocol, int kern)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      if (kern)
-+              return 0;
-+
-+      profile = aa_get_profile(current);
-+      if (profile)
-+              error = aa_net_perm(profile, "socket_create", family,
-+                                                      type, protocol);
-+      aa_put_profile(profile);
-+
-+      return error;
-+}
-+
-+static int apparmor_socket_post_create(struct socket *sock, int family,
-+                                      int type, int protocol, int kern)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      if (kern)
-+              return 0;
-+
-+      return aa_revalidate_sk(sk, "socket_post_create");
-+}
-+
-+static int apparmor_socket_bind(struct socket *sock,
-+                              struct sockaddr *address, int addrlen)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_bind");
-+}
-+
-+static int apparmor_socket_connect(struct socket *sock,
-+                                      struct sockaddr *address, int addrlen)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_connect");
-+}
-+
-+static int apparmor_socket_listen(struct socket *sock, int backlog)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_listen");
-+}
-+
-+static int apparmor_socket_accept(struct socket *sock, struct socket *newsock)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_accept");
-+}
-+
-+static int apparmor_socket_sendmsg(struct socket *sock,
-+                                      struct msghdr *msg, int size)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_sendmsg");
-+}
-+
-+static int apparmor_socket_recvmsg(struct socket *sock,
-+                                 struct msghdr *msg, int size, int flags)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_recvmsg");
-+}
-+
-+static int apparmor_socket_getsockname(struct socket *sock)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_getsockname");
-+}
-+
-+static int apparmor_socket_getpeername(struct socket *sock)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_getpeername");
-+}
-+
-+static int apparmor_socket_getsockopt(struct socket *sock, int level,
-+                                      int optname)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_getsockopt");
-+}
-+
-+static int apparmor_socket_setsockopt(struct socket *sock, int level,
-+                                      int optname)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_setsockopt");
-+}
-+
-+static int apparmor_socket_shutdown(struct socket *sock, int how)
-+{
-+      struct sock *sk = sock->sk;
-+
-+      return aa_revalidate_sk(sk, "socket_shutdown");
-+}
-+
- static int apparmor_getprocattr(struct task_struct *task, char *name,
-                               char **value)
- {
-@@ -780,9 +892,6 @@ struct security_operations apparmor_ops
-       .capable =                      apparmor_capable,
-       .syslog =                       cap_syslog,
--      .netlink_send =                 cap_netlink_send,
--      .netlink_recv =                 cap_netlink_recv,
--
-       .bprm_apply_creds =             cap_bprm_apply_creds,
-       .bprm_set_security =            apparmor_bprm_set_security,
-       .bprm_secureexec =              apparmor_bprm_secureexec,
-@@ -820,6 +929,20 @@ struct security_operations apparmor_ops
-       .getprocattr =                  apparmor_getprocattr,
-       .setprocattr =                  apparmor_setprocattr,
-+
-+      .socket_create =                apparmor_socket_create,
-+      .socket_post_create =           apparmor_socket_post_create,
-+      .socket_bind =                  apparmor_socket_bind,
-+      .socket_connect =               apparmor_socket_connect,
-+      .socket_listen =                apparmor_socket_listen,
-+      .socket_accept =                apparmor_socket_accept,
-+      .socket_sendmsg =               apparmor_socket_sendmsg,
-+      .socket_recvmsg =               apparmor_socket_recvmsg,
-+      .socket_getsockname =           apparmor_socket_getsockname,
-+      .socket_getpeername =           apparmor_socket_getpeername,
-+      .socket_getsockopt =            apparmor_socket_getsockopt,
-+      .socket_setsockopt =            apparmor_socket_setsockopt,
-+      .socket_shutdown =              apparmor_socket_shutdown,
- };
- void info_message(const char *str)
---- a/security/apparmor/main.c
-+++ b/security/apparmor/main.c
-@@ -14,6 +14,9 @@
- #include <linux/audit.h>
- #include <linux/mount.h>
- #include <linux/ptrace.h>
-+#include <linux/socket.h>
-+#include <linux/net.h>
-+#include <net/sock.h>
- #include "apparmor.h"
-@@ -116,6 +119,24 @@ static void aa_audit_file_mask(struct au
-       audit_log_format(ab, " %s=\"%s::%s\"", name, user, other);
- }
-+static const char *address_families[] = {
-+#include "af_names.h"
-+};
-+
-+static const char *sock_types[] = {
-+      "unknown(0)",
-+      "stream",
-+      "dgram",
-+      "raw",
-+      "rdm",
-+      "seqpacket",
-+      "dccp",
-+      "unknown(7)",
-+      "unknown(8)",
-+      "unknown(9)",
-+      "packet",
-+};
-+
- /**
-  * aa_audit - Log an audit event to the audit subsystem
-  * @profile: profile to check against
-@@ -187,7 +208,25 @@ static int aa_audit_base(struct aa_profi
-               audit_log_untrustedstring(ab, sa->name2);
-       }
--      audit_log_format(ab, " pid=%d", current->pid);
-+      if (sa->family || sa->type) {
-+              if (address_families[sa->family])
-+                      audit_log_format(ab, " family=\"%s\"",
-+                                       address_families[sa->family]);
-+              else
-+                      audit_log_format(ab, " family=\"unknown(%d)\"",
-+                                       sa->family);
-+
-+              if (sock_types[sa->type])
-+                      audit_log_format(ab, " sock_type=\"%s\"",
-+                                       sock_types[sa->type]);
-+              else
-+                      audit_log_format(ab, " sock_type=\"unknown(%d)\"",
-+                                       sa->type);
-+
-+              audit_log_format(ab, " protocol=%d", sa->protocol);
-+      }
-+
-+        audit_log_format(ab, " pid=%d", current->pid);
-       if (profile) {
-               audit_log_format(ab, " profile=");
-@@ -767,6 +806,72 @@ int aa_link(struct aa_profile *profile,
-       return error;
- }
-+
-+int aa_net_perm(struct aa_profile *profile, char *operation,
-+              int family, int type, int protocol)
-+{
-+      struct aa_audit sa;
-+      int error = 0;
-+      u16 family_mask, audit_mask, quiet_mask;
-+
-+      if ((family < 0) || (family >= AF_MAX))
-+              return -EINVAL;
-+
-+      if ((type < 0) || (type >= SOCK_MAX))
-+              return -EINVAL;
-+
-+      /* unix domain and netlink sockets are handled by ipc */
-+      if (family == AF_UNIX || family == AF_NETLINK)
-+              return 0;
-+
-+      family_mask = profile->network_families[family];
-+      audit_mask = profile->audit_network[family];
-+      quiet_mask = profile->quiet_network[family];
-+
-+      error = (family_mask & (1 << type)) ? 0 : -EACCES;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = operation;
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.family = family;
-+      sa.type = type;
-+      sa.protocol = protocol;
-+      sa.error_code = error;
-+
-+      if (likely(!error)) {
-+              if (!PROFILE_AUDIT(profile) && !(family_mask & audit_mask))
-+                      return 0;
-+      } else if (!((1 << type) & ~quiet_mask)) {
-+              return error;
-+      }
-+
-+      error = aa_audit(profile, &sa);
-+
-+      return error;
-+}
-+
-+int aa_revalidate_sk(struct sock *sk, char *operation)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      /* this is some debugging code to flush out the network hooks that
-+         that are called in interrupt context */
-+      if (in_interrupt()) {
-+              printk("AppArmor Debug: Hook being called from interrupt context\n");
-+              dump_stack();
-+              return 0;
-+      }
-+
-+      profile = aa_get_profile(current);
-+      if (profile)
-+              error = aa_net_perm(profile, operation,
-+                                  sk->sk_family, sk->sk_type,
-+                                  sk->sk_protocol);
-+      aa_put_profile(profile);
-+
-+      return error;
-+}
- /*******************************
-  * Global task related functions
---- a/security/apparmor/module_interface.c
-+++ b/security/apparmor/module_interface.c
-@@ -321,8 +321,8 @@ static struct aa_profile *aa_unpack_prof
-                                           struct aa_audit *sa)
- {
-       struct aa_profile *profile = NULL;
--
--      int error = -EPROTO;
-+      size_t size = 0;
-+      int i, error = -EPROTO;
-       profile = alloc_aa_profile();
-       if (!profile)
-@@ -355,6 +355,28 @@ static struct aa_profile *aa_unpack_prof
-       if (!aa_is_u32(e, &(profile->set_caps), NULL))
-               goto fail;
-+      size = aa_is_array(e, "net_allowed_af");
-+      if (size) {
-+              if (size > AF_MAX)
-+                      goto fail;
-+
-+              for (i = 0; i < size; i++) {
-+                      if (!aa_is_u16(e, &profile->network_families[i], NULL))
-+                              goto fail;
-+                      if (!aa_is_u16(e, &profile->audit_network[i], NULL))
-+                              goto fail;
-+                      if (!aa_is_u16(e, &profile->quiet_network[i], NULL))
-+                              goto fail;
-+              }
-+              if (!aa_is_nameX(e, AA_ARRAYEND, NULL))
-+                      goto fail;
-+              /* allow unix domain and netlink sockets they are handled
-+               * by IPC
-+               */
-+      }
-+      profile->network_families[AF_UNIX] = 0xffff;
-+      profile->network_families[AF_NETLINK] = 0xffff;
-+
-       /* get file rules */
-       profile->file_rules = aa_unpack_dfa(e);
-       if (IS_ERR(profile->file_rules)) {
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-ptrace-2.6.27.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-ptrace-2.6.27.diff
deleted file mode 100644 (file)
index c80f740..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: apparmor: use new ptrace security_operations
-
- This patch implements the new ptrace security_operations members.
-
- ->ptrace was changed to ->ptrace_may_access and ->ptrace_traceme.
-
- The apparmor versions are really just wrappers for the old function.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- security/apparmor/lsm.c |   17 +++++++++++++++--
- 1 file changed, 15 insertions(+), 2 deletions(-)
-
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -158,7 +158,7 @@ static int aa_reject_syscall(struct task
- }
- static int apparmor_ptrace(struct task_struct *parent,
--                         struct task_struct *child, unsigned int mode)
-+                         struct task_struct *child)
- {
-       struct aa_task_context *cxt;
-       int error = 0;
-@@ -207,6 +207,18 @@ static int apparmor_ptrace(struct task_s
-       return error;
- }
-+static int apparmor_ptrace_may_access(struct task_struct *child,
-+                                    unsigned int mode)
-+{
-+      return apparmor_ptrace(child->parent, child);
-+}
-+
-+
-+static int apparmor_ptrace_traceme(struct task_struct *parent)
-+{
-+      return apparmor_ptrace(parent, current);
-+}
-+
- static int apparmor_capable(struct task_struct *task, int cap)
- {
-       int error;
-@@ -899,7 +911,8 @@ static int apparmor_task_setrlimit(unsig
- }
- struct security_operations apparmor_ops = {
--      .ptrace =                       apparmor_ptrace,
-+      .ptrace_may_access =            apparmor_ptrace_may_access,
-+      .ptrace_traceme =               apparmor_ptrace_traceme,
-       .capget =                       cap_capget,
-       .capset_check =                 cap_capset_check,
-       .capset_set =                   cap_capset_set,
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-rlimits.diff b/src/patches/suse-2.6.27.31/patches.apparmor/apparmor-rlimits.diff
deleted file mode 100644 (file)
index f3912fd..0000000
+++ /dev/null
@@ -1,461 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: per profile controls for system rlimits
-
-Provide contol of rlimits on a per profile basis.  Each profile provides
-a per limit contol and corresponding hard limit value, such that when a
-profile becomes attached to a task it sets the tasks limits to be <= to
-the profiles specified limits.  Note: the profile limit value will not
-raise a tasks limit if it is already less than the profile mandates.
-
-In addition to setting a tasks limits, the ability to set limits on
-a confined task are controlled.  AppArmor only controls the raising
-of a tasks limits Tasks with CAP_SYS_RESOURCE can have their hard limits
-raised up to the value specified by the profile.  AppArmor does not
-prevent a task for lowering its hard limits, nor does it provide
-additional control on soft limits.
-
-AppArmor only controls the limits specified in a profile so that
-any limit not specified is free to be modified subject to standard
-linux limitations.
-
----
- security/apparmor/apparmor.h         |   23 ++++++
- security/apparmor/apparmorfs.c       |    2 
- security/apparmor/lsm.c              |   16 ++++
- security/apparmor/main.c             |  132 +++++++++++++++++++++++++++++++----
- security/apparmor/module_interface.c |   56 ++++++++++++++
- 5 files changed, 215 insertions(+), 14 deletions(-)
-
---- a/security/apparmor/apparmor.h
-+++ b/security/apparmor/apparmor.h
-@@ -16,6 +16,7 @@
- #include <linux/fs.h>
- #include <linux/binfmts.h>
- #include <linux/rcupdate.h>
-+#include <linux/resource.h>
- #include <linux/socket.h>
- #include <net/sock.h>
-@@ -139,6 +140,18 @@ extern unsigned int apparmor_path_max;
- #define AA_ERROR(fmt, args...)        printk(KERN_ERR "AppArmor: " fmt, ##args)
-+/* struct aa_rlimit - rlimits settings for the profile
-+ * @mask: which hard limits to set
-+ * @limits: rlimit values that override task limits
-+ *
-+ * AppArmor rlimits are used to set confined task rlimits.  Only the
-+ * limits specified in @mask will be controlled by apparmor.
-+ */
-+struct aa_rlimit {
-+      unsigned int mask;
-+      struct rlimit limits[RLIM_NLIMITS];
-+};
-+
- struct aa_profile;
- /* struct aa_namespace - namespace for a set of profiles
-@@ -173,6 +186,8 @@ struct aa_namespace {
-  * @audit_caps: caps that are to be audited
-  * @quiet_caps: caps that should not be audited
-  * @capabilities: capabilities granted by the process
-+ * @rlimits: rlimits for the profile
-+ * @task_count: how many tasks the profile is attached to
-  * @count: reference count of the profile
-  * @task_contexts: list of tasks confined by profile
-  * @lock: lock for the task_contexts list
-@@ -210,6 +225,9 @@ struct aa_profile {
-       kernel_cap_t audit_caps;
-       kernel_cap_t quiet_caps;
-+      struct aa_rlimit rlimits;
-+      unsigned int task_count;
-+
-       struct kref count;
-       struct list_head task_contexts;
-       spinlock_t lock;
-@@ -261,6 +279,7 @@ struct aa_audit {
-       const char *name2;
-       const char *name3;
-       int request_mask, denied_mask, audit_mask;
-+      int rlimit;
-       struct iattr *iattr;
-       pid_t task, parent;
-       int family, type, protocol;
-@@ -328,6 +347,10 @@ extern int aa_may_ptrace(struct aa_task_
- extern int aa_net_perm(struct aa_profile *profile, char *operation,
-                       int family, int type, int protocol);
- extern int aa_revalidate_sk(struct sock *sk, char *operation);
-+extern int aa_task_setrlimit(struct aa_profile *profile, unsigned int resource,
-+                           struct rlimit *new_rlim);
-+extern void aa_set_rlimits(struct task_struct *task, struct aa_profile *profile);
-+
- /* lsm.c */
- extern int apparmor_initialized;
---- a/security/apparmor/apparmorfs.c
-+++ b/security/apparmor/apparmorfs.c
-@@ -106,7 +106,7 @@ static ssize_t aa_features_read(struct f
- {
-       const char *features = "file=3.0 capability=2.0 network=1.0 "
-                              "change_hat=1.5 change_profile=1.0 "
--                             "aanamespaces=1.0";
-+                             "aanamespaces=1.0 rlimit=1.0";
-       return simple_read_from_buffer(buf, size, ppos, features,
-                                      strlen(features));
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -883,6 +883,21 @@ static int apparmor_setprocattr(struct t
-       return error;
- }
-+static int apparmor_task_setrlimit(unsigned int resource,
-+                                 struct rlimit *new_rlim)
-+{
-+      struct aa_profile *profile;
-+      int error = 0;
-+
-+      profile = aa_get_profile(current);
-+      if (profile) {
-+              error = aa_task_setrlimit(profile, resource, new_rlim);
-+      }
-+      aa_put_profile(profile);
-+
-+      return error;
-+}
-+
- struct security_operations apparmor_ops = {
-       .ptrace =                       apparmor_ptrace,
-       .capget =                       cap_capget,
-@@ -926,6 +941,7 @@ struct security_operations apparmor_ops
-       .task_free_security =           apparmor_task_free_security,
-       .task_post_setuid =             cap_task_post_setuid,
-       .task_reparent_to_init =        cap_task_reparent_to_init,
-+      .task_setrlimit =               apparmor_task_setrlimit,
-       .getprocattr =                  apparmor_getprocattr,
-       .setprocattr =                  apparmor_setprocattr,
---- a/security/apparmor/main.c
-+++ b/security/apparmor/main.c
-@@ -177,6 +177,9 @@ static int aa_audit_base(struct aa_profi
-       if (sa->request_mask)
-               audit_log_format(ab, " fsuid=%d", current->fsuid);
-+      if (sa->rlimit)
-+              audit_log_format(ab, " rlimit=%d", sa->rlimit - 1);
-+
-       if (sa->iattr) {
-               struct iattr *iattr = sa->iattr;
-@@ -872,6 +875,79 @@ int aa_revalidate_sk(struct sock *sk, ch
-       return error;
- }
-+/**
-+ * aa_task_setrlimit - test permission to set an rlimit
-+ * @profile - profile confining the task
-+ * @resource - the resource being set
-+ * @new_rlim - the new resource limit
-+ *
-+ * Control raising the processes hard limit.
-+ */
-+int aa_task_setrlimit(struct aa_profile *profile, unsigned int resource,
-+                    struct rlimit *new_rlim)
-+{
-+      struct aa_audit sa;
-+      int error = 0;
-+
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "setrlimit";
-+      sa.gfp_mask = GFP_KERNEL;
-+      sa.rlimit = resource + 1;
-+
-+      if (profile->rlimits.mask & (1 << resource) &&
-+          new_rlim->rlim_max > profile->rlimits.limits[resource].rlim_max) {
-+              sa.error_code = -EACCES;
-+
-+              error = aa_audit(profile, &sa);
-+      }
-+
-+      return error;
-+}
-+
-+static int aa_rlimit_nproc(struct aa_profile *profile) {
-+      if (profile && (profile->rlimits.mask & (1 << RLIMIT_NPROC)) &&
-+          profile->task_count >= profile->rlimits.limits[RLIMIT_NPROC].rlim_max)
-+              return -EAGAIN;
-+      return 0;
-+}
-+
-+void aa_set_rlimits(struct task_struct *task, struct aa_profile *profile)
-+{
-+      int i, mask;
-+
-+      if (!profile)
-+              return;
-+
-+      if (!profile->rlimits.mask)
-+              return;
-+
-+      task_lock(task->group_leader);
-+      mask = 1;
-+      for (i = 0; i < RLIM_NLIMITS; i++, mask <<= 1) {
-+              struct rlimit new_rlim, *old_rlim;
-+
-+              /* check to see if NPROC which is per profile and handled
-+               * in clone/exec or whether this is a limit to be set
-+               * can't set cpu limit either right now
-+               */
-+              if (i == RLIMIT_NPROC || i == RLIMIT_CPU)
-+                      continue;
-+
-+              old_rlim = task->signal->rlim + i;
-+              new_rlim = *old_rlim;
-+
-+              if (mask & profile->rlimits.mask &&
-+                  profile->rlimits.limits[i].rlim_max < new_rlim.rlim_max) {
-+                      new_rlim.rlim_max = profile->rlimits.limits[i].rlim_max;
-+                      /* soft limit should not exceed hard limit */
-+                      if (new_rlim.rlim_cur > new_rlim.rlim_max)
-+                              new_rlim.rlim_cur = new_rlim.rlim_max;
-+              }
-+
-+              *old_rlim = new_rlim;
-+      }
-+      task_unlock(task->group_leader);
-+}
- /*******************************
-  * Global task related functions
-@@ -885,6 +961,7 @@ int aa_revalidate_sk(struct sock *sk, ch
-  */
- int aa_clone(struct task_struct *child)
- {
-+      struct aa_audit sa;
-       struct aa_task_context *cxt, *child_cxt;
-       struct aa_profile *profile;
-@@ -894,6 +971,11 @@ int aa_clone(struct task_struct *child)
-       if (!child_cxt)
-               return -ENOMEM;
-+      memset(&sa, 0, sizeof(sa));
-+      sa.operation = "clone";
-+      sa.task = child->pid;
-+      sa.gfp_mask = GFP_KERNEL;
-+
- repeat:
-       profile = aa_get_profile(current);
-       if (profile) {
-@@ -910,18 +992,22 @@ repeat:
-                       goto repeat;
-               }
-+              if (aa_rlimit_nproc(profile)) {
-+                      sa.info = "rlimit nproc limit exceeded";
-+                      unlock_profile(profile);
-+                      aa_audit_reject(profile, &sa);
-+                      aa_put_profile(profile);
-+                      return -EAGAIN;
-+              }
-+
-               /* No need to grab the child's task lock here. */
-               aa_change_task_context(child, child_cxt, profile,
-                                      cxt->cookie, cxt->previous_profile);
-+
-               unlock_profile(profile);
-               if (APPARMOR_COMPLAIN(child_cxt) &&
-                   profile == profile->ns->null_complain_profile) {
--                      struct aa_audit sa;
--                      memset(&sa, 0, sizeof(sa));
--                      sa.operation = "clone";
--                      sa.gfp_mask = GFP_KERNEL;
--                      sa.task = child->pid;
-                       aa_audit_hint(profile, &sa);
-               }
-               aa_put_profile(profile);
-@@ -1156,6 +1242,10 @@ repeat:
-                       sa.task = current->parent->pid;
-                       aa_audit_reject(profile, &sa);
-               }
-+              if (PTR_ERR(old_profile) == -EAGAIN) {
-+                      sa.info = "rlimit nproc limit exceeded";
-+                      aa_audit_reject(profile, &sa);
-+              }
-               new_profile = old_profile;
-               goto cleanup;
-       }
-@@ -1303,6 +1393,12 @@ static int do_change_profile(struct aa_p
-               goto out;
-       }
-+      if ((error = aa_rlimit_nproc(new_profile))) {
-+              sa->info = "rlimit nproc limit exceeded";
-+              aa_audit_reject(cxt->profile, sa);
-+              goto out;
-+      }
-+
-       if (new_profile == ns->null_complain_profile)
-               aa_audit_hint(cxt->profile, sa);
-@@ -1481,17 +1577,18 @@ struct aa_profile *__aa_replace_profile(
-       cxt = lock_task_and_profiles(task, profile);
-       if (unlikely(profile && profile->isstale)) {
--              task_unlock(task);
--              unlock_both_profiles(profile, cxt ? cxt->profile : NULL);
--              aa_free_task_context(new_cxt);
--              return ERR_PTR(-ESTALE);
-+              old_profile = ERR_PTR(-ESTALE);
-+              goto error;
-       }
-       if ((current->ptrace & PT_PTRACED) && aa_may_ptrace(cxt, profile)) {
--              task_unlock(task);
--              unlock_both_profiles(profile, cxt ? cxt->profile : NULL);
--              aa_free_task_context(new_cxt);
--              return ERR_PTR(-EPERM);
-+              old_profile = ERR_PTR(-EPERM);
-+              goto error;
-+      }
-+
-+      if (aa_rlimit_nproc(profile)) {
-+              old_profile = ERR_PTR(-EAGAIN);
-+              goto error;
-       }
-       if (cxt)
-@@ -1499,8 +1596,15 @@ struct aa_profile *__aa_replace_profile(
-       aa_change_task_context(task, new_cxt, profile, 0, NULL);
-       task_unlock(task);
-+      aa_set_rlimits(task, profile);
-       unlock_both_profiles(profile, old_profile);
-       return old_profile;
-+
-+error:
-+      task_unlock(task);
-+      unlock_both_profiles(profile, cxt ? cxt->profile : NULL);
-+      aa_free_task_context(new_cxt);
-+      return old_profile;
- }
- /**
-@@ -1565,6 +1669,7 @@ void aa_change_task_context(struct task_
-       if (old_cxt) {
-               list_del_init(&old_cxt->list);
-+              old_cxt->profile->task_count--;
-               call_rcu(&old_cxt->rcu, free_aa_task_context_rcu_callback);
-       }
-       if (new_cxt) {
-@@ -1576,6 +1681,7 @@ void aa_change_task_context(struct task_
-               new_cxt->cookie = cookie;
-               new_cxt->task = task;
-               new_cxt->profile = aa_dup_profile(profile);
-+              profile->task_count++;
-               new_cxt->previous_profile = aa_dup_profile(previous_profile);
-               list_move(&new_cxt->list, &profile->task_contexts);
-       }
---- a/security/apparmor/module_interface.c
-+++ b/security/apparmor/module_interface.c
-@@ -177,6 +177,22 @@ fail:
-       return 0;
- }
-+static int aa_is_u64(struct aa_ext *e, u64 *data, const char *name)
-+{
-+      void *pos = e->pos;
-+      if (aa_is_nameX(e, AA_U64, name)) {
-+              if (!aa_inbounds(e, sizeof(u64)))
-+                      goto fail;
-+              if (data)
-+                      *data = le64_to_cpu(get_unaligned((u64 *)e->pos));
-+              e->pos += sizeof(u64);
-+              return 1;
-+      }
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
- static size_t aa_is_array(struct aa_ext *e, const char *name)
- {
-       void *pos = e->pos;
-@@ -312,6 +328,39 @@ fail:
-       return 0;
- }
-+int aa_unpack_rlimits(struct aa_ext *e, struct aa_profile *profile)
-+{
-+      void *pos = e->pos;
-+
-+      /* rlimits are optional */
-+      if (aa_is_nameX(e, AA_STRUCT, "rlimits")) {
-+              int i, size;
-+              u32 tmp = 0;
-+              if (!aa_is_u32(e, &tmp, NULL))
-+                      goto fail;
-+              profile->rlimits.mask = tmp;
-+
-+              size = aa_is_array(e, NULL);
-+              if (size > RLIM_NLIMITS)
-+                      goto fail;
-+              for (i = 0; i < size; i++) {
-+                      u64 tmp = 0;
-+                      if (!aa_is_u64(e, &tmp, NULL))
-+                              goto fail;
-+                      profile->rlimits.limits[i].rlim_max = tmp;
-+              }
-+              if (!aa_is_nameX(e, AA_ARRAYEND, NULL))
-+                      goto fail;
-+              if (!aa_is_nameX(e, AA_STRUCTEND, NULL))
-+                      goto fail;
-+      }
-+      return 1;
-+
-+fail:
-+      e->pos = pos;
-+      return 0;
-+}
-+
- /**
-  * aa_unpack_profile - unpack a serialized profile
-  * @e: serialized data extent information
-@@ -355,6 +404,9 @@ static struct aa_profile *aa_unpack_prof
-       if (!aa_is_u32(e, &(profile->set_caps), NULL))
-               goto fail;
-+      if (!aa_unpack_rlimits(e, profile))
-+              goto fail;
-+
-       size = aa_is_array(e, "net_allowed_af");
-       if (size) {
-               if (size > AF_MAX)
-@@ -614,6 +666,8 @@ ssize_t aa_replace_profile(void *udata,
-               sa.operation = "profile_load";
-               goto out;
-       }
-+      /* do not fail replacement based off of profile's NPROC rlimit */
-+
-       /*
-        * Replacement needs to allocate a new aa_task_context for each
-        * task confined by old_profile.  To do this the profile locks
-@@ -634,6 +688,7 @@ ssize_t aa_replace_profile(void *udata,
-                       task_lock(task);
-                       task_replace(task, new_cxt, new_profile);
-                       task_unlock(task);
-+                      aa_set_rlimits(task, new_profile);
-                       new_cxt = NULL;
-               }
-               unlock_both_profiles(old_profile, new_profile);
-@@ -656,6 +711,7 @@ out:
-  *
-  * remove a profile from the profile list and all aa_task_context references
-  * to said profile.
-+ * NOTE: removing confinement does not restore rlimits to preconfinemnet values
-  */
- ssize_t aa_remove_profile(char *name, size_t size)
- {
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path.diff b/src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path.diff
deleted file mode 100644 (file)
index e82cf5e..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Add d_namespace_path() to compute namespace relative pathnames
-
-In AppArmor, we are interested in pathnames relative to the namespace root.
-This is the same as d_path() except for the root where the search ends. Add
-a function for computing the namespace-relative path.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namespace.c        |   30 ++++++++++++++++++++++++++++++
- include/linux/mount.h |    2 ++
- 2 files changed, 32 insertions(+)
-
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -2357,3 +2357,33 @@ void put_mnt_ns(struct mnt_namespace *ns
-       kfree(ns);
- }
- EXPORT_SYMBOL(put_mnt_ns);
-+
-+char *d_namespace_path(struct dentry *dentry, struct vfsmount *vfsmnt,
-+                     char *buf, int buflen)
-+{
-+      struct path root, tmp, ns_root = { };
-+      struct path path = { .mnt = vfsmnt, .dentry = dentry };
-+      char *res;
-+
-+      read_lock(&current->fs->lock);
-+      root = current->fs->root;
-+      path_get(&current->fs->root);
-+      read_unlock(&current->fs->lock);
-+      spin_lock(&vfsmount_lock);
-+      if (root.mnt)
-+              ns_root.mnt = mntget(root.mnt->mnt_ns->root);
-+      if (ns_root.mnt)
-+              ns_root.dentry = dget(ns_root.mnt->mnt_root);
-+      spin_unlock(&vfsmount_lock);
-+      tmp = ns_root;
-+      res = __d_path(&path, &tmp, buf, buflen,
-+                     D_PATH_FAIL_DELETED | D_PATH_DISCONNECT);
-+      path_put(&root);
-+      path_put(&ns_root);
-+
-+      /* Prevent empty path for lazily unmounted filesystems. */
-+      if (!IS_ERR(res) && *res == '\0')
-+              *--res = '.';
-+      return res;
-+}
-+EXPORT_SYMBOL(d_namespace_path);
---- a/include/linux/mount.h
-+++ b/include/linux/mount.h
-@@ -137,4 +137,6 @@ extern void mark_mounts_for_expiry(struc
- extern spinlock_t vfsmount_lock;
- extern dev_t name_to_dev_t(char *name);
-+extern char *d_namespace_path(struct dentry *, struct vfsmount *, char *, int);
-+
- #endif /* _LINUX_MOUNT_H */
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path_oops_fix.diff b/src/patches/suse-2.6.27.31/patches.apparmor/d_namespace_path_oops_fix.diff
deleted file mode 100644 (file)
index f1ae52d..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From: Miklos Szeredi <mszeredi@suse.cz>
-Subject: fix oops in d_namespace_path
-Patch-mainline: no
-References: bnc#433504
-
-d_namespace_path uses the current->fs->root to get the current
-namespace.  If root is detached root.mnt->mnt_ns will be NULL, causing
-an Oops.  Fix by checking this before dereferencing the mnt_ns.
-
-Signed-off-by: Miklos Szeredi <mszeredi@suse.cz>
----
- fs/namespace.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/fs/namespace.c
-+++ b/fs/namespace.c
-@@ -2370,7 +2370,7 @@ char *d_namespace_path(struct dentry *de
-       path_get(&current->fs->root);
-       read_unlock(&current->fs->lock);
-       spin_lock(&vfsmount_lock);
--      if (root.mnt)
-+      if (root.mnt && root.mnt->mnt_ns)
-               ns_root.mnt = mntget(root.mnt->mnt_ns->root);
-       if (ns_root.mnt)
-               ns_root.dentry = dget(ns_root.mnt->mnt_root);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/do_path_lookup-nameidata.diff b/src/patches/suse-2.6.27.31/patches.apparmor/do_path_lookup-nameidata.diff
deleted file mode 100644 (file)
index 44a21b9..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Switch to vfs_permission() in do_path_lookup()
-
-Switch from file_permission() to vfs_permission() in do_path_lookup():
-this avoids calling permission() with a NULL nameidata here.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c |    7 ++-----
- 1 file changed, 2 insertions(+), 5 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1085,24 +1085,21 @@ static int do_path_lookup(int dfd, const
-               path_get(&fs->pwd);
-               read_unlock(&fs->lock);
-       } else {
--              struct dentry *dentry;
--
-               file = fget_light(dfd, &fput_needed);
-               retval = -EBADF;
-               if (!file)
-                       goto out_fail;
--              dentry = file->f_path.dentry;
-+              nd->path = file->f_path;
-               retval = -ENOTDIR;
--              if (!S_ISDIR(dentry->d_inode->i_mode))
-+              if (!S_ISDIR(nd->path.dentry->d_inode->i_mode))
-                       goto fput_fail;
-               retval = file_permission(file, MAY_EXEC);
-               if (retval)
-                       goto fput_fail;
--              nd->path = file->f_path;
-               path_get(&file->f_path);
-               fput_light(file, fput_needed);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/file-handle-ops.diff b/src/patches/suse-2.6.27.31/patches.apparmor/file-handle-ops.diff
deleted file mode 100644 (file)
index 2e921f9..0000000
+++ /dev/null
@@ -1,84 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Enable LSM hooks to distinguish operations on file descriptors from operations on pathnames
-
-Struct iattr already contains ia_file since commit cc4e69de from 
-Miklos (which is related to commit befc649c). Use this to pass
-struct file down the setattr hooks. This allows LSMs to distinguish
-operations on file descriptors from operations on paths.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Cc: Miklos Szeredi <mszeredi@suse.cz>
-
----
- fs/nfsd/vfs.c |   12 +++++++-----
- fs/open.c     |    5 ++++-
- 2 files changed, 11 insertions(+), 6 deletions(-)
-
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -425,7 +425,7 @@ static ssize_t nfsd_getxattr(struct dent
- {
-       ssize_t buflen;
--      buflen = vfs_getxattr(dentry, mnt, key, NULL, 0);
-+      buflen = vfs_getxattr(dentry, mnt, key, NULL, 0, NULL);
-       if (buflen <= 0)
-               return buflen;
-@@ -433,7 +433,7 @@ static ssize_t nfsd_getxattr(struct dent
-       if (!*buf)
-               return -ENOMEM;
--      return vfs_getxattr(dentry, mnt, key, *buf, buflen);
-+      return vfs_getxattr(dentry, mnt, key, *buf, buflen, NULL);
- }
- #endif
-@@ -459,7 +459,7 @@ set_nfsv4_acl_one(struct dentry *dentry,
-               goto out;
-       }
--      error = vfs_setxattr(dentry, mnt, key, buf, len, 0);
-+      error = vfs_setxattr(dentry, mnt, key, buf, len, 0, NULL);
- out:
-       kfree(buf);
-       return error;
-@@ -2133,12 +2133,14 @@ nfsd_set_posix_acl(struct svc_fh *fhp, i
-       if (error)
-               goto getout;
-       if (size)
--              error = vfs_setxattr(fhp->fh_dentry, mnt, name, value, size,0);
-+              error = vfs_setxattr(fhp->fh_dentry, mnt, name, value, size, 0,
-+                                   NULL);
-       else {
-               if (!S_ISDIR(inode->i_mode) && type == ACL_TYPE_DEFAULT)
-                       error = 0;
-               else {
--                      error = vfs_removexattr(fhp->fh_dentry, mnt, name);
-+                      error = vfs_removexattr(fhp->fh_dentry, mnt, name,
-+                                              NULL);
-                       if (error == -ENODATA)
-                               error = 0;
-               }
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -623,7 +623,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd
-       if (mode == (mode_t) -1)
-               mode = inode->i_mode;
-       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
--      newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
-+      newattrs.ia_valid = ATTR_MODE | ATTR_CTIME | ATTR_FILE;
-       err = fnotify_change(dentry, file->f_path.mnt, &newattrs, file);
-       mutex_unlock(&inode->i_mutex);
-       mnt_drop_write(file->f_path.mnt);
-@@ -686,6 +686,9 @@ static int chown_common(struct dentry * 
-       if (!S_ISDIR(inode->i_mode))
-               newattrs.ia_valid |=
-                       ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
-+      if (file)
-+              newattrs.ia_valid |= ATTR_FILE;
-+
-       mutex_lock(&inode->i_mutex);
-       error = fnotify_change(dentry, mnt, &newattrs, file);
-       mutex_unlock(&inode->i_mutex);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fix-complain.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fix-complain.diff
deleted file mode 100644 (file)
index 85feac1..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: fix enforcement of deny rules in complain mode
-Patch-mainline: no
-References: bnc#426159
-
-Fix enforcement of deny rules so that they are not enforced in complain
-mode.  This is necessary so that application behavior is not changed by
-the presence of the deny rule.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- security/apparmor/main.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/security/apparmor/main.c
-+++ b/security/apparmor/main.c
-@@ -325,7 +325,7 @@ static int aa_audit_file(struct aa_profi
-       } else {
-               int mask = AUDIT_QUIET_MASK(sa->audit_mask);
--              if (!(sa->denied_mask & ~mask))
-+              if (!(sa->denied_mask & ~mask) && !PROFILE_COMPLAIN(profile))
-                       return sa->error_code;
-               /* mask off perms whose denial is being silenced */
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fix-deleted-leak.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fix-deleted-leak.diff
deleted file mode 100644 (file)
index f70fedc..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-From: John Johansen <jrjohansen@verizon.net>
-Subject: [PATCH] AppArmor: Fix leak of filename for deleted files
-
- This patch fixes a memory leak where the name doesn't get freed when
- a file has been deleted.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
----
- security/apparmor/main.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/security/apparmor/main.c
-+++ b/security/apparmor/main.c
-@@ -500,10 +500,10 @@ static char *aa_get_name(struct dentry *
-                       *buffer = buf;
-                       return name;
-               }
-+              kfree(buf);
-               if (PTR_ERR(name) != -ENAMETOOLONG)
-                       return name;
--              kfree(buf);
-               size <<= 1;
-               if (size > apparmor_path_max)
-                       return ERR_PTR(-ENAMETOOLONG);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fix-security-param.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fix-security-param.diff
deleted file mode 100644 (file)
index 8d03cbc..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: fix recognition of security= boot parameter
-Patch-mainline: no
-References: bnc#442668
-
-Fix AppArmor to respect the kernel boot parameter security=, so that if a
-different lsm is choosen apparmor does not try to register its lsm hooks.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- security/Kconfig        |    9 +++++++++
- security/apparmor/lsm.c |    5 +++--
- security/security.c     |    2 +-
- 3 files changed, 13 insertions(+), 3 deletions(-)
-
---- a/security/Kconfig
-+++ b/security/Kconfig
-@@ -51,6 +51,15 @@ config SECURITY
-         If you are unsure how to answer this question, answer N.
-+config SECURITY_DEFAULT
-+      string "Default security module"
-+      depends on SECURITY
-+      default ""
-+      help
-+          This determines the security module used if the security=
-+          boot parmater is not provided.  If a security module is not
-+          specified the first module to register will be used.
-+
- config SECURITY_NETWORK
-       bool "Socket and Networking Security Hooks"
-       depends on SECURITY
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -911,6 +911,7 @@ static int apparmor_task_setrlimit(unsig
- }
- struct security_operations apparmor_ops = {
-+      .name =                         "apparmor",
-       .ptrace_may_access =            apparmor_ptrace_may_access,
-       .ptrace_traceme =               apparmor_ptrace_traceme,
-       .capget =                       cap_capget,
-@@ -989,8 +990,8 @@ static int __init apparmor_init(void)
- {
-       int error;
--      if (!apparmor_enabled) {
--              info_message("AppArmor disabled by boottime parameter\n");
-+      if (!apparmor_enabled || !security_module_enable(&apparmor_ops)) {
-+              info_message("AppArmor disabled by boot time parameter\n");
-               return 0;
-       }
---- a/security/security.c
-+++ b/security/security.c
-@@ -18,7 +18,7 @@
- #include <linux/security.h>
- /* Boot-time LSM user choice */
--static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1];
-+static __initdata char chosen_lsm[SECURITY_NAME_MAX + 1] = CONFIG_SECURITY_DEFAULT;
- /* things that live in capability.c */
- extern struct security_operations default_security_ops;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fix-vfs_rmdir.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fix-vfs_rmdir.diff
deleted file mode 100644 (file)
index 141bc64..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: Call lsm hook before unhashing dentry in vfs_rmdir()
-
-If we unhash the dentry before calling the security_inode_rmdir hook,
-we cannot compute the file's pathname in the hook anymore. AppArmor
-needs to know the filename in order to decide whether a file may be
-deleted, though.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/namei.c |   13 +++++++------
- 1 file changed, 7 insertions(+), 6 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2177,6 +2177,10 @@ int vfs_rmdir(struct inode *dir, struct 
-       if (!dir->i_op || !dir->i_op->rmdir)
-               return -EPERM;
-+      error = security_inode_rmdir(dir, dentry, mnt);
-+      if (error)
-+              return error;
-+
-       DQUOT_INIT(dir);
-       mutex_lock(&dentry->d_inode->i_mutex);
-@@ -2184,12 +2188,9 @@ int vfs_rmdir(struct inode *dir, struct 
-       if (d_mountpoint(dentry))
-               error = -EBUSY;
-       else {
--              error = security_inode_rmdir(dir, dentry, mnt);
--              if (!error) {
--                      error = dir->i_op->rmdir(dir, dentry);
--                      if (!error)
--                              dentry->d_inode->i_flags |= S_DEAD;
--              }
-+              error = dir->i_op->rmdir(dir, dentry);
-+              if (!error)
-+                      dentry->d_inode->i_flags |= S_DEAD;
-       }
-       mutex_unlock(&dentry->d_inode->i_mutex);
-       if (!error) {
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fork-tracking.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fork-tracking.diff
deleted file mode 100644 (file)
index 49cbd88..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: fix log messages to enable tools profile learning
-Patch-mainline: no
-References: bnc#447564  
-
-The allocation of the child pid is done after the LSM clone hook, which
-breaks the AppArmor tools fork tracking, for profiles learning.  Output
-the parent pid with each log message to enable the tools to handle fork
-tracking.
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- security/apparmor/lsm.c              |   28 ----------------------------
- security/apparmor/main.c             |   10 +++++-----
- security/apparmor/module_interface.c |    2 +-
- 3 files changed, 6 insertions(+), 34 deletions(-)
-
---- a/security/apparmor/lsm.c
-+++ b/security/apparmor/lsm.c
-@@ -143,20 +143,6 @@ static int param_set_aa_enabled(const ch
-       return 0;
- }
--static int aa_reject_syscall(struct task_struct *task, gfp_t flags,
--                           const char *name)
--{
--      struct aa_profile *profile = aa_get_profile(task);
--      int error = 0;
--
--      if (profile) {
--              error = aa_audit_syscallreject(profile, flags, name);
--              aa_put_profile(profile);
--      }
--
--      return error;
--}
--
- static int apparmor_ptrace(struct task_struct *parent,
-                          struct task_struct *child)
- {
-@@ -292,17 +278,6 @@ static int apparmor_bprm_secureexec(stru
-       return ret;
- }
--static int apparmor_sb_mount(char *dev_name, struct path *path, char *type,
--                            unsigned long flags, void *data)
--{
--      return aa_reject_syscall(current, GFP_KERNEL, "mount");
--}
--
--static int apparmor_umount(struct vfsmount *mnt, int flags)
--{
--      return aa_reject_syscall(current, GFP_KERNEL, "umount");
--}
--
- static int apparmor_inode_mkdir(struct inode *dir, struct dentry *dentry,
-                               struct vfsmount *mnt, int mask)
- {
-@@ -925,9 +900,6 @@ struct security_operations apparmor_ops
-       .bprm_set_security =            apparmor_bprm_set_security,
-       .bprm_secureexec =              apparmor_bprm_secureexec,
--      .sb_mount =                     apparmor_sb_mount,
--      .sb_umount =                    apparmor_umount,
--
-       .inode_mkdir =                  apparmor_inode_mkdir,
-       .inode_rmdir =                  apparmor_inode_rmdir,
-       .inode_create =                 apparmor_inode_create,
---- a/security/apparmor/main.c
-+++ b/security/apparmor/main.c
-@@ -229,9 +229,13 @@ static int aa_audit_base(struct aa_profi
-               audit_log_format(ab, " protocol=%d", sa->protocol);
-       }
--        audit_log_format(ab, " pid=%d", current->pid);
-+      audit_log_format(ab, " pid=%d", current->pid);
-       if (profile) {
-+              if (!sa->parent)
-+                      audit_log_format(ab, " parent=%d",
-+                                       current->real_parent->pid);
-+
-               audit_log_format(ab, " profile=");
-               audit_log_untrustedstring(ab, profile->name);
-@@ -1006,10 +1010,6 @@ repeat:
-               unlock_profile(profile);
--              if (APPARMOR_COMPLAIN(child_cxt) &&
--                  profile == profile->ns->null_complain_profile) {
--                      aa_audit_hint(profile, &sa);
--              }
-               aa_put_profile(profile);
-       } else
-               aa_free_task_context(child_cxt);
---- a/security/apparmor/module_interface.c
-+++ b/security/apparmor/module_interface.c
-@@ -126,7 +126,7 @@ static int aa_is_nameX(struct aa_ext *e,
-        * AA_NAME tag value is a u16.
-        */
-       if (aa_is_X(e, AA_NAME)) {
--              char *tag;
-+              char *tag = NULL;
-               size_t size = aa_is_u16_chunk(e, &tag);
-               /* if a name is specified it must match. otherwise skip tag */
-               if (name && (!size || strcmp(name, tag)))
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-reintro-ATTR_FILE.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-reintro-ATTR_FILE.diff
deleted file mode 100644 (file)
index a5efdee..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From: John Johansen <jjohansen@suse.de>
-Subject: AppArmor: reintroduce ATTR_FILE
-
-The fsetattr patch removed ATTR_FILE but AppArmor needs it to distinguish
-file based writes.
-
-Note: Now that LSMs must be static, it would be better to add a file
-pointer argument to security_operations->inode_setattr() instead. Then
-move the fs.h chunk to patches.apparmor/fsetattr-restore-ia_file. -jeffm
-
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/open.c |    3 +++
- 1 file changed, 3 insertions(+)
-
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -208,6 +208,9 @@ int do_truncate(struct dentry *dentry, s
-       newattrs.ia_size = length;
-       newattrs.ia_valid = ATTR_SIZE | time_attrs;
-+      if (filp)
-+              newattrs.ia_valid |= ATTR_FILE;
-+
-       /* Remove suid/sgid on truncate too */
-       newattrs.ia_valid |= should_remove_suid(dentry);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-restore-ia_file.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr-restore-ia_file.diff
deleted file mode 100644 (file)
index 5e5bd12..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH] vfs: restore ia_file for compatibility with external modules
-References: bnc#381259
-
- patches.apparmor/fsetattr.diff eliminated ia_file and ATTR_FILE in favor
- of providing a ->fsetattr call that used a file pointer. Until this
- patch is accepted into mainline, this patch provides the backward
- compatibility for external file system modules.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
----
- fs/attr.c          |   13 ++++++++++++-
- include/linux/fs.h |   11 +++++++++++
- 2 files changed, 23 insertions(+), 1 deletion(-)
-
---- a/fs/attr.c
-+++ b/fs/attr.c
-@@ -168,8 +168,19 @@ int fnotify_change(struct dentry *dentry
-               if (!error) {
-                       if (file && file->f_op && file->f_op->fsetattr)
-                               error = file->f_op->fsetattr(file, attr);
--                      else
-+                      else {
-+                              /* External file system still expect to be
-+                               * passed a file pointer via ia_file and
-+                               * have it announced via ATTR_FILE. This
-+                               * just makes it so they don't need to
-+                               * change their API just for us. External
-+                               * callers will have set these themselves. */
-+                              if (file) {
-+                                      attr->ia_valid |= ATTR_FILE;
-+                                      attr->ia_file = file;
-+                              }
-                               error = inode->i_op->setattr(dentry, attr);
-+                      }
-               }
-       } else {
-               error = inode_change_ok(inode, attr);
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -367,6 +367,17 @@ struct iattr {
-       struct timespec ia_atime;
-       struct timespec ia_mtime;
-       struct timespec ia_ctime;
-+
-+      /*
-+       * Not an attribute, but an auxilary info for filesystems wanting to
-+       * implement an ftruncate() like method.  NOTE: filesystem should
-+       * check for (ia_valid & ATTR_FILE), and not for (ia_file != NULL).
-+       *
-+       * NOTE: With patches.apparmor/fsetattr.diff applied, this is
-+       * for compatibility with external file system modules only. There
-+       * should not be any in-kernel users left.
-+       */
-+      struct file     *ia_file;
- };
- /*
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/fsetattr.diff
deleted file mode 100644 (file)
index ba01f3f..0000000
+++ /dev/null
@@ -1,414 +0,0 @@
-Subject: VFS: new fsetattr() file operation
-
-From: Miklos Szeredi <mszeredi@suse.cz>
-
-Add a new file operation: f_op->fsetattr(), that is invoked by
-ftruncate, fchmod, fchown and utimensat.  Fall back to i_op->setattr()
-if it is not defined.
-
-For the reasons why we need this, see patch adding fgetattr().
-
-ftruncate() already passed the open file to the filesystem via the
-ia_file member of struct iattr.  However it is cleaner to have a
-separate file operation for this, so remove ia_file, ATTR_FILE and
-convert existing users: fuse and AFS.
-
-Signed-off-by: Miklos Szeredi <mszeredi@suse.cz> ---
-Signed-off-by: John Johansen <jjohansen@suse.de> ---
-
----
- fs/afs/dir.c       |    1 +
- fs/afs/file.c      |    1 +
- fs/afs/inode.c     |   19 +++++++++++++++----
- fs/afs/internal.h  |    1 +
- fs/attr.c          |   19 +++++++++++++++----
- fs/fuse/dir.c      |   20 +++++++++-----------
- fs/fuse/file.c     |    7 +++++++
- fs/fuse/fuse_i.h   |    4 ++++
- fs/open.c          |   20 ++++++++------------
- fs/utimes.c        |    9 +++++----
- include/linux/fs.h |    9 ++-------
- 11 files changed, 68 insertions(+), 42 deletions(-)
-
---- a/fs/afs/dir.c
-+++ b/fs/afs/dir.c
-@@ -45,6 +45,7 @@ const struct file_operations afs_dir_fil
-       .release        = afs_release,
-       .readdir        = afs_readdir,
-       .lock           = afs_lock,
-+      .fsetattr       = afs_fsetattr,
- };
- const struct inode_operations afs_dir_inode_operations = {
---- a/fs/afs/file.c
-+++ b/fs/afs/file.c
-@@ -36,6 +36,7 @@ const struct file_operations afs_file_op
-       .fsync          = afs_fsync,
-       .lock           = afs_lock,
-       .flock          = afs_flock,
-+      .fsetattr       = afs_fsetattr,
- };
- const struct inode_operations afs_file_inode_operations = {
---- a/fs/afs/inode.c
-+++ b/fs/afs/inode.c
-@@ -358,7 +358,8 @@ void afs_clear_inode(struct inode *inode
- /*
-  * set the attributes of an inode
-  */
--int afs_setattr(struct dentry *dentry, struct iattr *attr)
-+static int afs_do_setattr(struct dentry *dentry, struct iattr *attr,
-+                 struct file *file)
- {
-       struct afs_vnode *vnode = AFS_FS_I(dentry->d_inode);
-       struct key *key;
-@@ -380,8 +381,8 @@ int afs_setattr(struct dentry *dentry, s
-               afs_writeback_all(vnode);
-       }
--      if (attr->ia_valid & ATTR_FILE) {
--              key = attr->ia_file->private_data;
-+      if (file) {
-+              key = file->private_data;
-       } else {
-               key = afs_request_key(vnode->volume->cell);
-               if (IS_ERR(key)) {
-@@ -391,10 +392,20 @@ int afs_setattr(struct dentry *dentry, s
-       }
-       ret = afs_vnode_setattr(vnode, key, attr);
--      if (!(attr->ia_valid & ATTR_FILE))
-+      if (!file)
-               key_put(key);
- error:
-       _leave(" = %d", ret);
-       return ret;
- }
-+
-+int afs_setattr(struct dentry *dentry, struct iattr *attr)
-+{
-+      return afs_do_setattr(dentry, attr, NULL);
-+}
-+
-+int afs_fsetattr(struct file *file, struct iattr *attr)
-+{
-+      return afs_do_setattr(file->f_path.dentry, attr, file);
-+}
---- a/fs/afs/internal.h
-+++ b/fs/afs/internal.h
-@@ -548,6 +548,7 @@ extern void afs_zap_data(struct afs_vnod
- extern int afs_validate(struct afs_vnode *, struct key *);
- extern int afs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
- extern int afs_setattr(struct dentry *, struct iattr *);
-+extern int afs_fsetattr(struct file *, struct iattr *);
- extern void afs_clear_inode(struct inode *);
- /*
---- a/fs/attr.c
-+++ b/fs/attr.c
-@@ -100,8 +100,8 @@ int inode_setattr(struct inode * inode,
- }
- EXPORT_SYMBOL(inode_setattr);
--int notify_change(struct dentry *dentry, struct vfsmount *mnt,
--                struct iattr *attr)
-+int fnotify_change(struct dentry *dentry, struct vfsmount *mnt,
-+                 struct iattr *attr, struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       mode_t mode = inode->i_mode;
-@@ -165,8 +165,12 @@ int notify_change(struct dentry *dentry,
-       if (inode->i_op && inode->i_op->setattr) {
-               error = security_inode_setattr(dentry, mnt, attr);
--              if (!error)
--                      error = inode->i_op->setattr(dentry, attr);
-+              if (!error) {
-+                      if (file && file->f_op && file->f_op->fsetattr)
-+                              error = file->f_op->fsetattr(file, attr);
-+                      else
-+                              error = inode->i_op->setattr(dentry, attr);
-+              }
-       } else {
-               error = inode_change_ok(inode, attr);
-               if (!error)
-@@ -188,5 +192,12 @@ int notify_change(struct dentry *dentry,
-       return error;
- }
-+EXPORT_SYMBOL_GPL(fnotify_change);
-+
-+int notify_change(struct dentry *dentry, struct vfsmount *mnt,
-+                struct iattr *attr)
-+{
-+      return fnotify_change(dentry, mnt, attr, NULL);
-+}
- EXPORT_SYMBOL(notify_change);
---- a/fs/fuse/dir.c
-+++ b/fs/fuse/dir.c
-@@ -1105,21 +1105,22 @@ static int fuse_dir_fsync(struct file *f
-       return file ? fuse_fsync_common(file, de, datasync, 1) : 0;
- }
--static bool update_mtime(unsigned ivalid)
-+static bool update_mtime(unsigned ivalid, bool have_file)
- {
-       /* Always update if mtime is explicitly set  */
-       if (ivalid & ATTR_MTIME_SET)
-               return true;
-       /* If it's an open(O_TRUNC) or an ftruncate(), don't update */
--      if ((ivalid & ATTR_SIZE) && (ivalid & (ATTR_OPEN | ATTR_FILE)))
-+      if ((ivalid & ATTR_SIZE) && ((ivalid & ATTR_OPEN) || have_file))
-               return false;
-       /* In all other cases update */
-       return true;
- }
--static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg)
-+static void iattr_to_fattr(struct iattr *iattr, struct fuse_setattr_in *arg,
-+                         bool have_file)
- {
-       unsigned ivalid = iattr->ia_valid;
-@@ -1138,7 +1139,7 @@ static void iattr_to_fattr(struct iattr
-               if (!(ivalid & ATTR_ATIME_SET))
-                       arg->valid |= FATTR_ATIME_NOW;
-       }
--      if ((ivalid & ATTR_MTIME) && update_mtime(ivalid)) {
-+      if ((ivalid & ATTR_MTIME) && update_mtime(ivalid, have_file)) {
-               arg->valid |= FATTR_MTIME;
-               arg->mtime = iattr->ia_mtime.tv_sec;
-               arg->mtimensec = iattr->ia_mtime.tv_nsec;
-@@ -1199,8 +1200,8 @@ void fuse_release_nowrite(struct inode *
-  * vmtruncate() doesn't allow for this case, so do the rlimit checking
-  * and the actual truncation by hand.
-  */
--static int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
--                         struct file *file)
-+int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
-+                  struct file *file)
- {
-       struct inode *inode = entry->d_inode;
-       struct fuse_conn *fc = get_fuse_conn(inode);
-@@ -1244,7 +1245,7 @@ static int fuse_do_setattr(struct dentry
-       memset(&inarg, 0, sizeof(inarg));
-       memset(&outarg, 0, sizeof(outarg));
--      iattr_to_fattr(attr, &inarg);
-+      iattr_to_fattr(attr, &inarg, file != NULL);
-       if (file) {
-               struct fuse_file *ff = file->private_data;
-               inarg.valid |= FATTR_FH;
-@@ -1314,10 +1315,7 @@ error:
- static int fuse_setattr(struct dentry *entry, struct iattr *attr)
- {
--      if (attr->ia_valid & ATTR_FILE)
--              return fuse_do_setattr(entry, attr, attr->ia_file);
--      else
--              return fuse_do_setattr(entry, attr, NULL);
-+      return fuse_do_setattr(entry, attr, NULL);
- }
- static int fuse_getattr(struct vfsmount *mnt, struct dentry *entry,
---- a/fs/fuse/file.c
-+++ b/fs/fuse/file.c
-@@ -1467,6 +1467,11 @@ static loff_t fuse_file_llseek(struct fi
-       return retval;
- }
-+static int fuse_fsetattr(struct file *file, struct iattr *attr)
-+{
-+      return fuse_do_setattr(file->f_path.dentry, attr, file);
-+}
-+
- static const struct file_operations fuse_file_operations = {
-       .llseek         = fuse_file_llseek,
-       .read           = do_sync_read,
-@@ -1480,6 +1485,7 @@ static const struct file_operations fuse
-       .fsync          = fuse_fsync,
-       .lock           = fuse_file_lock,
-       .flock          = fuse_file_flock,
-+      .fsetattr       = fuse_fsetattr,
-       .splice_read    = generic_file_splice_read,
- };
-@@ -1493,6 +1499,7 @@ static const struct file_operations fuse
-       .fsync          = fuse_fsync,
-       .lock           = fuse_file_lock,
-       .flock          = fuse_file_flock,
-+      .fsetattr       = fuse_fsetattr,
-       /* no mmap and splice_read */
- };
---- a/fs/fuse/fuse_i.h
-+++ b/fs/fuse/fuse_i.h
-@@ -551,6 +551,10 @@ void fuse_truncate(struct address_space
-  */
- int fuse_dev_init(void);
-+
-+int fuse_do_setattr(struct dentry *entry, struct iattr *attr,
-+                  struct file *file);
-+
- /**
-  * Cleanup the client device
-  */
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -207,16 +207,12 @@ int do_truncate(struct dentry *dentry, s
-       newattrs.ia_size = length;
-       newattrs.ia_valid = ATTR_SIZE | time_attrs;
--      if (filp) {
--              newattrs.ia_file = filp;
--              newattrs.ia_valid |= ATTR_FILE;
--      }
-       /* Remove suid/sgid on truncate too */
-       newattrs.ia_valid |= should_remove_suid(dentry);
-       mutex_lock(&dentry->d_inode->i_mutex);
--      err = notify_change(dentry, mnt, &newattrs);
-+      err = fnotify_change(dentry, mnt, &newattrs, filp);
-       mutex_unlock(&dentry->d_inode->i_mutex);
-       return err;
- }
-@@ -625,7 +621,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd
-               mode = inode->i_mode;
-       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
-       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--      err = notify_change(dentry, file->f_path.mnt, &newattrs);
-+      err = fnotify_change(dentry, file->f_path.mnt, &newattrs, file);
-       mutex_unlock(&inode->i_mutex);
-       mnt_drop_write(file->f_path.mnt);
- out_putf:
-@@ -669,7 +665,7 @@ SYSCALL_DEFINE2(chmod, const char __user
- }
- static int chown_common(struct dentry * dentry, struct vfsmount *mnt,
--                      uid_t user, gid_t group)
-+                      uid_t user, gid_t group, struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -688,7 +684,7 @@ static int chown_common(struct dentry *
-               newattrs.ia_valid |=
-                       ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
-       mutex_lock(&inode->i_mutex);
--      error = notify_change(dentry, mnt, &newattrs);
-+      error = fnotify_change(dentry, mnt, &newattrs, file);
-       mutex_unlock(&inode->i_mutex);
-       return error;
-@@ -705,7 +701,7 @@ SYSCALL_DEFINE3(chown, const char __user
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, path.mnt, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group, NULL);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -730,7 +726,7 @@ SYSCALL_DEFINE5(fchownat, int, dfd, cons
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, path.mnt, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group, NULL);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -749,7 +745,7 @@ SYSCALL_DEFINE3(lchown, const char __use
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, path.mnt, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group, NULL);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -772,7 +768,7 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd
-               goto out_fput;
-       dentry = file->f_path.dentry;
-       audit_inode(NULL, dentry);
--      error = chown_common(dentry, file->f_path.mnt, user, group);
-+      error = chown_common(dentry, file->f_path.mnt, user, group, file);
-       mnt_drop_write(file->f_path.mnt);
- out_fput:
-       fput(file);
---- a/fs/utimes.c
-+++ b/fs/utimes.c
-@@ -48,7 +48,8 @@ static bool nsec_valid(long nsec)
-       return nsec >= 0 && nsec <= 999999999;
- }
--static int utimes_common(struct path *path, struct timespec *times)
-+static int utimes_common(struct path *path, struct timespec *times,
-+                       struct file *f)
- {
-       int error;
-       struct iattr newattrs;
-@@ -102,7 +103,7 @@ static int utimes_common(struct path *pa
-               }
-       }
-       mutex_lock(&inode->i_mutex);
--      error = notify_change(path->dentry, path->mnt, &newattrs);
-+      error = fnotify_change(path->dentry, path->mnt, &newattrs, f);
-       mutex_unlock(&inode->i_mutex);
- mnt_drop_write_and_out:
-@@ -149,7 +150,7 @@ long do_utimes(int dfd, char __user *fil
-               if (!file)
-                       goto out;
--              error = utimes_common(&file->f_path, times);
-+              error = utimes_common(&file->f_path, times, file);
-               fput(file);
-       } else {
-               struct path path;
-@@ -162,7 +163,7 @@ long do_utimes(int dfd, char __user *fil
-               if (error)
-                       goto out;
--              error = utimes_common(&path, times);
-+              error = utimes_common(&path, times, NULL);
-               path_put(&path);
-       }
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -367,13 +367,6 @@ struct iattr {
-       struct timespec ia_atime;
-       struct timespec ia_mtime;
-       struct timespec ia_ctime;
--
--      /*
--       * Not an attribute, but an auxilary info for filesystems wanting to
--       * implement an ftruncate() like method.  NOTE: filesystem should
--       * check for (ia_valid & ATTR_FILE), and not for (ia_file != NULL).
--       */
--      struct file     *ia_file;
- };
- /*
-@@ -1280,6 +1273,7 @@ struct file_operations {
- #define HAVE_FOP_OPEN_EXEC
-       int (*open_exec) (struct inode *);
-       int (*setlease)(struct file *, long, struct file_lock **);
-+      int (*fsetattr)(struct file *, struct iattr *);
- };
- struct inode_operations {
-@@ -1799,6 +1793,7 @@ extern int do_remount_sb(struct super_bl
- extern sector_t bmap(struct inode *, sector_t);
- #endif
- extern int notify_change(struct dentry *, struct vfsmount *, struct iattr *);
-+extern int fnotify_change(struct dentry *, struct vfsmount *, struct iattr *, struct file *);
- extern int inode_permission(struct inode *, int);
- extern int generic_permission(struct inode *, int,
-               int (*check_acl)(struct inode *, int));
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/remove_suid.diff b/src/patches/suse-2.6.27.31/patches.apparmor/remove_suid.diff
deleted file mode 100644 (file)
index 9c639fa..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Pass struct path down to remove_suid and children
-
-Required by a later patch that adds a struct vfsmount parameter to
-notify_change().
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
-
- mm/filemap.c |    6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/mm/filemap.c
-+++ b/mm/filemap.c
-@@ -1826,12 +1826,12 @@ int should_remove_suid(struct dentry *de
- }
- EXPORT_SYMBOL(should_remove_suid);
--static int __remove_suid(struct dentry *dentry, int kill)
-+static int __remove_suid(struct path *path, int kill)
- {
-       struct iattr newattrs;
-       newattrs.ia_valid = ATTR_FORCE | kill;
--      return notify_change(dentry, &newattrs);
-+      return notify_change(path->dentry, &newattrs);
- }
- int file_remove_suid(struct file *file)
-@@ -1846,7 +1846,7 @@ int file_remove_suid(struct file *file)
-       if (killpriv)
-               error = security_inode_killpriv(dentry);
-       if (!error && killsuid)
--              error = __remove_suid(dentry, killsuid);
-+              error = __remove_suid(&file->f_path, killsuid);
-       return error;
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-create.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-create.diff
deleted file mode 100644 (file)
index 9d16017..0000000
+++ /dev/null
@@ -1,107 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_create LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c               |    2 +-
- include/linux/security.h |    9 ++++++---
- security/capability.c    |    2 +-
- security/security.c      |    5 +++--
- security/selinux/hooks.c |    3 ++-
- 5 files changed, 13 insertions(+), 8 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1543,7 +1543,7 @@ int vfs_create(struct inode *dir, struct
-               return -EACCES; /* shouldn't it be ENOSYS? */
-       mode &= S_IALLUGO;
-       mode |= S_IFREG;
--      error = security_inode_create(dir, dentry, mode);
-+      error = security_inode_create(dir, dentry, nd ? nd->path.mnt : NULL, mode);
-       if (error)
-               return error;
-       DQUOT_INIT(dir);
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -337,6 +337,7 @@ static inline void security_free_mnt_opt
-  *    Check permission to create a regular file.
-  *    @dir contains inode structure of the parent of the new file.
-  *    @dentry contains the dentry structure for the file to be created.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    @mode contains the file mode of the file to be created.
-  *    Return 0 if permission is granted.
-  * @inode_link:
-@@ -1354,8 +1355,8 @@ struct security_operations {
-       void (*inode_free_security) (struct inode *inode);
-       int (*inode_init_security) (struct inode *inode, struct inode *dir,
-                                   char **name, void **value, size_t *len);
--      int (*inode_create) (struct inode *dir,
--                           struct dentry *dentry, int mode);
-+      int (*inode_create) (struct inode *dir, struct dentry *dentry,
-+                           struct vfsmount *mnt, int mode);
-       int (*inode_link) (struct dentry *old_dentry,
-                          struct inode *dir, struct dentry *new_dentry);
-       int (*inode_unlink) (struct inode *dir, struct dentry *dentry);
-@@ -1622,7 +1623,8 @@ int security_inode_alloc(struct inode *i
- void security_inode_free(struct inode *inode);
- int security_inode_init_security(struct inode *inode, struct inode *dir,
-                                 char **name, void **value, size_t *len);
--int security_inode_create(struct inode *dir, struct dentry *dentry, int mode);
-+int security_inode_create(struct inode *dir, struct dentry *dentry,
-+                        struct vfsmount *mnt, int mode);
- int security_inode_link(struct dentry *old_dentry, struct inode *dir,
-                        struct dentry *new_dentry);
- int security_inode_unlink(struct inode *dir, struct dentry *dentry);
-@@ -1968,6 +1970,7 @@ static inline int security_inode_init_se
- static inline int security_inode_create(struct inode *dir,
-                                        struct dentry *dentry,
-+                                       struct vfsmount *mnt,
-                                        int mode)
- {
-       return 0;
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -155,7 +155,7 @@ static int cap_inode_init_security(struc
- }
- static int cap_inode_create(struct inode *inode, struct dentry *dentry,
--                          int mask)
-+                          struct vfsmount *mnt, int mask)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -355,11 +355,12 @@ int security_inode_init_security(struct
- }
- EXPORT_SYMBOL(security_inode_init_security);
--int security_inode_create(struct inode *dir, struct dentry *dentry, int mode)
-+int security_inode_create(struct inode *dir, struct dentry *dentry,
-+                        struct vfsmount *mnt, int mode)
- {
-       if (unlikely(IS_PRIVATE(dir)))
-               return 0;
--      return security_ops->inode_create(dir, dentry, mode);
-+      return security_ops->inode_create(dir, dentry, mnt, mode);
- }
- int security_inode_link(struct dentry *old_dentry, struct inode *dir,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2566,7 +2566,8 @@ static int selinux_inode_init_security(s
-       return 0;
- }
--static int selinux_inode_create(struct inode *dir, struct dentry *dentry, int mask)
-+static int selinux_inode_create(struct inode *dir, struct dentry *dentry,
-+                               struct vfsmount *mnt, int mask)
- {
-       return may_create(dir, dentry, SECCLASS_FILE);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-getxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-getxattr.diff
deleted file mode 100644 (file)
index 0e98d57..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_getxattr LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c                 |    2 +-
- include/linux/security.h   |   11 +++++++----
- security/capability.c      |    3 ++-
- security/security.c        |    5 +++--
- security/selinux/hooks.c   |    3 ++-
- security/smack/smack_lsm.c |    4 +++-
- 6 files changed, 18 insertions(+), 10 deletions(-)
-
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -141,7 +141,7 @@ vfs_getxattr(struct dentry *dentry, stru
-       if (error)
-               return error;
--      error = security_inode_getxattr(dentry, name);
-+      error = security_inode_getxattr(dentry, mnt, name);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -446,7 +446,7 @@ static inline void security_free_mnt_opt
-  *    @value identified by @name for @dentry and @mnt.
-  * @inode_getxattr:
-  *    Check permission before obtaining the extended attributes
-- *    identified by @name for @dentry.
-+ *    identified by @name for @dentry and @mnt.
-  *    Return 0 if permission is granted.
-  * @inode_listxattr:
-  *    Check permission before obtaining the list of extended attribute
-@@ -1400,7 +1400,8 @@ struct security_operations {
-                                    struct vfsmount *mnt,
-                                    const char *name, const void *value,
-                                    size_t size, int flags);
--      int (*inode_getxattr) (struct dentry *dentry, const char *name);
-+      int (*inode_getxattr) (struct dentry *dentry, struct vfsmount *mnt,
-+                             const char *name);
-       int (*inode_listxattr) (struct dentry *dentry);
-       int (*inode_removexattr) (struct dentry *dentry, const char *name);
-       int (*inode_need_killpriv) (struct dentry *dentry);
-@@ -1676,7 +1677,8 @@ int security_inode_setxattr(struct dentr
- void security_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                                 const char *name, const void *value,
-                                 size_t size, int flags);
--int security_inode_getxattr(struct dentry *dentry, const char *name);
-+int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                          const char *name);
- int security_inode_listxattr(struct dentry *dentry);
- int security_inode_removexattr(struct dentry *dentry, const char *name);
- int security_inode_need_killpriv(struct dentry *dentry);
-@@ -2113,7 +2115,8 @@ static inline void security_inode_post_s
- { }
- static inline int security_inode_getxattr(struct dentry *dentry,
--                      const char *name)
-+                                        struct vfsmount *mnt,
-+                                        const char *name)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -241,7 +241,8 @@ static void cap_inode_post_setxattr(stru
- {
- }
--static int cap_inode_getxattr(struct dentry *dentry, const char *name)
-+static int cap_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                            const char *name)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -488,11 +488,12 @@ void security_inode_post_setxattr(struct
-                                         flags);
- }
--int security_inode_getxattr(struct dentry *dentry, const char *name)
-+int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                          const char *name)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_getxattr(dentry, name);
-+      return security_ops->inode_getxattr(dentry, mnt, name);
- }
- int security_inode_listxattr(struct dentry *dentry)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2796,7 +2796,8 @@ static void selinux_inode_post_setxattr(
-       return;
- }
--static int selinux_inode_getxattr(struct dentry *dentry, const char *name)
-+static int selinux_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                const char *name)
- {
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -673,11 +673,13 @@ static void smack_inode_post_setxattr(st
- /*
-  * smack_inode_getxattr - Smack check on getxattr
-  * @dentry: the object
-+ * @mnt: unused
-  * @name: unused
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
--static int smack_inode_getxattr(struct dentry *dentry, const char *name)
-+static int smack_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                              const char *name)
- {
-       return smk_curacc(smk_of_inode(dentry->d_inode), MAY_READ);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-link.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-link.diff
deleted file mode 100644 (file)
index b43e1e6..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass the struct vfsmounts to the inode_link LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c                 |    3 ++-
- include/linux/security.h   |   18 ++++++++++++------
- security/capability.c      |    5 +++--
- security/security.c        |    8 +++++---
- security/selinux/hooks.c   |    9 +++++++--
- security/smack/smack_lsm.c |    5 +++--
- 6 files changed, 32 insertions(+), 16 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2437,7 +2437,8 @@ int vfs_link(struct dentry *old_dentry,
-       if (S_ISDIR(inode->i_mode))
-               return -EPERM;
--      error = security_inode_link(old_dentry, dir, new_dentry);
-+      error = security_inode_link(old_dentry, old_mnt, dir, new_dentry,
-+                                  new_mnt);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -343,8 +343,10 @@ static inline void security_free_mnt_opt
-  * @inode_link:
-  *    Check permission before creating a new hard link to a file.
-  *    @old_dentry contains the dentry structure for an existing link to the file.
-+ *    @old_mnt is the vfsmount corresponding to @old_dentry (may be NULL).
-  *    @dir contains the inode structure of the parent directory of the new link.
-  *    @new_dentry contains the dentry structure for the new link.
-+ *    @new_mnt is the vfsmount corresponding to @new_dentry (may be NULL).
-  *    Return 0 if permission is granted.
-  * @inode_unlink:
-  *    Check the permission to remove a hard link to a file.
-@@ -1362,8 +1364,9 @@ struct security_operations {
-                                   char **name, void **value, size_t *len);
-       int (*inode_create) (struct inode *dir, struct dentry *dentry,
-                            struct vfsmount *mnt, int mode);
--      int (*inode_link) (struct dentry *old_dentry,
--                         struct inode *dir, struct dentry *new_dentry);
-+      int (*inode_link) (struct dentry *old_dentry, struct vfsmount *old_mnt,
-+                         struct inode *dir, struct dentry *new_dentry,
-+                         struct vfsmount *new_mnt);
-       int (*inode_unlink) (struct inode *dir, struct dentry *dentry);
-       int (*inode_symlink) (struct inode *dir, struct dentry *dentry,
-                             struct vfsmount *mnt, const char *old_name);
-@@ -1632,8 +1635,9 @@ int security_inode_init_security(struct
-                                 char **name, void **value, size_t *len);
- int security_inode_create(struct inode *dir, struct dentry *dentry,
-                         struct vfsmount *mnt, int mode);
--int security_inode_link(struct dentry *old_dentry, struct inode *dir,
--                       struct dentry *new_dentry);
-+int security_inode_link(struct dentry *old_dentry, struct vfsmount *old_mnt,
-+                      struct inode *dir, struct dentry *new_dentry,
-+                      struct vfsmount *new_mnt);
- int security_inode_unlink(struct inode *dir, struct dentry *dentry);
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
-                          struct vfsmount *mnt, const char *old_name);
-@@ -1987,8 +1991,10 @@ static inline int security_inode_create(
- }
- static inline int security_inode_link(struct dentry *old_dentry,
--                                     struct inode *dir,
--                                     struct dentry *new_dentry)
-+                                    struct vfsmount *old_mnt,
-+                                    struct inode *dir,
-+                                    struct dentry *new_dentry,
-+                                    struct vfsmount *new_mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -160,8 +160,9 @@ static int cap_inode_create(struct inode
-       return 0;
- }
--static int cap_inode_link(struct dentry *old_dentry, struct inode *inode,
--                        struct dentry *new_dentry)
-+static int cap_inode_link(struct dentry *old_dentry, struct vfsmount *old_mnt,
-+                        struct inode *inode,
-+                        struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -363,12 +363,14 @@ int security_inode_create(struct inode *
-       return security_ops->inode_create(dir, dentry, mnt, mode);
- }
--int security_inode_link(struct dentry *old_dentry, struct inode *dir,
--                       struct dentry *new_dentry)
-+int security_inode_link(struct dentry *old_dentry, struct vfsmount *old_mnt,
-+                      struct inode *dir, struct dentry *new_dentry,
-+                      struct vfsmount *new_mnt)
- {
-       if (unlikely(IS_PRIVATE(old_dentry->d_inode)))
-               return 0;
--      return security_ops->inode_link(old_dentry, dir, new_dentry);
-+      return security_ops->inode_link(old_dentry, old_mnt, dir,
-+                                       new_dentry, new_mnt);
- }
- int security_inode_unlink(struct inode *dir, struct dentry *dentry)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2572,11 +2572,16 @@ static int selinux_inode_create(struct i
-       return may_create(dir, dentry, SECCLASS_FILE);
- }
--static int selinux_inode_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
-+static int selinux_inode_link(struct dentry *old_dentry,
-+                            struct vfsmount *old_mnt,
-+                            struct inode *dir,
-+                            struct dentry *new_dentry,
-+                            struct vfsmount *new_mnt)
- {
-       int rc;
--      rc = secondary_ops->inode_link(old_dentry, dir, new_dentry);
-+      rc = secondary_ops->inode_link(old_dentry, old_mnt, dir, new_dentry,
-+                                     new_mnt);
-       if (rc)
-               return rc;
-       return may_link(dir, old_dentry, MAY_LINK);
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -432,8 +432,9 @@ static int smack_inode_init_security(str
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
--static int smack_inode_link(struct dentry *old_dentry, struct inode *dir,
--                          struct dentry *new_dentry)
-+static int smack_inode_link(struct dentry *old_dentry, struct vfsmount *old_mnt,
-+                          struct inode *dir,
-+                          struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       int rc;
-       char *isp;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-listxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-listxattr.diff
deleted file mode 100644 (file)
index 5c7e1d5..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_listxattr LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c               |    2 +-
- include/linux/security.h |    9 +++++----
- security/capability.c    |    2 +-
- security/security.c      |    4 ++--
- security/selinux/hooks.c |    2 +-
- 5 files changed, 10 insertions(+), 9 deletions(-)
-
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -174,7 +174,7 @@ vfs_listxattr(struct dentry *dentry, str
-       struct inode *inode = dentry->d_inode;
-       ssize_t error;
--      error = security_inode_listxattr(dentry);
-+      error = security_inode_listxattr(dentry, mnt);
-       if (error)
-               return error;
-       error = -EOPNOTSUPP;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -450,7 +450,7 @@ static inline void security_free_mnt_opt
-  *    Return 0 if permission is granted.
-  * @inode_listxattr:
-  *    Check permission before obtaining the list of extended attribute
-- *    names for @dentry.
-+ *    names for @dentry and @mnt.
-  *    Return 0 if permission is granted.
-  * @inode_removexattr:
-  *    Check permission before removing the extended attribute
-@@ -1402,7 +1402,7 @@ struct security_operations {
-                                    size_t size, int flags);
-       int (*inode_getxattr) (struct dentry *dentry, struct vfsmount *mnt,
-                              const char *name);
--      int (*inode_listxattr) (struct dentry *dentry);
-+      int (*inode_listxattr) (struct dentry *dentry, struct vfsmount *mnt);
-       int (*inode_removexattr) (struct dentry *dentry, const char *name);
-       int (*inode_need_killpriv) (struct dentry *dentry);
-       int (*inode_killpriv) (struct dentry *dentry);
-@@ -1679,7 +1679,7 @@ void security_inode_post_setxattr(struct
-                                 size_t size, int flags);
- int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-                           const char *name);
--int security_inode_listxattr(struct dentry *dentry);
-+int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt);
- int security_inode_removexattr(struct dentry *dentry, const char *name);
- int security_inode_need_killpriv(struct dentry *dentry);
- int security_inode_killpriv(struct dentry *dentry);
-@@ -2121,7 +2121,8 @@ static inline int security_inode_getxatt
-       return 0;
- }
--static inline int security_inode_listxattr(struct dentry *dentry)
-+static inline int security_inode_listxattr(struct dentry *dentry,
-+                                         struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -247,7 +247,7 @@ static int cap_inode_getxattr(struct den
-       return 0;
- }
--static int cap_inode_listxattr(struct dentry *dentry)
-+static int cap_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -496,11 +496,11 @@ int security_inode_getxattr(struct dentr
-       return security_ops->inode_getxattr(dentry, mnt, name);
- }
--int security_inode_listxattr(struct dentry *dentry)
-+int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_listxattr(dentry);
-+      return security_ops->inode_listxattr(dentry, mnt);
- }
- int security_inode_removexattr(struct dentry *dentry, const char *name)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2802,7 +2802,7 @@ static int selinux_inode_getxattr(struct
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
--static int selinux_inode_listxattr(struct dentry *dentry)
-+static int selinux_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
- {
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-mkdir.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-mkdir.diff
deleted file mode 100644 (file)
index deed6a0..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_mkdir LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c               |    2 +-
- include/linux/security.h |    8 ++++++--
- security/capability.c    |    2 +-
- security/security.c      |    5 +++--
- security/selinux/hooks.c |    3 ++-
- 5 files changed, 13 insertions(+), 7 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2089,7 +2089,7 @@ int vfs_mkdir(struct inode *dir, struct
-               return -EPERM;
-       mode &= (S_IRWXUGO|S_ISVTX);
--      error = security_inode_mkdir(dir, dentry, mode);
-+      error = security_inode_mkdir(dir, dentry, mnt, mode);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -362,6 +362,7 @@ static inline void security_free_mnt_opt
-  *    associated with inode strcture @dir.
-  *    @dir containst the inode structure of parent of the directory to be created.
-  *    @dentry contains the dentry structure of new directory.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    @mode contains the mode of new directory.
-  *    Return 0 if permission is granted.
-  * @inode_rmdir:
-@@ -1363,7 +1364,8 @@ struct security_operations {
-       int (*inode_unlink) (struct inode *dir, struct dentry *dentry);
-       int (*inode_symlink) (struct inode *dir,
-                             struct dentry *dentry, const char *old_name);
--      int (*inode_mkdir) (struct inode *dir, struct dentry *dentry, int mode);
-+      int (*inode_mkdir) (struct inode *dir, struct dentry *dentry,
-+                          struct vfsmount *mnt, int mode);
-       int (*inode_rmdir) (struct inode *dir, struct dentry *dentry);
-       int (*inode_mknod) (struct inode *dir, struct dentry *dentry,
-                           int mode, dev_t dev);
-@@ -1632,7 +1634,8 @@ int security_inode_link(struct dentry *o
- int security_inode_unlink(struct inode *dir, struct dentry *dentry);
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
-                          const char *old_name);
--int security_inode_mkdir(struct inode *dir, struct dentry *dentry, int mode);
-+int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt, int mode);
- int security_inode_rmdir(struct inode *dir, struct dentry *dentry);
- int security_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev);
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
-@@ -2001,6 +2004,7 @@ static inline int security_inode_symlink
- static inline int security_inode_mkdir(struct inode *dir,
-                                       struct dentry *dentry,
-+                                      struct vfsmount *mnt,
-                                       int mode)
- {
-       return 0;
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -178,7 +178,7 @@ static int cap_inode_symlink(struct inod
- }
- static int cap_inode_mkdir(struct inode *inode, struct dentry *dentry,
--                         int mask)
-+                         struct vfsmount *mnt, int mask)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -386,11 +386,12 @@ int security_inode_symlink(struct inode
-       return security_ops->inode_symlink(dir, dentry, old_name);
- }
--int security_inode_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-+int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt, int mode)
- {
-       if (unlikely(IS_PRIVATE(dir)))
-               return 0;
--      return security_ops->inode_mkdir(dir, dentry, mode);
-+      return security_ops->inode_mkdir(dir, dentry, mnt, mode);
- }
- int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2597,7 +2597,8 @@ static int selinux_inode_symlink(struct
-       return may_create(dir, dentry, SECCLASS_LNK_FILE);
- }
--static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry, int mask)
-+static int selinux_inode_mkdir(struct inode *dir, struct dentry *dentry,
-+                             struct vfsmount *mnt, int mask)
- {
-       return may_create(dir, dentry, SECCLASS_DIR);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-mknod.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-mknod.diff
deleted file mode 100644 (file)
index cc46e2b..0000000
+++ /dev/null
@@ -1,124 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_mknod LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c               |    6 +++---
- include/linux/security.h |    7 +++++--
- security/capability.c    |    2 +-
- security/security.c      |    5 +++--
- security/selinux/hooks.c |    5 +++--
- 5 files changed, 15 insertions(+), 10 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1994,7 +1994,7 @@ int vfs_mknod(struct inode *dir, struct
-       if (error)
-               return error;
--      error = security_inode_mknod(dir, dentry, mode, dev);
-+      error = security_inode_mknod(dir, dentry, mnt, mode, dev);
-       if (error)
-               return error;
-@@ -2056,11 +2056,11 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const
-                       break;
-               case S_IFCHR: case S_IFBLK:
-                       error = vfs_mknod(nd.path.dentry->d_inode, dentry,
--                                        nd.path, mode, new_decode_dev(dev));
-+                                        nd.path.mnt, mode, new_decode_dev(dev));
-                       break;
-               case S_IFIFO: case S_IFSOCK:
-                       error = vfs_mknod(nd.path.dentry->d_inode, dentry,
--                                        nd.path, mode, 0);
-+                                        nd.path.mnt, mode, 0);
-                       break;
-       }
-       mnt_drop_write(nd.path.mnt);
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -377,6 +377,7 @@ static inline void security_free_mnt_opt
-  *    and not this hook.
-  *    @dir contains the inode structure of parent of the new file.
-  *    @dentry contains the dentry structure of the new file.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    @mode contains the mode of the new file.
-  *    @dev contains the device number.
-  *    Return 0 if permission is granted.
-@@ -1368,7 +1369,7 @@ struct security_operations {
-                           struct vfsmount *mnt, int mode);
-       int (*inode_rmdir) (struct inode *dir, struct dentry *dentry);
-       int (*inode_mknod) (struct inode *dir, struct dentry *dentry,
--                          int mode, dev_t dev);
-+                          struct vfsmount *mnt, int mode, dev_t dev);
-       int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry,
-                            struct inode *new_dir, struct dentry *new_dentry);
-       int (*inode_readlink) (struct dentry *dentry);
-@@ -1637,7 +1638,8 @@ int security_inode_symlink(struct inode
- int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-                        struct vfsmount *mnt, int mode);
- int security_inode_rmdir(struct inode *dir, struct dentry *dentry);
--int security_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev);
-+int security_inode_mknod(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt, int mode, dev_t dev);
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
-                         struct inode *new_dir, struct dentry *new_dentry);
- int security_inode_readlink(struct dentry *dentry);
-@@ -2018,6 +2020,7 @@ static inline int security_inode_rmdir(s
- static inline int security_inode_mknod(struct inode *dir,
-                                       struct dentry *dentry,
-+                                      struct vfsmount *mnt,
-                                       int mode, dev_t dev)
- {
-       return 0;
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -189,7 +189,7 @@ static int cap_inode_rmdir(struct inode
- }
- static int cap_inode_mknod(struct inode *inode, struct dentry *dentry,
--                         int mode, dev_t dev)
-+                         struct vfsmount *mnt, int mode, dev_t dev)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -401,11 +401,12 @@ int security_inode_rmdir(struct inode *d
-       return security_ops->inode_rmdir(dir, dentry);
- }
--int security_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
-+int security_inode_mknod(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt, int mode, dev_t dev)
- {
-       if (unlikely(IS_PRIVATE(dir)))
-               return 0;
--      return security_ops->inode_mknod(dir, dentry, mode, dev);
-+      return security_ops->inode_mknod(dir, dentry, mnt, mode, dev);
- }
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2608,11 +2608,12 @@ static int selinux_inode_rmdir(struct in
-       return may_link(dir, dentry, MAY_RMDIR);
- }
--static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
-+static int selinux_inode_mknod(struct inode *dir, struct dentry *dentry,
-+                             struct vfsmount *mnt, int mode, dev_t dev)
- {
-       int rc;
--      rc = secondary_ops->inode_mknod(dir, dentry, mode, dev);
-+      rc = secondary_ops->inode_mknod(dir, dentry, mnt, mode, dev);
-       if (rc)
-               return rc;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-readlink.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-readlink.diff
deleted file mode 100644 (file)
index 3eab4f5..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_readlink LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/stat.c                |    2 +-
- include/linux/security.h |    8 +++++---
- security/capability.c    |    2 +-
- security/security.c      |    4 ++--
- security/selinux/hooks.c |    2 +-
- 5 files changed, 10 insertions(+), 8 deletions(-)
-
---- a/fs/stat.c
-+++ b/fs/stat.c
-@@ -308,7 +308,7 @@ SYSCALL_DEFINE4(readlinkat, int, dfd, co
-               error = -EINVAL;
-               if (inode->i_op && inode->i_op->readlink) {
--                      error = security_inode_readlink(path.dentry);
-+                      error = security_inode_readlink(path.dentry, path.mnt);
-                       if (!error) {
-                               touch_atime(path.mnt, path.dentry);
-                               error = inode->i_op->readlink(path.dentry,
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -392,6 +392,7 @@ static inline void security_free_mnt_opt
-  * @inode_readlink:
-  *    Check the permission to read the symbolic link.
-  *    @dentry contains the dentry structure for the file link.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    Return 0 if permission is granted.
-  * @inode_follow_link:
-  *    Check permission to follow a symbolic link when looking up a pathname.
-@@ -1373,7 +1374,7 @@ struct security_operations {
-                           struct vfsmount *mnt, int mode, dev_t dev);
-       int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry,
-                            struct inode *new_dir, struct dentry *new_dentry);
--      int (*inode_readlink) (struct dentry *dentry);
-+      int (*inode_readlink) (struct dentry *dentry, struct vfsmount *mnt);
-       int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd);
-       int (*inode_permission) (struct inode *inode, int mask);
-       int (*inode_setattr)    (struct dentry *dentry, struct vfsmount *,
-@@ -1643,7 +1644,7 @@ int security_inode_mknod(struct inode *d
-                        struct vfsmount *mnt, int mode, dev_t dev);
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
-                         struct inode *new_dir, struct dentry *new_dentry);
--int security_inode_readlink(struct dentry *dentry);
-+int security_inode_readlink(struct dentry *dentry, struct vfsmount *mnt);
- int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd);
- int security_inode_permission(struct inode *inode, int mask);
- int security_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-@@ -2036,7 +2037,8 @@ static inline int security_inode_rename(
-       return 0;
- }
--static inline int security_inode_readlink(struct dentry *dentry)
-+static inline int security_inode_readlink(struct dentry *dentry,
-+                                        struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -200,7 +200,7 @@ static int cap_inode_rename(struct inode
-       return 0;
- }
--static int cap_inode_readlink(struct dentry *dentry)
-+static int cap_inode_readlink(struct dentry *dentry, struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -419,11 +419,11 @@ int security_inode_rename(struct inode *
-                                          new_dir, new_dentry);
- }
--int security_inode_readlink(struct dentry *dentry)
-+int security_inode_readlink(struct dentry *dentry, struct vfsmount *mnt)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_readlink(dentry);
-+      return security_ops->inode_readlink(dentry, mnt);
- }
- int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2627,7 +2627,7 @@ static int selinux_inode_rename(struct i
-       return may_rename(old_inode, old_dentry, new_inode, new_dentry);
- }
--static int selinux_inode_readlink(struct dentry *dentry)
-+static int selinux_inode_readlink(struct dentry *dentry, struct vfsmount *mnt)
- {
-       return dentry_has_perm(current, NULL, dentry, FILE__READ);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-removexattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-removexattr.diff
deleted file mode 100644 (file)
index ec59527..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_removexattr LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c                 |    2 +-
- include/linux/security.h   |   14 +++++++++-----
- security/commoncap.c       |    3 ++-
- security/security.c        |    5 +++--
- security/selinux/hooks.c   |    3 ++-
- security/smack/smack_lsm.c |    6 ++++--
- 6 files changed, 21 insertions(+), 12 deletions(-)
-
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -202,7 +202,7 @@ vfs_removexattr(struct dentry *dentry, s
-       if (error)
-               return error;
--      error = security_inode_removexattr(dentry, name);
-+      error = security_inode_removexattr(dentry, mnt, name);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -57,7 +57,8 @@ extern int cap_bprm_secureexec(struct li
- extern int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                             const char *name, const void *value, size_t size,
-                             int flags);
--extern int cap_inode_removexattr(struct dentry *dentry, const char *name);
-+extern int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+                               const char *name);
- extern int cap_inode_need_killpriv(struct dentry *dentry);
- extern int cap_inode_killpriv(struct dentry *dentry);
- extern int cap_task_post_setuid(uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
-@@ -1403,7 +1404,8 @@ struct security_operations {
-       int (*inode_getxattr) (struct dentry *dentry, struct vfsmount *mnt,
-                              const char *name);
-       int (*inode_listxattr) (struct dentry *dentry, struct vfsmount *mnt);
--      int (*inode_removexattr) (struct dentry *dentry, const char *name);
-+      int (*inode_removexattr) (struct dentry *dentry, struct vfsmount *mnt,
-+                                const char *name);
-       int (*inode_need_killpriv) (struct dentry *dentry);
-       int (*inode_killpriv) (struct dentry *dentry);
-       int (*inode_getsecurity) (const struct inode *inode, const char *name, void **buffer, bool alloc);
-@@ -1680,7 +1682,8 @@ void security_inode_post_setxattr(struct
- int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-                           const char *name);
- int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt);
--int security_inode_removexattr(struct dentry *dentry, const char *name);
-+int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+                             const char *name);
- int security_inode_need_killpriv(struct dentry *dentry);
- int security_inode_killpriv(struct dentry *dentry);
- int security_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc);
-@@ -2128,9 +2131,10 @@ static inline int security_inode_listxat
- }
- static inline int security_inode_removexattr(struct dentry *dentry,
--                      const char *name)
-+                                           struct vfsmount *mnt,
-+                                           const char *name)
- {
--      return cap_inode_removexattr(dentry, name);
-+      return cap_inode_removexattr(dentry, mnt, name);
- }
- static inline int security_inode_need_killpriv(struct dentry *dentry)
---- a/security/commoncap.c
-+++ b/security/commoncap.c
-@@ -429,7 +429,8 @@ int cap_inode_setxattr(struct dentry *de
-       return 0;
- }
--int cap_inode_removexattr(struct dentry *dentry, const char *name)
-+int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+                        const char *name)
- {
-       if (!strcmp(name, XATTR_NAME_CAPS)) {
-               if (!capable(CAP_SETFCAP))
---- a/security/security.c
-+++ b/security/security.c
-@@ -503,11 +503,12 @@ int security_inode_listxattr(struct dent
-       return security_ops->inode_listxattr(dentry, mnt);
- }
--int security_inode_removexattr(struct dentry *dentry, const char *name)
-+int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+                             const char *name)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_removexattr(dentry, name);
-+      return security_ops->inode_removexattr(dentry, mnt, name);
- }
- int security_inode_need_killpriv(struct dentry *dentry)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2807,7 +2807,8 @@ static int selinux_inode_listxattr(struc
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
--static int selinux_inode_removexattr(struct dentry *dentry, const char *name)
-+static int selinux_inode_removexattr(struct dentry *dentry,
-+                                   struct vfsmount *mnt, const char *name)
- {
-       if (strcmp(name, XATTR_NAME_SELINUX))
-               return selinux_inode_setotherxattr(dentry, name);
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -687,13 +687,15 @@ static int smack_inode_getxattr(struct d
- /*
-  * smack_inode_removexattr - Smack check on removexattr
-  * @dentry: the object
-+ * @mnt: unused
-  * @name: name of the attribute
-  *
-  * Removing the Smack attribute requires CAP_MAC_ADMIN
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
--static int smack_inode_removexattr(struct dentry *dentry, const char *name)
-+static int smack_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                 const char *name)
- {
-       int rc = 0;
-@@ -703,7 +705,7 @@ static int smack_inode_removexattr(struc
-               if (!capable(CAP_MAC_ADMIN))
-                       rc = -EPERM;
-       } else
--              rc = cap_inode_removexattr(dentry, name);
-+              rc = cap_inode_removexattr(dentry, mnt, name);
-       if (rc == 0)
-               rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-rename.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-rename.diff
deleted file mode 100644 (file)
index c206347..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_rename LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c                 |    6 ++++--
- include/linux/security.h   |   13 ++++++++++---
- security/capability.c      |    3 ++-
- security/security.c        |    7 ++++---
- security/selinux/hooks.c   |    8 ++++++--
- security/smack/smack_lsm.c |    6 +++++-
- 6 files changed, 31 insertions(+), 12 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2563,7 +2563,8 @@ static int vfs_rename_dir(struct inode *
-                       return error;
-       }
--      error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
-+      error = security_inode_rename(old_dir, old_dentry, old_mnt,
-+                                    new_dir, new_dentry, new_mnt);
-       if (error)
-               return error;
-@@ -2597,7 +2598,8 @@ static int vfs_rename_other(struct inode
-       struct inode *target;
-       int error;
--      error = security_inode_rename(old_dir, old_dentry, new_dir, new_dentry);
-+      error = security_inode_rename(old_dir, old_dentry, old_mnt,
-+                                    new_dir, new_dentry, new_mnt);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -390,8 +390,10 @@ static inline void security_free_mnt_opt
-  *    Check for permission to rename a file or directory.
-  *    @old_dir contains the inode structure for parent of the old link.
-  *    @old_dentry contains the dentry structure of the old link.
-+ *    @old_mnt is the vfsmount corresponding to @old_dentry (may be NULL).
-  *    @new_dir contains the inode structure for parent of the new link.
-  *    @new_dentry contains the dentry structure of the new link.
-+ *    @new_mnt is the vfsmount corresponding to @new_dentry (may be NULL).
-  *    Return 0 if permission is granted.
-  * @inode_readlink:
-  *    Check the permission to read the symbolic link.
-@@ -1380,7 +1382,9 @@ struct security_operations {
-       int (*inode_mknod) (struct inode *dir, struct dentry *dentry,
-                           struct vfsmount *mnt, int mode, dev_t dev);
-       int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry,
--                           struct inode *new_dir, struct dentry *new_dentry);
-+                           struct vfsmount *old_mnt,
-+                           struct inode *new_dir, struct dentry *new_dentry,
-+                           struct vfsmount *new_mnt);
-       int (*inode_readlink) (struct dentry *dentry, struct vfsmount *mnt);
-       int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd);
-       int (*inode_permission) (struct inode *inode, int mask);
-@@ -1653,7 +1657,8 @@ int security_inode_rmdir(struct inode *d
- int security_inode_mknod(struct inode *dir, struct dentry *dentry,
-                        struct vfsmount *mnt, int mode, dev_t dev);
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
--                        struct inode *new_dir, struct dentry *new_dentry);
-+                        struct vfsmount *old_mnt, struct inode *new_dir,
-+                        struct dentry *new_dentry, struct vfsmount *new_mnt);
- int security_inode_readlink(struct dentry *dentry, struct vfsmount *mnt);
- int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd);
- int security_inode_permission(struct inode *inode, int mask);
-@@ -2045,8 +2050,10 @@ static inline int security_inode_mknod(s
- static inline int security_inode_rename(struct inode *old_dir,
-                                        struct dentry *old_dentry,
-+                                       struct vfsmount *old_mnt,
-                                        struct inode *new_dir,
--                                       struct dentry *new_dentry)
-+                                       struct dentry *new_dentry,
-+                                       struct vfsmount *new_mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -198,7 +198,8 @@ static int cap_inode_mknod(struct inode
- }
- static int cap_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
--                          struct inode *new_inode, struct dentry *new_dentry)
-+                          struct vfsmount *old_mnt, struct inode *new_inode,
-+                          struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -414,13 +414,14 @@ int security_inode_mknod(struct inode *d
- }
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
--                         struct inode *new_dir, struct dentry *new_dentry)
-+                        struct vfsmount *old_mnt, struct inode *new_dir,
-+                        struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-         if (unlikely(IS_PRIVATE(old_dentry->d_inode) ||
-             (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode))))
-               return 0;
--      return security_ops->inode_rename(old_dir, old_dentry,
--                                         new_dir, new_dentry);
-+      return security_ops->inode_rename(old_dir, old_dentry, old_mnt,
-+                                         new_dir, new_dentry, new_mnt);
- }
- int security_inode_readlink(struct dentry *dentry, struct vfsmount *mnt)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2628,8 +2628,12 @@ static int selinux_inode_mknod(struct in
-       return may_create(dir, dentry, inode_mode_to_security_class(mode));
- }
--static int selinux_inode_rename(struct inode *old_inode, struct dentry *old_dentry,
--                              struct inode *new_inode, struct dentry *new_dentry)
-+static int selinux_inode_rename(struct inode *old_inode,
-+                              struct dentry *old_dentry,
-+                              struct vfsmount *old_mnt,
-+                                struct inode *new_inode,
-+                              struct dentry *new_dentry,
-+                              struct vfsmount *new_mnt)
- {
-       return may_rename(old_inode, old_dentry, new_inode, new_dentry);
- }
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -509,8 +509,10 @@ static int smack_inode_rmdir(struct inod
-  * smack_inode_rename - Smack check on rename
-  * @old_inode: the old directory
-  * @old_dentry: unused
-+ * @old_mnt: unused
-  * @new_inode: the new directory
-  * @new_dentry: unused
-+ * @new_mnt: unused
-  *
-  * Read and write access is required on both the old and
-  * new directories.
-@@ -519,8 +521,10 @@ static int smack_inode_rmdir(struct inod
-  */
- static int smack_inode_rename(struct inode *old_inode,
-                             struct dentry *old_dentry,
-+                            struct vfsmount *old_mnt,
-                             struct inode *new_inode,
--                            struct dentry *new_dentry)
-+                            struct dentry *new_dentry,
-+                            struct vfsmount *new_mnt)
- {
-       int rc;
-       char *isp;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-rmdir.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-rmdir.diff
deleted file mode 100644 (file)
index 30c8e30..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_rmdir LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c                 |    2 +-
- include/linux/security.h   |   10 +++++++---
- security/capability.c      |    3 ++-
- security/security.c        |    5 +++--
- security/selinux/hooks.c   |    3 ++-
- security/smack/smack_lsm.c |    4 +++-
- 6 files changed, 18 insertions(+), 9 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2184,7 +2184,7 @@ int vfs_rmdir(struct inode *dir, struct
-       if (d_mountpoint(dentry))
-               error = -EBUSY;
-       else {
--              error = security_inode_rmdir(dir, dentry);
-+              error = security_inode_rmdir(dir, dentry, mnt);
-               if (!error) {
-                       error = dir->i_op->rmdir(dir, dentry);
-                       if (!error)
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -372,6 +372,7 @@ static inline void security_free_mnt_opt
-  *    Check the permission to remove a directory.
-  *    @dir contains the inode structure of parent of the directory to be removed.
-  *    @dentry contains the dentry structure of directory to be removed.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    Return 0 if permission is granted.
-  * @inode_mknod:
-  *    Check permissions when creating a special file (or a socket or a fifo
-@@ -1372,7 +1373,8 @@ struct security_operations {
-                             struct vfsmount *mnt, const char *old_name);
-       int (*inode_mkdir) (struct inode *dir, struct dentry *dentry,
-                           struct vfsmount *mnt, int mode);
--      int (*inode_rmdir) (struct inode *dir, struct dentry *dentry);
-+      int (*inode_rmdir) (struct inode *dir, struct dentry *dentry,
-+                          struct vfsmount *mnt);
-       int (*inode_mknod) (struct inode *dir, struct dentry *dentry,
-                           struct vfsmount *mnt, int mode, dev_t dev);
-       int (*inode_rename) (struct inode *old_dir, struct dentry *old_dentry,
-@@ -1643,7 +1645,8 @@ int security_inode_symlink(struct inode
-                          struct vfsmount *mnt, const char *old_name);
- int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-                        struct vfsmount *mnt, int mode);
--int security_inode_rmdir(struct inode *dir, struct dentry *dentry);
-+int security_inode_rmdir(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt);
- int security_inode_mknod(struct inode *dir, struct dentry *dentry,
-                        struct vfsmount *mnt, int mode, dev_t dev);
- int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
-@@ -2022,7 +2025,8 @@ static inline int security_inode_mkdir(s
- }
- static inline int security_inode_rmdir(struct inode *dir,
--                                      struct dentry *dentry)
-+                                     struct dentry *dentry,
-+                                     struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -184,7 +184,8 @@ static int cap_inode_mkdir(struct inode
-       return 0;
- }
--static int cap_inode_rmdir(struct inode *inode, struct dentry *dentry)
-+static int cap_inode_rmdir(struct inode *inode, struct dentry *dentry,
-+                         struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -396,11 +396,12 @@ int security_inode_mkdir(struct inode *d
-       return security_ops->inode_mkdir(dir, dentry, mnt, mode);
- }
--int security_inode_rmdir(struct inode *dir, struct dentry *dentry)
-+int security_inode_rmdir(struct inode *dir, struct dentry *dentry,
-+                       struct vfsmount *mnt)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_rmdir(dir, dentry);
-+      return security_ops->inode_rmdir(dir, dentry, mnt);
- }
- int security_inode_mknod(struct inode *dir, struct dentry *dentry,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2609,7 +2609,8 @@ static int selinux_inode_mkdir(struct in
-       return may_create(dir, dentry, SECCLASS_DIR);
- }
--static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry)
-+static int selinux_inode_rmdir(struct inode *dir, struct dentry *dentry,
-+                             struct vfsmount *mnt)
- {
-       return may_link(dir, dentry, MAY_RMDIR);
- }
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -480,11 +480,13 @@ static int smack_inode_unlink(struct ino
-  * smack_inode_rmdir - Smack check on directory deletion
-  * @dir: containing directory object
-  * @dentry: directory to unlink
-+ * @mnt: vfsmount @dentry to unlink
-  *
-  * Returns 0 if current can write the containing directory
-  * and the directory, error code otherwise
-  */
--static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry)
-+static int smack_inode_rmdir(struct inode *dir, struct dentry *dentry,
-+                           struct vfsmount *mnt)
- {
-       int rc;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-setattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-setattr.diff
deleted file mode 100644 (file)
index 4854ab3..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_setattr LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/attr.c                  |    4 ++--
- fs/fat/file.c              |    2 +-
- include/linux/security.h   |   10 +++++++---
- security/capability.c      |    3 ++-
- security/security.c        |    5 +++--
- security/selinux/hooks.c   |    5 +++--
- security/smack/smack_lsm.c |    3 ++-
- 7 files changed, 20 insertions(+), 12 deletions(-)
-
---- a/fs/attr.c
-+++ b/fs/attr.c
-@@ -164,13 +164,13 @@ int notify_change(struct dentry *dentry,
-               down_write(&dentry->d_inode->i_alloc_sem);
-       if (inode->i_op && inode->i_op->setattr) {
--              error = security_inode_setattr(dentry, attr);
-+              error = security_inode_setattr(dentry, mnt, attr);
-               if (!error)
-                       error = inode->i_op->setattr(dentry, attr);
-       } else {
-               error = inode_change_ok(inode, attr);
-               if (!error)
--                      error = security_inode_setattr(dentry, attr);
-+                      error = security_inode_setattr(dentry, mnt, attr);
-               if (!error) {
-                       if ((ia_valid & ATTR_UID && attr->ia_uid != inode->i_uid) ||
-                           (ia_valid & ATTR_GID && attr->ia_gid != inode->i_gid))
---- a/fs/fat/file.c
-+++ b/fs/fat/file.c
-@@ -98,7 +98,7 @@ int fat_generic_ioctl(struct inode *inod
-                * out the RO attribute for checking by the security
-                * module, just because it maps to a file mode.
-                */
--              err = security_inode_setattr(filp->f_path.dentry, &ia);
-+              err = security_inode_setattr(filp->f_path.dentry, filp->f_path.mnt, &ia);
-               if (err)
-                       goto up;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -412,6 +412,7 @@ static inline void security_free_mnt_opt
-  *    file attributes change (such as when a file is truncated, chown/chmod
-  *    operations, transferring disk quotas, etc).
-  *    @dentry contains the dentry structure for the file.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    @attr is the iattr structure containing the new file attributes.
-  *    Return 0 if permission is granted.
-  * @inode_getattr:
-@@ -1371,7 +1372,8 @@ struct security_operations {
-       int (*inode_readlink) (struct dentry *dentry);
-       int (*inode_follow_link) (struct dentry *dentry, struct nameidata *nd);
-       int (*inode_permission) (struct inode *inode, int mask);
--      int (*inode_setattr)    (struct dentry *dentry, struct iattr *attr);
-+      int (*inode_setattr)    (struct dentry *dentry, struct vfsmount *,
-+                               struct iattr *attr);
-       int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry);
-       void (*inode_delete) (struct inode *inode);
-       int (*inode_setxattr) (struct dentry *dentry, const char *name,
-@@ -1638,7 +1640,8 @@ int security_inode_rename(struct inode *
- int security_inode_readlink(struct dentry *dentry);
- int security_inode_follow_link(struct dentry *dentry, struct nameidata *nd);
- int security_inode_permission(struct inode *inode, int mask);
--int security_inode_setattr(struct dentry *dentry, struct iattr *attr);
-+int security_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                         struct iattr *attr);
- int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry);
- void security_inode_delete(struct inode *inode);
- int security_inode_setxattr(struct dentry *dentry, const char *name,
-@@ -2041,7 +2044,8 @@ static inline int security_inode_permiss
- }
- static inline int security_inode_setattr(struct dentry *dentry,
--                                        struct iattr *attr)
-+                                       struct vfsmount *mnt,
-+                                       struct iattr *attr)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -216,7 +216,8 @@ static int cap_inode_permission(struct i
-       return 0;
- }
--static int cap_inode_setattr(struct dentry *dentry, struct iattr *iattr)
-+static int cap_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                           struct iattr *iattr)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -438,11 +438,12 @@ int security_inode_permission(struct ino
-       return security_ops->inode_permission(inode, mask);
- }
--int security_inode_setattr(struct dentry *dentry, struct iattr *attr)
-+int security_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                         struct iattr *attr)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_setattr(dentry, attr);
-+      return security_ops->inode_setattr(dentry, mnt, attr);
- }
- EXPORT_SYMBOL_GPL(security_inode_setattr);
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2656,11 +2656,12 @@ static int selinux_inode_permission(stru
-                              open_file_mask_to_av(inode->i_mode, mask), NULL);
- }
--static int selinux_inode_setattr(struct dentry *dentry, struct iattr *iattr)
-+static int selinux_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                               struct iattr *iattr)
- {
-       int rc;
--      rc = secondary_ops->inode_setattr(dentry, iattr);
-+      rc = secondary_ops->inode_setattr(dentry, mnt, iattr);
-       if (rc)
-               return rc;
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -559,7 +559,8 @@ static int smack_inode_permission(struct
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
--static int smack_inode_setattr(struct dentry *dentry, struct iattr *iattr)
-+static int smack_inode_setattr(struct dentry *dentry, struct vfsmount *mnt,
-+                             struct iattr *iattr)
- {
-       /*
-        * Need to allow for clearing the setuid bit.
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-setxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-setxattr.diff
deleted file mode 100644 (file)
index cf2e97c..0000000
+++ /dev/null
@@ -1,256 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_setxattr LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c                 |    4 ++--
- include/linux/security.h   |   41 ++++++++++++++++++++++++++---------------
- security/capability.c      |    3 ++-
- security/commoncap.c       |    5 +++--
- security/security.c        |   16 ++++++++++------
- security/selinux/hooks.c   |    8 +++++---
- security/smack/smack_lsm.c |   12 ++++++++----
- 7 files changed, 56 insertions(+), 33 deletions(-)
-
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -78,7 +78,7 @@ vfs_setxattr(struct dentry *dentry, stru
-               return error;
-       mutex_lock(&inode->i_mutex);
--      error = security_inode_setxattr(dentry, name, value, size, flags);
-+      error = security_inode_setxattr(dentry, mnt, name, value, size, flags);
-       if (error)
-               goto out;
-       error = -EOPNOTSUPP;
-@@ -86,7 +86,7 @@ vfs_setxattr(struct dentry *dentry, stru
-               error = inode->i_op->setxattr(dentry, name, value, size, flags);
-               if (!error) {
-                       fsnotify_xattr(dentry);
--                      security_inode_post_setxattr(dentry, name, value,
-+                      security_inode_post_setxattr(dentry, mnt, name, value,
-                                                    size, flags);
-               }
-       } else if (!strncmp(name, XATTR_SECURITY_PREFIX,
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -54,8 +54,9 @@ extern void cap_capset_set(struct task_s
- extern int cap_bprm_set_security(struct linux_binprm *bprm);
- extern void cap_bprm_apply_creds(struct linux_binprm *bprm, int unsafe);
- extern int cap_bprm_secureexec(struct linux_binprm *bprm);
--extern int cap_inode_setxattr(struct dentry *dentry, const char *name,
--                            const void *value, size_t size, int flags);
-+extern int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                            const char *name, const void *value, size_t size,
-+                            int flags);
- extern int cap_inode_removexattr(struct dentry *dentry, const char *name);
- extern int cap_inode_need_killpriv(struct dentry *dentry);
- extern int cap_inode_killpriv(struct dentry *dentry);
-@@ -438,11 +439,11 @@ static inline void security_free_mnt_opt
-  *    inode.
-  * @inode_setxattr:
-  *    Check permission before setting the extended attributes
-- *    @value identified by @name for @dentry.
-+ *    @value identified by @name for @dentry and @mnt.
-  *    Return 0 if permission is granted.
-  * @inode_post_setxattr:
-  *    Update inode security field after successful setxattr operation.
-- *    @value identified by @name for @dentry.
-+ *    @value identified by @name for @dentry and @mnt.
-  * @inode_getxattr:
-  *    Check permission before obtaining the extended attributes
-  *    identified by @name for @dentry.
-@@ -1392,10 +1393,13 @@ struct security_operations {
-                                struct iattr *attr);
-       int (*inode_getattr) (struct vfsmount *mnt, struct dentry *dentry);
-       void (*inode_delete) (struct inode *inode);
--      int (*inode_setxattr) (struct dentry *dentry, const char *name,
--                             const void *value, size_t size, int flags);
--      void (*inode_post_setxattr) (struct dentry *dentry, const char *name,
--                                   const void *value, size_t size, int flags);
-+      int (*inode_setxattr) (struct dentry *dentry, struct vfsmount *mnt,
-+                             const char *name, const void *value, size_t size,
-+                             int flags);
-+      void (*inode_post_setxattr) (struct dentry *dentry,
-+                                   struct vfsmount *mnt,
-+                                   const char *name, const void *value,
-+                                   size_t size, int flags);
-       int (*inode_getxattr) (struct dentry *dentry, const char *name);
-       int (*inode_listxattr) (struct dentry *dentry);
-       int (*inode_removexattr) (struct dentry *dentry, const char *name);
-@@ -1666,10 +1670,12 @@ int security_inode_setattr(struct dentry
-                          struct iattr *attr);
- int security_inode_getattr(struct vfsmount *mnt, struct dentry *dentry);
- void security_inode_delete(struct inode *inode);
--int security_inode_setxattr(struct dentry *dentry, const char *name,
--                          const void *value, size_t size, int flags);
--void security_inode_post_setxattr(struct dentry *dentry, const char *name,
--                                const void *value, size_t size, int flags);
-+int security_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                          const char *name, const void *value,
-+                          size_t size, int flags);
-+void security_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                const char *name, const void *value,
-+                                size_t size, int flags);
- int security_inode_getxattr(struct dentry *dentry, const char *name);
- int security_inode_listxattr(struct dentry *dentry);
- int security_inode_removexattr(struct dentry *dentry, const char *name);
-@@ -2092,13 +2098,18 @@ static inline void security_inode_delete
- { }
- static inline int security_inode_setxattr(struct dentry *dentry,
--              const char *name, const void *value, size_t size, int flags)
-+                                        struct vfsmount *mnt,
-+                                        const char *name, const void *value,
-+                                        size_t size, int flags)
- {
--      return cap_inode_setxattr(dentry, name, value, size, flags);
-+      return cap_inode_setxattr(dentry, mnt, name, value, size, flags);
- }
- static inline void security_inode_post_setxattr(struct dentry *dentry,
--              const char *name, const void *value, size_t size, int flags)
-+                                              struct vfsmount *mnt,
-+                                              const char *name,
-+                                              const void *value,
-+                                              size_t size, int flags)
- { }
- static inline int security_inode_getxattr(struct dentry *dentry,
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -235,7 +235,8 @@ static void cap_inode_delete(struct inod
- {
- }
--static void cap_inode_post_setxattr(struct dentry *dentry, const char *name,
-+static void cap_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                  const char *name,
-                                   const void *value, size_t size, int flags)
- {
- }
---- a/security/commoncap.c
-+++ b/security/commoncap.c
-@@ -414,8 +414,9 @@ int cap_bprm_secureexec (struct linux_bi
-               current->egid != current->gid);
- }
--int cap_inode_setxattr(struct dentry *dentry, const char *name,
--                     const void *value, size_t size, int flags)
-+int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                     const char *name, const void *value, size_t size,
-+                     int flags)
- {
-       if (!strcmp(name, XATTR_NAME_CAPS)) {
-               if (!capable(CAP_SETFCAP))
---- a/security/security.c
-+++ b/security/security.c
-@@ -468,20 +468,24 @@ void security_inode_delete(struct inode
-       security_ops->inode_delete(inode);
- }
--int security_inode_setxattr(struct dentry *dentry, const char *name,
--                          const void *value, size_t size, int flags)
-+int security_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                          const char *name, const void *value, size_t size,
-+                          int flags)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_setxattr(dentry, name, value, size, flags);
-+      return security_ops->inode_setxattr(dentry, mnt, name, value, size,
-+                                          flags);
- }
--void security_inode_post_setxattr(struct dentry *dentry, const char *name,
--                                const void *value, size_t size, int flags)
-+void security_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                const char *name, const void *value,
-+                                size_t size, int flags)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return;
--      security_ops->inode_post_setxattr(dentry, name, value, size, flags);
-+      security_ops->inode_post_setxattr(dentry, mnt, name, value, size,
-+                                        flags);
- }
- int security_inode_getxattr(struct dentry *dentry, const char *name)
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2713,8 +2713,9 @@ static int selinux_inode_setotherxattr(s
-       return dentry_has_perm(current, NULL, dentry, FILE__SETATTR);
- }
--static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
--                                const void *value, size_t size, int flags)
-+static int selinux_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                const char *name, const void *value,
-+                                size_t size, int flags)
- {
-       struct task_security_struct *tsec = current->security;
-       struct inode *inode = dentry->d_inode;
-@@ -2768,7 +2769,8 @@ static int selinux_inode_setxattr(struct
-                           &ad);
- }
--static void selinux_inode_post_setxattr(struct dentry *dentry, const char *name,
-+static void selinux_inode_post_setxattr(struct dentry *dentry,
-+                                      struct vfsmount *mnt, const char *name,
-                                       const void *value, size_t size,
-                                       int flags)
- {
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -595,6 +595,7 @@ static int smack_inode_getattr(struct vf
- /**
-  * smack_inode_setxattr - Smack check for setting xattrs
-  * @dentry: the object
-+ * @mnt: unused
-  * @name: name of the attribute
-  * @value: unused
-  * @size: unused
-@@ -604,8 +605,9 @@ static int smack_inode_getattr(struct vf
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
--static int smack_inode_setxattr(struct dentry *dentry, const char *name,
--                              const void *value, size_t size, int flags)
-+static int smack_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                              const char *name, const void *value,
-+                              size_t size, int flags)
- {
-       int rc = 0;
-@@ -617,7 +619,7 @@ static int smack_inode_setxattr(struct d
-               if (size == 0)
-                       rc = -EINVAL;
-       } else
--              rc = cap_inode_setxattr(dentry, name, value, size, flags);
-+              rc = cap_inode_setxattr(dentry, mnt, name, value, size, flags);
-       if (rc == 0)
-               rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
-@@ -628,6 +630,7 @@ static int smack_inode_setxattr(struct d
- /**
-  * smack_inode_post_setxattr - Apply the Smack update approved above
-  * @dentry: object
-+ * @mnt: unused
-  * @name: attribute name
-  * @value: attribute value
-  * @size: attribute size
-@@ -636,7 +639,8 @@ static int smack_inode_setxattr(struct d
-  * Set the pointer in the inode blob to the entry found
-  * in the master label list.
-  */
--static void smack_inode_post_setxattr(struct dentry *dentry, const char *name,
-+static void smack_inode_post_setxattr(struct dentry *dentry,
-+                                    struct vfsmount *mnt, const char *name,
-                                     const void *value, size_t size, int flags)
- {
-       struct inode_smack *isp;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-symlink.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-symlink.diff
deleted file mode 100644 (file)
index 304800b..0000000
+++ /dev/null
@@ -1,105 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_symlink LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c               |    2 +-
- include/linux/security.h |    8 +++++---
- security/capability.c    |    2 +-
- security/security.c      |    4 ++--
- security/selinux/hooks.c |    3 ++-
- 5 files changed, 11 insertions(+), 8 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2358,7 +2358,7 @@ int vfs_symlink(struct inode *dir, struc
-       if (!dir->i_op || !dir->i_op->symlink)
-               return -EPERM;
--      error = security_inode_symlink(dir, dentry, oldname);
-+      error = security_inode_symlink(dir, dentry, mnt, oldname);
-       if (error)
-               return error;
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -355,6 +355,7 @@ static inline void security_free_mnt_opt
-  *    Check the permission to create a symbolic link to a file.
-  *    @dir contains the inode structure of parent directory of the symbolic link.
-  *    @dentry contains the dentry structure of the symbolic link.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    @old_name contains the pathname of file.
-  *    Return 0 if permission is granted.
-  * @inode_mkdir:
-@@ -1363,8 +1364,8 @@ struct security_operations {
-       int (*inode_link) (struct dentry *old_dentry,
-                          struct inode *dir, struct dentry *new_dentry);
-       int (*inode_unlink) (struct inode *dir, struct dentry *dentry);
--      int (*inode_symlink) (struct inode *dir,
--                            struct dentry *dentry, const char *old_name);
-+      int (*inode_symlink) (struct inode *dir, struct dentry *dentry,
-+                            struct vfsmount *mnt, const char *old_name);
-       int (*inode_mkdir) (struct inode *dir, struct dentry *dentry,
-                           struct vfsmount *mnt, int mode);
-       int (*inode_rmdir) (struct inode *dir, struct dentry *dentry);
-@@ -1634,7 +1635,7 @@ int security_inode_link(struct dentry *o
-                        struct dentry *new_dentry);
- int security_inode_unlink(struct inode *dir, struct dentry *dentry);
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
--                         const char *old_name);
-+                         struct vfsmount *mnt, const char *old_name);
- int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-                        struct vfsmount *mnt, int mode);
- int security_inode_rmdir(struct inode *dir, struct dentry *dentry);
-@@ -1999,6 +2000,7 @@ static inline int security_inode_unlink(
- static inline int security_inode_symlink(struct inode *dir,
-                                         struct dentry *dentry,
-+                                        struct vfsmount *mnt,
-                                         const char *old_name)
- {
-       return 0;
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -172,7 +172,7 @@ static int cap_inode_unlink(struct inode
- }
- static int cap_inode_symlink(struct inode *inode, struct dentry *dentry,
--                           const char *name)
-+                           struct vfsmount *mnt, const char *name)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -379,11 +379,11 @@ int security_inode_unlink(struct inode *
- }
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
--                          const char *old_name)
-+                         struct vfsmount *mnt, const char *old_name)
- {
-       if (unlikely(IS_PRIVATE(dir)))
-               return 0;
--      return security_ops->inode_symlink(dir, dentry, old_name);
-+      return security_ops->inode_symlink(dir, dentry, mnt, old_name);
- }
- int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2592,7 +2592,8 @@ static int selinux_inode_unlink(struct i
-       return may_link(dir, dentry, MAY_UNLINK);
- }
--static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry, const char *name)
-+static int selinux_inode_symlink(struct inode *dir, struct dentry *dentry,
-+                               struct vfsmount *mnt, const char *name)
- {
-       return may_create(dir, dentry, SECCLASS_LNK_FILE);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-unlink.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-unlink.diff
deleted file mode 100644 (file)
index c4cfa8b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Pass struct vfsmount to the inode_unlink LSM hook
-
-This is needed for computing pathnames in the AppArmor LSM.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/namei.c                 |    2 +-
- include/linux/security.h   |   10 +++++++---
- security/capability.c      |    3 ++-
- security/security.c        |    5 +++--
- security/selinux/hooks.c   |    5 +++--
- security/smack/smack_lsm.c |    4 +++-
- 6 files changed, 19 insertions(+), 10 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2264,7 +2264,7 @@ int vfs_unlink(struct inode *dir, struct
-       if (d_mountpoint(dentry))
-               error = -EBUSY;
-       else {
--              error = security_inode_unlink(dir, dentry);
-+              error = security_inode_unlink(dir, dentry, mnt);
-               if (!error)
-                       error = dir->i_op->unlink(dir, dentry);
-       }
---- a/include/linux/security.h
-+++ b/include/linux/security.h
-@@ -352,6 +352,7 @@ static inline void security_free_mnt_opt
-  *    Check the permission to remove a hard link to a file.
-  *    @dir contains the inode structure of parent directory of the file.
-  *    @dentry contains the dentry structure for file to be unlinked.
-+ *    @mnt is the vfsmount corresponding to @dentry (may be NULL).
-  *    Return 0 if permission is granted.
-  * @inode_symlink:
-  *    Check the permission to create a symbolic link to a file.
-@@ -1368,7 +1369,8 @@ struct security_operations {
-       int (*inode_link) (struct dentry *old_dentry, struct vfsmount *old_mnt,
-                          struct inode *dir, struct dentry *new_dentry,
-                          struct vfsmount *new_mnt);
--      int (*inode_unlink) (struct inode *dir, struct dentry *dentry);
-+      int (*inode_unlink) (struct inode *dir, struct dentry *dentry,
-+                           struct vfsmount *mnt);
-       int (*inode_symlink) (struct inode *dir, struct dentry *dentry,
-                             struct vfsmount *mnt, const char *old_name);
-       int (*inode_mkdir) (struct inode *dir, struct dentry *dentry,
-@@ -1640,7 +1642,8 @@ int security_inode_create(struct inode *
- int security_inode_link(struct dentry *old_dentry, struct vfsmount *old_mnt,
-                       struct inode *dir, struct dentry *new_dentry,
-                       struct vfsmount *new_mnt);
--int security_inode_unlink(struct inode *dir, struct dentry *dentry);
-+int security_inode_unlink(struct inode *dir, struct dentry *dentry,
-+                        struct vfsmount *mnt);
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
-                          struct vfsmount *mnt, const char *old_name);
- int security_inode_mkdir(struct inode *dir, struct dentry *dentry,
-@@ -2003,7 +2006,8 @@ static inline int security_inode_link(st
- }
- static inline int security_inode_unlink(struct inode *dir,
--                                       struct dentry *dentry)
-+                                      struct dentry *dentry,
-+                                      struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/capability.c
-+++ b/security/capability.c
-@@ -167,7 +167,8 @@ static int cap_inode_link(struct dentry
-       return 0;
- }
--static int cap_inode_unlink(struct inode *inode, struct dentry *dentry)
-+static int cap_inode_unlink(struct inode *inode, struct dentry *dentry,
-+                          struct vfsmount *mnt)
- {
-       return 0;
- }
---- a/security/security.c
-+++ b/security/security.c
-@@ -373,11 +373,12 @@ int security_inode_link(struct dentry *o
-                                        new_dentry, new_mnt);
- }
--int security_inode_unlink(struct inode *dir, struct dentry *dentry)
-+int security_inode_unlink(struct inode *dir, struct dentry *dentry,
-+                        struct vfsmount *mnt)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_unlink(dir, dentry);
-+      return security_ops->inode_unlink(dir, dentry, mnt);
- }
- int security_inode_symlink(struct inode *dir, struct dentry *dentry,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -2587,11 +2587,12 @@ static int selinux_inode_link(struct den
-       return may_link(dir, old_dentry, MAY_LINK);
- }
--static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry)
-+static int selinux_inode_unlink(struct inode *dir, struct dentry *dentry,
-+                              struct vfsmount *mnt)
- {
-       int rc;
--      rc = secondary_ops->inode_unlink(dir, dentry);
-+      rc = secondary_ops->inode_unlink(dir, dentry, mnt);
-       if (rc)
-               return rc;
-       return may_link(dir, dentry, MAY_UNLINK);
---- a/security/smack/smack_lsm.c
-+++ b/security/smack/smack_lsm.c
-@@ -454,11 +454,13 @@ static int smack_inode_link(struct dentr
-  * smack_inode_unlink - Smack check on inode deletion
-  * @dir: containing directory object
-  * @dentry: file to unlink
-+ * @mnt: vfsmount of file to unlink
-  *
-  * Returns 0 if current can write the containing directory
-  * and the object, error code otherwise
-  */
--static int smack_inode_unlink(struct inode *dir, struct dentry *dentry)
-+static int smack_inode_unlink(struct inode *dir, struct dentry *dentry,
-+                            struct vfsmount *mnt)
- {
-       struct inode *ip = dentry->d_inode;
-       int rc;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/security-xattr-file.diff b/src/patches/suse-2.6.27.31/patches.apparmor/security-xattr-file.diff
deleted file mode 100644 (file)
index 2c0c3cc..0000000
+++ /dev/null
@@ -1,608 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Pass struct file down the inode_*xattr security LSM hooks
-
-This allows LSMs to also distinguish between file descriptor and path
-access for the xattr operations. (The other relevant operations are
-covered by the setattr hook.)
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c                 |   59 +++++++++++++++++++++++----------------------
- include/linux/security.h   |   38 ++++++++++++++++------------
- include/linux/xattr.h      |    9 +++---
- security/capability.c      |    5 ++-
- security/commoncap.c       |    4 +--
- security/security.c        |   17 ++++++------
- security/selinux/hooks.c   |   10 ++++---
- security/smack/smack_lsm.c |   14 ++++++----
- 8 files changed, 87 insertions(+), 69 deletions(-)
-
-Index: linux-2.6.27/fs/xattr.c
-===================================================================
---- linux-2.6.27.orig/fs/xattr.c
-+++ linux-2.6.27/fs/xattr.c
-@@ -68,7 +68,7 @@ xattr_permission(struct inode *inode, co
- int
- vfs_setxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name,
--           const void *value, size_t size, int flags)
-+           const void *value, size_t size, int flags, struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -78,7 +78,7 @@ vfs_setxattr(struct dentry *dentry, stru
-               return error;
-       mutex_lock(&inode->i_mutex);
--      error = security_inode_setxattr(dentry, mnt, name, value, size, flags);
-+      error = security_inode_setxattr(dentry, mnt, name, value, size, flags,                                          file);
-       if (error)
-               goto out;
-       error = -EOPNOTSUPP;
-@@ -132,7 +132,7 @@ EXPORT_SYMBOL_GPL(xattr_getsecurity);
- ssize_t
- vfs_getxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name,
--           void *value, size_t size)
-+           void *value, size_t size, struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -141,7 +141,7 @@ vfs_getxattr(struct dentry *dentry, stru
-       if (error)
-               return error;
--      error = security_inode_getxattr(dentry, mnt, name);
-+      error = security_inode_getxattr(dentry, mnt, name, file);
-       if (error)
-               return error;
-@@ -169,12 +169,12 @@ EXPORT_SYMBOL_GPL(vfs_getxattr);
- ssize_t
- vfs_listxattr(struct dentry *dentry, struct vfsmount *mnt, char *list,
--            size_t size)
-+            size_t size, struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       ssize_t error;
--      error = security_inode_listxattr(dentry, mnt);
-+      error = security_inode_listxattr(dentry, mnt, file);
-       if (error)
-               return error;
-       error = -EOPNOTSUPP;
-@@ -190,7 +190,8 @@ vfs_listxattr(struct dentry *dentry, str
- EXPORT_SYMBOL_GPL(vfs_listxattr);
- int
--vfs_removexattr(struct dentry *dentry, struct vfsmount *mnt, const char *name)
-+vfs_removexattr(struct dentry *dentry, struct vfsmount *mnt, const char *name,
-+              struct file *file)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -202,7 +203,7 @@ vfs_removexattr(struct dentry *dentry, s
-       if (error)
-               return error;
--      error = security_inode_removexattr(dentry, mnt, name);
-+      error = security_inode_removexattr(dentry, mnt, name, file);
-       if (error)
-               return error;
-@@ -222,7 +223,7 @@ EXPORT_SYMBOL_GPL(vfs_removexattr);
-  */
- static long
- setxattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name,
--       const void __user *value, size_t size, int flags)
-+       const void __user *value, size_t size, int flags, struct file *file)
- {
-       int error;
-       void *kvalue = NULL;
-@@ -249,7 +250,7 @@ setxattr(struct dentry *dentry, struct v
-               }
-       }
--      error = vfs_setxattr(dentry, mnt, kname, kvalue, size, flags);
-+      error = vfs_setxattr(dentry, mnt, kname, kvalue, size, flags, file);
-       kfree(kvalue);
-       return error;
- }
-@@ -266,7 +267,7 @@ SYSCALL_DEFINE5(setxattr, const char __u
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = setxattr(path.dentry, path.mnt, name, value, size, flags);
-+              error = setxattr(path.dentry, path.mnt, name, value, size, flags, NULL);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -285,7 +286,7 @@ SYSCALL_DEFINE5(lsetxattr, const char __
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = setxattr(path.dentry, path.mnt, name, value, size, flags);
-+              error = setxattr(path.dentry, path.mnt, name, value, size, flags, NULL);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -306,7 +307,8 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, cons
-       audit_inode(NULL, dentry);
-       error = mnt_want_write_file(f->f_path.mnt, f);
-       if (!error) {
--              error = setxattr(dentry, f->f_vfsmnt, name, value, size, flags);
-+              error = setxattr(dentry, f->f_vfsmnt, name, value, size, flags,
-+                               f);
-               mnt_drop_write(f->f_path.mnt);
-       }
-       fput(f);
-@@ -318,7 +320,7 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, cons
-  */
- static ssize_t
- getxattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name,
--       void __user *value, size_t size)
-+       void __user *value, size_t size, struct file *file)
- {
-       ssize_t error;
-       void *kvalue = NULL;
-@@ -338,7 +340,7 @@ getxattr(struct dentry *dentry, struct v
-                       return -ENOMEM;
-       }
--      error = vfs_getxattr(dentry, mnt, kname, kvalue, size);
-+      error = vfs_getxattr(dentry, mnt, kname, kvalue, size, file);
-       if (error > 0) {
-               if (size && copy_to_user(value, kvalue, error))
-                       error = -EFAULT;
-@@ -360,7 +362,7 @@ SYSCALL_DEFINE4(getxattr, const char __u
-       error = user_path(pathname, &path);
-       if (error)
-               return error;
--      error = getxattr(path.dentry, path.mnt, name, value, size);
-+      error = getxattr(path.dentry, path.mnt, name, value, size, NULL);
-       path_put(&path);
-       return error;
- }
-@@ -374,7 +376,7 @@ SYSCALL_DEFINE4(lgetxattr, const char __
-       error = user_lpath(pathname, &path);
-       if (error)
-               return error;
--      error = getxattr(path.dentry, path.mnt, name, value, size);
-+      error = getxattr(path.dentry, path.mnt, name, value, size, NULL);
-       path_put(&path);
-       return error;
- }
-@@ -389,7 +391,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, cons
-       if (!f)
-               return error;
-       audit_inode(NULL, f->f_path.dentry);
--      error = getxattr(f->f_path.dentry, f->f_path.mnt, name, value, size);
-+      error = getxattr(f->f_path.dentry, f->f_path.mnt, name, value, size, f);
-       fput(f);
-       return error;
- }
-@@ -399,7 +401,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, cons
-  */
- static ssize_t
- listxattr(struct dentry *dentry, struct vfsmount *mnt, char __user *list,
--        size_t size)
-+        size_t size, struct file *file)
- {
-       ssize_t error;
-       char *klist = NULL;
-@@ -412,7 +414,7 @@ listxattr(struct dentry *dentry, struct
-                       return -ENOMEM;
-       }
--      error = vfs_listxattr(dentry, mnt, klist, size);
-+      error = vfs_listxattr(dentry, mnt, klist, size, file);
-       if (error > 0) {
-               if (size && copy_to_user(list, klist, error))
-                       error = -EFAULT;
-@@ -434,7 +436,7 @@ SYSCALL_DEFINE3(listxattr, const char __
-       error = user_path(pathname, &path);
-       if (error)
-               return error;
--      error = listxattr(path.dentry, path.mnt, list, size);
-+      error = listxattr(path.dentry, path.mnt, list, size, NULL);
-       path_put(&path);
-       return error;
- }
-@@ -448,7 +450,7 @@ SYSCALL_DEFINE3(llistxattr, const char _
-       error = user_lpath(pathname, &path);
-       if (error)
-               return error;
--      error = listxattr(path.dentry, path.mnt, list, size);
-+      error = listxattr(path.dentry, path.mnt, list, size, NULL);
-       path_put(&path);
-       return error;
- }
-@@ -462,7 +464,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, cha
-       if (!f)
-               return error;
-       audit_inode(NULL, f->f_path.dentry);
--      error = listxattr(f->f_path.dentry, f->f_path.mnt, list, size);
-+      error = listxattr(f->f_path.dentry, f->f_path.mnt, list, size, f);
-       fput(f);
-       return error;
- }
-@@ -471,7 +473,8 @@ SYSCALL_DEFINE3(flistxattr, int, fd, cha
-  * Extended attribute REMOVE operations
-  */
- static long
--removexattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name)
-+removexattr(struct dentry *dentry, struct vfsmount *mnt,
-+          const char __user *name, struct file *file)
- {
-       int error;
-       char kname[XATTR_NAME_MAX + 1];
-@@ -482,7 +485,7 @@ removexattr(struct dentry *dentry, struc
-       if (error < 0)
-               return error;
--      return vfs_removexattr(dentry, mnt, kname);
-+      return vfs_removexattr(dentry, mnt, kname, file);
- }
- SYSCALL_DEFINE2(removexattr, const char __user *, pathname,
-@@ -496,7 +499,7 @@ SYSCALL_DEFINE2(removexattr, const char
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = removexattr(path.dentry, path.mnt, name);
-+              error = removexattr(path.dentry, path.mnt, name, NULL);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -514,7 +517,7 @@ SYSCALL_DEFINE2(lremovexattr, const char
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = removexattr(path.dentry, path.mnt, name);
-+              error = removexattr(path.dentry, path.mnt, name, NULL);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -534,7 +537,7 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, c
-       audit_inode(NULL, dentry);
-       error = mnt_want_write_file(f->f_path.mnt, f);
-       if (!error) {
--              error = removexattr(dentry, f->f_path.mnt, name);
-+              error = removexattr(dentry, f->f_path.mnt, name, f);
-               mnt_drop_write(f->f_path.mnt);
-       }
-       fput(f);
-Index: linux-2.6.27/include/linux/security.h
-===================================================================
---- linux-2.6.27.orig/include/linux/security.h
-+++ linux-2.6.27/include/linux/security.h
-@@ -56,9 +56,9 @@ extern void cap_bprm_apply_creds(struct
- extern int cap_bprm_secureexec(struct linux_binprm *bprm);
- extern int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                             const char *name, const void *value, size_t size,
--                            int flags);
-+                            int flags, struct file *file);
- extern int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
--                               const char *name);
-+                               const char *name, struct file *file);
- extern int cap_inode_need_killpriv(struct dentry *dentry);
- extern int cap_inode_killpriv(struct dentry *dentry);
- extern int cap_task_post_setuid(uid_t old_ruid, uid_t old_euid, uid_t old_suid, int flags);
-@@ -1396,16 +1396,17 @@ struct security_operations {
-       void (*inode_delete) (struct inode *inode);
-       int (*inode_setxattr) (struct dentry *dentry, struct vfsmount *mnt,
-                              const char *name, const void *value, size_t size,
--                             int flags);
-+                             int flags, struct file *file);
-       void (*inode_post_setxattr) (struct dentry *dentry,
-                                    struct vfsmount *mnt,
-                                    const char *name, const void *value,
-                                    size_t size, int flags);
-       int (*inode_getxattr) (struct dentry *dentry, struct vfsmount *mnt,
--                             const char *name);
--      int (*inode_listxattr) (struct dentry *dentry, struct vfsmount *mnt);
-+                             const char *name, struct file *file);
-+      int (*inode_listxattr) (struct dentry *dentry, struct vfsmount *mnt,
-+                              struct file *file);
-       int (*inode_removexattr) (struct dentry *dentry, struct vfsmount *mnt,
--                                const char *name);
-+                                const char *name, struct file *file);
-       int (*inode_need_killpriv) (struct dentry *dentry);
-       int (*inode_killpriv) (struct dentry *dentry);
-       int (*inode_getsecurity) (const struct inode *inode, const char *name, void **buffer, bool alloc);
-@@ -1675,15 +1676,16 @@ int security_inode_getattr(struct vfsmou
- void security_inode_delete(struct inode *inode);
- int security_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                           const char *name, const void *value,
--                          size_t size, int flags);
-+                          size_t size, int flags, struct file *file);
- void security_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                                 const char *name, const void *value,
-                                 size_t size, int flags);
- int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
--                          const char *name);
--int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt);
-+                          const char *name, struct file *file);
-+int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                           struct file *file);
- int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
--                             const char *name);
-+                             const char *name, struct file *file);
- int security_inode_need_killpriv(struct dentry *dentry);
- int security_inode_killpriv(struct dentry *dentry);
- int security_inode_getsecurity(const struct inode *inode, const char *name, void **buffer, bool alloc);
-@@ -2105,9 +2107,10 @@ static inline void security_inode_delete
- static inline int security_inode_setxattr(struct dentry *dentry,
-                                         struct vfsmount *mnt,
-                                         const char *name, const void *value,
--                                        size_t size, int flags)
-+                                        size_t size, int flags,
-+                                        struct file *file)
- {
--      return cap_inode_setxattr(dentry, mnt, name, value, size, flags);
-+      return cap_inode_setxattr(dentry, mnt, name, value, size, flags, file);
- }
- static inline void security_inode_post_setxattr(struct dentry *dentry,
-@@ -2119,22 +2122,25 @@ static inline void security_inode_post_s
- static inline int security_inode_getxattr(struct dentry *dentry,
-                                         struct vfsmount *mnt,
--                                        const char *name)
-+                                        const char *name,
-+                                        struct file *file)
- {
-       return 0;
- }
- static inline int security_inode_listxattr(struct dentry *dentry,
--                                         struct vfsmount *mnt)
-+                                         struct vfsmount *mnt,
-+                                         struct file *file)
- {
-       return 0;
- }
- static inline int security_inode_removexattr(struct dentry *dentry,
-                                            struct vfsmount *mnt,
--                                           const char *name)
-+                                           const char *name,
-+                                           struct file *file)
- {
--      return cap_inode_removexattr(dentry, mnt, name);
-+      return cap_inode_removexattr(dentry, mnt, name, file);
- }
- static inline int security_inode_need_killpriv(struct dentry *dentry)
-Index: linux-2.6.27/include/linux/xattr.h
-===================================================================
---- linux-2.6.27.orig/include/linux/xattr.h
-+++ linux-2.6.27/include/linux/xattr.h
-@@ -17,6 +17,7 @@
- #include <linux/types.h>
- #include <linux/mount.h>
-+#include <linux/fs.h>
- /* Namespaces */
- #define XATTR_OS2_PREFIX "os2."
-@@ -48,10 +49,10 @@ struct xattr_handler {
- };
- ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);
--ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t);
--ssize_t vfs_listxattr(struct dentry *d, struct vfsmount *, char *list, size_t size);
--int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int);
--int vfs_removexattr(struct dentry *, struct vfsmount *mnt, const char *);
-+ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t, struct file *file);
-+ssize_t vfs_listxattr(struct dentry *d, struct vfsmount *, char *list, size_t size, struct file *file);
-+int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int, struct file *file);
-+int vfs_removexattr(struct dentry *, struct vfsmount *mnt, const char *, struct file *file);
- ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size);
- ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
-Index: linux-2.6.27/security/capability.c
-===================================================================
---- linux-2.6.27.orig/security/capability.c
-+++ linux-2.6.27/security/capability.c
-@@ -242,12 +242,13 @@ static void cap_inode_post_setxattr(stru
- }
- static int cap_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
--                            const char *name)
-+                            const char *name, struct file *f)
- {
-       return 0;
- }
--static int cap_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
-+static int cap_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                             struct file *f)
- {
-       return 0;
- }
-Index: linux-2.6.27/security/commoncap.c
-===================================================================
---- linux-2.6.27.orig/security/commoncap.c
-+++ linux-2.6.27/security/commoncap.c
-@@ -416,7 +416,7 @@ int cap_bprm_secureexec (struct linux_bi
- int cap_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                      const char *name, const void *value, size_t size,
--                     int flags)
-+                     int flags, struct file *file)
- {
-       if (!strcmp(name, XATTR_NAME_CAPS)) {
-               if (!capable(CAP_SETFCAP))
-@@ -430,7 +430,7 @@ int cap_inode_setxattr(struct dentry *de
- }
- int cap_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
--                        const char *name)
-+                        const char *name, struct file *file)
- {
-       if (!strcmp(name, XATTR_NAME_CAPS)) {
-               if (!capable(CAP_SETFCAP))
-Index: linux-2.6.27/security/security.c
-===================================================================
---- linux-2.6.27.orig/security/security.c
-+++ linux-2.6.27/security/security.c
-@@ -470,12 +470,12 @@ void security_inode_delete(struct inode
- int security_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                           const char *name, const void *value, size_t size,
--                          int flags)
-+                          int flags, struct file *file)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
-       return security_ops->inode_setxattr(dentry, mnt, name, value, size,
--                                          flags);
-+                                          flags, file);
- }
- void security_inode_post_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-@@ -489,26 +489,27 @@ void security_inode_post_setxattr(struct
- }
- int security_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
--                          const char *name)
-+                          const char *name, struct file *file)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_getxattr(dentry, mnt, name);
-+      return security_ops->inode_getxattr(dentry, mnt, name, file);
- }
--int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
-+int security_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                           struct file *file)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_listxattr(dentry, mnt);
-+      return security_ops->inode_listxattr(dentry, mnt, file);
- }
- int security_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
--                             const char *name)
-+                             const char *name, struct file *file)
- {
-       if (unlikely(IS_PRIVATE(dentry->d_inode)))
-               return 0;
--      return security_ops->inode_removexattr(dentry, mnt, name);
-+      return security_ops->inode_removexattr(dentry, mnt, name, file);
- }
- int security_inode_need_killpriv(struct dentry *dentry)
-Index: linux-2.6.27/security/selinux/hooks.c
-===================================================================
---- linux-2.6.27.orig/security/selinux/hooks.c
-+++ linux-2.6.27/security/selinux/hooks.c
-@@ -2715,7 +2715,7 @@ static int selinux_inode_setotherxattr(s
- static int selinux_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                                 const char *name, const void *value,
--                                size_t size, int flags)
-+                                size_t size, int flags, struct file *file)
- {
-       struct task_security_struct *tsec = current->security;
-       struct inode *inode = dentry->d_inode;
-@@ -2797,18 +2797,20 @@ static void selinux_inode_post_setxattr(
- }
- static int selinux_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
--                                const char *name)
-+                                const char *name, struct file *file)
- {
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
--static int selinux_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt)
-+static int selinux_inode_listxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                                 struct file *file)
- {
-       return dentry_has_perm(current, NULL, dentry, FILE__GETATTR);
- }
- static int selinux_inode_removexattr(struct dentry *dentry,
--                                   struct vfsmount *mnt, const char *name)
-+                                   struct vfsmount *mnt, const char *name,
-+                                   struct file *file)
- {
-       if (strcmp(name, XATTR_NAME_SELINUX))
-               return selinux_inode_setotherxattr(dentry, name);
-Index: linux-2.6.27/security/smack/smack_lsm.c
-===================================================================
---- linux-2.6.27.orig/security/smack/smack_lsm.c
-+++ linux-2.6.27/security/smack/smack_lsm.c
-@@ -600,6 +600,7 @@ static int smack_inode_getattr(struct vf
-  * @value: unused
-  * @size: unused
-  * @flags: unused
-+ * @file: unused
-  *
-  * This protects the Smack attribute explicitly.
-  *
-@@ -607,7 +608,7 @@ static int smack_inode_getattr(struct vf
-  */
- static int smack_inode_setxattr(struct dentry *dentry, struct vfsmount *mnt,
-                               const char *name, const void *value,
--                              size_t size, int flags)
-+                              size_t size, int flags, struct file *file)
- {
-       int rc = 0;
-@@ -619,7 +620,8 @@ static int smack_inode_setxattr(struct d
-               if (size == 0)
-                       rc = -EINVAL;
-       } else
--              rc = cap_inode_setxattr(dentry, mnt, name, value, size, flags);
-+              rc = cap_inode_setxattr(dentry, mnt, name, value, size, flags,
-+                                      file);
-       if (rc == 0)
-               rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
-@@ -675,11 +677,12 @@ static void smack_inode_post_setxattr(st
-  * @dentry: the object
-  * @mnt: unused
-  * @name: unused
-+ * @file: unused
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
- static int smack_inode_getxattr(struct dentry *dentry, struct vfsmount *mnt,
--                              const char *name)
-+                              const char *name, struct file *file)
- {
-       return smk_curacc(smk_of_inode(dentry->d_inode), MAY_READ);
- }
-@@ -689,13 +692,14 @@ static int smack_inode_getxattr(struct d
-  * @dentry: the object
-  * @mnt: unused
-  * @name: name of the attribute
-+ * @file: unused
-  *
-  * Removing the Smack attribute requires CAP_MAC_ADMIN
-  *
-  * Returns 0 if access is permitted, an error code otherwise
-  */
- static int smack_inode_removexattr(struct dentry *dentry, struct vfsmount *mnt,
--                                 const char *name)
-+                                 const char *name, struct file *file)
- {
-       int rc = 0;
-@@ -705,7 +709,7 @@ static int smack_inode_removexattr(struc
-               if (!capable(CAP_MAC_ADMIN))
-                       rc = -EPERM;
-       } else
--              rc = cap_inode_removexattr(dentry, mnt, name);
-+              rc = cap_inode_removexattr(dentry, mnt, name, file);
-       if (rc == 0)
-               rc = smk_curacc(smk_of_inode(dentry->d_inode), MAY_WRITE);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/sysctl-pathname.diff b/src/patches/suse-2.6.27.31/patches.apparmor/sysctl-pathname.diff
deleted file mode 100644 (file)
index 33c747c..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Factor out sysctl pathname code
-
-Convert the selinux sysctl pathname computation code into a standalone
-function.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Reviewed-by: James Morris <jmorris@namei.org>
-
----
- include/linux/sysctl.h   |    2 ++
- kernel/sysctl.c          |   27 +++++++++++++++++++++++++++
- security/selinux/hooks.c |   34 +++++-----------------------------
- 3 files changed, 34 insertions(+), 29 deletions(-)
-
---- a/include/linux/sysctl.h
-+++ b/include/linux/sysctl.h
-@@ -996,6 +996,8 @@ extern int proc_doulongvec_minmax(struct
- extern int proc_doulongvec_ms_jiffies_minmax(struct ctl_table *table, int,
-                                     struct file *, void __user *, size_t *, loff_t *);
-+extern char *sysctl_pathname(ctl_table *, char *, int);
-+
- extern int do_sysctl (int __user *name, int nlen,
-                     void __user *oldval, size_t __user *oldlenp,
-                     void __user *newval, size_t newlen);
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -1552,6 +1552,33 @@ void register_sysctl_root(struct ctl_tab
-       spin_unlock(&sysctl_lock);
- }
-+char *sysctl_pathname(struct ctl_table *table, char *buffer, int buflen)
-+{
-+      if (buflen < 1)
-+              return NULL;
-+      buffer += --buflen;
-+      *buffer = '\0';
-+
-+      while (table) {
-+              int namelen = strlen(table->procname);
-+
-+              if (buflen < namelen + 1)
-+                      return NULL;
-+              buflen -= namelen + 1;
-+              buffer -= namelen;
-+              memcpy(buffer, table->procname, namelen);
-+              *--buffer = '/';
-+              table = table->parent;
-+      }
-+      if (buflen < 4)
-+              return NULL;
-+      buffer -= 4;
-+      memcpy(buffer, "/sys", 4);
-+
-+      return buffer;
-+}
-+EXPORT_SYMBOL_GPL(sysctl_pathname);
-+
- #ifdef CONFIG_SYSCTL_SYSCALL
- /* Perform the actual read/write of a sysctl table entry. */
- static int do_sysctl_strategy(struct ctl_table_root *root,
---- a/security/selinux/hooks.c
-+++ b/security/selinux/hooks.c
-@@ -1811,40 +1811,16 @@ static int selinux_capable(struct task_s
- static int selinux_sysctl_get_sid(ctl_table *table, u16 tclass, u32 *sid)
- {
--      int buflen, rc;
--      char *buffer, *path, *end;
-+      char *buffer, *path;
-+      int rc = -ENOMEM;
--      rc = -ENOMEM;
-       buffer = (char *)__get_free_page(GFP_KERNEL);
-       if (!buffer)
-               goto out;
--      buflen = PAGE_SIZE;
--      end = buffer+buflen;
--      *--end = '\0';
--      buflen--;
--      path = end-1;
--      *path = '/';
--      while (table) {
--              const char *name = table->procname;
--              size_t namelen = strlen(name);
--              buflen -= namelen + 1;
--              if (buflen < 0)
--                      goto out_free;
--              end -= namelen;
--              memcpy(end, name, namelen);
--              *--end = '/';
--              path = end;
--              table = table->parent;
--      }
--      buflen -= 4;
--      if (buflen < 0)
--              goto out_free;
--      end -= 4;
--      memcpy(end, "/sys", 4);
--      path = end;
--      rc = security_genfs_sid("proc", path, tclass, sid);
--out_free:
-+      path = sysctl_pathname(table, buffer, PAGE_SIZE);
-+      if (path)
-+              rc = security_genfs_sid("proc", path, tclass, sid);
-       free_page((unsigned long)buffer);
- out:
-       return rc;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/unambiguous-__d_path.diff b/src/patches/suse-2.6.27.31/patches.apparmor/unambiguous-__d_path.diff
deleted file mode 100644 (file)
index 924b566..0000000
+++ /dev/null
@@ -1,267 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Fix __d_path() for lazy unmounts and make it unambiguous
-
-First, when __d_path() hits a lazily unmounted mount point, it tries to prepend
-the name of the lazily unmounted dentry to the path name.  It gets this wrong,
-and also overwrites the slash that separates the name from the following
-pathname component. This patch fixes that; if a process was in directory
-/foo/bar and /foo got lazily unmounted, the old result was ``foobar'' (note the
-missing slash), while the new result with this patch is ``foo/bar''.
-
-Second, it isn't always possible to tell from the __d_path() result whether the
-specified root and rootmnt (i.e., the chroot) was reached.  We need an
-unambiguous result for AppArmor at least though, so we make sure that paths
-will only start with a slash if the path leads all the way up to the root.
-
-We also add a @fail_deleted argument, which allows to get rid of some of the
-mess in sys_getcwd().
-
-This patch leaves getcwd() and d_path() as they were before for everything
-except for bind-mounted directories; for them, it reports ``/foo/bar'' instead
-of ``foobar'' in the example described above.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-Acked-by: Alan Cox <alan@lxorguk.ukuu.org.uk>
-
-[ Moved dcache_lock outside vfsmount_lock to fix lock order (bnc#490902) ]
-Signed-off-by: Nick Piggin <npiggin@suse.de>
-
----
- fs/dcache.c            |  126 +++++++++++++++++++++++++++----------------------
- fs/seq_file.c          |    4 -
- include/linux/dcache.h |    5 +
- 3 files changed, 75 insertions(+), 60 deletions(-)
-
-Index: linux-2.6.27/fs/dcache.c
-===================================================================
---- linux-2.6.27.orig/fs/dcache.c
-+++ linux-2.6.27/fs/dcache.c
-@@ -1898,44 +1898,46 @@ static int prepend_name(char **buffer, i
-  * @root: root vfsmnt/dentry (may be modified by this function)
-  * @buffer: buffer to return value in
-  * @buflen: buffer length
-+ * @flags: flags controling behavior of d_path
-  *
-- * Convert a dentry into an ASCII path name. If the entry has been deleted
-- * the string " (deleted)" is appended. Note that this is ambiguous.
-- *
-- * Returns the buffer or an error code if the path was too long.
-- *
-- * "buflen" should be positive. Caller holds the dcache_lock.
-+ * Convert a dentry into an ASCII path name. If the entry has been deleted,
-+ * then if @flags has D_PATH_FAIL_DELETED set, ERR_PTR(-ENOENT) is returned.
-+ * Otherwise, the string " (deleted)" is appended. Note that this is ambiguous.
-  *
-  * If path is not reachable from the supplied root, then the value of
-- * root is changed (without modifying refcounts).
-+ * root is changed (without modifying refcounts).  The path returned in this
-+ * case will be relative (i.e., it will not start with a slash).
-+ *
-+ * Returns the buffer or an error code if the path was too long.
-  */
- char *__d_path(const struct path *path, struct path *root,
--             char *buffer, int buflen)
-+             char *buffer, int buflen, int flags)
- {
-       struct dentry *dentry = path->dentry;
-       struct vfsmount *vfsmnt = path->mnt;
--      char *end = buffer + buflen;
--      char *retval;
-+      const unsigned char *name;
-+      int namelen;
-+
-+      buffer += buflen;
-+      prepend(&buffer, &buflen, "\0", 1);
-+      spin_lock(&dcache_lock);
-       spin_lock(&vfsmount_lock);
--      prepend(&end, &buflen, "\0", 1);
--      if (!IS_ROOT(dentry) && d_unhashed(dentry) &&
--              (prepend(&end, &buflen, " (deleted)", 10) != 0))
-+      if (!IS_ROOT(dentry) && d_unhashed(dentry)) {
-+              if (flags & D_PATH_FAIL_DELETED) {
-+                      buffer = ERR_PTR(-ENOENT);
-+                      goto out;
-+              }
-+              if (prepend(&buffer, &buflen, " (deleted)", 10) != 0)
-                       goto Elong;
--
-+      }
-       if (buflen < 1)
-               goto Elong;
--      /* Get '/' right */
--      retval = end-1;
--      *retval = '/';
--      for (;;) {
-+      while (dentry != root->dentry || vfsmnt != root->mnt) {
-               struct dentry * parent;
--              if (dentry == root->dentry && vfsmnt == root->mnt)
--                      break;
-               if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
--                      /* Global root? */
-                       if (vfsmnt->mnt_parent == vfsmnt) {
-                               goto global_root;
-                       }
-@@ -1945,27 +1947,51 @@ char *__d_path(const struct path *path,
-               }
-               parent = dentry->d_parent;
-               prefetch(parent);
--              if ((prepend_name(&end, &buflen, &dentry->d_name) != 0) ||
--                  (prepend(&end, &buflen, "/", 1) != 0))
-+              if ((prepend_name(&buffer, &buflen, &dentry->d_name) != 0) ||
-+                  (prepend(&buffer, &buflen, "/", 1) != 0))
-                       goto Elong;
--              retval = end;
-               dentry = parent;
-       }
-+      /* Get '/' right. */
-+      if (*buffer != '/' && prepend(&buffer, &buflen, "/", 1))
-+              goto Elong;
- out:
-       spin_unlock(&vfsmount_lock);
--      return retval;
-+      spin_unlock(&dcache_lock);
-+      return buffer;
- global_root:
--      retval += 1;    /* hit the slash */
--      if (prepend_name(&retval, &buflen, &dentry->d_name) != 0)
-+      /*
-+       * We went past the (vfsmount, dentry) we were looking for and have
-+       * either hit a root dentry, a lazily unmounted dentry, an
-+       * unconnected dentry, or the file is on a pseudo filesystem.
-+       */
-+        namelen = dentry->d_name.len;
-+      name = dentry->d_name.name;
-+
-+      /*
-+       * If this is a root dentry, then overwrite the slash.  This
-+       * will also DTRT with pseudo filesystems which have root
-+       * dentries named "foo:".
-+       */
-+      if (IS_ROOT(dentry) && *buffer == '/') {
-+              buffer++;
-+              buflen++;
-+      }
-+      if ((flags & D_PATH_DISCONNECT) && *name == '/') {
-+              /* Make sure we won't return a pathname starting with '/' */
-+              name++;
-+              namelen--;
-+      }
-+      if (prepend(&buffer, &buflen, name, namelen))
-               goto Elong;
-       root->mnt = vfsmnt;
-       root->dentry = dentry;
-       goto out;
- Elong:
--      retval = ERR_PTR(-ENAMETOOLONG);
-+      buffer = ERR_PTR(-ENAMETOOLONG);
-       goto out;
- }
-@@ -2002,10 +2028,8 @@ char *d_path(const struct path *path, ch
-       root = current->fs->root;
-       path_get(&root);
-       read_unlock(&current->fs->lock);
--      spin_lock(&dcache_lock);
-       tmp = root;
--      res = __d_path(path, &tmp, buf, buflen);
--      spin_unlock(&dcache_lock);
-+      res = __d_path(path, &tmp, buf, buflen, 0);
-       path_put(&root);
-       return res;
- }
-@@ -2088,9 +2112,9 @@ Elong:
-  */
- SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
- {
--      int error;
--      struct path pwd, root;
--      char *page = (char *) __get_free_page(GFP_USER);
-+      int error, len;
-+      struct path pwd, root, tmp;
-+      char *page = (char *) __get_free_page(GFP_USER), *cwd;
-       if (!page)
-               return -ENOMEM;
-@@ -2102,30 +2126,20 @@ SYSCALL_DEFINE2(getcwd, char __user *, b
-       path_get(&root);
-       read_unlock(&current->fs->lock);
--      error = -ENOENT;
--      /* Has the current directory has been unlinked? */
--      spin_lock(&dcache_lock);
--      if (IS_ROOT(pwd.dentry) || !d_unhashed(pwd.dentry)) {
--              unsigned long len;
--              struct path tmp = root;
--              char * cwd;
--
--              cwd = __d_path(&pwd, &tmp, page, PAGE_SIZE);
--              spin_unlock(&dcache_lock);
--
-+      tmp = root;
-+      cwd = __d_path(&pwd, &tmp, page, PAGE_SIZE, D_PATH_FAIL_DELETED);
-+      if (IS_ERR(cwd)) {
-               error = PTR_ERR(cwd);
--              if (IS_ERR(cwd))
--                      goto out;
-+              goto out;
-+      }
--              error = -ERANGE;
--              len = PAGE_SIZE + page - cwd;
--              if (len <= size) {
--                      error = len;
--                      if (copy_to_user(buf, cwd, len))
--                              error = -EFAULT;
--              }
--      } else
--              spin_unlock(&dcache_lock);
-+      error = -ERANGE;
-+      len = PAGE_SIZE + page - cwd;
-+      if (len <= size) {
-+              error = len;
-+              if (copy_to_user(buf, cwd, len))
-+                      error = -EFAULT;
-+      }
- out:
-       path_put(&pwd);
-Index: linux-2.6.27/fs/seq_file.c
-===================================================================
---- linux-2.6.27.orig/fs/seq_file.c
-+++ linux-2.6.27/fs/seq_file.c
-@@ -441,9 +441,7 @@ int seq_path_root(struct seq_file *m, st
-               char *s = m->buf + m->count;
-               char *p;
--              spin_lock(&dcache_lock);
--              p = __d_path(path, root, s, m->size - m->count);
--              spin_unlock(&dcache_lock);
-+              p = __d_path(path, root, s, m->size - m->count, 0);
-               err = PTR_ERR(p);
-               if (!IS_ERR(p)) {
-                       s = mangle_path(s, p, esc);
-Index: linux-2.6.27/include/linux/dcache.h
-===================================================================
---- linux-2.6.27.orig/include/linux/dcache.h
-+++ linux-2.6.27/include/linux/dcache.h
-@@ -299,9 +299,12 @@ extern int d_validate(struct dentry *, s
- /*
-  * helper function for dentry_operations.d_dname() members
-  */
-+#define D_PATH_FAIL_DELETED 1
-+#define D_PATH_DISCONNECT   2
- extern char *dynamic_dname(struct dentry *, char *, int, const char *, ...);
--extern char *__d_path(const struct path *path, struct path *root, char *, int);
-+extern char *__d_path(const struct path *path, struct path *root, char *, int,
-+                    int);
- extern char *d_path(const struct path *, char *, int);
- extern char *dentry_path(struct dentry *, char *, int);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-getxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-getxattr.diff
deleted file mode 100644 (file)
index 8219e1d..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_getxattr()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/nfsd/nfs4xdr.c         |    2 +-
- fs/nfsd/vfs.c             |   21 ++++++++++++---------
- fs/xattr.c                |   15 ++++++++-------
- include/linux/nfsd/nfsd.h |    3 ++-
- include/linux/xattr.h     |    2 +-
- 5 files changed, 24 insertions(+), 19 deletions(-)
-
---- a/fs/nfsd/nfs4xdr.c
-+++ b/fs/nfsd/nfs4xdr.c
-@@ -1446,7 +1446,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s
-       }
-       if (bmval0 & (FATTR4_WORD0_ACL | FATTR4_WORD0_ACLSUPPORT
-                       | FATTR4_WORD0_SUPPORTED_ATTRS)) {
--              err = nfsd4_get_nfs4_acl(rqstp, dentry, &acl);
-+              err = nfsd4_get_nfs4_acl(rqstp, dentry, exp->ex_path.mnt, &acl);
-               aclsupport = (err == 0);
-               if (bmval0 & FATTR4_WORD0_ACL) {
-                       if (err == -EOPNOTSUPP)
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -420,11 +420,12 @@ out_nfserr:
- #if defined(CONFIG_NFSD_V2_ACL) || \
-     defined(CONFIG_NFSD_V3_ACL) || \
-     defined(CONFIG_NFSD_V4)
--static ssize_t nfsd_getxattr(struct dentry *dentry, char *key, void **buf)
-+static ssize_t nfsd_getxattr(struct dentry *dentry, struct vfsmount *mnt,
-+                           char *key, void **buf)
- {
-       ssize_t buflen;
--      buflen = vfs_getxattr(dentry, key, NULL, 0);
-+      buflen = vfs_getxattr(dentry, mnt, key, NULL, 0);
-       if (buflen <= 0)
-               return buflen;
-@@ -432,7 +433,7 @@ static ssize_t nfsd_getxattr(struct dent
-       if (!*buf)
-               return -ENOMEM;
--      return vfs_getxattr(dentry, key, *buf, buflen);
-+      return vfs_getxattr(dentry, mnt, key, *buf, buflen);
- }
- #endif
-@@ -513,13 +514,13 @@ out_nfserr:
- }
- static struct posix_acl *
--_get_posix_acl(struct dentry *dentry, char *key)
-+_get_posix_acl(struct dentry *dentry, struct vfsmount *mnt, char *key)
- {
-       void *buf = NULL;
-       struct posix_acl *pacl = NULL;
-       int buflen;
--      buflen = nfsd_getxattr(dentry, key, &buf);
-+      buflen = nfsd_getxattr(dentry, mnt, key, &buf);
-       if (!buflen)
-               buflen = -ENODATA;
-       if (buflen <= 0)
-@@ -531,14 +532,15 @@ _get_posix_acl(struct dentry *dentry, ch
- }
- int
--nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry, struct nfs4_acl **acl)
-+nfsd4_get_nfs4_acl(struct svc_rqst *rqstp, struct dentry *dentry,
-+                 struct vfsmount *mnt, struct nfs4_acl **acl)
- {
-       struct inode *inode = dentry->d_inode;
-       int error = 0;
-       struct posix_acl *pacl = NULL, *dpacl = NULL;
-       unsigned int flags = 0;
--      pacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_ACCESS);
-+      pacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_ACCESS);
-       if (IS_ERR(pacl) && PTR_ERR(pacl) == -ENODATA)
-               pacl = posix_acl_from_mode(inode->i_mode, GFP_KERNEL);
-       if (IS_ERR(pacl)) {
-@@ -548,7 +550,7 @@ nfsd4_get_nfs4_acl(struct svc_rqst *rqst
-       }
-       if (S_ISDIR(inode->i_mode)) {
--              dpacl = _get_posix_acl(dentry, POSIX_ACL_XATTR_DEFAULT);
-+              dpacl = _get_posix_acl(dentry, mnt, POSIX_ACL_XATTR_DEFAULT);
-               if (IS_ERR(dpacl) && PTR_ERR(dpacl) == -ENODATA)
-                       dpacl = NULL;
-               else if (IS_ERR(dpacl)) {
-@@ -2080,7 +2082,8 @@ nfsd_get_posix_acl(struct svc_fh *fhp, i
-               return ERR_PTR(-EOPNOTSUPP);
-       }
--      size = nfsd_getxattr(fhp->fh_dentry, name, &value);
-+      size = nfsd_getxattr(fhp->fh_dentry, fhp->fh_export->ex_path.mnt, name,
-+                           &value);
-       if (size < 0)
-               return ERR_PTR(size);
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -131,7 +131,8 @@ out_noalloc:
- EXPORT_SYMBOL_GPL(xattr_getsecurity);
- ssize_t
--vfs_getxattr(struct dentry *dentry, const char *name, void *value, size_t size)
-+vfs_getxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name,
-+           void *value, size_t size)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -314,8 +315,8 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, cons
-  * Extended attribute GET operations
-  */
- static ssize_t
--getxattr(struct dentry *d, const char __user *name, void __user *value,
--       size_t size)
-+getxattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name,
-+       void __user *value, size_t size)
- {
-       ssize_t error;
-       void *kvalue = NULL;
-@@ -335,7 +336,7 @@ getxattr(struct dentry *d, const char __
-                       return -ENOMEM;
-       }
--      error = vfs_getxattr(d, kname, kvalue, size);
-+      error = vfs_getxattr(dentry, mnt, kname, kvalue, size);
-       if (error > 0) {
-               if (size && copy_to_user(value, kvalue, error))
-                       error = -EFAULT;
-@@ -357,7 +358,7 @@ SYSCALL_DEFINE4(getxattr, const char __u
-       error = user_path(pathname, &path);
-       if (error)
-               return error;
--      error = getxattr(path.dentry, name, value, size);
-+      error = getxattr(path.dentry, path.mnt, name, value, size);
-       path_put(&path);
-       return error;
- }
-@@ -371,7 +372,7 @@ SYSCALL_DEFINE4(lgetxattr, const char __
-       error = user_lpath(pathname, &path);
-       if (error)
-               return error;
--      error = getxattr(path.dentry, name, value, size);
-+      error = getxattr(path.dentry, path.mnt, name, value, size);
-       path_put(&path);
-       return error;
- }
-@@ -386,7 +387,7 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, cons
-       if (!f)
-               return error;
-       audit_inode(NULL, f->f_path.dentry);
--      error = getxattr(f->f_path.dentry, name, value, size);
-+      error = getxattr(f->f_path.dentry, f->f_path.mnt, name, value, size);
-       fput(f);
-       return error;
- }
---- a/include/linux/nfsd/nfsd.h
-+++ b/include/linux/nfsd/nfsd.h
-@@ -85,7 +85,8 @@ __be32               nfsd_setattr(struct svc_rqst *, 
- #ifdef CONFIG_NFSD_V4
- __be32          nfsd4_set_nfs4_acl(struct svc_rqst *, struct svc_fh *,
-                     struct nfs4_acl *);
--int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *, struct nfs4_acl **);
-+int             nfsd4_get_nfs4_acl(struct svc_rqst *, struct dentry *,
-+                              struct vfsmount *mnt, struct nfs4_acl **);
- #endif /* CONFIG_NFSD_V4 */
- __be32                nfsd_create(struct svc_rqst *, struct svc_fh *,
-                               char *name, int len, struct iattr *attrs,
---- a/include/linux/xattr.h
-+++ b/include/linux/xattr.h
-@@ -48,7 +48,7 @@ struct xattr_handler {
- };
- ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);
--ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);
-+ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t);
- ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
- int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int);
- int vfs_removexattr(struct dentry *, const char *);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-link.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-link.diff
deleted file mode 100644 (file)
index 2c0a53a..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add struct vfsmount parameters to vfs_link()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c |    9 +++++++--
- fs/namei.c          |    6 ++++--
- fs/nfsd/vfs.c       |    3 ++-
- include/linux/fs.h  |    2 +-
- 4 files changed, 14 insertions(+), 6 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -403,19 +403,24 @@ static int ecryptfs_link(struct dentry *
-                        struct dentry *new_dentry)
- {
-       struct dentry *lower_old_dentry;
-+      struct vfsmount *lower_old_mnt;
-       struct dentry *lower_new_dentry;
-+      struct vfsmount *lower_new_mnt;
-       struct dentry *lower_dir_dentry;
-       u64 file_size_save;
-       int rc;
-       file_size_save = i_size_read(old_dentry->d_inode);
-       lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
-+      lower_old_mnt = ecryptfs_dentry_to_lower_mnt(old_dentry);
-       lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
-+      lower_new_mnt = ecryptfs_dentry_to_lower_mnt(new_dentry);
-       dget(lower_old_dentry);
-       dget(lower_new_dentry);
-       lower_dir_dentry = lock_parent(lower_new_dentry);
--      rc = vfs_link(lower_old_dentry, lower_dir_dentry->d_inode,
--                    lower_new_dentry);
-+      rc = vfs_link(lower_old_dentry, lower_old_mnt,
-+                    lower_dir_dentry->d_inode, lower_new_dentry,
-+                    lower_new_mnt);
-       if (rc || !lower_new_dentry->d_inode)
-               goto out_lock;
-       rc = ecryptfs_interpose(lower_new_dentry, new_dentry, dir->i_sb, 0);
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2412,7 +2412,7 @@ SYSCALL_DEFINE2(symlink, const char __us
-       return sys_symlinkat(oldname, AT_FDCWD, newname);
- }
--int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_dentry)
-+int vfs_link(struct dentry *old_dentry, struct vfsmount *old_mnt, struct inode *dir, struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       struct inode *inode = old_dentry->d_inode;
-       int error;
-@@ -2490,7 +2490,9 @@ SYSCALL_DEFINE5(linkat, int, olddfd, con
-       error = mnt_want_write(nd.path.mnt);
-       if (error)
-               goto out_dput;
--      error = vfs_link(old_path.dentry, nd.path.dentry->d_inode, new_dentry);
-+      error = vfs_link(old_path.dentry, old_path.mnt,
-+                       nd.path.dentry->d_inode,
-+                       new_dentry, nd.path.mnt);
-       mnt_drop_write(nd.path.mnt);
- out_dput:
-       dput(new_dentry);
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1650,7 +1650,8 @@ nfsd_link(struct svc_rqst *rqstp, struct
-               err = nfserrno(host_err);
-               goto out_dput;
-       }
--      host_err = vfs_link(dold, dirp, dnew);
-+      host_err = vfs_link(dold, tfhp->fh_export->ex_path.mnt, dirp,
-+                          dnew, ffhp->fh_export->ex_path.mnt);
-       if (!host_err) {
-               if (EX_ISSYNC(ffhp->fh_export)) {
-                       err = nfserrno(nfsd_sync_dir(ddir));
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1181,7 +1181,7 @@ extern int vfs_create(struct inode *, st
- extern int vfs_mkdir(struct inode *, struct dentry *, struct vfsmount *, int);
- extern int vfs_mknod(struct inode *, struct dentry *, struct vfsmount *, int, dev_t);
- extern int vfs_symlink(struct inode *, struct dentry *, struct vfsmount *, const char *);
--extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
-+extern int vfs_link(struct dentry *, struct vfsmount *, struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
- extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-listxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-listxattr.diff
deleted file mode 100644 (file)
index 2c6f24e..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_listxattr()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/xattr.c            |   25 ++++++++++++++-----------
- include/linux/xattr.h |    2 +-
- 2 files changed, 15 insertions(+), 12 deletions(-)
-
---- a/fs/xattr.c
-+++ b/fs/xattr.c
-@@ -168,18 +168,20 @@ nolsm:
- EXPORT_SYMBOL_GPL(vfs_getxattr);
- ssize_t
--vfs_listxattr(struct dentry *d, char *list, size_t size)
-+vfs_listxattr(struct dentry *dentry, struct vfsmount *mnt, char *list,
-+            size_t size)
- {
-+      struct inode *inode = dentry->d_inode;
-       ssize_t error;
--      error = security_inode_listxattr(d);
-+      error = security_inode_listxattr(dentry);
-       if (error)
-               return error;
-       error = -EOPNOTSUPP;
--      if (d->d_inode->i_op && d->d_inode->i_op->listxattr) {
--              error = d->d_inode->i_op->listxattr(d, list, size);
--      } else {
--              error = security_inode_listsecurity(d->d_inode, list, size);
-+      if (inode->i_op && inode->i_op->listxattr)
-+              error = inode->i_op->listxattr(dentry, list, size);
-+      else {
-+              error = security_inode_listsecurity(inode, list, size);
-               if (size && error > size)
-                       error = -ERANGE;
-       }
-@@ -396,7 +398,8 @@ SYSCALL_DEFINE4(fgetxattr, int, fd, cons
-  * Extended attribute LIST operations
-  */
- static ssize_t
--listxattr(struct dentry *d, char __user *list, size_t size)
-+listxattr(struct dentry *dentry, struct vfsmount *mnt, char __user *list,
-+        size_t size)
- {
-       ssize_t error;
-       char *klist = NULL;
-@@ -409,7 +412,7 @@ listxattr(struct dentry *d, char __user 
-                       return -ENOMEM;
-       }
--      error = vfs_listxattr(d, klist, size);
-+      error = vfs_listxattr(dentry, mnt, klist, size);
-       if (error > 0) {
-               if (size && copy_to_user(list, klist, error))
-                       error = -EFAULT;
-@@ -431,7 +434,7 @@ SYSCALL_DEFINE3(listxattr, const char __
-       error = user_path(pathname, &path);
-       if (error)
-               return error;
--      error = listxattr(path.dentry, list, size);
-+      error = listxattr(path.dentry, path.mnt, list, size);
-       path_put(&path);
-       return error;
- }
-@@ -445,7 +448,7 @@ SYSCALL_DEFINE3(llistxattr, const char _
-       error = user_lpath(pathname, &path);
-       if (error)
-               return error;
--      error = listxattr(path.dentry, list, size);
-+      error = listxattr(path.dentry, path.mnt, list, size);
-       path_put(&path);
-       return error;
- }
-@@ -459,7 +462,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, cha
-       if (!f)
-               return error;
-       audit_inode(NULL, f->f_path.dentry);
--      error = listxattr(f->f_path.dentry, list, size);
-+      error = listxattr(f->f_path.dentry, f->f_path.mnt, list, size);
-       fput(f);
-       return error;
- }
---- a/include/linux/xattr.h
-+++ b/include/linux/xattr.h
-@@ -49,7 +49,7 @@ struct xattr_handler {
- ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);
- ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t);
--ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
-+ssize_t vfs_listxattr(struct dentry *d, struct vfsmount *, char *list, size_t size);
- int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int);
- int vfs_removexattr(struct dentry *, const char *);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mkdir.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mkdir.diff
deleted file mode 100644 (file)
index 9e45fa8..0000000
+++ /dev/null
@@ -1,137 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add struct vfsmount parameter to vfs_mkdir()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c   |    5 ++++-
- fs/namei.c            |    5 +++--
- fs/nfsd/nfs4recover.c |    3 ++-
- fs/nfsd/vfs.c         |    8 +++++---
- include/linux/fs.h    |    2 +-
- kernel/cgroup.c       |    2 +-
- 6 files changed, 16 insertions(+), 9 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -501,11 +501,14 @@ static int ecryptfs_mkdir(struct inode *
- {
-       int rc;
-       struct dentry *lower_dentry;
-+      struct vfsmount *lower_mnt;
-       struct dentry *lower_dir_dentry;
-       lower_dentry = ecryptfs_dentry_to_lower(dentry);
-+      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       lower_dir_dentry = lock_parent(lower_dentry);
--      rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, mode);
-+      rc = vfs_mkdir(lower_dir_dentry->d_inode, lower_dentry, lower_mnt,
-+                     mode);
-       if (rc || !lower_dentry->d_inode)
-               goto out;
-       rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0);
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2077,7 +2077,8 @@ SYSCALL_DEFINE3(mknod, const char __user
-       return sys_mknodat(AT_FDCWD, filename, mode, dev);
- }
--int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-+int vfs_mkdir(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+            int mode)
- {
-       int error = may_create(dir, dentry, 1);
-@@ -2120,7 +2121,7 @@ SYSCALL_DEFINE3(mkdirat, int, dfd, const
-       error = mnt_want_write(nd.path.mnt);
-       if (error)
-               goto out_dput;
--      error = vfs_mkdir(nd.path.dentry->d_inode, dentry, mode);
-+      error = vfs_mkdir(nd.path.dentry->d_inode, dentry, nd.path.mnt, mode);
-       mnt_drop_write(nd.path.mnt);
- out_dput:
-       dput(dentry);
---- a/fs/nfsd/nfs4recover.c
-+++ b/fs/nfsd/nfs4recover.c
-@@ -158,7 +158,8 @@ nfsd4_create_clid_dir(struct nfs4_client
-       status = mnt_want_write(rec_dir.path.mnt);
-       if (status)
-               goto out_put;
--      status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry, S_IRWXU);
-+      status = vfs_mkdir(rec_dir.path.dentry->d_inode, dentry,
-+                         rec_dir.path.mnt, S_IRWXU);
-       mnt_drop_write(rec_dir.path.mnt);
- out_put:
-       dput(dentry);
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1215,6 +1215,7 @@ nfsd_create(struct svc_rqst *rqstp, stru
-               int type, dev_t rdev, struct svc_fh *resfhp)
- {
-       struct dentry   *dentry, *dchild = NULL;
-+      struct svc_export *exp;
-       struct inode    *dirp;
-       __be32          err;
-       __be32          err2;
-@@ -1232,6 +1233,7 @@ nfsd_create(struct svc_rqst *rqstp, stru
-               goto out;
-       dentry = fhp->fh_dentry;
-+      exp = fhp->fh_export;
-       dirp = dentry->d_inode;
-       err = nfserr_notdir;
-@@ -1248,7 +1250,7 @@ nfsd_create(struct svc_rqst *rqstp, stru
-               host_err = PTR_ERR(dchild);
-               if (IS_ERR(dchild))
-                       goto out_nfserr;
--              err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);
-+              err = fh_compose(resfhp, exp, dchild, fhp);
-               if (err)
-                       goto out;
-       } else {
-@@ -1298,7 +1300,7 @@ nfsd_create(struct svc_rqst *rqstp, stru
-               host_err = vfs_create(dirp, dchild, iap->ia_mode, NULL);
-               break;
-       case S_IFDIR:
--              host_err = vfs_mkdir(dirp, dchild, iap->ia_mode);
-+              host_err = vfs_mkdir(dirp, dchild, exp->ex_path.mnt, iap->ia_mode);
-               break;
-       case S_IFCHR:
-       case S_IFBLK:
-@@ -1312,7 +1314,7 @@ nfsd_create(struct svc_rqst *rqstp, stru
-               goto out_nfserr;
-       }
--      if (EX_ISSYNC(fhp->fh_export)) {
-+      if (EX_ISSYNC(exp)) {
-               err = nfserrno(nfsd_sync_dir(dentry));
-               write_inode_now(dchild->d_inode, 1);
-       }
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1178,7 +1178,7 @@ extern void unlock_super(struct super_bl
-  */
- extern int vfs_permission(struct nameidata *, int);
- extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *);
--extern int vfs_mkdir(struct inode *, struct dentry *, int);
-+extern int vfs_mkdir(struct inode *, struct dentry *, struct vfsmount *, int);
- extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t);
- extern int vfs_symlink(struct inode *, struct dentry *, const char *);
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
---- a/kernel/cgroup.c
-+++ b/kernel/cgroup.c
-@@ -2911,7 +2911,7 @@ int cgroup_clone(struct task_struct *tsk
-       }
-       /* Create the cgroup directory, which also creates the cgroup */
--      ret = vfs_mkdir(inode, dentry, S_IFDIR | 0755);
-+      ret = vfs_mkdir(inode, dentry, NULL, S_IFDIR | 0755);
-       child = __d_cgrp(dentry);
-       dput(dentry);
-       if (ret) {
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-mknod.diff
deleted file mode 100644 (file)
index cc12392..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_mknod()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c |    5 ++++-
- fs/namei.c          |   10 ++++++----
- fs/nfsd/vfs.c       |    3 ++-
- include/linux/fs.h  |    2 +-
- net/unix/af_unix.c  |    3 ++-
- 5 files changed, 15 insertions(+), 8 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -552,11 +552,14 @@ ecryptfs_mknod(struct inode *dir, struct
- {
-       int rc;
-       struct dentry *lower_dentry;
-+      struct vfsmount *lower_mnt;
-       struct dentry *lower_dir_dentry;
-       lower_dentry = ecryptfs_dentry_to_lower(dentry);
-+      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       lower_dir_dentry = lock_parent(lower_dentry);
--      rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, mode, dev);
-+      rc = vfs_mknod(lower_dir_dentry->d_inode, lower_dentry, lower_mnt, mode,
-+                     dev);
-       if (rc || !lower_dentry->d_inode)
-               goto out;
-       rc = ecryptfs_interpose(lower_dentry, dentry, dir->i_sb, 0);
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1976,7 +1976,8 @@ fail:
- }
- EXPORT_SYMBOL_GPL(lookup_create);
--int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
-+int vfs_mknod(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+            int mode, dev_t dev)
- {
-       int error = may_create(dir, dentry, 0);
-@@ -2054,11 +2055,12 @@ SYSCALL_DEFINE4(mknodat, int, dfd, const
-                       error = vfs_create(nd.path.dentry->d_inode,dentry,mode,&nd);
-                       break;
-               case S_IFCHR: case S_IFBLK:
--                      error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,
--                                      new_decode_dev(dev));
-+                      error = vfs_mknod(nd.path.dentry->d_inode, dentry,
-+                                        nd.path, mode, new_decode_dev(dev));
-                       break;
-               case S_IFIFO: case S_IFSOCK:
--                      error = vfs_mknod(nd.path.dentry->d_inode,dentry,mode,0);
-+                      error = vfs_mknod(nd.path.dentry->d_inode, dentry,
-+                                        nd.path, mode, 0);
-                       break;
-       }
-       mnt_drop_write(nd.path.mnt);
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1306,7 +1306,8 @@ nfsd_create(struct svc_rqst *rqstp, stru
-       case S_IFBLK:
-       case S_IFIFO:
-       case S_IFSOCK:
--              host_err = vfs_mknod(dirp, dchild, iap->ia_mode, rdev);
-+              host_err = vfs_mknod(dirp, dchild, exp->ex_path.mnt,
-+                                   iap->ia_mode, rdev);
-               break;
-       }
-       if (host_err < 0) {
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1179,7 +1179,7 @@ extern void unlock_super(struct super_bl
- extern int vfs_permission(struct nameidata *, int);
- extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *);
- extern int vfs_mkdir(struct inode *, struct dentry *, struct vfsmount *, int);
--extern int vfs_mknod(struct inode *, struct dentry *, int, dev_t);
-+extern int vfs_mknod(struct inode *, struct dentry *, struct vfsmount *, int, dev_t);
- extern int vfs_symlink(struct inode *, struct dentry *, const char *);
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
---- a/net/unix/af_unix.c
-+++ b/net/unix/af_unix.c
-@@ -827,7 +827,8 @@ static int unix_bind(struct socket *sock
-               err = mnt_want_write(nd.path.mnt);
-               if (err)
-                       goto out_mknod_dput;
--              err = vfs_mknod(nd.path.dentry->d_inode, dentry, mode, 0);
-+              err = vfs_mknod(nd.path.dentry->d_inode, dentry, nd.path.mnt,
-+                              mode, 0);
-               mnt_drop_write(nd.path.mnt);
-               if (err)
-                       goto out_mknod_dput;
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-notify_change.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-notify_change.diff
deleted file mode 100644 (file)
index 478d569..0000000
+++ /dev/null
@@ -1,291 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a vfsmount parameter to notify_change()
-
-The vfsmount parameter must be set appropriately for files visibile
-outside the kernel. Files that are only used in a filesystem (e.g.,
-reiserfs xattr files) will have a NULL vfsmount.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/attr.c           |    3 ++-
- fs/ecryptfs/inode.c |    4 +++-
- fs/exec.c           |    3 ++-
- fs/hpfs/namei.c     |    2 +-
- fs/namei.c          |    2 +-
- fs/nfsd/vfs.c       |    8 ++++----
- fs/open.c           |   28 +++++++++++++++-------------
- fs/utimes.c         |    2 +-
- include/linux/fs.h  |    6 +++---
- mm/filemap.c        |    2 +-
- 10 files changed, 33 insertions(+), 27 deletions(-)
-
---- a/fs/attr.c
-+++ b/fs/attr.c
-@@ -100,7 +100,8 @@ int inode_setattr(struct inode * inode,
- }
- EXPORT_SYMBOL(inode_setattr);
--int notify_change(struct dentry * dentry, struct iattr * attr)
-+int notify_change(struct dentry *dentry, struct vfsmount *mnt,
-+                struct iattr *attr)
- {
-       struct inode *inode = dentry->d_inode;
-       mode_t mode = inode->i_mode;
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -850,6 +850,7 @@ static int ecryptfs_setattr(struct dentr
- {
-       int rc = 0;
-       struct dentry *lower_dentry;
-+      struct vfsmount *lower_mnt;
-       struct inode *inode;
-       struct inode *lower_inode;
-       struct ecryptfs_crypt_stat *crypt_stat;
-@@ -860,6 +861,7 @@ static int ecryptfs_setattr(struct dentr
-       inode = dentry->d_inode;
-       lower_inode = ecryptfs_inode_to_lower(inode);
-       lower_dentry = ecryptfs_dentry_to_lower(dentry);
-+      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       mutex_lock(&crypt_stat->cs_mutex);
-       if (S_ISDIR(dentry->d_inode->i_mode))
-               crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED);
-@@ -911,7 +913,7 @@ static int ecryptfs_setattr(struct dentr
-               ia->ia_valid &= ~ATTR_MODE;
-       mutex_lock(&lower_dentry->d_inode->i_mutex);
--      rc = notify_change(lower_dentry, ia);
-+      rc = notify_change(lower_dentry, lower_mnt, ia);
-       mutex_unlock(&lower_dentry->d_inode->i_mutex);
- out:
-       fsstack_copy_attr_all(inode, lower_inode, NULL);
---- a/fs/exec.c
-+++ b/fs/exec.c
-@@ -1841,7 +1841,8 @@ int do_coredump(long signr, int exit_cod
-               goto close_fail;
-       if (!file->f_op->write)
-               goto close_fail;
--      if (!ispipe && do_truncate(file->f_path.dentry, 0, 0, file) != 0)
-+      if (!ispipe &&
-+          do_truncate(file->f_path.dentry, file->f_path.mnt, 0, 0, file) != 0)
-               goto close_fail;
-       retval = binfmt->core_dump(signr, regs, file, core_limit);
---- a/fs/hpfs/namei.c
-+++ b/fs/hpfs/namei.c
-@@ -426,7 +426,7 @@ again:
-                       /*printk("HPFS: truncating file before delete.\n");*/
-                       newattrs.ia_size = 0;
-                       newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--                      err = notify_change(dentry, &newattrs);
-+                      err = notify_change(dentry, NULL, &newattrs);
-                       put_write_access(inode);
-                       if (!err)
-                               goto again;
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1619,7 +1619,7 @@ int may_open(struct nameidata *nd, int a
-               if (!error) {
-                       DQUOT_INIT(inode);
--                      error = do_truncate(dentry, 0,
-+                      error = do_truncate(dentry, nd->path.mnt, 0,
-                                           ATTR_MTIME|ATTR_CTIME|ATTR_OPEN,
-                                           NULL);
-               }
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -397,7 +397,7 @@ nfsd_setattr(struct svc_rqst *rqstp, str
-       err = nfserr_notsync;
-       if (!check_guard || guardtime == inode->i_ctime.tv_sec) {
-               fh_lock(fhp);
--              host_err = notify_change(dentry, iap);
-+              host_err = notify_change(dentry, fhp->fh_export->ex_path.mnt, iap);
-               /* to get NFSERR_JUKEBOX on the wire, need -ETIMEDOUT */
-               if (host_err == -EAGAIN)
-                       host_err = -ETIMEDOUT;
-@@ -964,13 +964,13 @@ out:
-       return err;
- }
--static void kill_suid(struct dentry *dentry)
-+static void kill_suid(struct dentry *dentry, struct vfsmount *mnt)
- {
-       struct iattr    ia;
-       ia.ia_valid = ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
-       mutex_lock(&dentry->d_inode->i_mutex);
--      notify_change(dentry, &ia);
-+      notify_change(dentry, mnt, &ia);
-       mutex_unlock(&dentry->d_inode->i_mutex);
- }
-@@ -1033,7 +1033,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, s
-       /* clear setuid/setgid flag after write */
-       if (host_err >= 0 && (inode->i_mode & (S_ISUID | S_ISGID)))
--              kill_suid(dentry);
-+              kill_suid(dentry, exp->ex_path.mnt);
-       if (host_err >= 0 && stable) {
-               static ino_t    last_ino;
---- a/fs/open.c
-+++ b/fs/open.c
-@@ -195,8 +195,8 @@ out:
-       return error;
- }
--int do_truncate(struct dentry *dentry, loff_t length, unsigned int time_attrs,
--      struct file *filp)
-+int do_truncate(struct dentry *dentry, struct vfsmount *mnt, loff_t length,
-+              unsigned int time_attrs, struct file *filp)
- {
-       int err;
-       struct iattr newattrs;
-@@ -216,7 +216,7 @@ int do_truncate(struct dentry *dentry, l
-       newattrs.ia_valid |= should_remove_suid(dentry);
-       mutex_lock(&dentry->d_inode->i_mutex);
--      err = notify_change(dentry, &newattrs);
-+      err = notify_change(dentry, mnt, &newattrs);
-       mutex_unlock(&dentry->d_inode->i_mutex);
-       return err;
- }
-@@ -272,7 +272,7 @@ static long do_sys_truncate(const char _
-       error = locks_verify_truncate(inode, NULL, length);
-       if (!error) {
-               DQUOT_INIT(inode);
--              error = do_truncate(path.dentry, length, 0, NULL);
-+              error = do_truncate(path.dentry, path.mnt, length, 0, NULL);
-       }
- put_write_and_out:
-@@ -327,7 +327,8 @@ static long do_sys_ftruncate(unsigned in
-       error = locks_verify_truncate(inode, file, length);
-       if (!error)
--              error = do_truncate(dentry, length, ATTR_MTIME|ATTR_CTIME, file);
-+              error = do_truncate(dentry, file->f_path.mnt, length,
-+                                  ATTR_MTIME|ATTR_CTIME, file);
- out_putf:
-       fput(file);
- out:
-@@ -624,7 +625,7 @@ SYSCALL_DEFINE2(fchmod, unsigned int, fd
-               mode = inode->i_mode;
-       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
-       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--      err = notify_change(dentry, &newattrs);
-+      err = notify_change(dentry, file->f_path.mnt, &newattrs);
-       mutex_unlock(&inode->i_mutex);
-       mnt_drop_write(file->f_path.mnt);
- out_putf:
-@@ -653,7 +654,7 @@ SYSCALL_DEFINE3(fchmodat, int, dfd, cons
-               mode = inode->i_mode;
-       newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~S_IALLUGO);
-       newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
--      error = notify_change(path.dentry, &newattrs);
-+      error = notify_change(path.dentry, path.mnt, &newattrs);
-       mutex_unlock(&inode->i_mutex);
-       mnt_drop_write(path.mnt);
- dput_and_out:
-@@ -667,7 +668,8 @@ SYSCALL_DEFINE2(chmod, const char __user
-       return sys_fchmodat(AT_FDCWD, filename, mode);
- }
--static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
-+static int chown_common(struct dentry * dentry, struct vfsmount *mnt,
-+                      uid_t user, gid_t group)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -686,7 +688,7 @@ static int chown_common(struct dentry *
-               newattrs.ia_valid |=
-                       ATTR_KILL_SUID | ATTR_KILL_SGID | ATTR_KILL_PRIV;
-       mutex_lock(&inode->i_mutex);
--      error = notify_change(dentry, &newattrs);
-+      error = notify_change(dentry, mnt, &newattrs);
-       mutex_unlock(&inode->i_mutex);
-       return error;
-@@ -703,7 +705,7 @@ SYSCALL_DEFINE3(chown, const char __user
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -728,7 +730,7 @@ SYSCALL_DEFINE5(fchownat, int, dfd, cons
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -747,7 +749,7 @@ SYSCALL_DEFINE3(lchown, const char __use
-       error = mnt_want_write(path.mnt);
-       if (error)
-               goto out_release;
--      error = chown_common(path.dentry, user, group);
-+      error = chown_common(path.dentry, path.mnt, user, group);
-       mnt_drop_write(path.mnt);
- out_release:
-       path_put(&path);
-@@ -770,7 +772,7 @@ SYSCALL_DEFINE3(fchown, unsigned int, fd
-               goto out_fput;
-       dentry = file->f_path.dentry;
-       audit_inode(NULL, dentry);
--      error = chown_common(dentry, user, group);
-+      error = chown_common(dentry, file->f_path.mnt, user, group);
-       mnt_drop_write(file->f_path.mnt);
- out_fput:
-       fput(file);
---- a/fs/utimes.c
-+++ b/fs/utimes.c
-@@ -102,7 +102,7 @@ static int utimes_common(struct path *pa
-               }
-       }
-       mutex_lock(&inode->i_mutex);
--      error = notify_change(path->dentry, &newattrs);
-+      error = notify_change(path->dentry, path->mnt, &newattrs);
-       mutex_unlock(&inode->i_mutex);
- mnt_drop_write_and_out:
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1636,8 +1636,8 @@ static inline int break_lease(struct ino
- /* fs/open.c */
--extern int do_truncate(struct dentry *, loff_t start, unsigned int time_attrs,
--                     struct file *filp);
-+extern int do_truncate(struct dentry *, struct vfsmount *, loff_t start,
-+                     unsigned int time_attrs, struct file *filp);
- extern long do_sys_open(int dfd, const char __user *filename, int flags,
-                       int mode);
- extern struct file *filp_open(const char *, int, int);
-@@ -1798,7 +1798,7 @@ extern int do_remount_sb(struct super_bl
- #ifdef CONFIG_BLOCK
- extern sector_t bmap(struct inode *, sector_t);
- #endif
--extern int notify_change(struct dentry *, struct iattr *);
-+extern int notify_change(struct dentry *, struct vfsmount *, struct iattr *);
- extern int inode_permission(struct inode *, int);
- extern int generic_permission(struct inode *, int,
-               int (*check_acl)(struct inode *, int));
---- a/mm/filemap.c
-+++ b/mm/filemap.c
-@@ -1831,7 +1831,7 @@ static int __remove_suid(struct path *pa
-       struct iattr newattrs;
-       newattrs.ia_valid = ATTR_FORCE | kill;
--      return notify_change(path->dentry, &newattrs);
-+      return notify_change(path->dentry, path->mnt, &newattrs);
- }
- int file_remove_suid(struct file *file)
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-removexattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-removexattr.diff
deleted file mode 100644 (file)
index 18d6fee..0000000
+++ /dev/null
@@ -1,127 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_removexattr()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/nfsd/vfs.c         |   11 ++++++-----
- fs/xattr.c            |   12 ++++++------
- include/linux/xattr.h |    2 +-
- 3 files changed, 13 insertions(+), 12 deletions(-)
-
-Index: linux-2.6.27/fs/nfsd/vfs.c
-===================================================================
---- linux-2.6.27.orig/fs/nfsd/vfs.c
-+++ linux-2.6.27/fs/nfsd/vfs.c
-@@ -2095,6 +2095,7 @@ nfsd_get_posix_acl(struct svc_fh *fhp, i
- int
- nfsd_set_posix_acl(struct svc_fh *fhp, int type, struct posix_acl *acl)
- {
-+      struct vfsmount *mnt;
-       struct inode *inode = fhp->fh_dentry->d_inode;
-       char *name;
-       void *value = NULL;
-@@ -2127,22 +2128,22 @@ nfsd_set_posix_acl(struct svc_fh *fhp, i
-       } else
-               size = 0;
--      error = mnt_want_write(fhp->fh_export->ex_path.mnt);
-+      mnt = fhp->fh_export->ex_path.mnt;
-+      error = mnt_want_write(mnt);
-       if (error)
-               goto getout;
-       if (size)
--              error = vfs_setxattr(fhp->fh_dentry, fhp->fh_export->ex_path.mnt,
--                                   name, value, size,0);
-+              error = vfs_setxattr(fhp->fh_dentry, mnt, name, value, size,0);
-       else {
-               if (!S_ISDIR(inode->i_mode) && type == ACL_TYPE_DEFAULT)
-                       error = 0;
-               else {
--                      error = vfs_removexattr(fhp->fh_dentry, name);
-+                      error = vfs_removexattr(fhp->fh_dentry, mnt, name);
-                       if (error == -ENODATA)
-                               error = 0;
-               }
-       }
--      mnt_drop_write(fhp->fh_export->ex_path.mnt);
-+      mnt_drop_write(mnt);
- getout:
-       kfree(value);
-Index: linux-2.6.27/fs/xattr.c
-===================================================================
---- linux-2.6.27.orig/fs/xattr.c
-+++ linux-2.6.27/fs/xattr.c
-@@ -190,7 +190,7 @@ vfs_listxattr(struct dentry *dentry, str
- EXPORT_SYMBOL_GPL(vfs_listxattr);
- int
--vfs_removexattr(struct dentry *dentry, const char *name)
-+vfs_removexattr(struct dentry *dentry, struct vfsmount *mnt, const char *name)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -471,7 +471,7 @@ SYSCALL_DEFINE3(flistxattr, int, fd, cha
-  * Extended attribute REMOVE operations
-  */
- static long
--removexattr(struct dentry *d, const char __user *name)
-+removexattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name)
- {
-       int error;
-       char kname[XATTR_NAME_MAX + 1];
-@@ -482,7 +482,7 @@ removexattr(struct dentry *d, const char
-       if (error < 0)
-               return error;
--      return vfs_removexattr(d, kname);
-+      return vfs_removexattr(dentry, mnt, kname);
- }
- SYSCALL_DEFINE2(removexattr, const char __user *, pathname,
-@@ -496,7 +496,7 @@ SYSCALL_DEFINE2(removexattr, const char
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = removexattr(path.dentry, name);
-+              error = removexattr(path.dentry, path.mnt, name);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -514,7 +514,7 @@ SYSCALL_DEFINE2(lremovexattr, const char
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = removexattr(path.dentry, name);
-+              error = removexattr(path.dentry, path.mnt, name);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -534,7 +534,7 @@ SYSCALL_DEFINE2(fremovexattr, int, fd, c
-       audit_inode(NULL, dentry);
-       error = mnt_want_write_file(f->f_path.mnt, f);
-       if (!error) {
--              error = removexattr(dentry, name);
-+              error = removexattr(dentry, f->f_path.mnt, name);
-               mnt_drop_write(f->f_path.mnt);
-       }
-       fput(f);
-Index: linux-2.6.27/include/linux/xattr.h
-===================================================================
---- linux-2.6.27.orig/include/linux/xattr.h
-+++ linux-2.6.27/include/linux/xattr.h
-@@ -51,7 +51,7 @@ ssize_t xattr_getsecurity(struct inode *
- ssize_t vfs_getxattr(struct dentry *, struct vfsmount *, const char *, void *, size_t);
- ssize_t vfs_listxattr(struct dentry *d, struct vfsmount *, char *list, size_t size);
- int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int);
--int vfs_removexattr(struct dentry *, const char *);
-+int vfs_removexattr(struct dentry *, struct vfsmount *mnt, const char *);
- ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size);
- ssize_t generic_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-rename.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-rename.diff
deleted file mode 100644 (file)
index 2dd07da..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add struct vfsmount parameters to vfs_rename()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c |    7 ++++++-
- fs/namei.c          |   19 ++++++++++++-------
- fs/nfsd/vfs.c       |    3 ++-
- include/linux/fs.h  |    2 +-
- 4 files changed, 21 insertions(+), 10 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -590,19 +590,24 @@ ecryptfs_rename(struct inode *old_dir, s
- {
-       int rc;
-       struct dentry *lower_old_dentry;
-+      struct vfsmount *lower_old_mnt;
-       struct dentry *lower_new_dentry;
-+      struct vfsmount *lower_new_mnt;
-       struct dentry *lower_old_dir_dentry;
-       struct dentry *lower_new_dir_dentry;
-       lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry);
-+      lower_old_mnt = ecryptfs_dentry_to_lower_mnt(old_dentry);
-       lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry);
-+      lower_new_mnt = ecryptfs_dentry_to_lower_mnt(new_dentry);
-       dget(lower_old_dentry);
-       dget(lower_new_dentry);
-       lower_old_dir_dentry = dget_parent(lower_old_dentry);
-       lower_new_dir_dentry = dget_parent(lower_new_dentry);
-       lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
-       rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry,
--                      lower_new_dir_dentry->d_inode, lower_new_dentry);
-+                      lower_old_mnt, lower_new_dir_dentry->d_inode,
-+                      lower_new_dentry, lower_new_mnt);
-       if (rc)
-               goto out_lock;
-       fsstack_copy_attr_all(new_dir, lower_new_dir_dentry->d_inode, NULL);
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2547,7 +2547,8 @@ SYSCALL_DEFINE2(link, const char __user
-  *       locking].
-  */
- static int vfs_rename_dir(struct inode *old_dir, struct dentry *old_dentry,
--                        struct inode *new_dir, struct dentry *new_dentry)
-+                        struct vfsmount *old_mnt, struct inode *new_dir,
-+                        struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       int error = 0;
-       struct inode *target;
-@@ -2590,7 +2591,8 @@ static int vfs_rename_dir(struct inode *
- }
- static int vfs_rename_other(struct inode *old_dir, struct dentry *old_dentry,
--                          struct inode *new_dir, struct dentry *new_dentry)
-+                          struct vfsmount *old_mnt, struct inode *new_dir,
-+                          struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       struct inode *target;
-       int error;
-@@ -2618,7 +2620,8 @@ static int vfs_rename_other(struct inode
- }
- int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
--             struct inode *new_dir, struct dentry *new_dentry)
-+              struct vfsmount *old_mnt, struct inode *new_dir,
-+              struct dentry *new_dentry, struct vfsmount *new_mnt)
- {
-       int error;
-       int is_dir = S_ISDIR(old_dentry->d_inode->i_mode);
-@@ -2647,9 +2650,11 @@ int vfs_rename(struct inode *old_dir, st
-       old_name = fsnotify_oldname_init(old_dentry->d_name.name);
-       if (is_dir)
--              error = vfs_rename_dir(old_dir,old_dentry,new_dir,new_dentry);
-+              error = vfs_rename_dir(old_dir, old_dentry, old_mnt,
-+                                     new_dir, new_dentry, new_mnt);
-       else
--              error = vfs_rename_other(old_dir,old_dentry,new_dir,new_dentry);
-+              error = vfs_rename_other(old_dir, old_dentry, old_mnt,
-+                                       new_dir, new_dentry, new_mnt);
-       if (!error) {
-               const char *new_name = old_dentry->d_name.name;
-               fsnotify_move(old_dir, new_dir, old_name, new_name, is_dir,
-@@ -2726,8 +2731,8 @@ SYSCALL_DEFINE4(renameat, int, olddfd, c
-       error = mnt_want_write(oldnd.path.mnt);
-       if (error)
-               goto exit5;
--      error = vfs_rename(old_dir->d_inode, old_dentry,
--                                 new_dir->d_inode, new_dentry);
-+      error = vfs_rename(old_dir->d_inode, old_dentry, oldnd.path.mnt,
-+                         new_dir->d_inode, new_dentry, newnd.path.mnt);
-       mnt_drop_write(oldnd.path.mnt);
- exit5:
-       dput(new_dentry);
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1752,7 +1752,8 @@ nfsd_rename(struct svc_rqst *rqstp, stru
-       if (host_err)
-               goto out_dput_new;
--      host_err = vfs_rename(fdir, odentry, tdir, ndentry);
-+      host_err = vfs_rename(fdir, odentry, ffhp->fh_export->ex_path.mnt,
-+                            tdir, ndentry, tfhp->fh_export->ex_path.mnt);
-       if (!host_err && EX_ISSYNC(tfhp->fh_export)) {
-               host_err = nfsd_sync_dir(tdentry);
-               if (!host_err)
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1184,7 +1184,7 @@ extern int vfs_symlink(struct inode *, s
- extern int vfs_link(struct dentry *, struct vfsmount *, struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_rmdir(struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_unlink(struct inode *, struct dentry *, struct vfsmount *);
--extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
-+extern int vfs_rename(struct inode *, struct dentry *, struct vfsmount *, struct inode *, struct dentry *, struct vfsmount *);
- /*
-  * VFS dentry helper functions.
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-rmdir.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-rmdir.diff
deleted file mode 100644 (file)
index d3bd5bc..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_rmdir()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c   |    4 +++-
- fs/namei.c            |    4 ++--
- fs/nfsd/nfs4recover.c |    2 +-
- fs/nfsd/vfs.c         |    8 +++++---
- include/linux/fs.h    |    2 +-
- 5 files changed, 12 insertions(+), 8 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -534,14 +534,16 @@ out:
- static int ecryptfs_rmdir(struct inode *dir, struct dentry *dentry)
- {
-       struct dentry *lower_dentry;
-+      struct vfsmount *lower_mnt;
-       struct dentry *lower_dir_dentry;
-       int rc;
-       lower_dentry = ecryptfs_dentry_to_lower(dentry);
-+      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       dget(dentry);
-       lower_dir_dentry = lock_parent(lower_dentry);
-       dget(lower_dentry);
--      rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry);
-+      rc = vfs_rmdir(lower_dir_dentry->d_inode, lower_dentry, lower_mnt);
-       dput(lower_dentry);
-       if (!rc)
-               d_delete(lower_dentry);
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2167,7 +2167,7 @@ void dentry_unhash(struct dentry *dentry
-       spin_unlock(&dcache_lock);
- }
--int vfs_rmdir(struct inode *dir, struct dentry *dentry)
-+int vfs_rmdir(struct inode *dir, struct dentry *dentry,struct vfsmount *mnt)
- {
-       int error = may_delete(dir, dentry, 1);
-@@ -2230,7 +2230,7 @@ static long do_rmdir(int dfd, const char
-       error = mnt_want_write(nd.path.mnt);
-       if (error)
-               goto exit3;
--      error = vfs_rmdir(nd.path.dentry->d_inode, dentry);
-+      error = vfs_rmdir(nd.path.dentry->d_inode, dentry, nd.path.mnt);
-       mnt_drop_write(nd.path.mnt);
- exit3:
-       dput(dentry);
---- a/fs/nfsd/nfs4recover.c
-+++ b/fs/nfsd/nfs4recover.c
-@@ -279,7 +279,7 @@ nfsd4_clear_clid_dir(struct dentry *dir,
-        * a kernel from the future.... */
-       nfsd4_list_rec_dir(dentry, nfsd4_remove_clid_file);
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
--      status = vfs_rmdir(dir->d_inode, dentry);
-+      status = vfs_rmdir(dir->d_inode, dentry, rec_dir.path.mnt);
-       mutex_unlock(&dir->d_inode->i_mutex);
-       return status;
- }
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1790,6 +1790,7 @@ nfsd_unlink(struct svc_rqst *rqstp, stru
-                               char *fname, int flen)
- {
-       struct dentry   *dentry, *rdentry;
-+      struct svc_export *exp;
-       struct inode    *dirp;
-       __be32          err;
-       int             host_err;
-@@ -1804,6 +1805,7 @@ nfsd_unlink(struct svc_rqst *rqstp, stru
-       fh_lock_nested(fhp, I_MUTEX_PARENT);
-       dentry = fhp->fh_dentry;
-       dirp = dentry->d_inode;
-+      exp = fhp->fh_export;
-       rdentry = lookup_one_len(fname, dentry, flen);
-       host_err = PTR_ERR(rdentry);
-@@ -1825,21 +1827,21 @@ nfsd_unlink(struct svc_rqst *rqstp, stru
-       if (type != S_IFDIR) { /* It's UNLINK */
- #ifdef MSNFS
--              if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
-+              if ((exp->ex_flags & NFSEXP_MSNFS) &&
-                       (atomic_read(&rdentry->d_count) > 1)) {
-                       host_err = -EPERM;
-               } else
- #endif
-               host_err = vfs_unlink(dirp, rdentry);
-       } else { /* It's RMDIR */
--              host_err = vfs_rmdir(dirp, rdentry);
-+              host_err = vfs_rmdir(dirp, rdentry, exp->ex_path.mnt);
-       }
-       dput(rdentry);
-       if (host_err)
-               goto out_drop;
--      if (EX_ISSYNC(fhp->fh_export))
-+      if (EX_ISSYNC(exp))
-               host_err = nfsd_sync_dir(dentry);
- out_drop:
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1182,7 +1182,7 @@ extern int vfs_mkdir(struct inode *, str
- extern int vfs_mknod(struct inode *, struct dentry *, struct vfsmount *, int, dev_t);
- extern int vfs_symlink(struct inode *, struct dentry *, struct vfsmount *, const char *);
- extern int vfs_link(struct dentry *, struct vfsmount *, struct inode *, struct dentry *, struct vfsmount *);
--extern int vfs_rmdir(struct inode *, struct dentry *);
-+extern int vfs_rmdir(struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_unlink(struct inode *, struct dentry *);
- extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-setxattr.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-setxattr.diff
deleted file mode 100644 (file)
index 919a68f..0000000
+++ /dev/null
@@ -1,165 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_setxattr()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/nfsd/vfs.c         |   16 +++++++++++-----
- fs/xattr.c            |   16 ++++++++--------
- include/linux/xattr.h |    3 ++-
- 3 files changed, 21 insertions(+), 14 deletions(-)
-
-Index: linux-2.6.27/fs/nfsd/vfs.c
-===================================================================
---- linux-2.6.27.orig/fs/nfsd/vfs.c
-+++ linux-2.6.27/fs/nfsd/vfs.c
-@@ -438,7 +438,8 @@ static ssize_t nfsd_getxattr(struct dent
- #if defined(CONFIG_NFSD_V4)
- static int
--set_nfsv4_acl_one(struct dentry *dentry, struct posix_acl *pacl, char *key)
-+set_nfsv4_acl_one(struct dentry *dentry, struct vfsmount *mnt,
-+                struct posix_acl *pacl, char *key)
- {
-       int len;
-       size_t buflen;
-@@ -457,7 +458,7 @@ set_nfsv4_acl_one(struct dentry *dentry,
-               goto out;
-       }
--      error = vfs_setxattr(dentry, key, buf, len, 0);
-+      error = vfs_setxattr(dentry, mnt, key, buf, len, 0);
- out:
-       kfree(buf);
-       return error;
-@@ -470,6 +471,7 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqst
-       __be32 error;
-       int host_error;
-       struct dentry *dentry;
-+      struct vfsmount *mnt;
-       struct inode *inode;
-       struct posix_acl *pacl = NULL, *dpacl = NULL;
-       unsigned int flags = 0;
-@@ -480,6 +482,7 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqst
-               return error;
-       dentry = fhp->fh_dentry;
-+      mnt = fhp->fh_export->ex_path.mnt;
-       inode = dentry->d_inode;
-       if (S_ISDIR(inode->i_mode))
-               flags = NFS4_ACL_DIR;
-@@ -490,12 +493,14 @@ nfsd4_set_nfs4_acl(struct svc_rqst *rqst
-       } else if (host_error < 0)
-               goto out_nfserr;
--      host_error = set_nfsv4_acl_one(dentry, pacl, POSIX_ACL_XATTR_ACCESS);
-+      host_error = set_nfsv4_acl_one(dentry, mnt, pacl,
-+                                     POSIX_ACL_XATTR_ACCESS);
-       if (host_error < 0)
-               goto out_release;
-       if (S_ISDIR(inode->i_mode))
--              host_error = set_nfsv4_acl_one(dentry, dpacl, POSIX_ACL_XATTR_DEFAULT);
-+              host_error = set_nfsv4_acl_one(dentry, mnt, dpacl,
-+                                             POSIX_ACL_XATTR_DEFAULT);
- out_release:
-       posix_acl_release(pacl);
-@@ -2123,7 +2128,8 @@ nfsd_set_posix_acl(struct svc_fh *fhp, i
-       if (error)
-               goto getout;
-       if (size)
--              error = vfs_setxattr(fhp->fh_dentry, name, value, size, 0);
-+              error = vfs_setxattr(fhp->fh_dentry, fhp->fh_export->ex_path.mnt,
-+                                   name, value, size,0);
-       else {
-               if (!S_ISDIR(inode->i_mode) && type == ACL_TYPE_DEFAULT)
-                       error = 0;
-Index: linux-2.6.27/fs/xattr.c
-===================================================================
---- linux-2.6.27.orig/fs/xattr.c
-+++ linux-2.6.27/fs/xattr.c
-@@ -67,8 +67,8 @@ xattr_permission(struct inode *inode, co
- }
- int
--vfs_setxattr(struct dentry *dentry, const char *name, const void *value,
--              size_t size, int flags)
-+vfs_setxattr(struct dentry *dentry, struct vfsmount *mnt, const char *name,
-+           const void *value, size_t size, int flags)
- {
-       struct inode *inode = dentry->d_inode;
-       int error;
-@@ -218,8 +218,8 @@ EXPORT_SYMBOL_GPL(vfs_removexattr);
-  * Extended attribute SET operations
-  */
- static long
--setxattr(struct dentry *d, const char __user *name, const void __user *value,
--       size_t size, int flags)
-+setxattr(struct dentry *dentry, struct vfsmount *mnt, const char __user *name,
-+       const void __user *value, size_t size, int flags)
- {
-       int error;
-       void *kvalue = NULL;
-@@ -246,7 +246,7 @@ setxattr(struct dentry *d, const char __
-               }
-       }
--      error = vfs_setxattr(d, kname, kvalue, size, flags);
-+      error = vfs_setxattr(dentry, mnt, kname, kvalue, size, flags);
-       kfree(kvalue);
-       return error;
- }
-@@ -263,7 +263,7 @@ SYSCALL_DEFINE5(setxattr, const char __u
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = setxattr(path.dentry, name, value, size, flags);
-+              error = setxattr(path.dentry, path.mnt, name, value, size, flags);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -282,7 +282,7 @@ SYSCALL_DEFINE5(lsetxattr, const char __
-               return error;
-       error = mnt_want_write(path.mnt);
-       if (!error) {
--              error = setxattr(path.dentry, name, value, size, flags);
-+              error = setxattr(path.dentry, path.mnt, name, value, size, flags);
-               mnt_drop_write(path.mnt);
-       }
-       path_put(&path);
-@@ -303,7 +303,7 @@ SYSCALL_DEFINE5(fsetxattr, int, fd, cons
-       audit_inode(NULL, dentry);
-       error = mnt_want_write_file(f->f_path.mnt, f);
-       if (!error) {
--              error = setxattr(dentry, name, value, size, flags);
-+              error = setxattr(dentry, f->f_vfsmnt, name, value, size, flags);
-               mnt_drop_write(f->f_path.mnt);
-       }
-       fput(f);
-Index: linux-2.6.27/include/linux/xattr.h
-===================================================================
---- linux-2.6.27.orig/include/linux/xattr.h
-+++ linux-2.6.27/include/linux/xattr.h
-@@ -16,6 +16,7 @@
- #ifdef  __KERNEL__
- #include <linux/types.h>
-+#include <linux/mount.h>
- /* Namespaces */
- #define XATTR_OS2_PREFIX "os2."
-@@ -49,7 +50,7 @@ struct xattr_handler {
- ssize_t xattr_getsecurity(struct inode *, const char *, void *, size_t);
- ssize_t vfs_getxattr(struct dentry *, const char *, void *, size_t);
- ssize_t vfs_listxattr(struct dentry *d, char *list, size_t size);
--int vfs_setxattr(struct dentry *, const char *, const void *, size_t, int);
-+int vfs_setxattr(struct dentry *, struct vfsmount *, const char *, const void *, size_t, int);
- int vfs_removexattr(struct dentry *, const char *);
- ssize_t generic_getxattr(struct dentry *dentry, const char *name, void *buffer, size_t size);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-symlink.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-symlink.diff
deleted file mode 100644 (file)
index 5751f91..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_symlink()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c |    4 +++-
- fs/namei.c          |    5 +++--
- fs/nfsd/vfs.c       |   12 ++++++++----
- include/linux/fs.h  |    2 +-
- 4 files changed, 15 insertions(+), 8 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -464,6 +464,7 @@ static int ecryptfs_symlink(struct inode
- {
-       int rc;
-       struct dentry *lower_dentry;
-+      struct vfsmount *lower_mnt;
-       struct dentry *lower_dir_dentry;
-       char *encoded_symname;
-       int encoded_symlen;
-@@ -471,6 +472,7 @@ static int ecryptfs_symlink(struct inode
-       lower_dentry = ecryptfs_dentry_to_lower(dentry);
-       dget(lower_dentry);
-+      lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       lower_dir_dentry = lock_parent(lower_dentry);
-       encoded_symlen = ecryptfs_encode_filename(crypt_stat, symname,
-                                                 strlen(symname),
-@@ -479,7 +481,7 @@ static int ecryptfs_symlink(struct inode
-               rc = encoded_symlen;
-               goto out_lock;
-       }
--      rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry,
-+      rc = vfs_symlink(lower_dir_dentry->d_inode, lower_dentry, lower_mnt,
-                        encoded_symname);
-       kfree(encoded_symname);
-       if (rc || !lower_dentry->d_inode)
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2347,7 +2347,8 @@ SYSCALL_DEFINE1(unlink, const char __use
-       return do_unlinkat(AT_FDCWD, pathname);
- }
--int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
-+int vfs_symlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt,
-+              const char *oldname)
- {
-       int error = may_create(dir, dentry, 0);
-@@ -2393,7 +2394,7 @@ SYSCALL_DEFINE3(symlinkat, const char __
-       error = mnt_want_write(nd.path.mnt);
-       if (error)
-               goto out_dput;
--      error = vfs_symlink(nd.path.dentry->d_inode, dentry, from);
-+      error = vfs_symlink(nd.path.dentry->d_inode, dentry, nd.path.mnt, from);
-       mnt_drop_write(nd.path.mnt);
- out_dput:
-       dput(dentry);
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1545,6 +1545,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str
-                               struct iattr *iap)
- {
-       struct dentry   *dentry, *dnew;
-+      struct svc_export *exp;
-       __be32          err, cerr;
-       int             host_err;
-@@ -1569,6 +1570,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str
-       if (host_err)
-               goto out_nfserr;
-+      exp = fhp->fh_export;
-       if (unlikely(path[plen] != 0)) {
-               char *path_alloced = kmalloc(plen+1, GFP_KERNEL);
-               if (path_alloced == NULL)
-@@ -1576,14 +1578,16 @@ nfsd_symlink(struct svc_rqst *rqstp, str
-               else {
-                       strncpy(path_alloced, path, plen);
-                       path_alloced[plen] = 0;
--                      host_err = vfs_symlink(dentry->d_inode, dnew, path_alloced);
-+                      host_err = vfs_symlink(dentry->d_inode, dnew,
-+                                             exp->ex_path.mnt, path_alloced);
-                       kfree(path_alloced);
-               }
-       } else
--              host_err = vfs_symlink(dentry->d_inode, dnew, path);
-+              host_err = vfs_symlink(dentry->d_inode, dnew, exp->ex_path.mnt,
-+                                     path);
-       if (!host_err) {
--              if (EX_ISSYNC(fhp->fh_export))
-+              if (EX_ISSYNC(exp))
-                       host_err = nfsd_sync_dir(dentry);
-       }
-       err = nfserrno(host_err);
-@@ -1591,7 +1595,7 @@ nfsd_symlink(struct svc_rqst *rqstp, str
-       mnt_drop_write(fhp->fh_export->ex_path.mnt);
--      cerr = fh_compose(resfhp, fhp->fh_export, dnew, fhp);
-+      cerr = fh_compose(resfhp, exp, dnew, fhp);
-       dput(dnew);
-       if (err==0) err = cerr;
- out:
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1180,7 +1180,7 @@ extern int vfs_permission(struct nameida
- extern int vfs_create(struct inode *, struct dentry *, int, struct nameidata *);
- extern int vfs_mkdir(struct inode *, struct dentry *, struct vfsmount *, int);
- extern int vfs_mknod(struct inode *, struct dentry *, struct vfsmount *, int, dev_t);
--extern int vfs_symlink(struct inode *, struct dentry *, const char *);
-+extern int vfs_symlink(struct inode *, struct dentry *, struct vfsmount *, const char *);
- extern int vfs_link(struct dentry *, struct inode *, struct dentry *);
- extern int vfs_rmdir(struct inode *, struct dentry *);
- extern int vfs_unlink(struct inode *, struct dentry *);
diff --git a/src/patches/suse-2.6.27.31/patches.apparmor/vfs-unlink.diff b/src/patches/suse-2.6.27.31/patches.apparmor/vfs-unlink.diff
deleted file mode 100644 (file)
index cbf092a..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-From: Tony Jones <tonyj@suse.de>
-Subject: Add a struct vfsmount parameter to vfs_unlink()
-
-The vfsmount will be passed down to the LSM hook so that LSMs can compute
-pathnames.
-
-Signed-off-by: Tony Jones <tonyj@suse.de>
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-Signed-off-by: John Johansen <jjohansen@suse.de>
-
----
- fs/ecryptfs/inode.c   |    3 ++-
- fs/namei.c            |    4 ++--
- fs/nfsd/nfs4recover.c |    2 +-
- fs/nfsd/vfs.c         |    2 +-
- include/linux/fs.h    |    2 +-
- ipc/mqueue.c          |    2 +-
- 6 files changed, 8 insertions(+), 7 deletions(-)
-
---- a/fs/ecryptfs/inode.c
-+++ b/fs/ecryptfs/inode.c
-@@ -445,11 +445,12 @@ static int ecryptfs_unlink(struct inode
- {
-       int rc = 0;
-       struct dentry *lower_dentry = ecryptfs_dentry_to_lower(dentry);
-+      struct vfsmount *lower_mnt = ecryptfs_dentry_to_lower_mnt(dentry);
-       struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
-       struct dentry *lower_dir_dentry;
-       lower_dir_dentry = lock_parent(lower_dentry);
--      rc = vfs_unlink(lower_dir_inode, lower_dentry);
-+      rc = vfs_unlink(lower_dir_inode, lower_dentry, lower_mnt);
-       if (rc) {
-               printk(KERN_ERR "Error in vfs_unlink; rc = [%d]\n", rc);
-               goto out_unlock;
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -2248,7 +2248,7 @@ SYSCALL_DEFINE1(rmdir, const char __user
-       return do_rmdir(AT_FDCWD, pathname);
- }
--int vfs_unlink(struct inode *dir, struct dentry *dentry)
-+int vfs_unlink(struct inode *dir, struct dentry *dentry, struct vfsmount *mnt)
- {
-       int error = may_delete(dir, dentry, 0);
-@@ -2313,7 +2313,7 @@ static long do_unlinkat(int dfd, const c
-               error = mnt_want_write(nd.path.mnt);
-               if (error)
-                       goto exit2;
--              error = vfs_unlink(nd.path.dentry->d_inode, dentry);
-+              error = vfs_unlink(nd.path.dentry->d_inode, dentry, nd.path.mnt);
-               mnt_drop_write(nd.path.mnt);
-       exit2:
-               dput(dentry);
---- a/fs/nfsd/nfs4recover.c
-+++ b/fs/nfsd/nfs4recover.c
-@@ -264,7 +264,7 @@ nfsd4_remove_clid_file(struct dentry *di
-               return -EINVAL;
-       }
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_PARENT);
--      status = vfs_unlink(dir->d_inode, dentry);
-+      status = vfs_unlink(dir->d_inode, dentry, rec_dir.path.mnt);
-       mutex_unlock(&dir->d_inode->i_mutex);
-       return status;
- }
---- a/fs/nfsd/vfs.c
-+++ b/fs/nfsd/vfs.c
-@@ -1832,7 +1832,7 @@ nfsd_unlink(struct svc_rqst *rqstp, stru
-                       host_err = -EPERM;
-               } else
- #endif
--              host_err = vfs_unlink(dirp, rdentry);
-+              host_err = vfs_unlink(dirp, rdentry, exp->ex_path.mnt);
-       } else { /* It's RMDIR */
-               host_err = vfs_rmdir(dirp, rdentry, exp->ex_path.mnt);
-       }
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1183,7 +1183,7 @@ extern int vfs_mknod(struct inode *, str
- extern int vfs_symlink(struct inode *, struct dentry *, struct vfsmount *, const char *);
- extern int vfs_link(struct dentry *, struct vfsmount *, struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_rmdir(struct inode *, struct dentry *, struct vfsmount *);
--extern int vfs_unlink(struct inode *, struct dentry *);
-+extern int vfs_unlink(struct inode *, struct dentry *, struct vfsmount *);
- extern int vfs_rename(struct inode *, struct dentry *, struct inode *, struct dentry *);
- /*
---- a/ipc/mqueue.c
-+++ b/ipc/mqueue.c
-@@ -746,7 +746,7 @@ SYSCALL_DEFINE1(mq_unlink, const char __
-       err = mnt_want_write(mqueue_mnt);
-       if (err)
-               goto out_err;
--      err = vfs_unlink(dentry->d_parent->d_inode, dentry);
-+      err = vfs_unlink(dentry->d_parent->d_inode, dentry, mqueue_mnt);
-       mnt_drop_write(mqueue_mnt);
- out_err:
-       dput(dentry);
diff --git a/src/patches/suse-2.6.27.31/patches.arch/ia64-node_mem_map-node_start_pfn.diff b/src/patches/suse-2.6.27.31/patches.arch/ia64-node_mem_map-node_start_pfn.diff
deleted file mode 100644 (file)
index 8835c46..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-From: Bernhard Walle <bwalle@suse.de>
-Subject: [PATCH] Fix memory map for ia64/discontmem for kdump
-
-makedumpfile[1] cannot run on ia64 discontigmem kernel, because the member
-node_mem_map of struct pgdat_list has invalid value. This patch fixes it.
-
-node_start_pfn shows the start pfn of each node, and node_mem_map should
-point 'struct page' of each node's node_start_pfn.
-On my machine, node0's node_start_pfn shows 0x400 and its node_mem_map points
-0xa0007fffbf000000. This address is the same as vmem_map, so the node_mem_map
-points 'struct page' of pfn 0, even if its node_start_pfn shows 0x400.
-
-The cause is due to the round down of min_pfn in count_node_pages() and
-node0's node_mem_map points 'struct page' of inactive pfn (0x0).
-This patch fixes it.
-
-
-makedumpfile[1]: dump filtering command
-https://sourceforge.net/projects/makedumpfile/
-
-Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/ia64/include/asm/meminit.h |    1 -
- arch/ia64/mm/discontig.c        |    1 -
- 2 files changed, 2 deletions(-)
-
---- a/arch/ia64/include/asm/meminit.h
-+++ b/arch/ia64/include/asm/meminit.h
-@@ -47,7 +47,6 @@ extern int reserve_elfcorehdr(unsigned l
-  */
- #define GRANULEROUNDDOWN(n)   ((n) & ~(IA64_GRANULE_SIZE-1))
- #define GRANULEROUNDUP(n)     (((n)+IA64_GRANULE_SIZE-1) & ~(IA64_GRANULE_SIZE-1))
--#define ORDERROUNDDOWN(n)     ((n) & ~((PAGE_SIZE<<MAX_ORDER)-1))
- #ifdef CONFIG_NUMA
-   extern void call_pernode_memory (unsigned long start, unsigned long len, void *func);
---- a/arch/ia64/mm/discontig.c
-+++ b/arch/ia64/mm/discontig.c
-@@ -635,7 +635,6 @@ static __init int count_node_pages(unsig
-                       (min(end, __pa(MAX_DMA_ADDRESS)) - start) >>PAGE_SHIFT;
- #endif
-       start = GRANULEROUNDDOWN(start);
--      start = ORDERROUNDDOWN(start);
-       end = GRANULEROUNDUP(end);
-       mem_data[node].max_pfn = max(mem_data[node].max_pfn,
-                                    end >> PAGE_SHIFT);
diff --git a/src/patches/suse-2.6.27.31/patches.arch/ppc-axon-missing-msi-workaround-5.diff b/src/patches/suse-2.6.27.31/patches.arch/ppc-axon-missing-msi-workaround-5.diff
deleted file mode 100644 (file)
index 29d11c4..0000000
+++ /dev/null
@@ -1,143 +0,0 @@
-From: Arnd Bergmann <arnd.bergmann@de.ibm.com>
-Subject: powerpc/cell/axon-msi: retry on missing interrupt
-References: bnc#445964,bnc#467633
-
-The MSI capture logic on the axon bridge can sometimes
-lose interrupts in case of high DMA and interrupt load,
-when it signals an MSI interrupt to the MPIC interrupt
-controller while we are already handling another MSI.
-
-Each MSI vector gets written into a FIFO buffer in main
-memory using DMA, and that DMA access is normally flushed
-by the actual interrupt packet on the IOIF. An MMIO
-register in the MSIC holds the position of the last
-entry in the FIFO buffer that was written. However,
-reading that position does not flush the DMA, so that
-we can observe stale data in the buffer.
-
-In a stress test, we have observed the DMA to arrive
-up to 14 microseconds after reading the register.
-We can reliably detect this conditioning by writing
-an invalid MSI vector into the FIFO buffer after
-reading from it, assuming that all MSIs we get
-are valid. After detecting an invalid MSI vector,
-we udelay(1) in the interrupt cascade for up to
-100 times before giving up.
-
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Acked-by: John Jolly <jjolly@novell.com>
-
-commit 23e0e8afafd9ac065d81506524adf3339584044b
-Author: Arnd Bergmann <arnd@arndb.de>
-Date:   Fri Dec 12 09:19:50 2008 +0000
-
-    powerpc/cell/axon-msi: Fix MSI after kexec
-    
-    Commit d015fe995 'powerpc/cell/axon-msi: Retry on missing interrupt'
-    has turned a rare failure to kexec on QS22 into a reproducible
-    error, which we have now analysed.
-    
-    The problem is that after a kexec, the MSIC hardware still points
-    into the middle of the old ring buffer.  We set up the ring buffer
-    during reboot, but not the offset into it.  On older kernels, this
-    would cause a storm of thousands of spurious interrupts after a
-    kexec, which would most of the time get dropped silently.
-    
-    With the new code, we time out on each interrupt, waiting for
-    it to become valid.  If more interrupts come in that we time
-    out on, this goes on indefinitely, which eventually leads to
-    a hard crash.
-    
-    The solution in this commit is to read the current offset from
-    the MSIC when reinitializing it.  This now works correctly, as
-    expected.
-    
-    Reported-by: Dirk Herrendoerfer <d.herrendoerfer@de.ibm.com>
-    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-    Acked-by: Michael Ellerman <michael@ellerman.id.au>
-    Signed-off-by: Paul Mackerras <paulus@samba.org>
-
-
----
- arch/powerpc/platforms/cell/axon_msi.c |   39 ++++++++++++++++++++++++++++-----
- 1 file changed, 34 insertions(+), 5 deletions(-)
-
---- a/arch/powerpc/platforms/cell/axon_msi.c
-+++ b/arch/powerpc/platforms/cell/axon_msi.c
-@@ -95,6 +95,7 @@ static void axon_msi_cascade(unsigned in
-       struct axon_msic *msic = get_irq_data(irq);
-       u32 write_offset, msi;
-       int idx;
-+      int retry = 0;
-       write_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG);
-       pr_debug("axon_msi: original write_offset 0x%x\n", write_offset);
-@@ -102,7 +103,7 @@ static void axon_msi_cascade(unsigned in
-       /* write_offset doesn't wrap properly, so we have to mask it */
-       write_offset &= MSIC_FIFO_SIZE_MASK;
--      while (msic->read_offset != write_offset) {
-+      while (msic->read_offset != write_offset && retry < 100) {
-               idx  = msic->read_offset / sizeof(__le32);
-               msi  = le32_to_cpu(msic->fifo_virt[idx]);
-               msi &= 0xFFFF;
-@@ -110,13 +111,37 @@ static void axon_msi_cascade(unsigned in
-               pr_debug("axon_msi: woff %x roff %x msi %x\n",
-                         write_offset, msic->read_offset, msi);
-+              if (msi < NR_IRQS && irq_map[msi].host == msic->irq_host) {
-+                      generic_handle_irq(msi);
-+                      msic->fifo_virt[idx] = cpu_to_le32(0xffffffff);
-+              } else {
-+                      /*
-+                       * Reading the MSIC_WRITE_OFFSET_REG does not
-+                       * reliably flush the outstanding DMA to the
-+                       * FIFO buffer. Here we were reading stale
-+                       * data, so we need to retry.
-+                       */
-+                      udelay(1);
-+                      retry++;
-+                      pr_debug("axon_msi: invalid irq 0x%x!\n", msi);
-+                      continue;
-+              }
-+
-+              if (retry) {
-+                      pr_debug("axon_msi: late irq 0x%x, retry %d\n",
-+                               msi, retry);
-+                      retry = 0;
-+              }
-+
-               msic->read_offset += MSIC_FIFO_ENTRY_SIZE;
-               msic->read_offset &= MSIC_FIFO_SIZE_MASK;
-+      }
--              if (msi < NR_IRQS && irq_map[msi].host == msic->irq_host)
--                      generic_handle_irq(msi);
--              else
--                      pr_debug("axon_msi: invalid irq 0x%x!\n", msi);
-+      if (retry) {
-+              printk(KERN_WARNING "axon_msi: irq timed out\n");
-+
-+              msic->read_offset += MSIC_FIFO_ENTRY_SIZE;
-+              msic->read_offset &= MSIC_FIFO_SIZE_MASK;
-       }
-       desc->chip->eoi(irq);
-@@ -364,6 +389,7 @@ static int axon_msi_probe(struct of_devi
-                      dn->full_name);
-               goto out_free_fifo;
-       }
-+      memset(msic->fifo_virt, 0xff, MSIC_FIFO_SIZE_BYTES);
-       msic->irq_host = irq_alloc_host(dn, IRQ_HOST_MAP_NOMAP,
-                                       NR_IRQS, &msic_host_ops, 0);
-@@ -387,6 +413,9 @@ static int axon_msi_probe(struct of_devi
-                       MSIC_CTRL_IRQ_ENABLE | MSIC_CTRL_ENABLE |
-                       MSIC_CTRL_FIFO_SIZE);
-+      msic->read_offset = dcr_read(msic->dcr_host, MSIC_WRITE_OFFSET_REG)
-+                              & MSIC_FIFO_SIZE_MASK;
-+
-       device->dev.platform_data = msic;
-       ppc_md.setup_msi_irqs = axon_msi_setup_msi_irqs;
diff --git a/src/patches/suse-2.6.27.31/patches.arch/ppc-dynamic-reconfiguration.diff b/src/patches/suse-2.6.27.31/patches.arch/ppc-dynamic-reconfiguration.diff
deleted file mode 100644 (file)
index c697695..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-From: Chandru <chandru@in.ibm.com>
-Date: Sat, 30 Aug 2008 00:28:16 +1000
-Subject: [PATCH] powerpc: Add support for dynamic reconfiguration memory in kexec/kdump kernels
-References: bnc#431492
-X-Git-Commit: cf00085d8045cddd80a8aabad97de96fa8131793 Mon Sep 17 00:00:00 2001
-
-Kdump kernel needs to use only those memory regions that it is allowed
-to use (crashkernel, rtas, tce, etc.).  Each of these regions have
-their own sizes and are currently added under 'linux,usable-memory'
-property under each memory@xxx node of the device tree.
-
-The ibm,dynamic-memory property of ibm,dynamic-reconfiguration-memory
-node (on POWER6) now stores in it the representation for most of the
-logical memory blocks with the size of each memory block being a
-constant (lmb_size).  If one or more or part of the above mentioned
-regions lie under one of the lmb from ibm,dynamic-memory property,
-there is a need to identify those regions within the given lmb.
-
-This makes the kernel recognize a new 'linux,drconf-usable-memory'
-property added by kexec-tools.  Each entry in this property is of the
-form of a count followed by that many (base, size) pairs for the above
-mentioned regions.  The number of cells in the count value is given by
-the #size-cells property of the root node.
-
-Signed-off-by: Chandru Siddalingappa <chandru@in.ibm.com>
-Signed-off-by: Paul Mackerras <paulus@samba.org>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/powerpc/kernel/prom.c |   40 +++++++++++++++++++---
- arch/powerpc/mm/numa.c     |   79 +++++++++++++++++++++++++++++++++++----------
- 2 files changed, 96 insertions(+), 23 deletions(-)
-
---- a/arch/powerpc/kernel/prom.c
-+++ b/arch/powerpc/kernel/prom.c
-@@ -888,9 +888,10 @@ static u64 __init dt_mem_next_cell(int s
-  */
- static int __init early_init_dt_scan_drconf_memory(unsigned long node)
- {
--      cell_t *dm, *ls;
-+      cell_t *dm, *ls, *usm;
-       unsigned long l, n, flags;
-       u64 base, size, lmb_size;
-+      unsigned int is_kexec_kdump = 0, rngs;
-       ls = (cell_t *)of_get_flat_dt_prop(node, "ibm,lmb-size", &l);
-       if (ls == NULL || l < dt_root_size_cells * sizeof(cell_t))
-@@ -905,6 +906,12 @@ static int __init early_init_dt_scan_drc
-       if (l < (n * (dt_root_addr_cells + 4) + 1) * sizeof(cell_t))
-               return 0;
-+      /* check if this is a kexec/kdump kernel. */
-+      usm = (cell_t *)of_get_flat_dt_prop(node, "linux,drconf-usable-memory",
-+                                               &l);
-+      if (usm != NULL)
-+              is_kexec_kdump = 1;
-+
-       for (; n != 0; --n) {
-               base = dt_mem_next_cell(dt_root_addr_cells, &dm);
-               flags = dm[3];
-@@ -915,13 +922,34 @@ static int __init early_init_dt_scan_drc
-               if ((flags & 0x80) || !(flags & 0x8))
-                       continue;
-               size = lmb_size;
--              if (iommu_is_off) {
--                      if (base >= 0x80000000ul)
-+              rngs = 1;
-+              if (is_kexec_kdump) {
-+                      /*
-+                       * For each lmb in ibm,dynamic-memory, a corresponding
-+                       * entry in linux,drconf-usable-memory property contains
-+                       * a counter 'p' followed by 'p' (base, size) duple.
-+                       * Now read the counter from
-+                       * linux,drconf-usable-memory property
-+                       */
-+                      rngs = dt_mem_next_cell(dt_root_size_cells, &usm);
-+                      if (!rngs) /* there are no (base, size) duple */
-                               continue;
--                      if ((base + size) > 0x80000000ul)
--                              size = 0x80000000ul - base;
-               }
--              lmb_add(base, size);
-+              do {
-+                      if (is_kexec_kdump) {
-+                              base = dt_mem_next_cell(dt_root_addr_cells,
-+                                                       &usm);
-+                              size = dt_mem_next_cell(dt_root_size_cells,
-+                                                       &usm);
-+                      }
-+                      if (iommu_is_off) {
-+                              if (base >= 0x80000000ul)
-+                                      continue;
-+                              if ((base + size) > 0x80000000ul)
-+                                      size = 0x80000000ul - base;
-+                      }
-+                      lmb_add(base, size);
-+              } while (--rngs);
-       }
-       lmb_dump_all();
-       return 0;
---- a/arch/powerpc/mm/numa.c
-+++ b/arch/powerpc/mm/numa.c
-@@ -192,6 +192,21 @@ static const int *of_get_associativity(s
-       return of_get_property(dev, "ibm,associativity", NULL);
- }
-+/*
-+ * Returns the property linux,drconf-usable-memory if
-+ * it exists (the property exists only in kexec/kdump kernels,
-+ * added by kexec-tools)
-+ */
-+static const u32 *of_get_usable_memory(struct device_node *memory)
-+{
-+      const u32 *prop;
-+      u32 len;
-+      prop = of_get_property(memory, "linux,drconf-usable-memory", &len);
-+      if (!prop || len < sizeof(unsigned int))
-+              return 0;
-+      return prop;
-+}
-+
- /* Returns nid in the range [0..MAX_NUMNODES-1], or -1 if no useful numa
-  * info is found.
-  */
-@@ -529,14 +544,29 @@ static unsigned long __init numa_enforce
- }
- /*
-+ * Reads the counter for a given entry in
-+ * linux,drconf-usable-memory property
-+ */
-+static inline int __init read_usm_ranges(const u32 **usm)
-+{
-+      /*
-+       * For each lmb in ibm,dynamic-memory a corresponding
-+       * entry in linux,drconf-usable-memory property contains
-+       * a counter followed by that many (base, size) duple.
-+       * read the counter from linux,drconf-usable-memory
-+       */
-+      return read_n_cells(n_mem_size_cells, usm);
-+}
-+
-+/*
-  * Extract NUMA information from the ibm,dynamic-reconfiguration-memory
-  * node.  This assumes n_mem_{addr,size}_cells have been set.
-  */
- static void __init parse_drconf_memory(struct device_node *memory)
- {
--      const u32 *dm;
--      unsigned int n, rc;
--      unsigned long lmb_size, size;
-+      const u32 *dm, *usm;
-+      unsigned int n, rc, ranges, is_kexec_kdump = 0;
-+      unsigned long lmb_size, base, size, sz;
-       int nid;
-       struct assoc_arrays aa;
-@@ -552,6 +582,11 @@ static void __init parse_drconf_memory(s
-       if (rc)
-               return;
-+      /* check if this is a kexec/kdump kernel */
-+      usm = of_get_usable_memory(memory);
-+      if (usm != NULL)
-+              is_kexec_kdump = 1;
-+
-       for (; n != 0; --n) {
-               struct of_drconf_cell drmem;
-@@ -563,21 +598,31 @@ static void __init parse_drconf_memory(s
-                   || !(drmem.flags & DRCONF_MEM_ASSIGNED))
-                       continue;
--              nid = of_drconf_to_nid_single(&drmem, &aa);
--
--              fake_numa_create_new_node(
--                              ((drmem.base_addr + lmb_size) >> PAGE_SHIFT),
-+              base = drmem.base_addr;
-+              size = lmb_size;
-+              ranges = 1;
-+
-+              if (is_kexec_kdump) {
-+                      ranges = read_usm_ranges(&usm);
-+                      if (!ranges) /* there are no (base, size) duple */
-+                              continue;
-+              }
-+              do {
-+                      if (is_kexec_kdump) {
-+                              base = read_n_cells(n_mem_addr_cells, &usm);
-+                              size = read_n_cells(n_mem_size_cells, &usm);
-+                      }
-+                      nid = of_drconf_to_nid_single(&drmem, &aa);
-+                      fake_numa_create_new_node(
-+                              ((base + size) >> PAGE_SHIFT),
-                                          &nid);
--
--              node_set_online(nid);
--
--              size = numa_enforce_memory_limit(drmem.base_addr, lmb_size);
--              if (!size)
--                      continue;
--
--              add_active_range(nid, drmem.base_addr >> PAGE_SHIFT,
--                               (drmem.base_addr >> PAGE_SHIFT)
--                               + (size >> PAGE_SHIFT));
-+                      node_set_online(nid);
-+                      sz = numa_enforce_memory_limit(base, size);
-+                      if (sz)
-+                              add_active_range(nid, base >> PAGE_SHIFT,
-+                                               (base >> PAGE_SHIFT)
-+                                               + (sz >> PAGE_SHIFT));
-+              } while (--ranges);
-       }
- }
diff --git a/src/patches/suse-2.6.27.31/patches.arch/ppc-vmcoreinfo.diff b/src/patches/suse-2.6.27.31/patches.arch/ppc-vmcoreinfo.diff
deleted file mode 100644 (file)
index 1ab7978..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-Date: Thu, 9 Oct 2008 11:20:27 -0400
-From: Neil Horman <nhorman@tuxdriver.com>
-To: linux-kernel@vger.kernel.org, kexec@lists.infradead.org,
-       vgoyal@redhat.com, hbabu@us.ibm.com
-Subject: [PATCH] add additional symbols to /sys/kernel/vmcoreinfo data for
-       ppc(64)
-Cc: nhorman@tuxdriver.com
-
-Hey-
-       The makdumpdile dump filtering program, in some modes of operation needs
-the node_data and/or contig_page_data symbols to function properly.  These
-symbols are missing from the powerpc kernel.  This patch adds those symbols in
-properly.  Tested successfully by myself and the reporter.
-
-Regards
-Neil
-
-Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
- arch/powerpc/kernel/machine_kexec.c |    8 ++++++++
- 1 file changed, 8 insertions(+)
-
-
---- a/arch/powerpc/kernel/machine_kexec.c
-+++ b/arch/powerpc/kernel/machine_kexec.c
-@@ -44,6 +44,14 @@ void machine_kexec_cleanup(struct kimage
-               ppc_md.machine_kexec_cleanup(image);
- }
-+void arch_crash_save_vmcoreinfo(void)
-+{
-+#ifdef CONFIG_NEED_MULTIPLE_NODES
-+      VMCOREINFO_SYMBOL(node_data);
-+      VMCOREINFO_LENGTH(node_data, MAX_NUMNODES);
-+#endif
-+}
-+
- /*
-  * Do not allocate memory (or fail in any way) in machine_kexec().
-  * We are past the point of no return, committed to rebooting now.
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-04-06-cio-sac-update.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-04-06-cio-sac-update.diff
deleted file mode 100644 (file)
index 8ce3f37..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: cio: update sac values
-References: bnc#445100
-
-Symptom:     Drivers based on fcx fail to start I/O.
-Problem:     Values for the sac field have changed.
-Solution:    Update code accordingly.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- arch/s390/include/asm/fcx.h |    4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-Index: linux-sles11/arch/s390/include/asm/fcx.h
-===================================================================
---- linux-sles11.orig/arch/s390/include/asm/fcx.h
-+++ linux-sles11/arch/s390/include/asm/fcx.h
-@@ -248,8 +248,8 @@ struct dcw {
- #define TCCB_MAX_SIZE         (sizeof(struct tccb_tcah) + \
-                                TCCB_MAX_DCW * sizeof(struct dcw) + \
-                                sizeof(struct tccb_tcat))
--#define TCCB_SAC_DEFAULT      0xf901
--#define TCCB_SAC_INTRG                0xf902
-+#define TCCB_SAC_DEFAULT      0x1ffe
-+#define TCCB_SAC_INTRG                0x1fff
- /**
-  * struct tccb_tcah - Transport-Command-Area Header (TCAH)
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-07-01-zfcp-port-failed-message.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-07-01-zfcp-port-failed-message.diff
deleted file mode 100644 (file)
index 80cc7c9..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: zfcp: Remove message for failed port
-References: bnc#464466
-
-Symptom:     During opening of an adapter the message "Remote port ...
-             could not be opened" is emitted for initiator ports,
-             confusing users.
-Problem:     The port scan tries to open all ports, including
-             initiator ports to determine if they are target ports.
-             Sometimes, a different error status is returned for the
-             initiator ports, triggering the message mentioned above.
-Solution:    Remove the message, target port failures will be checked
-             later in the error recovery, printing a different message
-             if necessary.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- Documentation/kmsg/s390/zfcp |   15 ---------------
- drivers/s390/scsi/zfcp_dbf.c |    2 +-
- drivers/s390/scsi/zfcp_fsf.c |    6 ------
- 3 files changed, 1 insertion(+), 22 deletions(-)
-
---- a/Documentation/kmsg/s390/zfcp     2008-12-19 13:18:45.000000000 +0100
-+++ b/Documentation/kmsg/s390/zfcp     2008-12-19 13:18:59.000000000 +0100
-@@ -677,21 +677,6 @@
-  */
- /*?
-- * Text: "%s: Remote port 0x%016Lx could not be opened\n"
-- * Severity: Warning
-- * Parameter:
-- *   @1: bus ID of the zfcp device
-- *   @2: WWPN
-- * Description:
-- * The FCP adapter rejected a request to open the specified port. No retry
-- * is possible.
-- * User action:
-- * Verify the setup and try removing and adding the port again. If this
-- * problem persists, gather Linux debug data, collect the FCP adapter
-- * hardware logs, and report the problem to your support organization.
-- */
--
--/*?
-  * Text: "%s: LUN 0x%Lx on port 0x%Lx is already in use by CSS%d, MIF Image ID %x\n"
-  * Severity: Warning
-  * Parameter:
---- a/drivers/s390/scsi/zfcp_dbf.c     2008-12-19 13:18:45.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_dbf.c     2008-12-19 13:18:59.000000000 +0100
-@@ -521,7 +521,7 @@ static const char *zfcp_rec_dbf_ids[] = 
-       [29]    = "link down",
-       [30]    = "link up status read",
-       [31]    = "open port failed",
--      [32]    = "open port failed",
-+      [32]    = "",
-       [33]    = "close port",
-       [34]    = "open unit failed",
-       [35]    = "exclusive open unit failed",
---- a/drivers/s390/scsi/zfcp_fsf.c     2008-12-19 13:18:45.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_fsf.c     2008-12-19 13:18:59.000000000 +0100
-@@ -1405,13 +1405,7 @@ static void zfcp_fsf_open_port_handler(s
-               switch (header->fsf_status_qual.word[0]) {
-               case FSF_SQ_INVOKE_LINK_TEST_PROCEDURE:
-               case FSF_SQ_ULP_DEPENDENT_ERP_REQUIRED:
--                      req->status |= ZFCP_STATUS_FSFREQ_ERROR;
--                      break;
-               case FSF_SQ_NO_RETRY_POSSIBLE:
--                      dev_warn(&req->adapter->ccw_device->dev,
--                               "Remote port 0x%016Lx could not be opened\n",
--                               (unsigned long long)port->wwpn);
--                      zfcp_erp_port_failed(port, 32, req);
-                       req->status |= ZFCP_STATUS_FSFREQ_ERROR;
-                       break;
-               }
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-07-02-zfcp-unchained-fsf.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-07-02-zfcp-unchained-fsf.diff
deleted file mode 100644 (file)
index 25452ab..0000000
+++ /dev/null
@@ -1,378 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: zfcp: Add support for unchained FSF requests
-References: bnc#464466
-
-Symptom:     On a z900 zfcp loops in error recovery.
-Problem:     The z900 requires support for unchained FSF requests for
-             CT and ELS requests. The chained format triggers the ERP
-             from the qdio error handler.
-Solution:    Check the hardware feature flag and send unchained CT
-             and ELS requests if chaining is not support. Adapt the
-             size of the GPN_FT request as necessary and add debug data
-             and a warning, in case the CT request hits a limit.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- Documentation/kmsg/s390/zfcp |   16 ++++++++++++
- drivers/s390/scsi/zfcp_dbf.c |    2 +
- drivers/s390/scsi/zfcp_dbf.h |    1 
- drivers/s390/scsi/zfcp_def.h |    9 -------
- drivers/s390/scsi/zfcp_fc.c  |   55 ++++++++++++++++++++++++-------------------
- drivers/s390/scsi/zfcp_fsf.c |   32 +++++++++++++++++++------
- drivers/s390/scsi/zfcp_fsf.h |    2 +
- 7 files changed, 77 insertions(+), 40 deletions(-)
-
---- a/drivers/s390/scsi/zfcp_fc.c      2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_fc.c      2008-12-19 13:36:27.000000000 +0100
-@@ -25,9 +25,12 @@ struct gpn_ft_resp_acc {
-       u64 wwpn;
- } __attribute__ ((packed));
--#define ZFCP_GPN_FT_ENTRIES ((PAGE_SIZE - sizeof(struct ct_hdr)) \
--                              / sizeof(struct gpn_ft_resp_acc))
-+#define ZFCP_CT_SIZE_ONE_PAGE (PAGE_SIZE - sizeof(struct ct_hdr))
-+#define ZFCP_GPN_FT_ENTRIES   (ZFCP_CT_SIZE_ONE_PAGE \
-+                                      / sizeof(struct gpn_ft_resp_acc))
- #define ZFCP_GPN_FT_BUFFERS 4
-+#define ZFCP_GPN_FT_MAX_SIZE (ZFCP_GPN_FT_BUFFERS * PAGE_SIZE \
-+                              - sizeof(struct ct_hdr))
- #define ZFCP_GPN_FT_MAX_ENTRIES ZFCP_GPN_FT_BUFFERS * (ZFCP_GPN_FT_ENTRIES + 1)
- struct ct_iu_gpn_ft_resp {
-@@ -283,8 +286,6 @@ int static zfcp_fc_ns_gid_pn_request(str
-       gid_pn->ct.timeout = ZFCP_NS_GID_PN_TIMEOUT;
-       gid_pn->ct.req = &gid_pn->req;
-       gid_pn->ct.resp = &gid_pn->resp;
--      gid_pn->ct.req_count = 1;
--      gid_pn->ct.resp_count = 1;
-       sg_init_one(&gid_pn->req, &gid_pn->ct_iu_req,
-                   sizeof(struct ct_iu_gid_pn_req));
-       sg_init_one(&gid_pn->resp, &gid_pn->ct_iu_resp,
-@@ -296,7 +297,7 @@ int static zfcp_fc_ns_gid_pn_request(str
-       gid_pn->ct_iu_req.header.gs_subtype = ZFCP_CT_NAME_SERVER;
-       gid_pn->ct_iu_req.header.options = ZFCP_CT_SYNCHRONOUS;
-       gid_pn->ct_iu_req.header.cmd_rsp_code = ZFCP_CT_GID_PN;
--      gid_pn->ct_iu_req.header.max_res_size = ZFCP_CT_MAX_SIZE;
-+      gid_pn->ct_iu_req.header.max_res_size = ZFCP_CT_SIZE_ONE_PAGE / 4;
-       gid_pn->ct_iu_req.wwpn = erp_action->port->wwpn;
-       init_completion(&compl_rec.done);
-@@ -406,8 +407,6 @@ static int zfcp_fc_adisc(struct zfcp_por
-       sg_init_one(adisc->els.resp, &adisc->ls_adisc_acc,
-                   sizeof(struct zfcp_ls_adisc));
--      adisc->els.req_count = 1;
--      adisc->els.resp_count = 1;
-       adisc->els.adapter = adapter;
-       adisc->els.port = port;
-       adisc->els.d_id = port->d_id;
-@@ -447,17 +446,17 @@ void zfcp_test_link(struct zfcp_port *po
-               zfcp_erp_port_forced_reopen(port, 0, 65, NULL);
- }
--static void zfcp_free_sg_env(struct zfcp_gpn_ft *gpn_ft)
-+static void zfcp_free_sg_env(struct zfcp_gpn_ft *gpn_ft, int buf_num)
- {
-       struct scatterlist *sg = &gpn_ft->sg_req;
-       kfree(sg_virt(sg)); /* free request buffer */
--      zfcp_sg_free_table(gpn_ft->sg_resp, ZFCP_GPN_FT_BUFFERS);
-+      zfcp_sg_free_table(gpn_ft->sg_resp, buf_num);
-       kfree(gpn_ft);
- }
--static struct zfcp_gpn_ft *zfcp_alloc_sg_env(void)
-+static struct zfcp_gpn_ft *zfcp_alloc_sg_env(int buf_num)
- {
-       struct zfcp_gpn_ft *gpn_ft;
-       struct ct_iu_gpn_ft_req *req;
-@@ -474,8 +473,8 @@ static struct zfcp_gpn_ft *zfcp_alloc_sg
-       }
-       sg_init_one(&gpn_ft->sg_req, req, sizeof(*req));
--      if (zfcp_sg_setup_table(gpn_ft->sg_resp, ZFCP_GPN_FT_BUFFERS)) {
--              zfcp_free_sg_env(gpn_ft);
-+      if (zfcp_sg_setup_table(gpn_ft->sg_resp, buf_num)) {
-+              zfcp_free_sg_env(gpn_ft, buf_num);
-               gpn_ft = NULL;
-       }
- out:
-@@ -484,7 +483,8 @@ out:
- static int zfcp_scan_issue_gpn_ft(struct zfcp_gpn_ft *gpn_ft,
--                                struct zfcp_adapter *adapter)
-+                                struct zfcp_adapter *adapter,
-+                                int max_bytes)
- {
-       struct zfcp_send_ct *ct = &gpn_ft->ct;
-       struct ct_iu_gpn_ft_req *req = sg_virt(&gpn_ft->sg_req);
-@@ -497,8 +497,7 @@ static int zfcp_scan_issue_gpn_ft(struct
-       req->header.gs_subtype = ZFCP_CT_NAME_SERVER;
-       req->header.options = ZFCP_CT_SYNCHRONOUS;
-       req->header.cmd_rsp_code = ZFCP_CT_GPN_FT;
--      req->header.max_res_size = (sizeof(struct gpn_ft_resp_acc) *
--                                      (ZFCP_GPN_FT_MAX_ENTRIES - 1)) >> 2;
-+      req->header.max_res_size = max_bytes / 4;
-       req->flags = 0;
-       req->domain_id_scope = 0;
-       req->area_id_scope = 0;
-@@ -511,8 +510,6 @@ static int zfcp_scan_issue_gpn_ft(struct
-       ct->timeout = 10;
-       ct->req = &gpn_ft->sg_req;
-       ct->resp = gpn_ft->sg_resp;
--      ct->req_count = 1;
--      ct->resp_count = ZFCP_GPN_FT_BUFFERS;
-       init_completion(&compl_rec.done);
-       compl_rec.handler = NULL;
-@@ -539,7 +536,7 @@ static void zfcp_validate_port(struct zf
-       zfcp_port_dequeue(port);
- }
--static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft)
-+static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft, int max_entries)
- {
-       struct zfcp_send_ct *ct = &gpn_ft->ct;
-       struct scatterlist *sg = gpn_ft->sg_resp;
-@@ -559,13 +556,17 @@ static int zfcp_scan_eval_gpn_ft(struct 
-               return -EIO;
-       }
--      if (hdr->max_res_size)
-+      if (hdr->max_res_size) {
-+              dev_warn(&adapter->ccw_device->dev,
-+                       "The name server reported %d words residual data\n",
-+                       hdr->max_res_size);
-               return -E2BIG;
-+      }
-       down(&zfcp_data.config_sema);
-       /* first entry is the header */
--      for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES && !last; x++) {
-+      for (x = 1; x < max_entries && !last; x++) {
-               if (x % (ZFCP_GPN_FT_ENTRIES + 1))
-                       acc++;
-               else
-@@ -611,6 +612,12 @@ int zfcp_scan_ports(struct zfcp_adapter 
- {
-       int ret, i;
-       struct zfcp_gpn_ft *gpn_ft;
-+      int chain, max_entries, buf_num, max_bytes;
-+
-+      chain = adapter->adapter_features & FSF_FEATURE_ELS_CT_CHAINED_SBALS;
-+      buf_num = chain ? ZFCP_GPN_FT_BUFFERS : 1;
-+      max_entries = chain ? ZFCP_GPN_FT_MAX_ENTRIES : ZFCP_GPN_FT_ENTRIES;
-+      max_bytes = chain ? ZFCP_GPN_FT_MAX_SIZE : ZFCP_CT_SIZE_ONE_PAGE;
-       zfcp_erp_wait(adapter); /* wait until adapter is finished with ERP */
-       if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
-@@ -620,23 +627,23 @@ int zfcp_scan_ports(struct zfcp_adapter 
-       if (ret)
-               return ret;
--      gpn_ft = zfcp_alloc_sg_env();
-+      gpn_ft = zfcp_alloc_sg_env(buf_num);
-       if (!gpn_ft) {
-               ret = -ENOMEM;
-               goto out;
-       }
-       for (i = 0; i < 3; i++) {
--              ret = zfcp_scan_issue_gpn_ft(gpn_ft, adapter);
-+              ret = zfcp_scan_issue_gpn_ft(gpn_ft, adapter, max_bytes);
-               if (!ret) {
--                      ret = zfcp_scan_eval_gpn_ft(gpn_ft);
-+                      ret = zfcp_scan_eval_gpn_ft(gpn_ft, max_entries);
-                       if (ret == -EAGAIN)
-                               ssleep(1);
-                       else
-                               break;
-               }
-       }
--      zfcp_free_sg_env(gpn_ft);
-+      zfcp_free_sg_env(gpn_ft, buf_num);
- out:
-       zfcp_wka_port_put(&adapter->nsp);
-       return ret;
---- a/drivers/s390/scsi/zfcp_fsf.h     2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_fsf.h     2008-12-19 13:36:27.000000000 +0100
-@@ -164,6 +164,7 @@
- #define FSF_FEATURE_LUN_SHARING                       0x00000004
- #define FSF_FEATURE_NOTIFICATION_LOST         0x00000008
- #define FSF_FEATURE_HBAAPI_MANAGEMENT           0x00000010
-+#define FSF_FEATURE_ELS_CT_CHAINED_SBALS      0x00000020
- #define FSF_FEATURE_UPDATE_ALERT              0x00000100
- #define FSF_FEATURE_MEASUREMENT_DATA          0x00000200
-@@ -322,6 +323,7 @@ struct fsf_nport_serv_param {
-       u8  vendor_version_level[16];
- } __attribute__ ((packed));
-+#define FSF_PLOGI_MIN_LEN     112
- struct fsf_plogi {
-       u32    code;
-       struct fsf_nport_serv_param serv_param;
---- a/drivers/s390/scsi/zfcp_fsf.c     2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_fsf.c     2008-12-19 13:36:27.000000000 +0100
-@@ -1012,12 +1012,29 @@ skip_fsfstatus:
-               send_ct->handler(send_ct->handler_data);
- }
--static int zfcp_fsf_setup_sbals(struct zfcp_fsf_req *req,
--                              struct scatterlist *sg_req,
--                              struct scatterlist *sg_resp, int max_sbals)
-+static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
-+                                     struct scatterlist *sg_req,
-+                                     struct scatterlist *sg_resp,
-+                                     int max_sbals)
- {
-+      struct qdio_buffer_element *sbale = zfcp_qdio_sbale_req(req);
-+      u32 feat = req->adapter->adapter_features;
-       int bytes;
-+      if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS)) {
-+              if (sg_req->length > PAGE_SIZE || sg_resp->length > PAGE_SIZE ||
-+                  !sg_is_last(sg_req) || !sg_is_last(sg_resp))
-+                      return -EOPNOTSUPP;
-+
-+              sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE_READ;
-+              sbale[2].addr   = sg_virt(sg_req);
-+              sbale[2].length = sg_req->length;
-+              sbale[3].addr   = sg_virt(sg_resp);
-+              sbale[3].length = sg_resp->length;
-+              sbale[3].flags |= SBAL_FLAGS_LAST_ENTRY;
-+              return 0;
-+      }
-+
-       bytes = zfcp_qdio_sbals_from_sg(req, SBAL_FLAGS0_TYPE_WRITE_READ,
-                                       sg_req, max_sbals);
-       if (bytes <= 0)
-@@ -1059,8 +1076,8 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct
-               goto out;
-       }
--      ret = zfcp_fsf_setup_sbals(req, ct->req, ct->resp,
--                                 FSF_MAX_SBALS_PER_REQ);
-+      ret = zfcp_fsf_setup_ct_els_sbals(req, ct->req, ct->resp,
-+                                        FSF_MAX_SBALS_PER_REQ);
-       if (ret)
-               goto failed_send;
-@@ -1170,7 +1187,7 @@ int zfcp_fsf_send_els(struct zfcp_send_e
-               goto out;
-       }
--      ret = zfcp_fsf_setup_sbals(req, els->req, els->resp, 2);
-+      ret = zfcp_fsf_setup_ct_els_sbals(req, els->req, els->resp, 2);
-       if (ret)
-               goto failed_send;
-@@ -1433,7 +1450,8 @@ static void zfcp_fsf_open_port_handler(s
-                * Alternately, an ADISC/PDISC ELS should suffice, as well.
-                */
-               plogi = (struct fsf_plogi *) req->qtcb->bottom.support.els;
--              if (req->qtcb->bottom.support.els1_length >= sizeof(*plogi)) {
-+              if (req->qtcb->bottom.support.els1_length >=
-+                  FSF_PLOGI_MIN_LEN) {
-                       if (plogi->serv_param.wwpn != port->wwpn)
-                               atomic_clear_mask(ZFCP_STATUS_PORT_DID_DID,
-                                                 &port->status);
---- a/Documentation/kmsg/s390/zfcp     2008-12-19 13:36:23.000000000 +0100
-+++ b/Documentation/kmsg/s390/zfcp     2008-12-19 13:36:27.000000000 +0100
-@@ -813,3 +813,19 @@
-  * problem persists, gather Linux debug data, collect the FCP adapter
-  * hardware logs, and report the problem to your support organization.
-  */
-+
-+/*?
-+ * Text: "%s: The name server reported %d words residual data\n"
-+ * Severity: Warning
-+ * Parameter:
-+ *   @1: bus ID of the zfcp device
-+ *   @2: number of words in residual data
-+ * Description:
-+ * The fibre channel name server sent too much information about remote ports.
-+ * The zfcp device driver did not receive sufficient information to attach all
-+ * available remote ports in the SAN.
-+ * User action:
-+ * Verify that you are running the latest firmware level on the FCP
-+ * adapter. Check your SAN setup and consider reducing the number of ports
-+ * visible to the FCP adapter by using more restrictive zoning in the SAN.
-+ */
---- a/drivers/s390/scsi/zfcp_dbf.c     2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_dbf.c     2008-12-19 13:36:27.000000000 +0100
-@@ -935,6 +935,7 @@ void zfcp_san_dbf_event_ct_response(stru
-       rct->reason_code = hdr->reason_code;
-       rct->expl = hdr->reason_code_expl;
-       rct->vendor_unique = hdr->vendor_unique;
-+      rct->max_res_size = hdr->max_res_size;
-       rct->len = min((int)ct->resp->length - (int)sizeof(struct ct_hdr),
-                      ZFCP_DBF_SAN_MAX_PAYLOAD);
-       debug_event(adapter->san_dbf, level, r, sizeof(*r));
-@@ -1042,6 +1043,7 @@ static int zfcp_san_dbf_view_format(debu
-               zfcp_dbf_out(&p, "reason_code", "0x%02x", ct->reason_code);
-               zfcp_dbf_out(&p, "reason_code_expl", "0x%02x", ct->expl);
-               zfcp_dbf_out(&p, "vendor_unique", "0x%02x", ct->vendor_unique);
-+              zfcp_dbf_out(&p, "max_res_size", "0x%04x", ct->max_res_size);
-       } else if (strncmp(r->tag, "oels", ZFCP_DBF_TAG_SIZE) == 0 ||
-                  strncmp(r->tag, "rels", ZFCP_DBF_TAG_SIZE) == 0 ||
-                  strncmp(r->tag, "iels", ZFCP_DBF_TAG_SIZE) == 0) {
---- a/drivers/s390/scsi/zfcp_dbf.h     2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_dbf.h     2008-12-19 13:36:27.000000000 +0100
-@@ -171,6 +171,7 @@ struct zfcp_san_dbf_record_ct_response {
-       u8 reason_code;
-       u8 expl;
-       u8 vendor_unique;
-+      u16 max_res_size;
-       u32 len;
- } __attribute__ ((packed));
---- a/drivers/s390/scsi/zfcp_def.h     2008-12-19 13:36:23.000000000 +0100
-+++ b/drivers/s390/scsi/zfcp_def.h     2008-12-19 13:36:27.000000000 +0100
-@@ -210,7 +210,6 @@ struct zfcp_ls_adisc {
- #define ZFCP_CT_UNABLE_TO_PERFORM_CMD 0x09
- #define ZFCP_CT_GID_PN                        0x0121
- #define ZFCP_CT_GPN_FT                        0x0172
--#define ZFCP_CT_MAX_SIZE              0x1020
- #define ZFCP_CT_ACCEPT                        0x8002
- #define ZFCP_CT_REJECT                        0x8001
-@@ -339,8 +338,6 @@ struct ct_iu_gid_pn_resp {
-  * @wka_port: port where the request is sent to
-  * @req: scatter-gather list for request
-  * @resp: scatter-gather list for response
-- * @req_count: number of elements in request scatter-gather list
-- * @resp_count: number of elements in response scatter-gather list
-  * @handler: handler function (called for response to the request)
-  * @handler_data: data passed to handler function
-  * @timeout: FSF timeout for this request
-@@ -351,8 +348,6 @@ struct zfcp_send_ct {
-       struct zfcp_wka_port *wka_port;
-       struct scatterlist *req;
-       struct scatterlist *resp;
--      unsigned int req_count;
--      unsigned int resp_count;
-       void (*handler)(unsigned long);
-       unsigned long handler_data;
-       int timeout;
-@@ -377,8 +372,6 @@ struct zfcp_gid_pn_data {
-  * @d_id: destiniation id of port where request is sent to
-  * @req: scatter-gather list for request
-  * @resp: scatter-gather list for response
-- * @req_count: number of elements in request scatter-gather list
-- * @resp_count: number of elements in response scatter-gather list
-  * @handler: handler function (called for response to the request)
-  * @handler_data: data passed to handler function
-  * @completion: completion for synchronization purposes
-@@ -391,8 +384,6 @@ struct zfcp_send_els {
-       u32 d_id;
-       struct scatterlist *req;
-       struct scatterlist *resp;
--      unsigned int req_count;
--      unsigned int resp_count;
-       void (*handler)(unsigned long);
-       unsigned long handler_data;
-       struct completion *completion;
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-07-03-topology-fix.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-07-03-topology-fix.diff
deleted file mode 100644 (file)
index c86c5e3..0000000
+++ /dev/null
@@ -1,207 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: kernel: fix cpu topology support
-References: bnc#464466
-
-Symptom:     CPU topology changes aren't recognized by the scheduler.
-Problem:     The common code scheduler used to have a hook which could be
-             called from architecture code to trigger a rebuild of all
-             scheduling domains when cpu topology changed. This hook got
-             removed errorneously. So cpu topology change notifications
-             got lost.
-Solution:    Readd the hook. This patch also removes some unused code
-             from the s390 specific cpu topology code.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- arch/s390/kernel/topology.c |   35 ++++++++++-------------------------
- include/linux/topology.h    |    2 +-
- kernel/sched.c              |   16 +++++++++++++---
- 3 files changed, 24 insertions(+), 29 deletions(-)
-
---- a/arch/s390/kernel/topology.c
-+++ b/arch/s390/kernel/topology.c
-@@ -14,6 +14,7 @@
- #include <linux/workqueue.h>
- #include <linux/cpu.h>
- #include <linux/smp.h>
-+#include <linux/cpuset.h>
- #include <asm/delay.h>
- #include <asm/s390_ext.h>
- #include <asm/sysinfo.h>
-@@ -64,7 +65,6 @@ static void topology_work_fn(struct work
- static struct tl_info *tl_info;
- static struct core_info core_info;
- static int machine_has_topology;
--static int machine_has_topology_irq;
- static struct timer_list topology_timer;
- static void set_topology_timer(void);
- static DECLARE_WORK(topology_work, topology_work_fn);
-@@ -81,7 +81,7 @@ cpumask_t cpu_coregroup_map(unsigned int
-       cpus_clear(mask);
-       if (!topology_enabled || !machine_has_topology)
--              return cpu_present_map;
-+              return cpu_possible_map;
-       spin_lock_irqsave(&topology_lock, flags);
-       while (core) {
-               if (cpu_isset(cpu, core->mask)) {
-@@ -171,7 +171,7 @@ static void topology_update_polarization
-       int cpu;
-       mutex_lock(&smp_cpu_state_mutex);
--      for_each_present_cpu(cpu)
-+      for_each_possible_cpu(cpu)
-               smp_cpu_polarization[cpu] = POLARIZATION_HRZ;
-       mutex_unlock(&smp_cpu_state_mutex);
- }
-@@ -202,7 +202,7 @@ int topology_set_cpu_management(int fc)
-               rc = ptf(PTF_HORIZONTAL);
-       if (rc)
-               return -EBUSY;
--      for_each_present_cpu(cpu)
-+      for_each_possible_cpu(cpu)
-               smp_cpu_polarization[cpu] = POLARIZATION_UNKNWN;
-       return rc;
- }
-@@ -211,11 +211,11 @@ static void update_cpu_core_map(void)
- {
-       int cpu;
--      for_each_present_cpu(cpu)
-+      for_each_possible_cpu(cpu)
-               cpu_core_map[cpu] = cpu_coregroup_map(cpu);
- }
--void arch_update_cpu_topology(void)
-+int arch_update_cpu_topology(void)
- {
-       struct tl_info *info = tl_info;
-       struct sys_device *sysdev;
-@@ -224,7 +224,7 @@ void arch_update_cpu_topology(void)
-       if (!machine_has_topology) {
-               update_cpu_core_map();
-               topology_update_polarization_simple();
--              return;
-+              return 0;
-       }
-       stsi(info, 15, 1, 2);
-       tl_to_cores(info);
-@@ -233,11 +233,12 @@ void arch_update_cpu_topology(void)
-               sysdev = get_cpu_sysdev(cpu);
-               kobject_uevent(&sysdev->kobj, KOBJ_CHANGE);
-       }
-+      return 1;
- }
- static void topology_work_fn(struct work_struct *work)
- {
--      arch_reinit_sched_domains();
-+      rebuild_sched_domains();
- }
- void topology_schedule_update(void)
-@@ -260,11 +261,6 @@ static void set_topology_timer(void)
-       add_timer(&topology_timer);
- }
--static void topology_interrupt(__u16 code)
--{
--      schedule_work(&topology_work);
--}
--
- static int __init early_parse_topology(char *p)
- {
-       if (strncmp(p, "on", 2))
-@@ -284,14 +280,7 @@ static int __init init_topology_update(v
-               goto out;
-       }
-       init_timer_deferrable(&topology_timer);
--      if (machine_has_topology_irq) {
--              rc = register_external_interrupt(0x2005, topology_interrupt);
--              if (rc)
--                      goto out;
--              ctl_set_bit(0, 8);
--      }
--      else
--              set_topology_timer();
-+      set_topology_timer();
- out:
-       update_cpu_core_map();
-       return rc;
-@@ -312,9 +301,6 @@ void __init s390_init_cpu_topology(void)
-               return;
-       machine_has_topology = 1;
--      if (facility_bits & (1ULL << 51))
--              machine_has_topology_irq = 1;
--
-       tl_info = alloc_bootmem_pages(PAGE_SIZE);
-       info = tl_info;
-       stsi(info, 15, 1, 2);
-@@ -338,5 +324,4 @@ void __init s390_init_cpu_topology(void)
-       return;
- error:
-       machine_has_topology = 0;
--      machine_has_topology_irq = 0;
- }
---- a/include/linux/topology.h
-+++ b/include/linux/topology.h
-@@ -49,7 +49,7 @@
-       for_each_online_node(node)                      \
-               if (nr_cpus_node(node))
--void arch_update_cpu_topology(void);
-+int arch_update_cpu_topology(void);
- /* Conform to ACPI 2.0 SLIT distance definitions */
- #define LOCAL_DISTANCE                10
---- a/kernel/sched.c
-+++ b/kernel/sched.c
-@@ -7640,8 +7640,14 @@ static struct sched_domain_attr *dattr_c
-  */
- static cpumask_t fallback_doms;
--void __attribute__((weak)) arch_update_cpu_topology(void)
-+/*
-+ * arch_update_cpu_topology lets virtualized architectures update the
-+ * cpu core maps. It is supposed to return 1 if the topology changed
-+ * or 0 if it stayed the same.
-+ */
-+int __attribute__((weak)) arch_update_cpu_topology(void)
- {
-+      return 0;
- }
- /*
-@@ -7735,17 +7741,21 @@ void partition_sched_domains(int ndoms_n
-                            struct sched_domain_attr *dattr_new)
- {
-       int i, j, n;
-+      int top_changed;
-       mutex_lock(&sched_domains_mutex);
-       /* always unregister in case we don't destroy any domains */
-       unregister_sched_domain_sysctl();
-+      /* Let architecture update cpu core mappings. */
-+      top_changed = arch_update_cpu_topology();
-+
-       n = doms_new ? ndoms_new : 0;
-       /* Destroy deleted domains */
-       for (i = 0; i < ndoms_cur; i++) {
--              for (j = 0; j < n; j++) {
-+              for (j = 0; j < n && !top_changed; j++) {
-                       if (cpus_equal(doms_cur[i], doms_new[j])
-                           && dattrs_equal(dattr_cur, i, dattr_new, j))
-                               goto match1;
-@@ -7765,7 +7775,7 @@ match1:
-       /* Build new domains */
-       for (i = 0; i < ndoms_new; i++) {
--              for (j = 0; j < ndoms_cur; j++) {
-+              for (j = 0; j < ndoms_cur && !top_changed; j++) {
-                       if (cpus_equal(doms_new[i], doms_cur[j])
-                           && dattrs_equal(dattr_new, i, dattr_cur, j))
-                               goto match2;
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-08-01-cio-fix-mp-mode.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-08-01-cio-fix-mp-mode.diff
deleted file mode 100644 (file)
index 852e22b..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: cio: fix subchannel multipath mode setup
-References: bnc#466462,LTC#51047
-
-Symptom:     Undefined behavior when trying to access DASD devices with more
-             than one CHPID: e.g. I/O errors due to timeouts after missing
-             interrupts, slow access to DASDs because single path mode is used.
-Problem:     Setup of subchannel multipath mode is not performed correctly
-             because changes to a local buffer are lost before they are sent
-             to the channel subsystem. In this state, the control unit assumes
-             multipath mode while the channel subsystem expects single path
-             mode. As a result, interrupts may not be correctly recognized
-             which leads to timeout situations and eventually I/O errors.
-             Also single path processing may slow down DASD access.
-Solution:    Apply changes to the subchannel configuration after modifying
-             the local buffer.
-
-Acked-by: John Jolly <jjolly@suse.de>
-
----
- drivers/s390/cio/device.c     |    6 ++++++
- drivers/s390/cio/device_fsm.c |    2 ++
- 2 files changed, 8 insertions(+)
-
-Index: linux-sles11/drivers/s390/cio/device.c
-===================================================================
---- linux-sles11.orig/drivers/s390/cio/device.c
-+++ linux-sles11/drivers/s390/cio/device.c
-@@ -1246,6 +1246,9 @@ static int io_subchannel_probe(struct su
-               return 0;
-       }
-       io_subchannel_init_fields(sch);
-+      rc = cio_modify(sch);
-+      if (rc)
-+              goto out_schedule;
-       /*
-        * First check if a fitting device may be found amongst the
-        * disconnected devices or in the orphanage.
-@@ -1676,6 +1679,9 @@ static int ccw_device_console_enable(str
-       sch->private = cio_get_console_priv();
-       memset(sch->private, 0, sizeof(struct io_subchannel_private));
-       io_subchannel_init_fields(sch);
-+      rc = cio_modify(sch);
-+      if (rc)
-+              return rc;
-       sch->driver = &io_subchannel_driver;
-       /* Initialize the ccw_device structure. */
-       cdev->dev.parent= &sch->dev;
-Index: linux-sles11/drivers/s390/cio/device_fsm.c
-===================================================================
---- linux-sles11.orig/drivers/s390/cio/device_fsm.c
-+++ linux-sles11/drivers/s390/cio/device_fsm.c
-@@ -1028,6 +1028,8 @@ void ccw_device_trigger_reprobe(struct c
-       sch->schib.pmcw.ena = 0;
-       if ((sch->lpm & (sch->lpm - 1)) != 0)
-               sch->schib.pmcw.mp = 1;
-+      if (cio_modify(sch))
-+              return;
-       /* We should also udate ssd info, but this has to wait. */
-       /* Check if this is another device which appeared on the same sch. */
-       if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) {
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-08-02-zfcp-gpn-align-fix.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-08-02-zfcp-gpn-align-fix.diff
deleted file mode 100644 (file)
index d3a4403..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: zfcp: fix memory alignment for GPN_FT requests.
-References: bnc#466462
-
-Symptom:     An unexpected adapter reopen can be triggered in case
-             of a wrongly aligned GPN_FT nameserver request.
-Problem:     A request which is stored across a page is not allowed.
-             The standard memory allocation does not guarantee to have
-             all requested memory within one page.
-Solution:    Make sure the requested memory is always within one page.
-
-Acked-by: John Jolly <jjolly@suse.de>
-
----
- drivers/s390/scsi/zfcp_aux.c |    7 +++++++
- drivers/s390/scsi/zfcp_def.h |    9 +++++++++
- drivers/s390/scsi/zfcp_fc.c  |   13 +++----------
- 3 files changed, 19 insertions(+), 10 deletions(-)
-
-Index: linux-sles11/drivers/s390/scsi/zfcp_aux.c
-===================================================================
---- linux-sles11.orig/drivers/s390/scsi/zfcp_aux.c
-+++ linux-sles11/drivers/s390/scsi/zfcp_aux.c
-@@ -175,6 +175,11 @@ static int __init zfcp_module_init(void)
-       if (!zfcp_data.gid_pn_cache)
-               goto out_gid_cache;
-+      zfcp_data.gpn_ft_cache = zfcp_cache_create(
-+                      sizeof(struct ct_iu_gpn_ft_req), "zfcp_gpn");
-+      if (!zfcp_data.gpn_ft_cache)
-+              goto out_gpn_cache;
-+
-       zfcp_data.work_queue = create_singlethread_workqueue("zfcp_wq");
-       INIT_LIST_HEAD(&zfcp_data.adapter_list_head);
-@@ -209,6 +214,8 @@ out_ccw_register:
- out_misc:
-       fc_release_transport(zfcp_data.scsi_transport_template);
- out_transport:
-+      kmem_cache_destroy(zfcp_data.gpn_ft_cache);
-+out_gpn_cache:
-       kmem_cache_destroy(zfcp_data.gid_pn_cache);
- out_gid_cache:
-       kmem_cache_destroy(zfcp_data.sr_buffer_cache);
-Index: linux-sles11/drivers/s390/scsi/zfcp_def.h
-===================================================================
---- linux-sles11.orig/drivers/s390/scsi/zfcp_def.h
-+++ linux-sles11/drivers/s390/scsi/zfcp_def.h
-@@ -333,6 +333,14 @@ struct ct_iu_gid_pn_resp {
-       u32 d_id;
- } __attribute__ ((packed));
-+struct ct_iu_gpn_ft_req {
-+      struct ct_hdr header;
-+      u8 flags;
-+      u8 domain_id_scope;
-+      u8 area_id_scope;
-+      u8 fc4_type;
-+} __attribute__ ((packed));
-+
- /**
-  * struct zfcp_send_ct - used to pass parameters to function zfcp_fsf_send_ct
-  * @wka_port: port where the request is sent to
-@@ -595,6 +603,7 @@ struct zfcp_data {
-       struct kmem_cache       *fsf_req_qtcb_cache;
-       struct kmem_cache       *sr_buffer_cache;
-       struct kmem_cache       *gid_pn_cache;
-+      struct kmem_cache       *gpn_ft_cache;
-       struct workqueue_struct *work_queue;
- };
-Index: linux-sles11/drivers/s390/scsi/zfcp_fc.c
-===================================================================
---- linux-sles11.orig/drivers/s390/scsi/zfcp_fc.c
-+++ linux-sles11/drivers/s390/scsi/zfcp_fc.c
-@@ -10,14 +10,6 @@
- #include "zfcp_ext.h"
--struct ct_iu_gpn_ft_req {
--      struct ct_hdr header;
--      u8 flags;
--      u8 domain_id_scope;
--      u8 area_id_scope;
--      u8 fc4_type;
--} __attribute__ ((packed));
--
- struct gpn_ft_resp_acc {
-       u8 control;
-       u8 port_id[3];
-@@ -450,7 +442,8 @@ static void zfcp_free_sg_env(struct zfcp
- {
-       struct scatterlist *sg = &gpn_ft->sg_req;
--      kfree(sg_virt(sg)); /* free request buffer */
-+      /* free request buffer */
-+      kmem_cache_free(zfcp_data.gpn_ft_cache, sg_virt(sg));
-       zfcp_sg_free_table(gpn_ft->sg_resp, buf_num);
-       kfree(gpn_ft);
-@@ -465,7 +458,7 @@ static struct zfcp_gpn_ft *zfcp_alloc_sg
-       if (!gpn_ft)
-               return NULL;
--      req = kzalloc(sizeof(struct ct_iu_gpn_ft_req), GFP_KERNEL);
-+      req = kmem_cache_alloc(zfcp_data.gpn_ft_cache, GFP_KERNEL);
-       if (!req) {
-               kfree(gpn_ft);
-               gpn_ft = NULL;
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-08-03-iucv-cpu-hotremove.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-08-03-iucv-cpu-hotremove.diff
deleted file mode 100644 (file)
index 98cbf4b..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: iucv: failing cpu hot remove for inactive iucv
-References: bnc#466462,LTC#51104
-
-Symptom:     cpu hot remove rejected with NOTIFY_BAD
-Problem:     If the iucv module is compiled in / loaded but no user
-             is registered, cpu hot remove doesn't work. The iucv
-             cpu hotplug notifier on CPU_DOWN_PREPARE checks, if
-             the iucv_buffer_cpumask would be empty after the
-             corresponding bit would be cleared. However the bit
-             was never set since iucv wasn't enabled. That causes
-             all cpu hot unplug operations to fail in this scenario.
-Solution:    Use iucv_path_table as an indicator whether iucv is
-             enabled or not.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
-
- net/iucv/iucv.c |   18 +++++++++++-------
- 1 file changed, 11 insertions(+), 7 deletions(-)
-
-Index: linux-sles11/net/iucv/iucv.c
-===================================================================
---- linux-sles11.orig/net/iucv/iucv.c
-+++ linux-sles11/net/iucv/iucv.c
-@@ -516,6 +516,7 @@ static int iucv_enable(void)
-       size_t alloc_size;
-       int cpu, rc;
-+      get_online_cpus();
-       rc = -ENOMEM;
-       alloc_size = iucv_max_pathid * sizeof(struct iucv_path);
-       iucv_path_table = kzalloc(alloc_size, GFP_KERNEL);
-@@ -523,19 +524,17 @@ static int iucv_enable(void)
-               goto out;
-       /* Declare per cpu buffers. */
-       rc = -EIO;
--      get_online_cpus();
-       for_each_online_cpu(cpu)
-               smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1);
-       if (cpus_empty(iucv_buffer_cpumask))
-               /* No cpu could declare an iucv buffer. */
--              goto out_path;
-+              goto out;
-       put_online_cpus();
-       return 0;
--
--out_path:
--      put_online_cpus();
--      kfree(iucv_path_table);
- out:
-+      kfree(iucv_path_table);
-+      iucv_path_table = NULL;
-+      put_online_cpus();
-       return rc;
- }
-@@ -550,8 +549,9 @@ static void iucv_disable(void)
- {
-       get_online_cpus();
-       on_each_cpu(iucv_retrieve_cpu, NULL, 1);
--      put_online_cpus();
-       kfree(iucv_path_table);
-+      iucv_path_table = NULL;
-+      put_online_cpus();
- }
- static int __cpuinit iucv_cpu_notify(struct notifier_block *self,
-@@ -588,10 +588,14 @@ static int __cpuinit iucv_cpu_notify(str
-       case CPU_ONLINE_FROZEN:
-       case CPU_DOWN_FAILED:
-       case CPU_DOWN_FAILED_FROZEN:
-+              if (!iucv_path_table)
-+                      break;
-               smp_call_function_single(cpu, iucv_declare_cpu, NULL, 1);
-               break;
-       case CPU_DOWN_PREPARE:
-       case CPU_DOWN_PREPARE_FROZEN:
-+              if (!iucv_path_table)
-+                      break;
-               cpumask = iucv_buffer_cpumask;
-               cpu_clear(cpu, cpumask);
-               if (cpus_empty(cpumask))
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-08-04-compat-sigaltstack.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-08-04-compat-sigaltstack.diff
deleted file mode 100644 (file)
index 5f227a7..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: kernel: 31 bit compat sigaltstack syscall fails with -EFAULT.
-References: bnc#466462,LTC#50888
-
-Symptom:     When 31 bit user space programs call sigaltstack on a 64 bit Linux
-             OS, the system call returns -1 with errno=EFAULT.
-Problem:     The 31 bit pointer passed to the system call is extended
-             to 64 bit, but the high order bits are not set to zero.
-             The kernel detects the invalid user space pointer and
-             returns -EFAULT.
-Solution:    Call sys32_sigaltstack_wrapper() instead of sys32_sigaltstack().
-             The wrapper function sets the high order bits to zero.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- arch/s390/kernel/syscalls.S |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: linux-sles11/arch/s390/kernel/syscalls.S
-===================================================================
---- linux-sles11.orig/arch/s390/kernel/syscalls.S
-+++ linux-sles11/arch/s390/kernel/syscalls.S
-@@ -194,7 +194,7 @@ SYSCALL(sys_chown16,sys_ni_syscall,sys32
- SYSCALL(sys_getcwd,sys_getcwd,sys32_getcwd_wrapper)
- SYSCALL(sys_capget,sys_capget,sys32_capget_wrapper)
- SYSCALL(sys_capset,sys_capset,sys32_capset_wrapper)           /* 185 */
--SYSCALL(sys_sigaltstack,sys_sigaltstack,sys32_sigaltstack)
-+SYSCALL(sys_sigaltstack,sys_sigaltstack,sys32_sigaltstack_wrapper)
- SYSCALL(sys_sendfile,sys_sendfile64,sys32_sendfile_wrapper)
- NI_SYSCALL                                                    /* streams1 */
- NI_SYSCALL                                                    /* streams2 */
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-09-04-topology.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-09-04-topology.diff
deleted file mode 100644 (file)
index db7bc99..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: topology: introduce arch specific SD_MC_INIT initializer
-References: bnc#477666,LTC#51049
-
-Symptom:     Up to 30% more cpu usage for some workloads.
-Problem:     For some workloads the extra multicore scheduling domain causes
-             additional cpu usage because of too optimistic assumptions when
-             it is ok to migrate processes from one cpu to another. The default
-             values for SD_MC_INIT don't work well on s390.
-Solution:    Define an architecure specific SD_MC_INIT scheduling domain
-             initializer which fixes the regression.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
- arch/s390/include/asm/topology.h |    2 ++
- 1 file changed, 2 insertions(+)
-
-Index: linux-sles11/arch/s390/include/asm/topology.h
-===================================================================
---- linux-sles11.orig/arch/s390/include/asm/topology.h
-+++ linux-sles11/arch/s390/include/asm/topology.h
-@@ -28,6 +28,8 @@ static inline void s390_init_cpu_topolog
- };
- #endif
-+#define SD_MC_INIT SD_CPU_INIT
-+
- #include <asm-generic/topology.h>
- #endif /* _ASM_S390_TOPOLOGY_H */
diff --git a/src/patches/suse-2.6.27.31/patches.arch/s390-15-09-idle-accounting.diff b/src/patches/suse-2.6.27.31/patches.arch/s390-15-09-idle-accounting.diff
deleted file mode 100644 (file)
index 53fe518..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-From: Gerald Schaefer <geraldsc@de.ibm.com>
-Subject: kernel: fix idle time accounting
-References: bnc#518291,LTC#54879
-
-Symptom:     The idle time reported in /proc/stat is too large
-Problem:     The time spent with time ticks disabled is accounted twice,
-             once by the architecture backend and another time by the
-             generic timer code.
-Solution:    Stop accounting idle time in the generic timer code if
-             CONFIG_VIRT_CPU_ACCOUNTING is enabled.
-
-Acked-by: John Jolly <jjolly@suse.de>
----
-
- kernel/time/tick-sched.c |    4 ++++
- 1 file changed, 4 insertions(+)
-
-Index: linux-sles11/kernel/time/tick-sched.c
-===================================================================
---- linux-sles11.orig/kernel/time/tick-sched.c
-+++ linux-sles11/kernel/time/tick-sched.c
-@@ -377,7 +377,9 @@ void tick_nohz_restart_sched_tick(void)
- {
-       int cpu = smp_processor_id();
-       struct tick_sched *ts = &per_cpu(tick_cpu_sched, cpu);
-+#ifndef CONFIG_VIRT_CPU_ACCOUNTING
-       unsigned long ticks;
-+#endif
-       ktime_t now;
-       local_irq_disable();
-@@ -399,6 +401,7 @@ void tick_nohz_restart_sched_tick(void)
-       tick_do_update_jiffies64(now);
-       cpu_clear(cpu, nohz_cpu_mask);
-+#ifndef CONFIG_VIRT_CPU_ACCOUNTING
-       /*
-        * We stopped the tick in idle. Update process times would miss the
-        * time we slept as update_process_times does only a 1 tick
-@@ -414,6 +417,7 @@ void tick_nohz_restart_sched_tick(void)
-                                   jiffies_to_cputime(ticks));
-               sub_preempt_count(HARDIRQ_OFFSET);
-       }
-+#endif
-       touch_softlockup_watchdog();
-       /*
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc269-fix-vmaster b/src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc269-fix-vmaster
deleted file mode 100644 (file)
index ec1063c..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From 100d5eb36ba20dc0b99a17ea2b9800c567bfc3d1 Mon Sep 17 00:00:00 2001
-From: Takashi Iwai <tiwai@suse.de>
-Date: Mon, 10 Aug 2009 11:55:51 +0200
-Subject: [PATCH] ALSA: hda - Add missing vmaster initialization for ALC269
-Patch-mainline: 
-References:  bnc#527361
-
-Without the initialization of vmaster NID, the dB information got
-confused for ALC269 codec.
-
-Reference: Novell bnc#527361
-       https://bugzilla.novell.com/show_bug.cgi?id=527361
-
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
-Cc: <stable@kernel.org>
-
----
- sound/pci/hda/patch_realtek.c |    2 ++
- 1 file changed, 2 insertions(+)
-
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -12654,6 +12654,8 @@
-       spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
-       spec->capsrc_nids = alc269_capsrc_nids;
-+      spec->vmaster_nid = 0x02;
-+
-       codec->patch_ops = alc_patch_ops;
-       if (board_config == ALC269_AUTO)
-               spec->init_hook = alc269_auto_init;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-change-fcoe_sw-sg_tablesi.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-change-fcoe_sw-sg_tablesi.diff
deleted file mode 100644 (file)
index 5f0653c..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-From: Yi Zou <yi.zou@intel.com>
-Subject: [FcOE] change fcoe_sw sg_tablesize to SG_ALL
-References: bnc #459142
-
-Signed-off-by: Yi Zou <yi.zou@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/fcoe_sw.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-
---- a/drivers/scsi/fcoe/fcoe_sw.c
-+++ b/drivers/scsi/fcoe/fcoe_sw.c
-@@ -100,7 +100,7 @@ static struct scsi_host_template fcoe_sw
-       .cmd_per_lun = 32,
-       .can_queue = FCOE_MAX_OUTSTANDING_COMMANDS,
-       .use_clustering = ENABLE_CLUSTERING,
--      .sg_tablesize = 4,
-+      .sg_tablesize = SG_ALL,
-       .max_sectors = 0xffff,
- };
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-check-return-for-fc_set_m.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-check-return-for-fc_set_m.diff
deleted file mode 100644 (file)
index afe7324..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-From: Yi Zou <yi.zou@intel.com>
-Subject: [FcOE] check return for fc_set_mfs
-References: bnc #459142
-
-Signed-off-by: Yi Zou <yi.zou@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/fcoe_sw.c |    3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-
---- a/drivers/scsi/fcoe/fcoe_sw.c
-+++ b/drivers/scsi/fcoe/fcoe_sw.c
-@@ -178,7 +178,8 @@ static int fcoe_sw_netdev_config(struct
-        */
-       mfs = fc->real_dev->mtu - (sizeof(struct fcoe_hdr) +
-                                  sizeof(struct fcoe_crc_eof));
--      fc_set_mfs(lp, mfs);
-+      if (fc_set_mfs(lp, mfs))
-+              return -EINVAL;
-       lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;
-       if (!fcoe_link_ok(lp))
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-frame-length-validati.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-frame-length-validati.diff
deleted file mode 100644 (file)
index f623dba..0000000
+++ /dev/null
@@ -1,149 +0,0 @@
-From: Chris Leech <christopher.leech@intel.com>
-Subject: [FcOE] fix frame length validation in the early receive path
-References: bnc #459142
-
-Validation of the frame length was missing before accessing the FC and FCoE
-headers.  Some of the later checks were bogus, because of the way the fr_len
-variable and skb->len were being manipulated they could never fail.
-
-Signed-off-by: Chris Leech <christopher.leech@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/libfcoe.c |   48 +++++++++++++++++++++-----------------------
- include/scsi/fc/fc_fcoe.h   |   12 +++++++++++
- include/scsi/fc_frame.h     |    2 -
- 3 files changed, 36 insertions(+), 26 deletions(-)
-
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -184,7 +184,6 @@ int fcoe_rcv(struct sk_buff *skb, struct
-       struct fcoe_rcv_info *fr;
-       struct fcoe_softc *fc;
-       struct fcoe_dev_stats *stats;
--      u8 *data;
-       struct fc_frame_header *fh;
-       unsigned short oxid;
-       int cpu_idx;
-@@ -211,9 +210,18 @@ int fcoe_rcv(struct sk_buff *skb, struct
-               FC_DBG("wrong FC type frame");
-               goto err;
-       }
--      data = skb->data;
--      data += sizeof(struct fcoe_hdr);
--      fh = (struct fc_frame_header *)data;
-+
-+      /*
-+       * Check for minimum frame length, and make sure required FCoE
-+       * and FC headers are pulled into the linear data area.
-+       */
-+      if (unlikely((skb->len < FCOE_MIN_FRAME) ||
-+          !pskb_may_pull(skb, FCOE_HEADER_LEN)))
-+              goto err;
-+
-+      skb_set_transport_header(skb, sizeof(struct fcoe_hdr));
-+      fh = (struct fc_frame_header *) skb_transport_header(skb);
-+
-       oxid = ntohs(fh->fh_ox_id);
-       fr = fcoe_dev_from_skb(skb);
-@@ -514,8 +522,6 @@ int fcoe_percpu_receive_thread(void *arg
- {
-       struct fcoe_percpu_s *p = arg;
-       u32 fr_len;
--      unsigned int hlen;
--      unsigned int tlen;
-       struct fc_lport *lp;
-       struct fcoe_rcv_info *fr;
-       struct fcoe_dev_stats *stats;
-@@ -572,10 +578,12 @@ int fcoe_percpu_receive_thread(void *arg
-                       skb_linearize(skb);     /* not ideal */
-               /*
--               * Check the header and pull it off.
-+               * Frame length checks and setting up the header pointers
-+               * was done in fcoe_rcv already.
-                */
--              hlen = sizeof(struct fcoe_hdr);
--              hp = (struct fcoe_hdr *)skb->data;
-+              hp = (struct fcoe_hdr *) skb_network_header(skb);
-+              fh = (struct fc_frame_header *) skb_transport_header(skb);
-+
-               if (unlikely(FC_FCOE_DECAPS_VER(hp) != FC_FCOE_VER)) {
-                       if (stats) {
-                               if (stats->ErrorFrames < 5)
-@@ -586,22 +594,10 @@ int fcoe_percpu_receive_thread(void *arg
-                       kfree_skb(skb);
-                       continue;
-               }
-+
-               skb_pull(skb, sizeof(struct fcoe_hdr));
--              tlen = sizeof(struct fcoe_crc_eof);
--              fr_len = skb->len - tlen;
--              skb_trim(skb, fr_len);
-+              fr_len = skb->len - sizeof(struct fcoe_crc_eof);
--              if (unlikely(fr_len > skb->len)) {
--                      if (stats) {
--                              if (stats->ErrorFrames < 5)
--                                      FC_DBG("length error fr_len 0x%x "
--                                             "skb->len 0x%x", fr_len,
--                                             skb->len);
--                              stats->ErrorFrames++;
--                      }
--                      kfree_skb(skb);
--                      continue;
--              }
-               if (stats) {
-                       stats->RxFrames++;
-                       stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
-@@ -610,9 +606,11 @@ int fcoe_percpu_receive_thread(void *arg
-               fp = (struct fc_frame *)skb;
-               cp = (struct fcoe_crc_eof *)(skb->data + fr_len);
-               fc_frame_init(fp);
--              fr_eof(fp) = cp->fcoe_eof;
--              fr_sof(fp) = hp->fcoe_sof;
-               fr_dev(fp) = lp;
-+              fr_sof(fp) = hp->fcoe_sof;
-+              fr_eof(fp) = cp->fcoe_eof;
-+              /* trim off the CRC and EOF trailer*/
-+              skb_trim(skb, fr_len);
-               /*
-                * We only check CRC if no offload is available and if it is
---- a/include/scsi/fc/fc_fcoe.h
-+++ b/include/scsi/fc/fc_fcoe.h
-@@ -85,6 +85,18 @@ struct fcoe_crc_eof {
- } __attribute__((packed));
- /*
-+ * Minimum FCoE + FC header length
-+ * 14 bytes FCoE header + 24 byte FC header = 38 bytes
-+ */
-+#define FCOE_HEADER_LEN 38
-+
-+/*
-+ * Minimum FCoE frame size
-+ * 14 bytes FCoE header + 24 byte FC header + 8 byte FCoE trailer = 46 bytes
-+ */
-+#define FCOE_MIN_FRAME 46
-+
-+/*
-  * fc_fcoe_set_mac - Store OUI + DID into MAC address field.
-  * @mac: mac address to be set
-  * @did: fc dest id to use
---- a/include/scsi/fc_frame.h
-+++ b/include/scsi/fc_frame.h
-@@ -66,10 +66,10 @@ struct fcoe_rcv_info {
-       struct fc_lport *fr_dev;        /* transport layer private pointer */
-       struct fc_seq   *fr_seq;        /* for use with exchange manager */
-       struct scsi_cmnd *fr_cmd;       /* for use of scsi command */
-+      u16             fr_max_payload; /* max FC payload */
-       enum fc_sof     fr_sof;         /* start of frame delimiter */
-       enum fc_eof     fr_eof;         /* end of frame delimiter */
-       u8              fr_flags;       /* flags - see below */
--      u16             fr_max_payload; /* max FC payload */
- };
- /*
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-incorrect-use-of-struct-module.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-fix-incorrect-use-of-struct-module.diff
deleted file mode 100644 (file)
index 101eaa7..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-From: James Bottomley <James.Bottomley@HansenPartnership.com>
-Subject: fcoe: fix incorrect use of struct module
-Patch-mainline: 9296e519538b77b5070d49f2f9d66032733c76d4
-References: bnc #468051
-
-This structure may not be defined if CONFIG_MODULE=n, so never deref it. Change
-uses of module->name to module_name(module) and corrects some dyslexic printks
-and docbook comments.
-    
-Reported-by: Randy Dunlap <randy.dunlap@oracle.com>
-Cc: Robert Love <robert.w.love@intel.com>
-Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- drivers/scsi/fcoe/libfcoe.c |   10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -167,7 +167,7 @@ static int fcoe_cpu_callback(struct noti
- #endif /* CONFIG_HOTPLUG_CPU */
- /**
-- * foce_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ
-+ * fcoe_rcv - this is the fcoe receive function called by NET_RX_SOFTIRQ
-  * @skb: the receive skb
-  * @dev: associated net device
-  * @ptype: context
-@@ -992,8 +992,8 @@ static int fcoe_ethdrv_get(const struct
-       owner = fcoe_netdev_to_module_owner(netdev);
-       if (owner) {
--              printk(KERN_DEBUG "foce:hold driver module %s for %s\n",
--                     owner->name, netdev->name);
-+              printk(KERN_DEBUG "fcoe:hold driver module %s for %s\n",
-+                     module_name(owner), netdev->name);
-               return  try_module_get(owner);
-       }
-       return -ENODEV;
-@@ -1012,8 +1012,8 @@ static int fcoe_ethdrv_put(const struct
-       owner = fcoe_netdev_to_module_owner(netdev);
-       if (owner) {
--              printk(KERN_DEBUG "foce:release driver module %s for %s\n",
--                     owner->name, netdev->name);
-+              printk(KERN_DEBUG "fcoe:release driver module %s for %s\n",
-+                     module_name(owner), netdev->name);
-               module_put(owner);
-               return 0;
-       }
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-improved-load-balancing-i.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-improved-load-balancing-i.diff
deleted file mode 100644 (file)
index 9bef621..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-From: Vasu Dev <vasu.dev@intel.com>
-Subject: [FcOE] improved load balancing in rx path
-References: bnc #459142
-
-Currently incoming frame exchange id ANDing with total number of bits
-in online CPU bits mask, resulted only at most two CPUs selection in
-rx path, so instead used online CPU bits mask to direct incoming frame
-to a all cpus for better load balancing.
-
-Added code to default to first CPU in case selected CPU is offline or
-its rx thread not present.
-
-Signed-off-by: Vasu Dev <vasu.dev@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/libfcoe.c |   13 +++++++------
- 1 file changed, 7 insertions(+), 6 deletions(-)
-
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -230,13 +230,14 @@ int fcoe_rcv(struct sk_buff *skb, struct
-       cpu_idx = 0;
- #ifdef CONFIG_SMP
-       /*
--       * The exchange ID are ANDed with num of online CPUs,
--       * so that will have the least lock contention in
--       * handling the exchange. if there is no thread
--       * for a given idx then use first online cpu.
-+       * The incoming frame exchange id(oxid) is ANDed with num of online
-+       * cpu bits to get cpu_idx and then this cpu_idx is used for selecting
-+       * a per cpu kernel thread from fcoe_percpu. In case the cpu is
-+       * offline or no kernel thread for derived cpu_idx then cpu_idx is
-+       * initialize to first online cpu index.
-        */
--      cpu_idx = oxid & (num_online_cpus() >> 1);
--      if (fcoe_percpu[cpu_idx] == NULL)
-+      cpu_idx = oxid & (num_online_cpus() - 1);
-+      if (!fcoe_percpu[cpu_idx] || !cpu_online(cpu_idx))
-               cpu_idx = first_cpu(cpu_online_map);
- #endif
-       fps = fcoe_percpu[cpu_idx];
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-logoff-of-the-fabric-when.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-logoff-of-the-fabric-when.diff
deleted file mode 100644 (file)
index a1e3271..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: [FcOE] Logoff of the fabric when destroying interface
-References: bnc #459142
-
-This line was accidentally removed by a previous patch.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/fcoe_sw.c |    3 +++
- 1 file changed, 3 insertions(+)
-
-
---- a/drivers/scsi/fcoe/fcoe_sw.c
-+++ b/drivers/scsi/fcoe/fcoe_sw.c
-@@ -302,6 +302,9 @@ static int fcoe_sw_destroy(struct net_de
-       fc = fcoe_softc(lp);
-+      /* Logout of the fabric */
-+      fc_fabric_logoff(lp);
-+
-       /* Remove the instance from fcoe's list */
-       fcoe_hostlist_remove(lp);
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-remove-warn_on-in-fc_set.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-remove-warn_on-in-fc_set.diff
deleted file mode 100644 (file)
index 76a470a..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Yi Zou <yi.zou@intel.com>
-Subject: [FcOE] remove WARN_ON in fc_set_mfs
-References: bnc #459142
-
-remove WARN_ON in fc_set_mfs(), also adde comments.
-
-Signed-off-by: Yi Zou <yi.zou@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_lport.c |   13 +++++++++++--
- 1 file changed, 11 insertions(+), 2 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -656,10 +656,20 @@ int fc_lport_destroy(struct fc_lport *lp
- }
- EXPORT_SYMBOL(fc_lport_destroy);
-+/**
-+ * fc_set_mfs - sets up the mfs for the corresponding fc_lport
-+ * @lport: fc_lport pointer to unregister
-+ * @mfs: the new mfs for fc_lport
-+ *
-+ * Set mfs for the given fc_lport to the new mfs.
-+ *
-+ * Return: 0 for success
-+ *
-+ **/
- int fc_set_mfs(struct fc_lport *lport, u32 mfs)
- {
-       unsigned int old_mfs;
--      int rc = -1;
-+      int rc = -EINVAL;
-       mutex_lock(&lport->lp_mutex);
-@@ -667,7 +677,6 @@ int fc_set_mfs(struct fc_lport *lport, u
-       if (mfs >= FC_MIN_MAX_FRAME) {
-               mfs &= ~3;
--              WARN_ON((size_t) mfs < FC_MIN_MAX_FRAME);
-               if (mfs > FC_MAX_FRAME)
-                       mfs = FC_MAX_FRAME;
-               mfs -= sizeof(struct fc_frame_header);
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/fcoe-user_mfs-is-never-used.diff b/src/patches/suse-2.6.27.31/patches.drivers/fcoe-user_mfs-is-never-used.diff
deleted file mode 100644 (file)
index 6247dde..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-From: Yi Zou <yi.zou@intel.com>
-Subject: [FcOE] user_mfs is never used
-References: bnc #459142
-
-Signed-off-by: Yi Zou <yi.zou@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/libfcoe.c |    2 --
- include/scsi/libfcoe.h      |    1 -
- 2 files changed, 3 deletions(-)
-
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -900,8 +900,6 @@ static int fcoe_device_notification(stru
-               mfs = fc->real_dev->mtu -
-                       (sizeof(struct fcoe_hdr) +
-                        sizeof(struct fcoe_crc_eof));
--              if (fc->user_mfs && fc->user_mfs < mfs)
--                      mfs = fc->user_mfs;
-               if (mfs >= FC_MIN_MAX_FRAME)
-                       fc_set_mfs(lp, mfs);
-               new_status &= ~FC_LINK_UP;
---- a/include/scsi/libfcoe.h
-+++ b/include/scsi/libfcoe.h
-@@ -46,7 +46,6 @@ struct fcoe_softc {
-       struct net_device *phys_dev;            /* device with ethtool_ops */
-       struct packet_type  fcoe_packet_type;
-       struct sk_buff_head fcoe_pending_queue;
--      u16 user_mfs;                   /* configured max frame size */
-       u8 dest_addr[ETH_ALEN];
-       u8 ctl_src_addr[ETH_ALEN];
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-add-fc_disc-c-locking-co.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-add-fc_disc-c-locking-co.diff
deleted file mode 100644 (file)
index 5da8021..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: [FcOE] Add fc_disc.c locking comment block
-References: bnc #459142
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_disc.c |    8 ++++++++
- 1 file changed, 8 insertions(+)
-
-
---- a/drivers/scsi/libfc/fc_disc.c
-+++ b/drivers/scsi/libfc/fc_disc.c
-@@ -24,6 +24,14 @@
-  * also handles RSCN events and re-discovery if necessary.
-  */
-+/*
-+ * DISC LOCKING
-+ *
-+ * The disc mutex is can be locked when acquiring rport locks, but may not
-+ * be held when acquiring the lport lock. Refer to fc_lport.c for more
-+ * details.
-+ */
-+
- #include <linux/timer.h>
- #include <linux/err.h>
- #include <asm/unaligned.h>
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-check-for-err-when-recv-state-is-incorrect.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-check-for-err-when-recv-state-is-incorrect.diff
deleted file mode 100644 (file)
index 9a2b00f..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-From 251b8184b1bd4e17656d72ba9cffcba733092064 Mon Sep 17 00:00:00 2001
-From: Robert Love <robert.w.love@intel.com>
-Date: Mon, 2 Feb 2009 10:13:06 -0800
-Subject: [PATCH] libfc: check for err when recv and state is incorrect
-References: bnc#473602
-
-If we've just created an interface and the an rport is
-logging in we may have a request on the wire (say PRLI).
-If we destroy the interface, we'll go through each rport
-on the disc->rports list and set each rport's state to NONE.
-Then the lport will reset the EM. The EM reset will send a
-CLOSED event to the prli_resp() handler which will notice
-that the state != PRLI. In this case it frees the frame
-pointer, decrements the refcount and unlocks the rport.
-
-The problem is that there isn't a frame in this case. It's
-just a pointer with an embedded error code. The free causes
-an Oops.
-
-This patch moves the error checking to be before the state
-checking.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Signed-off-by: Hannes Reinecke <hare@suse.de>
-
----
- drivers/scsi/libfc/fc_lport.c |   50 +++++++++++++++++++++---------------------
- drivers/scsi/libfc/fc_rport.c |   30 ++++++++++++-------------
- 2 files changed, 40 insertions(+), 40 deletions(-)
-
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -1031,17 +1031,17 @@ static void fc_lport_rft_id_resp(struct 
-       FC_DEBUG_LPORT("Received a RFT_ID response\n");
-+      if (IS_ERR(fp)) {
-+              fc_lport_error(lport, fp);
-+              goto err;
-+      }
-+
-       if (lport->state != LPORT_ST_RFT_ID) {
-               FC_DBG("Received a RFT_ID response, but in state %s\n",
-                      fc_lport_state(lport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_lport_error(lport, fp);
--              goto err;
--      }
--
-       fh = fc_frame_header_get(fp);
-       ct = fc_frame_payload_get(fp, sizeof(*ct));
-@@ -1083,17 +1083,17 @@ static void fc_lport_rpn_id_resp(struct 
-       FC_DEBUG_LPORT("Received a RPN_ID response\n");
-+      if (IS_ERR(fp)) {
-+              fc_lport_error(lport, fp);
-+              goto err;
-+      }
-+
-       if (lport->state != LPORT_ST_RPN_ID) {
-               FC_DBG("Received a RPN_ID response, but in state %s\n",
-                      fc_lport_state(lport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_lport_error(lport, fp);
--              goto err;
--      }
--
-       fh = fc_frame_header_get(fp);
-       ct = fc_frame_payload_get(fp, sizeof(*ct));
-       if (fh && ct && fh->fh_type == FC_TYPE_CT &&
-@@ -1133,17 +1133,17 @@ static void fc_lport_scr_resp(struct fc_
-       FC_DEBUG_LPORT("Received a SCR response\n");
-+      if (IS_ERR(fp)) {
-+              fc_lport_error(lport, fp);
-+              goto err;
-+      }
-+
-       if (lport->state != LPORT_ST_SCR) {
-               FC_DBG("Received a SCR response, but in state %s\n",
-                      fc_lport_state(lport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_lport_error(lport, fp);
--              goto err;
--      }
--
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC)
-               fc_lport_enter_ready(lport);
-@@ -1359,17 +1359,17 @@ static void fc_lport_logo_resp(struct fc
-       FC_DEBUG_LPORT("Received a LOGO response\n");
-+      if (IS_ERR(fp)) {
-+              fc_lport_error(lport, fp);
-+              goto err;
-+      }
-+
-       if (lport->state != LPORT_ST_LOGO) {
-               FC_DBG("Received a LOGO response, but in state %s\n",
-                      fc_lport_state(lport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_lport_error(lport, fp);
--              goto err;
--      }
--
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC)
-               fc_lport_enter_reset(lport);
-@@ -1443,17 +1443,17 @@ static void fc_lport_flogi_resp(struct f
-       FC_DEBUG_LPORT("Received a FLOGI response\n");
-+      if (IS_ERR(fp)) {
-+              fc_lport_error(lport, fp);
-+              goto err;
-+      }
-+
-       if (lport->state != LPORT_ST_FLOGI) {
-               FC_DBG("Received a FLOGI response, but in state %s\n",
-                      fc_lport_state(lport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_lport_error(lport, fp);
--              goto err;
--      }
--
-       fh = fc_frame_header_get(fp);
-       did = ntoh24(fh->fh_d_id);
-       if (fc_frame_payload_op(fp) == ELS_LS_ACC && did != 0) {
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -505,17 +505,17 @@ static void fc_rport_plogi_resp(struct f
-       FC_DEBUG_RPORT("Received a PLOGI response from port (%6x)\n",
-                      rport->port_id);
-+      if (IS_ERR(fp)) {
-+              fc_rport_error_retry(rport, fp);
-+              goto err;
-+      }
-+
-       if (rdata->rp_state != RPORT_ST_PLOGI) {
-               FC_DBG("Received a PLOGI response, but in state %s\n",
-                      fc_rport_state(rport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_rport_error_retry(rport, fp);
--              goto err;
--      }
--
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC &&
-           (plp = fc_frame_payload_get(fp, sizeof(*plp))) != NULL) {
-@@ -614,17 +614,17 @@ static void fc_rport_prli_resp(struct fc
-       FC_DEBUG_RPORT("Received a PRLI response from port (%6x)\n",
-                      rport->port_id);
-+      if (IS_ERR(fp)) {
-+              fc_rport_error_retry(rport, fp);
-+              goto err;
-+      }
-+
-       if (rdata->rp_state != RPORT_ST_PRLI) {
-               FC_DBG("Received a PRLI response, but in state %s\n",
-                      fc_rport_state(rport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_rport_error_retry(rport, fp);
--              goto err;
--      }
--
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC) {
-               pp = fc_frame_payload_get(fp, sizeof(*pp));
-@@ -764,17 +764,17 @@ static void fc_rport_rtv_resp(struct fc_
-       FC_DEBUG_RPORT("Received a RTV response from port (%6x)\n",
-                      rport->port_id);
-+      if (IS_ERR(fp)) {
-+              fc_rport_error(rport, fp);
-+              goto err;
-+      }
-+
-       if (rdata->rp_state != RPORT_ST_RTV) {
-               FC_DBG("Received a RTV response, but in state %s\n",
-                      fc_rport_state(rport));
-               goto out;
-       }
--      if (IS_ERR(fp)) {
--              fc_rport_error(rport, fp);
--              goto err;
--      }
--
-       op = fc_frame_payload_op(fp);
-       if (op == ELS_LS_ACC) {
-               struct fc_els_rtv_acc *rtv;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-ensure-correct-device_pu.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-ensure-correct-device_pu.diff
deleted file mode 100644 (file)
index ad60ec2..0000000
+++ /dev/null
@@ -1,214 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: libfc: Ensure correct device_put/get usage (round 2)
-References: 
-
-Reference counting was barely used and where used
-it was incorrect. This patch creates a few simple
-policies.
-
-When the rport->dev [e.g. struct device] is initialized
-it starts with a refcnt of 1. Whenever we're using the
-rport we will increment the count. When we logoff we
-should decrement the count to 0 and the 'release'
-function will be called. The FC transport provides the
-release function for real rports and libfc provides it
-for rogue rports. When we switch from a rogue to real
-rport we'll decrement the refcnt on the rogue rport
-and increment it for the real rport, after we've created
-it.
-
-Any externally initiated action on an rport (login,
-logoff) will not require the caller to increment and
-decrement the refcnt.
-
-For rport_login(), the rport will have just been created
-and therefore no other thread would be able to access
-this object.
-
-For rport_logoff(), the rport will have been removed
-from the list of rports and therefore no other thread
-would be able to lookup() this rport.
-
-This patch removes the get_device() from the rport_lookup
-function. These are the places where it is called and why
-we don't need a reference.
-
-fc_disc_recv_rscn_req() - called for single port RSCNs
-                         the disc mutex is held and
-                         ensures that no other thread
-                         will find this rport.
-
-fc_disc_new_target() - Same. The rport cannot be looked up
-                      so no other thread can free the rport.
-                      This code looks buggy though, we
-                      shouldn't be calling rport_login() on
-                      a 'real' rport, which we could do.
-
-fc_disc_single() - Same. disc mutex protects the list.
-
-fc_lport_recv_req() - Similar, but this time the lport lock
-                     ensures that no incoming requests are
-                     processed until the current request
-                     for an rport has returned.
-
-When the rport layer needs to send a request it will
-increment the count so that the EM can be confident that
-the rport is present when making the callback. If
-fc_remote_port_delete() is called before the response
-callback, which is often the case for LOGO commands, the
-refcnt will still have a value of 1 becuase we grabbed the
-lock before the ctels_send() is called. The exchange would
-have been removed and so the callback will be called with
-an error code. After processing the error code we'll
-decrement the refcnt for the last time and the rport will
-be free'd.
-
-Since point-to-point mode is not working this patch
-does not consider point-to-point.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_disc.c  |    5 +----
- drivers/scsi/libfc/fc_lport.c |    5 ++---
- drivers/scsi/libfc/fc_rport.c |   21 ++++++++++++++-------
- 3 files changed, 17 insertions(+), 14 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_disc.c
-+++ b/drivers/scsi/libfc/fc_disc.c
-@@ -81,7 +81,6 @@ struct fc_rport *fc_disc_lookup_rport(co
-               if (rport->port_id == port_id) {
-                       disc_found = 1;
-                       found = rport;
--                      get_device(&found->dev);
-                       break;
-               }
-       }
-@@ -767,10 +766,8 @@ static void fc_disc_single(struct fc_dis
-               goto out;
-       rport = lport->tt.rport_lookup(lport, dp->ids.port_id);
--      if (rport) {
-+      if (rport)
-               fc_disc_del_target(disc, rport);
--              put_device(&rport->dev); /* hold from lookup */
--      }
-       new_rport = fc_rport_rogue_create(dp);
-       if (new_rport) {
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -908,10 +908,9 @@ static void fc_lport_recv_req(struct fc_
-                       d_id = ntoh24(fh->fh_d_id);
-                       rport = lport->tt.rport_lookup(lport, s_id);
--                      if (rport) {
-+                      if (rport)
-                               lport->tt.rport_recv_req(sp, fp, rport);
--                              put_device(&rport->dev); /* hold from lookup */
--                      } else {
-+                      else {
-                               rjt_data.fp = NULL;
-                               rjt_data.reason = ELS_RJT_UNAB;
-                               rjt_data.explan = ELS_EXPL_NONE;
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -111,16 +111,11 @@ struct fc_rport *fc_rport_rogue_create(s
-       rport->roles = dp->ids.roles;
-       rport->maxframe_size = FC_MIN_MAX_PAYLOAD;
-       /*
--       * init the device, so other code can manipulate the rport as if
--       * it came from the fc class. We also do an extra get because
--       * libfc will free this rport instead of relying on the normal
--       * refcounting.
--       *
-        * Note: all this libfc rogue rport code will be removed for
-        * upstream so it fine that this is really ugly and hacky right now.
-        */
-       device_initialize(&rport->dev);
--      get_device(&rport->dev);
-+      rport->dev.release = fc_rport_rogue_destroy; // XXX: bwalle
-       mutex_init(&rdata->rp_mutex);
-       rdata->local_port = dp->lp;
-@@ -402,9 +397,9 @@ static void fc_rport_timeout(struct work
-       case RPORT_ST_NONE:
-               break;
-       }
--      put_device(&rport->dev);
-       mutex_unlock(&rdata->rp_mutex);
-+      put_device(&rport->dev);
- }
- /**
-@@ -531,6 +526,7 @@ out:
-       fc_frame_free(fp);
- err:
-       mutex_unlock(&rdata->rp_mutex);
-+      put_device(&rport->dev);
- }
- /**
-@@ -562,6 +558,8 @@ static void fc_rport_enter_plogi(struct 
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI,
-                                 fc_rport_plogi_resp, rport, lport->e_d_tov))
-               fc_rport_error(rport, fp);
-+      else
-+              get_device(&rport->dev);
- }
- /**
-@@ -631,6 +629,7 @@ out:
-       fc_frame_free(fp);
- err:
-       mutex_unlock(&rdata->rp_mutex);
-+      put_device(&rport->dev);
- }
- /**
-@@ -679,6 +678,7 @@ out:
-       fc_frame_free(fp);
- err:
-       mutex_unlock(&rdata->rp_mutex);
-+      put_device(&rport->dev);
- }
- /**
-@@ -712,6 +712,8 @@ static void fc_rport_enter_prli(struct f
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI,
-                                 fc_rport_prli_resp, rport, lport->e_d_tov))
-               fc_rport_error(rport, fp);
-+      else
-+              get_device(&rport->dev);
- }
- /**
-@@ -777,6 +779,7 @@ out:
-       fc_frame_free(fp);
- err:
-       mutex_unlock(&rdata->rp_mutex);
-+      put_device(&rport->dev);
- }
- /**
-@@ -806,6 +809,8 @@ static void fc_rport_enter_rtv(struct fc
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV,
-                                    fc_rport_rtv_resp, rport, lport->e_d_tov))
-               fc_rport_error(rport, fp);
-+      else
-+              get_device(&rport->dev);
- }
- /**
-@@ -835,6 +840,8 @@ static void fc_rport_enter_logo(struct f
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO,
-                                 fc_rport_logo_resp, rport, lport->e_d_tov))
-               fc_rport_error(rport, fp);
-+      else
-+              get_device(&rport->dev);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-handle-rrq-exch-timeout.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-handle-rrq-exch-timeout.diff
deleted file mode 100644 (file)
index fbc2cc2..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Vasu Dev <vasu.dev@intel.com>
-Subject: libfc: handle RRQ exch timeout
-References: bnc #465596
-
-Cleanup exchange held due to RRQ when RRQ exch times out, in this case the
-ABTS is already done causing RRQ req therefore proceeding with cleanup in
-fc_exch_rrq_resp should be okay to restore exch resource.
-
-Signed-off-by: Vasu Dev <vasu.dev@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_exch.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -1605,7 +1605,7 @@ static void fc_exch_rrq_resp(struct fc_s
-       if (IS_ERR(fp)) {
-               int err = PTR_ERR(fp);
--              if (err == -FC_EX_CLOSED)
-+              if (err == -FC_EX_CLOSED || err == -FC_EX_TIMEOUT)
-                       goto cleanup;
-               FC_DBG("Cannot process RRQ, because of frame error %d\n", err);
-               return;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_lport-c-locki.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_lport-c-locki.diff
deleted file mode 100644 (file)
index 89f885d..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: [FcOE] Improve fc_lport.c locking comment block
-References: bnc #459142
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_lport.c |   76 ++++++++++++++++++++++++------------------
- 1 file changed, 45 insertions(+), 31 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -18,34 +18,51 @@
-  */
- /*
-- * General locking notes:
-+ * PORT LOCKING NOTES
-  *
-- * The lport and rport blocks both have mutexes that are used to protect
-- * the port objects states. The main motivation for this protection is that
-- * we don't want to be preparing a request/response in one context while
-- * another thread "resets" the port in question. For example, if the lport
-- * block is sending a SCR request to the directory server we don't want
-- * the lport to be reset before we fill out the frame header's port_id. The
-- * problem is that a reset would cause the lport's port_id to reset to 0.
-- * If we don't protect the lport we'd spew incorrect frames.
-- *
-- * At the time of this writing there are two primary mutexes, one for the
-- * lport and one for the rport. Since the lport uses the rport and makes
-- * calls into that block the rport should never make calls that would cause
-- * the lport's mutex to be locked. In other words, the lport's mutex is
-- * considered the outer lock and the rport's lock is considered the inner
-- * lock. The bottom line is that you can hold a lport's mutex and then
-- * hold the rport's mutex, but not the other way around.
-- *
-- * The only complication to this rule is the callbacks from the rport to
-- * the lport's rport_callback function. When rports become READY they make
-- * a callback to the lport so that it can track them. In the case of the
-- * directory server that callback might cause the lport to change its
-- * state, implying that the lport mutex would need to be held. This problem
-- * was solved by serializing the rport notifications to the lport and the
-- * callback is made without holding the rport's lock.
-+ * These comments only apply to the 'port code' which consists of the lport,
-+ * disc and rport blocks.
-  *
-- * lport locking notes:
-+ * MOTIVATION
-+ *
-+ * The lport, disc and rport blocks all have mutexes that are used to protect
-+ * those objects. The main motivation for these locks is to prevent from
-+ * having an lport reset just before we send a frame. In that scenario the
-+ * lport's FID would get set to zero and then we'd send a frame with an
-+ * invalid SID. We also need to ensure that states don't change unexpectedly
-+ * while processing another state.
-+ *
-+ * HEIRARCHY
-+ *
-+ * The following heirarchy defines the locking rules. A greater lock
-+ * may be held before acquiring a lesser lock, but a lesser lock should never
-+ * be held while attempting to acquire a greater lock. Here is the heirarchy-
-+ *
-+ * lport > disc, lport > rport, disc > rport
-+ *
-+ * CALLBACKS
-+ *
-+ * The callbacks cause complications with this scheme. There is a callback
-+ * from the rport (to either lport or disc) and a callback from disc
-+ * (to the lport).
-+ *
-+ * As rports exit the rport state machine a callback is made to the owner of
-+ * the rport to notify success or failure. Since the callback is likely to
-+ * cause the lport or disc to grab its lock we cannot hold the rport lock
-+ * while making the callback. To ensure that the rport is not free'd while
-+ * processing the callback the rport callbacks are serialized through a
-+ * single-threaded workqueue. An rport would never be free'd while in a
-+ * callback handler becuase no other rport work in this queue can be executed
-+ * at the same time.
-+ *
-+ * When discovery succeeds or fails a callback is made to the lport as
-+ * notification. Currently, succesful discovery causes the lport to take no
-+ * action. A failure will cause the lport to reset. There is likely a circular
-+ * locking problem with this implementation.
-+ */
-+
-+/*
-+ * LPORT LOCKING
-  *
-  * The critical sections protected by the lport's mutex are quite broad and
-  * may be improved upon in the future. The lport code and its locking doesn't
-@@ -54,9 +71,9 @@
-  *
-  * The strategy is to lock whenever processing a request or response. Note
-  * that every _enter_* function corresponds to a state change. They generally
-- * change the lports state and then sends a request out on the wire. We lock
-+ * change the lports state and then send a request out on the wire. We lock
-  * before calling any of these functions to protect that state change. This
-- * means that the entry points into the lport block to manage the locks while
-+ * means that the entry points into the lport block manage the locks while
-  * the state machine can transition between states (i.e. _enter_* functions)
-  * while always staying protected.
-  *
-@@ -68,9 +85,6 @@
-  * Retries also have to consider the locking. The retries occur from a work
-  * context and the work function will lock the lport and then retry the state
-  * (i.e. _enter_* function).
-- *
-- * The implication to all of this is that each lport can only process one
-- * state at a time.
-  */
- #include <linux/timer.h>
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_rport-c-locki.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-improve-fc_rport-c-locki.diff
deleted file mode 100644 (file)
index 755a646..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: Improve fc_rport.c locking comment block
-References: 459142
-
-checkpatch.pl was complaining about having spaces
-after '*'s. It seemed to be a false positive. I split
-the comment block into two blocks and it resolved the
-ERROR.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_rport.c |   17 ++++++++++-------
- 1 file changed, 10 insertions(+), 7 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -18,20 +18,23 @@
-  */
- /*
-+ * RPORT GENERAL INFO
-+ *
-  * This file contains all processing regarding fc_rports. It contains the
-  * rport state machine and does all rport interaction with the transport class.
-  * There should be no other places in libfc that interact directly with the
-  * transport class in regards to adding and deleting rports.
-  *
-  * fc_rport's represent N_Port's within the fabric.
-+ */
-+
-+/*
-+ * RPORT LOCKING
-  *
-- * rport locking notes:
-- *
-- * The rport should never hold the rport mutex and then lock the lport
-- * mutex. The rport's mutex is considered lesser than the lport's mutex, so
-- * the lport mutex can be held before locking the rport mutex, but not the
-- * other way around. See the comment block at the top of fc_lport.c for more
-- * details.
-+ * The rport should never hold the rport mutex and then attempt to acquire
-+ * either the lport or disc mutexes. The rport's mutex is considered lesser
-+ * than both the lport's mutex and the disc mutex. Refer to fc_lport.c for
-+ * more comments on the heirarchy.
-  *
-  * The locking strategy is similar to the lport's strategy. The lock protects
-  * the rport's states and is held and released by the entry points to the rport
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-fc_disc-inline-with.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-fc_disc-inline-with.diff
deleted file mode 100644 (file)
index a6a7e2a..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-From: Chris Leech <christopher.leech@intel.com>
-Subject: [FcOE] make fc_disc inline with the fc_lport structure
-References: bnc #459142
-
-The extra memory allocation we're not being checked for failure.  Rather than
-further complicating things, just make the discovery code required fields be
-part of the lport structure.
-
-Signed-off-by: Chris Leech <christopher.leech@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_disc.c  |   80 +++++++-----------------------------------
- drivers/scsi/libfc/fc_lport.c |    2 -
- include/scsi/libfc.h          |   22 ++++++++++-
- 3 files changed, 35 insertions(+), 69 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_disc.c
-+++ b/drivers/scsi/libfc/fc_disc.c
-@@ -45,26 +45,6 @@ static int fc_disc_debug;
-                       FC_DBG(fmt);            \
-       } while (0)
--struct fc_disc {
--      unsigned char           retry_count;
--      unsigned char           delay;
--      unsigned char           pending;
--      unsigned char           requested;
--      unsigned short          seq_count;
--      unsigned char           buf_len;
--      enum fc_disc_event      event;
--
--      void (*disc_callback)(struct fc_lport *,
--                            enum fc_disc_event);
--
--      struct list_head         rports;
--      struct fc_lport         *lport;
--      struct mutex            disc_mutex;
--      struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
--      struct delayed_work     disc_work;
--
--};
--
- static void fc_disc_gpn_ft_req(struct fc_disc *);
- static void fc_disc_gpn_ft_resp(struct fc_seq *, struct fc_frame *, void *);
- static int fc_disc_new_target(struct fc_disc *, struct fc_rport *,
-@@ -83,14 +63,11 @@ static void fc_disc_restart(struct fc_di
- struct fc_rport *fc_disc_lookup_rport(const struct fc_lport *lport,
-                                     u32 port_id)
- {
--      struct fc_disc *disc = lport->disc;
-+      const struct fc_disc *disc = &lport->disc;
-       struct fc_rport *rport, *found = NULL;
-       struct fc_rport_libfc_priv *rdata;
-       int disc_found = 0;
--      if (!disc)
--              return NULL;
--
-       list_for_each_entry(rdata, &disc->rports, peers) {
-               rport = PRIV_TO_RPORT(rdata);
-               if (rport->port_id == port_id) {
-@@ -108,27 +85,6 @@ struct fc_rport *fc_disc_lookup_rport(co
- }
- /**
-- * fc_disc_alloc - Allocate a discovery work object
-- * @lport: The FC lport associated with the discovery job
-- */
--static inline struct fc_disc *fc_disc_alloc(struct fc_lport *lport)
--{
--      struct fc_disc *disc;
--
--      disc = kzalloc(sizeof(struct fc_disc), GFP_KERNEL);
--      INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
--      mutex_init(&disc->disc_mutex);
--      INIT_LIST_HEAD(&disc->rports);
--
--      disc->lport = lport;
--      lport->disc = disc;
--      disc->delay = FC_DISC_DELAY;
--      disc->event = DISC_EV_NONE;
--
--      return disc;
--}
--
--/**
-  * fc_disc_stop_rports - delete all the remote ports associated with the lport
-  * @disc: The discovery job to stop rports on
-  *
-@@ -167,7 +123,7 @@ static void fc_disc_rport_callback(struc
-                                  enum fc_rport_event event)
- {
-       struct fc_rport_libfc_priv *rdata = rport->dd_data;
--      struct fc_disc *disc = lport->disc;
-+      struct fc_disc *disc = &lport->disc;
-       int found = 0;
-       FC_DEBUG_DISC("Received a %d event for port (%6x)\n", event,
-@@ -304,13 +260,7 @@ static void fc_disc_recv_req(struct fc_s
-                            struct fc_lport *lport)
- {
-       u8 op;
--      struct fc_disc *disc = lport->disc;
--
--      if (!disc) {
--              FC_DBG("Received a request for an lport not managed "
--                     "by the discovery engine\n");
--              return;
--      }
-+      struct fc_disc *disc = &lport->disc;
-       op = fc_frame_payload_op(fp);
-       switch (op) {
-@@ -365,17 +315,7 @@ static void fc_disc_start(void (*disc_ca
- {
-       struct fc_rport *rport;
-       struct fc_rport_identifiers ids;
--      struct fc_disc *disc = lport->disc;
--
--      if (!disc) {
--              FC_DEBUG_DISC("No existing discovery job, "
--                            "creating one for lport (%6x)\n",
--                            fc_host_port_id(lport->host));
--              disc = fc_disc_alloc(lport);
--      } else
--              FC_DEBUG_DISC("Found an existing discovery job "
--                            "for lport (%6x)\n",
--                            fc_host_port_id(lport->host));
-+      struct fc_disc *disc = &lport->disc;
-       /*
-        * At this point we may have a new disc job or an existing
-@@ -831,7 +771,7 @@ out:
-  */
- void fc_disc_stop(struct fc_lport *lport)
- {
--      struct fc_disc *disc = lport->disc;
-+      struct fc_disc *disc = &lport->disc;
-       if (disc) {
-               cancel_delayed_work_sync(&disc->disc_work);
-@@ -858,6 +798,7 @@ void fc_disc_stop_final(struct fc_lport 
-  */
- int fc_disc_init(struct fc_lport *lport)
- {
-+      struct fc_disc *disc;
-       if (!lport->tt.disc_start)
-               lport->tt.disc_start = fc_disc_start;
-@@ -874,6 +815,15 @@ int fc_disc_init(struct fc_lport *lport)
-       if (!lport->tt.rport_lookup)
-               lport->tt.rport_lookup = fc_disc_lookup_rport;
-+      disc = &lport->disc;
-+      INIT_DELAYED_WORK(&disc->disc_work, fc_disc_timeout);
-+      mutex_init(&disc->disc_mutex);
-+      INIT_LIST_HEAD(&disc->rports);
-+
-+      disc->lport = lport;
-+      disc->delay = FC_DISC_DELAY;
-+      disc->event = DISC_EV_NONE;
-+
-       return 0;
- }
- EXPORT_SYMBOL(fc_disc_init);
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -627,8 +627,6 @@ int fc_fabric_logoff(struct fc_lport *lp
- {
-       lport->tt.disc_stop_final(lport);
-       mutex_lock(&lport->lp_mutex);
--      kfree(lport->disc);
--      lport->disc = NULL;
-       fc_lport_enter_logo(lport);
-       mutex_unlock(&lport->lp_mutex);
-       return 0;
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -572,7 +572,25 @@ struct libfc_function_template {
-       void (*disc_stop_final) (struct fc_lport *);
- };
--struct fc_disc;
-+/* information used by the discovery layer */
-+struct fc_disc {
-+      unsigned char           retry_count;
-+      unsigned char           delay;
-+      unsigned char           pending;
-+      unsigned char           requested;
-+      unsigned short          seq_count;
-+      unsigned char           buf_len;
-+      enum fc_disc_event      event;
-+
-+      void (*disc_callback)(struct fc_lport *,
-+                            enum fc_disc_event);
-+
-+      struct list_head         rports;
-+      struct fc_lport         *lport;
-+      struct mutex            disc_mutex;
-+      struct fc_gpn_ft_resp   partial_buf;    /* partial name buffer */
-+      struct delayed_work     disc_work;
-+};
- struct fc_lport {
-       struct list_head list;
-@@ -582,8 +600,8 @@ struct fc_lport {
-       struct fc_exch_mgr      *emp;
-       struct fc_rport         *dns_rp;
-       struct fc_rport         *ptp_rp;
--      struct fc_disc          *disc;
-       void                    *scsi_priv;
-+      struct fc_disc          disc;
-       /* Operational Information */
-       struct libfc_function_template tt;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-rscn-parsing-more-r.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-rscn-parsing-more-r.diff
deleted file mode 100644 (file)
index c73f4e0..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Chris Leech <christopher.leech@intel.com>
-Subject: [FcOE] make RSCN parsing more robust
-References: bnc #459142
-
-RSCN parsing needs to verify that the payload length specified in the RSCN ELS
-message does not exceed the size of the actual frame received.
-
-Signed-off-by: Chris Leech <christopher.leech@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_disc.c |   19 +++++++++++++++----
- 1 files changed, 15 insertions(+), 4 deletions(-)
-
-
-diff --git a/drivers/scsi/libfc/fc_disc.c b/drivers/scsi/libfc/fc_disc.c
-index 0416041..8b609e4 100644
---- a/drivers/scsi/libfc/fc_disc.c
-+++ b/drivers/scsi/libfc/fc_disc.c
-@@ -173,17 +173,27 @@ static void fc_disc_recv_rscn_req(struct fc_seq *sp, struct fc_frame *fp,
-       FC_DEBUG_DISC("Received an RSCN event on port (%6x)\n",
-                     fc_host_port_id(lport->host));
-+      /* make sure the frame contains an RSCN message */
-       rp = fc_frame_payload_get(fp, sizeof(*rp));
--
--      if (!rp || rp->rscn_page_len != sizeof(*pp))
-+      if (!rp)
-               goto reject;
--
-+      /* make sure the page length is as expected (4 bytes) */
-+      if (rp->rscn_page_len != sizeof(*pp))
-+              goto reject;
-+      /* get the RSCN payload length */
-       len = ntohs(rp->rscn_plen);
-       if (len < sizeof(*rp))
-               goto reject;
-+      /* make sure the frame contains the expected payload */
-+      rp = fc_frame_payload_get(fp, len);
-+      if (!rp)
-+              goto reject;
-+      /* payload must be a multiple of the RSCN page size */
-       len -= sizeof(*rp);
-+      if (len % sizeof(*pp))
-+              goto reject;
--      for (pp = (void *)(rp + 1); len; len -= sizeof(*pp), pp++) {
-+      for (pp = (void *)(rp + 1); len > 0; len -= sizeof(*pp), pp++) {
-               ev_qual = pp->rscn_page_flags >> ELS_RSCN_EV_QUAL_BIT;
-               ev_qual &= ELS_RSCN_EV_QUAL_MASK;
-               fmt = pp->rscn_page_flags >> ELS_RSCN_ADDR_FMT_BIT;
-@@ -239,6 +249,7 @@ static void fc_disc_recv_rscn_req(struct fc_seq *sp, struct fc_frame *fp,
-       fc_frame_free(fp);
-       return;
- reject:
-+      FC_DEBUG_DISC("Received a bad RSCN frame\n");
-       rjt_data.fp = NULL;
-       rjt_data.reason = ELS_RJT_LOGIC;
-       rjt_data.explan = ELS_EXPL_NONE;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-sure-we-access-the.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-make-sure-we-access-the.diff
deleted file mode 100644 (file)
index a1bba0c..0000000
+++ /dev/null
@@ -1,114 +0,0 @@
-From: Chris Leech <christopher.leech@intel.com>
-Subject: [FcOE] make sure we access the CRC safely
-References: bnc #459142
-
-Even when fcoe verified that the EOF and CRC trailer bytes were there, when
-the CRC check was delayed for solicited SCSI data libfc would look past what
-was marked as valid data in the frame to find the CRC in the FCoE trailer.
-
-Instead, pass the CRC to libfc in the context block.
-
-Signed-off-by: Chris Leech <christopher.leech@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/libfcoe.c   |   20 ++++++++++++++------
- drivers/scsi/libfc/fc_fcp.c   |    2 +-
- drivers/scsi/libfc/fc_frame.c |    2 +-
- include/scsi/fc_frame.h       |    3 +++
- 4 files changed, 19 insertions(+), 8 deletions(-)
-
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -527,7 +527,7 @@ int fcoe_percpu_receive_thread(void *arg
-       struct fcoe_dev_stats *stats;
-       struct fc_frame_header *fh;
-       struct sk_buff *skb;
--      struct fcoe_crc_eof *cp;
-+      struct fcoe_crc_eof crc_eof;
-       struct fc_frame *fp;
-       u8 *mac = NULL;
-       struct fcoe_softc *fc;
-@@ -604,13 +604,21 @@ int fcoe_percpu_receive_thread(void *arg
-               }
-               fp = (struct fc_frame *)skb;
--              cp = (struct fcoe_crc_eof *)(skb->data + fr_len);
-               fc_frame_init(fp);
-               fr_dev(fp) = lp;
-               fr_sof(fp) = hp->fcoe_sof;
--              fr_eof(fp) = cp->fcoe_eof;
--              /* trim off the CRC and EOF trailer*/
--              skb_trim(skb, fr_len);
-+
-+              /* Copy out the CRC and EOF trailer for access */
-+              if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
-+                      kfree_skb(skb);
-+                      continue;
-+              }
-+              fr_eof(fp) = crc_eof.fcoe_eof;
-+              fr_crc(fp) = crc_eof.fcoe_crc32;
-+              if (pskb_trim(skb, fr_len)) {
-+                      kfree_skb(skb);
-+                      continue;
-+              }
-               /*
-                * We only check CRC if no offload is available and if it is
-@@ -629,7 +637,7 @@ int fcoe_percpu_receive_thread(void *arg
-                       continue;
-               }
-               if (fr_flags(fp) & FCPHF_CRC_UNCHECKED) {
--                      if (le32_to_cpu(cp->fcoe_crc32) !=
-+                      if (le32_to_cpu(fr_crc(fp)) !=
-                           ~crc32(~0, skb->data, fr_len)) {
-                               if (debug_fcoe || stats->InvalidCRCCount < 5)
-                                       printk(KERN_WARNING "fcoe: dropping "
---- a/drivers/scsi/libfc/fc_fcp.c
-+++ b/drivers/scsi/libfc/fc_fcp.c
-@@ -356,7 +356,7 @@ static void fc_fcp_recv_data(struct fc_f
-                       len += 4 - (len % 4);
-               }
--              if (~crc != le32_to_cpu(*(__le32 *)(buf + len))) {
-+              if (~crc != le32_to_cpu(fr_crc(fp))) {
- crc_err:
-                       stats = lp->dev_stats[smp_processor_id()];
-                       stats->ErrorFrames++;
---- a/drivers/scsi/libfc/fc_frame.c
-+++ b/drivers/scsi/libfc/fc_frame.c
-@@ -42,7 +42,7 @@ u32 fc_frame_crc_check(struct fc_frame *
-       len = (fr_len(fp) + 3) & ~3;    /* round up length to include fill */
-       bp = (const u8 *) fr_hdr(fp);
-       crc = ~crc32(~0, bp, len);
--      error = crc ^ *(u32 *) (bp + len);
-+      error = crc ^ fr_crc(fp);
-       return error;
- }
- EXPORT_SYMBOL(fc_frame_crc_check);
---- a/include/scsi/fc_frame.h
-+++ b/include/scsi/fc_frame.h
-@@ -56,6 +56,7 @@
- #define fr_max_payload(fp)    (fr_cb(fp)->fr_max_payload)
- #define fr_cmd(fp)    (fr_cb(fp)->fr_cmd)
- #define fr_dir(fp)    (fr_cmd(fp)->sc_data_direction)
-+#define fr_crc(fp)    (fr_cb(fp)->fr_crc)
- struct fc_frame {
-       struct sk_buff skb;
-@@ -66,12 +67,14 @@ struct fcoe_rcv_info {
-       struct fc_lport *fr_dev;        /* transport layer private pointer */
-       struct fc_seq   *fr_seq;        /* for use with exchange manager */
-       struct scsi_cmnd *fr_cmd;       /* for use of scsi command */
-+      u32             fr_crc;
-       u16             fr_max_payload; /* max FC payload */
-       enum fc_sof     fr_sof;         /* start of frame delimiter */
-       enum fc_eof     fr_eof;         /* end of frame delimiter */
-       u8              fr_flags;       /* flags - see below */
- };
-+
- /*
-  * Get fc_frame pointer for an skb that's already been imported.
-  */
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-pass-lport-in-exch_mgr_r.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-pass-lport-in-exch_mgr_r.diff
deleted file mode 100644 (file)
index dba8518..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-From: Abhijeet Joglekar <abjoglek@cisco.com>
-Subject: libfc: Pass lport in exch_mgr_reset
-References: bnc #465596
-
-fc_exch_mgr structure is private to fc_exch.c. To export exch_mgr_reset to
-transport, transport needs access to the exch manager. Change
-exch_mgr_reset to use lport param which is the shared structure between
-libFC and transport.
-
-Alternatively, fc_exch_mgr definition can be moved to libfc.h so that lport
-can be accessed from mp*.
-
-Signed-off-by: Abhijeet Joglekar <abjoglek@cisco.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_exch.c  |    3 ++-
- drivers/scsi/libfc/fc_lport.c |    4 ++--
- drivers/scsi/libfc/fc_rport.c |    4 ++--
- include/scsi/libfc.h          |    4 ++--
- 4 files changed, 8 insertions(+), 7 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -1478,10 +1478,11 @@ static void fc_exch_reset(struct fc_exch
-  * If sid is non-zero, reset only exchanges we source from that FID.
-  * If did is non-zero, reset only exchanges destined to that FID.
-  */
--void fc_exch_mgr_reset(struct fc_exch_mgr *mp, u32 sid, u32 did)
-+void fc_exch_mgr_reset(struct fc_lport *lp, u32 sid, u32 did)
- {
-       struct fc_exch *ep;
-       struct fc_exch *next;
-+      struct fc_exch_mgr *mp = lp->emp;
-       spin_lock_bh(&mp->em_lock);
- restart:
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -640,7 +640,7 @@ int fc_lport_destroy(struct fc_lport *lp
- {
-       lport->tt.frame_send = fc_frame_drop;
-       lport->tt.fcp_abort_io(lport);
--      lport->tt.exch_mgr_reset(lport->emp, 0, 0);
-+      lport->tt.exch_mgr_reset(lport, 0, 0);
-       return 0;
- }
- EXPORT_SYMBOL(fc_lport_destroy);
-@@ -951,7 +951,7 @@ static void fc_lport_enter_reset(struct 
-       lport->tt.disc_stop(lport);
--      lport->tt.exch_mgr_reset(lport->emp, 0, 0);
-+      lport->tt.exch_mgr_reset(lport, 0, 0);
-       fc_host_fabric_name(lport->host) = 0;
-       fc_host_port_id(lport->host) = 0;
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -1302,7 +1302,7 @@ void fc_rport_terminate_io(struct fc_rpo
-       struct fc_rport_libfc_priv *rdata = rport->dd_data;
-       struct fc_lport *lport = rdata->local_port;
--      lport->tt.exch_mgr_reset(lport->emp, 0, rport->port_id);
--      lport->tt.exch_mgr_reset(lport->emp, rport->port_id, 0);
-+      lport->tt.exch_mgr_reset(lport, 0, rport->port_id);
-+      lport->tt.exch_mgr_reset(lport, rport->port_id, 0);
- }
- EXPORT_SYMBOL(fc_rport_terminate_io);
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -469,7 +469,7 @@ struct libfc_function_template {
-        * If s_id is non-zero, reset only exchanges originating from that FID.
-        * If d_id is non-zero, reset only exchanges sending to that FID.
-        */
--      void (*exch_mgr_reset)(struct fc_exch_mgr *,
-+      void (*exch_mgr_reset)(struct fc_lport *,
-                              u32 s_id, u32 d_id);
-       void (*rport_flush_queue)(void);
-@@ -908,7 +908,7 @@ struct fc_seq *fc_seq_start_next(struct 
-  * If s_id is non-zero, reset only exchanges originating from that FID.
-  * If d_id is non-zero, reset only exchanges sending to that FID.
-  */
--void fc_exch_mgr_reset(struct fc_exch_mgr *, u32 s_id, u32 d_id);
-+void fc_exch_mgr_reset(struct fc_lport *, u32 s_id, u32 d_id);
- /*
-  * Functions for fc_functions_template
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-set-the-release-function.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-set-the-release-function.diff
deleted file mode 100644 (file)
index ea8cb0d..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: [FcOE] Set the release function for the rport's kobject (round 2)
-References: bnc #459142
-
-We need to be better about reference counting. The first
-step is to make use of the release function that is called
-when the reference count drops to 0.
-
-There was some inital push back by Joe on this patch. We
-talked off-list and agreed that the benefit of not having
-to check whether a rport is rogue or real overweighed the
-fact that we might be using reference counting on objects
-(rogue) that cannot be acted on by another thread.
-
-There is likely room for improvement here, but this should
-be a stable start.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_rport.c |   18 ++++++++++--------
- include/scsi/libfc.h          |    1 -
- 2 files changed, 10 insertions(+), 9 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -93,6 +93,13 @@ static const char *fc_rport_state_names[
-       [RPORT_ST_LOGO] = "LOGO",
- };
-+static void fc_rport_rogue_destroy(struct device *dev)
-+{
-+      struct fc_rport *rport = dev_to_rport(dev);
-+      FC_DEBUG_RPORT("Destroying rogue rport (%6x)\n", rport->port_id);
-+      kfree(rport);
-+}
-+
- struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *dp)
- {
-       struct fc_rport *rport;
-@@ -115,7 +122,7 @@ struct fc_rport *fc_rport_rogue_create(s
-        * upstream so it fine that this is really ugly and hacky right now.
-        */
-       device_initialize(&rport->dev);
--      rport->dev.release = fc_rport_rogue_destroy; // XXX: bwalle
-+      rport->dev.release = fc_rport_rogue_destroy;
-       mutex_init(&rdata->rp_mutex);
-       rdata->local_port = dp->lp;
-@@ -137,11 +144,6 @@ struct fc_rport *fc_rport_rogue_create(s
-       return rport;
- }
--void fc_rport_rogue_destroy(struct fc_rport *rport)
--{
--      kfree(rport);
--}
--
- /**
-  * fc_rport_state - return a string for the state the rport is in
-  * @rport: The rport whose state we want to get a string for
-@@ -263,7 +265,7 @@ static void fc_rport_work(struct work_st
-                              "(%6x).\n", ids.port_id);
-                       event = RPORT_EV_FAILED;
-               }
--              fc_rport_rogue_destroy(rport);
-+              put_device(&rport->dev);
-               rport = new_rport;
-               rdata = new_rport->dd_data;
-               if (rport_ops->event_callback)
-@@ -276,7 +278,7 @@ static void fc_rport_work(struct work_st
-               if (rport_ops->event_callback)
-                       rport_ops->event_callback(lport, rport, event);
-               if (trans_state == FC_PORTSTATE_ROGUE)
--                      fc_rport_rogue_destroy(rport);
-+                      put_device(&rport->dev);
-               else
-                       fc_remote_port_delete(rport);
-       } else
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -169,7 +169,6 @@ struct fc_rport_libfc_priv {
-       (struct fc_rport_libfc_priv *)((void *)x + sizeof(struct fc_rport));
- struct fc_rport *fc_rport_rogue_create(struct fc_disc_port *);
--void fc_rport_rogue_destroy(struct fc_rport *);
- static inline void fc_rport_set_name(struct fc_rport *rport, u64 wwpn, u64 wwnn)
- {
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-comment-for-orde.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-comment-for-orde.diff
deleted file mode 100644 (file)
index 02e8d8a..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-From: Vasu Dev <vasu.dev@intel.com>
-Subject: [FcOE] updated comment for order of em and ex locks
-References: bnc #459142
-
-The fc_exch is public but em_lock is static to fc_exch.c,
-so updated comment only in fc_exch.c on order of these locks.
-
-Also removed seq.f_ctl from comments since this field is
-already removed.
-
-Signed-off-by: Vasu Dev <vasu.dev@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_exch.c |    5 ++++-
- include/scsi/libfc.h         |    5 ++---
- 2 files changed, 6 insertions(+), 4 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -68,7 +68,8 @@ static struct kmem_cache *fc_em_cachep;
-  */
- struct fc_exch_mgr {
-       enum fc_class   class;          /* default class for sequences */
--      spinlock_t      em_lock;        /* exchange manager lock */
-+      spinlock_t      em_lock;        /* exchange manager lock,
-+                                         must be taken before ex_lock */
-       u16             last_xid;       /* last allocated exchange ID */
-       u16             min_xid;        /* min exchange ID */
-       u16             max_xid;        /* max exchange ID */
-@@ -179,6 +180,8 @@ static struct fc_seq *fc_seq_start_next_
-  * sequence allocation and deallocation must be locked.
-  *  - exchange refcnt can be done atomicly without locks.
-  *  - sequence allocation must be locked by exch lock.
-+ *  - If the em_lock and ex_lock must be taken at the same time, then the
-+ *    em_lock must be taken before the ex_lock.
-  */
- /*
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -299,11 +299,10 @@ struct fc_seq {
- /*
-  * Exchange.
-  *
-- * Locking notes: The ex_lock protects changes to the following fields:
-- *    esb_stat, f_ctl, seq.ssb_stat, seq.f_ctl.
-+ * Locking notes: The ex_lock protects following items:
-+ *    state, esb_stat, f_ctl, seq.ssb_stat
-  *    seq_id
-  *    sequence allocation
-- *
-  */
- struct fc_exch {
-       struct fc_exch_mgr *em;         /* exchange manager */
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-libfc-fcoe-modul.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-updated-libfc-fcoe-modul.diff
deleted file mode 100644 (file)
index a93906e..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Vasu Dev <vasu.dev@intel.com>
-Subject: [FcOE] updated libfc fcoe module ver to 1.0.6
-References: bnc #459142
-
-Signed-off-by: Vasu Dev <vasu.dev@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/fcoe/libfcoe.c |    2 +-
- drivers/scsi/libfc/fc_fcp.c |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
-
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -59,7 +59,7 @@ static int debug_fcoe;
- MODULE_AUTHOR("Open-FCoE.org");
- MODULE_DESCRIPTION("FCoE");
- MODULE_LICENSE("GPL");
--MODULE_VERSION("1.0.5");
-+MODULE_VERSION("1.0.6");
- /* fcoe host list */
- LIST_HEAD(fcoe_hostlist);
---- a/drivers/scsi/libfc/fc_fcp.c
-+++ b/drivers/scsi/libfc/fc_fcp.c
-@@ -42,7 +42,7 @@
- MODULE_AUTHOR("Open-FCoE.org");
- MODULE_DESCRIPTION("libfc");
- MODULE_LICENSE("GPL");
--MODULE_VERSION("1.0.5");
-+MODULE_VERSION("1.0.6");
- static int fc_fcp_debug;
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-use-an-operations-struct.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-use-an-operations-struct.diff
deleted file mode 100644 (file)
index ec7f6a2..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
-From: Robert Love <robert.w.love@intel.com>
-Subject: use an operations structure for rport callbacks
-References: bnc #459142
-
-This was called out for the disc callbacks in review
-comments when submitting to linux-scsi. It needed to be
-fixed for the rport callbacks too.
-
-This patch also fixes some spacing in the fc_rport
-structure definition as well as renaming the fc_lport_rport_event()
-function to fc_lport_rport_callback() to more clearly
-identify what it's doing.
-
-Signed-off-by: Robert Love <robert.w.love@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_disc.c  |   18 +++++++++-----
- drivers/scsi/libfc/fc_lport.c |   16 ++++++++-----
- drivers/scsi/libfc/fc_rport.c |   19 +++++++--------
- include/scsi/libfc.h          |   51 ++++++++++++++++++++++--------------------
- 4 files changed, 57 insertions(+), 47 deletions(-)
-
-
---- a/drivers/scsi/libfc/fc_disc.c
-+++ b/drivers/scsi/libfc/fc_disc.c
-@@ -154,7 +154,7 @@ void fc_disc_stop_rports(struct fc_disc
- }
- /**
-- * fc_disc_rport_event - Event handler for rport events
-+ * fc_disc_rport_callback - Event handler for rport events
-  * @lport: The lport which is receiving the event
-  * @rport: The rport which the event has occured on
-  * @event: The event that occured
-@@ -162,9 +162,9 @@ void fc_disc_stop_rports(struct fc_disc
-  * Locking Note: The rport lock should not be held when calling
-  *             this function.
-  */
--static void fc_disc_rport_event(struct fc_lport *lport,
--                              struct fc_rport *rport,
--                              enum fc_lport_event event)
-+static void fc_disc_rport_callback(struct fc_lport *lport,
-+                                 struct fc_rport *rport,
-+                                 enum fc_rport_event event)
- {
-       struct fc_rport_libfc_priv *rdata = rport->dd_data;
-       struct fc_disc *disc = lport->disc;
-@@ -420,6 +420,10 @@ static void fc_disc_start(void (*disc_ca
-       mutex_unlock(&disc->disc_mutex);
- }
-+static struct fc_rport_operations fc_disc_rport_ops = {
-+      .event_callback = fc_disc_rport_callback,
-+};
-+
- /**
-  * fc_disc_new_target - Handle new target found by discovery
-  * @lport: FC local port
-@@ -475,7 +479,7 @@ static int fc_disc_new_target(struct fc_
-               }
-               if (rport) {
-                       rp = rport->dd_data;
--                      rp->event_callback = fc_disc_rport_event;
-+                      rp->ops = &fc_disc_rport_ops;
-                       rp->rp_state = RPORT_ST_INIT;
-                       lport->tt.rport_login(rport);
-               }
-@@ -658,7 +662,7 @@ static int fc_disc_gpn_ft_parse(struct f
-                       rport = fc_rport_rogue_create(&dp);
-                       if (rport) {
-                               rdata = rport->dd_data;
--                              rdata->event_callback = fc_disc_rport_event;
-+                              rdata->ops = &fc_disc_rport_ops;
-                               rdata->local_port = lport;
-                               lport->tt.rport_login(rport);
-                       } else
-@@ -812,7 +816,7 @@ static void fc_disc_single(struct fc_dis
-       new_rport = fc_rport_rogue_create(dp);
-       if (new_rport) {
-               rdata = new_rport->dd_data;
--              rdata->event_callback = fc_disc_rport_event;
-+              rdata->ops = &fc_disc_rport_ops;
-               kfree(dp);
-               lport->tt.rport_login(new_rport);
-       }
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -38,7 +38,7 @@
-  * hold the rport's mutex, but not the other way around.
-  *
-  * The only complication to this rule is the callbacks from the rport to
-- * the lport's event_callback function. When rports become READY they make
-+ * the lport's rport_callback function. When rports become READY they make
-  * a callback to the lport so that it can track them. In the case of the
-  * directory server that callback might cause the lport to change its
-  * state, implying that the lport mutex would need to be held. This problem
-@@ -125,7 +125,7 @@ static int fc_frame_drop(struct fc_lport
- }
- /**
-- * fc_lport_rport_event - Event handler for rport events
-+ * fc_lport_rport_callback - Event handler for rport events
-  * @lport: The lport which is receiving the event
-  * @rport: The rport which the event has occured on
-  * @event: The event that occured
-@@ -133,9 +133,9 @@ static int fc_frame_drop(struct fc_lport
-  * Locking Note: The rport lock should not be held when calling
-  *             this function.
-  */
--static void fc_lport_rport_event(struct fc_lport *lport,
--                               struct fc_rport *rport,
--                               enum fc_lport_event event)
-+static void fc_lport_rport_callback(struct fc_lport *lport,
-+                                  struct fc_rport *rport,
-+                                  enum fc_rport_event event)
- {
-       FC_DEBUG_LPORT("Received a %d event for port (%6x)\n", event,
-                      rport->port_id);
-@@ -1265,6 +1265,10 @@ static void fc_lport_enter_rpn_id(struct
-               fc_lport_error(lport, fp);
- }
-+static struct fc_rport_operations fc_lport_rport_ops = {
-+      .event_callback = fc_lport_rport_callback,
-+};
-+
- /**
-  * fc_rport_enter_dns - Create a rport to the name server
-  * @lport: Fibre Channel local port requesting a rport for the name server
-@@ -1294,7 +1298,7 @@ static void fc_lport_enter_dns(struct fc
-               goto err;
-       rdata = rport->dd_data;
--      rdata->event_callback = fc_lport_rport_event;
-+      rdata->ops = &fc_lport_rport_ops;
-       lport->tt.rport_login(rport);
-       return;
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -125,7 +125,7 @@ struct fc_rport *fc_rport_rogue_create(s
-       rdata->rp_state = RPORT_ST_INIT;
-       rdata->event = RPORT_EV_NONE;
-       rdata->flags = FC_RP_FLAGS_REC_SUPPORTED;
--      rdata->event_callback = NULL;
-+      rdata->ops = NULL;
-       rdata->e_d_tov = dp->lp->e_d_tov;
-       rdata->r_a_tov = dp->lp->r_a_tov;
-       INIT_DELAYED_WORK(&rdata->retry_work, fc_rport_timeout);
-@@ -216,16 +216,15 @@ static void fc_rport_work(struct work_st
- {
-       struct fc_rport_libfc_priv *rdata =
-               container_of(work, struct fc_rport_libfc_priv, event_work);
--      enum fc_lport_event event;
-+      enum fc_rport_event event;
-       enum fc_rport_trans_state trans_state;
-       struct fc_lport *lport = rdata->local_port;
--      void (*event_callback)(struct fc_lport *, struct fc_rport *,
--                             enum fc_lport_event);
-+      struct fc_rport_operations *rport_ops;
-       struct fc_rport *rport = PRIV_TO_RPORT(rdata);
-       mutex_lock(&rdata->rp_mutex);
-       event = rdata->event;
--      event_callback = rdata->event_callback;
-+      rport_ops = rdata->ops;
-       if (event == RPORT_EV_CREATED) {
-               struct fc_rport *new_rport;
-@@ -250,7 +249,7 @@ static void fc_rport_work(struct work_st
-                       new_rdata = new_rport->dd_data;
-                       new_rdata->e_d_tov = rdata->e_d_tov;
-                       new_rdata->r_a_tov = rdata->r_a_tov;
--                      new_rdata->event_callback = rdata->event_callback;
-+                      new_rdata->ops = rdata->ops;
-                       new_rdata->local_port = rdata->local_port;
-                       new_rdata->flags = FC_RP_FLAGS_REC_SUPPORTED;
-                       new_rdata->trans_state = FC_PORTSTATE_REAL;
-@@ -269,15 +268,15 @@ static void fc_rport_work(struct work_st
-               fc_rport_rogue_destroy(rport);
-               rport = new_rport;
-               rdata = new_rport->dd_data;
--              if (event_callback)
--                      event_callback(lport, rport, event);
-+              if (rport_ops->event_callback)
-+                      rport_ops->event_callback(lport, rport, event);
-       } else if ((event == RPORT_EV_FAILED) ||
-                  (event == RPORT_EV_LOGO) ||
-                  (event == RPORT_EV_STOP)) {
-               trans_state = rdata->trans_state;
-               mutex_unlock(&rdata->rp_mutex);
--              if (event_callback)
--                      event_callback(lport, rport, event);
-+              if (rport_ops->event_callback)
-+                      rport_ops->event_callback(lport, rport, event);
-               if (trans_state == FC_PORTSTATE_ROGUE)
-                       fc_rport_rogue_destroy(rport);
-               else
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -89,14 +89,6 @@ enum fc_disc_event {
-       DISC_EV_FAILED
- };
--enum fc_lport_event {
--      RPORT_EV_NONE = 0,
--      RPORT_EV_CREATED,
--      RPORT_EV_FAILED,
--      RPORT_EV_STOP,
--      RPORT_EV_LOGO
--};
--
- enum fc_rport_state {
-       RPORT_ST_NONE = 0,
-       RPORT_ST_INIT,          /* initialized */
-@@ -126,6 +118,19 @@ struct fc_disc_port {
-       struct work_struct          rport_work;
- };
-+enum fc_rport_event {
-+      RPORT_EV_NONE = 0,
-+      RPORT_EV_CREATED,
-+      RPORT_EV_FAILED,
-+      RPORT_EV_STOP,
-+      RPORT_EV_LOGO
-+};
-+
-+struct fc_rport_operations {
-+      void (*event_callback)(struct fc_lport *, struct fc_rport *,
-+                             enum fc_rport_event);
-+};
-+
- /**
-  * struct fc_rport_libfc_priv - libfc internal information about a remote port
-  * @local_port: Fibre Channel host port instance
-@@ -140,24 +145,22 @@ struct fc_disc_port {
-  * @event_callback: Callback for rport READY, FAILED or LOGO
-  */
- struct fc_rport_libfc_priv {
--      struct fc_lport         *local_port;
--      enum fc_rport_state rp_state;
--      u16                     flags;
-+      struct fc_lport            *local_port;
-+      enum fc_rport_state        rp_state;
-+      u16                        flags;
-       #define FC_RP_FLAGS_REC_SUPPORTED       (1 << 0)
-       #define FC_RP_FLAGS_RETRY               (1 << 1)
--      u16             max_seq;
--      unsigned int    retries;
--      unsigned int    e_d_tov;
--      unsigned int    r_a_tov;
--      enum fc_rport_trans_state trans_state;
--      struct mutex    rp_mutex;
--      struct delayed_work     retry_work;
--      enum fc_lport_event     event;
--      void (*event_callback)(struct fc_lport *,
--                             struct fc_rport *,
--                             enum fc_lport_event);
--      struct list_head         peers;
--      struct work_struct       event_work;
-+      u16                        max_seq;
-+      unsigned int               retries;
-+      unsigned int               e_d_tov;
-+      unsigned int               r_a_tov;
-+      enum fc_rport_trans_state  trans_state;
-+      struct mutex               rp_mutex;
-+      struct delayed_work        retry_work;
-+      enum fc_rport_event        event;
-+      struct fc_rport_operations *ops;
-+      struct list_head           peers;
-+      struct work_struct         event_work;
- };
- #define PRIV_TO_RPORT(x)                                              \
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc-when-rport-goes-away-re.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc-when-rport-goes-away-re.diff
deleted file mode 100644 (file)
index 0651914..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-From: Abhijeet Joglekar <abjoglek@cisco.com>
-Subject: libfc: when rport goes away (re-plogi), clean up exchanges to/from rport
-References: bnc #465596
-
-When a rport goes away, libFC does a plogi which will reset exchanges
-    at the rport. Clean exchanges at our end, both in transport and libFC.
-    If transport hooks into exch_mgr_reset, it will call back into
-    fc_exch_mgr_reset() to clean up libFC exchanges.
-
-Signed-off-by: Abhijeet Joglekar <abjoglek@cisco.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
-
- drivers/scsi/libfc/fc_rport.c |    7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
-
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -215,6 +215,7 @@ static void fc_rport_state_enter(struct
- static void fc_rport_work(struct work_struct *work)
- {
-+      u32 port_id;
-       struct fc_rport_libfc_priv *rdata =
-               container_of(work, struct fc_rport_libfc_priv, event_work);
-       enum fc_rport_event event;
-@@ -280,8 +281,12 @@ static void fc_rport_work(struct work_st
-                       rport_ops->event_callback(lport, rport, event);
-               if (trans_state == FC_PORTSTATE_ROGUE)
-                       put_device(&rport->dev);
--              else
-+              else {
-+                      port_id = rport->port_id;
-                       fc_remote_port_delete(rport);
-+                      lport->tt.exch_mgr_reset(lport, 0, port_id);
-+                      lport->tt.exch_mgr_reset(lport, port_id, 0);
-+              }
-       } else
-               mutex_unlock(&rdata->rp_mutex);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc_locking.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc_locking.diff
deleted file mode 100644 (file)
index 2ff9a4e..0000000
+++ /dev/null
@@ -1,377 +0,0 @@
-From: Vasu Dev <vasu.dev@intel.com>
-Subject: libfc, fcoe: fixed locking issues with lport->lp_mutex around lport->link_status
-Patch-mainline: 6d235742e63f6b8912d8b200b75f9aa6d48f3e07
-References: bnc #468053
-
-The fcoe_xmit could call fc_pause in case the pending skb queue len is larger
-than FCOE_MAX_QUEUE_DEPTH, the fc_pause was trying to grab lport->lp_muex to
-change lport->link_status and that had these issues :-
-    
-1. The fcoe_xmit was getting called with bh disabled, thus causing
-"BUG: scheduling while atomic" when grabbing lport->lp_muex with bh disabled.
-
-2. fc_linkup and fc_linkdown function calls lport_enter function with
-lport->lp_mutex held and these enter function in turn calls fcoe_xmit to send
-lport related FC frame, e.g. fc_linkup => fc_lport_enter_flogi to send flogi
-req. In this case grabbing the same lport->lp_mutex again in fc_puase from
-fcoe_xmit would cause deadlock.
-
-The lport->lp_mutex was used for setting FC_PAUSE in fcoe_xmit path but
-FC_PAUSE bit was not used anywhere beside just setting and clear this
-bit in lport->link_status, instead used a separate field qfull in fc_lport
-to eliminate need for lport->lp_mutex to track pending queue full condition
-and in turn avoid above described two locking issues.
-
-Also added check for lp->qfull in fc_fcp_lport_queue_ready to trigger
-SCSI_MLQUEUE_HOST_BUSY when lp->qfull is set to prevent more scsi-ml cmds
-while lp->qfull is set.
-
-This patch eliminated FC_LINK_UP and FC_PAUSE and instead used dedicated
-fields in fc_lport for this, this simplified all related conditional
-code.
-    
-Also removed fc_pause and fc_unpause functions and instead used newly added
-lport->qfull directly in fcoe.
-
-Also fixed a circular locking in fc_exch_recv_abts.
-
-These issues were blocking large file copy to a 2TB lun.
-
-Signed-off-by: Vasu Dev <vasu.dev@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
- drivers/scsi/fcoe/fcoe_sw.c   |    6 +++---
- drivers/scsi/fcoe/libfcoe.c   |   41 +++++++++++++++++------------------------
- drivers/scsi/libfc/fc_exch.c  |    2 +-
- drivers/scsi/libfc/fc_fcp.c   |    6 +++---
- drivers/scsi/libfc/fc_lport.c |   38 +++++++-------------------------------
- drivers/scsi/libfc/fc_rport.c |    2 +-
- include/scsi/libfc.h          |   12 ++----------
- 7 files changed, 34 insertions(+), 73 deletions(-)
-
---- a/drivers/scsi/fcoe/fcoe_sw.c
-+++ b/drivers/scsi/fcoe/fcoe_sw.c
-@@ -116,7 +116,8 @@ static int fcoe_sw_lport_config(struct f
- {
-       int i = 0;
--      lp->link_status = 0;
-+      lp->link_up = 0;
-+      lp->qfull = 0;
-       lp->max_retry_count = 3;
-       lp->e_d_tov = 2 * 1000; /* FC-FS default */
-       lp->r_a_tov = 2 * 2 * 1000;
-@@ -181,9 +182,8 @@ static int fcoe_sw_netdev_config(struct 
-       if (fc_set_mfs(lp, mfs))
-               return -EINVAL;
--      lp->link_status = ~FC_PAUSE & ~FC_LINK_UP;
-       if (!fcoe_link_ok(lp))
--              lp->link_status |= FC_LINK_UP;
-+              lp->link_up = 1;
-       /* offload features support */
-       if (fc->real_dev->features & NETIF_F_SG)
---- a/drivers/scsi/fcoe/libfcoe.c
-+++ b/drivers/scsi/fcoe/libfcoe.c
-@@ -505,7 +505,7 @@ int fcoe_xmit(struct fc_lport *lp, struc
-       if (rc) {
-               fcoe_insert_wait_queue(lp, skb);
-               if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
--                      fc_pause(lp);
-+                      lp->qfull = 1;
-       }
-       return 0;
-@@ -719,7 +719,7 @@ static void fcoe_recv_flogi(struct fcoe_
-  * fcoe_watchdog - fcoe timer callback
-  * @vp:
-  *
-- * This checks the pending queue length for fcoe and put fcoe to be paused state
-+ * This checks the pending queue length for fcoe and set lport qfull
-  * if the FCOE_MAX_QUEUE_DEPTH is reached. This is done for all fc_lport on the
-  * fcoe_hostlist.
-  *
-@@ -729,17 +729,17 @@ void fcoe_watchdog(ulong vp)
- {
-       struct fc_lport *lp;
-       struct fcoe_softc *fc;
--      int paused = 0;
-+      int qfilled = 0;
-       read_lock(&fcoe_hostlist_lock);
-       list_for_each_entry(fc, &fcoe_hostlist, list) {
-               lp = fc->lp;
-               if (lp) {
-                       if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
--                              paused = 1;
-+                              qfilled = 1;
-                       if (fcoe_check_wait_queue(lp) <  FCOE_MAX_QUEUE_DEPTH) {
--                              if (paused)
--                                      fc_unpause(lp);
-+                              if (qfilled)
-+                                      lp->qfull = 0;
-                       }
-               }
-       }
-@@ -768,8 +768,7 @@ void fcoe_watchdog(ulong vp)
-  **/
- static int fcoe_check_wait_queue(struct fc_lport *lp)
- {
--      int rc, unpause = 0;
--      int paused = 0;
-+      int rc;
-       struct sk_buff *skb;
-       struct fcoe_softc *fc;
-@@ -777,10 +776,10 @@ static int fcoe_check_wait_queue(struct 
-       spin_lock_bh(&fc->fcoe_pending_queue.lock);
-       /*
--       * is this interface paused?
-+       * if interface pending queue full then set qfull in lport.
-        */
-       if (fc->fcoe_pending_queue.qlen > FCOE_MAX_QUEUE_DEPTH)
--              paused = 1;
-+              lp->qfull = 1;
-       if (fc->fcoe_pending_queue.qlen) {
-               while ((skb = __skb_dequeue(&fc->fcoe_pending_queue)) != NULL) {
-                       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
-@@ -792,11 +791,9 @@ static int fcoe_check_wait_queue(struct 
-                       spin_lock_bh(&fc->fcoe_pending_queue.lock);
-               }
-               if (fc->fcoe_pending_queue.qlen < FCOE_MAX_QUEUE_DEPTH)
--                      unpause = 1;
-+                      lp->qfull = 0;
-       }
-       spin_unlock_bh(&fc->fcoe_pending_queue.lock);
--      if ((unpause) && (paused))
--              fc_unpause(lp);
-       return fc->fcoe_pending_queue.qlen;
- }
-@@ -874,7 +871,7 @@ static int fcoe_device_notification(stru
-       struct net_device *real_dev = ptr;
-       struct fcoe_softc *fc;
-       struct fcoe_dev_stats *stats;
--      u16 new_status;
-+      u32 new_link_up;
-       u32 mfs;
-       int rc = NOTIFY_OK;
-@@ -891,17 +888,15 @@ static int fcoe_device_notification(stru
-               goto out;
-       }
--      new_status = lp->link_status;
-+      new_link_up = lp->link_up;
-       switch (event) {
-       case NETDEV_DOWN:
-       case NETDEV_GOING_DOWN:
--              new_status &= ~FC_LINK_UP;
-+              new_link_up = 0;
-               break;
-       case NETDEV_UP:
-       case NETDEV_CHANGE:
--              new_status &= ~FC_LINK_UP;
--              if (!fcoe_link_ok(lp))
--                      new_status |= FC_LINK_UP;
-+              new_link_up = !fcoe_link_ok(lp);
-               break;
-       case NETDEV_CHANGEMTU:
-               mfs = fc->real_dev->mtu -
-@@ -909,17 +904,15 @@ static int fcoe_device_notification(stru
-                        sizeof(struct fcoe_crc_eof));
-               if (mfs >= FC_MIN_MAX_FRAME)
-                       fc_set_mfs(lp, mfs);
--              new_status &= ~FC_LINK_UP;
--              if (!fcoe_link_ok(lp))
--                      new_status |= FC_LINK_UP;
-+              new_link_up = !fcoe_link_ok(lp);
-               break;
-       case NETDEV_REGISTER:
-               break;
-       default:
-               FC_DBG("unknown event %ld call", event);
-       }
--      if (lp->link_status != new_status) {
--              if ((new_status & FC_LINK_UP) == FC_LINK_UP)
-+      if (lp->link_up != new_link_up) {
-+              if (new_link_up)
-                       fc_linkup(lp);
-               else {
-                       stats = lp->dev_stats[smp_processor_id()];
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -1096,7 +1096,7 @@ static void fc_exch_recv_abts(struct fc_
-               ap->ba_high_seq_cnt = fh->fh_seq_cnt;
-               ap->ba_low_seq_cnt = htons(sp->cnt);
-       }
--      sp = fc_seq_start_next(sp);
-+      sp = fc_seq_start_next_locked(sp);
-       spin_unlock_bh(&ep->ex_lock);
-       fc_seq_send_last(sp, fp, FC_RCTL_BA_ACC, FC_TYPE_BLS);
-       fc_frame_free(rx_fp);
---- a/drivers/scsi/libfc/fc_fcp.c
-+++ b/drivers/scsi/libfc/fc_fcp.c
-@@ -20,13 +20,13 @@
-  */
- #include <linux/module.h>
-+#include <linux/delay.h>
- #include <linux/kernel.h>
- #include <linux/types.h>
- #include <linux/spinlock.h>
- #include <linux/scatterlist.h>
- #include <linux/err.h>
- #include <linux/crc32.h>
--#include <linux/delay.h>
- #include <scsi/scsi_tcq.h>
- #include <scsi/scsi.h>
-@@ -1622,7 +1622,7 @@ out:
- static inline int fc_fcp_lport_queue_ready(struct fc_lport *lp)
- {
-       /* lock ? */
--      return (lp->state == LPORT_ST_READY) && (lp->link_status & FC_LINK_UP);
-+      return (lp->state == LPORT_ST_READY) && lp->link_up && !lp->qfull;
- }
- /**
-@@ -1891,7 +1891,7 @@ int fc_eh_abort(struct scsi_cmnd *sc_cmd
-       lp = shost_priv(sc_cmd->device->host);
-       if (lp->state != LPORT_ST_READY)
-               return rc;
--      else if (!(lp->link_status & FC_LINK_UP))
-+      else if (!lp->link_up)
-               return rc;
-       spin_lock_irqsave(lp->host->host_lock, flags);
---- a/drivers/scsi/libfc/fc_lport.c
-+++ b/drivers/scsi/libfc/fc_lport.c
-@@ -250,7 +250,7 @@ void fc_get_host_port_state(struct Scsi_
- {
-       struct fc_lport *lp = shost_priv(shost);
--      if ((lp->link_status & FC_LINK_UP) == FC_LINK_UP)
-+      if (lp->link_up)
-               fc_host_port_state(shost) = FC_PORTSTATE_ONLINE;
-       else
-               fc_host_port_state(shost) = FC_PORTSTATE_OFFLINE;
-@@ -484,7 +484,7 @@ static void fc_lport_recv_rnid_req(struc
-  * @sp: current sequence in the ADISC exchange
-  * @fp: ADISC request frame
-  *
-- * Locking Note: The lport lock is exected to be held before calling
-+ * Locking Note: The lport lock is expected to be held before calling
-  * this function.
-  */
- static void fc_lport_recv_adisc_req(struct fc_seq *sp, struct fc_frame *in_fp,
-@@ -577,8 +577,8 @@ void fc_linkup(struct fc_lport *lport)
-                      fc_host_port_id(lport->host));
-       mutex_lock(&lport->lp_mutex);
--      if ((lport->link_status & FC_LINK_UP) != FC_LINK_UP) {
--              lport->link_status |= FC_LINK_UP;
-+      if (!lport->link_up) {
-+              lport->link_up = 1;
-               if (lport->state == LPORT_ST_RESET)
-                       fc_lport_enter_flogi(lport);
-@@ -597,8 +597,8 @@ void fc_linkdown(struct fc_lport *lport)
-       FC_DEBUG_LPORT("Link is down for port (%6x)\n",
-                      fc_host_port_id(lport->host));
--      if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) {
--              lport->link_status &= ~(FC_LINK_UP);
-+      if (lport->link_up) {
-+              lport->link_up = 0;
-               fc_lport_enter_reset(lport);
-               lport->tt.fcp_cleanup(lport);
-       }
-@@ -607,30 +607,6 @@ void fc_linkdown(struct fc_lport *lport)
- EXPORT_SYMBOL(fc_linkdown);
- /**
-- * fc_pause - Pause the flow of frames
-- * @lport: The lport to be paused
-- */
--void fc_pause(struct fc_lport *lport)
--{
--      mutex_lock(&lport->lp_mutex);
--      lport->link_status |= FC_PAUSE;
--      mutex_unlock(&lport->lp_mutex);
--}
--EXPORT_SYMBOL(fc_pause);
--
--/**
-- * fc_unpause - Unpause the flow of frames
-- * @lport: The lport to be unpaused
-- */
--void fc_unpause(struct fc_lport *lport)
--{
--      mutex_lock(&lport->lp_mutex);
--      lport->link_status &= ~(FC_PAUSE);
--      mutex_unlock(&lport->lp_mutex);
--}
--EXPORT_SYMBOL(fc_unpause);
--
--/**
-  * fc_fabric_logoff - Logout of the fabric
-  * @lport:          fc_lport pointer to logoff the fabric
-  *
-@@ -977,7 +953,7 @@ static void fc_lport_enter_reset(struct 
-       fc_host_fabric_name(lport->host) = 0;
-       fc_host_port_id(lport->host) = 0;
--      if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP)
-+      if (lport->link_up)
-               fc_lport_enter_flogi(lport);
- }
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -425,7 +425,7 @@ static void fc_rport_error(struct fc_rpo
-                      PTR_ERR(fp), fc_rport_state(rport), rdata->retries);
-       if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
--              /* 
-+              /*
-                * Memory allocation failure, or the exchange timed out.
-                *  Retry after delay
-                */
---- a/include/scsi/libfc.h
-+++ b/include/scsi/libfc.h
-@@ -68,9 +68,6 @@
- /*
-  * FC HBA status
-  */
--#define FC_PAUSE                  (1 << 1)
--#define FC_LINK_UP                (1 << 0)
--
- enum fc_lport_state {
-       LPORT_ST_NONE = 0,
-       LPORT_ST_FLOGI,
-@@ -603,7 +600,8 @@ struct fc_lport {
-       /* Operational Information */
-       struct libfc_function_template tt;
--      u16                     link_status;
-+      u8                      link_up;
-+      u8                      qfull;
-       enum fc_lport_state     state;
-       unsigned long           boot_time;
-@@ -704,12 +702,6 @@ void fc_linkup(struct fc_lport *);
- void fc_linkdown(struct fc_lport *);
- /*
-- * Pause and unpause traffic.
-- */
--void fc_pause(struct fc_lport *);
--void fc_unpause(struct fc_lport *);
--
--/*
-  * Configure the local port.
-  */
- int fc_lport_config(struct fc_lport *);
diff --git a/src/patches/suse-2.6.27.31/patches.drivers/libfc_rport.diff b/src/patches/suse-2.6.27.31/patches.drivers/libfc_rport.diff
deleted file mode 100644 (file)
index 92b0599..0000000
+++ /dev/null
@@ -1,265 +0,0 @@
-From: Chris Leech <christopher.leech@intel.com>
-Subject: libfc: rport retry on LS_RJT from certain ELS
-Patch-mainline: 6147a1194ba86af4266f36c9522a7b0040af98fe
-References: bnc #468054
-
-This allows any rport ELS to retry on LS_RJT.
-
-The rport error handling would only retry on resource allocation failures
-and exchange timeouts.  I have a target that will occasionally reject PLOGI
-when we do a quick LOGO/PLOGI.  When a critical ELS was rejected, libfc would
-fail silently leaving the rport in a dead state.
-
-The retry count and delay are managed by fc_rport_error_retry.  If the retry
-count is exceeded fc_rport_error will be called.  When retrying is not the
-correct course of action, fc_rport_error can be called directly.
-
-Signed-off-by: Chris Leech <christopher.leech@intel.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
----
- drivers/scsi/libfc/fc_exch.c  |    2 
- drivers/scsi/libfc/fc_rport.c |  111 ++++++++++++++++++++++++------------------
- include/scsi/fc/fc_fs.h       |    5 +
- 3 files changed, 69 insertions(+), 49 deletions(-)
-
---- a/drivers/scsi/libfc/fc_exch.c
-+++ b/drivers/scsi/libfc/fc_exch.c
-@@ -32,8 +32,6 @@
- #include <scsi/libfc.h>
- #include <scsi/fc_encode.h>
--#define         FC_DEF_R_A_TOV      (10 * 1000) /* resource allocation timeout */
--
- /*
-  * fc_exch_debug can be set in debugger or at compile time to get more logs.
-  */
---- a/drivers/scsi/libfc/fc_rport.c
-+++ b/drivers/scsi/libfc/fc_rport.c
-@@ -81,6 +81,7 @@ static void fc_rport_recv_logo_req(struc
-                                  struct fc_seq *, struct fc_frame *);
- static void fc_rport_timeout(struct work_struct *);
- static void fc_rport_error(struct fc_rport *, struct fc_frame *);
-+static void fc_rport_error_retry(struct fc_rport *, struct fc_frame *);
- static void fc_rport_work(struct work_struct *);
- static const char *fc_rport_state_names[] = {
-@@ -405,55 +406,71 @@ static void fc_rport_timeout(struct work
- }
- /**
-- * fc_rport_error - Handler for any errors
-+ * fc_rport_error - Error handler, called once retries have been exhausted
-  * @rport: The fc_rport object
-  * @fp: The frame pointer
-  *
-- * If the error was caused by a resource allocation failure
-- * then wait for half a second and retry, otherwise retry
-- * immediately.
-- *
-  * Locking Note: The rport lock is expected to be held before
-  * calling this routine
-  */
- static void fc_rport_error(struct fc_rport *rport, struct fc_frame *fp)
- {
-       struct fc_rport_libfc_priv *rdata = rport->dd_data;
--      unsigned long delay = 0;
-       FC_DEBUG_RPORT("Error %ld in state %s, retries %d\n",
-                      PTR_ERR(fp), fc_rport_state(rport), rdata->retries);
--      if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
--              /*
--               * Memory allocation failure, or the exchange timed out.
--               *  Retry after delay
--               */
--              if (rdata->retries < rdata->local_port->max_retry_count) {
--                      rdata->retries++;
--                      if (!fp)
--                              delay = msecs_to_jiffies(500);
--                      get_device(&rport->dev);
--                      schedule_delayed_work(&rdata->retry_work, delay);
--              } else {
--                      switch (rdata->rp_state) {
--                      case RPORT_ST_PLOGI:
--                      case RPORT_ST_PRLI:
--                      case RPORT_ST_LOGO:
--                              rdata->event = RPORT_EV_FAILED;
--                              queue_work(rport_event_queue,
--                                         &rdata->event_work);
--                              break;
--                      case RPORT_ST_RTV:
--                              fc_rport_enter_ready(rport);
--                              break;
--                      case RPORT_ST_NONE:
--                      case RPORT_ST_READY:
--                      case RPORT_ST_INIT:
--                              break;
--                      }
--              }
-+      switch (rdata->rp_state) {
-+      case RPORT_ST_PLOGI:
-+      case RPORT_ST_PRLI:
-+      case RPORT_ST_LOGO:
-+              rdata->event = RPORT_EV_FAILED;
-+              queue_work(rport_event_queue,
-+                         &rdata->event_work);
-+              break;
-+      case RPORT_ST_RTV:
-+              fc_rport_enter_ready(rport);
-+              break;
-+      case RPORT_ST_NONE:
-+      case RPORT_ST_READY:
-+      case RPORT_ST_INIT:
-+              break;
-+      }
-+}
-+
-+/**
-+ * fc_rport_error_retry - Error handler when retries are desired
-+ * @rport: The fc_rport object
-+ * @fp: The frame pointer
-+ *
-+ * If the error was an exchange timeout retry immediately,
-+ * otherwise wait for E_D_TOV.
-+ *
-+ * Locking Note: The rport lock is expected to be held before
-+ * calling this routine
-+ */
-+static void fc_rport_error_retry(struct fc_rport *rport, struct fc_frame *fp)
-+{
-+      struct fc_rport_libfc_priv *rdata = rport->dd_data;
-+      unsigned long delay = FC_DEF_E_D_TOV;
-+
-+      /* make sure this isn't an FC_EX_CLOSED error, never retry those */
-+      if (PTR_ERR(fp) == -FC_EX_CLOSED)
-+              return fc_rport_error(rport, fp);
-+
-+      if (rdata->retries < rdata->local_port->max_retry_count) {
-+              FC_DEBUG_RPORT("Error %ld in state %s, retrying\n",
-+                              PTR_ERR(fp), fc_rport_state(rport));
-+              rdata->retries++;
-+              /* no additional delay on exchange timeouts */
-+              if (PTR_ERR(fp) == -FC_EX_TIMEOUT)
-+                      delay = 0;
-+              get_device(&rport->dev);
-+              schedule_delayed_work(&rdata->retry_work, delay);
-+              return;
-       }
-+
-+      return fc_rport_error(rport, fp);
- }
- /**
-@@ -490,7 +507,7 @@ static void fc_rport_plogi_resp(struct f
-       }
-       if (IS_ERR(fp)) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               goto err;
-       }
-@@ -522,7 +539,7 @@ static void fc_rport_plogi_resp(struct f
-               else
-                       fc_rport_enter_prli(rport);
-       } else
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
- out:
-       fc_frame_free(fp);
-@@ -552,14 +569,14 @@ static void fc_rport_enter_plogi(struct 
-       rport->maxframe_size = FC_MIN_MAX_PAYLOAD;
-       fp = fc_frame_alloc(lport, sizeof(struct fc_els_flogi));
-       if (!fp) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               return;
-       }
-       rdata->e_d_tov = lport->e_d_tov;
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_PLOGI,
-                                 fc_rport_plogi_resp, rport, lport->e_d_tov))
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-       else
-               get_device(&rport->dev);
- }
-@@ -599,7 +616,7 @@ static void fc_rport_prli_resp(struct fc
-       }
-       if (IS_ERR(fp)) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               goto err;
-       }
-@@ -657,7 +674,7 @@ static void fc_rport_logo_resp(struct fc
-                      rport->port_id);
-       if (IS_ERR(fp)) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               goto err;
-       }
-@@ -707,13 +724,13 @@ static void fc_rport_enter_prli(struct f
-       fp = fc_frame_alloc(lport, sizeof(*pp));
-       if (!fp) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               return;
-       }
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_PRLI,
-                                 fc_rport_prli_resp, rport, lport->e_d_tov))
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-       else
-               get_device(&rport->dev);
- }
-@@ -804,13 +821,13 @@ static void fc_rport_enter_rtv(struct fc
-       fp = fc_frame_alloc(lport, sizeof(struct fc_els_rtv));
-       if (!fp) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               return;
-       }
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_RTV,
-                                    fc_rport_rtv_resp, rport, lport->e_d_tov))
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-       else
-               get_device(&rport->dev);
- }
-@@ -835,13 +852,13 @@ static void fc_rport_enter_logo(struct f
-       fp = fc_frame_alloc(lport, sizeof(struct fc_els_logo));
-       if (!fp) {
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-               return;
-       }
-       if (!lport->tt.elsct_send(lport, rport, fp, ELS_LOGO,
-                                 fc_rport_logo_resp, rport, lport->e_d_tov))
--              fc_rport_error(rport, fp);
-+              fc_rport_error_retry(rport, fp);
-       else
-               get_device(&rport->dev);
- }
---- a/include/scsi/fc/fc_fs.h
-+++ b/include/scsi/fc/fc_fs.h
-@@ -337,4 +337,9 @@ enum fc_pf_rjt_reason {
-       FC_RJT_VENDOR =         0xff,   /* vendor specific reject */
- };
-+/* default timeout values */
-+
-+#define FC_DEF_E_D_TOV        2000UL
-+#define FC_DEF_R_A_TOV        10000UL
-+
- #endif /* _FC_FS_H_ */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/altstack-avoid-copying-stack_t-as-a-structure-to-userspace b/src/patches/suse-2.6.27.31/patches.fixes/altstack-avoid-copying-stack_t-as-a-structure-to-userspace
deleted file mode 100644 (file)
index e152799..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Linus Torvalds <torvalds@linux-foundation.org>
-Date: Sat, 1 Aug 2009 17:34:56 +0000 (-0700)
-Subject: do_sigaltstack: avoid copying 'stack_t' as a structure to user space
-Git-commit: 0083fc2c50e6c5127c2802ad323adf8143ab7856
-Patch-mainline: 2.6.31
-References: bnc#527848
-
-do_sigaltstack: avoid copying 'stack_t' as a structure to user space
-
-Ulrich Drepper correctly points out that there is generally padding in
-the structure on 64-bit hosts, and that copying the structure from
-kernel to user space can leak information from the kernel stack in those
-padding bytes.
-
-Avoid the whole issue by just copying the three members one by one
-instead, which also means that the function also can avoid the need for
-a stack frame.  This also happens to match how we copy the new structure
-from user space, so it all even makes sense.
-
-[ The obvious solution of adding a memset() generates horrid code, gcc
-  does really stupid things. ]
-
-Reported-by: Ulrich Drepper <drepper@redhat.com>
-Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-Acked-by: Jeff Mahoney <jeffm@suse.com>
----
-
- kernel/signal.c |   15 ++++++++-------
- 1 file changed, 8 insertions(+), 7 deletions(-)
-
---- a/kernel/signal.c
-+++ b/kernel/signal.c
-@@ -2353,11 +2353,9 @@ do_sigaltstack (const stack_t __user *us
-       stack_t oss;
-       int error;
--      if (uoss) {
--              oss.ss_sp = (void __user *) current->sas_ss_sp;
--              oss.ss_size = current->sas_ss_size;
--              oss.ss_flags = sas_ss_flags(sp);
--      }
-+      oss.ss_sp = (void __user *) current->sas_ss_sp;
-+      oss.ss_size = current->sas_ss_size;
-+      oss.ss_flags = sas_ss_flags(sp);
-       if (uss) {
-               void __user *ss_sp;
-@@ -2400,13 +2398,16 @@ do_sigaltstack (const stack_t __user *us
-               current->sas_ss_size = ss_size;
-       }
-+      error = 0;
-       if (uoss) {
-               error = -EFAULT;
--              if (copy_to_user(uoss, &oss, sizeof(oss)))
-+              if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
-                       goto out;
-+              error = __put_user(oss.ss_sp, &uoss->ss_sp) |
-+                      __put_user(oss.ss_size, &uoss->ss_size) |
-+                      __put_user(oss.ss_flags, &uoss->ss_flags);
-       }
--      error = 0;
- out:
-       return error;
- }
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/b43legacy-fix-led_device_naming.diff b/src/patches/suse-2.6.27.31/patches.fixes/b43legacy-fix-led_device_naming.diff
deleted file mode 100644 (file)
index b79e5a6..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Danny Kukawka <dkukawka@suse.de>
-Subject: b43legacy: fix led naming
-
-Fixed led device naming for the b43legacy driver. Due to the
-documentation of the led subsystem/class the naming should be
-"devicename:colour:function" while not applying sections
-should be left blank.
-    
-This should lead to e.g. "b43legacy-%s::rx" instead of 
-"b43legacy-%s:rx".
-
-Signed-off-by: Danny Kukawka <dkukawka@suse.de>
---
- leds.c |    8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/b43legacy/leds.c b/drivers/net/wireless/b43legacy/leds.c
-index cacb786..cb4511f 100644
---- a/drivers/net/wireless/b43legacy/leds.c
-+++ b/drivers/net/wireless/b43legacy/leds.c
-@@ -146,12 +146,12 @@ static void b43legacy_map_led(struct b43legacy_wldev *dev,
-       case B43legacy_LED_TRANSFER:
-       case B43legacy_LED_APTRANSFER:
-               snprintf(name, sizeof(name),
--                       "b43legacy-%s:tx", wiphy_name(hw->wiphy));
-+                       "b43legacy-%s::tx", wiphy_name(hw->wiphy));
-               b43legacy_register_led(dev, &dev->led_tx, name,
-                                ieee80211_get_tx_led_name(hw),
-                                led_index, activelow);
-               snprintf(name, sizeof(name),
--                       "b43legacy-%s:rx", wiphy_name(hw->wiphy));
-+                       "b43legacy-%s::rx", wiphy_name(hw->wiphy));
-               b43legacy_register_led(dev, &dev->led_rx, name,
-                                ieee80211_get_rx_led_name(hw),
-                                led_index, activelow);
-@@ -161,7 +161,7 @@ static void b43legacy_map_led(struct b43legacy_wldev *dev,
-       case B43legacy_LED_RADIO_B:
-       case B43legacy_LED_MODE_BG:
-               snprintf(name, sizeof(name),
--                       "b43legacy-%s:radio", wiphy_name(hw->wiphy));
-+                       "b43legacy-%s::radio", wiphy_name(hw->wiphy));
-               b43legacy_register_led(dev, &dev->led_radio, name,
-                                b43legacy_rfkill_led_name(dev),
-                                led_index, activelow);
-@@ -172,7 +172,7 @@ static void b43legacy_map_led(struct b43legacy_wldev *dev,
-       case B43legacy_LED_WEIRD:
-       case B43legacy_LED_ASSOC:
-               snprintf(name, sizeof(name),
--                       "b43legacy-%s:assoc", wiphy_name(hw->wiphy));
-+                       "b43legacy-%s::assoc", wiphy_name(hw->wiphy));
-               b43legacy_register_led(dev, &dev->led_assoc, name,
-                                ieee80211_get_assoc_led_name(hw),
-                                led_index, activelow);
-
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ext2_mtime_update_on_rename.diff b/src/patches/suse-2.6.27.31/patches.fixes/ext2_mtime_update_on_rename.diff
deleted file mode 100644 (file)
index 15d5a50..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-From: Jan Kara <jack@suse.cz>
-Subject: [PATCH] ext2: Do not update mtime of a move directory when parent has not changed
-References: bnc#493392
-Patch-mainline: 2.6.30
-
-If the parent of the moved directory has not changed, there's no real
-reason to change mtime. Specs doesn't seem to say anything about this
-particular case and e.g. ext3 does not change mtime in this case.
-So we become a tiny bit more consistent.
-
-Spotted by ronny.pretzsch@dfs.de, initial fix by Jörn Engel <joern@logfs.org>.
-
-Signed-off-by: Jan Kara <jack@suse.cz>
----
- fs/ext2/namei.c |    5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
---- a/fs/ext2/namei.c
-+++ b/fs/ext2/namei.c
-@@ -355,7 +355,10 @@ static int ext2_rename (struct inode * o
-       inode_dec_link_count(old_inode);
-       if (dir_de) {
--              ext2_set_link(old_inode, dir_de, dir_page, new_dir);
-+              /* Set link only if parent has changed and thus avoid setting
-+               * of mtime of the moved directory on a pure rename. */
-+              if (old_dir != new_dir)
-+                      ext2_set_link(old_inode, dir_de, dir_page, new_dir);
-               inode_dec_link_count(old_dir);
-       }
-       return 0;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ext3_false_EIO_fix.diff b/src/patches/suse-2.6.27.31/patches.fixes/ext3_false_EIO_fix.diff
deleted file mode 100644 (file)
index 4b8bf1e..0000000
+++ /dev/null
@@ -1,172 +0,0 @@
-From: Jan Kara <jack@suse.cz>
-Subject: [PATCH] ext3: Avoid false EIO errors
-References: bnc#479730
-
-Sometimes block_write_begin() can map buffers in a page but later we fail to
-copy data into those buffers (because the source page has been paged out in the
-mean time). We then end up with !uptodate mapped buffers. To add a bit more to
-the confusion, block_write_end() does not commit any data (and thus does not
-any mark buffers as uptodate) if we didn't succeed with copying all the data.
-
-Commit f4fc66a894546bdc88a775d0e83ad20a65210bcb (ext3: convert to new aops)
-missed these cases and thus we were inserting non-uptodate buffers to
-transaction's list which confuses JBD code and it reports IO errors, aborts
-a transaction and generally makes users afraid about their data ;-P.
-
-This patch fixes the problem by reorganizing ext3_..._write_end() code to
-first call block_write_end() to mark buffers with valid data uptodate and
-after that we file only uptodate buffers to transaction's lists. Also
-fix a problem where we could leave blocks allocated beyond i_size (i_disksize
-in fact).
-
-Signed-off-by: Jan Kara <jack@suse.cz>
-
----
- fs/ext3/inode.c |   99 +++++++++++++++++++++++---------------------------------
- 1 file changed, 42 insertions(+), 57 deletions(-)
-
---- a/fs/ext3/inode.c
-+++ b/fs/ext3/inode.c
-@@ -1195,6 +1195,18 @@ int ext3_journal_dirty_data(handle_t *ha
-       return err;
- }
-+/* For ordered writepage and write_end functions */
-+static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh)
-+{
-+      /*
-+       * Write could have mapped the buffer but it didn't copy the data in
-+       * yet. So avoid filing such buffer into a transaction.
-+       */
-+      if (buffer_mapped(bh) && buffer_uptodate(bh))
-+              return ext3_journal_dirty_data(handle, bh);
-+      return 0;
-+}
-+
- /* For write_end() in data=journal mode */
- static int write_end_fn(handle_t *handle, struct buffer_head *bh)
- {
-@@ -1205,26 +1217,29 @@ static int write_end_fn(handle_t *handle
- }
- /*
-- * Generic write_end handler for ordered and writeback ext3 journal modes.
-- * We can't use generic_write_end, because that unlocks the page and we need to
-- * unlock the page after ext3_journal_stop, but ext3_journal_stop must run
-- * after block_write_end.
-+ * This is nasty and subtle: ext3_write_begin() could have allocated blocks
-+ * for the whole page but later we failed to copy the data in. So the disk
-+ * size we really have allocated is pos + len (block_write_end() has zeroed
-+ * the freshly allocated buffers so we aren't going to write garbage). But we
-+ * want to keep i_size at the place where data copying finished so that we
-+ * don't confuse readers. The worst what can happen is that we expose a page
-+ * of zeros at the end of file after a crash...
-  */
--static int ext3_generic_write_end(struct file *file,
--                              struct address_space *mapping,
--                              loff_t pos, unsigned len, unsigned copied,
--                              struct page *page, void *fsdata)
-+static void update_file_sizes(struct inode *inode, loff_t pos, unsigned len,
-+                            unsigned copied)
- {
--      struct inode *inode = file->f_mapping->host;
-+      int mark_dirty = 0;
--      copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
--
--      if (pos+copied > inode->i_size) {
--              i_size_write(inode, pos+copied);
--              mark_inode_dirty(inode);
-+      if (pos + len > EXT3_I(inode)->i_disksize) {
-+              mark_dirty = 1;
-+              EXT3_I(inode)->i_disksize = pos + len;
-       }
--
--      return copied;
-+      if (pos + copied > inode->i_size) {
-+              i_size_write(inode, pos + copied);
-+              mark_dirty = 1;
-+      }
-+      if (mark_dirty)
-+              mark_inode_dirty(inode);
- }
- /*
-@@ -1244,29 +1259,17 @@ static int ext3_ordered_write_end(struct
-       unsigned from, to;
-       int ret = 0, ret2;
-+      copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
-+
-+      /* See comment at update_file_sizes() for why we check buffers upto
-+       * from + len */
-       from = pos & (PAGE_CACHE_SIZE - 1);
-       to = from + len;
--
-       ret = walk_page_buffers(handle, page_buffers(page),
--              from, to, NULL, ext3_journal_dirty_data);
-+              from, to, NULL, journal_dirty_data_fn);
--      if (ret == 0) {
--              /*
--               * generic_write_end() will run mark_inode_dirty() if i_size
--               * changes.  So let's piggyback the i_disksize mark_inode_dirty
--               * into that.
--               */
--              loff_t new_i_size;
--
--              new_i_size = pos + copied;
--              if (new_i_size > EXT3_I(inode)->i_disksize)
--                      EXT3_I(inode)->i_disksize = new_i_size;
--              ret2 = ext3_generic_write_end(file, mapping, pos, len, copied,
--                                                      page, fsdata);
--              copied = ret2;
--              if (ret2 < 0)
--                      ret = ret2;
--      }
-+      if (ret == 0)
-+              update_file_sizes(inode, pos, len, copied);
-       ret2 = ext3_journal_stop(handle);
-       if (!ret)
-               ret = ret2;
-@@ -1283,22 +1286,11 @@ static int ext3_writeback_write_end(stru
- {
-       handle_t *handle = ext3_journal_current_handle();
-       struct inode *inode = file->f_mapping->host;
--      int ret = 0, ret2;
--      loff_t new_i_size;
-+      int ret;
--      new_i_size = pos + copied;
--      if (new_i_size > EXT3_I(inode)->i_disksize)
--              EXT3_I(inode)->i_disksize = new_i_size;
--
--      ret2 = ext3_generic_write_end(file, mapping, pos, len, copied,
--                                                      page, fsdata);
--      copied = ret2;
--      if (ret2 < 0)
--              ret = ret2;
--
--      ret2 = ext3_journal_stop(handle);
--      if (!ret)
--              ret = ret2;
-+      copied = block_write_end(file, mapping, pos, len, copied, page, fsdata);
-+      update_file_sizes(inode, pos, len, copied);
-+      ret = ext3_journal_stop(handle);
-       unlock_page(page);
-       page_cache_release(page);
-@@ -1412,13 +1404,6 @@ static int bput_one(handle_t *handle, st
-       return 0;
- }
--static int journal_dirty_data_fn(handle_t *handle, struct buffer_head *bh)
--{
--      if (buffer_mapped(bh))
--              return ext3_journal_dirty_data(handle, bh);
--      return 0;
--}
--
- /*
-  * Note that we always start a transaction even if we're not journalling
-  * data.  This is to preserve ordering: any hole instantiation within
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ia64-sparse-fixes.diff b/src/patches/suse-2.6.27.31/patches.fixes/ia64-sparse-fixes.diff
deleted file mode 100644 (file)
index c923fc0..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Jan Blunck <jblunck@suse.de>
-Subject: ia64-kvm: fix sparse warnings
-
-This patch fixes some sparse warning about dubious one-bit signed bitfield.
-
-Signed-off-by: Jan Blunck <jblunck@suse.de>
----
- arch/ia64/kvm/vti.h |   26 +++++++++++++-------------
- 1 file changed, 13 insertions(+), 13 deletions(-)
-
-Index: b/arch/ia64/kvm/vti.h
-===================================================================
---- a/arch/ia64/kvm/vti.h
-+++ b/arch/ia64/kvm/vti.h
-@@ -83,13 +83,13 @@
- union vac {
-       unsigned long value;
-       struct {
--              int a_int:1;
--              int a_from_int_cr:1;
--              int a_to_int_cr:1;
--              int a_from_psr:1;
--              int a_from_cpuid:1;
--              int a_cover:1;
--              int a_bsw:1;
-+              unsigned int a_int:1;
-+              unsigned int a_from_int_cr:1;
-+              unsigned int a_to_int_cr:1;
-+              unsigned int a_from_psr:1;
-+              unsigned int a_from_cpuid:1;
-+              unsigned int a_cover:1;
-+              unsigned int a_bsw:1;
-               long reserved:57;
-       };
- };
-@@ -97,12 +97,12 @@ union vac {
- union vdc {
-       unsigned long value;
-       struct {
--              int d_vmsw:1;
--              int d_extint:1;
--              int d_ibr_dbr:1;
--              int d_pmc:1;
--              int d_to_pmd:1;
--              int d_itm:1;
-+              unsigned int d_vmsw:1;
-+              unsigned int d_extint:1;
-+              unsigned int d_ibr_dbr:1;
-+              unsigned int d_pmc:1;
-+              unsigned int d_to_pmd:1;
-+              unsigned int d_itm:1;
-               long reserved:58;
-       };
- };
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_partition_id.diff b/src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_partition_id.diff
deleted file mode 100644 (file)
index 030d68a..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: Add partition id, coherence id, and region size to UV
-References: bnc#442455
-
-Add partition id, coherence id, and region size to UV.
-
-The SGI xp drivers (drivers/misc/sgi-xp) are used on both
-sn (Itanium) and uv (Tukwilla).  Using the same names
-(sn_partition_id, sn_coherency_id, sn_region_size)
-simplifies the driver code.
-
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- arch/ia64/uv/kernel/setup.c |    6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/arch/ia64/uv/kernel/setup.c
-+++ b/arch/ia64/uv/kernel/setup.c
-@@ -19,6 +19,12 @@ EXPORT_PER_CPU_SYMBOL_GPL(__uv_hub_info)
- #ifdef CONFIG_IA64_SGI_UV
- int sn_prom_type;
-+long sn_partition_id;
-+EXPORT_SYMBOL(sn_partition_id);
-+long sn_coherency_id;
-+EXPORT_SYMBOL_GPL(sn_coherency_id);
-+long sn_region_size;
-+EXPORT_SYMBOL(sn_region_size);
- #endif
- struct redir_addr {
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_watchlist.diff b/src/patches/suse-2.6.27.31/patches.fixes/ia64_uv_watchlist.diff
deleted file mode 100644 (file)
index 597622e..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Bernhard Walle <bwalle@suse.de>
-Subject: Add UV watchlist support
-References: bnc#442455
-
-Add UV watchlist support.
-
-This is used by SGI xp drivers (drivers/misc/sgi-xp).
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-
----
-
- arch/ia64/include/asm/sn/sn_sal.h |   45 ++++++++++++++++++++++++++++++++++++++
- 1 file changed, 45 insertions(+)
-
-Index: linux/arch/ia64/include/asm/sn/sn_sal.h
-===================================================================
---- linux.orig/arch/ia64/include/asm/sn/sn_sal.h       2008-11-05 09:21:48.690243174 -0600
-+++ linux/arch/ia64/include/asm/sn/sn_sal.h    2008-11-05 09:22:01.847928152 -0600
-@@ -90,6 +90,8 @@
- #define  SN_SAL_SET_CPU_NUMBER                           0x02000068
- #define  SN_SAL_KERNEL_LAUNCH_EVENT              0x02000069
-+#define  SN_SAL_WATCHLIST_ALLOC                          0x02000070
-+#define  SN_SAL_WATCHLIST_FREE                           0x02000071
- /*
-  * Service-specific constants
-@@ -1183,6 +1185,49 @@ ia64_sn_kernel_launch_event(void)
- {
-       struct ia64_sal_retval rv;
-       SAL_CALL_NOLOCK(rv, SN_SAL_KERNEL_LAUNCH_EVENT, 0, 0, 0, 0, 0, 0, 0);
-+      return rv.status;
-+}
-+
-+union sn_watchlist_u {
-+      u64     val;
-+      struct {
-+              u64     blade   : 16,
-+                      size    : 32,
-+                      filler  : 16;
-+      };
-+};
-+
-+static inline int
-+sn_mq_watchlist_alloc(int blade, void *mq, unsigned int mq_size,
-+                              unsigned long *intr_mmr_offset)
-+{
-+      struct ia64_sal_retval rv;
-+      unsigned long addr;
-+      union sn_watchlist_u size_blade;
-+      int watchlist;
-+
-+      addr = (unsigned long)mq;
-+      size_blade.size = mq_size;
-+      size_blade.blade = blade;
-+
-+      /*
-+       * bios returns watchlist number or negative error number.
-+       */
-+      ia64_sal_oemcall_nolock(&rv, SN_SAL_WATCHLIST_ALLOC, addr,
-+                      size_blade.val, (u64)intr_mmr_offset,
-+                      (u64)&watchlist, 0, 0, 0);
-+      if (rv.status < 0)
-+              return rv.status;
-+
-+      return watchlist;
-+}
-+
-+static inline int
-+sn_mq_watchlist_free(int blade, int watchlist_num)
-+{
-+      struct ia64_sal_retval rv;
-+      ia64_sal_oemcall_nolock(&rv, SN_SAL_WATCHLIST_FREE, blade,
-+                      watchlist_num, 0, 0, 0, 0, 0);
-       return rv.status;
- }
- #endif /* _ASM_IA64_SN_SN_SAL_H */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-3945_led_device_naming.diff b/src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-3945_led_device_naming.diff
deleted file mode 100644 (file)
index 904d754..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-From: Danny Kukawka <dkukawka@suse.de>
-Subject: iwlwifi: another led naming fix
-
-Fixed led device naming for the iwlwifi (iwl-3945) driver. Due 
-to the documentation of the led subsystem/class the naming should 
-be "devicename:colour:function" while not applying sections
-should be left blank.
-    
-This should lead to e.g. "iwl-%s::RX" instead of "iwl-%s:RX".
-
-Signed-off-by: Danny Kukawka <dkukawka@suse.de>
-Acked-by: Reinette Chatre <reinette.chatre@intel.com>
---
- iwl-led.c |    8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-led.c b/drivers/net/wireless/iwlwifi/iwl-3945-led.c
-index 4c63890..09f9350 100644
---- a/drivers/net/wireless/iwlwifi/iwl-3945-led.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-3945-led.c
-@@ -317,7 +317,7 @@ int iwl3945_led_register(struct iwl3945_priv *priv)
-       trigger = ieee80211_get_radio_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_RADIO].name,
--               sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio",
-+               sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s::radio",
-                wiphy_name(priv->hw->wiphy));
-       priv->led[IWL_LED_TRG_RADIO].led_on = iwl3945_led_on;
-@@ -333,7 +333,7 @@ int iwl3945_led_register(struct iwl3945_priv *priv)
-       trigger = ieee80211_get_assoc_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_ASSOC].name,
--               sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc",
-+               sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s::assoc",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl3945_led_register_led(priv,
-@@ -350,7 +350,7 @@ int iwl3945_led_register(struct iwl3945_priv *priv)
-       trigger = ieee80211_get_rx_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_RX].name,
--               sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX",
-+               sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s::RX",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl3945_led_register_led(priv,
-@@ -366,7 +366,7 @@ int iwl3945_led_register(struct iwl3945_priv *priv)
-       trigger = ieee80211_get_tx_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_TX].name,
--               sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX",
-+               sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s::TX",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl3945_led_register_led(priv,
-
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-led_device_naming.diff b/src/patches/suse-2.6.27.31/patches.fixes/iwlwifi-fix-iwl-led_device_naming.diff
deleted file mode 100644 (file)
index 5d7d18d..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-From: Danny Kukawka <dkukawka@suse.de>
-Subject: iwlwifi: fix led naming
-    
-Fixed led device naming for the iwl driver. Due to the
-documentation of the led subsystem/class the naming should be
-"devicename:colour:function" while not applying sections
-should be left blank.
-    
-This should lead to e.g. "iwl-phy0::RX" instead of "iwl-phy0:RX".
-
-Signed-off-by: Danny Kukawka <dkukawka@suse.de>
-Acked-by: Reinette Chatre <reinette.chatre@intel.com>
---
- drivers/net/wireless/iwlwifi/iwl-led.c |    8 ++++----
- 1 file changed, 4 insertions(+), 4 deletions(-)
-
---- a/drivers/net/wireless/iwlwifi/iwl-led.c
-+++ b/drivers/net/wireless/iwlwifi/iwl-led.c
-@@ -353,7 +353,7 @@ int iwl_leds_register(struct iwl_priv *p
-       trigger = ieee80211_get_radio_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_RADIO].name,
--               sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s:radio",
-+               sizeof(priv->led[IWL_LED_TRG_RADIO].name), "iwl-%s::radio",
-                wiphy_name(priv->hw->wiphy));
-       priv->led[IWL_LED_TRG_RADIO].led_on = iwl4965_led_on_reg;
-@@ -367,7 +367,7 @@ int iwl_leds_register(struct iwl_priv *p
-       trigger = ieee80211_get_assoc_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_ASSOC].name,
--               sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s:assoc",
-+               sizeof(priv->led[IWL_LED_TRG_ASSOC].name), "iwl-%s::assoc",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_ASSOC],
-@@ -383,7 +383,7 @@ int iwl_leds_register(struct iwl_priv *p
-       trigger = ieee80211_get_rx_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_RX].name,
--               sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s:RX",
-+               sizeof(priv->led[IWL_LED_TRG_RX].name), "iwl-%s::RX",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_RX],
-@@ -398,7 +398,7 @@ int iwl_leds_register(struct iwl_priv *p
-       trigger = ieee80211_get_tx_led_name(priv->hw);
-       snprintf(priv->led[IWL_LED_TRG_TX].name,
--               sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s:TX",
-+               sizeof(priv->led[IWL_LED_TRG_TX].name), "iwl-%s::TX",
-                wiphy_name(priv->hw->wiphy));
-       ret = iwl_leds_register_led(priv, &priv->led[IWL_LED_TRG_TX],
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/kdb-kdump.diff b/src/patches/suse-2.6.27.31/patches.fixes/kdb-kdump.diff
deleted file mode 100644 (file)
index 088f13a..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-From: Jay Lan <jlan@sgi.com>
-Subject: Fix CONFIG_KDB_KDUMP on xSeries
-Patch-mainline: not yet
-References: bnc#436454
-
-This patch fixes a problem that the capture kernel crashes with various
-backtraces after the machine has been crashed (both sysrq-trigger and panic()).
-Machines were that problem could reproduced at SUSE were molitor.suse.de and
-korner.suse.de.
-
-KDB was turned off in that scenarios.
-
-That patch succeeds in following scenarios:
-
-  a) kdb=0
-     modprobe crasher call_panic
-
-  b) kdb=1/0
-     echo c > /proc/sysrq-trigger
-
-  b) kdb=1
-     ESC KDB
-     kdb> kdump
-
-But it fails in:
-
-  kdb=1
-  modprobe crasher call_panic
-
-That has to be investigated. But I think that's unrelated to that patch,
-and it's no regression.
-
-
-Signed-off-by: Jay Lan <jlan@sgi.com>
-Signed-off-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kdb/kdba_support.c |    4 +---
- 1 file changed, 1 insertion(+), 3 deletions(-)
-
---- a/arch/x86/kdb/kdba_support.c
-+++ b/arch/x86/kdb/kdba_support.c
-@@ -35,8 +35,6 @@ void kdba_kdump_prepare(struct pt_regs *
-       if (regs == NULL)
-               regs = &r;
--      machine_crash_shutdown_begin();
--
-       for (i = 1; i < NR_CPUS; ++i) {
-               if (!cpu_online(i))
-                       continue;
-@@ -44,7 +42,7 @@ void kdba_kdump_prepare(struct pt_regs *
-               KDB_STATE_SET_CPU(KEXEC, i);
-       }
--      machine_crash_shutdown_end(regs);
-+      machine_crash_shutdown(regs);
- }
- extern void halt_current_cpu(struct pt_regs *);
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/kdb-oops-panic.diff b/src/patches/suse-2.6.27.31/patches.fixes/kdb-oops-panic.diff
deleted file mode 100644 (file)
index 734acfc..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-From: Bernhard Walle <bwalle@suse.de>
-Subject: [PATCH] Fix NULL pointer dereference when regs == NULL
-References: bnc#439007
-
-This patch fixes following problem:
-
-When panic() in user context, for example by
-
-    # modprobe crasher call_panic
-
-then KDB crashed in kdba_getpc() once because regs was not checked for being
-NULL:
-
-    Entering kdb (current=0xffff880036c747c0, pid 4420) on processor 1 Oops: <NULL>
-    BUG: unable to handle kernel NULL pointer dereference at 0000000000000080
-    IP: [<ffffffff80415ee2>] kdba_getpc+0x0/0x8
-    PGD 379f4067 PUD 39997067 PMD 0 
-    Oops: 0000 [1] SMP 
-    last sysfs file: /sys/devices/pci0000:00/0000:00:1c.5/0000:06:00.0/irq
-    kdb: Debugger re-entered on cpu 1, new reason = 5
-         Not executing a kdb command
-         No longjmp available for recovery
-         Cannot recover, allowing event to proceed
-
-Even if that has ieen fixed, then kdba_dumpregs() crashed because
-the return value of kdba_getpc() was assumed to be non-NULL.
-
-This patch simply ports the error handling from its 32 bit counterpart
-implementation. After applying that fix, the test mentioned above succeeds:
-
-    Entering kdb (current=0xffff8800355fc480, pid 7564) on processor 1 Oops: <NULL>
-    due to oops @ 0x0
-    kdba_dumpregs: pt_regs not available, use bt* or pid to select a different task
-    [1]kdb> 
-
-
-Signed-off-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kdb/kdbasupport_64.c |    7 ++++++-
- 1 file changed, 6 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kdb/kdbasupport_64.c
-+++ b/arch/x86/kdb/kdbasupport_64.c
-@@ -501,6 +501,11 @@ kdba_dumpregs(struct pt_regs *regs,
-               struct kdbregs *rlp;
-               kdb_machreg_t contents;
-+              if (!regs) {
-+                      kdb_printf("%s: pt_regs not available, use bt* or pid to select a different task\n", __FUNCTION__);
-+                      return KDB_BADREG;
-+              }
-+
-               for (i=0, rlp=kdbreglist; i<nkdbreglist; i++,rlp++) {
-                       kdb_printf("%8s = ", rlp->reg_name);
-                       kdba_getregcontents(rlp->reg_name, regs, &contents);
-@@ -554,7 +559,7 @@ EXPORT_SYMBOL(kdba_dumpregs);
- kdb_machreg_t
- kdba_getpc(struct pt_regs *regs)
- {
--      return regs->ip;
-+      return regs ? regs->ip : 0;
- }
- int
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/kdb-read-CR.diff b/src/patches/suse-2.6.27.31/patches.fixes/kdb-read-CR.diff
deleted file mode 100644 (file)
index 8ed6b60..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-From: Jay Lan <jlan@sgi.com>
-Subject: [PATCH] Support '\n' in KDB
-Patch-mainline: 2.6.28-rc3-*-1 patchset
-References: bnc#442808
-
-Cliff tried to use KDB on medusa to verify a UV/KDB compatibility fix and found
-KDB needs to support '\n' in kdb_read() for medusa.
-
-I have integrated his patch to kdb mainline at 2.6.28-rc3-*-1 patchset.
-
-
-Signed-off-by: Bernhard Walle <bwalle@suse.de>
-
----
- kdb/kdb_io.c |    3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
---- a/kdb/kdb_io.c
-+++ b/kdb/kdb_io.c
-@@ -246,7 +246,8 @@ kdb_read(char *buffer, size_t bufsize)
-                               *cp = tmp;
-                       }
-                       break;
--              case 13: /* enter */
-+              case 13: /* enter \r */
-+              case 10: /* enter \n */
-                       *lastchar++ = '\n';
-                       *lastchar++ = '\0';
-                       kdb_printf("\n");
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/kdump-x86-sparsemem.diff b/src/patches/suse-2.6.27.31/patches.fixes/kdump-x86-sparsemem.diff
deleted file mode 100644 (file)
index cb784bb..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-From e7706fc691513b0f06adb3de3d6ac04293180146 Mon Sep 17 00:00:00 2001
-From: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
-Date: Mon, 20 Oct 2008 13:51:52 +0900
-Subject: [PATCH] x86, kdump: fix invalid access on i386 sparsemem
-References: bnc#440525
-
-Impact: fix kdump crash on 32-bit sparsemem kernels
-
-Since linux-2.6.27, kdump has failed on i386 sparsemem kernel.
-1st-kernel gets a panic just before switching to 2nd-kernel.
-
-The cause is that a kernel accesses invalid mem_section by
-page_to_pfn(image->swap_page) at machine_kexec().
-image->swap_page is allocated if kexec for hibernation, but
-it is not allocated if kdump. So if kdump, a kernel should
-not access the mem_section corresponding to image->swap_page.
-
-The attached patch fixes this invalid access.
-
-Signed-off-by: Ken'ichi Ohmichi <oomichi@mxs.nes.nec.co.jp>
-Cc: kexec-ml <kexec@lists.infradead.org>
-Cc: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Ingo Molnar <mingo@elte.hu>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
-diff --git a/arch/x86/kernel/machine_kexec_32.c b/arch/x86/kernel/machine_kexec_32.c
-index 0732adb..7a38574 100644
---- a/arch/x86/kernel/machine_kexec_32.c
-+++ b/arch/x86/kernel/machine_kexec_32.c
-@@ -162,7 +162,10 @@ void machine_kexec(struct kimage *image)
-       page_list[VA_PTE_0] = (unsigned long)kexec_pte0;
-       page_list[PA_PTE_1] = __pa(kexec_pte1);
-       page_list[VA_PTE_1] = (unsigned long)kexec_pte1;
--      page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page) << PAGE_SHIFT);
-+
-+      if (image->type == KEXEC_TYPE_DEFAULT)
-+              page_list[PA_SWAP_PAGE] = (page_to_pfn(image->swap_page)
-+                                              << PAGE_SHIFT);
-       /* The segment registers are funny things, they have both a
-        * visible and an invisible part.  Whenever the visible part is
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/kvm-vmx-dont-allow-uninhibited-access-to-EFER-on-i386 b/src/patches/suse-2.6.27.31/patches.fixes/kvm-vmx-dont-allow-uninhibited-access-to-EFER-on-i386
deleted file mode 100644 (file)
index 943a1ba..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-From: Avi Kivity <avi@redhat.com>
-Date: Mon, 23 Mar 2009 22:13:44 +0200
-Subject: KVM: VMX: Don't allow uninhibited access to EFER on i386
-Git-commit: 16175a796d061833aacfbd9672235f2d2725df65
-Patch-mainline: 2.6.30-rc1
-References: bnc#492760
-
-vmx_set_msr() does not allow i386 guests to touch EFER, but they can still
-do so through the default: label in the switch.  If they set EFER_LME, they
-can oops the host.
-
-Fix by having EFER access through the normal channel (which will check for
-EFER_LME) even on i386.
-
-Reported-and-tested-by: Benjamin Gilbert <bgilbert@cs.cmu.edu>
-Cc: stable@kernel.org
-Signed-off-by: Avi Kivity <avi@redhat.com>
-Acked-by: Jeff Mahoney <jeffm@suse.com>
----
-
- arch/x86/kvm/vmx.c |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/arch/x86/kvm/vmx.c
-+++ b/arch/x86/kvm/vmx.c
-@@ -898,11 +898,11 @@ static int vmx_set_msr(struct kvm_vcpu *
-       int ret = 0;
-       switch (msr_index) {
--#ifdef CONFIG_X86_64
-       case MSR_EFER:
-               vmx_load_host_state(vmx);
-               ret = kvm_set_msr_common(vcpu, msr_index, data);
-               break;
-+#ifdef CONFIG_X86_64
-       case MSR_FS_BASE:
-               vmcs_writel(GUEST_FS_BASE, data);
-               break;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/make-note_interrupt-fast.diff b/src/patches/suse-2.6.27.31/patches.fixes/make-note_interrupt-fast.diff
deleted file mode 100644 (file)
index 620057d..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-From: Bernhard Walle <bwalle@suse.de>
-Subject: [PATCH] Fix performance regression on large IA64 systems
-References: bnc #469589
-
-This patch tries to address a performance regression discovered by SGI.
-
-Patch b60c1f6ffd88850079ae419aa933ab0eddbd5535 removes the call
-to note_interrupt() in __do_IRQ(). Patch d85a60d85ea5b7c597508c1510c88e657773d378
-adds it again. Because it's needed for irqpoll.
-
-That patch now introduces a new parameter 'only_fixup' for note_interrupt().
-This parameter determines two cases:
-
-  TRUE  => The function should be only executed when irqfixup is set.
-           Either 'irqpoll' or 'irqfixup' directly set that.
-
-  FALSE => Just the behaviour as note_interrupt() always had.
-
-Now the patch converts all calls of note_interrupt() to only_fixup=FALSE,
-except the call that has been removed by b60c1f6ffd88850079ae419aa933ab0eddbd5535.
-So that call is always done, but the body is only executed when either
-'irqpoll' or 'irqfixup' are specified.
-
-This patch is not meant for mainline inclusion in the first run!
-
-
-Signed-off-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/arm/mach-ns9xxx/irq.c              |    2 +-
- arch/powerpc/platforms/cell/interrupt.c |    2 +-
- include/linux/irq.h                     |    2 +-
- kernel/irq/chip.c                       |   10 +++++-----
- kernel/irq/handle.c                     |    4 ++--
- kernel/irq/spurious.c                   |   13 ++++++++++++-
- 6 files changed, 22 insertions(+), 11 deletions(-)
-
---- a/arch/arm/mach-ns9xxx/irq.c
-+++ b/arch/arm/mach-ns9xxx/irq.c
-@@ -86,7 +86,7 @@ static void handle_prio_irq(unsigned int
-       /* XXX: There is no direct way to access noirqdebug, so check
-        * unconditionally for spurious irqs...
-        * Maybe this function should go to kernel/irq/chip.c? */
--      note_interrupt(irq, desc, action_ret);
-+      note_interrupt(irq, desc, action_ret, 0);
-       spin_lock(&desc->lock);
-       desc->status &= ~IRQ_INPROGRESS;
---- a/arch/powerpc/platforms/cell/interrupt.c
-+++ b/arch/powerpc/platforms/cell/interrupt.c
-@@ -270,7 +270,7 @@ static void handle_iic_irq(unsigned int
-               spin_unlock(&desc->lock);
-               action_ret = handle_IRQ_event(irq, action);
-               if (!noirqdebug)
--                      note_interrupt(irq, desc, action_ret);
-+                      note_interrupt(irq, desc, action_ret, 0);
-               spin_lock(&desc->lock);
-       } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
---- a/include/linux/irq.h
-+++ b/include/linux/irq.h
-@@ -296,7 +296,7 @@ static inline void generic_handle_irq(un
- /* Handling of unhandled and spurious interrupts: */
- extern void note_interrupt(unsigned int irq, struct irq_desc *desc,
--                         int action_ret);
-+                         int action_ret, int only_fixup);
- /* Resending of interrupts :*/
- void check_irq_resend(struct irq_desc *desc, unsigned int irq);
---- a/kernel/irq/chip.c
-+++ b/kernel/irq/chip.c
-@@ -324,7 +324,7 @@ handle_simple_irq(unsigned int irq, stru
-       action_ret = handle_IRQ_event(irq, action);
-       if (!noirqdebug)
--              note_interrupt(irq, desc, action_ret);
-+              note_interrupt(irq, desc, action_ret, 0);
-       spin_lock(&desc->lock);
-       desc->status &= ~IRQ_INPROGRESS;
-@@ -370,7 +370,7 @@ handle_level_irq(unsigned int irq, struc
-       action_ret = handle_IRQ_event(irq, action);
-       if (!noirqdebug)
--              note_interrupt(irq, desc, action_ret);
-+              note_interrupt(irq, desc, action_ret, 0);
-       spin_lock(&desc->lock);
-       desc->status &= ~IRQ_INPROGRESS;
-@@ -423,7 +423,7 @@ handle_fasteoi_irq(unsigned int irq, str
-       action_ret = handle_IRQ_event(irq, action);
-       if (!noirqdebug)
--              note_interrupt(irq, desc, action_ret);
-+              note_interrupt(irq, desc, action_ret, 0);
-       spin_lock(&desc->lock);
-       desc->status &= ~IRQ_INPROGRESS;
-@@ -503,7 +503,7 @@ handle_edge_irq(unsigned int irq, struct
-               spin_unlock(&desc->lock);
-               action_ret = handle_IRQ_event(irq, action);
-               if (!noirqdebug)
--                      note_interrupt(irq, desc, action_ret);
-+                      note_interrupt(irq, desc, action_ret, 0);
-               spin_lock(&desc->lock);
-       } while ((desc->status & (IRQ_PENDING | IRQ_DISABLED)) == IRQ_PENDING);
-@@ -532,7 +532,7 @@ handle_percpu_irq(unsigned int irq, stru
-       action_ret = handle_IRQ_event(irq, desc->action);
-       if (!noirqdebug)
--              note_interrupt(irq, desc, action_ret);
-+              note_interrupt(irq, desc, action_ret, 0);
-       if (desc->chip->eoi)
-               desc->chip->eoi(irq);
---- a/kernel/irq/handle.c
-+++ b/kernel/irq/handle.c
-@@ -187,7 +187,7 @@ unsigned int __do_IRQ(unsigned int irq)
-               if (likely(!(desc->status & IRQ_DISABLED))) {
-                       action_ret = handle_IRQ_event(irq, desc->action);
-                       if (!noirqdebug)
--                              note_interrupt(irq, desc, action_ret);
-+                              note_interrupt(irq, desc, action_ret, 1);
-               }
-               desc->chip->end(irq);
-               return 1;
-@@ -241,7 +241,7 @@ unsigned int __do_IRQ(unsigned int irq)
-               action_ret = handle_IRQ_event(irq, action);
-               if (!noirqdebug)
--                      note_interrupt(irq, desc, action_ret);
-+                      note_interrupt(irq, desc, action_ret, 0);
-               spin_lock(&desc->lock);
-               if (likely(!(desc->status & IRQ_PENDING)))
---- a/kernel/irq/spurious.c
-+++ b/kernel/irq/spurious.c
-@@ -171,8 +171,19 @@ static inline int try_misrouted_irq(unsi
- }
- void note_interrupt(unsigned int irq, struct irq_desc *desc,
--                  irqreturn_t action_ret)
-+                  irqreturn_t action_ret, int only_fixup)
- {
-+      /*
-+       * The parameter "only_fixup" means that the function should be only
-+       * executed if this parameter is set to 1 and the function should
-+       * not be executed if the parameter is 0.
-+       *
-+       * We need that because irqfixup is static to the function but
-+       * this function is called from kernel/irq/handle.c.
-+       */
-+      if (only_fixup && irqfixup == 0)
-+              return;
-+
-       if (unlikely(action_ret != IRQ_HANDLED)) {
-               /*
-                * If we are seeing only the odd spurious IRQ caused by
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/nfs-acl-caching.diff b/src/patches/suse-2.6.27.31/patches.fixes/nfs-acl-caching.diff
deleted file mode 100644 (file)
index 3121700..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: "No acl" entry put in client-side acl cache instead of "not cached"
-References: 171059
-
-When the acl of a file is not cached and only the default acl of that
-file is requested, a NULL "no acl" entry is put in the client-side acl
-cache of nfs instead of ERR_PTR(-EAGAIN) "not cached".
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
-Index: linux-2.6.16/fs/nfs/nfs3acl.c
-===================================================================
---- linux-2.6.16.orig/fs/nfs/nfs3acl.c
-+++ linux-2.6.16/fs/nfs/nfs3acl.c
-@@ -172,8 +172,10 @@ static void nfs3_cache_acls(struct inode
-               inode->i_ino, acl, dfacl);
-       spin_lock(&inode->i_lock);
-       __nfs3_forget_cached_acls(NFS_I(inode));
--      nfsi->acl_access = posix_acl_dup(acl);
--      nfsi->acl_default = posix_acl_dup(dfacl);
-+      if (!IS_ERR(acl))
-+              nfsi->acl_access = posix_acl_dup(acl);
-+      if (!IS_ERR(dfacl))
-+              nfsi->acl_default = posix_acl_dup(dfacl);
-       spin_unlock(&inode->i_lock);
- }
-@@ -250,7 +252,9 @@ struct posix_acl *nfs3_proc_getacl(struc
-                       res.acl_access = NULL;
-               }
-       }
--      nfs3_cache_acls(inode, res.acl_access, res.acl_default);
-+      nfs3_cache_acls(inode,
-+              (res.mask & NFS_ACL)   ? res.acl_access  : ERR_PTR(-EINVAL),
-+              (res.mask & NFS_DFACL) ? res.acl_default : ERR_PTR(-EINVAL));
-       switch(type) {
-               case ACL_TYPE_ACCESS:
-@@ -321,6 +325,7 @@ static int nfs3_proc_setacls(struct inod
-       switch (status) {
-               case 0:
-                       status = nfs_refresh_inode(inode, &fattr);
-+                      nfs3_cache_acls(inode, acl, dfacl);
-                       break;
-               case -EPFNOSUPPORT:
-               case -EPROTONOSUPPORT:
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/ocfs2-initialize-the-cluster-we-re-writing-to.patch b/src/patches/suse-2.6.27.31/patches.fixes/ocfs2-initialize-the-cluster-we-re-writing-to.patch
deleted file mode 100644 (file)
index 4046ce6..0000000
+++ /dev/null
@@ -1,193 +0,0 @@
-From e7432675f8ca868a4af365759a8d4c3779a3d922 Mon Sep 17 00:00:00 2001
-From: Sunil Mushran <sunil.mushran@oracle.com>
-Date: Thu, 6 Aug 2009 16:12:58 -0700
-Subject: ocfs2: Initialize the cluster we're writing to in a non-sparse extend
-References: bnc#501563
-
-In a non-sparse extend, we correctly allocate (and zero) the clusters between
-the old_i_size and pos, but we don't zero the portions of the cluster we're
-writing to outside of pos<->len.
-
-It handles clustersize > pagesize and blocksize < pagesize.
-
-[Cleaned up by Joel Becker.]
-
-Signed-off-by: Sunil Mushran <sunil.mushran@oracle.com>
-Signed-off-by: Joel Becker <joel.becker@oracle.com>
-Signed-off-by: Mark Fasheh <mfasheh@suse.com>
----
- fs/ocfs2/aops.c |   66 +++++++++++++++++++++++++++++++++++++++---------------
- 1 files changed, 47 insertions(+), 19 deletions(-)
-
-Index: linux-2.6.27-ocfs2-update-sle11/fs/ocfs2/aops.c
-===================================================================
---- linux-2.6.27-ocfs2-update-sle11.orig/fs/ocfs2/aops.c
-+++ linux-2.6.27-ocfs2-update-sle11/fs/ocfs2/aops.c
-@@ -909,18 +909,17 @@ struct ocfs2_write_cluster_desc {
-        */
-       unsigned        c_new;
-       unsigned        c_unwritten;
-+      unsigned        c_needs_zero;
- };
--static inline int ocfs2_should_zero_cluster(struct ocfs2_write_cluster_desc *d)
--{
--      return d->c_new || d->c_unwritten;
--}
--
- struct ocfs2_write_ctxt {
-       /* Logical cluster position / len of write */
-       u32                             w_cpos;
-       u32                             w_clen;
-+      /* First cluster allocated in a nonsparse extend */
-+      u32                             w_first_new_cpos;
-+
-       struct ocfs2_write_cluster_desc w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE];
-       /*
-@@ -998,6 +997,7 @@ static int ocfs2_alloc_write_ctxt(struct
-               return -ENOMEM;
-       wc->w_cpos = pos >> osb->s_clustersize_bits;
-+      wc->w_first_new_cpos = UINT_MAX;
-       cend = (pos + len - 1) >> osb->s_clustersize_bits;
-       wc->w_clen = cend - wc->w_cpos + 1;
-       get_bh(di_bh);
-@@ -1239,20 +1239,18 @@ out:
-  */
- static int ocfs2_write_cluster(struct address_space *mapping,
-                              u32 phys, unsigned int unwritten,
-+                             unsigned int should_zero,
-                              struct ocfs2_alloc_context *data_ac,
-                              struct ocfs2_alloc_context *meta_ac,
-                              struct ocfs2_write_ctxt *wc, u32 cpos,
-                              loff_t user_pos, unsigned user_len)
- {
--      int ret, i, new, should_zero = 0;
-+      int ret, i, new;
-       u64 v_blkno, p_blkno;
-       struct inode *inode = mapping->host;
-       struct ocfs2_extent_tree et;
-       new = phys == 0 ? 1 : 0;
--      if (new || unwritten)
--              should_zero = 1;
--
-       if (new) {
-               u32 tmp_pos;
-@@ -1363,7 +1361,9 @@ static int ocfs2_write_cluster_by_desc(s
-                       local_len = osb->s_clustersize - cluster_off;
-               ret = ocfs2_write_cluster(mapping, desc->c_phys,
--                                        desc->c_unwritten, data_ac, meta_ac,
-+                                        desc->c_unwritten,
-+                                        desc->c_needs_zero,
-+                                        data_ac, meta_ac,
-                                         wc, desc->c_cpos, pos, local_len);
-               if (ret) {
-                       mlog_errno(ret);
-@@ -1413,14 +1413,14 @@ static void ocfs2_set_target_boundaries(
-                * newly allocated cluster.
-                */
-               desc = &wc->w_desc[0];
--              if (ocfs2_should_zero_cluster(desc))
-+              if (desc->c_needs_zero)
-                       ocfs2_figure_cluster_boundaries(osb,
-                                                       desc->c_cpos,
-                                                       &wc->w_target_from,
-                                                       NULL);
-               desc = &wc->w_desc[wc->w_clen - 1];
--              if (ocfs2_should_zero_cluster(desc))
-+              if (desc->c_needs_zero)
-                       ocfs2_figure_cluster_boundaries(osb,
-                                                       desc->c_cpos,
-                                                       NULL,
-@@ -1488,13 +1488,28 @@ static int ocfs2_populate_write_desc(str
-                       phys++;
-               }
-+              /*
-+               * If w_first_new_cpos is < UINT_MAX, we have a non-sparse
-+               * file that got extended.  w_first_new_cpos tells us
-+               * where the newly allocated clusters are so we can
-+               * zero them.
-+               */
-+              if (desc->c_cpos >= wc->w_first_new_cpos) {
-+                      BUG_ON(phys == 0);
-+                      desc->c_needs_zero = 1;
-+              }
-+
-               desc->c_phys = phys;
-               if (phys == 0) {
-                       desc->c_new = 1;
-+                      desc->c_needs_zero = 1;
-                       *clusters_to_alloc = *clusters_to_alloc + 1;
-               }
--              if (ext_flags & OCFS2_EXT_UNWRITTEN)
-+
-+              if (ext_flags & OCFS2_EXT_UNWRITTEN) {
-                       desc->c_unwritten = 1;
-+                      desc->c_needs_zero = 1;
-+              }
-               num_clusters--;
-       }
-@@ -1654,10 +1669,13 @@ static int ocfs2_expand_nonsparse_inode(
-       if (newsize <= i_size_read(inode))
-               return 0;
--      ret = ocfs2_extend_no_holes(inode, newsize, newsize - len);
-+      ret = ocfs2_extend_no_holes(inode, newsize, pos);
-       if (ret)
-               mlog_errno(ret);
-+      wc->w_first_new_cpos =
-+              ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode));
-+
-       return ret;
- }
-@@ -1666,7 +1684,7 @@ int ocfs2_write_begin_nolock(struct addr
-                            struct page **pagep, void **fsdata,
-                            struct buffer_head *di_bh, struct page *mmap_page)
- {
--      int ret, credits = OCFS2_INODE_UPDATE_CREDITS;
-+      int ret, cluster_of_pages, credits = OCFS2_INODE_UPDATE_CREDITS;
-       unsigned int clusters_to_alloc, extents_to_split;
-       struct ocfs2_write_ctxt *wc;
-       struct inode *inode = mapping->host;
-@@ -1744,8 +1762,19 @@ int ocfs2_write_begin_nolock(struct addr
-       }
--      ocfs2_set_target_boundaries(osb, wc, pos, len,
--                                  clusters_to_alloc + extents_to_split);
-+      /*
-+       * We have to zero sparse allocated clusters, unwritten extent clusters,
-+       * and non-sparse clusters we just extended.  For non-sparse writes,
-+       * we know zeros will only be needed in the first and/or last cluster.
-+       */
-+      if (clusters_to_alloc || extents_to_split ||
-+          wc->w_desc[0].c_needs_zero ||
-+          wc->w_desc[wc->w_clen - 1].c_needs_zero)
-+              cluster_of_pages = 1;
-+      else
-+              cluster_of_pages = 0;
-+
-+      ocfs2_set_target_boundaries(osb, wc, pos, len, cluster_of_pages);
-       handle = ocfs2_start_trans(osb, credits);
-       if (IS_ERR(handle)) {
-@@ -1778,8 +1807,7 @@ int ocfs2_write_begin_nolock(struct addr
-        * extent.
-        */
-       ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos,
--                                       clusters_to_alloc + extents_to_split,
--                                       mmap_page);
-+                                       cluster_of_pages, mmap_page);
-       if (ret) {
-               mlog_errno(ret);
-               goto out_quota;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/proc-scsi-scsi-fix.diff b/src/patches/suse-2.6.27.31/patches.fixes/proc-scsi-scsi-fix.diff
deleted file mode 100644 (file)
index 45b2e09..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH] scsi: iterate over devices individually for /proc/scsi/scsi
-References: 263731
-Patch-mainline: Probably never, hch wants to kill /proc/scsi/scsi anyway.
-
- On systems with very large numbers (> 1600 or so) of SCSI devices,
- cat /proc/scsi/scsi ends up failing with -ENOMEM. This is due to
- the show routine simply iterating over all of the devices with
- bus_for_each_dev(), and trying to dump all of them into the buffer
- at the same time. On my test system (using scsi_debug with 4064 devices),
- the output ends up being ~ 632k, far more than kmalloc will typically allow.
-
- This patch defines its own seq_file opreations to iterate over the scsi
- devices.The result is that each show() operation only dumps ~ 180 bytes
- into the buffer at a time so we don't run out of memory.
-
- If the "Attached devices" header isn't required, we can dump the
- sfile->private bit completely.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- drivers/scsi/scsi_proc.c |   58 ++++++++++++++++++++++++++++++++++++++++++-----
- 1 file changed, 52 insertions(+), 6 deletions(-)
-
---- a/drivers/scsi/scsi_proc.c
-+++ b/drivers/scsi/scsi_proc.c
-@@ -389,13 +389,59 @@ static ssize_t proc_scsi_write(struct fi
-  * @s: output goes here
-  * @p: not used
-  */
--static int proc_scsi_show(struct seq_file *s, void *p)
-+static int always_match(struct device *dev, void *data)
- {
--      seq_printf(s, "Attached devices:\n");
--      bus_for_each_dev(&scsi_bus_type, NULL, s, proc_print_scsidevice);
--      return 0;
-+      return 1;
- }
-+static inline struct device *next_scsi_device(struct device *start)
-+{
-+      struct device *next = bus_find_device(&scsi_bus_type, start, NULL,
-+                                            always_match);
-+      put_device(start);
-+      return next;
-+}
-+
-+static void *scsi_seq_start(struct seq_file *sfile, loff_t *pos)
-+{
-+      struct device *dev = NULL;
-+      loff_t n = *pos;
-+
-+      while ((dev = next_scsi_device(dev))) {
-+              if (!n--)
-+                      break;
-+              sfile->private++;
-+      }
-+      return dev;
-+}
-+
-+static void *scsi_seq_next(struct seq_file *sfile, void *v, loff_t *pos)
-+{
-+      (*pos)++;
-+      sfile->private++;
-+      return next_scsi_device(v);
-+}
-+
-+static void scsi_seq_stop(struct seq_file *sfile, void *v)
-+{
-+      put_device(v);
-+}
-+
-+static int scsi_seq_show(struct seq_file *sfile, void *dev)
-+{
-+      if (!sfile->private)
-+              seq_puts(sfile, "Attached devices:\n");
-+
-+      return proc_print_scsidevice(dev, sfile);
-+}
-+
-+static struct seq_operations scsi_seq_ops = {
-+      .start  = scsi_seq_start,
-+      .next   = scsi_seq_next,
-+      .stop   = scsi_seq_stop,
-+      .show   = scsi_seq_show
-+};
-+
- /**
-  * proc_scsi_open - glue function
-  * @inode: not used
-@@ -409,7 +455,7 @@ static int proc_scsi_open(struct inode *
-        * We don't really need this for the write case but it doesn't
-        * harm either.
-        */
--      return single_open(file, proc_scsi_show, NULL);
-+      return seq_open(file, &scsi_seq_ops);
- }
- static const struct file_operations proc_scsi_operations = {
-@@ -418,7 +464,7 @@ static const struct file_operations proc
-       .read           = seq_read,
-       .write          = proc_scsi_write,
-       .llseek         = seq_lseek,
--      .release        = single_release,
-+      .release        = seq_release,
- };
- /**
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/rt2x00-fix-led_device_naming.diff b/src/patches/suse-2.6.27.31/patches.fixes/rt2x00-fix-led_device_naming.diff
deleted file mode 100644 (file)
index cfabe43..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-From: Danny Kukawka <dkukawka@suse.de>
-Subject: rt2x00: fix led naming
-
-Fixed led device naming for the rt2x00 driver. Due to the
-documentation of the led subsystem/class the naming should be
-"devicename:colour:function" while not applying sections
-should be left blank.
-    
-This should lead to e.g. "%s::radio" instead of "%s:radio".
-
-Signed-off-by: Danny Kukawka <dkukawka@suse.de>
---
- drivers/net/wireless/rt2x00/rt2x00leds.c |    6 +++---
- 1 file changed, 3 insertions(+), 3 deletions(-)
-
---- a/drivers/net/wireless/rt2x00/rt2x00leds.c
-+++ b/drivers/net/wireless/rt2x00/rt2x00leds.c
-@@ -149,7 +149,7 @@ void rt2x00leds_register(struct rt2x00_d
-                rt2x00dev->ops->name, wiphy_name(rt2x00dev->hw->wiphy));
-       if (rt2x00dev->led_radio.flags & LED_INITIALIZED) {
--              snprintf(name, sizeof(name), "%s:radio", dev_name);
-+              snprintf(name, sizeof(name), "%s::radio", dev_name);
-               retval = rt2x00leds_register_led(rt2x00dev,
-                                                &rt2x00dev->led_radio,
-@@ -159,7 +159,7 @@ void rt2x00leds_register(struct rt2x00_d
-       }
-       if (rt2x00dev->led_assoc.flags & LED_INITIALIZED) {
--              snprintf(name, sizeof(name), "%s:assoc", dev_name);
-+              snprintf(name, sizeof(name), "%s::assoc", dev_name);
-               retval = rt2x00leds_register_led(rt2x00dev,
-                                                &rt2x00dev->led_assoc,
-@@ -169,7 +169,7 @@ void rt2x00leds_register(struct rt2x00_d
-       }
-       if (rt2x00dev->led_qual.flags & LED_INITIALIZED) {
--              snprintf(name, sizeof(name), "%s:quality", dev_name);
-+              snprintf(name, sizeof(name), "%s::quality", dev_name);
-               retval = rt2x00leds_register_led(rt2x00dev,
-                                                &rt2x00dev->led_qual,
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/sd_liberal_28_sense_invalid.diff b/src/patches/suse-2.6.27.31/patches.fixes/sd_liberal_28_sense_invalid.diff
deleted file mode 100644 (file)
index 00ec3e9..0000000
+++ /dev/null
@@ -1,27 +0,0 @@
-From: Oliver Neukum <oneukum@suse.de>
-Subject: fix medium presence misdetection in usb storage device 
-References: bnc#362850
-
-From reading the SCSI spec it seems that having the valid bit 0 (0x70
-checked in scsi_sense_valid) should does not invalidate the ASC or ASQ.
-[See page 37 of spc4r02.pdf].  It should only invalidate the INFORMATION
-field. Therefore remove the sense_valid check from the USB quirk.
-
-Signed-off-by: Brandon Philips <bphilips@suse.de>
-
----
- drivers/scsi/sd.c |    3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
---- a/drivers/scsi/sd.c
-+++ b/drivers/scsi/sd.c
-@@ -1208,8 +1208,7 @@ sd_spinup_disk(struct scsi_disk *sdkp)
-                * Yes, this sense key/ASC combination shouldn't
-                * occur here.  It's characteristic of these devices.
-                */
--              } else if (sense_valid &&
--                              sshdr.sense_key == UNIT_ATTENTION &&
-+              } else if (sshdr.sense_key == UNIT_ATTENTION &&
-                               sshdr.asc == 0x28) {
-                       if (!spintime) {
-                               spintime_expire = jiffies + 5 * HZ;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/taskstats-alignment b/src/patches/suse-2.6.27.31/patches.fixes/taskstats-alignment
deleted file mode 100644 (file)
index cee76a1..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-From: Raymund Will <rw@suse.de>
-Subject: ia64: fill 'struct taskstats' on stack and 'memcpy' result to skb.
-References: bnc#448410
-
-
-Signed-off-by: Raymund Will <rw@suse.de>
-
----
- kernel/taskstats.c           |   13 +++++++++++--
- 1 files changed, 11 insertions(+), 2 deletions(-)
-
---- a/kernel/taskstats.c
-+++ b/kernel/taskstats.c
-@@ -433,6 +433,12 @@ static int taskstats_user_cmd(struct sk_
-       struct taskstats *stats;
-       size_t size;
-       cpumask_t mask;
-+#ifdef CONFIG_IA64
-+      struct taskstats statn;
-+#define statf &statn
-+#else
-+#define statf stats
-+#endif
-       rc = parse(info->attrs[TASKSTATS_CMD_ATTR_REGISTER_CPUMASK], &mask);
-       if (rc < 0)
-@@ -463,7 +469,7 @@ static int taskstats_user_cmd(struct sk_
-               if (!stats)
-                       goto err;
--              rc = fill_pid(pid, NULL, stats);
-+              rc = fill_pid(pid, NULL, statf);
-               if (rc < 0)
-                       goto err;
-       } else if (info->attrs[TASKSTATS_CMD_ATTR_TGID]) {
-@@ -472,12 +478,15 @@ static int taskstats_user_cmd(struct sk_
-               if (!stats)
-                       goto err;
--              rc = fill_tgid(tgid, NULL, stats);
-+              rc = fill_tgid(tgid, NULL, statf);
-               if (rc < 0)
-                       goto err;
-       } else
-               goto err;
-+#ifdef CONFIG_IA64
-+      memcpy(stats, &statn, sizeof(statn));
-+#endif
-       return send_reply(rep_skb, info->snd_pid);
- err:
-       nlmsg_free(rep_skb);
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/udf-last_block_fix.patch b/src/patches/suse-2.6.27.31/patches.fixes/udf-last_block_fix.patch
deleted file mode 100644 (file)
index 9959335..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Jan Kara <jack@suse.cz>
-Subject: udf: Use device size when drive reported bogus number of written blocks
-References: bnc#501663
-Patch-mainline: 2.6.31
-
-Some drives report 0 as the number of written blocks when there are some blocks
-recorded. Use device size in such case so that we can automagically mount such
-media.
-
-Signed-off-by: Jan Kara <jack@suse.cz>
-
-diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/lowlevel.c linux-2.6.27-SLE11_BRANCH-1-udf_last_block_fix/fs/udf/lowlevel.c
---- linux-2.6.27-SLE11_BRANCH/fs/udf/lowlevel.c        2008-10-10 00:13:53.000000000 +0200
-+++ linux-2.6.27-SLE11_BRANCH-1-udf_last_block_fix/fs/udf/lowlevel.c   2009-06-18 12:08:11.000000000 +0200
-@@ -56,7 +56,12 @@ unsigned long udf_get_last_block(struct
-       struct block_device *bdev = sb->s_bdev;
-       unsigned long lblock = 0;
--      if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock))
-+      /*
-+       * ioctl failed or returned obviously bogus value?
-+       * Try using the device size...
-+       */
-+      if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) ||
-+          lblock == 0)
-               lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits;
-       if (lblock)
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_memprotect.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_memprotect.diff
deleted file mode 100644 (file)
index 2ded18f..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: Add UV bios call to change memory protections.
-References: bnc#442455
-
-
-Add UV bios call to change memory protections.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c |    8 ++++++++
- include/asm-x86/uv/bios.h |   10 +++++++++-
- 2 files changed, 17 insertions(+), 1 deletion(-)
-
-Index: linux/arch/x86/kernel/bios_uv.c
-===================================================================
---- linux.orig/arch/x86/kernel/bios_uv.c       2008-11-05 11:12:16.101949483 -0600
-+++ linux/arch/x86/kernel/bios_uv.c    2008-11-05 11:13:15.289411601 -0600
-@@ -134,6 +134,14 @@ uv_bios_mq_watchlist_free(int blade, int
- }
- EXPORT_SYMBOL_GPL(uv_bios_mq_watchlist_free);
-+s64
-+uv_bios_change_memprotect(u64 paddr, u64 len, enum uv_memprotect perms)
-+{
-+      return uv_bios_call_irqsave(UV_BIOS_MEMPROTECT, paddr, len,
-+                                      perms, 0, 0);
-+}
-+EXPORT_SYMBOL_GPL(uv_bios_change_memprotect);
-+
- s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
- {
-       return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
-Index: linux/include/asm-x86/uv/bios.h
-===================================================================
---- linux.orig/include/asm-x86/uv/bios.h       2008-11-05 11:12:16.117951501 -0600
-+++ linux/include/asm-x86/uv/bios.h    2008-11-05 11:13:15.301413114 -0600
-@@ -34,7 +34,8 @@ enum uv_bios_cmd {
-       UV_BIOS_GET_SN_INFO,
-       UV_BIOS_FREQ_BASE,
-       UV_BIOS_WATCHLIST_ALLOC,
--      UV_BIOS_WATCHLIST_FREE
-+      UV_BIOS_WATCHLIST_FREE,
-+      UV_BIOS_MEMPROTECT
- };
- /*
-@@ -82,6 +83,12 @@ union uv_watchlist_u {
-       };
- };
-+enum uv_memprotect {
-+      UV_MEMPROT_RESTRICT_ACCESS,
-+      UV_MEMPROT_ALLOW_AMO,
-+      UV_MEMPROT_ALLOW_RW
-+};
-+
- /*
-  * bios calls have 6 parameters
-  */
-@@ -94,6 +101,7 @@ extern s64 uv_bios_freq_base(u64, u64 *)
- extern int uv_bios_mq_watchlist_alloc(int, void *, unsigned int,
-                                       unsigned long *);
- extern int uv_bios_mq_watchlist_free(int, int);
-+extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);
- extern void uv_bios_init(void);
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_partition.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_partition.diff
deleted file mode 100644 (file)
index 6d42c73..0000000
+++ /dev/null
@@ -1,155 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: x86: Add UV partition call
-References: bnc#442455
-
-Add a bios call to return partitioning related info.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c        |   44 ++++++++++++++++++++++++++++++++++-----
- arch/x86/kernel/genx2apic_uv_x.c |   14 +++++++-----
- include/asm-x86/uv/bios.h        |   22 ++++++++++++++++---
- 3 files changed, 66 insertions(+), 14 deletions(-)
-
---- a/arch/x86/kernel/bios_uv.c
-+++ b/arch/x86/kernel/bios_uv.c
-@@ -23,6 +23,7 @@
- #include <asm/efi.h>
- #include <linux/io.h>
- #include <asm/uv/bios.h>
-+#include <asm/uv/uv_hub.h>
- struct uv_systab uv_systab;
-@@ -65,14 +66,47 @@ s64 uv_bios_call_reentrant(enum uv_bios_
-       return ret;
- }
--long
--x86_bios_freq_base(unsigned long clock_type, unsigned long *ticks_per_second,
--                                      unsigned long *drift_info)
-+
-+long sn_partition_id;
-+EXPORT_SYMBOL_GPL(sn_partition_id);
-+long uv_coherency_id;
-+EXPORT_SYMBOL_GPL(uv_coherency_id);
-+long uv_region_size;
-+EXPORT_SYMBOL_GPL(uv_region_size);
-+int uv_type;
-+
-+
-+s64 uv_bios_get_sn_info(int fc, int *uvtype, long *partid, long *coher,
-+              long *region)
-+{
-+      s64 ret;
-+      u64 v0, v1;
-+      union partition_info_u part;
-+
-+      ret = uv_bios_call_irqsave(UV_BIOS_GET_SN_INFO, fc,
-+                              (u64)(&v0), (u64)(&v1), 0, 0);
-+      if (ret != BIOS_STATUS_SUCCESS)
-+              return ret;
-+
-+      part.val = v0;
-+      if (uvtype)
-+              *uvtype = part.hub_version;
-+      if (partid)
-+              *partid = part.partition_id;
-+      if (coher)
-+              *coher = part.coherence_id;
-+      if (region)
-+              *region = part.region_size;
-+      return ret;
-+}
-+
-+
-+s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
- {
-       return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
--                              (u64)ticks_per_second, 0, 0, 0);
-+                         (u64)ticks_per_second, 0, 0, 0);
- }
--EXPORT_SYMBOL_GPL(x86_bios_freq_base);
-+EXPORT_SYMBOL_GPL(uv_bios_freq_base);
- #ifdef CONFIG_EFI
---- a/arch/x86/kernel/genx2apic_uv_x.c
-+++ b/arch/x86/kernel/genx2apic_uv_x.c
-@@ -353,12 +353,12 @@ static __init void map_mmioh_high(int ma
- static __init void uv_rtc_init(void)
- {
--      long status, ticks_per_sec, drift;
-+      long status;
-+      u64 ticks_per_sec;
--      status =
--          x86_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK, &ticks_per_sec,
--                                      &drift);
--      if (status != 0 || ticks_per_sec < 100000) {
-+      status = uv_bios_freq_base(BIOS_FREQ_BASE_REALTIME_CLOCK,
-+                                      &ticks_per_sec);
-+      if (status != BIOS_STATUS_SUCCESS || ticks_per_sec < 100000) {
-               printk(KERN_WARNING
-                       "unable to determine platform RTC clock frequency, "
-                       "guessing.\n");
-@@ -523,6 +523,8 @@ void __init uv_system_init(void)
-                      ~((1 << n_val) - 1)) << m_val;
-       uv_bios_init();
-+      uv_bios_get_sn_info(0, &uv_type, &sn_partition_id,
-+                          &uv_coherency_id, &uv_region_size);
-       uv_rtc_init();
-       for_each_present_cpu(cpu) {
-@@ -544,7 +546,7 @@ void __init uv_system_init(void)
-               uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;
-               uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper;
-               uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base;
--              uv_cpu_hub_info(cpu)->coherency_domain_number = 0;/* ZZZ */
-+              uv_cpu_hub_info(cpu)->coherency_domain_number = uv_coherency_id;
-               uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu;
-               uv_node_to_blade[nid] = blade;
-               uv_cpu_to_blade[cpu] = blade;
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -61,6 +61,16 @@ enum {
-       BIOS_FREQ_BASE_REALTIME_CLOCK = 2
- };
-+union partition_info_u {
-+      u64     val;
-+      struct {
-+              u64     hub_version     :  8,
-+                      partition_id    : 16,
-+                      coherence_id    : 16,
-+                      region_size     : 24;
-+      };
-+};
-+
- /*
-  * bios calls have 6 parameters
-  */
-@@ -68,10 +78,16 @@ extern s64 uv_bios_call(enum uv_bios_cmd
- extern s64 uv_bios_call_irqsave(enum uv_bios_cmd, u64, u64, u64, u64, u64);
- extern s64 uv_bios_call_reentrant(enum uv_bios_cmd, u64, u64, u64, u64, u64);
-+extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *);
-+extern s64 uv_bios_freq_base(u64, u64 *);
-+
- extern void uv_bios_init(void);
--extern long
--x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
--                 unsigned long *drift_info);
-+extern int uv_type;
-+extern long sn_partition_id;
-+extern long uv_coherency_id;
-+extern long uv_region_size;
-+#define partition_coherence_id()      (uv_coherency_id)
-+
- #endif /* _ASM_X86_BIOS_H */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_reserve_page.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_reserve_page.diff
deleted file mode 100644 (file)
index dbbb7b5..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: Add UV bios call to get the address of the reserved page.
-References: bnc#442455
-
-Add UV bios call to get the address of the reserved page.
-
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c |   11 +++++++++++
- include/asm-x86/uv/bios.h |    5 ++++-
- 2 files changed, 15 insertions(+), 1 deletion(-)
-
-Index: linux/arch/x86/kernel/bios_uv.c
-===================================================================
---- linux.orig/arch/x86/kernel/bios_uv.c       2008-11-05 11:13:15.289411601 -0600
-+++ linux/arch/x86/kernel/bios_uv.c    2008-11-05 11:14:11.428488248 -0600
-@@ -142,6 +142,17 @@ uv_bios_change_memprotect(u64 paddr, u64
- }
- EXPORT_SYMBOL_GPL(uv_bios_change_memprotect);
-+s64
-+uv_bios_reserved_page_pa(u64 buf, u64 *cookie, u64 *addr, u64 *len)
-+{
-+      s64 ret;
-+
-+      ret = uv_bios_call_irqsave(UV_BIOS_GET_PARTITION_ADDR, (u64)cookie,
-+                                      (u64)addr, buf, (u64)len, 0);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(uv_bios_reserved_page_pa);
-+
- s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
- {
-       return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
-Index: linux/include/asm-x86/uv/bios.h
-===================================================================
---- linux.orig/include/asm-x86/uv/bios.h       2008-11-05 11:13:15.301413114 -0600
-+++ linux/include/asm-x86/uv/bios.h    2008-11-05 11:14:11.436489257 -0600
-@@ -35,13 +35,15 @@ enum uv_bios_cmd {
-       UV_BIOS_FREQ_BASE,
-       UV_BIOS_WATCHLIST_ALLOC,
-       UV_BIOS_WATCHLIST_FREE,
--      UV_BIOS_MEMPROTECT
-+      UV_BIOS_MEMPROTECT,
-+      UV_BIOS_GET_PARTITION_ADDR
- };
- /*
-  * Status values returned from a BIOS call.
-  */
- enum {
-+      BIOS_STATUS_MORE_PASSES         =  1,
-       BIOS_STATUS_SUCCESS             =  0,
-       BIOS_STATUS_UNIMPLEMENTED       = -ENOSYS,
-       BIOS_STATUS_EINVAL              = -EINVAL,
-@@ -102,6 +104,7 @@ extern int uv_bios_mq_watchlist_alloc(in
-                                       unsigned long *);
- extern int uv_bios_mq_watchlist_free(int, int);
- extern s64 uv_bios_change_memprotect(u64, u64, enum uv_memprotect);
-+extern s64 uv_bios_reserved_page_pa(u64, u64 *, u64 *, u64 *);
- extern void uv_bios_init(void);
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_watchlist.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_call_watchlist.diff
deleted file mode 100644 (file)
index c08a62c..0000000
+++ /dev/null
@@ -1,100 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: Add UV bios calls to allocate and free watchlists.
-References: bnc#442455
-
-Add UV bios calls to allocate and free watchlists.
-
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c |   33 +++++++++++++++++++++++++++++++++
- include/asm-x86/uv/bios.h |   17 ++++++++++++++++-
- 2 files changed, 49 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kernel/bios_uv.c
-+++ b/arch/x86/kernel/bios_uv.c
-@@ -100,6 +100,39 @@ s64 uv_bios_get_sn_info(int fc, int *uvt
-       return ret;
- }
-+int
-+uv_bios_mq_watchlist_alloc(int blade, void *mq, unsigned int mq_size,
-+                         unsigned long *intr_mmr_offset)
-+{
-+      union uv_watchlist_u size_blade;
-+      unsigned long addr;
-+      u64 watchlist;
-+      s64 ret;
-+
-+      addr = (unsigned long)mq;
-+      size_blade.size = mq_size;
-+      size_blade.blade = blade;
-+
-+      /*
-+       * bios returns watchlist number or negative error number.
-+       */
-+      ret = (int)uv_bios_call_irqsave(UV_BIOS_WATCHLIST_ALLOC, addr,
-+                      size_blade.val, (u64)intr_mmr_offset,
-+                      (u64)&watchlist, 0);
-+      if (ret < BIOS_STATUS_SUCCESS)
-+              return ret;
-+
-+      return watchlist;
-+}
-+EXPORT_SYMBOL_GPL(uv_bios_mq_watchlist_alloc);
-+
-+int
-+uv_bios_mq_watchlist_free(int blade, int watchlist_num)
-+{
-+      return (int)uv_bios_call_irqsave(UV_BIOS_WATCHLIST_FREE,
-+                              blade, watchlist_num, 0, 0, 0);
-+}
-+EXPORT_SYMBOL_GPL(uv_bios_mq_watchlist_free);
- s64 uv_bios_freq_base(u64 clock_type, u64 *ticks_per_second)
- {
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -32,7 +32,9 @@
- enum uv_bios_cmd {
-       UV_BIOS_COMMON,
-       UV_BIOS_GET_SN_INFO,
--      UV_BIOS_FREQ_BASE
-+      UV_BIOS_FREQ_BASE,
-+      UV_BIOS_WATCHLIST_ALLOC,
-+      UV_BIOS_WATCHLIST_FREE
- };
- /*
-@@ -71,6 +73,15 @@ union partition_info_u {
-       };
- };
-+union uv_watchlist_u {
-+      u64     val;
-+      struct {
-+              u64     blade   : 16,
-+                      size    : 32,
-+                      filler  : 16;
-+      };
-+};
-+
- /*
-  * bios calls have 6 parameters
-  */
-@@ -80,9 +91,13 @@ extern s64 uv_bios_call_reentrant(enum u
- extern s64 uv_bios_get_sn_info(int, int *, long *, long *, long *);
- extern s64 uv_bios_freq_base(u64, u64 *);
-+extern int uv_bios_mq_watchlist_alloc(int, void *, unsigned int,
-+                                      unsigned long *);
-+extern int uv_bios_mq_watchlist_free(int, int);
- extern void uv_bios_init(void);
-+extern unsigned long sn_rtc_cycles_per_second;
- extern int uv_type;
- extern long sn_partition_id;
- extern long sn_coherency_id;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_common.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-bios_common.diff
deleted file mode 100644 (file)
index 5864106..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: x86: Add UV bios call infrastructure
-References: bnc#442455
-
-Add the EFI callback function and associated wrapper code.
-Initialize SAL system table entry info at boot time.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Signed-off-by: Paul Jackson <pj@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/bios_uv.c        |  101 ++++++++++++++++++++++++++++++---------
- arch/x86/kernel/genx2apic_uv_x.c |    1 
- include/asm-x86/efi.h            |   14 +++++
- include/asm-x86/uv/bios.h        |   73 +++++++++++++++-------------
- 4 files changed, 136 insertions(+), 53 deletions(-)
-
---- a/arch/x86/kernel/bios_uv.c
-+++ b/arch/x86/kernel/bios_uv.c
-@@ -1,8 +1,6 @@
- /*
-  * BIOS run time interface routines.
-  *
-- *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
-- *
-  *  This program is free software; you can redistribute it and/or modify
-  *  it under the terms of the GNU General Public License as published by
-  *  the Free Software Foundation; either version 2 of the License, or
-@@ -16,33 +14,94 @@
-  *  You should have received a copy of the GNU General Public License
-  *  along with this program; if not, write to the Free Software
-  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
-+ *  Copyright (c) Russ Anderson
-  */
-+#include <linux/efi.h>
-+#include <asm/efi.h>
-+#include <linux/io.h>
- #include <asm/uv/bios.h>
--const char *
--x86_bios_strerror(long status)
-+struct uv_systab uv_systab;
-+
-+s64 uv_bios_call(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3, u64 a4, u64 a5)
- {
--      const char *str;
--      switch (status) {
--      case  0: str = "Call completed without error"; break;
--      case -1: str = "Not implemented"; break;
--      case -2: str = "Invalid argument"; break;
--      case -3: str = "Call completed with error"; break;
--      default: str = "Unknown BIOS status code"; break;
--      }
--      return str;
-+      struct uv_systab *tab = &uv_systab;
-+
-+      if (!tab->function)
-+              /*
-+               * BIOS does not support UV systab
-+               */
-+              return BIOS_STATUS_UNIMPLEMENTED;
-+
-+      return efi_call6((void *)__va(tab->function),
-+                                      (u64)which, a1, a2, a3, a4, a5);
- }
--long
--x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
--                 unsigned long *drift_info)
-+s64 uv_bios_call_irqsave(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
-+                                      u64 a4, u64 a5)
- {
--      struct uv_bios_retval isrv;
-+      unsigned long bios_flags;
-+      s64 ret;
-+
-+      local_irq_save(bios_flags);
-+      ret = uv_bios_call(which, a1, a2, a3, a4, a5);
-+      local_irq_restore(bios_flags);
-+
-+      return ret;
-+}
-+
-+s64 uv_bios_call_reentrant(enum uv_bios_cmd which, u64 a1, u64 a2, u64 a3,
-+                                      u64 a4, u64 a5)
-+{
-+      s64 ret;
-+
-+      preempt_disable();
-+      ret = uv_bios_call(which, a1, a2, a3, a4, a5);
-+      preempt_enable();
--      BIOS_CALL(isrv, BIOS_FREQ_BASE, which, 0, 0, 0, 0, 0, 0);
--      *ticks_per_second = isrv.v0;
--      *drift_info = isrv.v1;
--      return isrv.status;
-+      return ret;
-+}
-+
-+long
-+x86_bios_freq_base(unsigned long clock_type, unsigned long *ticks_per_second,
-+                                      unsigned long *drift_info)
-+{
-+      return uv_bios_call(UV_BIOS_FREQ_BASE, clock_type,
-+                              (u64)ticks_per_second, 0, 0, 0);
- }
- EXPORT_SYMBOL_GPL(x86_bios_freq_base);
-+
-+
-+#ifdef CONFIG_EFI
-+void uv_bios_init(void)
-+{
-+      struct uv_systab *tab;
-+
-+      if ((efi.uv_systab == EFI_INVALID_TABLE_ADDR) ||
-+          (efi.uv_systab == (unsigned long)NULL)) {
-+              printk(KERN_CRIT "No EFI UV System Table.\n");
-+              uv_systab.function = (unsigned long)NULL;
-+              return;
-+      }
-+
-+      tab = (struct uv_systab *)ioremap(efi.uv_systab,
-+                                      sizeof(struct uv_systab));
-+      if (strncmp(tab->signature, "UVST", 4) != 0)
-+              printk(KERN_ERR "bad signature in UV system table!");
-+
-+      /*
-+       * Copy table to permanent spot for later use.
-+       */
-+      memcpy(&uv_systab, tab, sizeof(struct uv_systab));
-+      iounmap(tab);
-+
-+      printk(KERN_INFO "EFI UV System Table Revision %d\n", tab->revision);
-+}
-+#else /* !CONFIG_EFI */
-+
-+void uv_bios_init(void) { }
-+#endif
-+
---- a/arch/x86/kernel/genx2apic_uv_x.c
-+++ b/arch/x86/kernel/genx2apic_uv_x.c
-@@ -522,6 +522,7 @@ void __init uv_system_init(void)
-       gnode_upper = (((unsigned long)node_id.s.node_id) &
-                      ~((1 << n_val) - 1)) << m_val;
-+      uv_bios_init();
-       uv_rtc_init();
-       for_each_present_cpu(cpu) {
---- a/include/asm-x86/efi.h
-+++ b/include/asm-x86/efi.h
-@@ -49,6 +49,20 @@ extern u64 efi_call5(void *fp, u64 arg1,
- extern u64 efi_call6(void *fp, u64 arg1, u64 arg2, u64 arg3,
-                    u64 arg4, u64 arg5, u64 arg6);
-+
-+#ifndef CONFIG_EFI
-+/*
-+ * IF EFI is not configured, have the EFI calls return -ENOSYS.
-+ */
-+#define efi_call0(_f)                                 (-ENOSYS)
-+#define efi_call1(_f, _a1)                            (-ENOSYS)
-+#define efi_call2(_f, _a1, _a2)                               (-ENOSYS)
-+#define efi_call3(_f, _a1, _a2, _a3)                  (-ENOSYS)
-+#define efi_call4(_f, _a1, _a2, _a3, _a4)             (-ENOSYS)
-+#define efi_call5(_f, _a1, _a2, _a3, _a4, _a5)                (-ENOSYS)
-+#define efi_call6(_f, _a1, _a2, _a3, _a4, _a5, _a6)   (-ENOSYS)
-+#endif /* CONFIG_EFI */
-+
- #define efi_call_phys0(f)                     \
-       efi_call0((void *)(f))
- #define efi_call_phys1(f, a1)                 \
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -2,9 +2,7 @@
- #define _ASM_X86_BIOS_H
- /*
-- * BIOS layer definitions.
-- *
-- *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
-+ * UV BIOS layer definitions.
-  *
-  *  This program is free software; you can redistribute it and/or modify
-  *  it under the terms of the GNU General Public License as published by
-@@ -19,50 +17,61 @@
-  *  You should have received a copy of the GNU General Public License
-  *  along with this program; if not, write to the Free Software
-  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
-+ *  Copyright (c) Russ Anderson
-  */
- #include <linux/rtc.h>
--#define BIOS_FREQ_BASE                        0x01000001
-+/*
-+ * Values for the BIOS calls.  It is passed as the first * argument in the
-+ * BIOS call.  Passing any other value in the first argument will result
-+ * in a BIOS_STATUS_UNIMPLEMENTED return status.
-+ */
-+enum uv_bios_cmd {
-+      UV_BIOS_COMMON,
-+      UV_BIOS_GET_SN_INFO,
-+      UV_BIOS_FREQ_BASE
-+};
-+/*
-+ * Status values returned from a BIOS call.
-+ */
- enum {
--      BIOS_FREQ_BASE_PLATFORM = 0,
--      BIOS_FREQ_BASE_INTERVAL_TIMER = 1,
--      BIOS_FREQ_BASE_REALTIME_CLOCK = 2
-+      BIOS_STATUS_SUCCESS             =  0,
-+      BIOS_STATUS_UNIMPLEMENTED       = -ENOSYS,
-+      BIOS_STATUS_EINVAL              = -EINVAL,
-+      BIOS_STATUS_UNAVAIL             = -EBUSY
- };
--# define BIOS_CALL(result, a0, a1, a2, a3, a4, a5, a6, a7)            \
--      do {                                                            \
--              /* XXX - the real call goes here */                     \
--              result.status = BIOS_STATUS_UNIMPLEMENTED;              \
--              isrv.v0 = 0;                                            \
--              isrv.v1 = 0;                                            \
--      } while (0)
-+/*
-+ * The UV system table describes specific firmware
-+ * capabilities available to the Linux kernel at runtime.
-+ */
-+struct uv_systab {
-+      char signature[4];      /* must be "UVST" */
-+      u32 revision;           /* distinguish different firmware revs */
-+      u64 function;           /* BIOS runtime callback function ptr */
-+};
- enum {
--      BIOS_STATUS_SUCCESS             =  0,
--      BIOS_STATUS_UNIMPLEMENTED       = -1,
--      BIOS_STATUS_EINVAL              = -2,
--      BIOS_STATUS_ERROR               = -3
-+      BIOS_FREQ_BASE_PLATFORM = 0,
-+      BIOS_FREQ_BASE_INTERVAL_TIMER = 1,
-+      BIOS_FREQ_BASE_REALTIME_CLOCK = 2
- };
--struct uv_bios_retval {
--      /*
--       * A zero status value indicates call completed without error.
--       * A negative status value indicates reason of call failure.
--       * A positive status value indicates success but an
--       * informational value should be printed (e.g., "reboot for
--       * change to take effect").
--       */
--      s64 status;
--      u64 v0;
--      u64 v1;
--      u64 v2;
--};
-+/*
-+ * bios calls have 6 parameters
-+ */
-+extern s64 uv_bios_call(enum uv_bios_cmd, u64, u64, u64, u64, u64);
-+extern s64 uv_bios_call_irqsave(enum uv_bios_cmd, u64, u64, u64, u64, u64);
-+extern s64 uv_bios_call_reentrant(enum uv_bios_cmd, u64, u64, u64, u64, u64);
-+
-+extern void uv_bios_init(void);
- extern long
- x86_bios_freq_base(unsigned long which, unsigned long *ticks_per_second,
-                  unsigned long *drift_info);
--extern const char *x86_bios_strerror(long status);
- #endif /* _ASM_X86_BIOS_H */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-efi_bios.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-efi_bios.diff
deleted file mode 100644 (file)
index 1123b37..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: x86: Add UV EFI table entry
-References: bnc#442455
-
-Add an EFI table entry for SGI UV system.
-Look for the entry in the EFI tables.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Signed-off-by: Paul Jackson <pj@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/efi.c |    4 ++++
- include/linux/efi.h   |    4 ++++
- 2 files changed, 8 insertions(+)
-
-Index: linux/arch/x86/kernel/efi.c
-===================================================================
---- linux.orig/arch/x86/kernel/efi.c   2008-10-15 09:56:13.000000000 -0500
-+++ linux/arch/x86/kernel/efi.c        2008-10-15 09:56:23.000000000 -0500
-@@ -367,6 +367,10 @@ void __init efi_init(void)
-                       efi.smbios = config_tables[i].table;
-                       printk(" SMBIOS=0x%lx ", config_tables[i].table);
-               } else if (!efi_guidcmp(config_tables[i].guid,
-+                                      UV_SYSTEM_TABLE_GUID)) {
-+                      efi.uv_systab = config_tables[i].table;
-+                      printk(" UVsystab=0x%lx ", config_tables[i].table);
-+              } else if (!efi_guidcmp(config_tables[i].guid,
-                                       HCDP_TABLE_GUID)) {
-                       efi.hcdp = config_tables[i].table;
-                       printk(" HCDP=0x%lx ", config_tables[i].table);
-Index: linux/include/linux/efi.h
-===================================================================
---- linux.orig/include/linux/efi.h     2008-10-15 09:56:13.000000000 -0500
-+++ linux/include/linux/efi.h  2008-10-15 09:56:23.000000000 -0500
-@@ -208,6 +208,9 @@ typedef efi_status_t efi_set_virtual_add
- #define EFI_GLOBAL_VARIABLE_GUID \
-     EFI_GUID(  0x8be4df61, 0x93ca, 0x11d2, 0xaa, 0x0d, 0x00, 0xe0, 0x98, 0x03, 0x2b, 0x8c )
-+#define UV_SYSTEM_TABLE_GUID \
-+    EFI_GUID(  0x3b13a7d4, 0x633e, 0x11dd, 0x93, 0xec, 0xda, 0x25, 0x56, 0xd8, 0x95, 0x93 )
-+
- typedef struct {
-       efi_guid_t guid;
-       unsigned long table;
-@@ -255,6 +258,7 @@ extern struct efi {
-       unsigned long boot_info;        /* boot info table */
-       unsigned long hcdp;             /* HCDP table */
-       unsigned long uga;              /* UGA table */
-+      unsigned long uv_systab;        /* UV system table */
-       efi_get_time_t *get_time;
-       efi_set_time_t *set_time;
-       efi_get_wakeup_time_t *get_wakeup_time;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-sn_region_size.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-sn_region_size.diff
deleted file mode 100644 (file)
index c3aec1d..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: Use consistent names for region size and conherence id on x86 and ia64.
-References: bnc#442455
-
-The SGI xp drivers are used on both ia64 and x86.  Using the same
-names (sn_coherency_id, sn_region_size) simplies the driver code.
-
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- arch/x86/kernel/bios_uv.c        |    8 ++++----
- arch/x86/kernel/genx2apic_uv_x.c |    4 ++--
- include/asm-x86/uv/bios.h        |    6 +++---
- 3 files changed, 9 insertions(+), 9 deletions(-)
-
---- a/arch/x86/kernel/bios_uv.c
-+++ b/arch/x86/kernel/bios_uv.c
-@@ -69,10 +69,10 @@ s64 uv_bios_call_reentrant(enum uv_bios_
- long sn_partition_id;
- EXPORT_SYMBOL_GPL(sn_partition_id);
--long uv_coherency_id;
--EXPORT_SYMBOL_GPL(uv_coherency_id);
--long uv_region_size;
--EXPORT_SYMBOL_GPL(uv_region_size);
-+long sn_coherency_id;
-+EXPORT_SYMBOL_GPL(sn_coherency_id);
-+long sn_region_size;
-+EXPORT_SYMBOL_GPL(sn_region_size);
- int uv_type;
---- a/arch/x86/kernel/genx2apic_uv_x.c
-+++ b/arch/x86/kernel/genx2apic_uv_x.c
-@@ -524,7 +524,7 @@ void __init uv_system_init(void)
-       uv_bios_init();
-       uv_bios_get_sn_info(0, &uv_type, &sn_partition_id,
--                          &uv_coherency_id, &uv_region_size);
-+                          &sn_coherency_id, &sn_region_size);
-       uv_rtc_init();
-       for_each_present_cpu(cpu) {
-@@ -546,7 +546,7 @@ void __init uv_system_init(void)
-               uv_cpu_hub_info(cpu)->gpa_mask = (1 << (m_val + n_val)) - 1;
-               uv_cpu_hub_info(cpu)->gnode_upper = gnode_upper;
-               uv_cpu_hub_info(cpu)->global_mmr_base = mmr_base;
--              uv_cpu_hub_info(cpu)->coherency_domain_number = uv_coherency_id;
-+              uv_cpu_hub_info(cpu)->coherency_domain_number = sn_coherency_id;
-               uv_cpu_hub_info(cpu)->scir.offset = SCIR_LOCAL_MMR_BASE + lcpu;
-               uv_node_to_blade[nid] = blade;
-               uv_cpu_to_blade[cpu] = blade;
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -85,9 +85,9 @@ extern void uv_bios_init(void);
- extern int uv_type;
- extern long sn_partition_id;
--extern long uv_coherency_id;
--extern long uv_region_size;
--#define partition_coherence_id()      (uv_coherency_id)
-+extern long sn_coherency_id;
-+extern long sn_region_size;
-+#define partition_coherence_id()      (sn_coherency_id)
- extern struct kobject *sgi_uv_kobj;   /* /sys/firmware/sgi_uv */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-sysfs.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-sysfs.diff
deleted file mode 100644 (file)
index f9ac9c3..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-From: Russ Anderson <rja@sgi.com>
-Subject: x86: Add UV sysfs entries
-References: bnc#442455
-
-Create /sys/firmware/sgi_uv sysfs entries for partition_id and coherence_id.
-
-Signed-off-by: Russ Anderson <rja@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/Makefile   |    1 
- arch/x86/kernel/uv_sysfs.c |   72 +++++++++++++++++++++++++++++++++++++++++++++
- include/asm-x86/uv/bios.h  |    1 
- 3 files changed, 74 insertions(+)
-
---- a/arch/x86/kernel/Makefile
-+++ b/arch/x86/kernel/Makefile
-@@ -103,6 +103,7 @@ obj-$(CONFIG_OLPC)         += olpc.o
- # 64 bit specific files
- ifeq ($(CONFIG_X86_64),y)
-         obj-y                         += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
-+        obj-y                         += uv_sysfs.o
-         obj-y                         += genx2apic_cluster.o
-         obj-y                         += genx2apic_phys.o
-       obj-y                           += bios_uv.o
---- /dev/null
-+++ b/arch/x86/kernel/uv_sysfs.c
-@@ -0,0 +1,72 @@
-+/*
-+ * This file supports the /sys/firmware/sgi_uv interfaces for SGI UV.
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; either version 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ *  Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
-+ *  Copyright (c) Russ Anderson
-+ */
-+
-+#include <linux/sysdev.h>
-+#include <asm/uv/bios.h>
-+
-+struct kobject *sgi_uv_kobj;
-+
-+static ssize_t partition_id_show(struct kobject *kobj,
-+                      struct kobj_attribute *attr, char *buf)
-+{
-+      return snprintf(buf, PAGE_SIZE, "%ld\n", sn_partition_id);
-+}
-+
-+static ssize_t coherence_id_show(struct kobject *kobj,
-+                      struct kobj_attribute *attr, char *buf)
-+{
-+      return snprintf(buf, PAGE_SIZE, "%ld\n", partition_coherence_id());
-+}
-+
-+static struct kobj_attribute partition_id_attr =
-+      __ATTR(partition_id, S_IRUGO, partition_id_show, NULL);
-+
-+static struct kobj_attribute coherence_id_attr =
-+      __ATTR(coherence_id, S_IRUGO, coherence_id_show, NULL);
-+
-+
-+static int __init sgi_uv_sysfs_init(void)
-+{
-+      unsigned long ret;
-+
-+      if (!sgi_uv_kobj)
-+              sgi_uv_kobj = kobject_create_and_add("sgi_uv", firmware_kobj);
-+      if (!sgi_uv_kobj) {
-+              printk(KERN_WARNING "kobject_create_and_add sgi_uv failed \n");
-+              return -EINVAL;
-+      }
-+
-+      ret = sysfs_create_file(sgi_uv_kobj, &partition_id_attr.attr);
-+      if (ret) {
-+              printk(KERN_WARNING "sysfs_create_file partition_id failed \n");
-+              return ret;
-+      }
-+
-+      ret = sysfs_create_file(sgi_uv_kobj, &coherence_id_attr.attr);
-+      if (ret) {
-+              printk(KERN_WARNING "sysfs_create_file coherence_id failed \n");
-+              return ret;
-+      }
-+
-+      return 0;
-+}
-+
-+device_initcall(sgi_uv_sysfs_init);
---- a/include/asm-x86/uv/bios.h
-+++ b/include/asm-x86/uv/bios.h
-@@ -89,5 +89,6 @@ extern long uv_coherency_id;
- extern long uv_region_size;
- #define partition_coherence_id()      (uv_coherency_id)
-+extern struct kobject *sgi_uv_kobj;   /* /sys/firmware/sgi_uv */
- #endif /* _ASM_X86_BIOS_H */
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-xp-change_memprotect.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-xp-change_memprotect.diff
deleted file mode 100644 (file)
index e343346..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Subject: Define xp_expand_memprotect() and xp_restrict_memprotect()
-References: bnc#442461
-
-Define xp_expand_memprotect() and xp_restrict_memprotect() so they can be
-tailered to the hardware they are run on.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- drivers/misc/sgi-xp/xp.h      |    7 +++-
- drivers/misc/sgi-xp/xp_main.c |    7 ++++
- drivers/misc/sgi-xp/xp_sn2.c  |   34 +++++++++++++++++++++
- drivers/misc/sgi-xp/xp_uv.c   |   66 ++++++++++++++++++++++++++++++++++++++++++
- drivers/misc/sgi-xp/xpc_sn2.c |   15 +++------
- 5 files changed, 117 insertions(+), 12 deletions(-)
-
---- a/drivers/misc/sgi-xp/xp.h
-+++ b/drivers/misc/sgi-xp/xp.h
-@@ -190,9 +190,10 @@ enum xp_retval {
-       xpGruSendMqError,       /* 59: gru send message queue related error */
-       xpBadChannelNumber,     /* 60: invalid channel number */
--      xpBadMsgType,           /* 60: invalid message type */
-+      xpBadMsgType,           /* 61: invalid message type */
-+      xpBiosError,            /* 62: BIOS error */
--      xpUnknownReason         /* 61: unknown reason - must be last in enum */
-+      xpUnknownReason         /* 63: unknown reason - must be last in enum */
- };
- /*
-@@ -341,6 +342,8 @@ extern unsigned long (*xp_pa) (void *);
- extern enum xp_retval (*xp_remote_memcpy) (unsigned long, const unsigned long,
-                      size_t);
- extern int (*xp_cpu_to_nasid) (int);
-+extern enum xp_retval (*xp_expand_memprotect) (unsigned long, unsigned long);
-+extern enum xp_retval (*xp_restrict_memprotect) (unsigned long, unsigned long);
- extern u64 xp_nofault_PIOR_target;
- extern int xp_nofault_PIOR(void *);
---- a/drivers/misc/sgi-xp/xp_main.c
-+++ b/drivers/misc/sgi-xp/xp_main.c
-@@ -51,6 +51,13 @@ EXPORT_SYMBOL_GPL(xp_remote_memcpy);
- int (*xp_cpu_to_nasid) (int cpuid);
- EXPORT_SYMBOL_GPL(xp_cpu_to_nasid);
-+enum xp_retval (*xp_expand_memprotect) (unsigned long phys_addr,
-+                                      unsigned long size);
-+EXPORT_SYMBOL_GPL(xp_expand_memprotect);
-+enum xp_retval (*xp_restrict_memprotect) (unsigned long phys_addr,
-+                                        unsigned long size);
-+EXPORT_SYMBOL_GPL(xp_restrict_memprotect);
-+
- /*
-  * xpc_registrations[] keeps track of xpc_connect()'s done by the kernel-level
-  * users of XPC.
---- a/drivers/misc/sgi-xp/xp_sn2.c
-+++ b/drivers/misc/sgi-xp/xp_sn2.c
-@@ -120,6 +120,38 @@ xp_cpu_to_nasid_sn2(int cpuid)
-       return cpuid_to_nasid(cpuid);
- }
-+static enum xp_retval
-+xp_expand_memprotect_sn2(unsigned long phys_addr, unsigned long size)
-+{
-+      u64 nasid_array = 0;
-+      int ret;
-+
-+      ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_1,
-+                                 &nasid_array);
-+      if (ret != 0) {
-+              dev_err(xp, "sn_change_memprotect(,, "
-+                      "SN_MEMPROT_ACCESS_CLASS_1,) failed ret=%d\n", ret);
-+              return xpSalError;
-+      }
-+      return xpSuccess;
-+}
-+
-+static enum xp_retval
-+xp_restrict_memprotect_sn2(unsigned long phys_addr, unsigned long size)
-+{
-+      u64 nasid_array = 0;
-+      int ret;
-+
-+      ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_0,
-+                                 &nasid_array);
-+      if (ret != 0) {
-+              dev_err(xp, "sn_change_memprotect(,, "
-+                      "SN_MEMPROT_ACCESS_CLASS_0,) failed ret=%d\n", ret);
-+              return xpSalError;
-+      }
-+      return xpSuccess;
-+}
-+
- enum xp_retval
- xp_init_sn2(void)
- {
-@@ -132,6 +164,8 @@ xp_init_sn2(void)
-       xp_pa = xp_pa_sn2;
-       xp_remote_memcpy = xp_remote_memcpy_sn2;
-       xp_cpu_to_nasid = xp_cpu_to_nasid_sn2;
-+      xp_expand_memprotect = xp_expand_memprotect_sn2;
-+      xp_restrict_memprotect = xp_restrict_memprotect_sn2;
-       return xp_register_nofault_code_sn2();
- }
---- a/drivers/misc/sgi-xp/xp_uv.c
-+++ b/drivers/misc/sgi-xp/xp_uv.c
-@@ -15,6 +15,11 @@
- #include <linux/device.h>
- #include <asm/uv/uv_hub.h>
-+#if defined CONFIG_X86_64
-+#include <asm/uv/bios.h>
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+#include <asm/sn/sn_sal.h>
-+#endif
- #include "../sgi-gru/grukservices.h"
- #include "xp.h"
-@@ -49,6 +54,65 @@ xp_cpu_to_nasid_uv(int cpuid)
-       return UV_PNODE_TO_NASID(uv_cpu_to_pnode(cpuid));
- }
-+static enum xp_retval
-+xp_expand_memprotect_uv(unsigned long phys_addr, unsigned long size)
-+{
-+      int ret;
-+
-+#if defined CONFIG_X86_64
-+      ret = uv_bios_change_memprotect(phys_addr, size, UV_MEMPROT_ALLOW_RW);
-+      if (ret != BIOS_STATUS_SUCCESS) {
-+              dev_err(xp, "uv_bios_change_memprotect(,, "
-+                      "UV_MEMPROT_ALLOW_RW) failed, ret=%d\n", ret);
-+              return xpBiosError;
-+      }
-+
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      u64 nasid_array;
-+
-+      ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_1,
-+                                 &nasid_array);
-+      if (ret != 0) {
-+              dev_err(xp, "sn_change_memprotect(,, "
-+                      "SN_MEMPROT_ACCESS_CLASS_1,) failed ret=%d\n", ret);
-+              return xpSalError;
-+      }
-+#else
-+      #error not a supported configuration
-+#endif
-+      return xpSuccess;
-+}
-+
-+static enum xp_retval
-+xp_restrict_memprotect_uv(unsigned long phys_addr, unsigned long size)
-+{
-+      int ret;
-+
-+#if defined CONFIG_X86_64
-+      ret = uv_bios_change_memprotect(phys_addr, size,
-+                                      UV_MEMPROT_RESTRICT_ACCESS);
-+      if (ret != BIOS_STATUS_SUCCESS) {
-+              dev_err(xp, "uv_bios_change_memprotect(,, "
-+                      "UV_MEMPROT_RESTRICT_ACCESS) failed, ret=%d\n", ret);
-+              return xpBiosError;
-+      }
-+
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      u64 nasid_array;
-+
-+      ret = sn_change_memprotect(phys_addr, size, SN_MEMPROT_ACCESS_CLASS_0,
-+                                 &nasid_array);
-+      if (ret != 0) {
-+              dev_err(xp, "sn_change_memprotect(,, "
-+                      "SN_MEMPROT_ACCESS_CLASS_0,) failed ret=%d\n", ret);
-+              return xpSalError;
-+      }
-+#else
-+      #error not a supported configuration
-+#endif
-+      return xpSuccess;
-+}
-+
- enum xp_retval
- xp_init_uv(void)
- {
-@@ -61,6 +125,8 @@ xp_init_uv(void)
-       xp_pa = xp_pa_uv;
-       xp_remote_memcpy = xp_remote_memcpy_uv;
-       xp_cpu_to_nasid = xp_cpu_to_nasid_uv;
-+      xp_expand_memprotect = xp_expand_memprotect_uv;
-+      xp_restrict_memprotect = xp_restrict_memprotect_uv;
-       return xpSuccess;
- }
---- a/drivers/misc/sgi-xp/xpc_sn2.c
-+++ b/drivers/misc/sgi-xp/xpc_sn2.c
-@@ -553,22 +553,17 @@ static u64 xpc_prot_vec_sn2[MAX_NUMNODES
- static enum xp_retval
- xpc_allow_amo_ops_sn2(struct amo *amos_page)
- {
--      u64 nasid_array = 0;
--      int ret;
-+      enum xp_retval ret = xpSuccess;
-       /*
-        * On SHUB 1.1, we cannot call sn_change_memprotect() since the BIST
-        * collides with memory operations. On those systems we call
-        * xpc_allow_amo_ops_shub_wars_1_1_sn2() instead.
-        */
--      if (!enable_shub_wars_1_1()) {
--              ret = sn_change_memprotect(ia64_tpa((u64)amos_page), PAGE_SIZE,
--                                         SN_MEMPROT_ACCESS_CLASS_1,
--                                         &nasid_array);
--              if (ret != 0)
--                      return xpSalError;
--      }
--      return xpSuccess;
-+      if (!enable_shub_wars_1_1())
-+              ret = xp_expand_memprotect(ia64_tpa((u64)amos_page), PAGE_SIZE);
-+
-+      return ret;
- }
- /*
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc-get_sn_info.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc-get_sn_info.diff
deleted file mode 100644 (file)
index 795228d..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Subject: [PATCH] Define xp_partition_id and xp_region_size
-References: bnc#442461
-
-
-Define xp_partition_id and xp_region_size to their correct values.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- drivers/misc/sgi-xp/xp_uv.c |    4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
---- a/drivers/misc/sgi-xp/xp_uv.c
-+++ b/drivers/misc/sgi-xp/xp_uv.c
-@@ -119,8 +119,8 @@ xp_init_uv(void)
-       BUG_ON(!is_uv());
-       xp_max_npartitions = XP_MAX_NPARTITIONS_UV;
--      xp_partition_id = 0;    /* !!! not correct value */
--      xp_region_size = 0;     /* !!! not correct value */
-+      xp_partition_id = sn_partition_id;
-+      xp_region_size = sn_region_size;
-       xp_pa = xp_pa_uv;
-       xp_remote_memcpy = xp_remote_memcpy_uv;
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_create_gru_mq_uv.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_create_gru_mq_uv.diff
deleted file mode 100644 (file)
index e1a82e6..0000000
+++ /dev/null
@@ -1,388 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Subject: [PATCH] Add the code to create the activate and notify gru message queues
-References: bnc#442461
-
-For UV add the code to create the activate and notify gru message queues.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- drivers/misc/sgi-xp/xpc.h    |   12 +
- drivers/misc/sgi-xp/xpc_uv.c |  259 ++++++++++++++++++++++++++++++++++---------
- 2 files changed, 218 insertions(+), 53 deletions(-)
-
---- a/drivers/misc/sgi-xp/xpc.h
-+++ b/drivers/misc/sgi-xp/xpc.h
-@@ -181,6 +181,18 @@ struct xpc_vars_part_sn2 {
-                                 xpc_nasid_mask_nlongs))
- /*
-+ * Info pertinent to a GRU message queue using a watch list for irq generation.
-+ */
-+struct xpc_gru_mq_uv {
-+      void *address;          /* address of GRU message queue */
-+      unsigned int order;     /* size of GRU message queue as a power of 2 */
-+      int irq;                /* irq raised when message is received in mq */
-+      int mmr_blade;          /* blade where watchlist was allocated from */
-+      unsigned long mmr_offset; /* offset of irq mmr located on mmr_blade */
-+      int watchlist_num;      /* number of watchlist allocatd by BIOS */
-+};
-+
-+/*
-  * The activate_mq is used to send/receive GRU messages that affect XPC's
-  * heartbeat, partition active state, and channel state. This is UV only.
-  */
---- a/drivers/misc/sgi-xp/xpc_uv.c
-+++ b/drivers/misc/sgi-xp/xpc_uv.c
-@@ -18,7 +18,15 @@
- #include <linux/interrupt.h>
- #include <linux/delay.h>
- #include <linux/device.h>
-+#include <linux/err.h>
- #include <asm/uv/uv_hub.h>
-+#if defined CONFIG_X86_64
-+#include <asm/uv/bios.h>
-+#include <asm/uv/uv_irq.h>
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+#include <asm/sn/intr.h>
-+#include <asm/sn/sn_sal.h>
-+#endif
- #include "../sgi-gru/gru.h"
- #include "../sgi-gru/grukservices.h"
- #include "xpc.h"
-@@ -27,15 +35,17 @@ static atomic64_t xpc_heartbeat_uv;
- static DECLARE_BITMAP(xpc_heartbeating_to_mask_uv, XP_MAX_NPARTITIONS_UV);
- #define XPC_ACTIVATE_MSG_SIZE_UV      (1 * GRU_CACHE_LINE_BYTES)
--#define XPC_NOTIFY_MSG_SIZE_UV                (2 * GRU_CACHE_LINE_BYTES)
-+#define XPC_ACTIVATE_MQ_SIZE_UV               (4 * XP_MAX_NPARTITIONS_UV * \
-+                                       XPC_ACTIVATE_MSG_SIZE_UV)
-+#define XPC_ACTIVATE_IRQ_NAME         "xpc_activate"
--#define XPC_ACTIVATE_MQ_SIZE_UV       (4 * XP_MAX_NPARTITIONS_UV * \
--                               XPC_ACTIVATE_MSG_SIZE_UV)
--#define XPC_NOTIFY_MQ_SIZE_UV (4 * XP_MAX_NPARTITIONS_UV * \
--                               XPC_NOTIFY_MSG_SIZE_UV)
-+#define XPC_NOTIFY_MSG_SIZE_UV                (2 * GRU_CACHE_LINE_BYTES)
-+#define XPC_NOTIFY_MQ_SIZE_UV         (4 * XP_MAX_NPARTITIONS_UV * \
-+                                       XPC_NOTIFY_MSG_SIZE_UV)
-+#define XPC_NOTIFY_IRQ_NAME           "xpc_notify"
--static void *xpc_activate_mq_uv;
--static void *xpc_notify_mq_uv;
-+static struct xpc_gru_mq_uv *xpc_activate_mq_uv;
-+static struct xpc_gru_mq_uv *xpc_notify_mq_uv;
- static int
- xpc_setup_partitions_sn_uv(void)
-@@ -52,62 +62,209 @@ xpc_setup_partitions_sn_uv(void)
-       return 0;
- }
--static void *
--xpc_create_gru_mq_uv(unsigned int mq_size, int cpuid, unsigned int irq,
-+static int
-+xpc_get_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq, int cpu, char *irq_name)
-+{
-+#if defined CONFIG_X86_64
-+      mq->irq = uv_setup_irq(irq_name, cpu, mq->mmr_blade, mq->mmr_offset);
-+      if (mq->irq < 0) {
-+              dev_err(xpc_part, "uv_setup_irq() returned error=%d\n",
-+                      mq->irq);
-+      }
-+
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      int mmr_pnode;
-+      unsigned long mmr_value;
-+
-+      if (strcmp(irq_name, XPC_ACTIVATE_IRQ_NAME) == 0)
-+              mq->irq = SGI_XPC_ACTIVATE;
-+      else if (strcmp(irq_name, XPC_NOTIFY_IRQ_NAME) == 0)
-+              mq->irq = SGI_XPC_NOTIFY;
-+      else
-+              return -EINVAL;
-+
-+      mmr_pnode = uv_blade_to_pnode(mq->mmr_blade);
-+      mmr_value = (unsigned long)cpu_physical_id(cpu) << 32 | mq->irq;
-+
-+      uv_write_global_mmr64(mmr_pnode, mq->mmr_offset, mmr_value);
-+#else
-+      #error not a supported configuration
-+#endif
-+
-+      return 0;
-+}
-+
-+static void
-+xpc_release_gru_mq_irq_uv(struct xpc_gru_mq_uv *mq)
-+{
-+#if defined CONFIG_X86_64
-+      uv_teardown_irq(mq->irq, mq->mmr_blade, mq->mmr_offset);
-+
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      int mmr_pnode;
-+      unsigned long mmr_value;
-+
-+      mmr_pnode = uv_blade_to_pnode(mq->mmr_blade);
-+      mmr_value = 1UL << 16;
-+
-+      uv_write_global_mmr64(mmr_pnode, mq->mmr_offset, mmr_value);
-+#else
-+      #error not a supported configuration
-+#endif
-+}
-+
-+static int
-+xpc_gru_mq_watchlist_alloc_uv(struct xpc_gru_mq_uv *mq)
-+{
-+      int ret;
-+
-+#if defined CONFIG_X86_64
-+      ret = uv_bios_mq_watchlist_alloc(mq->mmr_blade, mq->address, mq->order,
-+                                       &mq->mmr_offset);
-+      if (ret < 0) {
-+              dev_err(xpc_part, "uv_bios_mq_watchlist_alloc() failed, "
-+                      "ret=%d\n", ret);
-+              return ret;
-+      }
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      ret = sn_mq_watchlist_alloc(mq->mmr_blade, mq->address, mq->order,
-+                                  &mq->mmr_offset);
-+      if (ret < 0) {
-+              dev_err(xpc_part, "sn_mq_watchlist_alloc() failed, ret=%d\n",
-+                      ret);
-+              return -EBUSY;
-+      }
-+#else
-+      #error not a supported configuration
-+#endif
-+
-+      mq->watchlist_num = ret;
-+      return 0;
-+}
-+
-+static void
-+xpc_gru_mq_watchlist_free_uv(struct xpc_gru_mq_uv *mq)
-+{
-+      int ret;
-+
-+#if defined CONFIG_X86_64
-+      ret = uv_bios_mq_watchlist_free(mq->mmr_blade, mq->watchlist_num);
-+      BUG_ON(ret != BIOS_STATUS_SUCCESS);
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      ret = sn_mq_watchlist_free(mq->mmr_blade, mq->watchlist_num);
-+      BUG_ON(ret != SALRET_OK);
-+#else
-+      #error not a supported configuration
-+#endif
-+}
-+
-+static struct xpc_gru_mq_uv *
-+xpc_create_gru_mq_uv(unsigned int mq_size, int cpu, char *irq_name,
-                    irq_handler_t irq_handler)
- {
-+      enum xp_retval xp_ret;
-       int ret;
-       int nid;
--      int mq_order;
-+      int pg_order;
-       struct page *page;
--      void *mq;
-+      struct xpc_gru_mq_uv *mq;
-+
-+      mq = kmalloc(sizeof(struct xpc_gru_mq_uv), GFP_KERNEL);
-+      if (mq == NULL) {
-+              dev_err(xpc_part, "xpc_create_gru_mq_uv() failed to kmalloc() "
-+                      "a xpc_gru_mq_uv structure\n");
-+              ret = -ENOMEM;
-+              goto out_1;
-+      }
-+
-+      pg_order = get_order(mq_size);
-+      mq->order = pg_order + PAGE_SHIFT;
-+      mq_size = 1UL << mq->order;
--      nid = cpu_to_node(cpuid);
--      mq_order = get_order(mq_size);
-+      mq->mmr_blade = uv_cpu_to_blade_id(cpu);
-+
-+      nid = cpu_to_node(cpu);
-       page = alloc_pages_node(nid, GFP_KERNEL | __GFP_ZERO | GFP_THISNODE,
--                              mq_order);
-+                              pg_order);
-       if (page == NULL) {
-               dev_err(xpc_part, "xpc_create_gru_mq_uv() failed to alloc %d "
-                       "bytes of memory on nid=%d for GRU mq\n", mq_size, nid);
--              return NULL;
-+              ret = -ENOMEM;
-+              goto out_2;
-       }
-+      mq->address = page_address(page);
--      mq = page_address(page);
--      ret = gru_create_message_queue(mq, mq_size);
-+      ret = gru_create_message_queue(mq->address, mq_size);
-       if (ret != 0) {
-               dev_err(xpc_part, "gru_create_message_queue() returned "
-                       "error=%d\n", ret);
--              free_pages((unsigned long)mq, mq_order);
--              return NULL;
-+              ret = -EINVAL;
-+              goto out_3;
-       }
--      /* !!! Need to do some other things to set up IRQ */
-+      /* enable generation of irq when GRU mq operation occurs to this mq */
-+      ret = xpc_gru_mq_watchlist_alloc_uv(mq);
-+      if (ret != 0)
-+              goto out_3;
-+
-+      ret = xpc_get_gru_mq_irq_uv(mq, cpu, irq_name);
-+      if (ret != 0)
-+              goto out_4;
--      ret = request_irq(irq, irq_handler, 0, "xpc", NULL);
-+      ret = request_irq(mq->irq, irq_handler, 0, irq_name, NULL);
-       if (ret != 0) {
-               dev_err(xpc_part, "request_irq(irq=%d) returned error=%d\n",
--                      irq, ret);
--              free_pages((unsigned long)mq, mq_order);
--              return NULL;
-+                      mq->irq, ret);
-+              goto out_5;
-       }
--      /* !!! enable generation of irq when GRU mq op occurs to this mq */
--
--      /* ??? allow other partitions to access GRU mq? */
-+      /* allow other partitions to access this GRU mq */
-+      xp_ret = xp_expand_memprotect(xp_pa(mq->address), mq_size);
-+      if (xp_ret != xpSuccess) {
-+              ret = -EACCES;
-+              goto out_6;
-+      }
-       return mq;
-+
-+      /* something went wrong */
-+out_6:
-+      free_irq(mq->irq, NULL);
-+out_5:
-+      xpc_release_gru_mq_irq_uv(mq);
-+out_4:
-+      xpc_gru_mq_watchlist_free_uv(mq);
-+out_3:
-+      free_pages((unsigned long)mq->address, pg_order);
-+out_2:
-+      kfree(mq);
-+out_1:
-+      return ERR_PTR(ret);
- }
- static void
--xpc_destroy_gru_mq_uv(void *mq, unsigned int mq_size, unsigned int irq)
-+xpc_destroy_gru_mq_uv(struct xpc_gru_mq_uv *mq)
- {
--      /* ??? disallow other partitions to access GRU mq? */
-+      unsigned int mq_size;
-+      int pg_order;
-+      int ret;
-+
-+      /* disallow other partitions to access GRU mq */
-+      mq_size = 1UL << mq->order;
-+      ret = xp_restrict_memprotect(xp_pa(mq->address), mq_size);
-+      BUG_ON(ret != xpSuccess);
-+
-+      /* unregister irq handler and release mq irq/vector mapping */
-+      free_irq(mq->irq, NULL);
-+      xpc_release_gru_mq_irq_uv(mq);
--      /* !!! disable generation of irq when GRU mq op occurs to this mq */
-+      /* disable generation of irq when GRU mq op occurs to this mq */
-+      xpc_gru_mq_watchlist_free_uv(mq);
--      free_irq(irq, NULL);
-+      pg_order = mq->order - PAGE_SHIFT;
-+      free_pages((unsigned long)mq->address, pg_order);
--      free_pages((unsigned long)mq, get_order(mq_size));
-+      kfree(mq);
- }
- static enum xp_retval
-@@ -402,7 +559,10 @@ xpc_handle_activate_IRQ_uv(int irq, void
-       struct xpc_partition *part;
-       int wakeup_hb_checker = 0;
--      while ((msg_hdr = gru_get_next_message(xpc_activate_mq_uv)) != NULL) {
-+      while (1) {
-+              msg_hdr = gru_get_next_message(xpc_activate_mq_uv->address);
-+              if (msg_hdr == NULL)
-+                      break;
-               partid = msg_hdr->partid;
-               if (partid < 0 || partid >= XP_MAX_NPARTITIONS_UV) {
-@@ -418,7 +578,7 @@ xpc_handle_activate_IRQ_uv(int irq, void
-                       }
-               }
--              gru_free_message(xpc_activate_mq_uv, msg_hdr);
-+              gru_free_message(xpc_activate_mq_uv->address, msg_hdr);
-       }
-       if (wakeup_hb_checker)
-@@ -507,7 +667,7 @@ xpc_get_partition_rsvd_page_pa_uv(void *
- static int
- xpc_setup_rsvd_page_sn_uv(struct xpc_rsvd_page *rp)
- {
--      rp->sn.activate_mq_gpa = uv_gpa(xpc_activate_mq_uv);
-+      rp->sn.activate_mq_gpa = uv_gpa(xpc_activate_mq_uv->address);
-       return 0;
- }
-@@ -1410,22 +1570,18 @@ xpc_init_uv(void)
-               return -E2BIG;
-       }
--      /* ??? The cpuid argument's value is 0, is that what we want? */
--      /* !!! The irq argument's value isn't correct. */
--      xpc_activate_mq_uv = xpc_create_gru_mq_uv(XPC_ACTIVATE_MQ_SIZE_UV, 0, 0,
-+      xpc_activate_mq_uv = xpc_create_gru_mq_uv(XPC_ACTIVATE_MQ_SIZE_UV, 0,
-+                                                XPC_ACTIVATE_IRQ_NAME,
-                                                 xpc_handle_activate_IRQ_uv);
--      if (xpc_activate_mq_uv == NULL)
--              return -ENOMEM;
-+      if (IS_ERR(xpc_activate_mq_uv))
-+              return PTR_ERR(xpc_activate_mq_uv);
--      /* ??? The cpuid argument's value is 0, is that what we want? */
--      /* !!! The irq argument's value isn't correct. */
--      xpc_notify_mq_uv = xpc_create_gru_mq_uv(XPC_NOTIFY_MQ_SIZE_UV, 0, 0,
-+      xpc_notify_mq_uv = xpc_create_gru_mq_uv(XPC_NOTIFY_MQ_SIZE_UV, 0,
-+                                              XPC_NOTIFY_IRQ_NAME,
-                                               xpc_handle_notify_IRQ_uv);
--      if (xpc_notify_mq_uv == NULL) {
--              /* !!! The irq argument's value isn't correct. */
--              xpc_destroy_gru_mq_uv(xpc_activate_mq_uv,
--                                    XPC_ACTIVATE_MQ_SIZE_UV, 0);
--              return -ENOMEM;
-+      if (IS_ERR(xpc_notify_mq_uv)) {
-+              xpc_destroy_gru_mq_uv(xpc_activate_mq_uv);
-+              return PTR_ERR(xpc_notify_mq_uv);
-       }
-       return 0;
-@@ -1434,9 +1590,6 @@ xpc_init_uv(void)
- void
- xpc_exit_uv(void)
- {
--      /* !!! The irq argument's value isn't correct. */
--      xpc_destroy_gru_mq_uv(xpc_notify_mq_uv, XPC_NOTIFY_MQ_SIZE_UV, 0);
--
--      /* !!! The irq argument's value isn't correct. */
--      xpc_destroy_gru_mq_uv(xpc_activate_mq_uv, XPC_ACTIVATE_MQ_SIZE_UV, 0);
-+      xpc_destroy_gru_mq_uv(xpc_notify_mq_uv);
-+      xpc_destroy_gru_mq_uv(xpc_activate_mq_uv);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_get_part_rsvd_page.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv-xpc_get_part_rsvd_page.diff
deleted file mode 100644 (file)
index ca9d9f2..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Subject: [PATCH] Add support for getting the address of a partition's reserved page.
-References: bnc#442461
-
-Add support for getting the address of a partition's reserved page.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
-
- drivers/misc/sgi-xp/xpc_uv.c |   31 ++++++++++++++++++++++++++++---
- 1 file changed, 28 insertions(+), 3 deletions(-)
-
-Index: linux/drivers/misc/sgi-xp/xpc_uv.c
-===================================================================
---- linux.orig/drivers/misc/sgi-xp/xpc_uv.c    2008-10-21 12:50:18.000000000 -0500
-+++ linux/drivers/misc/sgi-xp/xpc_uv.c 2008-10-21 14:00:13.000000000 -0500
-@@ -642,7 +642,7 @@ xpc_send_local_activate_IRQ_uv(struct xp
-       struct xpc_partition_uv *part_uv = &part->sn.uv;
-       /*
--       * !!! Make our side think that the remote parition sent an activate
-+       * !!! Make our side think that the remote partition sent an activate
-        * !!! message our way by doing what the activate IRQ handler would
-        * !!! do had one really been sent.
-        */
-@@ -660,8 +660,33 @@ static enum xp_retval
- xpc_get_partition_rsvd_page_pa_uv(void *buf, u64 *cookie, unsigned long *rp_pa,
-                                 size_t *len)
- {
--      /* !!! call the UV version of sn_partition_reserved_page_pa() */
--      return xpUnsupported;
-+      s64 status;
-+      enum xp_retval ret;
-+
-+#if defined CONFIG_X86_64
-+      status = uv_bios_reserved_page_pa((u64)buf, cookie, (u64 *)rp_pa,
-+                                        (u64 *)len);
-+      if (status == BIOS_STATUS_SUCCESS)
-+              ret = xpSuccess;
-+      else if (status == BIOS_STATUS_MORE_PASSES)
-+              ret = xpNeedMoreInfo;
-+      else
-+              ret = xpBiosError;
-+
-+#elif defined CONFIG_IA64_GENERIC || defined CONFIG_IA64_SGI_UV
-+      status = sn_partition_reserved_page_pa((u64)buf, cookie, rp_pa, len);
-+      if (status == SALRET_OK)
-+              ret = xpSuccess;
-+      else if (status == SALRET_MORE_PASSES)
-+              ret = xpNeedMoreInfo;
-+      else
-+              ret = xpSalError;
-+
-+#else
-+      #error not a supported configuration
-+#endif
-+
-+      return ret;
- }
- static int
diff --git a/src/patches/suse-2.6.27.31/patches.fixes/uv_setup_irq.diff b/src/patches/suse-2.6.27.31/patches.fixes/uv_setup_irq.diff
deleted file mode 100644 (file)
index 257cd32..0000000
+++ /dev/null
@@ -1,239 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Date: Thu, 2 Oct 2008 17:18:21 +0000 (-0500)
-Subject: x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3
-X-Git-Tag: v2.6.28-rc1~80^2~27
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=4173a0e7371ece227559b44943c6fd456ee470d1
-References: bnc#442461
-
-x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3
-
-Provide a means for UV interrupt MMRs to be setup with the message to be sent
-when an MSI is raised.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Signed-off-by: Ingo Molnar <mingo@elte.hu>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/x86/kernel/Makefile     |    2 -
- arch/x86/kernel/io_apic_64.c |   68 +++++++++++++++++++++++++++++++++++++
- arch/x86/kernel/uv_irq.c     |   79 +++++++++++++++++++++++++++++++++++++++++++
- include/asm-x86/uv/uv_irq.h  |   36 +++++++++++++++++++
- 4 files changed, 184 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kernel/Makefile
-+++ b/arch/x86/kernel/Makefile
-@@ -106,7 +106,7 @@ ifeq ($(CONFIG_X86_64),y)
-         obj-y                         += uv_sysfs.o
-         obj-y                         += genx2apic_cluster.o
-         obj-y                         += genx2apic_phys.o
--      obj-y                           += bios_uv.o
-+      obj-y                           += bios_uv.o uv_irq.o
-         obj-$(CONFIG_X86_PM_TIMER)    += pmtimer_64.o
-         obj-$(CONFIG_AUDIT)           += audit_64.o
---- a/arch/x86/kernel/io_apic_64.c
-+++ b/arch/x86/kernel/io_apic_64.c
-@@ -51,6 +51,8 @@
- #include <asm/msidef.h>
- #include <asm/hypertransport.h>
- #include <asm/irq_remapping.h>
-+#include <asm/uv/uv_hub.h>
-+#include <asm/uv/uv_irq.h>
- #include <mach_ipi.h>
- #include <mach_apic.h>
-@@ -2787,6 +2789,72 @@ int arch_setup_ht_irq(unsigned int irq,
- }
- #endif /* CONFIG_HT_IRQ */
-+#ifdef CONFIG_X86_64
-+/*
-+ * Re-target the irq to the specified CPU and enable the specified MMR located
-+ * on the specified blade to allow the sending of MSIs to the specified CPU.
-+ */
-+int arch_enable_uv_irq(char *irq_name, unsigned int irq, int cpu, int mmr_blade,
-+                     unsigned long mmr_offset)
-+{
-+      const cpumask_t *eligible_cpu = get_cpu_mask(cpu);
-+      struct irq_cfg *cfg;
-+      int mmr_pnode;
-+      unsigned long mmr_value;
-+      struct uv_IO_APIC_route_entry *entry;
-+      unsigned long flags;
-+      int err;
-+
-+      err = assign_irq_vector(irq, eligible_cpu);
-+      if (err != 0)
-+              return err;
-+
-+      spin_lock_irqsave(&vector_lock, flags);
-+      set_irq_chip_and_handler_name(irq, &uv_irq_chip, handle_percpu_irq,
-+                                    irq_name);
-+      spin_unlock_irqrestore(&vector_lock, flags);
-+
-+      cfg = &irq_cfg[irq];
-+
-+      mmr_value = 0;
-+      entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
-+      BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
-+
-+      entry->vector = cfg->vector;
-+      entry->delivery_mode = INT_DELIVERY_MODE;
-+      entry->dest_mode = INT_DEST_MODE;
-+      entry->polarity = 0;
-+      entry->trigger = 0;
-+      entry->mask = 0;
-+      entry->dest = cpu_mask_to_apicid(eligible_cpu);
-+
-+      mmr_pnode = uv_blade_to_pnode(mmr_blade);
-+      uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
-+
-+      return irq;
-+}
-+
-+/*
-+ * Disable the specified MMR located on the specified blade so that MSIs are
-+ * longer allowed to be sent.
-+ */
-+void arch_disable_uv_irq(int mmr_blade, unsigned long mmr_offset)
-+{
-+      unsigned long mmr_value;
-+      struct uv_IO_APIC_route_entry *entry;
-+      int mmr_pnode;
-+
-+      mmr_value = 0;
-+      entry = (struct uv_IO_APIC_route_entry *)&mmr_value;
-+      BUG_ON(sizeof(struct uv_IO_APIC_route_entry) != sizeof(unsigned long));
-+
-+      entry->mask = 1;
-+
-+      mmr_pnode = uv_blade_to_pnode(mmr_blade);
-+      uv_write_global_mmr64(mmr_pnode, mmr_offset, mmr_value);
-+}
-+#endif /* CONFIG_X86_64 */
-+
- /* --------------------------------------------------------------------------
-                           ACPI-based IOAPIC Configuration
-    -------------------------------------------------------------------------- */
---- /dev/null
-+++ b/arch/x86/kernel/uv_irq.c
-@@ -0,0 +1,79 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * SGI UV IRQ functions
-+ *
-+ * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/irq.h>
-+
-+#include <asm/apic.h>
-+#include <asm/uv/uv_irq.h>
-+
-+static void uv_noop(unsigned int irq)
-+{
-+}
-+
-+static unsigned int uv_noop_ret(unsigned int irq)
-+{
-+      return 0;
-+}
-+
-+static void uv_ack_apic(unsigned int irq)
-+{
-+      ack_APIC_irq();
-+}
-+
-+struct irq_chip uv_irq_chip = {
-+      .name           = "UV-CORE",
-+      .startup        = uv_noop_ret,
-+      .shutdown       = uv_noop,
-+      .enable         = uv_noop,
-+      .disable        = uv_noop,
-+      .ack            = uv_noop,
-+      .mask           = uv_noop,
-+      .unmask         = uv_noop,
-+      .eoi            = uv_ack_apic,
-+      .end            = uv_noop,
-+};
-+
-+/*
-+ * Set up a mapping of an available irq and vector, and enable the specified
-+ * MMR that defines the MSI that is to be sent to the specified CPU when an
-+ * interrupt is raised.
-+ */
-+int uv_setup_irq(char *irq_name, int cpu, int mmr_blade,
-+               unsigned long mmr_offset)
-+{
-+      int irq;
-+      int ret;
-+
-+      irq = create_irq();
-+      if (irq < 0)
-+              return -EBUSY;
-+
-+      ret = arch_enable_uv_irq(irq_name, irq, cpu, mmr_blade, mmr_offset);
-+      if (ret != irq)
-+              destroy_irq(irq);
-+
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(uv_setup_irq);
-+
-+/*
-+ * Tear down a mapping of an irq and vector, and disable the specified MMR that
-+ * defined the MSI that was to be sent to the specified CPU when an interrupt
-+ * was raised.
-+ *
-+ * Set mmr_blade and mmr_offset to what was passed in on uv_setup_irq().
-+ */
-+void uv_teardown_irq(unsigned int irq, int mmr_blade, unsigned long mmr_offset)
-+{
-+      arch_disable_uv_irq(mmr_blade, mmr_offset);
-+      destroy_irq(irq);
-+}
-+EXPORT_SYMBOL_GPL(uv_teardown_irq);
---- /dev/null
-+++ b/include/asm-x86/uv/uv_irq.h
-@@ -0,0 +1,36 @@
-+/*
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * SGI UV IRQ definitions
-+ *
-+ * Copyright (C) 2008 Silicon Graphics, Inc. All rights reserved.
-+ */
-+
-+#ifndef _ASM_X86_UV_UV_IRQ_H
-+#define _ASM_X86_UV_UV_IRQ_H
-+
-+/* If a generic version of this structure gets defined, eliminate this one. */
-+struct uv_IO_APIC_route_entry {
-+      __u64   vector          :  8,
-+              delivery_mode   :  3,
-+              dest_mode       :  1,
-+              delivery_status :  1,
-+              polarity        :  1,
-+              __reserved_1    :  1,
-+              trigger         :  1,
-+              mask            :  1,
-+              __reserved_2    : 15,
-+              dest            : 32;
-+};
-+
-+extern struct irq_chip uv_irq_chip;
-+
-+extern int arch_enable_uv_irq(char *, unsigned int, int, int, unsigned long);
-+extern void arch_disable_uv_irq(int, unsigned long);
-+
-+extern int uv_setup_irq(char *, int, int, unsigned long);
-+extern void uv_teardown_irq(unsigned int, int, unsigned long);
-+
-+#endif /* _ASM_X86_UV_UV_IRQ_H */
diff --git a/src/patches/suse-2.6.27.31/patches.kernel.org/ipmi-section-conflict.diff b/src/patches/suse-2.6.27.31/patches.kernel.org/ipmi-section-conflict.diff
deleted file mode 100644 (file)
index e1a9bc4..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH] ipmi: Fix section type conflicts
-
- Module parameters can't be static since the module macros explicitly
- put those symbols in the __param section. It causes a section conflict
- on ia64. This doesn't occur with standard types, since they are global
- and exported.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
----
-
- drivers/char/ipmi/ipmi_si_intf.c  |    4 ++--
- drivers/char/ipmi/ipmi_watchdog.c |   10 +++++-----
- 2 files changed, 7 insertions(+), 7 deletions(-)
-
---- a/drivers/char/ipmi/ipmi_si_intf.c
-+++ b/drivers/char/ipmi/ipmi_si_intf.c
-@@ -1152,7 +1152,7 @@ static unsigned int num_slave_addrs;
- #define IPMI_MEM_ADDR_SPACE 1
- static char *addr_space_to_str[] = { "i/o", "mem" };
--static int hotmod_handler(const char *val, struct kernel_param *kp);
-+int hotmod_handler(const char *val, struct kernel_param *kp);
- module_param_call(hotmod, hotmod_handler, NULL, NULL, 0200);
- MODULE_PARM_DESC(hotmod, "Add and remove interfaces.  See"
-@@ -1574,7 +1574,7 @@ static int check_hotmod_int_op(const cha
-       return 0;
- }
--static int hotmod_handler(const char *val, struct kernel_param *kp)
-+int hotmod_handler(const char *val, struct kernel_param *kp)
- {
-       char *str = kstrdup(val, GFP_KERNEL);
-       int  rv;
---- a/drivers/char/ipmi/ipmi_watchdog.c
-+++ b/drivers/char/ipmi/ipmi_watchdog.c
-@@ -196,7 +196,7 @@ static void ipmi_unregister_watchdog(int
-  */
- static int start_now;
--static int set_param_int(const char *val, struct kernel_param *kp)
-+int set_param_int(const char *val, struct kernel_param *kp)
- {
-       char *endp;
-       int  l;
-@@ -215,7 +215,7 @@ static int set_param_int(const char *val
-       return rv;
- }
--static int get_param_int(char *buffer, struct kernel_param *kp)
-+int get_param_int(char *buffer, struct kernel_param *kp)
- {
-       return sprintf(buffer, "%i", *((int *)kp->arg));
- }
-@@ -227,7 +227,7 @@ static int preaction_op(const char *inva
- static int preop_op(const char *inval, char *outval);
- static void check_parms(void);
--static int set_param_str(const char *val, struct kernel_param *kp)
-+int set_param_str(const char *val, struct kernel_param *kp)
- {
-       action_fn  fn = (action_fn) kp->arg;
-       int        rv = 0;
-@@ -251,7 +251,7 @@ static int set_param_str(const char *val
-       return rv;
- }
--static int get_param_str(char *buffer, struct kernel_param *kp)
-+int get_param_str(char *buffer, struct kernel_param *kp)
- {
-       action_fn fn = (action_fn) kp->arg;
-       int       rv;
-@@ -263,7 +263,7 @@ static int get_param_str(char *buffer, s
- }
--static int set_param_wdog_ifnum(const char *val, struct kernel_param *kp)
-+int set_param_wdog_ifnum(const char *val, struct kernel_param *kp)
- {
-       int rv = param_set_int(val, kp);
-       if (rv)
diff --git a/src/patches/suse-2.6.27.31/patches.kernel.org/psmouse-section-conflict.diff b/src/patches/suse-2.6.27.31/patches.kernel.org/psmouse-section-conflict.diff
deleted file mode 100644 (file)
index f62c89c..0000000
+++ /dev/null
@@ -1,47 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH] psmouse: fix section type conflict
-
- Module parameters can't be static since the module macros explicitly
- put those symbols in the __param section. It causes a section conflict
- on ia64. This doesn't occur with standard types, since they are global
- and exported.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- drivers/input/mouse/psmouse-base.c |    9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
---- a/drivers/input/mouse/psmouse-base.c
-+++ b/drivers/input/mouse/psmouse-base.c
-@@ -36,8 +36,8 @@ MODULE_DESCRIPTION(DRIVER_DESC);
- MODULE_LICENSE("GPL");
- static unsigned int psmouse_max_proto = PSMOUSE_AUTO;
--static int psmouse_set_maxproto(const char *val, struct kernel_param *kp);
--static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp);
-+int psmouse_set_maxproto(const char *val, struct kernel_param *kp);
-+int psmouse_get_maxproto(char *buffer, struct kernel_param *kp);
- #define param_check_proto_abbrev(name, p)     __param_check(name, p, unsigned int)
- #define param_set_proto_abbrev                        psmouse_set_maxproto
- #define param_get_proto_abbrev                        psmouse_get_maxproto
-@@ -1573,7 +1573,8 @@ static ssize_t psmouse_attr_set_resoluti
- }
--static int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
-+/* These two should be static, but it causes a section type conflict */
-+int psmouse_set_maxproto(const char *val, struct kernel_param *kp)
- {
-       const struct psmouse_protocol *proto;
-@@ -1590,7 +1591,7 @@ static int psmouse_set_maxproto(const ch
-       return 0;
- }
--static int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
-+int psmouse_get_maxproto(char *buffer, struct kernel_param *kp)
- {
-       int type = *((unsigned int *)kp->arg);
diff --git a/src/patches/suse-2.6.27.31/patches.rpmify/cloneconfig.diff b/src/patches/suse-2.6.27.31/patches.rpmify/cloneconfig.diff
deleted file mode 100644 (file)
index 73dc910..0000000
+++ /dev/null
@@ -1,37 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Add ``cloneconfig'' target
-
-Cloneconfig takes the first configuration it finds which appears
-to belong to the running kernel, and configures the kernel sources
-to match this configuration as closely as possible.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
- scripts/kconfig/Makefile |   16 ++++++++++++++++
- 1 file changed, 16 insertions(+)
-
---- a/scripts/kconfig/Makefile
-+++ b/scripts/kconfig/Makefile
-@@ -61,6 +61,22 @@ allnoconfig: $(obj)/conf
- allmodconfig: $(obj)/conf
-       $< -m $(Kconfig)
-+UNAME_RELEASE := $(shell uname -r)
-+CLONECONFIG := $(firstword $(wildcard /proc/config.gz \
-+                                    /lib/modules/$(UNAME_RELEASE)/.config \
-+                                    /etc/kernel-config \
-+                                    /boot/config-$(UNAME_RELEASE)))
-+cloneconfig: $(obj)/conf
-+      $(Q)case "$(CLONECONFIG)" in                            \
-+      '')     echo -e "The configuration of the running"      \
-+                      "kernel could not be determined\n";     \
-+              false ;;                                        \
-+      *.gz)   gzip -cd $(CLONECONFIG) > .config.running ;;    \
-+      *)      cat $(CLONECONFIG) > .config.running ;;         \
-+      esac &&                                                 \
-+      echo -e "Cloning configuration file $(CLONECONFIG)\n"
-+      $(Q)$< -D .config.running arch/$(SRCARCH)/Kconfig
-+
- defconfig: $(obj)/conf
- ifeq ($(KBUILD_DEFCONFIG),)
-       $< -d $(Kconfig)
diff --git a/src/patches/suse-2.6.27.31/patches.suse/apm_setup_UP.diff b/src/patches/suse-2.6.27.31/patches.suse/apm_setup_UP.diff
deleted file mode 100644 (file)
index b24c336..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-From: Olaf Dabrunz <od@suse.de>
-Subject: [apm] default to "power_off" when SMP kernel is used on single processor machines
-Reference: SUSE221667
-
-This patch turns on support for the APM power_off function by default when the
-SMP kernel is used on single processor machines.
-
-It is a bit ugly to use a separate variable to make sure the default value is
-only used when needed and the power_off variable is not initialized twice. But
-I did not find a better way to do this with the way the current initialization
-system works.
-
-Signed-off-by: Olaf Dabrunz <od@suse.de>
-
-
- arch/x86/kernel/apm_32.c |   15 ++++++++++++++-
- 1 file changed, 14 insertions(+), 1 deletion(-)
-
---- a/arch/x86/kernel/apm_32.c
-+++ b/arch/x86/kernel/apm_32.c
-@@ -389,6 +389,7 @@ static int smp __read_mostly;
- static int apm_disabled = -1;
- #ifdef CONFIG_SMP
- static int power_off;
-+static int power_off_set;
- #else
- static int power_off = 1;
- #endif
-@@ -1797,6 +1798,14 @@ static int apm(void *unused)
-               }
-       }
-+#ifdef CONFIG_SMP
-+      if (!power_off_set) {
-+              power_off = (num_online_cpus() == 1);
-+              /* remember not to initialize (with default value) again */
-+              power_off_set = 1;
-+      }
-+#endif
-+
-       /* Install our power off handler.. */
-       if (power_off)
-               pm_power_off = apm_power_off;
-@@ -1840,8 +1849,12 @@ static int __init apm_setup(char *str)
-               if (strncmp(str, "debug", 5) == 0)
-                       debug = !invert;
-               if ((strncmp(str, "power-off", 9) == 0) ||
--                  (strncmp(str, "power_off", 9) == 0))
-+                  (strncmp(str, "power_off", 9) == 0)) {
-                       power_off = !invert;
-+#ifdef CONFIG_SMP
-+                      power_off_set = 1;
-+#endif
-+              }
-               if (strncmp(str, "smp", 3) == 0) {
-                       smp = !invert;
-                       idle_threshold = 100;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/crasher-26.diff b/src/patches/suse-2.6.27.31/patches.suse/crasher-26.diff
deleted file mode 100644 (file)
index 2815e05..0000000
+++ /dev/null
@@ -1,260 +0,0 @@
-From: Chris Mason <mason@suse.com>
-Subject: slab testing module
-
----
- drivers/char/Kconfig   |    5 +
- drivers/char/Makefile  |    1 
- drivers/char/crasher.c |  225 +++++++++++++++++++++++++++++++++++++++++++++++++
- 3 files changed, 231 insertions(+)
-
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -1104,5 +1104,10 @@ config DEVPORT
- source "drivers/s390/char/Kconfig"
-+config CRASHER
-+      tristate "Crasher Module"
-+      help
-+        Slab cache memory tester.  Only use this as a module
-+
- endmenu
---- a/drivers/char/Makefile
-+++ b/drivers/char/Makefile
-@@ -105,6 +105,7 @@ obj-$(CONFIG_IPMI_HANDLER) += ipmi/
- obj-$(CONFIG_HANGCHECK_TIMER) += hangcheck-timer.o
- obj-$(CONFIG_TCG_TPM)         += tpm/
-+obj-$(CONFIG_CRASHER)         += crasher.o
- obj-$(CONFIG_PS3_FLASH)               += ps3flash.o
---- /dev/null
-+++ b/drivers/char/crasher.c
-@@ -0,0 +1,225 @@
-+/*
-+ * crasher.c, it breaks things
-+ */
-+
-+
-+#include <linux/module.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/completion.h>
-+#include <linux/jiffies.h>
-+#include <linux/sched.h>
-+#include <linux/moduleparam.h>
-+
-+static int module_exiting;
-+static struct completion startup = COMPLETION_INITIALIZER(startup);
-+static unsigned long rand_seed = 152L;
-+static unsigned long seed = 152L;
-+static int threads = 1;
-+static int call_panic;
-+static int call_bug;
-+static int trap_null, call_null, jump_null;
-+static long trap_read, trap_write, call_bad, jump_bad;
-+
-+module_param(seed, ulong, 0);
-+module_param(call_panic, bool, 0);
-+module_param(call_bug, bool, 0);
-+module_param(trap_null, bool, 0);
-+module_param(trap_read, long, 0);
-+module_param(trap_write, long, 0);
-+module_param(call_null, bool, 0);
-+module_param(call_bad, long, 0);
-+module_param(jump_null, bool, 0);
-+module_param(jump_bad, long, 0);
-+module_param(threads, int, 0);
-+MODULE_PARM_DESC(seed, "random seed for memory tests");
-+MODULE_PARM_DESC(call_panic, "test option. call panic() and render the system unusable.");
-+MODULE_PARM_DESC(call_bug, "test option. call BUG() and render the system unusable.");
-+MODULE_PARM_DESC(trap_null, "test option. dereference a NULL pointer to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(trap_read, "test option. read from an invalid address to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(trap_write, "test option. write to an invalid address to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(call_null, "test option. call a NULL pointer to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(call_bad, "test option. call an invalid address to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(jump_null, "test option. jump to a NULL pointer to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(jump_bad, "test option. jump to an invalid address to simulate a crash and render the system unusable.");
-+MODULE_PARM_DESC(threads, "number of threads to run");
-+MODULE_LICENSE("GPL");
-+
-+#define NUM_ALLOC 24
-+#define NUM_SIZES 8
-+static int sizes[]  = { 32, 64, 128, 192, 256, 1024, 2048, 4096 };
-+
-+struct mem_buf {
-+    char *buf;
-+    int size;
-+};
-+
-+static unsigned long crasher_random(void)
-+{
-+        rand_seed = rand_seed*69069L+1;
-+        return rand_seed^jiffies;
-+}
-+
-+void crasher_srandom(unsigned long entropy)
-+{
-+        rand_seed ^= entropy;
-+        crasher_random();
-+}
-+
-+static char *mem_alloc(int size) {
-+      char *p = kmalloc(size, GFP_KERNEL);
-+      int i;
-+      if (!p)
-+              return p;
-+      for (i = 0 ; i < size; i++)
-+              p[i] = (i % 119) + 8;
-+      return p;
-+}
-+
-+static void mem_check(char *p, int size) {
-+      int i;
-+      if (!p)
-+              return;
-+      for (i = 0 ; i < size; i++) {
-+              if (p[i] != ((i % 119) + 8)) {
-+                      printk(KERN_CRIT "verify error at %lX offset %d "
-+                             " wanted %d found %d size %d\n",
-+                             (unsigned long)(p + i), i, (i % 119) + 8,
-+                             p[i], size);
-+              }
-+      }
-+      // try and trigger slab poisoning for people using this buffer
-+      // wrong
-+      memset(p, 0, size);
-+}
-+
-+static void mem_verify(void) {
-+      struct mem_buf bufs[NUM_ALLOC];
-+      struct mem_buf *b;
-+      int index;
-+      int size;
-+      unsigned long sleep;
-+      memset(bufs, 0, sizeof(struct mem_buf) * NUM_ALLOC);
-+      while(!module_exiting) {
-+              index = crasher_random() % NUM_ALLOC;
-+              b = bufs + index;
-+              if (b->size) {
-+                      mem_check(b->buf, b->size);
-+                      kfree(b->buf);
-+                      b->buf = NULL;
-+                      b->size = 0;
-+              } else {
-+                      size = crasher_random() % NUM_SIZES;
-+                      size = sizes[size];
-+                      b->buf = mem_alloc(size);
-+                      b->size = size;
-+              }
-+              sleep = crasher_random() % (HZ / 10);
-+              set_current_state(TASK_INTERRUPTIBLE);
-+              schedule_timeout(sleep);
-+              set_current_state(TASK_RUNNING);
-+      }
-+      for (index = 0 ; index < NUM_ALLOC ; index++) {
-+              b = bufs + index;
-+              if (b->size) {
-+                      mem_check(b->buf, b->size);
-+                      kfree(b->buf);
-+              }
-+      }
-+}
-+
-+static int crasher_thread(void *unused)
-+{
-+      daemonize("crasher");
-+      complete(&startup);
-+      mem_verify();
-+      complete(&startup);
-+      return 0;
-+}
-+
-+static int __init crasher_init(void)
-+{
-+      int i;
-+      init_completion(&startup);
-+      crasher_srandom(seed);
-+
-+      if (call_panic) {
-+              panic("test panic from crasher module. Good Luck.\n");
-+              return -EFAULT;
-+      }
-+      if (call_bug) {
-+              printk("triggering BUG\n");
-+              BUG_ON(1);
-+              return -EFAULT;
-+      }
-+
-+      if (trap_null) {
-+              volatile char *p = NULL;
-+              printk("dereferencing NULL pointer.\n");
-+              p[0] = '\n';
-+              return -EFAULT;
-+      }
-+      if (trap_read) {
-+              const volatile char *p = (char *)trap_read;
-+              printk("reading from invalid(?) address %p.\n", p);
-+              return p[0] ? -EFAULT : -EACCES;
-+      }
-+      if (trap_write) {
-+              volatile char *p = (char *)trap_write;
-+              printk("writing to invalid(?) address %p.\n", p);
-+              p[0] = ' ';
-+              return -EFAULT;
-+      }
-+
-+      if (call_null) {
-+              void(*f)(void) = NULL;
-+              printk("calling NULL pointer.\n");
-+              f();
-+              return -EFAULT;
-+      }
-+      if (call_bad) {
-+              void(*f)(void) = (void(*)(void))call_bad;
-+              printk("calling invalid(?) address %p.\n", f);
-+              f();
-+              return -EFAULT;
-+      }
-+
-+      /* These two depend on the compiler doing tail call optimization. */
-+      if (jump_null) {
-+              int(*f)(void) = NULL;
-+              printk("jumping to NULL.\n");
-+              return f();
-+      }
-+      if (jump_bad) {
-+              int(*f)(void) = (int(*)(void))jump_bad;
-+              printk("jumping to invalid(?) address %p.\n", f);
-+              return f();
-+      }
-+
-+      printk("crasher module (%d threads).  Testing sizes: ", threads);
-+      for (i = 0 ; i < NUM_SIZES ; i++)
-+              printk("%d ", sizes[i]);
-+      printk("\n");
-+
-+      for (i = 0 ; i < threads ; i++)
-+              kernel_thread(crasher_thread, crasher_thread,
-+                            CLONE_FS | CLONE_FILES);
-+      for (i = 0 ; i < threads ; i++)
-+              wait_for_completion(&startup);
-+      return 0;
-+}
-+
-+static void __exit crasher_exit(void)
-+{
-+      int i;
-+      module_exiting = 1;
-+      for (i = 0 ; i < threads ; i++)
-+              wait_for_completion(&startup);
-+      printk("all crasher threads done\n");
-+      return;
-+}
-+
-+module_init(crasher_init);
-+module_exit(crasher_exit);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/file-capabilities-add-file_caps-switch.diff b/src/patches/suse-2.6.27.31/patches.suse/file-capabilities-add-file_caps-switch.diff
deleted file mode 100644 (file)
index 1ac93ed..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: file capabilities: add file_caps switch
-
-Based on a patch from Serge Hallyn <serue@us.ibm.com>:
-
-Add a file_caps boot option when file capabilities are
-compiled into the kernel (CONFIG_SECURITY_FILE_CAPABILITIES=y).
-
-This allows distributions to ship a kernel with file capabilities
-compiled in, without forcing users to use (and understand and
-trust) them.
-
-When file_caps=0 is specified at boot, then when a process executes
-a file, any file capabilities stored with that file will not be
-used in the calculation of the process' new capability sets.
-
-This means that booting with the file_caps=0 boot option will
-not be the same as booting a kernel with file capabilities
-compiled out - in particular a task with  CAP_SETPCAP will not
-have any chance of passing capabilities to another task (which
-isn't "really" possible anyway, and which may soon by killed
-altogether by David Howells in any case), and it will instead
-be able to put new capabilities in its pI.  However since fI
-will always be empty and pI is masked with fI, it gains the
-task nothing.
-
-We also support the extra prctl options, setting securebits and
-dropping capabilities from the per-process bounding set.
-
-The other remaining difference is that killpriv, task_setscheduler,
-setioprio, and setnice will continue to be hooked.  That will
-be noticable in the case where a root task changed its uid
-while keeping some caps, and another task owned by the new uid
-tries to change settings for the more privileged task.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- Documentation/kernel-parameters.txt |    9 +++++++++
- include/linux/capability.h          |    3 +++
- kernel/capability.c                 |   11 +++++++++++
- security/commoncap.c                |    3 +++
- 4 files changed, 26 insertions(+)
-
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -1403,6 +1403,15 @@ and is between 256 and 4096 characters.
-                       instruction doesn't work correctly and not to
-                       use it.
-+      file_caps=      Tells the kernel whether to honor file capabilities.
-+                      When disabled, the only way then for a file to be
-+                      executed with privilege is to be setuid root or executed
-+                      by root.
-+                      Format: {"0" | "1"}
-+                      0 -- ignore file capabilities.
-+                      1 -- honor file capabilities.
-+                      Default value is 1.
-+
-       nohalt          [IA-64] Tells the kernel not to use the power saving
-                       function PAL_HALT_LIGHT when idle. This increases
-                       power-consumption. On the positive side, it reduces
---- a/include/linux/capability.h
-+++ b/include/linux/capability.h
-@@ -68,6 +68,9 @@ typedef struct __user_cap_data_struct {
- #define VFS_CAP_U32             VFS_CAP_U32_2
- #define VFS_CAP_REVISION      VFS_CAP_REVISION_2
-+#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
-+extern int file_caps_enabled;
-+#endif
- struct vfs_cap_data {
-       __le32 magic_etc;            /* Little endian */
---- a/kernel/capability.c
-+++ b/kernel/capability.c
-@@ -33,6 +33,17 @@ EXPORT_SYMBOL(__cap_empty_set);
- EXPORT_SYMBOL(__cap_full_set);
- EXPORT_SYMBOL(__cap_init_eff_set);
-+#ifdef CONFIG_SECURITY_FILE_CAPABILITIES
-+int file_caps_enabled = 1;
-+
-+static int __init setup_file_caps(char *str)
-+{
-+      get_option(&str, &file_caps_enabled);
-+      return 1;
-+}
-+__setup("file_caps=", setup_file_caps);
-+#endif
-+
- /*
-  * More recent versions of libcap are available from:
-  *
---- a/security/commoncap.c
-+++ b/security/commoncap.c
-@@ -281,6 +281,9 @@ static int get_file_caps(struct linux_bi
-       bprm_clear_caps(bprm);
-+      if (!file_caps_enabled)
-+              return 0;
-+
-       if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
-               return 0;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/file-capabilities-disable-by-default.diff b/src/patches/suse-2.6.27.31/patches.suse/file-capabilities-disable-by-default.diff
deleted file mode 100644 (file)
index dab5faf..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Disable file capabilities by default
-
-Disable file capabilities by default: we are still lacking documentation
-and file capability awareness in system management tools.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- Documentation/kernel-parameters.txt |    2 +-
- kernel/capability.c                 |    2 +-
- 2 files changed, 2 insertions(+), 2 deletions(-)
-
---- a/Documentation/kernel-parameters.txt
-+++ b/Documentation/kernel-parameters.txt
-@@ -1410,7 +1410,7 @@ and is between 256 and 4096 characters.
-                       Format: {"0" | "1"}
-                       0 -- ignore file capabilities.
-                       1 -- honor file capabilities.
--                      Default value is 1.
-+                      Default value is 0.
-       nohalt          [IA-64] Tells the kernel not to use the power saving
-                       function PAL_HALT_LIGHT when idle. This increases
---- a/kernel/capability.c
-+++ b/kernel/capability.c
-@@ -34,7 +34,7 @@ EXPORT_SYMBOL(__cap_full_set);
- EXPORT_SYMBOL(__cap_init_eff_set);
- #ifdef CONFIG_SECURITY_FILE_CAPABILITIES
--int file_caps_enabled = 1;
-+int file_caps_enabled;
- static int __init setup_file_caps(char *str)
- {
diff --git a/src/patches/suse-2.6.27.31/patches.suse/fs-knows-MAY_APPEND.diff b/src/patches/suse-2.6.27.31/patches.suse/fs-knows-MAY_APPEND.diff
deleted file mode 100644 (file)
index 3f65c63..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Allow filesystems to handle MAY_APPEND
-    
-The MS_WITHAPPEND super_block flag tells the vfs that the permission
-inode operation understands the MAY_APPEND flag. This is required for
-implementing permission models which go beyond the traditional UNIX
-semantics.
-
-If a filesystem does not set the flag, the behavior is unchanged.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/namei.c         |    6 +++++-
- include/linux/fs.h |    2 ++
- 2 files changed, 7 insertions(+), 1 deletion(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -230,6 +230,7 @@ int generic_permission(struct inode *ino
- int inode_permission(struct inode *inode, int mask)
- {
-       int retval;
-+      int submask = mask;
-       if (mask & MAY_WRITE) {
-               umode_t mode = inode->i_mode;
-@@ -248,9 +249,12 @@ int inode_permission(struct inode *inode
-                       return -EACCES;
-       }
-+      if (!IS_WITHAPPEND(inode))
-+              submask &= ~MAY_APPEND;
-+
-       /* Ordinary permission routines do not understand MAY_APPEND. */
-       if (inode->i_op && inode->i_op->permission) {
--              retval = inode->i_op->permission(inode, mask);
-+              retval = inode->i_op->permission(inode, submask);
-               if (!retval) {
-                       /*
-                        * Exec permission on a regular file is denied if none
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -133,6 +133,7 @@ extern int dir_notify_enable;
- #define MS_RELATIME   (1<<21) /* Update atime relative to mtime/ctime. */
- #define MS_KERNMOUNT  (1<<22) /* this is a kern_mount call */
- #define MS_I_VERSION  (1<<23) /* Update inode I_version field */
-+#define MS_WITHAPPEND (1<<24) /* iop->permission() understands MAY_APPEND */
- #define MS_ACTIVE     (1<<30)
- #define MS_NOUSER     (1<<31)
-@@ -183,6 +184,7 @@ extern int dir_notify_enable;
- #define IS_MANDLOCK(inode)    __IS_FLG(inode, MS_MANDLOCK)
- #define IS_NOATIME(inode)   __IS_FLG(inode, MS_RDONLY|MS_NOATIME)
- #define IS_I_VERSION(inode)   __IS_FLG(inode, MS_I_VERSION)
-+#define IS_WITHAPPEND(inode)  __IS_FLG(inode, MS_WITHAPPEND)
- #define IS_NOQUOTA(inode)     ((inode)->i_flags & S_NOQUOTA)
- #define IS_APPEND(inode)      ((inode)->i_flags & S_APPEND)
diff --git a/src/patches/suse-2.6.27.31/patches.suse/fs-may_iops.diff b/src/patches/suse-2.6.27.31/patches.suse/fs-may_iops.diff
deleted file mode 100644 (file)
index 9ee1ae6..0000000
+++ /dev/null
@@ -1,144 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: VFS hooks for per-filesystem permission models
-    
-Add may_create and may_delete inode operations that filesystems can
-implement in order to override the vfs provided default behavior.
-This is required for implementing permission models which go beyond
-the traditional UNIX semantics.
-
-If a filesystem does not implement these hooks, the behavior is
-unchanged.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/namei.c         |   48 +++++++++++++++++++++++++++++++++++++-----------
- include/linux/fs.h |    2 ++
- 2 files changed, 39 insertions(+), 11 deletions(-)
-
---- a/fs/namei.c
-+++ b/fs/namei.c
-@@ -1402,13 +1402,24 @@ static int may_delete(struct inode *dir,
-       BUG_ON(victim->d_parent->d_inode != dir);
-       audit_inode_child(victim->d_name.name, victim, dir);
--      error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+      if (dir->i_op->may_delete) {
-+              if (IS_RDONLY(dir))
-+                      return -EROFS;
-+              if (IS_IMMUTABLE(dir))
-+                      return -EACCES;
-+              error = dir->i_op->may_delete(dir, victim->d_inode);
-+              if (!error)
-+                      error = security_inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+      } else {
-+              error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+              if (!error && check_sticky(dir, victim->d_inode))
-+                      error = -EPERM;
-+      }
-       if (error)
-               return error;
-       if (IS_APPEND(dir))
-               return -EPERM;
--      if (check_sticky(dir, victim->d_inode)||IS_APPEND(victim->d_inode)||
--          IS_IMMUTABLE(victim->d_inode))
-+      if (IS_APPEND(victim->d_inode) || IS_IMMUTABLE(victim->d_inode))
-               return -EPERM;
-       if (isdir) {
-               if (!S_ISDIR(victim->d_inode->i_mode))
-@@ -1432,13 +1443,28 @@ static int may_delete(struct inode *dir,
-  *  3. We should have write and exec permissions on dir
-  *  4. We can't do it if dir is immutable (done in permission())
-  */
--static inline int may_create(struct inode *dir, struct dentry *child)
-+static inline int may_create(struct inode *dir, struct dentry *child,
-+                           int isdir)
- {
-+      int error;
-+
-       if (child->d_inode)
-               return -EEXIST;
-       if (IS_DEADDIR(dir))
-               return -ENOENT;
--      return inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+
-+      if (dir->i_op->may_create) {
-+              if (IS_RDONLY(dir))
-+                      return -EROFS;
-+              if (IS_IMMUTABLE(dir))
-+                      return -EACCES;
-+              error = dir->i_op->may_create(dir, isdir);
-+              if (!error)
-+                      error = security_inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+      } else
-+              error = inode_permission(dir, MAY_WRITE | MAY_EXEC);
-+
-+      return error;
- }
- /* 
-@@ -1504,7 +1530,7 @@ void unlock_rename(struct dentry *p1, st
- int vfs_create(struct inode *dir, struct dentry *dentry, int mode,
-               struct nameidata *nd)
- {
--      int error = may_create(dir, dentry);
-+      int error = may_create(dir, dentry, 0);
-       if (error)
-               return error;
-@@ -1948,7 +1974,7 @@ EXPORT_SYMBOL_GPL(lookup_create);
- int vfs_mknod(struct inode *dir, struct dentry *dentry, int mode, dev_t dev)
- {
--      int error = may_create(dir, dentry);
-+      int error = may_create(dir, dentry, 0);
-       if (error)
-               return error;
-@@ -2049,7 +2075,7 @@ SYSCALL_DEFINE3(mknod, const char __user
- int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
- {
--      int error = may_create(dir, dentry);
-+      int error = may_create(dir, dentry, 1);
-       if (error)
-               return error;
-@@ -2316,7 +2342,7 @@ SYSCALL_DEFINE1(unlink, const char __use
- int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
- {
--      int error = may_create(dir, dentry);
-+      int error = may_create(dir, dentry, 0);
-       if (error)
-               return error;
-@@ -2386,7 +2412,7 @@ int vfs_link(struct dentry *old_dentry,
-       if (!inode)
-               return -ENOENT;
--      error = may_create(dir, new_dentry);
-+      error = may_create(dir, new_dentry, S_ISDIR(inode->i_mode));
-       if (error)
-               return error;
-@@ -2594,7 +2620,7 @@ int vfs_rename(struct inode *old_dir, st
-               return error;
-       if (!new_dentry->d_inode)
--              error = may_create(new_dir, new_dentry);
-+              error = may_create(new_dir, new_dentry, is_dir);
-       else
-               error = may_delete(new_dir, new_dentry, is_dir);
-       if (error)
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -1293,6 +1293,8 @@ struct inode_operations {
-       void (*put_link) (struct dentry *, struct nameidata *, void *);
-       void (*truncate) (struct inode *);
-       int (*permission) (struct inode *, int);
-+      int (*may_create) (struct inode *, int);
-+      int (*may_delete) (struct inode *, struct inode *);
-       int (*setattr) (struct dentry *, struct iattr *);
-       int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
-       int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/genksyms-add-override-flag.diff b/src/patches/suse-2.6.27.31/patches.suse/genksyms-add-override-flag.diff
deleted file mode 100644 (file)
index c0a2ea5..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: genksyms: add --override flag
-
-Add --override flag to genksyms to allow overriding types with old
-definitions using the 'override' keyword. This is similar to -p --preserve,
-but it doesn't abort the build if a symtype cannot be preserved
-
-[mmarek: added KBUILD_OVERRIDE env var to set this globally for the entire
- build]
----
- scripts/genksyms/genksyms.c |   21 +++++++++++++++------
- 1 file changed, 15 insertions(+), 6 deletions(-)
-
-Index: b/scripts/genksyms/genksyms.c
-===================================================================
---- a/scripts/genksyms/genksyms.c
-+++ b/scripts/genksyms/genksyms.c
-@@ -43,7 +43,7 @@ int cur_line = 1;
- char *cur_filename;
- static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
--         flag_preserve, flag_warnings;
-+         flag_override, flag_preserve, flag_warnings;
- static const char *arch = "";
- static const char *mod_prefix = "";
-@@ -200,7 +200,7 @@ struct symbol *__add_symbol(const char *
-                               sym->is_declared = 1;
-                               return sym;
-                       } else if (!sym->is_declared) {
--                              if (sym->is_override && flag_preserve) {
-+                              if (sym->is_override && flag_override) {
-                                       print_location();
-                                       fprintf(stderr, "ignoring ");
-                                       print_type_name(type, name);
-@@ -586,11 +586,13 @@ void export_symbol(const char *name)
-                       struct symbol *n = sym->expansion_trail;
-                       if (sym->status != STATUS_UNCHANGED) {
-+                              int fail = sym->is_override && flag_preserve;
-+
-                               if (!has_changed) {
-                                       print_location();
-                                       fprintf(stderr, "%s: %s: modversion "
-                                               "changed because of changes "
--                                              "in ", flag_preserve ? "error" :
-+                                              "in ", fail ? "error" :
-                                                      "warning", name);
-                               } else
-                                       fprintf(stderr, ", ");
-@@ -598,7 +600,7 @@ void export_symbol(const char *name)
-                               if (sym->status == STATUS_DEFINED)
-                                       fprintf(stderr, " (became defined)");
-                               has_changed = 1;
--                              if (flag_preserve)
-+                              if (fail)
-                                       errors++;
-                       }
-                       sym->expansion_trail = 0;
-@@ -655,6 +657,7 @@ static void genksyms_usage(void)
-             "  -D, --dump            Dump expanded symbol defs (for debugging only)\n"
-             "  -r, --reference file  Read reference symbols from a file\n"
-             "  -T, --dump-types file Dump expanded types into file\n"
-+            "  -o, --override        Allow to override reference modversions\n"
-             "  -p, --preserve        Preserve reference modversions or fail\n"
-             "  -w, --warnings        Enable warnings\n"
-             "  -q, --quiet           Disable warnings (default)\n"
-@@ -666,6 +669,7 @@ static void genksyms_usage(void)
-             "  -D                    Dump expanded symbol defs (for debugging only)\n"
-             "  -r file               Read reference symbols from a file\n"
-             "  -T file               Dump expanded types into file\n"
-+            "  -o                    Allow to override reference modversions\n"
-             "  -p                    Preserve reference modversions or fail\n"
-             "  -w                    Enable warnings\n"
-             "  -q                    Disable warnings (default)\n"
-@@ -690,15 +694,16 @@ int main(int argc, char **argv)
-               {"reference", 1, 0, 'r'},
-               {"dump-types", 1, 0, 'T'},
-               {"preserve", 0, 0, 'p'},
-+              {"override", 0, 0, 'o'},
-               {"version", 0, 0, 'V'},
-               {"help", 0, 0, 'h'},
-               {0, 0, 0, 0}
-       };
--      while ((o = getopt_long(argc, argv, "a:dwqVDr:T:ph",
-+      while ((o = getopt_long(argc, argv, "a:dwqVDr:T:oph",
-                               &long_opts[0], NULL)) != EOF)
- #else                         /* __GNU_LIBRARY__ */
--      while ((o = getopt(argc, argv, "a:dwqVDr:T:ph")) != EOF)
-+      while ((o = getopt(argc, argv, "a:dwqVDr:T:oph")) != EOF)
- #endif                                /* __GNU_LIBRARY__ */
-               switch (o) {
-               case 'a':
-@@ -735,7 +740,11 @@ int main(int argc, char **argv)
-                               return 1;
-                       }
-                       break;
-+              case 'o':
-+                      flag_override = 1;
-+                      break;
-               case 'p':
-+                      flag_override = 1;
-                       flag_preserve = 1;
-                       break;
-               case 'h':
-Index: b/scripts/Makefile.build
-===================================================================
---- a/scripts/Makefile.build
-+++ b/scripts/Makefile.build
-@@ -159,6 +159,7 @@ cmd_cc_symtypes_c     = \
-                             -r $(firstword $(wildcard                 \
-                                    $(@:.symtypes=.symref) /dev/null)) \
-                             $(if $(KBUILD_PRESERVE),-p)               \
-+                            $(if $(KBUILD_OVERRIDE),-o)               \
-                             -a $(ARCH)                                \
-                 >/dev/null;                                           \
-               test -s $@ || rm -f $@
-@@ -197,6 +198,7 @@ cmd_modversions =                                                  \
-                             -r $(firstword $(wildcard                 \
-                                    $(@:.o=.symref) /dev/null))        \
-                             $(if $(KBUILD_PRESERVE),-p)               \
-+                            $(if $(KBUILD_OVERRIDE),-o)               \
-                             -a $(ARCH)                                \
-               > $(@D)/.tmp_$(@F:.o=.ver);                             \
-                                                                       \
diff --git a/src/patches/suse-2.6.27.31/patches.suse/genksyms-override.diff b/src/patches/suse-2.6.27.31/patches.suse/genksyms-override.diff
deleted file mode 100644 (file)
index 1b77b4a..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: genksyms: allow to ignore symbol checksum changes
-
-This adds an "override" keyword for use in *.symvers / *.symref files.  When a
-symbol is overridden, the symbol's old definition will be used for computing
-checksums instead of the new one, preserving the previous checksum.  (Genksyms
-will still warn about the change.)
-
-This is meant to allow distributions to hide minor actual as well as fake ABI
-changes. (For example, when extra type information becomes available because
-additional headers are included, this may change checksums even though none of
-the types used have actully changed.)
-
-This approach also allows to get rid of "#ifdef __GENKSYMS__" hacks in the code,
-which are currently used in some vendor kernels to work around checksum changes.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- scripts/genksyms/genksyms.c |   34 ++++++++++++++++++++++++++++++----
- scripts/genksyms/genksyms.h |    1 +
- 2 files changed, 31 insertions(+), 4 deletions(-)
-
---- a/scripts/genksyms/genksyms.c
-+++ b/scripts/genksyms/genksyms.c
-@@ -191,11 +191,26 @@ struct symbol *__add_symbol(const char *
-                               /* fall through */ ;
-                       else if (sym->type == type &&
-                                equal_list(sym->defn, defn)) {
-+                              if (!sym->is_declared && sym->is_override) {
-+                                      print_location();
-+                                      print_type_name(type, name);
-+                                      fprintf(stderr, " modversion is "
-+                                              "unchanged\n");
-+                              }
-                               sym->is_declared = 1;
-                               return sym;
-                       } else if (!sym->is_declared) {
--                              status = is_unknown_symbol(sym) ?
--                                      STATUS_DEFINED : STATUS_MODIFIED;
-+                              if (sym->is_override && flag_preserve) {
-+                                      print_location();
-+                                      fprintf(stderr, "ignoring ");
-+                                      print_type_name(type, name);
-+                                      fprintf(stderr, " modversion change\n");
-+                                      sym->is_declared = 1;
-+                                      return sym;
-+                              } else {
-+                                      status = is_unknown_symbol(sym) ?
-+                                              STATUS_DEFINED : STATUS_MODIFIED;
-+                              }
-                       } else {
-                               error_with_pos("redefinition of %s", name);
-                               return sym;
-@@ -229,6 +244,7 @@ struct symbol *__add_symbol(const char *
-       sym->is_declared = !is_reference;
-       sym->status = status;
-+      sym->is_override = 0;
-       if (flag_debug) {
-               fprintf(debugfile, "Defn for %s %s == <",
-@@ -348,9 +364,16 @@ static void read_reference(FILE *f)
-       while (!feof(f)) {
-               struct string_list *defn = NULL;
-               struct string_list *sym, *def;
--              int is_extern = 0;
-+              int is_extern = 0, is_override = 0;
-+              struct symbol *subsym;
-               sym = read_node(f);
-+              if (sym && sym->tag == SYM_NORMAL &&
-+                  !strcmp(sym->string, "override")) {
-+                      is_override = 1;
-+                      free_node(sym);
-+                      sym = read_node(f);
-+              }
-               if (!sym)
-                       continue;
-               def = read_node(f);
-@@ -365,8 +388,9 @@ static void read_reference(FILE *f)
-                       defn = def;
-                       def = read_node(f);
-               }
--              add_reference_symbol(xstrdup(sym->string), sym->tag,
-+              subsym = add_reference_symbol(xstrdup(sym->string), sym->tag,
-                                             defn, is_extern);
-+              subsym->is_override = is_override;
-               free_node(sym);
-       }
- }
-@@ -743,6 +767,8 @@ int main(int argc, char **argv)
-               while (visited_symbols != (struct symbol *)-1L) {
-                       struct symbol *sym = visited_symbols;
-+                      if (sym->is_override)
-+                              fputs("override ", dumpfile);
-                       if (sym->type != SYM_NORMAL) {
-                               putc(symbol_type_name[sym->type][0], dumpfile);
-                               putc('#', dumpfile);
---- a/scripts/genksyms/genksyms.h
-+++ b/scripts/genksyms/genksyms.h
-@@ -49,6 +49,7 @@ struct symbol {
-       int is_extern;
-       int is_declared;
-       enum symbol_status status;
-+      int is_override;
- };
- typedef struct string_list **yystype;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/genksyms-reference.diff b/src/patches/suse-2.6.27.31/patches.suse/genksyms-reference.diff
deleted file mode 100644 (file)
index 9f440b9..0000000
+++ /dev/null
@@ -1,484 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: genksyms: track symbol checksum changes
-
-Sometimes it is preferable to avoid changes of exported symbol checksums (to
-avoid breaking externally provided modules).  When a checksum change occurs, it
-can be hard to figure out what caused this change: underlying types may have
-changed, or additional type information may simply have become available at the
-point where a symbol is exported.
-
-Add a new --reference option to genksyms which allows it to report why
-checksums change, based on the type information dumps it creates with
-the --dump-types flag.  Genksyms will read in such a dump from a previous run,
-and report which symbols have changed (and why).
-
-The behavior can be controlled for an entire build as follows: If
-KBUILD_SYMTYPES is set, genksyms uses --dump-types to produce *.symtypes dump
-files.  If any *.symref files exist, those will be used as the reference to
-check against.  If KBUILD_PRESERVE is set, checksum changes will fail the
-build.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- scripts/Makefile.build      |   16 ++
- scripts/genksyms/genksyms.c |  236 +++++++++++++++++++++++++++++++++++++++++---
- scripts/genksyms/genksyms.h |    6 +
- 3 files changed, 239 insertions(+), 19 deletions(-)
-
---- a/scripts/Makefile.build
-+++ b/scripts/Makefile.build
-@@ -153,12 +153,18 @@ $(obj)/%.i: $(src)/%.c FORCE
- quiet_cmd_cc_symtypes_c = SYM $(quiet_modtag) $@
- cmd_cc_symtypes_c        = \
-+              set -e;                                                 \
-               $(CPP) -D__GENKSYMS__ $(c_flags) $<                     \
--              | $(GENKSYMS) -T $@ >/dev/null;                         \
-+              | $(GENKSYMS) -T $@                                     \
-+                            -r $(firstword $(wildcard                 \
-+                                   $(@:.symtypes=.symref) /dev/null)) \
-+                            $(if $(KBUILD_PRESERVE),-p)               \
-+                            -a $(ARCH)                                \
-+                >/dev/null;                                           \
-               test -s $@ || rm -f $@
- $(obj)/%.symtypes : $(src)/%.c FORCE
--      $(call if_changed_dep,cc_symtypes_c)
-+      $(call cmd,cc_symtypes_c)
- # C (.c) files
- # The C file is compiled and updated dependency information is generated.
-@@ -187,7 +193,11 @@ cmd_modversions =                                                 \
-       if $(OBJDUMP) -h $(@D)/.tmp_$(@F) | grep -q __ksymtab; then     \
-               $(CPP) -D__GENKSYMS__ $(c_flags) $<                     \
-               | $(GENKSYMS) $(if $(KBUILD_SYMTYPES),                  \
--                            -T $(@D)/$(@F:.o=.symtypes)) -a $(ARCH)   \
-+                                 -T $(@:.o=.symtypes))                \
-+                            -r $(firstword $(wildcard                 \
-+                                   $(@:.o=.symref) /dev/null))        \
-+                            $(if $(KBUILD_PRESERVE),-p)               \
-+                            -a $(ARCH)                                \
-               > $(@D)/.tmp_$(@F:.o=.ver);                             \
-                                                                       \
-               $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F)              \
---- a/scripts/genksyms/genksyms.c
-+++ b/scripts/genksyms/genksyms.c
-@@ -42,7 +42,8 @@ static FILE *debugfile;
- int cur_line = 1;
- char *cur_filename;
--static int flag_debug, flag_dump_defs, flag_dump_types, flag_warnings;
-+static int flag_debug, flag_dump_defs, flag_reference, flag_dump_types,
-+         flag_preserve, flag_warnings;
- static const char *arch = "";
- static const char *mod_prefix = "";
-@@ -58,6 +59,8 @@ static const char *const symbol_type_nam
- static int equal_list(struct string_list *a, struct string_list *b);
- static void print_list(FILE * f, struct string_list *list);
-+static void print_location(void);
-+static void print_type_name(enum symbol_type type, const char *name);
- /*----------------------------------------------------------------------*/
-@@ -151,25 +154,66 @@ struct symbol *find_symbol(const char *n
-       for (sym = symtab[h]; sym; sym = sym->hash_next)
-               if (map_to_ns(sym->type) == map_to_ns(ns) &&
--                  strcmp(name, sym->name) == 0)
-+                  strcmp(name, sym->name) == 0 &&
-+                  sym->is_declared)
-                       break;
-       return sym;
- }
--struct symbol *add_symbol(const char *name, enum symbol_type type,
--                        struct string_list *defn, int is_extern)
-+static int is_unknown_symbol(struct symbol *sym)
-+{
-+      struct string_list *defn;
-+
-+      return ((sym->type == SYM_STRUCT ||
-+               sym->type == SYM_UNION ||
-+               sym->type == SYM_ENUM) &&
-+              (defn = sym->defn)  && defn->tag == SYM_NORMAL &&
-+                      strcmp(defn->string, "}") == 0 &&
-+              (defn = defn->next) && defn->tag == SYM_NORMAL &&
-+                      strcmp(defn->string, "UNKNOWN") == 0 &&
-+              (defn = defn->next) && defn->tag == SYM_NORMAL &&
-+                      strcmp(defn->string, "{") == 0);
-+}
-+
-+struct symbol *__add_symbol(const char *name, enum symbol_type type,
-+                          struct string_list *defn, int is_extern,
-+                          int is_reference)
- {
-       unsigned long h = crc32(name) % HASH_BUCKETS;
-       struct symbol *sym;
-+      enum symbol_status status = STATUS_UNCHANGED;
-       for (sym = symtab[h]; sym; sym = sym->hash_next) {
--              if (map_to_ns(sym->type) == map_to_ns(type)
--                  && strcmp(name, sym->name) == 0) {
--                      if (!equal_list(sym->defn, defn))
-+              if (map_to_ns(sym->type) == map_to_ns(type) &&
-+                  strcmp(name, sym->name) == 0) {
-+                      if (is_reference)
-+                              /* fall through */ ;
-+                      else if (sym->type == type &&
-+                               equal_list(sym->defn, defn)) {
-+                              sym->is_declared = 1;
-+                              return sym;
-+                      } else if (!sym->is_declared) {
-+                              status = is_unknown_symbol(sym) ?
-+                                      STATUS_DEFINED : STATUS_MODIFIED;
-+                      } else {
-                               error_with_pos("redefinition of %s", name);
--                      return sym;
-+                              return sym;
-+                      }
-+                      break;
-+              }
-+      }
-+
-+      if (sym) {
-+              struct symbol **psym;
-+
-+              for (psym = &symtab[h]; *psym; psym = &(*psym)->hash_next) {
-+                      if (*psym == sym) {
-+                              *psym = sym->hash_next;
-+                              break;
-+                      }
-               }
-+              --nsyms;
-       }
-       sym = xmalloc(sizeof(*sym));
-@@ -183,6 +227,9 @@ struct symbol *add_symbol(const char *na
-       sym->hash_next = symtab[h];
-       symtab[h] = sym;
-+      sym->is_declared = !is_reference;
-+      sym->status = status;
-+
-       if (flag_debug) {
-               fprintf(debugfile, "Defn for %s %s == <",
-                       symbol_type_name[type], name);
-@@ -196,6 +243,18 @@ struct symbol *add_symbol(const char *na
-       return sym;
- }
-+struct symbol *add_symbol(const char *name, enum symbol_type type,
-+                        struct string_list *defn, int is_extern)
-+{
-+      return __add_symbol(name, type, defn, is_extern, 0);
-+}
-+
-+struct symbol *add_reference_symbol(const char *name, enum symbol_type type,
-+                                  struct string_list *defn, int is_extern)
-+{
-+      return __add_symbol(name, type, defn, is_extern, 1);
-+}
-+
- /*----------------------------------------------------------------------*/
- void free_node(struct string_list *node)
-@@ -236,6 +295,82 @@ static int equal_list(struct string_list
-       return !a && !b;
- }
-+#define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
-+
-+struct string_list *read_node(FILE *f)
-+{
-+      char buffer[256];
-+      struct string_list node = {
-+              .string = buffer,
-+              .tag = SYM_NORMAL };
-+      int c;
-+
-+      while ((c = fgetc(f)) != EOF) {
-+              if (c == ' ') {
-+                      if (node.string == buffer)
-+                              continue;
-+                      break;
-+              } else if (c == '\n') {
-+                      if (node.string == buffer)
-+                              return NULL;
-+                      ungetc(c, f);
-+                      break;
-+              }
-+              if (node.string >= buffer + sizeof(buffer) - 1) {
-+                      fprintf(stderr, "Token too long\n");
-+                      exit(1);
-+              }
-+              *node.string++ = c;
-+      }
-+      if (node.string == buffer)
-+              return NULL;
-+      *node.string = 0;
-+      node.string = buffer;
-+
-+      if (node.string[1] == '#') {
-+              int n;
-+
-+              for (n = 0; n < ARRAY_SIZE(symbol_type_name); n++) {
-+                      if (node.string[0] == symbol_type_name[n][0]) {
-+                              node.tag = n;
-+                              node.string += 2;
-+                              return copy_node(&node);
-+                      }
-+              }
-+              fprintf(stderr, "Unknown type %c\n", node.string[0]);
-+              exit(1);
-+      }
-+      return copy_node(&node);
-+}
-+
-+static void read_reference(FILE *f)
-+{
-+      while (!feof(f)) {
-+              struct string_list *defn = NULL;
-+              struct string_list *sym, *def;
-+              int is_extern = 0;
-+
-+              sym = read_node(f);
-+              if (!sym)
-+                      continue;
-+              def = read_node(f);
-+              if (def && def->tag == SYM_NORMAL &&
-+                  !strcmp(def->string, "extern")) {
-+                      is_extern = 1;
-+                      free_node(def);
-+                      def = read_node(f);
-+              }
-+              while (def) {
-+                      def->next = defn;
-+                      defn = def;
-+                      def = read_node(f);
-+              }
-+              add_reference_symbol(xstrdup(sym->string), sym->tag,
-+                                            defn, is_extern);
-+              free_node(sym);
-+      }
-+}
-+
- static void print_node(FILE * f, struct string_list *list)
- {
-       if (list->tag != SYM_NORMAL) {
-@@ -311,6 +446,7 @@ static unsigned long expand_and_crc_sym(
-               case SYM_TYPEDEF:
-                       subsym = find_symbol(cur->string, cur->tag);
-+                      /* FIXME: Bad reference files can segfault here. */
-                       if (subsym->expansion_trail) {
-                               if (flag_dump_defs)
-                                       fprintf(debugfile, "%s ", cur->string);
-@@ -347,9 +483,22 @@ static unsigned long expand_and_crc_sym(
-                               t = n;
-                               n = xmalloc(sizeof(*n));
--                              n->string = xstrdup("{ UNKNOWN }");
-+                              n->string = xstrdup("{");
-+                              n->tag = SYM_NORMAL;
-+                              n->next = t;
-+                              t = n;
-+
-+                              n = xmalloc(sizeof(*n));
-+                              n->string = xstrdup("UNKNOWN");
-+                              n->tag = SYM_NORMAL;
-+                              n->next = t;
-+                              t = n;
-+
-+                              n = xmalloc(sizeof(*n));
-+                              n->string = xstrdup("}");
-                               n->tag = SYM_NORMAL;
-                               n->next = t;
-+                              t = n;
-                               subsym =
-                                   add_symbol(cur->string, cur->tag, n, 0);
-@@ -397,20 +546,42 @@ void export_symbol(const char *name)
-               error_with_pos("export undefined symbol %s", name);
-       else {
-               unsigned long crc;
-+              int has_changed = 0;
-               if (flag_dump_defs)
-                       fprintf(debugfile, "Export %s == <", name);
-               expansion_trail = (struct symbol *)-1L;
-+              sym->expansion_trail = expansion_trail;
-+              expansion_trail = sym;
-               crc = expand_and_crc_sym(sym, 0xffffffff) ^ 0xffffffff;
-               sym = expansion_trail;
-               while (sym != (struct symbol *)-1L) {
-                       struct symbol *n = sym->expansion_trail;
-+
-+                      if (sym->status != STATUS_UNCHANGED) {
-+                              if (!has_changed) {
-+                                      print_location();
-+                                      fprintf(stderr, "%s: %s: modversion "
-+                                              "changed because of changes "
-+                                              "in ", flag_preserve ? "error" :
-+                                                     "warning", name);
-+                              } else
-+                                      fprintf(stderr, ", ");
-+                              print_type_name(sym->type, sym->name);
-+                              if (sym->status == STATUS_DEFINED)
-+                                      fprintf(stderr, " (became defined)");
-+                              has_changed = 1;
-+                              if (flag_preserve)
-+                                      errors++;
-+                      }
-                       sym->expansion_trail = 0;
-                       sym = n;
-               }
-+              if (has_changed)
-+                      fprintf(stderr, "\n");
-               if (flag_dump_defs)
-                       fputs(">\n", debugfile);
-@@ -421,13 +592,26 @@ void export_symbol(const char *name)
- }
- /*----------------------------------------------------------------------*/
-+
-+static void print_location(void)
-+{
-+      fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>", cur_line);
-+}
-+
-+static void print_type_name(enum symbol_type type, const char *name)
-+{
-+      if (type != SYM_NORMAL)
-+              fprintf(stderr, "%s %s", symbol_type_name[type], name);
-+      else
-+              fprintf(stderr, "%s", name);
-+}
-+
- void error_with_pos(const char *fmt, ...)
- {
-       va_list args;
-       if (flag_warnings) {
--              fprintf(stderr, "%s:%d: ", cur_filename ? : "<stdin>",
--                      cur_line);
-+              print_location();
-               va_start(args, fmt);
-               vfprintf(stderr, fmt, args);
-@@ -445,7 +629,9 @@ static void genksyms_usage(void)
-             "  -a, --arch            Select architecture\n"
-             "  -d, --debug           Increment the debug level (repeatable)\n"
-             "  -D, --dump            Dump expanded symbol defs (for debugging only)\n"
--            "  -T, --dump-types file Dump expanded types into file (for debugging only)\n"
-+            "  -r, --reference file  Read reference symbols from a file\n"
-+            "  -T, --dump-types file Dump expanded types into file\n"
-+            "  -p, --preserve        Preserve reference modversions or fail\n"
-             "  -w, --warnings        Enable warnings\n"
-             "  -q, --quiet           Disable warnings (default)\n"
-             "  -h, --help            Print this message\n"
-@@ -454,7 +640,9 @@ static void genksyms_usage(void)
-             "  -a                    Select architecture\n"
-             "  -d                    Increment the debug level (repeatable)\n"
-             "  -D                    Dump expanded symbol defs (for debugging only)\n"
--            "  -T file               Dump expanded types into file (for debugging only)\n"
-+            "  -r file               Read reference symbols from a file\n"
-+            "  -T file               Dump expanded types into file\n"
-+            "  -p                    Preserve reference modversions or fail\n"
-             "  -w                    Enable warnings\n"
-             "  -q                    Disable warnings (default)\n"
-             "  -h                    Print this message\n"
-@@ -465,7 +653,7 @@ static void genksyms_usage(void)
- int main(int argc, char **argv)
- {
--      FILE *dumpfile = NULL;
-+      FILE *dumpfile = NULL, *ref_file = NULL;
-       int o;
- #ifdef __GNU_LIBRARY__
-@@ -475,16 +663,18 @@ int main(int argc, char **argv)
-               {"warnings", 0, 0, 'w'},
-               {"quiet", 0, 0, 'q'},
-               {"dump", 0, 0, 'D'},
-+              {"reference", 1, 0, 'r'},
-               {"dump-types", 1, 0, 'T'},
-+              {"preserve", 0, 0, 'p'},
-               {"version", 0, 0, 'V'},
-               {"help", 0, 0, 'h'},
-               {0, 0, 0, 0}
-       };
--      while ((o = getopt_long(argc, argv, "a:dwqVDT:h",
-+      while ((o = getopt_long(argc, argv, "a:dwqVDr:T:ph",
-                               &long_opts[0], NULL)) != EOF)
- #else                         /* __GNU_LIBRARY__ */
--      while ((o = getopt(argc, argv, "a:dwqVDT:h")) != EOF)
-+      while ((o = getopt(argc, argv, "a:dwqVDr:T:ph")) != EOF)
- #endif                                /* __GNU_LIBRARY__ */
-               switch (o) {
-               case 'a':
-@@ -505,6 +695,14 @@ int main(int argc, char **argv)
-               case 'D':
-                       flag_dump_defs = 1;
-                       break;
-+              case 'r':
-+                      flag_reference = 1;
-+                      ref_file = fopen(optarg, "r");
-+                      if (!ref_file) {
-+                              perror(optarg);
-+                              return 1;
-+                      }
-+                      break;
-               case 'T':
-                       flag_dump_types = 1;
-                       dumpfile = fopen(optarg, "w");
-@@ -513,6 +711,9 @@ int main(int argc, char **argv)
-                               return 1;
-                       }
-                       break;
-+              case 'p':
-+                      flag_preserve = 1;
-+                      break;
-               case 'h':
-                       genksyms_usage();
-                       return 0;
-@@ -533,6 +734,9 @@ int main(int argc, char **argv)
-               /* setlinebuf(debugfile); */
-       }
-+      if (flag_reference)
-+              read_reference(ref_file);
-+
-       yyparse();
-       if (flag_dump_types && visited_symbols) {
---- a/scripts/genksyms/genksyms.h
-+++ b/scripts/genksyms/genksyms.h
-@@ -29,6 +29,10 @@ enum symbol_type {
-       SYM_NORMAL, SYM_TYPEDEF, SYM_ENUM, SYM_STRUCT, SYM_UNION
- };
-+enum symbol_status {
-+      STATUS_UNCHANGED, STATUS_DEFINED, STATUS_MODIFIED
-+};
-+
- struct string_list {
-       struct string_list *next;
-       enum symbol_type tag;
-@@ -43,6 +47,8 @@ struct symbol {
-       struct symbol *expansion_trail;
-       struct symbol *visited;
-       int is_extern;
-+      int is_declared;
-+      enum symbol_status status;
- };
- typedef struct string_list **yystype;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/kdb-resolve-uv-conflict.diff b/src/patches/suse-2.6.27.31/patches.suse/kdb-resolve-uv-conflict.diff
deleted file mode 100644 (file)
index 937cf24..0000000
+++ /dev/null
@@ -1,224 +0,0 @@
-From: Jay Lan <jlan@sgi.com>
-Subject: [PATCH] Resolve KDB conflicts with UV
-References: bnc#440376
-
-Hi Keith,
-
-On Wed, Oct 29, 2008 at 03:57:25PM +1100, Keith Owens wrote:
-> However there is a separate problem with your patch.  You now wait in
-> smp_kdb_stop() until all cpus are in KDB.  If any cpu is completely
-> hung so it cannot be interrupted then smp_kdb_stop() will never return
-> and KDB will now appear to hang.
-> 
-> The existing code avoids this by
-> 
->   kdb() -> smp_kdb_stop() - issue KDB_VECTOR as normal interrupt but do not wait for cpus
->   kdb() -> kdba_main_loop()
->     kdba_main_loop() -> kdb_save_running()
->       kdb_save_running() -> kdb_main_loop()
->         kdb_main_loop() -> kdb_wait_for_cpus()
-> 
-> kdb_wait_for_cpus() waits until the other cpus are in KDB.  If a cpu
-> does not respond to KDB_VECTOR after a few seconds then
-> kdb_wait_for_cpus() hits the missing cpus with NMI.
-> 
-> This two step approach (send KDB_VECTOR as normal interrupt, wait then
-> send NMI) is used because NMI can be serviced at any time, even when
-> the target cpu is in the middle of servicing an interrupt.  This can
-> result in incomplete register state which leads to broken backtraces.
-> IOW, sending NMI first would actually make debugging harder.
-> 
-> Given the above logic, if you are going to take over an existing
-> interrupt vector then the vector needs to be acquired near the start of
-> kdb() and released near the end of kdb(), and only on the master cpu.
-> 
-> Note: there is no overwhelming need for KDB_VECTOR to have a high
-> priority.  As long as it is received within a few seconds then all is
-> well.
-
-Thanks for the explanation.  I see your point.
-
-How about if we keep the two step approach, but take over the vector
-when we need it, in step one.  Then give it back when the step two
- wait is over.
-(assuming we don't take over a vector needed for the NMI)
-
-Like this:
-
-Signed-off-by: Jay Lan <jlan@sgi.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/ia64/include/asm/kdb.h   |    4 ++++
- arch/x86/kdb/kdbasupport_32.c |   22 ++++++++++++++++++----
- arch/x86/kdb/kdbasupport_64.c |   23 +++++++++++++++++++----
- include/asm-x86/irq_vectors.h |   11 ++++++-----
- include/asm-x86/kdb.h         |    4 ++++
- kdb/kdbmain.c                 |    2 ++
- 6 files changed, 53 insertions(+), 13 deletions(-)
-
---- a/arch/ia64/include/asm/kdb.h
-+++ b/arch/ia64/include/asm/kdb.h
-@@ -42,4 +42,8 @@ kdba_funcptr_value(void *fp)
-       return *(unsigned long *)fp;
- }
-+#ifdef CONFIG_SMP
-+#define kdba_giveback_vector(vector) (0)
-+#endif
-+
- #endif        /* !_ASM_KDB_H */
---- a/arch/x86/kdb/kdbasupport_32.c
-+++ b/arch/x86/kdb/kdbasupport_32.c
-@@ -883,9 +883,6 @@ kdba_cpu_up(void)
- static int __init
- kdba_arch_init(void)
- {
--#ifdef        CONFIG_SMP
--      set_intr_gate(KDB_VECTOR, kdb_interrupt);
--#endif
-       set_intr_gate(KDBENTER_VECTOR, kdb_call);
-       return 0;
- }
-@@ -1027,14 +1024,31 @@ kdba_verify_rw(unsigned long addr, size_
- #include <mach_ipi.h>
-+gate_desc save_idt[NR_VECTORS];
-+
-+void kdba_takeover_vector(int vector)
-+{
-+      memcpy(&save_idt[vector], &idt_table[vector], sizeof(gate_desc));
-+      set_intr_gate(KDB_VECTOR, kdb_interrupt);
-+      return;
-+}
-+
-+void kdba_giveback_vector(int vector)
-+{
-+      native_write_idt_entry(idt_table, vector, &save_idt[vector]);
-+      return;
-+}
-+
- /* When first entering KDB, try a normal IPI.  That reduces backtrace problems
-  * on the other cpus.
-  */
- void
- smp_kdb_stop(void)
- {
--      if (!KDB_FLAG(NOIPI))
-+      if (!KDB_FLAG(NOIPI)) {
-+              kdba_takeover_vector(KDB_VECTOR);
-               send_IPI_allbutself(KDB_VECTOR);
-+      }
- }
- /* The normal KDB IPI handler */
---- a/arch/x86/kdb/kdbasupport_64.c
-+++ b/arch/x86/kdb/kdbasupport_64.c
-@@ -21,6 +21,7 @@
- #include <linux/interrupt.h>
- #include <linux/module.h>
- #include <linux/kdebug.h>
-+#include <linux/cpumask.h>
- #include <asm/processor.h>
- #include <asm/msr.h>
- #include <asm/uaccess.h>
-@@ -900,9 +901,6 @@ kdba_cpu_up(void)
- static int __init
- kdba_arch_init(void)
- {
--#ifdef        CONFIG_SMP
--      set_intr_gate(KDB_VECTOR, kdb_interrupt);
--#endif
-       set_intr_gate(KDBENTER_VECTOR, kdb_call);
-       return 0;
- }
-@@ -976,14 +974,31 @@ kdba_set_current_task(const struct task_
- #include <mach_ipi.h>
-+gate_desc save_idt[NR_VECTORS];
-+
-+void kdba_takeover_vector(int vector)
-+{
-+      memcpy(&save_idt[vector], &idt_table[vector], sizeof(gate_desc));
-+      set_intr_gate(KDB_VECTOR, kdb_interrupt);
-+      return;
-+}
-+
-+void kdba_giveback_vector(int vector)
-+{
-+      native_write_idt_entry(idt_table, vector, &save_idt[vector]);
-+      return;
-+}
-+
- /* When first entering KDB, try a normal IPI.  That reduces backtrace problems
-  * on the other cpus.
-  */
- void
- smp_kdb_stop(void)
- {
--      if (!KDB_FLAG(NOIPI))
-+      if (!KDB_FLAG(NOIPI)) {
-+              kdba_takeover_vector(KDB_VECTOR);
-               send_IPI_allbutself(KDB_VECTOR);
-+      }
- }
- /* The normal KDB IPI handler */
---- a/include/asm-x86/irq_vectors.h
-+++ b/include/asm-x86/irq_vectors.h
-@@ -66,7 +66,6 @@
- # define RESCHEDULE_VECTOR            0xfc
- # define CALL_FUNCTION_VECTOR         0xfb
- # define CALL_FUNCTION_SINGLE_VECTOR  0xfa
--#define       KDB_VECTOR                      0xf9
- # define THERMAL_APIC_VECTOR          0xf0
- #else
-@@ -79,10 +78,6 @@
- #define THERMAL_APIC_VECTOR           0xfa
- #define THRESHOLD_APIC_VECTOR         0xf9
- #define UV_BAU_MESSAGE                        0xf8
--/* Overload KDB_VECTOR with UV_BAU_MESSAGE. By the time the UV hardware is
-- * ready, we should have moved to a dynamically allocated vector scheme.
-- */
--#define KDB_VECTOR                    0xf8
- #define INVALIDATE_TLB_VECTOR_END     0xf7
- #define INVALIDATE_TLB_VECTOR_START   0xf0    /* f0-f7 used for TLB flush */
-@@ -91,6 +86,12 @@
- #endif
- /*
-+ * KDB_VECTOR will take over vector 0xfe when it is needed, as in theory
-+ * it should not be used anyway.
-+ */
-+#define KDB_VECTOR                    0xfe
-+
-+/*
-  * Local APIC timer IRQ vector is on a different priority level,
-  * to work around the 'lost local interrupt if more than 2 IRQ
-  * sources per level' errata.
---- a/include/asm-x86/kdb.h
-+++ b/include/asm-x86/kdb.h
-@@ -131,4 +131,8 @@ kdba_funcptr_value(void *fp)
-       return (unsigned long)fp;
- }
-+#ifdef CONFIG_SMP
-+extern void kdba_giveback_vector(int);
-+#endif
-+
- #endif        /* !_ASM_KDB_H */
---- a/kdb/kdbmain.c
-+++ b/kdb/kdbmain.c
-@@ -1666,6 +1666,8 @@ kdb_wait_for_cpus(void)
-                                       wait == 1 ? " is" : "s are",
-                                       wait == 1 ? "its" : "their");
-       }
-+      /* give back the vector we took over in smp_kdb_stop */
-+      kdba_giveback_vector(KDB_VECTOR);
- #endif        /* CONFIG_SMP */
- }
diff --git a/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ai.diff b/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ai.diff
deleted file mode 100644 (file)
index 6d4d82c..0000000
+++ /dev/null
@@ -1,123 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Implement those parts of Automatic Inheritance (AI) which are safe under POSIX
-
-If AI is disabled for a directory (ACL4_AUTO_INHERIT
-not set), nothing changes. If AI is enabled for a directory, the
-create-time inheritance algorithm changes as follows:
-
-* All inherited ACEs will have the ACE4_INHERITED_ACE flag set.
-
-* The create mode is applied to the ACL (by setting the file masks),
-which means that the ACL must no longer be subject to AI permission
-propagation, and so the ACL4_PROTECTED is set.
-
-By itelf, this is relatively useless because it will not allow
-permissions to propagate, but AI aware applications can clear the
-ACL4_PROTECTED flag when they know what they are doing, and this will
-enable AI permission propagation.
-
-It would be nice if AI aware applications could indicate this fact to
-the kernel so that the kernel can avoid setting the ACL4_PROTECTED flag
-in the first place, but there is no such user-space interface at this
-point.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/nfs4acl_base.c       |   12 ++++++++++--
- include/linux/nfs4acl.h |   26 +++++++++++++++++++++++---
- 2 files changed, 33 insertions(+), 5 deletions(-)
-
---- a/fs/nfs4acl_base.c
-+++ b/fs/nfs4acl_base.c
-@@ -151,7 +151,8 @@ nfs4acl_chmod(struct nfs4acl *acl, mode_
-       if (acl->a_owner_mask == owner_mask &&
-           acl->a_group_mask == group_mask &&
--          acl->a_other_mask == other_mask)
-+          acl->a_other_mask == other_mask &&
-+          (!nfs4acl_is_auto_inherit(acl) || nfs4acl_is_protected(acl)))
-               return acl;
-       clone = nfs4acl_clone(acl);
-@@ -162,6 +163,8 @@ nfs4acl_chmod(struct nfs4acl *acl, mode_
-       clone->a_owner_mask = owner_mask;
-       clone->a_group_mask = group_mask;
-       clone->a_other_mask = other_mask;
-+      if (nfs4acl_is_auto_inherit(clone))
-+              clone->a_flags |= ACL4_PROTECTED;
-       if (nfs4acl_write_through(&clone)) {
-               nfs4acl_put(clone);
-@@ -558,7 +561,12 @@ nfs4acl_inherit(const struct nfs4acl *di
-               return ERR_PTR(-ENOMEM);
-       }
--      acl->a_flags = (dir_acl->a_flags & ACL4_WRITE_THROUGH);
-+      acl->a_flags = (dir_acl->a_flags & ~ACL4_PROTECTED);
-+      if (nfs4acl_is_auto_inherit(acl)) {
-+              nfs4acl_for_each_entry(ace, acl)
-+                      ace->e_flags |= ACE4_INHERITED_ACE;
-+              acl->a_flags |= ACL4_PROTECTED;
-+      }
-       return acl;
- }
---- a/include/linux/nfs4acl.h
-+++ b/include/linux/nfs4acl.h
-@@ -32,10 +32,16 @@ struct nfs4acl {
-            _ace--)
- /* a_flags values */
-+#define ACL4_AUTO_INHERIT             0x01
-+#define ACL4_PROTECTED                        0x02
-+#define ACL4_DEFAULTED                        0x04
- #define ACL4_WRITE_THROUGH            0x40
--#define ACL4_VALID_FLAGS \
--      ACL4_WRITE_THROUGH
-+#define ACL4_VALID_FLAGS ( \
-+      ACL4_AUTO_INHERIT | \
-+      ACL4_PROTECTED | \
-+      ACL4_DEFAULTED | \
-+      ACL4_WRITE_THROUGH )
- /* e_type values */
- #define ACE4_ACCESS_ALLOWED_ACE_TYPE  0x0000
-@@ -51,6 +57,7 @@ struct nfs4acl {
- /*#define ACE4_SUCCESSFUL_ACCESS_ACE_FLAG     0x0010*/
- /*#define ACE4_FAILED_ACCESS_ACE_FLAG 0x0020*/
- #define ACE4_IDENTIFIER_GROUP         0x0040
-+#define ACE4_INHERITED_ACE            0x0080
- #define ACE4_SPECIAL_WHO              0x4000  /* in-memory representation only */
- #define ACE4_VALID_FLAGS ( \
-@@ -58,7 +65,8 @@ struct nfs4acl {
-       ACE4_DIRECTORY_INHERIT_ACE | \
-       ACE4_NO_PROPAGATE_INHERIT_ACE | \
-       ACE4_INHERIT_ONLY_ACE | \
--      ACE4_IDENTIFIER_GROUP )
-+      ACE4_IDENTIFIER_GROUP | \
-+      ACE4_INHERITED_ACE )
- /* e_mask bitflags */
- #define ACE4_READ_DATA                        0x00000001
-@@ -128,6 +136,18 @@ extern const char nfs4ace_group_who[];
- extern const char nfs4ace_everyone_who[];
- static inline int
-+nfs4acl_is_auto_inherit(const struct nfs4acl *acl)
-+{
-+      return acl->a_flags & ACL4_AUTO_INHERIT;
-+}
-+
-+static inline int
-+nfs4acl_is_protected(const struct nfs4acl *acl)
-+{
-+      return acl->a_flags & ACL4_PROTECTED;
-+}
-+
-+static inline int
- nfs4ace_is_owner(const struct nfs4ace *ace)
- {
-       return (ace->e_flags & ACE4_SPECIAL_WHO) &&
diff --git a/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-common.diff b/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-common.diff
deleted file mode 100644 (file)
index bccf826..0000000
+++ /dev/null
@@ -1,1770 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: NFSv4 ACL in-memory representation and manipulation
-    
-* In-memory representation (struct nfs4acl).
-* Functionality a filesystem needs such as permission checking,
-  apply mode to acl, compute mode from acl, inheritance upon file
-  create.
-* Compute a mask-less acl from struct nfs4acl that grants the same
-  permissions. Protocols which don't understand the masks need
-  this.
-* Convert to/from xattrs.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/Kconfig                    |    4 
- fs/Makefile                   |    4 
- fs/nfs4acl_base.c             |  565 +++++++++++++++++++++++++++++++
- fs/nfs4acl_compat.c           |  757 ++++++++++++++++++++++++++++++++++++++++++
- fs/nfs4acl_xattr.c            |  146 ++++++++
- include/linux/nfs4acl.h       |  205 +++++++++++
- include/linux/nfs4acl_xattr.h |   32 +
- 7 files changed, 1713 insertions(+)
-
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -419,6 +419,10 @@ config FS_POSIX_ACL
-       bool
-       default n
-+config FS_NFS4ACL
-+      bool
-+      default n
-+
- source "fs/xfs/Kconfig"
- source "fs/gfs2/Kconfig"
---- a/fs/Makefile
-+++ b/fs/Makefile
-@@ -50,6 +50,10 @@ obj-$(CONFIG_FS_POSIX_ACL)  += posix_acl.
- obj-$(CONFIG_NFS_COMMON)      += nfs_common/
- obj-$(CONFIG_GENERIC_ACL)     += generic_acl.o
-+obj-$(CONFIG_FS_NFS4ACL)      += nfs4acl.o
-+nfs4acl-y                     := nfs4acl_base.o nfs4acl_xattr.o \
-+                                 nfs4acl_compat.o
-+
- obj-$(CONFIG_QUOTA)           += dquot.o
- obj-$(CONFIG_QFMT_V1)         += quota_v1.o
- obj-$(CONFIG_QFMT_V2)         += quota_v2.o
---- /dev/null
-+++ b/fs/nfs4acl_base.c
-@@ -0,0 +1,565 @@
-+/*
-+ * Copyright (C) 2006 Andreas Gruenbacher <a.gruenbacher@computer.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/module.h>
-+#include <linux/fs.h>
-+#include <linux/nfs4acl.h>
-+
-+MODULE_LICENSE("GPL");
-+
-+/*
-+ * ACL entries that have ACE4_SPECIAL_WHO set in ace->e_flags use the
-+ * pointer values of these constants in ace->u.e_who to avoid massive
-+ * amounts of string comparisons.
-+ */
-+
-+const char nfs4ace_owner_who[]          = "OWNER@";
-+const char nfs4ace_group_who[]          = "GROUP@";
-+const char nfs4ace_everyone_who[] = "EVERYONE@";
-+
-+EXPORT_SYMBOL(nfs4ace_owner_who);
-+EXPORT_SYMBOL(nfs4ace_group_who);
-+EXPORT_SYMBOL(nfs4ace_everyone_who);
-+
-+/**
-+ * nfs4acl_alloc  -  allocate an acl
-+ * @count:    number of entries
-+ */
-+struct nfs4acl *
-+nfs4acl_alloc(int count)
-+{
-+      size_t size = sizeof(struct nfs4acl) + count * sizeof(struct nfs4ace);
-+      struct nfs4acl *acl = kmalloc(size, GFP_KERNEL);
-+
-+      if (acl) {
-+              memset(acl, 0, size);
-+              atomic_set(&acl->a_refcount, 1);
-+              acl->a_count = count;
-+      }
-+      return acl;
-+}
-+EXPORT_SYMBOL(nfs4acl_alloc);
-+
-+/**
-+ * nfs4acl_clone  -  create a copy of an acl
-+ */
-+struct nfs4acl *
-+nfs4acl_clone(const struct nfs4acl *acl)
-+{
-+      int count = acl->a_count;
-+      size_t size = sizeof(struct nfs4acl) + count * sizeof(struct nfs4ace);
-+      struct nfs4acl *dup = kmalloc(size, GFP_KERNEL);
-+
-+      if (dup) {
-+              memcpy(dup, acl, size);
-+              atomic_set(&dup->a_refcount, 1);
-+      }
-+      return dup;
-+}
-+
-+/*
-+ * The POSIX permissions are supersets of the below mask flags.
-+ *
-+ * The ACE4_READ_ATTRIBUTES and ACE4_READ_ACL flags are always granted
-+ * in POSIX. The ACE4_SYNCHRONIZE flag has no meaning under POSIX. We
-+ * make sure that we do not mask them if they are set, so that users who
-+ * rely on these flags won't get confused.
-+ */
-+#define ACE4_POSIX_MODE_READ ( \
-+      ACE4_READ_DATA | ACE4_LIST_DIRECTORY )
-+#define ACE4_POSIX_MODE_WRITE ( \
-+      ACE4_WRITE_DATA | ACE4_ADD_FILE | \
-+      ACE4_APPEND_DATA | ACE4_ADD_SUBDIRECTORY | \
-+      ACE4_DELETE_CHILD )
-+#define ACE4_POSIX_MODE_EXEC ( \
-+      ACE4_EXECUTE)
-+
-+static int
-+nfs4acl_mask_to_mode(unsigned int mask)
-+{
-+      int mode = 0;
-+
-+      if (mask & ACE4_POSIX_MODE_READ)
-+              mode |= MAY_READ;
-+      if (mask & ACE4_POSIX_MODE_WRITE)
-+              mode |= MAY_WRITE;
-+      if (mask & ACE4_POSIX_MODE_EXEC)
-+              mode |= MAY_EXEC;
-+
-+      return mode;
-+}
-+
-+/**
-+ * nfs4acl_masks_to_mode  -  compute file mode permission bits from file masks
-+ *
-+ * Compute the file mode permission bits from the file masks in the acl.
-+ */
-+int
-+nfs4acl_masks_to_mode(const struct nfs4acl *acl)
-+{
-+      return nfs4acl_mask_to_mode(acl->a_owner_mask) << 6 |
-+             nfs4acl_mask_to_mode(acl->a_group_mask) << 3 |
-+             nfs4acl_mask_to_mode(acl->a_other_mask);
-+}
-+EXPORT_SYMBOL(nfs4acl_masks_to_mode);
-+
-+static unsigned int
-+nfs4acl_mode_to_mask(mode_t mode)
-+{
-+      unsigned int mask = ACE4_POSIX_ALWAYS_ALLOWED;
-+
-+      if (mode & MAY_READ)
-+              mask |= ACE4_POSIX_MODE_READ;
-+      if (mode & MAY_WRITE)
-+              mask |= ACE4_POSIX_MODE_WRITE;
-+      if (mode & MAY_EXEC)
-+              mask |= ACE4_POSIX_MODE_EXEC;
-+
-+      return mask;
-+}
-+
-+/**
-+ * nfs4acl_chmod  -  update the file masks to reflect the new mode
-+ * @mode:     file mode permission bits to apply to the @acl
-+ *
-+ * Converts the mask flags corresponding to the owner, group, and other file
-+ * permissions and computes the file masks. Returns @acl if it already has the
-+ * appropriate file masks, or updates the flags in a copy of @acl. Takes over
-+ * @acl.
-+ */
-+struct nfs4acl *
-+nfs4acl_chmod(struct nfs4acl *acl, mode_t mode)
-+{
-+      unsigned int owner_mask, group_mask, other_mask;
-+      struct nfs4acl *clone;
-+
-+      owner_mask = nfs4acl_mode_to_mask(mode >> 6);
-+      group_mask = nfs4acl_mode_to_mask(mode >> 3);
-+      other_mask = nfs4acl_mode_to_mask(mode);
-+
-+      if (acl->a_owner_mask == owner_mask &&
-+          acl->a_group_mask == group_mask &&
-+          acl->a_other_mask == other_mask)
-+              return acl;
-+
-+      clone = nfs4acl_clone(acl);
-+      nfs4acl_put(acl);
-+      if (!clone)
-+              return ERR_PTR(-ENOMEM);
-+
-+      clone->a_owner_mask = owner_mask;
-+      clone->a_group_mask = group_mask;
-+      clone->a_other_mask = other_mask;
-+
-+      if (nfs4acl_write_through(&clone)) {
-+              nfs4acl_put(clone);
-+              clone = ERR_PTR(-ENOMEM);
-+      }
-+      return clone;
-+}
-+EXPORT_SYMBOL(nfs4acl_chmod);
-+
-+/**
-+ * nfs4acl_want_to_mask  - convert permission want argument to a mask
-+ * @want:     @want argument of the permission inode operation
-+ *
-+ * When checking for append, @want is (MAY_WRITE | MAY_APPEND).
-+ */
-+unsigned int
-+nfs4acl_want_to_mask(int want)
-+{
-+      unsigned int mask = 0;
-+
-+      if (want & MAY_READ)
-+              mask |= ACE4_READ_DATA;
-+      if (want & MAY_APPEND)
-+              mask |= ACE4_APPEND_DATA;
-+      else if (want & MAY_WRITE)
-+              mask |= ACE4_WRITE_DATA;
-+      if (want & MAY_EXEC)
-+              mask |= ACE4_EXECUTE;
-+
-+      return mask;
-+}
-+EXPORT_SYMBOL(nfs4acl_want_to_mask);
-+
-+/**
-+ * nfs4acl_capability_check  -  check for capabilities overriding read/write access
-+ * @inode:    inode to check
-+ * @mask:     requested access (ACE4_* bitmask)
-+ *
-+ * Capabilities other than CAP_DAC_OVERRIDE and CAP_DAC_READ_SEARCH must be checked
-+ * separately.
-+ */
-+static inline int nfs4acl_capability_check(struct inode *inode, unsigned int mask)
-+{
-+      /*
-+       * Read/write DACs are always overridable.
-+       * Executable DACs are overridable if at least one exec bit is set.
-+       */
-+      if (!(mask & (ACE4_WRITE_ACL | ACE4_WRITE_OWNER)) &&
-+          (!(mask & ACE4_EXECUTE) ||
-+          (inode->i_mode & S_IXUGO) || S_ISDIR(inode->i_mode)))
-+              if (capable(CAP_DAC_OVERRIDE))
-+                      return 0;
-+
-+      /*
-+       * Searching includes executable on directories, else just read.
-+       */
-+      if (!(mask & ~(ACE4_READ_DATA | ACE4_EXECUTE)) &&
-+          (S_ISDIR(inode->i_mode) || !(mask & ACE4_EXECUTE)))
-+              if (capable(CAP_DAC_READ_SEARCH))
-+                      return 0;
-+
-+      return -EACCES;
-+}
-+
-+/**
-+ * nfs4acl_permission  -  permission check algorithm with masking
-+ * @inode:    inode to check
-+ * @acl:      nfs4 acl of the inode
-+ * @mask:     requested access (ACE4_* bitmask)
-+ *
-+ * Checks if the current process is granted @mask flags in @acl. With
-+ * write-through, the OWNER@ is always granted the owner file mask, the
-+ * GROUP@ is always granted the group file mask, and EVERYONE@ is always
-+ * granted the other file mask. Otherwise, processes are only granted
-+ * @mask flags which they are granted in the @acl as well as in their
-+ * file mask.
-+ */
-+int nfs4acl_permission(struct inode *inode, const struct nfs4acl *acl,
-+                     unsigned int mask)
-+{
-+      const struct nfs4ace *ace;
-+      unsigned int file_mask, requested = mask, denied = 0;
-+      int in_owning_group = in_group_p(inode->i_gid);
-+      int owner_or_group_class = in_owning_group;
-+
-+      /*
-+       * A process is in the
-+       *   - owner file class if it owns the file, in the
-+       *   - group file class if it is in the file's owning group or
-+       *     it matches any of the user or group entries, and in the
-+       *   - other file class otherwise.
-+       */
-+
-+      nfs4acl_for_each_entry(ace, acl) {
-+              unsigned int ace_mask = ace->e_mask;
-+
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_owner(ace)) {
-+                      if (current->fsuid != inode->i_uid)
-+                              continue;
-+                      goto is_owner;
-+              } else if (nfs4ace_is_group(ace)) {
-+                      if (!in_owning_group)
-+                              continue;
-+              } else if (nfs4ace_is_unix_id(ace)) {
-+                      if (ace->e_flags & ACE4_IDENTIFIER_GROUP) {
-+                              if (!in_group_p(ace->u.e_id))
-+                                      continue;
-+                      } else {
-+                              if (current->fsuid != ace->u.e_id)
-+                                      continue;
-+                      }
-+              } else
-+                      goto is_everyone;
-+
-+              /*
-+               * Apply the group file mask to entries other than OWNER@ and
-+               * EVERYONE@. This is not required for correct access checking
-+               * but ensures that we grant the same permissions as the acl
-+               * computed by nfs4acl_apply_masks().
-+               *
-+               * For example, without this restriction, 'group@:rw::allow'
-+               * with mode 0600 would grant rw access to owner processes
-+               * which are also in the owning group. This cannot be expressed
-+               * in an acl.
-+               */
-+              if (nfs4ace_is_allow(ace))
-+                      ace_mask &= acl->a_group_mask;
-+
-+          is_owner:
-+              /* The process is in the owner or group file class. */
-+              owner_or_group_class = 1;
-+
-+          is_everyone:
-+              /* Check which mask flags the ACE allows or denies. */
-+              if (nfs4ace_is_deny(ace))
-+                      denied |= ace_mask & mask;
-+              mask &= ~ace_mask;
-+
-+              /* Keep going until we know which file class the process is in. */
-+              if (!mask && owner_or_group_class)
-+                      break;
-+      }
-+      denied |= mask;
-+
-+      /*
-+       * Figure out which file mask applies.
-+       * Clear write-through if the process is in the file group class but
-+       * not in the owning group, and so the denied permissions apply.
-+       */
-+      if (current->fsuid == inode->i_uid)
-+              file_mask = acl->a_owner_mask;
-+      else if (in_owning_group || owner_or_group_class)
-+              file_mask = acl->a_group_mask;
-+      else
-+              file_mask = acl->a_other_mask;
-+
-+      denied |= requested & ~file_mask;
-+      if (!denied)
-+              return 0;
-+      return nfs4acl_capability_check(inode, requested);
-+}
-+EXPORT_SYMBOL(nfs4acl_permission);
-+
-+/**
-+ * nfs4acl_generic_permission  -  permission check algorithm without explicit acl
-+ * @inode:    inode to check permissions for
-+ * @mask:     requested access (ACE4_* bitmask)
-+ *
-+ * The file mode of a file without ACL corresponds to an ACL with a single
-+ * "EVERYONE:~0::ALLOW" entry, with file masks that correspond to the file mode
-+ * permissions. Instead of constructing a temporary ACL and applying
-+ * nfs4acl_permission() to it, compute the identical result directly from the file
-+ * mode.
-+ */
-+int nfs4acl_generic_permission(struct inode *inode, unsigned int mask)
-+{
-+      int mode = inode->i_mode;
-+
-+      if (current->fsuid == inode->i_uid)
-+              mode >>= 6;
-+      else if (in_group_p(inode->i_gid))
-+              mode >>= 3;
-+      if (!(mask & ~nfs4acl_mode_to_mask(mode)))
-+              return 0;
-+      return nfs4acl_capability_check(inode, mask);
-+}
-+EXPORT_SYMBOL(nfs4acl_generic_permission);
-+
-+/*
-+ * nfs4ace_is_same_who  -  do both acl entries refer to the same identifier?
-+ */
-+int
-+nfs4ace_is_same_who(const struct nfs4ace *a, const struct nfs4ace *b)
-+{
-+#define WHO_FLAGS (ACE4_SPECIAL_WHO | ACE4_IDENTIFIER_GROUP)
-+      if ((a->e_flags & WHO_FLAGS) != (b->e_flags & WHO_FLAGS))
-+              return 0;
-+      if (a->e_flags & ACE4_SPECIAL_WHO)
-+              return a->u.e_who == b->u.e_who;
-+      else
-+              return a->u.e_id == b->u.e_id;
-+#undef WHO_FLAGS
-+}
-+
-+/**
-+ * nfs4acl_set_who  -  set a special who value
-+ * @ace:      acl entry
-+ * @who:      who value to use
-+ */
-+int
-+nfs4ace_set_who(struct nfs4ace *ace, const char *who)
-+{
-+      if (!strcmp(who, nfs4ace_owner_who))
-+              who = nfs4ace_owner_who;
-+      else if (!strcmp(who, nfs4ace_group_who))
-+              who = nfs4ace_group_who;
-+      else if (!strcmp(who, nfs4ace_everyone_who))
-+              who = nfs4ace_everyone_who;
-+      else
-+              return -EINVAL;
-+
-+      ace->u.e_who = who;
-+      ace->e_flags |= ACE4_SPECIAL_WHO;
-+      ace->e_flags &= ~ACE4_IDENTIFIER_GROUP;
-+      return 0;
-+}
-+EXPORT_SYMBOL(nfs4ace_set_who);
-+
-+/**
-+ * nfs4acl_allowed_to_who  -  mask flags allowed to a specific who value
-+ *
-+ * Computes the mask values allowed to a specific who value, taking
-+ * EVERYONE@ entries into account.
-+ */
-+static unsigned int
-+nfs4acl_allowed_to_who(struct nfs4acl *acl, struct nfs4ace *who)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed = 0;
-+
-+      nfs4acl_for_each_entry_reverse(ace, acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_same_who(ace, who) ||
-+                  nfs4ace_is_everyone(ace)) {
-+                      if (nfs4ace_is_allow(ace))
-+                              allowed |= ace->e_mask;
-+                      else if (nfs4ace_is_deny(ace))
-+                              allowed &= ~ace->e_mask;
-+              }
-+      }
-+      return allowed;
-+}
-+
-+/**
-+ * nfs4acl_compute_max_masks  -  compute upper bound masks
-+ *
-+ * Computes upper bound owner, group, and other masks so that none of
-+ * the mask flags allowed by the acl are disabled (for any choice of the
-+ * file owner or group membership).
-+ */
-+static void
-+nfs4acl_compute_max_masks(struct nfs4acl *acl)
-+{
-+      struct nfs4ace *ace;
-+
-+      acl->a_owner_mask = 0;
-+      acl->a_group_mask = 0;
-+      acl->a_other_mask = 0;
-+
-+      nfs4acl_for_each_entry_reverse(ace, acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+
-+              if (nfs4ace_is_owner(ace)) {
-+                      if (nfs4ace_is_allow(ace))
-+                              acl->a_owner_mask |= ace->e_mask;
-+                      else if (nfs4ace_is_deny(ace))
-+                              acl->a_owner_mask &= ~ace->e_mask;
-+              } else if (nfs4ace_is_everyone(ace)) {
-+                      if (nfs4ace_is_allow(ace)) {
-+                              struct nfs4ace who = {
-+                                      .e_flags = ACE4_SPECIAL_WHO,
-+                                      .u.e_who = nfs4ace_group_who,
-+                              };
-+
-+                              acl->a_other_mask |= ace->e_mask;
-+                              acl->a_group_mask |=
-+                                      nfs4acl_allowed_to_who(acl, &who);
-+                              acl->a_owner_mask |= ace->e_mask;
-+                      } else if (nfs4ace_is_deny(ace)) {
-+                              acl->a_other_mask &= ~ace->e_mask;
-+                              acl->a_group_mask &= ~ace->e_mask;
-+                              acl->a_owner_mask &= ~ace->e_mask;
-+                      }
-+              } else {
-+                      if (nfs4ace_is_allow(ace)) {
-+                              unsigned int mask =
-+                                      nfs4acl_allowed_to_who(acl, ace);
-+
-+                              acl->a_group_mask |= mask;
-+                              acl->a_owner_mask |= mask;
-+                      }
-+              }
-+      }
-+}
-+
-+/**
-+ * nfs4acl_inherit  -  compute the acl a new file will inherit
-+ * @dir_acl:  acl of the containing direcory
-+ * @mode:     file type and create mode of the new file
-+ *
-+ * Given the containing directory's acl, this function will compute the
-+ * acl that new files in that directory will inherit, or %NULL if
-+ * @dir_acl does not contain acl entries inheritable by this file.
-+ *
-+ * Without write-through, the file masks in the returned acl are set to
-+ * the intersection of the create mode and the maximum permissions
-+ * allowed to each file class. With write-through, the file masks are
-+ * set to the create mode.
-+ */
-+struct nfs4acl *
-+nfs4acl_inherit(const struct nfs4acl *dir_acl, mode_t mode)
-+{
-+      const struct nfs4ace *dir_ace;
-+      struct nfs4acl *acl;
-+      struct nfs4ace *ace;
-+      int count = 0;
-+
-+      if (S_ISDIR(mode)) {
-+              nfs4acl_for_each_entry(dir_ace, dir_acl) {
-+                      if (!nfs4ace_is_inheritable(dir_ace))
-+                              continue;
-+                      count++;
-+              }
-+              if (!count)
-+                      return NULL;
-+              acl = nfs4acl_alloc(count);
-+              if (!acl)
-+                      return ERR_PTR(-ENOMEM);
-+              ace = acl->a_entries;
-+              nfs4acl_for_each_entry(dir_ace, dir_acl) {
-+                      if (!nfs4ace_is_inheritable(dir_ace))
-+                              continue;
-+                      memcpy(ace, dir_ace, sizeof(struct nfs4ace));
-+                      if (dir_ace->e_flags & ACE4_NO_PROPAGATE_INHERIT_ACE)
-+                              nfs4ace_clear_inheritance_flags(ace);
-+                      if ((dir_ace->e_flags & ACE4_FILE_INHERIT_ACE) &&
-+                          !(dir_ace->e_flags & ACE4_DIRECTORY_INHERIT_ACE))
-+                              ace->e_flags |= ACE4_INHERIT_ONLY_ACE;
-+                      ace++;
-+              }
-+      } else {
-+              nfs4acl_for_each_entry(dir_ace, dir_acl) {
-+                      if (!(dir_ace->e_flags & ACE4_FILE_INHERIT_ACE))
-+                              continue;
-+                      count++;
-+              }
-+              if (!count)
-+                      return NULL;
-+              acl = nfs4acl_alloc(count);
-+              if (!acl)
-+                      return ERR_PTR(-ENOMEM);
-+              ace = acl->a_entries;
-+              nfs4acl_for_each_entry(dir_ace, dir_acl) {
-+                      if (!(dir_ace->e_flags & ACE4_FILE_INHERIT_ACE))
-+                              continue;
-+                      memcpy(ace, dir_ace, sizeof(struct nfs4ace));
-+                      nfs4ace_clear_inheritance_flags(ace);
-+                      ace++;
-+              }
-+      }
-+
-+      /* The maximum max flags that the owner, group, and other classes
-+         are allowed. */
-+      if (dir_acl->a_flags & ACL4_WRITE_THROUGH) {
-+              acl->a_owner_mask = ACE4_VALID_MASK;
-+              acl->a_group_mask = ACE4_VALID_MASK;
-+              acl->a_other_mask = ACE4_VALID_MASK;
-+
-+              mode &= ~current->fs->umask;
-+      } else
-+              nfs4acl_compute_max_masks(acl);
-+
-+      /* Apply the create mode. */
-+      acl->a_owner_mask &= nfs4acl_mode_to_mask(mode >> 6);
-+      acl->a_group_mask &= nfs4acl_mode_to_mask(mode >> 3);
-+      acl->a_other_mask &= nfs4acl_mode_to_mask(mode);
-+
-+      if (nfs4acl_write_through(&acl)) {
-+              nfs4acl_put(acl);
-+              return ERR_PTR(-ENOMEM);
-+      }
-+
-+      acl->a_flags = (dir_acl->a_flags & ACL4_WRITE_THROUGH);
-+
-+      return acl;
-+}
-+EXPORT_SYMBOL(nfs4acl_inherit);
---- /dev/null
-+++ b/fs/nfs4acl_compat.c
-@@ -0,0 +1,757 @@
-+/*
-+ * Copyright (C) 2006 Andreas Gruenbacher <a.gruenbacher@computer.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/fs.h>
-+#include <linux/nfs4acl.h>
-+
-+/**
-+ * struct nfs4acl_alloc  -  remember how many entries are actually allocated
-+ * @acl:      acl with a_count <= @count
-+ * @count:    the actual number of entries allocated in @acl
-+ *
-+ * We pass around this structure while modifying an acl, so that we do
-+ * not have to reallocate when we remove existing entries followed by
-+ * adding new entries.
-+ */
-+struct nfs4acl_alloc {
-+      struct nfs4acl *acl;
-+      unsigned int count;
-+};
-+
-+/**
-+ * nfs4acl_delete_entry  -  delete an entry in an acl
-+ * @x:                acl and number of allocated entries
-+ * @ace:      an entry in @x->acl
-+ *
-+ * Updates @ace so that it points to the entry before the deleted entry
-+ * on return. (When deleting the first entry, @ace will point to the
-+ * (non-existant) entry before the first entry). This behavior is the
-+ * expected behavior when deleting entries while forward iterating over
-+ * an acl.
-+ */
-+static void
-+nfs4acl_delete_entry(struct nfs4acl_alloc *x, struct nfs4ace **ace)
-+{
-+      void *end = x->acl->a_entries + x->acl->a_count;
-+
-+      memmove(*ace, *ace + 1, end - (void *)(*ace + 1));
-+      (*ace)--;
-+      x->acl->a_count--;
-+}
-+
-+/**
-+ * nfs4acl_insert_entry  -  insert an entry in an acl
-+ * @x:                acl and number of allocated entries
-+ * @ace:      entry before which the new entry shall be inserted
-+ *
-+ * Insert a new entry in @x->acl at position @ace, and zero-initialize
-+ * it.  This may require reallocating @x->acl.
-+ */
-+static int
-+nfs4acl_insert_entry(struct nfs4acl_alloc *x, struct nfs4ace **ace)
-+{
-+      if (x->count == x->acl->a_count) {
-+              int n = *ace - x->acl->a_entries;
-+              struct nfs4acl *acl2;
-+
-+              acl2 = nfs4acl_alloc(x->acl->a_count + 1);
-+              if (!acl2)
-+                      return -1;
-+              acl2->a_flags = x->acl->a_flags;
-+              acl2->a_owner_mask = x->acl->a_owner_mask;
-+              acl2->a_group_mask = x->acl->a_group_mask;
-+              acl2->a_other_mask = x->acl->a_other_mask;
-+              memcpy(acl2->a_entries, x->acl->a_entries,
-+                     n * sizeof(struct nfs4ace));
-+              memcpy(acl2->a_entries + n + 1, *ace,
-+                     (x->acl->a_count - n) * sizeof(struct nfs4ace));
-+              kfree(x->acl);
-+              x->acl = acl2;
-+              x->count = acl2->a_count;
-+              *ace = acl2->a_entries + n;
-+      } else {
-+              void *end = x->acl->a_entries + x->acl->a_count;
-+
-+              memmove(*ace + 1, *ace, end - (void *)*ace);
-+              x->acl->a_count++;
-+      }
-+      memset(*ace, 0, sizeof(struct nfs4ace));
-+      return 0;
-+}
-+
-+/**
-+ * nfs4ace_change_mask  -  change the mask in @ace to @mask
-+ * @x:                acl and number of allocated entries
-+ * @ace:      entry to modify
-+ * @mask:     new mask for @ace
-+ *
-+ * Set the effective mask of @ace to @mask. This will require splitting
-+ * off a separate acl entry if @ace is inheritable. In that case, the
-+ * effective- only acl entry is inserted after the inheritable acl
-+ * entry, end the inheritable acl entry is set to inheritable-only. If
-+ * @mode is 0, either set the original acl entry to inheritable-only if
-+ * it was inheritable, or remove it otherwise.  The returned @ace points
-+ * to the modified or inserted effective-only acl entry if that entry
-+ * exists, to the entry that has become inheritable-only, or else to the
-+ * previous entry in the acl. This is the expected behavior when
-+ * modifying masks while forward iterating over an acl.
-+ */
-+static int
-+nfs4ace_change_mask(struct nfs4acl_alloc *x, struct nfs4ace **ace,
-+                         unsigned int mask)
-+{
-+      if (mask && (*ace)->e_mask == mask)
-+              return 0;
-+      if (mask & ~ACE4_POSIX_ALWAYS_ALLOWED) {
-+              if (nfs4ace_is_inheritable(*ace)) {
-+                      if (nfs4acl_insert_entry(x, ace))
-+                              return -1;
-+                      memcpy(*ace, *ace + 1, sizeof(struct nfs4ace));
-+                      (*ace)->e_flags |= ACE4_INHERIT_ONLY_ACE;
-+                      (*ace)++;
-+                      nfs4ace_clear_inheritance_flags(*ace);
-+              }
-+              (*ace)->e_mask = mask;
-+      } else {
-+              if (nfs4ace_is_inheritable(*ace))
-+                      (*ace)->e_flags |= ACE4_INHERIT_ONLY_ACE;
-+              else
-+                      nfs4acl_delete_entry(x, ace);
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * nfs4acl_move_everyone_aces_down  -  move everyone@ acl entries to the end
-+ * @x:                acl and number of allocated entries
-+ *
-+ * Move all everyone acl entries to the bottom of the acl so that only a
-+ * single everyone@ allow acl entry remains at the end, and update the
-+ * mask fields of all acl entries on the way. If everyone@ is not
-+ * granted any permissions, no empty everyone@ acl entry is inserted.
-+ *
-+ * This transformation does not modify the permissions that the acl
-+ * grants, but we need it to simplify successive transformations.
-+ */
-+static int
-+nfs4acl_move_everyone_aces_down(struct nfs4acl_alloc *x)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed = 0, denied = 0;
-+
-+      nfs4acl_for_each_entry(ace, x->acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_everyone(ace)) {
-+                      if (nfs4ace_is_allow(ace))
-+                              allowed |= (ace->e_mask & ~denied);
-+                      else if (nfs4ace_is_deny(ace))
-+                              denied |= (ace->e_mask & ~allowed);
-+                      else
-+                              continue;
-+                      if (nfs4ace_change_mask(x, &ace, 0))
-+                              return -1;
-+              } else {
-+                      if (nfs4ace_is_allow(ace)) {
-+                              if (nfs4ace_change_mask(x, &ace, allowed |
-+                                              (ace->e_mask & ~denied)))
-+                                      return -1;
-+                      } else if (nfs4ace_is_deny(ace)) {
-+                              if (nfs4ace_change_mask(x, &ace, denied |
-+                                              (ace->e_mask & ~allowed)))
-+                                      return -1;
-+                      }
-+              }
-+      }
-+      if (allowed & ~ACE4_POSIX_ALWAYS_ALLOWED) {
-+              struct nfs4ace *last_ace = ace - 1;
-+
-+              if (nfs4ace_is_everyone(last_ace) &&
-+                  nfs4ace_is_allow(last_ace) &&
-+                  nfs4ace_is_inherit_only(last_ace) &&
-+                  last_ace->e_mask == allowed)
-+                      last_ace->e_flags &= ~ACE4_INHERIT_ONLY_ACE;
-+              else {
-+                      if (nfs4acl_insert_entry(x, &ace))
-+                              return -1;
-+                      ace->e_type = ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+                      ace->e_flags = ACE4_SPECIAL_WHO;
-+                      ace->e_mask = allowed;
-+                      ace->u.e_who = nfs4ace_everyone_who;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * __nfs4acl_propagate_everyone  -  propagate everyone@ mask flags up for @who
-+ * @x:                acl and number of allocated entries
-+ * @who:      identifier to propagate mask flags for
-+ * @allow:    mask flags to propagate up
-+ *
-+ * Propagate mask flags from the trailing everyone@ allow acl entry up
-+ * for the specified @who.
-+ *
-+ * The idea here is to precede the trailing EVERYONE@ ALLOW entry by an
-+ * additional @who ALLOW entry, but with the following optimizations:
-+ * (1) we don't bother setting any flags in the new @who ALLOW entry
-+ * that has already been allowed or denied by a previous @who entry, (2)
-+ * we merge the new @who entry with a previous @who entry if there is
-+ * such a previous @who entry and there are no intervening DENY entries
-+ * with mask flags that overlap the flags we care about.
-+ */
-+static int
-+__nfs4acl_propagate_everyone(struct nfs4acl_alloc *x, struct nfs4ace *who,
-+                        unsigned int allow)
-+{
-+      struct nfs4ace *allow_last = NULL, *ace;
-+
-+      /* Remove the mask flags from allow that are already determined for
-+         this who value, and figure out if there is an ALLOW entry for
-+         this who value that is "reachable" from the trailing EVERYONE@
-+         ALLOW ACE. */
-+      nfs4acl_for_each_entry(ace, x->acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_allow(ace)) {
-+                      if (nfs4ace_is_same_who(ace, who)) {
-+                              allow &= ~ace->e_mask;
-+                              allow_last = ace;
-+                      }
-+              } else if (nfs4ace_is_deny(ace)) {
-+                      if (nfs4ace_is_same_who(ace, who))
-+                              allow &= ~ace->e_mask;
-+                      if (allow & ace->e_mask)
-+                              allow_last = NULL;
-+              }
-+      }
-+
-+      if (allow) {
-+              if (allow_last)
-+                      return nfs4ace_change_mask(x, &allow_last,
-+                                                 allow_last->e_mask | allow);
-+              else {
-+                      struct nfs4ace who_copy;
-+
-+                      ace = x->acl->a_entries + x->acl->a_count - 1;
-+                      memcpy(&who_copy, who, sizeof(struct nfs4ace));
-+                      if (nfs4acl_insert_entry(x, &ace))
-+                              return -1;
-+                      memcpy(ace, &who_copy, sizeof(struct nfs4ace));
-+                      ace->e_type = ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+                      nfs4ace_clear_inheritance_flags(ace);
-+                      ace->e_mask = allow;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * nfs4acl_propagate_everyone  -  propagate everyone@ mask flags up the acl
-+ * @x:                acl and number of allocated entries
-+ *
-+ * Make sure for owner@, group@, and all other users, groups, and
-+ * special identifiers that they are allowed or denied all permissions
-+ * that are granted be the trailing everyone@ acl entry. If they are
-+ * not, try to add the missing permissions to existing allow acl entries
-+ * for those users, or introduce additional acl entries if that is not
-+ * possible.
-+ *
-+ * We do this so that no mask flags will get lost when finally applying
-+ * the file masks to the acl entries: otherwise, with an other file mask
-+ * that is more restrictive than the owner and/or group file mask, mask
-+ * flags that were allowed to processes in the owner and group classes
-+ * and that the other mask denies would be lost. For example, the
-+ * following two acls show the problem when mode 0664 is applied to
-+ * them:
-+ *
-+ *    masking without propagation (wrong)
-+ *    ===========================================================
-+ *    joe:r::allow            => joe:r::allow
-+ *    everyone@:rwx::allow    => everyone@:r::allow
-+ *    -----------------------------------------------------------
-+ *    joe:w::deny             => joe:w::deny
-+ *    everyone@:rwx::allow       everyone@:r::allow
-+ *
-+ * Note that the permissions of joe end up being more restrictive than
-+ * what the acl would allow when first computing the allowed flags and
-+ * then applying the respective mask. With propagation of permissions,
-+ * we get:
-+ *
-+ *    masking after propagation (correct)
-+ *    ===========================================================
-+ *    joe:r::allow            => joe:rw::allow
-+ *                               owner@:rw::allow
-+ *                               group@:rw::allow
-+ *    everyone@:rwx::allow       everyone@:r::allow
-+ *    -----------------------------------------------------------
-+ *    joe:w::deny             => owner@:x::deny
-+ *                               joe:w::deny
-+ *                               owner@:rw::allow
-+ *                               owner@:rw::allow
-+ *                               joe:r::allow
-+ *    everyone@:rwx::allow       everyone@:r::allow
-+ *
-+ * The examples show the acls that would result from propagation with no
-+ * masking performed. In fact, we do apply the respective mask to the
-+ * acl entries before computing the propagation because this will save
-+ * us from adding acl entries that would end up with empty mask fields
-+ * after applying the masks.
-+ *
-+ * It is ensured that no more than one entry will be inserted for each
-+ * who value, no matter how many entries each who value has already.
-+ */
-+static int
-+nfs4acl_propagate_everyone(struct nfs4acl_alloc *x)
-+{
-+      int write_through = (x->acl->a_flags & ACL4_WRITE_THROUGH);
-+      struct nfs4ace who = { .e_flags = ACE4_SPECIAL_WHO };
-+      struct nfs4ace *ace;
-+      unsigned int owner_allow, group_allow;
-+      int retval;
-+
-+      if (!((x->acl->a_owner_mask | x->acl->a_group_mask) &
-+            ~x->acl->a_other_mask))
-+              return 0;
-+      if (!x->acl->a_count)
-+              return 0;
-+      ace = x->acl->a_entries + x->acl->a_count - 1;
-+      if (nfs4ace_is_inherit_only(ace) || !nfs4ace_is_everyone(ace))
-+              return 0;
-+      if (!(ace->e_mask & ~x->acl->a_other_mask)) {
-+              /* None of the allowed permissions will get masked. */
-+              return 0;
-+      }
-+      owner_allow = ace->e_mask & x->acl->a_owner_mask;
-+      group_allow = ace->e_mask & x->acl->a_group_mask;
-+
-+      /* Propagate everyone@ permissions through to owner@. */
-+      if (owner_allow && !write_through &&
-+          (x->acl->a_owner_mask & ~x->acl->a_other_mask)) {
-+              who.u.e_who = nfs4ace_owner_who;
-+              retval = __nfs4acl_propagate_everyone(x, &who, owner_allow);
-+              if (retval)
-+                      return -1;
-+      }
-+
-+      if (group_allow && (x->acl->a_group_mask & ~x->acl->a_other_mask)) {
-+              int n;
-+
-+              if (!write_through) {
-+                      /* Propagate everyone@ permissions through to group@. */
-+                      who.u.e_who = nfs4ace_group_who;
-+                      retval = __nfs4acl_propagate_everyone(x, &who,
-+                                                            group_allow);
-+                      if (retval)
-+                              return -1;
-+              }
-+
-+              /* Start from the entry before the trailing EVERYONE@ ALLOW
-+                 entry. We will not hit EVERYONE@ entries in the loop. */
-+              for (n = x->acl->a_count - 2; n != -1; n--) {
-+                      ace = x->acl->a_entries + n;
-+
-+                      if (nfs4ace_is_inherit_only(ace) ||
-+                          nfs4ace_is_owner(ace) ||
-+                          nfs4ace_is_group(ace))
-+                              continue;
-+                      if (nfs4ace_is_allow(ace) || nfs4ace_is_deny(ace)) {
-+                              /* Any inserted entry will end up below the
-+                                 current entry. */
-+                              retval = __nfs4acl_propagate_everyone(x, ace,
-+                                                                 group_allow);
-+                              if (retval)
-+                                      return -1;
-+                      }
-+              }
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * __nfs4acl_apply_masks  -  apply the masks to the acl entries
-+ * @x:                acl and number of allocated entries
-+ *
-+ * Apply the owner file mask to owner@ entries, the intersection of the
-+ * group and other file masks to everyone@ entries, and the group file
-+ * mask to all other entries.
-+ */
-+static int
-+__nfs4acl_apply_masks(struct nfs4acl_alloc *x)
-+{
-+      struct nfs4ace *ace;
-+
-+      nfs4acl_for_each_entry(ace, x->acl) {
-+              unsigned int mask;
-+
-+              if (nfs4ace_is_inherit_only(ace) || !nfs4ace_is_allow(ace))
-+                      continue;
-+              if (nfs4ace_is_owner(ace))
-+                      mask = x->acl->a_owner_mask;
-+              else if (nfs4ace_is_everyone(ace))
-+                      mask = x->acl->a_other_mask;
-+              else
-+                      mask = x->acl->a_group_mask;
-+              if (nfs4ace_change_mask(x, &ace, ace->e_mask & mask))
-+                      return -1;
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * nfs4acl_max_allowed  -  maximum mask flags that anybody is allowed
-+ */
-+static unsigned int
-+nfs4acl_max_allowed(struct nfs4acl *acl)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed = 0;
-+
-+      nfs4acl_for_each_entry_reverse(ace, acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_allow(ace))
-+                      allowed |= ace->e_mask;
-+              else if (nfs4ace_is_deny(ace)) {
-+                      if (nfs4ace_is_everyone(ace))
-+                              allowed &= ~ace->e_mask;
-+              }
-+      }
-+      return allowed;
-+}
-+
-+/**
-+ * nfs4acl_isolate_owner_class  -  limit the owner class to the owner file mask
-+ * @x:                acl and number of allocated entries
-+ *
-+ * Make sure the owner class (owner@) is granted no more than the owner
-+ * mask by first checking which permissions anyone is granted, and then
-+ * denying owner@ all permissions beyond that.
-+ */
-+static int
-+nfs4acl_isolate_owner_class(struct nfs4acl_alloc *x)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed = 0;
-+
-+      allowed = nfs4acl_max_allowed(x->acl);
-+      if (allowed & ~x->acl->a_owner_mask) {
-+              /* Figure out if we can update an existig OWNER@ DENY entry. */
-+              nfs4acl_for_each_entry(ace, x->acl) {
-+                      if (nfs4ace_is_inherit_only(ace))
-+                              continue;
-+                      if (nfs4ace_is_deny(ace)) {
-+                              if (nfs4ace_is_owner(ace))
-+                                      break;
-+                      } else if (nfs4ace_is_allow(ace)) {
-+                              ace = x->acl->a_entries + x->acl->a_count;
-+                              break;
-+                      }
-+              }
-+              if (ace != x->acl->a_entries + x->acl->a_count) {
-+                      if (nfs4ace_change_mask(x, &ace, ace->e_mask |
-+                                      (allowed & ~x->acl->a_owner_mask)))
-+                              return -1;
-+              } else {
-+                      /* Insert an owner@ deny entry at the front. */
-+                      ace = x->acl->a_entries;
-+                      if (nfs4acl_insert_entry(x, &ace))
-+                              return -1;
-+                      ace->e_type = ACE4_ACCESS_DENIED_ACE_TYPE;
-+                      ace->e_flags = ACE4_SPECIAL_WHO;
-+                      ace->e_mask = allowed & ~x->acl->a_owner_mask;
-+                      ace->u.e_who = nfs4ace_owner_who;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * __nfs4acl_isolate_who  -  isolate entry from EVERYONE@ ALLOW entry
-+ * @x:                acl and number of allocated entries
-+ * @who:      identifier to isolate
-+ * @deny:     mask flags this identifier should not be allowed
-+ *
-+ * Make sure that @who is not allowed any mask flags in @deny by checking
-+ * which mask flags this identifier is allowed, and adding excess allowed
-+ * mask flags to an existing DENY entry before the trailing EVERYONE@ ALLOW
-+ * entry, or inserting such an entry.
-+ */
-+static int
-+__nfs4acl_isolate_who(struct nfs4acl_alloc *x, struct nfs4ace *who,
-+                    unsigned int deny)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed = 0, n;
-+
-+      /* Compute the mask flags granted to this who value. */
-+      nfs4acl_for_each_entry_reverse(ace, x->acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_same_who(ace, who)) {
-+                      if (nfs4ace_is_allow(ace))
-+                              allowed |= ace->e_mask;
-+                      else if (nfs4ace_is_deny(ace))
-+                              allowed &= ~ace->e_mask;
-+                      deny &= ~ace->e_mask;
-+              }
-+      }
-+      if (!deny)
-+              return 0;
-+
-+      /* Figure out if we can update an existig DENY entry.  Start
-+         from the entry before the trailing EVERYONE@ ALLOW entry. We
-+         will not hit EVERYONE@ entries in the loop. */
-+      for (n = x->acl->a_count - 2; n != -1; n--) {
-+              ace = x->acl->a_entries + n;
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_deny(ace)) {
-+                      if (nfs4ace_is_same_who(ace, who))
-+                              break;
-+              } else if (nfs4ace_is_allow(ace) &&
-+                         (ace->e_mask & deny)) {
-+                      n = -1;
-+                      break;
-+              }
-+      }
-+      if (n != -1) {
-+              if (nfs4ace_change_mask(x, &ace, ace->e_mask | deny))
-+                      return -1;
-+      } else {
-+              /* Insert a eny entry before the trailing EVERYONE@ DENY
-+                 entry. */
-+              struct nfs4ace who_copy;
-+
-+              ace = x->acl->a_entries + x->acl->a_count - 1;
-+              memcpy(&who_copy, who, sizeof(struct nfs4ace));
-+              if (nfs4acl_insert_entry(x, &ace))
-+                      return -1;
-+              memcpy(ace, &who_copy, sizeof(struct nfs4ace));
-+              ace->e_type = ACE4_ACCESS_DENIED_ACE_TYPE;
-+              nfs4ace_clear_inheritance_flags(ace);
-+              ace->e_mask = deny;
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * nfs4acl_isolate_group_class  -  limit the group class to the group file mask
-+ * @x:                acl and number of allocated entries
-+ *
-+ * Make sure the group class (all entries except owner@ and everyone@) is
-+ * granted no more than the group mask by inserting DENY entries for group
-+ * class entries where necessary.
-+ */
-+static int
-+nfs4acl_isolate_group_class(struct nfs4acl_alloc *x)
-+{
-+      struct nfs4ace who = {
-+              .e_flags = ACE4_SPECIAL_WHO,
-+              .u.e_who = nfs4ace_group_who,
-+      };
-+      struct nfs4ace *ace;
-+      unsigned int deny;
-+
-+      if (!x->acl->a_count)
-+              return 0;
-+      ace = x->acl->a_entries + x->acl->a_count - 1;
-+      if (nfs4ace_is_inherit_only(ace) || !nfs4ace_is_everyone(ace))
-+              return 0;
-+      deny = ace->e_mask & ~x->acl->a_group_mask;
-+
-+      if (deny) {
-+              unsigned int n;
-+
-+              if (__nfs4acl_isolate_who(x, &who, deny))
-+                      return -1;
-+
-+              /* Start from the entry before the trailing EVERYONE@ ALLOW
-+                 entry. We will not hit EVERYONE@ entries in the loop. */
-+              for (n = x->acl->a_count - 2; n != -1; n--) {
-+                      ace = x->acl->a_entries + n;
-+
-+                      if (nfs4ace_is_inherit_only(ace) ||
-+                          nfs4ace_is_owner(ace) ||
-+                          nfs4ace_is_group(ace))
-+                              continue;
-+                      if (__nfs4acl_isolate_who(x, ace, deny))
-+                              return -1;
-+              }
-+      }
-+      return 0;
-+}
-+
-+/**
-+ * __nfs4acl_write_through  -  grant the full masks to owner@, group@, everyone@
-+ *
-+ * Make sure that owner, group@, and everyone@ are allowed the full mask
-+ * permissions, and not only the permissions granted both by the acl and
-+ * the masks.
-+ */
-+static int
-+__nfs4acl_write_through(struct nfs4acl_alloc *x)
-+{
-+      struct nfs4ace *ace;
-+      unsigned int allowed;
-+
-+      /* Remove all owner@ and group@ ACEs: we re-insert them at the
-+         top. */
-+      nfs4acl_for_each_entry(ace, x->acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if ((nfs4ace_is_owner(ace) || nfs4ace_is_group(ace)) &&
-+                  nfs4ace_change_mask(x, &ace, 0))
-+                      return -1;
-+      }
-+
-+      /* Insert the everyone@ allow entry at the end, or update the
-+         existing entry. */
-+      allowed = x->acl->a_other_mask;
-+      if (allowed & ~ACE4_POSIX_ALWAYS_ALLOWED) {
-+              ace = x->acl->a_entries + x->acl->a_count - 1;
-+              if (x->acl->a_count && nfs4ace_is_everyone(ace) &&
-+                  !nfs4ace_is_inherit_only(ace)) {
-+                      if (nfs4ace_change_mask(x, &ace, allowed))
-+                              return -1;
-+              } else {
-+                      ace = x->acl->a_entries + x->acl->a_count;
-+                      if (nfs4acl_insert_entry(x, &ace))
-+                              return -1;
-+                      ace->e_type = ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+                      ace->e_flags = ACE4_SPECIAL_WHO;
-+                      ace->e_mask = allowed;
-+                      ace->u.e_who = nfs4ace_everyone_who;
-+              }
-+      }
-+
-+      /* Compute the permissions that owner@ and group@ are already granted
-+         though the everyone@ allow entry at the end. Note that the acl
-+         contains no owner@ or group@ entries at this point. */
-+      allowed = 0;
-+      nfs4acl_for_each_entry_reverse(ace, x->acl) {
-+              if (nfs4ace_is_inherit_only(ace))
-+                      continue;
-+              if (nfs4ace_is_allow(ace)) {
-+                      if (nfs4ace_is_everyone(ace))
-+                              allowed |= ace->e_mask;
-+              } else if (nfs4ace_is_deny(ace))
-+                              allowed &= ~ace->e_mask;
-+      }
-+
-+      /* Insert the appropriate group@ allow entry at the front. */
-+      if (x->acl->a_group_mask & ~allowed) {
-+              ace = x->acl->a_entries;
-+              if (nfs4acl_insert_entry(x, &ace))
-+                      return -1;
-+              ace->e_type = ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+              ace->e_flags = ACE4_SPECIAL_WHO;
-+              ace->e_mask = x->acl->a_group_mask /*& ~allowed*/;
-+              ace->u.e_who = nfs4ace_group_who;
-+      }
-+
-+      /* Insert the appropriate owner@ allow entry at the front. */
-+      if (x->acl->a_owner_mask & ~allowed) {
-+              ace = x->acl->a_entries;
-+              if (nfs4acl_insert_entry(x, &ace))
-+                      return -1;
-+              ace->e_type = ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+              ace->e_flags = ACE4_SPECIAL_WHO;
-+              ace->e_mask = x->acl->a_owner_mask /*& ~allowed*/;
-+              ace->u.e_who = nfs4ace_owner_who;
-+      }
-+
-+      /* Insert the appropriate owner@ deny entry at the front. */
-+      allowed = nfs4acl_max_allowed(x->acl);
-+      if (allowed & ~x->acl->a_owner_mask) {
-+              nfs4acl_for_each_entry(ace, x->acl) {
-+                      if (nfs4ace_is_inherit_only(ace))
-+                              continue;
-+                      if (nfs4ace_is_allow(ace)) {
-+                              ace = x->acl->a_entries + x->acl->a_count;
-+                              break;
-+                      }
-+                      if (nfs4ace_is_deny(ace) && nfs4ace_is_owner(ace))
-+                              break;
-+              }
-+              if (ace != x->acl->a_entries + x->acl->a_count) {
-+                      if (nfs4ace_change_mask(x, &ace, ace->e_mask |
-+                                      (allowed & ~x->acl->a_owner_mask)))
-+                              return -1;
-+              } else {
-+                      ace = x->acl->a_entries;
-+                      if (nfs4acl_insert_entry(x, &ace))
-+                              return -1;
-+                      ace->e_type = ACE4_ACCESS_DENIED_ACE_TYPE;
-+                      ace->e_flags = ACE4_SPECIAL_WHO;
-+                      ace->e_mask = allowed & ~x->acl->a_owner_mask;
-+                      ace->u.e_who = nfs4ace_owner_who;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+/**
-+ * nfs4acl_apply_masks  -  apply the masks to the acl
-+ *
-+ * Apply the masks so that the acl allows no more flags than the
-+ * intersection between the flags that the original acl allows and the
-+ * mask matching the process.
-+ *
-+ * Note: this algorithm may push the number of entries in the acl above
-+ * ACL4_XATTR_MAX_COUNT, so a read-modify-write cycle would fail.
-+ */
-+int
-+nfs4acl_apply_masks(struct nfs4acl **acl)
-+{
-+      struct nfs4acl_alloc x = {
-+              .acl = *acl,
-+              .count = (*acl)->a_count,
-+      };
-+      int retval = 0;
-+
-+      if (nfs4acl_move_everyone_aces_down(&x) ||
-+          nfs4acl_propagate_everyone(&x) ||
-+          __nfs4acl_apply_masks(&x) ||
-+          nfs4acl_isolate_owner_class(&x) ||
-+          nfs4acl_isolate_group_class(&x))
-+              retval = -ENOMEM;
-+
-+      *acl = x.acl;
-+      return retval;
-+}
-+EXPORT_SYMBOL(nfs4acl_apply_masks);
-+
-+int nfs4acl_write_through(struct nfs4acl **acl)
-+{
-+      struct nfs4acl_alloc x = {
-+              .acl = *acl,
-+              .count = (*acl)->a_count,
-+      };
-+      int retval = 0;
-+
-+      if (!((*acl)->a_flags & ACL4_WRITE_THROUGH))
-+              goto out;
-+
-+      if (nfs4acl_move_everyone_aces_down(&x) ||
-+          nfs4acl_propagate_everyone(&x) ||
-+          __nfs4acl_write_through(&x))
-+              retval = -ENOMEM;
-+
-+      *acl = x.acl;
-+out:
-+      return retval;
-+}
---- /dev/null
-+++ b/fs/nfs4acl_xattr.c
-@@ -0,0 +1,146 @@
-+/*
-+ * Copyright (C) 2006 Andreas Gruenbacher <a.gruenbacher@computer.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+#include <linux/nfs4acl_xattr.h>
-+
-+MODULE_LICENSE("GPL");
-+
-+struct nfs4acl *
-+nfs4acl_from_xattr(const void *value, size_t size)
-+{
-+      const struct nfs4acl_xattr *xattr_acl = value;
-+      const struct nfs4ace_xattr *xattr_ace = (void *)(xattr_acl + 1);
-+      struct nfs4acl *acl;
-+      struct nfs4ace *ace;
-+      int count;
-+
-+      if (size < sizeof(struct nfs4acl_xattr) ||
-+          xattr_acl->a_version != ACL4_XATTR_VERSION ||
-+          (xattr_acl->a_flags & ~ACL4_VALID_FLAGS))
-+              return ERR_PTR(-EINVAL);
-+
-+      count = be16_to_cpu(xattr_acl->a_count);
-+      if (count > ACL4_XATTR_MAX_COUNT)
-+              return ERR_PTR(-EINVAL);
-+
-+      acl = nfs4acl_alloc(count);
-+      if (!acl)
-+              return ERR_PTR(-ENOMEM);
-+
-+      acl->a_flags = xattr_acl->a_flags;
-+      acl->a_owner_mask = be32_to_cpu(xattr_acl->a_owner_mask);
-+      if (acl->a_owner_mask & ~ACE4_VALID_MASK)
-+              goto fail_einval;
-+      acl->a_group_mask = be32_to_cpu(xattr_acl->a_group_mask);
-+      if (acl->a_group_mask & ~ACE4_VALID_MASK)
-+              goto fail_einval;
-+      acl->a_other_mask = be32_to_cpu(xattr_acl->a_other_mask);
-+      if (acl->a_other_mask & ~ACE4_VALID_MASK)
-+              goto fail_einval;
-+
-+      nfs4acl_for_each_entry(ace, acl) {
-+              const char *who = (void *)(xattr_ace + 1), *end;
-+              ssize_t used = (void *)who - value;
-+
-+              if (used > size)
-+                      goto fail_einval;
-+              end = memchr(who, 0, size - used);
-+              if (!end)
-+                      goto fail_einval;
-+
-+              ace->e_type = be16_to_cpu(xattr_ace->e_type);
-+              ace->e_flags = be16_to_cpu(xattr_ace->e_flags);
-+              ace->e_mask = be32_to_cpu(xattr_ace->e_mask);
-+              ace->u.e_id = be32_to_cpu(xattr_ace->e_id);
-+
-+              if (ace->e_flags & ~ACE4_VALID_FLAGS) {
-+                      memset(ace, 0, sizeof(struct nfs4ace));
-+                      goto fail_einval;
-+              }
-+              if (ace->e_type > ACE4_ACCESS_DENIED_ACE_TYPE ||
-+                  (ace->e_mask & ~ACE4_VALID_MASK))
-+                      goto fail_einval;
-+
-+              if (who == end) {
-+                      if (ace->u.e_id == -1)
-+                              goto fail_einval;  /* uid/gid needed */
-+              } else if (nfs4ace_set_who(ace, who))
-+                      goto fail_einval;
-+
-+              xattr_ace = (void *)who + ALIGN(end - who + 1, 4);
-+      }
-+
-+      return acl;
-+
-+fail_einval:
-+      nfs4acl_put(acl);
-+      return ERR_PTR(-EINVAL);
-+}
-+EXPORT_SYMBOL(nfs4acl_from_xattr);
-+
-+size_t
-+nfs4acl_xattr_size(const struct nfs4acl *acl)
-+{
-+      size_t size = sizeof(struct nfs4acl_xattr);
-+      const struct nfs4ace *ace;
-+
-+      nfs4acl_for_each_entry(ace, acl) {
-+              size += sizeof(struct nfs4ace_xattr) +
-+                      (nfs4ace_is_unix_id(ace) ? 4 :
-+                       ALIGN(strlen(ace->u.e_who) + 1, 4));
-+      }
-+      return size;
-+}
-+EXPORT_SYMBOL(nfs4acl_xattr_size);
-+
-+void
-+nfs4acl_to_xattr(const struct nfs4acl *acl, void *buffer)
-+{
-+      struct nfs4acl_xattr *xattr_acl = buffer;
-+      struct nfs4ace_xattr *xattr_ace;
-+      const struct nfs4ace *ace;
-+
-+      xattr_acl->a_version = ACL4_XATTR_VERSION;
-+      xattr_acl->a_flags = acl->a_flags;
-+      xattr_acl->a_count = cpu_to_be16(acl->a_count);
-+
-+      xattr_acl->a_owner_mask = cpu_to_be32(acl->a_owner_mask);
-+      xattr_acl->a_group_mask = cpu_to_be32(acl->a_group_mask);
-+      xattr_acl->a_other_mask = cpu_to_be32(acl->a_other_mask);
-+
-+      xattr_ace = (void *)(xattr_acl + 1);
-+      nfs4acl_for_each_entry(ace, acl) {
-+              xattr_ace->e_type = cpu_to_be16(ace->e_type);
-+              xattr_ace->e_flags = cpu_to_be16(ace->e_flags &
-+                      ACE4_VALID_FLAGS);
-+              xattr_ace->e_mask = cpu_to_be32(ace->e_mask);
-+              if (nfs4ace_is_unix_id(ace)) {
-+                      xattr_ace->e_id = cpu_to_be32(ace->u.e_id);
-+                      memset(xattr_ace->e_who, 0, 4);
-+                      xattr_ace = (void *)xattr_ace->e_who + 4;
-+              } else {
-+                      int sz = ALIGN(strlen(ace->u.e_who) + 1, 4);
-+
-+                      xattr_ace->e_id = cpu_to_be32(-1);
-+                      memset(xattr_ace->e_who + sz - 4, 0, 4);
-+                      strcpy(xattr_ace->e_who, ace->u.e_who);
-+                      xattr_ace = (void *)xattr_ace->e_who + sz;
-+              }
-+      }
-+}
-+EXPORT_SYMBOL(nfs4acl_to_xattr);
---- /dev/null
-+++ b/include/linux/nfs4acl.h
-@@ -0,0 +1,205 @@
-+#ifndef __NFS4ACL_H
-+#define __NFS4ACL_H
-+
-+struct nfs4ace {
-+      unsigned short  e_type;
-+      unsigned short  e_flags;
-+      unsigned int    e_mask;
-+      union {
-+              unsigned int    e_id;
-+              const char      *e_who;
-+      } u;
-+};
-+
-+struct nfs4acl {
-+      atomic_t        a_refcount;
-+      unsigned int    a_owner_mask;
-+      unsigned int    a_group_mask;
-+      unsigned int    a_other_mask;
-+      unsigned short  a_count;
-+      unsigned short  a_flags;
-+      struct nfs4ace  a_entries[0];
-+};
-+
-+#define nfs4acl_for_each_entry(_ace, _acl) \
-+      for (_ace = _acl->a_entries; \
-+           _ace != _acl->a_entries + _acl->a_count; \
-+           _ace++)
-+
-+#define nfs4acl_for_each_entry_reverse(_ace, _acl) \
-+      for (_ace = _acl->a_entries + _acl->a_count - 1; \
-+           _ace != _acl->a_entries - 1; \
-+           _ace--)
-+
-+/* a_flags values */
-+#define ACL4_WRITE_THROUGH            0x40
-+
-+#define ACL4_VALID_FLAGS \
-+      ACL4_WRITE_THROUGH
-+
-+/* e_type values */
-+#define ACE4_ACCESS_ALLOWED_ACE_TYPE  0x0000
-+#define ACE4_ACCESS_DENIED_ACE_TYPE   0x0001
-+/*#define ACE4_SYSTEM_AUDIT_ACE_TYPE  0x0002*/
-+/*#define ACE4_SYSTEM_ALARM_ACE_TYPE  0x0003*/
-+
-+/* e_flags bitflags */
-+#define ACE4_FILE_INHERIT_ACE         0x0001
-+#define ACE4_DIRECTORY_INHERIT_ACE    0x0002
-+#define ACE4_NO_PROPAGATE_INHERIT_ACE 0x0004
-+#define ACE4_INHERIT_ONLY_ACE         0x0008
-+/*#define ACE4_SUCCESSFUL_ACCESS_ACE_FLAG     0x0010*/
-+/*#define ACE4_FAILED_ACCESS_ACE_FLAG 0x0020*/
-+#define ACE4_IDENTIFIER_GROUP         0x0040
-+#define ACE4_SPECIAL_WHO              0x4000  /* in-memory representation only */
-+
-+#define ACE4_VALID_FLAGS ( \
-+      ACE4_FILE_INHERIT_ACE | \
-+      ACE4_DIRECTORY_INHERIT_ACE | \
-+      ACE4_NO_PROPAGATE_INHERIT_ACE | \
-+      ACE4_INHERIT_ONLY_ACE | \
-+      ACE4_IDENTIFIER_GROUP )
-+
-+/* e_mask bitflags */
-+#define ACE4_READ_DATA                        0x00000001
-+#define ACE4_LIST_DIRECTORY           0x00000001
-+#define ACE4_WRITE_DATA                       0x00000002
-+#define ACE4_ADD_FILE                 0x00000002
-+#define ACE4_APPEND_DATA              0x00000004
-+#define ACE4_ADD_SUBDIRECTORY         0x00000004
-+#define ACE4_READ_NAMED_ATTRS         0x00000008
-+#define ACE4_WRITE_NAMED_ATTRS                0x00000010
-+#define ACE4_EXECUTE                  0x00000020
-+#define ACE4_DELETE_CHILD             0x00000040
-+#define ACE4_READ_ATTRIBUTES          0x00000080
-+#define ACE4_WRITE_ATTRIBUTES         0x00000100
-+#define ACE4_DELETE                   0x00010000
-+#define ACE4_READ_ACL                 0x00020000
-+#define ACE4_WRITE_ACL                        0x00040000
-+#define ACE4_WRITE_OWNER              0x00080000
-+#define ACE4_SYNCHRONIZE              0x00100000
-+
-+#define ACE4_VALID_MASK ( \
-+      ACE4_READ_DATA | ACE4_LIST_DIRECTORY | \
-+      ACE4_WRITE_DATA | ACE4_ADD_FILE | \
-+      ACE4_APPEND_DATA | ACE4_ADD_SUBDIRECTORY | \
-+      ACE4_READ_NAMED_ATTRS | \
-+      ACE4_WRITE_NAMED_ATTRS | \
-+      ACE4_EXECUTE | \
-+      ACE4_DELETE_CHILD | \
-+      ACE4_READ_ATTRIBUTES | \
-+      ACE4_WRITE_ATTRIBUTES | \
-+      ACE4_DELETE | \
-+      ACE4_READ_ACL | \
-+      ACE4_WRITE_ACL | \
-+      ACE4_WRITE_OWNER | \
-+      ACE4_SYNCHRONIZE )
-+
-+#define ACE4_POSIX_ALWAYS_ALLOWED ( \
-+      ACE4_SYNCHRONIZE | \
-+      ACE4_READ_ATTRIBUTES | \
-+      ACE4_READ_ACL )
-+/*
-+ * Duplicate an NFS4ACL handle.
-+ */
-+static inline struct nfs4acl *
-+nfs4acl_get(struct nfs4acl *acl)
-+{
-+      if (acl)
-+              atomic_inc(&acl->a_refcount);
-+      return acl;
-+}
-+
-+/*
-+ * Free an NFS4ACL handle
-+ */
-+static inline void
-+nfs4acl_put(struct nfs4acl *acl)
-+{
-+      if (acl && atomic_dec_and_test(&acl->a_refcount))
-+              kfree(acl);
-+}
-+
-+/* Special e_who identifiers: we use these pointer values in comparisons
-+   instead of strcmp for efficiency. */
-+
-+extern const char nfs4ace_owner_who[];
-+extern const char nfs4ace_group_who[];
-+extern const char nfs4ace_everyone_who[];
-+
-+static inline int
-+nfs4ace_is_owner(const struct nfs4ace *ace)
-+{
-+      return (ace->e_flags & ACE4_SPECIAL_WHO) &&
-+             ace->u.e_who == nfs4ace_owner_who;
-+}
-+
-+static inline int
-+nfs4ace_is_group(const struct nfs4ace *ace)
-+{
-+      return (ace->e_flags & ACE4_SPECIAL_WHO) &&
-+             ace->u.e_who == nfs4ace_group_who;
-+}
-+
-+static inline int
-+nfs4ace_is_everyone(const struct nfs4ace *ace)
-+{
-+      return (ace->e_flags & ACE4_SPECIAL_WHO) &&
-+             ace->u.e_who == nfs4ace_everyone_who;
-+}
-+
-+static inline int
-+nfs4ace_is_unix_id(const struct nfs4ace *ace)
-+{
-+      return !(ace->e_flags & ACE4_SPECIAL_WHO);
-+}
-+
-+static inline int
-+nfs4ace_is_inherit_only(const struct nfs4ace *ace)
-+{
-+      return ace->e_flags & ACE4_INHERIT_ONLY_ACE;
-+}
-+
-+static inline int
-+nfs4ace_is_inheritable(const struct nfs4ace *ace)
-+{
-+      return ace->e_flags & (ACE4_FILE_INHERIT_ACE |
-+                             ACE4_DIRECTORY_INHERIT_ACE);
-+}
-+
-+static inline void
-+nfs4ace_clear_inheritance_flags(struct nfs4ace *ace)
-+{
-+      ace->e_flags &= ~(ACE4_FILE_INHERIT_ACE |
-+                        ACE4_DIRECTORY_INHERIT_ACE |
-+                        ACE4_NO_PROPAGATE_INHERIT_ACE |
-+                        ACE4_INHERIT_ONLY_ACE);
-+}
-+
-+static inline int
-+nfs4ace_is_allow(const struct nfs4ace *ace)
-+{
-+      return ace->e_type == ACE4_ACCESS_ALLOWED_ACE_TYPE;
-+}
-+
-+static inline int
-+nfs4ace_is_deny(const struct nfs4ace *ace)
-+{
-+      return ace->e_type == ACE4_ACCESS_DENIED_ACE_TYPE;
-+}
-+
-+extern struct nfs4acl *nfs4acl_alloc(int count);
-+extern struct nfs4acl *nfs4acl_clone(const struct nfs4acl *acl);
-+
-+extern unsigned int nfs4acl_want_to_mask(int want);
-+extern int nfs4acl_permission(struct inode *, const struct nfs4acl *, unsigned int);
-+extern int nfs4acl_generic_permission(struct inode *, unsigned int);
-+extern int nfs4ace_is_same_who(const struct nfs4ace *, const struct nfs4ace *);
-+extern int nfs4ace_set_who(struct nfs4ace *ace, const char *who);
-+extern struct nfs4acl *nfs4acl_inherit(const struct nfs4acl *, mode_t);
-+extern int nfs4acl_masks_to_mode(const struct nfs4acl *);
-+extern struct nfs4acl *nfs4acl_chmod(struct nfs4acl *, mode_t);
-+extern int nfs4acl_apply_masks(struct nfs4acl **acl);
-+extern int nfs4acl_write_through(struct nfs4acl **acl);
-+
-+#endif /* __NFS4ACL_H */
---- /dev/null
-+++ b/include/linux/nfs4acl_xattr.h
-@@ -0,0 +1,32 @@
-+#ifndef __NFS4ACL_XATTR_H
-+#define __NFS4ACL_XATTR_H
-+
-+#include <linux/nfs4acl.h>
-+
-+#define NFS4ACL_XATTR "system.nfs4acl"
-+
-+struct nfs4ace_xattr {
-+      __be16          e_type;
-+      __be16          e_flags;
-+      __be32          e_mask;
-+      __be32          e_id;
-+      char            e_who[0];
-+};
-+
-+struct nfs4acl_xattr {
-+      unsigned char   a_version;
-+      unsigned char   a_flags;
-+      __be16          a_count;
-+      __be32          a_owner_mask;
-+      __be32          a_group_mask;
-+      __be32          a_other_mask;
-+};
-+
-+#define ACL4_XATTR_VERSION    0
-+#define ACL4_XATTR_MAX_COUNT  1024
-+
-+extern struct nfs4acl *nfs4acl_from_xattr(const void *, size_t);
-+extern size_t nfs4acl_xattr_size(const struct nfs4acl *acl);
-+extern void nfs4acl_to_xattr(const struct nfs4acl *, void *);
-+
-+#endif /* __NFS4ACL_XATTR_H */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ext3.diff b/src/patches/suse-2.6.27.31/patches.suse/nfs4acl-ext3.diff
deleted file mode 100644 (file)
index 938643e..0000000
+++ /dev/null
@@ -1,906 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: NFSv4 ACLs for ext3
-    
-With the acl=nfs4 mount option, ext3 will use NFSv4 ACLs instead of
-POSIX ACLs.  See http://www.suse.de/~agruen/nfs4acl/ for some
-documentation and examples.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- fs/Kconfig                |    7 
- fs/ext3/Makefile          |    1 
- fs/ext3/acl.c             |    8 
- fs/ext3/acl.h             |    4 
- fs/ext3/file.c            |    4 
- fs/ext3/ialloc.c          |    6 
- fs/ext3/inode.c           |   73 ++++++++-
- fs/ext3/namei.c           |   15 +
- fs/ext3/namei.h           |    1 
- fs/ext3/nfs4acl.c         |  370 ++++++++++++++++++++++++++++++++++++++++++++++
- fs/ext3/nfs4acl.h         |   36 ++++
- fs/ext3/super.c           |   60 +++++--
- fs/ext3/xattr.c           |    9 +
- fs/ext3/xattr.h           |    5 
- include/linux/ext3_fs.h   |    1 
- include/linux/ext3_fs_i.h |    3 
- 16 files changed, 577 insertions(+), 26 deletions(-)
-
---- a/fs/Kconfig
-+++ b/fs/Kconfig
-@@ -124,6 +124,13 @@ config EXT3_FS_POSIX_ACL
-         If you don't know what Access Control Lists are, say N
-+config EXT3_FS_NFS4ACL
-+      bool "Native NFSv4 ACLs (EXPERIMENTAL)"
-+      depends on EXT3_FS_XATTR && EXPERIMENTAL
-+      select FS_NFS4ACL
-+      help
-+        Allow to use NFSv4 ACLs instead of POSIX ACLs.
-+
- config EXT3_FS_SECURITY
-       bool "Ext3 Security Labels"
-       depends on EXT3_FS_XATTR
---- a/fs/ext3/Makefile
-+++ b/fs/ext3/Makefile
-@@ -10,3 +10,4 @@ ext3-y       := balloc.o bitmap.o dir.o file.o
- ext3-$(CONFIG_EXT3_FS_XATTR)   += xattr.o xattr_user.o xattr_trusted.o
- ext3-$(CONFIG_EXT3_FS_POSIX_ACL) += acl.o
- ext3-$(CONFIG_EXT3_FS_SECURITY)        += xattr_security.o
-+ext3-$(CONFIG_EXT3_FS_NFS4ACL)         += nfs4acl.o
---- a/fs/ext3/acl.c
-+++ b/fs/ext3/acl.c
-@@ -282,7 +282,7 @@ ext3_set_acl(handle_t *handle, struct in
-       return error;
- }
--static int
-+int
- ext3_check_acl(struct inode *inode, int mask)
- {
-       struct posix_acl *acl = ext3_get_acl(inode, ACL_TYPE_ACCESS);
-@@ -298,12 +298,6 @@ ext3_check_acl(struct inode *inode, int
-       return -EAGAIN;
- }
--int
--ext3_permission(struct inode *inode, int mask)
--{
--      return generic_permission(inode, mask, ext3_check_acl);
--}
--
- /*
-  * Initialize the ACLs of a new inode. Called from ext3_new_inode.
-  *
---- a/fs/ext3/acl.h
-+++ b/fs/ext3/acl.h
-@@ -58,13 +58,13 @@ static inline int ext3_acl_count(size_t
- #define EXT3_ACL_NOT_CACHED ((void *)-1)
- /* acl.c */
--extern int ext3_permission (struct inode *, int);
-+extern int ext3_check_acl (struct inode *, int);
- extern int ext3_acl_chmod (struct inode *);
- extern int ext3_init_acl (handle_t *, struct inode *, struct inode *);
- #else  /* CONFIG_EXT3_FS_POSIX_ACL */
- #include <linux/sched.h>
--#define ext3_permission NULL
-+#define ext3_check_acl NULL
- static inline int
- ext3_acl_chmod(struct inode *inode)
---- a/fs/ext3/file.c
-+++ b/fs/ext3/file.c
-@@ -23,8 +23,10 @@
- #include <linux/jbd.h>
- #include <linux/ext3_fs.h>
- #include <linux/ext3_jbd.h>
-+#include "namei.h"
- #include "xattr.h"
- #include "acl.h"
-+#include "nfs4acl.h"
- /*
-  * Called when an inode is released. Note that this is different
-@@ -134,5 +136,7 @@ const struct inode_operations ext3_file_
-       .removexattr    = generic_removexattr,
- #endif
-       .permission     = ext3_permission,
-+      .may_create     = ext3_may_create,
-+      .may_delete     = ext3_may_delete,
- };
---- a/fs/ext3/ialloc.c
-+++ b/fs/ext3/ialloc.c
-@@ -28,6 +28,7 @@
- #include "xattr.h"
- #include "acl.h"
-+#include "nfs4acl.h"
- /*
-  * ialloc.c contains the inodes allocation and deallocation routines
-@@ -595,7 +596,10 @@ got:
-               goto fail_drop;
-       }
--      err = ext3_init_acl(handle, inode, dir);
-+      if (test_opt(sb, NFS4ACL))
-+              err = ext3_nfs4acl_init(handle, inode, dir);
-+      else
-+              err = ext3_init_acl(handle, inode, dir);
-       if (err)
-               goto fail_free_drop;
---- a/fs/ext3/inode.c
-+++ b/fs/ext3/inode.c
-@@ -38,6 +38,7 @@
- #include <linux/bio.h>
- #include "xattr.h"
- #include "acl.h"
-+#include "nfs4acl.h"
- static int ext3_writepage_trans_blocks(struct inode *inode);
-@@ -2684,6 +2685,9 @@ struct inode *ext3_iget(struct super_blo
-       ei->i_acl = EXT3_ACL_NOT_CACHED;
-       ei->i_default_acl = EXT3_ACL_NOT_CACHED;
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      ei->i_nfs4acl = EXT3_NFS4ACL_NOT_CACHED;
-+#endif
-       ei->i_block_alloc_info = NULL;
-       ret = __ext3_get_inode_loc(inode, &iloc, 0);
-@@ -2983,6 +2987,65 @@ int ext3_write_inode(struct inode *inode
-       return ext3_force_commit(inode->i_sb);
- }
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+static int ext3_inode_change_ok(struct inode *inode, struct iattr *attr)
-+{
-+      unsigned int ia_valid = attr->ia_valid;
-+
-+      if (!test_opt(inode->i_sb, NFS4ACL))
-+              return inode_change_ok(inode, attr);
-+
-+      /* If force is set do it anyway. */
-+      if (ia_valid & ATTR_FORCE)
-+              return 0;
-+
-+      /* Make sure a caller can chown. */
-+      if ((ia_valid & ATTR_UID) &&
-+          (current->fsuid != inode->i_uid ||
-+           attr->ia_uid != inode->i_uid) &&
-+          (current->fsuid != attr->ia_uid ||
-+           ext3_nfs4acl_permission(inode, ACE4_WRITE_OWNER)) &&
-+          !capable(CAP_CHOWN))
-+              goto error;
-+
-+      /* Make sure caller can chgrp. */
-+      if ((ia_valid & ATTR_GID)) {
-+              int in_group = in_group_p(attr->ia_gid);
-+              if ((current->fsuid != inode->i_uid ||
-+                  (!in_group && attr->ia_gid != inode->i_gid)) &&
-+                  (!in_group ||
-+                   ext3_nfs4acl_permission(inode, ACE4_WRITE_OWNER)) &&
-+                  !capable(CAP_CHOWN))
-+                      goto error;
-+      }
-+
-+      /* Make sure a caller can chmod. */
-+      if (ia_valid & ATTR_MODE) {
-+              if (current->fsuid != inode->i_uid &&
-+                  ext3_nfs4acl_permission(inode, ACE4_WRITE_ACL) &&
-+                  !capable(CAP_FOWNER))
-+                      goto error;
-+              /* Also check the setgid bit! */
-+              if (!in_group_p((ia_valid & ATTR_GID) ? attr->ia_gid :
-+                              inode->i_gid) && !capable(CAP_FSETID))
-+                      attr->ia_mode &= ~S_ISGID;
-+      }
-+
-+      /* Check for setting the inode time. */
-+      if (ia_valid & (ATTR_MTIME_SET | ATTR_ATIME_SET)) {
-+              if (current->fsuid != inode->i_uid &&
-+                  ext3_nfs4acl_permission(inode, ACE4_WRITE_ATTRIBUTES) &&
-+                  !capable(CAP_FOWNER))
-+                      goto error;
-+      }
-+      return 0;
-+error:
-+      return -EPERM;
-+}
-+#else
-+# define ext3_inode_change_ok inode_change_ok
-+#endif
-+
- /*
-  * ext3_setattr()
-  *
-@@ -3006,7 +3069,7 @@ int ext3_setattr(struct dentry *dentry,
-       int error, rc = 0;
-       const unsigned int ia_valid = attr->ia_valid;
--      error = inode_change_ok(inode, attr);
-+      error = ext3_inode_change_ok(inode, attr);
-       if (error)
-               return error;
-@@ -3063,8 +3126,12 @@ int ext3_setattr(struct dentry *dentry,
-       if (inode->i_nlink)
-               ext3_orphan_del(NULL, inode);
--      if (!rc && (ia_valid & ATTR_MODE))
--              rc = ext3_acl_chmod(inode);
-+      if (!rc && (ia_valid & ATTR_MODE)) {
-+              if (test_opt(inode->i_sb, NFS4ACL))
-+                      rc = ext3_nfs4acl_chmod(inode);
-+              else
-+                      rc = ext3_acl_chmod(inode);
-+      }
- err_out:
-       ext3_std_error(inode->i_sb, error);
---- a/fs/ext3/namei.c
-+++ b/fs/ext3/namei.c
-@@ -40,6 +40,7 @@
- #include "namei.h"
- #include "xattr.h"
- #include "acl.h"
-+#include "nfs4acl.h"
- /*
-  * define how far ahead to read directories while searching them.
-@@ -2412,6 +2413,16 @@ end_rename:
-       return retval;
- }
-+int ext3_permission(struct inode *inode, int mask)
-+{
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      if (test_opt(inode->i_sb, NFS4ACL))
-+              return ext3_nfs4acl_permission(inode, nfs4acl_want_to_mask(mask));
-+      else
-+#endif
-+        return generic_permission(inode, mask, ext3_check_acl);
-+}
-+
- /*
-  * directories can handle most operations...
-  */
-@@ -2433,6 +2444,8 @@ const struct inode_operations ext3_dir_i
-       .removexattr    = generic_removexattr,
- #endif
-       .permission     = ext3_permission,
-+      .may_create     = ext3_may_create,
-+      .may_delete     = ext3_may_delete,
- };
- const struct inode_operations ext3_special_inode_operations = {
-@@ -2444,4 +2457,6 @@ const struct inode_operations ext3_speci
-       .removexattr    = generic_removexattr,
- #endif
-       .permission     = ext3_permission,
-+      .may_create     = ext3_may_create,
-+      .may_delete     = ext3_may_delete,
- };
---- a/fs/ext3/namei.h
-+++ b/fs/ext3/namei.h
-@@ -5,4 +5,5 @@
-  *
- */
-+extern int ext3_permission (struct inode *, int);
- extern struct dentry *ext3_get_parent(struct dentry *child);
---- /dev/null
-+++ b/fs/ext3/nfs4acl.c
-@@ -0,0 +1,370 @@
-+/*
-+ * Copyright (C) 2006 Andreas Gruenbacher <a.gruenbacher@computer.org>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License as published by the
-+ * Free Software Foundation; either version 2, or (at your option) any
-+ * later version.
-+ *
-+ * This program is distributed in the hope that it will be useful, but
-+ * WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ * General Public License for more details.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/ext3_jbd.h>
-+#include <linux/ext3_fs.h>
-+#include <linux/nfs4acl_xattr.h>
-+#include "namei.h"
-+#include "xattr.h"
-+#include "nfs4acl.h"
-+
-+static inline struct nfs4acl *
-+ext3_iget_nfs4acl(struct inode *inode)
-+{
-+      struct nfs4acl *acl = EXT3_NFS4ACL_NOT_CACHED;
-+      struct ext3_inode_info *ei = EXT3_I(inode);
-+
-+      spin_lock(&inode->i_lock);
-+      if (ei->i_nfs4acl != EXT3_NFS4ACL_NOT_CACHED)
-+              acl = nfs4acl_get(ei->i_nfs4acl);
-+      spin_unlock(&inode->i_lock);
-+
-+      return acl;
-+}
-+
-+static inline void
-+ext3_iset_nfs4acl(struct inode *inode, struct nfs4acl *acl)
-+{
-+      struct ext3_inode_info *ei = EXT3_I(inode);
-+
-+      spin_lock(&inode->i_lock);
-+      if (ei->i_nfs4acl != EXT3_NFS4ACL_NOT_CACHED)
-+              nfs4acl_put(ei->i_nfs4acl);
-+      ei->i_nfs4acl = nfs4acl_get(acl);
-+      spin_unlock(&inode->i_lock);
-+}
-+
-+static struct nfs4acl *
-+ext3_get_nfs4acl(struct inode *inode)
-+{
-+      const int name_index = EXT3_XATTR_INDEX_NFS4ACL;
-+      void *value = NULL;
-+      struct nfs4acl *acl;
-+      int retval;
-+
-+      if (!test_opt(inode->i_sb, NFS4ACL))
-+              return NULL;
-+
-+      acl = ext3_iget_nfs4acl(inode);
-+      if (acl != EXT3_NFS4ACL_NOT_CACHED)
-+              return acl;
-+      retval = ext3_xattr_get(inode, name_index, "", NULL, 0);
-+      if (retval > 0) {
-+              value = kmalloc(retval, GFP_KERNEL);
-+              if (!value)
-+                      return ERR_PTR(-ENOMEM);
-+              retval = ext3_xattr_get(inode, name_index, "", value, retval);
-+      }
-+      if (retval > 0) {
-+              acl = nfs4acl_from_xattr(value, retval);
-+              if (acl == ERR_PTR(-EINVAL))
-+                      acl = ERR_PTR(-EIO);
-+      } else if (retval == -ENODATA || retval == -ENOSYS)
-+              acl = NULL;
-+      else
-+              acl = ERR_PTR(retval);
-+      kfree(value);
-+
-+      if (!IS_ERR(acl))
-+              ext3_iset_nfs4acl(inode, acl);
-+
-+      return acl;
-+}
-+
-+static int
-+ext3_set_nfs4acl(handle_t *handle, struct inode *inode, struct nfs4acl *acl)
-+{
-+      const int name_index = EXT3_XATTR_INDEX_NFS4ACL;
-+      size_t size = 0;
-+      void *value = NULL;
-+      int retval;
-+
-+      if (acl) {
-+              size = nfs4acl_xattr_size(acl);
-+              value = kmalloc(size, GFP_KERNEL);
-+              if (!value)
-+                      return -ENOMEM;
-+              nfs4acl_to_xattr(acl, value);
-+      }
-+      if (handle)
-+              retval = ext3_xattr_set_handle(handle, inode, name_index, "",
-+                                             value, size, 0);
-+      else
-+              retval = ext3_xattr_set(inode, name_index, "", value, size, 0);
-+      if (value)
-+              kfree(value);
-+      if (!retval)
-+              ext3_iset_nfs4acl(inode, acl);
-+
-+      return retval;
-+}
-+
-+int
-+ext3_nfs4acl_permission(struct inode *inode, unsigned int mask)
-+{
-+      struct nfs4acl *acl;
-+      int retval;
-+
-+      BUG_ON(!test_opt(inode->i_sb, NFS4ACL));
-+
-+      acl = ext3_get_nfs4acl(inode);
-+      if (!acl)
-+              retval = nfs4acl_generic_permission(inode, mask);
-+      else if (IS_ERR(acl))
-+              retval = PTR_ERR(acl);
-+      else {
-+              retval = nfs4acl_permission(inode, acl, mask);
-+              nfs4acl_put(acl);
-+      }
-+
-+      return retval;
-+}
-+
-+int ext3_may_create(struct inode *dir, int isdir)
-+{
-+      int error;
-+
-+      if (test_opt(dir->i_sb, NFS4ACL)) {
-+              unsigned int mask = (isdir ? ACE4_ADD_SUBDIRECTORY : ACE4_ADD_FILE) |
-+                                  ACE4_EXECUTE;
-+
-+              error = ext3_nfs4acl_permission(dir, mask);
-+      } else
-+              error = ext3_permission(dir,  MAY_WRITE | MAY_EXEC);
-+
-+      return error;
-+}
-+
-+static int check_sticky(struct inode *dir, struct inode *inode)
-+{
-+      if (!(dir->i_mode & S_ISVTX))
-+              return 0;
-+      if (inode->i_uid == current->fsuid)
-+              return 0;
-+      if (dir->i_uid == current->fsuid)
-+              return 0;
-+      return !capable(CAP_FOWNER);
-+}
-+
-+int ext3_may_delete(struct inode *dir, struct inode *inode)
-+{
-+      int error;
-+
-+      if (test_opt(inode->i_sb, NFS4ACL)) {
-+              error = ext3_nfs4acl_permission(dir, ACE4_DELETE_CHILD | ACE4_EXECUTE);
-+              if (!error && check_sticky(dir, inode))
-+                      error = -EPERM;
-+              if (error && !ext3_nfs4acl_permission(inode, ACE4_DELETE))
-+                      error = 0;
-+      } else {
-+              error = ext3_permission(dir, MAY_WRITE | MAY_EXEC);
-+              if (!error && check_sticky(dir, inode))
-+                      error = -EPERM;
-+      }
-+
-+      return error;
-+}
-+
-+int
-+ext3_nfs4acl_init(handle_t *handle, struct inode *inode, struct inode *dir)
-+{
-+      struct nfs4acl *dir_acl = NULL, *acl;
-+      int retval;
-+
-+      if (!S_ISLNK(inode->i_mode))
-+              dir_acl = ext3_get_nfs4acl(dir);
-+      if (!dir_acl || IS_ERR(dir_acl)) {
-+              inode->i_mode &= ~current->fs->umask;
-+              return PTR_ERR(dir_acl);
-+      }
-+      acl = nfs4acl_inherit(dir_acl, inode->i_mode);
-+      nfs4acl_put(dir_acl);
-+
-+      retval = PTR_ERR(acl);
-+      if (acl && !IS_ERR(acl)) {
-+              retval = ext3_set_nfs4acl(handle, inode, acl);
-+              inode->i_mode = (inode->i_mode & ~S_IRWXUGO) |
-+                              nfs4acl_masks_to_mode(acl);
-+              nfs4acl_put(acl);
-+      }
-+      return retval;
-+}
-+
-+int
-+ext3_nfs4acl_chmod(struct inode *inode)
-+{
-+      struct nfs4acl *acl;
-+      int retval;
-+
-+      if (S_ISLNK(inode->i_mode))
-+              return -EOPNOTSUPP;
-+      acl = ext3_get_nfs4acl(inode);
-+      if (!acl || IS_ERR(acl))
-+              return PTR_ERR(acl);
-+      acl = nfs4acl_chmod(acl, inode->i_mode);
-+      if (IS_ERR(acl))
-+              return PTR_ERR(acl);
-+      retval = ext3_set_nfs4acl(NULL, inode, acl);
-+      nfs4acl_put(acl);
-+
-+      return retval;
-+}
-+
-+static size_t
-+ext3_xattr_list_nfs4acl(struct inode *inode, char *list, size_t list_len,
-+                      const char *name, size_t name_len)
-+{
-+      const size_t size = sizeof(NFS4ACL_XATTR);
-+
-+      if (!test_opt(inode->i_sb, NFS4ACL))
-+              return 0;
-+      if (list && size <= list_len)
-+              memcpy(list, NFS4ACL_XATTR, size);
-+      return size;
-+}
-+
-+static int
-+ext3_xattr_get_nfs4acl(struct inode *inode, const char *name, void *buffer,
-+                     size_t buffer_size)
-+{
-+      struct nfs4acl *acl;
-+      size_t size;
-+
-+      if (!test_opt(inode->i_sb, NFS4ACL))
-+              return -EOPNOTSUPP;
-+      if (strcmp(name, "") != 0)
-+              return -EINVAL;
-+
-+      acl = ext3_get_nfs4acl(inode);
-+      if (IS_ERR(acl))
-+              return PTR_ERR(acl);
-+      if (acl == NULL)
-+              return -ENODATA;
-+      size = nfs4acl_xattr_size(acl);
-+      if (buffer) {
-+              if (size > buffer_size)
-+                      return -ERANGE;
-+              nfs4acl_to_xattr(acl, buffer);
-+      }
-+      nfs4acl_put(acl);
-+
-+      return size;
-+}
-+
-+#ifdef NFS4ACL_DEBUG
-+static size_t
-+ext3_xattr_list_masked_nfs4acl(struct inode *inode, char *list, size_t list_len,
-+                             const char *name, size_t name_len)
-+{
-+      return 0;
-+}
-+
-+static int
-+ext3_xattr_get_masked_nfs4acl(struct inode *inode, const char *name,
-+                            void *buffer, size_t buffer_size)
-+{
-+      const int name_index = EXT3_XATTR_INDEX_NFS4ACL;
-+      struct nfs4acl *acl;
-+      void *xattr;
-+      size_t size;
-+      int retval;
-+
-+      if (!test_opt(inode->i_sb, NFS4ACL))
-+              return -EOPNOTSUPP;
-+      if (strcmp(name, "") != 0)
-+              return -EINVAL;
-+      retval = ext3_xattr_get(inode, name_index, "", NULL, 0);
-+      if (retval <= 0)
-+              return retval;
-+      xattr = kmalloc(retval, GFP_KERNEL);
-+      if (!xattr)
-+              return -ENOMEM;
-+      retval = ext3_xattr_get(inode, name_index, "", xattr, retval);
-+      if (retval <= 0)
-+              return retval;
-+      acl = nfs4acl_from_xattr(xattr, retval);
-+      kfree(xattr);
-+      if (IS_ERR(acl))
-+              return PTR_ERR(acl);
-+      retval = nfs4acl_apply_masks(&acl);
-+      if (retval) {
-+              nfs4acl_put(acl);
-+              return retval;
-+      }
-+      size = nfs4acl_xattr_size(acl);
-+      if (buffer) {
-+              if (size > buffer_size)
-+                      return -ERANGE;
-+              nfs4acl_to_xattr(acl, buffer);
-+      }
-+      nfs4acl_put(acl);
-+      return size;
-+}
-+#endif
-+
-+static int
-+ext3_xattr_set_nfs4acl(struct inode *inode, const char *name,
-+                     const void *value, size_t size, int flags)
-+{
-+      handle_t *handle;
-+      struct nfs4acl *acl = NULL;
-+      int retval, retries = 0;
-+
-+      if (S_ISLNK(inode->i_mode) || !test_opt(inode->i_sb, NFS4ACL))
-+              return -EOPNOTSUPP;
-+      if (strcmp(name, "") != 0)
-+              return -EINVAL;
-+      if (current->fsuid != inode->i_uid &&
-+          ext3_nfs4acl_permission(inode, ACE4_WRITE_ACL) &&
-+          !capable(CAP_FOWNER))
-+              return -EPERM;
-+      if (value) {
-+              acl = nfs4acl_from_xattr(value, size);
-+              if (IS_ERR(acl))
-+                      return PTR_ERR(acl);
-+
-+              inode->i_mode &= ~S_IRWXUGO;
-+              inode->i_mode |= nfs4acl_masks_to_mode(acl);
-+      }
-+
-+retry:
-+      handle = ext3_journal_start(inode, EXT3_DATA_TRANS_BLOCKS(inode->i_sb));
-+      if (IS_ERR(handle))
-+              return PTR_ERR(handle);
-+      ext3_mark_inode_dirty(handle, inode);
-+      retval = ext3_set_nfs4acl(handle, inode, acl);
-+      ext3_journal_stop(handle);
-+      if (retval == ENOSPC && ext3_should_retry_alloc(inode->i_sb, &retries))
-+              goto retry;
-+      nfs4acl_put(acl);
-+      return retval;
-+}
-+
-+struct xattr_handler ext3_nfs4acl_xattr_handler = {
-+      .prefix = NFS4ACL_XATTR,
-+      .list   = ext3_xattr_list_nfs4acl,
-+      .get    = ext3_xattr_get_nfs4acl,
-+      .set    = ext3_xattr_set_nfs4acl,
-+};
-+
-+#ifdef NFS4ACL_DEBUG
-+struct xattr_handler ext3_masked_nfs4acl_xattr_handler = {
-+      .prefix = "system.masked-nfs4acl",
-+      .list   = ext3_xattr_list_masked_nfs4acl,
-+      .get    = ext3_xattr_get_masked_nfs4acl,
-+      .set    = ext3_xattr_set_nfs4acl,
-+};
-+#endif
---- /dev/null
-+++ b/fs/ext3/nfs4acl.h
-@@ -0,0 +1,36 @@
-+#ifndef __FS_EXT3_NFS4ACL_H
-+#define __FS_EXT3_NFS4ACL_H
-+
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+
-+#include <linux/nfs4acl.h>
-+
-+/* Value for i_nfs4acl if NFS4ACL has not been cached */
-+#define EXT3_NFS4ACL_NOT_CACHED ((void *)-1)
-+
-+extern int ext3_nfs4acl_permission(struct inode *, unsigned int);
-+extern int ext3_may_create(struct inode *, int);
-+extern int ext3_may_delete(struct inode *, struct inode *);
-+extern int ext3_nfs4acl_init(handle_t *, struct inode *, struct inode *);
-+extern int ext3_nfs4acl_chmod(struct inode *);
-+
-+#else  /* CONFIG_FS_EXT3_NFS4ACL */
-+
-+#define ext3_may_create NULL
-+#define ext3_may_delete NULL
-+
-+static inline int
-+ext3_nfs4acl_init(handle_t *handle, struct inode *inode, struct inode *dir)
-+{
-+      return 0;
-+}
-+
-+static inline int
-+ext3_nfs4acl_chmod(struct inode *inode)
-+{
-+      return 0;
-+}
-+
-+#endif  /* CONFIG_FS_EXT3_NFS4ACL */
-+
-+#endif  /* __FS_EXT3_NFS4ACL_H */
---- a/fs/ext3/super.c
-+++ b/fs/ext3/super.c
-@@ -36,12 +36,14 @@
- #include <linux/namei.h>
- #include <linux/quotaops.h>
- #include <linux/seq_file.h>
-+#include <linux/nfs4acl.h>
- #include <linux/log2.h>
- #include <asm/uaccess.h>
- #include "xattr.h"
- #include "acl.h"
-+#include "nfs4acl.h"
- #include "namei.h"
- static int ext3_load_journal(struct super_block *, struct ext3_super_block *,
-@@ -454,6 +456,9 @@ static struct inode *ext3_alloc_inode(st
-       ei->i_acl = EXT3_ACL_NOT_CACHED;
-       ei->i_default_acl = EXT3_ACL_NOT_CACHED;
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      ei->i_nfs4acl = EXT3_NFS4ACL_NOT_CACHED;
-+#endif
-       ei->i_block_alloc_info = NULL;
-       ei->vfs_inode.i_version = 1;
-       return &ei->vfs_inode;
-@@ -516,6 +521,13 @@ static void ext3_clear_inode(struct inod
-               EXT3_I(inode)->i_default_acl = EXT3_ACL_NOT_CACHED;
-       }
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      if (EXT3_I(inode)->i_nfs4acl &&
-+                      EXT3_I(inode)->i_nfs4acl != EXT3_NFS4ACL_NOT_CACHED) {
-+              nfs4acl_put(EXT3_I(inode)->i_nfs4acl);
-+              EXT3_I(inode)->i_nfs4acl = EXT3_NFS4ACL_NOT_CACHED;
-+      }
-+#endif
-       ext3_discard_reservation(inode);
-       EXT3_I(inode)->i_block_alloc_info = NULL;
-       if (unlikely(rsv))
-@@ -750,7 +762,7 @@ enum {
-       Opt_bsd_df, Opt_minix_df, Opt_grpid, Opt_nogrpid,
-       Opt_resgid, Opt_resuid, Opt_sb, Opt_err_cont, Opt_err_panic, Opt_err_ro,
-       Opt_nouid32, Opt_nocheck, Opt_debug, Opt_oldalloc, Opt_orlov,
--      Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_noacl,
-+      Opt_user_xattr, Opt_nouser_xattr, Opt_acl, Opt_acl_flavor, Opt_noacl,
-       Opt_reservation, Opt_noreservation, Opt_noload, Opt_nobh, Opt_bh,
-       Opt_commit, Opt_journal_update, Opt_journal_inum, Opt_journal_dev,
-       Opt_abort, Opt_data_journal, Opt_data_ordered, Opt_data_writeback,
-@@ -782,6 +794,7 @@ static match_table_t tokens = {
-       {Opt_user_xattr, "user_xattr"},
-       {Opt_nouser_xattr, "nouser_xattr"},
-       {Opt_acl, "acl"},
-+      {Opt_acl_flavor, "acl=%s"},
-       {Opt_noacl, "noacl"},
-       {Opt_reservation, "reservation"},
-       {Opt_noreservation, "noreservation"},
-@@ -925,19 +938,33 @@ static int parse_options (char *options,
-                       printk("EXT3 (no)user_xattr options not supported\n");
-                       break;
- #endif
--#ifdef CONFIG_EXT3_FS_POSIX_ACL
-               case Opt_acl:
--                      set_opt(sbi->s_mount_opt, POSIX_ACL);
-+                      args[0].to = args[0].from;
-+                      /* fall through */
-+              case Opt_acl_flavor:
-+#ifdef CONFIG_EXT3_FS_POSIX_ACL
-+                      if (match_string(&args[0], "") ||
-+                          match_string(&args[0], "posix")) {
-+                              set_opt(sbi->s_mount_opt, POSIX_ACL);
-+                              clear_opt(sbi->s_mount_opt, NFS4ACL);
-+                      } else
-+#endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+                      if (match_string(&args[0], "nfs4")) {
-+                              clear_opt(sbi->s_mount_opt, POSIX_ACL);
-+                              set_opt(sbi->s_mount_opt, NFS4ACL);
-+                      } else
-+#endif
-+                      {
-+                              printk(KERN_ERR "EXT3-fs: unsupported acl "
-+                                     "flavor\n");
-+                              return 0;
-+                      }
-                       break;
-               case Opt_noacl:
-                       clear_opt(sbi->s_mount_opt, POSIX_ACL);
-+                      clear_opt(sbi->s_mount_opt, NFS4ACL);
-                       break;
--#else
--              case Opt_acl:
--              case Opt_noacl:
--                      printk("EXT3 (no)acl options not supported\n");
--                      break;
--#endif
-               case Opt_reservation:
-                       set_opt(sbi->s_mount_opt, RESERVATION);
-                       break;
-@@ -1607,8 +1634,11 @@ static int ext3_fill_super (struct super
-                           NULL, 0))
-               goto failed_mount;
--      sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
--              ((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
-+      sb->s_flags = (sb->s_flags & ~MS_POSIXACL);
-+      if (sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL)
-+              sb->s_flags |= MS_POSIXACL;
-+      if (sbi->s_mount_opt & EXT3_MOUNT_NFS4ACL)
-+              sb->s_flags |= MS_POSIXACL | MS_WITHAPPEND;
-       if (le32_to_cpu(es->s_rev_level) == EXT3_GOOD_OLD_REV &&
-           (EXT3_HAS_COMPAT_FEATURE(sb, ~0U) ||
-@@ -2451,8 +2481,12 @@ static int ext3_remount (struct super_bl
-       if (sbi->s_mount_opt & EXT3_MOUNT_ABORT)
-               ext3_abort(sb, __func__, "Abort forced by user");
--      sb->s_flags = (sb->s_flags & ~MS_POSIXACL) |
--              ((sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL) ? MS_POSIXACL : 0);
-+      sb->s_flags = (sb->s_flags & ~MS_POSIXACL);
-+      if (sbi->s_mount_opt & EXT3_MOUNT_POSIX_ACL)
-+              sb->s_flags |= MS_POSIXACL;
-+      if (sbi->s_mount_opt & EXT3_MOUNT_NFS4ACL)
-+              sb->s_flags |= MS_POSIXACL;
-+
-       es = sbi->s_es;
---- a/fs/ext3/xattr.c
-+++ b/fs/ext3/xattr.c
-@@ -114,6 +114,9 @@ static struct xattr_handler *ext3_xattr_
- #ifdef CONFIG_EXT3_FS_SECURITY
-       [EXT3_XATTR_INDEX_SECURITY]          = &ext3_xattr_security_handler,
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      [EXT3_XATTR_INDEX_NFS4ACL]           = &ext3_nfs4acl_xattr_handler,
-+#endif
- };
- struct xattr_handler *ext3_xattr_handlers[] = {
-@@ -126,6 +129,12 @@ struct xattr_handler *ext3_xattr_handler
- #ifdef CONFIG_EXT3_FS_SECURITY
-       &ext3_xattr_security_handler,
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      &ext3_nfs4acl_xattr_handler,
-+#ifdef NFS4ACL_DEBUG
-+      &ext3_masked_nfs4acl_xattr_handler,
-+#endif
-+#endif
-       NULL
- };
---- a/fs/ext3/xattr.h
-+++ b/fs/ext3/xattr.h
-@@ -21,6 +21,7 @@
- #define EXT3_XATTR_INDEX_TRUSTED              4
- #define       EXT3_XATTR_INDEX_LUSTRE                 5
- #define EXT3_XATTR_INDEX_SECURITY             6
-+#define EXT3_XATTR_INDEX_NFS4ACL              7
- struct ext3_xattr_header {
-       __le32  h_magic;        /* magic number for identification */
-@@ -63,6 +64,10 @@ extern struct xattr_handler ext3_xattr_t
- extern struct xattr_handler ext3_xattr_acl_access_handler;
- extern struct xattr_handler ext3_xattr_acl_default_handler;
- extern struct xattr_handler ext3_xattr_security_handler;
-+extern struct xattr_handler ext3_nfs4acl_xattr_handler;
-+#ifdef NFS4ACL_DEBUG
-+extern struct xattr_handler ext3_masked_nfs4acl_xattr_handler;
-+#endif
- extern ssize_t ext3_listxattr(struct dentry *, char *, size_t);
---- a/include/linux/ext3_fs.h
-+++ b/include/linux/ext3_fs.h
-@@ -380,6 +380,7 @@ struct ext3_inode {
- #define EXT3_MOUNT_QUOTA              0x80000 /* Some quota option set */
- #define EXT3_MOUNT_USRQUOTA           0x100000 /* "old" user quota */
- #define EXT3_MOUNT_GRPQUOTA           0x200000 /* "old" group quota */
-+#define EXT3_MOUNT_NFS4ACL            0x400000 /* NFS version 4 ACLs */
- /* Compatibility, for having both ext2_fs.h and ext3_fs.h included at once */
- #ifndef _LINUX_EXT2_FS_H
---- a/include/linux/ext3_fs_i.h
-+++ b/include/linux/ext3_fs_i.h
-@@ -107,6 +107,9 @@ struct ext3_inode_info {
-       struct posix_acl        *i_acl;
-       struct posix_acl        *i_default_acl;
- #endif
-+#ifdef CONFIG_EXT3_FS_NFS4ACL
-+      struct nfs4acl          *i_nfs4acl;
-+#endif
-       struct list_head i_orphan;      /* unlinked but open inodes */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/nfsacl-client-cache-CHECK.diff b/src/patches/suse-2.6.27.31/patches.suse/nfsacl-client-cache-CHECK.diff
deleted file mode 100644 (file)
index add3ead..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: nfsacl: improve cache consistency
-
-(This one is currently disabled.)
-
-Index: linux-2.6.11-rc2/fs/nfs/inode.c
-===================================================================
---- linux-2.6.11-rc2.orig/fs/nfs/inode.c
-+++ linux-2.6.11-rc2/fs/nfs/inode.c
-@@ -65,13 +65,8 @@ static int  nfs_statfs(struct super_bloc
- static int  nfs_show_options(struct seq_file *, struct vfsmount *);
- #ifdef CONFIG_NFS_ACL
--static void nfs_forget_cached_acls(struct inode *);
- static void __nfs_forget_cached_acls(struct nfs_inode *nfsi);
- #else
--static inline void nfs_forget_cached_acls(struct inode *inode)
--{
--}
--
- static inline void __nfs_forget_cached_acls(struct nfs_inode *nfsi)
- {
- }
-@@ -1188,7 +1183,7 @@ static void __nfs_forget_cached_acls(str
- #endif  /* CONFIG_NFS_ACL */
- #ifdef CONFIG_NFS_ACL
--static void nfs_forget_cached_acls(struct inode *inode)
-+void nfs_forget_cached_acls(struct inode *inode)
- {
-       dprintk("NFS: nfs_forget_cached_acls(%s/%ld)\n", inode->i_sb->s_id,
-               inode->i_ino);
-@@ -1293,6 +1288,8 @@ int nfs_refresh_inode(struct inode *inod
-       if ((fattr->valid & NFS_ATTR_WCC) != 0) {
-               if (timespec_equal(&inode->i_ctime, &fattr->pre_ctime))
-                       memcpy(&inode->i_ctime, &fattr->ctime, sizeof(inode->i_ctime));
-+              else
-+                      nfs_forget_cached_acls(inode);
-               if (timespec_equal(&inode->i_mtime, &fattr->pre_mtime))
-                       memcpy(&inode->i_mtime, &fattr->mtime, sizeof(inode->i_mtime));
-       }
-Index: linux-2.6.11-rc2/fs/nfs/nfs3proc.c
-===================================================================
---- linux-2.6.11-rc2.orig/fs/nfs/nfs3proc.c
-+++ linux-2.6.11-rc2/fs/nfs/nfs3proc.c
-@@ -876,7 +876,11 @@ nfs3_proc_setacls(struct inode *inode, s
-                               acl = NULL;
-                       }
-               }
--              nfs_cache_acls(inode, acl, dfacl);
-+              if ((fattr.valid & NFS_ATTR_WCC) &&
-+                  timespec_equal(&inode->i_ctime, &fattr.pre_ctime))
-+                      nfs_cache_acls(inode, acl, dfacl);
-+              else
-+                      nfs_forget_cached_acls(inode);
-               status = nfs_refresh_inode(inode, &fattr);
-       }
-Index: linux-2.6.11-rc2/include/linux/nfs_fs.h
-===================================================================
---- linux-2.6.11-rc2.orig/include/linux/nfs_fs.h
-+++ linux-2.6.11-rc2/include/linux/nfs_fs.h
-@@ -293,6 +293,13 @@ extern struct inode *nfs_fhget(struct su
-                               struct nfs_fattr *);
- extern struct posix_acl *nfs_get_cached_acl(struct inode *, int);
- extern void nfs_cache_acls(struct inode *, struct posix_acl *, struct posix_acl *);
-+#ifdef CONFIG_NFS_ACL
-+void nfs_forget_cached_acls(struct inode *);
-+#else
-+static inline void nfs_forget_cached_acls(struct inode *inode)
-+{
-+}
-+#endif
- extern int nfs_refresh_inode(struct inode *, struct nfs_fattr *);
- extern int nfs_getattr(struct vfsmount *, struct dentry *, struct kstat *);
- extern int nfs_permission(struct inode *, int, struct nameidata *);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/novfs-map-drives-correctly.diff b/src/patches/suse-2.6.27.31/patches.suse/novfs-map-drives-correctly.diff
deleted file mode 100644 (file)
index 44738a3..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-From: Goldwyn Rodrigues <rgoldwyn@suse.de>
-Subject: Fix oops in set_map_drive
-References: bnc#446824, bnc#444469
-
-The oops was caused because of an unconditional free because of the
-merge changes.
-The error was caused because novfs_set_map_drive was not being called
-with the right args, which caused it to request for incorrect memory
-size.
-Cleaned up some debug messages as well, and corrected debug messages.
-
-
----
- fs/novfs/daemon.c |    9 +++++----
- fs/novfs/inode.c  |   11 -----------
- 2 files changed, 5 insertions(+), 15 deletions(-)
-
-Index: linux-2.6.27/fs/novfs/daemon.c
-===================================================================
---- linux-2.6.27.orig/fs/novfs/daemon.c        2008-12-02 14:57:29.000000000 +0530
-+++ linux-2.6.27/fs/novfs/daemon.c     2008-12-02 15:03:15.000000000 +0530
-@@ -1936,7 +1936,7 @@ static int set_map_drive(struct novfs_xp
-               full_name_hash(drivemap->name,
-                               symInfo.linkOffsetLength - 1);
-       drivemap->namelen = symInfo.linkOffsetLength - 1;
--      DbgPrint("NwdSetMapDrive: hash=0x%x path=%s\n",
-+      DbgPrint("set_map_drive: hash=0x%lx path=%s\n",
-                       drivemap->hash, drivemap->name);
-       dm = (struct drive_map *) & DriveMapList.next;
-@@ -1945,8 +1945,8 @@ static int set_map_drive(struct novfs_xp
-       list_for_each(list, &DriveMapList) {
-               dm = list_entry(list, struct drive_map, list);
--              DbgPrint("NwdSetMapDrive: dm=0x%p\n"
--                              "   hash:    0x%x\n"
-+              DbgPrint("set_map_drive: dm=0x%p\n"
-+                              "   hash:    0x%lx\n"
-                               "   namelen: %d\n"
-                               "   name:    %s\n",
-                               dm, dm->hash, dm->namelen, dm->name);
-@@ -1971,7 +1971,8 @@ static int set_map_drive(struct novfs_xp
-                                       &dm->list);
-               }
-       }
--      kfree(drivemap);
-+      else
-+              kfree(drivemap);
-       up(&DriveMapLock);
-       return (retVal);
- }
-Index: linux-2.6.27/fs/novfs/inode.c
-===================================================================
---- linux-2.6.27.orig/fs/novfs/inode.c 2008-12-02 15:01:46.000000000 +0530
-+++ linux-2.6.27/fs/novfs/inode.c      2008-12-02 15:01:52.000000000 +0530
-@@ -4055,22 +4055,11 @@ int __init init_novfs(void)
- void __exit exit_novfs(void)
- {
--      printk(KERN_INFO "exit_novfs\n");
--
-       novfs_scope_exit();
--      printk(KERN_INFO "exit_novfs after Scope_Uninit\n");
--
-       novfs_daemon_queue_exit();
--      printk(KERN_INFO "exit_novfs after Uninit_Daemon_Queue\n");
--
-       novfs_profile_exit();
--      printk(KERN_INFO "exit_novfs after profile_exit\n");
--
-       novfs_proc_exit();
--      printk(KERN_INFO "exit_novfs Uninit_Procfs_Interface\n");
--
-       unregister_filesystem(&novfs_fs_type);
--      printk(KERN_INFO "exit_novfs: Exit\n");
-       if (novfs_current_mnt) {
-               kfree(novfs_current_mnt);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/novfs-merge-changes.diff b/src/patches/suse-2.6.27.31/patches.suse/novfs-merge-changes.diff
deleted file mode 100644 (file)
index fddf2cf..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-From: Goldwyn Rodrigues <rgoldwyn@novell.com
-Subject: Merge changes left out during code pull
-References: 445000
-
-Also contains the fix for a clean shutdown during umount.
-
----
- fs/novfs/file.c   |   55 ++++++++++++++++++++---------------------
- fs/novfs/inode.c  |   71 ++++++++++++++++++++++++++++++++++++------------------
- fs/novfs/nwcapi.c |   13 ++++++---
- fs/novfs/vfs.h    |    3 +-
- 4 files changed, 85 insertions(+), 57 deletions(-)
-
-Index: linux-2.6.27/fs/novfs/file.c
-===================================================================
---- linux-2.6.27.orig/fs/novfs/file.c  2008-12-02 11:57:24.000000000 +0530
-+++ linux-2.6.27/fs/novfs/file.c       2008-12-02 11:58:18.000000000 +0530
-@@ -405,7 +405,7 @@ int novfs_setx_file_info(char *Path, con
-               cmd->flags = flags;
-               cmd->pathLen = pathlen;
--              memcpy(cmd->data, Path, cmd->pathLen + 1);      //+ '\0'
-+              memcpy(cmd->data, Path, cmd->pathLen);
-               cmd->nameLen = namelen;
-               memcpy(cmd->data + cmd->pathLen + 1, Name, cmd->nameLen + 1);
-@@ -601,7 +601,7 @@ static int begin_directory_enumerate(uns
-       return (retCode);
- }
--static int end_directory_enumerate(void *EnumHandle, struct novfs_schandle SessionId)
-+int novfs_end_directory_enumerate(void *EnumHandle, struct novfs_schandle SessionId)
- {
-       struct novfs_end_enumerate_directory_request cmd;
-       struct novfs_end_enumerate_directory_reply *reply = NULL;
-@@ -793,11 +793,9 @@ int novfs_get_dir_listex(unsigned char *
-                   directory_enumerate_ex(EnumHandle, SessionId, Count, Info,
-                                          INTERRUPTIBLE);
-               if (retCode) {
--                      end_directory_enumerate(*EnumHandle, SessionId);
--                      if (-1 == retCode) {
--                              retCode = 0;
--                              *EnumHandle = Uint32toHandle(-1);
--                      }
-+                      novfs_end_directory_enumerate(*EnumHandle, SessionId);
-+                      retCode = 0;
-+                      *EnumHandle = Uint32toHandle(-1);
-               }
-       }
-       return (retCode);
-@@ -915,32 +913,33 @@ int novfs_create(unsigned char * Path, i
-       cmdlen = offsetof(struct novfs_create_file_request, path) + pathlen;
-       cmd = kmalloc(cmdlen, GFP_KERNEL);
--      if (cmd) {
--              cmd->Command.CommandType = VFS_COMMAND_CREATE_FILE;
--              if (DirectoryFlag) {
--                      cmd->Command.CommandType = VFS_COMMAND_CREATE_DIRECOTRY;
--              }
--              cmd->Command.SequenceNumber = 0;
--              cmd->Command.SessionId = SessionId;
-+      if (!cmd)
-+              return -ENOMEM;
-+      cmd->Command.CommandType = VFS_COMMAND_CREATE_FILE;
-+      if (DirectoryFlag) {
-+              cmd->Command.CommandType = VFS_COMMAND_CREATE_DIRECOTRY;
-+      }
-+      cmd->Command.SequenceNumber = 0;
-+      cmd->Command.SessionId = SessionId;
--              cmd->pathlength = pathlen;
--              memcpy(cmd->path, Path, pathlen);
-+      cmd->pathlength = pathlen;
-+      memcpy(cmd->path, Path, pathlen);
--              retCode =
--                  Queue_Daemon_Command(cmd, cmdlen, NULL, 0, (void *)&reply,
--                                       &replylen, INTERRUPTIBLE);
-+      retCode =
-+              Queue_Daemon_Command(cmd, cmdlen, NULL, 0, (void *)&reply,
-+                              &replylen, INTERRUPTIBLE);
-+
-+      if (reply) {
-+              retCode = 0;
-+              if (reply->Reply.ErrorCode) {
-+                      retCode = -EIO;
-+                      if (reply->Reply.ErrorCode == NWE_ACCESS_DENIED)
-+                              retCode = -EACCES;
--              if (reply) {
--                      retCode = 0;
--                      if (reply->Reply.ErrorCode) {
--                              retCode = -EIO;
--                      }
--                      kfree(reply);
-               }
--              kfree(cmd);
--      } else {
--              retCode = -ENOMEM;
-+              kfree(reply);
-       }
-+      kfree(cmd);
-       return (retCode);
- }
-Index: linux-2.6.27/fs/novfs/inode.c
-===================================================================
---- linux-2.6.27.orig/fs/novfs/inode.c 2008-12-02 11:57:24.000000000 +0530
-+++ linux-2.6.27/fs/novfs/inode.c      2008-12-02 11:58:35.000000000 +0530
-@@ -137,11 +137,11 @@ int novfs_i_revalidate(struct dentry *de
-  * Extended attributes operations
-  */
--int novfs_i_getxattr(struct dentry *dentry, const char *name, void *buffer,
-+ssize_t novfs_i_getxattr(struct dentry *dentry, const char *name, void *buffer,
-                    size_t size);
- int novfs_i_setxattr(struct dentry *dentry, const char *name, const void *value,
-                    size_t value_size, int flags);
--int novfs_i_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
-+ssize_t novfs_i_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size);
- void update_inode(struct inode *Inode, struct novfs_entry_info *Info);
-@@ -262,21 +262,17 @@ static struct inode_operations novfs_ino
-       .rename = novfs_i_rename,
-       .setattr = novfs_i_setattr,
-       .getattr = novfs_i_getattr,
--/*
-       .getxattr = novfs_i_getxattr,
-       .setxattr = novfs_i_setxattr,
-       .listxattr = novfs_i_listxattr,
--*/
- };
- static struct inode_operations novfs_file_inode_operations = {
-       .setattr = novfs_i_setattr,
-       .getattr = novfs_i_getattr,
--/*
-       .getxattr = novfs_i_getxattr,
-       .setxattr = novfs_i_setxattr,
-       .listxattr = novfs_i_listxattr,
--*/
- };
- static struct super_operations novfs_ops = {
-@@ -935,14 +931,23 @@ int novfs_dir_open(struct inode *dir, st
- int novfs_dir_release(struct inode *dir, struct file *file)
- {
--      struct file_private *file_private;
--      file_private = (struct file_private *) file->private_data;
-+      struct file_private *file_private = file->private_data;
-+      struct inode *inode = file->f_dentry->d_inode;
-+      struct novfs_schandle sessionId;
-       DbgPrint("novfs_dir_release: Inode 0x%p %d Name %.*s\n", dir,
-                dir->i_ino, file->f_dentry->d_name.len,
-                file->f_dentry->d_name.name);
-       if (file_private) {
-+              if (file_private->enumHandle && (file_private->enumHandle != ((void *)-1))) {
-+                      sessionId = novfs_scope_get_sessionId(((struct inode_data *)inode->i_private)->Scope);
-+                      if (SC_PRESENT(sessionId) == 0) {
-+                              ((struct inode_data *)inode->i_private)->Scope = novfs_get_scope(file->f_dentry);
-+                              sessionId = novfs_scope_get_sessionId(((struct inode_data *)inode->i_private)->Scope);
-+                      }
-+                      novfs_end_directory_enumerate(file_private->enumHandle, sessionId);
-+              }
-               kfree(file_private);
-               file->private_data = NULL;
-       }
-@@ -966,6 +971,16 @@ loff_t novfs_dir_lseek(struct file * fil
-       file_private = (struct file_private *) file->private_data;
-       file_private->listedall = 0;
-+      if (file_private->enumHandle && (file_private->enumHandle != ((void *)-1))) {
-+              struct novfs_schandle sessionId;
-+              struct inode *inode = file->f_dentry->d_inode;
-+              sessionId = novfs_scope_get_sessionId(((struct inode_data *)inode->i_private)->Scope);
-+              if (SC_PRESENT(sessionId) == 0) {
-+                      ((struct inode_data *)inode->i_private)->Scope = novfs_get_scope(file->f_dentry);
-+                      sessionId = novfs_scope_get_sessionId(((struct inode_data *)inode->i_private)->Scope);
-+              }
-+              novfs_end_directory_enumerate(file_private->enumHandle, sessionId);
-+      }
-       file_private->enumHandle = NULL;
-       return 0;
-@@ -2864,9 +2879,15 @@ int novfs_i_unlink(struct inode *dir, st
-                                       } else {
-                                               retCode =
-                                                   novfs_delete(path,
--                                                               S_ISDIR(inode->
--                                                                       i_mode),
--                                                               session);
-+                                                               S_ISDIR(inode->i_mode), session);
-+                                              if (retCode) {
-+                                                      struct iattr ia;
-+                                                      memset(&ia, 0, sizeof(ia));
-+                                                      ia.ia_valid = ATTR_MODE;
-+                                                      ia.ia_mode = S_IRWXU;
-+                                                      novfs_set_attr(path, &ia, session);
-+                                                      retCode = novfs_delete(path, S_ISDIR(inode->i_mode), session);
-+                                              }
-                                       }
-                                       if (!retCode || IS_DEADDIR(inode)) {
-                                               novfs_remove_inode_entry(dir,
-@@ -3119,13 +3140,16 @@ int novfs_i_rename(struct inode *odir, s
-                                                               }
-                                                               retCode =
--                                                                  novfs_delete
--                                                                  (newpath,
--                                                                   S_ISDIR
--                                                                   (nd->
--                                                                    d_inode->
--                                                                    i_mode),
--                                                                   session);
-+                                                                  novfs_delete(newpath, S_ISDIR(nd->d_inode->i_mode), session);
-+                                                              if (retCode) {
-+                                                                      struct iattr ia;
-+                                                                      memset(&ia, 0, sizeof(ia));
-+                                                                      ia.ia_valid = ATTR_MODE;
-+                                                                      ia.ia_mode = S_IRWXU;
-+                                                                      novfs_set_attr(newpath, &ia, session);
-+                                                                      retCode = novfs_delete(newpath, S_ISDIR(nd->d_inode->i_mode), session);
-+                                                              }
-+
-                                                       }
-                                                       session = novfs_scope_get_sessionId(((struct inode_data *) ndir->i_private)->Scope);
-@@ -3378,7 +3402,7 @@ int novfs_i_getattr(struct vfsmount *mnt
-       return (retCode);
- }
--int novfs_i_getxattr(struct dentry *dentry, const char *name, void *buffer,
-+ssize_t novfs_i_getxattr(struct dentry *dentry, const char *name, void *buffer,
-                    size_t buffer_size)
- {
-       struct inode *inode = dentry->d_inode;
-@@ -3528,7 +3552,7 @@ int novfs_i_setxattr(struct dentry *dent
-       return (retError);
- }
--int novfs_i_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
-+ssize_t novfs_i_listxattr(struct dentry *dentry, char *buffer, size_t buffer_size)
- {
-       struct inode *inode = dentry->d_inode;
-       struct novfs_schandle sessionId;
-@@ -3720,6 +3744,9 @@ int novfs_statfs(struct dentry *de, stru
-       DbgPrint("fd=%llu\n", fd);
-       DbgPrint("te=%llu\n", te);
-       DbgPrint("fe=%llu\n", fd);
-+      /* fix for Nautilus */
-+      if (sb->s_blocksize == 0)
-+              sb->s_blocksize = 4096;
-       buf->f_type = sb->s_magic;
-       buf->f_bsize = sb->s_blocksize;
-@@ -3762,7 +3789,6 @@ struct inode *novfs_get_inode(struct sup
-               inode->i_mode = mode;
-               inode->i_uid = Uid;
-               inode->i_gid = 0;
--              inode->i_sb->s_blocksize = sb->s_blocksize;
-               inode->i_blkbits = sb->s_blocksize_bits;
-               inode->i_blocks = 0;
-               inode->i_rdev = 0;
-@@ -3826,8 +3852,6 @@ struct inode *novfs_get_inode(struct sup
-               case S_IFDIR:
-                       inode->i_op = &novfs_inode_operations;
-                       inode->i_fop = &novfs_dir_operations;
--
--                      inode->i_sb->s_blocksize = 0;
-                       inode->i_blkbits = 0;
-                       break;
-@@ -3957,6 +3981,7 @@ static int novfs_get_sb(struct file_syst
- static void novfs_kill_sb(struct super_block *super)
- {
-+      shrink_dcache_sb(super);
-       kill_litter_super(super);
- }
-Index: linux-2.6.27/fs/novfs/vfs.h
-===================================================================
---- linux-2.6.27.orig/fs/novfs/vfs.h   2008-12-02 11:57:24.000000000 +0530
-+++ linux-2.6.27/fs/novfs/vfs.h        2008-12-02 11:58:18.000000000 +0530
-@@ -344,7 +344,8 @@ extern int novfs_close_stream(void * Con
-                             struct novfs_schandle SessionId);
- extern int novfs_add_to_root(char *);
--
-+extern int novfs_end_directory_enumerate(void *EnumHandle,
-+                                      struct novfs_schandle SessionId);
- /*
-  * scope.c functions
-Index: linux-2.6.27/fs/novfs/nwcapi.c
-===================================================================
---- linux-2.6.27.orig/fs/novfs/nwcapi.c        2008-12-02 11:57:24.000000000 +0530
-+++ linux-2.6.27/fs/novfs/nwcapi.c     2008-12-02 11:58:18.000000000 +0530
-@@ -1845,14 +1845,14 @@ int novfs_set_map_drive(struct novfs_xpl
-       struct novfs_xplat_call_request *cmd;
-       struct novfs_xplat_call_reply *reply;
--      unsigned long status = 0, datalen, cmdlen, replylen, cpylen;
-+      unsigned long status = 0, datalen, cmdlen, replylen;
-       struct nwc_map_drive_ex symInfo;
-       DbgPrint("Call to NwcSetMapDrive\n");
--      cpylen = copy_from_user(&symInfo, pdata->reqData, sizeof(symInfo));
-       cmdlen = sizeof(*cmd);
--      datalen =
--          sizeof(symInfo) + symInfo.dirPathOffsetLength +
-+      if (copy_from_user(&symInfo, pdata->reqData, sizeof(symInfo)))
-+              return -EFAULT;
-+      datalen = sizeof(symInfo) + symInfo.dirPathOffsetLength +
-           symInfo.linkOffsetLength;
-       DbgPrint(" cmdlen = %d\n", cmdlen);
-@@ -1876,7 +1876,10 @@ int novfs_set_map_drive(struct novfs_xpl
-       cmd->Command.SessionId = Session;
-       cmd->NwcCommand = NWC_MAP_DRIVE;
--      cpylen = copy_from_user(cmd->data, pdata->reqData, datalen);
-+      if (copy_from_user(cmd->data, pdata->reqData, datalen)) {
-+              kfree(cmd);
-+              return -EFAULT;
-+      }
-       status =
-               Queue_Daemon_Command((void *)cmd, cmdlen, NULL, 0,
-                               (void **)&reply, &replylen,
diff --git a/src/patches/suse-2.6.27.31/patches.suse/panic-on-io-nmi.diff b/src/patches/suse-2.6.27.31/patches.suse/panic-on-io-nmi.diff
deleted file mode 100644 (file)
index e6043a2..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-From: Kurt Garloff <garloff@suse.de>
-Subject: [PATCH] X86: sysctl to allow panic on IOCK NMI error
-References: bnc427979
-
-This patch introduces a sysctl /proc/sys/kernel/panic_on_io_nmi.,
-which defaults to 0 (off).
-When enabled, the kernel panics when the kernel receives an NMI
-caused by an IO error.
-
-The IO error triggered NMI indicates a serious system condition,
-which could result in IO data corruption. Rather than contiuing,
-panicing and dumping might be a better choice, so one can figure
-out what's causing the IO error.
-This could be especially important to companies running IO intensive
-applications where corruption must be avoided, e.g. a banks databases.
-
-
-Signed-off-by: Roberto Angelino <robertangelino@gmail.com>
-
-
----
- arch/x86/kernel/traps_32.c |    4 ++++
- arch/x86/kernel/traps_64.c |    4 ++++
- include/linux/kernel.h     |    1 +
- include/linux/sysctl.h     |    1 +
- kernel/sysctl.c            |    8 ++++++++
- kernel/sysctl_check.c      |    1 +
- 6 files changed, 19 insertions(+)
-
---- a/arch/x86/kernel/traps_32.c
-+++ b/arch/x86/kernel/traps_32.c
-@@ -83,6 +83,7 @@ gate_desc idt_table[256]
-       __attribute__((__section__(".data.idt"))) = { { { { 0, 0 } } }, };
- int panic_on_unrecovered_nmi;
-+int panic_on_io_nmi;
- int kstack_depth_to_print = 24;
- static unsigned int code_bytes = 64;
- #ifdef CONFIG_STACK_UNWIND
-@@ -779,6 +780,9 @@ io_check_error(unsigned char reason, str
-       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-+      if (panic_on_io_nmi)
-+              panic("NMI IOCK error: Not continuing");
-+
-       /* Re-enable the IOCK line, wait for a few seconds */
-       reason = (reason & 0xf) | 8;
-       outb(reason, 0x61);
---- a/arch/x86/kernel/traps_64.c
-+++ b/arch/x86/kernel/traps_64.c
-@@ -56,6 +56,7 @@
- #include <mach_traps.h>
- int panic_on_unrecovered_nmi;
-+int panic_on_io_nmi;
- int kstack_depth_to_print = 12;
- static unsigned int code_bytes = 64;
- #ifdef CONFIG_STACK_UNWIND
-@@ -840,6 +841,9 @@ io_check_error(unsigned char reason, str
-       printk("NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-+      if (panic_on_io_nmi)
-+              panic("NMI IOCK error: Not continuing");
-+
-       /* Re-enable the IOCK line, wait for a few seconds */
-       reason = (reason & 0xf) | 8;
-       outb(reason, 0x61);
---- a/include/linux/kernel.h
-+++ b/include/linux/kernel.h
-@@ -236,6 +236,7 @@ extern int oops_in_progress;               /* If set,
- extern int panic_timeout;
- extern int panic_on_oops;
- extern int panic_on_unrecovered_nmi;
-+extern int panic_on_io_nmi;
- extern int tainted;
- extern int unsupported;
- extern const char *print_tainted(void);
---- a/include/linux/sysctl.h
-+++ b/include/linux/sysctl.h
-@@ -165,6 +165,7 @@ enum
-       KERN_PANIC_ON_NMI=76, /* int: whether we will panic on an unrecovered */
-       KERN_KDB=77,            /* int: kdb on/off */
-       KERN_DUMP_AFTER_NOTIFIER=78, /* int: kdump after panic_notifier (SUSE only) */
-+      KERN_PANIC_ON_IO_NMI=79, /* int: whether we will panic on an io NMI */
- };
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -691,6 +691,14 @@ static struct ctl_table kern_table[] = {
-               .proc_handler   = &proc_dointvec,
-       },
-       {
-+              .ctl_name       = KERN_PANIC_ON_IO_NMI,
-+              .procname       = "panic_on_io_nmi",
-+              .data           = &panic_on_io_nmi,
-+              .maxlen         = sizeof(int),
-+              .mode           = 0644,
-+              .proc_handler   = &proc_dointvec,
-+      },
-+      {
-               .ctl_name       = KERN_BOOTLOADER_TYPE,
-               .procname       = "bootloader_type",
-               .data           = &bootloader_type,
---- a/kernel/sysctl_check.c
-+++ b/kernel/sysctl_check.c
-@@ -104,6 +104,7 @@ static const struct trans_ctl_table tran
-       { KERN_MAX_LOCK_DEPTH,          "max_lock_depth" },
-       { KERN_NMI_WATCHDOG,            "nmi_watchdog" },
-       { KERN_PANIC_ON_NMI,            "panic_on_unrecovered_nmi" },
-+      { KERN_PANIC_ON_IO_NMI,         "panic_on_io_nmi" },
-       { KERN_SETUID_DUMPABLE,         "suid_dumpable" },
-       { KERN_KDB,                     "kdb" },
-       { KERN_DUMP_AFTER_NOTIFIER,     "dump_after_notifier" },
diff --git a/src/patches/suse-2.6.27.31/patches.suse/parser-match_string.diff b/src/patches/suse-2.6.27.31/patches.suse/parser-match_string.diff
deleted file mode 100644 (file)
index 912f25d..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-From: Andreas Gruenbacher <agruen@suse.de>
-Subject: Add match_string() for mount option parsing
-References: FATE301275
-Patch-mainline: no
-
-The match_string() function allows to parse string constants in
-mount options.
-
-Signed-off-by: Andreas Gruenbacher <agruen@suse.de>
-
----
- include/linux/parser.h |    1 +
- lib/parser.c           |   14 ++++++++++++++
- 2 files changed, 15 insertions(+)
-
---- a/include/linux/parser.h
-+++ b/include/linux/parser.h
-@@ -26,6 +26,7 @@ typedef struct {
- } substring_t;
- int match_token(char *, match_table_t table, substring_t args[]);
-+int match_string(substring_t *s, const char *str);
- int match_int(substring_t *, int *result);
- int match_octal(substring_t *, int *result);
- int match_hex(substring_t *, int *result);
---- a/lib/parser.c
-+++ b/lib/parser.c
-@@ -111,6 +111,19 @@ int match_token(char *s, match_table_t t
- }
- /**
-+ * match_string: check for a particular parameter
-+ * @s: substring to be scanned
-+ * @str: string to scan for
-+ *
-+ * Description: Return if a &substring_t is equal to string @str.
-+ */
-+int match_string(substring_t *s, const char *str)
-+{
-+      return strlen(str) == s->to - s->from &&
-+             !memcmp(str, s->from, s->to - s->from);
-+}
-+
-+/**
-  * match_number: scan a number in the given base from a substring_t
-  * @s: substring to be scanned
-  * @result: resulting integer on success
-@@ -221,6 +234,7 @@ char *match_strdup(const substring_t *s)
- }
- EXPORT_SYMBOL(match_token);
-+EXPORT_SYMBOL(match_string);
- EXPORT_SYMBOL(match_int);
- EXPORT_SYMBOL(match_octal);
- EXPORT_SYMBOL(match_hex);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/raw_device_max_minors_param.diff b/src/patches/suse-2.6.27.31/patches.suse/raw_device_max_minors_param.diff
deleted file mode 100644 (file)
index 2971d63..0000000
+++ /dev/null
@@ -1,112 +0,0 @@
-From: Jan Kara <jack@suse.cz>
-Subject: Allow setting of number of raw devices as a module parameter
-References: FATE 302178
-Patch-mainline: never
-
-Allow setting of maximal number of raw devices as a module parameter. This requires
-changing of static array into a vmalloced one (the array is going to be too large
-for kmalloc).
-
-Signed-off-by: Jan Kara <jack@suse.cz>
-
----
- drivers/char/Kconfig |    2 +-
- drivers/char/raw.c   |   33 +++++++++++++++++++++++++++------
- 2 files changed, 28 insertions(+), 7 deletions(-)
-
---- a/drivers/char/Kconfig
-+++ b/drivers/char/Kconfig
-@@ -1026,7 +1026,7 @@ config RAW_DRIVER
-           with the O_DIRECT flag.
- config MAX_RAW_DEVS
--      int "Maximum number of RAW devices to support (1-8192)"
-+      int "Maximum number of RAW devices to support (1-65536)"
-       depends on RAW_DRIVER
-       default "256"
-       help
---- a/drivers/char/raw.c
-+++ b/drivers/char/raw.c
-@@ -20,6 +20,7 @@
- #include <linux/device.h>
- #include <linux/mutex.h>
- #include <linux/smp_lock.h>
-+#include <linux/vmalloc.h>
- #include <asm/uaccess.h>
-@@ -29,10 +30,15 @@ struct raw_device_data {
- };
- static struct class *raw_class;
--static struct raw_device_data raw_devices[MAX_RAW_MINORS];
-+static struct raw_device_data *raw_devices;
- static DEFINE_MUTEX(raw_mutex);
- static const struct file_operations raw_ctl_fops; /* forward declaration */
-+static int max_raw_minors = MAX_RAW_MINORS;
-+
-+module_param(max_raw_minors, int, 0);
-+MODULE_PARM_DESC(max_raw_minors, "Maximum number of raw devices (1-65536)");
-+
- /*
-  * Open/close code for raw IO.
-  *
-@@ -158,7 +164,7 @@ static int raw_ctl_ioctl(struct inode *i
-                       goto out;
-               }
--              if (rq.raw_minor <= 0 || rq.raw_minor >= MAX_RAW_MINORS) {
-+              if (rq.raw_minor <= 0 || rq.raw_minor >= max_raw_minors) {
-                       err = -EINVAL;
-                       goto out;
-               }
-@@ -266,12 +272,26 @@ static int __init raw_init(void)
-       dev_t dev = MKDEV(RAW_MAJOR, 0);
-       int ret;
--      ret = register_chrdev_region(dev, MAX_RAW_MINORS, "raw");
-+      if (max_raw_minors < 1 || max_raw_minors > 65536) {
-+              printk(KERN_WARNING "raw: invalid max_raw_minors (must be"
-+                      " between 1 and 65536), using %d\n", MAX_RAW_MINORS);
-+              max_raw_minors = MAX_RAW_MINORS;
-+      }
-+
-+      raw_devices = vmalloc(sizeof(struct raw_device_data) * max_raw_minors);
-+      if (!raw_devices) {
-+              printk(KERN_ERR "Not enough memory for raw device structures\n");
-+              ret = -ENOMEM;
-+              goto error;
-+      }
-+      memset(raw_devices, 0, sizeof(struct raw_device_data) * max_raw_minors);
-+
-+      ret = register_chrdev_region(dev, max_raw_minors, "raw");
-       if (ret)
-               goto error;
-       cdev_init(&raw_cdev, &raw_fops);
--      ret = cdev_add(&raw_cdev, dev, MAX_RAW_MINORS);
-+      ret = cdev_add(&raw_cdev, dev, max_raw_minors);
-       if (ret) {
-               kobject_put(&raw_cdev.kobj);
-               goto error_region;
-@@ -290,8 +310,9 @@ static int __init raw_init(void)
-       return 0;
- error_region:
--      unregister_chrdev_region(dev, MAX_RAW_MINORS);
-+      unregister_chrdev_region(dev, max_raw_minors);
- error:
-+      vfree(raw_devices);
-       return ret;
- }
-@@ -300,7 +321,7 @@ static void __exit raw_exit(void)
-       device_destroy(raw_class, MKDEV(RAW_MAJOR, 0));
-       class_destroy(raw_class);
-       cdev_del(&raw_cdev);
--      unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), MAX_RAW_MINORS);
-+      unregister_chrdev_region(MKDEV(RAW_MAJOR, 0), max_raw_minors);
- }
- module_init(raw_init);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-add-reiserfs_error.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-add-reiserfs_error.diff
deleted file mode 100644 (file)
index 04f95cf..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: introduce reiserfs_error()
-
- Although reiserfs can currently handle severe errors such as journal failure,
- it cannot handle less severe errors like metadata i/o failure. The following
- patch adds a reiserfs_error() function akin to the one in ext3.
-
- Subsequent patches will use this new error handler to handle errors more
- gracefully in general.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/prints.c        |   25 +++++++++++++++++++++++++
- include/linux/reiserfs_fs.h |    4 ++++
- 2 files changed, 29 insertions(+)
-
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -373,6 +373,31 @@ void __reiserfs_panic(struct super_block
-                     id ? id : "", id ? " " : "", function, error_buf);
- }
-+void __reiserfs_error(struct super_block *sb, const char *id,
-+                    const char *function, const char *fmt, ...)
-+{
-+      do_reiserfs_warning(fmt);
-+
-+      BUG_ON(sb == NULL);
-+
-+      if (reiserfs_error_panic(sb))
-+              __reiserfs_panic(sb, id, function, error_buf);
-+
-+      if (id && id[0])
-+              printk(KERN_CRIT "REISERFS error (device %s): %s %s: %s\n",
-+                     sb->s_id, id, function, error_buf);
-+      else
-+              printk(KERN_CRIT "REISERFS error (device %s): %s: %s\n",
-+                     sb->s_id, function, error_buf);
-+
-+      if (sb->s_flags & MS_RDONLY)
-+              return;
-+
-+      reiserfs_info(sb, "Remounting filesystem read-only\n");
-+      sb->s_flags |= MS_RDONLY;
-+      reiserfs_abort_journal(sb, -EIO);
-+}
-+
- void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...)
- {
-       do_reiserfs_warning(fmt);
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -2006,6 +2006,10 @@ void __reiserfs_panic(struct super_block
-     __attribute__ ((noreturn));
- #define reiserfs_panic(s, id, fmt, args...) \
-       __reiserfs_panic(s, id, __func__, fmt, ##args)
-+void __reiserfs_error(struct super_block *s, const char *id,
-+                    const char *function, const char *fmt, ...);
-+#define reiserfs_error(s, id, fmt, args...) \
-+       __reiserfs_error(s, id, __func__, fmt, ##args)
- void reiserfs_info(struct super_block *s, const char *fmt, ...);
- void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
- void print_indirect_item(struct buffer_head *bh, int item_num);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-buffer-info-for-balance.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-buffer-info-for-balance.diff
deleted file mode 100644 (file)
index 0504947..0000000
+++ /dev/null
@@ -1,122 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: use buffer_info for leaf_paste_entries
-
- This patch makes leaf_paste_entries more consistent with respect to the
- other leaf operations. Using buffer_info instead of buffer_head directly
- allows us to get a superblock pointer for use in error handling.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/do_balan.c      |   17 +++++++----------
- fs/reiserfs/lbalance.c      |    5 +++--
- include/linux/reiserfs_fs.h |    2 +-
- 3 files changed, 11 insertions(+), 13 deletions(-)
-
---- a/fs/reiserfs/do_balan.c
-+++ b/fs/reiserfs/do_balan.c
-@@ -449,8 +449,7 @@ static int balance_leaf(struct tree_bala
-                                                       /* when we have merge directory item, pos_in_item has been changed too */
-                                                       /* paste new directory entry. 1 is entry number */
--                                                      leaf_paste_entries(bi.
--                                                                         bi_bh,
-+                                                      leaf_paste_entries(&bi,
-                                                                          n +
-                                                                          item_pos
-                                                                          -
-@@ -699,7 +698,7 @@ static int balance_leaf(struct tree_bala
-                                                          n + item_pos -
-                                                          ret_val);
-                                       if (is_direntry_le_ih(pasted))
--                                              leaf_paste_entries(bi.bi_bh,
-+                                              leaf_paste_entries(&bi,
-                                                                  n +
-                                                                  item_pos -
-                                                                  ret_val,
-@@ -894,8 +893,7 @@ static int balance_leaf(struct tree_bala
-                                                            tb->insert_size[0],
-                                                            body, zeros_num);
-                                                       /* paste entry */
--                                                      leaf_paste_entries(bi.
--                                                                         bi_bh,
-+                                                      leaf_paste_entries(&bi,
-                                                                          0,
-                                                                          paste_entry_position,
-                                                                          1,
-@@ -1096,7 +1094,7 @@ static int balance_leaf(struct tree_bala
-                                                          tb->rnum[0]);
-                                       if (is_direntry_le_ih(pasted)
-                                           && pos_in_item >= 0) {
--                                              leaf_paste_entries(bi.bi_bh,
-+                                              leaf_paste_entries(&bi,
-                                                                  item_pos -
-                                                                  n +
-                                                                  tb->rnum[0],
-@@ -1339,8 +1337,7 @@ static int balance_leaf(struct tree_bala
-                                                            tb->insert_size[0],
-                                                            body, zeros_num);
-                                                       /* paste new directory entry */
--                                                      leaf_paste_entries(bi.
--                                                                         bi_bh,
-+                                                      leaf_paste_entries(&bi,
-                                                                          0,
-                                                                          pos_in_item
-                                                                          -
-@@ -1505,7 +1502,7 @@ static int balance_leaf(struct tree_bala
-                                                          item_pos - n +
-                                                          snum[i]);
-                                       if (is_direntry_le_ih(pasted)) {
--                                              leaf_paste_entries(bi.bi_bh,
-+                                              leaf_paste_entries(&bi,
-                                                                  item_pos -
-                                                                  n + snum[i],
-                                                                  pos_in_item,
-@@ -1606,7 +1603,7 @@ static int balance_leaf(struct tree_bala
-                                                                    zeros_num);
-                                               /* paste entry */
--                                              leaf_paste_entries(bi.bi_bh,
-+                                              leaf_paste_entries(&bi,
-                                                                  item_pos,
-                                                                  pos_in_item,
-                                                                  1,
---- a/fs/reiserfs/lbalance.c
-+++ b/fs/reiserfs/lbalance.c
-@@ -111,7 +111,7 @@ static void leaf_copy_dir_entries(struct
-       item_num_in_dest =
-           (last_first == FIRST_TO_LAST) ? (B_NR_ITEMS(dest) - 1) : 0;
--      leaf_paste_entries(dest_bi->bi_bh, item_num_in_dest,
-+      leaf_paste_entries(dest_bi, item_num_in_dest,
-                          (last_first ==
-                           FIRST_TO_LAST) ? I_ENTRY_COUNT(B_N_PITEM_HEAD(dest,
-                                                                         item_num_in_dest))
-@@ -1191,7 +1191,7 @@ static void leaf_delete_items_entirely(s
- }
- /* paste new_entry_count entries (new_dehs, records) into position before to item_num-th item */
--void leaf_paste_entries(struct buffer_head *bh,
-+void leaf_paste_entries(struct buffer_info *bi,
-                       int item_num,
-                       int before,
-                       int new_entry_count,
-@@ -1203,6 +1203,7 @@ void leaf_paste_entries(struct buffer_he
-       struct reiserfs_de_head *deh;
-       char *insert_point;
-       int i, old_entry_num;
-+      struct buffer_head *bh = bi->bi_bh;
-       if (new_entry_count == 0)
-               return;
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -2026,7 +2026,7 @@ void leaf_paste_in_buffer(struct buffer_
-                         int zeros_number);
- void leaf_cut_from_buffer(struct buffer_info *bi, int cut_item_num,
-                         int pos_in_item, int cut_size);
--void leaf_paste_entries(struct buffer_head *bh, int item_num, int before,
-+void leaf_paste_entries(struct buffer_info *bi, int item_num, int before,
-                       int new_entry_count, struct reiserfs_de_head *new_dehs,
-                       const char *records, int paste_size);
- /* ibalance.c */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-cleanup-path-funcs.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-cleanup-path-funcs.diff
deleted file mode 100644 (file)
index d567695..0000000
+++ /dev/null
@@ -1,290 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: cleanup path functions
-
- This patch cleans up some redundancies in the reiserfs tree path code.
-
- decrement_bcount() is essentially the same function as brelse(), so we use
- that instead.
-
- decrement_counters_in_path() is exactly the same function as pathrelse(), so
- we kill that and use pathrelse() instead.
-
- There's also a bit of cleanup that makes the code a bit more readable.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/fix_node.c |   58 ++++++++++++++++++++++++------------------------
- fs/reiserfs/stree.c    |   59 ++++++++++---------------------------------------
- 2 files changed, 43 insertions(+), 74 deletions(-)
-
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -753,20 +753,21 @@ static void free_buffers_in_tb(struct tr
- {
-       int n_counter;
--      decrement_counters_in_path(p_s_tb->tb_path);
-+      pathrelse(p_s_tb->tb_path);
-       for (n_counter = 0; n_counter < MAX_HEIGHT; n_counter++) {
--              decrement_bcount(p_s_tb->L[n_counter]);
-+              brelse(p_s_tb->L[n_counter]);
-+              brelse(p_s_tb->R[n_counter]);
-+              brelse(p_s_tb->FL[n_counter]);
-+              brelse(p_s_tb->FR[n_counter]);
-+              brelse(p_s_tb->CFL[n_counter]);
-+              brelse(p_s_tb->CFR[n_counter]);
-+
-               p_s_tb->L[n_counter] = NULL;
--              decrement_bcount(p_s_tb->R[n_counter]);
-               p_s_tb->R[n_counter] = NULL;
--              decrement_bcount(p_s_tb->FL[n_counter]);
-               p_s_tb->FL[n_counter] = NULL;
--              decrement_bcount(p_s_tb->FR[n_counter]);
-               p_s_tb->FR[n_counter] = NULL;
--              decrement_bcount(p_s_tb->CFL[n_counter]);
-               p_s_tb->CFL[n_counter] = NULL;
--              decrement_bcount(p_s_tb->CFR[n_counter]);
-               p_s_tb->CFR[n_counter] = NULL;
-       }
- }
-@@ -1022,7 +1023,7 @@ static int get_far_parent(struct tree_ba
-       if (buffer_locked(*pp_s_com_father)) {
-               __wait_on_buffer(*pp_s_com_father);
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--                      decrement_bcount(*pp_s_com_father);
-+                      brelse(*pp_s_com_father);
-                       return REPEAT_SEARCH;
-               }
-       }
-@@ -1050,8 +1051,8 @@ static int get_far_parent(struct tree_ba
-               return IO_ERROR;
-       if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--              decrement_counters_in_path(&s_path_to_neighbor_father);
--              decrement_bcount(*pp_s_com_father);
-+              pathrelse(&s_path_to_neighbor_father);
-+              brelse(*pp_s_com_father);
-               return REPEAT_SEARCH;
-       }
-@@ -1063,7 +1064,7 @@ static int get_far_parent(struct tree_ba
-              FIRST_PATH_ELEMENT_OFFSET, "PAP-8192: path length is too small");
-       s_path_to_neighbor_father.path_length--;
--      decrement_counters_in_path(&s_path_to_neighbor_father);
-+      pathrelse(&s_path_to_neighbor_father);
-       return CARRY_ON;
- }
-@@ -1086,10 +1087,10 @@ static int get_parents(struct tree_balan
-       if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-               /* The root can not have parents.
-                  Release nodes which previously were obtained as parents of the current node neighbors. */
--              decrement_bcount(p_s_tb->FL[n_h]);
--              decrement_bcount(p_s_tb->CFL[n_h]);
--              decrement_bcount(p_s_tb->FR[n_h]);
--              decrement_bcount(p_s_tb->CFR[n_h]);
-+              brelse(p_s_tb->FL[n_h]);
-+              brelse(p_s_tb->CFL[n_h]);
-+              brelse(p_s_tb->FR[n_h]);
-+              brelse(p_s_tb->CFR[n_h]);
-               p_s_tb->FL[n_h] = p_s_tb->CFL[n_h] = p_s_tb->FR[n_h] =
-                   p_s_tb->CFR[n_h] = NULL;
-               return CARRY_ON;
-@@ -1115,9 +1116,9 @@ static int get_parents(struct tree_balan
-                       return n_ret_value;
-       }
--      decrement_bcount(p_s_tb->FL[n_h]);
-+      brelse(p_s_tb->FL[n_h]);
-       p_s_tb->FL[n_h] = p_s_curf;     /* New initialization of FL[n_h]. */
--      decrement_bcount(p_s_tb->CFL[n_h]);
-+      brelse(p_s_tb->CFL[n_h]);
-       p_s_tb->CFL[n_h] = p_s_curcf;   /* New initialization of CFL[n_h]. */
-       RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
-@@ -1145,10 +1146,10 @@ static int get_parents(struct tree_balan
-               p_s_tb->rkey[n_h] = n_position;
-       }
--      decrement_bcount(p_s_tb->FR[n_h]);
-+      brelse(p_s_tb->FR[n_h]);
-       p_s_tb->FR[n_h] = p_s_curf;     /* New initialization of FR[n_path_offset]. */
--      decrement_bcount(p_s_tb->CFR[n_h]);
-+      brelse(p_s_tb->CFR[n_h]);
-       p_s_tb->CFR[n_h] = p_s_curcf;   /* New initialization of CFR[n_path_offset]. */
-       RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
-@@ -1964,7 +1965,7 @@ static int get_neighbors(struct tree_bal
-               if (!p_s_bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--                      decrement_bcount(p_s_bh);
-+                      brelse(p_s_bh);
-                       PROC_INFO_INC(p_s_sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
-@@ -1980,7 +1981,7 @@ static int get_neighbors(struct tree_bal
-                      dc_size(B_N_CHILD(p_s_tb->FL[0], n_child_position)),
-                      "PAP-8290: invalid child size of left neighbor");
--              decrement_bcount(p_s_tb->L[n_h]);
-+              brelse(p_s_tb->L[n_h]);
-               p_s_tb->L[n_h] = p_s_bh;
-       }
-@@ -2001,11 +2002,11 @@ static int get_neighbors(struct tree_bal
-               if (!p_s_bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--                      decrement_bcount(p_s_bh);
-+                      brelse(p_s_bh);
-                       PROC_INFO_INC(p_s_sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
--              decrement_bcount(p_s_tb->R[n_h]);
-+              brelse(p_s_tb->R[n_h]);
-               p_s_tb->R[n_h] = p_s_bh;
-               RFALSE(!n_h
-@@ -2511,16 +2512,17 @@ int fix_nodes(int n_op_mode, struct tree
-                       }
-                       brelse(p_s_tb->L[i]);
--                      p_s_tb->L[i] = NULL;
-                       brelse(p_s_tb->R[i]);
--                      p_s_tb->R[i] = NULL;
-                       brelse(p_s_tb->FL[i]);
--                      p_s_tb->FL[i] = NULL;
-                       brelse(p_s_tb->FR[i]);
--                      p_s_tb->FR[i] = NULL;
-                       brelse(p_s_tb->CFL[i]);
--                      p_s_tb->CFL[i] = NULL;
-                       brelse(p_s_tb->CFR[i]);
-+
-+                      p_s_tb->L[i] = NULL;
-+                      p_s_tb->R[i] = NULL;
-+                      p_s_tb->FL[i] = NULL;
-+                      p_s_tb->FR[i] = NULL;
-+                      p_s_tb->CFL[i] = NULL;
-                       p_s_tb->CFR[i] = NULL;
-               }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -23,7 +23,6 @@
-  * get_rkey
-  * key_in_buffer
-  * decrement_bcount
-- * decrement_counters_in_path
-  * reiserfs_check_path
-  * pathrelse_and_restore
-  * pathrelse
-@@ -359,36 +358,6 @@ static inline int key_in_buffer(struct t
-       return 1;
- }
--inline void decrement_bcount(struct buffer_head *p_s_bh)
--{
--      if (p_s_bh) {
--              if (atomic_read(&(p_s_bh->b_count))) {
--                      put_bh(p_s_bh);
--                      return;
--              }
--              reiserfs_panic(NULL, "PAP-5070",
--                             "trying to free free buffer %b", p_s_bh);
--      }
--}
--
--/* Decrement b_count field of the all buffers in the path. */
--void decrement_counters_in_path(struct treepath *p_s_search_path)
--{
--      int n_path_offset = p_s_search_path->path_length;
--
--      RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET ||
--             n_path_offset > EXTENDED_MAX_HEIGHT - 1,
--             "PAP-5080: invalid path offset of %d", n_path_offset);
--
--      while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
--              struct buffer_head *bh;
--
--              bh = PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--);
--              decrement_bcount(bh);
--      }
--      p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
--}
--
- int reiserfs_check_path(struct treepath *p)
- {
-       RFALSE(p->path_length != ILLEGAL_PATH_ELEMENT_OFFSET,
-@@ -396,12 +365,11 @@ int reiserfs_check_path(struct treepath
-       return 0;
- }
--/* Release all buffers in the path. Restore dirty bits clean
--** when preparing the buffer for the log
--**
--** only called from fix_nodes()
--*/
--void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_path)
-+/* Drop the reference to each buffer in a path and restore
-+ * dirty bits clean when preparing the buffer for the log.
-+ * This version should only be called from fix_nodes() */
-+void pathrelse_and_restore(struct super_block *sb,
-+                         struct treepath *p_s_search_path)
- {
-       int n_path_offset = p_s_search_path->path_length;
-@@ -409,16 +377,15 @@ void pathrelse_and_restore(struct super_
-              "clm-4000: invalid path offset");
-       while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
--              reiserfs_restore_prepared_buffer(s,
--                                               PATH_OFFSET_PBUFFER
--                                               (p_s_search_path,
--                                                n_path_offset));
--              brelse(PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--));
-+              struct buffer_head *bh;
-+              bh = PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--);
-+              reiserfs_restore_prepared_buffer(sb, bh);
-+              brelse(bh);
-       }
-       p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
- }
--/* Release all buffers in the path. */
-+/* Drop the reference to each buffer in a path */
- void pathrelse(struct treepath *p_s_search_path)
- {
-       int n_path_offset = p_s_search_path->path_length;
-@@ -631,7 +598,7 @@ int search_by_key(struct super_block *p_
-          we must be careful to release all nodes in a path before we either
-          discard the path struct or re-use the path struct, as we do here. */
--      decrement_counters_in_path(p_s_search_path);
-+      pathrelse(p_s_search_path);
-       right_neighbor_of_leaf_node = 0;
-@@ -691,7 +658,7 @@ int search_by_key(struct super_block *p_
-                       PROC_INFO_INC(p_s_sb, search_by_key_restarted);
-                       PROC_INFO_INC(p_s_sb,
-                                     sbk_restarted[expected_level - 1]);
--                      decrement_counters_in_path(p_s_search_path);
-+                      pathrelse(p_s_search_path);
-                       /* Get the root block number so that we can repeat the search
-                          starting from the root. */
-@@ -1868,7 +1835,7 @@ int reiserfs_do_truncate(struct reiserfs
-               if (journal_transaction_should_end(th, 0) ||
-                   reiserfs_transaction_free_space(th) <= JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD) {
-                       int orig_len_alloc = th->t_blocks_allocated;
--                      decrement_counters_in_path(&s_search_path);
-+                      pathrelse(&s_search_path);
-                       if (update_timestamps) {
-                               p_s_inode->i_mtime = p_s_inode->i_ctime =
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-consistent-messages.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-consistent-messages.diff
deleted file mode 100644 (file)
index 11bcbfe..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: use more consistent printk formatting
-
- The output format between a warning/error/panic/info/etc changes with
- which one is used.
-
- The following patch makes the messages more internally consistent, but also
- more consistent with other Linux filesystems.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/prints.c |   28 ++++++++++++++--------------
- 1 file changed, 14 insertions(+), 14 deletions(-)
-
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -268,10 +268,10 @@ void reiserfs_warning(struct super_block
- {
-       do_reiserfs_warning(fmt);
-       if (sb)
--              printk(KERN_WARNING "ReiserFS: %s: warning: %s\n",
--                     reiserfs_bdevname(sb), error_buf);
-+              printk(KERN_WARNING "REISERFS warning (device %s): %s\n",
-+                     sb->s_id, error_buf);
-       else
--              printk(KERN_WARNING "ReiserFS: warning: %s\n", error_buf);
-+              printk(KERN_WARNING "REISERFS warning: %s\n", error_buf);
- }
- /* No newline.. reiserfs_info calls can be followed by printk's */
-@@ -279,10 +279,10 @@ void reiserfs_info(struct super_block *s
- {
-       do_reiserfs_warning(fmt);
-       if (sb)
--              printk(KERN_NOTICE "ReiserFS: %s: %s",
--                     reiserfs_bdevname(sb), error_buf);
-+              printk(KERN_NOTICE "REISERFS (device %s): %s",
-+                     sb->s_id, error_buf);
-       else
--              printk(KERN_NOTICE "ReiserFS: %s", error_buf);
-+              printk(KERN_NOTICE "REISERFS %s:", error_buf);
- }
- /* No newline.. reiserfs_printk calls can be followed by printk's */
-@@ -297,10 +297,10 @@ void reiserfs_debug(struct super_block *
- #ifdef CONFIG_REISERFS_CHECK
-       do_reiserfs_warning(fmt);
-       if (s)
--              printk(KERN_DEBUG "ReiserFS: %s: %s\n",
--                     reiserfs_bdevname(s), error_buf);
-+              printk(KERN_DEBUG "REISERFS debug (device %s): %s\n",
-+                     s->s_id, error_buf);
-       else
--              printk(KERN_DEBUG "ReiserFS: %s\n", error_buf);
-+              printk(KERN_DEBUG "REISERFS debug: %s\n", error_buf);
- #endif
- }
-@@ -368,15 +368,15 @@ void reiserfs_abort(struct super_block *
-       do_reiserfs_warning(fmt);
-       if (reiserfs_error_panic(sb)) {
--              panic(KERN_CRIT "REISERFS: panic (device %s): %s\n",
--                    reiserfs_bdevname(sb), error_buf);
-+              panic(KERN_CRIT "REISERFS panic (device %s): %s\n", sb->s_id,
-+                    error_buf);
-       }
--      if (sb->s_flags & MS_RDONLY)
-+      if (reiserfs_is_journal_aborted(SB_JOURNAL(sb)))
-               return;
--      printk(KERN_CRIT "REISERFS: abort (device %s): %s\n",
--             reiserfs_bdevname(sb), error_buf);
-+      printk(KERN_CRIT "REISERFS abort (device %s): %s\n", sb->s_id,
-+             error_buf);
-       sb->s_flags |= MS_RDONLY;
-       reiserfs_journal_abort(sb, errno);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-eliminate-per-super-xattr-lock.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-eliminate-per-super-xattr-lock.diff
deleted file mode 100644 (file)
index 08de42b..0000000
+++ /dev/null
@@ -1,573 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: eliminate per-super xattr lock
-
- With the switch to using inode->i_mutex locking during lookups/creation in
- the xattr root, the per-super xattr lock is no longer needed.
-
- This patch removes it.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
---
- fs/reiserfs/inode.c            |   14 -------
- fs/reiserfs/namei.c            |   29 ----------------
- fs/reiserfs/super.c            |    4 --
- fs/reiserfs/xattr.c            |   70 +++++++++++++++++++-------------------
- fs/reiserfs/xattr_acl.c        |   74 ++++++++++++++++++-----------------------
- include/linux/reiserfs_fs.h    |    3 -
- include/linux/reiserfs_fs_sb.h |    3 -
- include/linux/reiserfs_xattr.h |   28 ++-------------
- 8 files changed, 74 insertions(+), 151 deletions(-)
-
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -1962,19 +1962,7 @@ int reiserfs_new_inode(struct reiserfs_t
-       out_inserted_sd:
-       inode->i_nlink = 0;
-       th->t_trans_id = 0;     /* so the caller can't use this handle later */
--
--      /* If we were inheriting an ACL, we need to release the lock so that
--       * iput doesn't deadlock in reiserfs_delete_xattrs. The locking
--       * code really needs to be reworked, but this will take care of it
--       * for now. -jeffm */
--#ifdef CONFIG_REISERFS_FS_POSIX_ACL
--      if (REISERFS_I(dir)->i_acl_default && !IS_ERR(REISERFS_I(dir)->i_acl_default)) {
--              reiserfs_write_unlock_xattrs(dir->i_sb);
--              iput(inode);
--              reiserfs_write_lock_xattrs(dir->i_sb);
--      } else
--#endif
--              iput(inode);
-+      iput(inode);
-       return err;
- }
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -618,9 +618,6 @@ static int reiserfs_create(struct inode
-       reiserfs_write_lock(dir->i_sb);
--      if (locked)
--              reiserfs_write_lock_xattrs(dir->i_sb);
--
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-       if (retval) {
-               drop_new_inode(inode);
-@@ -633,11 +630,6 @@ static int reiserfs_create(struct inode
-       if (retval)
-               goto out_failed;
--      if (locked) {
--              reiserfs_write_unlock_xattrs(dir->i_sb);
--              locked = 0;
--      }
--
-       inode->i_op = &reiserfs_file_inode_operations;
-       inode->i_fop = &reiserfs_file_operations;
-       inode->i_mapping->a_ops = &reiserfs_address_space_operations;
-@@ -662,8 +654,6 @@ static int reiserfs_create(struct inode
-       retval = journal_end(&th, dir->i_sb, jbegin_count);
-       out_failed:
--      if (locked)
--              reiserfs_write_unlock_xattrs(dir->i_sb);
-       reiserfs_write_unlock(dir->i_sb);
-       return retval;
- }
-@@ -693,9 +683,6 @@ static int reiserfs_mknod(struct inode *
-       reiserfs_write_lock(dir->i_sb);
--      if (locked)
--              reiserfs_write_lock_xattrs(dir->i_sb);
--
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-       if (retval) {
-               drop_new_inode(inode);
-@@ -709,11 +696,6 @@ static int reiserfs_mknod(struct inode *
-               goto out_failed;
-       }
--      if (locked) {
--              reiserfs_write_unlock_xattrs(dir->i_sb);
--              locked = 0;
--      }
--
-       inode->i_op = &reiserfs_special_inode_operations;
-       init_special_inode(inode, inode->i_mode, rdev);
-@@ -741,8 +723,6 @@ static int reiserfs_mknod(struct inode *
-       retval = journal_end(&th, dir->i_sb, jbegin_count);
-       out_failed:
--      if (locked)
--              reiserfs_write_unlock_xattrs(dir->i_sb);
-       reiserfs_write_unlock(dir->i_sb);
-       return retval;
- }
-@@ -772,8 +752,6 @@ static int reiserfs_mkdir(struct inode *
-       locked = reiserfs_cache_default_acl(dir);
-       reiserfs_write_lock(dir->i_sb);
--      if (locked)
--              reiserfs_write_lock_xattrs(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-       if (retval) {
-@@ -795,11 +773,6 @@ static int reiserfs_mkdir(struct inode *
-               goto out_failed;
-       }
--      if (locked) {
--              reiserfs_write_unlock_xattrs(dir->i_sb);
--              locked = 0;
--      }
--
-       reiserfs_update_inode_transaction(inode);
-       reiserfs_update_inode_transaction(dir);
-@@ -827,8 +800,6 @@ static int reiserfs_mkdir(struct inode *
-       d_instantiate(dentry, inode);
-       retval = journal_end(&th, dir->i_sb, jbegin_count);
-       out_failed:
--      if (locked)
--              reiserfs_write_unlock_xattrs(dir->i_sb);
-       reiserfs_write_unlock(dir->i_sb);
-       return retval;
- }
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -1644,10 +1644,6 @@ static int reiserfs_fill_super(struct su
-       REISERFS_SB(s)->s_alloc_options.preallocmin = 0;
-       /* Preallocate by 16 blocks (17-1) at once */
-       REISERFS_SB(s)->s_alloc_options.preallocsize = 17;
--#ifdef CONFIG_REISERFS_FS_XATTR
--      /* Initialize the rwsem for xattr dir */
--      init_rwsem(&REISERFS_SB(s)->xattr_dir_sem);
--#endif
-       /* setup default block allocator options */
-       reiserfs_init_alloc_options(s);
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -27,6 +27,12 @@
-  * these are special cases for filesystem ACLs, they are interpreted by the
-  * kernel, in addition, they are negatively and positively cached and attached
-  * to the inode so that unnecessary lookups are avoided.
-+ *
-+ * Locking works like so:
-+ * The xattr root (/.reiserfs_priv/xattrs) is protected by its i_mutex.
-+ * The xattr dir (/.reiserfs_priv/xattrs/<oid>.<gen>) is protected by
-+ * inode->xattr_sem.
-+ * The xattrs themselves are likewise protected by the xattr_sem.
-  */
- #include <linux/reiserfs_fs.h>
-@@ -392,16 +398,17 @@ reiserfs_delete_xattrs_filler(void *buf,
- /* This is called w/ inode->i_mutex downed */
- int reiserfs_delete_xattrs(struct inode *inode)
- {
--      struct dentry *dir, *root;
-       int err = 0;
-+      struct dentry *dir, *root;
-+      struct reiserfs_transaction_handle th;
-+      int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
-+                   4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
-       /* Skip out, an xattr has no xattrs associated with it */
-       if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
-               return 0;
--      reiserfs_read_lock_xattrs(inode->i_sb);
-       dir = open_xa_dir(inode, XATTR_REPLACE);
--      reiserfs_read_unlock_xattrs(inode->i_sb);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-               goto out;
-@@ -416,18 +423,26 @@ int reiserfs_delete_xattrs(struct inode
-       if (err)
-               goto out_dir;
--      /* Leftovers besides . and .. -- that's not good. */
--      if (dir->d_inode->i_nlink <= 2) {
--              root = open_xa_root(inode->i_sb, XATTR_REPLACE);
--              reiserfs_write_lock_xattrs(inode->i_sb);
-+      /* We start a transaction here to avoid a ABBA situation
-+       * between the xattr root's i_mutex and the journal lock.
-+       * Inode creation will inherit an ACL, which requires a
-+       * lookup. The lookup locks the xattr root i_mutex with a
-+       * transaction open.  Inode deletion takes teh xattr root
-+       * i_mutex to delete the directory and then starts a
-+       * transaction inside it. Boom. This doesn't incur much
-+       * additional overhead since the reiserfs_rmdir transaction
-+       * will just nest inside the outer transaction. */
-+      err = journal_begin(&th, inode->i_sb, blocks);
-+      if (!err) {
-+              int jerror;
-+              root = dget(dir->d_parent);
-               mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_XATTR);
-               err = xattr_rmdir(root->d_inode, dir);
-+              jerror = journal_end(&th, inode->i_sb, blocks);
-               mutex_unlock(&root->d_inode->i_mutex);
--              reiserfs_write_unlock_xattrs(inode->i_sb);
-               dput(root);
--      } else {
--              reiserfs_warning(inode->i_sb, "jdm-20006",
--                               "Couldn't remove all entries in directory");
-+
-+              err = jerror ?: err;
-       }
- out_dir:
-@@ -437,6 +452,9 @@ out:
-       if (!err)
-               REISERFS_I(inode)->i_flags =
-                   REISERFS_I(inode)->i_flags & ~i_has_xattr_dir;
-+      else
-+              reiserfs_warning(inode->i_sb, "jdm-20004",
-+                               "Couldn't remove all xattrs (%d)\n", err);
-       return err;
- }
-@@ -485,9 +503,7 @@ int reiserfs_chown_xattrs(struct inode *
-       if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
-               return 0;
--      reiserfs_read_lock_xattrs(inode->i_sb);
-       dir = open_xa_dir(inode, XATTR_REPLACE);
--      reiserfs_read_unlock_xattrs(inode->i_sb);
-       if (IS_ERR(dir)) {
-               if (PTR_ERR(dir) != -ENODATA)
-                       err = PTR_ERR(dir);
-@@ -731,6 +747,11 @@ reiserfs_xattr_get(const struct inode *i
-               goto out;
-       }
-+      /* protect against concurrent access. xattrs are backed by
-+       * regular files, but they're not regular files. The updates
-+       * must be atomic from the perspective of the user. */
-+      mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
-+
-       isize = i_size_read(dentry->d_inode);
-       REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-@@ -798,6 +819,7 @@ reiserfs_xattr_get(const struct inode *i
-       }
- out_dput:
-+      mutex_unlock(&dentry->d_inode->i_mutex);
-       dput(dentry);
- out:
-@@ -834,7 +856,6 @@ int reiserfs_xattr_del(struct inode *ino
- static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char *);
- /*
-  * Inode operation getxattr()
-- * Preliminary locking: we down dentry->d_inode->i_mutex
-  */
- ssize_t
- reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
-@@ -848,9 +869,7 @@ reiserfs_getxattr(struct dentry * dentry
-               return -EOPNOTSUPP;
-       reiserfs_read_lock_xattr_i(dentry->d_inode);
--      reiserfs_read_lock_xattrs(dentry->d_sb);
-       err = xah->get(dentry->d_inode, name, buffer, size);
--      reiserfs_read_unlock_xattrs(dentry->d_sb);
-       reiserfs_read_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -866,23 +885,13 @@ reiserfs_setxattr(struct dentry *dentry,
- {
-       struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
-       int err;
--      int lock;
-       if (!xah || !reiserfs_xattrs(dentry->d_sb) ||
-           get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
-       reiserfs_write_lock_xattr_i(dentry->d_inode);
--      lock = !has_xattr_dir(dentry->d_inode);
--      if (lock)
--              reiserfs_write_lock_xattrs(dentry->d_sb);
--      else
--              reiserfs_read_lock_xattrs(dentry->d_sb);
-       err = xah->set(dentry->d_inode, name, value, size, flags);
--      if (lock)
--              reiserfs_write_unlock_xattrs(dentry->d_sb);
--      else
--              reiserfs_read_unlock_xattrs(dentry->d_sb);
-       reiserfs_write_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -902,8 +911,6 @@ int reiserfs_removexattr(struct dentry *
-               return -EOPNOTSUPP;
-       reiserfs_write_lock_xattr_i(dentry->d_inode);
--      reiserfs_read_lock_xattrs(dentry->d_sb);
--
-       /* Deletion pre-operation */
-       if (xah->del) {
-               err = xah->del(dentry->d_inode, name);
-@@ -917,7 +924,6 @@ int reiserfs_removexattr(struct dentry *
-       mark_inode_dirty(dentry->d_inode);
-       out:
--      reiserfs_read_unlock_xattrs(dentry->d_sb);
-       reiserfs_write_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -966,8 +972,6 @@ reiserfs_listxattr_filler(void *buf, con
- /*
-  * Inode operation listxattr()
-- *
-- * Preliminary locking: we down dentry->d_inode->i_mutex
-  */
- ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
- {
-@@ -983,9 +987,7 @@ ssize_t reiserfs_listxattr(struct dentry
-               return -EOPNOTSUPP;
-       reiserfs_read_lock_xattr_i(dentry->d_inode);
--      reiserfs_read_lock_xattrs(dentry->d_sb);
-       dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE);
--      reiserfs_read_unlock_xattrs(dentry->d_sb);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-               if (err == -ENODATA)
-@@ -1114,11 +1116,9 @@ static int reiserfs_check_acl(struct ino
-       int error = -EAGAIN; /* do regular unix permission checks by default */
-       reiserfs_read_lock_xattr_i(inode);
--      reiserfs_read_lock_xattrs(inode->i_sb);
-       acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
--      reiserfs_read_unlock_xattrs(inode->i_sb);
-       reiserfs_read_unlock_xattr_i(inode);
-       if (acl) {
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -172,6 +172,29 @@ static void *posix_acl_to_disk(const str
-       return ERR_PTR(-EINVAL);
- }
-+static inline void iset_acl(struct inode *inode, struct posix_acl **i_acl,
-+                          struct posix_acl *acl)
-+{
-+      spin_lock(&inode->i_lock);
-+      if (*i_acl != ERR_PTR(-ENODATA))
-+              posix_acl_release(*i_acl);
-+      *i_acl = posix_acl_dup(acl);
-+      spin_unlock(&inode->i_lock);
-+}
-+
-+static inline struct posix_acl *iget_acl(struct inode *inode,
-+                                       struct posix_acl **i_acl)
-+{
-+      struct posix_acl *acl = ERR_PTR(-ENODATA);
-+
-+      spin_lock(&inode->i_lock);
-+      if (*i_acl != ERR_PTR(-ENODATA))
-+              acl = posix_acl_dup(*i_acl);
-+      spin_unlock(&inode->i_lock);
-+
-+      return acl;
-+}
-+
- /*
-  * Inode operation get_posix_acl().
-  *
-@@ -199,11 +222,11 @@ struct posix_acl *reiserfs_get_acl(struc
-               return ERR_PTR(-EINVAL);
-       }
--      if (IS_ERR(*p_acl)) {
--              if (PTR_ERR(*p_acl) == -ENODATA)
--                      return NULL;
--      } else if (*p_acl != NULL)
--              return posix_acl_dup(*p_acl);
-+      acl = iget_acl(inode, p_acl);
-+      if (acl && !IS_ERR(acl))
-+              return acl;
-+      else if (PTR_ERR(acl) == -ENODATA)
-+              return NULL;
-       size = reiserfs_xattr_get(inode, name, NULL, 0);
-       if (size < 0) {
-@@ -229,7 +252,7 @@ struct posix_acl *reiserfs_get_acl(struc
-       } else {
-               acl = posix_acl_from_disk(value, retval);
-               if (!IS_ERR(acl))
--                      *p_acl = posix_acl_dup(acl);
-+                      iset_acl(inode, p_acl, acl);
-       }
-       kfree(value);
-@@ -300,16 +323,8 @@ reiserfs_set_acl(struct inode *inode, in
-       kfree(value);
--      if (!error) {
--              /* Release the old one */
--              if (!IS_ERR(*p_acl) && *p_acl)
--                      posix_acl_release(*p_acl);
--
--              if (acl == NULL)
--                      *p_acl = ERR_PTR(-ENODATA);
--              else
--                      *p_acl = posix_acl_dup(acl);
--      }
-+      if (!error)
-+              iset_acl(inode, p_acl, acl);
-       return error;
- }
-@@ -404,9 +419,7 @@ int reiserfs_cache_default_acl(struct in
-       if (reiserfs_posixacl(inode->i_sb) && !IS_PRIVATE(inode)) {
-               struct posix_acl *acl;
-               reiserfs_read_lock_xattr_i(inode);
--              reiserfs_read_lock_xattrs(inode->i_sb);
-               acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT);
--              reiserfs_read_unlock_xattrs(inode->i_sb);
-               reiserfs_read_unlock_xattr_i(inode);
-               ret = (acl && !IS_ERR(acl));
-               if (ret)
-@@ -429,9 +442,7 @@ int reiserfs_acl_chmod(struct inode *ino
-               return 0;
-       }
--      reiserfs_read_lock_xattrs(inode->i_sb);
-       acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
--      reiserfs_read_unlock_xattrs(inode->i_sb);
-       if (!acl)
-               return 0;
-       if (IS_ERR(acl))
-@@ -442,17 +453,8 @@ int reiserfs_acl_chmod(struct inode *ino
-               return -ENOMEM;
-       error = posix_acl_chmod_masq(clone, inode->i_mode);
-       if (!error) {
--              int lock = !has_xattr_dir(inode);
-               reiserfs_write_lock_xattr_i(inode);
--              if (lock)
--                      reiserfs_write_lock_xattrs(inode->i_sb);
--              else
--                      reiserfs_read_lock_xattrs(inode->i_sb);
-               error = reiserfs_set_acl(inode, ACL_TYPE_ACCESS, clone);
--              if (lock)
--                      reiserfs_write_unlock_xattrs(inode->i_sb);
--              else
--                      reiserfs_read_unlock_xattrs(inode->i_sb);
-               reiserfs_write_unlock_xattr_i(inode);
-       }
-       posix_acl_release(clone);
-@@ -480,14 +482,9 @@ posix_acl_access_set(struct inode *inode
- static int posix_acl_access_del(struct inode *inode, const char *name)
- {
-       struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
--      struct posix_acl **acl = &reiserfs_i->i_acl_access;
-       if (strlen(name) != sizeof(POSIX_ACL_XATTR_ACCESS) - 1)
-               return -EINVAL;
--      if (!IS_ERR(*acl) && *acl) {
--              posix_acl_release(*acl);
--              *acl = ERR_PTR(-ENODATA);
--      }
--
-+      iset_acl(inode, &reiserfs_i->i_acl_access, ERR_PTR(-ENODATA));
-       return 0;
- }
-@@ -533,14 +530,9 @@ posix_acl_default_set(struct inode *inod
- static int posix_acl_default_del(struct inode *inode, const char *name)
- {
-       struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
--      struct posix_acl **acl = &reiserfs_i->i_acl_default;
-       if (strlen(name) != sizeof(POSIX_ACL_XATTR_DEFAULT) - 1)
-               return -EINVAL;
--      if (!IS_ERR(*acl) && *acl) {
--              posix_acl_release(*acl);
--              *acl = ERR_PTR(-ENODATA);
--      }
--
-+      iset_acl(inode, &reiserfs_i->i_acl_default, ERR_PTR(-ENODATA));
-       return 0;
- }
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -2224,7 +2224,4 @@ int reiserfs_unpack(struct inode *inode,
- #define reiserfs_write_lock( sb ) lock_kernel()
- #define reiserfs_write_unlock( sb ) unlock_kernel()
--/* xattr stuff */
--#define REISERFS_XATTR_DIR_SEM(s) (REISERFS_SB(s)->xattr_dir_sem)
--
- #endif                                /* _LINUX_REISER_FS_H */
---- a/include/linux/reiserfs_fs_sb.h
-+++ b/include/linux/reiserfs_fs_sb.h
-@@ -402,9 +402,6 @@ struct reiserfs_sb_info {
-       spinlock_t bitmap_lock; /* this lock on now only used to protect reserved_blocks variable */
-       struct dentry *priv_root;       /* root of /.reiserfs_priv */
-       struct dentry *xattr_root;      /* root of /.reiserfs_priv/.xa */
--#ifdef CONFIG_REISERFS_FS_XATTR
--      struct rw_semaphore xattr_dir_sem;
--#endif
-       int j_errno;
- #ifdef CONFIG_QUOTA
-       char *s_qf_names[MAXQUOTAS];
---- a/include/linux/reiserfs_xattr.h
-+++ b/include/linux/reiserfs_xattr.h
-@@ -67,45 +67,27 @@ extern struct reiserfs_xattr_handler use
- extern struct reiserfs_xattr_handler trusted_handler;
- extern struct reiserfs_xattr_handler security_handler;
--static inline void reiserfs_write_lock_xattrs(struct super_block *sb)
--{
--      down_write(&REISERFS_XATTR_DIR_SEM(sb));
--}
--static inline void reiserfs_write_unlock_xattrs(struct super_block *sb)
--{
--      up_write(&REISERFS_XATTR_DIR_SEM(sb));
--}
--static inline void reiserfs_read_lock_xattrs(struct super_block *sb)
--{
--      down_read(&REISERFS_XATTR_DIR_SEM(sb));
--}
--
--static inline void reiserfs_read_unlock_xattrs(struct super_block *sb)
--{
--      up_read(&REISERFS_XATTR_DIR_SEM(sb));
--}
--
- static inline void reiserfs_write_lock_xattr_i(struct inode *inode)
- {
--      down_write(&REISERFS_I(inode)->xattr_sem);
-+      down_write(&REISERFS_I(inode)->i_xattr_sem);
- }
- static inline void reiserfs_write_unlock_xattr_i(struct inode *inode)
- {
--      up_write(&REISERFS_I(inode)->xattr_sem);
-+      up_write(&REISERFS_I(inode)->i_xattr_sem);
- }
- static inline void reiserfs_read_lock_xattr_i(struct inode *inode)
- {
--      down_read(&REISERFS_I(inode)->xattr_sem);
-+      down_read(&REISERFS_I(inode)->i_xattr_sem);
- }
- static inline void reiserfs_read_unlock_xattr_i(struct inode *inode)
- {
--      up_read(&REISERFS_I(inode)->xattr_sem);
-+      up_read(&REISERFS_I(inode)->i_xattr_sem);
- }
- static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
- {
--      init_rwsem(&REISERFS_I(inode)->xattr_sem);
-+      init_rwsem(&REISERFS_I(inode)->i_xattr_sem);
- }
- #else
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-journaled-xattrs.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-journaled-xattrs.diff
deleted file mode 100644 (file)
index de58d89..0000000
+++ /dev/null
@@ -1,422 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: journaled xattrs
-
- Deadlocks are possible in the xattr code between the journal lock and the
- xattr sems.
-
- This patch implements journalling for xattr operations. The benefit is
- twofold:
- * It gets rid of the deadlock possibility by always ensuring that xattr
-   write operations are initiated inside a transaction.
- * It corrects the problem where xattr backing files aren't considered any
-   differently than normal files, despite the fact they are metadata.
-
- I discussed the added journal load with Chris Mason, and we decided that
- since xattrs (versus other journal activity) is fairly rare, the introduction
- of larger transactions to support journaled xattrs wouldn't be too big a deal.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/inode.c            |    3 -
- fs/reiserfs/namei.c            |   14 +----
- fs/reiserfs/xattr.c            |   39 +++++++++++----
- fs/reiserfs/xattr_acl.c        |  105 +++++++++++++++++++++++++++++++----------
- include/linux/reiserfs_acl.h   |    3 -
- include/linux/reiserfs_fs.h    |    4 +
- include/linux/reiserfs_xattr.h |   40 ++++++++++++++-
- 7 files changed, 159 insertions(+), 49 deletions(-)
-
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -1919,9 +1919,8 @@ int reiserfs_new_inode(struct reiserfs_t
-               goto out_inserted_sd;
-       }
--      /* XXX CHECK THIS */
-       if (reiserfs_posixacl(inode->i_sb)) {
--              retval = reiserfs_inherit_default_acl(dir, dentry, inode);
-+              retval = reiserfs_inherit_default_acl(th, dir, dentry, inode);
-               if (retval) {
-                       err = retval;
-                       reiserfs_check_path(&path_to_key);
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -607,15 +607,13 @@ static int reiserfs_create(struct inode 
-           2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
-                REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
-       struct reiserfs_transaction_handle th;
--      int locked;
-       if (!(inode = new_inode(dir->i_sb))) {
-               return -ENOMEM;
-       }
-       new_inode_init(inode, dir, mode);
--      locked = reiserfs_cache_default_acl(dir);
--
-+      jbegin_count += reiserfs_cache_default_acl(dir);
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -669,7 +667,6 @@ static int reiserfs_mknod(struct inode *
-           JOURNAL_PER_BALANCE_CNT * 3 +
-           2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
-                REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
--      int locked;
-       if (!new_valid_dev(rdev))
-               return -EINVAL;
-@@ -679,8 +676,7 @@ static int reiserfs_mknod(struct inode *
-       }
-       new_inode_init(inode, dir, mode);
--      locked = reiserfs_cache_default_acl(dir);
--
-+      jbegin_count += reiserfs_cache_default_acl(dir);
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -737,7 +733,6 @@ static int reiserfs_mkdir(struct inode *
-           JOURNAL_PER_BALANCE_CNT * 3 +
-           2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
-                REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
--      int locked;
- #ifdef DISPLACE_NEW_PACKING_LOCALITIES
-       /* set flag that new packing locality created and new blocks for the content     * of that directory are not displaced yet */
-@@ -749,8 +744,7 @@ static int reiserfs_mkdir(struct inode *
-       }
-       new_inode_init(inode, dir, mode);
--      locked = reiserfs_cache_default_acl(dir);
--
-+      jbegin_count += reiserfs_cache_default_acl(dir);
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -1037,8 +1031,6 @@ static int reiserfs_symlink(struct inode
-       memcpy(name, symname, strlen(symname));
-       padd_item(name, item_len, strlen(symname));
--      /* We would inherit the default ACL here, but symlinks don't get ACLs */
--
-       retval = journal_begin(&th, parent_dir->i_sb, jbegin_count);
-       if (retval) {
-               drop_new_inode(inode);
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -10,15 +10,17 @@
- #include <linux/reiserfs_acl.h>
- #include <asm/uaccess.h>
--static int reiserfs_set_acl(struct inode *inode, int type,
-+static int reiserfs_set_acl(struct reiserfs_transaction_handle *th,
-+                          struct inode *inode, int type,
-                           struct posix_acl *acl);
- static int
- xattr_set_acl(struct inode *inode, int type, const void *value, size_t size)
- {
-       struct posix_acl *acl;
--      int error;
--
-+      int error, error2;
-+      struct reiserfs_transaction_handle th;
-+      size_t jcreate_blocks;
-       if (!reiserfs_posixacl(inode->i_sb))
-               return -EOPNOTSUPP;
-       if (!is_owner_or_cap(inode))
-@@ -36,7 +38,21 @@ xattr_set_acl(struct inode *inode, int t
-       } else
-               acl = NULL;
--      error = reiserfs_set_acl(inode, type, acl);
-+      /* Pessimism: We can't assume that anything from the xattr root up
-+       * has been created. */
-+
-+      jcreate_blocks = reiserfs_xattr_jcreate_nblocks(inode) +
-+                       reiserfs_xattr_nblocks(inode, size) * 2;
-+
-+      reiserfs_write_lock(inode->i_sb);
-+      error = journal_begin(&th, inode->i_sb, jcreate_blocks);
-+      if (error == 0) {
-+              error = reiserfs_set_acl(&th, inode, type, acl);
-+              error2 = journal_end(&th, inode->i_sb, jcreate_blocks);
-+              if (error2)
-+                      error = error2;
-+      }
-+      reiserfs_write_unlock(inode->i_sb);
-       release_and_out:
-       posix_acl_release(acl);
-@@ -266,7 +282,8 @@ struct posix_acl *reiserfs_get_acl(struc
-  * BKL held [before 2.5.x]
-  */
- static int
--reiserfs_set_acl(struct inode *inode, int type, struct posix_acl *acl)
-+reiserfs_set_acl(struct reiserfs_transaction_handle *th, struct inode *inode,
-+               int type, struct posix_acl *acl)
- {
-       char *name;
-       void *value = NULL;
-@@ -310,7 +327,7 @@ reiserfs_set_acl(struct inode *inode, in
-                       return (int)PTR_ERR(value);
-       }
--      error = __reiserfs_xattr_set(inode, name, value, size, 0);
-+      error = reiserfs_xattr_set_handle(th, inode, name, value, size, 0);
-       /*
-        * Ensure that the inode gets dirtied if we're only using
-@@ -337,7 +354,8 @@ reiserfs_set_acl(struct inode *inode, in
- /* dir->i_mutex: locked,
-  * inode is new and not released into the wild yet */
- int
--reiserfs_inherit_default_acl(struct inode *dir, struct dentry *dentry,
-+reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,
-+                           struct inode *dir, struct dentry *dentry,
-                            struct inode *inode)
- {
-       struct posix_acl *acl;
-@@ -374,7 +392,8 @@ reiserfs_inherit_default_acl(struct inod
-               /* Copy the default ACL to the default ACL of a new directory */
-               if (S_ISDIR(inode->i_mode)) {
--                      err = reiserfs_set_acl(inode, ACL_TYPE_DEFAULT, acl);
-+                      err = reiserfs_set_acl(th, inode, ACL_TYPE_DEFAULT,
-+                                             acl);
-                       if (err)
-                               goto cleanup;
-               }
-@@ -395,9 +414,9 @@ reiserfs_inherit_default_acl(struct inod
-                       /* If we need an ACL.. */
-                       if (need_acl > 0) {
--                              err =
--                                  reiserfs_set_acl(inode, ACL_TYPE_ACCESS,
--                                                   acl_copy);
-+                              err = reiserfs_set_acl(th, inode,
-+                                                     ACL_TYPE_ACCESS,
-+                                                     acl_copy);
-                               if (err)
-                                       goto cleanup_copy;
-                       }
-@@ -415,21 +434,45 @@ reiserfs_inherit_default_acl(struct inod
-       return err;
- }
--/* Looks up and caches the result of the default ACL.
-- * We do this so that we don't need to carry the xattr_sem into
-- * reiserfs_new_inode if we don't need to */
-+/* This is used to cache the default acl before a new object is created.
-+ * The biggest reason for this is to get an idea of how many blocks will
-+ * actually be required for the create operation if we must inherit an ACL.
-+ * An ACL write can add up to 3 object creations and an additional file write
-+ * so we'd prefer not to reserve that many blocks in the journal if we can.
-+ * It also has the advantage of not loading the ACL with a transaction open,
-+ * this may seem silly, but if the owner of the directory is doing the
-+ * creation, the ACL may not be loaded since the permissions wouldn't require
-+ * it.
-+ * We return the number of blocks required for the transaction.
-+ */
- int reiserfs_cache_default_acl(struct inode *inode)
- {
--      int ret = 0;
--      if (reiserfs_posixacl(inode->i_sb) && !IS_PRIVATE(inode)) {
--              struct posix_acl *acl;
--              acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT);
--              ret = (acl && !IS_ERR(acl));
--              if (ret)
--                      posix_acl_release(acl);
-+      struct posix_acl *acl;
-+      int nblocks = 0;
-+
-+      if (IS_PRIVATE(inode))
-+              return 0;
-+
-+      acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT);
-+
-+      if (acl && !IS_ERR(acl)) {
-+              int size = reiserfs_acl_size(acl->a_count);
-+
-+              /* Other xattrs can be created during inode creation. We don't
-+               * want to claim too many blocks, so we check to see if we
-+               * we need to create the tree to the xattrs, and then we
-+               * just want two files. */
-+              nblocks = reiserfs_xattr_jcreate_nblocks(inode);
-+              nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
-+
-+              REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-+
-+              /* We need to account for writes + bitmaps for two files */
-+              nblocks += reiserfs_xattr_nblocks(inode, size) * 4;
-+              posix_acl_release(acl);
-       }
--      return ret;
-+      return nblocks;
- }
- int reiserfs_acl_chmod(struct inode *inode)
-@@ -455,8 +498,22 @@ int reiserfs_acl_chmod(struct inode *ino
-       if (!clone)
-               return -ENOMEM;
-       error = posix_acl_chmod_masq(clone, inode->i_mode);
--      if (!error)
--              error = reiserfs_set_acl(inode, ACL_TYPE_ACCESS, clone);
-+      if (!error) {
-+              struct reiserfs_transaction_handle th;
-+              size_t size = reiserfs_xattr_nblocks(inode,
-+                                           reiserfs_acl_size(clone->a_count));
-+              reiserfs_write_lock(inode->i_sb);
-+              error = journal_begin(&th, inode->i_sb, size * 2);
-+              if (!error) {
-+                      int error2;
-+                      error = reiserfs_set_acl(&th, inode, ACL_TYPE_ACCESS,
-+                                               clone);
-+                      error2 = journal_end(&th, inode->i_sb, size * 2);
-+                      if (error2)
-+                              error = error2;
-+              }
-+              reiserfs_write_unlock(inode->i_sb);
-+      }
-       posix_acl_release(clone);
-       return error;
- }
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -632,8 +632,9 @@ out_dput:
-  * inode->i_mutex: down
-  */
- int
--__reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
--                   size_t buffer_size, int flags)
-+reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *th,
-+                        struct inode *inode, const char *name,
-+                        const void *buffer, size_t buffer_size, int flags)
- {
-       int err = 0;
-       struct dentry *dentry;
-@@ -723,14 +724,34 @@ out_unlock:
-       return err;
- }
--int
--reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
--                   size_t buffer_size, int flags)
-+/* We need to start a transaction to maintain lock ordering */
-+int reiserfs_xattr_set(struct inode *inode, const char *name,
-+                     const void *buffer, size_t buffer_size, int flags)
- {
--      int err = __reiserfs_xattr_set(inode, name, buffer, buffer_size, flags);
--      if (err == -ENODATA)
--              err = 0;
--      return err;
-+
-+      struct reiserfs_transaction_handle th;
-+      int error, error2;
-+      size_t jbegin_count = reiserfs_xattr_nblocks(inode, buffer_size);
-+
-+      if (!(flags & XATTR_REPLACE))
-+              jbegin_count += reiserfs_xattr_jcreate_nblocks(inode);
-+
-+      reiserfs_write_lock(inode->i_sb);
-+      error = journal_begin(&th, inode->i_sb, jbegin_count);
-+      if (error) {
-+              reiserfs_write_unlock(inode->i_sb);
-+              return error;
-+      }
-+
-+      error = reiserfs_xattr_set_handle(&th, inode, name,
-+                                        buffer, buffer_size, flags);
-+
-+      error2 = journal_end(&th, inode->i_sb, jbegin_count);
-+      if (error == 0)
-+              error = error2;
-+      reiserfs_write_unlock(inode->i_sb);
-+
-+      return error;
- }
- /*
---- a/include/linux/reiserfs_acl.h
-+++ b/include/linux/reiserfs_acl.h
-@@ -49,7 +49,8 @@ static inline int reiserfs_acl_count(siz
- #ifdef CONFIG_REISERFS_FS_POSIX_ACL
- struct posix_acl *reiserfs_get_acl(struct inode *inode, int type);
- int reiserfs_acl_chmod(struct inode *inode);
--int reiserfs_inherit_default_acl(struct inode *dir, struct dentry *dentry,
-+int reiserfs_inherit_default_acl(struct reiserfs_transaction_handle *th,
-+                               struct inode *dir, struct dentry *dentry,
-                                struct inode *inode);
- int reiserfs_cache_default_acl(struct inode *dir);
- extern struct xattr_handler reiserfs_posix_acl_default_handler;
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1615,6 +1615,10 @@ struct reiserfs_journal_header {
- #define JOURNAL_MAX_COMMIT_AGE 30
- #define JOURNAL_MAX_TRANS_AGE 30
- #define JOURNAL_PER_BALANCE_CNT (3 * (MAX_HEIGHT-2) + 9)
-+#define JOURNAL_BLOCKS_PER_OBJECT(sb)  (JOURNAL_PER_BALANCE_CNT * 3 + \
-+                                       2 * (REISERFS_QUOTA_INIT_BLOCKS(sb) + \
-+                                            REISERFS_QUOTA_TRANS_BLOCKS(sb)))
-+
- #ifdef CONFIG_QUOTA
- /* We need to update data and inode (atime) */
- #define REISERFS_QUOTA_TRANS_BLOCKS(s) (REISERFS_SB(s)->s_mount_opt & (1<<REISERFS_QUOTA) ? 2 : 0)
---- a/include/linux/reiserfs_xattr.h
-+++ b/include/linux/reiserfs_xattr.h
-@@ -46,14 +46,50 @@ int reiserfs_removexattr(struct dentry *
- int reiserfs_permission(struct inode *inode, int mask);
- int reiserfs_xattr_get(struct inode *, const char *, void *, size_t);
--int __reiserfs_xattr_set(struct inode *, const char *, const void *,
--                       size_t, int);
- int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
-+int reiserfs_xattr_set_handle(struct reiserfs_transaction_handle *,
-+                            struct inode *, const char *, const void *,
-+                            size_t, int);
- extern struct xattr_handler reiserfs_xattr_user_handler;
- extern struct xattr_handler reiserfs_xattr_trusted_handler;
- extern struct xattr_handler reiserfs_xattr_security_handler;
-+#define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
-+static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)
-+{
-+      loff_t ret = 0;
-+      if (reiserfs_file_data_log(inode)) {
-+              ret = _ROUND_UP(xattr_size(size), inode->i_sb->s_blocksize);
-+              ret >>= inode->i_sb->s_blocksize_bits;
-+      }
-+      return ret;
-+}
-+
-+/* We may have to create up to 3 objects: xattr root, xattr dir, xattr file.
-+ * Let's try to be smart about it.
-+ * xattr root: We cache it. If it's not cached, we may need to create it.
-+ * xattr dir: If anything has been loaded for this inode, we can set a flag
-+ *            saying so.
-+ * xattr file: Since we don't cache xattrs, we can't tell. We always include
-+ *             blocks for it.
-+ *
-+ * However, since root and dir can be created between calls - YOU MUST SAVE
-+ * THIS VALUE.
-+ */
-+static inline size_t reiserfs_xattr_jcreate_nblocks(struct inode *inode)
-+{
-+      size_t nblocks = JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
-+
-+      if ((REISERFS_I(inode)->i_flags & i_has_xattr_dir) == 0) {
-+              nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
-+              if (REISERFS_SB(inode->i_sb)->xattr_root == NULL)
-+                      nblocks += JOURNAL_BLOCKS_PER_OBJECT(inode->i_sb);
-+      }
-+
-+      return nblocks;
-+}
-+
- static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
- {
-       init_rwsem(&REISERFS_I(inode)->i_xattr_sem);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-kill-xattr-readdir.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-kill-xattr-readdir.diff
deleted file mode 100644 (file)
index 421a3dc..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: use generic readdir for operations across all xattrs
-
- The current reiserfs xattr implementation open codes reiserfs_readdir and
- frees the path before calling the filldir function. Typically, the filldir
- function is something that modifies the file system, such as a chown or
- an inode deletion that also require reading of an inode associated with each
- direntry. Since the file system is modified, the path retained becomes
- invalid for the next run. In addition, it runs backwards in attempt to
- minimize activity.
-
- This is clearly suboptimal from a code cleanliness perspective as well as
- performance-wise.
-
- This patch implements a generic reiserfs_for_each_xattr that uses the generic
- readdir and a specific filldir routine that simply populates an array of
- dentries and then performs a specific operation on them. When all files have
- been operated on, it then calls the operation on the directory itself.
-
- The result is a noticable code reduction and better performance.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/dir.c           |   28 +--
- fs/reiserfs/xattr.c         |  402 ++++++++++++--------------------------------
- include/linux/reiserfs_fs.h |    1 
- 3 files changed, 131 insertions(+), 300 deletions(-)
-
---- a/fs/reiserfs/dir.c
-+++ b/fs/reiserfs/dir.c
-@@ -41,10 +41,10 @@ static int reiserfs_dir_fsync(struct fil
- #define store_ih(where,what) copy_item_head (where, what)
--//
--static int reiserfs_readdir(struct file *filp, void *dirent, filldir_t filldir)
-+int reiserfs_readdir_dentry(struct dentry *dentry, void *dirent,
-+                         filldir_t filldir, loff_t *pos)
- {
--      struct inode *inode = filp->f_path.dentry->d_inode;
-+      struct inode *inode = dentry->d_inode;
-       struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */
-       INITIALIZE_PATH(path_to_entry);
-       struct buffer_head *bh;
-@@ -64,13 +64,9 @@ static int reiserfs_readdir(struct file 
-       /* form key for search the next directory entry using f_pos field of
-          file structure */
--      make_cpu_key(&pos_key, inode,
--                   (filp->f_pos) ? (filp->f_pos) : DOT_OFFSET, TYPE_DIRENTRY,
--                   3);
-+      make_cpu_key(&pos_key, inode, *pos ?: DOT_OFFSET, TYPE_DIRENTRY, 3);
-       next_pos = cpu_key_k_offset(&pos_key);
--      /*  reiserfs_warning (inode->i_sb, "reiserfs_readdir 1: f_pos = %Ld", filp->f_pos); */
--
-       path_to_entry.reada = PATH_READA;
-       while (1) {
-             research:
-@@ -144,7 +140,7 @@ static int reiserfs_readdir(struct file 
-                               /* Ignore the .reiserfs_priv entry */
-                               if (reiserfs_xattrs(inode->i_sb) &&
-                                   !old_format_only(inode->i_sb) &&
--                                  filp->f_path.dentry == inode->i_sb->s_root &&
-+                                  dentry == inode->i_sb->s_root &&
-                                   REISERFS_SB(inode->i_sb)->priv_root &&
-                                   REISERFS_SB(inode->i_sb)->priv_root->d_inode
-                                   && deh_objectid(deh) ==
-@@ -156,7 +152,7 @@ static int reiserfs_readdir(struct file 
-                               }
-                               d_off = deh_offset(deh);
--                              filp->f_pos = d_off;
-+                              *pos = d_off;
-                               d_ino = deh_objectid(deh);
-                               if (d_reclen <= 32) {
-                                       local_buf = small_buf;
-@@ -223,15 +219,21 @@ static int reiserfs_readdir(struct file 
-       }                       /* while */
--      end:
--      filp->f_pos = next_pos;
-+end:
-+      *pos = next_pos;
-       pathrelse(&path_to_entry);
-       reiserfs_check_path(&path_to_entry);
--      out:
-+out:
-       reiserfs_write_unlock(inode->i_sb);
-       return ret;
- }
-+static int reiserfs_readdir(struct file *file, void *dirent, filldir_t filldir)
-+{
-+      struct dentry *dentry = file->f_path.dentry;
-+      return reiserfs_readdir_dentry(dentry, dirent, filldir, &file->f_pos);
-+}
-+
- /* compose directory item containing "." and ".." entries (entries are
-    not aligned to 4 byte boundary) */
- /* the last four params are LE */
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -167,218 +167,65 @@ static struct dentry *open_xa_dir(const 
- }
--/*
-- * this is very similar to fs/reiserfs/dir.c:reiserfs_readdir, but
-- * we need to drop the path before calling the filldir struct.  That
-- * would be a big performance hit to the non-xattr case, so I've copied
-- * the whole thing for now. --clm
-- *
-- * the big difference is that I go backwards through the directory,
-- * and don't mess with f->f_pos, but the idea is the same.  Do some
-- * action on each and every entry in the directory.
-- *
-- * we're called with i_mutex held, so there are no worries about the directory
-- * changing underneath us.
-- */
--static int __xattr_readdir(struct inode *inode, void *dirent, filldir_t filldir)
--{
--      struct cpu_key pos_key; /* key of current position in the directory (key of directory entry) */
--      INITIALIZE_PATH(path_to_entry);
--      struct buffer_head *bh;
--      int entry_num;
--      struct item_head *ih, tmp_ih;
--      int search_res;
--      char *local_buf;
--      loff_t next_pos;
--      char small_buf[32];     /* avoid kmalloc if we can */
--      struct reiserfs_de_head *deh;
--      int d_reclen;
--      char *d_name;
--      off_t d_off;
--      ino_t d_ino;
--      struct reiserfs_dir_entry de;
--
--      /* form key for search the next directory entry using f_pos field of
--         file structure */
--      next_pos = max_reiserfs_offset(inode);
--
--      while (1) {
--            research:
--              if (next_pos <= DOT_DOT_OFFSET)
--                      break;
--              make_cpu_key(&pos_key, inode, next_pos, TYPE_DIRENTRY, 3);
--
--              search_res =
--                  search_by_entry_key(inode->i_sb, &pos_key, &path_to_entry,
--                                      &de);
--              if (search_res == IO_ERROR) {
--                      // FIXME: we could just skip part of directory which could
--                      // not be read
--                      pathrelse(&path_to_entry);
--                      return -EIO;
--              }
--
--              if (search_res == NAME_NOT_FOUND)
--                      de.de_entry_num--;
--
--              set_de_name_and_namelen(&de);
--              entry_num = de.de_entry_num;
--              deh = &(de.de_deh[entry_num]);
--
--              bh = de.de_bh;
--              ih = de.de_ih;
--
--              if (!is_direntry_le_ih(ih)) {
--                      reiserfs_error(inode->i_sb, "jdm-20000",
--                                     "not direntry %h", ih);
--                      break;
--              }
--              copy_item_head(&tmp_ih, ih);
--
--              /* we must have found item, that is item of this directory, */
--              RFALSE(COMP_SHORT_KEYS(&(ih->ih_key), &pos_key),
--                     "vs-9000: found item %h does not match to dir we readdir %K",
--                     ih, &pos_key);
--
--              if (deh_offset(deh) <= DOT_DOT_OFFSET) {
--                      break;
--              }
--
--              /* look for the previous entry in the directory */
--              next_pos = deh_offset(deh) - 1;
--
--              if (!de_visible(deh))
--                      /* it is hidden entry */
--                      continue;
--
--              d_reclen = entry_length(bh, ih, entry_num);
--              d_name = B_I_DEH_ENTRY_FILE_NAME(bh, ih, deh);
--              d_off = deh_offset(deh);
--              d_ino = deh_objectid(deh);
--
--              if (!d_name[d_reclen - 1])
--                      d_reclen = strlen(d_name);
--
--              if (d_reclen > REISERFS_MAX_NAME(inode->i_sb->s_blocksize)) {
--                      /* too big to send back to VFS */
--                      continue;
--              }
--
--              /* Ignore the .reiserfs_priv entry */
--              if (reiserfs_xattrs(inode->i_sb) &&
--                  !old_format_only(inode->i_sb) &&
--                  deh_objectid(deh) ==
--                  le32_to_cpu(INODE_PKEY
--                              (REISERFS_SB(inode->i_sb)->priv_root->d_inode)->
--                              k_objectid))
--                      continue;
--
--              if (d_reclen <= 32) {
--                      local_buf = small_buf;
--              } else {
--                      local_buf = kmalloc(d_reclen, GFP_NOFS);
--                      if (!local_buf) {
--                              pathrelse(&path_to_entry);
--                              return -ENOMEM;
--                      }
--                      if (item_moved(&tmp_ih, &path_to_entry)) {
--                              kfree(local_buf);
--
--                              /* sigh, must retry.  Do this same offset again */
--                              next_pos = d_off;
--                              goto research;
--                      }
--              }
--
--              // Note, that we copy name to user space via temporary
--              // buffer (local_buf) because filldir will block if
--              // user space buffer is swapped out. At that time
--              // entry can move to somewhere else
--              memcpy(local_buf, d_name, d_reclen);
--
--              /* the filldir function might need to start transactions,
--               * or do who knows what.  Release the path now that we've
--               * copied all the important stuff out of the deh
--               */
--              pathrelse(&path_to_entry);
--
--              if (filldir(dirent, local_buf, d_reclen, d_off, d_ino,
--                          DT_UNKNOWN) < 0) {
--                      if (local_buf != small_buf) {
--                              kfree(local_buf);
--                      }
--                      goto end;
--              }
--              if (local_buf != small_buf) {
--                      kfree(local_buf);
--              }
--      }                       /* while */
--
--      end:
--      pathrelse(&path_to_entry);
--      return 0;
--}
--
--/*
-- * this could be done with dedicated readdir ops for the xattr files,
-- * but I want to get something working asap
-- * this is stolen from vfs_readdir
-- *
-- */
--static
--int xattr_readdir(struct inode *inode, filldir_t filler, void *buf)
--{
--      int res = -ENOENT;
--      if (!IS_DEADDIR(inode)) {
--              lock_kernel();
--              res = __xattr_readdir(inode, buf, filler);
--              unlock_kernel();
--      }
--      return res;
--}
--
- /* The following are side effects of other operations that aren't explicitly
-  * modifying extended attributes. This includes operations such as permissions
-  * or ownership changes, object deletions, etc. */
-+struct reiserfs_dentry_buf {
-+      struct dentry *xadir;
-+      int count;
-+      struct dentry *dentries[8];
-+};
- static int
--reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen,
--                            loff_t offset, u64 ino, unsigned int d_type)
-+fill_with_dentries(void *buf, const char *name, int namelen, loff_t offset,
-+                  u64 ino, unsigned int d_type)
- {
--      struct dentry *xadir = (struct dentry *)buf;
-+      struct reiserfs_dentry_buf *dbuf = buf;
-       struct dentry *dentry;
--      int err = 0;
--      dentry = lookup_one_len(name, xadir, namelen);
-+      if (dbuf->count == ARRAY_SIZE(dbuf->dentries))
-+              return -ENOSPC;
-+
-+      if (name[0] == '.' && (name[1] == '\0' ||
-+                             (name[1] == '.' && name[2] == '\0')))
-+              return 0;
-+
-+      dentry = lookup_one_len(name, dbuf->xadir, namelen);
-       if (IS_ERR(dentry)) {
--              err = PTR_ERR(dentry);
--              goto out;
-+              return PTR_ERR(dentry);
-       } else if (!dentry->d_inode) {
--              err = -ENODATA;
--              goto out_file;
-+              /* A directory entry exists, but no file? */
-+              reiserfs_error(dentry->d_sb, "xattr-20003",
-+                             "Corrupted directory: xattr %s listed but "
-+                             "not found for file %s.\n",
-+                             dentry->d_name.name, dbuf->xadir->d_name.name);
-+              dput(dentry);
-+              return -EIO;
-       }
--      /* Skip directories.. */
--      if (S_ISDIR(dentry->d_inode->i_mode))
--              goto out_file;
--
--      err = xattr_unlink(xadir->d_inode, dentry);
--
--out_file:
--      dput(dentry);
-+      dbuf->dentries[dbuf->count++] = dentry;
-+      return 0;
-+}
--out:
--      return err;
-+static void
-+cleanup_dentry_buf(struct reiserfs_dentry_buf *buf)
-+{
-+      int i;
-+      for (i = 0; i < buf->count; i++)
-+              if (buf->dentries[i])
-+                      dput(buf->dentries[i]);
- }
--/* This is called w/ inode->i_mutex downed */
--int reiserfs_delete_xattrs(struct inode *inode)
-+static int reiserfs_for_each_xattr(struct inode *inode,
-+                                 int (*action)(struct dentry *, void *),
-+                                 void *data)
- {
--      int err = -ENODATA;
--      struct dentry *dir, *root;
--      struct reiserfs_transaction_handle th;
--      int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
--                   4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
-+      struct dentry *dir;
-+      int i, err = 0;
-+      loff_t pos = 0;
-+      struct reiserfs_dentry_buf buf = {
-+              .count = 0,
-+      };
-       /* Skip out, an xattr has no xattrs associated with it */
-       if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
-@@ -389,117 +236,97 @@ int reiserfs_delete_xattrs(struct inode 
-               err = PTR_ERR(dir);
-               goto out;
-       } else if (!dir->d_inode) {
--              dput(dir);
--              goto out;
-+              err = 0;
-+              goto out_dir;
-       }
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir);
--      mutex_unlock(&dir->d_inode->i_mutex);
--      if (err) {
--              dput(dir);
--              goto out;
-+      buf.xadir = dir;
-+      err = reiserfs_readdir_dentry(dir, &buf, fill_with_dentries, &pos);
-+      while ((err == 0 || err == -ENOSPC) && buf.count) {
-+              err = 0;
-+
-+              for (i = 0; i < buf.count && buf.dentries[i]; i++) {
-+                      int lerr = 0;
-+                      struct dentry *dentry = buf.dentries[i];
-+
-+                      if (err == 0 && !S_ISDIR(dentry->d_inode->i_mode))
-+                              lerr = action(dentry, data);
-+
-+                      dput(dentry);
-+                      buf.dentries[i] = NULL;
-+                      err = lerr ?: err;
-+              }
-+              buf.count = 0;
-+              if (!err)
-+                      err = reiserfs_readdir_dentry(dir, &buf,
-+                                                    fill_with_dentries, &pos);
-       }
-+      mutex_unlock(&dir->d_inode->i_mutex);
--      root = dget(dir->d_parent);
--      dput(dir);
-+      /* Clean up after a failed readdir */
-+      cleanup_dentry_buf(&buf);
--      /* We start a transaction here to avoid a ABBA situation
--       * between the xattr root's i_mutex and the journal lock.
--       * Inode creation will inherit an ACL, which requires a
--       * lookup. The lookup locks the xattr root i_mutex with a
--       * transaction open.  Inode deletion takes teh xattr root
--       * i_mutex to delete the directory and then starts a
--       * transaction inside it. Boom. This doesn't incur much
--       * additional overhead since the reiserfs_rmdir transaction
--       * will just nest inside the outer transaction. */
--      err = journal_begin(&th, inode->i_sb, blocks);
-       if (!err) {
--              int jerror;
--              mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_XATTR);
--              err = xattr_rmdir(root->d_inode, dir);
--              jerror = journal_end(&th, inode->i_sb, blocks);
--              mutex_unlock(&root->d_inode->i_mutex);
--              err = jerror ?: err;
-+              /* We start a transaction here to avoid a ABBA situation
-+               * between the xattr root's i_mutex and the journal lock.
-+               * This doesn't incur much additional overhead since the
-+               * new transaction will just nest inside the
-+               * outer transaction. */
-+              int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
-+                           4 * REISERFS_QUOTA_TRANS_BLOCKS(inode->i_sb);
-+              struct reiserfs_transaction_handle th;
-+              err = journal_begin(&th, inode->i_sb, blocks);
-+              if (!err) {
-+                      int jerror;
-+                      mutex_lock_nested(&dir->d_parent->d_inode->i_mutex,
-+                                        I_MUTEX_XATTR);
-+                      err = action(dir, data);
-+                      jerror = journal_end(&th, inode->i_sb, blocks);
-+                      mutex_unlock(&dir->d_parent->d_inode->i_mutex);
-+                      err = jerror ?: err;
-+              }
-       }
--
--      dput(root);
-+out_dir:
-+      dput(dir);
- out:
--      if (err)
--              reiserfs_warning(inode->i_sb, "jdm-20004",
--                               "Couldn't remove all xattrs (%d)\n", err);
-+      /* -ENODATA isn't an error */
-+      if (err == -ENODATA)
-+              err = 0;
-       return err;
- }
--struct reiserfs_chown_buf {
--      struct inode *inode;
--      struct dentry *xadir;
--      struct iattr *attrs;
--};
--
--/* XXX: If there is a better way to do this, I'd love to hear about it */
--static int
--reiserfs_chown_xattrs_filler(void *buf, const char *name, int namelen,
--                           loff_t offset, u64 ino, unsigned int d_type)
-+static int delete_one_xattr(struct dentry *dentry, void *data)
- {
--      struct reiserfs_chown_buf *chown_buf = (struct reiserfs_chown_buf *)buf;
--      struct dentry *xafile, *xadir = chown_buf->xadir;
--      struct iattr *attrs = chown_buf->attrs;
--      int err = 0;
-+      struct inode *dir = dentry->d_parent->d_inode;
--      xafile = lookup_one_len(name, xadir, namelen);
--      if (IS_ERR(xafile))
--              return PTR_ERR(xafile);
--      else if (!xafile->d_inode) {
--              dput(xafile);
--              return -ENODATA;
--      }
-+      /* This is the xattr dir, handle specially. */
-+      if (S_ISDIR(dentry->d_inode->i_mode))
-+              return xattr_rmdir(dir, dentry);
--      if (!S_ISDIR(xafile->d_inode->i_mode)) {
--              mutex_lock_nested(&xafile->d_inode->i_mutex, I_MUTEX_CHILD);
--              err = reiserfs_setattr(xafile, attrs);
--              mutex_unlock(&xafile->d_inode->i_mutex);
--      }
--      dput(xafile);
-+      return xattr_unlink(dir, dentry);
-+}
-+
-+static int chown_one_xattr(struct dentry *dentry, void *data)
-+{
-+      struct iattr *attrs = data;
-+      return reiserfs_setattr(dentry, attrs);
-+}
-+/* No i_mutex, but the inode is unconnected. */
-+int reiserfs_delete_xattrs(struct inode *inode)
-+{
-+      int err = reiserfs_for_each_xattr(inode, delete_one_xattr, NULL);
-+      if (err)
-+              reiserfs_warning(inode->i_sb, "jdm-20004",
-+                               "Couldn't delete all xattrs (%d)\n", err);
-       return err;
- }
-+/* inode->i_mutex: down */
- int reiserfs_chown_xattrs(struct inode *inode, struct iattr *attrs)
- {
--      struct dentry *dir;
--      int err = 0;
--      struct reiserfs_chown_buf buf;
--      unsigned int ia_valid = attrs->ia_valid;
--
--      /* Skip out, an xattr has no xattrs associated with it */
--      if (IS_PRIVATE(inode) || get_inode_sd_version(inode) == STAT_DATA_V1)
--              return 0;
--
--      dir = open_xa_dir(inode, XATTR_REPLACE);
--      if (IS_ERR(dir)) {
--              if (PTR_ERR(dir) != -ENODATA)
--                      err = PTR_ERR(dir);
--              goto out;
--      } else if (!dir->d_inode)
--              goto out_dir;
--
--      attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME);
--      buf.xadir = dir;
--      buf.attrs = attrs;
--      buf.inode = inode;
--
--      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf);
--
--      if (!err)
--              err = reiserfs_setattr(dir, attrs);
--      mutex_unlock(&dir->d_inode->i_mutex);
--
--      attrs->ia_valid = ia_valid;
--out_dir:
--      dput(dir);
--out:
-+      int err = reiserfs_for_each_xattr(inode, chown_one_xattr, attrs);
-       if (err)
-               reiserfs_warning(inode->i_sb, "jdm-20007",
-                                "Couldn't chown all xattrs (%d)\n", err);
-@@ -1004,6 +831,7 @@ ssize_t reiserfs_listxattr(struct dentry
- {
-       struct dentry *dir;
-       int err = 0;
-+      loff_t pos = 0;
-       struct listxattr_buf buf = {
-               .inode = dentry->d_inode,
-               .buf = buffer,
-@@ -1026,7 +854,7 @@ ssize_t reiserfs_listxattr(struct dentry
-       }
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = xattr_readdir(dir->d_inode, listxattr_filler, &buf);
-+      err = reiserfs_readdir_dentry(dir, &buf, listxattr_filler, &pos);
-       mutex_unlock(&dir->d_inode->i_mutex);
-       if (!err)
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1984,6 +1984,7 @@ extern const struct inode_operations rei
- extern const struct inode_operations reiserfs_symlink_inode_operations;
- extern const struct inode_operations reiserfs_special_inode_operations;
- extern const struct file_operations reiserfs_dir_operations;
-+int reiserfs_readdir_dentry(struct dentry *, void *, filldir_t, loff_t *);
- /* tail_conversion.c */
- int direct2indirect(struct reiserfs_transaction_handle *, struct inode *,
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-make-per-inode-xattr-locking-more-fine-grained.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-make-per-inode-xattr-locking-more-fine-grained.diff
deleted file mode 100644 (file)
index c1b51a4..0000000
+++ /dev/null
@@ -1,421 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: make per-inode xattr locking more fine grained
-
- The per-inode locking can be made more fine-grained to surround just the
- interaction with the filesystem itself. This really only applies to protecting
- reads during a write, since concurrent writes are barred with inode->i_mutex
- at the vfs level.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/xattr.c            |  114 +++++++++++++++++++----------------------
- fs/reiserfs/xattr_acl.c        |    7 --
- include/linux/reiserfs_fs_i.h  |    2 
- include/linux/reiserfs_xattr.h |   22 -------
- 4 files changed, 55 insertions(+), 90 deletions(-)
-
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -418,9 +418,7 @@ int reiserfs_cache_default_acl(struct in
-       int ret = 0;
-       if (reiserfs_posixacl(inode->i_sb) && !IS_PRIVATE(inode)) {
-               struct posix_acl *acl;
--              reiserfs_read_lock_xattr_i(inode);
-               acl = reiserfs_get_acl(inode, ACL_TYPE_DEFAULT);
--              reiserfs_read_unlock_xattr_i(inode);
-               ret = (acl && !IS_ERR(acl));
-               if (ret)
-                       posix_acl_release(acl);
-@@ -452,11 +450,8 @@ int reiserfs_acl_chmod(struct inode *ino
-       if (!clone)
-               return -ENOMEM;
-       error = posix_acl_chmod_masq(clone, inode->i_mode);
--      if (!error) {
--              reiserfs_write_lock_xattr_i(inode);
-+      if (!error)
-               error = reiserfs_set_acl(inode, ACL_TYPE_ACCESS, clone);
--              reiserfs_write_unlock_xattr_i(inode);
--      }
-       posix_acl_release(clone);
-       return error;
- }
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -29,10 +29,8 @@
-  * to the inode so that unnecessary lookups are avoided.
-  *
-  * Locking works like so:
-- * The xattr root (/.reiserfs_priv/xattrs) is protected by its i_mutex.
-- * The xattr dir (/.reiserfs_priv/xattrs/<oid>.<gen>) is protected by
-- * inode->xattr_sem.
-- * The xattrs themselves are likewise protected by the xattr_sem.
-+ * Directory components (xattr root, xattr dir) are protectd by their i_mutex.
-+ * The xattrs themselves are protected by the xattr_sem.
-  */
- #include <linux/reiserfs_fs.h>
-@@ -55,6 +53,8 @@
- #define PRIVROOT_NAME ".reiserfs_priv"
- #define XAROOT_NAME   "xattrs"
-+static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char *);
-+
- /* Helpers for inode ops. We do this so that we don't have all the VFS
-  * overhead and also for proper i_mutex annotation.
-  * dir->i_mutex must be held for all of them. */
-@@ -339,12 +339,14 @@ int xattr_readdir(struct inode *inode, f
-       return res;
- }
-+/* expects xadir->d_inode->i_mutex to be locked */
- static int
- __reiserfs_xattr_del(struct dentry *xadir, const char *name, int namelen)
- {
-       struct dentry *dentry;
-       struct inode *dir = xadir->d_inode;
-       int err = 0;
-+      struct reiserfs_xattr_handler *xah;
-       dentry = lookup_one_len(name, xadir, namelen);
-       if (IS_ERR(dentry)) {
-@@ -372,6 +374,14 @@ __reiserfs_xattr_del(struct dentry *xadi
-               return -EIO;
-       }
-+      /* Deletion pre-operation */
-+      xah = find_xattr_handler_prefix(name);
-+      if (xah && xah->del) {
-+              err = xah->del(dentry->d_inode, name);
-+              if (err)
-+                      goto out;
-+      }
-+
-       err = xattr_unlink(dir, dentry);
- out_file:
-@@ -398,7 +408,7 @@ reiserfs_delete_xattrs_filler(void *buf,
- /* This is called w/ inode->i_mutex downed */
- int reiserfs_delete_xattrs(struct inode *inode)
- {
--      int err = 0;
-+      int err = -ENODATA;
-       struct dentry *dir, *root;
-       struct reiserfs_transaction_handle th;
-       int blocks = JOURNAL_PER_BALANCE_CNT * 2 + 2 +
-@@ -414,14 +424,19 @@ int reiserfs_delete_xattrs(struct inode 
-               goto out;
-       } else if (!dir->d_inode) {
-               dput(dir);
--              return 0;
-+              goto out;
-       }
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir);
-       mutex_unlock(&dir->d_inode->i_mutex);
--      if (err)
--              goto out_dir;
-+      if (err) {
-+              dput(dir);
-+              goto out;
-+      }
-+
-+      root = dget(dir->d_parent);
-+      dput(dir);
-       /* We start a transaction here to avoid a ABBA situation
-        * between the xattr root's i_mutex and the journal lock.
-@@ -435,19 +450,14 @@ int reiserfs_delete_xattrs(struct inode 
-       err = journal_begin(&th, inode->i_sb, blocks);
-       if (!err) {
-               int jerror;
--              root = dget(dir->d_parent);
-               mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_XATTR);
-               err = xattr_rmdir(root->d_inode, dir);
-               jerror = journal_end(&th, inode->i_sb, blocks);
-               mutex_unlock(&root->d_inode->i_mutex);
--              dput(root);
--
-               err = jerror ?: err;
-       }
--out_dir:
--      dput(dir);
--
-+      dput(root);
- out:
-       if (!err)
-               REISERFS_I(inode)->i_flags =
-@@ -484,7 +494,7 @@ reiserfs_chown_xattrs_filler(void *buf, 
-       if (!S_ISDIR(xafile->d_inode->i_mode)) {
-               mutex_lock_nested(&xafile->d_inode->i_mutex, I_MUTEX_CHILD);
--              err = notify_change(xafile, attrs);
-+              err = reiserfs_setattr(xafile, attrs);
-               mutex_unlock(&xafile->d_inode->i_mutex);
-       }
-       dput(xafile);
-@@ -520,13 +530,16 @@ int reiserfs_chown_xattrs(struct inode *
-       err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf);
-       if (!err)
--              err = notify_change(dir, attrs);
-+              err = reiserfs_setattr(dir, attrs);
-       mutex_unlock(&dir->d_inode->i_mutex);
-       attrs->ia_valid = ia_valid;
- out_dir:
-       dput(dir);
- out:
-+      if (err)
-+              reiserfs_warning(inode->i_sb, "jdm-20007",
-+                               "Couldn't chown all xattrs (%d)\n", err);
-       return err;
- }
-@@ -635,9 +648,8 @@ reiserfs_xattr_set(struct inode *inode, 
-       if (get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      /* Empty xattrs are ok, they're just empty files, no hash */
--      if (buffer && buffer_size)
--              xahash = xattr_hash(buffer, buffer_size);
-+      if (!buffer)
-+              return reiserfs_xattr_del(inode, name);
-       dentry = get_xa_file_dentry(inode, name, flags);
-       if (IS_ERR(dentry)) {
-@@ -645,13 +657,19 @@ reiserfs_xattr_set(struct inode *inode, 
-               goto out;
-       }
-+      down_write(&REISERFS_I(inode)->i_xattr_sem);
-+
-+      xahash = xattr_hash(buffer, buffer_size);
-       REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-       /* Resize it so we're ok to write there */
-       newattrs.ia_size = buffer_size;
-+      newattrs.ia_ctime = current_fs_time(inode->i_sb);
-       newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-       mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = notify_change(dentry, &newattrs);
-+      down_write(&dentry->d_inode->i_alloc_sem);
-+      err = reiserfs_setattr(dentry, &newattrs);
-+      up_write(&dentry->d_inode->i_alloc_sem);
-       mutex_unlock(&dentry->d_inode->i_mutex);
-       if (err)
-               goto out_filp;
-@@ -712,6 +730,7 @@ reiserfs_xattr_set(struct inode *inode, 
-       }
-       out_filp:
-+      up_write(&REISERFS_I(inode)->i_xattr_sem);
-       dput(dentry);
-       out:
-@@ -747,10 +766,7 @@ reiserfs_xattr_get(const struct inode *i
-               goto out;
-       }
--      /* protect against concurrent access. xattrs are backed by
--       * regular files, but they're not regular files. The updates
--       * must be atomic from the perspective of the user. */
--      mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
-+      down_read(&REISERFS_I(inode)->i_xattr_sem);
-       isize = i_size_read(dentry->d_inode);
-       REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-@@ -758,12 +774,12 @@ reiserfs_xattr_get(const struct inode *i
-       /* Just return the size needed */
-       if (buffer == NULL) {
-               err = isize - sizeof(struct reiserfs_xattr_header);
--              goto out_dput;
-+              goto out_unlock;
-       }
-       if (buffer_size < isize - sizeof(struct reiserfs_xattr_header)) {
-               err = -ERANGE;
--              goto out_dput;
-+              goto out_unlock;
-       }
-       while (file_pos < isize) {
-@@ -778,7 +794,7 @@ reiserfs_xattr_get(const struct inode *i
-               page = reiserfs_get_page(dentry->d_inode, file_pos);
-               if (IS_ERR(page)) {
-                       err = PTR_ERR(page);
--                      goto out_dput;
-+                      goto out_unlock;
-               }
-               lock_page(page);
-@@ -797,7 +813,7 @@ reiserfs_xattr_get(const struct inode *i
-                                                "associated with %k", name,
-                                                INODE_PKEY(inode));
-                               err = -EIO;
--                              goto out_dput;
-+                              goto out_unlock;
-                       }
-                       hash = le32_to_cpu(rxh->h_hash);
-               }
-@@ -818,8 +834,8 @@ reiserfs_xattr_get(const struct inode *i
-               err = -EIO;
-       }
--out_dput:
--      mutex_unlock(&dentry->d_inode->i_mutex);
-+out_unlock:
-+      up_read(&REISERFS_I(inode)->i_xattr_sem);
-       dput(dentry);
- out:
-@@ -852,8 +868,6 @@ int reiserfs_xattr_del(struct inode *ino
- }
- /* Actual operations that are exported to VFS-land */
--
--static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char *);
- /*
-  * Inode operation getxattr()
-  */
-@@ -868,9 +882,7 @@ reiserfs_getxattr(struct dentry * dentry
-           get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      reiserfs_read_lock_xattr_i(dentry->d_inode);
-       err = xah->get(dentry->d_inode, name, buffer, size);
--      reiserfs_read_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -890,9 +902,7 @@ reiserfs_setxattr(struct dentry *dentry,
-           get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      reiserfs_write_lock_xattr_i(dentry->d_inode);
-       err = xah->set(dentry->d_inode, name, value, size, flags);
--      reiserfs_write_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -910,21 +920,11 @@ int reiserfs_removexattr(struct dentry *
-           get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      reiserfs_write_lock_xattr_i(dentry->d_inode);
--      /* Deletion pre-operation */
--      if (xah->del) {
--              err = xah->del(dentry->d_inode, name);
--              if (err)
--                      goto out;
--      }
--
-       err = reiserfs_xattr_del(dentry->d_inode, name);
-       dentry->d_inode->i_ctime = CURRENT_TIME_SEC;
-       mark_inode_dirty(dentry->d_inode);
--      out:
--      reiserfs_write_unlock_xattr_i(dentry->d_inode);
-       return err;
- }
-@@ -986,7 +986,6 @@ ssize_t reiserfs_listxattr(struct dentry
-           get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      reiserfs_read_lock_xattr_i(dentry->d_inode);
-       dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-@@ -1005,19 +1004,16 @@ ssize_t reiserfs_listxattr(struct dentry
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf);
-       mutex_unlock(&dir->d_inode->i_mutex);
--      if (err)
--              goto out_dir;
--      if (buf.r_pos > buf.r_size && buffer != NULL)
--              err = -ERANGE;
--      else
--              err = buf.r_pos;
-+      if (!err) {
-+              if (buf.r_pos > buf.r_size && buffer != NULL)
-+                      err = -ERANGE;
-+              else
-+                      err = buf.r_pos;
-+      }
--      out_dir:
-       dput(dir);
--
--      out:
--      reiserfs_read_unlock_xattr_i(dentry->d_inode);
-+out:
-       return err;
- }
-@@ -1115,12 +1111,8 @@ static int reiserfs_check_acl(struct ino
-       struct posix_acl *acl;
-       int error = -EAGAIN; /* do regular unix permission checks by default */
--      reiserfs_read_lock_xattr_i(inode);
--
-       acl = reiserfs_get_acl(inode, ACL_TYPE_ACCESS);
--      reiserfs_read_unlock_xattr_i(inode);
--
-       if (acl) {
-               if (!IS_ERR(acl)) {
-                       error = posix_acl_permission(inode, acl, mask);
---- a/include/linux/reiserfs_fs_i.h
-+++ b/include/linux/reiserfs_fs_i.h
-@@ -59,7 +59,7 @@ struct reiserfs_inode_info {
-       struct posix_acl *i_acl_default;
- #endif
- #ifdef CONFIG_REISERFS_FS_XATTR
--      struct rw_semaphore xattr_sem;
-+      struct rw_semaphore i_xattr_sem;
- #endif
-       struct inode vfs_inode;
- };
---- a/include/linux/reiserfs_xattr.h
-+++ b/include/linux/reiserfs_xattr.h
-@@ -67,24 +67,6 @@ extern struct reiserfs_xattr_handler use
- extern struct reiserfs_xattr_handler trusted_handler;
- extern struct reiserfs_xattr_handler security_handler;
--static inline void reiserfs_write_lock_xattr_i(struct inode *inode)
--{
--      down_write(&REISERFS_I(inode)->i_xattr_sem);
--}
--static inline void reiserfs_write_unlock_xattr_i(struct inode *inode)
--{
--      up_write(&REISERFS_I(inode)->i_xattr_sem);
--}
--static inline void reiserfs_read_lock_xattr_i(struct inode *inode)
--{
--      down_read(&REISERFS_I(inode)->i_xattr_sem);
--}
--
--static inline void reiserfs_read_unlock_xattr_i(struct inode *inode)
--{
--      up_read(&REISERFS_I(inode)->i_xattr_sem);
--}
--
- static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
- {
-       init_rwsem(&REISERFS_I(inode)->i_xattr_sem);
-@@ -96,10 +78,6 @@ static inline void reiserfs_init_xattr_r
- #define reiserfs_setxattr NULL
- #define reiserfs_listxattr NULL
- #define reiserfs_removexattr NULL
--#define reiserfs_write_lock_xattrs(sb) do {;} while(0)
--#define reiserfs_write_unlock_xattrs(sb) do {;} while(0)
--#define reiserfs_read_lock_xattrs(sb)
--#define reiserfs_read_unlock_xattrs(sb)
- #define reiserfs_permission NULL
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rearrange-journal-abort.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rearrange-journal-abort.diff
deleted file mode 100644 (file)
index f7e9b58..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rearrange journal abort
-
- This patch kills off reiserfs_journal_abort as it is never called, and
- combines __reiserfs_journal_abort_{soft,hard} into one function called
- reiserfs_abort_journal, which performs the same work. It is silent
- as opposed to the old version, since the message was always issued
- after a regular 'abort' message.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/journal.c       |   23 ++++-------------------
- fs/reiserfs/prints.c        |    2 +-
- include/linux/reiserfs_fs.h |    2 +-
- 3 files changed, 6 insertions(+), 21 deletions(-)
-
---- a/fs/reiserfs/journal.c
-+++ b/fs/reiserfs/journal.c
-@@ -4292,14 +4292,15 @@ static int do_journal_end(struct reiserf
-       return journal->j_errno;
- }
--static void __reiserfs_journal_abort_hard(struct super_block *sb)
-+/* Send the file system read only and refuse new transactions */
-+void reiserfs_abort_journal(struct super_block *sb, int errno)
- {
-       struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       if (test_bit(J_ABORTED, &journal->j_state))
-               return;
--      printk(KERN_CRIT "REISERFS: Aborting journal for filesystem on %s\n",
--             reiserfs_bdevname(sb));
-+      if (!journal->j_errno)
-+              journal->j_errno = errno;
-       sb->s_flags |= MS_RDONLY;
-       set_bit(J_ABORTED, &journal->j_state);
-@@ -4309,19 +4310,3 @@ static void __reiserfs_journal_abort_har
- #endif
- }
--static void __reiserfs_journal_abort_soft(struct super_block *sb, int errno)
--{
--      struct reiserfs_journal *journal = SB_JOURNAL(sb);
--      if (test_bit(J_ABORTED, &journal->j_state))
--              return;
--
--      if (!journal->j_errno)
--              journal->j_errno = errno;
--
--      __reiserfs_journal_abort_hard(sb);
--}
--
--void reiserfs_journal_abort(struct super_block *sb, int errno)
--{
--      __reiserfs_journal_abort_soft(sb, errno);
--}
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -389,7 +389,7 @@ void reiserfs_abort(struct super_block *
-              error_buf);
-       sb->s_flags |= MS_RDONLY;
--      reiserfs_journal_abort(sb, errno);
-+      reiserfs_abort_journal(sb, errno);
- }
- /* this prints internal nodes (4 keys/items in line) (dc_number,
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1771,7 +1771,7 @@ int journal_begin(struct reiserfs_transa
-                 struct super_block *p_s_sb, unsigned long);
- int journal_join_abort(struct reiserfs_transaction_handle *,
-                      struct super_block *p_s_sb, unsigned long);
--void reiserfs_journal_abort(struct super_block *sb, int errno);
-+void reiserfs_abort_journal(struct super_block *sb, int errno);
- void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...);
- int reiserfs_allocate_list_bitmaps(struct super_block *s,
-                                  struct reiserfs_list_bitmap *, unsigned int);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs-warning.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs-warning.diff
deleted file mode 100644 (file)
index 6c17090..0000000
+++ /dev/null
@@ -1,2341 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rework reiserfs_warning
-
- ReiserFS warnings can be somewhat inconsistent.
- In some cases:
- * a unique identifier may be associated with it
- * the function name may be included
- * the device may be printed separately
-
- This patch aims to make warnings more consistent. reiserfs_warning() prints
- the device name, so printing it a second time is not required. The function
- name for a warning is always helpful in debugging, so it is now automatically
- inserted into the output. Hans has stated that every warning should have
- a unique identifier. Some cases lack them, others really shouldn't have them.
- reiserfs_warning() now expects an id associated with each message. In the
- rare case where one isn't needed, "" will suffice.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/bitmap.c          |   52 +++-----
- fs/reiserfs/do_balan.c        |   40 +++---
- fs/reiserfs/file.c            |    2 
- fs/reiserfs/fix_node.c        |   14 +-
- fs/reiserfs/inode.c           |   60 ++++-----
- fs/reiserfs/item_ops.c        |   60 +++++----
- fs/reiserfs/journal.c         |  174 +++++++++++++++-------------
- fs/reiserfs/lbalance.c        |   12 +
- fs/reiserfs/namei.c           |   45 +++----
- fs/reiserfs/objectid.c        |    5 
- fs/reiserfs/prints.c          |   11 +
- fs/reiserfs/procfs.c          |    5 
- fs/reiserfs/stree.c           |  107 ++++++++---------
- fs/reiserfs/super.c           |  257 ++++++++++++++++++++++--------------------
- fs/reiserfs/tail_conversion.c |    6 
- fs/reiserfs/xattr.c           |   21 ++-
- include/linux/reiserfs_fs.h   |    9 -
- 17 files changed, 454 insertions(+), 426 deletions(-)
-
---- a/fs/reiserfs/bitmap.c
-+++ b/fs/reiserfs/bitmap.c
-@@ -64,8 +64,8 @@ int is_reusable(struct super_block *s, b
-       unsigned int bmap_count = reiserfs_bmap_count(s);
-       if (block == 0 || block >= SB_BLOCK_COUNT(s)) {
--              reiserfs_warning(s,
--                               "vs-4010: is_reusable: block number is out of range %lu (%u)",
-+              reiserfs_warning(s, "vs-4010",
-+                               "block number is out of range %lu (%u)",
-                                block, SB_BLOCK_COUNT(s));
-               return 0;
-       }
-@@ -79,30 +79,29 @@ int is_reusable(struct super_block *s, b
-               b_blocknr_t bmap1 = REISERFS_SB(s)->s_sbh->b_blocknr + 1;
-               if (block >= bmap1 &&
-                   block <= bmap1 + bmap_count) {
--                      reiserfs_warning(s, "vs: 4019: is_reusable: "
--                                       "bitmap block %lu(%u) can't be freed or reused",
-+                      reiserfs_warning(s, "vs-4019", "bitmap block %lu(%u) "
-+                                       "can't be freed or reused",
-                                        block, bmap_count);
-                       return 0;
-               }
-       } else {
-               if (offset == 0) {
--                      reiserfs_warning(s, "vs: 4020: is_reusable: "
--                                       "bitmap block %lu(%u) can't be freed or reused",
-+                      reiserfs_warning(s, "vs-4020", "bitmap block %lu(%u) "
-+                                       "can't be freed or reused",
-                                        block, bmap_count);
-                       return 0;
-               }
-       }
-       if (bmap >= bmap_count) {
--              reiserfs_warning(s,
--                               "vs-4030: is_reusable: there is no so many bitmap blocks: "
--                               "block=%lu, bitmap_nr=%u", block, bmap);
-+              reiserfs_warning(s, "vs-4030", "bitmap for requested block "
-+                               "is out of range: block=%lu, bitmap_nr=%u",
-+                               block, bmap);
-               return 0;
-       }
-       if (bit_value == 0 && block == SB_ROOT_BLOCK(s)) {
--              reiserfs_warning(s,
--                               "vs-4050: is_reusable: this is root block (%u), "
-+              reiserfs_warning(s, "vs-4050", "this is root block (%u), "
-                                "it must be busy", SB_ROOT_BLOCK(s));
-               return 0;
-       }
-@@ -154,8 +153,8 @@ static int scan_bitmap_block(struct reis
- /* - I mean `a window of zero bits' as in description of this function - Zam. */
-       if (!bi) {
--              reiserfs_warning(s, "NULL bitmap info pointer for bitmap %d",
--                               bmap_n);
-+              reiserfs_warning(s, "jdm-4055", "NULL bitmap info pointer "
-+                               "for bitmap %d", bmap_n);
-               return 0;
-       }
-@@ -400,11 +399,8 @@ static void _reiserfs_free_block(struct 
-       get_bit_address(s, block, &nr, &offset);
-       if (nr >= reiserfs_bmap_count(s)) {
--              reiserfs_warning(s, "vs-4075: reiserfs_free_block: "
--                               "block %lu is out of range on %s "
--                               "(nr=%u,max=%u)", block,
--                               reiserfs_bdevname(s), nr,
--                               reiserfs_bmap_count(s));
-+              reiserfs_warning(s, "vs-4075", "block %lu is out of range",
-+                               block);
-               return;
-       }
-@@ -416,9 +412,8 @@ static void _reiserfs_free_block(struct 
-       /* clear bit for the given block in bit map */
-       if (!reiserfs_test_and_clear_le_bit(offset, bmbh->b_data)) {
--              reiserfs_warning(s, "vs-4080: reiserfs_free_block: "
--                               "free_block (%s:%lu)[dev:blocknr]: bit already cleared",
--                               reiserfs_bdevname(s), block);
-+              reiserfs_warning(s, "vs-4080",
-+                               "block %lu: bit already cleared", block);
-       }
-       apbi[nr].free_count++;
-       journal_mark_dirty(th, s, bmbh);
-@@ -477,9 +472,8 @@ static void __discard_prealloc(struct re
-       BUG_ON(!th->t_trans_id);
- #ifdef CONFIG_REISERFS_CHECK
-       if (ei->i_prealloc_count < 0)
--              reiserfs_warning(th->t_super,
--                               "zam-4001:%s: inode has negative prealloc blocks count.",
--                               __func__);
-+              reiserfs_warning(th->t_super, "zam-4001",
-+                               "inode has negative prealloc blocks count.");
- #endif
-       while (ei->i_prealloc_count > 0) {
-               reiserfs_free_prealloc_block(th, inode, ei->i_prealloc_block);
-@@ -515,9 +509,9 @@ void reiserfs_discard_all_prealloc(struc
-                               i_prealloc_list);
- #ifdef CONFIG_REISERFS_CHECK
-               if (!ei->i_prealloc_count) {
--                      reiserfs_warning(th->t_super,
--                                       "zam-4001:%s: inode is in prealloc list but has no preallocated blocks.",
--                                       __func__);
-+                      reiserfs_warning(th->t_super, "zam-4001",
-+                                       "inode is in prealloc list but has "
-+                                       "no preallocated blocks.");
-               }
- #endif
-               __discard_prealloc(th, ei);
-@@ -631,8 +625,8 @@ int reiserfs_parse_alloc_options(struct 
-                       continue;
-               }
--              reiserfs_warning(s, "zam-4001: %s : unknown option - %s",
--                               __func__, this_char);
-+              reiserfs_warning(s, "zam-4001", "unknown option - %s",
-+                               this_char);
-               return 1;
-       }
---- a/fs/reiserfs/do_balan.c
-+++ b/fs/reiserfs/do_balan.c
-@@ -1752,15 +1752,16 @@ static void store_thrown(struct tree_bal
-       int i;
-       if (buffer_dirty(bh))
--              reiserfs_warning(tb->tb_sb,
--                               "store_thrown deals with dirty buffer");
-+              reiserfs_warning(tb->tb_sb, "reiserfs-12320",
-+                               "called with dirty buffer");
-       for (i = 0; i < ARRAY_SIZE(tb->thrown); i++)
-               if (!tb->thrown[i]) {
-                       tb->thrown[i] = bh;
-                       get_bh(bh);     /* free_thrown puts this */
-                       return;
-               }
--      reiserfs_warning(tb->tb_sb, "store_thrown: too many thrown buffers");
-+      reiserfs_warning(tb->tb_sb, "reiserfs-12321",
-+                       "too many thrown buffers");
- }
- static void free_thrown(struct tree_balance *tb)
-@@ -1771,8 +1772,8 @@ static void free_thrown(struct tree_bala
-               if (tb->thrown[i]) {
-                       blocknr = tb->thrown[i]->b_blocknr;
-                       if (buffer_dirty(tb->thrown[i]))
--                              reiserfs_warning(tb->tb_sb,
--                                               "free_thrown deals with dirty buffer %d",
-+                              reiserfs_warning(tb->tb_sb, "reiserfs-12322",
-+                                               "called with dirty buffer %d",
-                                                blocknr);
-                       brelse(tb->thrown[i]);  /* incremented in store_thrown */
-                       reiserfs_free_block(tb->transaction_handle, NULL,
-@@ -1877,13 +1878,12 @@ static void check_internal_node(struct s
-       }
- }
--static int locked_or_not_in_tree(struct buffer_head *bh, char *which)
-+static int locked_or_not_in_tree(struct tree_balance *tb,
-+                                struct buffer_head *bh, char *which)
- {
-       if ((!buffer_journal_prepared(bh) && buffer_locked(bh)) ||
-           !B_IS_IN_TREE(bh)) {
--              reiserfs_warning(NULL,
--                               "vs-12339: locked_or_not_in_tree: %s (%b)",
--                               which, bh);
-+              reiserfs_warning(tb->tb_sb, "vs-12339", "%s (%b)", which, bh);
-               return 1;
-       }
-       return 0;
-@@ -1902,18 +1902,19 @@ static int check_before_balancing(struct
-       /* double check that buffers that we will modify are unlocked. (fix_nodes should already have
-          prepped all of these for us). */
-       if (tb->lnum[0]) {
--              retval |= locked_or_not_in_tree(tb->L[0], "L[0]");
--              retval |= locked_or_not_in_tree(tb->FL[0], "FL[0]");
--              retval |= locked_or_not_in_tree(tb->CFL[0], "CFL[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->L[0], "L[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->FL[0], "FL[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->CFL[0], "CFL[0]");
-               check_leaf(tb->L[0]);
-       }
-       if (tb->rnum[0]) {
--              retval |= locked_or_not_in_tree(tb->R[0], "R[0]");
--              retval |= locked_or_not_in_tree(tb->FR[0], "FR[0]");
--              retval |= locked_or_not_in_tree(tb->CFR[0], "CFR[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->R[0], "R[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->FR[0], "FR[0]");
-+              retval |= locked_or_not_in_tree(tb, tb->CFR[0], "CFR[0]");
-               check_leaf(tb->R[0]);
-       }
--      retval |= locked_or_not_in_tree(PATH_PLAST_BUFFER(tb->tb_path), "S[0]");
-+      retval |= locked_or_not_in_tree(tb, PATH_PLAST_BUFFER(tb->tb_path),
-+                                      "S[0]");
-       check_leaf(PATH_PLAST_BUFFER(tb->tb_path));
-       return retval;
-@@ -1952,7 +1953,7 @@ static void check_after_balance_leaf(str
-                                              PATH_H_POSITION(tb->tb_path,
-                                                              1))));
-               print_cur_tb("12223");
--              reiserfs_warning(tb->tb_sb,
-+              reiserfs_warning(tb->tb_sb, "reiserfs-12363",
-                                "B_FREE_SPACE (PATH_H_PBUFFER(tb->tb_path,0)) = %d; "
-                                "MAX_CHILD_SIZE (%d) - dc_size( %y, %d ) [%d] = %d",
-                                left,
-@@ -2104,9 +2105,8 @@ void do_balance(struct tree_balance *tb,
-       }
-       /* if we have no real work to do  */
-       if (!tb->insert_size[0]) {
--              reiserfs_warning(tb->tb_sb,
--                               "PAP-12350: do_balance: insert_size == 0, mode == %c",
--                               flag);
-+              reiserfs_warning(tb->tb_sb, "PAP-12350",
-+                               "insert_size == 0, mode == %c", flag);
-               unfix_nodes(tb);
-               return;
-       }
---- a/fs/reiserfs/file.c
-+++ b/fs/reiserfs/file.c
-@@ -76,7 +76,7 @@ static int reiserfs_file_release(struct 
-                        * and let the admin know what is going on.
-                        */
-                       igrab(inode);
--                      reiserfs_warning(inode->i_sb,
-+                      reiserfs_warning(inode->i_sb, "clm-9001",
-                                        "pinning inode %lu because the "
-                                        "preallocation can't be freed",
-                                        inode->i_ino);
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -496,8 +496,8 @@ static int get_num_ver(int mode, struct 
-               snum012[needed_nodes - 1 + 3] = units;
-               if (needed_nodes > 2)
--                      reiserfs_warning(tb->tb_sb, "vs-8111: get_num_ver: "
--                                       "split_item_position is out of boundary");
-+                      reiserfs_warning(tb->tb_sb, "vs-8111",
-+                                       "split_item_position is out of range");
-               snum012[needed_nodes - 1]++;
-               split_item_positions[needed_nodes - 1] = i;
-               needed_nodes++;
-@@ -533,8 +533,8 @@ static int get_num_ver(int mode, struct 
-               if (vn->vn_vi[split_item_num].vi_index != TYPE_DIRENTRY &&
-                   vn->vn_vi[split_item_num].vi_index != TYPE_INDIRECT)
--                      reiserfs_warning(tb->tb_sb, "vs-8115: get_num_ver: not "
--                                       "directory or indirect item");
-+                      reiserfs_warning(tb->tb_sb, "vs-8115",
-+                                       "not directory or indirect item");
-       }
-       /* now we know S2bytes, calculate S1bytes */
-@@ -2268,9 +2268,9 @@ static int wait_tb_buffers_until_unlocke
- #ifdef CONFIG_REISERFS_CHECK
-                       repeat_counter++;
-                       if ((repeat_counter % 10000) == 0) {
--                              reiserfs_warning(p_s_tb->tb_sb,
--                                               "wait_tb_buffers_until_released(): too many "
--                                               "iterations waiting for buffer to unlock "
-+                              reiserfs_warning(p_s_tb->tb_sb, "reiserfs-8200",
-+                                               "too many iterations waiting "
-+                                               "for buffer to unlock "
-                                                "(%b)", locked);
-                               /* Don't loop forever.  Try to recover from possible error. */
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -842,7 +842,9 @@ int reiserfs_get_block(struct inode *ino
-                               if (retval) {
-                                       if (retval != -ENOSPC)
-                                               reiserfs_warning(inode->i_sb,
--                                                               "clm-6004: convert tail failed inode %lu, error %d",
-+                                                       "clm-6004",
-+                                                       "convert tail failed "
-+                                                       "inode %lu, error %d",
-                                                                inode->i_ino,
-                                                                retval);
-                                       if (allocated_block_nr) {
-@@ -1006,8 +1008,7 @@ int reiserfs_get_block(struct inode *ino
-                       goto failure;
-               }
-               if (retval == POSITION_FOUND) {
--                      reiserfs_warning(inode->i_sb,
--                                       "vs-825: reiserfs_get_block: "
-+                      reiserfs_warning(inode->i_sb, "vs-825",
-                                        "%K should not be found", &key);
-                       retval = -EEXIST;
-                       if (allocated_block_nr)
-@@ -1332,9 +1333,9 @@ void reiserfs_update_sd_size(struct reis
-               /* look for the object's stat data */
-               retval = search_item(inode->i_sb, &key, &path);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(inode->i_sb,
--                                       "vs-13050: reiserfs_update_sd: "
--                                       "i/o failure occurred trying to update %K stat data",
-+                      reiserfs_warning(inode->i_sb, "vs-13050",
-+                                       "i/o failure occurred trying to "
-+                                       "update %K stat data",
-                                        &key);
-                       return;
-               }
-@@ -1345,9 +1346,9 @@ void reiserfs_update_sd_size(struct reis
-                               /*reiserfs_warning (inode->i_sb, "vs-13050: reiserfs_update_sd: i_nlink == 0, stat data not found"); */
-                               return;
-                       }
--                      reiserfs_warning(inode->i_sb,
--                                       "vs-13060: reiserfs_update_sd: "
--                                       "stat data of object %k (nlink == %d) not found (pos %d)",
-+                      reiserfs_warning(inode->i_sb, "vs-13060",
-+                                       "stat data of object %k (nlink == %d) "
-+                                       "not found (pos %d)",
-                                        INODE_PKEY(inode), inode->i_nlink,
-                                        pos);
-                       reiserfs_check_path(&path);
-@@ -1424,10 +1425,9 @@ void reiserfs_read_locked_inode(struct i
-       /* look for the object's stat data */
-       retval = search_item(inode->i_sb, &key, &path_to_sd);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(inode->i_sb,
--                               "vs-13070: reiserfs_read_locked_inode: "
--                               "i/o failure occurred trying to find stat data of %K",
--                               &key);
-+              reiserfs_warning(inode->i_sb, "vs-13070",
-+                               "i/o failure occurred trying to find "
-+                               "stat data of %K", &key);
-               reiserfs_make_bad_inode(inode);
-               return;
-       }
-@@ -1457,8 +1457,7 @@ void reiserfs_read_locked_inode(struct i
-          during mount (fs/reiserfs/super.c:finish_unfinished()). */
-       if ((inode->i_nlink == 0) &&
-           !REISERFS_SB(inode->i_sb)->s_is_unlinked_ok) {
--              reiserfs_warning(inode->i_sb,
--                               "vs-13075: reiserfs_read_locked_inode: "
-+              reiserfs_warning(inode->i_sb, "vs-13075",
-                                "dead inode read from disk %K. "
-                                "This is likely to be race with knfsd. Ignore",
-                                &key);
-@@ -1564,7 +1563,7 @@ struct dentry *reiserfs_fh_to_dentry(str
-        */
-       if (fh_type > fh_len) {
-               if (fh_type != 6 || fh_len != 5)
--                      reiserfs_warning(sb,
-+                      reiserfs_warning(sb, "reiserfs-13077",
-                               "nfsd/reiserfs, fhtype=%d, len=%d - odd",
-                               fh_type, fh_len);
-               fh_type = 5;
-@@ -1689,13 +1688,13 @@ static int reiserfs_new_directory(struct
-       /* look for place in the tree for new item */
-       retval = search_item(sb, &key, path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(sb, "vs-13080: reiserfs_new_directory: "
-+              reiserfs_warning(sb, "vs-13080",
-                                "i/o failure occurred creating new directory");
-               return -EIO;
-       }
-       if (retval == ITEM_FOUND) {
-               pathrelse(path);
--              reiserfs_warning(sb, "vs-13070: reiserfs_new_directory: "
-+              reiserfs_warning(sb, "vs-13070",
-                                "object with this key exists (%k)",
-                                &(ih->ih_key));
-               return -EEXIST;
-@@ -1729,13 +1728,13 @@ static int reiserfs_new_symlink(struct r
-       /* look for place in the tree for new item */
-       retval = search_item(sb, &key, path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(sb, "vs-13080: reiserfs_new_symlinik: "
-+              reiserfs_warning(sb, "vs-13080",
-                                "i/o failure occurred creating new symlink");
-               return -EIO;
-       }
-       if (retval == ITEM_FOUND) {
-               pathrelse(path);
--              reiserfs_warning(sb, "vs-13080: reiserfs_new_symlink: "
-+              reiserfs_warning(sb, "vs-13080",
-                                "object with this key exists (%k)",
-                                &(ih->ih_key));
-               return -EEXIST;
-@@ -1932,7 +1931,8 @@ int reiserfs_new_inode(struct reiserfs_t
-                       goto out_inserted_sd;
-               }
-       } else if (inode->i_sb->s_flags & MS_POSIXACL) {
--              reiserfs_warning(inode->i_sb, "ACLs aren't enabled in the fs, "
-+              reiserfs_warning(inode->i_sb, "jdm-13090",
-+                               "ACLs aren't enabled in the fs, "
-                                "but vfs thinks they are!");
-       } else if (is_reiserfs_priv_object(dir)) {
-               reiserfs_mark_inode_private(inode);
-@@ -2049,8 +2049,8 @@ static int grab_tail_page(struct inode *
-                ** I've screwed up the code to find the buffer, or the code to
-                ** call prepare_write
-                */
--              reiserfs_warning(p_s_inode->i_sb,
--                               "clm-6000: error reading block %lu on dev %s",
-+              reiserfs_warning(p_s_inode->i_sb, "clm-6000",
-+                               "error reading block %lu on dev %s",
-                                bh->b_blocknr,
-                                reiserfs_bdevname(p_s_inode->i_sb));
-               error = -EIO;
-@@ -2094,8 +2094,8 @@ int reiserfs_truncate_file(struct inode 
-                       // and get_block_create_0 could not find a block to read in,
-                       // which is ok.
-                       if (error != -ENOENT)
--                              reiserfs_warning(p_s_inode->i_sb,
--                                               "clm-6001: grab_tail_page failed %d",
-+                              reiserfs_warning(p_s_inode->i_sb, "clm-6001",
-+                                               "grab_tail_page failed %d",
-                                                error);
-                       page = NULL;
-                       bh = NULL;
-@@ -2213,9 +2213,8 @@ static int map_block_for_writepage(struc
-       /* we've found an unformatted node */
-       if (indirect_item_found(retval, ih)) {
-               if (bytes_copied > 0) {
--                      reiserfs_warning(inode->i_sb,
--                                       "clm-6002: bytes_copied %d",
--                                       bytes_copied);
-+                      reiserfs_warning(inode->i_sb, "clm-6002",
-+                                       "bytes_copied %d", bytes_copied);
-               }
-               if (!get_block_num(item, pos_in_item)) {
-                       /* crap, we are writing to a hole */
-@@ -2272,9 +2271,8 @@ static int map_block_for_writepage(struc
-                       goto research;
-               }
-       } else {
--              reiserfs_warning(inode->i_sb,
--                               "clm-6003: bad item inode %lu, device %s",
--                               inode->i_ino, reiserfs_bdevname(inode->i_sb));
-+              reiserfs_warning(inode->i_sb, "clm-6003",
-+                               "bad item inode %lu", inode->i_ino);
-               retval = -EIO;
-               goto out;
-       }
---- a/fs/reiserfs/item_ops.c
-+++ b/fs/reiserfs/item_ops.c
-@@ -97,7 +97,8 @@ static int sd_unit_num(struct virtual_it
- static void sd_print_vi(struct virtual_item *vi)
- {
--      reiserfs_warning(NULL, "STATDATA, index %d, type 0x%x, %h",
-+      reiserfs_warning(NULL, "reiserfs-16100",
-+                       "STATDATA, index %d, type 0x%x, %h",
-                        vi->vi_index, vi->vi_type, vi->vi_ih);
- }
-@@ -190,7 +191,8 @@ static int direct_unit_num(struct virtua
- static void direct_print_vi(struct virtual_item *vi)
- {
--      reiserfs_warning(NULL, "DIRECT, index %d, type 0x%x, %h",
-+      reiserfs_warning(NULL, "reiserfs-16101",
-+                       "DIRECT, index %d, type 0x%x, %h",
-                        vi->vi_index, vi->vi_type, vi->vi_ih);
- }
-@@ -278,7 +280,7 @@ static void indirect_print_item(struct i
-       unp = (__le32 *) item;
-       if (ih_item_len(ih) % UNFM_P_SIZE)
--              reiserfs_warning(NULL, "indirect_print_item: invalid item len");
-+              reiserfs_warning(NULL, "reiserfs-16102", "invalid item len");
-       printk("%d pointers\n[ ", (int)I_UNFM_NUM(ih));
-       for (j = 0; j < I_UNFM_NUM(ih); j++) {
-@@ -334,7 +336,8 @@ static int indirect_unit_num(struct virt
- static void indirect_print_vi(struct virtual_item *vi)
- {
--      reiserfs_warning(NULL, "INDIRECT, index %d, type 0x%x, %h",
-+      reiserfs_warning(NULL, "reiserfs-16103",
-+                       "INDIRECT, index %d, type 0x%x, %h",
-                        vi->vi_index, vi->vi_type, vi->vi_ih);
- }
-@@ -359,7 +362,7 @@ static struct item_operations indirect_o
- static int direntry_bytes_number(struct item_head *ih, int block_size)
- {
--      reiserfs_warning(NULL, "vs-16090: direntry_bytes_number: "
-+      reiserfs_warning(NULL, "vs-16090",
-                        "bytes number is asked for direntry");
-       return 0;
- }
-@@ -614,7 +617,8 @@ static void direntry_print_vi(struct vir
-       int i;
-       struct direntry_uarea *dir_u = vi->vi_uarea;
--      reiserfs_warning(NULL, "DIRENTRY, index %d, type 0x%x, %h, flags 0x%x",
-+      reiserfs_warning(NULL, "reiserfs-16104",
-+                       "DIRENTRY, index %d, type 0x%x, %h, flags 0x%x",
-                        vi->vi_index, vi->vi_type, vi->vi_ih, dir_u->flags);
-       printk("%d entries: ", dir_u->entry_count);
-       for (i = 0; i < dir_u->entry_count; i++)
-@@ -642,43 +646,43 @@ static struct item_operations direntry_o
- //
- static int errcatch_bytes_number(struct item_head *ih, int block_size)
- {
--      reiserfs_warning(NULL,
--                       "green-16001: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16001",
-+                       "Invalid item type observed, run fsck ASAP");
-       return 0;
- }
- static void errcatch_decrement_key(struct cpu_key *key)
- {
--      reiserfs_warning(NULL,
--                       "green-16002: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16002",
-+                       "Invalid item type observed, run fsck ASAP");
- }
- static int errcatch_is_left_mergeable(struct reiserfs_key *key,
-                                     unsigned long bsize)
- {
--      reiserfs_warning(NULL,
--                       "green-16003: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16003",
-+                       "Invalid item type observed, run fsck ASAP");
-       return 0;
- }
- static void errcatch_print_item(struct item_head *ih, char *item)
- {
--      reiserfs_warning(NULL,
--                       "green-16004: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16004",
-+                       "Invalid item type observed, run fsck ASAP");
- }
- static void errcatch_check_item(struct item_head *ih, char *item)
- {
--      reiserfs_warning(NULL,
--                       "green-16005: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16005",
-+                       "Invalid item type observed, run fsck ASAP");
- }
- static int errcatch_create_vi(struct virtual_node *vn,
-                             struct virtual_item *vi,
-                             int is_affected, int insert_size)
- {
--      reiserfs_warning(NULL,
--                       "green-16006: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16006",
-+                       "Invalid item type observed, run fsck ASAP");
-       return 0;               // We might return -1 here as well, but it won't help as create_virtual_node() from where
-       // this operation is called from is of return type void.
- }
-@@ -686,36 +690,36 @@ static int errcatch_create_vi(struct vir
- static int errcatch_check_left(struct virtual_item *vi, int free,
-                              int start_skip, int end_skip)
- {
--      reiserfs_warning(NULL,
--                       "green-16007: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16007",
-+                       "Invalid item type observed, run fsck ASAP");
-       return -1;
- }
- static int errcatch_check_right(struct virtual_item *vi, int free)
- {
--      reiserfs_warning(NULL,
--                       "green-16008: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16008",
-+                       "Invalid item type observed, run fsck ASAP");
-       return -1;
- }
- static int errcatch_part_size(struct virtual_item *vi, int first, int count)
- {
--      reiserfs_warning(NULL,
--                       "green-16009: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16009",
-+                       "Invalid item type observed, run fsck ASAP");
-       return 0;
- }
- static int errcatch_unit_num(struct virtual_item *vi)
- {
--      reiserfs_warning(NULL,
--                       "green-16010: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16010",
-+                       "Invalid item type observed, run fsck ASAP");
-       return 0;
- }
- static void errcatch_print_vi(struct virtual_item *vi)
- {
--      reiserfs_warning(NULL,
--                       "green-16011: Invalid item type observed, run fsck ASAP");
-+      reiserfs_warning(NULL, "green-16011",
-+                       "Invalid item type observed, run fsck ASAP");
- }
- static struct item_operations errcatch_ops = {
---- a/fs/reiserfs/journal.c
-+++ b/fs/reiserfs/journal.c
-@@ -300,8 +300,8 @@ int reiserfs_allocate_list_bitmaps(struc
-               jb->journal_list = NULL;
-               jb->bitmaps = vmalloc(mem);
-               if (!jb->bitmaps) {
--                      reiserfs_warning(p_s_sb,
--                                       "clm-2000, unable to allocate bitmaps for journal lists");
-+                      reiserfs_warning(p_s_sb, "clm-2000", "unable to "
-+                                       "allocate bitmaps for journal lists");
-                       failed = 1;
-                       break;
-               }
-@@ -644,8 +644,8 @@ static void reiserfs_end_buffer_io_sync(
-       char b[BDEVNAME_SIZE];
-       if (buffer_journaled(bh)) {
--              reiserfs_warning(NULL,
--                               "clm-2084: pinned buffer %lu:%s sent to disk",
-+              reiserfs_warning(NULL, "clm-2084",
-+                               "pinned buffer %lu:%s sent to disk",
-                                bh->b_blocknr, bdevname(bh->b_bdev, b));
-       }
-       if (uptodate)
-@@ -1122,7 +1122,8 @@ static int flush_commit_list(struct supe
-                       sync_dirty_buffer(tbh);
-               if (unlikely(!buffer_uptodate(tbh))) {
- #ifdef CONFIG_REISERFS_CHECK
--                      reiserfs_warning(s, "journal-601, buffer write failed");
-+                      reiserfs_warning(s, "journal-601",
-+                                       "buffer write failed");
- #endif
-                       retval = -EIO;
-               }
-@@ -1154,14 +1155,14 @@ static int flush_commit_list(struct supe
-        * up propagating the write error out to the filesystem. */
-       if (unlikely(!buffer_uptodate(jl->j_commit_bh))) {
- #ifdef CONFIG_REISERFS_CHECK
--              reiserfs_warning(s, "journal-615: buffer write failed");
-+              reiserfs_warning(s, "journal-615", "buffer write failed");
- #endif
-               retval = -EIO;
-       }
-       bforget(jl->j_commit_bh);
-       if (journal->j_last_commit_id != 0 &&
-           (jl->j_trans_id - journal->j_last_commit_id) != 1) {
--              reiserfs_warning(s, "clm-2200: last commit %lu, current %lu",
-+              reiserfs_warning(s, "clm-2200", "last commit %lu, current %lu",
-                                journal->j_last_commit_id, jl->j_trans_id);
-       }
-       journal->j_last_commit_id = jl->j_trans_id;
-@@ -1250,7 +1251,7 @@ static void remove_all_from_journal_list
-       while (cn) {
-               if (cn->blocknr != 0) {
-                       if (debug) {
--                              reiserfs_warning(p_s_sb,
-+                              reiserfs_warning(p_s_sb, "reiserfs-2201",
-                                                "block %u, bh is %d, state %ld",
-                                                cn->blocknr, cn->bh ? 1 : 0,
-                                                cn->state);
-@@ -1288,8 +1289,8 @@ static int _update_journal_header_block(
-                       wait_on_buffer((journal->j_header_bh));
-                       if (unlikely(!buffer_uptodate(journal->j_header_bh))) {
- #ifdef CONFIG_REISERFS_CHECK
--                              reiserfs_warning(p_s_sb,
--                                               "journal-699: buffer write failed");
-+                              reiserfs_warning(p_s_sb, "journal-699",
-+                                               "buffer write failed");
- #endif
-                               return -EIO;
-                       }
-@@ -1319,8 +1320,8 @@ static int _update_journal_header_block(
-                       sync_dirty_buffer(journal->j_header_bh);
-               }
-               if (!buffer_uptodate(journal->j_header_bh)) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-837: IO error during journal replay");
-+                      reiserfs_warning(p_s_sb, "journal-837",
-+                                       "IO error during journal replay");
-                       return -EIO;
-               }
-       }
-@@ -1401,8 +1402,7 @@ static int flush_journal_list(struct sup
-       BUG_ON(j_len_saved <= 0);
-       if (atomic_read(&journal->j_wcount) != 0) {
--              reiserfs_warning(s,
--                               "clm-2048: flush_journal_list called with wcount %d",
-+              reiserfs_warning(s, "clm-2048", "called with wcount %d",
-                                atomic_read(&journal->j_wcount));
-       }
-       BUG_ON(jl->j_trans_id == 0);
-@@ -1510,8 +1510,8 @@ static int flush_journal_list(struct sup
-                ** is not marked JDirty_wait
-                */
-               if ((!was_jwait) && !buffer_locked(saved_bh)) {
--                      reiserfs_warning(s,
--                                       "journal-813: BAD! buffer %llu %cdirty %cjwait, "
-+                      reiserfs_warning(s, "journal-813",
-+                                       "BAD! buffer %llu %cdirty %cjwait, "
-                                        "not in a newer tranasction",
-                                        (unsigned long long)saved_bh->
-                                        b_blocknr, was_dirty ? ' ' : '!',
-@@ -1529,8 +1529,8 @@ static int flush_journal_list(struct sup
-                               unlock_buffer(saved_bh);
-                       count++;
-               } else {
--                      reiserfs_warning(s,
--                                       "clm-2082: Unable to flush buffer %llu in %s",
-+                      reiserfs_warning(s, "clm-2082",
-+                                       "Unable to flush buffer %llu in %s",
-                                        (unsigned long long)saved_bh->
-                                        b_blocknr, __func__);
-               }
-@@ -1541,8 +1541,8 @@ static int flush_journal_list(struct sup
-                       /* we incremented this to keep others from taking the buffer head away */
-                       put_bh(saved_bh);
-                       if (atomic_read(&(saved_bh->b_count)) < 0) {
--                              reiserfs_warning(s,
--                                               "journal-945: saved_bh->b_count < 0");
-+                              reiserfs_warning(s, "journal-945",
-+                                               "saved_bh->b_count < 0");
-                       }
-               }
-       }
-@@ -1561,8 +1561,8 @@ static int flush_journal_list(struct sup
-                               }
-                               if (unlikely(!buffer_uptodate(cn->bh))) {
- #ifdef CONFIG_REISERFS_CHECK
--                                      reiserfs_warning(s,
--                                                       "journal-949: buffer write failed\n");
-+                                      reiserfs_warning(s, "journal-949",
-+                                                       "buffer write failed");
- #endif
-                                       err = -EIO;
-                               }
-@@ -1623,7 +1623,7 @@ static int flush_journal_list(struct sup
-       if (journal->j_last_flush_id != 0 &&
-           (jl->j_trans_id - journal->j_last_flush_id) != 1) {
--              reiserfs_warning(s, "clm-2201: last flush %lu, current %lu",
-+              reiserfs_warning(s, "clm-2201", "last flush %lu, current %lu",
-                                journal->j_last_flush_id, jl->j_trans_id);
-       }
-       journal->j_last_flush_id = jl->j_trans_id;
-@@ -2058,8 +2058,9 @@ static int journal_transaction_is_valid(
-                       return -1;
-               }
-               if (get_desc_trans_len(desc) > SB_JOURNAL(p_s_sb)->j_trans_max) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-2018: Bad transaction length %d encountered, ignoring transaction",
-+                      reiserfs_warning(p_s_sb, "journal-2018",
-+                                       "Bad transaction length %d "
-+                                       "encountered, ignoring transaction",
-                                        get_desc_trans_len(desc));
-                       return -1;
-               }
-@@ -2195,8 +2196,8 @@ static int journal_read_transaction(stru
-               brelse(d_bh);
-               kfree(log_blocks);
-               kfree(real_blocks);
--              reiserfs_warning(p_s_sb,
--                               "journal-1169: kmalloc failed, unable to mount FS");
-+              reiserfs_warning(p_s_sb, "journal-1169",
-+                               "kmalloc failed, unable to mount FS");
-               return -1;
-       }
-       /* get all the buffer heads */
-@@ -2218,15 +2219,18 @@ static int journal_read_transaction(stru
-                                                 j_realblock[i - trans_half]));
-               }
-               if (real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(p_s_sb)) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-1207: REPLAY FAILURE fsck required! Block to replay is outside of filesystem");
-+                      reiserfs_warning(p_s_sb, "journal-1207",
-+                                       "REPLAY FAILURE fsck required! "
-+                                       "Block to replay is outside of "
-+                                       "filesystem");
-                       goto abort_replay;
-               }
-               /* make sure we don't try to replay onto log or reserved area */
-               if (is_block_in_log_or_reserved_area
-                   (p_s_sb, real_blocks[i]->b_blocknr)) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-1204: REPLAY FAILURE fsck required! Trying to replay onto a log block");
-+                      reiserfs_warning(p_s_sb, "journal-1204",
-+                                       "REPLAY FAILURE fsck required! "
-+                                       "Trying to replay onto a log block");
-                     abort_replay:
-                       brelse_array(log_blocks, i);
-                       brelse_array(real_blocks, i);
-@@ -2242,8 +2246,9 @@ static int journal_read_transaction(stru
-       for (i = 0; i < get_desc_trans_len(desc); i++) {
-               wait_on_buffer(log_blocks[i]);
-               if (!buffer_uptodate(log_blocks[i])) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-1212: REPLAY FAILURE fsck required! buffer write failed");
-+                      reiserfs_warning(p_s_sb, "journal-1212",
-+                                       "REPLAY FAILURE fsck required! "
-+                                       "buffer write failed");
-                       brelse_array(log_blocks + i,
-                                    get_desc_trans_len(desc) - i);
-                       brelse_array(real_blocks, get_desc_trans_len(desc));
-@@ -2266,8 +2271,9 @@ static int journal_read_transaction(stru
-       for (i = 0; i < get_desc_trans_len(desc); i++) {
-               wait_on_buffer(real_blocks[i]);
-               if (!buffer_uptodate(real_blocks[i])) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-1226: REPLAY FAILURE, fsck required! buffer write failed");
-+                      reiserfs_warning(p_s_sb, "journal-1226",
-+                                       "REPLAY FAILURE, fsck required! "
-+                                       "buffer write failed");
-                       brelse_array(real_blocks + i,
-                                    get_desc_trans_len(desc) - i);
-                       brelse(c_bh);
-@@ -2418,8 +2424,8 @@ static int journal_read(struct super_blo
-       }
-       if (continue_replay && bdev_read_only(p_s_sb->s_bdev)) {
--              reiserfs_warning(p_s_sb,
--                               "clm-2076: device is readonly, unable to replay log");
-+              reiserfs_warning(p_s_sb, "clm-2076",
-+                               "device is readonly, unable to replay log");
-               return -1;
-       }
-@@ -2580,9 +2586,8 @@ static int release_journal_dev(struct su
-       }
-       if (result != 0) {
--              reiserfs_warning(super,
--                               "sh-457: release_journal_dev: Cannot release journal device: %i",
--                               result);
-+              reiserfs_warning(super, "sh-457",
-+                               "Cannot release journal device: %i", result);
-       }
-       return result;
- }
-@@ -2611,7 +2616,7 @@ static int journal_init_dev(struct super
-               if (IS_ERR(journal->j_dev_bd)) {
-                       result = PTR_ERR(journal->j_dev_bd);
-                       journal->j_dev_bd = NULL;
--                      reiserfs_warning(super, "sh-458: journal_init_dev: "
-+                      reiserfs_warning(super, "sh-458",
-                                        "cannot init journal device '%s': %i",
-                                        __bdevname(jdev, b), result);
-                       return result;
-@@ -2673,16 +2678,16 @@ static int check_advise_trans_params(str
-                   journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio ||
-                   SB_ONDISK_JOURNAL_SIZE(p_s_sb) / journal->j_trans_max <
-                   JOURNAL_MIN_RATIO) {
--                      reiserfs_warning(p_s_sb,
--                               "sh-462: bad transaction max size (%u). FSCK?",
--                               journal->j_trans_max);
-+                      reiserfs_warning(p_s_sb, "sh-462",
-+                                       "bad transaction max size (%u). "
-+                                       "FSCK?", journal->j_trans_max);
-                       return 1;
-               }
-               if (journal->j_max_batch != (journal->j_trans_max) *
-                       JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT) {
--                      reiserfs_warning(p_s_sb,
--                              "sh-463: bad transaction max batch (%u). FSCK?",
--                              journal->j_max_batch);
-+                      reiserfs_warning(p_s_sb, "sh-463",
-+                                       "bad transaction max batch (%u). "
-+                                       "FSCK?", journal->j_max_batch);
-                       return 1;
-               }
-       } else {
-@@ -2690,9 +2695,11 @@ static int check_advise_trans_params(str
-                    The file system was created by old version
-                  of mkreiserfs, so some fields contain zeros,
-                  and we need to advise proper values for them */
--              if (p_s_sb->s_blocksize != REISERFS_STANDARD_BLKSIZE)
--                      reiserfs_panic(p_s_sb, "sh-464: bad blocksize (%u)",
--                                     p_s_sb->s_blocksize);
-+              if (p_s_sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
-+                      reiserfs_warning(p_s_sb, "sh-464", "bad blocksize (%u)",
-+                                       p_s_sb->s_blocksize);
-+                      return 1;
-+              }
-               journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
-               journal->j_max_batch = JOURNAL_MAX_BATCH_DEFAULT;
-               journal->j_max_commit_age = JOURNAL_MAX_COMMIT_AGE;
-@@ -2716,8 +2723,8 @@ int journal_init(struct super_block *p_s
-       journal = SB_JOURNAL(p_s_sb) = vmalloc(sizeof(struct reiserfs_journal));
-       if (!journal) {
--              reiserfs_warning(p_s_sb,
--                               "journal-1256: unable to get memory for journal structure");
-+              reiserfs_warning(p_s_sb, "journal-1256",
-+                               "unable to get memory for journal structure");
-               return 1;
-       }
-       memset(journal, 0, sizeof(struct reiserfs_journal));
-@@ -2746,9 +2753,9 @@ int journal_init(struct super_block *p_s
-       if (!SB_ONDISK_JOURNAL_DEVICE(p_s_sb) &&
-           (SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) +
-            SB_ONDISK_JOURNAL_SIZE(p_s_sb) > p_s_sb->s_blocksize * 8)) {
--              reiserfs_warning(p_s_sb,
--                               "journal-1393: journal does not fit for area "
--                               "addressed by first of bitmap blocks. It starts at "
-+              reiserfs_warning(p_s_sb, "journal-1393",
-+                               "journal does not fit for area addressed "
-+                               "by first of bitmap blocks. It starts at "
-                                "%u and its size is %u. Block size %ld",
-                                SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb),
-                                SB_ONDISK_JOURNAL_SIZE(p_s_sb),
-@@ -2757,8 +2764,8 @@ int journal_init(struct super_block *p_s
-       }
-       if (journal_init_dev(p_s_sb, journal, j_dev_name) != 0) {
--              reiserfs_warning(p_s_sb,
--                               "sh-462: unable to initialize jornal device");
-+              reiserfs_warning(p_s_sb, "sh-462",
-+                               "unable to initialize jornal device");
-               goto free_and_return;
-       }
-@@ -2769,8 +2776,8 @@ int journal_init(struct super_block *p_s
-                            SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-                            SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-       if (!bhjh) {
--              reiserfs_warning(p_s_sb,
--                               "sh-459: unable to read journal header");
-+              reiserfs_warning(p_s_sb, "sh-459",
-+                               "unable to read journal header");
-               goto free_and_return;
-       }
-       jh = (struct reiserfs_journal_header *)(bhjh->b_data);
-@@ -2779,10 +2786,10 @@ int journal_init(struct super_block *p_s
-       if (is_reiserfs_jr(rs)
-           && (le32_to_cpu(jh->jh_journal.jp_journal_magic) !=
-               sb_jp_journal_magic(rs))) {
--              reiserfs_warning(p_s_sb,
--                               "sh-460: journal header magic %x "
--                               "(device %s) does not match to magic found in super "
--                               "block %x", jh->jh_journal.jp_journal_magic,
-+              reiserfs_warning(p_s_sb, "sh-460",
-+                               "journal header magic %x (device %s) does "
-+                               "not match to magic found in super block %x",
-+                               jh->jh_journal.jp_journal_magic,
-                                bdevname(journal->j_dev_bd, b),
-                                sb_jp_journal_magic(rs));
-               brelse(bhjh);
-@@ -2849,7 +2856,7 @@ int journal_init(struct super_block *p_s
-       journal->j_must_wait = 0;
-       if (journal->j_cnode_free == 0) {
--              reiserfs_warning(p_s_sb, "journal-2004: Journal cnode memory "
-+              reiserfs_warning(p_s_sb, "journal-2004", "Journal cnode memory "
-                                "allocation failed (%ld bytes). Journal is "
-                                "too large for available memory. Usually "
-                                "this is due to a journal that is too large.",
-@@ -2861,12 +2868,13 @@ int journal_init(struct super_block *p_s
-       jl = journal->j_current_jl;
-       jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
-       if (!jl->j_list_bitmap) {
--              reiserfs_warning(p_s_sb,
--                               "journal-2005, get_list_bitmap failed for journal list 0");
-+              reiserfs_warning(p_s_sb, "journal-2005",
-+                               "get_list_bitmap failed for journal list 0");
-               goto free_and_return;
-       }
-       if (journal_read(p_s_sb) < 0) {
--              reiserfs_warning(p_s_sb, "Replay Failure, unable to mount");
-+              reiserfs_warning(p_s_sb, "reiserfs-2006",
-+                               "Replay Failure, unable to mount");
-               goto free_and_return;
-       }
-@@ -3193,16 +3201,17 @@ int journal_begin(struct reiserfs_transa
-                       cur_th->t_refcount++;
-                       memcpy(th, cur_th, sizeof(*th));
-                       if (th->t_refcount <= 1)
--                              reiserfs_warning(p_s_sb,
--                                               "BAD: refcount <= 1, but journal_info != 0");
-+                              reiserfs_warning(p_s_sb, "reiserfs-2005",
-+                                               "BAD: refcount <= 1, but "
-+                                               "journal_info != 0");
-                       return 0;
-               } else {
-                       /* we've ended up with a handle from a different filesystem.
-                        ** save it and restore on journal_end.  This should never
-                        ** really happen...
-                        */
--                      reiserfs_warning(p_s_sb,
--                                       "clm-2100: nesting info a different FS");
-+                      reiserfs_warning(p_s_sb, "clm-2100",
-+                                       "nesting info a different FS");
-                       th->t_handle_save = current->journal_info;
-                       current->journal_info = th;
-               }
-@@ -3263,7 +3272,8 @@ int journal_mark_dirty(struct reiserfs_t
-        ** could get to disk too early.  NOT GOOD.
-        */
-       if (!prepared || buffer_dirty(bh)) {
--              reiserfs_warning(p_s_sb, "journal-1777: buffer %llu bad state "
-+              reiserfs_warning(p_s_sb, "journal-1777",
-+                               "buffer %llu bad state "
-                                "%cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT",
-                                (unsigned long long)bh->b_blocknr,
-                                prepared ? ' ' : '!',
-@@ -3273,8 +3283,8 @@ int journal_mark_dirty(struct reiserfs_t
-       }
-       if (atomic_read(&(journal->j_wcount)) <= 0) {
--              reiserfs_warning(p_s_sb,
--                               "journal-1409: journal_mark_dirty returning because j_wcount was %d",
-+              reiserfs_warning(p_s_sb, "journal-1409",
-+                               "returning because j_wcount was %d",
-                                atomic_read(&(journal->j_wcount)));
-               return 1;
-       }
-@@ -3339,8 +3349,8 @@ int journal_end(struct reiserfs_transact
-               struct super_block *p_s_sb, unsigned long nblocks)
- {
-       if (!current->journal_info && th->t_refcount > 1)
--              reiserfs_warning(p_s_sb, "REISER-NESTING: th NULL, refcount %d",
--                               th->t_refcount);
-+              reiserfs_warning(p_s_sb, "REISER-NESTING",
-+                               "th NULL, refcount %d", th->t_refcount);
-       if (!th->t_trans_id) {
-               WARN_ON(1);
-@@ -3410,8 +3420,8 @@ static int remove_from_transaction(struc
-               clear_buffer_journal_test(bh);
-               put_bh(bh);
-               if (atomic_read(&(bh->b_count)) < 0) {
--                      reiserfs_warning(p_s_sb,
--                                       "journal-1752: remove from trans, b_count < 0");
-+                      reiserfs_warning(p_s_sb, "journal-1752",
-+                                       "b_count < 0");
-               }
-               ret = 1;
-       }
-@@ -3731,7 +3741,8 @@ int journal_mark_freed(struct reiserfs_t
-                                               if (atomic_read
-                                                   (&(cn->bh->b_count)) < 0) {
-                                                       reiserfs_warning(p_s_sb,
--                                                                       "journal-2138: cn->bh->b_count < 0");
-+                                                               "journal-2138",
-+                                                               "cn->bh->b_count < 0");
-                                               }
-                                       }
-                                       if (cn->jlist) {        /* since we are clearing the bh, we MUST dec nonzerolen */
-@@ -4134,8 +4145,9 @@ static int do_journal_end(struct reiserf
-                       clear_buffer_journaled(cn->bh);
-               } else {
-                       /* JDirty cleared sometime during transaction.  don't log this one */
--                      reiserfs_warning(p_s_sb,
--                                       "journal-2048: do_journal_end: BAD, buffer in journal hash, but not JDirty!");
-+                      reiserfs_warning(p_s_sb, "journal-2048",
-+                                       "BAD, buffer in journal hash, "
-+                                       "but not JDirty!");
-                       brelse(cn->bh);
-               }
-               next = cn->next;
---- a/fs/reiserfs/lbalance.c
-+++ b/fs/reiserfs/lbalance.c
-@@ -1288,12 +1288,16 @@ void leaf_paste_entries(struct buffer_in
-                       prev = (i != 0) ? deh_location(&(deh[i - 1])) : 0;
-                       if (prev && prev <= deh_location(&(deh[i])))
--                              reiserfs_warning(NULL,
--                                               "vs-10240: leaf_paste_entries: directory item (%h) corrupted (prev %a, cur(%d) %a)",
-+                              reiserfs_warning(NULL, "vs-10240",
-+                                               "directory item (%h) "
-+                                               "corrupted (prev %a, "
-+                                               "cur(%d) %a)",
-                                                ih, deh + i - 1, i, deh + i);
-                       if (next && next >= deh_location(&(deh[i])))
--                              reiserfs_warning(NULL,
--                                               "vs-10250: leaf_paste_entries: directory item (%h) corrupted (cur(%d) %a, next %a)",
-+                              reiserfs_warning(NULL, "vs-10250",
-+                                               "directory item (%h) "
-+                                               "corrupted (cur(%d) %a, "
-+                                               "next %a)",
-                                                ih, i, deh + i, deh + i + 1);
-               }
-       }
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -120,8 +120,8 @@ int search_by_entry_key(struct super_blo
-       switch (retval) {
-       case ITEM_NOT_FOUND:
-               if (!PATH_LAST_POSITION(path)) {
--                      reiserfs_warning(sb,
--                                       "vs-7000: search_by_entry_key: search_by_key returned item position == 0");
-+                      reiserfs_warning(sb, "vs-7000", "search_by_key "
-+                                       "returned item position == 0");
-                       pathrelse(path);
-                       return IO_ERROR;
-               }
-@@ -135,8 +135,7 @@ int search_by_entry_key(struct super_blo
-       default:
-               pathrelse(path);
--              reiserfs_warning(sb,
--                               "vs-7002: search_by_entry_key: no path to here");
-+              reiserfs_warning(sb, "vs-7002", "no path to here");
-               return IO_ERROR;
-       }
-@@ -300,8 +299,7 @@ static int reiserfs_find_entry(struct in
-                   search_by_entry_key(dir->i_sb, &key_to_search,
-                                       path_to_entry, de);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(dir->i_sb, "zam-7001: io error in %s",
--                                       __func__);
-+                      reiserfs_warning(dir->i_sb, "zam-7001", "io error");
-                       return IO_ERROR;
-               }
-@@ -493,10 +491,9 @@ static int reiserfs_add_entry(struct rei
-               }
-               if (retval != NAME_FOUND) {
--                      reiserfs_warning(dir->i_sb,
--                                       "zam-7002:%s: \"reiserfs_find_entry\" "
--                                       "has returned unexpected value (%d)",
--                                       __func__, retval);
-+                      reiserfs_warning(dir->i_sb, "zam-7002",
-+                                       "reiserfs_find_entry() returned "
-+                                       "unexpected value (%d)", retval);
-               }
-               return -EEXIST;
-@@ -507,8 +504,9 @@ static int reiserfs_add_entry(struct rei
-                               MAX_GENERATION_NUMBER + 1);
-       if (gen_number > MAX_GENERATION_NUMBER) {
-               /* there is no free generation number */
--              reiserfs_warning(dir->i_sb,
--                               "reiserfs_add_entry: Congratulations! we have got hash function screwed up");
-+              reiserfs_warning(dir->i_sb, "reiserfs-7010",
-+                               "Congratulations! we have got hash function "
-+                               "screwed up");
-               if (buffer != small_buf)
-                       kfree(buffer);
-               pathrelse(&path);
-@@ -524,10 +522,9 @@ static int reiserfs_add_entry(struct rei
-       if (gen_number != 0) {  /* we need to re-search for the insertion point */
-               if (search_by_entry_key(dir->i_sb, &entry_key, &path, &de) !=
-                   NAME_NOT_FOUND) {
--                      reiserfs_warning(dir->i_sb,
--                                       "vs-7032: reiserfs_add_entry: "
--                                       "entry with this key (%K) already exists",
--                                       &entry_key);
-+                      reiserfs_warning(dir->i_sb, "vs-7032",
-+                                       "entry with this key (%K) already "
-+                                       "exists", &entry_key);
-                       if (buffer != small_buf)
-                               kfree(buffer);
-@@ -906,8 +903,9 @@ static int reiserfs_rmdir(struct inode *
-               goto end_rmdir;
-       if (inode->i_nlink != 2 && inode->i_nlink != 1)
--              reiserfs_warning(inode->i_sb, "%s: empty directory has nlink "
--                               "!= 2 (%d)", __func__, inode->i_nlink);
-+              reiserfs_warning(inode->i_sb, "reiserfs-7040",
-+                               "empty directory has nlink != 2 (%d)",
-+                               inode->i_nlink);
-       clear_nlink(inode);
-       inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
-@@ -983,10 +981,9 @@ static int reiserfs_unlink(struct inode 
-       }
-       if (!inode->i_nlink) {
--              reiserfs_warning(inode->i_sb, "%s: deleting nonexistent file "
--                               "(%s:%lu), %d", __func__,
--                               reiserfs_bdevname(inode->i_sb), inode->i_ino,
--                               inode->i_nlink);
-+              reiserfs_warning(inode->i_sb, "reiserfs-7042",
-+                               "deleting nonexistent file (%lu), %d",
-+                               inode->i_ino, inode->i_nlink);
-               inode->i_nlink = 1;
-       }
-@@ -1500,8 +1497,8 @@ static int reiserfs_rename(struct inode 
-       if (reiserfs_cut_from_item
-           (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL,
-            0) < 0)
--              reiserfs_warning(old_dir->i_sb,
--                               "vs-7060: reiserfs_rename: couldn't not cut old name. Fsck later?");
-+              reiserfs_warning(old_dir->i_sb, "vs-7060",
-+                               "couldn't not cut old name. Fsck later?");
-       old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;
---- a/fs/reiserfs/objectid.c
-+++ b/fs/reiserfs/objectid.c
-@@ -61,7 +61,7 @@ __u32 reiserfs_get_unused_objectid(struc
-       /* comment needed -Hans */
-       unused_objectid = le32_to_cpu(map[1]);
-       if (unused_objectid == U32_MAX) {
--              reiserfs_warning(s, "%s: no more object ids", __func__);
-+              reiserfs_warning(s, "reiserfs-15100", "no more object ids");
-               reiserfs_restore_prepared_buffer(s, SB_BUFFER_WITH_SB(s));
-               return 0;
-       }
-@@ -160,8 +160,7 @@ void reiserfs_release_objectid(struct re
-               i += 2;
-       }
--      reiserfs_warning(s,
--                       "vs-15011: reiserfs_release_objectid: tried to free free object id (%lu)",
-+      reiserfs_warning(s, "vs-15011", "tried to free free object id (%lu)",
-                        (long unsigned)objectid_to_release);
- }
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -264,14 +264,17 @@ static void prepare_error_buf(const char
-     va_end( args );\
- }
--void reiserfs_warning(struct super_block *sb, const char *fmt, ...)
-+void __reiserfs_warning(struct super_block *sb, const char *id,
-+                       const char *function, const char *fmt, ...)
- {
-       do_reiserfs_warning(fmt);
-       if (sb)
--              printk(KERN_WARNING "REISERFS warning (device %s): %s\n",
--                     sb->s_id, error_buf);
-+              printk(KERN_WARNING "REISERFS warning (device %s): %s%s%s: "
-+                     "%s\n", sb->s_id, id ? id : "", id ? " " : "",
-+                     function, error_buf);
-       else
--              printk(KERN_WARNING "REISERFS warning: %s\n", error_buf);
-+              printk(KERN_WARNING "REISERFS warning: %s%s%s: %s\n",
-+                     id ? id : "", id ? " " : "", function, error_buf);
- }
- /* No newline.. reiserfs_info calls can be followed by printk's */
---- a/fs/reiserfs/procfs.c
-+++ b/fs/reiserfs/procfs.c
-@@ -505,7 +505,7 @@ int reiserfs_proc_info_init(struct super
-               add_file(sb, "journal", show_journal);
-               return 0;
-       }
--      reiserfs_warning(sb, "reiserfs: cannot create /proc/%s/%s",
-+      reiserfs_warning(sb, "cannot create /proc/%s/%s",
-                        proc_info_root_name, b);
-       return 1;
- }
-@@ -561,8 +561,7 @@ int reiserfs_proc_info_global_init(void)
-               if (proc_info_root) {
-                       proc_info_root->owner = THIS_MODULE;
-               } else {
--                      reiserfs_warning(NULL,
--                                       "reiserfs: cannot create /proc/%s",
-+                      reiserfs_warning(NULL, "cannot create /proc/%s",
-                                        proc_info_root_name);
-                       return 1;
-               }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -444,23 +444,24 @@ static int is_leaf(char *buf, int blocks
-       blkh = (struct block_head *)buf;
-       if (blkh_level(blkh) != DISK_LEAF_NODE_LEVEL) {
--              reiserfs_warning(NULL,
--                               "is_leaf: this should be caught earlier");
-+              reiserfs_warning(NULL, "reiserfs-5080",
-+                               "this should be caught earlier");
-               return 0;
-       }
-       nr = blkh_nr_item(blkh);
-       if (nr < 1 || nr > ((blocksize - BLKH_SIZE) / (IH_SIZE + MIN_ITEM_LEN))) {
-               /* item number is too big or too small */
--              reiserfs_warning(NULL, "is_leaf: nr_item seems wrong: %z", bh);
-+              reiserfs_warning(NULL, "reiserfs-5081",
-+                               "nr_item seems wrong: %z", bh);
-               return 0;
-       }
-       ih = (struct item_head *)(buf + BLKH_SIZE) + nr - 1;
-       used_space = BLKH_SIZE + IH_SIZE * nr + (blocksize - ih_location(ih));
-       if (used_space != blocksize - blkh_free_space(blkh)) {
-               /* free space does not match to calculated amount of use space */
--              reiserfs_warning(NULL, "is_leaf: free space seems wrong: %z",
--                               bh);
-+              reiserfs_warning(NULL, "reiserfs-5082",
-+                               "free space seems wrong: %z", bh);
-               return 0;
-       }
-       // FIXME: it is_leaf will hit performance too much - we may have
-@@ -471,29 +472,29 @@ static int is_leaf(char *buf, int blocks
-       prev_location = blocksize;
-       for (i = 0; i < nr; i++, ih++) {
-               if (le_ih_k_type(ih) == TYPE_ANY) {
--                      reiserfs_warning(NULL,
--                                       "is_leaf: wrong item type for item %h",
-+                      reiserfs_warning(NULL, "reiserfs-5083",
-+                                       "wrong item type for item %h",
-                                        ih);
-                       return 0;
-               }
-               if (ih_location(ih) >= blocksize
-                   || ih_location(ih) < IH_SIZE * nr) {
--                      reiserfs_warning(NULL,
--                                       "is_leaf: item location seems wrong: %h",
-+                      reiserfs_warning(NULL, "reiserfs-5084",
-+                                       "item location seems wrong: %h",
-                                        ih);
-                       return 0;
-               }
-               if (ih_item_len(ih) < 1
-                   || ih_item_len(ih) > MAX_ITEM_LEN(blocksize)) {
--                      reiserfs_warning(NULL,
--                                       "is_leaf: item length seems wrong: %h",
-+                      reiserfs_warning(NULL, "reiserfs-5085",
-+                                       "item length seems wrong: %h",
-                                        ih);
-                       return 0;
-               }
-               if (prev_location - ih_location(ih) != ih_item_len(ih)) {
--                      reiserfs_warning(NULL,
--                                       "is_leaf: item location seems wrong (second one): %h",
--                                       ih);
-+                      reiserfs_warning(NULL, "reiserfs-5086",
-+                                       "item location seems wrong "
-+                                       "(second one): %h", ih);
-                       return 0;
-               }
-               prev_location = ih_location(ih);
-@@ -514,24 +515,23 @@ static int is_internal(char *buf, int bl
-       nr = blkh_level(blkh);
-       if (nr <= DISK_LEAF_NODE_LEVEL || nr > MAX_HEIGHT) {
-               /* this level is not possible for internal nodes */
--              reiserfs_warning(NULL,
--                               "is_internal: this should be caught earlier");
-+              reiserfs_warning(NULL, "reiserfs-5087",
-+                               "this should be caught earlier");
-               return 0;
-       }
-       nr = blkh_nr_item(blkh);
-       if (nr > (blocksize - BLKH_SIZE - DC_SIZE) / (KEY_SIZE + DC_SIZE)) {
-               /* for internal which is not root we might check min number of keys */
--              reiserfs_warning(NULL,
--                               "is_internal: number of key seems wrong: %z",
--                               bh);
-+              reiserfs_warning(NULL, "reiserfs-5088",
-+                               "number of key seems wrong: %z", bh);
-               return 0;
-       }
-       used_space = BLKH_SIZE + KEY_SIZE * nr + DC_SIZE * (nr + 1);
-       if (used_space != blocksize - blkh_free_space(blkh)) {
--              reiserfs_warning(NULL,
--                               "is_internal: free space seems wrong: %z", bh);
-+              reiserfs_warning(NULL, "reiserfs-5089",
-+                               "free space seems wrong: %z", bh);
-               return 0;
-       }
-       // one may imagine much more checks
-@@ -543,8 +543,8 @@ static int is_internal(char *buf, int bl
- static int is_tree_node(struct buffer_head *bh, int level)
- {
-       if (B_LEVEL(bh) != level) {
--              reiserfs_warning(NULL,
--                               "is_tree_node: node level %d does not match to the expected one %d",
-+              reiserfs_warning(NULL, "reiserfs-5090", "node level %d does "
-+                               "not match to the expected one %d",
-                                B_LEVEL(bh), level);
-               return 0;
-       }
-@@ -645,9 +645,9 @@ int search_by_key(struct super_block *p_
- #ifdef CONFIG_REISERFS_CHECK
-               if (!(++n_repeat_counter % 50000))
--                      reiserfs_warning(p_s_sb, "PAP-5100: search_by_key: %s:"
--                                       "there were %d iterations of while loop "
--                                       "looking for key %K",
-+                      reiserfs_warning(p_s_sb, "PAP-5100",
-+                                       "%s: there were %d iterations of "
-+                                       "while loop looking for key %K",
-                                        current->comm, n_repeat_counter,
-                                        p_s_key);
- #endif
-@@ -721,9 +721,9 @@ int search_by_key(struct super_block *p_
-               // make sure, that the node contents look like a node of
-               // certain level
-               if (!is_tree_node(p_s_bh, expected_level)) {
--                      reiserfs_warning(p_s_sb, "vs-5150: search_by_key: "
--                                       "invalid format found in block %ld. Fsck?",
--                                       p_s_bh->b_blocknr);
-+                      reiserfs_warning(p_s_sb, "vs-5150",
-+                                       "invalid format found in block %ld. "
-+                                       "Fsck?", p_s_bh->b_blocknr);
-                       pathrelse(p_s_search_path);
-                       return IO_ERROR;
-               }
-@@ -1227,8 +1227,7 @@ int reiserfs_delete_item(struct reiserfs
-               if (n_ret_value == IO_ERROR)
-                       break;
-               if (n_ret_value == FILE_NOT_FOUND) {
--                      reiserfs_warning(p_s_sb,
--                                       "vs-5340: reiserfs_delete_item: "
-+                      reiserfs_warning(p_s_sb, "vs-5340",
-                                        "no items of the file %K found",
-                                        p_s_item_key);
-                       break;
-@@ -1338,10 +1337,9 @@ void reiserfs_delete_solid_item(struct r
-       while (1) {
-               retval = search_item(th->t_super, &cpu_key, &path);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(th->t_super,
--                                       "vs-5350: reiserfs_delete_solid_item: "
--                                       "i/o failure occurred trying to delete %K",
--                                       &cpu_key);
-+                      reiserfs_warning(th->t_super, "vs-5350",
-+                                       "i/o failure occurred trying "
-+                                       "to delete %K", &cpu_key);
-                       break;
-               }
-               if (retval != ITEM_FOUND) {
-@@ -1355,9 +1353,8 @@ void reiserfs_delete_solid_item(struct r
-                            GET_GENERATION_NUMBER(le_key_k_offset
-                                                  (le_key_version(key),
-                                                   key)) == 1))
--                              reiserfs_warning(th->t_super,
--                                               "vs-5355: reiserfs_delete_solid_item: %k not found",
--                                               key);
-+                              reiserfs_warning(th->t_super, "vs-5355",
-+                                               "%k not found", key);
-                       break;
-               }
-               if (!tb_init) {
-@@ -1389,8 +1386,7 @@ void reiserfs_delete_solid_item(struct r
-                       break;
-               }
-               // IO_ERROR, NO_DISK_SPACE, etc
--              reiserfs_warning(th->t_super,
--                               "vs-5360: reiserfs_delete_solid_item: "
-+              reiserfs_warning(th->t_super, "vs-5360",
-                                "could not delete %K due to fix_nodes failure",
-                                &cpu_key);
-               unfix_nodes(&tb);
-@@ -1533,8 +1529,9 @@ static void indirect_to_direct_roll_back
-               set_cpu_key_k_offset(&tail_key,
-                                    cpu_key_k_offset(&tail_key) - removed);
-       }
--      reiserfs_warning(inode->i_sb,
--                       "indirect_to_direct_roll_back: indirect_to_direct conversion has been rolled back due to lack of disk space");
-+      reiserfs_warning(inode->i_sb, "reiserfs-5091", "indirect_to_direct "
-+                       "conversion has been rolled back due to "
-+                       "lack of disk space");
-       //mark_file_without_tail (inode);
-       mark_inode_dirty(inode);
- }
-@@ -1639,8 +1636,7 @@ int reiserfs_cut_from_item(struct reiser
-               if (n_ret_value == POSITION_FOUND)
-                       continue;
--              reiserfs_warning(p_s_sb,
--                               "PAP-5610: reiserfs_cut_from_item: item %K not found",
-+              reiserfs_warning(p_s_sb, "PAP-5610", "item %K not found",
-                                p_s_item_key);
-               unfix_nodes(&s_cut_balance);
-               return (n_ret_value == IO_ERROR) ? -EIO : -ENOENT;
-@@ -1654,7 +1650,8 @@ int reiserfs_cut_from_item(struct reiser
-                       indirect_to_direct_roll_back(th, p_s_inode, p_s_path);
-               }
-               if (n_ret_value == NO_DISK_SPACE)
--                      reiserfs_warning(p_s_sb, "NO_DISK_SPACE");
-+                      reiserfs_warning(p_s_sb, "reiserfs-5092",
-+                                       "NO_DISK_SPACE");
-               unfix_nodes(&s_cut_balance);
-               return -EIO;
-       }
-@@ -1743,8 +1740,7 @@ static void truncate_directory(struct re
- {
-       BUG_ON(!th->t_trans_id);
-       if (inode->i_nlink)
--              reiserfs_warning(inode->i_sb,
--                               "vs-5655: truncate_directory: link count != 0");
-+              reiserfs_warning(inode->i_sb, "vs-5655", "link count != 0");
-       set_le_key_k_offset(KEY_FORMAT_3_5, INODE_PKEY(inode), DOT_OFFSET);
-       set_le_key_k_type(KEY_FORMAT_3_5, INODE_PKEY(inode), TYPE_DIRENTRY);
-@@ -1797,16 +1793,14 @@ int reiserfs_do_truncate(struct reiserfs
-           search_for_position_by_key(p_s_inode->i_sb, &s_item_key,
-                                      &s_search_path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(p_s_inode->i_sb,
--                               "vs-5657: reiserfs_do_truncate: "
-+              reiserfs_warning(p_s_inode->i_sb, "vs-5657",
-                                "i/o failure occurred trying to truncate %K",
-                                &s_item_key);
-               err = -EIO;
-               goto out;
-       }
-       if (retval == POSITION_FOUND || retval == FILE_NOT_FOUND) {
--              reiserfs_warning(p_s_inode->i_sb,
--                               "PAP-5660: reiserfs_do_truncate: "
-+              reiserfs_warning(p_s_inode->i_sb, "PAP-5660",
-                                "wrong result %d of search for %K", retval,
-                                &s_item_key);
-@@ -1850,8 +1844,8 @@ int reiserfs_do_truncate(struct reiserfs
-                   reiserfs_cut_from_item(th, &s_search_path, &s_item_key,
-                                          p_s_inode, page, n_new_file_size);
-               if (n_deleted < 0) {
--                      reiserfs_warning(p_s_inode->i_sb,
--                                       "vs-5665: reiserfs_do_truncate: reiserfs_cut_from_item failed");
-+                      reiserfs_warning(p_s_inode->i_sb, "vs-5665",
-+                                       "reiserfs_cut_from_item failed");
-                       reiserfs_check_path(&s_search_path);
-                       return 0;
-               }
-@@ -2000,8 +1994,8 @@ int reiserfs_paste_into_item(struct reis
-                       goto error_out;
-               }
-               if (retval == POSITION_FOUND) {
--                      reiserfs_warning(inode->i_sb,
--                                       "PAP-5710: reiserfs_paste_into_item: entry or pasted byte (%K) exists",
-+                      reiserfs_warning(inode->i_sb, "PAP-5710",
-+                                       "entry or pasted byte (%K) exists",
-                                        p_s_key);
-                       retval = -EEXIST;
-                       goto error_out;
-@@ -2087,8 +2081,7 @@ int reiserfs_insert_item(struct reiserfs
-                       goto error_out;
-               }
-               if (retval == ITEM_FOUND) {
--                      reiserfs_warning(th->t_super,
--                                       "PAP-5760: reiserfs_insert_item: "
-+                      reiserfs_warning(th->t_super, "PAP-5760",
-                                        "key %K already exists in the tree",
-                                        key);
-                       retval = -EEXIST;
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -181,9 +181,9 @@ static int finish_unfinished(struct supe
-               if (REISERFS_SB(s)->s_qf_names[i]) {
-                       int ret = reiserfs_quota_on_mount(s, i);
-                       if (ret < 0)
--                              reiserfs_warning(s,
--                                               "reiserfs: cannot turn on journaled quota: error %d",
--                                               ret);
-+                              reiserfs_warning(s, "reiserfs-2500",
-+                                               "cannot turn on journaled "
-+                                               "quota: error %d", ret);
-               }
-       }
- #endif
-@@ -193,8 +193,8 @@ static int finish_unfinished(struct supe
-       while (!retval) {
-               retval = search_item(s, &max_cpu_key, &path);
-               if (retval != ITEM_NOT_FOUND) {
--                      reiserfs_warning(s,
--                                       "vs-2140: finish_unfinished: search_by_key returned %d",
-+                      reiserfs_warning(s, "vs-2140",
-+                                       "search_by_key returned %d",
-                                        retval);
-                       break;
-               }
-@@ -202,8 +202,8 @@ static int finish_unfinished(struct supe
-               bh = get_last_bh(&path);
-               item_pos = get_item_pos(&path);
-               if (item_pos != B_NR_ITEMS(bh)) {
--                      reiserfs_warning(s,
--                                       "vs-2060: finish_unfinished: wrong position found");
-+                      reiserfs_warning(s, "vs-2060",
-+                                       "wrong position found");
-                       break;
-               }
-               item_pos--;
-@@ -233,8 +233,7 @@ static int finish_unfinished(struct supe
-               if (!inode) {
-                       /* the unlink almost completed, it just did not manage to remove
-                          "save" link and release objectid */
--                      reiserfs_warning(s,
--                                       "vs-2180: finish_unfinished: iget failed for %K",
-+                      reiserfs_warning(s, "vs-2180", "iget failed for %K",
-                                        &obj_key);
-                       retval = remove_save_link_only(s, &save_link_key, 1);
-                       continue;
-@@ -242,8 +241,8 @@ static int finish_unfinished(struct supe
-               if (!truncate && inode->i_nlink) {
-                       /* file is not unlinked */
--                      reiserfs_warning(s,
--                                       "vs-2185: finish_unfinished: file %K is not unlinked",
-+                      reiserfs_warning(s, "vs-2185",
-+                                       "file %K is not unlinked",
-                                        &obj_key);
-                       retval = remove_save_link_only(s, &save_link_key, 0);
-                       continue;
-@@ -255,8 +254,9 @@ static int finish_unfinished(struct supe
-                          The only imaginable way is to execute unfinished truncate request
-                          then boot into old kernel, remove the file and create dir with
-                          the same key. */
--                      reiserfs_warning(s,
--                                       "green-2101: impossible truncate on a directory %k. Please report",
-+                      reiserfs_warning(s, "green-2101",
-+                                       "impossible truncate on a "
-+                                       "directory %k. Please report",
-                                        INODE_PKEY(inode));
-                       retval = remove_save_link_only(s, &save_link_key, 0);
-                       truncate = 0;
-@@ -286,9 +286,10 @@ static int finish_unfinished(struct supe
-                               /* removal gets completed in iput */
-                               retval = 0;
-                       } else {
--                              reiserfs_warning(s, "Dead loop in "
--                                              "finish_unfinished detected, "
--                                              "just remove save link\n");
-+                              reiserfs_warning(s, "super-2189", "Dead loop "
-+                                               "in finish_unfinished "
-+                                               "detected, just remove "
-+                                               "save link\n");
-                               retval = remove_save_link_only(s,
-                                                       &save_link_key, 0);
-                       }
-@@ -358,8 +359,9 @@ void add_save_link(struct reiserfs_trans
-       } else {
-               /* truncate */
-               if (S_ISDIR(inode->i_mode))
--                      reiserfs_warning(inode->i_sb,
--                                       "green-2102: Adding a truncate savelink for a directory %k! Please report",
-+                      reiserfs_warning(inode->i_sb, "green-2102",
-+                                       "Adding a truncate savelink for "
-+                                       "a directory %k! Please report",
-                                        INODE_PKEY(inode));
-               set_cpu_key_k_offset(&key, 1);
-               set_cpu_key_k_type(&key, TYPE_INDIRECT);
-@@ -374,7 +376,7 @@ void add_save_link(struct reiserfs_trans
-       retval = search_item(inode->i_sb, &key, &path);
-       if (retval != ITEM_NOT_FOUND) {
-               if (retval != -ENOSPC)
--                      reiserfs_warning(inode->i_sb, "vs-2100: add_save_link:"
-+                      reiserfs_warning(inode->i_sb, "vs-2100",
-                                        "search_by_key (%K) returned %d", &key,
-                                        retval);
-               pathrelse(&path);
-@@ -389,9 +391,8 @@ void add_save_link(struct reiserfs_trans
-           reiserfs_insert_item(th, &path, &key, &ih, NULL, (char *)&link);
-       if (retval) {
-               if (retval != -ENOSPC)
--                      reiserfs_warning(inode->i_sb,
--                                       "vs-2120: add_save_link: insert_item returned %d",
--                                       retval);
-+                      reiserfs_warning(inode->i_sb, "vs-2120",
-+                                       "insert_item returned %d", retval);
-       } else {
-               if (truncate)
-                       REISERFS_I(inode)->i_flags |=
-@@ -490,8 +491,7 @@ static void reiserfs_put_super(struct su
-       print_statistics(s);
-       if (REISERFS_SB(s)->reserved_blocks != 0) {
--              reiserfs_warning(s,
--                               "green-2005: reiserfs_put_super: reserved blocks left %d",
-+              reiserfs_warning(s, "green-2005", "reserved blocks left %d",
-                                REISERFS_SB(s)->reserved_blocks);
-       }
-@@ -557,8 +557,8 @@ static void reiserfs_dirty_inode(struct 
-       int err = 0;
-       if (inode->i_sb->s_flags & MS_RDONLY) {
--              reiserfs_warning(inode->i_sb,
--                               "clm-6006: writing inode %lu on readonly FS",
-+              reiserfs_warning(inode->i_sb, "clm-6006",
-+                               "writing inode %lu on readonly FS",
-                                inode->i_ino);
-               return;
-       }
-@@ -790,13 +790,15 @@ static int reiserfs_getopt(struct super_
-                       if (bit_flags) {
-                               if (opt->clrmask ==
-                                   (1 << REISERFS_UNSUPPORTED_OPT))
--                                      reiserfs_warning(s, "%s not supported.",
-+                                      reiserfs_warning(s, "super-6500",
-+                                                       "%s not supported.\n",
-                                                        p);
-                               else
-                                       *bit_flags &= ~opt->clrmask;
-                               if (opt->setmask ==
-                                   (1 << REISERFS_UNSUPPORTED_OPT))
--                                      reiserfs_warning(s, "%s not supported.",
-+                                      reiserfs_warning(s, "super-6501",
-+                                                       "%s not supported.\n",
-                                                        p);
-                               else
-                                       *bit_flags |= opt->setmask;
-@@ -805,7 +807,8 @@ static int reiserfs_getopt(struct super_
-               }
-       }
-       if (!opt->option_name) {
--              reiserfs_warning(s, "unknown mount option \"%s\"", p);
-+              reiserfs_warning(s, "super-6502",
-+                               "unknown mount option \"%s\"", p);
-               return -1;
-       }
-@@ -813,8 +816,9 @@ static int reiserfs_getopt(struct super_
-       switch (*p) {
-       case '=':
-               if (!opt->arg_required) {
--                      reiserfs_warning(s,
--                                       "the option \"%s\" does not require an argument",
-+                      reiserfs_warning(s, "super-6503",
-+                                       "the option \"%s\" does not "
-+                                       "require an argument\n",
-                                        opt->option_name);
-                       return -1;
-               }
-@@ -822,14 +826,15 @@ static int reiserfs_getopt(struct super_
-       case 0:
-               if (opt->arg_required) {
--                      reiserfs_warning(s,
--                                       "the option \"%s\" requires an argument",
--                                       opt->option_name);
-+                      reiserfs_warning(s, "super-6504",
-+                                       "the option \"%s\" requires an "
-+                                       "argument\n", opt->option_name);
-                       return -1;
-               }
-               break;
-       default:
--              reiserfs_warning(s, "head of option \"%s\" is only correct",
-+              reiserfs_warning(s, "super-6505",
-+                               "head of option \"%s\" is only correct\n",
-                                opt->option_name);
-               return -1;
-       }
-@@ -841,7 +846,8 @@ static int reiserfs_getopt(struct super_
-           && !(opt->arg_required & (1 << REISERFS_OPT_ALLOWEMPTY))
-           && !strlen(p)) {
-               /* this catches "option=," if not allowed */
--              reiserfs_warning(s, "empty argument for \"%s\"",
-+              reiserfs_warning(s, "super-6506",
-+                               "empty argument for \"%s\"\n",
-                                opt->option_name);
-               return -1;
-       }
-@@ -863,7 +869,8 @@ static int reiserfs_getopt(struct super_
-               }
-       }
--      reiserfs_warning(s, "bad value \"%s\" for option \"%s\"", p,
-+      reiserfs_warning(s, "super-6506",
-+                       "bad value \"%s\" for option \"%s\"\n", p,
-                        opt->option_name);
-       return -1;
- }
-@@ -953,9 +960,9 @@ static int reiserfs_parse_options(struct
-                               *blocks = simple_strtoul(arg, &p, 0);
-                               if (*p != '\0') {
-                                       /* NNN does not look like a number */
--                                      reiserfs_warning(s,
--                                                       "reiserfs_parse_options: bad value %s",
--                                                       arg);
-+                                      reiserfs_warning(s, "super-6507",
-+                                                       "bad value %s for "
-+                                                       "-oresize\n", arg);
-                                       return 0;
-                               }
-                       }
-@@ -966,8 +973,8 @@ static int reiserfs_parse_options(struct
-                       unsigned long val = simple_strtoul(arg, &p, 0);
-                       /* commit=NNN (time in seconds) */
-                       if (*p != '\0' || val >= (unsigned int)-1) {
--                              reiserfs_warning(s,
--                                               "reiserfs_parse_options: bad value %s",
-+                              reiserfs_warning(s, "super-6508",
-+                                               "bad value %s for -ocommit\n",
-                                                arg);
-                               return 0;
-                       }
-@@ -975,16 +982,18 @@ static int reiserfs_parse_options(struct
-               }
-               if (c == 'w') {
--                      reiserfs_warning(s, "reiserfs: nolargeio option is no longer supported");
-+                      reiserfs_warning(s, "super-6509", "nolargeio option "
-+                                       "is no longer supported");
-                       return 0;
-               }
-               if (c == 'j') {
-                       if (arg && *arg && jdev_name) {
-                               if (*jdev_name) {       //Hm, already assigned?
--                                      reiserfs_warning(s,
--                                                       "reiserfs_parse_options: journal device was already  specified to be %s",
--                                                       *jdev_name);
-+                                      reiserfs_warning(s, "super-6510",
-+                                                       "journal device was "
-+                                                       "already specified to "
-+                                                       "be %s", *jdev_name);
-                                       return 0;
-                               }
-                               *jdev_name = arg;
-@@ -997,29 +1006,35 @@ static int reiserfs_parse_options(struct
-                       if ((sb_any_quota_enabled(s) ||
-                            sb_any_quota_suspended(s)) &&
-                           (!*arg != !REISERFS_SB(s)->s_qf_names[qtype])) {
--                              reiserfs_warning(s,
--                                               "reiserfs_parse_options: cannot change journaled quota options when quota turned on.");
-+                              reiserfs_warning(s, "super-6511",
-+                                               "cannot change journaled "
-+                                               "quota options when quota "
-+                                               "turned on.");
-                               return 0;
-                       }
-                       if (*arg) {     /* Some filename specified? */
-                               if (REISERFS_SB(s)->s_qf_names[qtype]
-                                   && strcmp(REISERFS_SB(s)->s_qf_names[qtype],
-                                             arg)) {
--                                      reiserfs_warning(s,
--                                                       "reiserfs_parse_options: %s quota file already specified.",
-+                                      reiserfs_warning(s, "super-6512",
-+                                                       "%s quota file "
-+                                                       "already specified.",
-                                                        QTYPE2NAME(qtype));
-                                       return 0;
-                               }
-                               if (strchr(arg, '/')) {
--                                      reiserfs_warning(s,
--                                                       "reiserfs_parse_options: quotafile must be on filesystem root.");
-+                                      reiserfs_warning(s, "super-6513",
-+                                                       "quotafile must be "
-+                                                       "on filesystem root.");
-                                       return 0;
-                               }
-                               qf_names[qtype] =
-                                   kmalloc(strlen(arg) + 1, GFP_KERNEL);
-                               if (!qf_names[qtype]) {
--                                      reiserfs_warning(s,
--                                                       "reiserfs_parse_options: not enough memory for storing quotafile name.");
-+                                      reiserfs_warning(s, "reiserfs-2502",
-+                                                       "not enough memory "
-+                                                       "for storing "
-+                                                       "quotafile name.");
-                                       return 0;
-                               }
-                               strcpy(qf_names[qtype], arg);
-@@ -1037,22 +1052,25 @@ static int reiserfs_parse_options(struct
-                       else if (!strcmp(arg, "vfsv0"))
-                               *qfmt = QFMT_VFS_V0;
-                       else {
--                              reiserfs_warning(s,
--                                               "reiserfs_parse_options: unknown quota format specified.");
-+                              reiserfs_warning(s, "super-6514",
-+                                               "unknown quota format "
-+                                               "specified.");
-                               return 0;
-                       }
-                       if ((sb_any_quota_enabled(s) ||
-                            sb_any_quota_suspended(s)) &&
-                           *qfmt != REISERFS_SB(s)->s_jquota_fmt) {
--                              reiserfs_warning(s,
--                                               "reiserfs_parse_options: cannot change journaled quota options when quota turned on.");
-+                              reiserfs_warning(s, "super-6515",
-+                                               "cannot change journaled "
-+                                               "quota options when quota "
-+                                               "turned on.");
-                               return 0;
-                       }
-               }
- #else
-               if (c == 'u' || c == 'g' || c == 'f') {
--                      reiserfs_warning(s,
--                                       "reiserfs_parse_options: journaled quota options not supported.");
-+                      reiserfs_warning(s, "reiserfs-2503", "journaled "
-+                                       "quota options not supported.");
-                       return 0;
-               }
- #endif
-@@ -1061,15 +1079,15 @@ static int reiserfs_parse_options(struct
- #ifdef CONFIG_QUOTA
-       if (!REISERFS_SB(s)->s_jquota_fmt && !*qfmt
-           && (qf_names[USRQUOTA] || qf_names[GRPQUOTA])) {
--              reiserfs_warning(s,
--                               "reiserfs_parse_options: journaled quota format not specified.");
-+              reiserfs_warning(s, "super-6515",
-+                               "journaled quota format not specified.");
-               return 0;
-       }
-       /* This checking is not precise wrt the quota type but for our purposes it is sufficient */
-       if (!(*mount_options & (1 << REISERFS_QUOTA))
-           && sb_any_quota_enabled(s)) {
--              reiserfs_warning(s,
--                               "reiserfs_parse_options: quota options must be present when quota is turned on.");
-+              reiserfs_warning(s, "super-6516", "quota options must "
-+                               "be present when quota is turned on.");
-               return 0;
-       }
- #endif
-@@ -1129,14 +1147,15 @@ static void handle_attrs(struct super_bl
-       if (reiserfs_attrs(s)) {
-               if (old_format_only(s)) {
--                      reiserfs_warning(s,
--                                       "reiserfs: cannot support attributes on 3.5.x disk format");
-+                      reiserfs_warning(s, "super-6517", "cannot support "
-+                                       "attributes on 3.5.x disk format");
-                       REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_ATTRS);
-                       return;
-               }
-               if (!(le32_to_cpu(rs->s_flags) & reiserfs_attrs_cleared)) {
--                      reiserfs_warning(s,
--                                       "reiserfs: cannot support attributes until flag is set in super-block");
-+                      reiserfs_warning(s, "super-6518", "cannot support "
-+                                       "attributes until flag is set in "
-+                                       "super-block");
-                       REISERFS_SB(s)->s_mount_opt &= ~(1 << REISERFS_ATTRS);
-               }
-       }
-@@ -1314,7 +1333,7 @@ static int read_super_block(struct super
-       bh = sb_bread(s, offset / s->s_blocksize);
-       if (!bh) {
--              reiserfs_warning(s, "sh-2006: read_super_block: "
-+              reiserfs_warning(s, "sh-2006",
-                                "bread failed (dev %s, block %lu, size %lu)",
-                                reiserfs_bdevname(s), offset / s->s_blocksize,
-                                s->s_blocksize);
-@@ -1335,8 +1354,8 @@ static int read_super_block(struct super
-       bh = sb_bread(s, offset / s->s_blocksize);
-       if (!bh) {
--              reiserfs_warning(s, "sh-2007: read_super_block: "
--                               "bread failed (dev %s, block %lu, size %lu)\n",
-+              reiserfs_warning(s, "sh-2007",
-+                               "bread failed (dev %s, block %lu, size %lu)",
-                                reiserfs_bdevname(s), offset / s->s_blocksize,
-                                s->s_blocksize);
-               return 1;
-@@ -1344,8 +1363,8 @@ static int read_super_block(struct super
-       rs = (struct reiserfs_super_block *)bh->b_data;
-       if (sb_blocksize(rs) != s->s_blocksize) {
--              reiserfs_warning(s, "sh-2011: read_super_block: "
--                               "can't find a reiserfs filesystem on (dev %s, block %Lu, size %lu)\n",
-+              reiserfs_warning(s, "sh-2011", "can't find a reiserfs "
-+                               "filesystem on (dev %s, block %Lu, size %lu)",
-                                reiserfs_bdevname(s),
-                                (unsigned long long)bh->b_blocknr,
-                                s->s_blocksize);
-@@ -1355,9 +1374,10 @@ static int read_super_block(struct super
-       if (rs->s_v1.s_root_block == cpu_to_le32(-1)) {
-               brelse(bh);
--              reiserfs_warning(s,
--                               "Unfinished reiserfsck --rebuild-tree run detected. Please run\n"
--                               "reiserfsck --rebuild-tree and wait for a completion. If that fails\n"
-+              reiserfs_warning(s, "super-6519", "Unfinished reiserfsck "
-+                               "--rebuild-tree run detected. Please run\n"
-+                               "reiserfsck --rebuild-tree and wait for a "
-+                               "completion. If that fails\n"
-                                "get newer reiserfsprogs package");
-               return 1;
-       }
-@@ -1375,10 +1395,9 @@ static int read_super_block(struct super
-                       reiserfs_info(s, "found reiserfs format \"3.5\""
-                                     " with non-standard journal\n");
-               else {
--                      reiserfs_warning(s,
--                                       "sh-2012: read_super_block: found unknown "
--                                       "format \"%u\" of reiserfs with non-standard magic",
--                                       sb_version(rs));
-+                      reiserfs_warning(s, "sh-2012", "found unknown "
-+                                       "format \"%u\" of reiserfs with "
-+                                       "non-standard magic", sb_version(rs));
-                       return 1;
-               }
-       } else
-@@ -1408,8 +1427,7 @@ static int reread_meta_blocks(struct sup
-       ll_rw_block(READ, 1, &(SB_BUFFER_WITH_SB(s)));
-       wait_on_buffer(SB_BUFFER_WITH_SB(s));
-       if (!buffer_uptodate(SB_BUFFER_WITH_SB(s))) {
--              reiserfs_warning(s,
--                               "reread_meta_blocks, error reading the super");
-+              reiserfs_warning(s, "reiserfs-2504", "error reading the super");
-               return 1;
-       }
-@@ -1473,10 +1491,10 @@ static __u32 find_hash_out(struct super_
-                       && (yurahash ==
-                           GET_HASH_VALUE(deh_offset
-                                          (&(de.de_deh[de.de_entry_num])))))) {
--                      reiserfs_warning(s,
--                                       "Unable to automatically detect hash function. "
--                                       "Please mount with -o hash={tea,rupasov,r5}",
--                                       reiserfs_bdevname(s));
-+                      reiserfs_warning(s, "reiserfs-2506", "Unable to "
-+                                       "automatically detect hash function. "
-+                                       "Please mount with -o "
-+                                       "hash={tea,rupasov,r5}");
-                       hash = UNSET_HASH;
-                       break;
-               }
-@@ -1490,7 +1508,8 @@ static __u32 find_hash_out(struct super_
-                        (deh_offset(&(de.de_deh[de.de_entry_num]))) == r5hash)
-                       hash = R5_HASH;
-               else {
--                      reiserfs_warning(s, "Unrecognised hash function");
-+                      reiserfs_warning(s, "reiserfs-2506",
-+                                       "Unrecognised hash function");
-                       hash = UNSET_HASH;
-               }
-       } while (0);
-@@ -1518,17 +1537,20 @@ static int what_hash(struct super_block 
-                ** mount options 
-                */
-               if (reiserfs_rupasov_hash(s) && code != YURA_HASH) {
--                      reiserfs_warning(s, "Error, %s hash detected, "
-+                      reiserfs_warning(s, "reiserfs-2507",
-+                                       "Error, %s hash detected, "
-                                        "unable to force rupasov hash",
-                                        reiserfs_hashname(code));
-                       code = UNSET_HASH;
-               } else if (reiserfs_tea_hash(s) && code != TEA_HASH) {
--                      reiserfs_warning(s, "Error, %s hash detected, "
-+                      reiserfs_warning(s, "reiserfs-2508",
-+                                       "Error, %s hash detected, "
-                                        "unable to force tea hash",
-                                        reiserfs_hashname(code));
-                       code = UNSET_HASH;
-               } else if (reiserfs_r5_hash(s) && code != R5_HASH) {
--                      reiserfs_warning(s, "Error, %s hash detected, "
-+                      reiserfs_warning(s, "reiserfs-2509",
-+                                       "Error, %s hash detected, "
-                                        "unable to force r5 hash",
-                                        reiserfs_hashname(code));
-                       code = UNSET_HASH;
-@@ -1587,9 +1609,9 @@ static int function2code(hashf_t func)
-       return 0;
- }
--#define SWARN(silent, s, ...)                 \
-+#define SWARN(silent, s, id, ...)                     \
-       if (!(silent))                          \
--              reiserfs_warning (s, __VA_ARGS__)
-+              reiserfs_warning(s, id, __VA_ARGS__)
- static int reiserfs_fill_super(struct super_block *s, void *data, int silent)
- {
-@@ -1641,8 +1663,7 @@ static int reiserfs_fill_super(struct su
- #endif
-       if (blocks) {
--              SWARN(silent, s, "jmacd-7: reiserfs_fill_super: resize option "
--                    "for remount only");
-+              SWARN(silent, s, "jmacd-7", "resize option for remount only");
-               goto error;
-       }
-@@ -1651,8 +1672,7 @@ static int reiserfs_fill_super(struct su
-               old_format = 1;
-       /* try new format (64-th 1k block), which can contain reiserfs super block */
-       else if (read_super_block(s, REISERFS_DISK_OFFSET_IN_BYTES)) {
--              SWARN(silent, s,
--                    "sh-2021: reiserfs_fill_super: can not find reiserfs on %s",
-+              SWARN(silent, s, "sh-2021", "can not find reiserfs on %s",
-                     reiserfs_bdevname(s));
-               goto error;
-       }
-@@ -1664,13 +1684,12 @@ static int reiserfs_fill_super(struct su
-       if (s->s_bdev && s->s_bdev->bd_inode
-           && i_size_read(s->s_bdev->bd_inode) <
-           sb_block_count(rs) * sb_blocksize(rs)) {
--              SWARN(silent, s,
--                    "Filesystem on %s cannot be mounted because it is bigger than the device",
--                    reiserfs_bdevname(s));
--              SWARN(silent, s,
--                    "You may need to run fsck or increase size of your LVM partition");
--              SWARN(silent, s,
--                    "Or may be you forgot to reboot after fdisk when it told you to");
-+              SWARN(silent, s, "", "Filesystem cannot be "
-+                    "mounted because it is bigger than the device");
-+              SWARN(silent, s, "", "You may need to run fsck "
-+                    "or increase size of your LVM partition");
-+              SWARN(silent, s, "", "Or may be you forgot to "
-+                    "reboot after fdisk when it told you to");
-               goto error;
-       }
-@@ -1678,14 +1697,13 @@ static int reiserfs_fill_super(struct su
-       sbi->s_mount_state = REISERFS_VALID_FS;
-       if ((errval = reiserfs_init_bitmap_cache(s))) {
--              SWARN(silent, s,
--                    "jmacd-8: reiserfs_fill_super: unable to read bitmap");
-+              SWARN(silent, s, "jmacd-8", "unable to read bitmap");
-               goto error;
-       }
-       errval = -EINVAL;
- #ifdef CONFIG_REISERFS_CHECK
--      SWARN(silent, s, "CONFIG_REISERFS_CHECK is set ON");
--      SWARN(silent, s, "- it is slow mode for debugging.");
-+      SWARN(silent, s, "", "CONFIG_REISERFS_CHECK is set ON");
-+      SWARN(silent, s, "", "- it is slow mode for debugging.");
- #endif
-       /* make data=ordered the default */
-@@ -1706,8 +1724,8 @@ static int reiserfs_fill_super(struct su
-       }
-       // set_device_ro(s->s_dev, 1) ;
-       if (journal_init(s, jdev_name, old_format, commit_max_age)) {
--              SWARN(silent, s,
--                    "sh-2022: reiserfs_fill_super: unable to initialize journal space");
-+              SWARN(silent, s, "sh-2022",
-+                    "unable to initialize journal space");
-               goto error;
-       } else {
-               jinit_done = 1; /* once this is set, journal_release must be called
-@@ -1715,8 +1733,8 @@ static int reiserfs_fill_super(struct su
-                                */
-       }
-       if (reread_meta_blocks(s)) {
--              SWARN(silent, s,
--                    "jmacd-9: reiserfs_fill_super: unable to reread meta blocks after journal init");
-+              SWARN(silent, s, "jmacd-9",
-+                    "unable to reread meta blocks after journal init");
-               goto error;
-       }
-@@ -1724,8 +1742,8 @@ static int reiserfs_fill_super(struct su
-               goto error;
-       if (bdev_read_only(s->s_bdev) && !(s->s_flags & MS_RDONLY)) {
--              SWARN(silent, s,
--                    "clm-7000: Detected readonly device, marking FS readonly");
-+              SWARN(silent, s, "clm-7000",
-+                    "Detected readonly device, marking FS readonly");
-               s->s_flags |= MS_RDONLY;
-       }
-       args.objectid = REISERFS_ROOT_OBJECTID;
-@@ -1734,8 +1752,7 @@ static int reiserfs_fill_super(struct su
-           iget5_locked(s, REISERFS_ROOT_OBJECTID, reiserfs_find_actor,
-                        reiserfs_init_locked_inode, (void *)(&args));
-       if (!root_inode) {
--              SWARN(silent, s,
--                    "jmacd-10: reiserfs_fill_super: get root inode failed");
-+              SWARN(silent, s, "jmacd-10", "get root inode failed");
-               goto error;
-       }
-@@ -1784,7 +1801,7 @@ static int reiserfs_fill_super(struct su
-                * avoiding corruption. -jeffm */
-               if (bmap_would_wrap(reiserfs_bmap_count(s)) &&
-                   sb_bmap_nr(rs) != 0) {
--                      reiserfs_warning(s, "super-2030: This file system "
-+                      reiserfs_warning(s, "super-2030", "This file system "
-                                       "claims to use %u bitmap blocks in "
-                                       "its super block, but requires %u. "
-                                       "Clearing to zero.", sb_bmap_nr(rs),
-@@ -2085,8 +2102,8 @@ static int reiserfs_quota_on(struct supe
-       if (!(REISERFS_I(inode)->i_flags & i_nopack_mask)) {
-               err = reiserfs_unpack(inode, NULL);
-               if (err) {
--                      reiserfs_warning(sb,
--                              "reiserfs: Unpacking tail of quota file failed"
-+                      reiserfs_warning(sb, "super-6520",
-+                              "Unpacking tail of quota file failed"
-                               " (%d). Cannot turn on quotas.", err);
-                       err = -EINVAL;
-                       goto out;
-@@ -2097,8 +2114,8 @@ static int reiserfs_quota_on(struct supe
-       if (REISERFS_SB(sb)->s_qf_names[type]) {
-               /* Quotafile not of fs root? */
-               if (nd.path.dentry->d_parent->d_inode != sb->s_root->d_inode)
--                      reiserfs_warning(sb,
--                               "reiserfs: Quota file not on filesystem root. "
-+                      reiserfs_warning(sb, "super-6521",
-+                               "Quota file not on filesystem root. "
-                                "Journalled quota will not work.");
-       }
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -48,9 +48,9 @@ int direct2indirect(struct reiserfs_tran
-       // FIXME: we could avoid this 
-       if (search_for_position_by_key(sb, &end_key, path) == POSITION_FOUND) {
--              reiserfs_warning(sb, "PAP-14030: direct2indirect: "
--                               "pasted or inserted byte exists in the tree %K. "
--                               "Use fsck to repair.", &end_key);
-+              reiserfs_warning(sb, "PAP-14030",
-+                               "pasted or inserted byte exists in "
-+                               "the tree %K. Use fsck to repair.", &end_key);
-               pathrelse(path);
-               return -EIO;
-       }
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -259,7 +259,8 @@ static int __xattr_readdir(struct inode 
-               ih = de.de_ih;
-               if (!is_direntry_le_ih(ih)) {
--                      reiserfs_warning(inode->i_sb, "not direntry %h", ih);
-+                      reiserfs_warning(inode->i_sb, "jdm-20000",
-+                                       "not direntry %h", ih);
-                       break;
-               }
-               copy_item_head(&tmp_ih, ih);
-@@ -598,7 +599,7 @@ reiserfs_xattr_get(const struct inode *i
-                       if (rxh->h_magic != cpu_to_le32(REISERFS_XATTR_MAGIC)) {
-                               unlock_page(page);
-                               reiserfs_put_page(page);
--                              reiserfs_warning(inode->i_sb,
-+                              reiserfs_warning(inode->i_sb, "jdm-20001",
-                                                "Invalid magic for xattr (%s) "
-                                                "associated with %k", name,
-                                                INODE_PKEY(inode));
-@@ -618,7 +619,7 @@ reiserfs_xattr_get(const struct inode *i
-       if (xattr_hash(buffer, isize - sizeof(struct reiserfs_xattr_header)) !=
-           hash) {
--              reiserfs_warning(inode->i_sb,
-+              reiserfs_warning(inode->i_sb, "jdm-20002",
-                                "Invalid hash for xattr (%s) associated "
-                                "with %k", name, INODE_PKEY(inode));
-               err = -EIO;
-@@ -652,7 +653,8 @@ __reiserfs_xattr_del(struct dentry *xadi
-               goto out_file;
-       if (!is_reiserfs_priv_object(dentry->d_inode)) {
--              reiserfs_warning(dir->i_sb, "OID %08x [%.*s/%.*s] doesn't have "
-+              reiserfs_warning(dir->i_sb, "jdm-20003",
-+                               "OID %08x [%.*s/%.*s] doesn't have "
-                                "priv flag set [parent is %sset].",
-                                le32_to_cpu(INODE_PKEY(dentry->d_inode)->
-                                            k_objectid), xadir->d_name.len,
-@@ -750,7 +752,7 @@ int reiserfs_delete_xattrs(struct inode 
-               reiserfs_write_unlock_xattrs(inode->i_sb);
-               dput(root);
-       } else {
--              reiserfs_warning(inode->i_sb,
-+              reiserfs_warning(inode->i_sb, "jdm-20006",
-                                "Couldn't remove all entries in directory");
-       }
-       unlock_kernel();
-@@ -1154,7 +1156,8 @@ int reiserfs_xattr_init(struct super_blo
-       } else if (reiserfs_xattrs_optional(s)) {
-               /* Old format filesystem, but optional xattrs have been enabled
-                * at mount time. Error out. */
--              reiserfs_warning(s, "xattrs/ACLs not supported on pre v3.6 "
-+              reiserfs_warning(s, "jdm-20005",
-+                               "xattrs/ACLs not supported on pre v3.6 "
-                                "format filesystem. Failing mount.");
-               err = -EOPNOTSUPP;
-               goto error;
-@@ -1201,8 +1204,10 @@ int reiserfs_xattr_init(struct super_blo
-                       /* If we're read-only it just means that the dir hasn't been
-                        * created. Not an error -- just no xattrs on the fs. We'll
-                        * check again if we go read-write */
--                      reiserfs_warning(s, "xattrs/ACLs enabled and couldn't "
--                                       "find/create .reiserfs_priv. Failing mount.");
-+                      reiserfs_warning(s, "jdm-20006",
-+                                       "xattrs/ACLs enabled and couldn't "
-+                                       "find/create .reiserfs_priv. "
-+                                       "Failing mount.");
-                       err = -EOPNOTSUPP;
-               }
-       }
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -79,7 +79,10 @@ struct fid;
- */
- #define REISERFS_DEBUG_CODE 5 /* extra messages to help find/debug errors */
--void reiserfs_warning(struct super_block *s, const char *fmt, ...);
-+void __reiserfs_warning(struct super_block *s, const char *id,
-+                       const char *func, const char *fmt, ...);
-+#define reiserfs_warning(s, id, fmt, args...) \
-+       __reiserfs_warning(s, id, __func__, fmt, ##args)
- /* assertions handling */
- /** always check a condition and panic if it's false. */
-@@ -558,7 +561,7 @@ static inline int uniqueness2type(__u32 
-       case V1_DIRENTRY_UNIQUENESS:
-               return TYPE_DIRENTRY;
-       default:
--              reiserfs_warning(NULL, "vs-500: unknown uniqueness %d",
-+              reiserfs_warning(NULL, "vs-500", "unknown uniqueness %d",
-                                uniqueness);
-       case V1_ANY_UNIQUENESS:
-               return TYPE_ANY;
-@@ -578,7 +581,7 @@ static inline __u32 type2uniqueness(int 
-       case TYPE_DIRENTRY:
-               return V1_DIRENTRY_UNIQUENESS;
-       default:
--              reiserfs_warning(NULL, "vs-501: unknown type %d", type);
-+              reiserfs_warning(NULL, "vs-501", "unknown type %d", type);
-       case TYPE_ANY:
-               return V1_ANY_UNIQUENESS;
-       }
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_info.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_info.diff
deleted file mode 100644 (file)
index 8992e1b..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: make some warnings informational
-
- In several places, reiserfs_warning is used when there is no warning, just
- a notice. This patch changes some of them to indicate that the message
- is merely informational.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/bitmap.c |    6 +++---
- fs/reiserfs/super.c  |   14 ++++++--------
- fs/reiserfs/xattr.c  |   10 ++++------
- 3 files changed, 13 insertions(+), 17 deletions(-)
-
---- a/fs/reiserfs/bitmap.c
-+++ b/fs/reiserfs/bitmap.c
-@@ -40,8 +40,8 @@
- #define SET_OPTION(optname) \
-    do { \
--        reiserfs_warning(s, "reiserfs: option \"%s\" is set", #optname); \
--        set_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s)); \
-+      reiserfs_info(s, "block allocator option \"%s\" is set", #optname); \
-+      set_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s)); \
-     } while(0)
- #define TEST_OPTION(optname, s) \
-     test_bit(_ALLOC_ ## optname , &SB_ALLOC_OPTS(s))
-@@ -636,7 +636,7 @@ int reiserfs_parse_alloc_options(struct 
-               return 1;
-       }
--      reiserfs_warning(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
-+      reiserfs_info(s, "allocator options = [%08x]\n", SB_ALLOC_OPTS(s));
-       return 0;
- }
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -1369,13 +1369,11 @@ static int read_super_block(struct super
-               /* magic is of non-standard journal filesystem, look at s_version to
-                  find which format is in use */
-               if (sb_version(rs) == REISERFS_VERSION_2)
--                      reiserfs_warning(s,
--                                       "read_super_block: found reiserfs format \"3.6\""
--                                       " with non-standard journal");
-+                      reiserfs_info(s, "found reiserfs format \"3.6\""
-+                                    " with non-standard journal\n");
-               else if (sb_version(rs) == REISERFS_VERSION_1)
--                      reiserfs_warning(s,
--                                       "read_super_block: found reiserfs format \"3.5\""
--                                       " with non-standard journal");
-+                      reiserfs_info(s, "found reiserfs format \"3.5\""
-+                                    " with non-standard journal\n");
-               else {
-                       reiserfs_warning(s,
-                                        "sh-2012: read_super_block: found unknown "
-@@ -1454,8 +1452,8 @@ static __u32 find_hash_out(struct super_
-                       if (reiserfs_rupasov_hash(s)) {
-                               hash = YURA_HASH;
-                       }
--                      reiserfs_warning(s, "FS seems to be empty, autodetect "
--                                       "is using the default hash");
-+                      reiserfs_info(s, "FS seems to be empty, autodetect "
-+                                       "is using the default hash\n");
-                       break;
-               }
-               r5hash = GET_HASH_VALUE(r5_hash(de.de_name, de.de_namelen));
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -1182,12 +1182,10 @@ int reiserfs_xattr_init(struct super_blo
-                               }
-                               if (dentry && dentry->d_inode)
--                                      reiserfs_warning(s,
--                                                       "Created %s on %s - reserved for "
--                                                       "xattr storage.",
--                                                       PRIVROOT_NAME,
--                                                       reiserfs_bdevname
--                                                       (inode->i_sb));
-+                                      reiserfs_info(s, "Created %s - "
-+                                                    "reserved for xattr "
-+                                                    "storage.\n",
-+                                                    PRIVROOT_NAME);
-                       } else if (!dentry->d_inode) {
-                               dput(dentry);
-                               dentry = NULL;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_panic.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-reiserfs_panic.diff
deleted file mode 100644 (file)
index 482b43a..0000000
+++ /dev/null
@@ -1,970 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rework reiserfs_panic
-
- ReiserFS panics can be somewhat inconsistent.
- In some cases:
- * a unique identifier may be associated with it
- * the function name may be included
- * the device may be printed separately
-
- This patch aims to make warnings more consistent. reiserfs_warning() prints
- the device name, so printing it a second time is not required. The function
- name for a warning is always helpful in debugging, so it is now automatically
- inserted into the output. Hans has stated that every warning should have
- a unique identifier. Some cases lack them, others really shouldn't have them.
- reiserfs_warning() now expects an id associated with each message. In the
- rare case where one isn't needed, "" will suffice.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/do_balan.c        |   67 +++++++++++++++++++++--------------------
- fs/reiserfs/fix_node.c        |   68 +++++++++++++++++++++---------------------
- fs/reiserfs/ibalance.c        |   12 +++----
- fs/reiserfs/inode.c           |    3 -
- fs/reiserfs/item_ops.c        |    8 +++-
- fs/reiserfs/journal.c         |   57 +++++++++++++++++------------------
- fs/reiserfs/lbalance.c        |   27 +++++++++-------
- fs/reiserfs/namei.c           |   18 ++++-------
- fs/reiserfs/objectid.c        |    3 -
- fs/reiserfs/prints.c          |   33 +++++++++-----------
- fs/reiserfs/stree.c           |   49 ++++++++++++++----------------
- fs/reiserfs/tail_conversion.c |   10 ++----
- include/linux/reiserfs_fs.h   |   28 +++++++++++++----
- 13 files changed, 200 insertions(+), 183 deletions(-)
-
---- a/fs/reiserfs/do_balan.c
-+++ b/fs/reiserfs/do_balan.c
-@@ -153,8 +153,8 @@ static int balance_leaf_when_delete(stru
-       default:
-               print_cur_tb("12040");
--              reiserfs_panic(tb->tb_sb,
--                             "PAP-12040: balance_leaf_when_delete: unexpectable mode: %s(%d)",
-+              reiserfs_panic(tb->tb_sb, "PAP-12040",
-+                             "unexpected mode: %s(%d)",
-                              (flag ==
-                               M_PASTE) ? "PASTE" : ((flag ==
-                                                      M_INSERT) ? "INSERT" :
-@@ -721,8 +721,9 @@ static int balance_leaf(struct tree_bala
-                               }
-                               break;
-                       default:        /* cases d and t */
--                              reiserfs_panic(tb->tb_sb,
--                                             "PAP-12130: balance_leaf: lnum > 0: unexpectable mode: %s(%d)",
-+                              reiserfs_panic(tb->tb_sb, "PAP-12130",
-+                                             "lnum > 0: unexpected mode: "
-+                                             " %s(%d)",
-                                              (flag ==
-                                               M_DELETE) ? "DELETE" : ((flag ==
-                                                                        M_CUT)
-@@ -1134,8 +1135,8 @@ static int balance_leaf(struct tree_bala
-                       }
-                       break;
-               default:        /* cases d and t */
--                      reiserfs_panic(tb->tb_sb,
--                                     "PAP-12175: balance_leaf: rnum > 0: unexpectable mode: %s(%d)",
-+                      reiserfs_panic(tb->tb_sb, "PAP-12175",
-+                                     "rnum > 0: unexpected mode: %s(%d)",
-                                      (flag ==
-                                       M_DELETE) ? "DELETE" : ((flag ==
-                                                                M_CUT) ? "CUT"
-@@ -1165,8 +1166,8 @@ static int balance_leaf(struct tree_bala
-                  not set correctly */
-               if (tb->CFL[0]) {
-                       if (!tb->CFR[0])
--                              reiserfs_panic(tb->tb_sb,
--                                             "vs-12195: balance_leaf: CFR not initialized");
-+                              reiserfs_panic(tb->tb_sb, "vs-12195",
-+                                             "CFR not initialized");
-                       copy_key(B_N_PDELIM_KEY(tb->CFL[0], tb->lkey[0]),
-                                B_N_PDELIM_KEY(tb->CFR[0], tb->rkey[0]));
-                       do_balance_mark_internal_dirty(tb, tb->CFL[0], 0);
-@@ -1472,7 +1473,10 @@ static int balance_leaf(struct tree_bala
-                                           && (pos_in_item != ih_item_len(ih_check)
-                                               || tb->insert_size[0] <= 0))
-                                               reiserfs_panic(tb->tb_sb,
--                                                             "PAP-12235: balance_leaf: pos_in_item must be equal to ih_item_len");
-+                                                           "PAP-12235",
-+                                                           "pos_in_item "
-+                                                           "must be equal "
-+                                                           "to ih_item_len");
- #endif                                /* CONFIG_REISERFS_CHECK */
-                                       leaf_mi =
-@@ -1532,8 +1536,8 @@ static int balance_leaf(struct tree_bala
-                       }
-                       break;
-               default:        /* cases d and t */
--                      reiserfs_panic(tb->tb_sb,
--                                     "PAP-12245: balance_leaf: blknum > 2: unexpectable mode: %s(%d)",
-+                      reiserfs_panic(tb->tb_sb, "PAP-12245",
-+                                     "blknum > 2: unexpected mode: %s(%d)",
-                                      (flag ==
-                                       M_DELETE) ? "DELETE" : ((flag ==
-                                                                M_CUT) ? "CUT"
-@@ -1678,10 +1682,11 @@ static int balance_leaf(struct tree_bala
-                                                       print_cur_tb("12285");
-                                                       reiserfs_panic(tb->
-                                                                      tb_sb,
--                                                                     "PAP-12285: balance_leaf: insert_size must be 0 (%d)",
--                                                                     tb->
--                                                                     insert_size
--                                                                     [0]);
-+                                                          "PAP-12285",
-+                                                          "insert_size "
-+                                                          "must be 0 "
-+                                                          "(%d)",
-+                                                          tb->insert_size[0]);
-                                               }
-                                       }
- #endif                                /* CONFIG_REISERFS_CHECK */
-@@ -1694,11 +1699,10 @@ static int balance_leaf(struct tree_bala
-       if (flag == M_PASTE && tb->insert_size[0]) {
-               print_cur_tb("12290");
-               reiserfs_panic(tb->tb_sb,
--                             "PAP-12290: balance_leaf: insert_size is still not 0 (%d)",
-+                             "PAP-12290", "insert_size is still not 0 (%d)",
-                              tb->insert_size[0]);
-       }
- #endif                                /* CONFIG_REISERFS_CHECK */
--
-       return 0;
- }                             /* Leaf level of the tree is balanced (end of balance_leaf) */
-@@ -1729,8 +1733,7 @@ struct buffer_head *get_FEB(struct tree_
-                       break;
-       if (i == MAX_FEB_SIZE)
--              reiserfs_panic(tb->tb_sb,
--                             "vs-12300: get_FEB: FEB list is empty");
-+              reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty");
-       bi.tb = tb;
-       bi.bi_bh = first_b = tb->FEB[i];
-@@ -1871,8 +1874,8 @@ static void check_internal_node(struct s
-       for (i = 0; i <= B_NR_ITEMS(bh); i++, dc++) {
-               if (!is_reusable(s, dc_block_number(dc), 1)) {
-                       print_cur_tb(mes);
--                      reiserfs_panic(s,
--                                     "PAP-12338: check_internal_node: invalid child pointer %y in %b",
-+                      reiserfs_panic(s, "PAP-12338",
-+                                     "invalid child pointer %y in %b",
-                                      dc, bh);
-               }
-       }
-@@ -1894,9 +1897,10 @@ static int check_before_balancing(struct
-       int retval = 0;
-       if (cur_tb) {
--              reiserfs_panic(tb->tb_sb, "vs-12335: check_before_balancing: "
--                             "suspect that schedule occurred based on cur_tb not being null at this point in code. "
--                             "do_balance cannot properly handle schedule occurring while it runs.");
-+              reiserfs_panic(tb->tb_sb, "vs-12335", "suspect that schedule "
-+                             "occurred based on cur_tb not being null at "
-+                             "this point in code. do_balance cannot properly "
-+                             "handle schedule occurring while it runs.");
-       }
-       /* double check that buffers that we will modify are unlocked. (fix_nodes should already have
-@@ -1928,8 +1932,8 @@ static void check_after_balance_leaf(str
-                   dc_size(B_N_CHILD
-                           (tb->FL[0], get_left_neighbor_position(tb, 0)))) {
-                       print_cur_tb("12221");
--                      reiserfs_panic(tb->tb_sb,
--                                     "PAP-12355: check_after_balance_leaf: shift to left was incorrect");
-+                      reiserfs_panic(tb->tb_sb, "PAP-12355",
-+                                     "shift to left was incorrect");
-               }
-       }
-       if (tb->rnum[0]) {
-@@ -1938,8 +1942,8 @@ static void check_after_balance_leaf(str
-                   dc_size(B_N_CHILD
-                           (tb->FR[0], get_right_neighbor_position(tb, 0)))) {
-                       print_cur_tb("12222");
--                      reiserfs_panic(tb->tb_sb,
--                                     "PAP-12360: check_after_balance_leaf: shift to right was incorrect");
-+                      reiserfs_panic(tb->tb_sb, "PAP-12360",
-+                                     "shift to right was incorrect");
-               }
-       }
-       if (PATH_H_PBUFFER(tb->tb_path, 1) &&
-@@ -1964,8 +1968,7 @@ static void check_after_balance_leaf(str
-                                        (PATH_H_PBUFFER(tb->tb_path, 1),
-                                         PATH_H_POSITION(tb->tb_path, 1))),
-                                right);
--              reiserfs_panic(tb->tb_sb,
--                             "PAP-12365: check_after_balance_leaf: S is incorrect");
-+              reiserfs_panic(tb->tb_sb, "PAP-12365", "S is incorrect");
-       }
- }
-@@ -2100,8 +2103,8 @@ void do_balance(struct tree_balance *tb,
-       tb->need_balance_dirty = 0;
-       if (FILESYSTEM_CHANGED_TB(tb)) {
--              reiserfs_panic(tb->tb_sb,
--                             "clm-6000: do_balance, fs generation has changed\n");
-+              reiserfs_panic(tb->tb_sb, "clm-6000", "fs generation has "
-+                             "changed");
-       }
-       /* if we have no real work to do  */
-       if (!tb->insert_size[0]) {
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -135,8 +135,7 @@ static void create_virtual_node(struct t
-               vn->vn_free_ptr +=
-                   op_create_vi(vn, vi, is_affected, tb->insert_size[0]);
-               if (tb->vn_buf + tb->vn_buf_size < vn->vn_free_ptr)
--                      reiserfs_panic(tb->tb_sb,
--                                     "vs-8030: create_virtual_node: "
-+                      reiserfs_panic(tb->tb_sb, "vs-8030",
-                                      "virtual node space consumed");
-               if (!is_affected)
-@@ -186,8 +185,9 @@ static void create_virtual_node(struct t
-                            && I_ENTRY_COUNT(B_N_PITEM_HEAD(Sh, 0)) == 1)) {
-                               /* node contains more than 1 item, or item is not directory item, or this item contains more than 1 entry */
-                               print_block(Sh, 0, -1, -1);
--                              reiserfs_panic(tb->tb_sb,
--                                             "vs-8045: create_virtual_node: rdkey %k, affected item==%d (mode==%c) Must be %c",
-+                              reiserfs_panic(tb->tb_sb, "vs-8045",
-+                                             "rdkey %k, affected item==%d "
-+                                             "(mode==%c) Must be %c",
-                                              key, vn->vn_affected_item_num,
-                                              vn->vn_mode, M_DELETE);
-                       }
-@@ -1255,8 +1255,8 @@ static int ip_check_balance(struct tree_
-       /* Calculate balance parameters for creating new root. */
-       if (!Sh) {
-               if (!h)
--                      reiserfs_panic(tb->tb_sb,
--                                     "vs-8210: ip_check_balance: S[0] can not be 0");
-+                      reiserfs_panic(tb->tb_sb, "vs-8210",
-+                                     "S[0] can not be 0");
-               switch (n_ret_value = get_empty_nodes(tb, h)) {
-               case CARRY_ON:
-                       set_parameters(tb, h, 0, 0, 1, NULL, -1, -1);
-@@ -1266,8 +1266,8 @@ static int ip_check_balance(struct tree_
-               case REPEAT_SEARCH:
-                       return n_ret_value;
-               default:
--                      reiserfs_panic(tb->tb_sb,
--                                     "vs-8215: ip_check_balance: incorrect return value of get_empty_nodes");
-+                      reiserfs_panic(tb->tb_sb, "vs-8215", "incorrect "
-+                                     "return value of get_empty_nodes");
-               }
-       }
-@@ -2095,38 +2095,38 @@ static void tb_buffer_sanity_check(struc
-       if (p_s_bh) {
-               if (atomic_read(&(p_s_bh->b_count)) <= 0) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-1: tb_buffer_sanity_check(): negative or zero reference counter for buffer %s[%d] (%b)\n",
--                                     descr, level, p_s_bh);
-+                      reiserfs_panic(p_s_sb, "jmacd-1", "negative or zero "
-+                                     "reference counter for buffer %s[%d] "
-+                                     "(%b)", descr, level, p_s_bh);
-               }
-               if (!buffer_uptodate(p_s_bh)) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-2: tb_buffer_sanity_check(): buffer is not up to date %s[%d] (%b)\n",
-+                      reiserfs_panic(p_s_sb, "jmacd-2", "buffer is not up "
-+                                     "to date %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-               if (!B_IS_IN_TREE(p_s_bh)) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-3: tb_buffer_sanity_check(): buffer is not in tree %s[%d] (%b)\n",
-+                      reiserfs_panic(p_s_sb, "jmacd-3", "buffer is not "
-+                                     "in tree %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-               if (p_s_bh->b_bdev != p_s_sb->s_bdev) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-4: tb_buffer_sanity_check(): buffer has wrong device %s[%d] (%b)\n",
-+                      reiserfs_panic(p_s_sb, "jmacd-4", "buffer has wrong "
-+                                     "device %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-               if (p_s_bh->b_size != p_s_sb->s_blocksize) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-5: tb_buffer_sanity_check(): buffer has wrong blocksize %s[%d] (%b)\n",
-+                      reiserfs_panic(p_s_sb, "jmacd-5", "buffer has wrong "
-+                                     "blocksize %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-               if (p_s_bh->b_blocknr > SB_BLOCK_COUNT(p_s_sb)) {
--                      reiserfs_panic(p_s_sb,
--                                     "jmacd-6: tb_buffer_sanity_check(): buffer block number too high %s[%d] (%b)\n",
-+                      reiserfs_panic(p_s_sb, "jmacd-6", "buffer block "
-+                                     "number too high %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-       }
-@@ -2358,14 +2358,14 @@ int fix_nodes(int n_op_mode, struct tree
- #ifdef CONFIG_REISERFS_CHECK
-       if (cur_tb) {
-               print_cur_tb("fix_nodes");
--              reiserfs_panic(p_s_tb->tb_sb,
--                             "PAP-8305: fix_nodes:  there is pending do_balance");
-+              reiserfs_panic(p_s_tb->tb_sb, "PAP-8305",
-+                             "there is pending do_balance");
-       }
-       if (!buffer_uptodate(p_s_tbS0) || !B_IS_IN_TREE(p_s_tbS0)) {
--              reiserfs_panic(p_s_tb->tb_sb,
--                             "PAP-8320: fix_nodes: S[0] (%b %z) is not uptodate "
--                             "at the beginning of fix_nodes or not in tree (mode %c)",
-+              reiserfs_panic(p_s_tb->tb_sb, "PAP-8320", "S[0] (%b %z) is "
-+                             "not uptodate at the beginning of fix_nodes "
-+                             "or not in tree (mode %c)",
-                              p_s_tbS0, p_s_tbS0, n_op_mode);
-       }
-@@ -2373,24 +2373,26 @@ int fix_nodes(int n_op_mode, struct tree
-       switch (n_op_mode) {
-       case M_INSERT:
-               if (n_item_num <= 0 || n_item_num > B_NR_ITEMS(p_s_tbS0))
--                      reiserfs_panic(p_s_tb->tb_sb,
--                                     "PAP-8330: fix_nodes: Incorrect item number %d (in S0 - %d) in case of insert",
--                                     n_item_num, B_NR_ITEMS(p_s_tbS0));
-+                      reiserfs_panic(p_s_tb->tb_sb, "PAP-8330", "Incorrect "
-+                                     "item number %d (in S0 - %d) in case "
-+                                     "of insert", n_item_num,
-+                                     B_NR_ITEMS(p_s_tbS0));
-               break;
-       case M_PASTE:
-       case M_DELETE:
-       case M_CUT:
-               if (n_item_num < 0 || n_item_num >= B_NR_ITEMS(p_s_tbS0)) {
-                       print_block(p_s_tbS0, 0, -1, -1);
--                      reiserfs_panic(p_s_tb->tb_sb,
--                                     "PAP-8335: fix_nodes: Incorrect item number(%d); mode = %c insert_size = %d\n",
-+                      reiserfs_panic(p_s_tb->tb_sb, "PAP-8335", "Incorrect "
-+                                     "item number(%d); mode = %c "
-+                                     "insert_size = %d",
-                                      n_item_num, n_op_mode,
-                                      p_s_tb->insert_size[0]);
-               }
-               break;
-       default:
--              reiserfs_panic(p_s_tb->tb_sb,
--                             "PAP-8340: fix_nodes: Incorrect mode of operation");
-+              reiserfs_panic(p_s_tb->tb_sb, "PAP-8340", "Incorrect mode "
-+                             "of operation");
-       }
- #endif
---- a/fs/reiserfs/ibalance.c
-+++ b/fs/reiserfs/ibalance.c
-@@ -105,8 +105,8 @@ static void internal_define_dest_src_inf
-               break;
-       default:
--              reiserfs_panic(tb->tb_sb,
--                             "internal_define_dest_src_infos: shift type is unknown (%d)",
-+              reiserfs_panic(tb->tb_sb, "ibalance-1",
-+                             "shift type is unknown (%d)",
-                              shift_mode);
-       }
- }
-@@ -702,8 +702,8 @@ static void balance_internal_when_delete
-               return;
-       }
--      reiserfs_panic(tb->tb_sb,
--                     "balance_internal_when_delete: unexpected tb->lnum[%d]==%d or tb->rnum[%d]==%d",
-+      reiserfs_panic(tb->tb_sb, "ibalance-2",
-+                     "unexpected tb->lnum[%d]==%d or tb->rnum[%d]==%d",
-                      h, tb->lnum[h], h, tb->rnum[h]);
- }
-@@ -940,8 +940,8 @@ int balance_internal(struct tree_balance
-               struct block_head *blkh;
-               if (tb->blknum[h] != 1)
--                      reiserfs_panic(NULL,
--                                     "balance_internal: One new node required for creating the new root");
-+                      reiserfs_panic(NULL, "ibalance-3", "One new node "
-+                                     "required for creating the new root");
-               /* S[h] = empty buffer from the list FEB. */
-               tbSh = get_FEB(tb);
-               blkh = B_BLK_HEAD(tbSh);
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -1300,8 +1300,7 @@ static void update_stat_data(struct tree
-       ih = PATH_PITEM_HEAD(path);
-       if (!is_statdata_le_ih(ih))
--              reiserfs_panic(inode->i_sb,
--                             "vs-13065: update_stat_data: key %k, found item %h",
-+              reiserfs_panic(inode->i_sb, "vs-13065", "key %k, found item %h",
-                              INODE_PKEY(inode), ih);
-       if (stat_data_v1(ih)) {
---- a/fs/reiserfs/item_ops.c
-+++ b/fs/reiserfs/item_ops.c
-@@ -517,8 +517,9 @@ static int direntry_create_vi(struct vir
-                   ((is_affected
-                     && (vn->vn_mode == M_PASTE
-                         || vn->vn_mode == M_CUT)) ? insert_size : 0)) {
--                      reiserfs_panic(NULL,
--                                     "vs-8025: set_entry_sizes: (mode==%c, insert_size==%d), invalid length of directory item",
-+                      reiserfs_panic(NULL, "vs-8025", "(mode==%c, "
-+                                     "insert_size==%d), invalid length of "
-+                                     "directory item",
-                                      vn->vn_mode, insert_size);
-               }
-       }
-@@ -549,7 +550,8 @@ static int direntry_check_left(struct vi
-       }
-       if (entries == dir_u->entry_count) {
--              reiserfs_panic(NULL, "free space %d, entry_count %d\n", free,
-+              reiserfs_panic(NULL, "item_ops-1",
-+                             "free space %d, entry_count %d", free,
-                              dir_u->entry_count);
-       }
---- a/fs/reiserfs/journal.c
-+++ b/fs/reiserfs/journal.c
-@@ -436,8 +436,8 @@ void reiserfs_check_lock_depth(struct su
- {
- #ifdef CONFIG_SMP
-       if (current->lock_depth < 0) {
--              reiserfs_panic(sb, "%s called without kernel lock held",
--                             caller);
-+              reiserfs_panic(sb, "journal-1", "%s called without kernel "
-+                             "lock held", caller);
-       }
- #else
-       ;
-@@ -574,7 +574,7 @@ static inline void put_journal_list(stru
-                                   struct reiserfs_journal_list *jl)
- {
-       if (jl->j_refcount < 1) {
--              reiserfs_panic(s, "trans id %u, refcount at %d",
-+              reiserfs_panic(s, "journal-2", "trans id %u, refcount at %d",
-                              jl->j_trans_id, jl->j_refcount);
-       }
-       if (--jl->j_refcount == 0)
-@@ -1416,8 +1416,7 @@ static int flush_journal_list(struct sup
-       count = 0;
-       if (j_len_saved > journal->j_trans_max) {
--              reiserfs_panic(s,
--                             "journal-715: flush_journal_list, length is %lu, trans id %lu\n",
-+              reiserfs_panic(s, "journal-715", "length is %lu, trans id %lu",
-                              j_len_saved, jl->j_trans_id);
-               return 0;
-       }
-@@ -1449,8 +1448,8 @@ static int flush_journal_list(struct sup
-        ** or wait on a more recent transaction, or just ignore it 
-        */
-       if (atomic_read(&(journal->j_wcount)) != 0) {
--              reiserfs_panic(s,
--                             "journal-844: panic journal list is flushing, wcount is not 0\n");
-+              reiserfs_panic(s, "journal-844", "journal list is flushing, "
-+                             "wcount is not 0");
-       }
-       cn = jl->j_realblock;
-       while (cn) {
-@@ -1551,13 +1550,13 @@ static int flush_journal_list(struct sup
-               while (cn) {
-                       if (test_bit(BLOCK_NEEDS_FLUSH, &cn->state)) {
-                               if (!cn->bh) {
--                                      reiserfs_panic(s,
--                                                     "journal-1011: cn->bh is NULL\n");
-+                                      reiserfs_panic(s, "journal-1011",
-+                                                     "cn->bh is NULL");
-                               }
-                               wait_on_buffer(cn->bh);
-                               if (!cn->bh) {
--                                      reiserfs_panic(s,
--                                                     "journal-1012: cn->bh is NULL\n");
-+                                      reiserfs_panic(s, "journal-1012",
-+                                                     "cn->bh is NULL");
-                               }
-                               if (unlikely(!buffer_uptodate(cn->bh))) {
- #ifdef CONFIG_REISERFS_CHECK
-@@ -3252,8 +3251,8 @@ int journal_mark_dirty(struct reiserfs_t
-       PROC_INFO_INC(p_s_sb, journal.mark_dirty);
-       if (th->t_trans_id != journal->j_trans_id) {
--              reiserfs_panic(th->t_super,
--                             "journal-1577: handle trans id %ld != current trans id %ld\n",
-+              reiserfs_panic(th->t_super, "journal-1577",
-+                             "handle trans id %ld != current trans id %ld",
-                              th->t_trans_id, journal->j_trans_id);
-       }
-@@ -3292,8 +3291,8 @@ int journal_mark_dirty(struct reiserfs_t
-        ** Nothing can be done here, except make the FS readonly or panic.
-        */
-       if (journal->j_len >= journal->j_trans_max) {
--              reiserfs_panic(th->t_super,
--                             "journal-1413: journal_mark_dirty: j_len (%lu) is too big\n",
-+              reiserfs_panic(th->t_super, "journal-1413",
-+                             "j_len (%lu) is too big",
-                              journal->j_len);
-       }
-@@ -3313,7 +3312,8 @@ int journal_mark_dirty(struct reiserfs_t
-       if (!cn) {
-               cn = get_cnode(p_s_sb);
-               if (!cn) {
--                      reiserfs_panic(p_s_sb, "get_cnode failed!\n");
-+                      reiserfs_panic(p_s_sb, "journal-4",
-+                                     "get_cnode failed!");
-               }
-               if (th->t_blocks_logged == th->t_blocks_allocated) {
-@@ -3581,8 +3581,8 @@ static int check_journal_end(struct reis
-       BUG_ON(!th->t_trans_id);
-       if (th->t_trans_id != journal->j_trans_id) {
--              reiserfs_panic(th->t_super,
--                             "journal-1577: handle trans id %ld != current trans id %ld\n",
-+              reiserfs_panic(th->t_super, "journal-1577",
-+                             "handle trans id %ld != current trans id %ld",
-                              th->t_trans_id, journal->j_trans_id);
-       }
-@@ -3661,8 +3661,8 @@ static int check_journal_end(struct reis
-       }
-       if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
--              reiserfs_panic(p_s_sb,
--                             "journal-003: journal_end: j_start (%ld) is too high\n",
-+              reiserfs_panic(p_s_sb, "journal-003",
-+                             "j_start (%ld) is too high",
-                              journal->j_start);
-       }
-       return 1;
-@@ -3707,8 +3707,8 @@ int journal_mark_freed(struct reiserfs_t
-               /* set the bit for this block in the journal bitmap for this transaction */
-               jb = journal->j_current_jl->j_list_bitmap;
-               if (!jb) {
--                      reiserfs_panic(p_s_sb,
--                                     "journal-1702: journal_mark_freed, journal_list_bitmap is NULL\n");
-+                      reiserfs_panic(p_s_sb, "journal-1702",
-+                                     "journal_list_bitmap is NULL");
-               }
-               set_bit_in_list_bitmap(p_s_sb, blocknr, jb);
-@@ -4063,8 +4063,8 @@ static int do_journal_end(struct reiserf
-               if (buffer_journaled(cn->bh)) {
-                       jl_cn = get_cnode(p_s_sb);
-                       if (!jl_cn) {
--                              reiserfs_panic(p_s_sb,
--                                             "journal-1676, get_cnode returned NULL\n");
-+                              reiserfs_panic(p_s_sb, "journal-1676",
-+                                             "get_cnode returned NULL");
-                       }
-                       if (i == 0) {
-                               jl->j_realblock = jl_cn;
-@@ -4080,8 +4080,9 @@ static int do_journal_end(struct reiserf
-                       if (is_block_in_log_or_reserved_area
-                           (p_s_sb, cn->bh->b_blocknr)) {
--                              reiserfs_panic(p_s_sb,
--                                             "journal-2332: Trying to log block %lu, which is a log block\n",
-+                              reiserfs_panic(p_s_sb, "journal-2332",
-+                                             "Trying to log block %lu, "
-+                                             "which is a log block",
-                                              cn->bh->b_blocknr);
-                       }
-                       jl_cn->blocknr = cn->bh->b_blocknr;
-@@ -4265,8 +4266,8 @@ static int do_journal_end(struct reiserf
-           get_list_bitmap(p_s_sb, journal->j_current_jl);
-       if (!(journal->j_current_jl->j_list_bitmap)) {
--              reiserfs_panic(p_s_sb,
--                             "journal-1996: do_journal_end, could not get a list bitmap\n");
-+              reiserfs_panic(p_s_sb, "journal-1996",
-+                             "could not get a list bitmap");
-       }
-       atomic_set(&(journal->j_jlock), 0);
---- a/fs/reiserfs/lbalance.c
-+++ b/fs/reiserfs/lbalance.c
-@@ -168,10 +168,11 @@ static int leaf_copy_boundary_item(struc
-                       if (bytes_or_entries == ih_item_len(ih)
-                           && is_indirect_le_ih(ih))
-                               if (get_ih_free_space(ih))
--                                      reiserfs_panic(NULL,
--                                                     "vs-10020: leaf_copy_boundary_item: "
--                                                     "last unformatted node must be filled entirely (%h)",
--                                                     ih);
-+                                      reiserfs_panic(sb_from_bi(dest_bi),
-+                                                     "vs-10020",
-+                                                     "last unformatted node "
-+                                                     "must be filled "
-+                                                     "entirely (%h)", ih);
-               }
- #endif
-@@ -622,9 +623,8 @@ static void leaf_define_dest_src_infos(i
-               break;
-       default:
--              reiserfs_panic(NULL,
--                             "vs-10250: leaf_define_dest_src_infos: shift type is unknown (%d)",
--                             shift_mode);
-+              reiserfs_panic(sb_from_bi(src_bi), "vs-10250",
-+                             "shift type is unknown (%d)", shift_mode);
-       }
-       RFALSE(!src_bi->bi_bh || !dest_bi->bi_bh,
-              "vs-10260: mode==%d, source (%p) or dest (%p) buffer is initialized incorrectly",
-@@ -674,9 +674,9 @@ int leaf_shift_left(struct tree_balance 
- #ifdef CONFIG_REISERFS_CHECK
-                       if (tb->tb_mode == M_PASTE || tb->tb_mode == M_INSERT) {
-                               print_cur_tb("vs-10275");
--                              reiserfs_panic(tb->tb_sb,
--                                             "vs-10275: leaf_shift_left: balance condition corrupted (%c)",
--                                             tb->tb_mode);
-+                              reiserfs_panic(tb->tb_sb, "vs-10275",
-+                                             "balance condition corrupted "
-+                                             "(%c)", tb->tb_mode);
-                       }
- #endif
-@@ -889,9 +889,12 @@ void leaf_paste_in_buffer(struct buffer_
- #ifdef CONFIG_REISERFS_CHECK
-       if (zeros_number > paste_size) {
-+              struct super_block *sb = NULL;
-+              if (bi && bi->tb)
-+                      sb = bi->tb->tb_sb;
-               print_cur_tb("10177");
--              reiserfs_panic(NULL,
--                             "vs-10177: leaf_paste_in_buffer: ero number == %d, paste_size == %d",
-+              reiserfs_panic(sb, "vs-10177",
-+                             "zeros_number == %d, paste_size == %d",
-                              zeros_number, paste_size);
-       }
- #endif                                /* CONFIG_REISERFS_CHECK */
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -145,10 +145,9 @@ int search_by_entry_key(struct super_blo
-       if (!is_direntry_le_ih(de->de_ih) ||
-           COMP_SHORT_KEYS(&(de->de_ih->ih_key), key)) {
-               print_block(de->de_bh, 0, -1, -1);
--              reiserfs_panic(sb,
--                             "vs-7005: search_by_entry_key: found item %h is not directory item or "
--                             "does not belong to the same directory as key %K",
--                             de->de_ih, key);
-+              reiserfs_panic(sb, "vs-7005", "found item %h is not directory "
-+                             "item or does not belong to the same directory "
-+                             "as key %K", de->de_ih, key);
-       }
- #endif                                /* CONFIG_REISERFS_CHECK */
-@@ -1194,15 +1193,14 @@ static int entry_points_to_object(const 
-       if (inode) {
-               if (!de_visible(de->de_deh + de->de_entry_num))
--                      reiserfs_panic(NULL,
--                                     "vs-7042: entry_points_to_object: entry must be visible");
-+                      reiserfs_panic(inode->i_sb, "vs-7042",
-+                                     "entry must be visible");
-               return (de->de_objectid == inode->i_ino) ? 1 : 0;
-       }
-       /* this must be added hidden entry */
-       if (de_visible(de->de_deh + de->de_entry_num))
--              reiserfs_panic(NULL,
--                             "vs-7043: entry_points_to_object: entry must be visible");
-+              reiserfs_panic(NULL, "vs-7043", "entry must be visible");
-       return 1;
- }
-@@ -1316,8 +1314,8 @@ static int reiserfs_rename(struct inode 
-                              new_dentry->d_name.len, old_inode, 0);
-       if (retval == -EEXIST) {
-               if (!new_dentry_inode) {
--                      reiserfs_panic(old_dir->i_sb,
--                                     "vs-7050: new entry is found, new inode == 0\n");
-+                      reiserfs_panic(old_dir->i_sb, "vs-7050",
-+                                     "new entry is found, new inode == 0");
-               }
-       } else if (retval) {
-               int err = journal_end(&th, old_dir->i_sb, jbegin_count);
---- a/fs/reiserfs/objectid.c
-+++ b/fs/reiserfs/objectid.c
-@@ -18,8 +18,7 @@
- static void check_objectid_map(struct super_block *s, __le32 * map)
- {
-       if (le32_to_cpu(map[0]) != 1)
--              reiserfs_panic(s,
--                             "vs-15010: check_objectid_map: map corrupted: %lx",
-+              reiserfs_panic(s, "vs-15010", "map corrupted: %lx",
-                              (long unsigned int)le32_to_cpu(map[0]));
-       // FIXME: add something else here
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -356,14 +356,21 @@ void reiserfs_debug(struct super_block *
- extern struct tree_balance *cur_tb;
- #endif
--void reiserfs_panic(struct super_block *sb, const char *fmt, ...)
-+void __reiserfs_panic(struct super_block *sb, const char *id,
-+                    const char *function, const char *fmt, ...)
- {
-       do_reiserfs_warning(fmt);
-+#ifdef CONFIG_REISERFS_CHECK
-       dump_stack();
--
--      panic(KERN_EMERG "REISERFS: panic (device %s): %s\n",
--             reiserfs_bdevname(sb), error_buf);
-+#endif
-+      if (sb)
-+              panic(KERN_WARNING "REISERFS panic (device %s): %s%s%s: %s\n",
-+                    sb->s_id, id ? id : "", id ? " " : "",
-+                    function, error_buf);
-+      else
-+              panic(KERN_WARNING "REISERFS panic: %s%s%s: %s\n",
-+                    id ? id : "", id ? " " : "", function, error_buf);
- }
- void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...)
-@@ -684,12 +691,10 @@ static void check_leaf_block_head(struct
-       blkh = B_BLK_HEAD(bh);
-       nr = blkh_nr_item(blkh);
-       if (nr > (bh->b_size - BLKH_SIZE) / IH_SIZE)
--              reiserfs_panic(NULL,
--                             "vs-6010: check_leaf_block_head: invalid item number %z",
-+              reiserfs_panic(NULL, "vs-6010", "invalid item number %z",
-                              bh);
-       if (blkh_free_space(blkh) > bh->b_size - BLKH_SIZE - IH_SIZE * nr)
--              reiserfs_panic(NULL,
--                             "vs-6020: check_leaf_block_head: invalid free space %z",
-+              reiserfs_panic(NULL, "vs-6020", "invalid free space %z",
-                              bh);
- }
-@@ -700,21 +705,15 @@ static void check_internal_block_head(st
-       blkh = B_BLK_HEAD(bh);
-       if (!(B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL && B_LEVEL(bh) <= MAX_HEIGHT))
--              reiserfs_panic(NULL,
--                             "vs-6025: check_internal_block_head: invalid level %z",
--                             bh);
-+              reiserfs_panic(NULL, "vs-6025", "invalid level %z", bh);
-       if (B_NR_ITEMS(bh) > (bh->b_size - BLKH_SIZE) / IH_SIZE)
--              reiserfs_panic(NULL,
--                             "vs-6030: check_internal_block_head: invalid item number %z",
--                             bh);
-+              reiserfs_panic(NULL, "vs-6030", "invalid item number %z", bh);
-       if (B_FREE_SPACE(bh) !=
-           bh->b_size - BLKH_SIZE - KEY_SIZE * B_NR_ITEMS(bh) -
-           DC_SIZE * (B_NR_ITEMS(bh) + 1))
--              reiserfs_panic(NULL,
--                             "vs-6040: check_internal_block_head: invalid free space %z",
--                             bh);
-+              reiserfs_panic(NULL, "vs-6040", "invalid free space %z", bh);
- }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -366,9 +366,8 @@ inline void decrement_bcount(struct buff
-                       put_bh(p_s_bh);
-                       return;
-               }
--              reiserfs_panic(NULL,
--                             "PAP-5070: decrement_bcount: trying to free free buffer %b",
--                             p_s_bh);
-+              reiserfs_panic(NULL, "PAP-5070",
-+                             "trying to free free buffer %b", p_s_bh);
-       }
- }
-@@ -713,8 +712,8 @@ int search_by_key(struct super_block *p_
- #ifdef CONFIG_REISERFS_CHECK
-               if (cur_tb) {
-                       print_cur_tb("5140");
--                      reiserfs_panic(p_s_sb,
--                                     "PAP-5140: search_by_key: schedule occurred in do_balance!");
-+                      reiserfs_panic(p_s_sb, "PAP-5140",
-+                                     "schedule occurred in do_balance!");
-               }
- #endif
-@@ -1511,8 +1510,8 @@ static void indirect_to_direct_roll_back
-               /* look for the last byte of the tail */
-               if (search_for_position_by_key(inode->i_sb, &tail_key, path) ==
-                   POSITION_NOT_FOUND)
--                      reiserfs_panic(inode->i_sb,
--                                     "vs-5615: indirect_to_direct_roll_back: found invalid item");
-+                      reiserfs_panic(inode->i_sb, "vs-5615",
-+                                     "found invalid item");
-               RFALSE(path->pos_in_item !=
-                      ih_item_len(PATH_PITEM_HEAD(path)) - 1,
-                      "vs-5616: appended bytes found");
-@@ -1612,8 +1611,8 @@ int reiserfs_cut_from_item(struct reiser
-                               print_block(PATH_PLAST_BUFFER(p_s_path), 3,
-                                           PATH_LAST_POSITION(p_s_path) - 1,
-                                           PATH_LAST_POSITION(p_s_path) + 1);
--                              reiserfs_panic(p_s_sb,
--                                             "PAP-5580: reiserfs_cut_from_item: item to convert does not exist (%K)",
-+                              reiserfs_panic(p_s_sb, "PAP-5580", "item to "
-+                                             "convert does not exist (%K)",
-                                              p_s_item_key);
-                       }
-                       continue;
-@@ -1693,22 +1692,20 @@ int reiserfs_cut_from_item(struct reiser
-                  sure, that we exactly remove last unformatted node pointer
-                  of the item */
-               if (!is_indirect_le_ih(le_ih))
--                      reiserfs_panic(p_s_sb,
--                                     "vs-5652: reiserfs_cut_from_item: "
-+                      reiserfs_panic(p_s_sb, "vs-5652",
-                                      "item must be indirect %h", le_ih);
-               if (c_mode == M_DELETE && ih_item_len(le_ih) != UNFM_P_SIZE)
--                      reiserfs_panic(p_s_sb,
--                                     "vs-5653: reiserfs_cut_from_item: "
--                                     "completing indirect2direct conversion indirect item %h "
--                                     "being deleted must be of 4 byte long",
--                                     le_ih);
-+                      reiserfs_panic(p_s_sb, "vs-5653", "completing "
-+                                     "indirect2direct conversion indirect "
-+                                     "item %h being deleted must be of "
-+                                     "4 byte long", le_ih);
-               if (c_mode == M_CUT
-                   && s_cut_balance.insert_size[0] != -UNFM_P_SIZE) {
--                      reiserfs_panic(p_s_sb,
--                                     "vs-5654: reiserfs_cut_from_item: "
--                                     "can not complete indirect2direct conversion of %h (CUT, insert_size==%d)",
-+                      reiserfs_panic(p_s_sb, "vs-5654", "can not complete "
-+                                     "indirect2direct conversion of %h "
-+                                     "(CUT, insert_size==%d)",
-                                      le_ih, s_cut_balance.insert_size[0]);
-               }
-               /* it would be useful to make sure, that right neighboring
-@@ -1923,10 +1920,10 @@ static void check_research_for_paste(str
-                   || op_bytes_number(found_ih,
-                                      get_last_bh(path)->b_size) !=
-                   pos_in_item(path))
--                      reiserfs_panic(NULL,
--                                     "PAP-5720: check_research_for_paste: "
--                                     "found direct item %h or position (%d) does not match to key %K",
--                                     found_ih, pos_in_item(path), p_s_key);
-+                      reiserfs_panic(NULL, "PAP-5720", "found direct item "
-+                                     "%h or position (%d) does not match "
-+                                     "to key %K", found_ih,
-+                                     pos_in_item(path), p_s_key);
-       }
-       if (is_indirect_le_ih(found_ih)) {
-               if (le_ih_k_offset(found_ih) +
-@@ -1935,9 +1932,9 @@ static void check_research_for_paste(str
-                   cpu_key_k_offset(p_s_key)
-                   || I_UNFM_NUM(found_ih) != pos_in_item(path)
-                   || get_ih_free_space(found_ih) != 0)
--                      reiserfs_panic(NULL,
--                                     "PAP-5730: check_research_for_paste: "
--                                     "found indirect item (%h) or position (%d) does not match to key (%K)",
-+                      reiserfs_panic(NULL, "PAP-5730", "found indirect "
-+                                     "item (%h) or position (%d) does not "
-+                                     "match to key (%K)",
-                                      found_ih, pos_in_item(path), p_s_key);
-       }
- }
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -92,8 +92,7 @@ int direct2indirect(struct reiserfs_tran
-                  last item of the file */
-               if (search_for_position_by_key(sb, &end_key, path) ==
-                   POSITION_FOUND)
--                      reiserfs_panic(sb,
--                                     "PAP-14050: direct2indirect: "
-+                      reiserfs_panic(sb, "PAP-14050",
-                                      "direct item (%K) not found", &end_key);
-               p_le_ih = PATH_PITEM_HEAD(path);
-               RFALSE(!is_direct_le_ih(p_le_ih),
-@@ -214,8 +213,7 @@ int indirect2direct(struct reiserfs_tran
-               /* re-search indirect item */
-               if (search_for_position_by_key(p_s_sb, p_s_item_key, p_s_path)
-                   == POSITION_NOT_FOUND)
--                      reiserfs_panic(p_s_sb,
--                                     "PAP-5520: indirect2direct: "
-+                      reiserfs_panic(p_s_sb, "PAP-5520",
-                                      "item to be converted %K does not exist",
-                                      p_s_item_key);
-               copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-@@ -224,8 +222,8 @@ int indirect2direct(struct reiserfs_tran
-                   (ih_item_len(&s_ih) / UNFM_P_SIZE -
-                    1) * p_s_sb->s_blocksize;
-               if (pos != pos1)
--                      reiserfs_panic(p_s_sb, "vs-5530: indirect2direct: "
--                                     "tail position changed while we were reading it");
-+                      reiserfs_panic(p_s_sb, "vs-5530", "tail position "
-+                                     "changed while we were reading it");
- #endif
-       }
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -86,11 +86,14 @@ void __reiserfs_warning(struct super_blo
- /* assertions handling */
- /** always check a condition and panic if it's false. */
--#define __RASSERT( cond, scond, format, args... )                                     \
--if( !( cond ) )                                                               \
--  reiserfs_panic( NULL, "reiserfs[%i]: assertion " scond " failed at "        \
--                __FILE__ ":%i:%s: " format "\n",              \
--                in_interrupt() ? -1 : task_pid_nr(current), __LINE__ , __FUNCTION__ , ##args )
-+#define __RASSERT(cond, scond, format, args...)                       \
-+do {                                                                  \
-+      if (!(cond))                                                    \
-+              reiserfs_panic(NULL, "assertion failure", "(" #cond ") at " \
-+                             __FILE__ ":%i:%s: " format "\n",         \
-+                             in_interrupt() ? -1 : task_pid_nr(current), \
-+                             __LINE__, __func__ , ##args);            \
-+} while (0)
- #define RASSERT(cond, format, args...) __RASSERT(cond, #cond, format, ##args)
-@@ -1448,6 +1451,16 @@ struct buffer_info {
-       int bi_position;
- };
-+static inline struct super_block *sb_from_tb(struct tree_balance *tb)
-+{
-+      return tb ? tb->tb_sb : NULL;
-+}
-+
-+static inline struct super_block *sb_from_bi(struct buffer_info *bi)
-+{
-+      return bi ? sb_from_tb(bi->tb) : NULL;
-+}
-+
- /* there are 4 types of items: stat data, directory item, indirect, direct.
- +-------------------+------------+--------------+------------+
- |                 |  k_offset  | k_uniqueness | mergeable? |
-@@ -1988,8 +2001,11 @@ int fix_nodes(int n_op_mode, struct tree
- void unfix_nodes(struct tree_balance *);
- /* prints.c */
--void reiserfs_panic(struct super_block *s, const char *fmt, ...)
-+void __reiserfs_panic(struct super_block *s, const char *id,
-+                    const char *function, const char *fmt, ...)
-     __attribute__ ((noreturn));
-+#define reiserfs_panic(s, id, fmt, args...) \
-+      __reiserfs_panic(s, id, __func__, fmt, ##args)
- void reiserfs_info(struct super_block *s, const char *fmt, ...);
- void reiserfs_debug(struct super_block *s, int level, const char *fmt, ...);
- void print_indirect_item(struct buffer_head *bh, int item_num);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-i_has_xattr_dir.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-i_has_xattr_dir.diff
deleted file mode 100644 (file)
index f04a332..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: remove i_has_xattr_dir
-
- With the changes to xattr root locking, the i_has_xattr_dir flag
- is no longer needed. This patch removes it.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/xattr.c |    9 +--------
- 1 file changed, 1 insertion(+), 8 deletions(-)
-
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -459,10 +459,7 @@ int reiserfs_delete_xattrs(struct inode
-       dput(root);
- out:
--      if (!err)
--              REISERFS_I(inode)->i_flags =
--                  REISERFS_I(inode)->i_flags & ~i_has_xattr_dir;
--      else
-+      if (err)
-               reiserfs_warning(inode->i_sb, "jdm-20004",
-                                "Couldn't remove all xattrs (%d)\n", err);
-       return err;
-@@ -660,7 +657,6 @@ reiserfs_xattr_set(struct inode *inode,
-       down_write(&REISERFS_I(inode)->i_xattr_sem);
-       xahash = xattr_hash(buffer, buffer_size);
--      REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-       /* Resize it so we're ok to write there */
-       newattrs.ia_size = buffer_size;
-@@ -769,7 +765,6 @@ reiserfs_xattr_get(const struct inode *i
-       down_read(&REISERFS_I(inode)->i_xattr_sem);
-       isize = i_size_read(dentry->d_inode);
--      REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-       /* Just return the size needed */
-       if (buffer == NULL) {
-@@ -999,8 +994,6 @@ ssize_t reiserfs_listxattr(struct dentry
-       buf.r_pos = 0;
-       buf.r_inode = dentry->d_inode;
--      REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir;
--
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf);
-       mutex_unlock(&dir->d_inode->i_mutex);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-link-detection.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-remove-link-detection.diff
deleted file mode 100644 (file)
index 3d4bbfc..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: remove link detection code
-
- Early in the reiserfs xattr development, there was a plan to use hardlinks
- to save disk space for identical xattrs. That code never materialized and
- isn't going to, so this patch removes the detection code.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/xattr.c |   13 -------------
- 1 file changed, 13 deletions(-)
-
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -432,7 +432,6 @@ reiserfs_xattr_set(struct inode *inode,
-       if (buffer && buffer_size)
-               xahash = xattr_hash(buffer, buffer_size);
--      open_file:
-       dentry = get_xa_file_dentry(inode, name, flags);
-       if (IS_ERR(dentry)) {
-               err = PTR_ERR(dentry);
-@@ -441,18 +440,6 @@ reiserfs_xattr_set(struct inode *inode,
-       REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
--      /* we need to copy it off.. */
--      if (dentry->d_inode->i_nlink > 1) {
--              dput(dentry);
--              err = reiserfs_xattr_del(inode, name);
--              if (err < 0)
--                      goto out;
--              /* We just killed the old one, we're not replacing anymore */
--              if (flags & XATTR_REPLACE)
--                      flags &= ~XATTR_REPLACE;
--              goto open_file;
--      }
--
-       /* Resize it so we're ok to write there */
-       newattrs.ia_size = buffer_size;
-       newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-._.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-._.diff
deleted file mode 100644 (file)
index bfb241b..0000000
+++ /dev/null
@@ -1,1991 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename [cn]_* variables
-
- This patch renames n_, c_, etc variables to something more sane. This is
- the sixth in a series of patches to rip out some of the awful variable
- naming in reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/file.c            |    6 
- fs/reiserfs/fix_node.c        |  474 +++++++++++++++++++++---------------------
- fs/reiserfs/stree.c           |  370 ++++++++++++++++----------------
- fs/reiserfs/tail_conversion.c |   30 +-
- 4 files changed, 438 insertions(+), 442 deletions(-)
-
---- a/fs/reiserfs/file.c
-+++ b/fs/reiserfs/file.c
-@@ -138,11 +138,11 @@ static int reiserfs_sync_file(struct fil
-                             struct dentry *dentry, int datasync)
- {
-       struct inode *inode = dentry->d_inode;
--      int n_err;
-+      int err;
-       int barrier_done;
-       BUG_ON(!S_ISREG(inode->i_mode));
--      n_err = sync_mapping_buffers(inode->i_mapping);
-+      err = sync_mapping_buffers(inode->i_mapping);
-       reiserfs_write_lock(inode->i_sb);
-       barrier_done = reiserfs_commit_for_inode(inode);
-       reiserfs_write_unlock(inode->i_sb);
-@@ -150,7 +150,7 @@ static int reiserfs_sync_file(struct fil
-               blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
-       if (barrier_done < 0)
-               return barrier_done;
--      return (n_err < 0) ? -EIO : 0;
-+      return (err < 0) ? -EIO : 0;
- }
- /* taken fs/buffer.c:__block_commit_write */
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -751,24 +751,24 @@ else \
- static void free_buffers_in_tb(struct tree_balance *tb)
- {
--      int n_counter;
-+      int i;
-       pathrelse(tb->tb_path);
--      for (n_counter = 0; n_counter < MAX_HEIGHT; n_counter++) {
--              brelse(tb->L[n_counter]);
--              brelse(tb->R[n_counter]);
--              brelse(tb->FL[n_counter]);
--              brelse(tb->FR[n_counter]);
--              brelse(tb->CFL[n_counter]);
--              brelse(tb->CFR[n_counter]);
--
--              tb->L[n_counter] = NULL;
--              tb->R[n_counter] = NULL;
--              tb->FL[n_counter] = NULL;
--              tb->FR[n_counter] = NULL;
--              tb->CFL[n_counter] = NULL;
--              tb->CFR[n_counter] = NULL;
-+      for (i = 0; i < MAX_HEIGHT; i++) {
-+              brelse(tb->L[i]);
-+              brelse(tb->R[i]);
-+              brelse(tb->FL[i]);
-+              brelse(tb->FR[i]);
-+              brelse(tb->CFL[i]);
-+              brelse(tb->CFR[i]);
-+
-+              tb->L[i] = NULL;
-+              tb->R[i] = NULL;
-+              tb->FL[i] = NULL;
-+              tb->FR[i] = NULL;
-+              tb->CFL[i] = NULL;
-+              tb->CFR[i] = NULL;
-       }
- }
-@@ -778,13 +778,13 @@ static void free_buffers_in_tb(struct tr
-  *            NO_DISK_SPACE - no disk space.
-  */
- /* The function is NOT SCHEDULE-SAFE! */
--static int get_empty_nodes(struct tree_balance *tb, int n_h)
-+static int get_empty_nodes(struct tree_balance *tb, int h)
- {
-       struct buffer_head *new_bh,
--          *Sh = PATH_H_PBUFFER(tb->tb_path, n_h);
--      b_blocknr_t *blocknr, a_n_blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
--      int n_counter, n_number_of_freeblk, n_amount_needed,    /* number of needed empty blocks */
--       n_retval = CARRY_ON;
-+          *Sh = PATH_H_PBUFFER(tb->tb_path, h);
-+      b_blocknr_t *blocknr, blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
-+      int counter, number_of_freeblk, amount_needed,  /* number of needed empty blocks */
-+       retval = CARRY_ON;
-       struct super_block *sb = tb->tb_sb;
-       /* number_of_freeblk is the number of empty blocks which have been
-@@ -793,7 +793,7 @@ static int get_empty_nodes(struct tree_b
-          number_of_freeblk = tb->cur_blknum can be non-zero if a schedule occurs
-          after empty blocks are acquired, and the balancing analysis is
-          then restarted, amount_needed is the number needed by this level
--         (n_h) of the balancing analysis.
-+         (h) of the balancing analysis.
-          Note that for systems with many processes writing, it would be
-          more layout optimal to calculate the total number needed by all
-@@ -801,31 +801,31 @@ static int get_empty_nodes(struct tree_b
-       /* Initiate number_of_freeblk to the amount acquired prior to the restart of
-          the analysis or 0 if not restarted, then subtract the amount needed
--         by all of the levels of the tree below n_h. */
--      /* blknum includes S[n_h], so we subtract 1 in this calculation */
--      for (n_counter = 0, n_number_of_freeblk = tb->cur_blknum;
--           n_counter < n_h; n_counter++)
--              n_number_of_freeblk -=
--                  (tb->blknum[n_counter]) ? (tb->blknum[n_counter] -
-+         by all of the levels of the tree below h. */
-+      /* blknum includes S[h], so we subtract 1 in this calculation */
-+      for (counter = 0, number_of_freeblk = tb->cur_blknum;
-+           counter < h; counter++)
-+              number_of_freeblk -=
-+                  (tb->blknum[counter]) ? (tb->blknum[counter] -
-                                                  1) : 0;
-       /* Allocate missing empty blocks. */
-       /* if Sh == 0  then we are getting a new root */
--      n_amount_needed = (Sh) ? (tb->blknum[n_h] - 1) : 1;
-+      amount_needed = (Sh) ? (tb->blknum[h] - 1) : 1;
-       /*  Amount_needed = the amount that we need more than the amount that we have. */
--      if (n_amount_needed > n_number_of_freeblk)
--              n_amount_needed -= n_number_of_freeblk;
-+      if (amount_needed > number_of_freeblk)
-+              amount_needed -= number_of_freeblk;
-       else                    /* If we have enough already then there is nothing to do. */
-               return CARRY_ON;
-       /* No need to check quota - is not allocated for blocks used for formatted nodes */
--      if (reiserfs_new_form_blocknrs(tb, a_n_blocknrs,
--                                     n_amount_needed) == NO_DISK_SPACE)
-+      if (reiserfs_new_form_blocknrs(tb, blocknrs,
-+                                     amount_needed) == NO_DISK_SPACE)
-               return NO_DISK_SPACE;
-       /* for each blocknumber we just got, get a buffer and stick it on FEB */
--      for (blocknr = a_n_blocknrs, n_counter = 0;
--           n_counter < n_amount_needed; blocknr++, n_counter++) {
-+      for (blocknr = blocknrs, counter = 0;
-+           counter < amount_needed; blocknr++, counter++) {
-               RFALSE(!*blocknr,
-                      "PAP-8135: reiserfs_new_blocknrs failed when got new blocks");
-@@ -845,10 +845,10 @@ static int get_empty_nodes(struct tree_b
-               tb->FEB[tb->cur_blknum++] = new_bh;
-       }
--      if (n_retval == CARRY_ON && FILESYSTEM_CHANGED_TB(tb))
--              n_retval = REPEAT_SEARCH;
-+      if (retval == CARRY_ON && FILESYSTEM_CHANGED_TB(tb))
-+              retval = REPEAT_SEARCH;
--      return n_retval;
-+      return retval;
- }
- /* Get free space of the left neighbor, which is stored in the parent
-@@ -896,36 +896,36 @@ static int get_rfree(struct tree_balance
- }
- /* Check whether left neighbor is in memory. */
--static int is_left_neighbor_in_cache(struct tree_balance *tb, int n_h)
-+static int is_left_neighbor_in_cache(struct tree_balance *tb, int h)
- {
-       struct buffer_head *father, *left;
-       struct super_block *sb = tb->tb_sb;
--      b_blocknr_t n_left_neighbor_blocknr;
--      int n_left_neighbor_position;
-+      b_blocknr_t left_neighbor_blocknr;
-+      int left_neighbor_position;
-       /* Father of the left neighbor does not exist. */
--      if (!tb->FL[n_h])
-+      if (!tb->FL[h])
-               return 0;
-       /* Calculate father of the node to be balanced. */
--      father = PATH_H_PBUFFER(tb->tb_path, n_h + 1);
-+      father = PATH_H_PBUFFER(tb->tb_path, h + 1);
-       RFALSE(!father ||
-              !B_IS_IN_TREE(father) ||
--             !B_IS_IN_TREE(tb->FL[n_h]) ||
-+             !B_IS_IN_TREE(tb->FL[h]) ||
-              !buffer_uptodate(father) ||
--             !buffer_uptodate(tb->FL[n_h]),
-+             !buffer_uptodate(tb->FL[h]),
-              "vs-8165: F[h] (%b) or FL[h] (%b) is invalid",
--             father, tb->FL[n_h]);
-+             father, tb->FL[h]);
-       /* Get position of the pointer to the left neighbor into the left father. */
--      n_left_neighbor_position = (father == tb->FL[n_h]) ?
--          tb->lkey[n_h] : B_NR_ITEMS(tb->FL[n_h]);
-+      left_neighbor_position = (father == tb->FL[h]) ?
-+          tb->lkey[h] : B_NR_ITEMS(tb->FL[h]);
-       /* Get left neighbor block number. */
--      n_left_neighbor_blocknr =
--          B_N_CHILD_NUM(tb->FL[n_h], n_left_neighbor_position);
-+      left_neighbor_blocknr =
-+          B_N_CHILD_NUM(tb->FL[h], left_neighbor_position);
-       /* Look for the left neighbor in the cache. */
--      if ((left = sb_find_get_block(sb, n_left_neighbor_blocknr))) {
-+      if ((left = sb_find_get_block(sb, left_neighbor_blocknr))) {
-               RFALSE(buffer_uptodate(left) && !B_IS_IN_TREE(left),
-                      "vs-8170: left neighbor (%b %z) is not in the tree",
-@@ -955,7 +955,7 @@ static void decrement_key(struct cpu_key
-  *            CARRY_ON         - schedule didn't occur while the function worked;
-  */
- static int get_far_parent(struct tree_balance *tb,
--                        int n_h,
-+                        int h,
-                         struct buffer_head **pfather,
-                         struct buffer_head **pcom_father, char c_lr_par)
- {
-@@ -963,38 +963,38 @@ static int get_far_parent(struct tree_ba
-       INITIALIZE_PATH(s_path_to_neighbor_father);
-       struct treepath *path = tb->tb_path;
-       struct cpu_key s_lr_father_key;
--      int n_counter,
--          n_position = INT_MAX,
--          n_first_last_position = 0,
--          n_path_offset = PATH_H_PATH_OFFSET(path, n_h);
-+      int counter,
-+          position = INT_MAX,
-+          first_last_position = 0,
-+          path_offset = PATH_H_PATH_OFFSET(path, h);
--      /* Starting from F[n_h] go upwards in the tree, and look for the common
--         ancestor of F[n_h], and its neighbor l/r, that should be obtained. */
-+      /* Starting from F[h] go upwards in the tree, and look for the common
-+         ancestor of F[h], and its neighbor l/r, that should be obtained. */
--      n_counter = n_path_offset;
-+      counter = path_offset;
--      RFALSE(n_counter < FIRST_PATH_ELEMENT_OFFSET,
-+      RFALSE(counter < FIRST_PATH_ELEMENT_OFFSET,
-              "PAP-8180: invalid path length");
--      for (; n_counter > FIRST_PATH_ELEMENT_OFFSET; n_counter--) {
-+      for (; counter > FIRST_PATH_ELEMENT_OFFSET; counter--) {
-               /* Check whether parent of the current buffer in the path is really parent in the tree. */
-               if (!B_IS_IN_TREE
--                  (parent = PATH_OFFSET_PBUFFER(path, n_counter - 1)))
-+                  (parent = PATH_OFFSET_PBUFFER(path, counter - 1)))
-                       return REPEAT_SEARCH;
-               /* Check whether position in the parent is correct. */
--              if ((n_position =
-+              if ((position =
-                    PATH_OFFSET_POSITION(path,
--                                        n_counter - 1)) >
-+                                        counter - 1)) >
-                   B_NR_ITEMS(parent))
-                       return REPEAT_SEARCH;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(parent, n_position) !=
--                  PATH_OFFSET_PBUFFER(path, n_counter)->b_blocknr)
-+              if (B_N_CHILD_NUM(parent, position) !=
-+                  PATH_OFFSET_PBUFFER(path, counter)->b_blocknr)
-                       return REPEAT_SEARCH;
-               /* Return delimiting key if position in the parent is not equal to first/last one. */
-               if (c_lr_par == RIGHT_PARENTS)
--                      n_first_last_position = B_NR_ITEMS(parent);
--              if (n_position != n_first_last_position) {
-+                      first_last_position = B_NR_ITEMS(parent);
-+              if (position != first_last_position) {
-                       *pcom_father = parent;
-                       get_bh(*pcom_father);
-                       /*(*pcom_father = parent)->b_count++; */
-@@ -1003,7 +1003,7 @@ static int get_far_parent(struct tree_ba
-       }
-       /* if we are in the root of the tree, then there is no common father */
--      if (n_counter == FIRST_PATH_ELEMENT_OFFSET) {
-+      if (counter == FIRST_PATH_ELEMENT_OFFSET) {
-               /* Check whether first buffer in the path is the root of the tree. */
-               if (PATH_OFFSET_PBUFFER
-                   (tb->tb_path,
-@@ -1036,18 +1036,18 @@ static int get_far_parent(struct tree_ba
-       le_key2cpu_key(&s_lr_father_key,
-                      B_N_PDELIM_KEY(*pcom_father,
-                                     (c_lr_par ==
--                                     LEFT_PARENTS) ? (tb->lkey[n_h - 1] =
--                                                      n_position -
--                                                      1) : (tb->rkey[n_h -
-+                                     LEFT_PARENTS) ? (tb->lkey[h - 1] =
-+                                                      position -
-+                                                      1) : (tb->rkey[h -
-                                                                          1] =
--                                                            n_position)));
-+                                                            position)));
-       if (c_lr_par == LEFT_PARENTS)
-               decrement_key(&s_lr_father_key);
-       if (search_by_key
-           (tb->tb_sb, &s_lr_father_key, &s_path_to_neighbor_father,
--           n_h + 1) == IO_ERROR)
-+           h + 1) == IO_ERROR)
-               // path is released
-               return IO_ERROR;
-@@ -1059,7 +1059,7 @@ static int get_far_parent(struct tree_ba
-       *pfather = PATH_PLAST_BUFFER(&s_path_to_neighbor_father);
--      RFALSE(B_LEVEL(*pfather) != n_h + 1,
-+      RFALSE(B_LEVEL(*pfather) != h + 1,
-              "PAP-8190: (%b %z) level too small", *pfather, *pfather);
-       RFALSE(s_path_to_neighbor_father.path_length <
-              FIRST_PATH_ELEMENT_OFFSET, "PAP-8192: path length is too small");
-@@ -1069,92 +1069,92 @@ static int get_far_parent(struct tree_ba
-       return CARRY_ON;
- }
--/* Get parents of neighbors of node in the path(S[n_path_offset]) and common parents of
-- * S[n_path_offset] and L[n_path_offset]/R[n_path_offset]: F[n_path_offset], FL[n_path_offset],
-- * FR[n_path_offset], CFL[n_path_offset], CFR[n_path_offset].
-- * Calculate numbers of left and right delimiting keys position: lkey[n_path_offset], rkey[n_path_offset].
-+/* Get parents of neighbors of node in the path(S[path_offset]) and common parents of
-+ * S[path_offset] and L[path_offset]/R[path_offset]: F[path_offset], FL[path_offset],
-+ * FR[path_offset], CFL[path_offset], CFR[path_offset].
-+ * Calculate numbers of left and right delimiting keys position: lkey[path_offset], rkey[path_offset].
-  * Returns:   SCHEDULE_OCCURRED - schedule occurred while the function worked;
-  *            CARRY_ON - schedule didn't occur while the function worked;
-  */
--static int get_parents(struct tree_balance *tb, int n_h)
-+static int get_parents(struct tree_balance *tb, int h)
- {
-       struct treepath *path = tb->tb_path;
--      int n_position,
--          n_ret_value,
--          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
-+      int position,
-+          ret,
-+          path_offset = PATH_H_PATH_OFFSET(tb->tb_path, h);
-       struct buffer_head *curf, *curcf;
-       /* Current node is the root of the tree or will be root of the tree */
--      if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-+      if (path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-               /* The root can not have parents.
-                  Release nodes which previously were obtained as parents of the current node neighbors. */
--              brelse(tb->FL[n_h]);
--              brelse(tb->CFL[n_h]);
--              brelse(tb->FR[n_h]);
--              brelse(tb->CFR[n_h]);
--              tb->FL[n_h] = NULL;
--              tb->CFL[n_h] = NULL;
--              tb->FR[n_h] = NULL;
--              tb->CFR[n_h] = NULL;
-+              brelse(tb->FL[h]);
-+              brelse(tb->CFL[h]);
-+              brelse(tb->FR[h]);
-+              brelse(tb->CFR[h]);
-+              tb->FL[h]  = NULL;
-+              tb->CFL[h] = NULL;
-+              tb->FR[h]  = NULL;
-+              tb->CFR[h] = NULL;
-               return CARRY_ON;
-       }
--      /* Get parent FL[n_path_offset] of L[n_path_offset]. */
--      n_position = PATH_OFFSET_POSITION(path, n_path_offset - 1);
--      if (n_position) {
-+      /* Get parent FL[path_offset] of L[path_offset]. */
-+      position = PATH_OFFSET_POSITION(path, path_offset - 1);
-+      if (position) {
-               /* Current node is not the first child of its parent. */
--              curf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
--              curcf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+              curf = PATH_OFFSET_PBUFFER(path, path_offset - 1);
-+              curcf = PATH_OFFSET_PBUFFER(path, path_offset - 1);
-               get_bh(curf);
-               get_bh(curf);
--              tb->lkey[n_h] = n_position - 1;
-+              tb->lkey[h] = position - 1;
-       } else {
--              /* Calculate current parent of L[n_path_offset], which is the left neighbor of the current node.
--                 Calculate current common parent of L[n_path_offset] and the current node. Note that
--                 CFL[n_path_offset] not equal FL[n_path_offset] and CFL[n_path_offset] not equal F[n_path_offset].
--                 Calculate lkey[n_path_offset]. */
--              if ((n_ret_value = get_far_parent(tb, n_h + 1, &curf,
-+              /* Calculate current parent of L[path_offset], which is the left neighbor of the current node.
-+                 Calculate current common parent of L[path_offset] and the current node. Note that
-+                 CFL[path_offset] not equal FL[path_offset] and CFL[path_offset] not equal F[path_offset].
-+                 Calculate lkey[path_offset]. */
-+              if ((ret = get_far_parent(tb, h + 1, &curf,
-                                                 &curcf,
-                                                 LEFT_PARENTS)) != CARRY_ON)
--                      return n_ret_value;
-+                      return ret;
-       }
--      brelse(tb->FL[n_h]);
--      tb->FL[n_h] = curf;     /* New initialization of FL[n_h]. */
--      brelse(tb->CFL[n_h]);
--      tb->CFL[n_h] = curcf;   /* New initialization of CFL[n_h]. */
-+      brelse(tb->FL[h]);
-+      tb->FL[h] = curf;       /* New initialization of FL[h]. */
-+      brelse(tb->CFL[h]);
-+      tb->CFL[h] = curcf;     /* New initialization of CFL[h]. */
-       RFALSE((curf && !B_IS_IN_TREE(curf)) ||
-              (curcf && !B_IS_IN_TREE(curcf)),
-              "PAP-8195: FL (%b) or CFL (%b) is invalid", curf, curcf);
--/* Get parent FR[n_h] of R[n_h]. */
-+/* Get parent FR[h] of R[h]. */
--/* Current node is the last child of F[n_h]. FR[n_h] != F[n_h]. */
--      if (n_position == B_NR_ITEMS(PATH_H_PBUFFER(path, n_h + 1))) {
--/* Calculate current parent of R[n_h], which is the right neighbor of F[n_h].
--   Calculate current common parent of R[n_h] and current node. Note that CFR[n_h]
--   not equal FR[n_path_offset] and CFR[n_h] not equal F[n_h]. */
--              if ((n_ret_value =
--                   get_far_parent(tb, n_h + 1, &curf, &curcf,
-+/* Current node is the last child of F[h]. FR[h] != F[h]. */
-+      if (position == B_NR_ITEMS(PATH_H_PBUFFER(path, h + 1))) {
-+/* Calculate current parent of R[h], which is the right neighbor of F[h].
-+   Calculate current common parent of R[h] and current node. Note that CFR[h]
-+   not equal FR[path_offset] and CFR[h] not equal F[h]. */
-+              if ((ret =
-+                   get_far_parent(tb, h + 1, &curf, &curcf,
-                                   RIGHT_PARENTS)) != CARRY_ON)
--                      return n_ret_value;
-+                      return ret;
-       } else {
--/* Current node is not the last child of its parent F[n_h]. */
--              curf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
--              curcf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+/* Current node is not the last child of its parent F[h]. */
-+              curf = PATH_OFFSET_PBUFFER(path, path_offset - 1);
-+              curcf = PATH_OFFSET_PBUFFER(path, path_offset - 1);
-               get_bh(curf);
-               get_bh(curf);
--              tb->rkey[n_h] = n_position;
-+              tb->rkey[h] = position;
-       }
--      brelse(tb->FR[n_h]);
--      /* New initialization of FR[n_path_offset]. */
--      tb->FR[n_h] = curf;
-+      brelse(tb->FR[h]);
-+      /* New initialization of FR[path_offset]. */
-+      tb->FR[h] = curf;
--      brelse(tb->CFR[n_h]);
--      /* New initialization of CFR[n_path_offset]. */
--      tb->CFR[n_h] = curcf;
-+      brelse(tb->CFR[h]);
-+      /* New initialization of CFR[path_offset]. */
-+      tb->CFR[h] = curcf;
-       RFALSE((curf && !B_IS_IN_TREE(curf)) ||
-              (curcf && !B_IS_IN_TREE(curcf)),
-@@ -1222,7 +1222,7 @@ static int ip_check_balance(struct tree_
-                                  contains node being balanced.  The mnemonic is
-                                  that the attempted change in node space used level
-                                  is levbytes bytes. */
--       n_ret_value;
-+       ret;
-       int lfree, sfree, rfree /* free space in L, S and R */ ;
-@@ -1262,22 +1262,22 @@ static int ip_check_balance(struct tree_
-               if (!h)
-                       reiserfs_panic(tb->tb_sb, "vs-8210",
-                                      "S[0] can not be 0");
--              switch (n_ret_value = get_empty_nodes(tb, h)) {
-+              switch (ret = get_empty_nodes(tb, h)) {
-               case CARRY_ON:
-                       set_parameters(tb, h, 0, 0, 1, NULL, -1, -1);
-                       return NO_BALANCING_NEEDED;     /* no balancing for higher levels needed */
-               case NO_DISK_SPACE:
-               case REPEAT_SEARCH:
--                      return n_ret_value;
-+                      return ret;
-               default:
-                       reiserfs_panic(tb->tb_sb, "vs-8215", "incorrect "
-                                      "return value of get_empty_nodes");
-               }
-       }
--      if ((n_ret_value = get_parents(tb, h)) != CARRY_ON)     /* get parents of S[h] neighbors. */
--              return n_ret_value;
-+      if ((ret = get_parents(tb, h)) != CARRY_ON)     /* get parents of S[h] neighbors. */
-+              return ret;
-       sfree = B_FREE_SPACE(Sh);
-@@ -1564,7 +1564,7 @@ static int dc_check_balance_internal(str
-       /* Sh is the node whose balance is currently being checked,
-          and Fh is its father.  */
-       struct buffer_head *Sh, *Fh;
--      int maxsize, n_ret_value;
-+      int maxsize, ret;
-       int lfree, rfree /* free space in L and R */ ;
-       Sh = PATH_H_PBUFFER(tb->tb_path, h);
-@@ -1589,8 +1589,8 @@ static int dc_check_balance_internal(str
-               return CARRY_ON;
-       }
--      if ((n_ret_value = get_parents(tb, h)) != CARRY_ON)
--              return n_ret_value;
-+      if ((ret = get_parents(tb, h)) != CARRY_ON)
-+              return ret;
-       /* get free space of neighbors */
-       rfree = get_rfree(tb, h);
-@@ -1747,7 +1747,7 @@ static int dc_check_balance_leaf(struct
-          attempted change in node space used level is levbytes bytes. */
-       int levbytes;
-       /* the maximal item size */
--      int maxsize, n_ret_value;
-+      int maxsize, ret;
-       /* S0 is the node whose balance is currently being checked,
-          and F0 is its father.  */
-       struct buffer_head *S0, *F0;
-@@ -1769,8 +1769,8 @@ static int dc_check_balance_leaf(struct
-               return NO_BALANCING_NEEDED;
-       }
--      if ((n_ret_value = get_parents(tb, h)) != CARRY_ON)
--              return n_ret_value;
-+      if ((ret = get_parents(tb, h)) != CARRY_ON)
-+              return ret;
-       /* get free space of neighbors */
-       rfree = get_rfree(tb, h);
-@@ -1889,40 +1889,40 @@ static int check_balance(int mode,
- }
- /* Check whether parent at the path is the really parent of the current node.*/
--static int get_direct_parent(struct tree_balance *tb, int n_h)
-+static int get_direct_parent(struct tree_balance *tb, int h)
- {
-       struct buffer_head *bh;
-       struct treepath *path = tb->tb_path;
--      int n_position,
--          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
-+      int position,
-+          path_offset = PATH_H_PATH_OFFSET(tb->tb_path, h);
-       /* We are in the root or in the new root. */
--      if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-+      if (path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
--              RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET - 1,
-+              RFALSE(path_offset < FIRST_PATH_ELEMENT_OFFSET - 1,
-                      "PAP-8260: invalid offset in the path");
-               if (PATH_OFFSET_PBUFFER(path, FIRST_PATH_ELEMENT_OFFSET)->
-                   b_blocknr == SB_ROOT_BLOCK(tb->tb_sb)) {
-                       /* Root is not changed. */
--                      PATH_OFFSET_PBUFFER(path, n_path_offset - 1) = NULL;
--                      PATH_OFFSET_POSITION(path, n_path_offset - 1) = 0;
-+                      PATH_OFFSET_PBUFFER(path, path_offset - 1) = NULL;
-+                      PATH_OFFSET_POSITION(path, path_offset - 1) = 0;
-                       return CARRY_ON;
-               }
-               return REPEAT_SEARCH;   /* Root is changed and we must recalculate the path. */
-       }
-       if (!B_IS_IN_TREE
--          (bh = PATH_OFFSET_PBUFFER(path, n_path_offset - 1)))
-+          (bh = PATH_OFFSET_PBUFFER(path, path_offset - 1)))
-               return REPEAT_SEARCH;   /* Parent in the path is not in the tree. */
--      if ((n_position =
-+      if ((position =
-            PATH_OFFSET_POSITION(path,
--                                n_path_offset - 1)) > B_NR_ITEMS(bh))
-+                                path_offset - 1)) > B_NR_ITEMS(bh))
-               return REPEAT_SEARCH;
--      if (B_N_CHILD_NUM(bh, n_position) !=
--          PATH_OFFSET_PBUFFER(path, n_path_offset)->b_blocknr)
-+      if (B_N_CHILD_NUM(bh, position) !=
-+          PATH_OFFSET_PBUFFER(path, path_offset)->b_blocknr)
-               /* Parent in the path is not parent of the current node in the tree. */
-               return REPEAT_SEARCH;
-@@ -1935,92 +1935,92 @@ static int get_direct_parent(struct tree
-       return CARRY_ON;        /* Parent in the path is unlocked and really parent of the current node.  */
- }
--/* Using lnum[n_h] and rnum[n_h] we should determine what neighbors
-- * of S[n_h] we
-- * need in order to balance S[n_h], and get them if necessary.
-+/* Using lnum[h] and rnum[h] we should determine what neighbors
-+ * of S[h] we
-+ * need in order to balance S[h], and get them if necessary.
-  * Returns:   SCHEDULE_OCCURRED - schedule occurred while the function worked;
-  *            CARRY_ON - schedule didn't occur while the function worked;
-  */
--static int get_neighbors(struct tree_balance *tb, int n_h)
-+static int get_neighbors(struct tree_balance *tb, int h)
- {
--      int n_child_position,
--          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h + 1);
--      unsigned long n_son_number;
-+      int child_position,
-+          path_offset = PATH_H_PATH_OFFSET(tb->tb_path, h + 1);
-+      unsigned long son_number;
-       struct super_block *sb = tb->tb_sb;
-       struct buffer_head *bh;
--      PROC_INFO_INC(sb, get_neighbors[n_h]);
-+      PROC_INFO_INC(sb, get_neighbors[h]);
--      if (tb->lnum[n_h]) {
--              /* We need left neighbor to balance S[n_h]. */
--              PROC_INFO_INC(sb, need_l_neighbor[n_h]);
--              bh = PATH_OFFSET_PBUFFER(tb->tb_path, n_path_offset);
-+      if (tb->lnum[h]) {
-+              /* We need left neighbor to balance S[h]. */
-+              PROC_INFO_INC(sb, need_l_neighbor[h]);
-+              bh = PATH_OFFSET_PBUFFER(tb->tb_path, path_offset);
--              RFALSE(bh == tb->FL[n_h] &&
--                     !PATH_OFFSET_POSITION(tb->tb_path, n_path_offset),
-+              RFALSE(bh == tb->FL[h] &&
-+                     !PATH_OFFSET_POSITION(tb->tb_path, path_offset),
-                      "PAP-8270: invalid position in the parent");
--              n_child_position =
-+              child_position =
-                   (bh ==
--                   tb->FL[n_h]) ? tb->lkey[n_h] : B_NR_ITEMS(tb->
--                                                                     FL[n_h]);
--              n_son_number = B_N_CHILD_NUM(tb->FL[n_h], n_child_position);
--              bh = sb_bread(sb, n_son_number);
-+                   tb->FL[h]) ? tb->lkey[h] : B_NR_ITEMS(tb->
-+                                                                     FL[h]);
-+              son_number = B_N_CHILD_NUM(tb->FL[h], child_position);
-+              bh = sb_bread(sb, son_number);
-               if (!bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(tb)) {
-                       brelse(bh);
--                      PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-+                      PROC_INFO_INC(sb, get_neighbors_restart[h]);
-                       return REPEAT_SEARCH;
-               }
--              RFALSE(!B_IS_IN_TREE(tb->FL[n_h]) ||
--                     n_child_position > B_NR_ITEMS(tb->FL[n_h]) ||
--                     B_N_CHILD_NUM(tb->FL[n_h], n_child_position) !=
-+              RFALSE(!B_IS_IN_TREE(tb->FL[h]) ||
-+                     child_position > B_NR_ITEMS(tb->FL[h]) ||
-+                     B_N_CHILD_NUM(tb->FL[h], child_position) !=
-                      bh->b_blocknr, "PAP-8275: invalid parent");
-               RFALSE(!B_IS_IN_TREE(bh), "PAP-8280: invalid child");
--              RFALSE(!n_h &&
-+              RFALSE(!h &&
-                      B_FREE_SPACE(bh) !=
-                      MAX_CHILD_SIZE(bh) -
--                     dc_size(B_N_CHILD(tb->FL[0], n_child_position)),
-+                     dc_size(B_N_CHILD(tb->FL[0], child_position)),
-                      "PAP-8290: invalid child size of left neighbor");
--              brelse(tb->L[n_h]);
--              tb->L[n_h] = bh;
-+              brelse(tb->L[h]);
-+              tb->L[h] = bh;
-       }
--      /* We need right neighbor to balance S[n_path_offset]. */
--      if (tb->rnum[n_h]) {
--              PROC_INFO_INC(sb, need_r_neighbor[n_h]);
--              bh = PATH_OFFSET_PBUFFER(tb->tb_path, n_path_offset);
-+      /* We need right neighbor to balance S[path_offset]. */
-+      if (tb->rnum[h]) {      /* We need right neighbor to balance S[path_offset]. */
-+              PROC_INFO_INC(sb, need_r_neighbor[h]);
-+              bh = PATH_OFFSET_PBUFFER(tb->tb_path, path_offset);
--              RFALSE(bh == tb->FR[n_h] &&
-+              RFALSE(bh == tb->FR[h] &&
-                      PATH_OFFSET_POSITION(tb->tb_path,
--                                          n_path_offset) >=
-+                                          path_offset) >=
-                      B_NR_ITEMS(bh),
-                      "PAP-8295: invalid position in the parent");
--              n_child_position =
--                  (bh == tb->FR[n_h]) ? tb->rkey[n_h] + 1 : 0;
--              n_son_number = B_N_CHILD_NUM(tb->FR[n_h], n_child_position);
--              bh = sb_bread(sb, n_son_number);
-+              child_position =
-+                  (bh == tb->FR[h]) ? tb->rkey[h] + 1 : 0;
-+              son_number = B_N_CHILD_NUM(tb->FR[h], child_position);
-+              bh = sb_bread(sb, son_number);
-               if (!bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(tb)) {
-                       brelse(bh);
--                      PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-+                      PROC_INFO_INC(sb, get_neighbors_restart[h]);
-                       return REPEAT_SEARCH;
-               }
--              brelse(tb->R[n_h]);
--              tb->R[n_h] = bh;
-+              brelse(tb->R[h]);
-+              tb->R[h] = bh;
--              RFALSE(!n_h
-+              RFALSE(!h
-                      && B_FREE_SPACE(bh) !=
-                      MAX_CHILD_SIZE(bh) -
--                     dc_size(B_N_CHILD(tb->FR[0], n_child_position)),
-+                     dc_size(B_N_CHILD(tb->FR[0], child_position)),
-                      "PAP-8300: invalid child size of right neighbor (%d != %d - %d)",
-                      B_FREE_SPACE(bh), MAX_CHILD_SIZE(bh),
--                     dc_size(B_N_CHILD(tb->FR[0], n_child_position)));
-+                     dc_size(B_N_CHILD(tb->FR[0], child_position)));
-       }
-       return CARRY_ON;
-@@ -2317,11 +2317,11 @@ static int wait_tb_buffers_until_unlocke
-  *             -1 - if no_disk_space
-  */
--int fix_nodes(int n_op_mode, struct tree_balance *tb,
-+int fix_nodes(int op_mode, struct tree_balance *tb,
-             struct item_head *ins_ih, const void *data)
- {
--      int n_ret_value, n_h, n_item_num = PATH_LAST_POSITION(tb->tb_path);
--      int n_pos_in_item;
-+      int ret, h, item_num = PATH_LAST_POSITION(tb->tb_path);
-+      int pos_in_item;
-       /* we set wait_tb_buffers_run when we have to restore any dirty bits cleared
-        ** during wait_tb_buffers_run
-@@ -2331,7 +2331,7 @@ int fix_nodes(int n_op_mode, struct tree
-       ++REISERFS_SB(tb->tb_sb)->s_fix_nodes;
--      n_pos_in_item = tb->tb_path->pos_in_item;
-+      pos_in_item = tb->tb_path->pos_in_item;
-       tb->fs_gen = get_generation(tb->tb_sb);
-@@ -2364,26 +2364,26 @@ int fix_nodes(int n_op_mode, struct tree
-               reiserfs_panic(tb->tb_sb, "PAP-8320", "S[0] (%b %z) is "
-                              "not uptodate at the beginning of fix_nodes "
-                              "or not in tree (mode %c)",
--                             tbS0, tbS0, n_op_mode);
-+                             tbS0, tbS0, op_mode);
-       /* Check parameters. */
--      switch (n_op_mode) {
-+      switch (op_mode) {
-       case M_INSERT:
--              if (n_item_num <= 0 || n_item_num > B_NR_ITEMS(tbS0))
-+              if (item_num <= 0 || item_num > B_NR_ITEMS(tbS0))
-                       reiserfs_panic(tb->tb_sb, "PAP-8330", "Incorrect "
-                                      "item number %d (in S0 - %d) in case "
--                                     "of insert", n_item_num,
-+                                     "of insert", item_num,
-                                      B_NR_ITEMS(tbS0));
-               break;
-       case M_PASTE:
-       case M_DELETE:
-       case M_CUT:
--              if (n_item_num < 0 || n_item_num >= B_NR_ITEMS(tbS0)) {
-+              if (item_num < 0 || item_num >= B_NR_ITEMS(tbS0)) {
-                       print_block(tbS0, 0, -1, -1);
-                       reiserfs_panic(tb->tb_sb, "PAP-8335", "Incorrect "
-                                      "item number(%d); mode = %c "
-                                      "insert_size = %d",
--                                     n_item_num, n_op_mode,
-+                                     item_num, op_mode,
-                                      tb->insert_size[0]);
-               }
-               break;
-@@ -2397,73 +2397,73 @@ int fix_nodes(int n_op_mode, struct tree
-               // FIXME: maybe -ENOMEM when tb->vn_buf == 0? Now just repeat
-               return REPEAT_SEARCH;
--      /* Starting from the leaf level; for all levels n_h of the tree. */
--      for (n_h = 0; n_h < MAX_HEIGHT && tb->insert_size[n_h]; n_h++) {
--              n_ret_value = get_direct_parent(tb, n_h);
--              if (n_ret_value != CARRY_ON)
-+      /* Starting from the leaf level; for all levels h of the tree. */
-+      for (h = 0; h < MAX_HEIGHT && tb->insert_size[h]; h++) {
-+              ret = get_direct_parent(tb, h);
-+              if (ret != CARRY_ON)
-                       goto repeat;
--              n_ret_value = check_balance(n_op_mode, tb, n_h, n_item_num,
--                                          n_pos_in_item, ins_ih, data);
--              if (n_ret_value != CARRY_ON) {
--                      if (n_ret_value == NO_BALANCING_NEEDED) {
-+              ret = check_balance(op_mode, tb, h, item_num,
-+                                  pos_in_item, ins_ih, data);
-+              if (ret != CARRY_ON) {
-+                      if (ret == NO_BALANCING_NEEDED) {
-                               /* No balancing for higher levels needed. */
--                              n_ret_value = get_neighbors(tb, n_h);
--                              if (n_ret_value != CARRY_ON)
-+                              ret = get_neighbors(tb, h);
-+                              if (ret != CARRY_ON)
-                                       goto repeat;
--                              if (n_h != MAX_HEIGHT - 1)
--                                      tb->insert_size[n_h + 1] = 0;
-+                              if (h != MAX_HEIGHT - 1)
-+                                      tb->insert_size[h + 1] = 0;
-                               /* ok, analysis and resource gathering are complete */
-                               break;
-                       }
-                       goto repeat;
-               }
--              n_ret_value = get_neighbors(tb, n_h);
--              if (n_ret_value != CARRY_ON)
-+              ret = get_neighbors(tb, h);
-+              if (ret != CARRY_ON)
-                       goto repeat;
-               /* No disk space, or schedule occurred and analysis may be
-                * invalid and needs to be redone. */
--              n_ret_value = get_empty_nodes(tb, n_h);
--              if (n_ret_value != CARRY_ON)
-+              ret = get_empty_nodes(tb, h);
-+              if (ret != CARRY_ON)
-                       goto repeat;
--              if (!PATH_H_PBUFFER(tb->tb_path, n_h)) {
-+              if (!PATH_H_PBUFFER(tb->tb_path, h)) {
-                       /* We have a positive insert size but no nodes exist on this
-                          level, this means that we are creating a new root. */
--                      RFALSE(tb->blknum[n_h] != 1,
-+                      RFALSE(tb->blknum[h] != 1,
-                              "PAP-8350: creating new empty root");
--                      if (n_h < MAX_HEIGHT - 1)
--                              tb->insert_size[n_h + 1] = 0;
--              } else if (!PATH_H_PBUFFER(tb->tb_path, n_h + 1)) {
--                      if (tb->blknum[n_h] > 1) {
--                              /* The tree needs to be grown, so this node S[n_h]
-+                      if (h < MAX_HEIGHT - 1)
-+                              tb->insert_size[h + 1] = 0;
-+              } else if (!PATH_H_PBUFFER(tb->tb_path, h + 1)) {
-+                      if (tb->blknum[h] > 1) {
-+                              /* The tree needs to be grown, so this node S[h]
-                                  which is the root node is split into two nodes,
--                                 and a new node (S[n_h+1]) will be created to
-+                                 and a new node (S[h+1]) will be created to
-                                  become the root node.  */
--                              RFALSE(n_h == MAX_HEIGHT - 1,
-+                              RFALSE(h == MAX_HEIGHT - 1,
-                                      "PAP-8355: attempt to create too high of a tree");
--                              tb->insert_size[n_h + 1] =
-+                              tb->insert_size[h + 1] =
-                                   (DC_SIZE +
--                                   KEY_SIZE) * (tb->blknum[n_h] - 1) +
-+                                   KEY_SIZE) * (tb->blknum[h] - 1) +
-                                   DC_SIZE;
--                      } else if (n_h < MAX_HEIGHT - 1)
--                              tb->insert_size[n_h + 1] = 0;
-+                      } else if (h < MAX_HEIGHT - 1)
-+                              tb->insert_size[h + 1] = 0;
-               } else
--                      tb->insert_size[n_h + 1] =
--                          (DC_SIZE + KEY_SIZE) * (tb->blknum[n_h] - 1);
-+                      tb->insert_size[h + 1] =
-+                          (DC_SIZE + KEY_SIZE) * (tb->blknum[h] - 1);
-       }
--      n_ret_value = wait_tb_buffers_until_unlocked(tb);
--      if (n_ret_value == CARRY_ON) {
-+      ret = wait_tb_buffers_until_unlocked(tb);
-+      if (ret == CARRY_ON) {
-               if (FILESYSTEM_CHANGED_TB(tb)) {
-                       wait_tb_buffers_run = 1;
--                      n_ret_value = REPEAT_SEARCH;
-+                      ret = REPEAT_SEARCH;
-                       goto repeat;
-               } else {
-                       return CARRY_ON;
-@@ -2529,7 +2529,7 @@ int fix_nodes(int n_op_mode, struct tree
-                                           (tb->tb_sb, tb->FEB[i]);
-                       }
-               }
--              return n_ret_value;
-+              return ret;
-       }
- }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -136,11 +136,11 @@ inline int comp_short_le_keys(const stru
-                             const struct reiserfs_key *key2)
- {
-       __u32 *k1_u32, *k2_u32;
--      int n_key_length = REISERFS_SHORT_KEY_LEN;
-+      int key_length = REISERFS_SHORT_KEY_LEN;
-       k1_u32 = (__u32 *) key1;
-       k2_u32 = (__u32 *) key2;
--      for (; n_key_length--; ++k1_u32, ++k2_u32) {
-+      for (; key_length--; ++k1_u32, ++k2_u32) {
-               if (le32_to_cpu(*k1_u32) < le32_to_cpu(*k2_u32))
-                       return -1;
-               if (le32_to_cpu(*k1_u32) > le32_to_cpu(*k2_u32))
-@@ -177,10 +177,10 @@ inline int comp_le_keys(const struct rei
-  *        *pos = number of the searched element if found, else the        *
-  *        number of the first element that is larger than key.            *
-  **************************************************************************/
--/* For those not familiar with binary search: n_lbound is the leftmost item that it
-- could be, n_rbound the rightmost item that it could be.  We examine the item
-- halfway between n_lbound and n_rbound, and that tells us either that we can increase
-- n_lbound, or decrease n_rbound, or that we have found it, or if n_lbound <= n_rbound that
-+/* For those not familiar with binary search: lbound is the leftmost item that it
-+ could be, rbound the rightmost item that it could be.  We examine the item
-+ halfway between lbound and rbound, and that tells us either that we can increase
-+ lbound, or decrease rbound, or that we have found it, or if lbound <= rbound that
-  there are no possible items, and we have not found it. With each examination we
-  cut the number of possible items it could be by one more than half rounded down,
-  or we find it. */
-@@ -198,28 +198,27 @@ static inline int bin_search(const void
-                            int *pos /* Number of the searched for element. */
-     )
- {
--      int n_rbound, n_lbound, n_j;
-+      int rbound, lbound, j;
--      for (n_j = ((n_rbound = num - 1) + (n_lbound = 0)) / 2;
--           n_lbound <= n_rbound; n_j = (n_rbound + n_lbound) / 2)
-+      for (j = ((rbound = num - 1) + (lbound = 0)) / 2;
-+           lbound <= rbound; j = (rbound + lbound) / 2)
-               switch (comp_keys
--                      ((struct reiserfs_key *)((char *)base +
--                                               n_j * width),
-+                      ((struct reiserfs_key *)((char *)base + j * width),
-                        (struct cpu_key *)key)) {
-               case -1:
--                      n_lbound = n_j + 1;
-+                      lbound = j + 1;
-                       continue;
-               case 1:
--                      n_rbound = n_j - 1;
-+                      rbound = j - 1;
-                       continue;
-               case 0:
--                      *pos = n_j;
-+                      *pos = j;
-                       return ITEM_FOUND;      /* Key found in the array.  */
-               }
-       /* bin_search did not find given key, it returns position of key,
-          that is minimal and greater than the given one. */
--      *pos = n_lbound;
-+      *pos = lbound;
-       return ITEM_NOT_FOUND;
- }
-@@ -242,43 +241,41 @@ static const struct reiserfs_key MAX_KEY
-    of the path, and going upwards.  We must check the path's validity at each step.  If the key is not in
-    the path, there is no delimiting key in the tree (buffer is first or last buffer in tree), and in this
-    case we return a special key, either MIN_KEY or MAX_KEY. */
--static inline const struct reiserfs_key *get_lkey(const struct treepath
--                                                *chk_path,
--                                                const struct super_block
--                                                *sb)
-+static inline const struct reiserfs_key *get_lkey(const struct treepath *chk_path,
-+                                                const struct super_block *sb)
- {
--      int n_position, n_path_offset = chk_path->path_length;
-+      int position, path_offset = chk_path->path_length;
-       struct buffer_head *parent;
--      RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET,
-+      RFALSE(path_offset < FIRST_PATH_ELEMENT_OFFSET,
-              "PAP-5010: invalid offset in the path");
-       /* While not higher in path than first element. */
--      while (n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-+      while (path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-               RFALSE(!buffer_uptodate
--                     (PATH_OFFSET_PBUFFER(chk_path, n_path_offset)),
-+                     (PATH_OFFSET_PBUFFER(chk_path, path_offset)),
-                      "PAP-5020: parent is not uptodate");
-               /* Parent at the path is not in the tree now. */
-               if (!B_IS_IN_TREE
-                   (parent =
--                   PATH_OFFSET_PBUFFER(chk_path, n_path_offset)))
-+                   PATH_OFFSET_PBUFFER(chk_path, path_offset)))
-                       return &MAX_KEY;
-               /* Check whether position in the parent is correct. */
--              if ((n_position =
-+              if ((position =
-                    PATH_OFFSET_POSITION(chk_path,
--                                        n_path_offset)) >
-+                                        path_offset)) >
-                   B_NR_ITEMS(parent))
-                       return &MAX_KEY;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(parent, n_position) !=
-+              if (B_N_CHILD_NUM(parent, position) !=
-                   PATH_OFFSET_PBUFFER(chk_path,
--                                      n_path_offset + 1)->b_blocknr)
-+                                      path_offset + 1)->b_blocknr)
-                       return &MAX_KEY;
-               /* Return delimiting key if position in the parent is not equal to zero. */
--              if (n_position)
--                      return B_N_PDELIM_KEY(parent, n_position - 1);
-+              if (position)
-+                      return B_N_PDELIM_KEY(parent, position - 1);
-       }
-       /* Return MIN_KEY if we are in the root of the buffer tree. */
-       if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-@@ -291,37 +288,37 @@ static inline const struct reiserfs_key
- inline const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
-                                          const struct super_block *sb)
- {
--      int n_position, n_path_offset = chk_path->path_length;
-+      int position, path_offset = chk_path->path_length;
-       struct buffer_head *parent;
--      RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET,
-+      RFALSE(path_offset < FIRST_PATH_ELEMENT_OFFSET,
-              "PAP-5030: invalid offset in the path");
--      while (n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-+      while (path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-               RFALSE(!buffer_uptodate
--                     (PATH_OFFSET_PBUFFER(chk_path, n_path_offset)),
-+                     (PATH_OFFSET_PBUFFER(chk_path, path_offset)),
-                      "PAP-5040: parent is not uptodate");
-               /* Parent at the path is not in the tree now. */
-               if (!B_IS_IN_TREE
-                   (parent =
--                   PATH_OFFSET_PBUFFER(chk_path, n_path_offset)))
-+                   PATH_OFFSET_PBUFFER(chk_path, path_offset)))
-                       return &MIN_KEY;
-               /* Check whether position in the parent is correct. */
--              if ((n_position =
-+              if ((position =
-                    PATH_OFFSET_POSITION(chk_path,
--                                        n_path_offset)) >
-+                                        path_offset)) >
-                   B_NR_ITEMS(parent))
-                       return &MIN_KEY;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(parent, n_position) !=
-+              if (B_N_CHILD_NUM(parent, position) !=
-                   PATH_OFFSET_PBUFFER(chk_path,
--                                      n_path_offset + 1)->b_blocknr)
-+                                      path_offset + 1)->b_blocknr)
-                       return &MIN_KEY;
-               /* Return delimiting key if position in the parent is not the last one. */
--              if (n_position != B_NR_ITEMS(parent))
--                      return B_N_PDELIM_KEY(parent, n_position);
-+              if (position != B_NR_ITEMS(parent))
-+                      return B_N_PDELIM_KEY(parent, position);
-       }
-       /* Return MAX_KEY if we are in the root of the buffer tree. */
-       if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-@@ -371,14 +368,14 @@ int reiserfs_check_path(struct treepath
- void pathrelse_and_restore(struct super_block *sb,
-                          struct treepath *search_path)
- {
--      int n_path_offset = search_path->path_length;
-+      int path_offset = search_path->path_length;
--      RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-+      RFALSE(path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-              "clm-4000: invalid path offset");
--      while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
-+      while (path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
-               struct buffer_head *bh;
--              bh = PATH_OFFSET_PBUFFER(search_path, n_path_offset--);
-+              bh = PATH_OFFSET_PBUFFER(search_path, path_offset--);
-               reiserfs_restore_prepared_buffer(sb, bh);
-               brelse(bh);
-       }
-@@ -388,13 +385,13 @@ void pathrelse_and_restore(struct super_
- /* Drop the reference to each buffer in a path */
- void pathrelse(struct treepath *search_path)
- {
--      int n_path_offset = search_path->path_length;
-+      int path_offset = search_path->path_length;
--      RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-+      RFALSE(path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-              "PAP-5090: invalid path offset");
--      while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET)
--              brelse(PATH_OFFSET_PBUFFER(search_path, n_path_offset--));
-+      while (path_offset > ILLEGAL_PATH_ELEMENT_OFFSET)
-+              brelse(PATH_OFFSET_PBUFFER(search_path, path_offset--));
-       search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
- }
-@@ -572,16 +569,16 @@ int search_by_key(struct super_block *sb
-                                                  by the calling
-                                                  function. It is filled up
-                                                  by this function.  */
--                int n_stop_level      /* How far down the tree to search. To
-+                int stop_level        /* How far down the tree to search. To
-                                          stop at leaf level - set to
-                                          DISK_LEAF_NODE_LEVEL */
-     )
- {
--      b_blocknr_t n_block_number;
-+      b_blocknr_t block_number;
-       int expected_level;
-       struct buffer_head *bh;
-       struct path_element *last_element;
--      int n_node_level, n_retval;
-+      int node_level, retval;
-       int right_neighbor_of_leaf_node;
-       int fs_gen;
-       struct buffer_head *reada_bh[SEARCH_BY_KEY_READA];
-@@ -589,7 +586,7 @@ int search_by_key(struct super_block *sb
-       int reada_count = 0;
- #ifdef CONFIG_REISERFS_CHECK
--      int n_repeat_counter = 0;
-+      int repeat_counter = 0;
- #endif
-       PROC_INFO_INC(sb, search_by_key);
-@@ -605,16 +602,16 @@ int search_by_key(struct super_block *sb
-       /* With each iteration of this loop we search through the items in the
-          current node, and calculate the next current node(next path element)
-          for the next iteration of this loop.. */
--      n_block_number = SB_ROOT_BLOCK(sb);
-+      block_number = SB_ROOT_BLOCK(sb);
-       expected_level = -1;
-       while (1) {
- #ifdef CONFIG_REISERFS_CHECK
--              if (!(++n_repeat_counter % 50000))
-+              if (!(++repeat_counter % 50000))
-                       reiserfs_warning(sb, "PAP-5100",
-                                        "%s: there were %d iterations of "
-                                        "while loop looking for key %K",
--                                       current->comm, n_repeat_counter,
-+                                       current->comm, repeat_counter,
-                                        key);
- #endif
-@@ -627,7 +624,7 @@ int search_by_key(struct super_block *sb
-               /* Read the next tree node, and set the last element in the path to
-                  have a pointer to it. */
-               if ((bh = last_element->pe_buffer =
--                   sb_getblk(sb, n_block_number))) {
-+                   sb_getblk(sb, block_number))) {
-                       if (!buffer_uptodate(bh) && reada_count > 1)
-                               search_by_key_reada(sb, reada_bh,
-                                                   reada_blocks, reada_count);
-@@ -661,7 +658,7 @@ int search_by_key(struct super_block *sb
-                       /* Get the root block number so that we can repeat the search
-                          starting from the root. */
--                      n_block_number = SB_ROOT_BLOCK(sb);
-+                      block_number = SB_ROOT_BLOCK(sb);
-                       expected_level = -1;
-                       right_neighbor_of_leaf_node = 0;
-@@ -694,26 +691,26 @@ int search_by_key(struct super_block *sb
-               }
-               /* ok, we have acquired next formatted node in the tree */
--              n_node_level = B_LEVEL(bh);
-+              node_level = B_LEVEL(bh);
--              PROC_INFO_BH_STAT(sb, bh, n_node_level - 1);
-+              PROC_INFO_BH_STAT(sb, bh, node_level - 1);
--              RFALSE(n_node_level < n_stop_level,
-+              RFALSE(node_level < stop_level,
-                      "vs-5152: tree level (%d) is less than stop level (%d)",
--                     n_node_level, n_stop_level);
-+                     node_level, stop_level);
--              n_retval = bin_search(key, B_N_PITEM_HEAD(bh, 0),
-+              retval = bin_search(key, B_N_PITEM_HEAD(bh, 0),
-                                     B_NR_ITEMS(bh),
--                                    (n_node_level ==
-+                                    (node_level ==
-                                      DISK_LEAF_NODE_LEVEL) ? IH_SIZE :
-                                     KEY_SIZE,
-                                     &(last_element->pe_position));
--              if (n_node_level == n_stop_level) {
--                      return n_retval;
-+              if (node_level == stop_level) {
-+                      return retval;
-               }
-               /* we are not in the stop level */
--              if (n_retval == ITEM_FOUND)
-+              if (retval == ITEM_FOUND)
-                       /* item has been found, so we choose the pointer which is to the right of the found one */
-                       last_element->pe_position++;
-@@ -724,12 +721,12 @@ int search_by_key(struct super_block *sb
-               /* So we have chosen a position in the current node which is
-                  an internal node.  Now we calculate child block number by
-                  position in the node. */
--              n_block_number =
-+              block_number =
-                   B_N_CHILD_NUM(bh, last_element->pe_position);
-               /* if we are going to read leaf nodes, try for read ahead as well */
-               if ((search_path->reada & PATH_READA) &&
--                  n_node_level == DISK_LEAF_NODE_LEVEL + 1) {
-+                  node_level == DISK_LEAF_NODE_LEVEL + 1) {
-                       int pos = last_element->pe_position;
-                       int limit = B_NR_ITEMS(bh);
-                       struct reiserfs_key *le_key;
-@@ -781,7 +778,7 @@ int search_for_position_by_key(struct su
-     )
- {
-       struct item_head *p_le_ih;      /* pointer to on-disk structure */
--      int n_blk_size;
-+      int blk_size;
-       loff_t item_offset, offset;
-       struct reiserfs_dir_entry de;
-       int retval;
-@@ -816,7 +813,7 @@ int search_for_position_by_key(struct su
-       p_le_ih =
-           B_N_PITEM_HEAD(PATH_PLAST_BUFFER(search_path),
-                          --PATH_LAST_POSITION(search_path));
--      n_blk_size = sb->s_blocksize;
-+      blk_size = sb->s_blocksize;
-       if (comp_short_keys(&(p_le_ih->ih_key), p_cpu_key)) {
-               return FILE_NOT_FOUND;
-@@ -828,10 +825,10 @@ int search_for_position_by_key(struct su
-       /* Needed byte is contained in the item pointed to by the path. */
-       if (item_offset <= offset &&
--          item_offset + op_bytes_number(p_le_ih, n_blk_size) > offset) {
-+          item_offset + op_bytes_number(p_le_ih, blk_size) > offset) {
-               pos_in_item(search_path) = offset - item_offset;
-               if (is_indirect_le_ih(p_le_ih)) {
--                      pos_in_item(search_path) /= n_blk_size;
-+                      pos_in_item(search_path) /= blk_size;
-               }
-               return POSITION_FOUND;
-       }
-@@ -891,7 +888,7 @@ static inline int prepare_for_direct_ite
-       if (get_inode_item_key_version(inode) == KEY_FORMAT_3_6) {
-               //
-               round_len = ROUND_UP(new_file_length);
--              /* this was n_new_file_length < le_ih ... */
-+              /* this was new_file_length < le_ih ... */
-               if (round_len < le_ih_k_offset(le_ih)) {
-                       *cut_size = -(IH_SIZE + ih_item_len(le_ih));
-                       return M_DELETE;        /* Delete this item. */
-@@ -953,7 +950,7 @@ static inline int prepare_for_direntry_i
-     This function returns a determination of what balance mode the calling function should employ. */
- static char prepare_for_delete_or_cut(struct reiserfs_transaction_handle *th, struct inode *inode, struct treepath *path, const struct cpu_key *item_key, int *removed,       /* Number of unformatted nodes which were removed
-                                                                                                                                                                                  from end of the file. */
--                                    int *cut_size, unsigned long long n_new_file_length       /* MAX_KEY_OFFSET in case of delete. */
-+                                    int *cut_size, unsigned long long new_file_length /* MAX_KEY_OFFSET in case of delete. */
-     )
- {
-       struct super_block *sb = inode->i_sb;
-@@ -965,7 +962,7 @@ static char prepare_for_delete_or_cut(st
-       /* Stat_data item. */
-       if (is_statdata_le_ih(p_le_ih)) {
--              RFALSE(n_new_file_length != max_reiserfs_offset(inode),
-+              RFALSE(new_file_length != max_reiserfs_offset(inode),
-                      "PAP-5210: mode must be M_DELETE");
-               *cut_size = -(IH_SIZE + ih_item_len(p_le_ih));
-@@ -975,13 +972,13 @@ static char prepare_for_delete_or_cut(st
-       /* Directory item. */
-       if (is_direntry_le_ih(p_le_ih))
-               return prepare_for_direntry_item(path, p_le_ih, inode,
--                                               n_new_file_length,
-+                                               new_file_length,
-                                                cut_size);
-       /* Direct item. */
-       if (is_direct_le_ih(p_le_ih))
-               return prepare_for_direct_item(path, p_le_ih, inode,
--                                             n_new_file_length, cut_size);
-+                                             new_file_length, cut_size);
-       /* Case of an indirect item. */
-       {
-@@ -992,10 +989,10 @@ static char prepare_for_delete_or_cut(st
-           int result = M_CUT;
-           int pos = 0;
--          if ( n_new_file_length == max_reiserfs_offset (inode) ) {
-+          if ( new_file_length == max_reiserfs_offset (inode) ) {
-               /* prepare_for_delete_or_cut() is called by
-                * reiserfs_delete_item() */
--              n_new_file_length = 0;
-+              new_file_length = 0;
-               delete = 1;
-           }
-@@ -1006,7 +1003,7 @@ static char prepare_for_delete_or_cut(st
-               copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
-               pos = I_UNFM_NUM(&s_ih);
--              while (le_ih_k_offset (&s_ih) + (pos - 1) * blk_size > n_new_file_length) {
-+              while (le_ih_k_offset (&s_ih) + (pos - 1) * blk_size > new_file_length) {
-                   __le32 *unfm;
-                   __u32 block;
-@@ -1062,35 +1059,34 @@ static char prepare_for_delete_or_cut(st
- }
- /* Calculate number of bytes which will be deleted or cut during balance */
--static int calc_deleted_bytes_number(struct tree_balance *tb, char c_mode)
-+static int calc_deleted_bytes_number(struct tree_balance *tb, char mode)
- {
--      int n_del_size;
-+      int del_size;
-       struct item_head *p_le_ih = PATH_PITEM_HEAD(tb->tb_path);
-       if (is_statdata_le_ih(p_le_ih))
-               return 0;
--      n_del_size =
--          (c_mode ==
-+      del_size =
-+          (mode ==
-            M_DELETE) ? ih_item_len(p_le_ih) : -tb->insert_size[0];
-       if (is_direntry_le_ih(p_le_ih)) {
--              // return EMPTY_DIR_SIZE; /* We delete emty directoris only. */
--              // we can't use EMPTY_DIR_SIZE, as old format dirs have a different
--              // empty size.  ick. FIXME, is this right?
--              //
--              return n_del_size;
-+              /* return EMPTY_DIR_SIZE; We delete emty directoris only.
-+               * we can't use EMPTY_DIR_SIZE, as old format dirs have a different
-+               * empty size.  ick. FIXME, is this right? */
-+              return del_size;
-       }
-       if (is_indirect_le_ih(p_le_ih))
--              n_del_size = (n_del_size / UNFM_P_SIZE) *
-+              del_size = (del_size / UNFM_P_SIZE) *
-                               (PATH_PLAST_BUFFER(tb->tb_path)->b_size);
--      return n_del_size;
-+      return del_size;
- }
- static void init_tb_struct(struct reiserfs_transaction_handle *th,
-                          struct tree_balance *tb,
-                          struct super_block *sb,
--                         struct treepath *path, int n_size)
-+                         struct treepath *path, int size)
- {
-       BUG_ON(!th->t_trans_id);
-@@ -1101,7 +1097,7 @@ static void init_tb_struct(struct reiser
-       tb->tb_path = path;
-       PATH_OFFSET_PBUFFER(path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
-       PATH_OFFSET_POSITION(path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
--      tb->insert_size[0] = n_size;
-+      tb->insert_size[0] = size;
- }
- void padd_item(char *item, int total_length, int length)
-@@ -1156,11 +1152,11 @@ int reiserfs_delete_item(struct reiserfs
-       struct item_head s_ih;
-       struct item_head *q_ih;
-       int quota_cut_bytes;
--      int n_ret_value, n_del_size, n_removed;
-+      int ret_value, del_size, removed;
- #ifdef CONFIG_REISERFS_CHECK
--      char c_mode;
--      int n_iter = 0;
-+      char mode;
-+      int iter = 0;
- #endif
-       BUG_ON(!th->t_trans_id);
-@@ -1169,34 +1165,34 @@ int reiserfs_delete_item(struct reiserfs
-                      0 /*size is unknown */ );
-       while (1) {
--              n_removed = 0;
-+              removed = 0;
- #ifdef CONFIG_REISERFS_CHECK
--              n_iter++;
--              c_mode =
-+              iter++;
-+              mode =
- #endif
-                   prepare_for_delete_or_cut(th, inode, path,
--                                            item_key, &n_removed,
--                                            &n_del_size,
-+                                            item_key, &removed,
-+                                            &del_size,
-                                             max_reiserfs_offset(inode));
--              RFALSE(c_mode != M_DELETE, "PAP-5320: mode must be M_DELETE");
-+              RFALSE(mode != M_DELETE, "PAP-5320: mode must be M_DELETE");
-               copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
--              s_del_balance.insert_size[0] = n_del_size;
-+              s_del_balance.insert_size[0] = del_size;
--              n_ret_value = fix_nodes(M_DELETE, &s_del_balance, NULL, NULL);
--              if (n_ret_value != REPEAT_SEARCH)
-+              ret_value = fix_nodes(M_DELETE, &s_del_balance, NULL, NULL);
-+              if (ret_value != REPEAT_SEARCH)
-                       break;
-               PROC_INFO_INC(sb, delete_item_restarted);
-               // file system changed, repeat search
--              n_ret_value =
-+              ret_value =
-                   search_for_position_by_key(sb, item_key, path);
--              if (n_ret_value == IO_ERROR)
-+              if (ret_value == IO_ERROR)
-                       break;
--              if (n_ret_value == FILE_NOT_FOUND) {
-+              if (ret_value == FILE_NOT_FOUND) {
-                       reiserfs_warning(sb, "vs-5340",
-                                        "no items of the file %K found",
-                                        item_key);
-@@ -1204,12 +1200,12 @@ int reiserfs_delete_item(struct reiserfs
-               }
-       }                       /* while (1) */
--      if (n_ret_value != CARRY_ON) {
-+      if (ret_value != CARRY_ON) {
-               unfix_nodes(&s_del_balance);
-               return 0;
-       }
-       // reiserfs_delete_item returns item length when success
--      n_ret_value = calc_deleted_bytes_number(&s_del_balance, M_DELETE);
-+      ret_value = calc_deleted_bytes_number(&s_del_balance, M_DELETE);
-       q_ih = get_ih(path);
-       quota_cut_bytes = ih_item_len(q_ih);
-@@ -1255,7 +1251,7 @@ int reiserfs_delete_item(struct reiserfs
-               off = ((le_ih_k_offset(&s_ih) - 1) & (PAGE_CACHE_SIZE - 1));
-               memcpy(data + off,
-                      B_I_PITEM(PATH_PLAST_BUFFER(path), &s_ih),
--                     n_ret_value);
-+                     ret_value);
-               kunmap_atomic(data, KM_USER0);
-       }
-       /* Perform balancing after all resources have been collected at once. */
-@@ -1269,7 +1265,7 @@ int reiserfs_delete_item(struct reiserfs
-       DQUOT_FREE_SPACE_NODIRTY(inode, quota_cut_bytes);
-       /* Return deleted body length */
--      return n_ret_value;
-+      return ret_value;
- }
- /* Summary Of Mechanisms For Handling Collisions Between Processes:
-@@ -1432,13 +1428,13 @@ static int maybe_indirect_to_direct(stru
-                                   struct page *page,
-                                   struct treepath *path,
-                                   const struct cpu_key *item_key,
--                                  loff_t n_new_file_size, char *mode)
-+                                  loff_t new_file_size, char *mode)
- {
-       struct super_block *sb = inode->i_sb;
--      int n_block_size = sb->s_blocksize;
-+      int block_size = sb->s_blocksize;
-       int cut_bytes;
-       BUG_ON(!th->t_trans_id);
--      BUG_ON(n_new_file_size != inode->i_size);
-+      BUG_ON(new_file_size != inode->i_size);
-       /* the page being sent in could be NULL if there was an i/o error
-        ** reading in the last block.  The user will hit problems trying to
-@@ -1450,15 +1446,15 @@ static int maybe_indirect_to_direct(stru
-               /* leave tail in an unformatted node */
-               *mode = M_SKIP_BALANCING;
-               cut_bytes =
--                  n_block_size - (n_new_file_size & (n_block_size - 1));
-+                  block_size - (new_file_size & (block_size - 1));
-               pathrelse(path);
-               return cut_bytes;
-       }
-       /* Perform the conversion to a direct_item. */
-       /* return indirect_to_direct(inode, path, item_key,
--                                n_new_file_size, mode); */
-+                                new_file_size, mode); */
-       return indirect2direct(th, inode, page, path, item_key,
--                             n_new_file_size, mode);
-+                             new_file_size, mode);
- }
- /* we did indirect_to_direct conversion. And we have inserted direct
-@@ -1512,7 +1508,7 @@ int reiserfs_cut_from_item(struct reiser
-                          struct treepath *path,
-                          struct cpu_key *item_key,
-                          struct inode *inode,
--                         struct page *page, loff_t n_new_file_size)
-+                         struct page *page, loff_t new_file_size)
- {
-       struct super_block *sb = inode->i_sb;
-       /* Every function which is going to call do_balance must first
-@@ -1521,10 +1517,10 @@ int reiserfs_cut_from_item(struct reiser
-          After that we can make tree balancing. */
-       struct tree_balance s_cut_balance;
-       struct item_head *p_le_ih;
--      int n_cut_size = 0,     /* Amount to be cut. */
--          n_ret_value = CARRY_ON, n_removed = 0,      /* Number of the removed unformatted nodes. */
--          n_is_inode_locked = 0;
--      char c_mode;            /* Mode of the balance. */
-+      int cut_size = 0,       /* Amount to be cut. */
-+          ret_value = CARRY_ON, removed = 0,  /* Number of the removed unformatted nodes. */
-+          is_inode_locked = 0;
-+      char mode;              /* Mode of the balance. */
-       int retval2 = -1;
-       int quota_cut_bytes;
-       loff_t tail_pos = 0;
-@@ -1532,7 +1528,7 @@ int reiserfs_cut_from_item(struct reiser
-       BUG_ON(!th->t_trans_id);
-       init_tb_struct(th, &s_cut_balance, inode->i_sb, path,
--                     n_cut_size);
-+                     cut_size);
-       /* Repeat this loop until we either cut the item without needing
-          to balance, or we fix_nodes without schedule occurring */
-@@ -1542,30 +1538,30 @@ int reiserfs_cut_from_item(struct reiser
-                  free unformatted nodes which are pointed to by the cut
-                  pointers. */
--              c_mode =
-+              mode =
-                   prepare_for_delete_or_cut(th, inode, path,
--                                            item_key, &n_removed,
--                                            &n_cut_size, n_new_file_size);
--              if (c_mode == M_CONVERT) {
-+                                            item_key, &removed,
-+                                            &cut_size, new_file_size);
-+              if (mode == M_CONVERT) {
-                       /* convert last unformatted node to direct item or leave
-                          tail in the unformatted node */
--                      RFALSE(n_ret_value != CARRY_ON,
-+                      RFALSE(ret_value != CARRY_ON,
-                              "PAP-5570: can not convert twice");
--                      n_ret_value =
-+                      ret_value =
-                           maybe_indirect_to_direct(th, inode, page,
-                                                    path, item_key,
--                                                   n_new_file_size, &c_mode);
--                      if (c_mode == M_SKIP_BALANCING)
-+                                                   new_file_size, &mode);
-+                      if (mode == M_SKIP_BALANCING)
-                               /* tail has been left in the unformatted node */
--                              return n_ret_value;
-+                              return ret_value;
--                      n_is_inode_locked = 1;
-+                      is_inode_locked = 1;
-                       /* removing of last unformatted node will change value we
-                          have to return to truncate. Save it */
--                      retval2 = n_ret_value;
--                      /*retval2 = sb->s_blocksize - (n_new_file_size & (sb->s_blocksize - 1)); */
-+                      retval2 = ret_value;
-+                      /*retval2 = sb->s_blocksize - (new_file_size & (sb->s_blocksize - 1)); */
-                       /* So, we have performed the first part of the conversion:
-                          inserting the new direct item.  Now we are removing the
-@@ -1573,10 +1569,10 @@ int reiserfs_cut_from_item(struct reiser
-                          it. */
-                       set_cpu_key_k_type(item_key, TYPE_INDIRECT);
-                       item_key->key_length = 4;
--                      n_new_file_size -=
--                          (n_new_file_size & (sb->s_blocksize - 1));
--                      tail_pos = n_new_file_size;
--                      set_cpu_key_k_offset(item_key, n_new_file_size + 1);
-+                      new_file_size -=
-+                          (new_file_size & (sb->s_blocksize - 1));
-+                      tail_pos = new_file_size;
-+                      set_cpu_key_k_offset(item_key, new_file_size + 1);
-                       if (search_for_position_by_key
-                           (sb, item_key,
-                            path) == POSITION_NOT_FOUND) {
-@@ -1589,38 +1585,38 @@ int reiserfs_cut_from_item(struct reiser
-                       }
-                       continue;
-               }
--              if (n_cut_size == 0) {
-+              if (cut_size == 0) {
-                       pathrelse(path);
-                       return 0;
-               }
--              s_cut_balance.insert_size[0] = n_cut_size;
-+              s_cut_balance.insert_size[0] = cut_size;
--              n_ret_value = fix_nodes(c_mode, &s_cut_balance, NULL, NULL);
--              if (n_ret_value != REPEAT_SEARCH)
-+              ret_value = fix_nodes(mode, &s_cut_balance, NULL, NULL);
-+              if (ret_value != REPEAT_SEARCH)
-                       break;
-               PROC_INFO_INC(sb, cut_from_item_restarted);
--              n_ret_value =
-+              ret_value =
-                   search_for_position_by_key(sb, item_key, path);
--              if (n_ret_value == POSITION_FOUND)
-+              if (ret_value == POSITION_FOUND)
-                       continue;
-               reiserfs_warning(sb, "PAP-5610", "item %K not found",
-                                item_key);
-               unfix_nodes(&s_cut_balance);
--              return (n_ret_value == IO_ERROR) ? -EIO : -ENOENT;
-+              return (ret_value == IO_ERROR) ? -EIO : -ENOENT;
-       }                       /* while */
-       // check fix_nodes results (IO_ERROR or NO_DISK_SPACE)
--      if (n_ret_value != CARRY_ON) {
--              if (n_is_inode_locked) {
-+      if (ret_value != CARRY_ON) {
-+              if (is_inode_locked) {
-                       // FIXME: this seems to be not needed: we are always able
-                       // to cut item
-                       indirect_to_direct_roll_back(th, inode, path);
-               }
--              if (n_ret_value == NO_DISK_SPACE)
-+              if (ret_value == NO_DISK_SPACE)
-                       reiserfs_warning(sb, "reiserfs-5092",
-                                        "NO_DISK_SPACE");
-               unfix_nodes(&s_cut_balance);
-@@ -1629,24 +1625,24 @@ int reiserfs_cut_from_item(struct reiser
-       /* go ahead and perform balancing */
--      RFALSE(c_mode == M_PASTE || c_mode == M_INSERT, "invalid mode");
-+      RFALSE(mode == M_PASTE || mode == M_INSERT, "invalid mode");
-       /* Calculate number of bytes that need to be cut from the item. */
-       quota_cut_bytes =
--          (c_mode ==
-+          (mode ==
-            M_DELETE) ? ih_item_len(get_ih(path)) : -s_cut_balance.
-           insert_size[0];
-       if (retval2 == -1)
--              n_ret_value = calc_deleted_bytes_number(&s_cut_balance, c_mode);
-+              ret_value = calc_deleted_bytes_number(&s_cut_balance, mode);
-       else
--              n_ret_value = retval2;
-+              ret_value = retval2;
-       /* For direct items, we only change the quota when deleting the last
-        ** item.
-        */
-       p_le_ih = PATH_PITEM_HEAD(s_cut_balance.tb_path);
-       if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(p_le_ih)) {
--              if (c_mode == M_DELETE &&
-+              if (mode == M_DELETE &&
-                   (le_ih_k_offset(p_le_ih) & (sb->s_blocksize - 1)) ==
-                   1) {
-                       // FIXME: this is to keep 3.5 happy
-@@ -1657,7 +1653,7 @@ int reiserfs_cut_from_item(struct reiser
-               }
-       }
- #ifdef CONFIG_REISERFS_CHECK
--      if (n_is_inode_locked) {
-+      if (is_inode_locked) {
-               struct item_head *le_ih =
-                   PATH_PITEM_HEAD(s_cut_balance.tb_path);
-               /* we are going to complete indirect2direct conversion. Make
-@@ -1667,13 +1663,13 @@ int reiserfs_cut_from_item(struct reiser
-                       reiserfs_panic(sb, "vs-5652",
-                                      "item must be indirect %h", le_ih);
--              if (c_mode == M_DELETE && ih_item_len(le_ih) != UNFM_P_SIZE)
-+              if (mode == M_DELETE && ih_item_len(le_ih) != UNFM_P_SIZE)
-                       reiserfs_panic(sb, "vs-5653", "completing "
-                                      "indirect2direct conversion indirect "
-                                      "item %h being deleted must be of "
-                                      "4 byte long", le_ih);
--              if (c_mode == M_CUT
-+              if (mode == M_CUT
-                   && s_cut_balance.insert_size[0] != -UNFM_P_SIZE) {
-                       reiserfs_panic(sb, "vs-5654", "can not complete "
-                                      "indirect2direct conversion of %h "
-@@ -1685,8 +1681,8 @@ int reiserfs_cut_from_item(struct reiser
-       }
- #endif
--      do_balance(&s_cut_balance, NULL, NULL, c_mode);
--      if (n_is_inode_locked) {
-+      do_balance(&s_cut_balance, NULL, NULL, mode);
-+      if (is_inode_locked) {
-               /* we've done an indirect->direct conversion.  when the data block
-                ** was freed, it was removed from the list of blocks that must
-                ** be flushed before the transaction commits, make sure to
-@@ -1701,7 +1697,7 @@ int reiserfs_cut_from_item(struct reiser
-                      quota_cut_bytes, inode->i_uid, '?');
- #endif
-       DQUOT_FREE_SPACE_NODIRTY(inode, quota_cut_bytes);
--      return n_ret_value;
-+      return ret_value;
- }
- static void truncate_directory(struct reiserfs_transaction_handle *th,
-@@ -1733,9 +1729,9 @@ int reiserfs_do_truncate(struct reiserfs
-       INITIALIZE_PATH(s_search_path); /* Path to the current object item. */
-       struct item_head *p_le_ih;      /* Pointer to an item header. */
-       struct cpu_key s_item_key;      /* Key to search for a previous file item. */
--      loff_t n_file_size,     /* Old file size. */
--       n_new_file_size;       /* New file size. */
--      int n_deleted;          /* Number of deleted or truncated bytes. */
-+      loff_t file_size,       /* Old file size. */
-+       new_file_size; /* New file size. */
-+      int deleted;            /* Number of deleted or truncated bytes. */
-       int retval;
-       int err = 0;
-@@ -1752,7 +1748,7 @@ int reiserfs_do_truncate(struct reiserfs
-       }
-       /* Get new file size. */
--      n_new_file_size = inode->i_size;
-+      new_file_size = inode->i_size;
-       // FIXME: note, that key type is unimportant here
-       make_cpu_key(&s_item_key, inode, max_reiserfs_offset(inode),
-@@ -1782,7 +1778,7 @@ int reiserfs_do_truncate(struct reiserfs
-       /* Get real file size (total length of all file items) */
-       p_le_ih = PATH_PITEM_HEAD(&s_search_path);
-       if (is_statdata_le_ih(p_le_ih))
--              n_file_size = 0;
-+              file_size = 0;
-       else {
-               loff_t offset = le_ih_k_offset(p_le_ih);
-               int bytes =
-@@ -1791,42 +1787,42 @@ int reiserfs_do_truncate(struct reiserfs
-               /* this may mismatch with real file size: if last direct item
-                  had no padding zeros and last unformatted node had no free
-                  space, this file would have this file size */
--              n_file_size = offset + bytes - 1;
-+              file_size = offset + bytes - 1;
-       }
-       /*
-        * are we doing a full truncate or delete, if so
-        * kick in the reada code
-        */
--      if (n_new_file_size == 0)
-+      if (new_file_size == 0)
-               s_search_path.reada = PATH_READA | PATH_READA_BACK;
--      if (n_file_size == 0 || n_file_size < n_new_file_size) {
-+      if (file_size == 0 || file_size < new_file_size) {
-               goto update_and_out;
-       }
-       /* Update key to search for the last file item. */
--      set_cpu_key_k_offset(&s_item_key, n_file_size);
-+      set_cpu_key_k_offset(&s_item_key, file_size);
-       do {
-               /* Cut or delete file item. */
--              n_deleted =
-+              deleted =
-                   reiserfs_cut_from_item(th, &s_search_path, &s_item_key,
--                                         inode, page, n_new_file_size);
--              if (n_deleted < 0) {
-+                                         inode, page, new_file_size);
-+              if (deleted < 0) {
-                       reiserfs_warning(inode->i_sb, "vs-5665",
-                                        "reiserfs_cut_from_item failed");
-                       reiserfs_check_path(&s_search_path);
-                       return 0;
-               }
--              RFALSE(n_deleted > n_file_size,
-+              RFALSE(deleted > file_size,
-                      "PAP-5670: reiserfs_cut_from_item: too many bytes deleted: deleted %d, file_size %lu, item_key %K",
--                     n_deleted, n_file_size, &s_item_key);
-+                     deleted, file_size, &s_item_key);
-               /* Change key to search the last file item. */
--              n_file_size -= n_deleted;
-+              file_size -= deleted;
--              set_cpu_key_k_offset(&s_item_key, n_file_size);
-+              set_cpu_key_k_offset(&s_item_key, file_size);
-               /* While there are bytes to truncate and previous file item is presented in the tree. */
-@@ -1857,13 +1853,13 @@ int reiserfs_do_truncate(struct reiserfs
-                               goto out;
-                       reiserfs_update_inode_transaction(inode);
-               }
--      } while (n_file_size > ROUND_UP(n_new_file_size) &&
-+      } while (file_size > ROUND_UP(new_file_size) &&
-                search_for_position_by_key(inode->i_sb, &s_item_key,
-                                           &s_search_path) == POSITION_FOUND);
--      RFALSE(n_file_size > ROUND_UP(n_new_file_size),
-+      RFALSE(file_size > ROUND_UP(new_file_size),
-              "PAP-5680: truncate did not finish: new_file_size %Ld, current %Ld, oid %d",
--             n_new_file_size, n_file_size, s_item_key.on_disk_key.k_objectid);
-+             new_file_size, file_size, s_item_key.on_disk_key.k_objectid);
-       update_and_out:
-       if (update_timestamps) {
-@@ -1918,7 +1914,7 @@ int reiserfs_paste_into_item(struct reis
-                            const struct cpu_key *key, /* Key to search for the needed item. */
-                            struct inode *inode,       /* Inode item belongs to */
-                            const char *body,  /* Pointer to the bytes to paste.    */
--                           int n_pasted_size)
-+                           int pasted_size)
- {                             /* Size of pasted bytes.             */
-       struct tree_balance s_paste_balance;
-       int retval;
-@@ -1931,16 +1927,16 @@ int reiserfs_paste_into_item(struct reis
- #ifdef REISERQUOTA_DEBUG
-       reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                      "reiserquota paste_into_item(): allocating %u id=%u type=%c",
--                     n_pasted_size, inode->i_uid,
-+                     pasted_size, inode->i_uid,
-                      key2type(&(key->on_disk_key)));
- #endif
--      if (DQUOT_ALLOC_SPACE_NODIRTY(inode, n_pasted_size)) {
-+      if (DQUOT_ALLOC_SPACE_NODIRTY(inode, pasted_size)) {
-               pathrelse(search_path);
-               return -EDQUOT;
-       }
-       init_tb_struct(th, &s_paste_balance, th->t_super, search_path,
--                     n_pasted_size);
-+                     pasted_size);
- #ifdef DISPLACE_NEW_PACKING_LOCALITIES
-       s_paste_balance.key = key->on_disk_key;
- #endif
-@@ -1988,10 +1984,10 @@ int reiserfs_paste_into_item(struct reis
- #ifdef REISERQUOTA_DEBUG
-       reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                      "reiserquota paste_into_item(): freeing %u id=%u type=%c",
--                     n_pasted_size, inode->i_uid,
-+                     pasted_size, inode->i_uid,
-                      key2type(&(key->on_disk_key)));
- #endif
--      DQUOT_FREE_SPACE_NODIRTY(inode, n_pasted_size);
-+      DQUOT_FREE_SPACE_NODIRTY(inode, pasted_size);
-       return retval;
- }
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -26,7 +26,7 @@ int direct2indirect(struct reiserfs_tran
-                                  converted item. */
-       struct item_head ind_ih;        /* new indirect item to be inserted or
-                                          key of unfm pointer to be pasted */
--      int n_blk_size, n_retval;       /* returned value for reiserfs_insert_item and clones */
-+      int blk_size, retval;   /* returned value for reiserfs_insert_item and clones */
-       unp_t unfm_ptr;         /* Handle on an unformatted node
-                                  that will be inserted in the
-                                  tree. */
-@@ -35,7 +35,7 @@ int direct2indirect(struct reiserfs_tran
-       REISERFS_SB(sb)->s_direct2indirect++;
--      n_blk_size = sb->s_blocksize;
-+      blk_size = sb->s_blocksize;
-       /* and key to search for append or insert pointer to the new
-          unformatted node. */
-@@ -64,17 +64,17 @@ int direct2indirect(struct reiserfs_tran
-               set_ih_free_space(&ind_ih, 0);  /* delete at nearest future */
-               put_ih_item_len(&ind_ih, UNFM_P_SIZE);
-               PATH_LAST_POSITION(path)++;
--              n_retval =
-+              retval =
-                   reiserfs_insert_item(th, path, &end_key, &ind_ih, inode,
-                                        (char *)&unfm_ptr);
-       } else {
-               /* Paste into last indirect item of an object. */
--              n_retval = reiserfs_paste_into_item(th, path, &end_key, inode,
-+              retval = reiserfs_paste_into_item(th, path, &end_key, inode,
-                                                   (char *)&unfm_ptr,
-                                                   UNFM_P_SIZE);
-       }
--      if (n_retval) {
--              return n_retval;
-+      if (retval) {
-+              return retval;
-       }
-       // note: from here there are two keys which have matching first
-       // three key components. They only differ by the fourth one.
-@@ -98,7 +98,7 @@ int direct2indirect(struct reiserfs_tran
-               RFALSE(!is_direct_le_ih(p_le_ih),
-                      "vs-14055: direct item expected(%K), found %h",
-                      &end_key, p_le_ih);
--              tail_size = (le_ih_k_offset(p_le_ih) & (n_blk_size - 1))
-+              tail_size = (le_ih_k_offset(p_le_ih) & (blk_size - 1))
-                   + ih_item_len(p_le_ih) - 1;
-               /* we only send the unbh pointer if the buffer is not up to date.
-@@ -113,11 +113,11 @@ int direct2indirect(struct reiserfs_tran
-               } else {
-                       up_to_date_bh = unbh;
-               }
--              n_retval = reiserfs_delete_item(th, path, &end_key, inode,
-+              retval = reiserfs_delete_item(th, path, &end_key, inode,
-                                               up_to_date_bh);
--              total_tail += n_retval;
--              if (tail_size == n_retval)
-+              total_tail += retval;
-+              if (tail_size == retval)
-                       // done: file does not have direct items anymore
-                       break;
-@@ -129,7 +129,7 @@ int direct2indirect(struct reiserfs_tran
-               unsigned pgoff =
-                   (tail_offset + total_tail - 1) & (PAGE_CACHE_SIZE - 1);
-               char *kaddr = kmap_atomic(up_to_date_bh->b_page, KM_USER0);
--              memset(kaddr + pgoff, 0, n_blk_size - total_tail);
-+              memset(kaddr + pgoff, 0, blk_size - total_tail);
-               kunmap_atomic(kaddr, KM_USER0);
-       }
-@@ -181,7 +181,7 @@ int indirect2direct(struct reiserfs_tran
- {
-       struct super_block *sb = inode->i_sb;
-       struct item_head s_ih;
--      unsigned long n_block_size = sb->s_blocksize;
-+      unsigned long block_size = sb->s_blocksize;
-       char *tail;
-       int tail_len, round_tail_len;
-       loff_t pos, pos1;       /* position of first byte of the tail */
-@@ -196,7 +196,7 @@ int indirect2direct(struct reiserfs_tran
-       /* store item head path points to. */
-       copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
--      tail_len = (n_new_file_size & (n_block_size - 1));
-+      tail_len = (n_new_file_size & (block_size - 1));
-       if (get_inode_sd_version(inode) == STAT_DATA_V2)
-               round_tail_len = ROUND_UP(tail_len);
-       else
-@@ -257,7 +257,7 @@ int indirect2direct(struct reiserfs_tran
-                  unformatted node. For now i_size is considered as guard for
-                  going out of file size */
-               kunmap(page);
--              return n_block_size - round_tail_len;
-+              return block_size - round_tail_len;
-       }
-       kunmap(page);
-@@ -276,5 +276,5 @@ int indirect2direct(struct reiserfs_tran
-       /* mark_file_with_tail (inode, pos1 + 1); */
-       REISERFS_I(inode)->i_first_direct_byte = pos1 + 1;
--      return n_block_size - round_tail_len;
-+      return block_size - round_tail_len;
- }
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_._.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_._.diff
deleted file mode 100644 (file)
index c40136a..0000000
+++ /dev/null
@@ -1,1816 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename p_._ variables
-
- This patch is a simple s/p_._//g to the reiserfs code. This is the fifth
- in a series of patches to rip out some of the awful variable naming in
- reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/file.c            |    6 
- fs/reiserfs/fix_node.c        |  169 +++++++--------
- fs/reiserfs/stree.c           |  472 +++++++++++++++++++++---------------------
- fs/reiserfs/tail_conversion.c |   28 +-
- include/linux/reiserfs_fs.h   |   46 ++--
- 5 files changed, 365 insertions(+), 356 deletions(-)
-
---- a/fs/reiserfs/file.c
-+++ b/fs/reiserfs/file.c
-@@ -134,10 +134,10 @@ static void reiserfs_vfs_truncate_file(s
-  * be removed...
-  */
--static int reiserfs_sync_file(struct file *p_s_filp,
--                            struct dentry *p_s_dentry, int datasync)
-+static int reiserfs_sync_file(struct file *filp,
-+                            struct dentry *dentry, int datasync)
- {
--      struct inode *inode = p_s_dentry->d_inode;
-+      struct inode *inode = dentry->d_inode;
-       int n_err;
-       int barrier_done;
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -780,9 +780,9 @@ static void free_buffers_in_tb(struct tr
- /* The function is NOT SCHEDULE-SAFE! */
- static int get_empty_nodes(struct tree_balance *tb, int n_h)
- {
--      struct buffer_head *p_s_new_bh,
--          *p_s_Sh = PATH_H_PBUFFER(tb->tb_path, n_h);
--      b_blocknr_t *p_n_blocknr, a_n_blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
-+      struct buffer_head *new_bh,
-+          *Sh = PATH_H_PBUFFER(tb->tb_path, n_h);
-+      b_blocknr_t *blocknr, a_n_blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
-       int n_counter, n_number_of_freeblk, n_amount_needed,    /* number of needed empty blocks */
-        n_retval = CARRY_ON;
-       struct super_block *sb = tb->tb_sb;
-@@ -810,8 +810,8 @@ static int get_empty_nodes(struct tree_b
-                                                  1) : 0;
-       /* Allocate missing empty blocks. */
--      /* if p_s_Sh == 0  then we are getting a new root */
--      n_amount_needed = (p_s_Sh) ? (tb->blknum[n_h] - 1) : 1;
-+      /* if Sh == 0  then we are getting a new root */
-+      n_amount_needed = (Sh) ? (tb->blknum[n_h] - 1) : 1;
-       /*  Amount_needed = the amount that we need more than the amount that we have. */
-       if (n_amount_needed > n_number_of_freeblk)
-               n_amount_needed -= n_number_of_freeblk;
-@@ -824,25 +824,25 @@ static int get_empty_nodes(struct tree_b
-               return NO_DISK_SPACE;
-       /* for each blocknumber we just got, get a buffer and stick it on FEB */
--      for (p_n_blocknr = a_n_blocknrs, n_counter = 0;
--           n_counter < n_amount_needed; p_n_blocknr++, n_counter++) {
-+      for (blocknr = a_n_blocknrs, n_counter = 0;
-+           n_counter < n_amount_needed; blocknr++, n_counter++) {
--              RFALSE(!*p_n_blocknr,
-+              RFALSE(!*blocknr,
-                      "PAP-8135: reiserfs_new_blocknrs failed when got new blocks");
--              p_s_new_bh = sb_getblk(sb, *p_n_blocknr);
--              RFALSE(buffer_dirty(p_s_new_bh) ||
--                     buffer_journaled(p_s_new_bh) ||
--                     buffer_journal_dirty(p_s_new_bh),
-+              new_bh = sb_getblk(sb, *blocknr);
-+              RFALSE(buffer_dirty(new_bh) ||
-+                     buffer_journaled(new_bh) ||
-+                     buffer_journal_dirty(new_bh),
-                      "PAP-8140: journlaled or dirty buffer %b for the new block",
--                     p_s_new_bh);
-+                     new_bh);
-               /* Put empty buffers into the array. */
-               RFALSE(tb->FEB[tb->cur_blknum],
-                      "PAP-8141: busy slot for new buffer");
--              set_buffer_journal_new(p_s_new_bh);
--              tb->FEB[tb->cur_blknum++] = p_s_new_bh;
-+              set_buffer_journal_new(new_bh);
-+              tb->FEB[tb->cur_blknum++] = new_bh;
-       }
-       if (n_retval == CARRY_ON && FILESYSTEM_CHANGED_TB(tb))
-@@ -898,7 +898,7 @@ static int get_rfree(struct tree_balance
- /* Check whether left neighbor is in memory. */
- static int is_left_neighbor_in_cache(struct tree_balance *tb, int n_h)
- {
--      struct buffer_head *p_s_father, *left;
-+      struct buffer_head *father, *left;
-       struct super_block *sb = tb->tb_sb;
-       b_blocknr_t n_left_neighbor_blocknr;
-       int n_left_neighbor_position;
-@@ -908,18 +908,18 @@ static int is_left_neighbor_in_cache(str
-               return 0;
-       /* Calculate father of the node to be balanced. */
--      p_s_father = PATH_H_PBUFFER(tb->tb_path, n_h + 1);
-+      father = PATH_H_PBUFFER(tb->tb_path, n_h + 1);
--      RFALSE(!p_s_father ||
--             !B_IS_IN_TREE(p_s_father) ||
-+      RFALSE(!father ||
-+             !B_IS_IN_TREE(father) ||
-              !B_IS_IN_TREE(tb->FL[n_h]) ||
--             !buffer_uptodate(p_s_father) ||
-+             !buffer_uptodate(father) ||
-              !buffer_uptodate(tb->FL[n_h]),
-              "vs-8165: F[h] (%b) or FL[h] (%b) is invalid",
--             p_s_father, tb->FL[n_h]);
-+             father, tb->FL[n_h]);
-       /* Get position of the pointer to the left neighbor into the left father. */
--      n_left_neighbor_position = (p_s_father == tb->FL[n_h]) ?
-+      n_left_neighbor_position = (father == tb->FL[n_h]) ?
-           tb->lkey[n_h] : B_NR_ITEMS(tb->FL[n_h]);
-       /* Get left neighbor block number. */
-       n_left_neighbor_blocknr =
-@@ -940,10 +940,10 @@ static int is_left_neighbor_in_cache(str
- #define LEFT_PARENTS  'l'
- #define RIGHT_PARENTS 'r'
--static void decrement_key(struct cpu_key *p_s_key)
-+static void decrement_key(struct cpu_key *key)
- {
-       // call item specific function for this key
--      item_ops[cpu_key_k_type(p_s_key)]->decrement_key(p_s_key);
-+      item_ops[cpu_key_k_type(key)]->decrement_key(key);
- }
- /* Calculate far left/right parent of the left/right neighbor of the current node, that
-@@ -956,17 +956,17 @@ static void decrement_key(struct cpu_key
-  */
- static int get_far_parent(struct tree_balance *tb,
-                         int n_h,
--                        struct buffer_head **pp_s_father,
--                        struct buffer_head **pp_s_com_father, char c_lr_par)
-+                        struct buffer_head **pfather,
-+                        struct buffer_head **pcom_father, char c_lr_par)
- {
--      struct buffer_head *p_s_parent;
-+      struct buffer_head *parent;
-       INITIALIZE_PATH(s_path_to_neighbor_father);
--      struct treepath *p_s_path = tb->tb_path;
-+      struct treepath *path = tb->tb_path;
-       struct cpu_key s_lr_father_key;
-       int n_counter,
-           n_position = INT_MAX,
-           n_first_last_position = 0,
--          n_path_offset = PATH_H_PATH_OFFSET(p_s_path, n_h);
-+          n_path_offset = PATH_H_PATH_OFFSET(path, n_h);
-       /* Starting from F[n_h] go upwards in the tree, and look for the common
-          ancestor of F[n_h], and its neighbor l/r, that should be obtained. */
-@@ -979,25 +979,25 @@ static int get_far_parent(struct tree_ba
-       for (; n_counter > FIRST_PATH_ELEMENT_OFFSET; n_counter--) {
-               /* Check whether parent of the current buffer in the path is really parent in the tree. */
-               if (!B_IS_IN_TREE
--                  (p_s_parent = PATH_OFFSET_PBUFFER(p_s_path, n_counter - 1)))
-+                  (parent = PATH_OFFSET_PBUFFER(path, n_counter - 1)))
-                       return REPEAT_SEARCH;
-               /* Check whether position in the parent is correct. */
-               if ((n_position =
--                   PATH_OFFSET_POSITION(p_s_path,
-+                   PATH_OFFSET_POSITION(path,
-                                         n_counter - 1)) >
--                  B_NR_ITEMS(p_s_parent))
-+                  B_NR_ITEMS(parent))
-                       return REPEAT_SEARCH;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(p_s_parent, n_position) !=
--                  PATH_OFFSET_PBUFFER(p_s_path, n_counter)->b_blocknr)
-+              if (B_N_CHILD_NUM(parent, n_position) !=
-+                  PATH_OFFSET_PBUFFER(path, n_counter)->b_blocknr)
-                       return REPEAT_SEARCH;
-               /* Return delimiting key if position in the parent is not equal to first/last one. */
-               if (c_lr_par == RIGHT_PARENTS)
--                      n_first_last_position = B_NR_ITEMS(p_s_parent);
-+                      n_first_last_position = B_NR_ITEMS(parent);
-               if (n_position != n_first_last_position) {
--                      *pp_s_com_father = p_s_parent;
--                      get_bh(*pp_s_com_father);
--                      /*(*pp_s_com_father = p_s_parent)->b_count++; */
-+                      *pcom_father = parent;
-+                      get_bh(*pcom_father);
-+                      /*(*pcom_father = parent)->b_count++; */
-                       break;
-               }
-       }
-@@ -1009,22 +1009,22 @@ static int get_far_parent(struct tree_ba
-                   (tb->tb_path,
-                    FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
-                   SB_ROOT_BLOCK(tb->tb_sb)) {
--                      *pp_s_father = *pp_s_com_father = NULL;
-+                      *pfather = *pcom_father = NULL;
-                       return CARRY_ON;
-               }
-               return REPEAT_SEARCH;
-       }
--      RFALSE(B_LEVEL(*pp_s_com_father) <= DISK_LEAF_NODE_LEVEL,
-+      RFALSE(B_LEVEL(*pcom_father) <= DISK_LEAF_NODE_LEVEL,
-              "PAP-8185: (%b %z) level too small",
--             *pp_s_com_father, *pp_s_com_father);
-+             *pcom_father, *pcom_father);
-       /* Check whether the common parent is locked. */
--      if (buffer_locked(*pp_s_com_father)) {
--              __wait_on_buffer(*pp_s_com_father);
-+      if (buffer_locked(*pcom_father)) {
-+              __wait_on_buffer(*pcom_father);
-               if (FILESYSTEM_CHANGED_TB(tb)) {
--                      brelse(*pp_s_com_father);
-+                      brelse(*pcom_father);
-                       return REPEAT_SEARCH;
-               }
-       }
-@@ -1034,7 +1034,7 @@ static int get_far_parent(struct tree_ba
-       /* Form key to get parent of the left/right neighbor. */
-       le_key2cpu_key(&s_lr_father_key,
--                     B_N_PDELIM_KEY(*pp_s_com_father,
-+                     B_N_PDELIM_KEY(*pcom_father,
-                                     (c_lr_par ==
-                                      LEFT_PARENTS) ? (tb->lkey[n_h - 1] =
-                                                       n_position -
-@@ -1053,14 +1053,14 @@ static int get_far_parent(struct tree_ba
-       if (FILESYSTEM_CHANGED_TB(tb)) {
-               pathrelse(&s_path_to_neighbor_father);
--              brelse(*pp_s_com_father);
-+              brelse(*pcom_father);
-               return REPEAT_SEARCH;
-       }
--      *pp_s_father = PATH_PLAST_BUFFER(&s_path_to_neighbor_father);
-+      *pfather = PATH_PLAST_BUFFER(&s_path_to_neighbor_father);
--      RFALSE(B_LEVEL(*pp_s_father) != n_h + 1,
--             "PAP-8190: (%b %z) level too small", *pp_s_father, *pp_s_father);
-+      RFALSE(B_LEVEL(*pfather) != n_h + 1,
-+             "PAP-8190: (%b %z) level too small", *pfather, *pfather);
-       RFALSE(s_path_to_neighbor_father.path_length <
-              FIRST_PATH_ELEMENT_OFFSET, "PAP-8192: path length is too small");
-@@ -1078,11 +1078,11 @@ static int get_far_parent(struct tree_ba
-  */
- static int get_parents(struct tree_balance *tb, int n_h)
- {
--      struct treepath *p_s_path = tb->tb_path;
-+      struct treepath *path = tb->tb_path;
-       int n_position,
-           n_ret_value,
-           n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
--      struct buffer_head *p_s_curf, *p_s_curcf;
-+      struct buffer_head *curf, *curcf;
-       /* Current node is the root of the tree or will be root of the tree */
-       if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-@@ -1100,66 +1100,65 @@ static int get_parents(struct tree_balan
-       }
-       /* Get parent FL[n_path_offset] of L[n_path_offset]. */
--      if ((n_position = PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1))) {
-+      n_position = PATH_OFFSET_POSITION(path, n_path_offset - 1);
-+      if (n_position) {
-               /* Current node is not the first child of its parent. */
--              /*(p_s_curf = p_s_curcf = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1))->b_count += 2; */
--              p_s_curf = p_s_curcf =
--                  PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1);
--              get_bh(p_s_curf);
--              get_bh(p_s_curf);
-+              curf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+              curcf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+              get_bh(curf);
-+              get_bh(curf);
-               tb->lkey[n_h] = n_position - 1;
-       } else {
-               /* Calculate current parent of L[n_path_offset], which is the left neighbor of the current node.
-                  Calculate current common parent of L[n_path_offset] and the current node. Note that
-                  CFL[n_path_offset] not equal FL[n_path_offset] and CFL[n_path_offset] not equal F[n_path_offset].
-                  Calculate lkey[n_path_offset]. */
--              if ((n_ret_value = get_far_parent(tb, n_h + 1, &p_s_curf,
--                                                &p_s_curcf,
-+              if ((n_ret_value = get_far_parent(tb, n_h + 1, &curf,
-+                                                &curcf,
-                                                 LEFT_PARENTS)) != CARRY_ON)
-                       return n_ret_value;
-       }
-       brelse(tb->FL[n_h]);
--      tb->FL[n_h] = p_s_curf; /* New initialization of FL[n_h]. */
-+      tb->FL[n_h] = curf;     /* New initialization of FL[n_h]. */
-       brelse(tb->CFL[n_h]);
--      tb->CFL[n_h] = p_s_curcf;       /* New initialization of CFL[n_h]. */
-+      tb->CFL[n_h] = curcf;   /* New initialization of CFL[n_h]. */
--      RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
--             (p_s_curcf && !B_IS_IN_TREE(p_s_curcf)),
--             "PAP-8195: FL (%b) or CFL (%b) is invalid", p_s_curf, p_s_curcf);
-+      RFALSE((curf && !B_IS_IN_TREE(curf)) ||
-+             (curcf && !B_IS_IN_TREE(curcf)),
-+             "PAP-8195: FL (%b) or CFL (%b) is invalid", curf, curcf);
- /* Get parent FR[n_h] of R[n_h]. */
- /* Current node is the last child of F[n_h]. FR[n_h] != F[n_h]. */
--      if (n_position == B_NR_ITEMS(PATH_H_PBUFFER(p_s_path, n_h + 1))) {
-+      if (n_position == B_NR_ITEMS(PATH_H_PBUFFER(path, n_h + 1))) {
- /* Calculate current parent of R[n_h], which is the right neighbor of F[n_h].
-    Calculate current common parent of R[n_h] and current node. Note that CFR[n_h]
-    not equal FR[n_path_offset] and CFR[n_h] not equal F[n_h]. */
-               if ((n_ret_value =
--                   get_far_parent(tb, n_h + 1, &p_s_curf, &p_s_curcf,
-+                   get_far_parent(tb, n_h + 1, &curf, &curcf,
-                                   RIGHT_PARENTS)) != CARRY_ON)
-                       return n_ret_value;
-       } else {
- /* Current node is not the last child of its parent F[n_h]. */
--              /*(p_s_curf = p_s_curcf = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1))->b_count += 2; */
--              p_s_curf = p_s_curcf =
--                  PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1);
--              get_bh(p_s_curf);
--              get_bh(p_s_curf);
-+              curf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+              curcf = PATH_OFFSET_PBUFFER(path, n_path_offset - 1);
-+              get_bh(curf);
-+              get_bh(curf);
-               tb->rkey[n_h] = n_position;
-       }
-       brelse(tb->FR[n_h]);
-       /* New initialization of FR[n_path_offset]. */
--      tb->FR[n_h] = p_s_curf;
-+      tb->FR[n_h] = curf;
-       brelse(tb->CFR[n_h]);
-       /* New initialization of CFR[n_path_offset]. */
--      tb->CFR[n_h] = p_s_curcf;
-+      tb->CFR[n_h] = curcf;
--      RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
--             (p_s_curcf && !B_IS_IN_TREE(p_s_curcf)),
--             "PAP-8205: FR (%b) or CFR (%b) is invalid", p_s_curf, p_s_curcf);
-+      RFALSE((curf && !B_IS_IN_TREE(curf)) ||
-+             (curcf && !B_IS_IN_TREE(curcf)),
-+             "PAP-8205: FR (%b) or CFR (%b) is invalid", curf, curcf);
-       return CARRY_ON;
- }
-@@ -1893,7 +1892,7 @@ static int check_balance(int mode,
- static int get_direct_parent(struct tree_balance *tb, int n_h)
- {
-       struct buffer_head *bh;
--      struct treepath *p_s_path = tb->tb_path;
-+      struct treepath *path = tb->tb_path;
-       int n_position,
-           n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
-@@ -1903,27 +1902,27 @@ static int get_direct_parent(struct tree
-               RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET - 1,
-                      "PAP-8260: invalid offset in the path");
--              if (PATH_OFFSET_PBUFFER(p_s_path, FIRST_PATH_ELEMENT_OFFSET)->
-+              if (PATH_OFFSET_PBUFFER(path, FIRST_PATH_ELEMENT_OFFSET)->
-                   b_blocknr == SB_ROOT_BLOCK(tb->tb_sb)) {
-                       /* Root is not changed. */
--                      PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1) = NULL;
--                      PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1) = 0;
-+                      PATH_OFFSET_PBUFFER(path, n_path_offset - 1) = NULL;
-+                      PATH_OFFSET_POSITION(path, n_path_offset - 1) = 0;
-                       return CARRY_ON;
-               }
-               return REPEAT_SEARCH;   /* Root is changed and we must recalculate the path. */
-       }
-       if (!B_IS_IN_TREE
--          (bh = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1)))
-+          (bh = PATH_OFFSET_PBUFFER(path, n_path_offset - 1)))
-               return REPEAT_SEARCH;   /* Parent in the path is not in the tree. */
-       if ((n_position =
--           PATH_OFFSET_POSITION(p_s_path,
-+           PATH_OFFSET_POSITION(path,
-                                 n_path_offset - 1)) > B_NR_ITEMS(bh))
-               return REPEAT_SEARCH;
-       if (B_N_CHILD_NUM(bh, n_position) !=
--          PATH_OFFSET_PBUFFER(p_s_path, n_path_offset)->b_blocknr)
-+          PATH_OFFSET_PBUFFER(path, n_path_offset)->b_blocknr)
-               /* Parent in the path is not parent of the current node in the tree. */
-               return REPEAT_SEARCH;
-@@ -2319,7 +2318,7 @@ static int wait_tb_buffers_until_unlocke
-  */
- int fix_nodes(int n_op_mode, struct tree_balance *tb,
--            struct item_head *p_s_ins_ih, const void *data)
-+            struct item_head *ins_ih, const void *data)
- {
-       int n_ret_value, n_h, n_item_num = PATH_LAST_POSITION(tb->tb_path);
-       int n_pos_in_item;
-@@ -2405,7 +2404,7 @@ int fix_nodes(int n_op_mode, struct tree
-                       goto repeat;
-               n_ret_value = check_balance(n_op_mode, tb, n_h, n_item_num,
--                                          n_pos_in_item, p_s_ins_ih, data);
-+                                          n_pos_in_item, ins_ih, data);
-               if (n_ret_value != CARRY_ON) {
-                       if (n_ret_value == NO_BALANCING_NEEDED) {
-                               /* No balancing for higher levels needed. */
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -68,10 +68,10 @@ inline int B_IS_IN_TREE(const struct buf
- //
- // to gets item head in le form
- //
--inline void copy_item_head(struct item_head *p_v_to,
--                         const struct item_head *p_v_from)
-+inline void copy_item_head(struct item_head *to,
-+                         const struct item_head *from)
- {
--      memcpy(p_v_to, p_v_from, IH_SIZE);
-+      memcpy(to, from, IH_SIZE);
- }
- /* k1 is pointer to on-disk structure which is stored in little-endian
-@@ -135,15 +135,15 @@ static inline int comp_keys(const struct
- inline int comp_short_le_keys(const struct reiserfs_key *key1,
-                             const struct reiserfs_key *key2)
- {
--      __u32 *p_s_1_u32, *p_s_2_u32;
-+      __u32 *k1_u32, *k2_u32;
-       int n_key_length = REISERFS_SHORT_KEY_LEN;
--      p_s_1_u32 = (__u32 *) key1;
--      p_s_2_u32 = (__u32 *) key2;
--      for (; n_key_length--; ++p_s_1_u32, ++p_s_2_u32) {
--              if (le32_to_cpu(*p_s_1_u32) < le32_to_cpu(*p_s_2_u32))
-+      k1_u32 = (__u32 *) key1;
-+      k2_u32 = (__u32 *) key2;
-+      for (; n_key_length--; ++k1_u32, ++k2_u32) {
-+              if (le32_to_cpu(*k1_u32) < le32_to_cpu(*k2_u32))
-                       return -1;
--              if (le32_to_cpu(*p_s_1_u32) > le32_to_cpu(*p_s_2_u32))
-+              if (le32_to_cpu(*k1_u32) > le32_to_cpu(*k2_u32))
-                       return 1;
-       }
-       return 0;
-@@ -174,8 +174,8 @@ inline int comp_le_keys(const struct rei
-  *  Binary search toolkit function                                        *
-  *  Search for an item in the array by the item key                       *
-  *  Returns:    1 if found,  0 if not found;                              *
-- *        *p_n_pos = number of the searched element if found, else the    *
-- *        number of the first element that is larger than p_v_key.        *
-+ *        *pos = number of the searched element if found, else the        *
-+ *        number of the first element that is larger than key.            *
-  **************************************************************************/
- /* For those not familiar with binary search: n_lbound is the leftmost item that it
-  could be, n_rbound the rightmost item that it could be.  We examine the item
-@@ -184,28 +184,28 @@ inline int comp_le_keys(const struct rei
-  there are no possible items, and we have not found it. With each examination we
-  cut the number of possible items it could be by one more than half rounded down,
-  or we find it. */
--static inline int bin_search(const void *p_v_key,     /* Key to search for.                   */
--                           const void *p_v_base,      /* First item in the array.             */
--                           int p_n_num,       /* Number of items in the array.        */
--                           int p_n_width,     /* Item size in the array.
--                                                 searched. Lest the reader be
--                                                 confused, note that this is crafted
--                                                 as a general function, and when it
--                                                 is applied specifically to the array
--                                                 of item headers in a node, p_n_width
--                                                 is actually the item header size not
--                                                 the item size.                      */
--                           int *p_n_pos       /* Number of the searched for element. */
-+static inline int bin_search(const void *key, /* Key to search for. */
-+                           const void *base,  /* First item in the array. */
-+                           int num,   /* Number of items in the array. */
-+                           int width, /* Item size in the array.
-+                                         searched. Lest the reader be
-+                                         confused, note that this is crafted
-+                                         as a general function, and when it
-+                                         is applied specifically to the array
-+                                         of item headers in a node, width
-+                                         is actually the item header size not
-+                                         the item size. */
-+                           int *pos /* Number of the searched for element. */
-     )
- {
-       int n_rbound, n_lbound, n_j;
--      for (n_j = ((n_rbound = p_n_num - 1) + (n_lbound = 0)) / 2;
-+      for (n_j = ((n_rbound = num - 1) + (n_lbound = 0)) / 2;
-            n_lbound <= n_rbound; n_j = (n_rbound + n_lbound) / 2)
-               switch (comp_keys
--                      ((struct reiserfs_key *)((char *)p_v_base +
--                                               n_j * p_n_width),
--                       (struct cpu_key *)p_v_key)) {
-+                      ((struct reiserfs_key *)((char *)base +
-+                                               n_j * width),
-+                       (struct cpu_key *)key)) {
-               case -1:
-                       n_lbound = n_j + 1;
-                       continue;
-@@ -213,13 +213,13 @@ static inline int bin_search(const void 
-                       n_rbound = n_j - 1;
-                       continue;
-               case 0:
--                      *p_n_pos = n_j;
-+                      *pos = n_j;
-                       return ITEM_FOUND;      /* Key found in the array.  */
-               }
-       /* bin_search did not find given key, it returns position of key,
-          that is minimal and greater than the given one. */
--      *p_n_pos = n_lbound;
-+      *pos = n_lbound;
-       return ITEM_NOT_FOUND;
- }
-@@ -243,12 +243,12 @@ static const struct reiserfs_key MAX_KEY
-    the path, there is no delimiting key in the tree (buffer is first or last buffer in tree), and in this
-    case we return a special key, either MIN_KEY or MAX_KEY. */
- static inline const struct reiserfs_key *get_lkey(const struct treepath
--                                                *p_s_chk_path,
-+                                                *chk_path,
-                                                 const struct super_block
-                                                 *sb)
- {
--      int n_position, n_path_offset = p_s_chk_path->path_length;
--      struct buffer_head *p_s_parent;
-+      int n_position, n_path_offset = chk_path->path_length;
-+      struct buffer_head *parent;
-       RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET,
-              "PAP-5010: invalid offset in the path");
-@@ -257,42 +257,42 @@ static inline const struct reiserfs_key 
-       while (n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-               RFALSE(!buffer_uptodate
--                     (PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)),
-+                     (PATH_OFFSET_PBUFFER(chk_path, n_path_offset)),
-                      "PAP-5020: parent is not uptodate");
-               /* Parent at the path is not in the tree now. */
-               if (!B_IS_IN_TREE
--                  (p_s_parent =
--                   PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)))
-+                  (parent =
-+                   PATH_OFFSET_PBUFFER(chk_path, n_path_offset)))
-                       return &MAX_KEY;
-               /* Check whether position in the parent is correct. */
-               if ((n_position =
--                   PATH_OFFSET_POSITION(p_s_chk_path,
-+                   PATH_OFFSET_POSITION(chk_path,
-                                         n_path_offset)) >
--                  B_NR_ITEMS(p_s_parent))
-+                  B_NR_ITEMS(parent))
-                       return &MAX_KEY;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(p_s_parent, n_position) !=
--                  PATH_OFFSET_PBUFFER(p_s_chk_path,
-+              if (B_N_CHILD_NUM(parent, n_position) !=
-+                  PATH_OFFSET_PBUFFER(chk_path,
-                                       n_path_offset + 1)->b_blocknr)
-                       return &MAX_KEY;
-               /* Return delimiting key if position in the parent is not equal to zero. */
-               if (n_position)
--                      return B_N_PDELIM_KEY(p_s_parent, n_position - 1);
-+                      return B_N_PDELIM_KEY(parent, n_position - 1);
-       }
-       /* Return MIN_KEY if we are in the root of the buffer tree. */
--      if (PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-+      if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-           b_blocknr == SB_ROOT_BLOCK(sb))
-               return &MIN_KEY;
-       return &MAX_KEY;
- }
- /* Get delimiting key of the buffer at the path and its right neighbor. */
--inline const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
-+inline const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
-                                          const struct super_block *sb)
- {
--      int n_position, n_path_offset = p_s_chk_path->path_length;
--      struct buffer_head *p_s_parent;
-+      int n_position, n_path_offset = chk_path->path_length;
-+      struct buffer_head *parent;
-       RFALSE(n_path_offset < FIRST_PATH_ELEMENT_OFFSET,
-              "PAP-5030: invalid offset in the path");
-@@ -300,31 +300,31 @@ inline const struct reiserfs_key *get_rk
-       while (n_path_offset-- > FIRST_PATH_ELEMENT_OFFSET) {
-               RFALSE(!buffer_uptodate
--                     (PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)),
-+                     (PATH_OFFSET_PBUFFER(chk_path, n_path_offset)),
-                      "PAP-5040: parent is not uptodate");
-               /* Parent at the path is not in the tree now. */
-               if (!B_IS_IN_TREE
--                  (p_s_parent =
--                   PATH_OFFSET_PBUFFER(p_s_chk_path, n_path_offset)))
-+                  (parent =
-+                   PATH_OFFSET_PBUFFER(chk_path, n_path_offset)))
-                       return &MIN_KEY;
-               /* Check whether position in the parent is correct. */
-               if ((n_position =
--                   PATH_OFFSET_POSITION(p_s_chk_path,
-+                   PATH_OFFSET_POSITION(chk_path,
-                                         n_path_offset)) >
--                  B_NR_ITEMS(p_s_parent))
-+                  B_NR_ITEMS(parent))
-                       return &MIN_KEY;
-               /* Check whether parent at the path really points to the child. */
--              if (B_N_CHILD_NUM(p_s_parent, n_position) !=
--                  PATH_OFFSET_PBUFFER(p_s_chk_path,
-+              if (B_N_CHILD_NUM(parent, n_position) !=
-+                  PATH_OFFSET_PBUFFER(chk_path,
-                                       n_path_offset + 1)->b_blocknr)
-                       return &MIN_KEY;
-               /* Return delimiting key if position in the parent is not the last one. */
--              if (n_position != B_NR_ITEMS(p_s_parent))
--                      return B_N_PDELIM_KEY(p_s_parent, n_position);
-+              if (n_position != B_NR_ITEMS(parent))
-+                      return B_N_PDELIM_KEY(parent, n_position);
-       }
-       /* Return MAX_KEY if we are in the root of the buffer tree. */
--      if (PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-+      if (PATH_OFFSET_PBUFFER(chk_path, FIRST_PATH_ELEMENT_OFFSET)->
-           b_blocknr == SB_ROOT_BLOCK(sb))
-               return &MAX_KEY;
-       return &MIN_KEY;
-@@ -335,25 +335,25 @@ inline const struct reiserfs_key *get_rk
-    the path.  These delimiting keys are stored at least one level above that buffer in the tree. If the
-    buffer is the first or last node in the tree order then one of the delimiting keys may be absent, and in
-    this case get_lkey and get_rkey return a special key which is MIN_KEY or MAX_KEY. */
--static inline int key_in_buffer(struct treepath *p_s_chk_path,        /* Path which should be checked.  */
--                              const struct cpu_key *p_s_key,  /* Key which should be checked.   */
--                              struct super_block *sb  /* Super block pointer.    */
-+static inline int key_in_buffer(struct treepath *chk_path,    /* Path which should be checked.  */
-+                              const struct cpu_key *key,      /* Key which should be checked.   */
-+                              struct super_block *sb
-     )
- {
--      RFALSE(!p_s_key || p_s_chk_path->path_length < FIRST_PATH_ELEMENT_OFFSET
--             || p_s_chk_path->path_length > MAX_HEIGHT,
-+      RFALSE(!key || chk_path->path_length < FIRST_PATH_ELEMENT_OFFSET
-+             || chk_path->path_length > MAX_HEIGHT,
-              "PAP-5050: pointer to the key(%p) is NULL or invalid path length(%d)",
--             p_s_key, p_s_chk_path->path_length);
--      RFALSE(!PATH_PLAST_BUFFER(p_s_chk_path)->b_bdev,
-+             key, chk_path->path_length);
-+      RFALSE(!PATH_PLAST_BUFFER(chk_path)->b_bdev,
-              "PAP-5060: device must not be NODEV");
--      if (comp_keys(get_lkey(p_s_chk_path, sb), p_s_key) == 1)
-+      if (comp_keys(get_lkey(chk_path, sb), key) == 1)
-               /* left delimiting key is bigger, that the key we look for */
-               return 0;
--      //  if ( comp_keys(p_s_key, get_rkey(p_s_chk_path, sb)) != -1 )
--      if (comp_keys(get_rkey(p_s_chk_path, sb), p_s_key) != 1)
--              /* p_s_key must be less than right delimitiing key */
-+      /*  if ( comp_keys(key, get_rkey(chk_path, sb)) != -1 ) */
-+      if (comp_keys(get_rkey(chk_path, sb), key) != 1)
-+              /* key must be less than right delimitiing key */
-               return 0;
-       return 1;
- }
-@@ -369,34 +369,34 @@ int reiserfs_check_path(struct treepath 
-  * dirty bits clean when preparing the buffer for the log.
-  * This version should only be called from fix_nodes() */
- void pathrelse_and_restore(struct super_block *sb,
--                         struct treepath *p_s_search_path)
-+                         struct treepath *search_path)
- {
--      int n_path_offset = p_s_search_path->path_length;
-+      int n_path_offset = search_path->path_length;
-       RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-              "clm-4000: invalid path offset");
-       while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET) {
-               struct buffer_head *bh;
--              bh = PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--);
-+              bh = PATH_OFFSET_PBUFFER(search_path, n_path_offset--);
-               reiserfs_restore_prepared_buffer(sb, bh);
-               brelse(bh);
-       }
--      p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-+      search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
- }
- /* Drop the reference to each buffer in a path */
--void pathrelse(struct treepath *p_s_search_path)
-+void pathrelse(struct treepath *search_path)
- {
--      int n_path_offset = p_s_search_path->path_length;
-+      int n_path_offset = search_path->path_length;
-       RFALSE(n_path_offset < ILLEGAL_PATH_ELEMENT_OFFSET,
-              "PAP-5090: invalid path offset");
-       while (n_path_offset > ILLEGAL_PATH_ELEMENT_OFFSET)
--              brelse(PATH_OFFSET_PBUFFER(p_s_search_path, n_path_offset--));
-+              brelse(PATH_OFFSET_PBUFFER(search_path, n_path_offset--));
--      p_s_search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
-+      search_path->path_length = ILLEGAL_PATH_ELEMENT_OFFSET;
- }
- static int is_leaf(char *buf, int blocksize, struct buffer_head *bh)
-@@ -547,9 +547,9 @@ static void search_by_key_reada(struct s
-  * Algorithm   SearchByKey                                                *
-  *             look for item in the Disk S+Tree by its key                *
-  * Input:  sb   -  super block                                            *
-- *         p_s_key  - pointer to the key to search                        *
-+ *         key  - pointer to the key to search                            *
-  * Output: ITEM_FOUND, ITEM_NOT_FOUND or IO_ERROR                         *
-- *         p_s_search_path - path from the root to the needed leaf        *
-+ *         search_path - path from the root to the needed leaf            *
-  **************************************************************************/
- /* This function fills up the path from the root to the leaf as it
-@@ -566,8 +566,8 @@ static void search_by_key_reada(struct s
-    correctness of the top of the path but need not be checked for the
-    correctness of the bottom of the path */
- /* The function is NOT SCHEDULE-SAFE! */
--int search_by_key(struct super_block *sb, const struct cpu_key *p_s_key,      /* Key to search. */
--                struct treepath *p_s_search_path,/* This structure was
-+int search_by_key(struct super_block *sb, const struct cpu_key *key,  /* Key to search. */
-+                struct treepath *search_path,/* This structure was
-                                                  allocated and initialized
-                                                  by the calling
-                                                  function. It is filled up
-@@ -580,7 +580,7 @@ int search_by_key(struct super_block *sb
-       b_blocknr_t n_block_number;
-       int expected_level;
-       struct buffer_head *bh;
--      struct path_element *p_s_last_element;
-+      struct path_element *last_element;
-       int n_node_level, n_retval;
-       int right_neighbor_of_leaf_node;
-       int fs_gen;
-@@ -598,7 +598,7 @@ int search_by_key(struct super_block *sb
-          we must be careful to release all nodes in a path before we either
-          discard the path struct or re-use the path struct, as we do here. */
--      pathrelse(p_s_search_path);
-+      pathrelse(search_path);
-       right_neighbor_of_leaf_node = 0;
-@@ -615,18 +615,18 @@ int search_by_key(struct super_block *sb
-                                        "%s: there were %d iterations of "
-                                        "while loop looking for key %K",
-                                        current->comm, n_repeat_counter,
--                                       p_s_key);
-+                                       key);
- #endif
-               /* prep path to have another element added to it. */
--              p_s_last_element =
--                  PATH_OFFSET_PELEMENT(p_s_search_path,
--                                       ++p_s_search_path->path_length);
-+              last_element =
-+                  PATH_OFFSET_PELEMENT(search_path,
-+                                       ++search_path->path_length);
-               fs_gen = get_generation(sb);
-               /* Read the next tree node, and set the last element in the path to
-                  have a pointer to it. */
--              if ((bh = p_s_last_element->pe_buffer =
-+              if ((bh = last_element->pe_buffer =
-                    sb_getblk(sb, n_block_number))) {
-                       if (!buffer_uptodate(bh) && reada_count > 1)
-                               search_by_key_reada(sb, reada_bh,
-@@ -637,8 +637,8 @@ int search_by_key(struct super_block *sb
-                               goto io_error;
-               } else {
-                     io_error:
--                      p_s_search_path->path_length--;
--                      pathrelse(p_s_search_path);
-+                      search_path->path_length--;
-+                      pathrelse(search_path);
-                       return IO_ERROR;
-               }
-               reada_count = 0;
-@@ -652,12 +652,12 @@ int search_by_key(struct super_block *sb
-               if (fs_changed(fs_gen, sb) &&
-                   (!B_IS_IN_TREE(bh) ||
-                    B_LEVEL(bh) != expected_level ||
--                   !key_in_buffer(p_s_search_path, p_s_key, sb))) {
-+                   !key_in_buffer(search_path, key, sb))) {
-                       PROC_INFO_INC(sb, search_by_key_fs_changed);
-                       PROC_INFO_INC(sb, search_by_key_restarted);
-                       PROC_INFO_INC(sb,
-                                     sbk_restarted[expected_level - 1]);
--                      pathrelse(p_s_search_path);
-+                      pathrelse(search_path);
-                       /* Get the root block number so that we can repeat the search
-                          starting from the root. */
-@@ -669,11 +669,11 @@ int search_by_key(struct super_block *sb
-                       continue;
-               }
--              /* only check that the key is in the buffer if p_s_key is not
-+              /* only check that the key is in the buffer if key is not
-                  equal to the MAX_KEY. Latter case is only possible in
-                  "finish_unfinished()" processing during mount. */
--              RFALSE(comp_keys(&MAX_KEY, p_s_key) &&
--                     !key_in_buffer(p_s_search_path, p_s_key, sb),
-+              RFALSE(comp_keys(&MAX_KEY, key) &&
-+                     !key_in_buffer(search_path, key, sb),
-                      "PAP-5130: key is not in the buffer");
- #ifdef CONFIG_REISERFS_CHECK
-               if (cur_tb) {
-@@ -689,7 +689,7 @@ int search_by_key(struct super_block *sb
-                       reiserfs_error(sb, "vs-5150",
-                                      "invalid format found in block %ld. "
-                                      "Fsck?", bh->b_blocknr);
--                      pathrelse(p_s_search_path);
-+                      pathrelse(search_path);
-                       return IO_ERROR;
-               }
-@@ -702,12 +702,12 @@ int search_by_key(struct super_block *sb
-                      "vs-5152: tree level (%d) is less than stop level (%d)",
-                      n_node_level, n_stop_level);
--              n_retval = bin_search(p_s_key, B_N_PITEM_HEAD(bh, 0),
-+              n_retval = bin_search(key, B_N_PITEM_HEAD(bh, 0),
-                                     B_NR_ITEMS(bh),
-                                     (n_node_level ==
-                                      DISK_LEAF_NODE_LEVEL) ? IH_SIZE :
-                                     KEY_SIZE,
--                                    &(p_s_last_element->pe_position));
-+                                    &(last_element->pe_position));
-               if (n_node_level == n_stop_level) {
-                       return n_retval;
-               }
-@@ -715,7 +715,7 @@ int search_by_key(struct super_block *sb
-               /* we are not in the stop level */
-               if (n_retval == ITEM_FOUND)
-                       /* item has been found, so we choose the pointer which is to the right of the found one */
--                      p_s_last_element->pe_position++;
-+                      last_element->pe_position++;
-               /* if item was not found we choose the position which is to
-                  the left of the found item. This requires no code,
-@@ -725,23 +725,23 @@ int search_by_key(struct super_block *sb
-                  an internal node.  Now we calculate child block number by
-                  position in the node. */
-               n_block_number =
--                  B_N_CHILD_NUM(bh, p_s_last_element->pe_position);
-+                  B_N_CHILD_NUM(bh, last_element->pe_position);
-               /* if we are going to read leaf nodes, try for read ahead as well */
--              if ((p_s_search_path->reada & PATH_READA) &&
-+              if ((search_path->reada & PATH_READA) &&
-                   n_node_level == DISK_LEAF_NODE_LEVEL + 1) {
--                      int pos = p_s_last_element->pe_position;
-+                      int pos = last_element->pe_position;
-                       int limit = B_NR_ITEMS(bh);
-                       struct reiserfs_key *le_key;
--                      if (p_s_search_path->reada & PATH_READA_BACK)
-+                      if (search_path->reada & PATH_READA_BACK)
-                               limit = 0;
-                       while (reada_count < SEARCH_BY_KEY_READA) {
-                               if (pos == limit)
-                                       break;
-                               reada_blocks[reada_count++] =
-                                   B_N_CHILD_NUM(bh, pos);
--                              if (p_s_search_path->reada & PATH_READA_BACK)
-+                              if (search_path->reada & PATH_READA_BACK)
-                                       pos--;
-                               else
-                                       pos++;
-@@ -751,7 +751,7 @@ int search_by_key(struct super_block *sb
-                                */
-                               le_key = B_N_PDELIM_KEY(bh, pos);
-                               if (le32_to_cpu(le_key->k_objectid) !=
--                                  p_s_key->on_disk_key.k_objectid) {
-+                                  key->on_disk_key.k_objectid) {
-                                       break;
-                               }
-                       }
-@@ -760,11 +760,11 @@ int search_by_key(struct super_block *sb
- }
- /* Form the path to an item and position in this item which contains
--   file byte defined by p_s_key. If there is no such item
-+   file byte defined by key. If there is no such item
-    corresponding to the key, we point the path to the item with
--   maximal key less than p_s_key, and *p_n_pos_in_item is set to one
-+   maximal key less than key, and *pos_in_item is set to one
-    past the last entry/byte in the item.  If searching for entry in a
--   directory item, and it is not found, *p_n_pos_in_item is set to one
-+   directory item, and it is not found, *pos_in_item is set to one
-    entry more than the entry with maximal key which is less than the
-    sought key.
-@@ -777,7 +777,7 @@ int search_by_key(struct super_block *sb
- /* The function is NOT SCHEDULE-SAFE! */
- int search_for_position_by_key(struct super_block *sb,        /* Pointer to the super block.          */
-                              const struct cpu_key *p_cpu_key, /* Key to search (cpu variable)         */
--                             struct treepath *p_s_search_path /* Filled up by this function.          */
-+                             struct treepath *search_path     /* Filled up by this function.          */
-     )
- {
-       struct item_head *p_le_ih;      /* pointer to on-disk structure */
-@@ -788,34 +788,34 @@ int search_for_position_by_key(struct su
-       /* If searching for directory entry. */
-       if (is_direntry_cpu_key(p_cpu_key))
--              return search_by_entry_key(sb, p_cpu_key, p_s_search_path,
-+              return search_by_entry_key(sb, p_cpu_key, search_path,
-                                          &de);
-       /* If not searching for directory entry. */
-       /* If item is found. */
--      retval = search_item(sb, p_cpu_key, p_s_search_path);
-+      retval = search_item(sb, p_cpu_key, search_path);
-       if (retval == IO_ERROR)
-               return retval;
-       if (retval == ITEM_FOUND) {
-               RFALSE(!ih_item_len
-                      (B_N_PITEM_HEAD
--                      (PATH_PLAST_BUFFER(p_s_search_path),
--                       PATH_LAST_POSITION(p_s_search_path))),
-+                      (PATH_PLAST_BUFFER(search_path),
-+                       PATH_LAST_POSITION(search_path))),
-                      "PAP-5165: item length equals zero");
--              pos_in_item(p_s_search_path) = 0;
-+              pos_in_item(search_path) = 0;
-               return POSITION_FOUND;
-       }
--      RFALSE(!PATH_LAST_POSITION(p_s_search_path),
-+      RFALSE(!PATH_LAST_POSITION(search_path),
-              "PAP-5170: position equals zero");
-       /* Item is not found. Set path to the previous item. */
-       p_le_ih =
--          B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_search_path),
--                         --PATH_LAST_POSITION(p_s_search_path));
-+          B_N_PITEM_HEAD(PATH_PLAST_BUFFER(search_path),
-+                         --PATH_LAST_POSITION(search_path));
-       n_blk_size = sb->s_blocksize;
-       if (comp_short_keys(&(p_le_ih->ih_key), p_cpu_key)) {
-@@ -829,9 +829,9 @@ int search_for_position_by_key(struct su
-       /* Needed byte is contained in the item pointed to by the path. */
-       if (item_offset <= offset &&
-           item_offset + op_bytes_number(p_le_ih, n_blk_size) > offset) {
--              pos_in_item(p_s_search_path) = offset - item_offset;
-+              pos_in_item(search_path) = offset - item_offset;
-               if (is_indirect_le_ih(p_le_ih)) {
--                      pos_in_item(p_s_search_path) /= n_blk_size;
-+                      pos_in_item(search_path) /= n_blk_size;
-               }
-               return POSITION_FOUND;
-       }
-@@ -839,18 +839,18 @@ int search_for_position_by_key(struct su
-       /* Needed byte is not contained in the item pointed to by the
-          path. Set pos_in_item out of the item. */
-       if (is_indirect_le_ih(p_le_ih))
--              pos_in_item(p_s_search_path) =
-+              pos_in_item(search_path) =
-                   ih_item_len(p_le_ih) / UNFM_P_SIZE;
-       else
--              pos_in_item(p_s_search_path) = ih_item_len(p_le_ih);
-+              pos_in_item(search_path) = ih_item_len(p_le_ih);
-       return POSITION_NOT_FOUND;
- }
- /* Compare given item and item pointed to by the path. */
--int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path)
-+int comp_items(const struct item_head *stored_ih, const struct treepath *path)
- {
--      struct buffer_head *bh = PATH_PLAST_BUFFER(p_s_path);
-+      struct buffer_head *bh = PATH_PLAST_BUFFER(path);
-       struct item_head *ih;
-       /* Last buffer at the path is not in the tree. */
-@@ -858,11 +858,11 @@ int comp_items(const struct item_head *s
-               return 1;
-       /* Last path position is invalid. */
--      if (PATH_LAST_POSITION(p_s_path) >= B_NR_ITEMS(bh))
-+      if (PATH_LAST_POSITION(path) >= B_NR_ITEMS(bh))
-               return 1;
-       /* we need only to know, whether it is the same item */
--      ih = get_ih(p_s_path);
-+      ih = get_ih(path);
-       return memcmp(stored_ih, ih, IH_SIZE);
- }
-@@ -951,14 +951,14 @@ static inline int prepare_for_direntry_i
-     In case of file truncate calculate whether this item must be deleted/truncated or last
-     unformatted node of this item will be converted to a direct item.
-     This function returns a determination of what balance mode the calling function should employ. */
--static char prepare_for_delete_or_cut(struct reiserfs_transaction_handle *th, struct inode *inode, struct treepath *p_s_path, const struct cpu_key *p_s_item_key, int *p_n_removed,   /* Number of unformatted nodes which were removed
-+static char prepare_for_delete_or_cut(struct reiserfs_transaction_handle *th, struct inode *inode, struct treepath *path, const struct cpu_key *item_key, int *removed,       /* Number of unformatted nodes which were removed
-                                                                                                                                                                                  from end of the file. */
--                                    int *p_n_cut_size, unsigned long long n_new_file_length   /* MAX_KEY_OFFSET in case of delete. */
-+                                    int *cut_size, unsigned long long n_new_file_length       /* MAX_KEY_OFFSET in case of delete. */
-     )
- {
-       struct super_block *sb = inode->i_sb;
--      struct item_head *p_le_ih = PATH_PITEM_HEAD(p_s_path);
--      struct buffer_head *bh = PATH_PLAST_BUFFER(p_s_path);
-+      struct item_head *p_le_ih = PATH_PITEM_HEAD(path);
-+      struct buffer_head *bh = PATH_PLAST_BUFFER(path);
-       BUG_ON(!th->t_trans_id);
-@@ -968,20 +968,20 @@ static char prepare_for_delete_or_cut(st
-               RFALSE(n_new_file_length != max_reiserfs_offset(inode),
-                      "PAP-5210: mode must be M_DELETE");
--              *p_n_cut_size = -(IH_SIZE + ih_item_len(p_le_ih));
-+              *cut_size = -(IH_SIZE + ih_item_len(p_le_ih));
-               return M_DELETE;
-       }
-       /* Directory item. */
-       if (is_direntry_le_ih(p_le_ih))
--              return prepare_for_direntry_item(p_s_path, p_le_ih, inode,
-+              return prepare_for_direntry_item(path, p_le_ih, inode,
-                                                n_new_file_length,
--                                               p_n_cut_size);
-+                                               cut_size);
-       /* Direct item. */
-       if (is_direct_le_ih(p_le_ih))
--              return prepare_for_direct_item(p_s_path, p_le_ih, inode,
--                                             n_new_file_length, p_n_cut_size);
-+              return prepare_for_direct_item(path, p_le_ih, inode,
-+                                             n_new_file_length, cut_size);
-       /* Case of an indirect item. */
-       {
-@@ -1001,9 +1001,9 @@ static char prepare_for_delete_or_cut(st
-           do {
-               need_re_search = 0;
--              *p_n_cut_size = 0;
--              bh = PATH_PLAST_BUFFER(p_s_path);
--              copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-+              *cut_size = 0;
-+              bh = PATH_PLAST_BUFFER(path);
-+              copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
-               pos = I_UNFM_NUM(&s_ih);
-               while (le_ih_k_offset (&s_ih) + (pos - 1) * blk_size > n_new_file_length) {
-@@ -1013,10 +1013,9 @@ static char prepare_for_delete_or_cut(st
-                   /* Each unformatted block deletion may involve one additional
-                    * bitmap block into the transaction, thereby the initial
-                    * journal space reservation might not be enough. */
--                  if (!delete && (*p_n_cut_size) != 0 &&
--                      reiserfs_transaction_free_space(th) < JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD) {
-+                  if (!delete && (*cut_size) != 0 &&
-+                      reiserfs_transaction_free_space(th) < JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD)
-                       break;
--                  }
-                   unfm = (__le32 *)B_I_PITEM(bh, &s_ih) + pos - 1;
-                   block = get_block_num(unfm, 0);
-@@ -1030,17 +1029,17 @@ static char prepare_for_delete_or_cut(st
-                   cond_resched();
--                  if (item_moved (&s_ih, p_s_path))  {
-+                  if (item_moved (&s_ih, path))  {
-                       need_re_search = 1;
-                       break;
-                   }
-                   pos --;
--                  (*p_n_removed) ++;
--                  (*p_n_cut_size) -= UNFM_P_SIZE;
-+                  (*removed)++;
-+                  (*cut_size) -= UNFM_P_SIZE;
-                   if (pos == 0) {
--                      (*p_n_cut_size) -= IH_SIZE;
-+                      (*cut_size) -= IH_SIZE;
-                       result = M_DELETE;
-                       break;
-                   }
-@@ -1050,10 +1049,10 @@ static char prepare_for_delete_or_cut(st
-               ** buffer */
-               reiserfs_restore_prepared_buffer(sb, bh);
-           } while (need_re_search &&
--                   search_for_position_by_key(sb, p_s_item_key, p_s_path) == POSITION_FOUND);
--          pos_in_item(p_s_path) = pos * UNFM_P_SIZE;
-+                   search_for_position_by_key(sb, item_key, path) == POSITION_FOUND);
-+          pos_in_item(path) = pos * UNFM_P_SIZE;
--          if (*p_n_cut_size == 0) {
-+          if (*cut_size == 0) {
-               /* Nothing were cut. maybe convert last unformatted node to the
-                * direct item? */
-               result = M_CONVERT;
-@@ -1091,7 +1090,7 @@ static int calc_deleted_bytes_number(str
- static void init_tb_struct(struct reiserfs_transaction_handle *th,
-                          struct tree_balance *tb,
-                          struct super_block *sb,
--                         struct treepath *p_s_path, int n_size)
-+                         struct treepath *path, int n_size)
- {
-       BUG_ON(!th->t_trans_id);
-@@ -1099,9 +1098,9 @@ static void init_tb_struct(struct reiser
-       memset(tb, '\0', sizeof(struct tree_balance));
-       tb->transaction_handle = th;
-       tb->tb_sb = sb;
--      tb->tb_path = p_s_path;
--      PATH_OFFSET_PBUFFER(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
--      PATH_OFFSET_POSITION(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
-+      tb->tb_path = path;
-+      PATH_OFFSET_PBUFFER(path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
-+      PATH_OFFSET_POSITION(path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
-       tb->insert_size[0] = n_size;
- }
-@@ -1141,13 +1140,17 @@ char head2type(struct item_head *ih)
- }
- #endif
--/* Delete object item. */
--int reiserfs_delete_item(struct reiserfs_transaction_handle *th, struct treepath *p_s_path,   /* Path to the deleted item. */
--                       const struct cpu_key *p_s_item_key,    /* Key to search for the deleted item.  */
--                       struct inode *inode,   /* inode is here just to update
--                                               * i_blocks and quotas */
--                       struct buffer_head *p_s_un_bh)
--{                             /* NULL or unformatted node pointer.    */
-+/* Delete object item.
-+ * th       - active transaction handle
-+ * path     - path to the deleted item
-+ * item_key - key to search for the deleted item
-+ * indode   - used for updating i_blocks and quotas
-+ * un_bh    - NULL or unformatted node pointer
-+ */
-+int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
-+                       struct treepath *path, const struct cpu_key *item_key,
-+                       struct inode *inode, struct buffer_head *un_bh)
-+{
-       struct super_block *sb = inode->i_sb;
-       struct tree_balance s_del_balance;
-       struct item_head s_ih;
-@@ -1162,7 +1165,7 @@ int reiserfs_delete_item(struct reiserfs
-       BUG_ON(!th->t_trans_id);
--      init_tb_struct(th, &s_del_balance, sb, p_s_path,
-+      init_tb_struct(th, &s_del_balance, sb, path,
-                      0 /*size is unknown */ );
-       while (1) {
-@@ -1172,14 +1175,14 @@ int reiserfs_delete_item(struct reiserfs
-               n_iter++;
-               c_mode =
- #endif
--                  prepare_for_delete_or_cut(th, inode, p_s_path,
--                                            p_s_item_key, &n_removed,
-+                  prepare_for_delete_or_cut(th, inode, path,
-+                                            item_key, &n_removed,
-                                             &n_del_size,
-                                             max_reiserfs_offset(inode));
-               RFALSE(c_mode != M_DELETE, "PAP-5320: mode must be M_DELETE");
--              copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-+              copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
-               s_del_balance.insert_size[0] = n_del_size;
-               n_ret_value = fix_nodes(M_DELETE, &s_del_balance, NULL, NULL);
-@@ -1190,13 +1193,13 @@ int reiserfs_delete_item(struct reiserfs
-               // file system changed, repeat search
-               n_ret_value =
--                  search_for_position_by_key(sb, p_s_item_key, p_s_path);
-+                  search_for_position_by_key(sb, item_key, path);
-               if (n_ret_value == IO_ERROR)
-                       break;
-               if (n_ret_value == FILE_NOT_FOUND) {
-                       reiserfs_warning(sb, "vs-5340",
-                                        "no items of the file %K found",
--                                       p_s_item_key);
-+                                       item_key);
-                       break;
-               }
-       }                       /* while (1) */
-@@ -1207,7 +1210,7 @@ int reiserfs_delete_item(struct reiserfs
-       }
-       // reiserfs_delete_item returns item length when success
-       n_ret_value = calc_deleted_bytes_number(&s_del_balance, M_DELETE);
--      q_ih = get_ih(p_s_path);
-+      q_ih = get_ih(path);
-       quota_cut_bytes = ih_item_len(q_ih);
-       /* hack so the quota code doesn't have to guess if the file
-@@ -1224,7 +1227,7 @@ int reiserfs_delete_item(struct reiserfs
-               }
-       }
--      if (p_s_un_bh) {
-+      if (un_bh) {
-               int off;
-               char *data;
-@@ -1242,16 +1245,16 @@ int reiserfs_delete_item(struct reiserfs
-                ** The unformatted node must be dirtied later on.  We can't be
-                ** sure here if the entire tail has been deleted yet.
-                **
--               ** p_s_un_bh is from the page cache (all unformatted nodes are
-+               ** un_bh is from the page cache (all unformatted nodes are
-                ** from the page cache) and might be a highmem page.  So, we
--               ** can't use p_s_un_bh->b_data.
-+               ** can't use un_bh->b_data.
-                ** -clm
-                */
--              data = kmap_atomic(p_s_un_bh->b_page, KM_USER0);
-+              data = kmap_atomic(un_bh->b_page, KM_USER0);
-               off = ((le_ih_k_offset(&s_ih) - 1) & (PAGE_CACHE_SIZE - 1));
-               memcpy(data + off,
--                     B_I_PITEM(PATH_PLAST_BUFFER(p_s_path), &s_ih),
-+                     B_I_PITEM(PATH_PLAST_BUFFER(path), &s_ih),
-                      n_ret_value);
-               kunmap_atomic(data, KM_USER0);
-       }
-@@ -1427,9 +1430,9 @@ static void unmap_buffers(struct page *p
- static int maybe_indirect_to_direct(struct reiserfs_transaction_handle *th,
-                                   struct inode *inode,
-                                   struct page *page,
--                                  struct treepath *p_s_path,
--                                  const struct cpu_key *p_s_item_key,
--                                  loff_t n_new_file_size, char *p_c_mode)
-+                                  struct treepath *path,
-+                                  const struct cpu_key *item_key,
-+                                  loff_t n_new_file_size, char *mode)
- {
-       struct super_block *sb = inode->i_sb;
-       int n_block_size = sb->s_blocksize;
-@@ -1445,17 +1448,17 @@ static int maybe_indirect_to_direct(stru
-           !tail_has_to_be_packed(inode) ||
-           !page || (REISERFS_I(inode)->i_flags & i_nopack_mask)) {
-               /* leave tail in an unformatted node */
--              *p_c_mode = M_SKIP_BALANCING;
-+              *mode = M_SKIP_BALANCING;
-               cut_bytes =
-                   n_block_size - (n_new_file_size & (n_block_size - 1));
--              pathrelse(p_s_path);
-+              pathrelse(path);
-               return cut_bytes;
-       }
--      /* Permorm the conversion to a direct_item. */
--      /* return indirect_to_direct(inode, p_s_path, p_s_item_key,
--                                n_new_file_size, p_c_mode); */
--      return indirect2direct(th, inode, page, p_s_path, p_s_item_key,
--                             n_new_file_size, p_c_mode);
-+      /* Perform the conversion to a direct_item. */
-+      /* return indirect_to_direct(inode, path, item_key,
-+                                n_new_file_size, mode); */
-+      return indirect2direct(th, inode, page, path, item_key,
-+                             n_new_file_size, mode);
- }
- /* we did indirect_to_direct conversion. And we have inserted direct
-@@ -1506,8 +1509,8 @@ static void indirect_to_direct_roll_back
- /* (Truncate or cut entry) or delete object item. Returns < 0 on failure */
- int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
--                         struct treepath *p_s_path,
--                         struct cpu_key *p_s_item_key,
-+                         struct treepath *path,
-+                         struct cpu_key *item_key,
-                          struct inode *inode,
-                          struct page *page, loff_t n_new_file_size)
- {
-@@ -1528,7 +1531,7 @@ int reiserfs_cut_from_item(struct reiser
-       BUG_ON(!th->t_trans_id);
--      init_tb_struct(th, &s_cut_balance, inode->i_sb, p_s_path,
-+      init_tb_struct(th, &s_cut_balance, inode->i_sb, path,
-                      n_cut_size);
-       /* Repeat this loop until we either cut the item without needing
-@@ -1540,8 +1543,8 @@ int reiserfs_cut_from_item(struct reiser
-                  pointers. */
-               c_mode =
--                  prepare_for_delete_or_cut(th, inode, p_s_path,
--                                            p_s_item_key, &n_removed,
-+                  prepare_for_delete_or_cut(th, inode, path,
-+                                            item_key, &n_removed,
-                                             &n_cut_size, n_new_file_size);
-               if (c_mode == M_CONVERT) {
-                       /* convert last unformatted node to direct item or leave
-@@ -1551,7 +1554,7 @@ int reiserfs_cut_from_item(struct reiser
-                       n_ret_value =
-                           maybe_indirect_to_direct(th, inode, page,
--                                                   p_s_path, p_s_item_key,
-+                                                   path, item_key,
-                                                    n_new_file_size, &c_mode);
-                       if (c_mode == M_SKIP_BALANCING)
-                               /* tail has been left in the unformatted node */
-@@ -1568,26 +1571,26 @@ int reiserfs_cut_from_item(struct reiser
-                          inserting the new direct item.  Now we are removing the
-                          last unformatted node pointer. Set key to search for
-                          it. */
--                      set_cpu_key_k_type(p_s_item_key, TYPE_INDIRECT);
--                      p_s_item_key->key_length = 4;
-+                      set_cpu_key_k_type(item_key, TYPE_INDIRECT);
-+                      item_key->key_length = 4;
-                       n_new_file_size -=
-                           (n_new_file_size & (sb->s_blocksize - 1));
-                       tail_pos = n_new_file_size;
--                      set_cpu_key_k_offset(p_s_item_key, n_new_file_size + 1);
-+                      set_cpu_key_k_offset(item_key, n_new_file_size + 1);
-                       if (search_for_position_by_key
--                          (sb, p_s_item_key,
--                           p_s_path) == POSITION_NOT_FOUND) {
--                              print_block(PATH_PLAST_BUFFER(p_s_path), 3,
--                                          PATH_LAST_POSITION(p_s_path) - 1,
--                                          PATH_LAST_POSITION(p_s_path) + 1);
-+                          (sb, item_key,
-+                           path) == POSITION_NOT_FOUND) {
-+                              print_block(PATH_PLAST_BUFFER(path), 3,
-+                                          PATH_LAST_POSITION(path) - 1,
-+                                          PATH_LAST_POSITION(path) + 1);
-                               reiserfs_panic(sb, "PAP-5580", "item to "
-                                              "convert does not exist (%K)",
--                                             p_s_item_key);
-+                                             item_key);
-                       }
-                       continue;
-               }
-               if (n_cut_size == 0) {
--                      pathrelse(p_s_path);
-+                      pathrelse(path);
-                       return 0;
-               }
-@@ -1600,12 +1603,12 @@ int reiserfs_cut_from_item(struct reiser
-               PROC_INFO_INC(sb, cut_from_item_restarted);
-               n_ret_value =
--                  search_for_position_by_key(sb, p_s_item_key, p_s_path);
-+                  search_for_position_by_key(sb, item_key, path);
-               if (n_ret_value == POSITION_FOUND)
-                       continue;
-               reiserfs_warning(sb, "PAP-5610", "item %K not found",
--                               p_s_item_key);
-+                               item_key);
-               unfix_nodes(&s_cut_balance);
-               return (n_ret_value == IO_ERROR) ? -EIO : -ENOENT;
-       }                       /* while */
-@@ -1615,7 +1618,7 @@ int reiserfs_cut_from_item(struct reiser
-               if (n_is_inode_locked) {
-                       // FIXME: this seems to be not needed: we are always able
-                       // to cut item
--                      indirect_to_direct_roll_back(th, inode, p_s_path);
-+                      indirect_to_direct_roll_back(th, inode, path);
-               }
-               if (n_ret_value == NO_DISK_SPACE)
-                       reiserfs_warning(sb, "reiserfs-5092",
-@@ -1631,7 +1634,7 @@ int reiserfs_cut_from_item(struct reiser
-       /* Calculate number of bytes that need to be cut from the item. */
-       quota_cut_bytes =
-           (c_mode ==
--           M_DELETE) ? ih_item_len(get_ih(p_s_path)) : -s_cut_balance.
-+           M_DELETE) ? ih_item_len(get_ih(path)) : -s_cut_balance.
-           insert_size[0];
-       if (retval2 == -1)
-               n_ret_value = calc_deleted_bytes_number(&s_cut_balance, c_mode);
-@@ -1878,7 +1881,7 @@ int reiserfs_do_truncate(struct reiserfs
- #ifdef CONFIG_REISERFS_CHECK
- // this makes sure, that we __append__, not overwrite or add holes
- static void check_research_for_paste(struct treepath *path,
--                                   const struct cpu_key *p_s_key)
-+                                   const struct cpu_key *key)
- {
-       struct item_head *found_ih = get_ih(path);
-@@ -1886,35 +1889,35 @@ static void check_research_for_paste(str
-               if (le_ih_k_offset(found_ih) +
-                   op_bytes_number(found_ih,
-                                   get_last_bh(path)->b_size) !=
--                  cpu_key_k_offset(p_s_key)
-+                  cpu_key_k_offset(key)
-                   || op_bytes_number(found_ih,
-                                      get_last_bh(path)->b_size) !=
-                   pos_in_item(path))
-                       reiserfs_panic(NULL, "PAP-5720", "found direct item "
-                                      "%h or position (%d) does not match "
-                                      "to key %K", found_ih,
--                                     pos_in_item(path), p_s_key);
-+                                     pos_in_item(path), key);
-       }
-       if (is_indirect_le_ih(found_ih)) {
-               if (le_ih_k_offset(found_ih) +
-                   op_bytes_number(found_ih,
-                                   get_last_bh(path)->b_size) !=
--                  cpu_key_k_offset(p_s_key)
-+                  cpu_key_k_offset(key)
-                   || I_UNFM_NUM(found_ih) != pos_in_item(path)
-                   || get_ih_free_space(found_ih) != 0)
-                       reiserfs_panic(NULL, "PAP-5730", "found indirect "
-                                      "item (%h) or position (%d) does not "
-                                      "match to key (%K)",
--                                     found_ih, pos_in_item(path), p_s_key);
-+                                     found_ih, pos_in_item(path), key);
-       }
- }
- #endif                                /* config reiserfs check */
- /* Paste bytes to the existing item. Returns bytes number pasted into the item. */
--int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct treepath *p_s_search_path,        /* Path to the pasted item.          */
--                           const struct cpu_key *p_s_key,     /* Key to search for the needed item. */
-+int reiserfs_paste_into_item(struct reiserfs_transaction_handle *th, struct treepath *search_path,    /* Path to the pasted item.       */
-+                           const struct cpu_key *key, /* Key to search for the needed item. */
-                            struct inode *inode,       /* Inode item belongs to */
--                           const char *p_c_body,      /* Pointer to the bytes to paste.    */
-+                           const char *body,  /* Pointer to the bytes to paste.    */
-                            int n_pasted_size)
- {                             /* Size of pasted bytes.             */
-       struct tree_balance s_paste_balance;
-@@ -1929,17 +1932,17 @@ int reiserfs_paste_into_item(struct reis
-       reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                      "reiserquota paste_into_item(): allocating %u id=%u type=%c",
-                      n_pasted_size, inode->i_uid,
--                     key2type(&(p_s_key->on_disk_key)));
-+                     key2type(&(key->on_disk_key)));
- #endif
-       if (DQUOT_ALLOC_SPACE_NODIRTY(inode, n_pasted_size)) {
--              pathrelse(p_s_search_path);
-+              pathrelse(search_path);
-               return -EDQUOT;
-       }
--      init_tb_struct(th, &s_paste_balance, th->t_super, p_s_search_path,
-+      init_tb_struct(th, &s_paste_balance, th->t_super, search_path,
-                      n_pasted_size);
- #ifdef DISPLACE_NEW_PACKING_LOCALITIES
--      s_paste_balance.key = p_s_key->on_disk_key;
-+      s_paste_balance.key = key->on_disk_key;
- #endif
-       /* DQUOT_* can schedule, must check before the fix_nodes */
-@@ -1949,13 +1952,13 @@ int reiserfs_paste_into_item(struct reis
-       while ((retval =
-               fix_nodes(M_PASTE, &s_paste_balance, NULL,
--                        p_c_body)) == REPEAT_SEARCH) {
-+                        body)) == REPEAT_SEARCH) {
-             search_again:
-               /* file system changed while we were in the fix_nodes */
-               PROC_INFO_INC(th->t_super, paste_into_item_restarted);
-               retval =
--                  search_for_position_by_key(th->t_super, p_s_key,
--                                             p_s_search_path);
-+                  search_for_position_by_key(th->t_super, key,
-+                                             search_path);
-               if (retval == IO_ERROR) {
-                       retval = -EIO;
-                       goto error_out;
-@@ -1963,19 +1966,19 @@ int reiserfs_paste_into_item(struct reis
-               if (retval == POSITION_FOUND) {
-                       reiserfs_warning(inode->i_sb, "PAP-5710",
-                                        "entry or pasted byte (%K) exists",
--                                       p_s_key);
-+                                       key);
-                       retval = -EEXIST;
-                       goto error_out;
-               }
- #ifdef CONFIG_REISERFS_CHECK
--              check_research_for_paste(p_s_search_path, p_s_key);
-+              check_research_for_paste(search_path, key);
- #endif
-       }
-       /* Perform balancing after all resources are collected by fix_nodes, and
-          accessing them will not risk triggering schedule. */
-       if (retval == CARRY_ON) {
--              do_balance(&s_paste_balance, NULL /*ih */ , p_c_body, M_PASTE);
-+              do_balance(&s_paste_balance, NULL /*ih */ , body, M_PASTE);
-               return 0;
-       }
-       retval = (retval == NO_DISK_SPACE) ? -ENOSPC : -EIO;
-@@ -1986,17 +1989,23 @@ int reiserfs_paste_into_item(struct reis
-       reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                      "reiserquota paste_into_item(): freeing %u id=%u type=%c",
-                      n_pasted_size, inode->i_uid,
--                     key2type(&(p_s_key->on_disk_key)));
-+                     key2type(&(key->on_disk_key)));
- #endif
-       DQUOT_FREE_SPACE_NODIRTY(inode, n_pasted_size);
-       return retval;
- }
--/* Insert new item into the buffer at the path. */
--int reiserfs_insert_item(struct reiserfs_transaction_handle *th, struct treepath *p_s_path,   /* Path to the inserteded item.         */
--                       const struct cpu_key *key, struct item_head *p_s_ih,   /* Pointer to the item header to insert. */
--                       struct inode *inode, const char *p_c_body)
--{                             /* Pointer to the bytes to insert.      */
-+/* Insert new item into the buffer at the path.
-+ * th   - active transaction handle
-+ * path - path to the inserted item
-+ * ih   - pointer to the item header to insert
-+ * body - pointer to the bytes to insert
-+ */
-+int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
-+                       struct treepath *path, const struct cpu_key *key,
-+                       struct item_head *ih, struct inode *inode,
-+                       const char *body)
-+{
-       struct tree_balance s_ins_balance;
-       int retval;
-       int fs_gen = 0;
-@@ -2006,28 +2015,27 @@ int reiserfs_insert_item(struct reiserfs
-       if (inode) {            /* Do we count quotas for item? */
-               fs_gen = get_generation(inode->i_sb);
--              quota_bytes = ih_item_len(p_s_ih);
-+              quota_bytes = ih_item_len(ih);
-               /* hack so the quota code doesn't have to guess if the file has
-                ** a tail, links are always tails, so there's no guessing needed
-                */
--              if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(p_s_ih)) {
-+              if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(ih))
-                       quota_bytes = inode->i_sb->s_blocksize + UNFM_P_SIZE;
--              }
- #ifdef REISERQUOTA_DEBUG
-               reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                              "reiserquota insert_item(): allocating %u id=%u type=%c",
--                             quota_bytes, inode->i_uid, head2type(p_s_ih));
-+                             quota_bytes, inode->i_uid, head2type(ih));
- #endif
-               /* We can't dirty inode here. It would be immediately written but
-                * appropriate stat item isn't inserted yet... */
-               if (DQUOT_ALLOC_SPACE_NODIRTY(inode, quota_bytes)) {
--                      pathrelse(p_s_path);
-+                      pathrelse(path);
-                       return -EDQUOT;
-               }
-       }
--      init_tb_struct(th, &s_ins_balance, th->t_super, p_s_path,
--                     IH_SIZE + ih_item_len(p_s_ih));
-+      init_tb_struct(th, &s_ins_balance, th->t_super, path,
-+                     IH_SIZE + ih_item_len(ih));
- #ifdef DISPLACE_NEW_PACKING_LOCALITIES
-       s_ins_balance.key = key->on_disk_key;
- #endif
-@@ -2037,12 +2045,12 @@ int reiserfs_insert_item(struct reiserfs
-       }
-       while ((retval =
--              fix_nodes(M_INSERT, &s_ins_balance, p_s_ih,
--                        p_c_body)) == REPEAT_SEARCH) {
-+              fix_nodes(M_INSERT, &s_ins_balance, ih,
-+                        body)) == REPEAT_SEARCH) {
-             search_again:
-               /* file system changed while we were in the fix_nodes */
-               PROC_INFO_INC(th->t_super, insert_item_restarted);
--              retval = search_item(th->t_super, key, p_s_path);
-+              retval = search_item(th->t_super, key, path);
-               if (retval == IO_ERROR) {
-                       retval = -EIO;
-                       goto error_out;
-@@ -2058,7 +2066,7 @@ int reiserfs_insert_item(struct reiserfs
-       /* make balancing after all resources will be collected at a time */
-       if (retval == CARRY_ON) {
--              do_balance(&s_ins_balance, p_s_ih, p_c_body, M_INSERT);
-+              do_balance(&s_ins_balance, ih, body, M_INSERT);
-               return 0;
-       }
-@@ -2069,7 +2077,7 @@ int reiserfs_insert_item(struct reiserfs
- #ifdef REISERQUOTA_DEBUG
-       reiserfs_debug(th->t_super, REISERFS_DEBUG_CODE,
-                      "reiserquota insert_item(): freeing %u id=%u type=%c",
--                     quota_bytes, inode->i_uid, head2type(p_s_ih));
-+                     quota_bytes, inode->i_uid, head2type(ih));
- #endif
-       if (inode)
-               DQUOT_FREE_SPACE_NODIRTY(inode, quota_bytes);
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -172,10 +172,12 @@ void reiserfs_unmap_buffer(struct buffer
-    inode */
- int indirect2direct(struct reiserfs_transaction_handle *th,
-                   struct inode *inode, struct page *page,
--                  struct treepath *p_s_path,  /* path to the indirect item. */
--                  const struct cpu_key *p_s_item_key, /* Key to look for unformatted node pointer to be cut. */
-+                  struct treepath *path,      /* path to the indirect item. */
-+                  const struct cpu_key *item_key,     /* Key to look for
-+                                                       * unformatted node
-+                                                       * pointer to be cut. */
-                   loff_t n_new_file_size,     /* New file size. */
--                  char *p_c_mode)
-+                  char *mode)
- {
-       struct super_block *sb = inode->i_sb;
-       struct item_head s_ih;
-@@ -189,10 +191,10 @@ int indirect2direct(struct reiserfs_tran
-       REISERFS_SB(sb)->s_indirect2direct++;
--      *p_c_mode = M_SKIP_BALANCING;
-+      *mode = M_SKIP_BALANCING;
-       /* store item head path points to. */
--      copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-+      copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
-       tail_len = (n_new_file_size & (n_block_size - 1));
-       if (get_inode_sd_version(inode) == STAT_DATA_V2)
-@@ -211,14 +213,14 @@ int indirect2direct(struct reiserfs_tran
-       tail = (char *)kmap(page);      /* this can schedule */
--      if (path_changed(&s_ih, p_s_path)) {
-+      if (path_changed(&s_ih, path)) {
-               /* re-search indirect item */
--              if (search_for_position_by_key(sb, p_s_item_key, p_s_path)
-+              if (search_for_position_by_key(sb, item_key, path)
-                   == POSITION_NOT_FOUND)
-                       reiserfs_panic(sb, "PAP-5520",
-                                      "item to be converted %K does not exist",
--                                     p_s_item_key);
--              copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-+                                     item_key);
-+              copy_item_head(&s_ih, PATH_PITEM_HEAD(path));
- #ifdef CONFIG_REISERFS_CHECK
-               pos = le_ih_k_offset(&s_ih) - 1 +
-                   (ih_item_len(&s_ih) / UNFM_P_SIZE -
-@@ -240,13 +242,13 @@ int indirect2direct(struct reiserfs_tran
-        */
-       tail = tail + (pos & (PAGE_CACHE_SIZE - 1));
--      PATH_LAST_POSITION(p_s_path)++;
-+      PATH_LAST_POSITION(path)++;
--      key = *p_s_item_key;
-+      key = *item_key;
-       set_cpu_key_k_type(&key, TYPE_DIRECT);
-       key.key_length = 4;
-       /* Insert tail as new direct item in the tree */
--      if (reiserfs_insert_item(th, p_s_path, &key, &s_ih, inode,
-+      if (reiserfs_insert_item(th, path, &key, &s_ih, inode,
-                                tail ? tail : NULL) < 0) {
-               /* No disk memory. So we can not convert last unformatted node
-                  to the direct item.  In this case we used to adjust
-@@ -268,7 +270,7 @@ int indirect2direct(struct reiserfs_tran
-       /* We have inserted new direct item and must remove last
-          unformatted node. */
--      *p_c_mode = M_CUT;
-+      *mode = M_CUT;
-       /* we store position of first direct item in the in-core inode */
-       /* mark_file_with_tail (inode, pos1 + 1); */
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -694,9 +694,9 @@ static inline void cpu_key_k_offset_dec(
- #define is_indirect_cpu_ih(ih) (is_indirect_cpu_key (&((ih)->ih_key)))
- #define is_statdata_cpu_ih(ih) (is_statdata_cpu_key (&((ih)->ih_key)))
--#define I_K_KEY_IN_ITEM(p_s_ih, p_s_key, n_blocksize) \
--    ( ! COMP_SHORT_KEYS(p_s_ih, p_s_key) && \
--          I_OFF_BYTE_IN_ITEM(p_s_ih, k_offset (p_s_key), n_blocksize) )
-+#define I_K_KEY_IN_ITEM(ih, key, n_blocksize) \
-+    (!COMP_SHORT_KEYS(ih, key) && \
-+        I_OFF_BYTE_IN_ITEM(ih, k_offset(key), n_blocksize))
- /* maximal length of item */
- #define MAX_ITEM_LEN(block_size) (block_size - BLKH_SIZE - IH_SIZE)
-@@ -1196,33 +1196,33 @@ struct treepath {
- struct treepath var = {.path_length = ILLEGAL_PATH_ELEMENT_OFFSET, .reada = 0,}
- /* Get path element by path and path position. */
--#define PATH_OFFSET_PELEMENT(p_s_path,n_offset)  ((p_s_path)->path_elements +(n_offset))
-+#define PATH_OFFSET_PELEMENT(path, n_offset)  ((path)->path_elements + (n_offset))
- /* Get buffer header at the path by path and path position. */
--#define PATH_OFFSET_PBUFFER(p_s_path,n_offset)   (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_buffer)
-+#define PATH_OFFSET_PBUFFER(path, n_offset)   (PATH_OFFSET_PELEMENT(path, n_offset)->pe_buffer)
- /* Get position in the element at the path by path and path position. */
--#define PATH_OFFSET_POSITION(p_s_path,n_offset) (PATH_OFFSET_PELEMENT(p_s_path,n_offset)->pe_position)
-+#define PATH_OFFSET_POSITION(path, n_offset) (PATH_OFFSET_PELEMENT(path, n_offset)->pe_position)
--#define PATH_PLAST_BUFFER(p_s_path) (PATH_OFFSET_PBUFFER((p_s_path), (p_s_path)->path_length))
-+#define PATH_PLAST_BUFFER(path) (PATH_OFFSET_PBUFFER((path), (path)->path_length))
-                               /* you know, to the person who didn't
-                                  write this the macro name does not
-                                  at first suggest what it does.
-                                  Maybe POSITION_FROM_PATH_END? Or
-                                  maybe we should just focus on
-                                  dumping paths... -Hans */
--#define PATH_LAST_POSITION(p_s_path) (PATH_OFFSET_POSITION((p_s_path), (p_s_path)->path_length))
-+#define PATH_LAST_POSITION(path) (PATH_OFFSET_POSITION((path), (path)->path_length))
--#define PATH_PITEM_HEAD(p_s_path)    B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_path),PATH_LAST_POSITION(p_s_path))
-+#define PATH_PITEM_HEAD(path)    B_N_PITEM_HEAD(PATH_PLAST_BUFFER(path), PATH_LAST_POSITION(path))
- /* in do_balance leaf has h == 0 in contrast with path structure,
-    where root has level == 0. That is why we need these defines */
--#define PATH_H_PBUFFER(p_s_path, h) PATH_OFFSET_PBUFFER (p_s_path, p_s_path->path_length - (h))       /* tb->S[h] */
-+#define PATH_H_PBUFFER(path, h) PATH_OFFSET_PBUFFER (path, path->path_length - (h))   /* tb->S[h] */
- #define PATH_H_PPARENT(path, h) PATH_H_PBUFFER (path, (h) + 1)        /* tb->F[h] or tb->S[0]->b_parent */
- #define PATH_H_POSITION(path, h) PATH_OFFSET_POSITION (path, path->path_length - (h))
- #define PATH_H_B_ITEM_ORDER(path, h) PATH_H_POSITION(path, h + 1)     /* tb->S[h]->b_item_order */
--#define PATH_H_PATH_OFFSET(p_s_path, n_h) ((p_s_path)->path_length - (n_h))
-+#define PATH_H_PATH_OFFSET(path, n_h) ((path)->path_length - (n_h))
- #define get_last_bh(path) PATH_PLAST_BUFFER(path)
- #define get_ih(path) PATH_PITEM_HEAD(path)
-@@ -1512,7 +1512,7 @@ extern struct item_operations *item_ops[
- #define COMP_SHORT_KEYS comp_short_keys
- /* number of blocks pointed to by the indirect item */
--#define I_UNFM_NUM(p_s_ih)    ( ih_item_len(p_s_ih) / UNFM_P_SIZE )
-+#define I_UNFM_NUM(ih)        (ih_item_len(ih) / UNFM_P_SIZE)
- /* the used space within the unformatted node corresponding to pos within the item pointed to by ih */
- #define I_POS_UNFM_SIZE(ih,pos,size) (((pos) == I_UNFM_NUM(ih) - 1 ) ? (size) - ih_free_space(ih) : (size))
-@@ -1793,8 +1793,8 @@ int reiserfs_convert_objectid_map_v1(str
- /* stree.c */
- int B_IS_IN_TREE(const struct buffer_head *);
--extern void copy_item_head(struct item_head *p_v_to,
--                         const struct item_head *p_v_from);
-+extern void copy_item_head(struct item_head *to,
-+                         const struct item_head *from);
- // first key is in cpu form, second - le
- extern int comp_short_keys(const struct reiserfs_key *le_key,
-@@ -1829,20 +1829,20 @@ static inline void copy_key(struct reise
-       memcpy(to, from, KEY_SIZE);
- }
--int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path);
--const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
-+int comp_items(const struct item_head *stored_ih, const struct treepath *path);
-+const struct reiserfs_key *get_rkey(const struct treepath *chk_path,
-                                   const struct super_block *sb);
- int search_by_key(struct super_block *, const struct cpu_key *,
-                 struct treepath *, int);
- #define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL)
- int search_for_position_by_key(struct super_block *sb,
--                             const struct cpu_key *p_s_cpu_key,
--                             struct treepath *p_s_search_path);
-+                             const struct cpu_key *cpu_key,
-+                             struct treepath *search_path);
- extern void decrement_bcount(struct buffer_head *bh);
--void decrement_counters_in_path(struct treepath *p_s_search_path);
--void pathrelse(struct treepath *p_s_search_path);
-+void decrement_counters_in_path(struct treepath *search_path);
-+void pathrelse(struct treepath *search_path);
- int reiserfs_check_path(struct treepath *p);
--void pathrelse_and_restore(struct super_block *s, struct treepath *p_s_search_path);
-+void pathrelse_and_restore(struct super_block *s, struct treepath *search_path);
- int reiserfs_insert_item(struct reiserfs_transaction_handle *th,
-                        struct treepath *path,
-@@ -1865,7 +1865,7 @@ int reiserfs_cut_from_item(struct reiser
- int reiserfs_delete_item(struct reiserfs_transaction_handle *th,
-                        struct treepath *path,
-                        const struct cpu_key *key,
--                       struct inode *inode, struct buffer_head *p_s_un_bh);
-+                       struct inode *inode, struct buffer_head *un_bh);
- void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
-                               struct inode *inode, struct reiserfs_key *key);
-@@ -2005,7 +2005,7 @@ extern const struct address_space_operat
- /* fix_nodes.c */
- int fix_nodes(int n_op_mode, struct tree_balance *tb,
--            struct item_head *p_s_ins_ih, const void *);
-+            struct item_head *ins_ih, const void *);
- void unfix_nodes(struct tree_balance *);
- /* prints.c */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_bh.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_bh.diff
deleted file mode 100644 (file)
index be108d6..0000000
+++ /dev/null
@@ -1,489 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename p_s_bh to bh
-
- This patch is a simple s/p_s_bh/bh/g to the reiserfs code. This is the second
- in a series of patches to rip out some of the awful variable naming in
- reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/fix_node.c      |   94 ++++++++++++++++++++------------------------
- fs/reiserfs/stree.c         |   63 ++++++++++++++---------------
- include/linux/reiserfs_fs.h |   37 ++++++++---------
- 3 files changed, 94 insertions(+), 100 deletions(-)
-
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -1887,7 +1887,7 @@ static int check_balance(int mode,
- /* Check whether parent at the path is the really parent of the current node.*/
- static int get_direct_parent(struct tree_balance *p_s_tb, int n_h)
- {
--      struct buffer_head *p_s_bh;
-+      struct buffer_head *bh;
-       struct treepath *p_s_path = p_s_tb->tb_path;
-       int n_position,
-           n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h);
-@@ -1909,21 +1909,21 @@ static int get_direct_parent(struct tree
-       }
-       if (!B_IS_IN_TREE
--          (p_s_bh = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1)))
-+          (bh = PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1)))
-               return REPEAT_SEARCH;   /* Parent in the path is not in the tree. */
-       if ((n_position =
-            PATH_OFFSET_POSITION(p_s_path,
--                                n_path_offset - 1)) > B_NR_ITEMS(p_s_bh))
-+                                n_path_offset - 1)) > B_NR_ITEMS(bh))
-               return REPEAT_SEARCH;
--      if (B_N_CHILD_NUM(p_s_bh, n_position) !=
-+      if (B_N_CHILD_NUM(bh, n_position) !=
-           PATH_OFFSET_PBUFFER(p_s_path, n_path_offset)->b_blocknr)
-               /* Parent in the path is not parent of the current node in the tree. */
-               return REPEAT_SEARCH;
--      if (buffer_locked(p_s_bh)) {
--              __wait_on_buffer(p_s_bh);
-+      if (buffer_locked(bh)) {
-+              __wait_on_buffer(bh);
-               if (FILESYSTEM_CHANGED_TB(p_s_tb))
-                       return REPEAT_SEARCH;
-       }
-@@ -1943,29 +1943,29 @@ static int get_neighbors(struct tree_bal
-           n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h + 1);
-       unsigned long n_son_number;
-       struct super_block *sb = p_s_tb->tb_sb;
--      struct buffer_head *p_s_bh;
-+      struct buffer_head *bh;
-       PROC_INFO_INC(sb, get_neighbors[n_h]);
-       if (p_s_tb->lnum[n_h]) {
-               /* We need left neighbor to balance S[n_h]. */
-               PROC_INFO_INC(sb, need_l_neighbor[n_h]);
--              p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-+              bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
--              RFALSE(p_s_bh == p_s_tb->FL[n_h] &&
-+              RFALSE(bh == p_s_tb->FL[n_h] &&
-                      !PATH_OFFSET_POSITION(p_s_tb->tb_path, n_path_offset),
-                      "PAP-8270: invalid position in the parent");
-               n_child_position =
--                  (p_s_bh ==
-+                  (bh ==
-                    p_s_tb->FL[n_h]) ? p_s_tb->lkey[n_h] : B_NR_ITEMS(p_s_tb->
-                                                                      FL[n_h]);
-               n_son_number = B_N_CHILD_NUM(p_s_tb->FL[n_h], n_child_position);
--              p_s_bh = sb_bread(sb, n_son_number);
--              if (!p_s_bh)
-+              bh = sb_bread(sb, n_son_number);
-+              if (!bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--                      brelse(p_s_bh);
-+                      brelse(bh);
-                       PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
-@@ -1973,48 +1973,48 @@ static int get_neighbors(struct tree_bal
-               RFALSE(!B_IS_IN_TREE(p_s_tb->FL[n_h]) ||
-                      n_child_position > B_NR_ITEMS(p_s_tb->FL[n_h]) ||
-                      B_N_CHILD_NUM(p_s_tb->FL[n_h], n_child_position) !=
--                     p_s_bh->b_blocknr, "PAP-8275: invalid parent");
--              RFALSE(!B_IS_IN_TREE(p_s_bh), "PAP-8280: invalid child");
-+                     bh->b_blocknr, "PAP-8275: invalid parent");
-+              RFALSE(!B_IS_IN_TREE(bh), "PAP-8280: invalid child");
-               RFALSE(!n_h &&
--                     B_FREE_SPACE(p_s_bh) !=
--                     MAX_CHILD_SIZE(p_s_bh) -
-+                     B_FREE_SPACE(bh) !=
-+                     MAX_CHILD_SIZE(bh) -
-                      dc_size(B_N_CHILD(p_s_tb->FL[0], n_child_position)),
-                      "PAP-8290: invalid child size of left neighbor");
-               brelse(p_s_tb->L[n_h]);
--              p_s_tb->L[n_h] = p_s_bh;
-+              p_s_tb->L[n_h] = bh;
-       }
-       if (p_s_tb->rnum[n_h]) {        /* We need right neighbor to balance S[n_path_offset]. */
-               PROC_INFO_INC(sb, need_r_neighbor[n_h]);
--              p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-+              bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
--              RFALSE(p_s_bh == p_s_tb->FR[n_h] &&
-+              RFALSE(bh == p_s_tb->FR[n_h] &&
-                      PATH_OFFSET_POSITION(p_s_tb->tb_path,
-                                           n_path_offset) >=
--                     B_NR_ITEMS(p_s_bh),
-+                     B_NR_ITEMS(bh),
-                      "PAP-8295: invalid position in the parent");
-               n_child_position =
--                  (p_s_bh == p_s_tb->FR[n_h]) ? p_s_tb->rkey[n_h] + 1 : 0;
-+                  (bh == p_s_tb->FR[n_h]) ? p_s_tb->rkey[n_h] + 1 : 0;
-               n_son_number = B_N_CHILD_NUM(p_s_tb->FR[n_h], n_child_position);
--              p_s_bh = sb_bread(sb, n_son_number);
--              if (!p_s_bh)
-+              bh = sb_bread(sb, n_son_number);
-+              if (!bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
--                      brelse(p_s_bh);
-+                      brelse(bh);
-                       PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
-               brelse(p_s_tb->R[n_h]);
--              p_s_tb->R[n_h] = p_s_bh;
-+              p_s_tb->R[n_h] = bh;
-               RFALSE(!n_h
--                     && B_FREE_SPACE(p_s_bh) !=
--                     MAX_CHILD_SIZE(p_s_bh) -
-+                     && B_FREE_SPACE(bh) !=
-+                     MAX_CHILD_SIZE(bh) -
-                      dc_size(B_N_CHILD(p_s_tb->FR[0], n_child_position)),
-                      "PAP-8300: invalid child size of right neighbor (%d != %d - %d)",
--                     B_FREE_SPACE(p_s_bh), MAX_CHILD_SIZE(p_s_bh),
-+                     B_FREE_SPACE(bh), MAX_CHILD_SIZE(bh),
-                      dc_size(B_N_CHILD(p_s_tb->FR[0], n_child_position)));
-       }
-@@ -2090,51 +2090,45 @@ static int get_mem_for_virtual_node(stru
- #ifdef CONFIG_REISERFS_CHECK
- static void tb_buffer_sanity_check(struct super_block *sb,
--                                 struct buffer_head *p_s_bh,
-+                                 struct buffer_head *bh,
-                                  const char *descr, int level)
- {
--      if (p_s_bh) {
--              if (atomic_read(&(p_s_bh->b_count)) <= 0) {
-+      if (bh) {
-+              if (atomic_read(&(bh->b_count)) <= 0)
-                       reiserfs_panic(sb, "jmacd-1", "negative or zero "
-                                      "reference counter for buffer %s[%d] "
--                                     "(%b)", descr, level, p_s_bh);
--              }
-+                                     "(%b)", descr, level, bh);
--              if (!buffer_uptodate(p_s_bh)) {
-+              if (!buffer_uptodate(bh))
-                       reiserfs_panic(sb, "jmacd-2", "buffer is not up "
-                                      "to date %s[%d] (%b)",
--                                     descr, level, p_s_bh);
--              }
-+                                     descr, level, bh);
--              if (!B_IS_IN_TREE(p_s_bh)) {
-+              if (!B_IS_IN_TREE(bh))
-                       reiserfs_panic(sb, "jmacd-3", "buffer is not "
-                                      "in tree %s[%d] (%b)",
--                                     descr, level, p_s_bh);
--              }
-+                                     descr, level, bh);
--              if (p_s_bh->b_bdev != sb->s_bdev) {
-+              if (bh->b_bdev != sb->s_bdev)
-                       reiserfs_panic(sb, "jmacd-4", "buffer has wrong "
-                                      "device %s[%d] (%b)",
--                                     descr, level, p_s_bh);
--              }
-+                                     descr, level, bh);
--              if (p_s_bh->b_size != sb->s_blocksize) {
-+              if (bh->b_size != sb->s_blocksize)
-                       reiserfs_panic(sb, "jmacd-5", "buffer has wrong "
-                                      "blocksize %s[%d] (%b)",
--                                     descr, level, p_s_bh);
--              }
-+                                     descr, level, bh);
--              if (p_s_bh->b_blocknr > SB_BLOCK_COUNT(sb)) {
-+              if (bh->b_blocknr > SB_BLOCK_COUNT(sb))
-                       reiserfs_panic(sb, "jmacd-6", "buffer block "
-                                      "number too high %s[%d] (%b)",
--                                     descr, level, p_s_bh);
--              }
-+                                     descr, level, bh);
-       }
- }
- #else
- static void tb_buffer_sanity_check(struct super_block *sb,
--                                 struct buffer_head *p_s_bh,
-+                                 struct buffer_head *bh,
-                                  const char *descr, int level)
- {;
- }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -56,13 +56,13 @@
- #include <linux/quotaops.h>
- /* Does the buffer contain a disk block which is in the tree. */
--inline int B_IS_IN_TREE(const struct buffer_head *p_s_bh)
-+inline int B_IS_IN_TREE(const struct buffer_head *bh)
- {
--      RFALSE(B_LEVEL(p_s_bh) > MAX_HEIGHT,
--             "PAP-1010: block (%b) has too big level (%z)", p_s_bh, p_s_bh);
-+      RFALSE(B_LEVEL(bh) > MAX_HEIGHT,
-+             "PAP-1010: block (%b) has too big level (%z)", bh, bh);
--      return (B_LEVEL(p_s_bh) != FREE_LEVEL);
-+      return (B_LEVEL(bh) != FREE_LEVEL);
- }
- //
-@@ -579,7 +579,7 @@ int search_by_key(struct super_block *sb
- {
-       b_blocknr_t n_block_number;
-       int expected_level;
--      struct buffer_head *p_s_bh;
-+      struct buffer_head *bh;
-       struct path_element *p_s_last_element;
-       int n_node_level, n_retval;
-       int right_neighbor_of_leaf_node;
-@@ -626,15 +626,14 @@ int search_by_key(struct super_block *sb
-               /* Read the next tree node, and set the last element in the path to
-                  have a pointer to it. */
--              if ((p_s_bh = p_s_last_element->pe_buffer =
-+              if ((bh = p_s_last_element->pe_buffer =
-                    sb_getblk(sb, n_block_number))) {
--                      if (!buffer_uptodate(p_s_bh) && reada_count > 1) {
-+                      if (!buffer_uptodate(bh) && reada_count > 1)
-                               search_by_key_reada(sb, reada_bh,
-                                                   reada_blocks, reada_count);
--                      }
--                      ll_rw_block(READ, 1, &p_s_bh);
--                      wait_on_buffer(p_s_bh);
--                      if (!buffer_uptodate(p_s_bh))
-+                      ll_rw_block(READ, 1, &bh);
-+                      wait_on_buffer(bh);
-+                      if (!buffer_uptodate(bh))
-                               goto io_error;
-               } else {
-                     io_error:
-@@ -651,8 +650,8 @@ int search_by_key(struct super_block *sb
-                  to search is still in the tree rooted from the current buffer. If
-                  not then repeat search from the root. */
-               if (fs_changed(fs_gen, sb) &&
--                  (!B_IS_IN_TREE(p_s_bh) ||
--                   B_LEVEL(p_s_bh) != expected_level ||
-+                  (!B_IS_IN_TREE(bh) ||
-+                   B_LEVEL(bh) != expected_level ||
-                    !key_in_buffer(p_s_search_path, p_s_key, sb))) {
-                       PROC_INFO_INC(sb, search_by_key_fs_changed);
-                       PROC_INFO_INC(sb, search_by_key_restarted);
-@@ -686,25 +685,25 @@ int search_by_key(struct super_block *sb
-               // make sure, that the node contents look like a node of
-               // certain level
--              if (!is_tree_node(p_s_bh, expected_level)) {
-+              if (!is_tree_node(bh, expected_level)) {
-                       reiserfs_error(sb, "vs-5150",
-                                      "invalid format found in block %ld. "
--                                     "Fsck?", p_s_bh->b_blocknr);
-+                                     "Fsck?", bh->b_blocknr);
-                       pathrelse(p_s_search_path);
-                       return IO_ERROR;
-               }
-               /* ok, we have acquired next formatted node in the tree */
--              n_node_level = B_LEVEL(p_s_bh);
-+              n_node_level = B_LEVEL(bh);
--              PROC_INFO_BH_STAT(sb, p_s_bh, n_node_level - 1);
-+              PROC_INFO_BH_STAT(sb, bh, n_node_level - 1);
-               RFALSE(n_node_level < n_stop_level,
-                      "vs-5152: tree level (%d) is less than stop level (%d)",
-                      n_node_level, n_stop_level);
--              n_retval = bin_search(p_s_key, B_N_PITEM_HEAD(p_s_bh, 0),
--                                    B_NR_ITEMS(p_s_bh),
-+              n_retval = bin_search(p_s_key, B_N_PITEM_HEAD(bh, 0),
-+                                    B_NR_ITEMS(bh),
-                                     (n_node_level ==
-                                      DISK_LEAF_NODE_LEVEL) ? IH_SIZE :
-                                     KEY_SIZE,
-@@ -726,13 +725,13 @@ int search_by_key(struct super_block *sb
-                  an internal node.  Now we calculate child block number by
-                  position in the node. */
-               n_block_number =
--                  B_N_CHILD_NUM(p_s_bh, p_s_last_element->pe_position);
-+                  B_N_CHILD_NUM(bh, p_s_last_element->pe_position);
-               /* if we are going to read leaf nodes, try for read ahead as well */
-               if ((p_s_search_path->reada & PATH_READA) &&
-                   n_node_level == DISK_LEAF_NODE_LEVEL + 1) {
-                       int pos = p_s_last_element->pe_position;
--                      int limit = B_NR_ITEMS(p_s_bh);
-+                      int limit = B_NR_ITEMS(bh);
-                       struct reiserfs_key *le_key;
-                       if (p_s_search_path->reada & PATH_READA_BACK)
-@@ -741,7 +740,7 @@ int search_by_key(struct super_block *sb
-                               if (pos == limit)
-                                       break;
-                               reada_blocks[reada_count++] =
--                                  B_N_CHILD_NUM(p_s_bh, pos);
-+                                  B_N_CHILD_NUM(bh, pos);
-                               if (p_s_search_path->reada & PATH_READA_BACK)
-                                       pos--;
-                               else
-@@ -750,7 +749,7 @@ int search_by_key(struct super_block *sb
-                               /*
-                                * check to make sure we're in the same object
-                                */
--                              le_key = B_N_PDELIM_KEY(p_s_bh, pos);
-+                              le_key = B_N_PDELIM_KEY(bh, pos);
-                               if (le32_to_cpu(le_key->k_objectid) !=
-                                   p_s_key->on_disk_key.k_objectid) {
-                                       break;
-@@ -851,15 +850,15 @@ int search_for_position_by_key(struct su
- /* Compare given item and item pointed to by the path. */
- int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path)
- {
--      struct buffer_head *p_s_bh;
-+      struct buffer_head *bh = PATH_PLAST_BUFFER(p_s_path);
-       struct item_head *ih;
-       /* Last buffer at the path is not in the tree. */
--      if (!B_IS_IN_TREE(p_s_bh = PATH_PLAST_BUFFER(p_s_path)))
-+      if (!B_IS_IN_TREE(bh))
-               return 1;
-       /* Last path position is invalid. */
--      if (PATH_LAST_POSITION(p_s_path) >= B_NR_ITEMS(p_s_bh))
-+      if (PATH_LAST_POSITION(p_s_path) >= B_NR_ITEMS(bh))
-               return 1;
-       /* we need only to know, whether it is the same item */
-@@ -959,7 +958,7 @@ static char prepare_for_delete_or_cut(st
- {
-       struct super_block *sb = inode->i_sb;
-       struct item_head *p_le_ih = PATH_PITEM_HEAD(p_s_path);
--      struct buffer_head *p_s_bh = PATH_PLAST_BUFFER(p_s_path);
-+      struct buffer_head *bh = PATH_PLAST_BUFFER(p_s_path);
-       BUG_ON(!th->t_trans_id);
-@@ -1003,7 +1002,7 @@ static char prepare_for_delete_or_cut(st
-           do {
-               need_re_search = 0;
-               *p_n_cut_size = 0;
--              p_s_bh = PATH_PLAST_BUFFER(p_s_path);
-+              bh = PATH_PLAST_BUFFER(p_s_path);
-               copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-               pos = I_UNFM_NUM(&s_ih);
-@@ -1019,13 +1018,13 @@ static char prepare_for_delete_or_cut(st
-                       break;
-                   }
--                  unfm = (__le32 *)B_I_PITEM(p_s_bh, &s_ih) + pos - 1;
-+                  unfm = (__le32 *)B_I_PITEM(bh, &s_ih) + pos - 1;
-                   block = get_block_num(unfm, 0);
-                   if (block != 0) {
--                      reiserfs_prepare_for_journal(sb, p_s_bh, 1);
-+                      reiserfs_prepare_for_journal(sb, bh, 1);
-                       put_block_num(unfm, 0, 0);
--                      journal_mark_dirty (th, sb, p_s_bh);
-+                      journal_mark_dirty(th, sb, bh);
-                       reiserfs_free_block(th, inode, block, 1);
-                   }
-@@ -1049,7 +1048,7 @@ static char prepare_for_delete_or_cut(st
-               /* a trick.  If the buffer has been logged, this will do nothing.  If
-               ** we've broken the loop without logging it, it will restore the
-               ** buffer */
--              reiserfs_restore_prepared_buffer(sb, p_s_bh);
-+              reiserfs_restore_prepared_buffer(sb, bh);
-           } while (need_re_search &&
-                    search_for_position_by_key(sb, p_s_item_key, p_s_path) == POSITION_FOUND);
-           pos_in_item(p_s_path) = pos * UNFM_P_SIZE;
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -751,25 +751,25 @@ struct block_head {
- #define DISK_LEAF_NODE_LEVEL  1       /* Leaf node level. */
- /* Given the buffer head of a formatted node, resolve to the block head of that node. */
--#define B_BLK_HEAD(p_s_bh)            ((struct block_head *)((p_s_bh)->b_data))
-+#define B_BLK_HEAD(bh)                        ((struct block_head *)((bh)->b_data))
- /* Number of items that are in buffer. */
--#define B_NR_ITEMS(p_s_bh)            (blkh_nr_item(B_BLK_HEAD(p_s_bh)))
--#define B_LEVEL(p_s_bh)               (blkh_level(B_BLK_HEAD(p_s_bh)))
--#define B_FREE_SPACE(p_s_bh)          (blkh_free_space(B_BLK_HEAD(p_s_bh)))
--
--#define PUT_B_NR_ITEMS(p_s_bh,val)    do { set_blkh_nr_item(B_BLK_HEAD(p_s_bh),val); } while (0)
--#define PUT_B_LEVEL(p_s_bh,val)       do { set_blkh_level(B_BLK_HEAD(p_s_bh),val); } while (0)
--#define PUT_B_FREE_SPACE(p_s_bh,val)  do { set_blkh_free_space(B_BLK_HEAD(p_s_bh),val); } while (0)
-+#define B_NR_ITEMS(bh)                        (blkh_nr_item(B_BLK_HEAD(bh)))
-+#define B_LEVEL(bh)                   (blkh_level(B_BLK_HEAD(bh)))
-+#define B_FREE_SPACE(bh)              (blkh_free_space(B_BLK_HEAD(bh)))
-+
-+#define PUT_B_NR_ITEMS(bh, val)               do { set_blkh_nr_item(B_BLK_HEAD(bh), val); } while (0)
-+#define PUT_B_LEVEL(bh, val)          do { set_blkh_level(B_BLK_HEAD(bh), val); } while (0)
-+#define PUT_B_FREE_SPACE(bh, val)     do { set_blkh_free_space(B_BLK_HEAD(bh), val); } while (0)
- /* Get right delimiting key. -- little endian */
--#define B_PRIGHT_DELIM_KEY(p_s_bh)   (&(blk_right_delim_key(B_BLK_HEAD(p_s_bh))))
-+#define B_PRIGHT_DELIM_KEY(bh)                (&(blk_right_delim_key(B_BLK_HEAD(bh))))
- /* Does the buffer contain a disk leaf. */
--#define B_IS_ITEMS_LEVEL(p_s_bh)     (B_LEVEL(p_s_bh) == DISK_LEAF_NODE_LEVEL)
-+#define B_IS_ITEMS_LEVEL(bh)          (B_LEVEL(bh) == DISK_LEAF_NODE_LEVEL)
- /* Does the buffer contain a disk internal node */
--#define B_IS_KEYS_LEVEL(p_s_bh)      (B_LEVEL(p_s_bh) > DISK_LEAF_NODE_LEVEL \
--                                            && B_LEVEL(p_s_bh) <= MAX_HEIGHT)
-+#define B_IS_KEYS_LEVEL(bh)      (B_LEVEL(bh) > DISK_LEAF_NODE_LEVEL \
-+                                          && B_LEVEL(bh) <= MAX_HEIGHT)
- /***************************************************************************/
- /*                             STAT DATA                                   */
-@@ -1119,12 +1119,13 @@ struct disk_child {
- #define put_dc_size(dc_p, val)   do { (dc_p)->dc_size = cpu_to_le16(val); } while(0)
- /* Get disk child by buffer header and position in the tree node. */
--#define B_N_CHILD(p_s_bh,n_pos)  ((struct disk_child *)\
--((p_s_bh)->b_data+BLKH_SIZE+B_NR_ITEMS(p_s_bh)*KEY_SIZE+DC_SIZE*(n_pos)))
-+#define B_N_CHILD(bh, n_pos)  ((struct disk_child *)\
-+((bh)->b_data + BLKH_SIZE + B_NR_ITEMS(bh) * KEY_SIZE + DC_SIZE * (n_pos)))
- /* Get disk child number by buffer header and position in the tree node. */
--#define B_N_CHILD_NUM(p_s_bh,n_pos) (dc_block_number(B_N_CHILD(p_s_bh,n_pos)))
--#define PUT_B_N_CHILD_NUM(p_s_bh,n_pos, val) (put_dc_block_number(B_N_CHILD(p_s_bh,n_pos), val ))
-+#define B_N_CHILD_NUM(bh, n_pos) (dc_block_number(B_N_CHILD(bh, n_pos)))
-+#define PUT_B_N_CHILD_NUM(bh, n_pos, val) \
-+                              (put_dc_block_number(B_N_CHILD(bh, n_pos), val))
-  /* maximal value of field child_size in structure disk_child */
-  /* child size is the combined size of all items and their headers */
-@@ -1837,7 +1838,7 @@ int search_by_key(struct super_block *, 
- int search_for_position_by_key(struct super_block *sb,
-                              const struct cpu_key *p_s_cpu_key,
-                              struct treepath *p_s_search_path);
--extern void decrement_bcount(struct buffer_head *p_s_bh);
-+extern void decrement_bcount(struct buffer_head *bh);
- void decrement_counters_in_path(struct treepath *p_s_search_path);
- void pathrelse(struct treepath *p_s_search_path);
- int reiserfs_check_path(struct treepath *p);
-@@ -1978,7 +1979,7 @@ int reiserfs_global_version_in_proc(char
- #define PROC_INFO_MAX( sb, field, value ) VOID_V
- #define PROC_INFO_INC( sb, field ) VOID_V
- #define PROC_INFO_ADD( sb, field, val ) VOID_V
--#define PROC_INFO_BH_STAT(sb, p_s_bh, n_node_level) VOID_V
-+#define PROC_INFO_BH_STAT(sb, bh, n_node_level) VOID_V
- #endif
- /* dir.c */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_inode.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_inode.diff
deleted file mode 100644 (file)
index 437637d..0000000
+++ /dev/null
@@ -1,554 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename p_s_inode to inode
-
- This patch is a simple s/p_s_inode/inode/g to the reiserfs code. This is the
- third in a series of patches to rip out some of the awful variable naming in
- reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/file.c            |   16 +++---
- fs/reiserfs/inode.c           |   43 ++++++++---------
- fs/reiserfs/stree.c           |  103 +++++++++++++++++++++---------------------
- fs/reiserfs/tail_conversion.c |   18 ++++---
- include/linux/reiserfs_fs.h   |    4 -
- 5 files changed, 95 insertions(+), 89 deletions(-)
-
---- a/fs/reiserfs/file.c
-+++ b/fs/reiserfs/file.c
-@@ -137,17 +137,17 @@ static void reiserfs_vfs_truncate_file(s
- static int reiserfs_sync_file(struct file *p_s_filp,
-                             struct dentry *p_s_dentry, int datasync)
- {
--      struct inode *p_s_inode = p_s_dentry->d_inode;
-+      struct inode *inode = p_s_dentry->d_inode;
-       int n_err;
-       int barrier_done;
--      BUG_ON(!S_ISREG(p_s_inode->i_mode));
--      n_err = sync_mapping_buffers(p_s_inode->i_mapping);
--      reiserfs_write_lock(p_s_inode->i_sb);
--      barrier_done = reiserfs_commit_for_inode(p_s_inode);
--      reiserfs_write_unlock(p_s_inode->i_sb);
--      if (barrier_done != 1 && reiserfs_barrier_flush(p_s_inode->i_sb))
--              blkdev_issue_flush(p_s_inode->i_sb->s_bdev, NULL);
-+      BUG_ON(!S_ISREG(inode->i_mode));
-+      n_err = sync_mapping_buffers(inode->i_mapping);
-+      reiserfs_write_lock(inode->i_sb);
-+      barrier_done = reiserfs_commit_for_inode(inode);
-+      reiserfs_write_unlock(inode->i_sb);
-+      if (barrier_done != 1 && reiserfs_barrier_flush(inode->i_sb))
-+              blkdev_issue_flush(inode->i_sb->s_bdev, NULL);
-       if (barrier_done < 0)
-               return barrier_done;
-       return (n_err < 0) ? -EIO : 0;
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -1992,7 +1992,7 @@ int reiserfs_new_inode(struct reiserfs_t
- **
- ** on failure, nonzero is returned, page_result and bh_result are untouched.
- */
--static int grab_tail_page(struct inode *p_s_inode,
-+static int grab_tail_page(struct inode *inode,
-                         struct page **page_result,
-                         struct buffer_head **bh_result)
- {
-@@ -2000,11 +2000,11 @@ static int grab_tail_page(struct inode *
-       /* we want the page with the last byte in the file,
-        ** not the page that will hold the next byte for appending
-        */
--      unsigned long index = (p_s_inode->i_size - 1) >> PAGE_CACHE_SHIFT;
-+      unsigned long index = (inode->i_size - 1) >> PAGE_CACHE_SHIFT;
-       unsigned long pos = 0;
-       unsigned long start = 0;
--      unsigned long blocksize = p_s_inode->i_sb->s_blocksize;
--      unsigned long offset = (p_s_inode->i_size) & (PAGE_CACHE_SIZE - 1);
-+      unsigned long blocksize = inode->i_sb->s_blocksize;
-+      unsigned long offset = (inode->i_size) & (PAGE_CACHE_SIZE - 1);
-       struct buffer_head *bh;
-       struct buffer_head *head;
-       struct page *page;
-@@ -2018,7 +2018,7 @@ static int grab_tail_page(struct inode *
-       if ((offset & (blocksize - 1)) == 0) {
-               return -ENOENT;
-       }
--      page = grab_cache_page(p_s_inode->i_mapping, index);
-+      page = grab_cache_page(inode->i_mapping, index);
-       error = -ENOMEM;
-       if (!page) {
-               goto out;
-@@ -2047,7 +2047,7 @@ static int grab_tail_page(struct inode *
-                ** I've screwed up the code to find the buffer, or the code to
-                ** call prepare_write
-                */
--              reiserfs_error(p_s_inode->i_sb, "clm-6000",
-+              reiserfs_error(inode->i_sb, "clm-6000",
-                              "error reading block %lu", bh->b_blocknr);
-               error = -EIO;
-               goto unlock;
-@@ -2070,27 +2070,28 @@ static int grab_tail_page(struct inode *
- **
- ** some code taken from block_truncate_page
- */
--int reiserfs_truncate_file(struct inode *p_s_inode, int update_timestamps)
-+int reiserfs_truncate_file(struct inode *inode, int update_timestamps)
- {
-       struct reiserfs_transaction_handle th;
-       /* we want the offset for the first byte after the end of the file */
--      unsigned long offset = p_s_inode->i_size & (PAGE_CACHE_SIZE - 1);
--      unsigned blocksize = p_s_inode->i_sb->s_blocksize;
-+      unsigned long offset = inode->i_size & (PAGE_CACHE_SIZE - 1);
-+      unsigned blocksize = inode->i_sb->s_blocksize;
-       unsigned length;
-       struct page *page = NULL;
-       int error;
-       struct buffer_head *bh = NULL;
-       int err2;
--      reiserfs_write_lock(p_s_inode->i_sb);
-+      reiserfs_write_lock(inode->i_sb);
--      if (p_s_inode->i_size > 0) {
--              if ((error = grab_tail_page(p_s_inode, &page, &bh))) {
-+      if (inode->i_size > 0) {
-+              error = grab_tail_page(inode, &page, &bh);
-+              if (error) {
-                       // -ENOENT means we truncated past the end of the file,
-                       // and get_block_create_0 could not find a block to read in,
-                       // which is ok.
-                       if (error != -ENOENT)
--                              reiserfs_error(p_s_inode->i_sb, "clm-6001",
-+                              reiserfs_error(inode->i_sb, "clm-6001",
-                                              "grab_tail_page failed %d",
-                                              error);
-                       page = NULL;
-@@ -2108,19 +2109,19 @@ int reiserfs_truncate_file(struct inode 
-       /* it is enough to reserve space in transaction for 2 balancings:
-          one for "save" link adding and another for the first
-          cut_from_item. 1 is for update_sd */
--      error = journal_begin(&th, p_s_inode->i_sb,
-+      error = journal_begin(&th, inode->i_sb,
-                             JOURNAL_PER_BALANCE_CNT * 2 + 1);
-       if (error)
-               goto out;
--      reiserfs_update_inode_transaction(p_s_inode);
-+      reiserfs_update_inode_transaction(inode);
-       if (update_timestamps)
-               /* we are doing real truncate: if the system crashes before the last
-                  transaction of truncating gets committed - on reboot the file
-                  either appears truncated properly or not truncated at all */
--              add_save_link(&th, p_s_inode, 1);
--      err2 = reiserfs_do_truncate(&th, p_s_inode, page, update_timestamps);
-+              add_save_link(&th, inode, 1);
-+      err2 = reiserfs_do_truncate(&th, inode, page, update_timestamps);
-       error =
--          journal_end(&th, p_s_inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1);
-+          journal_end(&th, inode->i_sb, JOURNAL_PER_BALANCE_CNT * 2 + 1);
-       if (error)
-               goto out;
-@@ -2131,7 +2132,7 @@ int reiserfs_truncate_file(struct inode 
-       }
-       
-       if (update_timestamps) {
--              error = remove_save_link(p_s_inode, 1 /* truncate */ );
-+              error = remove_save_link(inode, 1 /* truncate */);
-               if (error)
-                       goto out;
-       }
-@@ -2150,14 +2151,14 @@ int reiserfs_truncate_file(struct inode 
-               page_cache_release(page);
-       }
--      reiserfs_write_unlock(p_s_inode->i_sb);
-+      reiserfs_write_unlock(inode->i_sb);
-       return 0;
-       out:
-       if (page) {
-               unlock_page(page);
-               page_cache_release(page);
-       }
--      reiserfs_write_unlock(p_s_inode->i_sb);
-+      reiserfs_write_unlock(inode->i_sb);
-       return error;
- }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -1143,10 +1143,11 @@ char head2type(struct item_head *ih)
- /* Delete object item. */
- int reiserfs_delete_item(struct reiserfs_transaction_handle *th, struct treepath *p_s_path,   /* Path to the deleted item. */
-                        const struct cpu_key *p_s_item_key,    /* Key to search for the deleted item.  */
--                       struct inode *p_s_inode,       /* inode is here just to update i_blocks and quotas */
-+                       struct inode *inode,   /* inode is here just to update
-+                                               * i_blocks and quotas */
-                        struct buffer_head *p_s_un_bh)
- {                             /* NULL or unformatted node pointer.    */
--      struct super_block *sb = p_s_inode->i_sb;
-+      struct super_block *sb = inode->i_sb;
-       struct tree_balance s_del_balance;
-       struct item_head s_ih;
-       struct item_head *q_ih;
-@@ -1170,10 +1171,10 @@ int reiserfs_delete_item(struct reiserfs
-               n_iter++;
-               c_mode =
- #endif
--                  prepare_for_delete_or_cut(th, p_s_inode, p_s_path,
-+                  prepare_for_delete_or_cut(th, inode, p_s_path,
-                                             p_s_item_key, &n_removed,
-                                             &n_del_size,
--                                            max_reiserfs_offset(p_s_inode));
-+                                            max_reiserfs_offset(inode));
-               RFALSE(c_mode != M_DELETE, "PAP-5320: mode must be M_DELETE");
-@@ -1214,7 +1215,7 @@ int reiserfs_delete_item(struct reiserfs
-        ** split into multiple items, and we only want to decrement for
-        ** the unfm node once
-        */
--      if (!S_ISLNK(p_s_inode->i_mode) && is_direct_le_ih(q_ih)) {
-+      if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(q_ih)) {
-               if ((le_ih_k_offset(q_ih) & (sb->s_blocksize - 1)) == 1) {
-                       quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
-               } else {
-@@ -1259,9 +1260,9 @@ int reiserfs_delete_item(struct reiserfs
- #ifdef REISERQUOTA_DEBUG
-       reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                      "reiserquota delete_item(): freeing %u, id=%u type=%c",
--                     quota_cut_bytes, p_s_inode->i_uid, head2type(&s_ih));
-+                     quota_cut_bytes, inode->i_uid, head2type(&s_ih));
- #endif
--      DQUOT_FREE_SPACE_NODIRTY(p_s_inode, quota_cut_bytes);
-+      DQUOT_FREE_SPACE_NODIRTY(inode, quota_cut_bytes);
-       /* Return deleted body length */
-       return n_ret_value;
-@@ -1423,25 +1424,25 @@ static void unmap_buffers(struct page *p
- }
- static int maybe_indirect_to_direct(struct reiserfs_transaction_handle *th,
--                                  struct inode *p_s_inode,
-+                                  struct inode *inode,
-                                   struct page *page,
-                                   struct treepath *p_s_path,
-                                   const struct cpu_key *p_s_item_key,
-                                   loff_t n_new_file_size, char *p_c_mode)
- {
--      struct super_block *sb = p_s_inode->i_sb;
-+      struct super_block *sb = inode->i_sb;
-       int n_block_size = sb->s_blocksize;
-       int cut_bytes;
-       BUG_ON(!th->t_trans_id);
--      BUG_ON(n_new_file_size != p_s_inode->i_size);
-+      BUG_ON(n_new_file_size != inode->i_size);
-       /* the page being sent in could be NULL if there was an i/o error
-        ** reading in the last block.  The user will hit problems trying to
-        ** read the file, but for now we just skip the indirect2direct
-        */
--      if (atomic_read(&p_s_inode->i_count) > 1 ||
--          !tail_has_to_be_packed(p_s_inode) ||
--          !page || (REISERFS_I(p_s_inode)->i_flags & i_nopack_mask)) {
-+      if (atomic_read(&inode->i_count) > 1 ||
-+          !tail_has_to_be_packed(inode) ||
-+          !page || (REISERFS_I(inode)->i_flags & i_nopack_mask)) {
-               /* leave tail in an unformatted node */
-               *p_c_mode = M_SKIP_BALANCING;
-               cut_bytes =
-@@ -1450,8 +1451,9 @@ static int maybe_indirect_to_direct(stru
-               return cut_bytes;
-       }
-       /* Permorm the conversion to a direct_item. */
--      /*return indirect_to_direct (p_s_inode, p_s_path, p_s_item_key, n_new_file_size, p_c_mode); */
--      return indirect2direct(th, p_s_inode, page, p_s_path, p_s_item_key,
-+      /* return indirect_to_direct(inode, p_s_path, p_s_item_key,
-+                                n_new_file_size, p_c_mode); */
-+      return indirect2direct(th, inode, page, p_s_path, p_s_item_key,
-                              n_new_file_size, p_c_mode);
- }
-@@ -1505,10 +1507,10 @@ static void indirect_to_direct_roll_back
- int reiserfs_cut_from_item(struct reiserfs_transaction_handle *th,
-                          struct treepath *p_s_path,
-                          struct cpu_key *p_s_item_key,
--                         struct inode *p_s_inode,
-+                         struct inode *inode,
-                          struct page *page, loff_t n_new_file_size)
- {
--      struct super_block *sb = p_s_inode->i_sb;
-+      struct super_block *sb = inode->i_sb;
-       /* Every function which is going to call do_balance must first
-          create a tree_balance structure.  Then it must fill up this
-          structure by using the init_tb_struct and fix_nodes functions.
-@@ -1525,7 +1527,7 @@ int reiserfs_cut_from_item(struct reiser
-       BUG_ON(!th->t_trans_id);
--      init_tb_struct(th, &s_cut_balance, p_s_inode->i_sb, p_s_path,
-+      init_tb_struct(th, &s_cut_balance, inode->i_sb, p_s_path,
-                      n_cut_size);
-       /* Repeat this loop until we either cut the item without needing
-@@ -1537,7 +1539,7 @@ int reiserfs_cut_from_item(struct reiser
-                  pointers. */
-               c_mode =
--                  prepare_for_delete_or_cut(th, p_s_inode, p_s_path,
-+                  prepare_for_delete_or_cut(th, inode, p_s_path,
-                                             p_s_item_key, &n_removed,
-                                             &n_cut_size, n_new_file_size);
-               if (c_mode == M_CONVERT) {
-@@ -1547,7 +1549,7 @@ int reiserfs_cut_from_item(struct reiser
-                              "PAP-5570: can not convert twice");
-                       n_ret_value =
--                          maybe_indirect_to_direct(th, p_s_inode, page,
-+                          maybe_indirect_to_direct(th, inode, page,
-                                                    p_s_path, p_s_item_key,
-                                                    n_new_file_size, &c_mode);
-                       if (c_mode == M_SKIP_BALANCING)
-@@ -1612,7 +1614,7 @@ int reiserfs_cut_from_item(struct reiser
-               if (n_is_inode_locked) {
-                       // FIXME: this seems to be not needed: we are always able
-                       // to cut item
--                      indirect_to_direct_roll_back(th, p_s_inode, p_s_path);
-+                      indirect_to_direct_roll_back(th, inode, p_s_path);
-               }
-               if (n_ret_value == NO_DISK_SPACE)
-                       reiserfs_warning(sb, "reiserfs-5092",
-@@ -1639,12 +1641,12 @@ int reiserfs_cut_from_item(struct reiser
-        ** item.
-        */
-       p_le_ih = PATH_PITEM_HEAD(s_cut_balance.tb_path);
--      if (!S_ISLNK(p_s_inode->i_mode) && is_direct_le_ih(p_le_ih)) {
-+      if (!S_ISLNK(inode->i_mode) && is_direct_le_ih(p_le_ih)) {
-               if (c_mode == M_DELETE &&
-                   (le_ih_k_offset(p_le_ih) & (sb->s_blocksize - 1)) ==
-                   1) {
-                       // FIXME: this is to keep 3.5 happy
--                      REISERFS_I(p_s_inode)->i_first_direct_byte = U32_MAX;
-+                      REISERFS_I(inode)->i_first_direct_byte = U32_MAX;
-                       quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
-               } else {
-                       quota_cut_bytes = 0;
-@@ -1687,14 +1689,14 @@ int reiserfs_cut_from_item(struct reiser
-                ** unmap and invalidate it
-                */
-               unmap_buffers(page, tail_pos);
--              REISERFS_I(p_s_inode)->i_flags &= ~i_pack_on_close_mask;
-+              REISERFS_I(inode)->i_flags &= ~i_pack_on_close_mask;
-       }
- #ifdef REISERQUOTA_DEBUG
--      reiserfs_debug(p_s_inode->i_sb, REISERFS_DEBUG_CODE,
-+      reiserfs_debug(inode->i_sb, REISERFS_DEBUG_CODE,
-                      "reiserquota cut_from_item(): freeing %u id=%u type=%c",
--                     quota_cut_bytes, p_s_inode->i_uid, '?');
-+                     quota_cut_bytes, inode->i_uid, '?');
- #endif
--      DQUOT_FREE_SPACE_NODIRTY(p_s_inode, quota_cut_bytes);
-+      DQUOT_FREE_SPACE_NODIRTY(inode, quota_cut_bytes);
-       return n_ret_value;
- }
-@@ -1715,8 +1717,8 @@ static void truncate_directory(struct re
- /* Truncate file to the new size. Note, this must be called with a transaction
-    already started */
--int reiserfs_do_truncate(struct reiserfs_transaction_handle *th, struct inode *p_s_inode,     /* ->i_size contains new
--                                                                                                 size */
-+int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
-+                        struct inode *inode,  /* ->i_size contains new size */
-                        struct page *page,     /* up to date for last block */
-                        int update_timestamps  /* when it is called by
-                                                  file_release to convert
-@@ -1735,35 +1737,35 @@ int reiserfs_do_truncate(struct reiserfs
-       BUG_ON(!th->t_trans_id);
-       if (!
--          (S_ISREG(p_s_inode->i_mode) || S_ISDIR(p_s_inode->i_mode)
--           || S_ISLNK(p_s_inode->i_mode)))
-+          (S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)
-+           || S_ISLNK(inode->i_mode)))
-               return 0;
--      if (S_ISDIR(p_s_inode->i_mode)) {
-+      if (S_ISDIR(inode->i_mode)) {
-               // deletion of directory - no need to update timestamps
--              truncate_directory(th, p_s_inode);
-+              truncate_directory(th, inode);
-               return 0;
-       }
-       /* Get new file size. */
--      n_new_file_size = p_s_inode->i_size;
-+      n_new_file_size = inode->i_size;
-       // FIXME: note, that key type is unimportant here
--      make_cpu_key(&s_item_key, p_s_inode, max_reiserfs_offset(p_s_inode),
-+      make_cpu_key(&s_item_key, inode, max_reiserfs_offset(inode),
-                    TYPE_DIRECT, 3);
-       retval =
--          search_for_position_by_key(p_s_inode->i_sb, &s_item_key,
-+          search_for_position_by_key(inode->i_sb, &s_item_key,
-                                      &s_search_path);
-       if (retval == IO_ERROR) {
--              reiserfs_error(p_s_inode->i_sb, "vs-5657",
-+              reiserfs_error(inode->i_sb, "vs-5657",
-                              "i/o failure occurred trying to truncate %K",
-                              &s_item_key);
-               err = -EIO;
-               goto out;
-       }
-       if (retval == POSITION_FOUND || retval == FILE_NOT_FOUND) {
--              reiserfs_error(p_s_inode->i_sb, "PAP-5660",
-+              reiserfs_error(inode->i_sb, "PAP-5660",
-                              "wrong result %d of search for %K", retval,
-                              &s_item_key);
-@@ -1780,7 +1782,7 @@ int reiserfs_do_truncate(struct reiserfs
-       else {
-               loff_t offset = le_ih_k_offset(p_le_ih);
-               int bytes =
--                  op_bytes_number(p_le_ih, p_s_inode->i_sb->s_blocksize);
-+                  op_bytes_number(p_le_ih, inode->i_sb->s_blocksize);
-               /* this may mismatch with real file size: if last direct item
-                  had no padding zeros and last unformatted node had no free
-@@ -1805,9 +1807,9 @@ int reiserfs_do_truncate(struct reiserfs
-               /* Cut or delete file item. */
-               n_deleted =
-                   reiserfs_cut_from_item(th, &s_search_path, &s_item_key,
--                                         p_s_inode, page, n_new_file_size);
-+                                         inode, page, n_new_file_size);
-               if (n_deleted < 0) {
--                      reiserfs_warning(p_s_inode->i_sb, "vs-5665",
-+                      reiserfs_warning(inode->i_sb, "vs-5665",
-                                        "reiserfs_cut_from_item failed");
-                       reiserfs_check_path(&s_search_path);
-                       return 0;
-@@ -1837,22 +1839,22 @@ int reiserfs_do_truncate(struct reiserfs
-                       pathrelse(&s_search_path);
-                       if (update_timestamps) {
--                              p_s_inode->i_mtime = p_s_inode->i_ctime =
--                                  CURRENT_TIME_SEC;
-+                              inode->i_mtime = CURRENT_TIME_SEC;
-+                              inode->i_ctime = CURRENT_TIME_SEC;
-                       }
--                      reiserfs_update_sd(th, p_s_inode);
-+                      reiserfs_update_sd(th, inode);
--                      err = journal_end(th, p_s_inode->i_sb, orig_len_alloc);
-+                      err = journal_end(th, inode->i_sb, orig_len_alloc);
-                       if (err)
-                               goto out;
--                      err = journal_begin(th, p_s_inode->i_sb,
-+                      err = journal_begin(th, inode->i_sb,
-                                           JOURNAL_FOR_FREE_BLOCK_AND_UPDATE_SD + JOURNAL_PER_BALANCE_CNT * 4) ;
-                       if (err)
-                               goto out;
--                      reiserfs_update_inode_transaction(p_s_inode);
-+                      reiserfs_update_inode_transaction(inode);
-               }
-       } while (n_file_size > ROUND_UP(n_new_file_size) &&
--               search_for_position_by_key(p_s_inode->i_sb, &s_item_key,
-+               search_for_position_by_key(inode->i_sb, &s_item_key,
-                                           &s_search_path) == POSITION_FOUND);
-       RFALSE(n_file_size > ROUND_UP(n_new_file_size),
-@@ -1862,9 +1864,10 @@ int reiserfs_do_truncate(struct reiserfs
-       update_and_out:
-       if (update_timestamps) {
-               // this is truncate, not file closing
--              p_s_inode->i_mtime = p_s_inode->i_ctime = CURRENT_TIME_SEC;
-+              inode->i_mtime = CURRENT_TIME_SEC;
-+              inode->i_ctime = CURRENT_TIME_SEC;
-       }
--      reiserfs_update_sd(th, p_s_inode);
-+      reiserfs_update_sd(th, inode);
-       out:
-       pathrelse(&s_search_path);
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -170,12 +170,14 @@ void reiserfs_unmap_buffer(struct buffer
-    what we expect from it (number of cut bytes). But when tail remains
-    in the unformatted node, we set mode to SKIP_BALANCING and unlock
-    inode */
--int indirect2direct(struct reiserfs_transaction_handle *th, struct inode *p_s_inode, struct page *page, struct treepath *p_s_path,    /* path to the indirect item. */
-+int indirect2direct(struct reiserfs_transaction_handle *th,
-+                  struct inode *inode, struct page *page,
-+                  struct treepath *p_s_path,  /* path to the indirect item. */
-                   const struct cpu_key *p_s_item_key, /* Key to look for unformatted node pointer to be cut. */
-                   loff_t n_new_file_size,     /* New file size. */
-                   char *p_c_mode)
- {
--      struct super_block *sb = p_s_inode->i_sb;
-+      struct super_block *sb = inode->i_sb;
-       struct item_head s_ih;
-       unsigned long n_block_size = sb->s_blocksize;
-       char *tail;
-@@ -193,7 +195,7 @@ int indirect2direct(struct reiserfs_tran
-       copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
-       tail_len = (n_new_file_size & (n_block_size - 1));
--      if (get_inode_sd_version(p_s_inode) == STAT_DATA_V2)
-+      if (get_inode_sd_version(inode) == STAT_DATA_V2)
-               round_tail_len = ROUND_UP(tail_len);
-       else
-               round_tail_len = tail_len;
-@@ -228,7 +230,7 @@ int indirect2direct(struct reiserfs_tran
-       }
-       /* Set direct item header to insert. */
--      make_le_item_head(&s_ih, NULL, get_inode_item_key_version(p_s_inode),
-+      make_le_item_head(&s_ih, NULL, get_inode_item_key_version(inode),
-                         pos1 + 1, TYPE_DIRECT, round_tail_len,
-                         0xffff /*ih_free_space */ );
-@@ -244,7 +246,7 @@ int indirect2direct(struct reiserfs_tran
-       set_cpu_key_k_type(&key, TYPE_DIRECT);
-       key.key_length = 4;
-       /* Insert tail as new direct item in the tree */
--      if (reiserfs_insert_item(th, p_s_path, &key, &s_ih, p_s_inode,
-+      if (reiserfs_insert_item(th, p_s_path, &key, &s_ih, inode,
-                                tail ? tail : NULL) < 0) {
-               /* No disk memory. So we can not convert last unformatted node
-                  to the direct item.  In this case we used to adjust
-@@ -258,7 +260,7 @@ int indirect2direct(struct reiserfs_tran
-       kunmap(page);
-       /* make sure to get the i_blocks changes from reiserfs_insert_item */
--      reiserfs_update_sd(th, p_s_inode);
-+      reiserfs_update_sd(th, inode);
-       // note: we have now the same as in above direct2indirect
-       // conversion: there are two keys which have matching first three
-@@ -269,8 +271,8 @@ int indirect2direct(struct reiserfs_tran
-       *p_c_mode = M_CUT;
-       /* we store position of first direct item in the in-core inode */
--      //mark_file_with_tail (p_s_inode, pos1 + 1);
--      REISERFS_I(p_s_inode)->i_first_direct_byte = pos1 + 1;
-+      /* mark_file_with_tail (inode, pos1 + 1); */
-+      REISERFS_I(inode)->i_first_direct_byte = pos1 + 1;
-       return n_block_size - round_tail_len;
- }
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1870,9 +1870,9 @@ int reiserfs_delete_item(struct reiserfs
- void reiserfs_delete_solid_item(struct reiserfs_transaction_handle *th,
-                               struct inode *inode, struct reiserfs_key *key);
- int reiserfs_delete_object(struct reiserfs_transaction_handle *th,
--                         struct inode *p_s_inode);
-+                         struct inode *inode);
- int reiserfs_do_truncate(struct reiserfs_transaction_handle *th,
--                       struct inode *p_s_inode, struct page *,
-+                       struct inode *inode, struct page *,
-                        int update_timestamps);
- #define i_block_size(inode) ((inode)->i_sb->s_blocksize)
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_sb.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_sb.diff
deleted file mode 100644 (file)
index 48ac35f..0000000
+++ /dev/null
@@ -1,2869 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename p_s_sb to sb
-
- This patch is a simple s/p_s_sb/sb/g to the reiserfs code. This is the first
- in a series of patches to rip out some of the awful variable naming in
- reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/fix_node.c        |   46 +-
- fs/reiserfs/fix_node.c        |   46 +-
- fs/reiserfs/journal.c         |  735 ++++++++++++++++++++----------------------
- fs/reiserfs/stree.c           |  126 +++----
- fs/reiserfs/tail_conversion.c |   16 
- include/linux/reiserfs_fs.h   |   14 
- 5 files changed, 468 insertions(+), 469 deletions(-)
-
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -785,7 +785,7 @@ static int get_empty_nodes(struct tree_b
-       b_blocknr_t *p_n_blocknr, a_n_blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
-       int n_counter, n_number_of_freeblk, n_amount_needed,    /* number of needed empty blocks */
-        n_retval = CARRY_ON;
--      struct super_block *p_s_sb = p_s_tb->tb_sb;
-+      struct super_block *sb = p_s_tb->tb_sb;
-       /* number_of_freeblk is the number of empty blocks which have been
-          acquired for use by the balancing algorithm minus the number of
-@@ -830,7 +830,7 @@ static int get_empty_nodes(struct tree_b
-               RFALSE(!*p_n_blocknr,
-                      "PAP-8135: reiserfs_new_blocknrs failed when got new blocks");
--              p_s_new_bh = sb_getblk(p_s_sb, *p_n_blocknr);
-+              p_s_new_bh = sb_getblk(sb, *p_n_blocknr);
-               RFALSE(buffer_dirty(p_s_new_bh) ||
-                      buffer_journaled(p_s_new_bh) ||
-                      buffer_journal_dirty(p_s_new_bh),
-@@ -899,7 +899,7 @@ static int get_rfree(struct tree_balance
- static int is_left_neighbor_in_cache(struct tree_balance *p_s_tb, int n_h)
- {
-       struct buffer_head *p_s_father, *left;
--      struct super_block *p_s_sb = p_s_tb->tb_sb;
-+      struct super_block *sb = p_s_tb->tb_sb;
-       b_blocknr_t n_left_neighbor_blocknr;
-       int n_left_neighbor_position;
-@@ -924,7 +924,7 @@ static int is_left_neighbor_in_cache(str
-       n_left_neighbor_blocknr =
-           B_N_CHILD_NUM(p_s_tb->FL[n_h], n_left_neighbor_position);
-       /* Look for the left neighbor in the cache. */
--      if ((left = sb_find_get_block(p_s_sb, n_left_neighbor_blocknr))) {
-+      if ((left = sb_find_get_block(sb, n_left_neighbor_blocknr))) {
-               RFALSE(buffer_uptodate(left) && !B_IS_IN_TREE(left),
-                      "vs-8170: left neighbor (%b %z) is not in the tree",
-@@ -1942,14 +1942,14 @@ static int get_neighbors(struct tree_bal
-       int n_child_position,
-           n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h + 1);
-       unsigned long n_son_number;
--      struct super_block *p_s_sb = p_s_tb->tb_sb;
-+      struct super_block *sb = p_s_tb->tb_sb;
-       struct buffer_head *p_s_bh;
--      PROC_INFO_INC(p_s_sb, get_neighbors[n_h]);
-+      PROC_INFO_INC(sb, get_neighbors[n_h]);
-       if (p_s_tb->lnum[n_h]) {
-               /* We need left neighbor to balance S[n_h]. */
--              PROC_INFO_INC(p_s_sb, need_l_neighbor[n_h]);
-+              PROC_INFO_INC(sb, need_l_neighbor[n_h]);
-               p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-               RFALSE(p_s_bh == p_s_tb->FL[n_h] &&
-@@ -1961,12 +1961,12 @@ static int get_neighbors(struct tree_bal
-                    p_s_tb->FL[n_h]) ? p_s_tb->lkey[n_h] : B_NR_ITEMS(p_s_tb->
-                                                                      FL[n_h]);
-               n_son_number = B_N_CHILD_NUM(p_s_tb->FL[n_h], n_child_position);
--              p_s_bh = sb_bread(p_s_sb, n_son_number);
-+              p_s_bh = sb_bread(sb, n_son_number);
-               if (!p_s_bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-                       brelse(p_s_bh);
--                      PROC_INFO_INC(p_s_sb, get_neighbors_restart[n_h]);
-+                      PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
-@@ -1986,7 +1986,7 @@ static int get_neighbors(struct tree_bal
-       }
-       if (p_s_tb->rnum[n_h]) {        /* We need right neighbor to balance S[n_path_offset]. */
--              PROC_INFO_INC(p_s_sb, need_r_neighbor[n_h]);
-+              PROC_INFO_INC(sb, need_r_neighbor[n_h]);
-               p_s_bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-               RFALSE(p_s_bh == p_s_tb->FR[n_h] &&
-@@ -1998,12 +1998,12 @@ static int get_neighbors(struct tree_bal
-               n_child_position =
-                   (p_s_bh == p_s_tb->FR[n_h]) ? p_s_tb->rkey[n_h] + 1 : 0;
-               n_son_number = B_N_CHILD_NUM(p_s_tb->FR[n_h], n_child_position);
--              p_s_bh = sb_bread(p_s_sb, n_son_number);
-+              p_s_bh = sb_bread(sb, n_son_number);
-               if (!p_s_bh)
-                       return IO_ERROR;
-               if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-                       brelse(p_s_bh);
--                      PROC_INFO_INC(p_s_sb, get_neighbors_restart[n_h]);
-+                      PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
-               brelse(p_s_tb->R[n_h]);
-@@ -2089,51 +2089,51 @@ static int get_mem_for_virtual_node(stru
- }
- #ifdef CONFIG_REISERFS_CHECK
--static void tb_buffer_sanity_check(struct super_block *p_s_sb,
-+static void tb_buffer_sanity_check(struct super_block *sb,
-                                  struct buffer_head *p_s_bh,
-                                  const char *descr, int level)
- {
-       if (p_s_bh) {
-               if (atomic_read(&(p_s_bh->b_count)) <= 0) {
--                      reiserfs_panic(p_s_sb, "jmacd-1", "negative or zero "
-+                      reiserfs_panic(sb, "jmacd-1", "negative or zero "
-                                      "reference counter for buffer %s[%d] "
-                                      "(%b)", descr, level, p_s_bh);
-               }
-               if (!buffer_uptodate(p_s_bh)) {
--                      reiserfs_panic(p_s_sb, "jmacd-2", "buffer is not up "
-+                      reiserfs_panic(sb, "jmacd-2", "buffer is not up "
-                                      "to date %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-               if (!B_IS_IN_TREE(p_s_bh)) {
--                      reiserfs_panic(p_s_sb, "jmacd-3", "buffer is not "
-+                      reiserfs_panic(sb, "jmacd-3", "buffer is not "
-                                      "in tree %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
--              if (p_s_bh->b_bdev != p_s_sb->s_bdev) {
--                      reiserfs_panic(p_s_sb, "jmacd-4", "buffer has wrong "
-+              if (p_s_bh->b_bdev != sb->s_bdev) {
-+                      reiserfs_panic(sb, "jmacd-4", "buffer has wrong "
-                                      "device %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
--              if (p_s_bh->b_size != p_s_sb->s_blocksize) {
--                      reiserfs_panic(p_s_sb, "jmacd-5", "buffer has wrong "
-+              if (p_s_bh->b_size != sb->s_blocksize) {
-+                      reiserfs_panic(sb, "jmacd-5", "buffer has wrong "
-                                      "blocksize %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
--              if (p_s_bh->b_blocknr > SB_BLOCK_COUNT(p_s_sb)) {
--                      reiserfs_panic(p_s_sb, "jmacd-6", "buffer block "
-+              if (p_s_bh->b_blocknr > SB_BLOCK_COUNT(sb)) {
-+                      reiserfs_panic(sb, "jmacd-6", "buffer block "
-                                      "number too high %s[%d] (%b)",
-                                      descr, level, p_s_bh);
-               }
-       }
- }
- #else
--static void tb_buffer_sanity_check(struct super_block *p_s_sb,
-+static void tb_buffer_sanity_check(struct super_block *sb,
-                                  struct buffer_head *p_s_bh,
-                                  const char *descr, int level)
- {;
---- a/fs/reiserfs/journal.c
-+++ b/fs/reiserfs/journal.c
-@@ -97,7 +97,7 @@ static int flush_commit_list(struct supe
-                            struct reiserfs_journal_list *jl, int flushall);
- static int can_dirty(struct reiserfs_journal_cnode *cn);
- static int journal_join(struct reiserfs_transaction_handle *th,
--                      struct super_block *p_s_sb, unsigned long nblocks);
-+                      struct super_block *sb, unsigned long nblocks);
- static int release_journal_dev(struct super_block *super,
-                              struct reiserfs_journal *journal);
- static int dirty_one_transaction(struct super_block *s,
-@@ -113,12 +113,12 @@ enum {
- };
- static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
--                            struct super_block *p_s_sb,
-+                            struct super_block *sb,
-                             unsigned long nblocks, int join);
--static void init_journal_hash(struct super_block *p_s_sb)
-+static void init_journal_hash(struct super_block *sb)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       memset(journal->j_hash_table, 0,
-              JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
- }
-@@ -145,7 +145,7 @@ static void disable_barrier(struct super
- }
- static struct reiserfs_bitmap_node *allocate_bitmap_node(struct super_block
--                                                       *p_s_sb)
-+                                                       *sb)
- {
-       struct reiserfs_bitmap_node *bn;
-       static int id;
-@@ -154,7 +154,7 @@ static struct reiserfs_bitmap_node *allo
-       if (!bn) {
-               return NULL;
-       }
--      bn->data = kzalloc(p_s_sb->s_blocksize, GFP_NOFS);
-+      bn->data = kzalloc(sb->s_blocksize, GFP_NOFS);
-       if (!bn->data) {
-               kfree(bn);
-               return NULL;
-@@ -164,9 +164,9 @@ static struct reiserfs_bitmap_node *allo
-       return bn;
- }
--static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *p_s_sb)
-+static struct reiserfs_bitmap_node *get_bitmap_node(struct super_block *sb)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_bitmap_node *bn = NULL;
-       struct list_head *entry = journal->j_bitmap_nodes.next;
-@@ -176,21 +176,21 @@ static struct reiserfs_bitmap_node *get_
-       if (entry != &journal->j_bitmap_nodes) {
-               bn = list_entry(entry, struct reiserfs_bitmap_node, list);
-               list_del(entry);
--              memset(bn->data, 0, p_s_sb->s_blocksize);
-+              memset(bn->data, 0, sb->s_blocksize);
-               journal->j_free_bitmap_nodes--;
-               return bn;
-       }
--      bn = allocate_bitmap_node(p_s_sb);
-+      bn = allocate_bitmap_node(sb);
-       if (!bn) {
-               yield();
-               goto repeat;
-       }
-       return bn;
- }
--static inline void free_bitmap_node(struct super_block *p_s_sb,
-+static inline void free_bitmap_node(struct super_block *sb,
-                                   struct reiserfs_bitmap_node *bn)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       journal->j_used_bitmap_nodes--;
-       if (journal->j_free_bitmap_nodes > REISERFS_MAX_BITMAP_NODES) {
-               kfree(bn->data);
-@@ -201,13 +201,13 @@ static inline void free_bitmap_node(stru
-       }
- }
--static void allocate_bitmap_nodes(struct super_block *p_s_sb)
-+static void allocate_bitmap_nodes(struct super_block *sb)
- {
-       int i;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_bitmap_node *bn = NULL;
-       for (i = 0; i < REISERFS_MIN_BITMAP_NODES; i++) {
--              bn = allocate_bitmap_node(p_s_sb);
-+              bn = allocate_bitmap_node(sb);
-               if (bn) {
-                       list_add(&bn->list, &journal->j_bitmap_nodes);
-                       journal->j_free_bitmap_nodes++;
-@@ -217,30 +217,30 @@ static void allocate_bitmap_nodes(struct
-       }
- }
--static int set_bit_in_list_bitmap(struct super_block *p_s_sb,
-+static int set_bit_in_list_bitmap(struct super_block *sb,
-                                 b_blocknr_t block,
-                                 struct reiserfs_list_bitmap *jb)
- {
--      unsigned int bmap_nr = block / (p_s_sb->s_blocksize << 3);
--      unsigned int bit_nr = block % (p_s_sb->s_blocksize << 3);
-+      unsigned int bmap_nr = block / (sb->s_blocksize << 3);
-+      unsigned int bit_nr = block % (sb->s_blocksize << 3);
-       if (!jb->bitmaps[bmap_nr]) {
--              jb->bitmaps[bmap_nr] = get_bitmap_node(p_s_sb);
-+              jb->bitmaps[bmap_nr] = get_bitmap_node(sb);
-       }
-       set_bit(bit_nr, (unsigned long *)jb->bitmaps[bmap_nr]->data);
-       return 0;
- }
--static void cleanup_bitmap_list(struct super_block *p_s_sb,
-+static void cleanup_bitmap_list(struct super_block *sb,
-                               struct reiserfs_list_bitmap *jb)
- {
-       int i;
-       if (jb->bitmaps == NULL)
-               return;
--      for (i = 0; i < reiserfs_bmap_count(p_s_sb); i++) {
-+      for (i = 0; i < reiserfs_bmap_count(sb); i++) {
-               if (jb->bitmaps[i]) {
--                      free_bitmap_node(p_s_sb, jb->bitmaps[i]);
-+                      free_bitmap_node(sb, jb->bitmaps[i]);
-                       jb->bitmaps[i] = NULL;
-               }
-       }
-@@ -249,7 +249,7 @@ static void cleanup_bitmap_list(struct s
- /*
- ** only call this on FS unmount.
- */
--static int free_list_bitmaps(struct super_block *p_s_sb,
-+static int free_list_bitmaps(struct super_block *sb,
-                            struct reiserfs_list_bitmap *jb_array)
- {
-       int i;
-@@ -257,16 +257,16 @@ static int free_list_bitmaps(struct supe
-       for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
-               jb = jb_array + i;
-               jb->journal_list = NULL;
--              cleanup_bitmap_list(p_s_sb, jb);
-+              cleanup_bitmap_list(sb, jb);
-               vfree(jb->bitmaps);
-               jb->bitmaps = NULL;
-       }
-       return 0;
- }
--static int free_bitmap_nodes(struct super_block *p_s_sb)
-+static int free_bitmap_nodes(struct super_block *sb)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct list_head *next = journal->j_bitmap_nodes.next;
-       struct reiserfs_bitmap_node *bn;
-@@ -286,7 +286,7 @@ static int free_bitmap_nodes(struct supe
- ** get memory for JOURNAL_NUM_BITMAPS worth of bitmaps.
- ** jb_array is the array to be filled in.
- */
--int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
-+int reiserfs_allocate_list_bitmaps(struct super_block *sb,
-                                  struct reiserfs_list_bitmap *jb_array,
-                                  unsigned int bmap_nr)
- {
-@@ -300,7 +300,7 @@ int reiserfs_allocate_list_bitmaps(struc
-               jb->journal_list = NULL;
-               jb->bitmaps = vmalloc(mem);
-               if (!jb->bitmaps) {
--                      reiserfs_warning(p_s_sb, "clm-2000", "unable to "
-+                      reiserfs_warning(sb, "clm-2000", "unable to "
-                                        "allocate bitmaps for journal lists");
-                       failed = 1;
-                       break;
-@@ -308,7 +308,7 @@ int reiserfs_allocate_list_bitmaps(struc
-               memset(jb->bitmaps, 0, mem);
-       }
-       if (failed) {
--              free_list_bitmaps(p_s_sb, jb_array);
-+              free_list_bitmaps(sb, jb_array);
-               return -1;
-       }
-       return 0;
-@@ -318,12 +318,12 @@ int reiserfs_allocate_list_bitmaps(struc
- ** find an available list bitmap.  If you can't find one, flush a commit list
- ** and try again
- */
--static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *p_s_sb,
-+static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *sb,
-                                                   struct reiserfs_journal_list
-                                                   *jl)
- {
-       int i, j;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_list_bitmap *jb = NULL;
-       for (j = 0; j < (JOURNAL_NUM_BITMAPS * 3); j++) {
-@@ -331,7 +331,7 @@ static struct reiserfs_list_bitmap *get_
-               journal->j_list_bitmap_index = (i + 1) % JOURNAL_NUM_BITMAPS;
-               jb = journal->j_list_bitmap + i;
-               if (journal->j_list_bitmap[i].journal_list) {
--                      flush_commit_list(p_s_sb,
-+                      flush_commit_list(sb,
-                                         journal->j_list_bitmap[i].
-                                         journal_list, 1);
-                       if (!journal->j_list_bitmap[i].journal_list) {
-@@ -378,12 +378,12 @@ static struct reiserfs_journal_cnode *al
- /*
- ** pulls a cnode off the free list, or returns NULL on failure
- */
--static struct reiserfs_journal_cnode *get_cnode(struct super_block *p_s_sb)
-+static struct reiserfs_journal_cnode *get_cnode(struct super_block *sb)
- {
-       struct reiserfs_journal_cnode *cn;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
--      reiserfs_check_lock_depth(p_s_sb, "get_cnode");
-+      reiserfs_check_lock_depth(sb, "get_cnode");
-       if (journal->j_cnode_free <= 0) {
-               return NULL;
-@@ -405,12 +405,12 @@ static struct reiserfs_journal_cnode *ge
- /*
- ** returns a cnode to the free list
- */
--static void free_cnode(struct super_block *p_s_sb,
-+static void free_cnode(struct super_block *sb,
-                      struct reiserfs_journal_cnode *cn)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
--      reiserfs_check_lock_depth(p_s_sb, "free_cnode");
-+      reiserfs_check_lock_depth(sb, "free_cnode");
-       journal->j_cnode_used--;
-       journal->j_cnode_free++;
-@@ -481,11 +481,11 @@ static inline struct reiserfs_journal_cn
- ** reject it on the next call to reiserfs_in_journal
- **
- */
--int reiserfs_in_journal(struct super_block *p_s_sb,
-+int reiserfs_in_journal(struct super_block *sb,
-                       unsigned int bmap_nr, int bit_nr, int search_all,
-                       b_blocknr_t * next_zero_bit)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_cnode *cn;
-       struct reiserfs_list_bitmap *jb;
-       int i;
-@@ -493,14 +493,14 @@ int reiserfs_in_journal(struct super_blo
-       *next_zero_bit = 0;     /* always start this at zero. */
--      PROC_INFO_INC(p_s_sb, journal.in_journal);
-+      PROC_INFO_INC(sb, journal.in_journal);
-       /* If we aren't doing a search_all, this is a metablock, and it will be logged before use.
-        ** if we crash before the transaction that freed it commits,  this transaction won't
-        ** have committed either, and the block will never be written
-        */
-       if (search_all) {
-               for (i = 0; i < JOURNAL_NUM_BITMAPS; i++) {
--                      PROC_INFO_INC(p_s_sb, journal.in_journal_bitmap);
-+                      PROC_INFO_INC(sb, journal.in_journal_bitmap);
-                       jb = journal->j_list_bitmap + i;
-                       if (jb->journal_list && jb->bitmaps[bmap_nr] &&
-                           test_bit(bit_nr,
-@@ -510,28 +510,28 @@ int reiserfs_in_journal(struct super_blo
-                                   find_next_zero_bit((unsigned long *)
-                                                      (jb->bitmaps[bmap_nr]->
-                                                       data),
--                                                     p_s_sb->s_blocksize << 3,
-+                                                     sb->s_blocksize << 3,
-                                                      bit_nr + 1);
-                               return 1;
-                       }
-               }
-       }
--      bl = bmap_nr * (p_s_sb->s_blocksize << 3) + bit_nr;
-+      bl = bmap_nr * (sb->s_blocksize << 3) + bit_nr;
-       /* is it in any old transactions? */
-       if (search_all
-           && (cn =
--              get_journal_hash_dev(p_s_sb, journal->j_list_hash_table, bl))) {
-+              get_journal_hash_dev(sb, journal->j_list_hash_table, bl))) {
-               return 1;
-       }
-       /* is it in the current transaction.  This should never happen */
--      if ((cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, bl))) {
-+      if ((cn = get_journal_hash_dev(sb, journal->j_hash_table, bl))) {
-               BUG();
-               return 1;
-       }
--      PROC_INFO_INC(p_s_sb, journal.in_journal_reusable);
-+      PROC_INFO_INC(sb, journal.in_journal_reusable);
-       /* safe for reuse */
-       return 0;
- }
-@@ -553,16 +553,16 @@ static inline void insert_journal_hash(s
- }
- /* lock the current transaction */
--static inline void lock_journal(struct super_block *p_s_sb)
-+static inline void lock_journal(struct super_block *sb)
- {
--      PROC_INFO_INC(p_s_sb, journal.lock_journal);
--      mutex_lock(&SB_JOURNAL(p_s_sb)->j_mutex);
-+      PROC_INFO_INC(sb, journal.lock_journal);
-+      mutex_lock(&SB_JOURNAL(sb)->j_mutex);
- }
- /* unlock the current transaction */
--static inline void unlock_journal(struct super_block *p_s_sb)
-+static inline void unlock_journal(struct super_block *sb)
- {
--      mutex_unlock(&SB_JOURNAL(p_s_sb)->j_mutex);
-+      mutex_unlock(&SB_JOURNAL(sb)->j_mutex);
- }
- static inline void get_journal_list(struct reiserfs_journal_list *jl)
-@@ -586,13 +586,13 @@ static inline void put_journal_list(stru
- ** it gets called by flush_commit_list, and cleans up any data stored about blocks freed during a
- ** transaction.
- */
--static void cleanup_freed_for_journal_list(struct super_block *p_s_sb,
-+static void cleanup_freed_for_journal_list(struct super_block *sb,
-                                          struct reiserfs_journal_list *jl)
- {
-       struct reiserfs_list_bitmap *jb = jl->j_list_bitmap;
-       if (jb) {
--              cleanup_bitmap_list(p_s_sb, jb);
-+              cleanup_bitmap_list(sb, jb);
-       }
-       jl->j_list_bitmap->journal_list = NULL;
-       jl->j_list_bitmap = NULL;
-@@ -1237,11 +1237,11 @@ static void remove_journal_hash(struct s
- ** journal list for this transaction.  Aside from freeing the cnode, this also allows the
- ** block to be reallocated for data blocks if it had been deleted.
- */
--static void remove_all_from_journal_list(struct super_block *p_s_sb,
-+static void remove_all_from_journal_list(struct super_block *sb,
-                                        struct reiserfs_journal_list *jl,
-                                        int debug)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_cnode *cn, *last;
-       cn = jl->j_realblock;
-@@ -1251,18 +1251,18 @@ static void remove_all_from_journal_list
-       while (cn) {
-               if (cn->blocknr != 0) {
-                       if (debug) {
--                              reiserfs_warning(p_s_sb, "reiserfs-2201",
-+                              reiserfs_warning(sb, "reiserfs-2201",
-                                                "block %u, bh is %d, state %ld",
-                                                cn->blocknr, cn->bh ? 1 : 0,
-                                                cn->state);
-                       }
-                       cn->state = 0;
--                      remove_journal_hash(p_s_sb, journal->j_list_hash_table,
-+                      remove_journal_hash(sb, journal->j_list_hash_table,
-                                           jl, cn->blocknr, 1);
-               }
-               last = cn;
-               cn = cn->next;
--              free_cnode(p_s_sb, last);
-+              free_cnode(sb, last);
-       }
-       jl->j_realblock = NULL;
- }
-@@ -1274,12 +1274,12 @@ static void remove_all_from_journal_list
- ** called by flush_journal_list, before it calls remove_all_from_journal_list
- **
- */
--static int _update_journal_header_block(struct super_block *p_s_sb,
-+static int _update_journal_header_block(struct super_block *sb,
-                                       unsigned long offset,
-                                       unsigned int trans_id)
- {
-       struct reiserfs_journal_header *jh;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       if (reiserfs_is_journal_aborted(journal))
-               return -EIO;
-@@ -1289,7 +1289,7 @@ static int _update_journal_header_block(
-                       wait_on_buffer((journal->j_header_bh));
-                       if (unlikely(!buffer_uptodate(journal->j_header_bh))) {
- #ifdef CONFIG_REISERFS_CHECK
--                              reiserfs_warning(p_s_sb, "journal-699",
-+                              reiserfs_warning(sb, "journal-699",
-                                                "buffer write failed");
- #endif
-                               return -EIO;
-@@ -1303,24 +1303,24 @@ static int _update_journal_header_block(
-               jh->j_first_unflushed_offset = cpu_to_le32(offset);
-               jh->j_mount_id = cpu_to_le32(journal->j_mount_id);
--              if (reiserfs_barrier_flush(p_s_sb)) {
-+              if (reiserfs_barrier_flush(sb)) {
-                       int ret;
-                       lock_buffer(journal->j_header_bh);
-                       ret = submit_barrier_buffer(journal->j_header_bh);
-                       if (ret == -EOPNOTSUPP) {
-                               set_buffer_uptodate(journal->j_header_bh);
--                              disable_barrier(p_s_sb);
-+                              disable_barrier(sb);
-                               goto sync;
-                       }
-                       wait_on_buffer(journal->j_header_bh);
--                      check_barrier_completion(p_s_sb, journal->j_header_bh);
-+                      check_barrier_completion(sb, journal->j_header_bh);
-               } else {
-                     sync:
-                       set_buffer_dirty(journal->j_header_bh);
-                       sync_dirty_buffer(journal->j_header_bh);
-               }
-               if (!buffer_uptodate(journal->j_header_bh)) {
--                      reiserfs_warning(p_s_sb, "journal-837",
-+                      reiserfs_warning(sb, "journal-837",
-                                        "IO error during journal replay");
-                       return -EIO;
-               }
-@@ -1328,23 +1328,23 @@ static int _update_journal_header_block(
-       return 0;
- }
--static int update_journal_header_block(struct super_block *p_s_sb,
-+static int update_journal_header_block(struct super_block *sb,
-                                      unsigned long offset,
-                                      unsigned int trans_id)
- {
--      return _update_journal_header_block(p_s_sb, offset, trans_id);
-+      return _update_journal_header_block(sb, offset, trans_id);
- }
- /*
- ** flush any and all journal lists older than you are
- ** can only be called from flush_journal_list
- */
--static int flush_older_journal_lists(struct super_block *p_s_sb,
-+static int flush_older_journal_lists(struct super_block *sb,
-                                    struct reiserfs_journal_list *jl)
- {
-       struct list_head *entry;
-       struct reiserfs_journal_list *other_jl;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       unsigned int trans_id = jl->j_trans_id;
-       /* we know we are the only ones flushing things, no extra race
-@@ -1359,7 +1359,7 @@ static int flush_older_journal_lists(str
-       if (other_jl->j_trans_id < trans_id) {
-               BUG_ON(other_jl->j_refcount <= 0);
-               /* do not flush all */
--              flush_journal_list(p_s_sb, other_jl, 0);
-+              flush_journal_list(sb, other_jl, 0);
-               /* other_jl is now deleted from the list */
-               goto restart;
-@@ -1908,22 +1908,22 @@ void remove_journal_hash(struct super_bl
-       }
- }
--static void free_journal_ram(struct super_block *p_s_sb)
-+static void free_journal_ram(struct super_block *sb)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       kfree(journal->j_current_jl);
-       journal->j_num_lists--;
-       vfree(journal->j_cnode_free_orig);
--      free_list_bitmaps(p_s_sb, journal->j_list_bitmap);
--      free_bitmap_nodes(p_s_sb);      /* must be after free_list_bitmaps */
-+      free_list_bitmaps(sb, journal->j_list_bitmap);
-+      free_bitmap_nodes(sb);  /* must be after free_list_bitmaps */
-       if (journal->j_header_bh) {
-               brelse(journal->j_header_bh);
-       }
-       /* j_header_bh is on the journal dev, make sure not to release the journal
-        * dev until we brelse j_header_bh
-        */
--      release_journal_dev(p_s_sb, journal);
-+      release_journal_dev(sb, journal);
-       vfree(journal);
- }
-@@ -1932,27 +1932,27 @@ static void free_journal_ram(struct supe
- ** of read_super() yet.  Any other caller must keep error at 0.
- */
- static int do_journal_release(struct reiserfs_transaction_handle *th,
--                            struct super_block *p_s_sb, int error)
-+                            struct super_block *sb, int error)
- {
-       struct reiserfs_transaction_handle myth;
-       int flushed = 0;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       /* we only want to flush out transactions if we were called with error == 0
-        */
--      if (!error && !(p_s_sb->s_flags & MS_RDONLY)) {
-+      if (!error && !(sb->s_flags & MS_RDONLY)) {
-               /* end the current trans */
-               BUG_ON(!th->t_trans_id);
--              do_journal_end(th, p_s_sb, 10, FLUSH_ALL);
-+              do_journal_end(th, sb, 10, FLUSH_ALL);
-               /* make sure something gets logged to force our way into the flush code */
--              if (!journal_join(&myth, p_s_sb, 1)) {
--                      reiserfs_prepare_for_journal(p_s_sb,
--                                                   SB_BUFFER_WITH_SB(p_s_sb),
-+              if (!journal_join(&myth, sb, 1)) {
-+                      reiserfs_prepare_for_journal(sb,
-+                                                   SB_BUFFER_WITH_SB(sb),
-                                                    1);
--                      journal_mark_dirty(&myth, p_s_sb,
--                                         SB_BUFFER_WITH_SB(p_s_sb));
--                      do_journal_end(&myth, p_s_sb, 1, FLUSH_ALL);
-+                      journal_mark_dirty(&myth, sb,
-+                                         SB_BUFFER_WITH_SB(sb));
-+                      do_journal_end(&myth, sb, 1, FLUSH_ALL);
-                       flushed = 1;
-               }
-       }
-@@ -1960,26 +1960,26 @@ static int do_journal_release(struct rei
-       /* this also catches errors during the do_journal_end above */
-       if (!error && reiserfs_is_journal_aborted(journal)) {
-               memset(&myth, 0, sizeof(myth));
--              if (!journal_join_abort(&myth, p_s_sb, 1)) {
--                      reiserfs_prepare_for_journal(p_s_sb,
--                                                   SB_BUFFER_WITH_SB(p_s_sb),
-+              if (!journal_join_abort(&myth, sb, 1)) {
-+                      reiserfs_prepare_for_journal(sb,
-+                                                   SB_BUFFER_WITH_SB(sb),
-                                                    1);
--                      journal_mark_dirty(&myth, p_s_sb,
--                                         SB_BUFFER_WITH_SB(p_s_sb));
--                      do_journal_end(&myth, p_s_sb, 1, FLUSH_ALL);
-+                      journal_mark_dirty(&myth, sb,
-+                                         SB_BUFFER_WITH_SB(sb));
-+                      do_journal_end(&myth, sb, 1, FLUSH_ALL);
-               }
-       }
-       reiserfs_mounted_fs_count--;
-       /* wait for all commits to finish */
--      cancel_delayed_work(&SB_JOURNAL(p_s_sb)->j_work);
-+      cancel_delayed_work(&SB_JOURNAL(sb)->j_work);
-       flush_workqueue(commit_wq);
-       if (!reiserfs_mounted_fs_count) {
-               destroy_workqueue(commit_wq);
-               commit_wq = NULL;
-       }
--      free_journal_ram(p_s_sb);
-+      free_journal_ram(sb);
-       return 0;
- }
-@@ -1988,28 +1988,28 @@ static int do_journal_release(struct rei
- ** call on unmount.  flush all journal trans, release all alloc'd ram
- */
- int journal_release(struct reiserfs_transaction_handle *th,
--                  struct super_block *p_s_sb)
-+                  struct super_block *sb)
- {
--      return do_journal_release(th, p_s_sb, 0);
-+      return do_journal_release(th, sb, 0);
- }
- /*
- ** only call from an error condition inside reiserfs_read_super!
- */
- int journal_release_error(struct reiserfs_transaction_handle *th,
--                        struct super_block *p_s_sb)
-+                        struct super_block *sb)
- {
--      return do_journal_release(th, p_s_sb, 1);
-+      return do_journal_release(th, sb, 1);
- }
- /* compares description block with commit block.  returns 1 if they differ, 0 if they are the same */
--static int journal_compare_desc_commit(struct super_block *p_s_sb,
-+static int journal_compare_desc_commit(struct super_block *sb,
-                                      struct reiserfs_journal_desc *desc,
-                                      struct reiserfs_journal_commit *commit)
- {
-       if (get_commit_trans_id(commit) != get_desc_trans_id(desc) ||
-           get_commit_trans_len(commit) != get_desc_trans_len(desc) ||
--          get_commit_trans_len(commit) > SB_JOURNAL(p_s_sb)->j_trans_max ||
-+          get_commit_trans_len(commit) > SB_JOURNAL(sb)->j_trans_max ||
-           get_commit_trans_len(commit) <= 0) {
-               return 1;
-       }
-@@ -2020,7 +2020,7 @@ static int journal_compare_desc_commit(s
- ** returns -1 if it found a corrupt commit block
- ** returns 1 if both desc and commit were valid
- */
--static int journal_transaction_is_valid(struct super_block *p_s_sb,
-+static int journal_transaction_is_valid(struct super_block *sb,
-                                       struct buffer_head *d_bh,
-                                       unsigned int *oldest_invalid_trans_id,
-                                       unsigned long *newest_mount_id)
-@@ -2038,7 +2038,7 @@ static int journal_transaction_is_valid(
-           && !memcmp(get_journal_desc_magic(d_bh), JOURNAL_DESC_MAGIC, 8)) {
-               if (oldest_invalid_trans_id && *oldest_invalid_trans_id
-                   && get_desc_trans_id(desc) > *oldest_invalid_trans_id) {
--                      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                      reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                      "journal-986: transaction "
-                                      "is valid returning because trans_id %d is greater than "
-                                      "oldest_invalid %lu",
-@@ -2048,7 +2048,7 @@ static int journal_transaction_is_valid(
-               }
-               if (newest_mount_id
-                   && *newest_mount_id > get_desc_mount_id(desc)) {
--                      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                      reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                      "journal-1087: transaction "
-                                      "is valid returning because mount_id %d is less than "
-                                      "newest_mount_id %lu",
-@@ -2056,37 +2056,37 @@ static int journal_transaction_is_valid(
-                                      *newest_mount_id);
-                       return -1;
-               }
--              if (get_desc_trans_len(desc) > SB_JOURNAL(p_s_sb)->j_trans_max) {
--                      reiserfs_warning(p_s_sb, "journal-2018",
-+              if (get_desc_trans_len(desc) > SB_JOURNAL(sb)->j_trans_max) {
-+                      reiserfs_warning(sb, "journal-2018",
-                                        "Bad transaction length %d "
-                                        "encountered, ignoring transaction",
-                                        get_desc_trans_len(desc));
-                       return -1;
-               }
--              offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb);
-+              offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
-               /* ok, we have a journal description block, lets see if the transaction was valid */
-               c_bh =
--                  journal_bread(p_s_sb,
--                                SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+                  journal_bread(sb,
-+                                SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                                 ((offset + get_desc_trans_len(desc) +
--                                  1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
-+                                  1) % SB_ONDISK_JOURNAL_SIZE(sb)));
-               if (!c_bh)
-                       return 0;
-               commit = (struct reiserfs_journal_commit *)c_bh->b_data;
--              if (journal_compare_desc_commit(p_s_sb, desc, commit)) {
--                      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+              if (journal_compare_desc_commit(sb, desc, commit)) {
-+                      reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                      "journal_transaction_is_valid, commit offset %ld had bad "
-                                      "time %d or length %d",
-                                      c_bh->b_blocknr -
--                                     SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                                     SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                                      get_commit_trans_id(commit),
-                                      get_commit_trans_len(commit));
-                       brelse(c_bh);
-                       if (oldest_invalid_trans_id) {
-                               *oldest_invalid_trans_id =
-                                   get_desc_trans_id(desc);
--                              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                              "journal-1004: "
-                                              "transaction_is_valid setting oldest invalid trans_id "
-                                              "to %d",
-@@ -2095,11 +2095,11 @@ static int journal_transaction_is_valid(
-                       return -1;
-               }
-               brelse(c_bh);
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                              "journal-1006: found valid "
-                              "transaction start offset %llu, len %d id %d",
-                              d_bh->b_blocknr -
--                             SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                             SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                              get_desc_trans_len(desc),
-                              get_desc_trans_id(desc));
-               return 1;
-@@ -2121,13 +2121,13 @@ static void brelse_array(struct buffer_h
- ** this either reads in a replays a transaction, or returns because the transaction
- ** is invalid, or too old.
- */
--static int journal_read_transaction(struct super_block *p_s_sb,
-+static int journal_read_transaction(struct super_block *sb,
-                                   unsigned long cur_dblock,
-                                   unsigned long oldest_start,
-                                   unsigned int oldest_trans_id,
-                                   unsigned long newest_mount_id)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_desc *desc;
-       struct reiserfs_journal_commit *commit;
-       unsigned int trans_id = 0;
-@@ -2139,45 +2139,45 @@ static int journal_read_transaction(stru
-       int i;
-       int trans_half;
--      d_bh = journal_bread(p_s_sb, cur_dblock);
-+      d_bh = journal_bread(sb, cur_dblock);
-       if (!d_bh)
-               return 1;
-       desc = (struct reiserfs_journal_desc *)d_bh->b_data;
--      trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb);
--      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1037: "
-+      trans_offset = d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
-+      reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1037: "
-                      "journal_read_transaction, offset %llu, len %d mount_id %d",
--                     d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                     d_bh->b_blocknr - SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                      get_desc_trans_len(desc), get_desc_mount_id(desc));
-       if (get_desc_trans_id(desc) < oldest_trans_id) {
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1039: "
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1039: "
-                              "journal_read_trans skipping because %lu is too old",
-                              cur_dblock -
--                             SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb));
-+                             SB_ONDISK_JOURNAL_1st_BLOCK(sb));
-               brelse(d_bh);
-               return 1;
-       }
-       if (get_desc_mount_id(desc) != newest_mount_id) {
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1146: "
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1146: "
-                              "journal_read_trans skipping because %d is != "
-                              "newest_mount_id %lu", get_desc_mount_id(desc),
-                              newest_mount_id);
-               brelse(d_bh);
-               return 1;
-       }
--      c_bh = journal_bread(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+      c_bh = journal_bread(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                            ((trans_offset + get_desc_trans_len(desc) + 1) %
--                            SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
-+                            SB_ONDISK_JOURNAL_SIZE(sb)));
-       if (!c_bh) {
-               brelse(d_bh);
-               return 1;
-       }
-       commit = (struct reiserfs_journal_commit *)c_bh->b_data;
--      if (journal_compare_desc_commit(p_s_sb, desc, commit)) {
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+      if (journal_compare_desc_commit(sb, desc, commit)) {
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                              "journal_read_transaction, "
-                              "commit offset %llu had bad time %d or length %d",
-                              c_bh->b_blocknr -
--                             SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                             SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                              get_commit_trans_id(commit),
-                              get_commit_trans_len(commit));
-               brelse(c_bh);
-@@ -2195,30 +2195,30 @@ static int journal_read_transaction(stru
-               brelse(d_bh);
-               kfree(log_blocks);
-               kfree(real_blocks);
--              reiserfs_warning(p_s_sb, "journal-1169",
-+              reiserfs_warning(sb, "journal-1169",
-                                "kmalloc failed, unable to mount FS");
-               return -1;
-       }
-       /* get all the buffer heads */
--      trans_half = journal_trans_half(p_s_sb->s_blocksize);
-+      trans_half = journal_trans_half(sb->s_blocksize);
-       for (i = 0; i < get_desc_trans_len(desc); i++) {
-               log_blocks[i] =
--                  journal_getblk(p_s_sb,
--                                 SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+                  journal_getblk(sb,
-+                                 SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                                  (trans_offset + 1 +
--                                  i) % SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-+                                  i) % SB_ONDISK_JOURNAL_SIZE(sb));
-               if (i < trans_half) {
-                       real_blocks[i] =
--                          sb_getblk(p_s_sb,
-+                          sb_getblk(sb,
-                                     le32_to_cpu(desc->j_realblock[i]));
-               } else {
-                       real_blocks[i] =
--                          sb_getblk(p_s_sb,
-+                          sb_getblk(sb,
-                                     le32_to_cpu(commit->
-                                                 j_realblock[i - trans_half]));
-               }
--              if (real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(p_s_sb)) {
--                      reiserfs_warning(p_s_sb, "journal-1207",
-+              if (real_blocks[i]->b_blocknr > SB_BLOCK_COUNT(sb)) {
-+                      reiserfs_warning(sb, "journal-1207",
-                                        "REPLAY FAILURE fsck required! "
-                                        "Block to replay is outside of "
-                                        "filesystem");
-@@ -2226,8 +2226,8 @@ static int journal_read_transaction(stru
-               }
-               /* make sure we don't try to replay onto log or reserved area */
-               if (is_block_in_log_or_reserved_area
--                  (p_s_sb, real_blocks[i]->b_blocknr)) {
--                      reiserfs_warning(p_s_sb, "journal-1204",
-+                  (sb, real_blocks[i]->b_blocknr)) {
-+                      reiserfs_warning(sb, "journal-1204",
-                                        "REPLAY FAILURE fsck required! "
-                                        "Trying to replay onto a log block");
-                     abort_replay:
-@@ -2245,7 +2245,7 @@ static int journal_read_transaction(stru
-       for (i = 0; i < get_desc_trans_len(desc); i++) {
-               wait_on_buffer(log_blocks[i]);
-               if (!buffer_uptodate(log_blocks[i])) {
--                      reiserfs_warning(p_s_sb, "journal-1212",
-+                      reiserfs_warning(sb, "journal-1212",
-                                        "REPLAY FAILURE fsck required! "
-                                        "buffer write failed");
-                       brelse_array(log_blocks + i,
-@@ -2270,7 +2270,7 @@ static int journal_read_transaction(stru
-       for (i = 0; i < get_desc_trans_len(desc); i++) {
-               wait_on_buffer(real_blocks[i]);
-               if (!buffer_uptodate(real_blocks[i])) {
--                      reiserfs_warning(p_s_sb, "journal-1226",
-+                      reiserfs_warning(sb, "journal-1226",
-                                        "REPLAY FAILURE, fsck required! "
-                                        "buffer write failed");
-                       brelse_array(real_blocks + i,
-@@ -2284,15 +2284,15 @@ static int journal_read_transaction(stru
-               brelse(real_blocks[i]);
-       }
-       cur_dblock =
--          SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+          SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-           ((trans_offset + get_desc_trans_len(desc) +
--            2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb));
--      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+            2) % SB_ONDISK_JOURNAL_SIZE(sb));
-+      reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                      "journal-1095: setting journal " "start to offset %ld",
--                     cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb));
-+                     cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb));
-       /* init starting values for the first transaction, in case this is the last transaction to be replayed. */
--      journal->j_start = cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb);
-+      journal->j_start = cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb);
-       journal->j_last_flush_trans_id = trans_id;
-       journal->j_trans_id = trans_id + 1;
-       /* check for trans_id overflow */
-@@ -2357,9 +2357,9 @@ static struct buffer_head *reiserfs_brea
- **
- ** On exit, it sets things up so the first transaction will work correctly.
- */
--static int journal_read(struct super_block *p_s_sb)
-+static int journal_read(struct super_block *sb)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_desc *desc;
-       unsigned int oldest_trans_id = 0;
-       unsigned int oldest_invalid_trans_id = 0;
-@@ -2375,8 +2375,8 @@ static int journal_read(struct super_blo
-       int ret;
-       char b[BDEVNAME_SIZE];
--      cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb);
--      reiserfs_info(p_s_sb, "checking transaction log (%s)\n",
-+      cur_dblock = SB_ONDISK_JOURNAL_1st_BLOCK(sb);
-+      reiserfs_info(sb, "checking transaction log (%s)\n",
-                     bdevname(journal->j_dev_bd, b));
-       start = get_seconds();
-@@ -2384,22 +2384,22 @@ static int journal_read(struct super_blo
-        ** is the first unflushed, and if that transaction is not valid,
-        ** replay is done
-        */
--      journal->j_header_bh = journal_bread(p_s_sb,
--                                           SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb)
--                                           + SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-+      journal->j_header_bh = journal_bread(sb,
-+                                           SB_ONDISK_JOURNAL_1st_BLOCK(sb)
-+                                           + SB_ONDISK_JOURNAL_SIZE(sb));
-       if (!journal->j_header_bh) {
-               return 1;
-       }
-       jh = (struct reiserfs_journal_header *)(journal->j_header_bh->b_data);
-       if (le32_to_cpu(jh->j_first_unflushed_offset) <
--          SB_ONDISK_JOURNAL_SIZE(p_s_sb)
-+          SB_ONDISK_JOURNAL_SIZE(sb)
-           && le32_to_cpu(jh->j_last_flush_trans_id) > 0) {
-               oldest_start =
--                  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+                  SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                   le32_to_cpu(jh->j_first_unflushed_offset);
-               oldest_trans_id = le32_to_cpu(jh->j_last_flush_trans_id) + 1;
-               newest_mount_id = le32_to_cpu(jh->j_mount_id);
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                              "journal-1153: found in "
-                              "header: first_unflushed_offset %d, last_flushed_trans_id "
-                              "%lu", le32_to_cpu(jh->j_first_unflushed_offset),
-@@ -2411,10 +2411,10 @@ static int journal_read(struct super_blo
-                ** through the whole log.
-                */
-               d_bh =
--                  journal_bread(p_s_sb,
--                                SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+                  journal_bread(sb,
-+                                SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                                 le32_to_cpu(jh->j_first_unflushed_offset));
--              ret = journal_transaction_is_valid(p_s_sb, d_bh, NULL, NULL);
-+              ret = journal_transaction_is_valid(sb, d_bh, NULL, NULL);
-               if (!ret) {
-                       continue_replay = 0;
-               }
-@@ -2422,8 +2422,8 @@ static int journal_read(struct super_blo
-               goto start_log_replay;
-       }
--      if (continue_replay && bdev_read_only(p_s_sb->s_bdev)) {
--              reiserfs_warning(p_s_sb, "clm-2076",
-+      if (continue_replay && bdev_read_only(sb->s_bdev)) {
-+              reiserfs_warning(sb, "clm-2076",
-                                "device is readonly, unable to replay log");
-               return -1;
-       }
-@@ -2433,17 +2433,17 @@ static int journal_read(struct super_blo
-        */
-       while (continue_replay
-              && cur_dblock <
--             (SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
--              SB_ONDISK_JOURNAL_SIZE(p_s_sb))) {
-+             (SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-+              SB_ONDISK_JOURNAL_SIZE(sb))) {
-               /* Note that it is required for blocksize of primary fs device and journal
-                  device to be the same */
-               d_bh =
-                   reiserfs_breada(journal->j_dev_bd, cur_dblock,
--                                  p_s_sb->s_blocksize,
--                                  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
--                                  SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-+                                  sb->s_blocksize,
-+                                  SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-+                                  SB_ONDISK_JOURNAL_SIZE(sb));
-               ret =
--                  journal_transaction_is_valid(p_s_sb, d_bh,
-+                  journal_transaction_is_valid(sb, d_bh,
-                                                &oldest_invalid_trans_id,
-                                                &newest_mount_id);
-               if (ret == 1) {
-@@ -2452,26 +2452,26 @@ static int journal_read(struct super_blo
-                               oldest_trans_id = get_desc_trans_id(desc);
-                               oldest_start = d_bh->b_blocknr;
-                               newest_mount_id = get_desc_mount_id(desc);
--                              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                              "journal-1179: Setting "
-                                              "oldest_start to offset %llu, trans_id %lu",
-                                              oldest_start -
-                                              SB_ONDISK_JOURNAL_1st_BLOCK
--                                             (p_s_sb), oldest_trans_id);
-+                                             (sb), oldest_trans_id);
-                       } else if (oldest_trans_id > get_desc_trans_id(desc)) {
-                               /* one we just read was older */
-                               oldest_trans_id = get_desc_trans_id(desc);
-                               oldest_start = d_bh->b_blocknr;
--                              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                              "journal-1180: Resetting "
-                                              "oldest_start to offset %lu, trans_id %lu",
-                                              oldest_start -
-                                              SB_ONDISK_JOURNAL_1st_BLOCK
--                                             (p_s_sb), oldest_trans_id);
-+                                             (sb), oldest_trans_id);
-                       }
-                       if (newest_mount_id < get_desc_mount_id(desc)) {
-                               newest_mount_id = get_desc_mount_id(desc);
--                              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+                              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                                              "journal-1299: Setting "
-                                              "newest_mount_id to %d",
-                                              get_desc_mount_id(desc));
-@@ -2486,17 +2486,17 @@ static int journal_read(struct super_blo
-       start_log_replay:
-       cur_dblock = oldest_start;
-       if (oldest_trans_id) {
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                              "journal-1206: Starting replay "
-                              "from offset %llu, trans_id %lu",
--                             cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                             cur_dblock - SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                              oldest_trans_id);
-       }
-       replay_count = 0;
-       while (continue_replay && oldest_trans_id > 0) {
-               ret =
--                  journal_read_transaction(p_s_sb, cur_dblock, oldest_start,
-+                  journal_read_transaction(sb, cur_dblock, oldest_start,
-                                            oldest_trans_id, newest_mount_id);
-               if (ret < 0) {
-                       return ret;
-@@ -2504,14 +2504,14 @@ static int journal_read(struct super_blo
-                       break;
-               }
-               cur_dblock =
--                  SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) + journal->j_start;
-+                  SB_ONDISK_JOURNAL_1st_BLOCK(sb) + journal->j_start;
-               replay_count++;
-               if (cur_dblock == oldest_start)
-                       break;
-       }
-       if (oldest_trans_id == 0) {
--              reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+              reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                              "journal-1225: No valid " "transactions found");
-       }
-       /* j_start does not get set correctly if we don't replay any transactions.
-@@ -2531,16 +2531,16 @@ static int journal_read(struct super_blo
-       } else {
-               journal->j_mount_id = newest_mount_id + 1;
-       }
--      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
-+      reiserfs_debug(sb, REISERFS_DEBUG_CODE, "journal-1299: Setting "
-                      "newest_mount_id to %lu", journal->j_mount_id);
-       journal->j_first_unflushed_offset = journal->j_start;
-       if (replay_count > 0) {
--              reiserfs_info(p_s_sb,
-+              reiserfs_info(sb,
-                             "replayed %d transactions in %lu seconds\n",
-                             replay_count, get_seconds() - start);
-       }
--      if (!bdev_read_only(p_s_sb->s_bdev) &&
--          _update_journal_header_block(p_s_sb, journal->j_start,
-+      if (!bdev_read_only(sb->s_bdev) &&
-+          _update_journal_header_block(sb, journal->j_start,
-                                        journal->j_last_flush_trans_id)) {
-               /* replay failed, caller must call free_journal_ram and abort
-                ** the mount
-@@ -2565,9 +2565,9 @@ static struct reiserfs_journal_list *all
-       return jl;
- }
--static void journal_list_init(struct super_block *p_s_sb)
-+static void journal_list_init(struct super_block *sb)
- {
--      SB_JOURNAL(p_s_sb)->j_current_jl = alloc_journal_list(p_s_sb);
-+      SB_JOURNAL(sb)->j_current_jl = alloc_journal_list(sb);
- }
- static int release_journal_dev(struct super_block *super,
-@@ -2663,28 +2663,28 @@ static int journal_init_dev(struct super
-  */
- #define REISERFS_STANDARD_BLKSIZE (4096)
--static int check_advise_trans_params(struct super_block *p_s_sb,
-+static int check_advise_trans_params(struct super_block *sb,
-                                    struct reiserfs_journal *journal)
- {
-         if (journal->j_trans_max) {
-               /* Non-default journal params.
-                  Do sanity check for them. */
-               int ratio = 1;
--              if (p_s_sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
--                      ratio = REISERFS_STANDARD_BLKSIZE / p_s_sb->s_blocksize;
-+              if (sb->s_blocksize < REISERFS_STANDARD_BLKSIZE)
-+                      ratio = REISERFS_STANDARD_BLKSIZE / sb->s_blocksize;
-               if (journal->j_trans_max > JOURNAL_TRANS_MAX_DEFAULT / ratio ||
-                   journal->j_trans_max < JOURNAL_TRANS_MIN_DEFAULT / ratio ||
--                  SB_ONDISK_JOURNAL_SIZE(p_s_sb) / journal->j_trans_max <
-+                  SB_ONDISK_JOURNAL_SIZE(sb) / journal->j_trans_max <
-                   JOURNAL_MIN_RATIO) {
--                      reiserfs_warning(p_s_sb, "sh-462",
-+                      reiserfs_warning(sb, "sh-462",
-                                        "bad transaction max size (%u). "
-                                        "FSCK?", journal->j_trans_max);
-                       return 1;
-               }
-               if (journal->j_max_batch != (journal->j_trans_max) *
-                       JOURNAL_MAX_BATCH_DEFAULT/JOURNAL_TRANS_MAX_DEFAULT) {
--                      reiserfs_warning(p_s_sb, "sh-463",
-+                      reiserfs_warning(sb, "sh-463",
-                                        "bad transaction max batch (%u). "
-                                        "FSCK?", journal->j_max_batch);
-                       return 1;
-@@ -2694,9 +2694,9 @@ static int check_advise_trans_params(str
-                    The file system was created by old version
-                  of mkreiserfs, so some fields contain zeros,
-                  and we need to advise proper values for them */
--              if (p_s_sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
--                      reiserfs_warning(p_s_sb, "sh-464", "bad blocksize (%u)",
--                                       p_s_sb->s_blocksize);
-+              if (sb->s_blocksize != REISERFS_STANDARD_BLKSIZE) {
-+                      reiserfs_warning(sb, "sh-464", "bad blocksize (%u)",
-+                                       sb->s_blocksize);
-                       return 1;
-               }
-               journal->j_trans_max = JOURNAL_TRANS_MAX_DEFAULT;
-@@ -2709,10 +2709,10 @@ static int check_advise_trans_params(str
- /*
- ** must be called once on fs mount.  calls journal_read for you
- */
--int journal_init(struct super_block *p_s_sb, const char *j_dev_name,
-+int journal_init(struct super_block *sb, const char *j_dev_name,
-                int old_format, unsigned int commit_max_age)
- {
--      int num_cnodes = SB_ONDISK_JOURNAL_SIZE(p_s_sb) * 2;
-+      int num_cnodes = SB_ONDISK_JOURNAL_SIZE(sb) * 2;
-       struct buffer_head *bhjh;
-       struct reiserfs_super_block *rs;
-       struct reiserfs_journal_header *jh;
-@@ -2720,9 +2720,9 @@ int journal_init(struct super_block *p_s
-       struct reiserfs_journal_list *jl;
-       char b[BDEVNAME_SIZE];
--      journal = SB_JOURNAL(p_s_sb) = vmalloc(sizeof(struct reiserfs_journal));
-+      journal = SB_JOURNAL(sb) = vmalloc(sizeof(struct reiserfs_journal));
-       if (!journal) {
--              reiserfs_warning(p_s_sb, "journal-1256",
-+              reiserfs_warning(sb, "journal-1256",
-                                "unable to get memory for journal structure");
-               return 1;
-       }
-@@ -2732,50 +2732,50 @@ int journal_init(struct super_block *p_s
-       INIT_LIST_HEAD(&journal->j_working_list);
-       INIT_LIST_HEAD(&journal->j_journal_list);
-       journal->j_persistent_trans = 0;
--      if (reiserfs_allocate_list_bitmaps(p_s_sb,
-+      if (reiserfs_allocate_list_bitmaps(sb,
-                                          journal->j_list_bitmap,
--                                         reiserfs_bmap_count(p_s_sb)))
-+                                         reiserfs_bmap_count(sb)))
-               goto free_and_return;
--      allocate_bitmap_nodes(p_s_sb);
-+      allocate_bitmap_nodes(sb);
-       /* reserved for journal area support */
--      SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) = (old_format ?
-+      SB_JOURNAL_1st_RESERVED_BLOCK(sb) = (old_format ?
-                                                REISERFS_OLD_DISK_OFFSET_IN_BYTES
--                                               / p_s_sb->s_blocksize +
--                                               reiserfs_bmap_count(p_s_sb) +
-+                                               / sb->s_blocksize +
-+                                               reiserfs_bmap_count(sb) +
-                                                1 :
-                                                REISERFS_DISK_OFFSET_IN_BYTES /
--                                               p_s_sb->s_blocksize + 2);
-+                                               sb->s_blocksize + 2);
-       /* Sanity check to see is the standard journal fitting withing first bitmap
-          (actual for small blocksizes) */
--      if (!SB_ONDISK_JOURNAL_DEVICE(p_s_sb) &&
--          (SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb) +
--           SB_ONDISK_JOURNAL_SIZE(p_s_sb) > p_s_sb->s_blocksize * 8)) {
--              reiserfs_warning(p_s_sb, "journal-1393",
-+      if (!SB_ONDISK_JOURNAL_DEVICE(sb) &&
-+          (SB_JOURNAL_1st_RESERVED_BLOCK(sb) +
-+           SB_ONDISK_JOURNAL_SIZE(sb) > sb->s_blocksize * 8)) {
-+              reiserfs_warning(sb, "journal-1393",
-                                "journal does not fit for area addressed "
-                                "by first of bitmap blocks. It starts at "
-                                "%u and its size is %u. Block size %ld",
--                               SB_JOURNAL_1st_RESERVED_BLOCK(p_s_sb),
--                               SB_ONDISK_JOURNAL_SIZE(p_s_sb),
--                               p_s_sb->s_blocksize);
-+                               SB_JOURNAL_1st_RESERVED_BLOCK(sb),
-+                               SB_ONDISK_JOURNAL_SIZE(sb),
-+                               sb->s_blocksize);
-               goto free_and_return;
-       }
--      if (journal_init_dev(p_s_sb, journal, j_dev_name) != 0) {
--              reiserfs_warning(p_s_sb, "sh-462",
-+      if (journal_init_dev(sb, journal, j_dev_name) != 0) {
-+              reiserfs_warning(sb, "sh-462",
-                                "unable to initialize jornal device");
-               goto free_and_return;
-       }
--      rs = SB_DISK_SUPER_BLOCK(p_s_sb);
-+      rs = SB_DISK_SUPER_BLOCK(sb);
-       /* read journal header */
--      bhjh = journal_bread(p_s_sb,
--                           SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
--                           SB_ONDISK_JOURNAL_SIZE(p_s_sb));
-+      bhjh = journal_bread(sb,
-+                           SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-+                           SB_ONDISK_JOURNAL_SIZE(sb));
-       if (!bhjh) {
--              reiserfs_warning(p_s_sb, "sh-459",
-+              reiserfs_warning(sb, "sh-459",
-                                "unable to read journal header");
-               goto free_and_return;
-       }
-@@ -2785,7 +2785,7 @@ int journal_init(struct super_block *p_s
-       if (is_reiserfs_jr(rs)
-           && (le32_to_cpu(jh->jh_journal.jp_journal_magic) !=
-               sb_jp_journal_magic(rs))) {
--              reiserfs_warning(p_s_sb, "sh-460",
-+              reiserfs_warning(sb, "sh-460",
-                                "journal header magic %x (device %s) does "
-                                "not match to magic found in super block %x",
-                                jh->jh_journal.jp_journal_magic,
-@@ -2801,7 +2801,7 @@ int journal_init(struct super_block *p_s
-           le32_to_cpu(jh->jh_journal.jp_journal_max_commit_age);
-       journal->j_max_trans_age = JOURNAL_MAX_TRANS_AGE;
--      if (check_advise_trans_params(p_s_sb, journal) != 0)
-+      if (check_advise_trans_params(sb, journal) != 0)
-               goto free_and_return;
-       journal->j_default_max_commit_age = journal->j_max_commit_age;
-@@ -2810,12 +2810,12 @@ int journal_init(struct super_block *p_s
-               journal->j_max_trans_age = commit_max_age;
-       }
--      reiserfs_info(p_s_sb, "journal params: device %s, size %u, "
-+      reiserfs_info(sb, "journal params: device %s, size %u, "
-                     "journal first block %u, max trans len %u, max batch %u, "
-                     "max commit age %u, max trans age %u\n",
-                     bdevname(journal->j_dev_bd, b),
--                    SB_ONDISK_JOURNAL_SIZE(p_s_sb),
--                    SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb),
-+                    SB_ONDISK_JOURNAL_SIZE(sb),
-+                    SB_ONDISK_JOURNAL_1st_BLOCK(sb),
-                     journal->j_trans_max,
-                     journal->j_max_batch,
-                     journal->j_max_commit_age, journal->j_max_trans_age);
-@@ -2823,7 +2823,7 @@ int journal_init(struct super_block *p_s
-       brelse(bhjh);
-       journal->j_list_bitmap_index = 0;
--      journal_list_init(p_s_sb);
-+      journal_list_init(sb);
-       memset(journal->j_list_hash_table, 0,
-              JOURNAL_HASH_SIZE * sizeof(struct reiserfs_journal_cnode *));
-@@ -2855,7 +2855,7 @@ int journal_init(struct super_block *p_s
-       journal->j_must_wait = 0;
-       if (journal->j_cnode_free == 0) {
--              reiserfs_warning(p_s_sb, "journal-2004", "Journal cnode memory "
-+              reiserfs_warning(sb, "journal-2004", "Journal cnode memory "
-                                "allocation failed (%ld bytes). Journal is "
-                                "too large for available memory. Usually "
-                                "this is due to a journal that is too large.",
-@@ -2863,16 +2863,16 @@ int journal_init(struct super_block *p_s
-               goto free_and_return;
-       }
--      init_journal_hash(p_s_sb);
-+      init_journal_hash(sb);
-       jl = journal->j_current_jl;
--      jl->j_list_bitmap = get_list_bitmap(p_s_sb, jl);
-+      jl->j_list_bitmap = get_list_bitmap(sb, jl);
-       if (!jl->j_list_bitmap) {
--              reiserfs_warning(p_s_sb, "journal-2005",
-+              reiserfs_warning(sb, "journal-2005",
-                                "get_list_bitmap failed for journal list 0");
-               goto free_and_return;
-       }
--      if (journal_read(p_s_sb) < 0) {
--              reiserfs_warning(p_s_sb, "reiserfs-2006",
-+      if (journal_read(sb) < 0) {
-+              reiserfs_warning(sb, "reiserfs-2006",
-                                "Replay Failure, unable to mount");
-               goto free_and_return;
-       }
-@@ -2882,10 +2882,10 @@ int journal_init(struct super_block *p_s
-               commit_wq = create_workqueue("reiserfs");
-       INIT_DELAYED_WORK(&journal->j_work, flush_async_commits);
--      journal->j_work_sb = p_s_sb;
-+      journal->j_work_sb = sb;
-       return 0;
-       free_and_return:
--      free_journal_ram(p_s_sb);
-+      free_journal_ram(sb);
-       return 1;
- }
-@@ -3001,37 +3001,37 @@ static void let_transaction_grow(struct 
- ** expect to use in nblocks.
- */
- static int do_journal_begin_r(struct reiserfs_transaction_handle *th,
--                            struct super_block *p_s_sb, unsigned long nblocks,
-+                            struct super_block *sb, unsigned long nblocks,
-                             int join)
- {
-       time_t now = get_seconds();
-       unsigned int old_trans_id;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_transaction_handle myth;
-       int sched_count = 0;
-       int retval;
--      reiserfs_check_lock_depth(p_s_sb, "journal_begin");
-+      reiserfs_check_lock_depth(sb, "journal_begin");
-       BUG_ON(nblocks > journal->j_trans_max);
--      PROC_INFO_INC(p_s_sb, journal.journal_being);
-+      PROC_INFO_INC(sb, journal.journal_being);
-       /* set here for journal_join */
-       th->t_refcount = 1;
--      th->t_super = p_s_sb;
-+      th->t_super = sb;
-       relock:
--      lock_journal(p_s_sb);
-+      lock_journal(sb);
-       if (join != JBEGIN_ABORT && reiserfs_is_journal_aborted(journal)) {
--              unlock_journal(p_s_sb);
-+              unlock_journal(sb);
-               retval = journal->j_errno;
-               goto out_fail;
-       }
-       journal->j_bcount++;
-       if (test_bit(J_WRITERS_BLOCKED, &journal->j_state)) {
--              unlock_journal(p_s_sb);
--              reiserfs_wait_on_write_block(p_s_sb);
--              PROC_INFO_INC(p_s_sb, journal.journal_relock_writers);
-+              unlock_journal(sb);
-+              reiserfs_wait_on_write_block(sb);
-+              PROC_INFO_INC(sb, journal.journal_relock_writers);
-               goto relock;
-       }
-       now = get_seconds();
-@@ -3052,7 +3052,7 @@ static int do_journal_begin_r(struct rei
-           || (!join && journal->j_cnode_free < (journal->j_trans_max * 3))) {
-               old_trans_id = journal->j_trans_id;
--              unlock_journal(p_s_sb); /* allow others to finish this transaction */
-+              unlock_journal(sb);     /* allow others to finish this transaction */
-               if (!join && (journal->j_len_alloc + nblocks + 2) >=
-                   journal->j_max_batch &&
-@@ -3060,7 +3060,7 @@ static int do_journal_begin_r(struct rei
-                   (journal->j_len_alloc * 75)) {
-                       if (atomic_read(&journal->j_wcount) > 10) {
-                               sched_count++;
--                              queue_log_writer(p_s_sb);
-+                              queue_log_writer(sb);
-                               goto relock;
-                       }
-               }
-@@ -3070,25 +3070,25 @@ static int do_journal_begin_r(struct rei
-               if (atomic_read(&journal->j_jlock)) {
-                       while (journal->j_trans_id == old_trans_id &&
-                              atomic_read(&journal->j_jlock)) {
--                              queue_log_writer(p_s_sb);
-+                              queue_log_writer(sb);
-                       }
-                       goto relock;
-               }
--              retval = journal_join(&myth, p_s_sb, 1);
-+              retval = journal_join(&myth, sb, 1);
-               if (retval)
-                       goto out_fail;
-               /* someone might have ended the transaction while we joined */
-               if (old_trans_id != journal->j_trans_id) {
--                      retval = do_journal_end(&myth, p_s_sb, 1, 0);
-+                      retval = do_journal_end(&myth, sb, 1, 0);
-               } else {
--                      retval = do_journal_end(&myth, p_s_sb, 1, COMMIT_NOW);
-+                      retval = do_journal_end(&myth, sb, 1, COMMIT_NOW);
-               }
-               if (retval)
-                       goto out_fail;
--              PROC_INFO_INC(p_s_sb, journal.journal_relock_wcount);
-+              PROC_INFO_INC(sb, journal.journal_relock_wcount);
-               goto relock;
-       }
-       /* we are the first writer, set trans_id */
-@@ -3100,7 +3100,7 @@ static int do_journal_begin_r(struct rei
-       th->t_blocks_logged = 0;
-       th->t_blocks_allocated = nblocks;
-       th->t_trans_id = journal->j_trans_id;
--      unlock_journal(p_s_sb);
-+      unlock_journal(sb);
-       INIT_LIST_HEAD(&th->t_list);
-       get_fs_excl();
-       return 0;
-@@ -3110,7 +3110,7 @@ static int do_journal_begin_r(struct rei
-       /* Re-set th->t_super, so we can properly keep track of how many
-        * persistent transactions there are. We need to do this so if this
-        * call is part of a failed restart_transaction, we can free it later */
--      th->t_super = p_s_sb;
-+      th->t_super = sb;
-       return retval;
- }
-@@ -3161,7 +3161,7 @@ int reiserfs_end_persistent_transaction(
- }
- static int journal_join(struct reiserfs_transaction_handle *th,
--                      struct super_block *p_s_sb, unsigned long nblocks)
-+                      struct super_block *sb, unsigned long nblocks)
- {
-       struct reiserfs_transaction_handle *cur_th = current->journal_info;
-@@ -3170,11 +3170,11 @@ static int journal_join(struct reiserfs_
-        */
-       th->t_handle_save = cur_th;
-       BUG_ON(cur_th && cur_th->t_refcount > 1);
--      return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_JOIN);
-+      return do_journal_begin_r(th, sb, nblocks, JBEGIN_JOIN);
- }
- int journal_join_abort(struct reiserfs_transaction_handle *th,
--                     struct super_block *p_s_sb, unsigned long nblocks)
-+                     struct super_block *sb, unsigned long nblocks)
- {
-       struct reiserfs_transaction_handle *cur_th = current->journal_info;
-@@ -3183,11 +3183,11 @@ int journal_join_abort(struct reiserfs_t
-        */
-       th->t_handle_save = cur_th;
-       BUG_ON(cur_th && cur_th->t_refcount > 1);
--      return do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_ABORT);
-+      return do_journal_begin_r(th, sb, nblocks, JBEGIN_ABORT);
- }
- int journal_begin(struct reiserfs_transaction_handle *th,
--                struct super_block *p_s_sb, unsigned long nblocks)
-+                struct super_block *sb, unsigned long nblocks)
- {
-       struct reiserfs_transaction_handle *cur_th = current->journal_info;
-       int ret;
-@@ -3195,12 +3195,12 @@ int journal_begin(struct reiserfs_transa
-       th->t_handle_save = NULL;
-       if (cur_th) {
-               /* we are nesting into the current transaction */
--              if (cur_th->t_super == p_s_sb) {
-+              if (cur_th->t_super == sb) {
-                       BUG_ON(!cur_th->t_refcount);
-                       cur_th->t_refcount++;
-                       memcpy(th, cur_th, sizeof(*th));
-                       if (th->t_refcount <= 1)
--                              reiserfs_warning(p_s_sb, "reiserfs-2005",
-+                              reiserfs_warning(sb, "reiserfs-2005",
-                                                "BAD: refcount <= 1, but "
-                                                "journal_info != 0");
-                       return 0;
-@@ -3209,7 +3209,7 @@ int journal_begin(struct reiserfs_transa
-                        ** save it and restore on journal_end.  This should never
-                        ** really happen...
-                        */
--                      reiserfs_warning(p_s_sb, "clm-2100",
-+                      reiserfs_warning(sb, "clm-2100",
-                                        "nesting info a different FS");
-                       th->t_handle_save = current->journal_info;
-                       current->journal_info = th;
-@@ -3217,7 +3217,7 @@ int journal_begin(struct reiserfs_transa
-       } else {
-               current->journal_info = th;
-       }
--      ret = do_journal_begin_r(th, p_s_sb, nblocks, JBEGIN_REG);
-+      ret = do_journal_begin_r(th, sb, nblocks, JBEGIN_REG);
-       BUG_ON(current->journal_info != th);
-       /* I guess this boils down to being the reciprocal of clm-2100 above.
-@@ -3241,28 +3241,28 @@ int journal_begin(struct reiserfs_transa
- ** if j_len, is bigger than j_len_alloc, it pushes j_len_alloc to 10 + j_len.
- */
- int journal_mark_dirty(struct reiserfs_transaction_handle *th,
--                     struct super_block *p_s_sb, struct buffer_head *bh)
-+                     struct super_block *sb, struct buffer_head *bh)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_cnode *cn = NULL;
-       int count_already_incd = 0;
-       int prepared = 0;
-       BUG_ON(!th->t_trans_id);
--      PROC_INFO_INC(p_s_sb, journal.mark_dirty);
-+      PROC_INFO_INC(sb, journal.mark_dirty);
-       if (th->t_trans_id != journal->j_trans_id) {
-               reiserfs_panic(th->t_super, "journal-1577",
-                              "handle trans id %ld != current trans id %ld",
-                              th->t_trans_id, journal->j_trans_id);
-       }
--      p_s_sb->s_dirt = 1;
-+      sb->s_dirt = 1;
-       prepared = test_clear_buffer_journal_prepared(bh);
-       clear_buffer_journal_restore_dirty(bh);
-       /* already in this transaction, we are done */
-       if (buffer_journaled(bh)) {
--              PROC_INFO_INC(p_s_sb, journal.mark_dirty_already);
-+              PROC_INFO_INC(sb, journal.mark_dirty_already);
-               return 0;
-       }
-@@ -3271,7 +3271,7 @@ int journal_mark_dirty(struct reiserfs_t
-        ** could get to disk too early.  NOT GOOD.
-        */
-       if (!prepared || buffer_dirty(bh)) {
--              reiserfs_warning(p_s_sb, "journal-1777",
-+              reiserfs_warning(sb, "journal-1777",
-                                "buffer %llu bad state "
-                                "%cPREPARED %cLOCKED %cDIRTY %cJDIRTY_WAIT",
-                                (unsigned long long)bh->b_blocknr,
-@@ -3282,7 +3282,7 @@ int journal_mark_dirty(struct reiserfs_t
-       }
-       if (atomic_read(&(journal->j_wcount)) <= 0) {
--              reiserfs_warning(p_s_sb, "journal-1409",
-+              reiserfs_warning(sb, "journal-1409",
-                                "returning because j_wcount was %d",
-                                atomic_read(&(journal->j_wcount)));
-               return 1;
-@@ -3298,7 +3298,7 @@ int journal_mark_dirty(struct reiserfs_t
-       if (buffer_journal_dirty(bh)) {
-               count_already_incd = 1;
--              PROC_INFO_INC(p_s_sb, journal.mark_dirty_notjournal);
-+              PROC_INFO_INC(sb, journal.mark_dirty_notjournal);
-               clear_buffer_journal_dirty(bh);
-       }
-@@ -3310,10 +3310,9 @@ int journal_mark_dirty(struct reiserfs_t
-       /* now put this guy on the end */
-       if (!cn) {
--              cn = get_cnode(p_s_sb);
-+              cn = get_cnode(sb);
-               if (!cn) {
--                      reiserfs_panic(p_s_sb, "journal-4",
--                                     "get_cnode failed!");
-+                      reiserfs_panic(sb, "journal-4", "get_cnode failed!");
-               }
-               if (th->t_blocks_logged == th->t_blocks_allocated) {
-@@ -3325,7 +3324,7 @@ int journal_mark_dirty(struct reiserfs_t
-               cn->bh = bh;
-               cn->blocknr = bh->b_blocknr;
--              cn->sb = p_s_sb;
-+              cn->sb = sb;
-               cn->jlist = NULL;
-               insert_journal_hash(journal->j_hash_table, cn);
-               if (!count_already_incd) {
-@@ -3346,10 +3345,10 @@ int journal_mark_dirty(struct reiserfs_t
- }
- int journal_end(struct reiserfs_transaction_handle *th,
--              struct super_block *p_s_sb, unsigned long nblocks)
-+              struct super_block *sb, unsigned long nblocks)
- {
-       if (!current->journal_info && th->t_refcount > 1)
--              reiserfs_warning(p_s_sb, "REISER-NESTING",
-+              reiserfs_warning(sb, "REISER-NESTING",
-                                "th NULL, refcount %d", th->t_refcount);
-       if (!th->t_trans_id) {
-@@ -3373,7 +3372,7 @@ int journal_end(struct reiserfs_transact
-               }
-               return 0;
-       } else {
--              return do_journal_end(th, p_s_sb, nblocks, 0);
-+              return do_journal_end(th, sb, nblocks, 0);
-       }
- }
-@@ -3384,15 +3383,15 @@ int journal_end(struct reiserfs_transact
- **
- ** returns 1 if it cleaned and relsed the buffer. 0 otherwise
- */
--static int remove_from_transaction(struct super_block *p_s_sb,
-+static int remove_from_transaction(struct super_block *sb,
-                                  b_blocknr_t blocknr, int already_cleaned)
- {
-       struct buffer_head *bh;
-       struct reiserfs_journal_cnode *cn;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       int ret = 0;
--      cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, blocknr);
-+      cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
-       if (!cn || !cn->bh) {
-               return ret;
-       }
-@@ -3410,7 +3409,7 @@ static int remove_from_transaction(struc
-               journal->j_last = cn->prev;
-       }
-       if (bh)
--              remove_journal_hash(p_s_sb, journal->j_hash_table, NULL,
-+              remove_journal_hash(sb, journal->j_hash_table, NULL,
-                                   bh->b_blocknr, 0);
-       clear_buffer_journaled(bh);     /* don't log this one */
-@@ -3420,14 +3419,14 @@ static int remove_from_transaction(struc
-               clear_buffer_journal_test(bh);
-               put_bh(bh);
-               if (atomic_read(&(bh->b_count)) < 0) {
--                      reiserfs_warning(p_s_sb, "journal-1752",
-+                      reiserfs_warning(sb, "journal-1752",
-                                        "b_count < 0");
-               }
-               ret = 1;
-       }
-       journal->j_len--;
-       journal->j_len_alloc--;
--      free_cnode(p_s_sb, cn);
-+      free_cnode(sb, cn);
-       return ret;
- }
-@@ -3478,19 +3477,19 @@ static int can_dirty(struct reiserfs_jou
- ** will wait until the current transaction is done/committed before returning
- */
- int journal_end_sync(struct reiserfs_transaction_handle *th,
--                   struct super_block *p_s_sb, unsigned long nblocks)
-+                   struct super_block *sb, unsigned long nblocks)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       BUG_ON(!th->t_trans_id);
-       /* you can sync while nested, very, very bad */
-       BUG_ON(th->t_refcount > 1);
-       if (journal->j_len == 0) {
--              reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb),
-+              reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
-                                            1);
--              journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb));
-+              journal_mark_dirty(th, sb, SB_BUFFER_WITH_SB(sb));
-       }
--      return do_journal_end(th, p_s_sb, nblocks, COMMIT_NOW | WAIT);
-+      return do_journal_end(th, sb, nblocks, COMMIT_NOW | WAIT);
- }
- /*
-@@ -3500,7 +3499,7 @@ static void flush_async_commits(struct w
- {
-       struct reiserfs_journal *journal =
-               container_of(work, struct reiserfs_journal, j_work.work);
--      struct super_block *p_s_sb = journal->j_work_sb;
-+      struct super_block *sb = journal->j_work_sb;
-       struct reiserfs_journal_list *jl;
-       struct list_head *entry;
-@@ -3509,7 +3508,7 @@ static void flush_async_commits(struct w
-               /* last entry is the youngest, commit it and you get everything */
-               entry = journal->j_journal_list.prev;
-               jl = JOURNAL_LIST_ENTRY(entry);
--              flush_commit_list(p_s_sb, jl, 1);
-+              flush_commit_list(sb, jl, 1);
-       }
-       unlock_kernel();
- }
-@@ -3518,11 +3517,11 @@ static void flush_async_commits(struct w
- ** flushes any old transactions to disk
- ** ends the current transaction if it is too old
- */
--int reiserfs_flush_old_commits(struct super_block *p_s_sb)
-+int reiserfs_flush_old_commits(struct super_block *sb)
- {
-       time_t now;
-       struct reiserfs_transaction_handle th;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       now = get_seconds();
-       /* safety check so we don't flush while we are replaying the log during
-@@ -3539,20 +3538,20 @@ int reiserfs_flush_old_commits(struct su
-           journal->j_trans_start_time > 0 &&
-           journal->j_len > 0 &&
-           (now - journal->j_trans_start_time) > journal->j_max_trans_age) {
--              if (!journal_join(&th, p_s_sb, 1)) {
--                      reiserfs_prepare_for_journal(p_s_sb,
--                                                   SB_BUFFER_WITH_SB(p_s_sb),
-+              if (!journal_join(&th, sb, 1)) {
-+                      reiserfs_prepare_for_journal(sb,
-+                                                   SB_BUFFER_WITH_SB(sb),
-                                                    1);
--                      journal_mark_dirty(&th, p_s_sb,
--                                         SB_BUFFER_WITH_SB(p_s_sb));
-+                      journal_mark_dirty(&th, sb,
-+                                         SB_BUFFER_WITH_SB(sb));
-                       /* we're only being called from kreiserfsd, it makes no sense to do
-                        ** an async commit so that kreiserfsd can do it later
-                        */
--                      do_journal_end(&th, p_s_sb, 1, COMMIT_NOW | WAIT);
-+                      do_journal_end(&th, sb, 1, COMMIT_NOW | WAIT);
-               }
-       }
--      return p_s_sb->s_dirt;
-+      return sb->s_dirt;
- }
- /*
-@@ -3567,7 +3566,7 @@ int reiserfs_flush_old_commits(struct su
- ** Note, we can't allow the journal_end to proceed while there are still writers in the log.
- */
- static int check_journal_end(struct reiserfs_transaction_handle *th,
--                           struct super_block *p_s_sb, unsigned long nblocks,
-+                           struct super_block *sb, unsigned long nblocks,
-                            int flags)
- {
-@@ -3576,7 +3575,7 @@ static int check_journal_end(struct reis
-       int commit_now = flags & COMMIT_NOW;
-       int wait_on_commit = flags & WAIT;
-       struct reiserfs_journal_list *jl;
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       BUG_ON(!th->t_trans_id);
-@@ -3615,31 +3614,31 @@ static int check_journal_end(struct reis
-                       if (flush) {
-                               journal->j_next_full_flush = 1;
-                       }
--                      unlock_journal(p_s_sb);
-+                      unlock_journal(sb);
-                       /* sleep while the current transaction is still j_jlocked */
-                       while (journal->j_trans_id == trans_id) {
-                               if (atomic_read(&journal->j_jlock)) {
--                                      queue_log_writer(p_s_sb);
-+                                      queue_log_writer(sb);
-                               } else {
--                                      lock_journal(p_s_sb);
-+                                      lock_journal(sb);
-                                       if (journal->j_trans_id == trans_id) {
-                                               atomic_set(&(journal->j_jlock),
-                                                          1);
-                                       }
--                                      unlock_journal(p_s_sb);
-+                                      unlock_journal(sb);
-                               }
-                       }
-                       BUG_ON(journal->j_trans_id == trans_id);
-                       
-                       if (commit_now
--                          && journal_list_still_alive(p_s_sb, trans_id)
-+                          && journal_list_still_alive(sb, trans_id)
-                           && wait_on_commit) {
--                              flush_commit_list(p_s_sb, jl, 1);
-+                              flush_commit_list(sb, jl, 1);
-                       }
-                       return 0;
-               }
--              unlock_journal(p_s_sb);
-+              unlock_journal(sb);
-               return 0;
-       }
-@@ -3656,12 +3655,12 @@ static int check_journal_end(struct reis
-           && journal->j_len_alloc < journal->j_max_batch
-           && journal->j_cnode_free > (journal->j_trans_max * 3)) {
-               journal->j_bcount++;
--              unlock_journal(p_s_sb);
-+              unlock_journal(sb);
-               return 0;
-       }
--      if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
--              reiserfs_panic(p_s_sb, "journal-003",
-+      if (journal->j_start > SB_ONDISK_JOURNAL_SIZE(sb)) {
-+              reiserfs_panic(sb, "journal-003",
-                              "j_start (%ld) is too high",
-                              journal->j_start);
-       }
-@@ -3683,16 +3682,16 @@ static int check_journal_end(struct reis
- ** Then remove it from the current transaction, decrementing any counters and filing it on the clean list.
- */
- int journal_mark_freed(struct reiserfs_transaction_handle *th,
--                     struct super_block *p_s_sb, b_blocknr_t blocknr)
-+                     struct super_block *sb, b_blocknr_t blocknr)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_cnode *cn = NULL;
-       struct buffer_head *bh = NULL;
-       struct reiserfs_list_bitmap *jb = NULL;
-       int cleaned = 0;
-       BUG_ON(!th->t_trans_id);
--      cn = get_journal_hash_dev(p_s_sb, journal->j_hash_table, blocknr);
-+      cn = get_journal_hash_dev(sb, journal->j_hash_table, blocknr);
-       if (cn && cn->bh) {
-               bh = cn->bh;
-               get_bh(bh);
-@@ -3702,15 +3701,15 @@ int journal_mark_freed(struct reiserfs_t
-               clear_buffer_journal_new(bh);
-               clear_prepared_bits(bh);
-               reiserfs_clean_and_file_buffer(bh);
--              cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned);
-+              cleaned = remove_from_transaction(sb, blocknr, cleaned);
-       } else {
-               /* set the bit for this block in the journal bitmap for this transaction */
-               jb = journal->j_current_jl->j_list_bitmap;
-               if (!jb) {
--                      reiserfs_panic(p_s_sb, "journal-1702",
-+                      reiserfs_panic(sb, "journal-1702",
-                                      "journal_list_bitmap is NULL");
-               }
--              set_bit_in_list_bitmap(p_s_sb, blocknr, jb);
-+              set_bit_in_list_bitmap(sb, blocknr, jb);
-               /* Note, the entire while loop is not allowed to schedule.  */
-@@ -3718,13 +3717,13 @@ int journal_mark_freed(struct reiserfs_t
-                       clear_prepared_bits(bh);
-                       reiserfs_clean_and_file_buffer(bh);
-               }
--              cleaned = remove_from_transaction(p_s_sb, blocknr, cleaned);
-+              cleaned = remove_from_transaction(sb, blocknr, cleaned);
-               /* find all older transactions with this block, make sure they don't try to write it out */
--              cn = get_journal_hash_dev(p_s_sb, journal->j_list_hash_table,
-+              cn = get_journal_hash_dev(sb, journal->j_list_hash_table,
-                                         blocknr);
-               while (cn) {
--                      if (p_s_sb == cn->sb && blocknr == cn->blocknr) {
-+                      if (sb == cn->sb && blocknr == cn->blocknr) {
-                               set_bit(BLOCK_FREED, &cn->state);
-                               if (cn->bh) {
-                                       if (!cleaned) {
-@@ -3740,7 +3739,7 @@ int journal_mark_freed(struct reiserfs_t
-                                               put_bh(cn->bh);
-                                               if (atomic_read
-                                                   (&(cn->bh->b_count)) < 0) {
--                                                      reiserfs_warning(p_s_sb,
-+                                                      reiserfs_warning(sb,
-                                                                "journal-2138",
-                                                                "cn->bh->b_count < 0");
-                                               }
-@@ -3847,18 +3846,18 @@ int reiserfs_commit_for_inode(struct ino
-       return __commit_trans_jl(inode, id, jl);
- }
--void reiserfs_restore_prepared_buffer(struct super_block *p_s_sb,
-+void reiserfs_restore_prepared_buffer(struct super_block *sb,
-                                     struct buffer_head *bh)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
--      PROC_INFO_INC(p_s_sb, journal.restore_prepared);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-+      PROC_INFO_INC(sb, journal.restore_prepared);
-       if (!bh) {
-               return;
-       }
-       if (test_clear_buffer_journal_restore_dirty(bh) &&
-           buffer_journal_dirty(bh)) {
-               struct reiserfs_journal_cnode *cn;
--              cn = get_journal_hash_dev(p_s_sb,
-+              cn = get_journal_hash_dev(sb,
-                                         journal->j_list_hash_table,
-                                         bh->b_blocknr);
-               if (cn && can_dirty(cn)) {
-@@ -3877,10 +3876,10 @@ extern struct tree_balance *cur_tb;
- ** wait on it.
- **
- */
--int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
-+int reiserfs_prepare_for_journal(struct super_block *sb,
-                                struct buffer_head *bh, int wait)
- {
--      PROC_INFO_INC(p_s_sb, journal.prepare);
-+      PROC_INFO_INC(sb, journal.prepare);
-       if (!trylock_buffer(bh)) {
-               if (!wait)
-@@ -3928,10 +3927,10 @@ static void flush_old_journal_lists(stru
- ** journal lists, etc just won't happen.
- */
- static int do_journal_end(struct reiserfs_transaction_handle *th,
--                        struct super_block *p_s_sb, unsigned long nblocks,
-+                        struct super_block *sb, unsigned long nblocks,
-                         int flags)
- {
--      struct reiserfs_journal *journal = SB_JOURNAL(p_s_sb);
-+      struct reiserfs_journal *journal = SB_JOURNAL(sb);
-       struct reiserfs_journal_cnode *cn, *next, *jl_cn;
-       struct reiserfs_journal_cnode *last_cn = NULL;
-       struct reiserfs_journal_desc *desc;
-@@ -3961,14 +3960,14 @@ static int do_journal_end(struct reiserf
-       put_fs_excl();
-       current->journal_info = th->t_handle_save;
--      reiserfs_check_lock_depth(p_s_sb, "journal end");
-+      reiserfs_check_lock_depth(sb, "journal end");
-       if (journal->j_len == 0) {
--              reiserfs_prepare_for_journal(p_s_sb, SB_BUFFER_WITH_SB(p_s_sb),
-+              reiserfs_prepare_for_journal(sb, SB_BUFFER_WITH_SB(sb),
-                                            1);
--              journal_mark_dirty(th, p_s_sb, SB_BUFFER_WITH_SB(p_s_sb));
-+              journal_mark_dirty(th, sb, SB_BUFFER_WITH_SB(sb));
-       }
--      lock_journal(p_s_sb);
-+      lock_journal(sb);
-       if (journal->j_next_full_flush) {
-               flags |= FLUSH_ALL;
-               flush = 1;
-@@ -3981,10 +3980,10 @@ static int do_journal_end(struct reiserf
-       /* check_journal_end locks the journal, and unlocks if it does not return 1
-        ** it tells us if we should continue with the journal_end, or just return
-        */
--      if (!check_journal_end(th, p_s_sb, nblocks, flags)) {
--              p_s_sb->s_dirt = 1;
--              wake_queued_writers(p_s_sb);
--              reiserfs_async_progress_wait(p_s_sb);
-+      if (!check_journal_end(th, sb, nblocks, flags)) {
-+              sb->s_dirt = 1;
-+              wake_queued_writers(sb);
-+              reiserfs_async_progress_wait(sb);
-               goto out;
-       }
-@@ -4013,8 +4012,8 @@ static int do_journal_end(struct reiserf
-       /* setup description block */
-       d_bh =
--          journal_getblk(p_s_sb,
--                         SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+          journal_getblk(sb,
-+                         SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                          journal->j_start);
-       set_buffer_uptodate(d_bh);
-       desc = (struct reiserfs_journal_desc *)(d_bh)->b_data;
-@@ -4023,9 +4022,9 @@ static int do_journal_end(struct reiserf
-       set_desc_trans_id(desc, journal->j_trans_id);
-       /* setup commit block.  Don't write (keep it clean too) this one until after everyone else is written */
--      c_bh = journal_getblk(p_s_sb, SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+      c_bh = journal_getblk(sb, SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                             ((journal->j_start + journal->j_len +
--                              1) % SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
-+                              1) % SB_ONDISK_JOURNAL_SIZE(sb)));
-       commit = (struct reiserfs_journal_commit *)c_bh->b_data;
-       memset(c_bh->b_data, 0, c_bh->b_size);
-       set_commit_trans_id(commit, journal->j_trans_id);
-@@ -4058,12 +4057,12 @@ static int do_journal_end(struct reiserf
-        **  for each real block, add it to the journal list hash,
-        ** copy into real block index array in the commit or desc block
-        */
--      trans_half = journal_trans_half(p_s_sb->s_blocksize);
-+      trans_half = journal_trans_half(sb->s_blocksize);
-       for (i = 0, cn = journal->j_first; cn; cn = cn->next, i++) {
-               if (buffer_journaled(cn->bh)) {
--                      jl_cn = get_cnode(p_s_sb);
-+                      jl_cn = get_cnode(sb);
-                       if (!jl_cn) {
--                              reiserfs_panic(p_s_sb, "journal-1676",
-+                              reiserfs_panic(sb, "journal-1676",
-                                              "get_cnode returned NULL");
-                       }
-                       if (i == 0) {
-@@ -4079,15 +4078,15 @@ static int do_journal_end(struct reiserf
-                          of journal or reserved area */
-                       if (is_block_in_log_or_reserved_area
--                          (p_s_sb, cn->bh->b_blocknr)) {
--                              reiserfs_panic(p_s_sb, "journal-2332",
-+                          (sb, cn->bh->b_blocknr)) {
-+                              reiserfs_panic(sb, "journal-2332",
-                                              "Trying to log block %lu, "
-                                              "which is a log block",
-                                              cn->bh->b_blocknr);
-                       }
-                       jl_cn->blocknr = cn->bh->b_blocknr;
-                       jl_cn->state = 0;
--                      jl_cn->sb = p_s_sb;
-+                      jl_cn->sb = sb;
-                       jl_cn->bh = cn->bh;
-                       jl_cn->jlist = jl;
-                       insert_journal_hash(journal->j_list_hash_table, jl_cn);
-@@ -4128,11 +4127,11 @@ static int do_journal_end(struct reiserf
-                       char *addr;
-                       struct page *page;
-                       tmp_bh =
--                          journal_getblk(p_s_sb,
--                                         SB_ONDISK_JOURNAL_1st_BLOCK(p_s_sb) +
-+                          journal_getblk(sb,
-+                                         SB_ONDISK_JOURNAL_1st_BLOCK(sb) +
-                                          ((cur_write_start +
-                                            jindex) %
--                                          SB_ONDISK_JOURNAL_SIZE(p_s_sb)));
-+                                          SB_ONDISK_JOURNAL_SIZE(sb)));
-                       set_buffer_uptodate(tmp_bh);
-                       page = cn->bh->b_page;
-                       addr = kmap(page);
-@@ -4146,13 +4145,13 @@ static int do_journal_end(struct reiserf
-                       clear_buffer_journaled(cn->bh);
-               } else {
-                       /* JDirty cleared sometime during transaction.  don't log this one */
--                      reiserfs_warning(p_s_sb, "journal-2048",
-+                      reiserfs_warning(sb, "journal-2048",
-                                        "BAD, buffer in journal hash, "
-                                        "but not JDirty!");
-                       brelse(cn->bh);
-               }
-               next = cn->next;
--              free_cnode(p_s_sb, cn);
-+              free_cnode(sb, cn);
-               cn = next;
-               cond_resched();
-       }
-@@ -4162,7 +4161,7 @@ static int do_journal_end(struct reiserf
-        ** so we dirty/relse c_bh in flush_commit_list, with commit_left <= 1.
-        */
--      journal->j_current_jl = alloc_journal_list(p_s_sb);
-+      journal->j_current_jl = alloc_journal_list(sb);
-       /* now it is safe to insert this transaction on the main list */
-       list_add_tail(&jl->j_list, &journal->j_journal_list);
-@@ -4173,7 +4172,7 @@ static int do_journal_end(struct reiserf
-       old_start = journal->j_start;
-       journal->j_start =
-           (journal->j_start + journal->j_len +
--           2) % SB_ONDISK_JOURNAL_SIZE(p_s_sb);
-+           2) % SB_ONDISK_JOURNAL_SIZE(sb);
-       atomic_set(&(journal->j_wcount), 0);
-       journal->j_bcount = 0;
-       journal->j_last = NULL;
-@@ -4188,7 +4187,7 @@ static int do_journal_end(struct reiserf
-       journal->j_len_alloc = 0;
-       journal->j_next_full_flush = 0;
-       journal->j_next_async_flush = 0;
--      init_journal_hash(p_s_sb);
-+      init_journal_hash(sb);
-       // make sure reiserfs_add_jh sees the new current_jl before we
-       // write out the tails
-@@ -4217,8 +4216,8 @@ static int do_journal_end(struct reiserf
-        ** queue don't wait for this proc to flush journal lists and such.
-        */
-       if (flush) {
--              flush_commit_list(p_s_sb, jl, 1);
--              flush_journal_list(p_s_sb, jl, 1);
-+              flush_commit_list(sb, jl, 1);
-+              flush_journal_list(sb, jl, 1);
-       } else if (!(jl->j_state & LIST_COMMIT_PENDING))
-               queue_delayed_work(commit_wq, &journal->j_work, HZ / 10);
-@@ -4232,11 +4231,11 @@ static int do_journal_end(struct reiserf
-               if (journal->j_start <= temp_jl->j_start) {
-                       if ((journal->j_start + journal->j_trans_max + 1) >=
-                           temp_jl->j_start) {
--                              flush_used_journal_lists(p_s_sb, temp_jl);
-+                              flush_used_journal_lists(sb, temp_jl);
-                               goto first_jl;
-                       } else if ((journal->j_start +
-                                   journal->j_trans_max + 1) <
--                                 SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
-+                                 SB_ONDISK_JOURNAL_SIZE(sb)) {
-                               /* if we don't cross into the next transaction and we don't
-                                * wrap, there is no way we can overlap any later transactions
-                                * break now
-@@ -4245,11 +4244,11 @@ static int do_journal_end(struct reiserf
-                       }
-               } else if ((journal->j_start +
-                           journal->j_trans_max + 1) >
--                         SB_ONDISK_JOURNAL_SIZE(p_s_sb)) {
-+                         SB_ONDISK_JOURNAL_SIZE(sb)) {
-                       if (((journal->j_start + journal->j_trans_max + 1) %
--                           SB_ONDISK_JOURNAL_SIZE(p_s_sb)) >=
-+                           SB_ONDISK_JOURNAL_SIZE(sb)) >=
-                           temp_jl->j_start) {
--                              flush_used_journal_lists(p_s_sb, temp_jl);
-+                              flush_used_journal_lists(sb, temp_jl);
-                               goto first_jl;
-                       } else {
-                               /* we don't overlap anything from out start to the end of the
-@@ -4260,34 +4259,34 @@ static int do_journal_end(struct reiserf
-                       }
-               }
-       }
--      flush_old_journal_lists(p_s_sb);
-+      flush_old_journal_lists(sb);
-       journal->j_current_jl->j_list_bitmap =
--          get_list_bitmap(p_s_sb, journal->j_current_jl);
-+          get_list_bitmap(sb, journal->j_current_jl);
-       if (!(journal->j_current_jl->j_list_bitmap)) {
--              reiserfs_panic(p_s_sb, "journal-1996",
-+              reiserfs_panic(sb, "journal-1996",
-                              "could not get a list bitmap");
-       }
-       atomic_set(&(journal->j_jlock), 0);
--      unlock_journal(p_s_sb);
-+      unlock_journal(sb);
-       /* wake up any body waiting to join. */
-       clear_bit(J_WRITERS_QUEUED, &journal->j_state);
-       wake_up(&(journal->j_join_wait));
-       if (!flush && wait_on_commit &&
--          journal_list_still_alive(p_s_sb, commit_trans_id)) {
--              flush_commit_list(p_s_sb, jl, 1);
-+          journal_list_still_alive(sb, commit_trans_id)) {
-+              flush_commit_list(sb, jl, 1);
-       }
-       out:
--      reiserfs_check_lock_depth(p_s_sb, "journal end2");
-+      reiserfs_check_lock_depth(sb, "journal end2");
-       memset(th, 0, sizeof(*th));
-       /* Re-set th->t_super, so we can properly keep track of how many
-        * persistent transactions there are. We need to do this so if this
-        * call is part of a failed restart_transaction, we can free it later */
--      th->t_super = p_s_sb;
-+      th->t_super = sb;
-       return journal->j_errno;
- }
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -245,7 +245,7 @@ static const struct reiserfs_key MAX_KEY
- static inline const struct reiserfs_key *get_lkey(const struct treepath
-                                                 *p_s_chk_path,
-                                                 const struct super_block
--                                                *p_s_sb)
-+                                                *sb)
- {
-       int n_position, n_path_offset = p_s_chk_path->path_length;
-       struct buffer_head *p_s_parent;
-@@ -282,14 +282,14 @@ static inline const struct reiserfs_key 
-       }
-       /* Return MIN_KEY if we are in the root of the buffer tree. */
-       if (PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->
--          b_blocknr == SB_ROOT_BLOCK(p_s_sb))
-+          b_blocknr == SB_ROOT_BLOCK(sb))
-               return &MIN_KEY;
-       return &MAX_KEY;
- }
- /* Get delimiting key of the buffer at the path and its right neighbor. */
- inline const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
--                                         const struct super_block *p_s_sb)
-+                                         const struct super_block *sb)
- {
-       int n_position, n_path_offset = p_s_chk_path->path_length;
-       struct buffer_head *p_s_parent;
-@@ -325,7 +325,7 @@ inline const struct reiserfs_key *get_rk
-       }
-       /* Return MAX_KEY if we are in the root of the buffer tree. */
-       if (PATH_OFFSET_PBUFFER(p_s_chk_path, FIRST_PATH_ELEMENT_OFFSET)->
--          b_blocknr == SB_ROOT_BLOCK(p_s_sb))
-+          b_blocknr == SB_ROOT_BLOCK(sb))
-               return &MAX_KEY;
-       return &MIN_KEY;
- }
-@@ -337,7 +337,7 @@ inline const struct reiserfs_key *get_rk
-    this case get_lkey and get_rkey return a special key which is MIN_KEY or MAX_KEY. */
- static inline int key_in_buffer(struct treepath *p_s_chk_path,        /* Path which should be checked.  */
-                               const struct cpu_key *p_s_key,  /* Key which should be checked.   */
--                              struct super_block *p_s_sb      /* Super block pointer.           */
-+                              struct super_block *sb  /* Super block pointer.    */
-     )
- {
-@@ -348,11 +348,11 @@ static inline int key_in_buffer(struct t
-       RFALSE(!PATH_PLAST_BUFFER(p_s_chk_path)->b_bdev,
-              "PAP-5060: device must not be NODEV");
--      if (comp_keys(get_lkey(p_s_chk_path, p_s_sb), p_s_key) == 1)
-+      if (comp_keys(get_lkey(p_s_chk_path, sb), p_s_key) == 1)
-               /* left delimiting key is bigger, that the key we look for */
-               return 0;
--      //  if ( comp_keys(p_s_key, get_rkey(p_s_chk_path, p_s_sb)) != -1 )
--      if (comp_keys(get_rkey(p_s_chk_path, p_s_sb), p_s_key) != 1)
-+      //  if ( comp_keys(p_s_key, get_rkey(p_s_chk_path, sb)) != -1 )
-+      if (comp_keys(get_rkey(p_s_chk_path, sb), p_s_key) != 1)
-               /* p_s_key must be less than right delimitiing key */
-               return 0;
-       return 1;
-@@ -546,7 +546,7 @@ static void search_by_key_reada(struct s
- /**************************************************************************
-  * Algorithm   SearchByKey                                                *
-  *             look for item in the Disk S+Tree by its key                *
-- * Input:  p_s_sb   -  super block                                        *
-+ * Input:  sb   -  super block                                            *
-  *         p_s_key  - pointer to the key to search                        *
-  * Output: ITEM_FOUND, ITEM_NOT_FOUND or IO_ERROR                         *
-  *         p_s_search_path - path from the root to the needed leaf        *
-@@ -566,7 +566,7 @@ static void search_by_key_reada(struct s
-    correctness of the top of the path but need not be checked for the
-    correctness of the bottom of the path */
- /* The function is NOT SCHEDULE-SAFE! */
--int search_by_key(struct super_block *p_s_sb, const struct cpu_key *p_s_key,  /* Key to search. */
-+int search_by_key(struct super_block *sb, const struct cpu_key *p_s_key,      /* Key to search. */
-                 struct treepath *p_s_search_path,/* This structure was
-                                                  allocated and initialized
-                                                  by the calling
-@@ -592,7 +592,7 @@ int search_by_key(struct super_block *p_
-       int n_repeat_counter = 0;
- #endif
--      PROC_INFO_INC(p_s_sb, search_by_key);
-+      PROC_INFO_INC(sb, search_by_key);
-       /* As we add each node to a path we increase its count.  This means that
-          we must be careful to release all nodes in a path before we either
-@@ -605,13 +605,13 @@ int search_by_key(struct super_block *p_
-       /* With each iteration of this loop we search through the items in the
-          current node, and calculate the next current node(next path element)
-          for the next iteration of this loop.. */
--      n_block_number = SB_ROOT_BLOCK(p_s_sb);
-+      n_block_number = SB_ROOT_BLOCK(sb);
-       expected_level = -1;
-       while (1) {
- #ifdef CONFIG_REISERFS_CHECK
-               if (!(++n_repeat_counter % 50000))
--                      reiserfs_warning(p_s_sb, "PAP-5100",
-+                      reiserfs_warning(sb, "PAP-5100",
-                                        "%s: there were %d iterations of "
-                                        "while loop looking for key %K",
-                                        current->comm, n_repeat_counter,
-@@ -622,14 +622,14 @@ int search_by_key(struct super_block *p_
-               p_s_last_element =
-                   PATH_OFFSET_PELEMENT(p_s_search_path,
-                                        ++p_s_search_path->path_length);
--              fs_gen = get_generation(p_s_sb);
-+              fs_gen = get_generation(sb);
-               /* Read the next tree node, and set the last element in the path to
-                  have a pointer to it. */
-               if ((p_s_bh = p_s_last_element->pe_buffer =
--                   sb_getblk(p_s_sb, n_block_number))) {
-+                   sb_getblk(sb, n_block_number))) {
-                       if (!buffer_uptodate(p_s_bh) && reada_count > 1) {
--                              search_by_key_reada(p_s_sb, reada_bh,
-+                              search_by_key_reada(sb, reada_bh,
-                                                   reada_blocks, reada_count);
-                       }
-                       ll_rw_block(READ, 1, &p_s_bh);
-@@ -644,25 +644,25 @@ int search_by_key(struct super_block *p_
-               }
-               reada_count = 0;
-               if (expected_level == -1)
--                      expected_level = SB_TREE_HEIGHT(p_s_sb);
-+                      expected_level = SB_TREE_HEIGHT(sb);
-               expected_level--;
-               /* It is possible that schedule occurred. We must check whether the key
-                  to search is still in the tree rooted from the current buffer. If
-                  not then repeat search from the root. */
--              if (fs_changed(fs_gen, p_s_sb) &&
-+              if (fs_changed(fs_gen, sb) &&
-                   (!B_IS_IN_TREE(p_s_bh) ||
-                    B_LEVEL(p_s_bh) != expected_level ||
--                   !key_in_buffer(p_s_search_path, p_s_key, p_s_sb))) {
--                      PROC_INFO_INC(p_s_sb, search_by_key_fs_changed);
--                      PROC_INFO_INC(p_s_sb, search_by_key_restarted);
--                      PROC_INFO_INC(p_s_sb,
-+                   !key_in_buffer(p_s_search_path, p_s_key, sb))) {
-+                      PROC_INFO_INC(sb, search_by_key_fs_changed);
-+                      PROC_INFO_INC(sb, search_by_key_restarted);
-+                      PROC_INFO_INC(sb,
-                                     sbk_restarted[expected_level - 1]);
-                       pathrelse(p_s_search_path);
-                       /* Get the root block number so that we can repeat the search
-                          starting from the root. */
--                      n_block_number = SB_ROOT_BLOCK(p_s_sb);
-+                      n_block_number = SB_ROOT_BLOCK(sb);
-                       expected_level = -1;
-                       right_neighbor_of_leaf_node = 0;
-@@ -674,12 +674,12 @@ int search_by_key(struct super_block *p_
-                  equal to the MAX_KEY. Latter case is only possible in
-                  "finish_unfinished()" processing during mount. */
-               RFALSE(comp_keys(&MAX_KEY, p_s_key) &&
--                     !key_in_buffer(p_s_search_path, p_s_key, p_s_sb),
-+                     !key_in_buffer(p_s_search_path, p_s_key, sb),
-                      "PAP-5130: key is not in the buffer");
- #ifdef CONFIG_REISERFS_CHECK
-               if (cur_tb) {
-                       print_cur_tb("5140");
--                      reiserfs_panic(p_s_sb, "PAP-5140",
-+                      reiserfs_panic(sb, "PAP-5140",
-                                      "schedule occurred in do_balance!");
-               }
- #endif
-@@ -687,7 +687,7 @@ int search_by_key(struct super_block *p_
-               // make sure, that the node contents look like a node of
-               // certain level
-               if (!is_tree_node(p_s_bh, expected_level)) {
--                      reiserfs_error(p_s_sb, "vs-5150",
-+                      reiserfs_error(sb, "vs-5150",
-                                      "invalid format found in block %ld. "
-                                      "Fsck?", p_s_bh->b_blocknr);
-                       pathrelse(p_s_search_path);
-@@ -697,7 +697,7 @@ int search_by_key(struct super_block *p_
-               /* ok, we have acquired next formatted node in the tree */
-               n_node_level = B_LEVEL(p_s_bh);
--              PROC_INFO_BH_STAT(p_s_sb, p_s_bh, n_node_level - 1);
-+              PROC_INFO_BH_STAT(sb, p_s_bh, n_node_level - 1);
-               RFALSE(n_node_level < n_stop_level,
-                      "vs-5152: tree level (%d) is less than stop level (%d)",
-@@ -776,7 +776,7 @@ int search_by_key(struct super_block *p_
-    units of directory entries.  */
- /* The function is NOT SCHEDULE-SAFE! */
--int search_for_position_by_key(struct super_block *p_s_sb,    /* Pointer to the super block.          */
-+int search_for_position_by_key(struct super_block *sb,        /* Pointer to the super block.          */
-                              const struct cpu_key *p_cpu_key, /* Key to search (cpu variable)         */
-                              struct treepath *p_s_search_path /* Filled up by this function.          */
-     )
-@@ -789,13 +789,13 @@ int search_for_position_by_key(struct su
-       /* If searching for directory entry. */
-       if (is_direntry_cpu_key(p_cpu_key))
--              return search_by_entry_key(p_s_sb, p_cpu_key, p_s_search_path,
-+              return search_by_entry_key(sb, p_cpu_key, p_s_search_path,
-                                          &de);
-       /* If not searching for directory entry. */
-       /* If item is found. */
--      retval = search_item(p_s_sb, p_cpu_key, p_s_search_path);
-+      retval = search_item(sb, p_cpu_key, p_s_search_path);
-       if (retval == IO_ERROR)
-               return retval;
-       if (retval == ITEM_FOUND) {
-@@ -817,7 +817,7 @@ int search_for_position_by_key(struct su
-       p_le_ih =
-           B_N_PITEM_HEAD(PATH_PLAST_BUFFER(p_s_search_path),
-                          --PATH_LAST_POSITION(p_s_search_path));
--      n_blk_size = p_s_sb->s_blocksize;
-+      n_blk_size = sb->s_blocksize;
-       if (comp_short_keys(&(p_le_ih->ih_key), p_cpu_key)) {
-               return FILE_NOT_FOUND;
-@@ -957,7 +957,7 @@ static char prepare_for_delete_or_cut(st
-                                     int *p_n_cut_size, unsigned long long n_new_file_length   /* MAX_KEY_OFFSET in case of delete. */
-     )
- {
--      struct super_block *p_s_sb = inode->i_sb;
-+      struct super_block *sb = inode->i_sb;
-       struct item_head *p_le_ih = PATH_PITEM_HEAD(p_s_path);
-       struct buffer_head *p_s_bh = PATH_PLAST_BUFFER(p_s_path);
-@@ -986,7 +986,7 @@ static char prepare_for_delete_or_cut(st
-       /* Case of an indirect item. */
-       {
--          int blk_size = p_s_sb->s_blocksize;
-+          int blk_size = sb->s_blocksize;
-           struct item_head s_ih;
-           int need_re_search;
-           int delete = 0;
-@@ -1023,9 +1023,9 @@ static char prepare_for_delete_or_cut(st
-                   block = get_block_num(unfm, 0);
-                   if (block != 0) {
--                      reiserfs_prepare_for_journal(p_s_sb, p_s_bh, 1);
-+                      reiserfs_prepare_for_journal(sb, p_s_bh, 1);
-                       put_block_num(unfm, 0, 0);
--                      journal_mark_dirty (th, p_s_sb, p_s_bh);
-+                      journal_mark_dirty (th, sb, p_s_bh);
-                       reiserfs_free_block(th, inode, block, 1);
-                   }
-@@ -1049,9 +1049,9 @@ static char prepare_for_delete_or_cut(st
-               /* a trick.  If the buffer has been logged, this will do nothing.  If
-               ** we've broken the loop without logging it, it will restore the
-               ** buffer */
--              reiserfs_restore_prepared_buffer(p_s_sb, p_s_bh);
-+              reiserfs_restore_prepared_buffer(sb, p_s_bh);
-           } while (need_re_search &&
--                   search_for_position_by_key(p_s_sb, p_s_item_key, p_s_path) == POSITION_FOUND);
-+                   search_for_position_by_key(sb, p_s_item_key, p_s_path) == POSITION_FOUND);
-           pos_in_item(p_s_path) = pos * UNFM_P_SIZE;
-           if (*p_n_cut_size == 0) {
-@@ -1090,7 +1090,7 @@ static int calc_deleted_bytes_number(str
- static void init_tb_struct(struct reiserfs_transaction_handle *th,
-                          struct tree_balance *p_s_tb,
--                         struct super_block *p_s_sb,
-+                         struct super_block *sb,
-                          struct treepath *p_s_path, int n_size)
- {
-@@ -1098,7 +1098,7 @@ static void init_tb_struct(struct reiser
-       memset(p_s_tb, '\0', sizeof(struct tree_balance));
-       p_s_tb->transaction_handle = th;
--      p_s_tb->tb_sb = p_s_sb;
-+      p_s_tb->tb_sb = sb;
-       p_s_tb->tb_path = p_s_path;
-       PATH_OFFSET_PBUFFER(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
-       PATH_OFFSET_POSITION(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
-@@ -1147,7 +1147,7 @@ int reiserfs_delete_item(struct reiserfs
-                        struct inode *p_s_inode,       /* inode is here just to update i_blocks and quotas */
-                        struct buffer_head *p_s_un_bh)
- {                             /* NULL or unformatted node pointer.    */
--      struct super_block *p_s_sb = p_s_inode->i_sb;
-+      struct super_block *sb = p_s_inode->i_sb;
-       struct tree_balance s_del_balance;
-       struct item_head s_ih;
-       struct item_head *q_ih;
-@@ -1161,7 +1161,7 @@ int reiserfs_delete_item(struct reiserfs
-       BUG_ON(!th->t_trans_id);
--      init_tb_struct(th, &s_del_balance, p_s_sb, p_s_path,
-+      init_tb_struct(th, &s_del_balance, sb, p_s_path,
-                      0 /*size is unknown */ );
-       while (1) {
-@@ -1185,15 +1185,15 @@ int reiserfs_delete_item(struct reiserfs
-               if (n_ret_value != REPEAT_SEARCH)
-                       break;
--              PROC_INFO_INC(p_s_sb, delete_item_restarted);
-+              PROC_INFO_INC(sb, delete_item_restarted);
-               // file system changed, repeat search
-               n_ret_value =
--                  search_for_position_by_key(p_s_sb, p_s_item_key, p_s_path);
-+                  search_for_position_by_key(sb, p_s_item_key, p_s_path);
-               if (n_ret_value == IO_ERROR)
-                       break;
-               if (n_ret_value == FILE_NOT_FOUND) {
--                      reiserfs_warning(p_s_sb, "vs-5340",
-+                      reiserfs_warning(sb, "vs-5340",
-                                        "no items of the file %K found",
-                                        p_s_item_key);
-                       break;
-@@ -1216,8 +1216,8 @@ int reiserfs_delete_item(struct reiserfs
-        ** the unfm node once
-        */
-       if (!S_ISLNK(p_s_inode->i_mode) && is_direct_le_ih(q_ih)) {
--              if ((le_ih_k_offset(q_ih) & (p_s_sb->s_blocksize - 1)) == 1) {
--                      quota_cut_bytes = p_s_sb->s_blocksize + UNFM_P_SIZE;
-+              if ((le_ih_k_offset(q_ih) & (sb->s_blocksize - 1)) == 1) {
-+                      quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
-               } else {
-                       quota_cut_bytes = 0;
-               }
-@@ -1258,7 +1258,7 @@ int reiserfs_delete_item(struct reiserfs
-       do_balance(&s_del_balance, NULL, NULL, M_DELETE);
- #ifdef REISERQUOTA_DEBUG
--      reiserfs_debug(p_s_sb, REISERFS_DEBUG_CODE,
-+      reiserfs_debug(sb, REISERFS_DEBUG_CODE,
-                      "reiserquota delete_item(): freeing %u, id=%u type=%c",
-                      quota_cut_bytes, p_s_inode->i_uid, head2type(&s_ih));
- #endif
-@@ -1430,8 +1430,8 @@ static int maybe_indirect_to_direct(stru
-                                   const struct cpu_key *p_s_item_key,
-                                   loff_t n_new_file_size, char *p_c_mode)
- {
--      struct super_block *p_s_sb = p_s_inode->i_sb;
--      int n_block_size = p_s_sb->s_blocksize;
-+      struct super_block *sb = p_s_inode->i_sb;
-+      int n_block_size = sb->s_blocksize;
-       int cut_bytes;
-       BUG_ON(!th->t_trans_id);
-       BUG_ON(n_new_file_size != p_s_inode->i_size);
-@@ -1509,7 +1509,7 @@ int reiserfs_cut_from_item(struct reiser
-                          struct inode *p_s_inode,
-                          struct page *page, loff_t n_new_file_size)
- {
--      struct super_block *p_s_sb = p_s_inode->i_sb;
-+      struct super_block *sb = p_s_inode->i_sb;
-       /* Every function which is going to call do_balance must first
-          create a tree_balance structure.  Then it must fill up this
-          structure by using the init_tb_struct and fix_nodes functions.
-@@ -1560,7 +1560,7 @@ int reiserfs_cut_from_item(struct reiser
-                       /* removing of last unformatted node will change value we
-                          have to return to truncate. Save it */
-                       retval2 = n_ret_value;
--                      /*retval2 = p_s_sb->s_blocksize - (n_new_file_size & (p_s_sb->s_blocksize - 1)); */
-+                      /*retval2 = sb->s_blocksize - (n_new_file_size & (sb->s_blocksize - 1)); */
-                       /* So, we have performed the first part of the conversion:
-                          inserting the new direct item.  Now we are removing the
-@@ -1569,16 +1569,16 @@ int reiserfs_cut_from_item(struct reiser
-                       set_cpu_key_k_type(p_s_item_key, TYPE_INDIRECT);
-                       p_s_item_key->key_length = 4;
-                       n_new_file_size -=
--                          (n_new_file_size & (p_s_sb->s_blocksize - 1));
-+                          (n_new_file_size & (sb->s_blocksize - 1));
-                       tail_pos = n_new_file_size;
-                       set_cpu_key_k_offset(p_s_item_key, n_new_file_size + 1);
-                       if (search_for_position_by_key
--                          (p_s_sb, p_s_item_key,
-+                          (sb, p_s_item_key,
-                            p_s_path) == POSITION_NOT_FOUND) {
-                               print_block(PATH_PLAST_BUFFER(p_s_path), 3,
-                                           PATH_LAST_POSITION(p_s_path) - 1,
-                                           PATH_LAST_POSITION(p_s_path) + 1);
--                              reiserfs_panic(p_s_sb, "PAP-5580", "item to "
-+                              reiserfs_panic(sb, "PAP-5580", "item to "
-                                              "convert does not exist (%K)",
-                                              p_s_item_key);
-                       }
-@@ -1595,14 +1595,14 @@ int reiserfs_cut_from_item(struct reiser
-               if (n_ret_value != REPEAT_SEARCH)
-                       break;
--              PROC_INFO_INC(p_s_sb, cut_from_item_restarted);
-+              PROC_INFO_INC(sb, cut_from_item_restarted);
-               n_ret_value =
--                  search_for_position_by_key(p_s_sb, p_s_item_key, p_s_path);
-+                  search_for_position_by_key(sb, p_s_item_key, p_s_path);
-               if (n_ret_value == POSITION_FOUND)
-                       continue;
--              reiserfs_warning(p_s_sb, "PAP-5610", "item %K not found",
-+              reiserfs_warning(sb, "PAP-5610", "item %K not found",
-                                p_s_item_key);
-               unfix_nodes(&s_cut_balance);
-               return (n_ret_value == IO_ERROR) ? -EIO : -ENOENT;
-@@ -1616,7 +1616,7 @@ int reiserfs_cut_from_item(struct reiser
-                       indirect_to_direct_roll_back(th, p_s_inode, p_s_path);
-               }
-               if (n_ret_value == NO_DISK_SPACE)
--                      reiserfs_warning(p_s_sb, "reiserfs-5092",
-+                      reiserfs_warning(sb, "reiserfs-5092",
-                                        "NO_DISK_SPACE");
-               unfix_nodes(&s_cut_balance);
-               return -EIO;
-@@ -1642,11 +1642,11 @@ int reiserfs_cut_from_item(struct reiser
-       p_le_ih = PATH_PITEM_HEAD(s_cut_balance.tb_path);
-       if (!S_ISLNK(p_s_inode->i_mode) && is_direct_le_ih(p_le_ih)) {
-               if (c_mode == M_DELETE &&
--                  (le_ih_k_offset(p_le_ih) & (p_s_sb->s_blocksize - 1)) ==
-+                  (le_ih_k_offset(p_le_ih) & (sb->s_blocksize - 1)) ==
-                   1) {
-                       // FIXME: this is to keep 3.5 happy
-                       REISERFS_I(p_s_inode)->i_first_direct_byte = U32_MAX;
--                      quota_cut_bytes = p_s_sb->s_blocksize + UNFM_P_SIZE;
-+                      quota_cut_bytes = sb->s_blocksize + UNFM_P_SIZE;
-               } else {
-                       quota_cut_bytes = 0;
-               }
-@@ -1659,18 +1659,18 @@ int reiserfs_cut_from_item(struct reiser
-                  sure, that we exactly remove last unformatted node pointer
-                  of the item */
-               if (!is_indirect_le_ih(le_ih))
--                      reiserfs_panic(p_s_sb, "vs-5652",
-+                      reiserfs_panic(sb, "vs-5652",
-                                      "item must be indirect %h", le_ih);
-               if (c_mode == M_DELETE && ih_item_len(le_ih) != UNFM_P_SIZE)
--                      reiserfs_panic(p_s_sb, "vs-5653", "completing "
-+                      reiserfs_panic(sb, "vs-5653", "completing "
-                                      "indirect2direct conversion indirect "
-                                      "item %h being deleted must be of "
-                                      "4 byte long", le_ih);
-               if (c_mode == M_CUT
-                   && s_cut_balance.insert_size[0] != -UNFM_P_SIZE) {
--                      reiserfs_panic(p_s_sb, "vs-5654", "can not complete "
-+                      reiserfs_panic(sb, "vs-5654", "can not complete "
-                                      "indirect2direct conversion of %h "
-                                      "(CUT, insert_size==%d)",
-                                      le_ih, s_cut_balance.insert_size[0]);
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -175,9 +175,9 @@ int indirect2direct(struct reiserfs_tran
-                   loff_t n_new_file_size,     /* New file size. */
-                   char *p_c_mode)
- {
--      struct super_block *p_s_sb = p_s_inode->i_sb;
-+      struct super_block *sb = p_s_inode->i_sb;
-       struct item_head s_ih;
--      unsigned long n_block_size = p_s_sb->s_blocksize;
-+      unsigned long n_block_size = sb->s_blocksize;
-       char *tail;
-       int tail_len, round_tail_len;
-       loff_t pos, pos1;       /* position of first byte of the tail */
-@@ -185,7 +185,7 @@ int indirect2direct(struct reiserfs_tran
-       BUG_ON(!th->t_trans_id);
--      REISERFS_SB(p_s_sb)->s_indirect2direct++;
-+      REISERFS_SB(sb)->s_indirect2direct++;
-       *p_c_mode = M_SKIP_BALANCING;
-@@ -200,7 +200,7 @@ int indirect2direct(struct reiserfs_tran
-       pos =
-           le_ih_k_offset(&s_ih) - 1 + (ih_item_len(&s_ih) / UNFM_P_SIZE -
--                                       1) * p_s_sb->s_blocksize;
-+                                       1) * sb->s_blocksize;
-       pos1 = pos;
-       // we are protected by i_mutex. The tail can not disapper, not
-@@ -211,18 +211,18 @@ int indirect2direct(struct reiserfs_tran
-       if (path_changed(&s_ih, p_s_path)) {
-               /* re-search indirect item */
--              if (search_for_position_by_key(p_s_sb, p_s_item_key, p_s_path)
-+              if (search_for_position_by_key(sb, p_s_item_key, p_s_path)
-                   == POSITION_NOT_FOUND)
--                      reiserfs_panic(p_s_sb, "PAP-5520",
-+                      reiserfs_panic(sb, "PAP-5520",
-                                      "item to be converted %K does not exist",
-                                      p_s_item_key);
-               copy_item_head(&s_ih, PATH_PITEM_HEAD(p_s_path));
- #ifdef CONFIG_REISERFS_CHECK
-               pos = le_ih_k_offset(&s_ih) - 1 +
-                   (ih_item_len(&s_ih) / UNFM_P_SIZE -
--                   1) * p_s_sb->s_blocksize;
-+                   1) * sb->s_blocksize;
-               if (pos != pos1)
--                      reiserfs_panic(p_s_sb, "vs-5530", "tail position "
-+                      reiserfs_panic(sb, "vs-5530", "tail position "
-                                      "changed while we were reading it");
- #endif
-       }
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1769,12 +1769,12 @@ int journal_end_sync(struct reiserfs_tra
- int journal_mark_freed(struct reiserfs_transaction_handle *,
-                      struct super_block *, b_blocknr_t blocknr);
- int journal_transaction_should_end(struct reiserfs_transaction_handle *, int);
--int reiserfs_in_journal(struct super_block *p_s_sb, unsigned int bmap_nr,
--                      int bit_nr, int searchall, b_blocknr_t *next);
-+int reiserfs_in_journal(struct super_block *sb, unsigned int bmap_nr,
-+                       int bit_nr, int searchall, b_blocknr_t *next);
- int journal_begin(struct reiserfs_transaction_handle *,
--                struct super_block *p_s_sb, unsigned long);
-+                struct super_block *sb, unsigned long);
- int journal_join_abort(struct reiserfs_transaction_handle *,
--                     struct super_block *p_s_sb, unsigned long);
-+                     struct super_block *sb, unsigned long);
- void reiserfs_abort_journal(struct super_block *sb, int errno);
- void reiserfs_abort(struct super_block *sb, int errno, const char *fmt, ...);
- int reiserfs_allocate_list_bitmaps(struct super_block *s,
-@@ -1830,11 +1830,11 @@ static inline void copy_key(struct reise
- int comp_items(const struct item_head *stored_ih, const struct treepath *p_s_path);
- const struct reiserfs_key *get_rkey(const struct treepath *p_s_chk_path,
--                                  const struct super_block *p_s_sb);
-+                                  const struct super_block *sb);
- int search_by_key(struct super_block *, const struct cpu_key *,
-                 struct treepath *, int);
- #define search_item(s,key,path) search_by_key (s, key, path, DISK_LEAF_NODE_LEVEL)
--int search_for_position_by_key(struct super_block *p_s_sb,
-+int search_for_position_by_key(struct super_block *sb,
-                              const struct cpu_key *p_s_cpu_key,
-                              struct treepath *p_s_search_path);
- extern void decrement_bcount(struct buffer_head *p_s_bh);
-@@ -1978,7 +1978,7 @@ int reiserfs_global_version_in_proc(char
- #define PROC_INFO_MAX( sb, field, value ) VOID_V
- #define PROC_INFO_INC( sb, field ) VOID_V
- #define PROC_INFO_ADD( sb, field, val ) VOID_V
--#define PROC_INFO_BH_STAT( p_s_sb, p_s_bh, n_node_level ) VOID_V
-+#define PROC_INFO_BH_STAT(sb, p_s_bh, n_node_level) VOID_V
- #endif
- /* dir.c */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_tb.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-rename-p_s_tb.diff
deleted file mode 100644 (file)
index c6b420e..0000000
+++ /dev/null
@@ -1,1040 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: rename p_s_tb to tb
-
- This patch is a simple s/p_s_tb/tb/g to the reiserfs code. This is the fourth
- in a series of patches to rip out some of the awful variable naming in
- reiserfs.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/fix_node.c      |  482 ++++++++++++++++++++++----------------------
- fs/reiserfs/stree.c         |   21 +
- include/linux/reiserfs_fs.h |    2 
- 3 files changed, 254 insertions(+), 251 deletions(-)
-
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -749,26 +749,26 @@ else \
-                 -1, -1);\
- }
--static void free_buffers_in_tb(struct tree_balance *p_s_tb)
-+static void free_buffers_in_tb(struct tree_balance *tb)
- {
-       int n_counter;
--      pathrelse(p_s_tb->tb_path);
-+      pathrelse(tb->tb_path);
-       for (n_counter = 0; n_counter < MAX_HEIGHT; n_counter++) {
--              brelse(p_s_tb->L[n_counter]);
--              brelse(p_s_tb->R[n_counter]);
--              brelse(p_s_tb->FL[n_counter]);
--              brelse(p_s_tb->FR[n_counter]);
--              brelse(p_s_tb->CFL[n_counter]);
--              brelse(p_s_tb->CFR[n_counter]);
--
--              p_s_tb->L[n_counter] = NULL;
--              p_s_tb->R[n_counter] = NULL;
--              p_s_tb->FL[n_counter] = NULL;
--              p_s_tb->FR[n_counter] = NULL;
--              p_s_tb->CFL[n_counter] = NULL;
--              p_s_tb->CFR[n_counter] = NULL;
-+              brelse(tb->L[n_counter]);
-+              brelse(tb->R[n_counter]);
-+              brelse(tb->FL[n_counter]);
-+              brelse(tb->FR[n_counter]);
-+              brelse(tb->CFL[n_counter]);
-+              brelse(tb->CFR[n_counter]);
-+
-+              tb->L[n_counter] = NULL;
-+              tb->R[n_counter] = NULL;
-+              tb->FL[n_counter] = NULL;
-+              tb->FR[n_counter] = NULL;
-+              tb->CFL[n_counter] = NULL;
-+              tb->CFR[n_counter] = NULL;
-       }
- }
-@@ -778,14 +778,14 @@ static void free_buffers_in_tb(struct tr
-  *            NO_DISK_SPACE - no disk space.
-  */
- /* The function is NOT SCHEDULE-SAFE! */
--static int get_empty_nodes(struct tree_balance *p_s_tb, int n_h)
-+static int get_empty_nodes(struct tree_balance *tb, int n_h)
- {
-       struct buffer_head *p_s_new_bh,
--          *p_s_Sh = PATH_H_PBUFFER(p_s_tb->tb_path, n_h);
-+          *p_s_Sh = PATH_H_PBUFFER(tb->tb_path, n_h);
-       b_blocknr_t *p_n_blocknr, a_n_blocknrs[MAX_AMOUNT_NEEDED] = { 0, };
-       int n_counter, n_number_of_freeblk, n_amount_needed,    /* number of needed empty blocks */
-        n_retval = CARRY_ON;
--      struct super_block *sb = p_s_tb->tb_sb;
-+      struct super_block *sb = tb->tb_sb;
-       /* number_of_freeblk is the number of empty blocks which have been
-          acquired for use by the balancing algorithm minus the number of
-@@ -803,15 +803,15 @@ static int get_empty_nodes(struct tree_b
-          the analysis or 0 if not restarted, then subtract the amount needed
-          by all of the levels of the tree below n_h. */
-       /* blknum includes S[n_h], so we subtract 1 in this calculation */
--      for (n_counter = 0, n_number_of_freeblk = p_s_tb->cur_blknum;
-+      for (n_counter = 0, n_number_of_freeblk = tb->cur_blknum;
-            n_counter < n_h; n_counter++)
-               n_number_of_freeblk -=
--                  (p_s_tb->blknum[n_counter]) ? (p_s_tb->blknum[n_counter] -
-+                  (tb->blknum[n_counter]) ? (tb->blknum[n_counter] -
-                                                  1) : 0;
-       /* Allocate missing empty blocks. */
-       /* if p_s_Sh == 0  then we are getting a new root */
--      n_amount_needed = (p_s_Sh) ? (p_s_tb->blknum[n_h] - 1) : 1;
-+      n_amount_needed = (p_s_Sh) ? (tb->blknum[n_h] - 1) : 1;
-       /*  Amount_needed = the amount that we need more than the amount that we have. */
-       if (n_amount_needed > n_number_of_freeblk)
-               n_amount_needed -= n_number_of_freeblk;
-@@ -819,7 +819,7 @@ static int get_empty_nodes(struct tree_b
-               return CARRY_ON;
-       /* No need to check quota - is not allocated for blocks used for formatted nodes */
--      if (reiserfs_new_form_blocknrs(p_s_tb, a_n_blocknrs,
-+      if (reiserfs_new_form_blocknrs(tb, a_n_blocknrs,
-                                      n_amount_needed) == NO_DISK_SPACE)
-               return NO_DISK_SPACE;
-@@ -838,14 +838,14 @@ static int get_empty_nodes(struct tree_b
-                      p_s_new_bh);
-               /* Put empty buffers into the array. */
--              RFALSE(p_s_tb->FEB[p_s_tb->cur_blknum],
-+              RFALSE(tb->FEB[tb->cur_blknum],
-                      "PAP-8141: busy slot for new buffer");
-               set_buffer_journal_new(p_s_new_bh);
--              p_s_tb->FEB[p_s_tb->cur_blknum++] = p_s_new_bh;
-+              tb->FEB[tb->cur_blknum++] = p_s_new_bh;
-       }
--      if (n_retval == CARRY_ON && FILESYSTEM_CHANGED_TB(p_s_tb))
-+      if (n_retval == CARRY_ON && FILESYSTEM_CHANGED_TB(tb))
-               n_retval = REPEAT_SEARCH;
-       return n_retval;
-@@ -896,33 +896,34 @@ static int get_rfree(struct tree_balance
- }
- /* Check whether left neighbor is in memory. */
--static int is_left_neighbor_in_cache(struct tree_balance *p_s_tb, int n_h)
-+static int is_left_neighbor_in_cache(struct tree_balance *tb, int n_h)
- {
-       struct buffer_head *p_s_father, *left;
--      struct super_block *sb = p_s_tb->tb_sb;
-+      struct super_block *sb = tb->tb_sb;
-       b_blocknr_t n_left_neighbor_blocknr;
-       int n_left_neighbor_position;
--      if (!p_s_tb->FL[n_h])   /* Father of the left neighbor does not exist. */
-+      /* Father of the left neighbor does not exist. */
-+      if (!tb->FL[n_h])
-               return 0;
-       /* Calculate father of the node to be balanced. */
--      p_s_father = PATH_H_PBUFFER(p_s_tb->tb_path, n_h + 1);
-+      p_s_father = PATH_H_PBUFFER(tb->tb_path, n_h + 1);
-       RFALSE(!p_s_father ||
-              !B_IS_IN_TREE(p_s_father) ||
--             !B_IS_IN_TREE(p_s_tb->FL[n_h]) ||
-+             !B_IS_IN_TREE(tb->FL[n_h]) ||
-              !buffer_uptodate(p_s_father) ||
--             !buffer_uptodate(p_s_tb->FL[n_h]),
-+             !buffer_uptodate(tb->FL[n_h]),
-              "vs-8165: F[h] (%b) or FL[h] (%b) is invalid",
--             p_s_father, p_s_tb->FL[n_h]);
-+             p_s_father, tb->FL[n_h]);
-       /* Get position of the pointer to the left neighbor into the left father. */
--      n_left_neighbor_position = (p_s_father == p_s_tb->FL[n_h]) ?
--          p_s_tb->lkey[n_h] : B_NR_ITEMS(p_s_tb->FL[n_h]);
-+      n_left_neighbor_position = (p_s_father == tb->FL[n_h]) ?
-+          tb->lkey[n_h] : B_NR_ITEMS(tb->FL[n_h]);
-       /* Get left neighbor block number. */
-       n_left_neighbor_blocknr =
--          B_N_CHILD_NUM(p_s_tb->FL[n_h], n_left_neighbor_position);
-+          B_N_CHILD_NUM(tb->FL[n_h], n_left_neighbor_position);
-       /* Look for the left neighbor in the cache. */
-       if ((left = sb_find_get_block(sb, n_left_neighbor_blocknr))) {
-@@ -953,14 +954,14 @@ static void decrement_key(struct cpu_key
-               SCHEDULE_OCCURRED - schedule occurred while the function worked;
-  *            CARRY_ON         - schedule didn't occur while the function worked;
-  */
--static int get_far_parent(struct tree_balance *p_s_tb,
-+static int get_far_parent(struct tree_balance *tb,
-                         int n_h,
-                         struct buffer_head **pp_s_father,
-                         struct buffer_head **pp_s_com_father, char c_lr_par)
- {
-       struct buffer_head *p_s_parent;
-       INITIALIZE_PATH(s_path_to_neighbor_father);
--      struct treepath *p_s_path = p_s_tb->tb_path;
-+      struct treepath *p_s_path = tb->tb_path;
-       struct cpu_key s_lr_father_key;
-       int n_counter,
-           n_position = INT_MAX,
-@@ -1005,9 +1006,9 @@ static int get_far_parent(struct tree_ba
-       if (n_counter == FIRST_PATH_ELEMENT_OFFSET) {
-               /* Check whether first buffer in the path is the root of the tree. */
-               if (PATH_OFFSET_PBUFFER
--                  (p_s_tb->tb_path,
-+                  (tb->tb_path,
-                    FIRST_PATH_ELEMENT_OFFSET)->b_blocknr ==
--                  SB_ROOT_BLOCK(p_s_tb->tb_sb)) {
-+                  SB_ROOT_BLOCK(tb->tb_sb)) {
-                       *pp_s_father = *pp_s_com_father = NULL;
-                       return CARRY_ON;
-               }
-@@ -1022,7 +1023,7 @@ static int get_far_parent(struct tree_ba
-       if (buffer_locked(*pp_s_com_father)) {
-               __wait_on_buffer(*pp_s_com_father);
--              if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+              if (FILESYSTEM_CHANGED_TB(tb)) {
-                       brelse(*pp_s_com_father);
-                       return REPEAT_SEARCH;
-               }
-@@ -1035,9 +1036,9 @@ static int get_far_parent(struct tree_ba
-       le_key2cpu_key(&s_lr_father_key,
-                      B_N_PDELIM_KEY(*pp_s_com_father,
-                                     (c_lr_par ==
--                                     LEFT_PARENTS) ? (p_s_tb->lkey[n_h - 1] =
-+                                     LEFT_PARENTS) ? (tb->lkey[n_h - 1] =
-                                                       n_position -
--                                                      1) : (p_s_tb->rkey[n_h -
-+                                                      1) : (tb->rkey[n_h -
-                                                                          1] =
-                                                             n_position)));
-@@ -1045,12 +1046,12 @@ static int get_far_parent(struct tree_ba
-               decrement_key(&s_lr_father_key);
-       if (search_by_key
--          (p_s_tb->tb_sb, &s_lr_father_key, &s_path_to_neighbor_father,
-+          (tb->tb_sb, &s_lr_father_key, &s_path_to_neighbor_father,
-            n_h + 1) == IO_ERROR)
-               // path is released
-               return IO_ERROR;
--      if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+      if (FILESYSTEM_CHANGED_TB(tb)) {
-               pathrelse(&s_path_to_neighbor_father);
-               brelse(*pp_s_com_father);
-               return REPEAT_SEARCH;
-@@ -1075,24 +1076,26 @@ static int get_far_parent(struct tree_ba
-  * Returns:   SCHEDULE_OCCURRED - schedule occurred while the function worked;
-  *            CARRY_ON - schedule didn't occur while the function worked;
-  */
--static int get_parents(struct tree_balance *p_s_tb, int n_h)
-+static int get_parents(struct tree_balance *tb, int n_h)
- {
--      struct treepath *p_s_path = p_s_tb->tb_path;
-+      struct treepath *p_s_path = tb->tb_path;
-       int n_position,
-           n_ret_value,
--          n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h);
-+          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
-       struct buffer_head *p_s_curf, *p_s_curcf;
-       /* Current node is the root of the tree or will be root of the tree */
-       if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-               /* The root can not have parents.
-                  Release nodes which previously were obtained as parents of the current node neighbors. */
--              brelse(p_s_tb->FL[n_h]);
--              brelse(p_s_tb->CFL[n_h]);
--              brelse(p_s_tb->FR[n_h]);
--              brelse(p_s_tb->CFR[n_h]);
--              p_s_tb->FL[n_h] = p_s_tb->CFL[n_h] = p_s_tb->FR[n_h] =
--                  p_s_tb->CFR[n_h] = NULL;
-+              brelse(tb->FL[n_h]);
-+              brelse(tb->CFL[n_h]);
-+              brelse(tb->FR[n_h]);
-+              brelse(tb->CFR[n_h]);
-+              tb->FL[n_h] = NULL;
-+              tb->CFL[n_h] = NULL;
-+              tb->FR[n_h] = NULL;
-+              tb->CFR[n_h] = NULL;
-               return CARRY_ON;
-       }
-@@ -1104,22 +1107,22 @@ static int get_parents(struct tree_balan
-                   PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1);
-               get_bh(p_s_curf);
-               get_bh(p_s_curf);
--              p_s_tb->lkey[n_h] = n_position - 1;
-+              tb->lkey[n_h] = n_position - 1;
-       } else {
-               /* Calculate current parent of L[n_path_offset], which is the left neighbor of the current node.
-                  Calculate current common parent of L[n_path_offset] and the current node. Note that
-                  CFL[n_path_offset] not equal FL[n_path_offset] and CFL[n_path_offset] not equal F[n_path_offset].
-                  Calculate lkey[n_path_offset]. */
--              if ((n_ret_value = get_far_parent(p_s_tb, n_h + 1, &p_s_curf,
-+              if ((n_ret_value = get_far_parent(tb, n_h + 1, &p_s_curf,
-                                                 &p_s_curcf,
-                                                 LEFT_PARENTS)) != CARRY_ON)
-                       return n_ret_value;
-       }
--      brelse(p_s_tb->FL[n_h]);
--      p_s_tb->FL[n_h] = p_s_curf;     /* New initialization of FL[n_h]. */
--      brelse(p_s_tb->CFL[n_h]);
--      p_s_tb->CFL[n_h] = p_s_curcf;   /* New initialization of CFL[n_h]. */
-+      brelse(tb->FL[n_h]);
-+      tb->FL[n_h] = p_s_curf; /* New initialization of FL[n_h]. */
-+      brelse(tb->CFL[n_h]);
-+      tb->CFL[n_h] = p_s_curcf;       /* New initialization of CFL[n_h]. */
-       RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
-              (p_s_curcf && !B_IS_IN_TREE(p_s_curcf)),
-@@ -1133,7 +1136,7 @@ static int get_parents(struct tree_balan
-    Calculate current common parent of R[n_h] and current node. Note that CFR[n_h]
-    not equal FR[n_path_offset] and CFR[n_h] not equal F[n_h]. */
-               if ((n_ret_value =
--                   get_far_parent(p_s_tb, n_h + 1, &p_s_curf, &p_s_curcf,
-+                   get_far_parent(tb, n_h + 1, &p_s_curf, &p_s_curcf,
-                                   RIGHT_PARENTS)) != CARRY_ON)
-                       return n_ret_value;
-       } else {
-@@ -1143,14 +1146,16 @@ static int get_parents(struct tree_balan
-                   PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1);
-               get_bh(p_s_curf);
-               get_bh(p_s_curf);
--              p_s_tb->rkey[n_h] = n_position;
-+              tb->rkey[n_h] = n_position;
-       }
--      brelse(p_s_tb->FR[n_h]);
--      p_s_tb->FR[n_h] = p_s_curf;     /* New initialization of FR[n_path_offset]. */
-+      brelse(tb->FR[n_h]);
-+      /* New initialization of FR[n_path_offset]. */
-+      tb->FR[n_h] = p_s_curf;
--      brelse(p_s_tb->CFR[n_h]);
--      p_s_tb->CFR[n_h] = p_s_curcf;   /* New initialization of CFR[n_path_offset]. */
-+      brelse(tb->CFR[n_h]);
-+      /* New initialization of CFR[n_path_offset]. */
-+      tb->CFR[n_h] = p_s_curcf;
-       RFALSE((p_s_curf && !B_IS_IN_TREE(p_s_curf)) ||
-              (p_s_curcf && !B_IS_IN_TREE(p_s_curcf)),
-@@ -1885,12 +1890,12 @@ static int check_balance(int mode,
- }
- /* Check whether parent at the path is the really parent of the current node.*/
--static int get_direct_parent(struct tree_balance *p_s_tb, int n_h)
-+static int get_direct_parent(struct tree_balance *tb, int n_h)
- {
-       struct buffer_head *bh;
--      struct treepath *p_s_path = p_s_tb->tb_path;
-+      struct treepath *p_s_path = tb->tb_path;
-       int n_position,
--          n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h);
-+          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h);
-       /* We are in the root or in the new root. */
-       if (n_path_offset <= FIRST_PATH_ELEMENT_OFFSET) {
-@@ -1899,7 +1904,7 @@ static int get_direct_parent(struct tree
-                      "PAP-8260: invalid offset in the path");
-               if (PATH_OFFSET_PBUFFER(p_s_path, FIRST_PATH_ELEMENT_OFFSET)->
--                  b_blocknr == SB_ROOT_BLOCK(p_s_tb->tb_sb)) {
-+                  b_blocknr == SB_ROOT_BLOCK(tb->tb_sb)) {
-                       /* Root is not changed. */
-                       PATH_OFFSET_PBUFFER(p_s_path, n_path_offset - 1) = NULL;
-                       PATH_OFFSET_POSITION(p_s_path, n_path_offset - 1) = 0;
-@@ -1924,7 +1929,7 @@ static int get_direct_parent(struct tree
-       if (buffer_locked(bh)) {
-               __wait_on_buffer(bh);
--              if (FILESYSTEM_CHANGED_TB(p_s_tb))
-+              if (FILESYSTEM_CHANGED_TB(tb))
-                       return REPEAT_SEARCH;
-       }
-@@ -1937,85 +1942,86 @@ static int get_direct_parent(struct tree
-  * Returns:   SCHEDULE_OCCURRED - schedule occurred while the function worked;
-  *            CARRY_ON - schedule didn't occur while the function worked;
-  */
--static int get_neighbors(struct tree_balance *p_s_tb, int n_h)
-+static int get_neighbors(struct tree_balance *tb, int n_h)
- {
-       int n_child_position,
--          n_path_offset = PATH_H_PATH_OFFSET(p_s_tb->tb_path, n_h + 1);
-+          n_path_offset = PATH_H_PATH_OFFSET(tb->tb_path, n_h + 1);
-       unsigned long n_son_number;
--      struct super_block *sb = p_s_tb->tb_sb;
-+      struct super_block *sb = tb->tb_sb;
-       struct buffer_head *bh;
-       PROC_INFO_INC(sb, get_neighbors[n_h]);
--      if (p_s_tb->lnum[n_h]) {
-+      if (tb->lnum[n_h]) {
-               /* We need left neighbor to balance S[n_h]. */
-               PROC_INFO_INC(sb, need_l_neighbor[n_h]);
--              bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-+              bh = PATH_OFFSET_PBUFFER(tb->tb_path, n_path_offset);
--              RFALSE(bh == p_s_tb->FL[n_h] &&
--                     !PATH_OFFSET_POSITION(p_s_tb->tb_path, n_path_offset),
-+              RFALSE(bh == tb->FL[n_h] &&
-+                     !PATH_OFFSET_POSITION(tb->tb_path, n_path_offset),
-                      "PAP-8270: invalid position in the parent");
-               n_child_position =
-                   (bh ==
--                   p_s_tb->FL[n_h]) ? p_s_tb->lkey[n_h] : B_NR_ITEMS(p_s_tb->
-+                   tb->FL[n_h]) ? tb->lkey[n_h] : B_NR_ITEMS(tb->
-                                                                      FL[n_h]);
--              n_son_number = B_N_CHILD_NUM(p_s_tb->FL[n_h], n_child_position);
-+              n_son_number = B_N_CHILD_NUM(tb->FL[n_h], n_child_position);
-               bh = sb_bread(sb, n_son_number);
-               if (!bh)
-                       return IO_ERROR;
--              if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+              if (FILESYSTEM_CHANGED_TB(tb)) {
-                       brelse(bh);
-                       PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
--              RFALSE(!B_IS_IN_TREE(p_s_tb->FL[n_h]) ||
--                     n_child_position > B_NR_ITEMS(p_s_tb->FL[n_h]) ||
--                     B_N_CHILD_NUM(p_s_tb->FL[n_h], n_child_position) !=
-+              RFALSE(!B_IS_IN_TREE(tb->FL[n_h]) ||
-+                     n_child_position > B_NR_ITEMS(tb->FL[n_h]) ||
-+                     B_N_CHILD_NUM(tb->FL[n_h], n_child_position) !=
-                      bh->b_blocknr, "PAP-8275: invalid parent");
-               RFALSE(!B_IS_IN_TREE(bh), "PAP-8280: invalid child");
-               RFALSE(!n_h &&
-                      B_FREE_SPACE(bh) !=
-                      MAX_CHILD_SIZE(bh) -
--                     dc_size(B_N_CHILD(p_s_tb->FL[0], n_child_position)),
-+                     dc_size(B_N_CHILD(tb->FL[0], n_child_position)),
-                      "PAP-8290: invalid child size of left neighbor");
--              brelse(p_s_tb->L[n_h]);
--              p_s_tb->L[n_h] = bh;
-+              brelse(tb->L[n_h]);
-+              tb->L[n_h] = bh;
-       }
--      if (p_s_tb->rnum[n_h]) {        /* We need right neighbor to balance S[n_path_offset]. */
-+      /* We need right neighbor to balance S[n_path_offset]. */
-+      if (tb->rnum[n_h]) {
-               PROC_INFO_INC(sb, need_r_neighbor[n_h]);
--              bh = PATH_OFFSET_PBUFFER(p_s_tb->tb_path, n_path_offset);
-+              bh = PATH_OFFSET_PBUFFER(tb->tb_path, n_path_offset);
--              RFALSE(bh == p_s_tb->FR[n_h] &&
--                     PATH_OFFSET_POSITION(p_s_tb->tb_path,
-+              RFALSE(bh == tb->FR[n_h] &&
-+                     PATH_OFFSET_POSITION(tb->tb_path,
-                                           n_path_offset) >=
-                      B_NR_ITEMS(bh),
-                      "PAP-8295: invalid position in the parent");
-               n_child_position =
--                  (bh == p_s_tb->FR[n_h]) ? p_s_tb->rkey[n_h] + 1 : 0;
--              n_son_number = B_N_CHILD_NUM(p_s_tb->FR[n_h], n_child_position);
-+                  (bh == tb->FR[n_h]) ? tb->rkey[n_h] + 1 : 0;
-+              n_son_number = B_N_CHILD_NUM(tb->FR[n_h], n_child_position);
-               bh = sb_bread(sb, n_son_number);
-               if (!bh)
-                       return IO_ERROR;
--              if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+              if (FILESYSTEM_CHANGED_TB(tb)) {
-                       brelse(bh);
-                       PROC_INFO_INC(sb, get_neighbors_restart[n_h]);
-                       return REPEAT_SEARCH;
-               }
--              brelse(p_s_tb->R[n_h]);
--              p_s_tb->R[n_h] = bh;
-+              brelse(tb->R[n_h]);
-+              tb->R[n_h] = bh;
-               RFALSE(!n_h
-                      && B_FREE_SPACE(bh) !=
-                      MAX_CHILD_SIZE(bh) -
--                     dc_size(B_N_CHILD(p_s_tb->FR[0], n_child_position)),
-+                     dc_size(B_N_CHILD(tb->FR[0], n_child_position)),
-                      "PAP-8300: invalid child size of right neighbor (%d != %d - %d)",
-                      B_FREE_SPACE(bh), MAX_CHILD_SIZE(bh),
--                     dc_size(B_N_CHILD(p_s_tb->FR[0], n_child_position)));
-+                     dc_size(B_N_CHILD(tb->FR[0], n_child_position)));
-       }
-       return CARRY_ON;
-@@ -2139,7 +2145,7 @@ static int clear_all_dirty_bits(struct s
-       return reiserfs_prepare_for_journal(s, bh, 0);
- }
--static int wait_tb_buffers_until_unlocked(struct tree_balance *p_s_tb)
-+static int wait_tb_buffers_until_unlocked(struct tree_balance *tb)
- {
-       struct buffer_head *locked;
- #ifdef CONFIG_REISERFS_CHECK
-@@ -2151,95 +2157,94 @@ static int wait_tb_buffers_until_unlocke
-               locked = NULL;
--              for (i = p_s_tb->tb_path->path_length;
-+              for (i = tb->tb_path->path_length;
-                    !locked && i > ILLEGAL_PATH_ELEMENT_OFFSET; i--) {
--                      if (PATH_OFFSET_PBUFFER(p_s_tb->tb_path, i)) {
-+                      if (PATH_OFFSET_PBUFFER(tb->tb_path, i)) {
-                               /* if I understand correctly, we can only be sure the last buffer
-                                ** in the path is in the tree --clm
-                                */
- #ifdef CONFIG_REISERFS_CHECK
--                              if (PATH_PLAST_BUFFER(p_s_tb->tb_path) ==
--                                  PATH_OFFSET_PBUFFER(p_s_tb->tb_path, i)) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
-+                              if (PATH_PLAST_BUFFER(tb->tb_path) ==
-+                                  PATH_OFFSET_PBUFFER(tb->tb_path, i))
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-                                                              PATH_OFFSET_PBUFFER
--                                                             (p_s_tb->tb_path,
-+                                                             (tb->tb_path,
-                                                               i), "S",
--                                                             p_s_tb->tb_path->
-+                                                             tb->tb_path->
-                                                              path_length - i);
--                              }
- #endif
--                              if (!clear_all_dirty_bits(p_s_tb->tb_sb,
-+                              if (!clear_all_dirty_bits(tb->tb_sb,
-                                                         PATH_OFFSET_PBUFFER
--                                                        (p_s_tb->tb_path,
-+                                                        (tb->tb_path,
-                                                          i))) {
-                                       locked =
--                                          PATH_OFFSET_PBUFFER(p_s_tb->tb_path,
-+                                          PATH_OFFSET_PBUFFER(tb->tb_path,
-                                                               i);
-                               }
-                       }
-               }
--              for (i = 0; !locked && i < MAX_HEIGHT && p_s_tb->insert_size[i];
-+              for (i = 0; !locked && i < MAX_HEIGHT && tb->insert_size[i];
-                    i++) {
--                      if (p_s_tb->lnum[i]) {
-+                      if (tb->lnum[i]) {
--                              if (p_s_tb->L[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->L[i],
-+                              if (tb->L[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->L[i],
-                                                              "L", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->L[i]))
--                                              locked = p_s_tb->L[i];
-+                                          (tb->tb_sb, tb->L[i]))
-+                                              locked = tb->L[i];
-                               }
--                              if (!locked && p_s_tb->FL[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->FL[i],
-+                              if (!locked && tb->FL[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->FL[i],
-                                                              "FL", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->FL[i]))
--                                              locked = p_s_tb->FL[i];
-+                                          (tb->tb_sb, tb->FL[i]))
-+                                              locked = tb->FL[i];
-                               }
--                              if (!locked && p_s_tb->CFL[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->CFL[i],
-+                              if (!locked && tb->CFL[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->CFL[i],
-                                                              "CFL", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->CFL[i]))
--                                              locked = p_s_tb->CFL[i];
-+                                          (tb->tb_sb, tb->CFL[i]))
-+                                              locked = tb->CFL[i];
-                               }
-                       }
--                      if (!locked && (p_s_tb->rnum[i])) {
-+                      if (!locked && (tb->rnum[i])) {
--                              if (p_s_tb->R[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->R[i],
-+                              if (tb->R[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->R[i],
-                                                              "R", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->R[i]))
--                                              locked = p_s_tb->R[i];
-+                                          (tb->tb_sb, tb->R[i]))
-+                                              locked = tb->R[i];
-                               }
--                              if (!locked && p_s_tb->FR[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->FR[i],
-+                              if (!locked && tb->FR[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->FR[i],
-                                                              "FR", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->FR[i]))
--                                              locked = p_s_tb->FR[i];
-+                                          (tb->tb_sb, tb->FR[i]))
-+                                              locked = tb->FR[i];
-                               }
--                              if (!locked && p_s_tb->CFR[i]) {
--                                      tb_buffer_sanity_check(p_s_tb->tb_sb,
--                                                             p_s_tb->CFR[i],
-+                              if (!locked && tb->CFR[i]) {
-+                                      tb_buffer_sanity_check(tb->tb_sb,
-+                                                             tb->CFR[i],
-                                                              "CFR", i);
-                                       if (!clear_all_dirty_bits
--                                          (p_s_tb->tb_sb, p_s_tb->CFR[i]))
--                                              locked = p_s_tb->CFR[i];
-+                                          (tb->tb_sb, tb->CFR[i]))
-+                                              locked = tb->CFR[i];
-                               }
-                       }
-               }
-@@ -2252,10 +2257,10 @@ static int wait_tb_buffers_until_unlocke
-                ** --clm
-                */
-               for (i = 0; !locked && i < MAX_FEB_SIZE; i++) {
--                      if (p_s_tb->FEB[i]) {
-+                      if (tb->FEB[i]) {
-                               if (!clear_all_dirty_bits
--                                  (p_s_tb->tb_sb, p_s_tb->FEB[i]))
--                                      locked = p_s_tb->FEB[i];
-+                                  (tb->tb_sb, tb->FEB[i]))
-+                                      locked = tb->FEB[i];
-                       }
-               }
-@@ -2263,21 +2268,20 @@ static int wait_tb_buffers_until_unlocke
- #ifdef CONFIG_REISERFS_CHECK
-                       repeat_counter++;
-                       if ((repeat_counter % 10000) == 0) {
--                              reiserfs_warning(p_s_tb->tb_sb, "reiserfs-8200",
-+                              reiserfs_warning(tb->tb_sb, "reiserfs-8200",
-                                                "too many iterations waiting "
-                                                "for buffer to unlock "
-                                                "(%b)", locked);
-                               /* Don't loop forever.  Try to recover from possible error. */
--                              return (FILESYSTEM_CHANGED_TB(p_s_tb)) ?
-+                              return (FILESYSTEM_CHANGED_TB(tb)) ?
-                                   REPEAT_SEARCH : CARRY_ON;
-                       }
- #endif
-                       __wait_on_buffer(locked);
--                      if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+                      if (FILESYSTEM_CHANGED_TB(tb))
-                               return REPEAT_SEARCH;
--                      }
-               }
-       } while (locked);
-@@ -2307,138 +2311,136 @@ static int wait_tb_buffers_until_unlocke
-  *    tb      tree_balance structure;
-  *    inum    item number in S[h];
-  *      pos_in_item - comment this if you can
-- *      ins_ih & ins_sd are used when inserting
-+ *      ins_ih        item head of item being inserted
-+ *    data    inserted item or data to be pasted
-  * Returns:   1 - schedule occurred while the function worked;
-  *            0 - schedule didn't occur while the function worked;
-  *             -1 - if no_disk_space
-  */
--int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb, struct item_head *p_s_ins_ih,       // item head of item being inserted
--            const void *data  // inserted item or data to be pasted
--    )
-+int fix_nodes(int n_op_mode, struct tree_balance *tb,
-+            struct item_head *p_s_ins_ih, const void *data)
- {
--      int n_ret_value, n_h, n_item_num = PATH_LAST_POSITION(p_s_tb->tb_path);
-+      int n_ret_value, n_h, n_item_num = PATH_LAST_POSITION(tb->tb_path);
-       int n_pos_in_item;
-       /* we set wait_tb_buffers_run when we have to restore any dirty bits cleared
-        ** during wait_tb_buffers_run
-        */
-       int wait_tb_buffers_run = 0;
--      struct buffer_head *p_s_tbS0 = PATH_PLAST_BUFFER(p_s_tb->tb_path);
-+      struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
--      ++REISERFS_SB(p_s_tb->tb_sb)->s_fix_nodes;
-+      ++REISERFS_SB(tb->tb_sb)->s_fix_nodes;
--      n_pos_in_item = p_s_tb->tb_path->pos_in_item;
-+      n_pos_in_item = tb->tb_path->pos_in_item;
--      p_s_tb->fs_gen = get_generation(p_s_tb->tb_sb);
-+      tb->fs_gen = get_generation(tb->tb_sb);
-       /* we prepare and log the super here so it will already be in the
-        ** transaction when do_balance needs to change it.
-        ** This way do_balance won't have to schedule when trying to prepare
-        ** the super for logging
-        */
--      reiserfs_prepare_for_journal(p_s_tb->tb_sb,
--                                   SB_BUFFER_WITH_SB(p_s_tb->tb_sb), 1);
--      journal_mark_dirty(p_s_tb->transaction_handle, p_s_tb->tb_sb,
--                         SB_BUFFER_WITH_SB(p_s_tb->tb_sb));
--      if (FILESYSTEM_CHANGED_TB(p_s_tb))
-+      reiserfs_prepare_for_journal(tb->tb_sb,
-+                                   SB_BUFFER_WITH_SB(tb->tb_sb), 1);
-+      journal_mark_dirty(tb->transaction_handle, tb->tb_sb,
-+                         SB_BUFFER_WITH_SB(tb->tb_sb));
-+      if (FILESYSTEM_CHANGED_TB(tb))
-               return REPEAT_SEARCH;
-       /* if it possible in indirect_to_direct conversion */
--      if (buffer_locked(p_s_tbS0)) {
--              __wait_on_buffer(p_s_tbS0);
--              if (FILESYSTEM_CHANGED_TB(p_s_tb))
-+      if (buffer_locked(tbS0)) {
-+              __wait_on_buffer(tbS0);
-+              if (FILESYSTEM_CHANGED_TB(tb))
-                       return REPEAT_SEARCH;
-       }
- #ifdef CONFIG_REISERFS_CHECK
-       if (cur_tb) {
-               print_cur_tb("fix_nodes");
--              reiserfs_panic(p_s_tb->tb_sb, "PAP-8305",
-+              reiserfs_panic(tb->tb_sb, "PAP-8305",
-                              "there is pending do_balance");
-       }
--      if (!buffer_uptodate(p_s_tbS0) || !B_IS_IN_TREE(p_s_tbS0)) {
--              reiserfs_panic(p_s_tb->tb_sb, "PAP-8320", "S[0] (%b %z) is "
-+      if (!buffer_uptodate(tbS0) || !B_IS_IN_TREE(tbS0))
-+              reiserfs_panic(tb->tb_sb, "PAP-8320", "S[0] (%b %z) is "
-                              "not uptodate at the beginning of fix_nodes "
-                              "or not in tree (mode %c)",
--                             p_s_tbS0, p_s_tbS0, n_op_mode);
--      }
-+                             tbS0, tbS0, n_op_mode);
-       /* Check parameters. */
-       switch (n_op_mode) {
-       case M_INSERT:
--              if (n_item_num <= 0 || n_item_num > B_NR_ITEMS(p_s_tbS0))
--                      reiserfs_panic(p_s_tb->tb_sb, "PAP-8330", "Incorrect "
-+              if (n_item_num <= 0 || n_item_num > B_NR_ITEMS(tbS0))
-+                      reiserfs_panic(tb->tb_sb, "PAP-8330", "Incorrect "
-                                      "item number %d (in S0 - %d) in case "
-                                      "of insert", n_item_num,
--                                     B_NR_ITEMS(p_s_tbS0));
-+                                     B_NR_ITEMS(tbS0));
-               break;
-       case M_PASTE:
-       case M_DELETE:
-       case M_CUT:
--              if (n_item_num < 0 || n_item_num >= B_NR_ITEMS(p_s_tbS0)) {
--                      print_block(p_s_tbS0, 0, -1, -1);
--                      reiserfs_panic(p_s_tb->tb_sb, "PAP-8335", "Incorrect "
-+              if (n_item_num < 0 || n_item_num >= B_NR_ITEMS(tbS0)) {
-+                      print_block(tbS0, 0, -1, -1);
-+                      reiserfs_panic(tb->tb_sb, "PAP-8335", "Incorrect "
-                                      "item number(%d); mode = %c "
-                                      "insert_size = %d",
-                                      n_item_num, n_op_mode,
--                                     p_s_tb->insert_size[0]);
-+                                     tb->insert_size[0]);
-               }
-               break;
-       default:
--              reiserfs_panic(p_s_tb->tb_sb, "PAP-8340", "Incorrect mode "
-+              reiserfs_panic(tb->tb_sb, "PAP-8340", "Incorrect mode "
-                              "of operation");
-       }
- #endif
--      if (get_mem_for_virtual_node(p_s_tb) == REPEAT_SEARCH)
-+      if (get_mem_for_virtual_node(tb) == REPEAT_SEARCH)
-               // FIXME: maybe -ENOMEM when tb->vn_buf == 0? Now just repeat
-               return REPEAT_SEARCH;
-       /* Starting from the leaf level; for all levels n_h of the tree. */
--      for (n_h = 0; n_h < MAX_HEIGHT && p_s_tb->insert_size[n_h]; n_h++) {
--              if ((n_ret_value = get_direct_parent(p_s_tb, n_h)) != CARRY_ON) {
-+      for (n_h = 0; n_h < MAX_HEIGHT && tb->insert_size[n_h]; n_h++) {
-+              n_ret_value = get_direct_parent(tb, n_h);
-+              if (n_ret_value != CARRY_ON)
-                       goto repeat;
--              }
--              if ((n_ret_value =
--                   check_balance(n_op_mode, p_s_tb, n_h, n_item_num,
--                                 n_pos_in_item, p_s_ins_ih,
--                                 data)) != CARRY_ON) {
-+              n_ret_value = check_balance(n_op_mode, tb, n_h, n_item_num,
-+                                          n_pos_in_item, p_s_ins_ih, data);
-+              if (n_ret_value != CARRY_ON) {
-                       if (n_ret_value == NO_BALANCING_NEEDED) {
-                               /* No balancing for higher levels needed. */
--                              if ((n_ret_value =
--                                   get_neighbors(p_s_tb, n_h)) != CARRY_ON) {
-+                              n_ret_value = get_neighbors(tb, n_h);
-+                              if (n_ret_value != CARRY_ON)
-                                       goto repeat;
--                              }
-                               if (n_h != MAX_HEIGHT - 1)
--                                      p_s_tb->insert_size[n_h + 1] = 0;
-+                                      tb->insert_size[n_h + 1] = 0;
-                               /* ok, analysis and resource gathering are complete */
-                               break;
-                       }
-                       goto repeat;
-               }
--              if ((n_ret_value = get_neighbors(p_s_tb, n_h)) != CARRY_ON) {
-+              n_ret_value = get_neighbors(tb, n_h);
-+              if (n_ret_value != CARRY_ON)
-                       goto repeat;
--              }
--              if ((n_ret_value = get_empty_nodes(p_s_tb, n_h)) != CARRY_ON) {
--                      goto repeat;    /* No disk space, or schedule occurred and
--                                         analysis may be invalid and needs to be redone. */
--              }
-+              /* No disk space, or schedule occurred and analysis may be
-+               * invalid and needs to be redone. */
-+              n_ret_value = get_empty_nodes(tb, n_h);
-+              if (n_ret_value != CARRY_ON)
-+                      goto repeat;
--              if (!PATH_H_PBUFFER(p_s_tb->tb_path, n_h)) {
-+              if (!PATH_H_PBUFFER(tb->tb_path, n_h)) {
-                       /* We have a positive insert size but no nodes exist on this
-                          level, this means that we are creating a new root. */
--                      RFALSE(p_s_tb->blknum[n_h] != 1,
-+                      RFALSE(tb->blknum[n_h] != 1,
-                              "PAP-8350: creating new empty root");
-                       if (n_h < MAX_HEIGHT - 1)
--                              p_s_tb->insert_size[n_h + 1] = 0;
--              } else if (!PATH_H_PBUFFER(p_s_tb->tb_path, n_h + 1)) {
--                      if (p_s_tb->blknum[n_h] > 1) {
-+                              tb->insert_size[n_h + 1] = 0;
-+              } else if (!PATH_H_PBUFFER(tb->tb_path, n_h + 1)) {
-+                      if (tb->blknum[n_h] > 1) {
-                               /* The tree needs to be grown, so this node S[n_h]
-                                  which is the root node is split into two nodes,
-                                  and a new node (S[n_h+1]) will be created to
-@@ -2447,19 +2449,20 @@ int fix_nodes(int n_op_mode, struct tree
-                               RFALSE(n_h == MAX_HEIGHT - 1,
-                                      "PAP-8355: attempt to create too high of a tree");
--                              p_s_tb->insert_size[n_h + 1] =
-+                              tb->insert_size[n_h + 1] =
-                                   (DC_SIZE +
--                                   KEY_SIZE) * (p_s_tb->blknum[n_h] - 1) +
-+                                   KEY_SIZE) * (tb->blknum[n_h] - 1) +
-                                   DC_SIZE;
-                       } else if (n_h < MAX_HEIGHT - 1)
--                              p_s_tb->insert_size[n_h + 1] = 0;
-+                              tb->insert_size[n_h + 1] = 0;
-               } else
--                      p_s_tb->insert_size[n_h + 1] =
--                          (DC_SIZE + KEY_SIZE) * (p_s_tb->blknum[n_h] - 1);
-+                      tb->insert_size[n_h + 1] =
-+                          (DC_SIZE + KEY_SIZE) * (tb->blknum[n_h] - 1);
-       }
--      if ((n_ret_value = wait_tb_buffers_until_unlocked(p_s_tb)) == CARRY_ON) {
--              if (FILESYSTEM_CHANGED_TB(p_s_tb)) {
-+      n_ret_value = wait_tb_buffers_until_unlocked(tb);
-+      if (n_ret_value == CARRY_ON) {
-+              if (FILESYSTEM_CHANGED_TB(tb)) {
-                       wait_tb_buffers_run = 1;
-                       n_ret_value = REPEAT_SEARCH;
-                       goto repeat;
-@@ -2482,50 +2485,49 @@ int fix_nodes(int n_op_mode, struct tree
-               /* Release path buffers. */
-               if (wait_tb_buffers_run) {
--                      pathrelse_and_restore(p_s_tb->tb_sb, p_s_tb->tb_path);
-+                      pathrelse_and_restore(tb->tb_sb, tb->tb_path);
-               } else {
--                      pathrelse(p_s_tb->tb_path);
-+                      pathrelse(tb->tb_path);
-               }
-               /* brelse all resources collected for balancing */
-               for (i = 0; i < MAX_HEIGHT; i++) {
-                       if (wait_tb_buffers_run) {
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->L[i]);
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->R[i]);
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->FL[i]);
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->FR[i]);
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->L[i]);
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->R[i]);
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->FL[i]);
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->FR[i]);
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->
-                                                                CFL[i]);
--                              reiserfs_restore_prepared_buffer(p_s_tb->tb_sb,
--                                                               p_s_tb->
-+                              reiserfs_restore_prepared_buffer(tb->tb_sb,
-+                                                               tb->
-                                                                CFR[i]);
-                       }
--                      brelse(p_s_tb->L[i]);
--                      brelse(p_s_tb->R[i]);
--                      brelse(p_s_tb->FL[i]);
--                      brelse(p_s_tb->FR[i]);
--                      brelse(p_s_tb->CFL[i]);
--                      brelse(p_s_tb->CFR[i]);
--
--                      p_s_tb->L[i] = NULL;
--                      p_s_tb->R[i] = NULL;
--                      p_s_tb->FL[i] = NULL;
--                      p_s_tb->FR[i] = NULL;
--                      p_s_tb->CFL[i] = NULL;
--                      p_s_tb->CFR[i] = NULL;
-+                      brelse(tb->L[i]);
-+                      brelse(tb->R[i]);
-+                      brelse(tb->FL[i]);
-+                      brelse(tb->FR[i]);
-+                      brelse(tb->CFL[i]);
-+                      brelse(tb->CFR[i]);
-+
-+                      tb->L[i] = NULL;
-+                      tb->R[i] = NULL;
-+                      tb->FL[i] = NULL;
-+                      tb->FR[i] = NULL;
-+                      tb->CFL[i] = NULL;
-+                      tb->CFR[i] = NULL;
-               }
-               if (wait_tb_buffers_run) {
-                       for (i = 0; i < MAX_FEB_SIZE; i++) {
--                              if (p_s_tb->FEB[i]) {
-+                              if (tb->FEB[i])
-                                       reiserfs_restore_prepared_buffer
--                                          (p_s_tb->tb_sb, p_s_tb->FEB[i]);
--                              }
-+                                          (tb->tb_sb, tb->FEB[i]);
-                       }
-               }
-               return n_ret_value;
-@@ -2533,7 +2535,7 @@ int fix_nodes(int n_op_mode, struct tree
- }
--/* Anatoly will probably forgive me renaming p_s_tb to tb. I just
-+/* Anatoly will probably forgive me renaming tb to tb. I just
-    wanted to make lines shorter */
- void unfix_nodes(struct tree_balance *tb)
- {
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -1063,17 +1063,17 @@ static char prepare_for_delete_or_cut(st
- }
- /* Calculate number of bytes which will be deleted or cut during balance */
--static int calc_deleted_bytes_number(struct tree_balance *p_s_tb, char c_mode)
-+static int calc_deleted_bytes_number(struct tree_balance *tb, char c_mode)
- {
-       int n_del_size;
--      struct item_head *p_le_ih = PATH_PITEM_HEAD(p_s_tb->tb_path);
-+      struct item_head *p_le_ih = PATH_PITEM_HEAD(tb->tb_path);
-       if (is_statdata_le_ih(p_le_ih))
-               return 0;
-       n_del_size =
-           (c_mode ==
--           M_DELETE) ? ih_item_len(p_le_ih) : -p_s_tb->insert_size[0];
-+           M_DELETE) ? ih_item_len(p_le_ih) : -tb->insert_size[0];
-       if (is_direntry_le_ih(p_le_ih)) {
-               // return EMPTY_DIR_SIZE; /* We delete emty directoris only. */
-               // we can't use EMPTY_DIR_SIZE, as old format dirs have a different
-@@ -1083,25 +1083,26 @@ static int calc_deleted_bytes_number(str
-       }
-       if (is_indirect_le_ih(p_le_ih))
--              n_del_size = (n_del_size / UNFM_P_SIZE) * (PATH_PLAST_BUFFER(p_s_tb->tb_path)->b_size); // - get_ih_free_space (p_le_ih);
-+              n_del_size = (n_del_size / UNFM_P_SIZE) *
-+                              (PATH_PLAST_BUFFER(tb->tb_path)->b_size);
-       return n_del_size;
- }
- static void init_tb_struct(struct reiserfs_transaction_handle *th,
--                         struct tree_balance *p_s_tb,
-+                         struct tree_balance *tb,
-                          struct super_block *sb,
-                          struct treepath *p_s_path, int n_size)
- {
-       BUG_ON(!th->t_trans_id);
--      memset(p_s_tb, '\0', sizeof(struct tree_balance));
--      p_s_tb->transaction_handle = th;
--      p_s_tb->tb_sb = sb;
--      p_s_tb->tb_path = p_s_path;
-+      memset(tb, '\0', sizeof(struct tree_balance));
-+      tb->transaction_handle = th;
-+      tb->tb_sb = sb;
-+      tb->tb_path = p_s_path;
-       PATH_OFFSET_PBUFFER(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = NULL;
-       PATH_OFFSET_POSITION(p_s_path, ILLEGAL_PATH_ELEMENT_OFFSET) = 0;
--      p_s_tb->insert_size[0] = n_size;
-+      tb->insert_size[0] = n_size;
- }
- void padd_item(char *item, int total_length, int length)
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -2004,7 +2004,7 @@ extern const struct address_space_operat
- /* fix_nodes.c */
--int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb,
-+int fix_nodes(int n_op_mode, struct tree_balance *tb,
-             struct item_head *p_s_ins_ih, const void *);
- void unfix_nodes(struct tree_balance *);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-selinux.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-selinux.diff
deleted file mode 100644 (file)
index c270b50..0000000
+++ /dev/null
@@ -1,316 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: add atomic addition of selinux attributes during inode creation
-
- Some time ago, some changes were made to make security inode attributes
- be atomically written during inode creation. ReiserFS fell behind in this
- area, but with the reworking of the xattr code, it's now fairly easy to add.
-
- The following patch adds the ability for security attributes to be added
- automatically during inode creation.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
- fs/reiserfs/inode.c            |   16 +++++++++++-
- fs/reiserfs/namei.c            |   37 +++++++++++++++++++++++++---
- fs/reiserfs/xattr_security.c   |   54 +++++++++++++++++++++++++++++++++++++++++
- include/linux/reiserfs_fs.h    |    4 ++-
- include/linux/reiserfs_xattr.h |   32 ++++++++++++++++++++++++
- 5 files changed, 137 insertions(+), 6 deletions(-)
-
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -1756,7 +1756,8 @@ int reiserfs_new_inode(struct reiserfs_t
-                      /* 0 for regular, EMTRY_DIR_SIZE for dirs, 
-                         strlen (symname) for symlinks) */
-                      loff_t i_size, struct dentry *dentry,
--                     struct inode *inode)
-+                     struct inode *inode,
-+                     struct reiserfs_security_handle *security)
- {
-       struct super_block *sb;
-       INITIALIZE_PATH(path_to_key);
-@@ -1934,6 +1935,19 @@ int reiserfs_new_inode(struct reiserfs_t
-       } else if (IS_PRIVATE(dir))
-               inode->i_flags |= S_PRIVATE;
-+      if (security->name) {
-+              retval = reiserfs_security_write(th, inode, security);
-+              if (retval) {
-+                      err = retval;
-+                      reiserfs_check_path(&path_to_key);
-+                      retval = journal_end(th, th->t_super,
-+                                           th->t_blocks_allocated);
-+                      if (retval)
-+                              err = retval;
-+                      goto out_inserted_sd;
-+              }
-+      }
-+
-       insert_inode_hash(inode);
-       reiserfs_update_sd(th, inode);
-       reiserfs_check_path(&path_to_key);
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -607,6 +607,7 @@ static int reiserfs_create(struct inode 
-           2 * (REISERFS_QUOTA_INIT_BLOCKS(dir->i_sb) +
-                REISERFS_QUOTA_TRANS_BLOCKS(dir->i_sb));
-       struct reiserfs_transaction_handle th;
-+      struct reiserfs_security_handle security;
-       if (!(inode = new_inode(dir->i_sb))) {
-               return -ENOMEM;
-@@ -614,6 +615,12 @@ static int reiserfs_create(struct inode 
-       new_inode_init(inode, dir, mode);
-       jbegin_count += reiserfs_cache_default_acl(dir);
-+      retval = reiserfs_security_init(dir, inode, &security);
-+      if (retval < 0) {
-+              drop_new_inode(inode);
-+              return retval;
-+      }
-+      jbegin_count += retval;
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -624,7 +631,7 @@ static int reiserfs_create(struct inode 
-       retval =
-           reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,
--                             inode);
-+                             inode, &security);
-       if (retval)
-               goto out_failed;
-@@ -662,6 +669,7 @@ static int reiserfs_mknod(struct inode *
-       int retval;
-       struct inode *inode;
-       struct reiserfs_transaction_handle th;
-+      struct reiserfs_security_handle security;
-       /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
-       int jbegin_count =
-           JOURNAL_PER_BALANCE_CNT * 3 +
-@@ -677,6 +685,12 @@ static int reiserfs_mknod(struct inode *
-       new_inode_init(inode, dir, mode);
-       jbegin_count += reiserfs_cache_default_acl(dir);
-+      retval = reiserfs_security_init(dir, inode, &security);
-+      if (retval < 0) {
-+              drop_new_inode(inode);
-+              return retval;
-+      }
-+      jbegin_count += retval;
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -687,7 +701,7 @@ static int reiserfs_mknod(struct inode *
-       retval =
-           reiserfs_new_inode(&th, dir, mode, NULL, 0 /*i_size */ , dentry,
--                             inode);
-+                             inode, &security);
-       if (retval) {
-               goto out_failed;
-       }
-@@ -728,6 +742,7 @@ static int reiserfs_mkdir(struct inode *
-       int retval;
-       struct inode *inode;
-       struct reiserfs_transaction_handle th;
-+      struct reiserfs_security_handle security;
-       /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
-       int jbegin_count =
-           JOURNAL_PER_BALANCE_CNT * 3 +
-@@ -745,6 +760,12 @@ static int reiserfs_mkdir(struct inode *
-       new_inode_init(inode, dir, mode);
-       jbegin_count += reiserfs_cache_default_acl(dir);
-+      retval = reiserfs_security_init(dir, inode, &security);
-+      if (retval < 0) {
-+              drop_new_inode(inode);
-+              return retval;
-+      }
-+      jbegin_count += retval;
-       reiserfs_write_lock(dir->i_sb);
-       retval = journal_begin(&th, dir->i_sb, jbegin_count);
-@@ -761,7 +782,7 @@ static int reiserfs_mkdir(struct inode *
-           retval = reiserfs_new_inode(&th, dir, mode, NULL /*symlink */ ,
-                                       old_format_only(dir->i_sb) ?
-                                       EMPTY_DIR_SIZE_V1 : EMPTY_DIR_SIZE,
--                                      dentry, inode);
-+                                      dentry, inode, &security);
-       if (retval) {
-               dir->i_nlink--;
-               goto out_failed;
-@@ -1002,6 +1023,7 @@ static int reiserfs_symlink(struct inode
-       char *name;
-       int item_len;
-       struct reiserfs_transaction_handle th;
-+      struct reiserfs_security_handle security;
-       int mode = S_IFLNK | S_IRWXUGO;
-       /* We need blocks for transaction + (user+group)*(quotas for new inode + update of quota for directory owner) */
-       int jbegin_count =
-@@ -1014,6 +1036,13 @@ static int reiserfs_symlink(struct inode
-       }
-       new_inode_init(inode, parent_dir, mode);
-+      retval = reiserfs_security_init(parent_dir, inode, &security);
-+      if (retval < 0) {
-+              drop_new_inode(inode);
-+              return retval;
-+      }
-+      jbegin_count += retval;
-+
-       reiserfs_write_lock(parent_dir->i_sb);
-       item_len = ROUND_UP(strlen(symname));
-       if (item_len > MAX_DIRECT_ITEM_LEN(parent_dir->i_sb->s_blocksize)) {
-@@ -1040,7 +1069,7 @@ static int reiserfs_symlink(struct inode
-       retval =
-           reiserfs_new_inode(&th, parent_dir, mode, name, strlen(symname),
--                             dentry, inode);
-+                             dentry, inode, &security);
-       kfree(name);
-       if (retval) {           /* reiserfs_new_inode iputs for us */
-               goto out_failed;
---- a/fs/reiserfs/xattr_security.c
-+++ b/fs/reiserfs/xattr_security.c
-@@ -4,6 +4,7 @@
- #include <linux/pagemap.h>
- #include <linux/xattr.h>
- #include <linux/reiserfs_xattr.h>
-+#include <linux/security.h>
- #include <asm/uaccess.h>
- static int
-@@ -47,6 +48,59 @@ static size_t security_list(struct inode
-       return len;
- }
-+/* Initializes the security context for a new inode and returns the number
-+ * of blocks needed for the transaction. If successful, reiserfs_security
-+ * must be released using reiserfs_security_free when the caller is done. */
-+int reiserfs_security_init(struct inode *dir, struct inode *inode,
-+                         struct reiserfs_security_handle *sec)
-+{
-+      int blocks = 0;
-+      int error = security_inode_init_security(inode, dir, &sec->name,
-+                                               &sec->value, &sec->length);
-+      if (error) {
-+              if (error == -EOPNOTSUPP)
-+                      error = 0;
-+
-+              sec->name = NULL;
-+              sec->value = NULL;
-+              sec->length = 0;
-+              return error;
-+      }
-+
-+      if (sec->length) {
-+              blocks = reiserfs_xattr_jcreate_nblocks(inode) +
-+                       reiserfs_xattr_nblocks(inode, sec->length);
-+              /* We don't want to count the directories twice if we have
-+               * a default ACL. */
-+              REISERFS_I(inode)->i_flags |= i_has_xattr_dir;
-+      }
-+      return blocks;
-+}
-+
-+int reiserfs_security_write(struct reiserfs_transaction_handle *th,
-+                          struct inode *inode,
-+                          struct reiserfs_security_handle *sec)
-+{
-+      int error;
-+      if (strlen(sec->name) < sizeof(XATTR_SECURITY_PREFIX))
-+              return -EINVAL;
-+
-+      error = reiserfs_xattr_set_handle(th, inode, sec->name, sec->value,
-+                                        sec->length, XATTR_CREATE);
-+      if (error == -ENODATA || error == -EOPNOTSUPP)
-+              error = 0;
-+
-+      return error;
-+}
-+
-+void reiserfs_security_free(struct reiserfs_security_handle *sec)
-+{
-+      kfree(sec->name);
-+      kfree(sec->value);
-+      sec->name = NULL;
-+      sec->value = NULL;
-+}
-+
- struct xattr_handler reiserfs_xattr_security_handler = {
-       .prefix = XATTR_SECURITY_PREFIX,
-       .get = security_get,
---- a/include/linux/reiserfs_fs.h
-+++ b/include/linux/reiserfs_fs.h
-@@ -1915,10 +1915,12 @@ void make_le_item_head(struct item_head 
-                      loff_t offset, int type, int length, int entry_count);
- struct inode *reiserfs_iget(struct super_block *s, const struct cpu_key *key);
-+struct reiserfs_security_handle;
- int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
-                      struct inode *dir, int mode,
-                      const char *symname, loff_t i_size,
--                     struct dentry *dentry, struct inode *inode);
-+                     struct dentry *dentry, struct inode *inode,
-+                     struct reiserfs_security_handle *security);
- void reiserfs_update_sd_size(struct reiserfs_transaction_handle *th,
-                            struct inode *inode, loff_t size);
---- a/include/linux/reiserfs_xattr.h
-+++ b/include/linux/reiserfs_xattr.h
-@@ -15,6 +15,12 @@ struct reiserfs_xattr_header {
-       __le32 h_hash;          /* hash of the value */
- };
-+struct reiserfs_security_handle {
-+      char *name;
-+      void *value;
-+      size_t length;
-+};
-+
- #ifdef __KERNEL__
- #include <linux/init.h>
-@@ -54,6 +60,14 @@ int reiserfs_xattr_set_handle(struct rei
- extern struct xattr_handler reiserfs_xattr_user_handler;
- extern struct xattr_handler reiserfs_xattr_trusted_handler;
- extern struct xattr_handler reiserfs_xattr_security_handler;
-+#ifdef CONFIG_REISERFS_FS_SECURITY
-+int reiserfs_security_init(struct inode *dir, struct inode *inode,
-+                         struct reiserfs_security_handle *sec);
-+int reiserfs_security_write(struct reiserfs_transaction_handle *th,
-+                          struct inode *inode,
-+                          struct reiserfs_security_handle *sec);
-+void reiserfs_security_free(struct reiserfs_security_handle *sec);
-+#endif
- #define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
- static inline loff_t reiserfs_xattr_nblocks(struct inode *inode, loff_t size)
-@@ -109,6 +123,24 @@ static inline void reiserfs_init_xattr_r
- }
- #endif  /*  CONFIG_REISERFS_FS_XATTR  */
-+#ifndef CONFIG_REISERFS_FS_SECURITY
-+static inline int reiserfs_security_init(struct inode *dir,
-+                                       struct inode *inode,
-+                                       struct reiserfs_security_handle *sec)
-+{
-+      return 0;
-+}
-+static inline int
-+reiserfs_security_write(struct reiserfs_transaction_handle *th,
-+                      struct inode *inode,
-+                      struct reiserfs_security_handle *sec)
-+{
-+      return 0;
-+}
-+static inline void reiserfs_security_free(struct reiserfs_security_handle *sec)
-+{}
-+#endif
-+
- #endif  /*  __KERNEL__  */
- #endif  /*  _LINUX_REISERFS_XATTR_H  */
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-buffer-info.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-buffer-info.diff
deleted file mode 100644 (file)
index 42160c6..0000000
+++ /dev/null
@@ -1,363 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: [PATCH 31/40] reiserfs: factor out buffer_info initialization
-
- This is the first in a series of patches to make balance_leaf() not quite
- so insane.
-
- This patch factors out the open coded initializations of buffer_info
- structures and defines a few initializers for the 4 cases they're used.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/do_balan.c |  175 ++++++++++++++++---------------------------------
- 1 file changed, 60 insertions(+), 115 deletions(-)
-
---- a/fs/reiserfs/do_balan.c
-+++ b/fs/reiserfs/do_balan.c
-@@ -29,6 +29,43 @@ struct tree_balance *cur_tb = NULL; /* d
-                                          is interrupting do_balance */
- #endif
-+static inline void buffer_info_init_left(struct tree_balance *tb,
-+                                         struct buffer_info *bi)
-+{
-+      bi->tb          = tb;
-+      bi->bi_bh       = tb->L[0];
-+      bi->bi_parent   = tb->FL[0];
-+      bi->bi_position = get_left_neighbor_position(tb, 0);
-+}
-+
-+static inline void buffer_info_init_right(struct tree_balance *tb,
-+                                          struct buffer_info *bi)
-+{
-+      bi->tb          = tb;
-+      bi->bi_bh       = tb->R[0];
-+      bi->bi_parent   = tb->FR[0];
-+      bi->bi_position = get_right_neighbor_position(tb, 0);
-+}
-+
-+static inline void buffer_info_init_tbS0(struct tree_balance *tb,
-+                                         struct buffer_info *bi)
-+{
-+      bi->tb          = tb;
-+      bi->bi_bh        = PATH_PLAST_BUFFER(tb->tb_path);
-+      bi->bi_parent   = PATH_H_PPARENT(tb->tb_path, 0);
-+      bi->bi_position = PATH_H_POSITION(tb->tb_path, 1);
-+}
-+
-+static inline void buffer_info_init_bh(struct tree_balance *tb,
-+                                       struct buffer_info *bi,
-+                                       struct buffer_head *bh)
-+{
-+      bi->tb          = tb;
-+      bi->bi_bh       = bh;
-+      bi->bi_parent   = NULL;
-+      bi->bi_position = 0;
-+}
-+
- inline void do_balance_mark_leaf_dirty(struct tree_balance *tb,
-                                      struct buffer_head *bh, int flag)
- {
-@@ -86,6 +123,7 @@ static int balance_leaf_when_delete(stru
-              "PAP-12010: tree can not be empty");
-       ih = B_N_PITEM_HEAD(tbS0, item_pos);
-+      buffer_info_init_tbS0(tb, &bi);
-       /* Delete or truncate the item */
-@@ -96,10 +134,6 @@ static int balance_leaf_when_delete(stru
-                      "vs-12013: mode Delete, insert size %d, ih to be deleted %h",
-                      -tb->insert_size[0], ih);
--              bi.tb = tb;
--              bi.bi_bh = tbS0;
--              bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
--              bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
-               leaf_delete_items(&bi, 0, item_pos, 1, -1);
-               if (!item_pos && tb->CFL[0]) {
-@@ -121,10 +155,6 @@ static int balance_leaf_when_delete(stru
-               break;
-       case M_CUT:{            /* cut item in S[0] */
--                      bi.tb = tb;
--                      bi.bi_bh = tbS0;
--                      bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
--                      bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
-                       if (is_direntry_le_ih(ih)) {
-                               /* UFS unlink semantics are such that you can only delete one directory entry at a time. */
-@@ -325,11 +355,7 @@ static int balance_leaf(struct tree_bala
-                                              ih_item_len(ih));
-                                       /* Insert new item into L[0] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = tb->L[0];
--                                      bi.bi_parent = tb->FL[0];
--                                      bi.bi_position =
--                                          get_left_neighbor_position(tb, 0);
-+                                      buffer_info_init_left(tb, &bi);
-                                       leaf_insert_into_buf(&bi,
-                                                            n + item_pos -
-                                                            ret_val, ih, body,
-@@ -369,11 +395,7 @@ static int balance_leaf(struct tree_bala
-                                           leaf_shift_left(tb, tb->lnum[0] - 1,
-                                                           tb->lbytes);
-                                       /* Insert new item into L[0] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = tb->L[0];
--                                      bi.bi_parent = tb->FL[0];
--                                      bi.bi_position =
--                                          get_left_neighbor_position(tb, 0);
-+                                      buffer_info_init_left(tb, &bi);
-                                       leaf_insert_into_buf(&bi,
-                                                            n + item_pos -
-                                                            ret_val, ih, body,
-@@ -429,13 +451,7 @@ static int balance_leaf(struct tree_bala
-                                                       }
-                                                       /* Append given directory entry to directory item */
--                                                      bi.tb = tb;
--                                                      bi.bi_bh = tb->L[0];
--                                                      bi.bi_parent =
--                                                          tb->FL[0];
--                                                      bi.bi_position =
--                                                          get_left_neighbor_position
--                                                          (tb, 0);
-+                                                      buffer_info_init_left(tb, &bi);
-                                                       leaf_paste_in_buffer
-                                                           (&bi,
-                                                            n + item_pos -
-@@ -523,13 +539,7 @@ static int balance_leaf(struct tree_bala
-                                                                            (tbS0,
-                                                                             item_pos)));
-                                                       /* Append to body of item in L[0] */
--                                                      bi.tb = tb;
--                                                      bi.bi_bh = tb->L[0];
--                                                      bi.bi_parent =
--                                                          tb->FL[0];
--                                                      bi.bi_position =
--                                                          get_left_neighbor_position
--                                                          (tb, 0);
-+                                                      buffer_info_init_left(tb, &bi);
-                                                       leaf_paste_in_buffer
-                                                           (&bi,
-                                                            n + item_pos -
-@@ -680,11 +690,7 @@ static int balance_leaf(struct tree_bala
-                                           leaf_shift_left(tb, tb->lnum[0],
-                                                           tb->lbytes);
-                                       /* Append to body of item in L[0] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = tb->L[0];
--                                      bi.bi_parent = tb->FL[0];
--                                      bi.bi_position =
--                                          get_left_neighbor_position(tb, 0);
-+                                      buffer_info_init_left(tb, &bi);
-                                       leaf_paste_in_buffer(&bi,
-                                                            n + item_pos -
-                                                            ret_val,
-@@ -776,11 +782,7 @@ static int balance_leaf(struct tree_bala
-                                       set_le_ih_k_offset(ih, offset);
-                                       put_ih_item_len(ih, tb->rbytes);
-                                       /* Insert part of the item into R[0] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = tb->R[0];
--                                      bi.bi_parent = tb->FR[0];
--                                      bi.bi_position =
--                                          get_right_neighbor_position(tb, 0);
-+                                      buffer_info_init_right(tb, &bi);
-                                       if ((old_len - tb->rbytes) > zeros_num) {
-                                               r_zeros_number = 0;
-                                               r_body =
-@@ -817,11 +819,7 @@ static int balance_leaf(struct tree_bala
-                                                            tb->rnum[0] - 1,
-                                                            tb->rbytes);
-                                       /* Insert new item into R[0] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = tb->R[0];
--                                      bi.bi_parent = tb->FR[0];
--                                      bi.bi_position =
--                                          get_right_neighbor_position(tb, 0);
-+                                      buffer_info_init_right(tb, &bi);
-                                       leaf_insert_into_buf(&bi,
-                                                            item_pos - n +
-                                                            tb->rnum[0] - 1,
-@@ -881,13 +879,7 @@ static int balance_leaf(struct tree_bala
-                                                           pos_in_item -
-                                                           entry_count +
-                                                           tb->rbytes - 1;
--                                                      bi.tb = tb;
--                                                      bi.bi_bh = tb->R[0];
--                                                      bi.bi_parent =
--                                                          tb->FR[0];
--                                                      bi.bi_position =
--                                                          get_right_neighbor_position
--                                                          (tb, 0);
-+                                                      buffer_info_init_right(tb, &bi);
-                                                       leaf_paste_in_buffer
-                                                           (&bi, 0,
-                                                            paste_entry_position,
-@@ -1018,12 +1010,7 @@ static int balance_leaf(struct tree_bala
-                                                   (tb, tb->CFR[0], 0);
-                                               /* Append part of body into R[0] */
--                                              bi.tb = tb;
--                                              bi.bi_bh = tb->R[0];
--                                              bi.bi_parent = tb->FR[0];
--                                              bi.bi_position =
--                                                  get_right_neighbor_position
--                                                  (tb, 0);
-+                                              buffer_info_init_right(tb, &bi);
-                                               if (n_rem > zeros_num) {
-                                                       r_zeros_number = 0;
-                                                       r_body =
-@@ -1070,12 +1057,7 @@ static int balance_leaf(struct tree_bala
-                                                            tb->rbytes);
-                                       /* append item in R[0] */
-                                       if (pos_in_item >= 0) {
--                                              bi.tb = tb;
--                                              bi.bi_bh = tb->R[0];
--                                              bi.bi_parent = tb->FR[0];
--                                              bi.bi_position =
--                                                  get_right_neighbor_position
--                                                  (tb, 0);
-+                                              buffer_info_init_right(tb, &bi);
-                                               leaf_paste_in_buffer(&bi,
-                                                                    item_pos -
-                                                                    n +
-@@ -1231,10 +1213,7 @@ static int balance_leaf(struct tree_bala
-                                       put_ih_item_len(ih, sbytes[i]);
-                                       /* Insert part of the item into S_new[i] before 0-th item */
--                                      bi.tb = tb;
--                                      bi.bi_bh = S_new[i];
--                                      bi.bi_parent = NULL;
--                                      bi.bi_position = 0;
-+                                      buffer_info_init_bh(tb, &bi, S_new[i]);
-                                       if ((old_len - sbytes[i]) > zeros_num) {
-                                               r_zeros_number = 0;
-@@ -1266,10 +1245,7 @@ static int balance_leaf(struct tree_bala
-                                                       S_new[i]);
-                                       /* Insert new item into S_new[i] */
--                                      bi.tb = tb;
--                                      bi.bi_bh = S_new[i];
--                                      bi.bi_parent = NULL;
--                                      bi.bi_position = 0;
-+                                      buffer_info_init_bh(tb, &bi, S_new[i]);
-                                       leaf_insert_into_buf(&bi,
-                                                            item_pos - n +
-                                                            snum[i] - 1, ih,
-@@ -1326,10 +1302,7 @@ static int balance_leaf(struct tree_bala
-                                                            sbytes[i] - 1,
-                                                            S_new[i]);
-                                                       /* Paste given directory entry to directory item */
--                                                      bi.tb = tb;
--                                                      bi.bi_bh = S_new[i];
--                                                      bi.bi_parent = NULL;
--                                                      bi.bi_position = 0;
-+                                                      buffer_info_init_bh(tb, &bi, S_new[i]);
-                                                       leaf_paste_in_buffer
-                                                           (&bi, 0,
-                                                            pos_in_item -
-@@ -1399,11 +1372,7 @@ static int balance_leaf(struct tree_bala
-                                               if (n_rem < 0)
-                                                       n_rem = 0;
-                                               /* Append part of body into S_new[0] */
--                                              bi.tb = tb;
--                                              bi.bi_bh = S_new[i];
--                                              bi.bi_parent = NULL;
--                                              bi.bi_position = 0;
--
-+                                              buffer_info_init_bh(tb, &bi, S_new[i]);
-                                               if (n_rem > zeros_num) {
-                                                       r_zeros_number = 0;
-                                                       r_body =
-@@ -1490,10 +1459,7 @@ static int balance_leaf(struct tree_bala
-                                              leaf_mi);
-                                       /* paste into item */
--                                      bi.tb = tb;
--                                      bi.bi_bh = S_new[i];
--                                      bi.bi_parent = NULL;
--                                      bi.bi_position = 0;
-+                                      buffer_info_init_bh(tb, &bi, S_new[i]);
-                                       leaf_paste_in_buffer(&bi,
-                                                            item_pos - n +
-                                                            snum[i],
-@@ -1560,10 +1526,7 @@ static int balance_leaf(struct tree_bala
-               switch (flag) {
-               case M_INSERT:  /* insert item into S[0] */
--                      bi.tb = tb;
--                      bi.bi_bh = tbS0;
--                      bi.bi_parent = PATH_H_PPARENT(tb->tb_path, 0);
--                      bi.bi_position = PATH_H_POSITION(tb->tb_path, 1);
-+                      buffer_info_init_tbS0(tb, &bi);
-                       leaf_insert_into_buf(&bi, item_pos, ih, body,
-                                            zeros_num);
-@@ -1590,14 +1553,7 @@ static int balance_leaf(struct tree_bala
-                                                      "PAP-12260: insert_size is 0 already");
-                                               /* prepare space */
--                                              bi.tb = tb;
--                                              bi.bi_bh = tbS0;
--                                              bi.bi_parent =
--                                                  PATH_H_PPARENT(tb->tb_path,
--                                                                 0);
--                                              bi.bi_position =
--                                                  PATH_H_POSITION(tb->tb_path,
--                                                                  1);
-+                                              buffer_info_init_tbS0(tb, &bi);
-                                               leaf_paste_in_buffer(&bi,
-                                                                    item_pos,
-                                                                    pos_in_item,
-@@ -1645,14 +1601,7 @@ static int balance_leaf(struct tree_bala
-                                               RFALSE(tb->insert_size[0] <= 0,
-                                                      "PAP-12275: insert size must not be %d",
-                                                      tb->insert_size[0]);
--                                              bi.tb = tb;
--                                              bi.bi_bh = tbS0;
--                                              bi.bi_parent =
--                                                  PATH_H_PPARENT(tb->tb_path,
--                                                                 0);
--                                              bi.bi_position =
--                                                  PATH_H_POSITION(tb->tb_path,
--                                                                  1);
-+                                              buffer_info_init_tbS0(tb, &bi);
-                                               leaf_paste_in_buffer(&bi,
-                                                                    item_pos,
-                                                                    pos_in_item,
-@@ -1725,7 +1674,6 @@ void make_empty_node(struct buffer_info
- struct buffer_head *get_FEB(struct tree_balance *tb)
- {
-       int i;
--      struct buffer_head *first_b;
-       struct buffer_info bi;
-       for (i = 0; i < MAX_FEB_SIZE; i++)
-@@ -1735,16 +1683,13 @@ struct buffer_head *get_FEB(struct tree_
-       if (i == MAX_FEB_SIZE)
-               reiserfs_panic(tb->tb_sb, "vs-12300", "FEB list is empty");
--      bi.tb = tb;
--      bi.bi_bh = first_b = tb->FEB[i];
--      bi.bi_parent = NULL;
--      bi.bi_position = 0;
-+      buffer_info_init_bh(tb, &bi, tb->FEB[i]);
-       make_empty_node(&bi);
--      set_buffer_uptodate(first_b);
-+      set_buffer_uptodate(tb->FEB[i]);
-+      tb->used[i] = tb->FEB[i];
-       tb->FEB[i] = NULL;
--      tb->used[i] = first_b;
--      return (first_b);
-+      return tb->used[i];
- }
- /* This is now used because reiserfs_free_block has to be able to
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-xattr-internal-file-lookups-opens.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-simplify-xattr-internal-file-lookups-opens.diff
deleted file mode 100644 (file)
index 77e815f..0000000
+++ /dev/null
@@ -1,474 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: simplify xattr internal file lookups/opens
-
- The xattr file open/lookup code is needlessly complex. We can use vfs-level
- operations to perform the same work, and also simplify the locking
- constraints. The locking advantages will be exploited in future patches.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/xattr.c |  262 ++++++++++++++++++++++++++--------------------------
- 1 file changed, 135 insertions(+), 127 deletions(-)
-
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -44,100 +44,123 @@
- #include <net/checksum.h>
- #include <linux/smp_lock.h>
- #include <linux/stat.h>
-+#include <linux/quotaops.h>
--#define FL_READONLY 128
--#define FL_DIR_SEM_HELD 256
- #define PRIVROOT_NAME ".reiserfs_priv"
- #define XAROOT_NAME   "xattrs"
--/* Returns the dentry referring to the root of the extended attribute
-- * directory tree. If it has already been retrieved, it is used. If it
-- * hasn't been created and the flags indicate creation is allowed, we
-- * attempt to create it. On error, we return a pointer-encoded error.
-- */
--static struct dentry *get_xa_root(struct super_block *sb, int flags)
-+/* Helpers for inode ops. We do this so that we don't have all the VFS
-+ * overhead and also for proper i_mutex annotation.
-+ * dir->i_mutex must be held for all of them. */
-+static int xattr_create(struct inode *dir, struct dentry *dentry, int mode)
- {
--      struct dentry *privroot = dget(REISERFS_SB(sb)->priv_root);
--      struct dentry *xaroot;
-+      BUG_ON(!mutex_is_locked(&dir->i_mutex));
-+      DQUOT_INIT(dir);
-+      return dir->i_op->create(dir, dentry, mode, NULL);
-+}
--      /* This needs to be created at mount-time */
--      if (!privroot)
--              return ERR_PTR(-ENODATA);
-+static int xattr_mkdir(struct inode *dir, struct dentry *dentry, int mode)
-+{
-+      BUG_ON(!mutex_is_locked(&dir->i_mutex));
-+      DQUOT_INIT(dir);
-+      return dir->i_op->mkdir(dir, dentry, mode);
-+}
--      mutex_lock_nested(&privroot->d_inode->i_mutex, I_MUTEX_XATTR);
--      if (REISERFS_SB(sb)->xattr_root) {
--              xaroot = dget(REISERFS_SB(sb)->xattr_root);
--              goto out;
--      }
-+/* We use I_MUTEX_CHILD here to silence lockdep. It's safe because xattr
-+ * mutation ops aren't called during rename or splace, which are the
-+ * only other users of I_MUTEX_CHILD. It violates the ordering, but that's
-+ * better than allocating another subclass just for this code. */
-+static int xattr_unlink(struct inode *dir, struct dentry *dentry)
-+{
-+      int error;
-+      BUG_ON(!mutex_is_locked(&dir->i_mutex));
-+      DQUOT_INIT(dir);
--      xaroot = lookup_one_len(XAROOT_NAME, privroot, strlen(XAROOT_NAME));
--      if (IS_ERR(xaroot)) {
--              goto out;
--      } else if (!xaroot->d_inode) {
-+      mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
-+      error = dir->i_op->unlink(dir, dentry);
-+      mutex_unlock(&dentry->d_inode->i_mutex);
-+
-+      if (!error)
-+              d_delete(dentry);
-+      return error;
-+}
-+
-+static int xattr_rmdir(struct inode *dir, struct dentry *dentry)
-+{
-+      int error;
-+      BUG_ON(!mutex_is_locked(&dir->i_mutex));
-+      DQUOT_INIT(dir);
-+
-+      mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_CHILD);
-+      dentry_unhash(dentry);
-+      error = dir->i_op->rmdir(dir, dentry);
-+      if (!error)
-+              dentry->d_inode->i_flags |= S_DEAD;
-+      mutex_unlock(&dentry->d_inode->i_mutex);
-+      if (!error)
-+              d_delete(dentry);
-+      dput(dentry);
-+
-+      return error;
-+}
-+
-+
-+#define xattr_may_create(flags)       (!flags || flags & XATTR_CREATE)
-+
-+/* Returns and possibly creates the xattr dir. */
-+static struct dentry *lookup_or_create_dir(struct dentry *parent,
-+                                          const char *name, int flags)
-+{
-+      struct dentry *dentry;
-+      BUG_ON(!parent);
-+
-+      dentry = lookup_one_len(name, parent, strlen(name));
-+      if (IS_ERR(dentry))
-+              return dentry;
-+      else if (!dentry->d_inode) {
-               int err = -ENODATA;
--              if (flags == 0 || flags & XATTR_CREATE)
--                      err = privroot->d_inode->i_op->mkdir(privroot->d_inode,
--                                                           xaroot, 0700);
-+
-+              if (xattr_may_create(flags)) {
-+                      mutex_lock_nested(&parent->d_inode->i_mutex,
-+                                        I_MUTEX_XATTR);
-+                      err = xattr_mkdir(parent->d_inode, dentry, 0700);
-+                      mutex_unlock(&parent->d_inode->i_mutex);
-+              }
-+
-               if (err) {
--                      dput(xaroot);
--                      xaroot = ERR_PTR(err);
--                      goto out;
-+                      dput(dentry);
-+                      dentry = ERR_PTR(err);
-               }
-       }
--      REISERFS_SB(sb)->xattr_root = dget(xaroot);
--      out:
--      mutex_unlock(&privroot->d_inode->i_mutex);
--      dput(privroot);
--      return xaroot;
-+      return dentry;
-+}
-+
-+static struct dentry *open_xa_root(struct super_block *sb, int flags)
-+{
-+      struct dentry *privroot = REISERFS_SB(sb)->priv_root;
-+      if (!privroot)
-+              return ERR_PTR(-ENODATA);
-+      return lookup_or_create_dir(privroot, XAROOT_NAME, flags);
- }
--/* Opens the directory corresponding to the inode's extended attribute store.
-- * If flags allow, the tree to the directory may be created. If creation is
-- * prohibited, -ENODATA is returned. */
- static struct dentry *open_xa_dir(const struct inode *inode, int flags)
- {
-       struct dentry *xaroot, *xadir;
-       char namebuf[17];
--      xaroot = get_xa_root(inode->i_sb, flags);
-+      xaroot = open_xa_root(inode->i_sb, flags);
-       if (IS_ERR(xaroot))
-               return xaroot;
--      /* ok, we have xaroot open */
-       snprintf(namebuf, sizeof(namebuf), "%X.%X",
-                le32_to_cpu(INODE_PKEY(inode)->k_objectid),
-                inode->i_generation);
--      xadir = lookup_one_len(namebuf, xaroot, strlen(namebuf));
--      if (IS_ERR(xadir)) {
--              dput(xaroot);
--              return xadir;
--      }
--
--      if (!xadir->d_inode) {
--              int err;
--              if (flags == 0 || flags & XATTR_CREATE) {
--                      /* Although there is nothing else trying to create this directory,
--                       * another directory with the same hash may be created, so we need
--                       * to protect against that */
--                      err =
--                          xaroot->d_inode->i_op->mkdir(xaroot->d_inode, xadir,
--                                                       0700);
--                      if (err) {
--                              dput(xaroot);
--                              dput(xadir);
--                              return ERR_PTR(err);
--                      }
--              }
--              if (!xadir->d_inode) {
--                      dput(xaroot);
--                      dput(xadir);
--                      return ERR_PTR(-ENODATA);
--              }
--      }
-+      xadir = lookup_or_create_dir(xaroot, namebuf, flags);
-       dput(xaroot);
-       return xadir;
-+
- }
- /*
-@@ -302,13 +325,11 @@ static
- int xattr_readdir(struct inode *inode, filldir_t filler, void *buf)
- {
-       int res = -ENOENT;
--      mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR);
-       if (!IS_DEADDIR(inode)) {
-               lock_kernel();
-               res = __xattr_readdir(inode, buf, filler);
-               unlock_kernel();
-       }
--      mutex_unlock(&inode->i_mutex);
-       return res;
- }
-@@ -345,9 +366,7 @@ __reiserfs_xattr_del(struct dentry *xadi
-               return -EIO;
-       }
--      err = dir->i_op->unlink(dir, dentry);
--      if (!err)
--              d_delete(dentry);
-+      err = xattr_unlink(dir, dentry);
- out_file:
-       dput(dentry);
-@@ -381,7 +400,7 @@ int reiserfs_delete_xattrs(struct inode
-               return 0;
-       reiserfs_read_lock_xattrs(inode->i_sb);
--      dir = open_xa_dir(inode, FL_READONLY);
-+      dir = open_xa_dir(inode, XATTR_REPLACE);
-       reiserfs_read_unlock_xattrs(inode->i_sb);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-@@ -391,25 +410,25 @@ int reiserfs_delete_xattrs(struct inode
-               return 0;
-       }
--      lock_kernel();
-+      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_delete_xattrs_filler, dir);
--      if (err) {
--              unlock_kernel();
-+      mutex_unlock(&dir->d_inode->i_mutex);
-+      if (err)
-               goto out_dir;
--      }
-       /* Leftovers besides . and .. -- that's not good. */
-       if (dir->d_inode->i_nlink <= 2) {
--              root = get_xa_root(inode->i_sb, XATTR_REPLACE);
-+              root = open_xa_root(inode->i_sb, XATTR_REPLACE);
-               reiserfs_write_lock_xattrs(inode->i_sb);
--              err = vfs_rmdir(root->d_inode, dir);
-+              mutex_lock_nested(&root->d_inode->i_mutex, I_MUTEX_XATTR);
-+              err = xattr_rmdir(root->d_inode, dir);
-+              mutex_unlock(&root->d_inode->i_mutex);
-               reiserfs_write_unlock_xattrs(inode->i_sb);
-               dput(root);
-       } else {
-               reiserfs_warning(inode->i_sb, "jdm-20006",
-                                "Couldn't remove all entries in directory");
-       }
--      unlock_kernel();
- out_dir:
-       dput(dir);
-@@ -445,8 +464,11 @@ reiserfs_chown_xattrs_filler(void *buf,
-               return -ENODATA;
-       }
--      if (!S_ISDIR(xafile->d_inode->i_mode))
-+      if (!S_ISDIR(xafile->d_inode->i_mode)) {
-+              mutex_lock_nested(&xafile->d_inode->i_mutex, I_MUTEX_CHILD);
-               err = notify_change(xafile, attrs);
-+              mutex_unlock(&xafile->d_inode->i_mutex);
-+      }
-       dput(xafile);
-       return err;
-@@ -464,38 +486,31 @@ int reiserfs_chown_xattrs(struct inode *
-               return 0;
-       reiserfs_read_lock_xattrs(inode->i_sb);
--      dir = open_xa_dir(inode, FL_READONLY);
-+      dir = open_xa_dir(inode, XATTR_REPLACE);
-       reiserfs_read_unlock_xattrs(inode->i_sb);
-       if (IS_ERR(dir)) {
-               if (PTR_ERR(dir) != -ENODATA)
-                       err = PTR_ERR(dir);
-               goto out;
--      } else if (!dir->d_inode) {
--              dput(dir);
--              goto out;
--      }
--
--      lock_kernel();
-+      } else if (!dir->d_inode)
-+              goto out_dir;
-       attrs->ia_valid &= (ATTR_UID | ATTR_GID | ATTR_CTIME);
-       buf.xadir = dir;
-       buf.attrs = attrs;
-       buf.inode = inode;
-+      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_chown_xattrs_filler, &buf);
--      if (err) {
--              unlock_kernel();
--              goto out_dir;
--      }
--      err = notify_change(dir, attrs);
--      unlock_kernel();
-+      if (!err)
-+              err = notify_change(dir, attrs);
-+      mutex_unlock(&dir->d_inode->i_mutex);
-+      attrs->ia_valid = ia_valid;
- out_dir:
-       dput(dir);
--
- out:
--      attrs->ia_valid = ia_valid;
-       return err;
- }
-@@ -513,47 +528,35 @@ static struct dentry *get_xa_file_dentry
-       int err = 0;
-       xadir = open_xa_dir(inode, flags);
--      if (IS_ERR(xadir)) {
-+      if (IS_ERR(xadir))
-               return ERR_CAST(xadir);
--      } else if (xadir && !xadir->d_inode) {
--              dput(xadir);
--              return ERR_PTR(-ENODATA);
--      }
-       xafile = lookup_one_len(name, xadir, strlen(name));
-       if (IS_ERR(xafile)) {
--              dput(xadir);
--              return ERR_CAST(xafile);
-+              err = PTR_ERR(xafile);
-+              goto out;
-       }
--      if (xafile->d_inode) {  /* file exists */
--              if (flags & XATTR_CREATE) {
--                      err = -EEXIST;
--                      dput(xafile);
--                      goto out;
--              }
--      } else if (flags & XATTR_REPLACE || flags & FL_READONLY) {
--              goto out;
--      } else {
--              /* inode->i_mutex is down, so nothing else can try to create
--               * the same xattr */
--              err = xadir->d_inode->i_op->create(xadir->d_inode, xafile,
--                                                 0700 | S_IFREG, NULL);
-+      if (xafile->d_inode && (flags & XATTR_CREATE))
-+              err = -EEXIST;
--              if (err) {
--                      dput(xafile);
--                      goto out;
-+      if (!xafile->d_inode) {
-+              err = -ENODATA;
-+              if (xattr_may_create(flags)) {
-+                      mutex_lock_nested(&xadir->d_inode->i_mutex,
-+                                        I_MUTEX_XATTR);
-+                      err = xattr_create(xadir->d_inode, xafile,
-+                                            0700|S_IFREG);
-+                      mutex_unlock(&xadir->d_inode->i_mutex);
-               }
-       }
-+      if (err)
-+              dput(xafile);
- out:
-       dput(xadir);
-       if (err)
--              xafile = ERR_PTR(err);
--      else if (!xafile->d_inode) {
--              dput(xafile);
--              xafile = ERR_PTR(-ENODATA);
--      }
-+              return ERR_PTR(err);
-       return xafile;
- }
-@@ -633,6 +636,7 @@ reiserfs_xattr_set(struct inode *inode,
-       newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
-       mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = notify_change(dentry, &newattrs);
-+      mutex_unlock(&dentry->d_inode->i_mutex);
-       if (err)
-               goto out_filp;
-@@ -692,7 +696,6 @@ reiserfs_xattr_set(struct inode *inode,
-       }
-       out_filp:
--      mutex_unlock(&dentry->d_inode->i_mutex);
-       dput(dentry);
-       out:
-@@ -722,7 +725,7 @@ reiserfs_xattr_get(const struct inode *i
-       if (get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      dentry = get_xa_file_dentry(inode, name, FL_READONLY);
-+      dentry = get_xa_file_dentry(inode, name, XATTR_REPLACE);
-       if (IS_ERR(dentry)) {
-               err = PTR_ERR(dentry);
-               goto out;
-@@ -806,13 +809,15 @@ int reiserfs_xattr_del(struct inode *ino
-       struct dentry *dir;
-       int err;
--      dir = open_xa_dir(inode, FL_READONLY);
-+      dir = open_xa_dir(inode, XATTR_REPLACE);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-               goto out;
-       }
-+      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = __reiserfs_xattr_del(dir, name, strlen(name));
-+      mutex_unlock(&dir->d_inode->i_mutex);
-       dput(dir);
-       if (!err) {
-@@ -826,6 +831,7 @@ int reiserfs_xattr_del(struct inode *ino
- /* Actual operations that are exported to VFS-land */
-+static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char *);
- /*
-  * Inode operation getxattr()
-  * Preliminary locking: we down dentry->d_inode->i_mutex
-@@ -978,7 +984,7 @@ ssize_t reiserfs_listxattr(struct dentry
-       reiserfs_read_lock_xattr_i(dentry->d_inode);
-       reiserfs_read_lock_xattrs(dentry->d_sb);
--      dir = open_xa_dir(dentry->d_inode, FL_READONLY);
-+      dir = open_xa_dir(dentry->d_inode, XATTR_REPLACE);
-       reiserfs_read_unlock_xattrs(dentry->d_sb);
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-@@ -994,7 +1000,9 @@ ssize_t reiserfs_listxattr(struct dentry
-       REISERFS_I(dentry->d_inode)->i_flags |= i_has_xattr_dir;
-+      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
-       err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf);
-+      mutex_unlock(&dir->d_inode->i_mutex);
-       if (err)
-               goto out_dir;
-@@ -1146,7 +1154,7 @@ static int create_privroot(struct dentry
-       int err;
-       struct inode *inode = dentry->d_parent->d_inode;
-       mutex_lock_nested(&inode->i_mutex, I_MUTEX_XATTR);
--      err = inode->i_op->mkdir(inode, dentry, 0700);
-+      err = xattr_mkdir(inode, dentry, 0700);
-       mutex_unlock(&inode->i_mutex);
-       if (err) {
-               dput(dentry);
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-strip-whitespace.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-strip-whitespace.diff
deleted file mode 100644 (file)
index cf4f8dc..0000000
+++ /dev/null
@@ -1,1335 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: strip trailing whitespace
-
- This patch strips trailing whitespace from the reiserfs code.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
- fs/reiserfs/README             |    4 -
- fs/reiserfs/do_balan.c         |   14 ++--
- fs/reiserfs/file.c             |    8 +-
- fs/reiserfs/fix_node.c         |   38 ++++++------
- fs/reiserfs/hashes.c           |    2 
- fs/reiserfs/ibalance.c         |   10 +--
- fs/reiserfs/inode.c            |   52 ++++++++---------
- fs/reiserfs/ioctl.c            |    2 
- fs/reiserfs/journal.c          |  120 ++++++++++++++++++++---------------------
- fs/reiserfs/lbalance.c         |   18 +++---
- fs/reiserfs/namei.c            |   30 +++++-----
- fs/reiserfs/objectid.c         |    2 
- fs/reiserfs/prints.c           |   26 ++++----
- fs/reiserfs/procfs.c           |    2 
- fs/reiserfs/resize.c           |    6 +-
- fs/reiserfs/stree.c            |    8 +-
- fs/reiserfs/super.c            |   10 +--
- fs/reiserfs/tail_conversion.c  |    2 
- include/linux/reiserfs_fs_sb.h |   14 ++--
- 19 files changed, 184 insertions(+), 184 deletions(-)
-
---- a/fs/reiserfs/do_balan.c
-+++ b/fs/reiserfs/do_balan.c
-@@ -76,21 +76,21 @@ inline void do_balance_mark_leaf_dirty(s
- #define do_balance_mark_internal_dirty do_balance_mark_leaf_dirty
- #define do_balance_mark_sb_dirty do_balance_mark_leaf_dirty
--/* summary: 
-+/* summary:
-  if deleting something ( tb->insert_size[0] < 0 )
-    return(balance_leaf_when_delete()); (flag d handled here)
-  else
-    if lnum is larger than 0 we put items into the left node
-    if rnum is larger than 0 we put items into the right node
-    if snum1 is larger than 0 we put items into the new node s1
--   if snum2 is larger than 0 we put items into the new node s2 
-+   if snum2 is larger than 0 we put items into the new node s2
- Note that all *num* count new items being created.
- It would be easier to read balance_leaf() if each of these summary
- lines was a separate procedure rather than being inlined.  I think
- that there are many passages here and in balance_leaf_when_delete() in
- which two calls to one procedure can replace two passages, and it
--might save cache space and improve software maintenance costs to do so.  
-+might save cache space and improve software maintenance costs to do so.
- Vladimir made the perceptive comment that we should offload most of
- the decision making in this function into fix_nodes/check_balance, and
-@@ -288,15 +288,15 @@ static int balance_leaf(struct tree_bala
-     )
- {
-       struct buffer_head *tbS0 = PATH_PLAST_BUFFER(tb->tb_path);
--      int item_pos = PATH_LAST_POSITION(tb->tb_path); /*  index into the array of item headers in S[0] 
-+      int item_pos = PATH_LAST_POSITION(tb->tb_path); /*  index into the array of item headers in S[0]
-                                                          of the affected item */
-       struct buffer_info bi;
-       struct buffer_head *S_new[2];   /* new nodes allocated to hold what could not fit into S */
-       int snum[2];            /* number of items that will be placed
-                                  into S_new (includes partially shifted
-                                  items) */
--      int sbytes[2];          /* if an item is partially shifted into S_new then 
--                                 if it is a directory item 
-+      int sbytes[2];          /* if an item is partially shifted into S_new then
-+                                 if it is a directory item
-                                  it is the number of entries from the item that are shifted into S_new
-                                  else
-                                  it is the number of bytes from the item that are shifted into S_new
-@@ -1983,7 +1983,7 @@ static inline void do_balance_starts(str
-       /* store_print_tb (tb); */
-       /* do not delete, just comment it out */
--/*    print_tb(flag, PATH_LAST_POSITION(tb->tb_path), tb->tb_path->pos_in_item, tb, 
-+/*    print_tb(flag, PATH_LAST_POSITION(tb->tb_path), tb->tb_path->pos_in_item, tb,
-            "check");*/
-       RFALSE(check_before_balancing(tb), "PAP-12340: locked buffers in TB");
- #ifdef CONFIG_REISERFS_CHECK
---- a/fs/reiserfs/file.c
-+++ b/fs/reiserfs/file.c
-@@ -20,14 +20,14 @@
- ** insertion/balancing, for files that are written in one write.
- ** It avoids unnecessary tail packings (balances) for files that are written in
- ** multiple writes and are small enough to have tails.
--** 
-+**
- ** file_release is called by the VFS layer when the file is closed.  If
- ** this is the last open file descriptor, and the file
- ** small enough to have a tail, and the tail is currently in an
- ** unformatted node, the tail is converted back into a direct item.
--** 
-+**
- ** We use reiserfs_truncate_file to pack the tail, since it already has
--** all the conditions coded.  
-+** all the conditions coded.
- */
- static int reiserfs_file_release(struct inode *inode, struct file *filp)
- {
-@@ -223,7 +223,7 @@ int reiserfs_commit_page(struct inode *i
- }
- /* Write @count bytes at position @ppos in a file indicated by @file
--   from the buffer @buf.  
-+   from the buffer @buf.
-    generic_file_write() is only appropriate for filesystems that are not seeking to optimize performance and want
-    something simple that works.  It is not for serious use by general purpose filesystems, excepting the one that it was
---- a/fs/reiserfs/fix_node.c
-+++ b/fs/reiserfs/fix_node.c
-@@ -30,8 +30,8 @@
-  ** get_direct_parent
-  ** get_neighbors
-  ** fix_nodes
-- ** 
-- ** 
-+ **
-+ **
-  **/
- #include <linux/time.h>
-@@ -377,9 +377,9 @@ static int get_num_ver(int mode, struct 
-       int needed_nodes;
-       int start_item,         /* position of item we start filling node from */
-        end_item,              /* position of item we finish filling node by */
--       start_bytes,           /* number of first bytes (entries for directory) of start_item-th item 
-+       start_bytes,           /* number of first bytes (entries for directory) of start_item-th item
-                                  we do not include into node that is being filled */
--       end_bytes;             /* number of last bytes (entries for directory) of end_item-th item 
-+       end_bytes;             /* number of last bytes (entries for directory) of end_item-th item
-                                  we do node include into node that is being filled */
-       int split_item_positions[2];    /* these are positions in virtual item of
-                                          items, that are split between S[0] and
-@@ -569,7 +569,7 @@ extern struct tree_balance *cur_tb;
- /* Set parameters for balancing.
-  * Performs write of results of analysis of balancing into structure tb,
-- * where it will later be used by the functions that actually do the balancing. 
-+ * where it will later be used by the functions that actually do the balancing.
-  * Parameters:
-  *    tb      tree_balance structure;
-  *    h       current level of the node;
-@@ -1204,7 +1204,7 @@ static inline int can_node_be_removed(in
-  *    h       current level of the node;
-  *    inum    item number in S[h];
-  *    mode    i - insert, p - paste;
-- * Returns:   1 - schedule occurred; 
-+ * Returns:   1 - schedule occurred;
-  *            0 - balancing for higher levels needed;
-  *           -1 - no balancing for higher levels needed;
-  *           -2 - no disk space.
-@@ -1239,7 +1239,7 @@ static int ip_check_balance(struct tree_
-       /* we perform 8 calls to get_num_ver().  For each call we calculate five parameters.
-          where 4th parameter is s1bytes and 5th - s2bytes
-        */
--      short snum012[40] = { 0, };     /* s0num, s1num, s2num for 8 cases 
-+      short snum012[40] = { 0, };     /* s0num, s1num, s2num for 8 cases
-                                          0,1 - do not shift and do not shift but bottle
-                                          2 - shift only whole item to left
-                                          3 - shift to left and bottle as much as possible
-@@ -1288,7 +1288,7 @@ static int ip_check_balance(struct tree_
-       create_virtual_node(tb, h);
--      /*  
-+      /*
-          determine maximal number of items we can shift to the left neighbor (in tb structure)
-          and the maximal number of bytes that can flow to the left neighbor
-          from the left most liquid item that cannot be shifted from S[0] entirely (returned value)
-@@ -1349,13 +1349,13 @@ static int ip_check_balance(struct tree_
-       {
-               int lpar, rpar, nset, lset, rset, lrset;
--              /* 
-+              /*
-                * regular overflowing of the node
-                */
--              /* get_num_ver works in 2 modes (FLOW & NO_FLOW) 
-+              /* get_num_ver works in 2 modes (FLOW & NO_FLOW)
-                  lpar, rpar - number of items we can shift to left/right neighbor (including splitting item)
--                 nset, lset, rset, lrset - shows, whether flowing items give better packing 
-+                 nset, lset, rset, lrset - shows, whether flowing items give better packing
-                */
- #define FLOW 1
- #define NO_FLOW 0             /* do not any splitting */
-@@ -1545,7 +1545,7 @@ static int ip_check_balance(struct tree_
-  *    h       current level of the node;
-  *    inum    item number in S[h];
-  *    mode    i - insert, p - paste;
-- * Returns:   1 - schedule occurred; 
-+ * Returns:   1 - schedule occurred;
-  *            0 - balancing for higher levels needed;
-  *           -1 - no balancing for higher levels needed;
-  *           -2 - no disk space.
-@@ -1728,7 +1728,7 @@ static int dc_check_balance_internal(str
-  *    h       current level of the node;
-  *    inum    item number in S[h];
-  *    mode    i - insert, p - paste;
-- * Returns:   1 - schedule occurred; 
-+ * Returns:   1 - schedule occurred;
-  *            0 - balancing for higher levels needed;
-  *           -1 - no balancing for higher levels needed;
-  *           -2 - no disk space.
-@@ -1822,7 +1822,7 @@ static int dc_check_balance_leaf(struct 
-  *    h       current level of the node;
-  *    inum    item number in S[h];
-  *    mode    d - delete, c - cut.
-- * Returns:   1 - schedule occurred; 
-+ * Returns:   1 - schedule occurred;
-  *            0 - balancing for higher levels needed;
-  *           -1 - no balancing for higher levels needed;
-  *           -2 - no disk space.
-@@ -1851,7 +1851,7 @@ static int dc_check_balance(struct tree_
-  *    h       current level of the node;
-  *    inum    item number in S[h];
-  *    mode    i - insert, p - paste, d - delete, c - cut.
-- * Returns:   1 - schedule occurred; 
-+ * Returns:   1 - schedule occurred;
-  *            0 - balancing for higher levels needed;
-  *           -1 - no balancing for higher levels needed;
-  *           -2 - no disk space.
-@@ -2296,15 +2296,15 @@ static int wait_tb_buffers_until_unlocke
-  *    analyze what and where should be moved;
-  *    get sufficient number of new nodes;
-  * Balancing will start only after all resources will be collected at a time.
-- * 
-+ *
-  * When ported to SMP kernels, only at the last moment after all needed nodes
-  * are collected in cache, will the resources be locked using the usual
-  * textbook ordered lock acquisition algorithms.  Note that ensuring that
-  * this code neither write locks what it does not need to write lock nor locks out of order
-  * will be a pain in the butt that could have been avoided.  Grumble grumble. -Hans
-- * 
-+ *
-  * fix is meant in the sense of render unchanging
-- * 
-+ *
-  * Latency might be improved by first gathering a list of what buffers are needed
-  * and then getting as many of them in parallel as possible? -Hans
-  *
-@@ -2316,7 +2316,7 @@ static int wait_tb_buffers_until_unlocke
-  *      ins_ih & ins_sd are used when inserting
-  * Returns:   1 - schedule occurred while the function worked;
-  *            0 - schedule didn't occur while the function worked;
-- *             -1 - if no_disk_space 
-+ *             -1 - if no_disk_space
-  */
- int fix_nodes(int n_op_mode, struct tree_balance *p_s_tb, struct item_head *p_s_ins_ih,       // item head of item being inserted
---- a/fs/reiserfs/hashes.c
-+++ b/fs/reiserfs/hashes.c
-@@ -7,7 +7,7 @@
-  * (see Applied Cryptography, 2nd edition, p448).
-  *
-  * Jeremy Fitzhardinge <jeremy@zip.com.au> 1998
-- * 
-+ *
-  * Jeremy has agreed to the contents of reiserfs/README. -Hans
-  * Yura's function is added (04/07/2000)
-  */
---- a/fs/reiserfs/ibalance.c
-+++ b/fs/reiserfs/ibalance.c
-@@ -278,7 +278,7 @@ static void internal_delete_childs(struc
- /* copy cpy_num node pointers and cpy_num - 1 items from buffer src to buffer dest
- * last_first == FIRST_TO_LAST means, that we copy first items from src to tail of dest
-- * last_first == LAST_TO_FIRST means, that we copy last items from src to head of dest 
-+ * last_first == LAST_TO_FIRST means, that we copy last items from src to head of dest
-  */
- static void internal_copy_pointers_items(struct buffer_info *dest_bi,
-                                        struct buffer_head *src,
-@@ -385,7 +385,7 @@ static void internal_move_pointers_items
-       if (last_first == FIRST_TO_LAST) {      /* shift_left occurs */
-               first_pointer = 0;
-               first_item = 0;
--              /* delete cpy_num - del_par pointers and keys starting for pointers with first_pointer, 
-+              /* delete cpy_num - del_par pointers and keys starting for pointers with first_pointer,
-                  for key - with first_item */
-               internal_delete_pointers_items(src_bi, first_pointer,
-                                              first_item, cpy_num - del_par);
-@@ -453,7 +453,7 @@ static void internal_insert_key(struct b
-       }
- }
--/* Insert d_key'th (delimiting) key from buffer cfl to tail of dest. 
-+/* Insert d_key'th (delimiting) key from buffer cfl to tail of dest.
-  * Copy pointer_amount node pointers and pointer_amount - 1 items from buffer src to buffer dest.
-  * Replace  d_key'th key in buffer cfl.
-  * Delete pointer_amount items and node pointers from buffer src.
-@@ -518,7 +518,7 @@ static void internal_shift1_left(struct 
-       /*    internal_move_pointers_items (tb->L[h], tb->S[h], FIRST_TO_LAST, pointer_amount, 1); */
- }
--/* Insert d_key'th (delimiting) key from buffer cfr to head of dest. 
-+/* Insert d_key'th (delimiting) key from buffer cfr to head of dest.
-  * Copy n node pointers and n - 1 items from buffer src to buffer dest.
-  * Replace  d_key'th key in buffer cfr.
-  * Delete n items and node pointers from buffer src.
-@@ -749,7 +749,7 @@ int balance_internal(struct tree_balance
-        this means that new pointers and items must be inserted AFTER *
-        child_pos
-        }
--       else 
-+       else
-        {
-        it is the position of the leftmost pointer that must be deleted (together with
-        its corresponding key to the left of the pointer)
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -52,7 +52,7 @@ void reiserfs_delete_inode(struct inode 
-               /* Do quota update inside a transaction for journaled quotas. We must do that
-                * after delete_object so that quota updates go into the same transaction as
-                * stat data deletion */
--              if (!err) 
-+              if (!err)
-                       DQUOT_FREE_INODE(inode);
-               if (journal_end(&th, inode->i_sb, jbegin_count))
-@@ -363,7 +363,7 @@ static int _get_block_create_0(struct in
-               }
-               /* make sure we don't read more bytes than actually exist in
-                ** the file.  This can happen in odd cases where i_size isn't
--               ** correct, and when direct item padding results in a few 
-+               ** correct, and when direct item padding results in a few
-                ** extra bytes at the end of the direct item
-                */
-               if ((le_ih_k_offset(ih) + path.pos_in_item) > inode->i_size)
-@@ -438,15 +438,15 @@ static int reiserfs_bmap(struct inode *i
- ** -ENOENT instead of a valid buffer.  block_prepare_write expects to
- ** be able to do i/o on the buffers returned, unless an error value
- ** is also returned.
--** 
-+**
- ** So, this allows block_prepare_write to be used for reading a single block
- ** in a page.  Where it does not produce a valid page for holes, or past the
- ** end of the file.  This turns out to be exactly what we need for reading
- ** tails for conversion.
- **
- ** The point of the wrapper is forcing a certain value for create, even
--** though the VFS layer is calling this function with create==1.  If you 
--** don't want to send create == GET_BLOCK_NO_HOLE to reiserfs_get_block, 
-+** though the VFS layer is calling this function with create==1.  If you
-+** don't want to send create == GET_BLOCK_NO_HOLE to reiserfs_get_block,
- ** don't use this function.
- */
- static int reiserfs_get_block_create_0(struct inode *inode, sector_t block,
-@@ -602,7 +602,7 @@ int reiserfs_get_block(struct inode *ino
-       int done;
-       int fs_gen;
-       struct reiserfs_transaction_handle *th = NULL;
--      /* space reserved in transaction batch: 
-+      /* space reserved in transaction batch:
-          . 3 balancings in direct->indirect conversion
-          . 1 block involved into reiserfs_update_sd()
-          XXX in practically impossible worst case direct2indirect()
-@@ -754,7 +754,7 @@ int reiserfs_get_block(struct inode *ino
-               reiserfs_write_unlock(inode->i_sb);
-               /* the item was found, so new blocks were not added to the file
--               ** there is no need to make sure the inode is updated with this 
-+               ** there is no need to make sure the inode is updated with this
-                ** transaction
-                */
-               return retval;
-@@ -986,7 +986,7 @@ int reiserfs_get_block(struct inode *ino
-               /* this loop could log more blocks than we had originally asked
-                ** for.  So, we have to allow the transaction to end if it is
--               ** too big or too full.  Update the inode so things are 
-+               ** too big or too full.  Update the inode so things are
-                ** consistent if we crash before the function returns
-                **
-                ** release the path so that anybody waiting on the path before
-@@ -997,7 +997,7 @@ int reiserfs_get_block(struct inode *ino
-                       if (retval)
-                               goto failure;
-               }
--              /* inserting indirect pointers for a hole can take a 
-+              /* inserting indirect pointers for a hole can take a
-                ** long time.  reschedule if needed
-                */
-               cond_resched();
-@@ -1444,7 +1444,7 @@ void reiserfs_read_locked_inode(struct i
-          update sd on unlink all that is required is to check for nlink
-          here. This bug was first found by Sizif when debugging
-          SquidNG/Butterfly, forgotten, and found again after Philippe
--         Gramoulle <philippe.gramoulle@mmania.com> reproduced it. 
-+         Gramoulle <philippe.gramoulle@mmania.com> reproduced it.
-          More logical fix would require changes in fs/inode.c:iput() to
-          remove inode from hash-table _after_ fs cleaned disk stuff up and
-@@ -1628,7 +1628,7 @@ int reiserfs_write_inode(struct inode *i
-       if (inode->i_sb->s_flags & MS_RDONLY)
-               return -EROFS;
-       /* memory pressure can sometimes initiate write_inode calls with sync == 1,
--       ** these cases are just when the system needs ram, not when the 
-+       ** these cases are just when the system needs ram, not when the
-        ** inode needs to reach disk for safety, and they can safely be
-        ** ignored because the altered inode has already been logged.
-        */
-@@ -1745,7 +1745,7 @@ static int reiserfs_new_symlink(struct r
- /* inserts the stat data into the tree, and then calls
-    reiserfs_new_directory (to insert ".", ".." item if new object is
-    directory) or reiserfs_new_symlink (to insert symlink body if new
--   object is symlink) or nothing (if new object is regular file) 
-+   object is symlink) or nothing (if new object is regular file)
-    NOTE! uid and gid must already be set in the inode.  If we return
-    non-zero due to an error, we have to drop the quota previously allocated
-@@ -1753,7 +1753,7 @@ static int reiserfs_new_symlink(struct r
-    if we return non-zero, we also end the transaction.  */
- int reiserfs_new_inode(struct reiserfs_transaction_handle *th,
-                      struct inode *dir, int mode, const char *symname,
--                     /* 0 for regular, EMTRY_DIR_SIZE for dirs, 
-+                     /* 0 for regular, EMTRY_DIR_SIZE for dirs,
-                         strlen (symname) for symlinks) */
-                      loff_t i_size, struct dentry *dentry,
-                      struct inode *inode,
-@@ -1788,7 +1788,7 @@ int reiserfs_new_inode(struct reiserfs_t
-               goto out_bad_inode;
-       }
-       if (old_format_only(sb))
--              /* not a perfect generation count, as object ids can be reused, but 
-+              /* not a perfect generation count, as object ids can be reused, but
-                ** this is as good as reiserfs can do right now.
-                ** note that the private part of inode isn't filled in yet, we have
-                ** to use the directory.
-@@ -2086,7 +2086,7 @@ int reiserfs_truncate_file(struct inode 
-       if (p_s_inode->i_size > 0) {
-               if ((error = grab_tail_page(p_s_inode, &page, &bh))) {
--                      // -ENOENT means we truncated past the end of the file, 
-+                      // -ENOENT means we truncated past the end of the file,
-                       // and get_block_create_0 could not find a block to read in,
-                       // which is ok.
-                       if (error != -ENOENT)
-@@ -2098,11 +2098,11 @@ int reiserfs_truncate_file(struct inode 
-               }
-       }
--      /* so, if page != NULL, we have a buffer head for the offset at 
--       ** the end of the file. if the bh is mapped, and bh->b_blocknr != 0, 
--       ** then we have an unformatted node.  Otherwise, we have a direct item, 
--       ** and no zeroing is required on disk.  We zero after the truncate, 
--       ** because the truncate might pack the item anyway 
-+      /* so, if page != NULL, we have a buffer head for the offset at
-+       ** the end of the file. if the bh is mapped, and bh->b_blocknr != 0,
-+       ** then we have an unformatted node.  Otherwise, we have a direct item,
-+       ** and no zeroing is required on disk.  We zero after the truncate,
-+       ** because the truncate might pack the item anyway
-        ** (it will unmap bh if it packs).
-        */
-       /* it is enough to reserve space in transaction for 2 balancings:
-@@ -2311,8 +2311,8 @@ static int map_block_for_writepage(struc
-       return retval;
- }
--/* 
-- * mason@suse.com: updated in 2.5.54 to follow the same general io 
-+/*
-+ * mason@suse.com: updated in 2.5.54 to follow the same general io
-  * start/recovery path as __block_write_full_page, along with special
-  * code to handle reiserfs tails.
-  */
-@@ -2452,7 +2452,7 @@ static int reiserfs_write_full_page(stru
-       unlock_page(page);
-       /*
--       * since any buffer might be the only dirty buffer on the page, 
-+       * since any buffer might be the only dirty buffer on the page,
-        * the first submit_bh can bring the page out of writeback.
-        * be careful with the buffers.
-        */
-@@ -2471,8 +2471,8 @@ static int reiserfs_write_full_page(stru
-       if (nr == 0) {
-               /*
-                * if this page only had a direct item, it is very possible for
--               * no io to be required without there being an error.  Or, 
--               * someone else could have locked them and sent them down the 
-+               * no io to be required without there being an error.  Or,
-+               * someone else could have locked them and sent them down the
-                * pipe without locking the page
-                */
-               bh = head;
-@@ -2491,7 +2491,7 @@ static int reiserfs_write_full_page(stru
-       fail:
-       /* catches various errors, we need to make sure any valid dirty blocks
--       * get to the media.  The page is currently locked and not marked for 
-+       * get to the media.  The page is currently locked and not marked for
-        * writeback
-        */
-       ClearPageUptodate(page);
---- a/fs/reiserfs/ioctl.c
-+++ b/fs/reiserfs/ioctl.c
-@@ -189,7 +189,7 @@ int reiserfs_unpack(struct inode *inode,
-       }
-       /* we unpack by finding the page with the tail, and calling
--       ** reiserfs_prepare_write on that page.  This will force a 
-+       ** reiserfs_prepare_write on that page.  This will force a
-        ** reiserfs_get_block to unpack the tail for us.
-        */
-       index = inode->i_size >> PAGE_CACHE_SHIFT;
---- a/fs/reiserfs/journal.c
-+++ b/fs/reiserfs/journal.c
-@@ -1,36 +1,36 @@
- /*
- ** Write ahead logging implementation copyright Chris Mason 2000
- **
--** The background commits make this code very interelated, and 
-+** The background commits make this code very interelated, and
- ** overly complex.  I need to rethink things a bit....The major players:
- **
--** journal_begin -- call with the number of blocks you expect to log.  
-+** journal_begin -- call with the number of blocks you expect to log.
- **                  If the current transaction is too
--**                old, it will block until the current transaction is 
-+**                old, it will block until the current transaction is
- **                finished, and then start a new one.
--**                Usually, your transaction will get joined in with 
-+**                Usually, your transaction will get joined in with
- **                  previous ones for speed.
- **
--** journal_join  -- same as journal_begin, but won't block on the current 
-+** journal_join  -- same as journal_begin, but won't block on the current
- **                  transaction regardless of age.  Don't ever call
--**                  this.  Ever.  There are only two places it should be 
-+**                  this.  Ever.  There are only two places it should be
- **                  called from, and they are both inside this file.
- **
--** journal_mark_dirty -- adds blocks into this transaction.  clears any flags 
-+** journal_mark_dirty -- adds blocks into this transaction.  clears any flags
- **                       that might make them get sent to disk
--**                       and then marks them BH_JDirty.  Puts the buffer head 
--**                       into the current transaction hash.  
-+**                       and then marks them BH_JDirty.  Puts the buffer head
-+**                       into the current transaction hash.
- **
- ** journal_end -- if the current transaction is batchable, it does nothing
- **                   otherwise, it could do an async/synchronous commit, or
--**                   a full flush of all log and real blocks in the 
-+**                   a full flush of all log and real blocks in the
- **                   transaction.
- **
--** flush_old_commits -- if the current transaction is too old, it is ended and 
--**                      commit blocks are sent to disk.  Forces commit blocks 
--**                      to disk for all backgrounded commits that have been 
-+** flush_old_commits -- if the current transaction is too old, it is ended and
-+**                      commit blocks are sent to disk.  Forces commit blocks
-+**                      to disk for all backgrounded commits that have been
- **                      around too long.
--**                 -- Note, if you call this as an immediate flush from 
-+**                 -- Note, if you call this as an immediate flush from
- **                    from within kupdate, it will ignore the immediate flag
- */
-@@ -212,7 +212,7 @@ static void allocate_bitmap_nodes(struct
-                       list_add(&bn->list, &journal->j_bitmap_nodes);
-                       journal->j_free_bitmap_nodes++;
-               } else {
--                      break;  // this is ok, we'll try again when more are needed 
-+                      break;  /* this is ok, we'll try again when more are needed */
-               }
-       }
- }
-@@ -283,7 +283,7 @@ static int free_bitmap_nodes(struct supe
- }
- /*
--** get memory for JOURNAL_NUM_BITMAPS worth of bitmaps. 
-+** get memory for JOURNAL_NUM_BITMAPS worth of bitmaps.
- ** jb_array is the array to be filled in.
- */
- int reiserfs_allocate_list_bitmaps(struct super_block *p_s_sb,
-@@ -315,7 +315,7 @@ int reiserfs_allocate_list_bitmaps(struc
- }
- /*
--** find an available list bitmap.  If you can't find one, flush a commit list 
-+** find an available list bitmap.  If you can't find one, flush a commit list
- ** and try again
- */
- static struct reiserfs_list_bitmap *get_list_bitmap(struct super_block *p_s_sb,
-@@ -348,7 +348,7 @@ static struct reiserfs_list_bitmap *get_
-       return jb;
- }
--/* 
-+/*
- ** allocates a new chunk of X nodes, and links them all together as a list.
- ** Uses the cnode->next and cnode->prev pointers
- ** returns NULL on failure
-@@ -376,7 +376,7 @@ static struct reiserfs_journal_cnode *al
- }
- /*
--** pulls a cnode off the free list, or returns NULL on failure 
-+** pulls a cnode off the free list, or returns NULL on failure
- */
- static struct reiserfs_journal_cnode *get_cnode(struct super_block *p_s_sb)
- {
-@@ -403,7 +403,7 @@ static struct reiserfs_journal_cnode *ge
- }
- /*
--** returns a cnode to the free list 
-+** returns a cnode to the free list
- */
- static void free_cnode(struct super_block *p_s_sb,
-                      struct reiserfs_journal_cnode *cn)
-@@ -1192,8 +1192,8 @@ static int flush_commit_list(struct supe
- }
- /*
--** flush_journal_list frequently needs to find a newer transaction for a given block.  This does that, or 
--** returns NULL if it can't find anything 
-+** flush_journal_list frequently needs to find a newer transaction for a given block.  This does that, or
-+** returns NULL if it can't find anything
- */
- static struct reiserfs_journal_list *find_newer_jl_for_cn(struct
-                                                         reiserfs_journal_cnode
-@@ -1335,8 +1335,8 @@ static int update_journal_header_block(s
-       return _update_journal_header_block(p_s_sb, offset, trans_id);
- }
--/* 
--** flush any and all journal lists older than you are 
-+/*
-+** flush any and all journal lists older than you are
- ** can only be called from flush_journal_list
- */
- static int flush_older_journal_lists(struct super_block *p_s_sb,
-@@ -1382,8 +1382,8 @@ static void del_from_work_list(struct su
- ** always set flushall to 1, unless you are calling from inside
- ** flush_journal_list
- **
--** IMPORTANT.  This can only be called while there are no journal writers, 
--** and the journal is locked.  That means it can only be called from 
-+** IMPORTANT.  This can only be called while there are no journal writers,
-+** and the journal is locked.  That means it can only be called from
- ** do_journal_end, or by journal_release
- */
- static int flush_journal_list(struct super_block *s,
-@@ -1429,7 +1429,7 @@ static int flush_journal_list(struct sup
-               goto flush_older_and_return;
-       }
--      /* start by putting the commit list on disk.  This will also flush 
-+      /* start by putting the commit list on disk.  This will also flush
-        ** the commit lists of any olders transactions
-        */
-       flush_commit_list(s, jl, 1);
-@@ -1444,8 +1444,8 @@ static int flush_journal_list(struct sup
-               goto flush_older_and_return;
-       }
--      /* loop through each cnode, see if we need to write it, 
--       ** or wait on a more recent transaction, or just ignore it 
-+      /* loop through each cnode, see if we need to write it,
-+       ** or wait on a more recent transaction, or just ignore it
-        */
-       if (atomic_read(&(journal->j_wcount)) != 0) {
-               reiserfs_panic(s, "journal-844", "journal list is flushing, "
-@@ -1473,8 +1473,8 @@ static int flush_journal_list(struct sup
-               if (!pjl && cn->bh) {
-                       saved_bh = cn->bh;
--                      /* we do this to make sure nobody releases the buffer while 
--                       ** we are working with it 
-+                      /* we do this to make sure nobody releases the buffer while
-+                       ** we are working with it
-                        */
-                       get_bh(saved_bh);
-@@ -1497,8 +1497,8 @@ static int flush_journal_list(struct sup
-                       goto free_cnode;
-               }
--              /* bh == NULL when the block got to disk on its own, OR, 
--               ** the block got freed in a future transaction 
-+              /* bh == NULL when the block got to disk on its own, OR,
-+               ** the block got freed in a future transaction
-                */
-               if (saved_bh == NULL) {
-                       goto free_cnode;
-@@ -1586,7 +1586,7 @@ static int flush_journal_list(struct sup
-                              __func__);
-       flush_older_and_return:
--      /* before we can update the journal header block, we _must_ flush all 
-+      /* before we can update the journal header block, we _must_ flush all
-        ** real blocks from all older transactions to disk.  This is because
-        ** once the header block is updated, this transaction will not be
-        ** replayed after a crash
-@@ -1596,7 +1596,7 @@ static int flush_journal_list(struct sup
-       }
-       err = journal->j_errno;
--      /* before we can remove everything from the hash tables for this 
-+      /* before we can remove everything from the hash tables for this
-        ** transaction, we must make sure it can never be replayed
-        **
-        ** since we are only called from do_journal_end, we know for sure there
-@@ -2016,9 +2016,9 @@ static int journal_compare_desc_commit(s
-       return 0;
- }
--/* returns 0 if it did not find a description block  
-+/* returns 0 if it did not find a description block
- ** returns -1 if it found a corrupt commit block
--** returns 1 if both desc and commit were valid 
-+** returns 1 if both desc and commit were valid
- */
- static int journal_transaction_is_valid(struct super_block *p_s_sb,
-                                       struct buffer_head *d_bh,
-@@ -2380,8 +2380,8 @@ static int journal_read(struct super_blo
-                     bdevname(journal->j_dev_bd, b));
-       start = get_seconds();
--      /* step 1, read in the journal header block.  Check the transaction it says 
--       ** is the first unflushed, and if that transaction is not valid, 
-+      /* step 1, read in the journal header block.  Check the transaction it says
-+       ** is the first unflushed, and if that transaction is not valid,
-        ** replay is done
-        */
-       journal->j_header_bh = journal_bread(p_s_sb,
-@@ -2406,8 +2406,8 @@ static int journal_read(struct super_blo
-                              le32_to_cpu(jh->j_last_flush_trans_id));
-               valid_journal_header = 1;
--              /* now, we try to read the first unflushed offset.  If it is not valid, 
--               ** there is nothing more we can do, and it makes no sense to read 
-+              /* now, we try to read the first unflushed offset.  If it is not valid,
-+               ** there is nothing more we can do, and it makes no sense to read
-                ** through the whole log.
-                */
-               d_bh =
-@@ -2916,7 +2916,7 @@ int journal_transaction_should_end(struc
-       return 0;
- }
--/* this must be called inside a transaction, and requires the 
-+/* this must be called inside a transaction, and requires the
- ** kernel_lock to be held
- */
- void reiserfs_block_writes(struct reiserfs_transaction_handle *th)
-@@ -3037,7 +3037,7 @@ static int do_journal_begin_r(struct rei
-       now = get_seconds();
-       /* if there is no room in the journal OR
--       ** if this transaction is too old, and we weren't called joinable, wait for it to finish before beginning 
-+       ** if this transaction is too old, and we weren't called joinable, wait for it to finish before beginning
-        ** we don't sleep if there aren't other writers
-        */
-@@ -3237,7 +3237,7 @@ int journal_begin(struct reiserfs_transa
- **
- ** if it was dirty, cleans and files onto the clean list.  I can't let it be dirty again until the
- ** transaction is committed.
--** 
-+**
- ** if j_len, is bigger than j_len_alloc, it pushes j_len_alloc to 10 + j_len.
- */
- int journal_mark_dirty(struct reiserfs_transaction_handle *th,
-@@ -3287,7 +3287,7 @@ int journal_mark_dirty(struct reiserfs_t
-                                atomic_read(&(journal->j_wcount)));
-               return 1;
-       }
--      /* this error means I've screwed up, and we've overflowed the transaction.  
-+      /* this error means I've screwed up, and we've overflowed the transaction.
-        ** Nothing can be done here, except make the FS readonly or panic.
-        */
-       if (journal->j_len >= journal->j_trans_max) {
-@@ -3377,7 +3377,7 @@ int journal_end(struct reiserfs_transact
-       }
- }
--/* removes from the current transaction, relsing and descrementing any counters.  
-+/* removes from the current transaction, relsing and descrementing any counters.
- ** also files the removed buffer directly onto the clean list
- **
- ** called by journal_mark_freed when a block has been deleted
-@@ -3475,7 +3475,7 @@ static int can_dirty(struct reiserfs_jou
- }
- /* syncs the commit blocks, but does not force the real buffers to disk
--** will wait until the current transaction is done/committed before returning 
-+** will wait until the current transaction is done/committed before returning
- */
- int journal_end_sync(struct reiserfs_transaction_handle *th,
-                    struct super_block *p_s_sb, unsigned long nblocks)
-@@ -3557,13 +3557,13 @@ int reiserfs_flush_old_commits(struct su
- /*
- ** returns 0 if do_journal_end should return right away, returns 1 if do_journal_end should finish the commit
--** 
--** if the current transaction is too old, but still has writers, this will wait on j_join_wait until all 
-+**
-+** if the current transaction is too old, but still has writers, this will wait on j_join_wait until all
- ** the writers are done.  By the time it wakes up, the transaction it was called has already ended, so it just
- ** flushes the commit list and returns 0.
- **
- ** Won't batch when flush or commit_now is set.  Also won't batch when others are waiting on j_join_wait.
--** 
-+**
- ** Note, we can't allow the journal_end to proceed while there are still writers in the log.
- */
- static int check_journal_end(struct reiserfs_transaction_handle *th,
-@@ -3591,7 +3591,7 @@ static int check_journal_end(struct reis
-               atomic_dec(&(journal->j_wcount));
-       }
--      /* BUG, deal with case where j_len is 0, but people previously freed blocks need to be released 
-+      /* BUG, deal with case where j_len is 0, but people previously freed blocks need to be released
-        ** will be dealt with by next transaction that actually writes something, but should be taken
-        ** care of in this trans
-        */
-@@ -3600,7 +3600,7 @@ static int check_journal_end(struct reis
-       /* if wcount > 0, and we are called to with flush or commit_now,
-        ** we wait on j_join_wait.  We will wake up when the last writer has
-        ** finished the transaction, and started it on its way to the disk.
--       ** Then, we flush the commit or journal list, and just return 0 
-+       ** Then, we flush the commit or journal list, and just return 0
-        ** because the rest of journal end was already done for this transaction.
-        */
-       if (atomic_read(&(journal->j_wcount)) > 0) {
-@@ -3671,7 +3671,7 @@ static int check_journal_end(struct reis
- /*
- ** Does all the work that makes deleting blocks safe.
- ** when deleting a block mark BH_JNew, just remove it from the current transaction, clean it's buffer_head and move on.
--** 
-+**
- ** otherwise:
- ** set a bit for the block in the journal bitmap.  That will prevent it from being allocated for unformatted nodes
- ** before this transaction has finished.
-@@ -3875,7 +3875,7 @@ extern struct tree_balance *cur_tb;
- ** be written to disk while we are altering it.  So, we must:
- ** clean it
- ** wait on it.
--** 
-+**
- */
- int reiserfs_prepare_for_journal(struct super_block *p_s_sb,
-                                struct buffer_head *bh, int wait)
-@@ -3917,7 +3917,7 @@ static void flush_old_journal_lists(stru
-       }
- }
--/* 
-+/*
- ** long and ugly.  If flush, will not return until all commit
- ** blocks and all real buffers in the trans are on disk.
- ** If no_async, won't return until all commit blocks are on disk.
-@@ -3978,7 +3978,7 @@ static int do_journal_end(struct reiserf
-               wait_on_commit = 1;
-       }
--      /* check_journal_end locks the journal, and unlocks if it does not return 1 
-+      /* check_journal_end locks the journal, and unlocks if it does not return 1
-        ** it tells us if we should continue with the journal_end, or just return
-        */
-       if (!check_journal_end(th, p_s_sb, nblocks, flags)) {
-@@ -4075,7 +4075,7 @@ static int do_journal_end(struct reiserf
-                               last_cn->next = jl_cn;
-                       }
-                       last_cn = jl_cn;
--                      /* make sure the block we are trying to log is not a block 
-+                      /* make sure the block we are trying to log is not a block
-                          of journal or reserved area */
-                       if (is_block_in_log_or_reserved_area
-@@ -4222,9 +4222,9 @@ static int do_journal_end(struct reiserf
-       } else if (!(jl->j_state & LIST_COMMIT_PENDING))
-               queue_delayed_work(commit_wq, &journal->j_work, HZ / 10);
--      /* if the next transaction has any chance of wrapping, flush 
--       ** transactions that might get overwritten.  If any journal lists are very 
--       ** old flush them as well.  
-+      /* if the next transaction has any chance of wrapping, flush
-+       ** transactions that might get overwritten.  If any journal lists are very
-+       ** old flush them as well.
-        */
-       first_jl:
-       list_for_each_safe(entry, safe, &journal->j_journal_list) {
---- a/fs/reiserfs/lbalance.c
-+++ b/fs/reiserfs/lbalance.c
-@@ -119,8 +119,8 @@ static void leaf_copy_dir_entries(struct
-                          DEH_SIZE * copy_count + copy_records_len);
- }
--/* Copy the first (if last_first == FIRST_TO_LAST) or last (last_first == LAST_TO_FIRST) item or 
--   part of it or nothing (see the return 0 below) from SOURCE to the end 
-+/* Copy the first (if last_first == FIRST_TO_LAST) or last (last_first == LAST_TO_FIRST) item or
-+   part of it or nothing (see the return 0 below) from SOURCE to the end
-    (if last_first) or beginning (!last_first) of the DEST */
- /* returns 1 if anything was copied, else 0 */
- static int leaf_copy_boundary_item(struct buffer_info *dest_bi,
-@@ -396,7 +396,7 @@ static void leaf_item_bottle(struct buff
-               else {
-                       struct item_head n_ih;
--                      /* copy part of the body of the item number 'item_num' of SOURCE to the end of the DEST 
-+                      /* copy part of the body of the item number 'item_num' of SOURCE to the end of the DEST
-                          part defined by 'cpy_bytes'; create new item header; change old item_header (????);
-                          n_ih = new item_header;
-                        */
-@@ -426,7 +426,7 @@ static void leaf_item_bottle(struct buff
-               else {
-                       struct item_head n_ih;
--                      /* copy part of the body of the item number 'item_num' of SOURCE to the begin of the DEST 
-+                      /* copy part of the body of the item number 'item_num' of SOURCE to the begin of the DEST
-                          part defined by 'cpy_bytes'; create new item header;
-                          n_ih = new item_header;
-                        */
-@@ -724,7 +724,7 @@ int leaf_shift_right(struct tree_balance
- static void leaf_delete_items_entirely(struct buffer_info *bi,
-                                      int first, int del_num);
- /*  If del_bytes == -1, starting from position 'first' delete del_num items in whole in buffer CUR.
--    If not. 
-+    If not.
-     If last_first == 0. Starting from position 'first' delete del_num-1 items in whole. Delete part of body of
-     the first item. Part defined by del_bytes. Don't delete first item header
-     If last_first == 1. Starting from position 'first+1' delete del_num-1 items in whole. Delete part of body of
-@@ -783,7 +783,7 @@ void leaf_delete_items(struct buffer_inf
-                               /* len = body len of item */
-                               len = ih_item_len(ih);
--                      /* delete the part of the last item of the bh 
-+                      /* delete the part of the last item of the bh
-                          do not delete item header
-                        */
-                       leaf_cut_from_buffer(cur_bi, B_NR_ITEMS(bh) - 1,
-@@ -865,7 +865,7 @@ void leaf_insert_into_buf(struct buffer_
-       }
- }
--/* paste paste_size bytes to affected_item_num-th item. 
-+/* paste paste_size bytes to affected_item_num-th item.
-    When item is a directory, this only prepare space for new entries */
- void leaf_paste_in_buffer(struct buffer_info *bi, int affected_item_num,
-                         int pos_in_item, int paste_size,
-@@ -1022,7 +1022,7 @@ static int leaf_cut_entries(struct buffe
- /*  when cut item is part of regular file
-         pos_in_item - first byte that must be cut
-         cut_size - number of bytes to be cut beginning from pos_in_item
-- 
-+
-    when cut item is part of directory
-         pos_in_item - number of first deleted entry
-         cut_size - count of deleted entries
-@@ -1275,7 +1275,7 @@ void leaf_paste_entries(struct buffer_in
-       /* change item key if necessary (when we paste before 0-th entry */
-       if (!before) {
-               set_le_ih_k_offset(ih, deh_offset(new_dehs));
--/*      memcpy (&ih->ih_key.k_offset, 
-+/*      memcpy (&ih->ih_key.k_offset,
-                      &new_dehs->deh_offset, SHORT_KEY_SIZE);*/
-       }
- #ifdef CONFIG_REISERFS_CHECK
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -106,7 +106,7 @@ key of the first directory entry in it.
- This function first calls search_by_key, then, if item whose first
- entry matches is not found it looks for the entry inside directory
- item found by search_by_key. Fills the path to the entry, and to the
--entry position in the item 
-+entry position in the item
- */
-@@ -371,7 +371,7 @@ static struct dentry *reiserfs_lookup(st
-       return d_splice_alias(inode, dentry);
- }
--/* 
-+/*
- ** looks up the dentry of the parent directory for child.
- ** taken from ext2_get_parent
- */
-@@ -410,7 +410,7 @@ struct dentry *reiserfs_get_parent(struc
-       return parent;
- }
--/* add entry to the directory (entry can be hidden). 
-+/* add entry to the directory (entry can be hidden).
- insert definition of when hidden directories are used here -Hans
-@@ -568,7 +568,7 @@ static int drop_new_inode(struct inode *
-       return 0;
- }
--/* utility function that does setup for reiserfs_new_inode.  
-+/* utility function that does setup for reiserfs_new_inode.
- ** DQUOT_INIT needs lots of credits so it's better to have it
- ** outside of a transaction, so we had to pull some bits of
- ** reiserfs_new_inode out into this func.
-@@ -823,7 +823,7 @@ static inline int reiserfs_empty_dir(str
- {
-       /* we can cheat because an old format dir cannot have
-        ** EMPTY_DIR_SIZE, and a new format dir cannot have
--       ** EMPTY_DIR_SIZE_V1.  So, if the inode is either size, 
-+       ** EMPTY_DIR_SIZE_V1.  So, if the inode is either size,
-        ** regardless of disk format version, the directory is empty.
-        */
-       if (inode->i_size != EMPTY_DIR_SIZE &&
-@@ -1163,7 +1163,7 @@ static int reiserfs_link(struct dentry *
-       return retval;
- }
--// de contains information pointing to an entry which 
-+/* de contains information pointing to an entry which */
- static int de_still_valid(const char *name, int len,
-                         struct reiserfs_dir_entry *de)
- {
-@@ -1207,10 +1207,10 @@ static void set_ino_in_dir_entry(struct 
-       de->de_deh[de->de_entry_num].deh_objectid = key->k_objectid;
- }
--/* 
-+/*
-  * process, that is going to call fix_nodes/do_balance must hold only
-  * one path. If it holds 2 or more, it can get into endless waiting in
-- * get_empty_nodes or its clones 
-+ * get_empty_nodes or its clones
-  */
- static int reiserfs_rename(struct inode *old_dir, struct dentry *old_dentry,
-                          struct inode *new_dir, struct dentry *new_dentry)
-@@ -1264,7 +1264,7 @@ static int reiserfs_rename(struct inode 
-       old_inode_mode = old_inode->i_mode;
-       if (S_ISDIR(old_inode_mode)) {
--              // make sure, that directory being renamed has correct ".." 
-+              // make sure, that directory being renamed has correct ".."
-               // and that its new parent directory has not too many links
-               // already
-@@ -1275,8 +1275,8 @@ static int reiserfs_rename(struct inode 
-                       }
-               }
--              /* directory is renamed, its parent directory will be changed, 
--               ** so find ".." entry 
-+              /* directory is renamed, its parent directory will be changed,
-+               ** so find ".." entry
-                */
-               dot_dot_de.de_gen_number_bit_string = NULL;
-               retval =
-@@ -1386,9 +1386,9 @@ static int reiserfs_rename(struct inode 
-                  this stuff, yes? Then, having
-                  gathered everything into RAM we
-                  should lock the buffers, yes?  -Hans */
--              /* probably.  our rename needs to hold more 
--               ** than one path at once.  The seals would 
--               ** have to be written to deal with multi-path 
-+              /* probably.  our rename needs to hold more
-+               ** than one path at once.  The seals would
-+               ** have to be written to deal with multi-path
-                ** issues -chris
-                */
-               /* sanity checking before doing the rename - avoid races many
-@@ -1466,7 +1466,7 @@ static int reiserfs_rename(struct inode 
-       }
-       if (S_ISDIR(old_inode_mode)) {
--              // adjust ".." of renamed directory 
-+              /* adjust ".." of renamed directory */
-               set_ino_in_dir_entry(&dot_dot_de, INODE_PKEY(new_dir));
-               journal_mark_dirty(&th, new_dir->i_sb, dot_dot_de.de_bh);
---- a/fs/reiserfs/objectid.c
-+++ b/fs/reiserfs/objectid.c
-@@ -180,7 +180,7 @@ int reiserfs_convert_objectid_map_v1(str
-       if (cur_size > new_size) {
-               /* mark everyone used that was listed as free at the end of the objectid
--               ** map 
-+               ** map
-                */
-               objectid_map[new_size - 1] = objectid_map[cur_size - 1];
-               set_sb_oid_cursize(disk_sb, new_size);
---- a/fs/reiserfs/prints.c
-+++ b/fs/reiserfs/prints.c
-@@ -181,11 +181,11 @@ static char *is_there_reiserfs_struct(ch
-    appropriative printk. With this reiserfs_warning you can use format
-    specification for complex structures like you used to do with
-    printfs for integers, doubles and pointers. For instance, to print
--   out key structure you have to write just: 
--   reiserfs_warning ("bad key %k", key); 
--   instead of 
--   printk ("bad key %lu %lu %lu %lu", key->k_dir_id, key->k_objectid, 
--           key->k_offset, key->k_uniqueness); 
-+   out key structure you have to write just:
-+   reiserfs_warning ("bad key %k", key);
-+   instead of
-+   printk ("bad key %lu %lu %lu %lu", key->k_dir_id, key->k_objectid,
-+           key->k_offset, key->k_uniqueness);
- */
- static void prepare_error_buf(const char *fmt, va_list args)
-@@ -247,11 +247,11 @@ static void prepare_error_buf(const char
- }
- /* in addition to usual conversion specifiers this accepts reiserfs
--   specific conversion specifiers: 
--   %k to print little endian key, 
--   %K to print cpu key, 
-+   specific conversion specifiers:
-+   %k to print little endian key,
-+   %K to print cpu key,
-    %h to print item_head,
--   %t to print directory entry 
-+   %t to print directory entry
-    %z to print block head (arg must be struct buffer_head *
-    %b to print buffer_head
- */
-@@ -317,17 +317,17 @@ void reiserfs_debug(struct super_block *
-     maintainer-errorid.  Don't bother with reusing errorids, there are
-     lots of numbers out there.
--    Example: 
--    
-+    Example:
-+
-     reiserfs_panic(
-       p_sb, "reiser-29: reiserfs_new_blocknrs: "
-       "one of search_start or rn(%d) is equal to MAX_B_NUM,"
--      "which means that we are optimizing location based on the bogus location of a temp buffer (%p).", 
-+      "which means that we are optimizing location based on the bogus location of a temp buffer (%p).",
-       rn, bh
-     );
-     Regular panic()s sometimes clear the screen before the message can
--    be read, thus the need for the while loop.  
-+    be read, thus the need for the while loop.
-     Numbering scheme for panic used by Vladimir and Anatoly( Hans completely ignores this scheme, and considers it
-     pointless complexity):
---- a/fs/reiserfs/procfs.c
-+++ b/fs/reiserfs/procfs.c
-@@ -636,7 +636,7 @@ int reiserfs_global_version_in_proc(char
-  *
-  */
--/* 
-+/*
-  * Make Linus happy.
-  * Local variables:
-  * c-indentation-style: "K&R"
---- a/fs/reiserfs/README
-+++ b/fs/reiserfs/README
-@@ -1,4 +1,4 @@
--[LICENSING] 
-+[LICENSING]
- ReiserFS is hereby licensed under the GNU General
- Public License version 2.
-@@ -31,7 +31,7 @@ the GPL as not allowing those additional
- it wrongly, and Richard Stallman agrees with me, when carefully read
- you can see that those restrictions on additional terms do not apply
- to the owner of the copyright, and my interpretation of this shall
--govern for this license.  
-+govern for this license.
- Finally, nothing in this license shall be interpreted to allow you to
- fail to fairly credit me, or to remove my credits, without my
---- a/fs/reiserfs/resize.c
-+++ b/fs/reiserfs/resize.c
-@@ -1,8 +1,8 @@
--/* 
-+/*
-  * Copyright 2000 by Hans Reiser, licensing governed by reiserfs/README
-  */
--/* 
-+/*
-  * Written by Alexander Zarochentcev.
-  *
-  * The kernel part of the (on-line) reiserfs resizer.
-@@ -101,7 +101,7 @@ int reiserfs_resize(struct super_block *
-                       memcpy(jbitmap[i].bitmaps, jb->bitmaps, copy_size);
-                       /* just in case vfree schedules on us, copy the new
--                       ** pointer into the journal struct before freeing the 
-+                       ** pointer into the journal struct before freeing the
-                        ** old one
-                        */
-                       node_tmp = jb->bitmaps;
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -77,7 +77,7 @@ inline void copy_item_head(struct item_h
- /* k1 is pointer to on-disk structure which is stored in little-endian
-    form. k2 is pointer to cpu variable. For key of items of the same
-    object this returns 0.
--   Returns: -1 if key1 < key2 
-+   Returns: -1 if key1 < key2
-    0 if key1 == key2
-    1 if key1 > key2 */
- inline int comp_short_keys(const struct reiserfs_key *le_key,
-@@ -890,7 +890,7 @@ static inline int prepare_for_direct_ite
-       }
-       // new file gets truncated
-       if (get_inode_item_key_version(inode) == KEY_FORMAT_3_6) {
--              // 
-+              //
-               round_len = ROUND_UP(new_file_length);
-               /* this was n_new_file_length < le_ih ... */
-               if (round_len < le_ih_k_offset(le_ih)) {
-@@ -1443,7 +1443,7 @@ static int maybe_indirect_to_direct(stru
-       if (atomic_read(&p_s_inode->i_count) > 1 ||
-           !tail_has_to_be_packed(p_s_inode) ||
-           !page || (REISERFS_I(p_s_inode)->i_flags & i_nopack_mask)) {
--              // leave tail in an unformatted node    
-+              /* leave tail in an unformatted node */
-               *p_c_mode = M_SKIP_BALANCING;
-               cut_bytes =
-                   n_block_size - (n_new_file_size & (n_block_size - 1));
-@@ -1826,7 +1826,7 @@ int reiserfs_do_truncate(struct reiserfs
-               /* While there are bytes to truncate and previous file item is presented in the tree. */
-               /*
--               ** This loop could take a really long time, and could log 
-+               ** This loop could take a really long time, and could log
-                ** many more blocks than a transaction can hold.  So, we do a polite
-                ** journal end here, and if the transaction needs ending, we make
-                ** sure the file is consistent before ending the current trans
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -754,7 +754,7 @@ static int reiserfs_getopt(struct super_
-                          char **opt_arg, unsigned long *bit_flags)
- {
-       char *p;
--      /* foo=bar, 
-+      /* foo=bar,
-          ^   ^  ^
-          |   |  +-- option_end
-          |   +-- arg_start
-@@ -1346,7 +1346,7 @@ static int read_super_block(struct super
-       }
-       //
-       // ok, reiserfs signature (old or new) found in at the given offset
--      //    
-+      //
-       fs_blocksize = sb_blocksize(rs);
-       brelse(bh);
-       sb_set_blocksize(s, fs_blocksize);
-@@ -1532,8 +1532,8 @@ static int what_hash(struct super_block 
-               code = find_hash_out(s);
-       if (code != UNSET_HASH && reiserfs_hash_detect(s)) {
--              /* detection has found the hash, and we must check against the 
--               ** mount options 
-+              /* detection has found the hash, and we must check against the
-+               ** mount options
-                */
-               if (reiserfs_rupasov_hash(s) && code != YURA_HASH) {
-                       reiserfs_warning(s, "reiserfs-2507",
-@@ -1565,7 +1565,7 @@ static int what_hash(struct super_block 
-               }
-       }
--      /* if we are mounted RW, and we have a new valid hash code, update 
-+      /* if we are mounted RW, and we have a new valid hash code, update
-        ** the super
-        */
-       if (code != UNSET_HASH &&
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -46,7 +46,7 @@ int direct2indirect(struct reiserfs_tran
-       /* Set the key to search for the place for new unfm pointer */
-       make_cpu_key(&end_key, inode, tail_offset, TYPE_INDIRECT, 4);
--      // FIXME: we could avoid this 
-+      /* FIXME: we could avoid this */
-       if (search_for_position_by_key(sb, &end_key, path) == POSITION_FOUND) {
-               reiserfs_error(sb, "PAP-14030",
-                              "pasted or inserted byte exists in "
---- a/include/linux/reiserfs_fs_sb.h
-+++ b/include/linux/reiserfs_fs_sb.h
-@@ -14,7 +14,7 @@ typedef enum {
- } reiserfs_super_block_flags;
- /* struct reiserfs_super_block accessors/mutators
-- * since this is a disk structure, it will always be in 
-+ * since this is a disk structure, it will always be in
-  * little endian format. */
- #define sb_block_count(sbp)         (le32_to_cpu((sbp)->s_v1.s_block_count))
- #define set_sb_block_count(sbp,v)   ((sbp)->s_v1.s_block_count = cpu_to_le32(v))
-@@ -83,16 +83,16 @@ typedef enum {
- /* LOGGING -- */
--/* These all interelate for performance.  
-+/* These all interelate for performance.
- **
--** If the journal block count is smaller than n transactions, you lose speed. 
-+** If the journal block count is smaller than n transactions, you lose speed.
- ** I don't know what n is yet, I'm guessing 8-16.
- **
- ** typical transaction size depends on the application, how often fsync is
--** called, and how many metadata blocks you dirty in a 30 second period.  
-+** called, and how many metadata blocks you dirty in a 30 second period.
- ** The more small files (<16k) you use, the larger your transactions will
- ** be.
--** 
-+**
- ** If your journal fills faster than dirty buffers get flushed to disk, it must flush them before allowing the journal
- ** to wrap, which slows things down.  If you need high speed meta data updates, the journal should be big enough
- ** to prevent wrapping before dirty meta blocks get to disk.
-@@ -241,7 +241,7 @@ struct reiserfs_journal {
-       struct reiserfs_list_bitmap j_list_bitmap[JOURNAL_NUM_BITMAPS]; /* array of bitmaps to record the deleted blocks */
-       struct reiserfs_journal_cnode *j_hash_table[JOURNAL_HASH_SIZE]; /* hash table for real buffer heads in current trans */
--      struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE];    /* hash table for all the real buffer heads in all 
-+      struct reiserfs_journal_cnode *j_list_hash_table[JOURNAL_HASH_SIZE];    /* hash table for all the real buffer heads in all
-                                                                                  the transactions */
-       struct list_head j_prealloc_list;       /* list of inodes which have preallocated blocks */
-       int j_persistent_trans;
-@@ -425,7 +425,7 @@ enum reiserfs_mount_options {
-                                  partition will be dealt with in a
-                                  manner of 3.5.x */
--/* -o hash={tea, rupasov, r5, detect} is meant for properly mounting 
-+/* -o hash={tea, rupasov, r5, detect} is meant for properly mounting
- ** reiserfs disks from 3.5.19 or earlier.  99% of the time, this option
- ** is not required.  If the normal autodection code can't determine which
- ** hash to use (because both hashes had the same value for a file)
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-generic-xattr-handlers.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-generic-xattr-handlers.diff
deleted file mode 100644 (file)
index d197a09..0000000
+++ /dev/null
@@ -1,1142 +0,0 @@
-Subject: reiserfs: use generic xattr handlers
-From: Jeff Mahoney <jeffm@suse.com>
-
- Christoph Hellwig had asked me quite some time ago to port the reiserfs
- xattrs to the generic xattr interface.
-
- This patch replaces the reiserfs-specific xattr handling code with the
- generic struct xattr_handler.
-
- However, since reiserfs doesn't split the prefix and name when accessing
- xattrs, it can't leverage generic_{set,get,list,remove}xattr without
- needlessly reconstructing the name on the back end.
-
- Update 7/26/07: Added missing dput() to deletion path.
- Update 8/30/07: Added missing mark_inode_dirty when i_mode is used to
-                 represent an ACL and no previous ACL existed.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
----
-
- fs/reiserfs/super.c            |    7 
- fs/reiserfs/xattr.c            |  467 ++++++++++++++++-------------------------
- fs/reiserfs/xattr_acl.c        |   79 ++----
- fs/reiserfs/xattr_security.c   |   26 --
- fs/reiserfs/xattr_trusted.c    |   45 ---
- fs/reiserfs/xattr_user.c       |   31 --
- include/linux/reiserfs_acl.h   |   16 -
- include/linux/reiserfs_fs_sb.h |    3 
- include/linux/reiserfs_xattr.h |   25 --
- 9 files changed, 258 insertions(+), 441 deletions(-)
-
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -2261,9 +2261,6 @@ static int __init init_reiserfs_fs(void)
-               return ret;
-       }
--      if ((ret = reiserfs_xattr_register_handlers()))
--              goto failed_reiserfs_xattr_register_handlers;
--
-       reiserfs_proc_info_global_init();
-       reiserfs_proc_register_global("version",
-                                     reiserfs_global_version_in_proc);
-@@ -2274,9 +2271,6 @@ static int __init init_reiserfs_fs(void)
-               return 0;
-       }
--      reiserfs_xattr_unregister_handlers();
--
--      failed_reiserfs_xattr_register_handlers:
-       reiserfs_proc_unregister_global("version");
-       reiserfs_proc_info_global_done();
-       destroy_inodecache();
-@@ -2286,7 +2280,6 @@ static int __init init_reiserfs_fs(void)
- static void __exit exit_reiserfs_fs(void)
- {
--      reiserfs_xattr_unregister_handlers();
-       reiserfs_proc_unregister_global("version");
-       reiserfs_proc_info_global_done();
-       unregister_filesystem(&reiserfs_fs_type);
---- a/fs/reiserfs/xattr_acl.c
-+++ b/fs/reiserfs/xattr_acl.c
-@@ -271,7 +271,7 @@ reiserfs_set_acl(struct inode *inode, in
-       char *name;
-       void *value = NULL;
-       struct posix_acl **p_acl;
--      size_t size;
-+      size_t size = 0;
-       int error;
-       struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
-@@ -308,16 +308,21 @@ reiserfs_set_acl(struct inode *inode, in
-               value = posix_acl_to_disk(acl, &size);
-               if (IS_ERR(value))
-                       return (int)PTR_ERR(value);
--              error = reiserfs_xattr_set(inode, name, value, size, 0);
--      } else {
--              error = reiserfs_xattr_del(inode, name);
--              if (error == -ENODATA) {
--                      /* This may seem odd here, but it means that the ACL was set
--                       * with a value representable with mode bits. If there was
--                       * an ACL before, reiserfs_xattr_del already dirtied the inode.
--                       */
-+      }
-+
-+      error = __reiserfs_xattr_set(inode, name, value, size, 0);
-+
-+      /*
-+       * Ensure that the inode gets dirtied if we're only using
-+       * the mode bits and an old ACL didn't exist. We don't need
-+       * to check if the inode is hashed here since we won't get
-+       * called by reiserfs_inherit_default_acl().
-+       */
-+      if (error == -ENODATA) {
-+              error = 0;
-+              if (type == ACL_TYPE_ACCESS) {
-+                      inode->i_ctime = CURRENT_TIME_SEC;
-                       mark_inode_dirty(inode);
--                      error = 0;
-               }
-       }
-@@ -474,33 +479,22 @@ posix_acl_access_set(struct inode *inode
-       return xattr_set_acl(inode, ACL_TYPE_ACCESS, value, size);
- }
--static int posix_acl_access_del(struct inode *inode, const char *name)
--{
--      struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
--      if (strlen(name) != sizeof(POSIX_ACL_XATTR_ACCESS) - 1)
--              return -EINVAL;
--      iset_acl(inode, &reiserfs_i->i_acl_access, ERR_PTR(-ENODATA));
--      return 0;
--}
--
--static int
--posix_acl_access_list(struct inode *inode, const char *name, int namelen,
--                    char *out)
-+static size_t posix_acl_access_list(struct inode *inode, char *list,
-+                                  size_t list_size, const char *name,
-+                                  size_t name_len)
- {
--      int len = namelen;
-+      const size_t size = sizeof(POSIX_ACL_XATTR_ACCESS);
-       if (!reiserfs_posixacl(inode->i_sb))
-               return 0;
--      if (out)
--              memcpy(out, name, len);
--
--      return len;
-+      if (list && size <= list_size)
-+              memcpy(list, POSIX_ACL_XATTR_ACCESS, size);
-+      return size;
- }
--struct reiserfs_xattr_handler posix_acl_access_handler = {
-+struct xattr_handler reiserfs_posix_acl_access_handler = {
-       .prefix = POSIX_ACL_XATTR_ACCESS,
-       .get = posix_acl_access_get,
-       .set = posix_acl_access_set,
--      .del = posix_acl_access_del,
-       .list = posix_acl_access_list,
- };
-@@ -522,32 +516,21 @@ posix_acl_default_set(struct inode *inod
-       return xattr_set_acl(inode, ACL_TYPE_DEFAULT, value, size);
- }
--static int posix_acl_default_del(struct inode *inode, const char *name)
--{
--      struct reiserfs_inode_info *reiserfs_i = REISERFS_I(inode);
--      if (strlen(name) != sizeof(POSIX_ACL_XATTR_DEFAULT) - 1)
--              return -EINVAL;
--      iset_acl(inode, &reiserfs_i->i_acl_default, ERR_PTR(-ENODATA));
--      return 0;
--}
--
--static int
--posix_acl_default_list(struct inode *inode, const char *name, int namelen,
--                     char *out)
-+static size_t posix_acl_default_list(struct inode *inode, char *list,
-+                                   size_t list_size, const char *name,
-+                                   size_t name_len)
- {
--      int len = namelen;
-+      const size_t size = sizeof(POSIX_ACL_XATTR_DEFAULT);
-       if (!reiserfs_posixacl(inode->i_sb))
-               return 0;
--      if (out)
--              memcpy(out, name, len);
--
--      return len;
-+      if (list && size <= list_size)
-+              memcpy(list, POSIX_ACL_XATTR_DEFAULT, size);
-+      return size;
- }
--struct reiserfs_xattr_handler posix_acl_default_handler = {
-+struct xattr_handler reiserfs_posix_acl_default_handler = {
-       .prefix = POSIX_ACL_XATTR_DEFAULT,
-       .get = posix_acl_default_get,
-       .set = posix_acl_default_set,
--      .del = posix_acl_default_del,
-       .list = posix_acl_default_list,
- };
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -53,7 +53,6 @@
- #define PRIVROOT_NAME ".reiserfs_priv"
- #define XAROOT_NAME   "xattrs"
--static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char *);
- /* Helpers for inode ops. We do this so that we don't have all the VFS
-  * overhead and also for proper i_mutex annotation.
-@@ -110,7 +109,6 @@ static int xattr_rmdir(struct inode *dir
-       return error;
- }
--
- #define xattr_may_create(flags)       (!flags || flags & XATTR_CREATE)
- /* Returns and possibly creates the xattr dir. */
-@@ -339,14 +337,17 @@ int xattr_readdir(struct inode *inode, f
-       return res;
- }
--/* expects xadir->d_inode->i_mutex to be locked */
-+/* The following are side effects of other operations that aren't explicitly
-+ * modifying extended attributes. This includes operations such as permissions
-+ * or ownership changes, object deletions, etc. */
-+
- static int
--__reiserfs_xattr_del(struct dentry *xadir, const char *name, int namelen)
-+reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen,
-+                            loff_t offset, u64 ino, unsigned int d_type)
- {
-+      struct dentry *xadir = (struct dentry *)buf;
-       struct dentry *dentry;
--      struct inode *dir = xadir->d_inode;
-       int err = 0;
--      struct reiserfs_xattr_handler *xah;
-       dentry = lookup_one_len(name, xadir, namelen);
-       if (IS_ERR(dentry)) {
-@@ -361,28 +362,7 @@ __reiserfs_xattr_del(struct dentry *xadi
-       if (S_ISDIR(dentry->d_inode->i_mode))
-               goto out_file;
--      if (!IS_PRIVATE(dentry->d_inode)) {
--              reiserfs_error(dir->i_sb, "jdm-20003",
--                             "OID %08x [%.*s/%.*s] doesn't have "
--                             "priv flag set [parent is %sset].",
--                             le32_to_cpu(INODE_PKEY(dentry->d_inode)->
--                                         k_objectid), xadir->d_name.len,
--                             xadir->d_name.name, namelen, name,
--                             IS_PRIVATE(xadir->d_inode) ? "" :
--                             "not ");
--              dput(dentry);
--              return -EIO;
--      }
--
--      /* Deletion pre-operation */
--      xah = find_xattr_handler_prefix(name);
--      if (xah && xah->del) {
--              err = xah->del(dentry->d_inode, name);
--              if (err)
--                      goto out;
--      }
--
--      err = xattr_unlink(dir, dentry);
-+      err = xattr_unlink(xadir->d_inode, dentry);
- out_file:
-       dput(dentry);
-@@ -391,20 +371,6 @@ out:
-       return err;
- }
--/* The following are side effects of other operations that aren't explicitly
-- * modifying extended attributes. This includes operations such as permissions
-- * or ownership changes, object deletions, etc. */
--
--static int
--reiserfs_delete_xattrs_filler(void *buf, const char *name, int namelen,
--                            loff_t offset, u64 ino, unsigned int d_type)
--{
--      struct dentry *xadir = (struct dentry *)buf;
--
--      return __reiserfs_xattr_del(xadir, name, namelen);
--
--}
--
- /* This is called w/ inode->i_mutex downed */
- int reiserfs_delete_xattrs(struct inode *inode)
- {
-@@ -541,14 +507,11 @@ out:
- }
- #ifdef CONFIG_REISERFS_FS_XATTR
--static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char
--                                                              *prefix);
--
- /* Returns a dentry corresponding to a specific extended attribute file
-  * for the inode. If flags allow, the file is created. Otherwise, a
-  * valid or negative dentry, or an error is returned. */
--static struct dentry *get_xa_file_dentry(const struct inode *inode,
--                                       const char *name, int flags)
-+static struct dentry *xattr_lookup(struct inode *inode, const char *name,
-+                                  int flags)
- {
-       struct dentry *xadir, *xafile;
-       int err = 0;
-@@ -623,6 +586,45 @@ int reiserfs_commit_write(struct file *f
- int reiserfs_prepare_write(struct file *f, struct page *page,
-                          unsigned from, unsigned to);
-+static void update_ctime(struct inode *inode)
-+{
-+      struct timespec now = current_fs_time(inode->i_sb);
-+      if (hlist_unhashed(&inode->i_hash) || !inode->i_nlink ||
-+          timespec_equal(&inode->i_ctime, &now))
-+              return;
-+
-+      inode->i_ctime = CURRENT_TIME_SEC;
-+      mark_inode_dirty(inode);
-+}
-+
-+static int lookup_and_delete_xattr(struct inode *inode, const char *name)
-+{
-+      int err = 0;
-+      struct dentry *dentry, *xadir;
-+
-+      xadir = open_xa_dir(inode, XATTR_REPLACE);
-+      if (IS_ERR(xadir))
-+              return PTR_ERR(xadir);
-+
-+      dentry = lookup_one_len(name, xadir, strlen(name));
-+      if (IS_ERR(dentry)) {
-+              err = PTR_ERR(dentry);
-+              goto out_dput;
-+      }
-+
-+      if (dentry->d_inode) {
-+              mutex_lock_nested(&xadir->d_inode->i_mutex, I_MUTEX_XATTR);
-+              err = xattr_unlink(xadir->d_inode, dentry);
-+              mutex_unlock(&xadir->d_inode->i_mutex);
-+              update_ctime(inode);
-+      }
-+
-+      dput(dentry);
-+out_dput:
-+      dput(xadir);
-+      return err;
-+}
-+
- /* Generic extended attribute operations that can be used by xa plugins */
-@@ -630,8 +632,8 @@ int reiserfs_prepare_write(struct file *
-  * inode->i_mutex: down
-  */
- int
--reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
--                 size_t buffer_size, int flags)
-+__reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
-+                   size_t buffer_size, int flags)
- {
-       int err = 0;
-       struct dentry *dentry;
-@@ -639,37 +641,22 @@ reiserfs_xattr_set(struct inode *inode, 
-       char *data;
-       size_t file_pos = 0;
-       size_t buffer_pos = 0;
--      struct iattr newattrs;
-+      size_t new_size;
-       __u32 xahash = 0;
-       if (get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
-       if (!buffer)
--              return reiserfs_xattr_del(inode, name);
-+              return lookup_and_delete_xattr(inode, name);
--      dentry = get_xa_file_dentry(inode, name, flags);
--      if (IS_ERR(dentry)) {
--              err = PTR_ERR(dentry);
--              goto out;
--      }
-+      dentry = xattr_lookup(inode, name, flags);
-+      if (IS_ERR(dentry))
-+              return PTR_ERR(dentry);
-       down_write(&REISERFS_I(inode)->i_xattr_sem);
-       xahash = xattr_hash(buffer, buffer_size);
--
--      /* Resize it so we're ok to write there */
--      newattrs.ia_size = buffer_size;
--      newattrs.ia_ctime = current_fs_time(inode->i_sb);
--      newattrs.ia_valid = ATTR_SIZE | ATTR_CTIME;
--      mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
--      down_write(&dentry->d_inode->i_alloc_sem);
--      err = reiserfs_setattr(dentry, &newattrs);
--      up_write(&dentry->d_inode->i_alloc_sem);
--      mutex_unlock(&dentry->d_inode->i_mutex);
--      if (err)
--              goto out_filp;
--
-       while (buffer_pos < buffer_size || buffer_pos == 0) {
-               size_t chunk;
-               size_t skip = 0;
-@@ -682,7 +669,7 @@ reiserfs_xattr_set(struct inode *inode, 
-               page = reiserfs_get_page(dentry->d_inode, file_pos);
-               if (IS_ERR(page)) {
-                       err = PTR_ERR(page);
--                      goto out_filp;
-+                      goto out_unlock;
-               }
-               lock_page(page);
-@@ -716,20 +703,33 @@ reiserfs_xattr_set(struct inode *inode, 
-                       break;
-       }
--      /* We can't mark the inode dirty if it's not hashed. This is the case
--       * when we're inheriting the default ACL. If we dirty it, the inode
--       * gets marked dirty, but won't (ever) make it onto the dirty list until
--       * it's synced explicitly to clear I_DIRTY. This is bad. */
--      if (!hlist_unhashed(&inode->i_hash)) {
--              inode->i_ctime = CURRENT_TIME_SEC;
--              mark_inode_dirty(inode);
--      }
--
--      out_filp:
-+      new_size = buffer_size + sizeof(struct reiserfs_xattr_header);
-+      if (!err && new_size < i_size_read(dentry->d_inode)) {
-+              struct iattr newattrs = {
-+                      .ia_ctime = current_fs_time(inode->i_sb),
-+                      .ia_size = buffer_size,
-+                      .ia_valid = ATTR_SIZE | ATTR_CTIME,
-+              };
-+              mutex_lock_nested(&dentry->d_inode->i_mutex, I_MUTEX_XATTR);
-+              down_write(&dentry->d_inode->i_alloc_sem);
-+              err = reiserfs_setattr(dentry, &newattrs);
-+              up_write(&dentry->d_inode->i_alloc_sem);
-+              mutex_unlock(&dentry->d_inode->i_mutex);
-+      } else
-+              update_ctime(inode);
-+out_unlock:
-       up_write(&REISERFS_I(inode)->i_xattr_sem);
-       dput(dentry);
-+      return err;
-+}
--      out:
-+int
-+reiserfs_xattr_set(struct inode *inode, const char *name, const void *buffer,
-+                   size_t buffer_size, int flags)
-+{
-+      int err = __reiserfs_xattr_set(inode, name, buffer, buffer_size, flags);
-+      if (err == -ENODATA)
-+              err = 0;
-       return err;
- }
-@@ -737,7 +737,7 @@ reiserfs_xattr_set(struct inode *inode, 
-  * inode->i_mutex: down
-  */
- int
--reiserfs_xattr_get(const struct inode *inode, const char *name, void *buffer,
-+reiserfs_xattr_get(struct inode *inode, const char *name, void *buffer,
-                  size_t buffer_size)
- {
-       ssize_t err = 0;
-@@ -756,7 +756,7 @@ reiserfs_xattr_get(const struct inode *i
-       if (get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      dentry = get_xa_file_dentry(inode, name, XATTR_REPLACE);
-+      dentry = xattr_lookup(inode, name, XATTR_REPLACE);
-       if (IS_ERR(dentry)) {
-               err = PTR_ERR(dentry);
-               goto out;
-@@ -837,32 +837,53 @@ out:
-       return err;
- }
--int reiserfs_xattr_del(struct inode *inode, const char *name)
--{
--      struct dentry *dir;
--      int err;
-+/* Actual operations that are exported to VFS-land */
-+struct xattr_handler *reiserfs_xattr_handlers[] = {
-+      &reiserfs_xattr_user_handler,
-+      &reiserfs_xattr_trusted_handler,
-+#ifdef CONFIG_REISERFS_FS_SECURITY
-+      &reiserfs_xattr_security_handler,
-+#endif
-+#ifdef CONFIG_REISERFS_FS_POSIX_ACL
-+      &reiserfs_posix_acl_access_handler,
-+      &reiserfs_posix_acl_default_handler,
-+#endif
-+      NULL
-+};
--      dir = open_xa_dir(inode, XATTR_REPLACE);
--      if (IS_ERR(dir)) {
--              err = PTR_ERR(dir);
--              goto out;
--      }
-+/*
-+ * In order to implement different sets of xattr operations for each xattr
-+ * prefix with the generic xattr API, a filesystem should create a
-+ * null-terminated array of struct xattr_handler (one for each prefix) and
-+ * hang a pointer to it off of the s_xattr field of the superblock.
-+ *
-+ * The generic_fooxattr() functions will use this list to dispatch xattr
-+ * operations to the correct xattr_handler.
-+ */
-+#define for_each_xattr_handler(handlers, handler)             \
-+              for ((handler) = *(handlers)++;                 \
-+                      (handler) != NULL;                      \
-+                      (handler) = *(handlers)++)
--      mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = __reiserfs_xattr_del(dir, name, strlen(name));
--      mutex_unlock(&dir->d_inode->i_mutex);
--      dput(dir);
-+/* This is the implementation for the xattr plugin infrastructure */
-+static inline struct xattr_handler *
-+find_xattr_handler_prefix(struct xattr_handler **handlers,
-+                         const char *name)
-+{
-+      struct xattr_handler *xah;
--      if (!err) {
--              inode->i_ctime = CURRENT_TIME_SEC;
--              mark_inode_dirty(inode);
-+      if (!handlers)
-+              return NULL;
-+
-+      for_each_xattr_handler(handlers, xah) {
-+              if (strncmp(xah->prefix, name, strlen(xah->prefix)) == 0)
-+                      break;
-       }
--      out:
--      return err;
-+      return xah;
- }
--/* Actual operations that are exported to VFS-land */
-+
- /*
-  * Inode operation getxattr()
-  */
-@@ -870,15 +891,15 @@ ssize_t
- reiserfs_getxattr(struct dentry * dentry, const char *name, void *buffer,
-                 size_t size)
- {
--      struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
--      int err;
-+      struct inode *inode = dentry->d_inode;
-+      struct xattr_handler *handler;
--      if (!xah || !reiserfs_xattrs(dentry->d_sb) ||
--          get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-+      handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);
-+
-+      if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      err = xah->get(dentry->d_inode, name, buffer, size);
--      return err;
-+      return handler->get(inode, name, buffer, size);
- }
- /*
-@@ -890,15 +911,15 @@ int
- reiserfs_setxattr(struct dentry *dentry, const char *name, const void *value,
-                 size_t size, int flags)
- {
--      struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
--      int err;
-+      struct inode *inode = dentry->d_inode;
-+      struct xattr_handler *handler;
--      if (!xah || !reiserfs_xattrs(dentry->d_sb) ||
--          get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-+      handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);
-+
-+      if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      err = xah->set(dentry->d_inode, name, value, size, flags);
--      return err;
-+      return handler->set(inode, name, value, size, flags);
- }
- /*
-@@ -908,71 +929,65 @@ reiserfs_setxattr(struct dentry *dentry,
-  */
- int reiserfs_removexattr(struct dentry *dentry, const char *name)
- {
--      int err;
--      struct reiserfs_xattr_handler *xah = find_xattr_handler_prefix(name);
-+      struct inode *inode = dentry->d_inode;
-+      struct xattr_handler *handler;
-+      handler = find_xattr_handler_prefix(inode->i_sb->s_xattr, name);
--      if (!xah || !reiserfs_xattrs(dentry->d_sb) ||
--          get_inode_sd_version(dentry->d_inode) == STAT_DATA_V1)
-+      if (!handler || get_inode_sd_version(inode) == STAT_DATA_V1)
-               return -EOPNOTSUPP;
--      err = reiserfs_xattr_del(dentry->d_inode, name);
--
--      dentry->d_inode->i_ctime = CURRENT_TIME_SEC;
--      mark_inode_dirty(dentry->d_inode);
--
--      return err;
-+      return handler->set(inode, name, NULL, 0, XATTR_REPLACE);
- }
--/* This is what filldir will use:
-- * r_pos will always contain the amount of space required for the entire
-- * list. If r_pos becomes larger than r_size, we need more space and we
-- * return an error indicating this. If r_pos is less than r_size, then we've
-- * filled the buffer successfully and we return success */
--struct reiserfs_listxattr_buf {
--      int r_pos;
--      int r_size;
--      char *r_buf;
--      struct inode *r_inode;
-+struct listxattr_buf {
-+      size_t size;
-+      size_t pos;
-+      char *buf;
-+      struct inode *inode;
- };
--static int
--reiserfs_listxattr_filler(void *buf, const char *name, int namelen,
--                        loff_t offset, u64 ino, unsigned int d_type)
-+static int listxattr_filler(void *buf, const char *name, int namelen,
-+                          loff_t offset, u64 ino, unsigned int d_type)
- {
--      struct reiserfs_listxattr_buf *b = (struct reiserfs_listxattr_buf *)buf;
--      int len = 0;
--      if (name[0] != '.'
--          || (namelen != 1 && (name[1] != '.' || namelen != 2))) {
--              struct reiserfs_xattr_handler *xah =
--                  find_xattr_handler_prefix(name);
--              if (!xah)
--                      return 0;       /* Unsupported xattr name, skip it */
--
--              /* We call ->list() twice because the operation isn't required to just
--               * return the name back - we want to make sure we have enough space */
--              len += xah->list(b->r_inode, name, namelen, NULL);
--
--              if (len) {
--                      if (b->r_pos + len + 1 <= b->r_size) {
--                              char *p = b->r_buf + b->r_pos;
--                              p += xah->list(b->r_inode, name, namelen, p);
--                              *p++ = '\0';
--                      }
--                      b->r_pos += len + 1;
-+      struct listxattr_buf *b = (struct listxattr_buf *)buf;
-+      size_t size;
-+      if (name[0] != '.' ||
-+          (namelen != 1 && (name[1] != '.' || namelen != 2))) {
-+              struct xattr_handler *handler;
-+              handler = find_xattr_handler_prefix(b->inode->i_sb->s_xattr,
-+                                                  name);
-+              if (!handler)   /* Unsupported xattr name */
-+                      return 0;
-+              if (b->buf) {
-+                      size = handler->list(b->inode, b->buf + b->pos,
-+                                       b->size, name, namelen);
-+                      if (size > b->size)
-+                              return -ERANGE;
-+              } else {
-+                      size = handler->list(b->inode, NULL, 0, name, namelen);
-               }
--      }
-+              b->pos += size;
-+      }
-       return 0;
- }
- /*
-  * Inode operation listxattr()
-+ *
-+ * We totally ignore the generic listxattr here because it would be stupid
-+ * not to. Since the xattrs are organized in a directory, we can just
-+ * readdir to find them.
-  */
- ssize_t reiserfs_listxattr(struct dentry * dentry, char *buffer, size_t size)
- {
-       struct dentry *dir;
-       int err = 0;
--      struct reiserfs_listxattr_buf buf;
-+      struct listxattr_buf buf = {
-+              .inode = dentry->d_inode,
-+              .buf = buffer,
-+              .size = buffer ? size : 0,
-+      };
-       if (!dentry->d_inode)
-               return -EINVAL;
-@@ -985,120 +1000,22 @@ ssize_t reiserfs_listxattr(struct dentry
-       if (IS_ERR(dir)) {
-               err = PTR_ERR(dir);
-               if (err == -ENODATA)
--                      err = 0;        /* Not an error if there aren't any xattrs */
-+                      err = 0;  /* Not an error if there aren't any xattrs */
-               goto out;
-       }
--      buf.r_buf = buffer;
--      buf.r_size = buffer ? size : 0;
--      buf.r_pos = 0;
--      buf.r_inode = dentry->d_inode;
--
-       mutex_lock_nested(&dir->d_inode->i_mutex, I_MUTEX_XATTR);
--      err = xattr_readdir(dir->d_inode, reiserfs_listxattr_filler, &buf);
-+      err = xattr_readdir(dir->d_inode, listxattr_filler, &buf);
-       mutex_unlock(&dir->d_inode->i_mutex);
--      if (!err) {
--              if (buf.r_pos > buf.r_size && buffer != NULL)
--                      err = -ERANGE;
--              else
--                      err = buf.r_pos;
--      }
-+      if (!err)
-+              err = buf.pos;
-       dput(dir);
- out:
-       return err;
- }
--/* This is the implementation for the xattr plugin infrastructure */
--static LIST_HEAD(xattr_handlers);
--static DEFINE_RWLOCK(handler_lock);
--
--static struct reiserfs_xattr_handler *find_xattr_handler_prefix(const char
--                                                              *prefix)
--{
--      struct reiserfs_xattr_handler *xah = NULL;
--      struct list_head *p;
--
--      read_lock(&handler_lock);
--      list_for_each(p, &xattr_handlers) {
--              xah = list_entry(p, struct reiserfs_xattr_handler, handlers);
--              if (strncmp(xah->prefix, prefix, strlen(xah->prefix)) == 0)
--                      break;
--              xah = NULL;
--      }
--
--      read_unlock(&handler_lock);
--      return xah;
--}
--
--static void __unregister_handlers(void)
--{
--      struct reiserfs_xattr_handler *xah;
--      struct list_head *p, *tmp;
--
--      list_for_each_safe(p, tmp, &xattr_handlers) {
--              xah = list_entry(p, struct reiserfs_xattr_handler, handlers);
--              if (xah->exit)
--                      xah->exit();
--
--              list_del_init(p);
--      }
--      INIT_LIST_HEAD(&xattr_handlers);
--}
--
--int __init reiserfs_xattr_register_handlers(void)
--{
--      int err = 0;
--      struct reiserfs_xattr_handler *xah;
--      struct list_head *p;
--
--      write_lock(&handler_lock);
--
--      /* If we're already initialized, nothing to do */
--      if (!list_empty(&xattr_handlers)) {
--              write_unlock(&handler_lock);
--              return 0;
--      }
--
--      /* Add the handlers */
--      list_add_tail(&user_handler.handlers, &xattr_handlers);
--      list_add_tail(&trusted_handler.handlers, &xattr_handlers);
--#ifdef CONFIG_REISERFS_FS_SECURITY
--      list_add_tail(&security_handler.handlers, &xattr_handlers);
--#endif
--#ifdef CONFIG_REISERFS_FS_POSIX_ACL
--      list_add_tail(&posix_acl_access_handler.handlers, &xattr_handlers);
--      list_add_tail(&posix_acl_default_handler.handlers, &xattr_handlers);
--#endif
--
--      /* Run initializers, if available */
--      list_for_each(p, &xattr_handlers) {
--              xah = list_entry(p, struct reiserfs_xattr_handler, handlers);
--              if (xah->init) {
--                      err = xah->init();
--                      if (err) {
--                              list_del_init(p);
--                              break;
--                      }
--              }
--      }
--
--      /* Clean up other handlers, if any failed */
--      if (err)
--              __unregister_handlers();
--
--      write_unlock(&handler_lock);
--      return err;
--}
--
--void reiserfs_xattr_unregister_handlers(void)
--{
--      write_lock(&handler_lock);
--      __unregister_handlers();
--      write_unlock(&handler_lock);
--}
--
- static int reiserfs_check_acl(struct inode *inode, int mask)
- {
-       struct posix_acl *acl;
-@@ -1157,20 +1074,16 @@ static int xattr_mount_check(struct supe
- {
-       /* We need generation numbers to ensure that the oid mapping is correct
-        * v3.5 filesystems don't have them. */
--      if (!old_format_only(s)) {
--              set_bit(REISERFS_XATTRS, &(REISERFS_SB(s)->s_mount_opt));
--      } else if (reiserfs_xattrs_optional(s)) {
--              /* Old format filesystem, but optional xattrs have been enabled
--               * at mount time. Error out. */
--              reiserfs_warning(s, "jdm-20005",
--                               "xattrs/ACLs not supported on pre v3.6 "
--                               "format filesystem. Failing mount.");
--              return -EOPNOTSUPP;
--      } else {
--              /* Old format filesystem, but no optional xattrs have
--               * been enabled. This means we silently disable xattrs
--               * on the filesystem. */
--              clear_bit(REISERFS_XATTRS, &(REISERFS_SB(s)->s_mount_opt));
-+      if (old_format_only(s)) {
-+              if (reiserfs_xattrs_optional(s)) {
-+                      /* Old format filesystem, but optional xattrs have
-+                       * been enabled. Error out. */
-+                      reiserfs_warning(s, "jdm-2005",
-+                                       "xattrs/ACLs not supported "
-+                                       "on pre-v3.6 format filesystems. "
-+                                       "Failing mount.");
-+                      return -EOPNOTSUPP;
-+              }
-       }
-       return 0;
-@@ -1251,9 +1164,11 @@ int reiserfs_xattr_init(struct super_blo
-       }
- #ifdef CONFIG_REISERFS_FS_XATTR
-+      if (!err)
-+              s->s_xattr = reiserfs_xattr_handlers;
-+
- error:
-       if (err) {
--              clear_bit(REISERFS_XATTRS, &(REISERFS_SB(s)->s_mount_opt));
-               clear_bit(REISERFS_XATTRS_USER, &(REISERFS_SB(s)->s_mount_opt));
-               clear_bit(REISERFS_POSIXACL, &(REISERFS_SB(s)->s_mount_opt));
-       }
---- a/fs/reiserfs/xattr_security.c
-+++ b/fs/reiserfs/xattr_security.c
-@@ -31,35 +31,25 @@ security_set(struct inode *inode, const 
-       return reiserfs_xattr_set(inode, name, buffer, size, flags);
- }
--static int security_del(struct inode *inode, const char *name)
-+static size_t security_list(struct inode *inode, char *list, size_t list_len,
-+                          const char *name, size_t namelen)
- {
--      if (strlen(name) < sizeof(XATTR_SECURITY_PREFIX))
--              return -EINVAL;
--
--      if (IS_PRIVATE(inode))
--              return -EPERM;
--
--      return 0;
--}
--
--static int
--security_list(struct inode *inode, const char *name, int namelen, char *out)
--{
--      int len = namelen;
-+      const size_t len = namelen + 1;
-       if (IS_PRIVATE(inode))
-               return 0;
--      if (out)
--              memcpy(out, name, len);
-+      if (list && len <= list_len) {
-+              memcpy(list, name, namelen);
-+              list[namelen] = '\0';
-+      }
-       return len;
- }
--struct reiserfs_xattr_handler security_handler = {
-+struct xattr_handler reiserfs_xattr_security_handler = {
-       .prefix = XATTR_SECURITY_PREFIX,
-       .get = security_get,
-       .set = security_set,
--      .del = security_del,
-       .list = security_list,
- };
---- a/fs/reiserfs/xattr_trusted.c
-+++ b/fs/reiserfs/xattr_trusted.c
-@@ -13,10 +13,7 @@ trusted_get(struct inode *inode, const c
-       if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
-               return -EINVAL;
--      if (!reiserfs_xattrs(inode->i_sb))
--              return -EOPNOTSUPP;
--
--      if (!(capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)))
-+      if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode))
-               return -EPERM;
-       return reiserfs_xattr_get(inode, name, buffer, size);
-@@ -29,50 +26,30 @@ trusted_set(struct inode *inode, const c
-       if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
-               return -EINVAL;
--      if (!reiserfs_xattrs(inode->i_sb))
--              return -EOPNOTSUPP;
--
--      if (!(capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)))
-+      if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode))
-               return -EPERM;
-       return reiserfs_xattr_set(inode, name, buffer, size, flags);
- }
--static int trusted_del(struct inode *inode, const char *name)
-+static size_t trusted_list(struct inode *inode, char *list, size_t list_size,
-+                         const char *name, size_t name_len)
- {
--      if (strlen(name) < sizeof(XATTR_TRUSTED_PREFIX))
--              return -EINVAL;
-+      const size_t len = name_len + 1;
--      if (!reiserfs_xattrs(inode->i_sb))
--              return -EOPNOTSUPP;
--
--      if (!(capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)))
--              return -EPERM;
--
--      return 0;
--}
--
--static int
--trusted_list(struct inode *inode, const char *name, int namelen, char *out)
--{
--      int len = namelen;
--
--      if (!reiserfs_xattrs(inode->i_sb))
-+      if (!capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode))
-               return 0;
--      if (!(capable(CAP_SYS_ADMIN) || IS_PRIVATE(inode)))
--              return 0;
--
--      if (out)
--              memcpy(out, name, len);
--
-+      if (list && len <= list_size) {
-+              memcpy(list, name, name_len);
-+              list[name_len] = '\0';
-+      }
-       return len;
- }
--struct reiserfs_xattr_handler trusted_handler = {
-+struct xattr_handler reiserfs_xattr_trusted_handler = {
-       .prefix = XATTR_TRUSTED_PREFIX,
-       .get = trusted_get,
-       .set = trusted_set,
--      .del = trusted_del,
-       .list = trusted_list,
- };
---- a/fs/reiserfs/xattr_user.c
-+++ b/fs/reiserfs/xattr_user.c
-@@ -6,10 +6,6 @@
- #include <linux/reiserfs_xattr.h>
- #include <asm/uaccess.h>
--#ifdef CONFIG_REISERFS_FS_POSIX_ACL
--# include <linux/reiserfs_acl.h>
--#endif
--
- static int
- user_get(struct inode *inode, const char *name, void *buffer, size_t size)
- {
-@@ -25,7 +21,6 @@ static int
- user_set(struct inode *inode, const char *name, const void *buffer,
-        size_t size, int flags)
- {
--
-       if (strlen(name) < sizeof(XATTR_USER_PREFIX))
-               return -EINVAL;
-@@ -34,33 +29,23 @@ user_set(struct inode *inode, const char
-       return reiserfs_xattr_set(inode, name, buffer, size, flags);
- }
--static int user_del(struct inode *inode, const char *name)
-+static size_t user_list(struct inode *inode, char *list, size_t list_size,
-+                      const char *name, size_t name_len)
- {
--      if (strlen(name) < sizeof(XATTR_USER_PREFIX))
--              return -EINVAL;
--
--      if (!reiserfs_xattrs_user(inode->i_sb))
--              return -EOPNOTSUPP;
--      return 0;
--}
-+      const size_t len = name_len + 1;
--static int
--user_list(struct inode *inode, const char *name, int namelen, char *out)
--{
--      int len = namelen;
-       if (!reiserfs_xattrs_user(inode->i_sb))
-               return 0;
--
--      if (out)
--              memcpy(out, name, len);
--
-+      if (list && len <= list_size) {
-+              memcpy(list, name, name_len);
-+              list[name_len] = '\0';
-+      }
-       return len;
- }
--struct reiserfs_xattr_handler user_handler = {
-+struct xattr_handler reiserfs_xattr_user_handler = {
-       .prefix = XATTR_USER_PREFIX,
-       .get = user_get,
-       .set = user_set,
--      .del = user_del,
-       .list = user_list,
- };
---- a/include/linux/reiserfs_acl.h
-+++ b/include/linux/reiserfs_acl.h
-@@ -52,10 +52,8 @@ int reiserfs_acl_chmod(struct inode *ino
- int reiserfs_inherit_default_acl(struct inode *dir, struct dentry *dentry,
-                                struct inode *inode);
- int reiserfs_cache_default_acl(struct inode *dir);
--extern int reiserfs_xattr_posix_acl_init(void) __init;
--extern int reiserfs_xattr_posix_acl_exit(void);
--extern struct reiserfs_xattr_handler posix_acl_default_handler;
--extern struct reiserfs_xattr_handler posix_acl_access_handler;
-+extern struct xattr_handler reiserfs_posix_acl_default_handler;
-+extern struct xattr_handler reiserfs_posix_acl_access_handler;
- static inline void reiserfs_init_acl_access(struct inode *inode)
- {
-@@ -75,16 +73,6 @@ static inline struct posix_acl *reiserfs
-       return NULL;
- }
--static inline int reiserfs_xattr_posix_acl_init(void)
--{
--      return 0;
--}
--
--static inline int reiserfs_xattr_posix_acl_exit(void)
--{
--      return 0;
--}
--
- static inline int reiserfs_acl_chmod(struct inode *inode)
- {
-       return 0;
---- a/include/linux/reiserfs_fs_sb.h
-+++ b/include/linux/reiserfs_fs_sb.h
-@@ -450,7 +450,6 @@ enum reiserfs_mount_options {
-       REISERFS_NO_UNHASHED_RELOCATION,
-       REISERFS_HASHED_RELOCATION,
-       REISERFS_ATTRS,
--      REISERFS_XATTRS,
-       REISERFS_XATTRS_USER,
-       REISERFS_POSIXACL,
-       REISERFS_BARRIER_NONE,
-@@ -488,7 +487,7 @@ enum reiserfs_mount_options {
- #define reiserfs_data_log(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_LOG))
- #define reiserfs_data_ordered(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_ORDERED))
- #define reiserfs_data_writeback(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_DATA_WRITEBACK))
--#define reiserfs_xattrs(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_XATTRS))
-+#define reiserfs_xattrs(s) ((s)->s_xattr != NULL)
- #define reiserfs_xattrs_user(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_XATTRS_USER))
- #define reiserfs_posixacl(s) (REISERFS_SB(s)->s_mount_opt & (1 << REISERFS_POSIXACL))
- #define reiserfs_xattrs_optional(s) (reiserfs_xattrs_user(s) || reiserfs_posixacl(s))
---- a/include/linux/reiserfs_xattr.h
-+++ b/include/linux/reiserfs_xattr.h
-@@ -29,20 +29,6 @@ struct iattr;
- struct super_block;
- struct nameidata;
--struct reiserfs_xattr_handler {
--      char *prefix;
--      int (*init) (void);
--      void (*exit) (void);
--      int (*get) (struct inode * inode, const char *name, void *buffer,
--                  size_t size);
--      int (*set) (struct inode * inode, const char *name, const void *buffer,
--                  size_t size, int flags);
--      int (*del) (struct inode * inode, const char *name);
--      int (*list) (struct inode * inode, const char *name, int namelen,
--                   char *out);
--      struct list_head handlers;
--};
--
- int reiserfs_xattr_register_handlers(void) __init;
- void reiserfs_xattr_unregister_handlers(void);
- int reiserfs_xattr_init(struct super_block *sb, int mount_flags);
-@@ -59,13 +45,14 @@ ssize_t reiserfs_listxattr(struct dentry
- int reiserfs_removexattr(struct dentry *dentry, const char *name);
- int reiserfs_permission(struct inode *inode, int mask);
--int reiserfs_xattr_del(struct inode *, const char *);
--int reiserfs_xattr_get(const struct inode *, const char *, void *, size_t);
-+int reiserfs_xattr_get(struct inode *, const char *, void *, size_t);
-+int __reiserfs_xattr_set(struct inode *, const char *, const void *,
-+                       size_t, int);
- int reiserfs_xattr_set(struct inode *, const char *, const void *, size_t, int);
--extern struct reiserfs_xattr_handler user_handler;
--extern struct reiserfs_xattr_handler trusted_handler;
--extern struct reiserfs_xattr_handler security_handler;
-+extern struct xattr_handler reiserfs_xattr_user_handler;
-+extern struct xattr_handler reiserfs_xattr_trusted_handler;
-+extern struct xattr_handler reiserfs_xattr_security_handler;
- static inline void reiserfs_init_xattr_rwsem(struct inode *inode)
- {
diff --git a/src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-reiserfs_error.diff b/src/patches/suse-2.6.27.31/patches.suse/reiserfs-use-reiserfs_error.diff
deleted file mode 100644 (file)
index e2c3a04..0000000
+++ /dev/null
@@ -1,512 +0,0 @@
-From: Jeff Mahoney <jeffm@suse.com>
-Subject: reiserfs: use reiserfs_error()
-
- This patch makes many paths that are currently using warnings to handle
- the error.
-
-Signed-off-by: Jeff Mahoney <jeffm@suse.com>
-
---
-
- fs/reiserfs/bitmap.c          |   56 +++++++++++++++++++++---------------------
- fs/reiserfs/inode.c           |   45 +++++++++++++++------------------
- fs/reiserfs/lbalance.c        |   20 +++++++--------
- fs/reiserfs/namei.c           |   24 +++++++++---------
- fs/reiserfs/objectid.c        |    4 +--
- fs/reiserfs/stree.c           |   26 +++++++++----------
- fs/reiserfs/super.c           |   15 +++++------
- fs/reiserfs/tail_conversion.c |    6 ++--
- fs/reiserfs/xattr.c           |   21 +++++++--------
- 9 files changed, 107 insertions(+), 110 deletions(-)
-
---- a/fs/reiserfs/bitmap.c
-+++ b/fs/reiserfs/bitmap.c
-@@ -64,9 +64,9 @@ int is_reusable(struct super_block *s, b
-       unsigned int bmap_count = reiserfs_bmap_count(s);
-       if (block == 0 || block >= SB_BLOCK_COUNT(s)) {
--              reiserfs_warning(s, "vs-4010",
--                               "block number is out of range %lu (%u)",
--                               block, SB_BLOCK_COUNT(s));
-+              reiserfs_error(s, "vs-4010",
-+                             "block number is out of range %lu (%u)",
-+                             block, SB_BLOCK_COUNT(s));
-               return 0;
-       }
-@@ -79,30 +79,30 @@ int is_reusable(struct super_block *s, b
-               b_blocknr_t bmap1 = REISERFS_SB(s)->s_sbh->b_blocknr + 1;
-               if (block >= bmap1 &&
-                   block <= bmap1 + bmap_count) {
--                      reiserfs_warning(s, "vs-4019", "bitmap block %lu(%u) "
--                                       "can't be freed or reused",
--                                       block, bmap_count);
-+                      reiserfs_error(s, "vs-4019", "bitmap block %lu(%u) "
-+                                     "can't be freed or reused",
-+                                     block, bmap_count);
-                       return 0;
-               }
-       } else {
-               if (offset == 0) {
--                      reiserfs_warning(s, "vs-4020", "bitmap block %lu(%u) "
--                                       "can't be freed or reused",
--                                       block, bmap_count);
-+                      reiserfs_error(s, "vs-4020", "bitmap block %lu(%u) "
-+                                     "can't be freed or reused",
-+                                     block, bmap_count);
-                       return 0;
-               }
-       }
-       if (bmap >= bmap_count) {
--              reiserfs_warning(s, "vs-4030", "bitmap for requested block "
--                               "is out of range: block=%lu, bitmap_nr=%u",
--                               block, bmap);
-+              reiserfs_error(s, "vs-4030", "bitmap for requested block "
-+                             "is out of range: block=%lu, bitmap_nr=%u",
-+                             block, bmap);
-               return 0;
-       }
-       if (bit_value == 0 && block == SB_ROOT_BLOCK(s)) {
--              reiserfs_warning(s, "vs-4050", "this is root block (%u), "
--                               "it must be busy", SB_ROOT_BLOCK(s));
-+              reiserfs_error(s, "vs-4050", "this is root block (%u), "
-+                             "it must be busy", SB_ROOT_BLOCK(s));
-               return 0;
-       }
-@@ -153,8 +153,8 @@ static int scan_bitmap_block(struct reis
- /* - I mean `a window of zero bits' as in description of this function - Zam. */
-       if (!bi) {
--              reiserfs_warning(s, "jdm-4055", "NULL bitmap info pointer "
--                               "for bitmap %d", bmap_n);
-+              reiserfs_error(s, "jdm-4055", "NULL bitmap info pointer "
-+                             "for bitmap %d", bmap_n);
-               return 0;
-       }
-@@ -399,8 +399,8 @@ static void _reiserfs_free_block(struct 
-       get_bit_address(s, block, &nr, &offset);
-       if (nr >= reiserfs_bmap_count(s)) {
--              reiserfs_warning(s, "vs-4075", "block %lu is out of range",
--                               block);
-+              reiserfs_error(s, "vs-4075", "block %lu is out of range",
-+                             block);
-               return;
-       }
-@@ -412,8 +412,8 @@ static void _reiserfs_free_block(struct 
-       /* clear bit for the given block in bit map */
-       if (!reiserfs_test_and_clear_le_bit(offset, bmbh->b_data)) {
--              reiserfs_warning(s, "vs-4080",
--                               "block %lu: bit already cleared", block);
-+              reiserfs_error(s, "vs-4080",
-+                             "block %lu: bit already cleared", block);
-       }
-       apbi[nr].free_count++;
-       journal_mark_dirty(th, s, bmbh);
-@@ -440,7 +440,7 @@ void reiserfs_free_block(struct reiserfs
-               return;
-       if (block > sb_block_count(REISERFS_SB(s)->s_rs)) {
--              reiserfs_panic(th->t_super, "bitmap-4072",
-+              reiserfs_error(th->t_super, "bitmap-4072",
-                              "Trying to free block outside file system "
-                              "boundaries (%lu > %lu)",
-                              block, sb_block_count(REISERFS_SB(s)->s_rs));
-@@ -472,8 +472,8 @@ static void __discard_prealloc(struct re
-       BUG_ON(!th->t_trans_id);
- #ifdef CONFIG_REISERFS_CHECK
-       if (ei->i_prealloc_count < 0)
--              reiserfs_warning(th->t_super, "zam-4001",
--                               "inode has negative prealloc blocks count.");
-+              reiserfs_error(th->t_super, "zam-4001",
-+                             "inode has negative prealloc blocks count.");
- #endif
-       while (ei->i_prealloc_count > 0) {
-               reiserfs_free_prealloc_block(th, inode, ei->i_prealloc_block);
-@@ -509,9 +509,9 @@ void reiserfs_discard_all_prealloc(struc
-                               i_prealloc_list);
- #ifdef CONFIG_REISERFS_CHECK
-               if (!ei->i_prealloc_count) {
--                      reiserfs_warning(th->t_super, "zam-4001",
--                                       "inode is in prealloc list but has "
--                                       "no preallocated blocks.");
-+                      reiserfs_error(th->t_super, "zam-4001",
-+                                     "inode is in prealloc list but has "
-+                                     "no preallocated blocks.");
-               }
- #endif
-               __discard_prealloc(th, ei);
-@@ -1214,7 +1214,9 @@ void reiserfs_cache_bitmap_metadata(stru
-       unsigned long *cur = (unsigned long *)(bh->b_data + bh->b_size);
-       /* The first bit must ALWAYS be 1 */
--      BUG_ON(!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data));
-+      if (!reiserfs_test_le_bit(0, (unsigned long *)bh->b_data))
-+              reiserfs_error(sb, "reiserfs-2025", "bitmap block %lu is "
-+                             "corrupted: first bit must be 1", bh->b_blocknr);
-       info->free_count = 0;
---- a/fs/reiserfs/inode.c
-+++ b/fs/reiserfs/inode.c
-@@ -841,12 +841,12 @@ int reiserfs_get_block(struct inode *ino
-                                                         tail_offset);
-                               if (retval) {
-                                       if (retval != -ENOSPC)
--                                              reiserfs_warning(inode->i_sb,
--                                                       "clm-6004",
--                                                       "convert tail failed "
--                                                       "inode %lu, error %d",
--                                                               inode->i_ino,
--                                                               retval);
-+                                              reiserfs_error(inode->i_sb,
-+                                                      "clm-6004",
-+                                                      "convert tail failed "
-+                                                      "inode %lu, error %d",
-+                                                      inode->i_ino,
-+                                                      retval);
-                                       if (allocated_block_nr) {
-                                               /* the bitmap, the super, and the stat data == 3 */
-                                               if (!th)
-@@ -1332,10 +1332,9 @@ void reiserfs_update_sd_size(struct reis
-               /* look for the object's stat data */
-               retval = search_item(inode->i_sb, &key, &path);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(inode->i_sb, "vs-13050",
--                                       "i/o failure occurred trying to "
--                                       "update %K stat data",
--                                       &key);
-+                      reiserfs_error(inode->i_sb, "vs-13050",
-+                                     "i/o failure occurred trying to "
-+                                     "update %K stat data", &key);
-                       return;
-               }
-               if (retval == ITEM_NOT_FOUND) {
-@@ -1424,9 +1423,9 @@ void reiserfs_read_locked_inode(struct i
-       /* look for the object's stat data */
-       retval = search_item(inode->i_sb, &key, &path_to_sd);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(inode->i_sb, "vs-13070",
--                               "i/o failure occurred trying to find "
--                               "stat data of %K", &key);
-+              reiserfs_error(inode->i_sb, "vs-13070",
-+                             "i/o failure occurred trying to find "
-+                             "stat data of %K", &key);
-               reiserfs_make_bad_inode(inode);
-               return;
-       }
-@@ -1687,8 +1686,8 @@ static int reiserfs_new_directory(struct
-       /* look for place in the tree for new item */
-       retval = search_item(sb, &key, path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(sb, "vs-13080",
--                               "i/o failure occurred creating new directory");
-+              reiserfs_error(sb, "vs-13080",
-+                             "i/o failure occurred creating new directory");
-               return -EIO;
-       }
-       if (retval == ITEM_FOUND) {
-@@ -1727,8 +1726,8 @@ static int reiserfs_new_symlink(struct r
-       /* look for place in the tree for new item */
-       retval = search_item(sb, &key, path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(sb, "vs-13080",
--                               "i/o failure occurred creating new symlink");
-+              reiserfs_error(sb, "vs-13080",
-+                             "i/o failure occurred creating new symlink");
-               return -EIO;
-       }
-       if (retval == ITEM_FOUND) {
-@@ -2048,10 +2047,8 @@ static int grab_tail_page(struct inode *
-                ** I've screwed up the code to find the buffer, or the code to
-                ** call prepare_write
-                */
--              reiserfs_warning(p_s_inode->i_sb, "clm-6000",
--                               "error reading block %lu on dev %s",
--                               bh->b_blocknr,
--                               reiserfs_bdevname(p_s_inode->i_sb));
-+              reiserfs_error(p_s_inode->i_sb, "clm-6000",
-+                             "error reading block %lu", bh->b_blocknr);
-               error = -EIO;
-               goto unlock;
-       }
-@@ -2093,9 +2090,9 @@ int reiserfs_truncate_file(struct inode 
-                       // and get_block_create_0 could not find a block to read in,
-                       // which is ok.
-                       if (error != -ENOENT)
--                              reiserfs_warning(p_s_inode->i_sb, "clm-6001",
--                                               "grab_tail_page failed %d",
--                                               error);
-+                              reiserfs_error(p_s_inode->i_sb, "clm-6001",
-+                                             "grab_tail_page failed %d",
-+                                             error);
-                       page = NULL;
-                       bh = NULL;
-               }
---- a/fs/reiserfs/lbalance.c
-+++ b/fs/reiserfs/lbalance.c
-@@ -1291,17 +1291,17 @@ void leaf_paste_entries(struct buffer_in
-                       prev = (i != 0) ? deh_location(&(deh[i - 1])) : 0;
-                       if (prev && prev <= deh_location(&(deh[i])))
--                              reiserfs_warning(NULL, "vs-10240",
--                                               "directory item (%h) "
--                                               "corrupted (prev %a, "
--                                               "cur(%d) %a)",
--                                               ih, deh + i - 1, i, deh + i);
-+                              reiserfs_error(sb_from_bi(bi), "vs-10240",
-+                                             "directory item (%h) "
-+                                             "corrupted (prev %a, "
-+                                             "cur(%d) %a)",
-+                                             ih, deh + i - 1, i, deh + i);
-                       if (next && next >= deh_location(&(deh[i])))
--                              reiserfs_warning(NULL, "vs-10250",
--                                               "directory item (%h) "
--                                               "corrupted (cur(%d) %a, "
--                                               "next %a)",
--                                               ih, i, deh + i, deh + i + 1);
-+                              reiserfs_error(sb_from_bi(bi), "vs-10250",
-+                                             "directory item (%h) "
-+                                             "corrupted (cur(%d) %a, "
-+                                             "next %a)",
-+                                             ih, i, deh + i, deh + i + 1);
-               }
-       }
- #endif
---- a/fs/reiserfs/namei.c
-+++ b/fs/reiserfs/namei.c
-@@ -120,8 +120,8 @@ int search_by_entry_key(struct super_blo
-       switch (retval) {
-       case ITEM_NOT_FOUND:
-               if (!PATH_LAST_POSITION(path)) {
--                      reiserfs_warning(sb, "vs-7000", "search_by_key "
--                                       "returned item position == 0");
-+                      reiserfs_error(sb, "vs-7000", "search_by_key "
-+                                     "returned item position == 0");
-                       pathrelse(path);
-                       return IO_ERROR;
-               }
-@@ -135,7 +135,7 @@ int search_by_entry_key(struct super_blo
-       default:
-               pathrelse(path);
--              reiserfs_warning(sb, "vs-7002", "no path to here");
-+              reiserfs_error(sb, "vs-7002", "no path to here");
-               return IO_ERROR;
-       }
-@@ -298,7 +298,7 @@ static int reiserfs_find_entry(struct in
-                   search_by_entry_key(dir->i_sb, &key_to_search,
-                                       path_to_entry, de);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(dir->i_sb, "zam-7001", "io error");
-+                      reiserfs_error(dir->i_sb, "zam-7001", "io error");
-                       return IO_ERROR;
-               }
-@@ -490,9 +490,9 @@ static int reiserfs_add_entry(struct rei
-               }
-               if (retval != NAME_FOUND) {
--                      reiserfs_warning(dir->i_sb, "zam-7002",
--                                       "reiserfs_find_entry() returned "
--                                       "unexpected value (%d)", retval);
-+                      reiserfs_error(dir->i_sb, "zam-7002",
-+                                     "reiserfs_find_entry() returned "
-+                                     "unexpected value (%d)", retval);
-               }
-               return -EEXIST;
-@@ -902,9 +902,9 @@ static int reiserfs_rmdir(struct inode *
-               goto end_rmdir;
-       if (inode->i_nlink != 2 && inode->i_nlink != 1)
--              reiserfs_warning(inode->i_sb, "reiserfs-7040",
--                               "empty directory has nlink != 2 (%d)",
--                               inode->i_nlink);
-+              reiserfs_error(inode->i_sb, "reiserfs-7040",
-+                             "empty directory has nlink != 2 (%d)",
-+                             inode->i_nlink);
-       clear_nlink(inode);
-       inode->i_ctime = dir->i_ctime = dir->i_mtime = CURRENT_TIME_SEC;
-@@ -1495,8 +1495,8 @@ static int reiserfs_rename(struct inode 
-       if (reiserfs_cut_from_item
-           (&th, &old_entry_path, &(old_de.de_entry_key), old_dir, NULL,
-            0) < 0)
--              reiserfs_warning(old_dir->i_sb, "vs-7060",
--                               "couldn't not cut old name. Fsck later?");
-+              reiserfs_error(old_dir->i_sb, "vs-7060",
-+                             "couldn't not cut old name. Fsck later?");
-       old_dir->i_size -= DEH_SIZE + old_de.de_entrylen;
---- a/fs/reiserfs/objectid.c
-+++ b/fs/reiserfs/objectid.c
-@@ -159,8 +159,8 @@ void reiserfs_release_objectid(struct re
-               i += 2;
-       }
--      reiserfs_warning(s, "vs-15011", "tried to free free object id (%lu)",
--                       (long unsigned)objectid_to_release);
-+      reiserfs_error(s, "vs-15011", "tried to free free object id (%lu)",
-+                     (long unsigned)objectid_to_release);
- }
- int reiserfs_convert_objectid_map_v1(struct super_block *s)
---- a/fs/reiserfs/stree.c
-+++ b/fs/reiserfs/stree.c
-@@ -720,9 +720,9 @@ int search_by_key(struct super_block *p_
-               // make sure, that the node contents look like a node of
-               // certain level
-               if (!is_tree_node(p_s_bh, expected_level)) {
--                      reiserfs_warning(p_s_sb, "vs-5150",
--                                       "invalid format found in block %ld. "
--                                       "Fsck?", p_s_bh->b_blocknr);
-+                      reiserfs_error(p_s_sb, "vs-5150",
-+                                     "invalid format found in block %ld. "
-+                                     "Fsck?", p_s_bh->b_blocknr);
-                       pathrelse(p_s_search_path);
-                       return IO_ERROR;
-               }
-@@ -1336,9 +1336,9 @@ void reiserfs_delete_solid_item(struct r
-       while (1) {
-               retval = search_item(th->t_super, &cpu_key, &path);
-               if (retval == IO_ERROR) {
--                      reiserfs_warning(th->t_super, "vs-5350",
--                                       "i/o failure occurred trying "
--                                       "to delete %K", &cpu_key);
-+                      reiserfs_error(th->t_super, "vs-5350",
-+                                     "i/o failure occurred trying "
-+                                     "to delete %K", &cpu_key);
-                       break;
-               }
-               if (retval != ITEM_FOUND) {
-@@ -1737,7 +1737,7 @@ static void truncate_directory(struct re
- {
-       BUG_ON(!th->t_trans_id);
-       if (inode->i_nlink)
--              reiserfs_warning(inode->i_sb, "vs-5655", "link count != 0");
-+              reiserfs_error(inode->i_sb, "vs-5655", "link count != 0");
-       set_le_key_k_offset(KEY_FORMAT_3_5, INODE_PKEY(inode), DOT_OFFSET);
-       set_le_key_k_type(KEY_FORMAT_3_5, INODE_PKEY(inode), TYPE_DIRENTRY);
-@@ -1790,16 +1790,16 @@ int reiserfs_do_truncate(struct reiserfs
-           search_for_position_by_key(p_s_inode->i_sb, &s_item_key,
-                                      &s_search_path);
-       if (retval == IO_ERROR) {
--              reiserfs_warning(p_s_inode->i_sb, "vs-5657",
--                               "i/o failure occurred trying to truncate %K",
--                               &s_item_key);
-+              reiserfs_error(p_s_inode->i_sb, "vs-5657",
-+                             "i/o failure occurred trying to truncate %K",
-+                             &s_item_key);
-               err = -EIO;
-               goto out;
-       }
-       if (retval == POSITION_FOUND || retval == FILE_NOT_FOUND) {
--              reiserfs_warning(p_s_inode->i_sb, "PAP-5660",
--                               "wrong result %d of search for %K", retval,
--                               &s_item_key);
-+              reiserfs_error(p_s_inode->i_sb, "PAP-5660",
-+                             "wrong result %d of search for %K", retval,
-+                             &s_item_key);
-               err = -EIO;
-               goto out;
---- a/fs/reiserfs/super.c
-+++ b/fs/reiserfs/super.c
-@@ -193,9 +193,8 @@ static int finish_unfinished(struct supe
-       while (!retval) {
-               retval = search_item(s, &max_cpu_key, &path);
-               if (retval != ITEM_NOT_FOUND) {
--                      reiserfs_warning(s, "vs-2140",
--                                       "search_by_key returned %d",
--                                       retval);
-+                      reiserfs_error(s, "vs-2140",
-+                                     "search_by_key returned %d", retval);
-                       break;
-               }
-@@ -376,9 +375,9 @@ void add_save_link(struct reiserfs_trans
-       retval = search_item(inode->i_sb, &key, &path);
-       if (retval != ITEM_NOT_FOUND) {
-               if (retval != -ENOSPC)
--                      reiserfs_warning(inode->i_sb, "vs-2100",
--                                       "search_by_key (%K) returned %d", &key,
--                                       retval);
-+                      reiserfs_error(inode->i_sb, "vs-2100",
-+                                     "search_by_key (%K) returned %d", &key,
-+                                     retval);
-               pathrelse(&path);
-               return;
-       }
-@@ -391,8 +390,8 @@ void add_save_link(struct reiserfs_trans
-           reiserfs_insert_item(th, &path, &key, &ih, NULL, (char *)&link);
-       if (retval) {
-               if (retval != -ENOSPC)
--                      reiserfs_warning(inode->i_sb, "vs-2120",
--                                       "insert_item returned %d", retval);
-+                      reiserfs_error(inode->i_sb, "vs-2120",
-+                                     "insert_item returned %d", retval);
-       } else {
-               if (truncate)
-                       REISERFS_I(inode)->i_flags |=
---- a/fs/reiserfs/tail_conversion.c
-+++ b/fs/reiserfs/tail_conversion.c
-@@ -48,9 +48,9 @@ int direct2indirect(struct reiserfs_tran
-       // FIXME: we could avoid this 
-       if (search_for_position_by_key(sb, &end_key, path) == POSITION_FOUND) {
--              reiserfs_warning(sb, "PAP-14030",
--                               "pasted or inserted byte exists in "
--                               "the tree %K. Use fsck to repair.", &end_key);
-+              reiserfs_error(sb, "PAP-14030",
-+                             "pasted or inserted byte exists in "
-+                             "the tree %K. Use fsck to repair.", &end_key);
-               pathrelse(path);
-               return -EIO;
-       }
---- a/fs/reiserfs/xattr.c
-+++ b/fs/reiserfs/xattr.c
-@@ -259,8 +259,8 @@ static int __xattr_readdir(struct inode 
-               ih = de.de_ih;
-               if (!is_direntry_le_ih(ih)) {
--                      reiserfs_warning(inode->i_sb, "jdm-20000",
--                                       "not direntry %h", ih);
-+                      reiserfs_error(inode->i_sb, "jdm-20000",
-+                                     "not direntry %h", ih);
-                       break;
-               }
-               copy_item_head(&tmp_ih, ih);
-@@ -653,15 +653,14 @@ __reiserfs_xattr_del(struct dentry *xadi
-               goto out_file;
-       if (!is_reiserfs_priv_object(dentry->d_inode)) {
--              reiserfs_warning(dir->i_sb, "jdm-20003",
--                               "OID %08x [%.*s/%.*s] doesn't have "
--                               "priv flag set [parent is %sset].",
--                               le32_to_cpu(INODE_PKEY(dentry->d_inode)->
--                                           k_objectid), xadir->d_name.len,
--                               xadir->d_name.name, namelen, name,
--                               is_reiserfs_priv_object(xadir->
--                                                       d_inode) ? "" :
--                               "not ");
-+              reiserfs_error(dir->i_sb, "jdm-20003",
-+                             "OID %08x [%.*s/%.*s] doesn't have "
-+                             "priv flag set [parent is %sset].",
-+                             le32_to_cpu(INODE_PKEY(dentry->d_inode)->
-+                                         k_objectid), xadir->d_name.len,
-+                             xadir->d_name.name, namelen, name,
-+                             is_reiserfs_priv_object(xadir->d_inode) ? "" :
-+                             "not ");
-               dput(dentry);
-               return -EIO;
-       }
diff --git a/src/patches/suse-2.6.27.31/patches.suse/s390-Kerntypes.diff b/src/patches/suse-2.6.27.31/patches.suse/s390-Kerntypes.diff
deleted file mode 100644 (file)
index 6cad1ee..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-From: Michael Holzheu <holzheu@de.ibm.com>
-Subject: [PATCH] Generate Kerntypes file
-Patch-mainline: never
-References: bnc #471422
-
-Since dwarfextract doesn't produce a correct dwarf Kerntypes,
-we produce it with the compiler again.
-
-
-Signed-off-by: Michael Holzheu <holzheu@de.ibm.com>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
----
- arch/s390/boot/Makefile    |    2 
- arch/s390/boot/kerntypes.c |  289 +++++++++++++++++++++++++++++++++++++++++++++
- 2 files changed, 290 insertions(+), 1 deletion(-)
-
---- a/arch/s390/boot/Makefile
-+++ b/arch/s390/boot/Makefile
-@@ -8,7 +8,7 @@ COMPILE_VERSION := __linux_compile_versi
- EXTRA_CFLAGS  := -DCOMPILE_VERSION=$(COMPILE_VERSION) -gstabs -I.
--targets := image
-+targets := image kerntypes.o
- $(obj)/image: vmlinux FORCE
-       $(call if_changed,objcopy)
---- /dev/null
-+++ b/arch/s390/boot/kerntypes.c
-@@ -0,0 +1,289 @@
-+/*
-+ * kerntypes.c
-+ *
-+ * Dummy module that includes headers for all kernel types of interest.
-+ * The kernel type information is used by the lcrash utility when
-+ * analyzing system crash dumps or the live system. Using the type
-+ * information for the running system, rather than kernel header files,
-+ * makes for a more flexible and robust analysis tool.
-+ *
-+ * This source code is released under the GNU GPL.
-+ */
-+
-+/* generate version for this file */
-+typedef char *COMPILE_VERSION;
-+
-+/* General linux types */
-+
-+#include <linux/autoconf.h>
-+#include <linux/compile.h>
-+#include <linux/utsname.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#ifdef CONFIG_SLUB
-+ #include <linux/slub_def.h>
-+#else
-+ #include <linux/slab_def.h>
-+#endif
-+#include <linux/slab.h>
-+#include <linux/bio.h>
-+#include <linux/bitmap.h>
-+#include <linux/bitops.h>
-+#include <linux/bitrev.h>
-+#include <linux/blkdev.h>
-+#include <linux/blkpg.h>
-+#include <linux/bootmem.h>
-+#include <linux/buffer_head.h>
-+#include <linux/cache.h>
-+#include <linux/cdev.h>
-+#include <linux/cpu.h>
-+#include <linux/cpumask.h>
-+#include <linux/cpuset.h>
-+#include <linux/dcache.h>
-+#include <linux/debugfs.h>
-+#include <linux/elevator.h>
-+#include <linux/fd.h>
-+#include <linux/file.h>
-+#include <linux/fs.h>
-+#include <linux/futex.h>
-+#include <linux/genhd.h>
-+#include <linux/highmem.h>
-+#include <linux/if.h>
-+#include <linux/if_addr.h>
-+#include <linux/if_arp.h>
-+#include <linux/if_bonding.h>
-+#include <linux/if_ether.h>
-+#include <linux/if_tr.h>
-+#include <linux/if_tun.h>
-+#include <linux/if_vlan.h>
-+#include <linux/in.h>
-+#include <linux/in6.h>
-+#include <linux/in_route.h>
-+#include <linux/inet.h>
-+#include <linux/inet_diag.h>
-+#include <linux/inetdevice.h>
-+#include <linux/init.h>
-+#include <linux/initrd.h>
-+#include <linux/inotify.h>
-+#include <linux/interrupt.h>
-+#include <linux/ioctl.h>
-+#include <linux/ip.h>
-+#include <linux/ipsec.h>
-+#include <linux/ipv6.h>
-+#include <linux/ipv6_route.h>
-+#include <linux/irq.h>
-+#include <linux/irqflags.h>
-+#include <linux/irqreturn.h>
-+#include <linux/jbd2.h>
-+#include <linux/jffs2.h>
-+#include <linux/jhash.h>
-+#include <linux/jiffies.h>
-+#include <linux/kallsyms.h>
-+#include <linux/kernel.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/kexec.h>
-+#include <linux/kobject.h>
-+#include <linux/kthread.h>
-+#include <linux/ktime.h>
-+#include <linux/list.h>
-+#include <linux/memory.h>
-+#include <linux/miscdevice.h>
-+#include <linux/mm.h>
-+#include <linux/mm_inline.h>
-+#include <linux/mm_types.h>
-+#include <linux/mman.h>
-+#include <linux/mmtimer.h>
-+#include <linux/mmzone.h>
-+#include <linux/mnt_namespace.h>
-+#include <linux/module.h>
-+#include <linux/moduleloader.h>
-+#include <linux/moduleparam.h>
-+#include <linux/mount.h>
-+#include <linux/mpage.h>
-+#include <linux/mqueue.h>
-+#include <linux/mtio.h>
-+#include <linux/mutex.h>
-+#include <linux/namei.h>
-+#include <linux/neighbour.h>
-+#include <linux/net.h>
-+#include <linux/netdevice.h>
-+#include <linux/netfilter.h>
-+#include <linux/netfilter_arp.h>
-+#include <linux/netfilter_bridge.h>
-+#include <linux/netfilter_decnet.h>
-+#include <linux/netfilter_ipv4.h>
-+#include <linux/netfilter_ipv6.h>
-+#include <linux/netlink.h>
-+#include <linux/netpoll.h>
-+#include <linux/pagemap.h>
-+#include <linux/param.h>
-+#include <linux/percpu.h>
-+#include <linux/percpu_counter.h>
-+#include <linux/pfn.h>
-+#include <linux/pid.h>
-+#include <linux/pid_namespace.h>
-+#include <linux/pm.h>
-+#include <linux/poll.h>
-+#include <linux/posix-timers.h>
-+#include <linux/posix_acl.h>
-+#include <linux/posix_acl_xattr.h>
-+#include <linux/posix_types.h>
-+#include <linux/preempt.h>
-+#include <linux/prio_tree.h>
-+#include <linux/proc_fs.h>
-+#include <linux/profile.h>
-+#include <linux/ptrace.h>
-+#include <linux/radix-tree.h>
-+#include <linux/ramfs.h>
-+#include <linux/raw.h>
-+#include <linux/rbtree.h>
-+#include <linux/rcupdate.h>
-+#include <linux/reboot.h>
-+#include <linux/relay.h>
-+#include <linux/resource.h>
-+#include <linux/romfs_fs.h>
-+#include <linux/root_dev.h>
-+#include <linux/route.h>
-+#include <linux/rwsem.h>
-+#include <linux/sched.h>
-+#include <linux/sem.h>
-+#include <linux/seq_file.h>
-+#include <linux/seqlock.h>
-+#include <linux/shm.h>
-+#include <linux/shmem_fs.h>
-+#include <linux/signal.h>
-+#include <linux/signalfd.h>
-+#include <linux/skbuff.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/socket.h>
-+#include <linux/sockios.h>
-+#include <linux/spinlock.h>
-+#include <linux/stat.h>
-+#include <linux/statfs.h>
-+#include <linux/stddef.h>
-+#include <linux/swap.h>
-+#include <linux/swapops.h>
-+#include <linux/sys.h>
-+#include <linux/syscalls.h>
-+#include <linux/sysctl.h>
-+#include <linux/sysdev.h>
-+#include <linux/sysfs.h>
-+#include <linux/sysrq.h>
-+#include <linux/tc.h>
-+#include <linux/tcp.h>
-+#include <linux/thread_info.h>
-+#include <linux/threads.h>
-+#include <linux/tick.h>
-+#include <linux/time.h>
-+#include <linux/timer.h>
-+#include <linux/timerfd.h>
-+#include <linux/times.h>
-+#include <linux/timex.h>
-+#include <linux/topology.h>
-+#include <linux/transport_class.h>
-+#include <linux/tty.h>
-+#include <linux/tty_driver.h>
-+#include <linux/tty_flip.h>
-+#include <linux/tty_ldisc.h>
-+#include <linux/types.h>
-+#include <linux/uaccess.h>
-+#include <linux/unistd.h>
-+#include <linux/utime.h>
-+#include <linux/uts.h>
-+#include <linux/utsname.h>
-+#include <linux/utsrelease.h>
-+#include <linux/version.h>
-+#include <linux/vfs.h>
-+#include <linux/vmalloc.h>
-+#include <linux/vmstat.h>
-+#include <linux/wait.h>
-+#include <linux/watchdog.h>
-+#include <linux/workqueue.h>
-+#include <linux/zconf.h>
-+#include <linux/zlib.h>
-+
-+/*
-+ * s390 specific includes
-+ */
-+
-+#include <asm/lowcore.h>
-+#include <asm/debug.h>
-+#include <asm/ccwdev.h>
-+#include <asm/ccwgroup.h>
-+#include <asm/qdio.h>
-+#include <asm/zcrypt.h>
-+#include <asm/etr.h>
-+#include <asm/ipl.h>
-+#include <asm/setup.h>
-+#include <asm/schid.h>
-+#include <asm/chsc.h>
-+
-+/* channel subsystem driver */
-+#include "drivers/s390/cio/cio.h"
-+#include "drivers/s390/cio/chsc.h"
-+#include "drivers/s390/cio/css.h"
-+#include "drivers/s390/cio/device.h"
-+#include "drivers/s390/cio/chsc_sch.h"
-+
-+/* dasd device driver */
-+#include "drivers/s390/block/dasd_int.h"
-+#include "drivers/s390/block/dasd_diag.h"
-+#include "drivers/s390/block/dasd_eckd.h"
-+#include "drivers/s390/block/dasd_fba.h"
-+
-+/* networking drivers */
-+#include "include/net/iucv/iucv.h"
-+#include "drivers/s390/net/fsm.h"
-+#include "drivers/s390/net/ctcm_main.h"
-+#include "drivers/s390/net/ctcm_fsms.h"
-+#include "drivers/s390/net/lcs.h"
-+#include "drivers/s390/net/qeth_core.h"
-+#include "drivers/s390/net/qeth_core_mpc.h"
-+#include "drivers/s390/net/qeth_core_offl.h"
-+#include "drivers/s390/net/qeth_l3.h"
-+
-+/* zfcp device driver */
-+#include "drivers/s390/scsi/zfcp_def.h"
-+#include "drivers/s390/scsi/zfcp_fsf.h"
-+
-+/* crypto device driver */
-+#include "drivers/s390/crypto/ap_bus.h"
-+#include "drivers/s390/crypto/zcrypt_api.h"
-+#include "drivers/s390/crypto/zcrypt_cca_key.h"
-+#include "drivers/s390/crypto/zcrypt_pcica.h"
-+#include "drivers/s390/crypto/zcrypt_pcicc.h"
-+#include "drivers/s390/crypto/zcrypt_pcixcc.h"
-+#include "drivers/s390/crypto/zcrypt_cex2a.h"
-+
-+/* sclp device driver */
-+#include "drivers/s390/char/sclp.h"
-+#include "drivers/s390/char/sclp_rw.h"
-+#include "drivers/s390/char/sclp_tty.h"
-+
-+/* vmur device driver */
-+#include "drivers/s390/char/vmur.h"
-+
-+/* qdio device driver */
-+#include "drivers/s390/cio/qdio.h"
-+#include "drivers/s390/cio/qdio_thinint.c"
-+#include "drivers/s390/cio/qdio_perf.h"
-+
-+/*
-+ * include sched.c for types:
-+ *    - struct prio_array
-+ *    - struct runqueue
-+ */
-+#include "kernel/sched.c"
-+/*
-+ * include slab.c for struct kmem_cache
-+ */
-+#ifdef CONFIG_SLUB
-+ #include "mm/slub.c"
-+#else
-+ #include "mm/slab.c"
-+#endif
-+
-+/* include driver core private structures */
-+#include "drivers/base/base.h"
diff --git a/src/patches/suse-2.6.27.31/patches.suse/s390-System.map.diff b/src/patches/suse-2.6.27.31/patches.suse/s390-System.map.diff
deleted file mode 100644 (file)
index 93b9546..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-From: Bernhard Walle <bwalle@suse.de>
-Subject: [PATCH] Strip L2^B symbols
-Patch-mainline: never
-References: bnc #456682
-
-This patches strips all L2^B symbols that happen on s390 only from System.map.
-We don't need that symbols as this are local labels. It confuses (older)
-versions of crash and just makes System.map larger.
-
-The proper fix needs to be in binutils. However, since the binutils maintainer
-at SUSE is not cooperative I workarounded this in the kernel. The proper
-binutils patch is already mainline [1].
-
-
-Signed-off-by: Bernhard Walle <bwalle@suse.de>
-
-[1] http://article.gmane.org/gmane.comp.gnu.binutils.cvs/12731
----
- scripts/mksysmap |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/scripts/mksysmap
-+++ b/scripts/mksysmap
-@@ -41,5 +41,5 @@
- # so we just ignore them to let readprofile continue to work.
- # (At least sparc64 has __crc_ in the middle).
--$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)' > $2
-+$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\(L2\ 2\)' > $2
diff --git a/src/patches/suse-2.6.27.31/patches.suse/usb_correct_config_ti_04b3_4543.diff b/src/patches/suse-2.6.27.31/patches.suse/usb_correct_config_ti_04b3_4543.diff
deleted file mode 100644 (file)
index 911a48f..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-From: Petr Ostadal <postadal@novell.com>
-Subject: fix ti_usb_3410_5052 driver for device 04b3:4543
-References: bnc#395775
-
-Signed-off-by: Oliver Neukum <oneukum@suse.de>
-
----
- drivers/usb/serial/ti_usb_3410_5052.c |    6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
---- a/drivers/usb/serial/ti_usb_3410_5052.c
-+++ b/drivers/usb/serial/ti_usb_3410_5052.c
-@@ -463,9 +463,11 @@ static int ti_startup(struct usb_serial
-               goto free_tdev;
-       }
--      /* the second configuration must be set (in sysfs by hotplug script) */
-+      /* the second configuration must be set */
-+      printk(KERN_DEBUG"%s: bConfigurationValue: %x\n", __FUNCTION__, dev->actconfig->desc.bConfigurationValue);
-       if (dev->actconfig->desc.bConfigurationValue == TI_BOOT_CONFIG) {
--              status = -ENODEV;
-+              status = usb_driver_set_configuration(dev, TI_ACTIVE_CONFIG);
-+              status = status ? status : -ENODEV;
-               goto free_tdev;
-       }
diff --git a/src/patches/suse-2.6.27.31/patches.trace/ftrace-framepointer.diff b/src/patches/suse-2.6.27.31/patches.trace/ftrace-framepointer.diff
deleted file mode 100644 (file)
index d2d2fe4..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-From: Jan Blunck <jblunck@suse.de>
-Subject: Select FRAME_POINTER only on SYSPROF_TRACER
-Date: Wed Sep 24 10:32:16 CEST 2008
-
-The only tracer that requires frame pointers is the sysprof trace. Since this
-tracer copies the functionality of oprofile, it isn't required at all.
-
-Signed-off-by: Jan Blunck <jblunck@suse.de>
----
- kernel/trace/Kconfig |    2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-Index: b/kernel/trace/Kconfig
-===================================================================
---- a/kernel/trace/Kconfig
-+++ b/kernel/trace/Kconfig
-@@ -18,7 +18,6 @@ config TRACING
- config FTRACE
-       bool "Kernel Function Tracer"
-       depends on HAVE_FTRACE
--      select FRAME_POINTER
-       select TRACING
-       select CONTEXT_SWITCH_TRACER
-       help
-@@ -79,6 +78,7 @@ config SYSPROF_TRACER
-       bool "Sysprof Tracer"
-       depends on X86
-       select TRACING
-+      select FRAME_POINTER
-       help
-         This tracer provides the trace needed by the 'Sysprof' userspace
-         tool.
diff --git a/src/patches/suse-2.6.27.31/patches.trace/s390-syscall-get-nr.diff b/src/patches/suse-2.6.27.31/patches.trace/s390-syscall-get-nr.diff
deleted file mode 100644 (file)
index 2d33f08..0000000
+++ /dev/null
@@ -1,281 +0,0 @@
-Subject: [PATCH] fix syscall_get_nr.
-
-From: Martin Schwidefsky <schwidefsky@de.ibm.com>
-
-syscall_get_nr() currently returns a valid result only if the call
-chain of the traced process includes do_syscall_trace_enter(). But
-collect_syscall() can be called for any sleeping task, the result of
-syscall_get_nr() in general is completely bogus.
-
-To make syscall_get_nr() work for any sleeping task the traps field
-in pt_regs is replace with svcnr - the system call number the process
-is executing. If svcnr == 0 the process is not on a system call path.
-
-Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
-Acked-by: John Jolly <jjolly@novell.com>
----
-
- arch/s390/include/asm/ptrace.h   |    2 +-
- arch/s390/include/asm/syscall.h  |    4 +---
- arch/s390/kernel/asm-offsets.c   |    2 +-
- arch/s390/kernel/compat_signal.c |    2 +-
- arch/s390/kernel/entry.S         |   21 +++++++++++----------
- arch/s390/kernel/entry64.S       |   23 ++++++++++-------------
- arch/s390/kernel/ptrace.c        |    2 +-
- arch/s390/kernel/signal.c        |    6 +++---
- 8 files changed, 29 insertions(+), 33 deletions(-)
-
---- a/arch/s390/include/asm/ptrace.h
-+++ b/arch/s390/include/asm/ptrace.h
-@@ -321,8 +321,8 @@ struct pt_regs 
-       psw_t psw;
-       unsigned long gprs[NUM_GPRS];
-       unsigned long orig_gpr2;
-+      unsigned short svcnr;
-       unsigned short ilc;
--      unsigned short trap;
- };
- #endif
---- a/arch/s390/include/asm/syscall.h
-+++ b/arch/s390/include/asm/syscall.h
-@@ -17,9 +17,7 @@
- static inline long syscall_get_nr(struct task_struct *task,
-                                 struct pt_regs *regs)
- {
--      if (regs->trap != __LC_SVC_OLD_PSW)
--              return -1;
--      return regs->gprs[2];
-+      return regs->svcnr ? regs->svcnr : -1;
- }
- static inline void syscall_rollback(struct task_struct *task,
---- a/arch/s390/kernel/asm-offsets.c
-+++ b/arch/s390/kernel/asm-offsets.c
-@@ -32,7 +32,7 @@ int main(void)
-       DEFINE(__PT_GPRS, offsetof(struct pt_regs, gprs));
-       DEFINE(__PT_ORIG_GPR2, offsetof(struct pt_regs, orig_gpr2));
-       DEFINE(__PT_ILC, offsetof(struct pt_regs, ilc));
--      DEFINE(__PT_TRAP, offsetof(struct pt_regs, trap));
-+      DEFINE(__PT_SVCNR, offsetof(struct pt_regs, svcnr));
-       DEFINE(__PT_SIZE, sizeof(struct pt_regs));
-       BLANK();
-       DEFINE(__SF_BACKCHAIN, offsetof(struct stack_frame, back_chain));
---- a/arch/s390/kernel/compat_signal.c
-+++ b/arch/s390/kernel/compat_signal.c
-@@ -340,7 +340,7 @@ static int restore_sigregs32(struct pt_r
-               return err;
-       restore_fp_regs(&current->thread.fp_regs);
--      regs->trap = -1;        /* disable syscall checks */
-+      regs->svcnr = 0;        /* disable syscall checks */
-       return 0;
- }
---- a/arch/s390/kernel/entry64.S
-+++ b/arch/s390/kernel/entry64.S
-@@ -46,7 +46,7 @@ SP_R14            =  STACK_FRAME_OVERHEAD + __P
- SP_R15             =  STACK_FRAME_OVERHEAD + __PT_GPRS + 120
- SP_ORIG_R2   =        STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2
- SP_ILC             =  STACK_FRAME_OVERHEAD + __PT_ILC
--SP_TRAP      =        STACK_FRAME_OVERHEAD + __PT_TRAP
-+SP_SVCNR      =       STACK_FRAME_OVERHEAD + __PT_SVCNR
- SP_SIZE      =        STACK_FRAME_OVERHEAD + __PT_SIZE
- STACK_SHIFT = PAGE_SHIFT + THREAD_ORDER
-@@ -168,11 +168,10 @@ _TIF_WORK_INT = (_TIF_SIGPENDING | _TIF_
-       .macro  CREATE_STACK_FRAME psworg,savearea
-       aghi    %r15,-SP_SIZE           # make room for registers & psw
-       mvc     SP_PSW(16,%r15),0(%r12) # move user PSW to stack
--      la      %r12,\psworg
-       stg     %r2,SP_ORIG_R2(%r15)    # store original content of gpr 2
--      icm     %r12,12,__LC_SVC_ILC
-+      icm     %r12,3,__LC_SVC_ILC
-       stmg    %r0,%r11,SP_R0(%r15)    # store gprs %r0-%r11 to kernel stack
--      st      %r12,SP_ILC(%r15)
-+      st      %r12,SP_SVCNR(%r15)
-       mvc     SP_R12(32,%r15),\savearea # move %r12-%r15 to stack
-       la      %r12,0
-       stg     %r12,__SF_BACKCHAIN(%r15)
-@@ -247,16 +246,17 @@ sysc_update:
- #endif
- sysc_do_svc:
-       lg      %r9,__LC_THREAD_INFO    # load pointer to thread_info struct
--      slag    %r7,%r7,2       # *4 and test for svc 0
-+      ltgr    %r7,%r7         # test for svc 0
-       jnz     sysc_nr_ok
-       # svc 0: system call number in %r1
-       cl      %r1,BASED(.Lnr_syscalls)
-       jnl     sysc_nr_ok
-       lgfr    %r7,%r1         # clear high word in r1
--      slag    %r7,%r7,2       # svc 0: system call number in %r1
- sysc_nr_ok:
-       mvc     SP_ARGS(8,%r15),SP_R7(%r15)
- sysc_do_restart:
-+      sth     %r7,SP_SVCNR(%r15)
-+      sllg    %r7,%r7,2       # svc number * 4
-       larl    %r10,sys_call_table
- #ifdef CONFIG_COMPAT
-       tm      __TI_flags+5(%r9),(_TIF_31BIT>>16)  # running in 31 bit mode ?
-@@ -360,7 +360,6 @@ sysc_notify_resume:
- sysc_restart:
-       ni      __TI_flags+7(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
-       lg      %r7,SP_R2(%r15)         # load new svc number
--      slag    %r7,%r7,2               # *4
-       mvc     SP_R2(8,%r15),SP_ORIG_R2(%r15) # restore first argument
-       lmg     %r2,%r6,SP_R2(%r15)     # load svc arguments
-       j       sysc_do_restart         # restart svc
-@@ -369,9 +368,8 @@ sysc_restart:
- # _TIF_SINGLE_STEP is set, call do_single_step
- #
- sysc_singlestep:
--      ni      __TI_flags+7(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
--      lhi     %r0,__LC_PGM_OLD_PSW
--      sth     %r0,SP_TRAP(%r15)       # set trap indication to pgm check
-+      ni      __TI_flags+7(%r9),255-_TIF_SINGLE_STEP  # clear TIF_SINGLE_STEP
-+      xc      SP_SVCNR(2,%r15),SP_SVCNR(%r15)         # clear svc number
-       la      %r2,SP_PTREGS(%r15)     # address of register-save area
-       larl    %r14,sysc_return        # load adr. of system return
-       jg      do_single_step          # branch to do_sigtrap
-@@ -389,7 +387,7 @@ sysc_tracesys:
-       lghi    %r0,NR_syscalls
-       clgr    %r0,%r2
-       jnh     sysc_tracenogo
--      slag    %r7,%r2,2               # *4
-+      sllg    %r7,%r2,2               # svc number *4
-       lgf     %r8,0(%r7,%r10)
- sysc_tracego:
-       lmg     %r3,%r6,SP_R3(%r15)
-@@ -564,8 +562,7 @@ pgm_svcper:
- # per was called from kernel, must be kprobes
- #
- kernel_per:
--      lhi     %r0,__LC_PGM_OLD_PSW
--      sth     %r0,SP_TRAP(%r15)       # set trap indication to pgm check
-+      xc      SP_SVCNR(2,%r15),SP_SVCNR(%r15) # clear svc number
-       la      %r2,SP_PTREGS(%r15)     # address of register-save area
-       larl    %r14,sysc_restore       # load adr. of system ret, no work
-       jg      do_single_step          # branch to do_single_step
---- a/arch/s390/kernel/entry.S
-+++ b/arch/s390/kernel/entry.S
-@@ -46,7 +46,7 @@ SP_R14            =  STACK_FRAME_OVERHEAD + __P
- SP_R15             =  STACK_FRAME_OVERHEAD + __PT_GPRS + 60
- SP_ORIG_R2   =        STACK_FRAME_OVERHEAD + __PT_ORIG_GPR2
- SP_ILC             =  STACK_FRAME_OVERHEAD + __PT_ILC
--SP_TRAP      =        STACK_FRAME_OVERHEAD + __PT_TRAP
-+SP_SVCNR     =        STACK_FRAME_OVERHEAD + __PT_SVCNR
- SP_SIZE      =        STACK_FRAME_OVERHEAD + __PT_SIZE
- _TIF_WORK_SVC = (_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_NEED_RESCHED | \
-@@ -180,11 +180,10 @@ STACK_SIZE  = 1 << STACK_SHIFT
-       .macro  CREATE_STACK_FRAME psworg,savearea
-       s       %r15,BASED(.Lc_spsize)  # make room for registers & psw
-       mvc     SP_PSW(8,%r15),0(%r12)  # move user PSW to stack
--      la      %r12,\psworg
-       st      %r2,SP_ORIG_R2(%r15)    # store original content of gpr 2
--      icm     %r12,12,__LC_SVC_ILC
-+      icm     %r12,3,__LC_SVC_ILC
-       stm     %r0,%r11,SP_R0(%r15)    # store gprs %r0-%r11 to kernel stack
--      st      %r12,SP_ILC(%r15)
-+      st      %r12,SP_SVCNR(%r15)
-       mvc     SP_R12(16,%r15),\savearea # move %r12-%r15 to stack
-       la      %r12,0
-       st      %r12,__SF_BACKCHAIN(%r15)       # clear back chain
-@@ -261,16 +260,17 @@ sysc_update:
- #endif
- sysc_do_svc:
-       l       %r9,__LC_THREAD_INFO    # load pointer to thread_info struct
--      sla     %r7,2                   # *4 and test for svc 0
-+      ltr     %r7,%r7                 # test for svc 0
-       bnz     BASED(sysc_nr_ok)       # svc number > 0
-       # svc 0: system call number in %r1
-       cl      %r1,BASED(.Lnr_syscalls)
-       bnl     BASED(sysc_nr_ok)
-       lr      %r7,%r1           # copy svc number to %r7
--      sla     %r7,2             # *4
- sysc_nr_ok:
-       mvc     SP_ARGS(4,%r15),SP_R7(%r15)
- sysc_do_restart:
-+      sth     %r7,SP_SVCNR(%r15)
-+      sll     %r7,2             # svc number *4
-       l       %r8,BASED(.Lsysc_table)
-       tm      __TI_flags+3(%r9),(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT)
-       l       %r8,0(%r7,%r8)    # get system call addr.
-@@ -373,7 +373,6 @@ sysc_notify_resume:
- sysc_restart:
-       ni      __TI_flags+3(%r9),255-_TIF_RESTART_SVC # clear TIF_RESTART_SVC
-       l       %r7,SP_R2(%r15)         # load new svc number
--      sla     %r7,2
-       mvc     SP_R2(4,%r15),SP_ORIG_R2(%r15) # restore first argument
-       lm      %r2,%r6,SP_R2(%r15)     # load svc arguments
-       b       BASED(sysc_do_restart)  # restart svc
-@@ -383,7 +382,8 @@ sysc_restart:
- #
- sysc_singlestep:
-       ni      __TI_flags+3(%r9),255-_TIF_SINGLE_STEP # clear TIF_SINGLE_STEP
--      mvi     SP_TRAP+1(%r15),0x28    # set trap indication to pgm check
-+      mvi     SP_SVCNR(%r15),0xff     # set trap indication to pgm check
-+      mvi     SP_SVCNR+1(%r15),0xff
-       la      %r2,SP_PTREGS(%r15)     # address of register-save area
-       l       %r1,BASED(.Lhandle_per) # load adr. of per handler
-       la      %r14,BASED(sysc_return) # load adr. of system return
-@@ -404,7 +404,7 @@ sysc_tracesys:
-       bnl     BASED(sysc_tracenogo)
-       l       %r8,BASED(.Lsysc_table)
-       lr      %r7,%r2
--      sll     %r7,2                   # *4
-+      sll     %r7,2                   # svc number *4
-       l       %r8,0(%r7,%r8)
- sysc_tracego:
-       lm      %r3,%r6,SP_R3(%r15)
-@@ -583,7 +583,8 @@ pgm_svcper:
- # per was called from kernel, must be kprobes
- #
- kernel_per:
--      mvi     SP_TRAP+1(%r15),0x28    # set trap indication to pgm check
-+      mvi     SP_SVCNR(%r15),0xff     # set trap indication to pgm check
-+      mvi     SP_SVCNR+1(%r15),0xff
-       la      %r2,SP_PTREGS(%r15)     # address of register-save area
-       l       %r1,BASED(.Lhandle_per) # load adr. of per handler
-       la      %r14,BASED(sysc_restore)# load adr. of system return
---- a/arch/s390/kernel/ptrace.c
-+++ b/arch/s390/kernel/ptrace.c
-@@ -671,7 +671,7 @@ asmlinkage long do_syscall_trace_enter(s
-                * debugger stored an invalid system call number. Skip
-                * the system call and the system call restart handling.
-                */
--              regs->trap = -1;
-+              regs->svcnr = 0;
-               ret = -1;
-       }
---- a/arch/s390/kernel/signal.c
-+++ b/arch/s390/kernel/signal.c
-@@ -157,7 +157,7 @@ static int restore_sigregs(struct pt_reg
-       current->thread.fp_regs.fpc &= FPC_VALID_MASK;
-       restore_fp_regs(&current->thread.fp_regs);
--      regs->trap = -1;        /* disable syscall checks */
-+      regs->svcnr = 0;        /* disable syscall checks */
-       return 0;
- }
-@@ -442,7 +442,7 @@ void do_signal(struct pt_regs *regs)
-               oldset = &current->blocked;
-       /* Are we from a system call? */
--      if (regs->trap == __LC_SVC_OLD_PSW) {
-+      if (regs->svcnr) {
-               continue_addr = regs->psw.addr;
-               restart_addr = continue_addr - regs->ilc;
-               retval = regs->gprs[2];
-@@ -459,7 +459,7 @@ void do_signal(struct pt_regs *regs)
-               case -ERESTART_RESTARTBLOCK:
-                       regs->gprs[2] = -EINTR;
-               }
--              regs->trap = -1;        /* Don't deal with this again. */
-+              regs->svcnr = 0;        /* Don't deal with this again. */
-       }
-       /* Get signal to deliver.  When running under ptrace, at this point
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-i386.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-i386.diff
deleted file mode 100644 (file)
index 4ac9419..0000000
+++ /dev/null
@@ -1,280 +0,0 @@
-Subject: xen3 arch-i386
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-Index: head-2008-11-25/arch/x86/kernel/asm-offsets_32.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/asm-offsets_32.c      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/asm-offsets_32.c   2008-11-25 12:35:53.000000000 +0100
-@@ -91,9 +91,14 @@ void foo(void)
-       OFFSET(pbe_orig_address, pbe, orig_address);
-       OFFSET(pbe_next, pbe, next);
-+#ifndef CONFIG_X86_NO_TSS
-       /* Offset from the sysenter stack to tss.sp0 */
--      DEFINE(TSS_sysenter_sp0, offsetof(struct tss_struct, x86_tss.sp0) -
-+      DEFINE(SYSENTER_stack_sp0, offsetof(struct tss_struct, x86_tss.sp0) -
-                sizeof(struct tss_struct));
-+#else
-+      /* sysenter stack points directly to sp0 */
-+      DEFINE(SYSENTER_stack_sp0, 0);
-+#endif
-       DEFINE(PAGE_SIZE_asm, PAGE_SIZE);
-       DEFINE(PAGE_SHIFT_asm, PAGE_SHIFT);
-Index: head-2008-11-25/arch/x86/kernel/entry_32.S
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/entry_32.S    2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/entry_32.S 2008-11-25 12:35:53.000000000 +0100
-@@ -293,7 +293,7 @@ ENTRY(ia32_sysenter_target)
-       CFI_SIGNAL_FRAME
-       CFI_DEF_CFA esp, 0
-       CFI_REGISTER esp, ebp
--      movl TSS_sysenter_sp0(%esp),%esp
-+      movl SYSENTER_stack_sp0(%esp),%esp
- sysenter_past_esp:
-       /*
-        * Interrupts are disabled here, but we can't trace it until
-@@ -782,7 +782,7 @@ END(device_not_available)
-  * that sets up the real kernel stack. Check here, since we can't
-  * allow the wrong stack to be used.
-  *
-- * "TSS_sysenter_sp0+12" is because the NMI/debug handler will have
-+ * "SYSENTER_stack_sp0+12" is because the NMI/debug handler will have
-  * already pushed 3 words if it hits on the sysenter instruction:
-  * eflags, cs and eip.
-  *
-@@ -794,7 +794,7 @@ END(device_not_available)
-       cmpw $__KERNEL_CS,4(%esp);              \
-       jne ok;                                 \
- label:                                                \
--      movl TSS_sysenter_sp0+offset(%esp),%esp;        \
-+      movl SYSENTER_stack_sp0+offset(%esp),%esp;      \
-       CFI_DEF_CFA esp, 0;                     \
-       CFI_UNDEFINED eip;                      \
-       pushfl;                                 \
-Index: head-2008-11-25/arch/x86/kernel/machine_kexec_32.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/machine_kexec_32.c    2008-11-17 13:38:03.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/machine_kexec_32.c 2008-11-25 12:35:53.000000000 +0100
-@@ -25,6 +25,10 @@
- #include <asm/system.h>
- #include <asm/cacheflush.h>
-+#ifdef CONFIG_XEN
-+#include <xen/interface/kexec.h>
-+#endif
-+
- #define PAGE_ALIGNED __attribute__ ((__aligned__(PAGE_SIZE)))
- static u32 kexec_pgd[1024] PAGE_ALIGNED;
- #ifdef CONFIG_X86_PAE
-@@ -34,6 +38,55 @@ static u32 kexec_pmd1[1024] PAGE_ALIGNED
- static u32 kexec_pte0[1024] PAGE_ALIGNED;
- static u32 kexec_pte1[1024] PAGE_ALIGNED;
-+#ifdef CONFIG_XEN
-+
-+#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-+
-+#if PAGES_NR > KEXEC_XEN_NO_PAGES
-+#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-+#endif
-+
-+#if PA_CONTROL_PAGE != 0
-+#error PA_CONTROL_PAGE is non zero - Xen support will break
-+#endif
-+
-+void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-+{
-+      void *control_page;
-+
-+      memset(xki->page_list, 0, sizeof(xki->page_list));
-+
-+      control_page = page_address(image->control_code_page);
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+      xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-+      xki->page_list[PA_PGD] = __ma(kexec_pgd);
-+#ifdef CONFIG_X86_PAE
-+      xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-+      xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-+#endif
-+      xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-+      xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-+
-+}
-+
-+int __init machine_kexec_setup_resources(struct resource *hypervisor,
-+                                       struct resource *phys_cpus,
-+                                       int nr_phys_cpus)
-+{
-+      int k;
-+
-+      /* The per-cpu crash note resources belong to the hypervisor resource */
-+      for (k = 0; k < nr_phys_cpus; k++)
-+              request_resource(hypervisor, phys_cpus + k);
-+
-+      return 0;
-+}
-+
-+void machine_kexec_register_resources(struct resource *res) { ; }
-+
-+#endif /* CONFIG_XEN */
-+
- /*
-  * A architecture hook called to validate the
-  * proposed image and prepare the control pages
-@@ -64,6 +117,7 @@ void machine_kexec_cleanup(struct kimage
-               set_pages_nx(image->control_code_page, 1);
- }
-+#ifndef CONFIG_XEN
- /*
-  * Do not allocate memory (or fail in any way) in machine_kexec().
-  * We are past the point of no return, committed to rebooting now.
-@@ -137,6 +191,7 @@ void machine_kexec(struct kimage *image)
-       __ftrace_enabled_restore(save_ftrace_enabled);
- }
-+#endif
- void arch_crash_save_vmcoreinfo(void)
- {
-Index: head-2008-11-25/arch/x86/kernel/vm86_32.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/vm86_32.c     2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/vm86_32.c  2008-11-25 12:35:53.000000000 +0100
-@@ -124,7 +124,9 @@ static int copy_vm86_regs_from_user(stru
- struct pt_regs *save_v86_state(struct kernel_vm86_regs *regs)
- {
-+#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss;
-+#endif
-       struct pt_regs *ret;
-       unsigned long tmp;
-@@ -147,12 +149,16 @@ struct pt_regs *save_v86_state(struct ke
-               do_exit(SIGSEGV);
-       }
-+#ifndef CONFIG_X86_NO_TSS
-       tss = &per_cpu(init_tss, get_cpu());
-+#endif
-       current->thread.sp0 = current->thread.saved_sp0;
-       current->thread.sysenter_cs = __KERNEL_CS;
-       load_sp0(tss, &current->thread);
-       current->thread.saved_sp0 = 0;
-+#ifndef CONFIG_X86_NO_TSS
-       put_cpu();
-+#endif
-       ret = KVM86->regs32;
-@@ -279,7 +285,9 @@ out:
- static void do_sys_vm86(struct kernel_vm86_struct *info, struct task_struct *tsk)
- {
-+#ifndef CONFIG_X86_NO_TSS
-       struct tss_struct *tss;
-+#endif
- /*
-  * make sure the vm86() system call doesn't try to do anything silly
-  */
-@@ -324,12 +332,16 @@ static void do_sys_vm86(struct kernel_vm
-       tsk->thread.saved_fs = info->regs32->fs;
-       savesegment(gs, tsk->thread.saved_gs);
-+#ifndef CONFIG_X86_NO_TSS
-       tss = &per_cpu(init_tss, get_cpu());
-+#endif
-       tsk->thread.sp0 = (unsigned long) &info->VM86_TSS_ESP0;
-       if (cpu_has_sep)
-               tsk->thread.sysenter_cs = 0;
-       load_sp0(tss, &tsk->thread);
-+#ifndef CONFIG_X86_NO_TSS
-       put_cpu();
-+#endif
-       tsk->thread.screen_bitmap = info->screen_bitmap;
-       if (info->flags & VM86_SCREEN_BITMAP)
-Index: head-2008-11-25/arch/x86/power/cpu_32.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/power/cpu_32.c       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/power/cpu_32.c    2008-11-25 12:35:53.000000000 +0100
-@@ -65,6 +65,7 @@ static void do_fpu_end(void)
- static void fix_processor_context(void)
- {
-+#ifndef CONFIG_X86_NO_TSS
-       int cpu = smp_processor_id();
-       struct tss_struct *t = &per_cpu(init_tss, cpu);
-@@ -74,6 +75,7 @@ static void fix_processor_context(void)
-                                * 386 hardware has concept of busy TSS or some
-                                * similar stupidity.
-                                */
-+#endif
-       load_TR_desc();                         /* This does ltr */
-       load_LDT(&current->active_mm->context); /* This does lldt */
-Index: head-2008-11-25/arch/x86/vdso/vdso32-setup.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/vdso/vdso32-setup.c  2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/vdso/vdso32-setup.c       2008-11-25 12:35:53.000000000 +0100
-@@ -26,6 +26,10 @@
- #include <asm/vdso.h>
- #include <asm/proto.h>
-+#ifdef CONFIG_XEN
-+#include <xen/interface/callback.h>
-+#endif
-+
- enum {
-       VDSO_DISABLED = 0,
-       VDSO_ENABLED = 1,
-@@ -225,6 +229,7 @@ static inline void map_compat_vdso(int m
- void enable_sep_cpu(void)
- {
-+#ifndef CONFIG_XEN
-       int cpu = get_cpu();
-       struct tss_struct *tss = &per_cpu(init_tss, cpu);
-@@ -239,6 +244,35 @@ void enable_sep_cpu(void)
-       wrmsr(MSR_IA32_SYSENTER_ESP, tss->x86_tss.sp1, 0);
-       wrmsr(MSR_IA32_SYSENTER_EIP, (unsigned long) ia32_sysenter_target, 0);
-       put_cpu();      
-+#else
-+      extern asmlinkage void ia32pv_sysenter_target(void);
-+      static struct callback_register sysenter = {
-+              .type = CALLBACKTYPE_sysenter,
-+              .address = { __KERNEL_CS, (unsigned long)ia32pv_sysenter_target },
-+      };
-+
-+      if (!boot_cpu_has(X86_FEATURE_SEP))
-+              return;
-+
-+      get_cpu();
-+
-+      if (xen_feature(XENFEAT_supervisor_mode_kernel))
-+              sysenter.address.eip = (unsigned long)ia32_sysenter_target;
-+
-+      switch (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter)) {
-+      case 0:
-+              break;
-+#if CONFIG_XEN_COMPAT < 0x030200
-+      case -ENOSYS:
-+              sysenter.type = CALLBACKTYPE_sysenter_deprecated;
-+              if (HYPERVISOR_callback_op(CALLBACKOP_register, &sysenter) == 0)
-+                      break;
-+#endif
-+      default:
-+              clear_bit(X86_FEATURE_SEP, boot_cpu_data.x86_capability);
-+              break;
-+      }
-+#endif
- }
- static struct vm_area_struct gate_vma;
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86.diff
deleted file mode 100644 (file)
index 7942b0c..0000000
+++ /dev/null
@@ -1,328 +0,0 @@
-Subject: xen3 arch-x86
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-List of files that don't require modification anymore (and hence
-removed from this patch), for reference and in case upstream wants to
-take the forward porting patches:
-2.6.26/arch/x86/kernel/crash.c
-
-Index: head-2008-12-01/arch/x86/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/Makefile     2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/Makefile  2008-12-01 11:11:08.000000000 +0100
-@@ -115,6 +115,10 @@ mcore-y  := arch/x86/mach-default/
- mflags-$(CONFIG_X86_VOYAGER)  := -Iinclude/asm-x86/mach-voyager
- mcore-$(CONFIG_X86_VOYAGER)   := arch/x86/mach-voyager/
-+# Xen subarch support
-+mflags-$(CONFIG_X86_XEN)      := -Iinclude/asm-x86/mach-xen
-+mcore-$(CONFIG_X86_XEN)               := arch/x86/mach-xen/
-+
- # generic subarchitecture
- mflags-$(CONFIG_X86_GENERICARCH):= -Iinclude/asm-x86/mach-generic
- fcore-$(CONFIG_X86_GENERICARCH)       += arch/x86/mach-generic/
-@@ -183,9 +187,26 @@ drivers-$(CONFIG_KDB) += arch/x86/kdb/
- boot := arch/x86/boot
--PHONY += zImage bzImage compressed zlilo bzlilo \
-+PHONY += zImage bzImage vmlinuz compressed zlilo bzlilo \
-          zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
-+ifdef CONFIG_XEN
-+CPPFLAGS := -D__XEN_INTERFACE_VERSION__=$(CONFIG_XEN_INTERFACE_VERSION) \
-+      -Iinclude$(if $(KBUILD_SRC),2)/asm/mach-xen $(CPPFLAGS)
-+
-+ifdef CONFIG_X86_64
-+LDFLAGS_vmlinux := -e startup_64
-+endif
-+
-+# Default kernel to build
-+all: vmlinuz
-+
-+# KBUILD_IMAGE specifies the target image being built
-+KBUILD_IMAGE := $(boot)/vmlinuz
-+
-+vmlinuz: vmlinux
-+      $(Q)$(MAKE) $(build)=$(boot) $(KBUILD_IMAGE)
-+else
- # Default kernel to build
- all: bzImage
-@@ -208,6 +229,7 @@ zdisk bzdisk: vmlinux
- fdimage fdimage144 fdimage288 isoimage: vmlinux
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) $@
-+endif
- install:
-       $(Q)$(MAKE) $(build)=$(boot) BOOTIMAGE=$(KBUILD_IMAGE) install
-Index: head-2008-12-01/arch/x86/boot/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/boot/Makefile        2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/boot/Makefile     2008-12-01 11:11:08.000000000 +0100
-@@ -25,7 +25,7 @@ SVGA_MODE := -DSVGA_MODE=NORMAL_VGA
- #RAMDISK := -DRAMDISK=512
--targets               := vmlinux.bin setup.bin setup.elf zImage bzImage
-+targets               := vmlinux.bin setup.bin setup.elf zImage bzImage vmlinuz vmlinux-stripped
- subdir-               := compressed
- setup-y               += a20.o cmdline.o copy.o cpu.o cpucheck.o edd.o
-@@ -190,5 +190,13 @@ zlilo: $(BOOTIMAGE)
-       cp System.map $(INSTALL_PATH)/
-       if [ -x /sbin/lilo ]; then /sbin/lilo; else /etc/lilo/install; fi
-+$(obj)/vmlinuz: $(obj)/vmlinux-stripped FORCE
-+      $(call if_changed,gzip)
-+      @echo 'Kernel: $@ is ready' ' (#'`cat .version`')'
-+
-+$(obj)/vmlinux-stripped: OBJCOPYFLAGS := -g --strip-unneeded
-+$(obj)/vmlinux-stripped: vmlinux FORCE
-+      $(call if_changed,objcopy)
-+
- install:
-       sh $(srctree)/$(src)/install.sh $(KERNELRELEASE) $(BOOTIMAGE) System.map "$(INSTALL_PATH)"
-Index: head-2008-12-01/arch/x86/kernel/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/Makefile      2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/Makefile   2008-12-01 11:14:33.000000000 +0100
-@@ -99,10 +99,13 @@ scx200-y                   += scx200_32.o
- obj-$(CONFIG_OLPC)            += olpc.o
-+obj-$(CONFIG_X86_XEN)         += fixup.o
-+
- ###
- # 64 bit specific files
- ifeq ($(CONFIG_X86_64),y)
-         obj-y                         += genapic_64.o genapic_flat_64.o genx2apic_uv_x.o tlb_uv.o
-+      obj-$(CONFIG_X86_XEN_GENAPIC)   += genapic_xen_64.o
-         obj-y                         += uv_sysfs.o
-         obj-y                         += genx2apic_cluster.o
-         obj-y                         += genx2apic_phys.o
-@@ -116,4 +119,10 @@ ifeq ($(CONFIG_X86_64),y)
-         obj-$(CONFIG_SWIOTLB)         += pci-swiotlb_64.o
-         obj-$(CONFIG_PCI_MMCONFIG)    += mmconf-fam10h_64.o
-+
-+      time_64-$(CONFIG_XEN)           += time_32.o
-+      pci-dma_64-$(CONFIG_XEN)        += pci-dma_32.o
- endif
-+
-+disabled-obj-$(CONFIG_XEN) := i8259_$(BITS).o reboot.o smpboot_$(BITS).o
-+%/head_$(BITS).o %/head_$(BITS).s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
-Index: head-2008-12-01/arch/x86/kernel/acpi/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/acpi/Makefile 2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/acpi/Makefile      2008-12-01 11:11:08.000000000 +0100
-@@ -5,6 +5,9 @@ obj-$(CONFIG_ACPI_SLEEP)       += sleep.o wake
- ifneq ($(CONFIG_ACPI_PROCESSOR),)
- obj-y                         += cstate.o processor.o
-+ifneq ($(CONFIG_PROCESSOR_EXTERNAL_CONTROL),)
-+obj-$(CONFIG_XEN)             += processor_extcntl_xen.o
-+endif
- endif
- $(obj)/wakeup_rm.o:    $(obj)/realmode/wakeup.bin
-@@ -12,3 +15,4 @@ $(obj)/wakeup_rm.o:    $(obj)/realmode/w
- $(obj)/realmode/wakeup.bin: FORCE
-       $(Q)$(MAKE) $(build)=$(obj)/realmode
-+disabled-obj-$(CONFIG_XEN)    := cstate.o wakeup_$(BITS).o
-Index: head-2008-12-01/arch/x86/kernel/acpi/boot.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/acpi/boot.c   2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/acpi/boot.c        2008-12-01 11:11:08.000000000 +0100
-@@ -130,8 +130,10 @@ char *__init __acpi_map_table(unsigned l
-       if (!phys || !size)
-               return NULL;
-+#ifndef CONFIG_XEN
-       if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT))
-               return __va(phys);
-+#endif
-       offset = phys & (PAGE_SIZE - 1);
-       mapped_size = PAGE_SIZE - offset;
-Index: head-2008-12-01/arch/x86/kernel/acpi/processor.c
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/acpi/processor.c      2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/acpi/processor.c   2008-12-01 11:11:08.000000000 +0100
-@@ -75,7 +75,18 @@ static void init_intel_pdc(struct acpi_p
- /* Initialize _PDC data based on the CPU vendor */
- void arch_acpi_processor_init_pdc(struct acpi_processor *pr)
- {
-+#ifdef CONFIG_XEN
-+      /*
-+       * As a work-around, just use cpu0's cpuinfo for all processors.
-+       * Further work is required to expose xen hypervisor interface of
-+       * getting physical cpuinfo to dom0 kernel and then
-+       * arch_acpi_processor_init_pdc can set _PDC parameters according
-+       * to Xen's phys information.
-+       */
-+      struct cpuinfo_x86 *c = &boot_cpu_data;
-+#else
-       struct cpuinfo_x86 *c = &cpu_data(pr->id);
-+#endif
-       pr->pdc = NULL;
-       if (c->x86_vendor == X86_VENDOR_INTEL)
-Index: head-2008-12-01/arch/x86/kernel/cpu/mtrr/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/cpu/mtrr/Makefile     2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/cpu/mtrr/Makefile  2008-12-01 11:11:08.000000000 +0100
-@@ -1,3 +1,4 @@
- obj-y         := main.o if.o generic.o state.o
- obj-$(CONFIG_X86_32) += amd.o cyrix.o centaur.o
-+obj-$(CONFIG_XEN) := main.o if.o
-Index: head-2008-12-01/arch/x86/lib/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/lib/Makefile 2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/lib/Makefile      2008-12-01 11:11:08.000000000 +0100
-@@ -25,3 +25,5 @@ else
-         lib-y += memmove_64.o memset_64.o
-         lib-y += copy_user_64.o rwlock_64.o copy_user_nocache_64.o
- endif
-+
-+lib-$(CONFIG_XEN_SCRUB_PAGES) += scrub.o
-Index: head-2008-12-01/arch/x86/mm/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/mm/Makefile  2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/mm/Makefile       2008-12-01 11:11:08.000000000 +0100
-@@ -21,4 +21,6 @@ obj-$(CONFIG_K8_NUMA)                += k8topology_64.
- endif
- obj-$(CONFIG_ACPI_NUMA)               += srat_$(BITS).o
-+obj-$(CONFIG_XEN)             += hypervisor.o
-+
- obj-$(CONFIG_MEMTEST)         += memtest.o
-Index: head-2008-12-01/arch/x86/oprofile/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/oprofile/Makefile    2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/oprofile/Makefile 2008-12-01 11:11:08.000000000 +0100
-@@ -6,7 +6,14 @@ DRIVER_OBJS = $(addprefix ../../../drive
-               oprofilefs.o oprofile_stats.o  \
-               timer_int.o )
-+ifdef CONFIG_XEN
-+XENOPROF_COMMON_OBJS = $(addprefix ../../../drivers/xen/xenoprof/, \
-+                       xenoprofile.o)
-+oprofile-y                            := $(DRIVER_OBJS) \
-+                                         $(XENOPROF_COMMON_OBJS) xenoprof.o
-+else
- oprofile-y                            := $(DRIVER_OBJS) init.o backtrace.o
- oprofile-$(CONFIG_X86_LOCAL_APIC)     += nmi_int.o op_model_athlon.o \
-                                          op_model_ppro.o op_model_p4.o
- oprofile-$(CONFIG_X86_IO_APIC)                += nmi_timer_int.o
-+endif
-Index: head-2008-12-01/arch/x86/pci/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/pci/Makefile 2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/arch/x86/pci/Makefile      2008-12-01 11:11:08.000000000 +0100
-@@ -4,6 +4,9 @@ obj-$(CONFIG_PCI_BIOS)         += pcbios.o
- obj-$(CONFIG_PCI_MMCONFIG)    += mmconfig_$(BITS).o direct.o mmconfig-shared.o
- obj-$(CONFIG_PCI_DIRECT)      += direct.o
- obj-$(CONFIG_PCI_OLPC)                += olpc.o
-+# pcifront should be after mmconfig.o and direct.o as it should only
-+# take over if direct access to the PCI bus is unavailable
-+obj-$(CONFIG_XEN_PCIDEV_FRONTEND) += pcifront.o
- obj-y                         += fixup.o
- obj-$(CONFIG_ACPI)            += acpi.o
-Index: head-2008-12-01/include/asm-x86/acpi.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/acpi.h        2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/acpi.h     2008-12-01 11:11:08.000000000 +0100
-@@ -30,6 +30,10 @@
- #include <asm/mmu.h>
- #include <asm/mpspec.h>
-+#ifdef CONFIG_XEN
-+#include <xen/interface/platform.h>
-+#endif
-+
- #define COMPILER_DEPENDENT_INT64   long long
- #define COMPILER_DEPENDENT_UINT64  unsigned long long
-@@ -124,6 +128,27 @@ extern unsigned long acpi_wakeup_address
- /* early initialization routine */
- extern void acpi_reserve_bootmem(void);
-+#ifdef CONFIG_XEN
-+static inline int acpi_notify_hypervisor_state(u8 sleep_state,
-+                                             u32 pm1a_cnt_val,
-+                                             u32 pm1b_cnt_val)
-+{
-+      struct xen_platform_op op = {
-+              .cmd = XENPF_enter_acpi_sleep,
-+              .interface_version = XENPF_INTERFACE_VERSION,
-+              .u = {
-+                      .enter_acpi_sleep = {
-+                              .pm1a_cnt_val = pm1a_cnt_val,
-+                              .pm1b_cnt_val = pm1b_cnt_val,
-+                              .sleep_state = sleep_state,
-+                      },
-+              },
-+      };
-+
-+      return HYPERVISOR_platform_op(&op);
-+}
-+#endif /* CONFIG_XEN */
-+
- /*
-  * Check if the CPU can handle C2 and deeper
-  */
-@@ -156,7 +181,9 @@ static inline void disable_acpi(void) { 
- #endif /* !CONFIG_ACPI */
-+#ifndef CONFIG_XEN
- #define ARCH_HAS_POWER_INIT   1
-+#endif
- struct bootnode;
-Index: head-2008-12-01/include/asm-x86/apic.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/apic.h        2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/apic.h     2008-12-01 11:11:08.000000000 +0100
-@@ -12,7 +12,9 @@
- #include <asm/cpufeature.h>
- #include <asm/msr.h>
-+#ifndef CONFIG_XEN
- #define ARCH_APICTIMER_STOPS_ON_C3    1
-+#endif
- /*
-  * Debugging macros
-Index: head-2008-12-01/include/asm-x86/kexec.h
-===================================================================
---- head-2008-12-01.orig/include/asm-x86/kexec.h       2008-12-01 10:53:14.000000000 +0100
-+++ head-2008-12-01/include/asm-x86/kexec.h    2008-12-01 11:11:08.000000000 +0100
-@@ -170,6 +170,19 @@ relocate_kernel(unsigned long indirectio
-               unsigned long start_address) ATTRIB_NORET;
- #endif
-+/* Under Xen we need to work with machine addresses. These macros give the
-+ * machine address of a certain page to the generic kexec code instead of
-+ * the pseudo physical address which would be given by the default macros.
-+ */
-+
-+#ifdef CONFIG_XEN
-+#define KEXEC_ARCH_HAS_PAGE_MACROS
-+#define kexec_page_to_pfn(page)  pfn_to_mfn(page_to_pfn(page))
-+#define kexec_pfn_to_page(pfn)   pfn_to_page(mfn_to_pfn(pfn))
-+#define kexec_virt_to_phys(addr) virt_to_machine(addr)
-+#define kexec_phys_to_virt(addr) phys_to_virt(machine_to_phys(addr))
-+#endif
-+
- #endif /* __ASSEMBLY__ */
- #endif /* _KEXEC_H */
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86_64.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-arch-x86_64.diff
deleted file mode 100644 (file)
index ec03598..0000000
+++ /dev/null
@@ -1,248 +0,0 @@
-Subject: xen3 arch-x86_64
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-Index: head-2008-11-25/arch/x86/kernel/asm-offsets_64.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/asm-offsets_64.c      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/asm-offsets_64.c   2008-11-25 12:35:54.000000000 +0100
-@@ -122,8 +122,10 @@ int main(void)
-       ENTRY(cr8);
-       BLANK();
- #undef ENTRY
-+#ifndef CONFIG_X86_NO_TSS
-       DEFINE(TSS_ist, offsetof(struct tss_struct, x86_tss.ist));
-       BLANK();
-+#endif
-       DEFINE(crypto_tfm_ctx_offset, offsetof(struct crypto_tfm, __crt_ctx));
-       BLANK();
-       DEFINE(__NR_syscall_max, sizeof(syscalls) - 1);
-Index: head-2008-11-25/arch/x86/kernel/machine_kexec_64.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/machine_kexec_64.c    2008-08-18 10:13:08.000000000 +0200
-+++ head-2008-11-25/arch/x86/kernel/machine_kexec_64.c 2008-11-25 12:35:54.000000000 +0100
-@@ -27,6 +27,119 @@ static u64 kexec_pud1[512] PAGE_ALIGNED;
- static u64 kexec_pmd1[512] PAGE_ALIGNED;
- static u64 kexec_pte1[512] PAGE_ALIGNED;
-+#ifdef CONFIG_XEN
-+
-+/* In the case of Xen, override hypervisor functions to be able to create
-+ * a regular identity mapping page table...
-+ */
-+
-+#include <xen/interface/kexec.h>
-+#include <xen/interface/memory.h>
-+
-+#define x__pmd(x) ((pmd_t) { (x) } )
-+#define x__pud(x) ((pud_t) { (x) } )
-+#define x__pgd(x) ((pgd_t) { (x) } )
-+
-+#define x_pmd_val(x)   ((x).pmd)
-+#define x_pud_val(x)   ((x).pud)
-+#define x_pgd_val(x)   ((x).pgd)
-+
-+static inline void x_set_pmd(pmd_t *dst, pmd_t val)
-+{
-+      x_pmd_val(*dst) = x_pmd_val(val);
-+}
-+
-+static inline void x_set_pud(pud_t *dst, pud_t val)
-+{
-+      x_pud_val(*dst) = phys_to_machine(x_pud_val(val));
-+}
-+
-+static inline void x_pud_clear (pud_t *pud)
-+{
-+      x_pud_val(*pud) = 0;
-+}
-+
-+static inline void x_set_pgd(pgd_t *dst, pgd_t val)
-+{
-+      x_pgd_val(*dst) = phys_to_machine(x_pgd_val(val));
-+}
-+
-+static inline void x_pgd_clear (pgd_t * pgd)
-+{
-+      x_pgd_val(*pgd) = 0;
-+}
-+
-+#define X__PAGE_KERNEL_LARGE_EXEC \
-+         _PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_PSE
-+#define X_KERNPG_TABLE _PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY
-+
-+#define __ma(x) (pfn_to_mfn(__pa((x)) >> PAGE_SHIFT) << PAGE_SHIFT)
-+
-+#if PAGES_NR > KEXEC_XEN_NO_PAGES
-+#error PAGES_NR is greater than KEXEC_XEN_NO_PAGES - Xen support will break
-+#endif
-+
-+#if PA_CONTROL_PAGE != 0
-+#error PA_CONTROL_PAGE is non zero - Xen support will break
-+#endif
-+
-+void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-+{
-+      void *control_page;
-+      void *table_page;
-+
-+      memset(xki->page_list, 0, sizeof(xki->page_list));
-+
-+      control_page = page_address(image->control_code_page) + PAGE_SIZE;
-+      memcpy(control_page, relocate_kernel, PAGE_SIZE);
-+
-+      table_page = page_address(image->control_code_page);
-+
-+      xki->page_list[PA_CONTROL_PAGE] = __ma(control_page);
-+      xki->page_list[PA_TABLE_PAGE] = __ma(table_page);
-+
-+      xki->page_list[PA_PGD] = __ma(kexec_pgd);
-+      xki->page_list[PA_PUD_0] = __ma(kexec_pud0);
-+      xki->page_list[PA_PUD_1] = __ma(kexec_pud1);
-+      xki->page_list[PA_PMD_0] = __ma(kexec_pmd0);
-+      xki->page_list[PA_PMD_1] = __ma(kexec_pmd1);
-+      xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
-+      xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
-+}
-+
-+int __init machine_kexec_setup_resources(struct resource *hypervisor,
-+                                       struct resource *phys_cpus,
-+                                       int nr_phys_cpus)
-+{
-+      int k;
-+
-+      /* The per-cpu crash note resources belong to the hypervisor resource */
-+      for (k = 0; k < nr_phys_cpus; k++)
-+              request_resource(hypervisor, phys_cpus + k);
-+
-+      return 0;
-+}
-+
-+void machine_kexec_register_resources(struct resource *res) { ; }
-+
-+#else /* CONFIG_XEN */
-+
-+#define x__pmd(x) __pmd(x)
-+#define x__pud(x) __pud(x)
-+#define x__pgd(x) __pgd(x)
-+
-+#define x_set_pmd(x, y) set_pmd(x, y)
-+#define x_set_pud(x, y) set_pud(x, y)
-+#define x_set_pgd(x, y) set_pgd(x, y)
-+
-+#define x_pud_clear(x) pud_clear(x)
-+#define x_pgd_clear(x) pgd_clear(x)
-+
-+#define X__PAGE_KERNEL_LARGE_EXEC __PAGE_KERNEL_LARGE_EXEC
-+#define X_KERNPG_TABLE _KERNPG_TABLE
-+
-+#endif /* CONFIG_XEN */
-+
- static void init_level2_page(pmd_t *level2p, unsigned long addr)
- {
-       unsigned long end_addr;
-@@ -34,7 +147,7 @@ static void init_level2_page(pmd_t *leve
-       addr &= PAGE_MASK;
-       end_addr = addr + PUD_SIZE;
-       while (addr < end_addr) {
--              set_pmd(level2p++, __pmd(addr | __PAGE_KERNEL_LARGE_EXEC));
-+              x_set_pmd(level2p++, x__pmd(addr | X__PAGE_KERNEL_LARGE_EXEC));
-               addr += PMD_SIZE;
-       }
- }
-@@ -59,12 +172,12 @@ static int init_level3_page(struct kimag
-               }
-               level2p = (pmd_t *)page_address(page);
-               init_level2_page(level2p, addr);
--              set_pud(level3p++, __pud(__pa(level2p) | _KERNPG_TABLE));
-+              x_set_pud(level3p++, x__pud(__pa(level2p) | X_KERNPG_TABLE));
-               addr += PUD_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
--              pud_clear(level3p++);
-+              x_pud_clear(level3p++);
-               addr += PUD_SIZE;
-       }
- out:
-@@ -95,12 +208,12 @@ static int init_level4_page(struct kimag
-               if (result) {
-                       goto out;
-               }
--              set_pgd(level4p++, __pgd(__pa(level3p) | _KERNPG_TABLE));
-+              x_set_pgd(level4p++, x__pgd(__pa(level3p) | X_KERNPG_TABLE));
-               addr += PGDIR_SIZE;
-       }
-       /* clear the unused entries */
-       while (addr < end_addr) {
--              pgd_clear(level4p++);
-+              x_pgd_clear(level4p++);
-               addr += PGDIR_SIZE;
-       }
- out:
-@@ -111,8 +224,14 @@ out:
- static int init_pgtable(struct kimage *image, unsigned long start_pgtable)
- {
-       pgd_t *level4p;
-+      unsigned long x_max_pfn = max_pfn;
-+
-+#ifdef CONFIG_XEN
-+      x_max_pfn = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-+#endif
-+
-       level4p = (pgd_t *)__va(start_pgtable);
--      return init_level4_page(image, level4p, 0, max_pfn << PAGE_SHIFT);
-+      return init_level4_page(image, level4p, 0, x_max_pfn << PAGE_SHIFT);
- }
- int machine_kexec_prepare(struct kimage *image)
-@@ -136,6 +255,7 @@ void machine_kexec_cleanup(struct kimage
-       return;
- }
-+#ifndef CONFIG_XEN
- /*
-  * Do not allocate memory (or fail in any way) in machine_kexec().
-  * We are past the point of no return, committed to rebooting now.
-@@ -176,6 +296,7 @@ void machine_kexec(struct kimage *image)
-       relocate_kernel((unsigned long)image->head, (unsigned long)page_list,
-                       image->start);
- }
-+#endif
- void arch_crash_save_vmcoreinfo(void)
- {
-Index: head-2008-11-25/arch/x86/power/cpu_64.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/power/cpu_64.c       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/power/cpu_64.c    2008-11-25 12:35:54.000000000 +0100
-@@ -135,6 +135,7 @@ void restore_processor_state(void)
- static void fix_processor_context(void)
- {
-+#ifndef CONFIG_X86_NO_TSS
-       int cpu = smp_processor_id();
-       struct tss_struct *t = &per_cpu(init_tss, cpu);
-@@ -146,6 +147,7 @@ static void fix_processor_context(void)
-       set_tss_desc(cpu, t);
-       get_cpu_gdt_table(cpu)[GDT_ENTRY_TSS].type = 9;
-+#endif
-       syscall_init();                         /* This sets MSR_*STAR and related */
-       load_TR_desc();                         /* This does ltr */
-Index: head-2008-11-25/arch/x86/vdso/Makefile
-===================================================================
---- head-2008-11-25.orig/arch/x86/vdso/Makefile        2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/arch/x86/vdso/Makefile     2008-11-25 12:35:54.000000000 +0100
-@@ -65,6 +65,8 @@ obj-$(VDSO32-y)                      += vdso32-syms.lds
- vdso32.so-$(VDSO32-y)         += int80
- vdso32.so-$(CONFIG_COMPAT)    += syscall
- vdso32.so-$(VDSO32-y)         += sysenter
-+xen-vdso32-$(subst 1,$(CONFIG_COMPAT),$(shell expr $(CONFIG_XEN_COMPAT)0 '<' 0x0302000)) += int80
-+vdso32.so-$(CONFIG_XEN)               += $(xen-vdso32-y)
- vdso32-images                 = $(vdso32.so-y:%=vdso32-%.so)
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-common.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-common.diff
deleted file mode 100644 (file)
index d94e4e9..0000000
+++ /dev/null
@@ -1,4036 +0,0 @@
-Subject: xen3 common
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-List of files that don't require modification anymore (and hence
-removed from this patch), for reference and in case upstream wants to
-take the forward porting patches:
-2.6.22/include/linux/sched.h
-2.6.22/kernel/softlockup.c
-2.6.22/kernel/timer.c
-2.6.25/mm/highmem.c
-
---- sle11-2009-07-31.orig/drivers/Makefile     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/Makefile  2009-02-16 15:58:14.000000000 +0100
-@@ -37,6 +37,7 @@ obj-y                                += base/ block/ misc/ mfd/ net/
- obj-$(CONFIG_NUBUS)           += nubus/
- obj-$(CONFIG_ATM)             += atm/
- obj-y                         += macintosh/
-+obj-$(CONFIG_XEN)             += xen/
- obj-$(CONFIG_SCSI)            += scsi/
- obj-$(CONFIG_ATA)             += ata/
- obj-$(CONFIG_IDE)             += ide/
---- sle11-2009-07-31.orig/drivers/acpi/Makefile        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/Makefile     2009-02-16 15:58:14.000000000 +0100
-@@ -34,6 +34,9 @@ processor-objs       += processor_core.o proce
- ifdef CONFIG_CPU_FREQ
- processor-objs        += processor_perflib.o
- endif
-+ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+processor-objs        += processor_perflib.o processor_extcntl.o
-+endif
- obj-y                         += sleep/
- obj-y                         += bus.o glue.o
---- sle11-2009-07-31.orig/drivers/acpi/hardware/hwsleep.c      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/hardware/hwsleep.c   2009-02-16 15:58:14.000000000 +0100
-@@ -241,7 +241,11 @@ acpi_status asmlinkage acpi_enter_sleep_
-       u32 PM1Bcontrol;
-       struct acpi_bit_register_info *sleep_type_reg_info;
-       struct acpi_bit_register_info *sleep_enable_reg_info;
-+#if !(defined(CONFIG_XEN) && defined(CONFIG_X86))
-       u32 in_value;
-+#else
-+      int err;
-+#endif
-       struct acpi_object_list arg_list;
-       union acpi_object arg;
-       acpi_status status;
-@@ -351,6 +355,7 @@ acpi_status asmlinkage acpi_enter_sleep_
-       ACPI_FLUSH_CPU_CACHE();
-+#if !(defined(CONFIG_XEN) && defined(CONFIG_X86))
-       status = acpi_hw_register_write(ACPI_REGISTER_PM1A_CONTROL,
-                                       PM1Acontrol);
-       if (ACPI_FAILURE(status)) {
-@@ -397,6 +402,16 @@ acpi_status asmlinkage acpi_enter_sleep_
-               /* Spin until we wake */
-       } while (!in_value);
-+#else
-+      /* PV ACPI just need check hypercall return value */
-+      err = acpi_notify_hypervisor_state(sleep_state,
-+                      PM1Acontrol, PM1Bcontrol);
-+      if (err) {
-+              ACPI_DEBUG_PRINT((ACPI_DB_ERROR,
-+                                "Hypervisor failure [%d]\n", err));
-+              return_ACPI_STATUS(AE_ERROR);
-+      }
-+#endif
-       return_ACPI_STATUS(AE_OK);
- }
---- sle11-2009-07-31.orig/drivers/acpi/processor_core.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/processor_core.c     2009-02-16 15:58:14.000000000 +0100
-@@ -620,7 +620,8 @@ static int acpi_processor_get_info(struc
-        */
-       if (pr->id == -1) {
-               if (ACPI_FAILURE
--                  (acpi_processor_hotadd_init(pr->handle, &pr->id))) {
-+                  (acpi_processor_hotadd_init(pr->handle, &pr->id)) &&
-+                  !processor_cntl_external()) {
-                       return -ENODEV;
-               }
-       }
-@@ -662,7 +663,11 @@ static int acpi_processor_get_info(struc
-       return 0;
- }
-+#ifndef CONFIG_XEN
- static DEFINE_PER_CPU(void *, processor_device_array);
-+#else
-+static void *processor_device_array[NR_ACPI_CPUS];
-+#endif
- static int __cpuinit acpi_processor_start(struct acpi_device *device)
- {
-@@ -671,30 +676,46 @@ static int __cpuinit acpi_processor_star
-       struct acpi_processor *pr;
-       struct sys_device *sysdev;
-+      processor_extcntl_init();
-+
-       pr = acpi_driver_data(device);
-       result = acpi_processor_get_info(device);
--      if (result) {
-+      if (result ||
-+          ((pr->id == -1) && !processor_cntl_external())) {
-               /* Processor is physically not present */
-               return 0;
-       }
--      BUG_ON((pr->id >= nr_cpu_ids) || (pr->id < 0));
-+      BUG_ON(!processor_cntl_external() &&
-+             ((pr->id >= nr_cpu_ids) || (pr->id < 0)));
-       /*
-        * Buggy BIOS check
-        * ACPI id of processors can be reported wrongly by the BIOS.
-        * Don't trust it blindly
-        */
-+#ifndef CONFIG_XEN
-       if (per_cpu(processor_device_array, pr->id) != NULL &&
-           per_cpu(processor_device_array, pr->id) != device) {
-+#else
-+      BUG_ON(pr->acpi_id >= NR_ACPI_CPUS);
-+      if (processor_device_array[pr->acpi_id] != NULL &&
-+          processor_device_array[pr->acpi_id] != device) {
-+#endif
-               printk(KERN_WARNING "BIOS reported wrong ACPI id "
-                       "for the processor\n");
-               return -ENODEV;
-       }
-+#ifndef CONFIG_XEN
-       per_cpu(processor_device_array, pr->id) = device;
-       per_cpu(processors, pr->id) = pr;
-+#else
-+      processor_device_array[pr->acpi_id] = device;
-+      if (pr->id != -1)
-+              per_cpu(processors, pr->id) = pr;
-+#endif
-       result = acpi_processor_add_fs(device);
-       if (result)
-@@ -710,15 +731,28 @@ static int __cpuinit acpi_processor_star
-       /* _PDC call should be done before doing anything else (if reqd.). */
-       arch_acpi_processor_init_pdc(pr);
-       acpi_processor_set_pdc(pr);
--#ifdef CONFIG_CPU_FREQ
-+#if defined(CONFIG_CPU_FREQ) || defined(CONFIG_PROCESSOR_EXTERNAL_CONTROL)
-       acpi_processor_ppc_has_changed(pr);
- #endif
--      acpi_processor_get_throttling_info(pr);
--      acpi_processor_get_limit_info(pr);
-+
-+      /*
-+       * pr->id may equal to -1 while processor_cntl_external enabled.
-+       * throttle and thermal module don't support this case.
-+       * Tx only works when dom0 vcpu == pcpu num by far, as we give
-+       * control to dom0.
-+       */
-+      if (pr->id != -1) {
-+              acpi_processor_get_throttling_info(pr);
-+              acpi_processor_get_limit_info(pr);
-+      }
-       acpi_processor_power_init(pr, device);
-+      result = processor_extcntl_prepare(pr);
-+      if (result)
-+              goto end;
-+
-       pr->cdev = thermal_cooling_device_register("Processor", device,
-                                               &processor_cooling_ops);
-       if (IS_ERR(pr->cdev)) {
-@@ -846,7 +880,7 @@ static int acpi_processor_remove(struct 
-       pr = acpi_driver_data(device);
--      if (pr->id >= nr_cpu_ids) {
-+      if (!processor_cntl_external() && pr->id >= nr_cpu_ids) {
-               kfree(pr);
-               return 0;
-       }
-@@ -872,8 +906,14 @@ static int acpi_processor_remove(struct 
-               pr->cdev = NULL;
-       }
-+#ifndef CONFIG_XEN
-       per_cpu(processors, pr->id) = NULL;
-       per_cpu(processor_device_array, pr->id) = NULL;
-+#else
-+      if (pr->id != -1)
-+              per_cpu(processors, pr->id) = NULL;
-+      processor_device_array[pr->acpi_id] = NULL;
-+#endif
-       kfree(pr);
-       return 0;
-@@ -933,6 +973,10 @@ int acpi_processor_device_add(acpi_handl
-       if (!pr)
-               return -ENODEV;
-+      if (processor_cntl_external())
-+              processor_notify_external(pr,
-+                      PROCESSOR_HOTPLUG, HOTPLUG_TYPE_ADD);
-+
-       if ((pr->id >= 0) && (pr->id < nr_cpu_ids)) {
-               kobject_uevent(&(*device)->dev.kobj, KOBJ_ONLINE);
-       }
-@@ -972,6 +1016,10 @@ static void __ref acpi_processor_hotplug
-                       break;
-               }
-+              if (processor_cntl_external())
-+                      processor_notify_external(pr,
-+                                      PROCESSOR_HOTPLUG, HOTPLUG_TYPE_ADD);
-+
-               if (pr->id >= 0 && (pr->id < nr_cpu_ids)) {
-                       kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
-                       break;
-@@ -1003,6 +1051,11 @@ static void __ref acpi_processor_hotplug
-               if ((pr->id < nr_cpu_ids) && (cpu_present(pr->id)))
-                       kobject_uevent(&device->dev.kobj, KOBJ_OFFLINE);
-+
-+              if (processor_cntl_external())
-+                      processor_notify_external(pr, PROCESSOR_HOTPLUG,
-+                                                      HOTPLUG_TYPE_REMOVE);
-+
-               break;
-       default:
-               ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-@@ -1067,6 +1120,11 @@ static acpi_status acpi_processor_hotadd
- static int acpi_processor_handle_eject(struct acpi_processor *pr)
- {
-+#ifdef CONFIG_XEN
-+      if (pr->id == -1)
-+              return (0);
-+#endif
-+
-       if (cpu_online(pr->id))
-               cpu_down(pr->id);
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-07-31/drivers/acpi/processor_extcntl.c  2009-02-16 15:58:14.000000000 +0100
-@@ -0,0 +1,241 @@
-+/*
-+ * processor_extcntl.c - channel to external control logic
-+ *
-+ *  Copyright (C) 2008, Intel corporation
-+ *
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; either version 2 of the License, or (at
-+ *  your option) any later version.
-+ *
-+ *  This program is distributed in the hope that it will be useful, but
-+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License along
-+ *  with this program; if not, write to the Free Software Foundation, Inc.,
-+ *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/acpi.h>
-+#include <linux/pm.h>
-+#include <linux/cpu.h>
-+
-+#include <acpi/processor.h>
-+
-+#define ACPI_PROCESSOR_COMPONENT        0x01000000
-+#define ACPI_PROCESSOR_CLASS            "processor"
-+#define ACPI_PROCESSOR_DRIVER_NAME      "ACPI Processor Driver"
-+#define _COMPONENT              ACPI_PROCESSOR_COMPONENT
-+ACPI_MODULE_NAME("acpi_processor")
-+
-+static int processor_extcntl_parse_csd(struct acpi_processor *pr);
-+static int processor_extcntl_get_performance(struct acpi_processor *pr);
-+/*
-+ * External processor control logic may register with its own set of
-+ * ops to get ACPI related notification. One example is like VMM.
-+ */
-+const struct processor_extcntl_ops *processor_extcntl_ops;
-+EXPORT_SYMBOL(processor_extcntl_ops);
-+
-+static int processor_notify_smm(void)
-+{
-+      acpi_status status;
-+      static int is_done = 0;
-+
-+      /* only need successfully notify BIOS once */
-+      /* avoid double notification which may lead to unexpected result */
-+      if (is_done)
-+              return 0;
-+
-+      /* Can't write pstate_cnt to smi_cmd if either value is zero */
-+      if ((!acpi_fadt.smi_cmd) || (!acpi_fadt.pstate_cnt)) {
-+              ACPI_DEBUG_PRINT((ACPI_DB_INFO,"No SMI port or pstate_cnt\n"));
-+              return 0;
-+      }
-+
-+      ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-+              "Writing pstate_cnt [0x%x] to smi_cmd [0x%x]\n",
-+              acpi_fadt.pstate_cnt, acpi_fadt.smi_cmd));
-+
-+      /* FADT v1 doesn't support pstate_cnt, many BIOS vendors use
-+       * it anyway, so we need to support it... */
-+      if (acpi_fadt_is_v1) {
-+              ACPI_DEBUG_PRINT((ACPI_DB_INFO,
-+                      "Using v1.0 FADT reserved value for pstate_cnt\n"));
-+      }
-+
-+      status = acpi_os_write_port(acpi_fadt.smi_cmd,
-+                                  (u32) acpi_fadt.pstate_cnt, 8);
-+      if (ACPI_FAILURE(status)) 
-+              return status;
-+
-+      is_done = 1;
-+
-+      return 0;
-+}
-+
-+int processor_notify_external(struct acpi_processor *pr, int event, int type)
-+{
-+      int ret = -EINVAL;
-+
-+      if (!processor_cntl_external())
-+              return -EINVAL;
-+
-+      switch (event) {
-+      case PROCESSOR_PM_INIT:
-+      case PROCESSOR_PM_CHANGE:
-+              if ((type >= PM_TYPE_MAX) ||
-+                      !processor_extcntl_ops->pm_ops[type])
-+                      break;
-+
-+              ret = processor_extcntl_ops->pm_ops[type](pr, event);
-+              break;
-+      case PROCESSOR_HOTPLUG:
-+              if (processor_extcntl_ops->hotplug)
-+                      ret = processor_extcntl_ops->hotplug(pr, type);
-+              break;
-+      default:
-+              printk(KERN_ERR "Unsupport processor events %d.\n", event);
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+/*
-+ * External control logic can decide to grab full or part of physical
-+ * processor control bits. Take a VMM for example, physical processors
-+ * are owned by VMM and thus existence information like hotplug is
-+ * always required to be notified to VMM. Similar is processor idle
-+ * state which is also necessarily controlled by VMM. But for other
-+ * control bits like performance/throttle states, VMM may choose to
-+ * control or not upon its own policy.
-+ */
-+void processor_extcntl_init(void)
-+{
-+      if (!processor_extcntl_ops)
-+              arch_acpi_processor_init_extcntl(&processor_extcntl_ops);
-+}
-+
-+/*
-+ * This is called from ACPI processor init, and targeted to hold
-+ * some tricky housekeeping jobs to satisfy external control model.
-+ * For example, we may put dependency parse stub here for idle
-+ * and performance state. Those information may be not available
-+ * if splitting from dom0 control logic like cpufreq driver.
-+ */
-+int processor_extcntl_prepare(struct acpi_processor *pr)
-+{
-+      /* parse cstate dependency information */
-+      if (processor_pm_external())
-+              processor_extcntl_parse_csd(pr);
-+
-+      /* Initialize performance states */
-+      if (processor_pmperf_external())
-+              processor_extcntl_get_performance(pr);
-+
-+      return 0;
-+}
-+
-+/*
-+ * Currently no _CSD is implemented which is why existing ACPI code
-+ * doesn't parse _CSD at all. But to keep interface complete with
-+ * external control logic, we put a placeholder here for future
-+ * compatibility.
-+ */
-+static int processor_extcntl_parse_csd(struct acpi_processor *pr)
-+{
-+      int i;
-+
-+      for (i = 0; i < pr->power.count; i++) {
-+              if (!pr->power.states[i].valid)
-+                      continue;
-+
-+              /* No dependency by default */
-+              pr->power.states[i].domain_info = NULL;
-+              pr->power.states[i].csd_count = 0;
-+      }
-+
-+      return 0;
-+}
-+
-+/*
-+ * Existing ACPI module does parse performance states at some point,
-+ * when acpi-cpufreq driver is loaded which however is something
-+ * we'd like to disable to avoid confliction with external control
-+ * logic. So we have to collect raw performance information here 
-+ * when ACPI processor object is found and started.
-+ */
-+static int processor_extcntl_get_performance(struct acpi_processor *pr)
-+{
-+      int ret;
-+      struct acpi_processor_performance *perf;
-+      struct acpi_psd_package *pdomain;
-+
-+      if (pr->performance)
-+              return -EBUSY;
-+
-+      perf = kzalloc(sizeof(struct acpi_processor_performance), GFP_KERNEL);
-+      if (!perf)
-+              return -ENOMEM;
-+
-+      pr->performance = perf;
-+      /* Get basic performance state information */
-+      ret = acpi_processor_get_performance_info(pr);
-+      if (ret < 0)
-+              goto err_out;
-+
-+      /*
-+       * Well, here we need retrieve performance dependency information
-+       * from _PSD object. The reason why existing interface is not used
-+       * is due to the reason that existing interface sticks to Linux cpu
-+       * id to construct some bitmap, however we want to split ACPI 
-+       * processor objects from Linux cpu id logic. For example, even
-+       * when Linux is configured as UP, we still want to parse all ACPI
-+       * processor objects to external logic. In this case, it's preferred
-+       * to use ACPI ID instead.
-+       */
-+      pdomain = &pr->performance->domain_info;
-+      pdomain->num_processors = 0;
-+      ret = acpi_processor_get_psd(pr);
-+      if (ret < 0) {
-+              /*
-+               * _PSD is optional - assume no coordination if absent (or
-+               * broken), matching native kernels' behavior.
-+               */
-+              pdomain->num_entries = ACPI_PSD_REV0_ENTRIES;
-+              pdomain->revision = ACPI_PSD_REV0_REVISION;
-+              pdomain->domain = pr->acpi_id;
-+              pdomain->coord_type = DOMAIN_COORD_TYPE_SW_ALL;
-+              pdomain->num_processors = 1;
-+      }
-+
-+      /* Some sanity check */
-+      if ((pdomain->revision != ACPI_PSD_REV0_REVISION) ||
-+          (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) ||
-+          ((pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL) &&
-+           (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY) &&
-+           (pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL))) {
-+              ret = -EINVAL;
-+              goto err_out;
-+      }
-+
-+      /* Last step is to notify BIOS that external logic exists */
-+      processor_notify_smm();
-+
-+      processor_notify_external(pr, PROCESSOR_PM_INIT, PM_TYPE_PERF);
-+
-+      return 0;
-+err_out:
-+      pr->performance = NULL;
-+      kfree(perf);
-+      return ret;
-+}
---- sle11-2009-07-31.orig/drivers/acpi/processor_idle.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/processor_idle.c     2009-06-29 15:17:44.000000000 +0200
-@@ -908,7 +908,8 @@ static int acpi_processor_get_power_info
-                                */
-                               cx.entry_method = ACPI_CSTATE_HALT;
-                               snprintf(cx.desc, ACPI_CX_DESC_LEN, "ACPI HLT");
--                      } else {
-+                      /* This doesn't apply to external control case */
-+                      } else if (!processor_pm_external()) {
-                               continue;
-                       }
-                       if (cx.type == ACPI_STATE_C1 &&
-@@ -947,6 +948,12 @@ static int acpi_processor_get_power_info
-               cx.power = obj->integer.value;
-+#ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+              /* cache control methods to notify external logic */
-+              if (processor_pm_external())
-+                      memcpy(&cx.reg, reg, sizeof(*reg));
-+#endif
-+
-               current_count++;
-               memcpy(&(pr->power.states[current_count]), &cx, sizeof(cx));
-@@ -1289,14 +1296,18 @@ int acpi_processor_cst_has_changed(struc
-        * been initialized.
-        */
-       if (pm_idle_save) {
--              pm_idle = pm_idle_save;
-+              if (!processor_pm_external())
-+                      pm_idle = pm_idle_save;
-               /* Relies on interrupts forcing exit from idle. */
-               synchronize_sched();
-       }
-       pr->flags.power = 0;
-       result = acpi_processor_get_power_info(pr);
--      if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
-+      if (processor_pm_external())
-+              processor_notify_external(pr,
-+                      PROCESSOR_PM_CHANGE, PM_TYPE_IDLE);
-+      else if ((pr->flags.power == 1) && (pr->flags.power_setup_done))
-               pm_idle = acpi_processor_idle;
-       return result;
-@@ -1821,7 +1832,7 @@ int __cpuinit acpi_processor_power_init(
-               printk(")\n");
- #ifndef CONFIG_CPU_IDLE
--              if (pr->id == 0) {
-+              if (!processor_pm_external() && (pr->id == 0)) {
-                       pm_idle_save = pm_idle;
-                       pm_idle = acpi_processor_idle;
-               }
-@@ -1835,6 +1846,11 @@ int __cpuinit acpi_processor_power_init(
-                                acpi_driver_data(device));
-       if (!entry)
-               return -EIO;
-+
-+      if (processor_pm_external())
-+              processor_notify_external(pr,
-+                      PROCESSOR_PM_INIT, PM_TYPE_IDLE);
-+
-       return 0;
- }
---- sle11-2009-07-31.orig/drivers/acpi/processor_perflib.c     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/processor_perflib.c  2009-02-16 15:58:14.000000000 +0100
-@@ -80,6 +80,7 @@ MODULE_PARM_DESC(ignore_ppc, "If the fre
- static int acpi_processor_ppc_status;
-+#ifdef CONFIG_CPU_FREQ
- static int acpi_processor_ppc_notifier(struct notifier_block *nb,
-                                      unsigned long event, void *data)
- {
-@@ -122,6 +123,7 @@ static int acpi_processor_ppc_notifier(s
- static struct notifier_block acpi_ppc_notifier_block = {
-       .notifier_call = acpi_processor_ppc_notifier,
- };
-+#endif        /* CONFIG_CPU_FREQ */
- static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
- {
-@@ -166,9 +168,15 @@ int acpi_processor_ppc_has_changed(struc
-       if (ret < 0)
-               return (ret);
-       else
-+#ifdef CONFIG_CPU_FREQ
-               return cpufreq_update_policy(pr->id);
-+#elif CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+              return processor_notify_external(pr,
-+                              PROCESSOR_PM_CHANGE, PM_TYPE_PERF);
-+#endif
- }
-+#ifdef CONFIG_CPU_FREQ
- void acpi_processor_ppc_init(void)
- {
-       if (!cpufreq_register_notifier
-@@ -187,6 +195,7 @@ void acpi_processor_ppc_exit(void)
-       acpi_processor_ppc_status &= ~PPC_REGISTERED;
- }
-+#endif        /* CONFIG_CPU_FREQ */
- static int acpi_processor_get_performance_control(struct acpi_processor *pr)
- {
-@@ -328,7 +337,10 @@ static int acpi_processor_get_performanc
-       return result;
- }
--static int acpi_processor_get_performance_info(struct acpi_processor *pr)
-+#ifndef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+static
-+#endif
-+int acpi_processor_get_performance_info(struct acpi_processor *pr)
- {
-       int result = 0;
-       acpi_status status = AE_OK;
-@@ -356,6 +368,7 @@ static int acpi_processor_get_performanc
-       return 0;
- }
-+#ifdef CONFIG_CPU_FREQ
- int acpi_processor_notify_smm(struct module *calling_module)
- {
-       acpi_status status;
-@@ -416,6 +429,7 @@ int acpi_processor_notify_smm(struct mod
- }
- EXPORT_SYMBOL(acpi_processor_notify_smm);
-+#endif        /* CONFIG_CPU_FREQ */
- #ifdef CONFIG_X86_ACPI_CPUFREQ_PROC_INTF
- /* /proc/acpi/processor/../performance interface (DEPRECATED) */
-@@ -507,7 +521,10 @@ static void acpi_cpufreq_remove_file(str
- }
- #endif                                /* CONFIG_X86_ACPI_CPUFREQ_PROC_INTF */
--static int acpi_processor_get_psd(struct acpi_processor       *pr)
-+#ifndef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+static
-+#endif
-+int acpi_processor_get_psd(struct acpi_processor *pr)
- {
-       int result = 0;
-       acpi_status status = AE_OK;
---- sle11-2009-07-31.orig/drivers/acpi/sleep/main.c    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/acpi/sleep/main.c 2009-02-16 15:58:14.000000000 +0100
-@@ -27,6 +27,7 @@ u8 sleep_states[ACPI_S_STATE_COUNT];
- static int acpi_sleep_prepare(u32 acpi_state)
- {
- #ifdef CONFIG_ACPI_SLEEP
-+#ifndef CONFIG_ACPI_PV_SLEEP
-       /* do we have a wakeup address for S2 and S3? */
-       if (acpi_state == ACPI_STATE_S3) {
-               if (!acpi_wakeup_address) {
-@@ -36,6 +37,7 @@ static int acpi_sleep_prepare(u32 acpi_s
-                               (acpi_physical_address)acpi_wakeup_address);
-       }
-+#endif
-       ACPI_FLUSH_CPU_CACHE();
-       acpi_enable_wakeup_device_prep(acpi_state);
- #endif
-@@ -208,7 +210,14 @@ static int acpi_suspend_enter(suspend_st
-               break;
-       case ACPI_STATE_S3:
-+#ifdef CONFIG_ACPI_PV_SLEEP
-+              /* Hyperviosr will save and restore CPU context
-+               * and then we can skip low level housekeeping here.
-+               */
-+              acpi_enter_sleep_state(acpi_state);
-+#else
-               do_suspend_lowlevel();
-+#endif
-               break;
-       }
---- sle11-2009-07-31.orig/drivers/char/agp/intel-agp.c 2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/char/agp/intel-agp.c      2009-02-16 15:58:14.000000000 +0100
-@@ -250,6 +250,13 @@ static void *i8xx_alloc_pages(void)
-       if (page == NULL)
-               return NULL;
-+#ifdef CONFIG_XEN
-+      if (xen_create_contiguous_region((unsigned long)page_address(page), 2, 32)) {
-+              __free_pages(page, 2);
-+              return NULL;
-+      }
-+#endif
-+
-       if (set_pages_uc(page, 4) < 0) {
-               set_pages_wb(page, 4);
-               __free_pages(page, 2);
-@@ -269,6 +276,9 @@ static void i8xx_destroy_pages(void *add
-       page = virt_to_page(addr);
-       set_pages_wb(page, 4);
-+#ifdef CONFIG_XEN
-+      xen_destroy_contiguous_region((unsigned long)page_address(page), 2);
-+#endif
-       put_page(page);
-       __free_pages(page, 2);
-       atomic_dec(&agp_bridge->current_memory_agp);
---- sle11-2009-07-31.orig/drivers/char/mem.c   2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/char/mem.c        2009-02-16 15:58:14.000000000 +0100
-@@ -110,6 +110,7 @@ void __attribute__((weak)) unxlate_dev_m
- {
- }
-+#ifndef ARCH_HAS_DEV_MEM
- /*
-  * This funcion reads the *physical* memory. The f_pos points directly to the 
-  * memory location. 
-@@ -254,6 +255,7 @@ static ssize_t write_mem(struct file * f
-       *ppos += written;
-       return written;
- }
-+#endif
- int __attribute__((weak)) phys_mem_access_prot_allowed(struct file *file,
-       unsigned long pfn, unsigned long size, pgprot_t *vma_prot)
-@@ -372,6 +374,9 @@ static int mmap_mem(struct file * file, 
- static int mmap_kmem(struct file * file, struct vm_area_struct * vma)
- {
-       unsigned long pfn;
-+#ifdef CONFIG_XEN
-+      unsigned long i, count;
-+#endif
-       /* Turn a kernel-virtual address into a physical page frame */
-       pfn = __pa((u64)vma->vm_pgoff << PAGE_SHIFT) >> PAGE_SHIFT;
-@@ -386,6 +391,13 @@ static int mmap_kmem(struct file * file,
-       if (!pfn_valid(pfn))
-               return -EIO;
-+#ifdef CONFIG_XEN
-+      count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-+      for (i = 0; i < count; i++)
-+              if ((pfn + i) != mfn_to_local_pfn(pfn_to_mfn(pfn + i)))
-+                      return -EIO;
-+#endif
-+
-       vma->vm_pgoff = pfn;
-       return mmap_mem(file, vma);
- }
-@@ -905,6 +917,7 @@ static int open_port(struct inode * inod
- #define open_kmem     open_mem
- #define open_oldmem   open_mem
-+#ifndef ARCH_HAS_DEV_MEM
- static const struct file_operations mem_fops = {
-       .llseek         = memory_lseek,
-       .read           = read_mem,
-@@ -913,6 +926,9 @@ static const struct file_operations mem_
-       .open           = open_mem,
-       .get_unmapped_area = get_unmapped_area_mem,
- };
-+#else
-+extern const struct file_operations mem_fops;
-+#endif
- #ifdef CONFIG_DEVKMEM
- static const struct file_operations kmem_fops = {
---- sle11-2009-07-31.orig/drivers/char/tpm/Makefile    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/char/tpm/Makefile 2009-02-16 15:58:14.000000000 +0100
-@@ -9,3 +9,5 @@ obj-$(CONFIG_TCG_TIS) += tpm_tis.o
- obj-$(CONFIG_TCG_NSC) += tpm_nsc.o
- obj-$(CONFIG_TCG_ATMEL) += tpm_atmel.o
- obj-$(CONFIG_TCG_INFINEON) += tpm_infineon.o
-+obj-$(CONFIG_TCG_XEN) += tpm_xenu.o
-+tpm_xenu-y = tpm_xen.o tpm_vtpm.o
---- sle11-2009-07-31.orig/drivers/char/tpm/tpm.h       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/char/tpm/tpm.h    2009-02-16 15:58:14.000000000 +0100
-@@ -107,6 +107,9 @@ struct tpm_chip {
-       struct dentry **bios_dir;
-       struct list_head list;
-+#ifdef CONFIG_XEN
-+      void *priv;
-+#endif
-       void (*release) (struct device *);
- };
-@@ -124,6 +127,18 @@ static inline void tpm_write_index(int b
-       outb(value & 0xFF, base+1);
- }
-+#ifdef CONFIG_XEN
-+static inline void *chip_get_private(const struct tpm_chip *chip)
-+{
-+      return chip->priv;
-+}
-+
-+static inline void chip_set_private(struct tpm_chip *chip, void *priv)
-+{
-+      chip->priv = priv;
-+}
-+#endif
-+
- extern void tpm_get_timeouts(struct tpm_chip *);
- extern void tpm_gen_interrupt(struct tpm_chip *);
- extern void tpm_continue_selftest(struct tpm_chip *);
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-07-31/drivers/char/tpm/tpm_vtpm.c       2009-02-16 15:58:14.000000000 +0100
-@@ -0,0 +1,542 @@
-+/*
-+ * Copyright (C) 2006 IBM Corporation
-+ *
-+ * Authors:
-+ * Stefan Berger <stefanb@us.ibm.com>
-+ *
-+ * Generic device driver part for device drivers in a virtualized
-+ * environment.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation, version 2 of the
-+ * License.
-+ *
-+ */
-+
-+#include <asm/uaccess.h>
-+#include <linux/list.h>
-+#include <linux/device.h>
-+#include <linux/interrupt.h>
-+#include <linux/platform_device.h>
-+#include "tpm.h"
-+#include "tpm_vtpm.h"
-+
-+/* read status bits */
-+enum {
-+      STATUS_BUSY = 0x01,
-+      STATUS_DATA_AVAIL = 0x02,
-+      STATUS_READY = 0x04
-+};
-+
-+struct transmission {
-+      struct list_head next;
-+
-+      unsigned char *request;
-+      size_t  request_len;
-+      size_t  request_buflen;
-+
-+      unsigned char *response;
-+      size_t  response_len;
-+      size_t  response_buflen;
-+
-+      unsigned int flags;
-+};
-+
-+enum {
-+      TRANSMISSION_FLAG_WAS_QUEUED = 0x1
-+};
-+
-+
-+enum {
-+      DATAEX_FLAG_QUEUED_ONLY = 0x1
-+};
-+
-+
-+/* local variables */
-+
-+/* local function prototypes */
-+static int _vtpm_send_queued(struct tpm_chip *chip);
-+
-+
-+/* =============================================================
-+ * Some utility functions
-+ * =============================================================
-+ */
-+static void vtpm_state_init(struct vtpm_state *vtpms)
-+{
-+      vtpms->current_request = NULL;
-+      spin_lock_init(&vtpms->req_list_lock);
-+      init_waitqueue_head(&vtpms->req_wait_queue);
-+      INIT_LIST_HEAD(&vtpms->queued_requests);
-+
-+      vtpms->current_response = NULL;
-+      spin_lock_init(&vtpms->resp_list_lock);
-+      init_waitqueue_head(&vtpms->resp_wait_queue);
-+
-+      vtpms->disconnect_time = jiffies;
-+}
-+
-+
-+static inline struct transmission *transmission_alloc(void)
-+{
-+      return kzalloc(sizeof(struct transmission), GFP_ATOMIC);
-+}
-+
-+static unsigned char *
-+transmission_set_req_buffer(struct transmission *t,
-+                            unsigned char *buffer, size_t len)
-+{
-+      if (t->request_buflen < len) {
-+              kfree(t->request);
-+              t->request = kmalloc(len, GFP_KERNEL);
-+              if (!t->request) {
-+                      t->request_buflen = 0;
-+                      return NULL;
-+              }
-+              t->request_buflen = len;
-+      }
-+
-+      memcpy(t->request, buffer, len);
-+      t->request_len = len;
-+
-+      return t->request;
-+}
-+
-+static unsigned char *
-+transmission_set_res_buffer(struct transmission *t,
-+                            const unsigned char *buffer, size_t len)
-+{
-+      if (t->response_buflen < len) {
-+              kfree(t->response);
-+              t->response = kmalloc(len, GFP_ATOMIC);
-+              if (!t->response) {
-+                      t->response_buflen = 0;
-+                      return NULL;
-+              }
-+              t->response_buflen = len;
-+      }
-+
-+      memcpy(t->response, buffer, len);
-+      t->response_len = len;
-+
-+      return t->response;
-+}
-+
-+static inline void transmission_free(struct transmission *t)
-+{
-+      kfree(t->request);
-+      kfree(t->response);
-+      kfree(t);
-+}
-+
-+/* =============================================================
-+ * Interface with the lower layer driver
-+ * =============================================================
-+ */
-+/*
-+ * Lower layer uses this function to make a response available.
-+ */
-+int vtpm_vd_recv(const struct tpm_chip *chip,
-+                 const unsigned char *buffer, size_t count,
-+                 void *ptr)
-+{
-+      unsigned long flags;
-+      int ret_size = 0;
-+      struct transmission *t;
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      /*
-+       * The list with requests must contain one request
-+       * only and the element there must be the one that
-+       * was passed to me from the front-end.
-+       */
-+      spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-+      if (vtpms->current_request != ptr) {
-+              spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+              return 0;
-+      }
-+
-+      if ((t = vtpms->current_request)) {
-+              transmission_free(t);
-+              vtpms->current_request = NULL;
-+      }
-+
-+      t = transmission_alloc();
-+      if (t) {
-+              if (!transmission_set_res_buffer(t, buffer, count)) {
-+                      transmission_free(t);
-+                      spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+                      return -ENOMEM;
-+              }
-+              ret_size = count;
-+              vtpms->current_response = t;
-+              wake_up_interruptible(&vtpms->resp_wait_queue);
-+      }
-+      spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+
-+      return ret_size;
-+}
-+
-+
-+/*
-+ * Lower layer indicates its status (connected/disconnected)
-+ */
-+void vtpm_vd_status(const struct tpm_chip *chip, u8 vd_status)
-+{
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      vtpms->vd_status = vd_status;
-+      if ((vtpms->vd_status & TPM_VD_STATUS_CONNECTED) == 0) {
-+              vtpms->disconnect_time = jiffies;
-+      }
-+}
-+
-+/* =============================================================
-+ * Interface with the generic TPM driver
-+ * =============================================================
-+ */
-+static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)
-+{
-+      int rc = 0;
-+      unsigned long flags;
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      /*
-+       * Check if the previous operation only queued the command
-+       * In this case there won't be a response, so I just
-+       * return from here and reset that flag. In any other
-+       * case I should receive a response from the back-end.
-+       */
-+      spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-+      if ((vtpms->flags & DATAEX_FLAG_QUEUED_ONLY) != 0) {
-+              vtpms->flags &= ~DATAEX_FLAG_QUEUED_ONLY;
-+              spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+              /*
-+               * The first few commands (measurements) must be
-+               * queued since it might not be possible to talk to the
-+               * TPM, yet.
-+               * Return a response of up to 30 '0's.
-+               */
-+
-+              count = min_t(size_t, count, 30);
-+              memset(buf, 0x0, count);
-+              return count;
-+      }
-+      /*
-+       * Check whether something is in the responselist and if
-+       * there's nothing in the list wait for something to appear.
-+       */
-+
-+      if (!vtpms->current_response) {
-+              spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+              interruptible_sleep_on_timeout(&vtpms->resp_wait_queue,
-+                                             1000);
-+              spin_lock_irqsave(&vtpms->resp_list_lock ,flags);
-+      }
-+
-+      if (vtpms->current_response) {
-+              struct transmission *t = vtpms->current_response;
-+              vtpms->current_response = NULL;
-+              rc = min(count, t->response_len);
-+              memcpy(buf, t->response, rc);
-+              transmission_free(t);
-+      }
-+
-+      spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+      return rc;
-+}
-+
-+static int vtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
-+{
-+      int rc = 0;
-+      unsigned long flags;
-+      struct transmission *t = transmission_alloc();
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      if (!t)
-+              return -ENOMEM;
-+      /*
-+       * If there's a current request, it must be the
-+       * previous request that has timed out.
-+       */
-+      spin_lock_irqsave(&vtpms->req_list_lock, flags);
-+      if (vtpms->current_request != NULL) {
-+              printk("WARNING: Sending although there is a request outstanding.\n"
-+                     "         Previous request must have timed out.\n");
-+              transmission_free(vtpms->current_request);
-+              vtpms->current_request = NULL;
-+      }
-+      spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-+
-+      /*
-+       * Queue the packet if the driver below is not
-+       * ready, yet, or there is any packet already
-+       * in the queue.
-+       * If the driver below is ready, unqueue all
-+       * packets first before sending our current
-+       * packet.
-+       * For each unqueued packet, except for the
-+       * last (=current) packet, call the function
-+       * tpm_xen_recv to wait for the response to come
-+       * back.
-+       */
-+      if ((vtpms->vd_status & TPM_VD_STATUS_CONNECTED) == 0) {
-+              if (time_after(jiffies,
-+                             vtpms->disconnect_time + HZ * 10)) {
-+                      rc = -ENOENT;
-+              } else {
-+                      goto queue_it;
-+              }
-+      } else {
-+              /*
-+               * Send all queued packets.
-+               */
-+              if (_vtpm_send_queued(chip) == 0) {
-+
-+                      vtpms->current_request = t;
-+
-+                      rc = vtpm_vd_send(vtpms->tpm_private,
-+                                        buf,
-+                                        count,
-+                                        t);
-+                      /*
-+                       * The generic TPM driver will call
-+                       * the function to receive the response.
-+                       */
-+                      if (rc < 0) {
-+                              vtpms->current_request = NULL;
-+                              goto queue_it;
-+                      }
-+              } else {
-+queue_it:
-+                      if (!transmission_set_req_buffer(t, buf, count)) {
-+                              transmission_free(t);
-+                              rc = -ENOMEM;
-+                              goto exit;
-+                      }
-+                      /*
-+                       * An error occurred. Don't event try
-+                       * to send the current request. Just
-+                       * queue it.
-+                       */
-+                      spin_lock_irqsave(&vtpms->req_list_lock, flags);
-+                      vtpms->flags |= DATAEX_FLAG_QUEUED_ONLY;
-+                      list_add_tail(&t->next, &vtpms->queued_requests);
-+                      spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-+              }
-+      }
-+
-+exit:
-+      return rc;
-+}
-+
-+
-+/*
-+ * Send all queued requests.
-+ */
-+static int _vtpm_send_queued(struct tpm_chip *chip)
-+{
-+      int rc;
-+      int error = 0;
-+      long flags;
-+      unsigned char buffer[1];
-+      struct vtpm_state *vtpms;
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      spin_lock_irqsave(&vtpms->req_list_lock, flags);
-+
-+      while (!list_empty(&vtpms->queued_requests)) {
-+              /*
-+               * Need to dequeue them.
-+               * Read the result into a dummy buffer.
-+               */
-+              struct transmission *qt = (struct transmission *)
-+                                        vtpms->queued_requests.next;
-+              list_del(&qt->next);
-+              vtpms->current_request = qt;
-+              spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-+
-+              rc = vtpm_vd_send(vtpms->tpm_private,
-+                                qt->request,
-+                                qt->request_len,
-+                                qt);
-+
-+              if (rc < 0) {
-+                      spin_lock_irqsave(&vtpms->req_list_lock, flags);
-+                      if ((qt = vtpms->current_request) != NULL) {
-+                              /*
-+                               * requeue it at the beginning
-+                               * of the list
-+                               */
-+                              list_add(&qt->next,
-+                                       &vtpms->queued_requests);
-+                      }
-+                      vtpms->current_request = NULL;
-+                      error = 1;
-+                      break;
-+              }
-+              /*
-+               * After this point qt is not valid anymore!
-+               * It is freed when the front-end is delivering
-+               * the data by calling tpm_recv
-+               */
-+              /*
-+               * Receive response into provided dummy buffer
-+               */
-+              rc = vtpm_recv(chip, buffer, sizeof(buffer));
-+              spin_lock_irqsave(&vtpms->req_list_lock, flags);
-+      }
-+
-+      spin_unlock_irqrestore(&vtpms->req_list_lock, flags);
-+
-+      return error;
-+}
-+
-+static void vtpm_cancel(struct tpm_chip *chip)
-+{
-+      unsigned long flags;
-+      struct vtpm_state *vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      spin_lock_irqsave(&vtpms->resp_list_lock,flags);
-+
-+      if (!vtpms->current_response && vtpms->current_request) {
-+              spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+              interruptible_sleep_on(&vtpms->resp_wait_queue);
-+              spin_lock_irqsave(&vtpms->resp_list_lock,flags);
-+      }
-+
-+      if (vtpms->current_response) {
-+              struct transmission *t = vtpms->current_response;
-+              vtpms->current_response = NULL;
-+              transmission_free(t);
-+      }
-+
-+      spin_unlock_irqrestore(&vtpms->resp_list_lock,flags);
-+}
-+
-+static u8 vtpm_status(struct tpm_chip *chip)
-+{
-+      u8 rc = 0;
-+      unsigned long flags;
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = (struct vtpm_state *)chip_get_private(chip);
-+
-+      spin_lock_irqsave(&vtpms->resp_list_lock, flags);
-+      /*
-+       * Data are available if:
-+       *  - there's a current response
-+       *  - the last packet was queued only (this is fake, but necessary to
-+       *      get the generic TPM layer to call the receive function.)
-+       */
-+      if (vtpms->current_response ||
-+          0 != (vtpms->flags & DATAEX_FLAG_QUEUED_ONLY)) {
-+              rc = STATUS_DATA_AVAIL;
-+      } else if (!vtpms->current_response && !vtpms->current_request) {
-+              rc = STATUS_READY;
-+      }
-+
-+      spin_unlock_irqrestore(&vtpms->resp_list_lock, flags);
-+      return rc;
-+}
-+
-+static struct file_operations vtpm_ops = {
-+      .owner = THIS_MODULE,
-+      .llseek = no_llseek,
-+      .open = tpm_open,
-+      .read = tpm_read,
-+      .write = tpm_write,
-+      .release = tpm_release,
-+};
-+
-+static DEVICE_ATTR(pubek, S_IRUGO, tpm_show_pubek, NULL);
-+static DEVICE_ATTR(pcrs, S_IRUGO, tpm_show_pcrs, NULL);
-+static DEVICE_ATTR(enabled, S_IRUGO, tpm_show_enabled, NULL);
-+static DEVICE_ATTR(active, S_IRUGO, tpm_show_active, NULL);
-+static DEVICE_ATTR(owned, S_IRUGO, tpm_show_owned, NULL);
-+static DEVICE_ATTR(temp_deactivated, S_IRUGO, tpm_show_temp_deactivated,
-+                 NULL);
-+static DEVICE_ATTR(caps, S_IRUGO, tpm_show_caps, NULL);
-+static DEVICE_ATTR(cancel, S_IWUSR |S_IWGRP, NULL, tpm_store_cancel);
-+
-+static struct attribute *vtpm_attrs[] = {
-+      &dev_attr_pubek.attr,
-+      &dev_attr_pcrs.attr,
-+      &dev_attr_enabled.attr,
-+      &dev_attr_active.attr,
-+      &dev_attr_owned.attr,
-+      &dev_attr_temp_deactivated.attr,
-+      &dev_attr_caps.attr,
-+      &dev_attr_cancel.attr,
-+      NULL,
-+};
-+
-+static struct attribute_group vtpm_attr_grp = { .attrs = vtpm_attrs };
-+
-+#define TPM_LONG_TIMEOUT   (10 * 60 * HZ)
-+
-+static struct tpm_vendor_specific tpm_vtpm = {
-+      .recv = vtpm_recv,
-+      .send = vtpm_send,
-+      .cancel = vtpm_cancel,
-+      .status = vtpm_status,
-+      .req_complete_mask = STATUS_BUSY | STATUS_DATA_AVAIL,
-+      .req_complete_val  = STATUS_DATA_AVAIL,
-+      .req_canceled = STATUS_READY,
-+      .attr_group = &vtpm_attr_grp,
-+      .miscdev = {
-+              .fops = &vtpm_ops,
-+      },
-+      .duration = {
-+              TPM_LONG_TIMEOUT,
-+              TPM_LONG_TIMEOUT,
-+              TPM_LONG_TIMEOUT,
-+      },
-+};
-+
-+struct tpm_chip *init_vtpm(struct device *dev,
-+                           struct tpm_private *tp)
-+{
-+      long rc;
-+      struct tpm_chip *chip;
-+      struct vtpm_state *vtpms;
-+
-+      vtpms = kzalloc(sizeof(struct vtpm_state), GFP_KERNEL);
-+      if (!vtpms)
-+              return ERR_PTR(-ENOMEM);
-+
-+      vtpm_state_init(vtpms);
-+      vtpms->tpm_private = tp;
-+
-+      chip = tpm_register_hardware(dev, &tpm_vtpm);
-+      if (!chip) {
-+              rc = -ENODEV;
-+              goto err_free_mem;
-+      }
-+
-+      chip_set_private(chip, vtpms);
-+
-+      return chip;
-+
-+err_free_mem:
-+      kfree(vtpms);
-+
-+      return ERR_PTR(rc);
-+}
-+
-+void cleanup_vtpm(struct device *dev)
-+{
-+      struct tpm_chip *chip = dev_get_drvdata(dev);
-+      struct vtpm_state *vtpms = (struct vtpm_state*)chip_get_private(chip);
-+      tpm_remove_hardware(dev);
-+      kfree(vtpms);
-+}
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-07-31/drivers/char/tpm/tpm_vtpm.h       2009-02-16 15:58:14.000000000 +0100
-@@ -0,0 +1,55 @@
-+#ifndef TPM_VTPM_H
-+#define TPM_VTPM_H
-+
-+struct tpm_chip;
-+struct tpm_private;
-+
-+struct vtpm_state {
-+      struct transmission *current_request;
-+      spinlock_t           req_list_lock;
-+      wait_queue_head_t    req_wait_queue;
-+
-+      struct list_head     queued_requests;
-+
-+      struct transmission *current_response;
-+      spinlock_t           resp_list_lock;
-+      wait_queue_head_t    resp_wait_queue;     // processes waiting for responses
-+
-+      u8                   vd_status;
-+      u8                   flags;
-+
-+      unsigned long        disconnect_time;
-+
-+      /*
-+       * The following is a private structure of the underlying
-+       * driver. It is passed as parameter in the send function.
-+       */
-+      struct tpm_private *tpm_private;
-+};
-+
-+
-+enum vdev_status {
-+      TPM_VD_STATUS_DISCONNECTED = 0x0,
-+      TPM_VD_STATUS_CONNECTED = 0x1
-+};
-+
-+/* this function is called from tpm_vtpm.c */
-+int vtpm_vd_send(struct tpm_private * tp,
-+                 const u8 * buf, size_t count, void *ptr);
-+
-+/* these functions are offered by tpm_vtpm.c */
-+struct tpm_chip *init_vtpm(struct device *,
-+                           struct tpm_private *);
-+void cleanup_vtpm(struct device *);
-+int vtpm_vd_recv(const struct tpm_chip* chip,
-+                 const unsigned char *buffer, size_t count, void *ptr);
-+void vtpm_vd_status(const struct tpm_chip *, u8 status);
-+
-+static inline struct tpm_private *tpm_private_from_dev(struct device *dev)
-+{
-+      struct tpm_chip *chip = dev_get_drvdata(dev);
-+      struct vtpm_state *vtpms = chip_get_private(chip);
-+      return vtpms->tpm_private;
-+}
-+
-+#endif
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-07-31/drivers/char/tpm/tpm_xen.c        2009-02-16 15:58:14.000000000 +0100
-@@ -0,0 +1,722 @@
-+/*
-+ * Copyright (c) 2005, IBM Corporation
-+ *
-+ * Author: Stefan Berger, stefanb@us.ibm.com
-+ * Grant table support: Mahadevan Gomathisankaran
-+ *
-+ * This code has been derived from drivers/xen/netfront/netfront.c
-+ *
-+ * Copyright (c) 2002-2004, K A Fraser
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/err.h>
-+#include <linux/interrupt.h>
-+#include <linux/mutex.h>
-+#include <asm/uaccess.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/interface/io/tpmif.h>
-+#include <xen/gnttab.h>
-+#include <xen/xenbus.h>
-+#include "tpm.h"
-+#include "tpm_vtpm.h"
-+
-+#undef DEBUG
-+
-+/* local structures */
-+struct tpm_private {
-+      struct tpm_chip *chip;
-+
-+      tpmif_tx_interface_t *tx;
-+      atomic_t refcnt;
-+      unsigned int irq;
-+      u8 is_connected;
-+      u8 is_suspended;
-+
-+      spinlock_t tx_lock;
-+
-+      struct tx_buffer *tx_buffers[TPMIF_TX_RING_SIZE];
-+
-+      atomic_t tx_busy;
-+      void *tx_remember;
-+
-+      domid_t backend_id;
-+      wait_queue_head_t wait_q;
-+
-+      struct xenbus_device *dev;
-+      int ring_ref;
-+};
-+
-+struct tx_buffer {
-+      unsigned int size;      // available space in data
-+      unsigned int len;       // used space in data
-+      unsigned char *data;    // pointer to a page
-+};
-+
-+
-+/* locally visible variables */
-+static grant_ref_t gref_head;
-+static struct tpm_private *my_priv;
-+
-+/* local function prototypes */
-+static irqreturn_t tpmif_int(int irq,
-+                             void *tpm_priv,
-+                             struct pt_regs *ptregs);
-+static void tpmif_rx_action(unsigned long unused);
-+static int tpmif_connect(struct xenbus_device *dev,
-+                         struct tpm_private *tp,
-+                         domid_t domid);
-+static DECLARE_TASKLET(tpmif_rx_tasklet, tpmif_rx_action, 0);
-+static int tpmif_allocate_tx_buffers(struct tpm_private *tp);
-+static void tpmif_free_tx_buffers(struct tpm_private *tp);
-+static void tpmif_set_connected_state(struct tpm_private *tp,
-+                                      u8 newstate);
-+static int tpm_xmit(struct tpm_private *tp,
-+                    const u8 * buf, size_t count, int userbuffer,
-+                    void *remember);
-+static void destroy_tpmring(struct tpm_private *tp);
-+void __exit tpmif_exit(void);
-+
-+#define DPRINTK(fmt, args...) \
-+    pr_debug("xen_tpm_fr (%s:%d) " fmt, __FUNCTION__, __LINE__, ##args)
-+#define IPRINTK(fmt, args...) \
-+    printk(KERN_INFO "xen_tpm_fr: " fmt, ##args)
-+#define WPRINTK(fmt, args...) \
-+    printk(KERN_WARNING "xen_tpm_fr: " fmt, ##args)
-+
-+#define GRANT_INVALID_REF     0
-+
-+
-+static inline int
-+tx_buffer_copy(struct tx_buffer *txb, const u8 *src, int len,
-+               int isuserbuffer)
-+{
-+      int copied = len;
-+
-+      if (len > txb->size)
-+              copied = txb->size;
-+      if (isuserbuffer) {
-+              if (copy_from_user(txb->data, src, copied))
-+                      return -EFAULT;
-+      } else {
-+              memcpy(txb->data, src, copied);
-+      }
-+      txb->len = len;
-+      return copied;
-+}
-+
-+static inline struct tx_buffer *tx_buffer_alloc(void)
-+{
-+      struct tx_buffer *txb;
-+
-+      txb = kzalloc(sizeof(struct tx_buffer), GFP_KERNEL);
-+      if (!txb)
-+              return NULL;
-+
-+      txb->len = 0;
-+      txb->size = PAGE_SIZE;
-+      txb->data = (unsigned char *)__get_free_page(GFP_KERNEL);
-+      if (txb->data == NULL) {
-+              kfree(txb);
-+              txb = NULL;
-+      }
-+
-+      return txb;
-+}
-+
-+
-+static inline void tx_buffer_free(struct tx_buffer *txb)
-+{
-+      if (txb) {
-+              free_page((long)txb->data);
-+              kfree(txb);
-+      }
-+}
-+
-+/**************************************************************
-+ Utility function for the tpm_private structure
-+**************************************************************/
-+static void tpm_private_init(struct tpm_private *tp)
-+{
-+      spin_lock_init(&tp->tx_lock);
-+      init_waitqueue_head(&tp->wait_q);
-+      atomic_set(&tp->refcnt, 1);
-+}
-+
-+static void tpm_private_put(void)
-+{
-+      if (!atomic_dec_and_test(&my_priv->refcnt))
-+              return;
-+
-+      tpmif_free_tx_buffers(my_priv);
-+      kfree(my_priv);
-+      my_priv = NULL;
-+}
-+
-+static struct tpm_private *tpm_private_get(void)
-+{
-+      int err;
-+
-+      if (my_priv) {
-+              atomic_inc(&my_priv->refcnt);
-+              return my_priv;
-+      }
-+
-+      my_priv = kzalloc(sizeof(struct tpm_private), GFP_KERNEL);
-+      if (!my_priv)
-+              return NULL;
-+
-+      tpm_private_init(my_priv);
-+      err = tpmif_allocate_tx_buffers(my_priv);
-+      if (err < 0)
-+              tpm_private_put();
-+
-+      return my_priv;
-+}
-+
-+/**************************************************************
-+
-+ The interface to let the tpm plugin register its callback
-+ function and send data to another partition using this module
-+
-+**************************************************************/
-+
-+static DEFINE_MUTEX(suspend_lock);
-+/*
-+ * Send data via this module by calling this function
-+ */
-+int vtpm_vd_send(struct tpm_private *tp,
-+                 const u8 * buf, size_t count, void *ptr)
-+{
-+      int sent;
-+
-+      mutex_lock(&suspend_lock);
-+      sent = tpm_xmit(tp, buf, count, 0, ptr);
-+      mutex_unlock(&suspend_lock);
-+
-+      return sent;
-+}
-+
-+/**************************************************************
-+ XENBUS support code
-+**************************************************************/
-+
-+static int setup_tpmring(struct xenbus_device *dev,
-+                         struct tpm_private *tp)
-+{
-+      tpmif_tx_interface_t *sring;
-+      int err;
-+
-+      tp->ring_ref = GRANT_INVALID_REF;
-+
-+      sring = (void *)__get_free_page(GFP_KERNEL);
-+      if (!sring) {
-+              xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
-+              return -ENOMEM;
-+      }
-+      tp->tx = sring;
-+
-+      err = xenbus_grant_ring(dev, virt_to_mfn(tp->tx));
-+      if (err < 0) {
-+              free_page((unsigned long)sring);
-+              tp->tx = NULL;
-+              xenbus_dev_fatal(dev, err, "allocating grant reference");
-+              goto fail;
-+      }
-+      tp->ring_ref = err;
-+
-+      err = tpmif_connect(dev, tp, dev->otherend_id);
-+      if (err)
-+              goto fail;
-+
-+      return 0;
-+fail:
-+      destroy_tpmring(tp);
-+      return err;
-+}
-+
-+
-+static void destroy_tpmring(struct tpm_private *tp)
-+{
-+      tpmif_set_connected_state(tp, 0);
-+
-+      if (tp->ring_ref != GRANT_INVALID_REF) {
-+              gnttab_end_foreign_access(tp->ring_ref, (unsigned long)tp->tx);
-+              tp->ring_ref = GRANT_INVALID_REF;
-+              tp->tx = NULL;
-+      }
-+
-+      if (tp->irq)
-+              unbind_from_irqhandler(tp->irq, tp);
-+
-+      tp->irq = 0;
-+}
-+
-+
-+static int talk_to_backend(struct xenbus_device *dev,
-+                           struct tpm_private *tp)
-+{
-+      const char *message = NULL;
-+      int err;
-+      struct xenbus_transaction xbt;
-+
-+      err = setup_tpmring(dev, tp);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "setting up ring");
-+              goto out;
-+      }
-+
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "starting transaction");
-+              goto destroy_tpmring;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename,
-+                          "ring-ref","%u", tp->ring_ref);
-+      if (err) {
-+              message = "writing ring-ref";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-+                          irq_to_evtchn_port(tp->irq));
-+      if (err) {
-+              message = "writing event-channel";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err == -EAGAIN)
-+              goto again;
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "completing transaction");
-+              goto destroy_tpmring;
-+      }
-+
-+      xenbus_switch_state(dev, XenbusStateConnected);
-+
-+      return 0;
-+
-+abort_transaction:
-+      xenbus_transaction_end(xbt, 1);
-+      if (message)
-+              xenbus_dev_error(dev, err, "%s", message);
-+destroy_tpmring:
-+      destroy_tpmring(tp);
-+out:
-+      return err;
-+}
-+
-+/**
-+ * Callback received when the backend's state changes.
-+ */
-+static void backend_changed(struct xenbus_device *dev,
-+                          enum xenbus_state backend_state)
-+{
-+      struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-+      DPRINTK("\n");
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitWait:
-+      case XenbusStateInitialised:
-+      case XenbusStateReconfiguring:
-+      case XenbusStateReconfigured:
-+      case XenbusStateUnknown:
-+              break;
-+
-+      case XenbusStateConnected:
-+              tpmif_set_connected_state(tp, 1);
-+              break;
-+
-+      case XenbusStateClosing:
-+              tpmif_set_connected_state(tp, 0);
-+              xenbus_frontend_closed(dev);
-+              break;
-+
-+      case XenbusStateClosed:
-+              tpmif_set_connected_state(tp, 0);
-+              if (tp->is_suspended == 0)
-+                      device_unregister(&dev->dev);
-+              xenbus_frontend_closed(dev);
-+              break;
-+      }
-+}
-+
-+static int tpmfront_probe(struct xenbus_device *dev,
-+                          const struct xenbus_device_id *id)
-+{
-+      int err;
-+      int handle;
-+      struct tpm_private *tp = tpm_private_get();
-+
-+      if (!tp)
-+              return -ENOMEM;
-+
-+      tp->chip = init_vtpm(&dev->dev, tp);
-+      if (IS_ERR(tp->chip))
-+              return PTR_ERR(tp->chip);
-+
-+      err = xenbus_scanf(XBT_NIL, dev->nodename,
-+                         "handle", "%i", &handle);
-+      if (XENBUS_EXIST_ERR(err))
-+              return err;
-+
-+      if (err < 0) {
-+              xenbus_dev_fatal(dev,err,"reading virtual-device");
-+              return err;
-+      }
-+
-+      tp->dev = dev;
-+
-+      err = talk_to_backend(dev, tp);
-+      if (err) {
-+              tpm_private_put();
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+static int tpmfront_remove(struct xenbus_device *dev)
-+{
-+      struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-+      destroy_tpmring(tp);
-+      cleanup_vtpm(&dev->dev);
-+      return 0;
-+}
-+
-+static int tpmfront_suspend(struct xenbus_device *dev)
-+{
-+      struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-+      u32 ctr;
-+
-+      /* Take the lock, preventing any application from sending. */
-+      mutex_lock(&suspend_lock);
-+      tp->is_suspended = 1;
-+
-+      for (ctr = 0; atomic_read(&tp->tx_busy); ctr++) {
-+              if ((ctr % 10) == 0)
-+                      printk("TPM-FE [INFO]: Waiting for outstanding "
-+                             "request.\n");
-+              /* Wait for a request to be responded to. */
-+              interruptible_sleep_on_timeout(&tp->wait_q, 100);
-+      }
-+
-+      return 0;
-+}
-+
-+static int tpmfront_suspend_finish(struct tpm_private *tp)
-+{
-+      tp->is_suspended = 0;
-+      /* Allow applications to send again. */
-+      mutex_unlock(&suspend_lock);
-+      return 0;
-+}
-+
-+static int tpmfront_suspend_cancel(struct xenbus_device *dev)
-+{
-+      struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-+      return tpmfront_suspend_finish(tp);
-+}
-+
-+static int tpmfront_resume(struct xenbus_device *dev)
-+{
-+      struct tpm_private *tp = tpm_private_from_dev(&dev->dev);
-+      destroy_tpmring(tp);
-+      return talk_to_backend(dev, tp);
-+}
-+
-+static int tpmif_connect(struct xenbus_device *dev,
-+                         struct tpm_private *tp,
-+                         domid_t domid)
-+{
-+      int err;
-+
-+      tp->backend_id = domid;
-+
-+      err = bind_listening_port_to_irqhandler(
-+              domid, tpmif_int, SA_SAMPLE_RANDOM, "tpmif", tp);
-+      if (err <= 0) {
-+              WPRINTK("bind_listening_port_to_irqhandler failed "
-+                      "(err=%d)\n", err);
-+              return err;
-+      }
-+      tp->irq = err;
-+
-+      return 0;
-+}
-+
-+static struct xenbus_device_id tpmfront_ids[] = {
-+      { "vtpm" },
-+      { "" }
-+};
-+
-+static struct xenbus_driver tpmfront = {
-+      .name = "vtpm",
-+      .owner = THIS_MODULE,
-+      .ids = tpmfront_ids,
-+      .probe = tpmfront_probe,
-+      .remove =  tpmfront_remove,
-+      .resume = tpmfront_resume,
-+      .otherend_changed = backend_changed,
-+      .suspend = tpmfront_suspend,
-+      .suspend_cancel = tpmfront_suspend_cancel,
-+};
-+
-+static void __init init_tpm_xenbus(void)
-+{
-+      xenbus_register_frontend(&tpmfront);
-+}
-+
-+static int tpmif_allocate_tx_buffers(struct tpm_private *tp)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < TPMIF_TX_RING_SIZE; i++) {
-+              tp->tx_buffers[i] = tx_buffer_alloc();
-+              if (!tp->tx_buffers[i]) {
-+                      tpmif_free_tx_buffers(tp);
-+                      return -ENOMEM;
-+              }
-+      }
-+      return 0;
-+}
-+
-+static void tpmif_free_tx_buffers(struct tpm_private *tp)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < TPMIF_TX_RING_SIZE; i++)
-+              tx_buffer_free(tp->tx_buffers[i]);
-+}
-+
-+static void tpmif_rx_action(unsigned long priv)
-+{
-+      struct tpm_private *tp = (struct tpm_private *)priv;
-+      int i = 0;
-+      unsigned int received;
-+      unsigned int offset = 0;
-+      u8 *buffer;
-+      tpmif_tx_request_t *tx = &tp->tx->ring[i].req;
-+
-+      atomic_set(&tp->tx_busy, 0);
-+      wake_up_interruptible(&tp->wait_q);
-+
-+      received = tx->size;
-+
-+      buffer = kmalloc(received, GFP_ATOMIC);
-+      if (!buffer)
-+              return;
-+
-+      for (i = 0; i < TPMIF_TX_RING_SIZE && offset < received; i++) {
-+              struct tx_buffer *txb = tp->tx_buffers[i];
-+              tpmif_tx_request_t *tx;
-+              unsigned int tocopy;
-+
-+              tx = &tp->tx->ring[i].req;
-+              tocopy = tx->size;
-+              if (tocopy > PAGE_SIZE)
-+                      tocopy = PAGE_SIZE;
-+
-+              memcpy(&buffer[offset], txb->data, tocopy);
-+
-+              gnttab_release_grant_reference(&gref_head, tx->ref);
-+
-+              offset += tocopy;
-+      }
-+
-+      vtpm_vd_recv(tp->chip, buffer, received, tp->tx_remember);
-+      kfree(buffer);
-+}
-+
-+
-+static irqreturn_t tpmif_int(int irq, void *tpm_priv, struct pt_regs *ptregs)
-+{
-+      struct tpm_private *tp = tpm_priv;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&tp->tx_lock, flags);
-+      tpmif_rx_tasklet.data = (unsigned long)tp;
-+      tasklet_schedule(&tpmif_rx_tasklet);
-+      spin_unlock_irqrestore(&tp->tx_lock, flags);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+static int tpm_xmit(struct tpm_private *tp,
-+                    const u8 * buf, size_t count, int isuserbuffer,
-+                    void *remember)
-+{
-+      tpmif_tx_request_t *tx;
-+      TPMIF_RING_IDX i;
-+      unsigned int offset = 0;
-+
-+      spin_lock_irq(&tp->tx_lock);
-+
-+      if (unlikely(atomic_read(&tp->tx_busy))) {
-+              printk("tpm_xmit: There's an outstanding request/response "
-+                     "on the way!\n");
-+              spin_unlock_irq(&tp->tx_lock);
-+              return -EBUSY;
-+      }
-+
-+      if (tp->is_connected != 1) {
-+              spin_unlock_irq(&tp->tx_lock);
-+              return -EIO;
-+      }
-+
-+      for (i = 0; count > 0 && i < TPMIF_TX_RING_SIZE; i++) {
-+              struct tx_buffer *txb = tp->tx_buffers[i];
-+              int copied;
-+
-+              if (!txb) {
-+                      DPRINTK("txb (i=%d) is NULL. buffers initilized?\n"
-+                              "Not transmitting anything!\n", i);
-+                      spin_unlock_irq(&tp->tx_lock);
-+                      return -EFAULT;
-+              }
-+
-+              copied = tx_buffer_copy(txb, &buf[offset], count,
-+                                      isuserbuffer);
-+              if (copied < 0) {
-+                      /* An error occurred */
-+                      spin_unlock_irq(&tp->tx_lock);
-+                      return copied;
-+              }
-+              count -= copied;
-+              offset += copied;
-+
-+              tx = &tp->tx->ring[i].req;
-+              tx->addr = virt_to_machine(txb->data);
-+              tx->size = txb->len;
-+              tx->unused = 0;
-+
-+              DPRINTK("First 4 characters sent by TPM-FE are "
-+                      "0x%02x 0x%02x 0x%02x 0x%02x\n",
-+                      txb->data[0],txb->data[1],txb->data[2],txb->data[3]);
-+
-+              /* Get the granttable reference for this page. */
-+              tx->ref = gnttab_claim_grant_reference(&gref_head);
-+              if (tx->ref == -ENOSPC) {
-+                      spin_unlock_irq(&tp->tx_lock);
-+                      DPRINTK("Grant table claim reference failed in "
-+                              "func:%s line:%d file:%s\n",
-+                              __FUNCTION__, __LINE__, __FILE__);
-+                      return -ENOSPC;
-+              }
-+              gnttab_grant_foreign_access_ref(tx->ref,
-+                                              tp->backend_id,
-+                                              virt_to_mfn(txb->data),
-+                                              0 /*RW*/);
-+              wmb();
-+      }
-+
-+      atomic_set(&tp->tx_busy, 1);
-+      tp->tx_remember = remember;
-+
-+      mb();
-+
-+      notify_remote_via_irq(tp->irq);
-+
-+      spin_unlock_irq(&tp->tx_lock);
-+      return offset;
-+}
-+
-+
-+static void tpmif_notify_upperlayer(struct tpm_private *tp)
-+{
-+      /* Notify upper layer about the state of the connection to the BE. */
-+      vtpm_vd_status(tp->chip, (tp->is_connected
-+                                ? TPM_VD_STATUS_CONNECTED
-+                                : TPM_VD_STATUS_DISCONNECTED));
-+}
-+
-+
-+static void tpmif_set_connected_state(struct tpm_private *tp, u8 is_connected)
-+{
-+      /*
-+       * Don't notify upper layer if we are in suspend mode and
-+       * should disconnect - assumption is that we will resume
-+       * The mutex keeps apps from sending.
-+       */
-+      if (is_connected == 0 && tp->is_suspended == 1)
-+              return;
-+
-+      /*
-+       * Unlock the mutex if we are connected again
-+       * after being suspended - now resuming.
-+       * This also removes the suspend state.
-+       */
-+      if (is_connected == 1 && tp->is_suspended == 1)
-+              tpmfront_suspend_finish(tp);
-+
-+      if (is_connected != tp->is_connected) {
-+              tp->is_connected = is_connected;
-+              tpmif_notify_upperlayer(tp);
-+      }
-+}
-+
-+
-+
-+/* =================================================================
-+ * Initialization function.
-+ * =================================================================
-+ */
-+
-+
-+static int __init tpmif_init(void)
-+{
-+      struct tpm_private *tp;
-+
-+      if (is_initial_xendomain())
-+              return -EPERM;
-+
-+      tp = tpm_private_get();
-+      if (!tp)
-+              return -ENOMEM;
-+
-+      IPRINTK("Initialising the vTPM driver.\n");
-+      if (gnttab_alloc_grant_references(TPMIF_TX_RING_SIZE,
-+                                        &gref_head) < 0) {
-+              tpm_private_put();
-+              return -EFAULT;
-+      }
-+
-+      init_tpm_xenbus();
-+      return 0;
-+}
-+
-+
-+module_init(tpmif_init);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
---- sle11-2009-07-31.orig/drivers/ide/ide-lib.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/ide/ide-lib.c     2009-02-16 15:58:14.000000000 +0100
-@@ -177,12 +177,12 @@ void ide_toggle_bounce(ide_drive_t *driv
- {
-       u64 addr = BLK_BOUNCE_HIGH;     /* dma64_addr_t */
--      if (!PCI_DMA_BUS_IS_PHYS) {
--              addr = BLK_BOUNCE_ANY;
--      } else if (on && drive->media == ide_disk) {
-+      if (on && drive->media == ide_disk) {
-               struct device *dev = drive->hwif->dev;
--              if (dev && dev->dma_mask)
-+              if (!PCI_DMA_BUS_IS_PHYS)
-+                      addr = BLK_BOUNCE_ANY;
-+              else if (dev && dev->dma_mask)
-                       addr = *dev->dma_mask;
-       }
---- sle11-2009-07-31.orig/drivers/oprofile/buffer_sync.c       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/buffer_sync.c    2009-02-16 15:58:14.000000000 +0100
-@@ -6,6 +6,10 @@
-  *
-  * @author John Levon <levon@movementarian.org>
-  *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-  * This is the core of the buffer management. Each
-  * CPU buffer is processed and entered into the
-  * global event buffer. Such processing is necessary
-@@ -40,6 +44,7 @@ static cpumask_t marked_cpus = CPU_MASK_
- static DEFINE_SPINLOCK(task_mortuary);
- static void process_task_mortuary(void);
-+static int cpu_current_domain[NR_CPUS];
- /* Take ownership of the task struct and place it on the
-  * list for processing. Only after two full buffer syncs
-@@ -148,6 +153,11 @@ static void end_sync(void)
- int sync_start(void)
- {
-       int err;
-+      int i;
-+
-+      for (i = 0; i < NR_CPUS; i++) {
-+              cpu_current_domain[i] = COORDINATOR_DOMAIN;
-+      }
-       start_cpu_work();
-@@ -274,15 +284,31 @@ static void add_cpu_switch(int i)
-       last_cookie = INVALID_COOKIE;
- }
--static void add_kernel_ctx_switch(unsigned int in_kernel)
-+static void add_cpu_mode_switch(unsigned int cpu_mode)
- {
-       add_event_entry(ESCAPE_CODE);
--      if (in_kernel)
--              add_event_entry(KERNEL_ENTER_SWITCH_CODE); 
--      else
--              add_event_entry(KERNEL_EXIT_SWITCH_CODE); 
-+      switch (cpu_mode) {
-+      case CPU_MODE_USER:
-+              add_event_entry(USER_ENTER_SWITCH_CODE);
-+              break;
-+      case CPU_MODE_KERNEL:
-+              add_event_entry(KERNEL_ENTER_SWITCH_CODE);
-+              break;
-+      case CPU_MODE_XEN:
-+              add_event_entry(XEN_ENTER_SWITCH_CODE);
-+              break;
-+      default:
-+              break;
-+      }
- }
-- 
-+
-+static void add_domain_switch(unsigned long domain_id)
-+{
-+      add_event_entry(ESCAPE_CODE);
-+      add_event_entry(DOMAIN_SWITCH_CODE);
-+      add_event_entry(domain_id);
-+}
-+
- static void
- add_user_ctx_switch(struct task_struct const * task, unsigned long cookie)
- {
-@@ -347,9 +373,9 @@ static int add_us_sample(struct mm_struc
-  * for later lookup from userspace.
-  */
- static int
--add_sample(struct mm_struct * mm, struct op_sample * s, int in_kernel)
-+add_sample(struct mm_struct * mm, struct op_sample * s, int cpu_mode)
- {
--      if (in_kernel) {
-+      if (cpu_mode >= CPU_MODE_KERNEL) {
-               add_sample_entry(s->eip, s->event);
-               return 1;
-       } else if (mm) {
-@@ -495,15 +521,21 @@ void sync_buffer(int cpu)
-       struct mm_struct *mm = NULL;
-       struct task_struct * new;
-       unsigned long cookie = 0;
--      int in_kernel = 1;
-+      int cpu_mode = 1;
-       unsigned int i;
-       sync_buffer_state state = sb_buffer_start;
-       unsigned long available;
-+      int domain_switch = 0;
-       mutex_lock(&buffer_mutex);
-  
-       add_cpu_switch(cpu);
-+      /* We need to assign the first samples in this CPU buffer to the
-+         same domain that we were processing at the last sync_buffer */
-+      if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
-+              add_domain_switch(cpu_current_domain[cpu]);
-+      }
-       /* Remember, only we can modify tail_pos */
-       available = get_slots(cpu_buf);
-@@ -511,16 +543,18 @@ void sync_buffer(int cpu)
-       for (i = 0; i < available; ++i) {
-               struct op_sample * s = &cpu_buf->buffer[cpu_buf->tail_pos];
-  
--              if (is_code(s->eip)) {
--                      if (s->event <= CPU_IS_KERNEL) {
--                              /* kernel/userspace switch */
--                              in_kernel = s->event;
-+              if (is_code(s->eip) && !domain_switch) {
-+                      if (s->event <= CPU_MODE_XEN) {
-+                              /* xen/kernel/userspace switch */
-+                              cpu_mode = s->event;
-                               if (state == sb_buffer_start)
-                                       state = sb_sample_start;
--                              add_kernel_ctx_switch(s->event);
-+                              add_cpu_mode_switch(s->event);
-                       } else if (s->event == CPU_TRACE_BEGIN) {
-                               state = sb_bt_start;
-                               add_trace_begin();
-+                      } else if (s->event == CPU_DOMAIN_SWITCH) {
-+                                      domain_switch = 1;                              
-                       } else {
-                               struct mm_struct * oldmm = mm;
-@@ -534,11 +568,21 @@ void sync_buffer(int cpu)
-                               add_user_ctx_switch(new, cookie);
-                       }
-               } else {
--                      if (state >= sb_bt_start &&
--                          !add_sample(mm, s, in_kernel)) {
--                              if (state == sb_bt_start) {
--                                      state = sb_bt_ignore;
--                                      atomic_inc(&oprofile_stats.bt_lost_no_mapping);
-+                      if (domain_switch) {
-+                              cpu_current_domain[cpu] = s->eip;
-+                              add_domain_switch(s->eip);
-+                              domain_switch = 0;
-+                      } else {
-+                              if (cpu_current_domain[cpu] !=
-+                                  COORDINATOR_DOMAIN) {
-+                                      add_sample_entry(s->eip, s->event);
-+                              }
-+                              else  if (state >= sb_bt_start &&
-+                                  !add_sample(mm, s, cpu_mode)) {
-+                                      if (state == sb_bt_start) {
-+                                              state = sb_bt_ignore;
-+                                              atomic_inc(&oprofile_stats.bt_lost_no_mapping);
-+                                      }
-                               }
-                       }
-               }
-@@ -547,6 +591,11 @@ void sync_buffer(int cpu)
-       }
-       release_mm(mm);
-+      /* We reset domain to COORDINATOR at each CPU switch */
-+      if (cpu_current_domain[cpu] != COORDINATOR_DOMAIN) {
-+              add_domain_switch(COORDINATOR_DOMAIN);
-+      }
-+
-       mark_done(cpu);
-       mutex_unlock(&buffer_mutex);
---- sle11-2009-07-31.orig/drivers/oprofile/cpu_buffer.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/cpu_buffer.c     2009-02-16 15:58:14.000000000 +0100
-@@ -6,6 +6,10 @@
-  *
-  * @author John Levon <levon@movementarian.org>
-  *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-  * Each CPU has a local buffer that stores PC value/event
-  * pairs. We also log context switches when we notice them.
-  * Eventually each CPU's buffer is processed into the global
-@@ -34,6 +38,8 @@ static void wq_sync_buffer(struct work_s
- #define DEFAULT_TIMER_EXPIRE (HZ / 10)
- static int work_enabled;
-+static int32_t current_domain = COORDINATOR_DOMAIN;
-+
- void free_cpu_buffers(void)
- {
-       int i;
-@@ -72,7 +78,7 @@ int alloc_cpu_buffers(void)
-                       goto fail;
-  
-               b->last_task = NULL;
--              b->last_is_kernel = -1;
-+              b->last_cpu_mode = -1;
-               b->tracing = 0;
-               b->buffer_size = buffer_size;
-               b->tail_pos = 0;
-@@ -130,7 +136,7 @@ void cpu_buffer_reset(struct oprofile_cp
-        * collected will populate the buffer with proper
-        * values to initialize the buffer
-        */
--      cpu_buf->last_is_kernel = -1;
-+      cpu_buf->last_cpu_mode = -1;
-       cpu_buf->last_task = NULL;
- }
-@@ -180,13 +186,13 @@ add_code(struct oprofile_cpu_buffer * bu
-  * because of the head/tail separation of the writer and reader
-  * of the CPU buffer.
-  *
-- * is_kernel is needed because on some architectures you cannot
-+ * cpu_mode is needed because on some architectures you cannot
-  * tell if you are in kernel or user space simply by looking at
-- * pc. We tag this in the buffer by generating kernel enter/exit
-- * events whenever is_kernel changes
-+ * pc. We tag this in the buffer by generating kernel/user (and xen)
-+ *  enter events whenever cpu_mode changes
-  */
- static int log_sample(struct oprofile_cpu_buffer * cpu_buf, unsigned long pc,
--                    int is_kernel, unsigned long event)
-+                    int cpu_mode, unsigned long event)
- {
-       struct task_struct * task;
-@@ -202,18 +208,18 @@ static int log_sample(struct oprofile_cp
-               return 0;
-       }
--      is_kernel = !!is_kernel;
--
-       task = current;
-       /* notice a switch from user->kernel or vice versa */
--      if (cpu_buf->last_is_kernel != is_kernel) {
--              cpu_buf->last_is_kernel = is_kernel;
--              add_code(cpu_buf, is_kernel);
-+      if (cpu_buf->last_cpu_mode != cpu_mode) {
-+              cpu_buf->last_cpu_mode = cpu_mode;
-+              add_code(cpu_buf, cpu_mode);
-       }
--
-+      
-       /* notice a task switch */
--      if (cpu_buf->last_task != task) {
-+      /* if not processing other domain samples */
-+      if ((cpu_buf->last_task != task) &&
-+          (current_domain == COORDINATOR_DOMAIN)) {
-               cpu_buf->last_task = task;
-               add_code(cpu_buf, (unsigned long)task);
-       }
-@@ -297,6 +303,25 @@ void oprofile_add_trace(unsigned long pc
-       add_sample(cpu_buf, pc, 0);
- }
-+int oprofile_add_domain_switch(int32_t domain_id)
-+{
-+      struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
-+
-+      /* should have space for switching into and out of domain 
-+         (2 slots each) plus one sample and one cpu mode switch */
-+      if (((nr_available_slots(cpu_buf) < 6) && 
-+           (domain_id != COORDINATOR_DOMAIN)) ||
-+          (nr_available_slots(cpu_buf) < 2))
-+              return 0;
-+
-+      add_code(cpu_buf, CPU_DOMAIN_SWITCH);
-+      add_sample(cpu_buf, domain_id, 0);
-+
-+      current_domain = domain_id;
-+
-+      return 1;
-+}
-+
- /*
-  * This serves to avoid cpu buffer overflow, and makes sure
-  * the task mortuary progresses
---- sle11-2009-07-31.orig/drivers/oprofile/cpu_buffer.h        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/cpu_buffer.h     2009-02-16 15:58:14.000000000 +0100
-@@ -37,7 +37,7 @@ struct oprofile_cpu_buffer {
-       volatile unsigned long tail_pos;
-       unsigned long buffer_size;
-       struct task_struct * last_task;
--      int last_is_kernel;
-+      int last_cpu_mode;
-       int tracing;
-       struct op_sample * buffer;
-       unsigned long sample_received;
-@@ -53,7 +53,10 @@ DECLARE_PER_CPU(struct oprofile_cpu_buff
- void cpu_buffer_reset(struct oprofile_cpu_buffer * cpu_buf);
- /* transient events for the CPU buffer -> event buffer */
--#define CPU_IS_KERNEL 1
--#define CPU_TRACE_BEGIN 2
-+#define CPU_MODE_USER           0
-+#define CPU_MODE_KERNEL         1
-+#define CPU_MODE_XEN            2
-+#define CPU_TRACE_BEGIN         3
-+#define CPU_DOMAIN_SWITCH       4
- #endif /* OPROFILE_CPU_BUFFER_H */
---- sle11-2009-07-31.orig/drivers/oprofile/event_buffer.h      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/event_buffer.h   2009-02-16 15:58:14.000000000 +0100
-@@ -30,6 +30,9 @@ void wake_up_buffer_waiter(void);
- #define INVALID_COOKIE ~0UL
- #define NO_COOKIE 0UL
-+/* Constant used to refer to coordinator domain (Xen) */
-+#define COORDINATOR_DOMAIN -1
-+
- extern const struct file_operations event_buffer_fops;
-  
- /* mutex between sync_cpu_buffers() and the
---- sle11-2009-07-31.orig/drivers/oprofile/oprof.c     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/oprof.c  2009-02-16 15:58:14.000000000 +0100
-@@ -5,6 +5,10 @@
-  * @remark Read the file COPYING
-  *
-  * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-  */
- #include <linux/kernel.h>
-@@ -33,6 +37,32 @@ static DEFINE_MUTEX(start_mutex);
-  */
- static int timer = 0;
-+int oprofile_set_active(int active_domains[], unsigned int adomains)
-+{
-+      int err;
-+
-+      if (!oprofile_ops.set_active)
-+              return -EINVAL;
-+
-+      mutex_lock(&start_mutex);
-+      err = oprofile_ops.set_active(active_domains, adomains);
-+      mutex_unlock(&start_mutex);
-+      return err;
-+}
-+
-+int oprofile_set_passive(int passive_domains[], unsigned int pdomains)
-+{
-+      int err;
-+
-+      if (!oprofile_ops.set_passive)
-+              return -EINVAL;
-+
-+      mutex_lock(&start_mutex);
-+      err = oprofile_ops.set_passive(passive_domains, pdomains);
-+      mutex_unlock(&start_mutex);
-+      return err;
-+}
-+
- int oprofile_setup(void)
- {
-       int err;
---- sle11-2009-07-31.orig/drivers/oprofile/oprof.h     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/oprof.h  2009-02-16 15:58:14.000000000 +0100
-@@ -35,5 +35,8 @@ void oprofile_create_files(struct super_
- void oprofile_timer_init(struct oprofile_operations * ops);
- int oprofile_set_backtrace(unsigned long depth);
-+
-+int oprofile_set_active(int active_domains[], unsigned int adomains);
-+int oprofile_set_passive(int passive_domains[], unsigned int pdomains);
-  
- #endif /* OPROF_H */
---- sle11-2009-07-31.orig/drivers/oprofile/oprofile_files.c    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/drivers/oprofile/oprofile_files.c 2009-02-16 15:58:14.000000000 +0100
-@@ -5,15 +5,21 @@
-  * @remark Read the file COPYING
-  *
-  * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.     
-  */
- #include <linux/fs.h>
- #include <linux/oprofile.h>
-+#include <asm/uaccess.h>
-+#include <linux/ctype.h>
- #include "event_buffer.h"
- #include "oprofile_stats.h"
- #include "oprof.h"
-- 
-+
- unsigned long fs_buffer_size = 131072;
- unsigned long fs_cpu_buffer_size = 8192;
- unsigned long fs_buffer_watershed = 32768; /* FIXME: tune */
-@@ -117,11 +123,202 @@ static ssize_t dump_write(struct file * 
- static const struct file_operations dump_fops = {
-       .write          = dump_write,
- };
-- 
-+
-+#define TMPBUFSIZE 512
-+
-+static unsigned int adomains = 0;
-+static int active_domains[MAX_OPROF_DOMAINS + 1];
-+static DEFINE_MUTEX(adom_mutex);
-+
-+static ssize_t adomain_write(struct file * file, char const __user * buf, 
-+                           size_t count, loff_t * offset)
-+{
-+      char *tmpbuf;
-+      char *startp, *endp;
-+      int i;
-+      unsigned long val;
-+      ssize_t retval = count;
-+      
-+      if (*offset)
-+              return -EINVAL; 
-+      if (count > TMPBUFSIZE - 1)
-+              return -EINVAL;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      if (copy_from_user(tmpbuf, buf, count)) {
-+              kfree(tmpbuf);
-+              return -EFAULT;
-+      }
-+      tmpbuf[count] = 0;
-+
-+      mutex_lock(&adom_mutex);
-+
-+      startp = tmpbuf;
-+      /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */
-+      for (i = 0; i <= MAX_OPROF_DOMAINS; i++) {
-+              val = simple_strtoul(startp, &endp, 0);
-+              if (endp == startp)
-+                      break;
-+              while (ispunct(*endp) || isspace(*endp))
-+                      endp++;
-+              active_domains[i] = val;
-+              if (active_domains[i] != val)
-+                      /* Overflow, force error below */
-+                      i = MAX_OPROF_DOMAINS + 1;
-+              startp = endp;
-+      }
-+      /* Force error on trailing junk */
-+      adomains = *startp ? MAX_OPROF_DOMAINS + 1 : i;
-+
-+      kfree(tmpbuf);
-+
-+      if (adomains > MAX_OPROF_DOMAINS
-+          || oprofile_set_active(active_domains, adomains)) {
-+              adomains = 0;
-+              retval = -EINVAL;
-+      }
-+
-+      mutex_unlock(&adom_mutex);
-+      return retval;
-+}
-+
-+static ssize_t adomain_read(struct file * file, char __user * buf, 
-+                          size_t count, loff_t * offset)
-+{
-+      char * tmpbuf;
-+      size_t len;
-+      int i;
-+      ssize_t retval;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      mutex_lock(&adom_mutex);
-+
-+      len = 0;
-+      for (i = 0; i < adomains; i++)
-+              len += snprintf(tmpbuf + len,
-+                              len < TMPBUFSIZE ? TMPBUFSIZE - len : 0,
-+                              "%u ", active_domains[i]);
-+      WARN_ON(len > TMPBUFSIZE);
-+      if (len != 0 && len <= TMPBUFSIZE)
-+              tmpbuf[len-1] = '\n';
-+
-+      mutex_unlock(&adom_mutex);
-+
-+      retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len);
-+
-+      kfree(tmpbuf);
-+      return retval;
-+}
-+
-+
-+static struct file_operations active_domain_ops = {
-+      .read           = adomain_read,
-+      .write          = adomain_write,
-+};
-+
-+static unsigned int pdomains = 0;
-+static int passive_domains[MAX_OPROF_DOMAINS];
-+static DEFINE_MUTEX(pdom_mutex);
-+
-+static ssize_t pdomain_write(struct file * file, char const __user * buf, 
-+                           size_t count, loff_t * offset)
-+{
-+      char *tmpbuf;
-+      char *startp, *endp;
-+      int i;
-+      unsigned long val;
-+      ssize_t retval = count;
-+      
-+      if (*offset)
-+              return -EINVAL; 
-+      if (count > TMPBUFSIZE - 1)
-+              return -EINVAL;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      if (copy_from_user(tmpbuf, buf, count)) {
-+              kfree(tmpbuf);
-+              return -EFAULT;
-+      }
-+      tmpbuf[count] = 0;
-+
-+      mutex_lock(&pdom_mutex);
-+
-+      startp = tmpbuf;
-+      /* Parse one more than MAX_OPROF_DOMAINS, for easy error checking */
-+      for (i = 0; i <= MAX_OPROF_DOMAINS; i++) {
-+              val = simple_strtoul(startp, &endp, 0);
-+              if (endp == startp)
-+                      break;
-+              while (ispunct(*endp) || isspace(*endp))
-+                      endp++;
-+              passive_domains[i] = val;
-+              if (passive_domains[i] != val)
-+                      /* Overflow, force error below */
-+                      i = MAX_OPROF_DOMAINS + 1;
-+              startp = endp;
-+      }
-+      /* Force error on trailing junk */
-+      pdomains = *startp ? MAX_OPROF_DOMAINS + 1 : i;
-+
-+      kfree(tmpbuf);
-+
-+      if (pdomains > MAX_OPROF_DOMAINS
-+          || oprofile_set_passive(passive_domains, pdomains)) {
-+              pdomains = 0;
-+              retval = -EINVAL;
-+      }
-+
-+      mutex_unlock(&pdom_mutex);
-+      return retval;
-+}
-+
-+static ssize_t pdomain_read(struct file * file, char __user * buf, 
-+                          size_t count, loff_t * offset)
-+{
-+      char * tmpbuf;
-+      size_t len;
-+      int i;
-+      ssize_t retval;
-+
-+      if (!(tmpbuf = kmalloc(TMPBUFSIZE, GFP_KERNEL)))
-+              return -ENOMEM;
-+
-+      mutex_lock(&pdom_mutex);
-+
-+      len = 0;
-+      for (i = 0; i < pdomains; i++)
-+              len += snprintf(tmpbuf + len,
-+                              len < TMPBUFSIZE ? TMPBUFSIZE - len : 0,
-+                              "%u ", passive_domains[i]);
-+      WARN_ON(len > TMPBUFSIZE);
-+      if (len != 0 && len <= TMPBUFSIZE)
-+              tmpbuf[len-1] = '\n';
-+
-+      mutex_unlock(&pdom_mutex);
-+
-+      retval = simple_read_from_buffer(buf, count, offset, tmpbuf, len);
-+
-+      kfree(tmpbuf);
-+      return retval;
-+}
-+
-+static struct file_operations passive_domain_ops = {
-+      .read           = pdomain_read,
-+      .write          = pdomain_write,
-+};
-+
- void oprofile_create_files(struct super_block * sb, struct dentry * root)
- {
-       oprofilefs_create_file(sb, root, "enable", &enable_fops);
-       oprofilefs_create_file_perm(sb, root, "dump", &dump_fops, 0666);
-+      oprofilefs_create_file(sb, root, "active_domains", &active_domain_ops);
-+      oprofilefs_create_file(sb, root, "passive_domains", &passive_domain_ops);
-       oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops);
-       oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size);
-       oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
---- sle11-2009-07-31.orig/fs/aio.c     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/fs/aio.c  2009-03-24 10:01:35.000000000 +0100
-@@ -36,6 +36,11 @@
- #include <asm/uaccess.h>
- #include <asm/mmu_context.h>
-+#ifdef CONFIG_EPOLL
-+#include <linux/poll.h>
-+#include <linux/eventpoll.h>
-+#endif
-+
- #if DEBUG > 1
- #define dprintk               printk
- #else
-@@ -1026,6 +1031,11 @@ put_rq:
-       if (waitqueue_active(&ctx->wait))
-               wake_up(&ctx->wait);
-+#ifdef CONFIG_EPOLL
-+      if (ctx->file && waitqueue_active(&ctx->poll_wait))
-+              wake_up(&ctx->poll_wait);
-+#endif
-+
-       spin_unlock_irqrestore(&ctx->ctx_lock, flags);
-       return ret;
- }
-@@ -1033,6 +1043,8 @@ put_rq:
- /* aio_read_evt
-  *    Pull an event off of the ioctx's event ring.  Returns the number of 
-  *    events fetched (0 or 1 ;-)
-+ *    If ent parameter is 0, just returns the number of events that would
-+ *    be fetched.
-  *    FIXME: make this use cmpxchg.
-  *    TODO: make the ringbuffer user mmap()able (requires FIXME).
-  */
-@@ -1055,13 +1067,18 @@ static int aio_read_evt(struct kioctx *i
-       head = ring->head % info->nr;
-       if (head != ring->tail) {
--              struct io_event *evp = aio_ring_event(info, head, KM_USER1);
--              *ent = *evp;
--              head = (head + 1) % info->nr;
--              smp_mb(); /* finish reading the event before updatng the head */
--              ring->head = head;
--              ret = 1;
--              put_aio_ring_event(evp, KM_USER1);
-+              if (ent) { /* event requested */
-+                      struct io_event *evp =
-+                              aio_ring_event(info, head, KM_USER1);
-+                      *ent = *evp;
-+                      head = (head + 1) % info->nr;
-+                      /* finish reading the event before updatng the head */
-+                      smp_mb();
-+                      ring->head = head;
-+                      ret = 1;
-+                      put_aio_ring_event(evp, KM_USER1);
-+              } else /* only need to know availability */
-+                      ret = 1;
-       }
-       spin_unlock(&info->ring_lock);
-@@ -1251,6 +1268,13 @@ static void io_destroy(struct kioctx *io
-       aio_cancel_all(ioctx);
-       wait_for_all_aios(ioctx);
-+#ifdef CONFIG_EPOLL
-+      /* forget the poll file, but it's up to the user to close it */
-+      if (ioctx->file) {
-+              ioctx->file->private_data = 0;
-+              ioctx->file = 0;
-+      }
-+#endif
-       /*
-        * Wake up any waiters.  The setting of ctx->dead must be seen
-@@ -1261,6 +1285,67 @@ static void io_destroy(struct kioctx *io
-       put_ioctx(ioctx);       /* once for the lookup */
- }
-+#ifdef CONFIG_EPOLL
-+
-+static int aio_queue_fd_close(struct inode *inode, struct file *file)
-+{
-+      struct kioctx *ioctx = file->private_data;
-+      if (ioctx) {
-+              file->private_data = 0;
-+              spin_lock_irq(&ioctx->ctx_lock);
-+              ioctx->file = 0;
-+              spin_unlock_irq(&ioctx->ctx_lock);
-+      }
-+      return 0;
-+}
-+
-+static unsigned int aio_queue_fd_poll(struct file *file, poll_table *wait)
-+{     unsigned int pollflags = 0;
-+      struct kioctx *ioctx = file->private_data;
-+
-+      if (ioctx) {
-+
-+              spin_lock_irq(&ioctx->ctx_lock);
-+              /* Insert inside our poll wait queue */
-+              poll_wait(file, &ioctx->poll_wait, wait);
-+
-+              /* Check our condition */
-+              if (aio_read_evt(ioctx, 0))
-+                      pollflags = POLLIN | POLLRDNORM;
-+              spin_unlock_irq(&ioctx->ctx_lock);
-+      }
-+
-+      return pollflags;
-+}
-+
-+static const struct file_operations aioq_fops = {
-+      .release        = aio_queue_fd_close,
-+      .poll           = aio_queue_fd_poll
-+};
-+
-+/* make_aio_fd:
-+ *  Create a file descriptor that can be used to poll the event queue.
-+ *  Based and piggybacked on the excellent epoll code.
-+ */
-+
-+static int make_aio_fd(struct kioctx *ioctx)
-+{
-+      int error, fd;
-+      struct inode *inode;
-+      struct file *file;
-+
-+      error = ep_getfd(&fd, &inode, &file, NULL, &aioq_fops);
-+      if (error)
-+              return error;
-+
-+      /* associate the file with the IO context */
-+      file->private_data = ioctx;
-+      ioctx->file = file;
-+      init_waitqueue_head(&ioctx->poll_wait);
-+      return fd;
-+}
-+#endif
-+
- /* sys_io_setup:
-  *    Create an aio_context capable of receiving at least nr_events.
-  *    ctxp must not point to an aio_context that already exists, and
-@@ -1273,18 +1358,30 @@ static void io_destroy(struct kioctx *io
-  *    resources are available.  May fail with -EFAULT if an invalid
-  *    pointer is passed for ctxp.  Will fail with -ENOSYS if not
-  *    implemented.
-+ *
-+ *    To request a selectable fd, the user context has to be initialized
-+ *    to 1, instead of 0, and the return value is the fd.
-+ *    This keeps the system call compatible, since a non-zero value
-+ *    was not allowed so far.
-  */
- SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
- {
-       struct kioctx *ioctx = NULL;
-       unsigned long ctx;
-       long ret;
-+      int make_fd = 0;
-       ret = get_user(ctx, ctxp);
-       if (unlikely(ret))
-               goto out;
-       ret = -EINVAL;
-+#ifdef CONFIG_EPOLL
-+      if (ctx == 1) {
-+              make_fd = 1;
-+              ctx = 0;
-+      }
-+#endif
-       if (unlikely(ctx || nr_events == 0)) {
-               pr_debug("EINVAL: io_setup: ctx %lu nr_events %u\n",
-                        ctx, nr_events);
-@@ -1295,8 +1392,12 @@ SYSCALL_DEFINE2(io_setup, unsigned, nr_e
-       ret = PTR_ERR(ioctx);
-       if (!IS_ERR(ioctx)) {
-               ret = put_user(ioctx->user_id, ctxp);
--              if (!ret)
--                      return 0;
-+#ifdef CONFIG_EPOLL
-+              if (make_fd && ret >= 0)
-+                      ret = make_aio_fd(ioctx);
-+#endif
-+              if (ret >= 0)
-+                      return ret;
-               get_ioctx(ioctx); /* io_destroy() expects us to hold a ref */
-               io_destroy(ioctx);
---- sle11-2009-07-31.orig/fs/compat_ioctl.c    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/fs/compat_ioctl.c 2009-03-24 10:01:40.000000000 +0100
-@@ -114,6 +114,13 @@
- #include <asm/fbio.h>
- #endif
-+#ifdef CONFIG_XEN
-+#include <xen/interface/xen.h>
-+#include <xen/public/evtchn.h>
-+#include <xen/public/privcmd.h>
-+#include <xen/compat_ioctl.h>
-+#endif
-+
- static int do_ioctl32_pointer(unsigned int fd, unsigned int cmd,
-                             unsigned long arg, struct file *f)
- {
-@@ -2736,6 +2743,18 @@ IGNORE_IOCTL(FBIOGETCMAP32)
- IGNORE_IOCTL(FBIOSCURSOR32)
- IGNORE_IOCTL(FBIOGCURSOR32)
- #endif
-+
-+#ifdef CONFIG_XEN
-+HANDLE_IOCTL(IOCTL_PRIVCMD_MMAP_32, privcmd_ioctl_32)
-+HANDLE_IOCTL(IOCTL_PRIVCMD_MMAPBATCH_32, privcmd_ioctl_32)
-+COMPATIBLE_IOCTL(IOCTL_PRIVCMD_HYPERCALL)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_VIRQ)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_INTERDOMAIN)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_BIND_UNBOUND_PORT)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_UNBIND)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_NOTIFY)
-+COMPATIBLE_IOCTL(IOCTL_EVTCHN_RESET)
-+#endif
- };
- #define IOCTL_HASHSIZE 256
---- sle11-2009-07-31.orig/include/acpi/processor.h     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/acpi/processor.h  2009-02-16 15:58:14.000000000 +0100
-@@ -17,6 +17,12 @@
- #define ACPI_PROCESSOR_MAX_THROTTLE   250     /* 25% */
- #define ACPI_PROCESSOR_MAX_DUTY_WIDTH 4
-+#ifdef CONFIG_XEN
-+#define NR_ACPI_CPUS                  (NR_CPUS < 256 ? 256 : NR_CPUS)
-+#else
-+#define NR_ACPI_CPUS                  NR_CPUS
-+#endif /* CONFIG_XEN */
-+
- #define ACPI_PDC_REVISION_ID          0x1
- #define ACPI_PSD_REV0_REVISION                0       /* Support for _PSD as in ACPI 3.0 */
-@@ -42,6 +48,17 @@
- struct acpi_processor_cx;
-+#ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+struct acpi_csd_package {
-+      acpi_integer num_entries;
-+      acpi_integer revision;
-+      acpi_integer domain;
-+      acpi_integer coord_type;
-+      acpi_integer num_processors;
-+      acpi_integer index;
-+} __attribute__ ((packed));
-+#endif
-+
- struct acpi_power_register {
-       u8 descriptor;
-       u16 length;
-@@ -74,6 +91,12 @@ struct acpi_processor_cx {
-       u32 power;
-       u32 usage;
-       u64 time;
-+#ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+      /* Require raw information for external control logic */
-+      struct acpi_power_register reg;
-+      u32 csd_count;
-+      struct acpi_csd_package *domain_info;
-+#endif
-       struct acpi_processor_cx_policy promotion;
-       struct acpi_processor_cx_policy demotion;
-       char desc[ACPI_CX_DESC_LEN];
-@@ -304,6 +327,9 @@ static inline void acpi_processor_ppc_ex
- {
-       return;
- }
-+#ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+int acpi_processor_ppc_has_changed(struct acpi_processor *pr);
-+#else
- static inline int acpi_processor_ppc_has_changed(struct acpi_processor *pr)
- {
-       static unsigned int printout = 1;
-@@ -316,6 +342,7 @@ static inline int acpi_processor_ppc_has
-       }
-       return 0;
- }
-+#endif                                /* CONFIG_PROCESSOR_EXTERNAL_CONTROL */
- #endif                                /* CONFIG_CPU_FREQ */
- /* in processor_throttling.c */
-@@ -352,4 +379,120 @@ static inline void acpi_thermal_cpufreq_
- }
- #endif
-+/*
-+ * Following are interfaces geared to external processor PM control
-+ * logic like a VMM
-+ */
-+/* Events notified to external control logic */
-+#define PROCESSOR_PM_INIT     1
-+#define PROCESSOR_PM_CHANGE   2
-+#define PROCESSOR_HOTPLUG     3
-+
-+/* Objects for the PM events */
-+#define PM_TYPE_IDLE          0
-+#define PM_TYPE_PERF          1
-+#define PM_TYPE_THR           2
-+#define PM_TYPE_MAX           3
-+
-+/* Processor hotplug events */
-+#define HOTPLUG_TYPE_ADD      0
-+#define HOTPLUG_TYPE_REMOVE   1
-+
-+#ifdef CONFIG_PROCESSOR_EXTERNAL_CONTROL
-+struct processor_extcntl_ops {
-+      /* Transfer processor PM events to external control logic */
-+      int (*pm_ops[PM_TYPE_MAX])(struct acpi_processor *pr, int event);
-+      /* Notify physical processor status to external control logic */
-+      int (*hotplug)(struct acpi_processor *pr, int type);
-+};
-+extern const struct processor_extcntl_ops *processor_extcntl_ops;
-+
-+static inline int processor_cntl_external(void)
-+{
-+      return (processor_extcntl_ops != NULL);
-+}
-+
-+static inline int processor_pm_external(void)
-+{
-+      return processor_cntl_external() &&
-+              (processor_extcntl_ops->pm_ops[PM_TYPE_IDLE] != NULL);
-+}
-+
-+static inline int processor_pmperf_external(void)
-+{
-+      return processor_cntl_external() &&
-+              (processor_extcntl_ops->pm_ops[PM_TYPE_PERF] != NULL);
-+}
-+
-+static inline int processor_pmthr_external(void)
-+{
-+      return processor_cntl_external() &&
-+              (processor_extcntl_ops->pm_ops[PM_TYPE_THR] != NULL);
-+}
-+
-+extern int processor_notify_external(struct acpi_processor *pr,
-+                      int event, int type);
-+extern void processor_extcntl_init(void);
-+extern int processor_extcntl_prepare(struct acpi_processor *pr);
-+extern int acpi_processor_get_performance_info(struct acpi_processor *pr);
-+extern int acpi_processor_get_psd(struct acpi_processor *pr);
-+void arch_acpi_processor_init_extcntl(const struct processor_extcntl_ops **);
-+#else
-+static inline int processor_cntl_external(void) {return 0;}
-+static inline int processor_pm_external(void) {return 0;}
-+static inline int processor_pmperf_external(void) {return 0;}
-+static inline int processor_pmthr_external(void) {return 0;}
-+static inline int processor_notify_external(struct acpi_processor *pr,
-+                      int event, int type)
-+{
-+      return 0;
-+}
-+static inline void processor_extcntl_init(void) {}
-+static inline int processor_extcntl_prepare(struct acpi_processor *pr)
-+{
-+      return 0;
-+}
-+#endif /* CONFIG_PROCESSOR_EXTERNAL_CONTROL */
-+
-+#ifdef CONFIG_XEN
-+static inline void xen_convert_pct_reg(struct xen_pct_register *xpct,
-+      struct acpi_pct_register *apct)
-+{
-+      xpct->descriptor = apct->descriptor;
-+      xpct->length     = apct->length;
-+      xpct->space_id   = apct->space_id;
-+      xpct->bit_width  = apct->bit_width;
-+      xpct->bit_offset = apct->bit_offset;
-+      xpct->reserved   = apct->reserved;
-+      xpct->address    = apct->address;
-+}
-+
-+static inline void xen_convert_pss_states(struct xen_processor_px *xpss,
-+      struct acpi_processor_px *apss, int state_count)
-+{
-+      int i;
-+      for(i=0; i<state_count; i++) {
-+              xpss->core_frequency     = apss->core_frequency;
-+              xpss->power              = apss->power;
-+              xpss->transition_latency = apss->transition_latency;
-+              xpss->bus_master_latency = apss->bus_master_latency;
-+              xpss->control            = apss->control;
-+              xpss->status             = apss->status;
-+              xpss++;
-+              apss++;
-+      }
-+}
-+
-+static inline void xen_convert_psd_pack(struct xen_psd_package *xpsd,
-+      struct acpi_psd_package *apsd)
-+{
-+      xpsd->num_entries    = apsd->num_entries;
-+      xpsd->revision       = apsd->revision;
-+      xpsd->domain         = apsd->domain;
-+      xpsd->coord_type     = apsd->coord_type;
-+      xpsd->num_processors = apsd->num_processors;
-+}
-+
-+#endif /* CONFIG_XEN */
-+
- #endif
---- sle11-2009-07-31.orig/include/asm-generic/pci.h    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/asm-generic/pci.h 2009-02-16 15:58:14.000000000 +0100
-@@ -43,7 +43,9 @@ pcibios_select_root(struct pci_dev *pdev
-       return root;
- }
-+#ifndef pcibios_scan_all_fns
- #define pcibios_scan_all_fns(a, b)    0
-+#endif
- #ifndef HAVE_ARCH_PCI_GET_LEGACY_IDE_IRQ
- static inline int pci_get_legacy_ide_irq(struct pci_dev *dev, int channel)
---- sle11-2009-07-31.orig/include/asm-generic/pgtable.h        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/asm-generic/pgtable.h     2009-02-16 15:58:14.000000000 +0100
-@@ -99,6 +99,10 @@ static inline void ptep_set_wrprotect(st
- }
- #endif
-+#ifndef arch_change_pte_range
-+#define arch_change_pte_range(mm, pmd, addr, end, newprot) 0
-+#endif
-+
- #ifndef __HAVE_ARCH_PTE_SAME
- #define pte_same(A,B) (pte_val(A) == pte_val(B))
- #endif
---- sle11-2009-07-31.orig/include/linux/aio.h  2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/aio.h       2009-02-16 15:58:14.000000000 +0100
-@@ -199,6 +199,11 @@ struct kioctx {
-       struct aio_ring_info    ring_info;
-       struct delayed_work     wq;
-+#ifdef CONFIG_EPOLL
-+      // poll integration
-+      wait_queue_head_t       poll_wait;
-+      struct file             *file;
-+#endif
- };
- /* prototypes */
---- sle11-2009-07-31.orig/include/linux/highmem.h      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/highmem.h   2009-02-16 15:58:14.000000000 +0100
-@@ -62,6 +62,7 @@ static inline void *kmap_atomic(struct p
- #endif /* CONFIG_HIGHMEM */
-+#ifndef __HAVE_ARCH_CLEAR_USER_HIGHPAGE
- /* when CONFIG_HIGHMEM is not set these will be plain clear/copy_page */
- static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
- {
-@@ -69,6 +70,7 @@ static inline void clear_user_highpage(s
-       clear_user_page(addr, vaddr, page);
-       kunmap_atomic(addr, KM_USER0);
- }
-+#endif
- #ifndef __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
- /**
-@@ -115,12 +117,14 @@ alloc_zeroed_user_highpage_movable(struc
-       return __alloc_zeroed_user_highpage(__GFP_MOVABLE, vma, vaddr);
- }
-+#ifndef __HAVE_ARCH_CLEAR_HIGHPAGE
- static inline void clear_highpage(struct page *page)
- {
-       void *kaddr = kmap_atomic(page, KM_USER0);
-       clear_page(kaddr);
-       kunmap_atomic(kaddr, KM_USER0);
- }
-+#endif
- static inline void zero_user_segments(struct page *page,
-       unsigned start1, unsigned end1,
-@@ -174,6 +178,8 @@ static inline void copy_user_highpage(st
- #endif
-+#ifndef __HAVE_ARCH_COPY_HIGHPAGE
-+
- static inline void copy_highpage(struct page *to, struct page *from)
- {
-       char *vfrom, *vto;
-@@ -185,4 +191,6 @@ static inline void copy_highpage(struct 
-       kunmap_atomic(vto, KM_USER1);
- }
-+#endif
-+
- #endif /* _LINUX_HIGHMEM_H */
---- sle11-2009-07-31.orig/include/linux/interrupt.h    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/interrupt.h 2009-02-16 15:58:14.000000000 +0100
-@@ -218,6 +218,12 @@ static inline int disable_irq_wake(unsig
- }
- #endif /* CONFIG_GENERIC_HARDIRQS */
-+#ifdef CONFIG_HAVE_IRQ_IGNORE_UNHANDLED
-+int irq_ignore_unhandled(unsigned int irq);
-+#else
-+#define irq_ignore_unhandled(irq) 0
-+#endif
-+
- #ifndef __ARCH_SET_SOFTIRQ_PENDING
- #define set_softirq_pending(x) (local_softirq_pending() = (x))
- #define or_softirq_pending(x)  (local_softirq_pending() |= (x))
---- sle11-2009-07-31.orig/include/linux/kexec.h        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/kexec.h     2009-02-16 15:58:14.000000000 +0100
-@@ -46,6 +46,13 @@
-                           KEXEC_CORE_NOTE_NAME_BYTES +                \
-                           KEXEC_CORE_NOTE_DESC_BYTES )
-+#ifndef KEXEC_ARCH_HAS_PAGE_MACROS
-+#define kexec_page_to_pfn(page)  page_to_pfn(page)
-+#define kexec_pfn_to_page(pfn)   pfn_to_page(pfn)
-+#define kexec_virt_to_phys(addr) virt_to_phys(addr)
-+#define kexec_phys_to_virt(addr) phys_to_virt(addr)
-+#endif
-+
- /*
-  * This structure is used to hold the arguments that are used when loading
-  * kernel binaries.
-@@ -108,6 +115,12 @@ struct kimage {
- extern void machine_kexec(struct kimage *image);
- extern int machine_kexec_prepare(struct kimage *image);
- extern void machine_kexec_cleanup(struct kimage *image);
-+#ifdef CONFIG_XEN
-+extern int xen_machine_kexec_load(struct kimage *image);
-+extern void xen_machine_kexec_unload(struct kimage *image);
-+extern void xen_machine_kexec_setup_resources(void);
-+extern void xen_machine_kexec_register_resources(struct resource *res);
-+#endif
- extern asmlinkage long sys_kexec_load(unsigned long entry,
-                                       unsigned long nr_segments,
-                                       struct kexec_segment __user *segments,
---- sle11-2009-07-31.orig/include/linux/mm.h   2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/mm.h        2009-06-29 15:17:31.000000000 +0200
-@@ -113,6 +113,9 @@ extern unsigned int kobjsize(const void 
- #define VM_CAN_NONLINEAR 0x08000000   /* Has ->fault & does nonlinear pages */
- #define VM_MIXEDMAP   0x10000000      /* Can contain "struct page" and pure PFN pages */
- #define VM_SAO                0x20000000      /* Strong Access Ordering (powerpc) */
-+#ifdef CONFIG_XEN
-+#define VM_FOREIGN    0x40000000      /* Has pages belonging to another VM */
-+#endif
- #define VM_PAGE_MKWRITE2 0x80000000   /* Uses page_mkwrite2 rather than page_mkwrite */
- #ifndef VM_STACK_DEFAULT_FLAGS                /* arch can override this */
-@@ -198,6 +201,11 @@ struct vm_operations_struct {
-        */
-       int (*access)(struct vm_area_struct *vma, unsigned long addr,
-                     void *buf, int len, int write);
-+
-+      /* Area-specific function for clearing the PTE at @ptep. Returns the
-+       * original value of @ptep. */
-+      pte_t (*zap_pte)(struct vm_area_struct *vma, 
-+                       unsigned long addr, pte_t *ptep, int is_fullmm);
- #ifdef CONFIG_NUMA
-       /*
-        * set_policy() op must add a reference to any non-NULL @new mempolicy
---- sle11-2009-07-31.orig/include/linux/oprofile.h     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/oprofile.h  2009-06-26 16:58:14.000000000 +0200
-@@ -16,6 +16,8 @@
- #include <linux/types.h>
- #include <linux/spinlock.h>
- #include <asm/atomic.h>
-+
-+#include <xen/interface/xenoprof.h>
-  
- /* Each escaped entry is prefixed by ESCAPE_CODE
-  * then one of the following codes, then the
-@@ -28,14 +30,18 @@
- #define CPU_SWITCH_CODE                       2
- #define COOKIE_SWITCH_CODE            3
- #define KERNEL_ENTER_SWITCH_CODE      4
--#define KERNEL_EXIT_SWITCH_CODE               5
-+#define USER_ENTER_SWITCH_CODE                5
- #define MODULE_LOADED_CODE            6
- #define CTX_TGID_CODE                 7
- #define TRACE_BEGIN_CODE              8
- #define TRACE_END_CODE                        9
- #define XEN_ENTER_SWITCH_CODE         10
-+#ifndef CONFIG_XEN
- #define SPU_PROFILING_CODE            11
- #define SPU_CTX_SWITCH_CODE           12
-+#else
-+#define DOMAIN_SWITCH_CODE            11
-+#endif
- struct super_block;
- struct dentry;
-@@ -47,6 +53,11 @@ struct oprofile_operations {
-       /* create any necessary configuration files in the oprofile fs.
-        * Optional. */
-       int (*create_files)(struct super_block * sb, struct dentry * root);
-+      /* setup active domains with Xen */
-+      int (*set_active)(int *active_domains, unsigned int adomains);
-+        /* setup passive domains with Xen */
-+        int (*set_passive)(int *passive_domains, unsigned int pdomains);
-+      
-       /* Do any necessary interrupt setup. Optional. */
-       int (*setup)(void);
-       /* Do any necessary interrupt shutdown. Optional. */
-@@ -106,6 +117,8 @@ void oprofile_add_pc(unsigned long pc, i
- /* add a backtrace entry, to be called from the ->backtrace callback */
- void oprofile_add_trace(unsigned long eip);
-+/* add a domain switch entry */
-+int oprofile_add_domain_switch(int32_t domain_id);
- /**
-  * Create a file of the given name as a child of the given root, with
---- sle11-2009-07-31.orig/include/linux/page-flags.h   2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/page-flags.h        2009-02-16 15:58:14.000000000 +0100
-@@ -98,6 +98,9 @@ enum pageflags {
- #ifdef CONFIG_IA64_UNCACHED_ALLOCATOR
-       PG_uncached,            /* Page has been mapped as uncached */
- #endif
-+#ifdef CONFIG_XEN
-+      PG_foreign,             /* Page is owned by foreign allocator. */
-+#endif
-       __NR_PAGEFLAGS,
-       /* Filesystems */
-@@ -271,6 +274,19 @@ static inline void SetPageUptodate(struc
- CLEARPAGEFLAG(Uptodate, uptodate)
-+#define PageForeign(page)     test_bit(PG_foreign, &(page)->flags)
-+#define SetPageForeign(_page, dtor) do {              \
-+      set_bit(PG_foreign, &(_page)->flags);           \
-+      BUG_ON((dtor) == (void (*)(struct page *))0);   \
-+      (_page)->index = (long)(dtor);                  \
-+} while (0)
-+#define ClearPageForeign(page) do {                   \
-+      clear_bit(PG_foreign, &(page)->flags);          \
-+      (page)->index = 0;                              \
-+} while (0)
-+#define PageForeignDestructor(_page)                  \
-+      ((void (*)(struct page *))(_page)->index)(_page)
-+
- extern void cancel_dirty_page(struct page *page, unsigned int account_size);
- int test_clear_page_writeback(struct page *page);
-@@ -341,9 +357,18 @@ PAGEFLAG(MemError, memerror)
- PAGEFLAG_FALSE(MemError)
- #endif
-+#if !defined(CONFIG_XEN)
-+# define PAGE_FLAGS_XEN 0
-+#elif defined(CONFIG_X86)
-+# define PAGE_FLAGS_XEN ((1 << PG_pinned) | (1 << PG_foreign))
-+#else
-+# define PAGE_FLAGS_XEN (1 << PG_foreign)
-+#endif
-+
- #define PAGE_FLAGS    (1 << PG_lru   | 1 << PG_private   | 1 << PG_locked | \
-                        1 << PG_buddy | 1 << PG_writeback | 1 << PG_waiters | \
--                       1 << PG_slab  | 1 << PG_swapcache | 1 << PG_active)
-+                       1 << PG_slab  | 1 << PG_swapcache | 1 << PG_active | \
-+                       PAGE_FLAGS_XEN)
- /*
-  * Flags checked in bad_page().  Pages on the free list should not have
---- sle11-2009-07-31.orig/include/linux/pci.h  2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/pci.h       2009-02-16 15:58:14.000000000 +0100
-@@ -211,6 +211,9 @@ struct pci_dev {
-        * directly, use the values stored here. They might be different!
-        */
-       unsigned int    irq;
-+#ifdef CONFIG_XEN
-+      unsigned int    irq_old;
-+#endif
-       struct resource resource[DEVICE_COUNT_RESOURCE]; /* I/O and memory regions + expansion ROMs */
-       /* These fields are used by common fixups */
-@@ -772,6 +775,11 @@ static inline int pci_msi_enabled(void)
- {
-       return 0;
- }
-+
-+#ifdef CONFIG_XEN
-+#define register_msi_get_owner(func) 0
-+#define unregister_msi_get_owner(func) 0
-+#endif
- #else
- extern int pci_enable_msi(struct pci_dev *dev);
- extern void pci_msi_shutdown(struct pci_dev *dev);
-@@ -784,6 +792,10 @@ extern void msi_remove_pci_irq_vectors(s
- extern void pci_restore_msi_state(struct pci_dev *dev);
- extern int pci_msi_enabled(void);
-+#ifdef CONFIG_XEN
-+extern int register_msi_get_owner(int (*func)(struct pci_dev *dev));
-+extern int unregister_msi_get_owner(int (*func)(struct pci_dev *dev));
-+#endif
- #endif
- #ifndef CONFIG_PCIEASPM
---- sle11-2009-07-31.orig/include/linux/skbuff.h       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/skbuff.h    2009-02-16 15:58:14.000000000 +0100
-@@ -217,6 +217,8 @@ typedef unsigned char *sk_buff_data_t;
-  *    @local_df: allow local fragmentation
-  *    @cloned: Head may be cloned (check refcnt to be sure)
-  *    @nohdr: Payload reference only, must not modify header
-+ *    @proto_data_valid: Protocol data validated since arriving at localhost
-+ *    @proto_csum_blank: Protocol csum must be added before leaving localhost
-  *    @pkt_type: Packet class
-  *    @fclone: skbuff clone status
-  *    @ip_summed: Driver fed us an IP checksum
-@@ -323,7 +325,11 @@ struct sk_buff {
- #ifdef CONFIG_NETVM
-       __u8                    emergency:1;
- #endif
--      /* 12-16 bit hole */
-+#ifdef CONFIG_XEN
-+      __u8                    proto_data_valid:1,
-+                              proto_csum_blank:1;
-+#endif
-+      /* 10-16 bit hole */
- #ifdef CONFIG_NET_DMA
-       dma_cookie_t            dma_cookie;
---- sle11-2009-07-31.orig/include/linux/vermagic.h     2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/include/linux/vermagic.h  2009-02-16 15:58:14.000000000 +0100
-@@ -22,6 +22,11 @@
- #else
- #define MODULE_VERMAGIC_MODVERSIONS ""
- #endif
-+#ifdef CONFIG_XEN
-+#define MODULE_VERMAGIC_XEN "Xen "
-+#else
-+#define MODULE_VERMAGIC_XEN
-+#endif
- #ifndef MODULE_ARCH_VERMAGIC
- #define MODULE_ARCH_VERMAGIC ""
- #endif
-@@ -30,5 +35,5 @@
-       UTS_RELEASE " "                                                 \
-       MODULE_VERMAGIC_SMP MODULE_VERMAGIC_PREEMPT                     \
-       MODULE_VERMAGIC_MODULE_UNLOAD MODULE_VERMAGIC_MODVERSIONS       \
--      MODULE_ARCH_VERMAGIC
-+      MODULE_VERMAGIC_XEN MODULE_ARCH_VERMAGIC
---- sle11-2009-07-31.orig/kernel/irq/spurious.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/kernel/irq/spurious.c     2009-02-16 15:58:14.000000000 +0100
-@@ -193,7 +193,7 @@ void note_interrupt(unsigned int irq, st
-                */
-               if (time_after(jiffies, desc->last_unhandled + HZ/10))
-                       desc->irqs_unhandled = 1;
--              else
-+              else if (!irq_ignore_unhandled(irq))
-                       desc->irqs_unhandled++;
-               desc->last_unhandled = jiffies;
-               if (unlikely(action_ret != IRQ_NONE))
---- sle11-2009-07-31.orig/kernel/kexec.c       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/kernel/kexec.c    2009-02-16 15:58:14.000000000 +0100
-@@ -359,13 +359,26 @@ static int kimage_is_destination_range(s
-       return 0;
- }
--static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order)
-+static struct page *kimage_alloc_pages(gfp_t gfp_mask, unsigned int order, unsigned long limit)
- {
-       struct page *pages;
-       pages = alloc_pages(gfp_mask, order);
-       if (pages) {
-               unsigned int count, i;
-+#ifdef CONFIG_XEN
-+              int address_bits;
-+
-+              if (limit == ~0UL)
-+                      address_bits = BITS_PER_LONG;
-+              else
-+                      address_bits = long_log2(limit);
-+
-+              if (xen_limit_pages_to_max_mfn(pages, order, address_bits) < 0) {
-+                      __free_pages(pages, order);
-+                      return NULL;
-+              }
-+#endif
-               pages->mapping = NULL;
-               set_page_private(pages, order);
-               count = 1 << order;
-@@ -384,6 +397,9 @@ static void kimage_free_pages(struct pag
-       count = 1 << order;
-       for (i = 0; i < count; i++)
-               ClearPageReserved(page + i);
-+#ifdef CONFIG_XEN
-+      xen_destroy_contiguous_region((unsigned long)page_address(page), order);
-+#endif
-       __free_pages(page, order);
- }
-@@ -429,10 +445,10 @@ static struct page *kimage_alloc_normal_
-       do {
-               unsigned long pfn, epfn, addr, eaddr;
--              pages = kimage_alloc_pages(GFP_KERNEL, order);
-+              pages = kimage_alloc_pages(GFP_KERNEL, order, KEXEC_CONTROL_MEMORY_LIMIT);
-               if (!pages)
-                       break;
--              pfn   = page_to_pfn(pages);
-+              pfn   = kexec_page_to_pfn(pages);
-               epfn  = pfn + count;
-               addr  = pfn << PAGE_SHIFT;
-               eaddr = epfn << PAGE_SHIFT;
-@@ -466,6 +482,7 @@ static struct page *kimage_alloc_normal_
-       return pages;
- }
-+#ifndef CONFIG_XEN
- static struct page *kimage_alloc_crash_control_pages(struct kimage *image,
-                                                     unsigned int order)
- {
-@@ -519,7 +536,7 @@ static struct page *kimage_alloc_crash_c
-               }
-               /* If I don't overlap any segments I have found my hole! */
-               if (i == image->nr_segments) {
--                      pages = pfn_to_page(hole_start >> PAGE_SHIFT);
-+                      pages = kexec_pfn_to_page(hole_start >> PAGE_SHIFT);
-                       break;
-               }
-       }
-@@ -546,6 +563,13 @@ struct page *kimage_alloc_control_pages(
-       return pages;
- }
-+#else /* !CONFIG_XEN */
-+struct page *kimage_alloc_control_pages(struct kimage *image,
-+                                       unsigned int order)
-+{
-+      return kimage_alloc_normal_control_pages(image, order);
-+}
-+#endif
- static int kimage_add_entry(struct kimage *image, kimage_entry_t entry)
- {
-@@ -561,7 +585,7 @@ static int kimage_add_entry(struct kimag
-                       return -ENOMEM;
-               ind_page = page_address(page);
--              *image->entry = virt_to_phys(ind_page) | IND_INDIRECTION;
-+              *image->entry = kexec_virt_to_phys(ind_page) | IND_INDIRECTION;
-               image->entry = ind_page;
-               image->last_entry = ind_page +
-                                     ((PAGE_SIZE/sizeof(kimage_entry_t)) - 1);
-@@ -620,13 +644,13 @@ static void kimage_terminate(struct kima
- #define for_each_kimage_entry(image, ptr, entry) \
-       for (ptr = &image->head; (entry = *ptr) && !(entry & IND_DONE); \
-               ptr = (entry & IND_INDIRECTION)? \
--                      phys_to_virt((entry & PAGE_MASK)): ptr +1)
-+                      kexec_phys_to_virt((entry & PAGE_MASK)): ptr +1)
- static void kimage_free_entry(kimage_entry_t entry)
- {
-       struct page *page;
--      page = pfn_to_page(entry >> PAGE_SHIFT);
-+      page = kexec_pfn_to_page(entry >> PAGE_SHIFT);
-       kimage_free_pages(page);
- }
-@@ -638,6 +662,10 @@ static void kimage_free(struct kimage *i
-       if (!image)
-               return;
-+#ifdef CONFIG_XEN
-+      xen_machine_kexec_unload(image);
-+#endif
-+
-       kimage_free_extra_pages(image);
-       for_each_kimage_entry(image, ptr, entry) {
-               if (entry & IND_INDIRECTION) {
-@@ -713,7 +741,7 @@ static struct page *kimage_alloc_page(st
-        * have a match.
-        */
-       list_for_each_entry(page, &image->dest_pages, lru) {
--              addr = page_to_pfn(page) << PAGE_SHIFT;
-+              addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
-               if (addr == destination) {
-                       list_del(&page->lru);
-                       return page;
-@@ -724,16 +752,16 @@ static struct page *kimage_alloc_page(st
-               kimage_entry_t *old;
-               /* Allocate a page, if we run out of memory give up */
--              page = kimage_alloc_pages(gfp_mask, 0);
-+              page = kimage_alloc_pages(gfp_mask, 0, KEXEC_SOURCE_MEMORY_LIMIT);
-               if (!page)
-                       return NULL;
-               /* If the page cannot be used file it away */
--              if (page_to_pfn(page) >
-+              if (kexec_page_to_pfn(page) >
-                               (KEXEC_SOURCE_MEMORY_LIMIT >> PAGE_SHIFT)) {
-                       list_add(&page->lru, &image->unuseable_pages);
-                       continue;
-               }
--              addr = page_to_pfn(page) << PAGE_SHIFT;
-+              addr = kexec_page_to_pfn(page) << PAGE_SHIFT;
-               /* If it is the destination page we want use it */
-               if (addr == destination)
-@@ -756,7 +784,7 @@ static struct page *kimage_alloc_page(st
-                       struct page *old_page;
-                       old_addr = *old & PAGE_MASK;
--                      old_page = pfn_to_page(old_addr >> PAGE_SHIFT);
-+                      old_page = kexec_pfn_to_page(old_addr >> PAGE_SHIFT);
-                       copy_highpage(page, old_page);
-                       *old = addr | (*old & ~PAGE_MASK);
-@@ -812,7 +840,7 @@ static int kimage_load_normal_segment(st
-                       result  = -ENOMEM;
-                       goto out;
-               }
--              result = kimage_add_page(image, page_to_pfn(page)
-+              result = kimage_add_page(image, kexec_page_to_pfn(page)
-                                                               << PAGE_SHIFT);
-               if (result < 0)
-                       goto out;
-@@ -844,6 +872,7 @@ out:
-       return result;
- }
-+#ifndef CONFIG_XEN
- static int kimage_load_crash_segment(struct kimage *image,
-                                       struct kexec_segment *segment)
- {
-@@ -866,7 +895,7 @@ static int kimage_load_crash_segment(str
-               char *ptr;
-               size_t uchunk, mchunk;
--              page = pfn_to_page(maddr >> PAGE_SHIFT);
-+              page = kexec_pfn_to_page(maddr >> PAGE_SHIFT);
-               if (!page) {
-                       result  = -ENOMEM;
-                       goto out;
-@@ -915,6 +944,13 @@ static int kimage_load_segment(struct ki
-       return result;
- }
-+#else /* CONFIG_XEN */
-+static int kimage_load_segment(struct kimage *image,
-+                              struct kexec_segment *segment)
-+{
-+      return kimage_load_normal_segment(image, segment);
-+}
-+#endif
- /*
-  * Exec Kernel system call: for obvious reasons only root may call it.
-@@ -1018,6 +1054,13 @@ SYSCALL_DEFINE4(kexec_load, unsigned lon
-               }
-               kimage_terminate(image);
-       }
-+#ifdef CONFIG_XEN
-+      if (image) {
-+              result = xen_machine_kexec_load(image);
-+              if (result)
-+                      goto out;
-+      }
-+#endif
-       /* Install the new kernel, and  Uninstall the old */
-       image = xchg(dest_image, image);
---- sle11-2009-07-31.orig/kernel/sysctl.c      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/kernel/sysctl.c   2009-02-16 15:58:14.000000000 +0100
-@@ -751,7 +751,7 @@ static struct ctl_table kern_table[] = {
-               .proc_handler   = &proc_dointvec,
-       },
- #endif
--#if   defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86)
-+#if defined(CONFIG_ACPI_SLEEP) && defined(CONFIG_X86) && !defined(CONFIG_ACPI_PV_SLEEP)
-       {
-               .procname       = "acpi_video_flags",
-               .data           = &acpi_realmode_flags,
---- sle11-2009-07-31.orig/mm/memory.c  2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/mm/memory.c       2009-02-16 15:58:14.000000000 +0100
-@@ -446,6 +446,12 @@ struct page *vm_normal_page(struct vm_ar
- {
-       unsigned long pfn;
-+#if defined(CONFIG_XEN) && defined(CONFIG_X86)
-+      /* XEN: Covers user-space grant mappings (even of local pages). */
-+      if (unlikely(vma->vm_flags & VM_FOREIGN))
-+              return NULL;
-+#endif
-+
-       if (HAVE_PTE_SPECIAL) {
-               if (likely(!pte_special(pte))) {
-                       VM_BUG_ON(!pfn_valid(pte_pfn(pte)));
-@@ -474,7 +480,14 @@ struct page *vm_normal_page(struct vm_ar
-               }
-       }
-+#ifndef CONFIG_XEN
-       VM_BUG_ON(!pfn_valid(pfn));
-+#else
-+      if (unlikely(!pfn_valid(pfn))) {
-+              VM_BUG_ON(!(vma->vm_flags & VM_RESERVED));
-+              return NULL;
-+      }
-+#endif
-       /*
-        * NOTE! We still have PageReserved() pages in the page tables.
-@@ -745,8 +758,12 @@ static unsigned long zap_pte_range(struc
-                                    page->index > details->last_index))
-                                       continue;
-                       }
--                      ptent = ptep_get_and_clear_full(mm, addr, pte,
--                                                      tlb->fullmm);
-+                      if (unlikely(vma->vm_ops && vma->vm_ops->zap_pte))
-+                              ptent = vma->vm_ops->zap_pte(vma, addr, pte,
-+                                                           tlb->fullmm);
-+                      else
-+                              ptent = ptep_get_and_clear_full(mm, addr, pte,
-+                                                              tlb->fullmm);
-                       tlb_remove_tlb_entry(tlb, pte, addr);
-                       if (unlikely(!page))
-                               continue;
-@@ -996,6 +1013,7 @@ unsigned long zap_page_range(struct vm_a
-               tlb_finish_mmu(tlb, address, end);
-       return end;
- }
-+EXPORT_SYMBOL(zap_page_range);
- /**
-  * zap_vma_ptes - remove ptes mapping the vma
-@@ -1193,6 +1211,26 @@ int get_user_pages(struct task_struct *t
-                       continue;
-               }
-+#ifdef CONFIG_XEN
-+              if (vma && (vma->vm_flags & VM_FOREIGN)) {
-+                      struct page **map = vma->vm_private_data;
-+                      int offset = (start - vma->vm_start) >> PAGE_SHIFT;
-+                      if (map[offset] != NULL) {
-+                              if (pages) {
-+                                      struct page *page = map[offset];
-+
-+                                      pages[i] = page;
-+                                      get_page(page);
-+                              }
-+                              if (vmas)
-+                                      vmas[i] = vma;
-+                              i++;
-+                              start += PAGE_SIZE;
-+                              len--;
-+                              continue;
-+                      }
-+              }
-+#endif
-               if (!vma || (vma->vm_flags & (VM_IO | VM_PFNMAP))
-                               || !(vm_flags & vma->vm_flags))
-                       return i ? : -EFAULT;
---- sle11-2009-07-31.orig/mm/mprotect.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/mm/mprotect.c     2009-02-16 15:58:14.000000000 +0100
-@@ -92,6 +92,8 @@ static inline void change_pmd_range(stru
-               next = pmd_addr_end(addr, end);
-               if (pmd_none_or_clear_bad(pmd))
-                       continue;
-+              if (arch_change_pte_range(mm, pmd, addr, next, newprot))
-+                      continue;
-               change_pte_range(mm, pmd, addr, next, newprot, dirty_accountable);
-       } while (pmd++, addr = next, addr != end);
- }
---- sle11-2009-07-31.orig/mm/page_alloc.c      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/mm/page_alloc.c   2009-07-31 14:50:10.000000000 +0200
-@@ -533,6 +533,12 @@ static void __free_pages_ok(struct page 
-       int i;
-       int reserved = 0;
-+#ifdef CONFIG_XEN
-+      if (PageForeign(page)) {
-+              PageForeignDestructor(page);
-+              return;
-+      }
-+#endif
-       trace_page_free(page, order);
-       for (i = 0 ; i < (1 << order) ; ++i)
-@@ -998,6 +1004,12 @@ static void free_hot_cold_page(struct pa
-       struct per_cpu_pages *pcp;
-       unsigned long flags;
-+#ifdef CONFIG_XEN
-+      if (PageForeign(page)) {
-+              PageForeignDestructor(page);
-+              return;
-+      }
-+#endif
-       trace_page_free(page, 0);
-       if (PageAnon(page))
---- sle11-2009-07-31.orig/net/core/dev.c       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/net/core/dev.c    2009-02-16 15:58:14.000000000 +0100
-@@ -131,6 +131,12 @@
- #include "net-sysfs.h"
-+#ifdef CONFIG_XEN
-+#include <net/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/udp.h>
-+#endif
-+
- /*
-  *    The list of packet types we will receive (as opposed to discard)
-  *    and the routines to invoke.
-@@ -1734,6 +1740,42 @@ static struct netdev_queue *dev_pick_tx(
-       return netdev_get_tx_queue(dev, queue_index);
- }
-+#ifdef CONFIG_XEN
-+inline int skb_checksum_setup(struct sk_buff *skb)
-+{
-+      if (skb->proto_csum_blank) {
-+              if (skb->protocol != htons(ETH_P_IP))
-+                      goto out;
-+              skb->h.raw = (unsigned char *)skb->nh.iph + 4*skb->nh.iph->ihl;
-+              if (skb->h.raw >= skb->tail)
-+                      goto out;
-+              switch (skb->nh.iph->protocol) {
-+              case IPPROTO_TCP:
-+                      skb->csum = offsetof(struct tcphdr, check);
-+                      break;
-+              case IPPROTO_UDP:
-+                      skb->csum = offsetof(struct udphdr, check);
-+                      break;
-+              default:
-+                      if (net_ratelimit())
-+                              printk(KERN_ERR "Attempting to checksum a non-"
-+                                     "TCP/UDP packet, dropping a protocol"
-+                                     " %d packet", skb->nh.iph->protocol);
-+                      goto out;
-+              }
-+              if ((skb->h.raw + skb->csum + 2) > skb->tail)
-+                      goto out;
-+              skb->ip_summed = CHECKSUM_HW;
-+              skb->proto_csum_blank = 0;
-+      }
-+      return 0;
-+out:
-+      return -EPROTO;
-+}
-+#else
-+inline int skb_checksum_setup(struct sk_buff *skb) { return 0; }
-+#endif
-+
- /**
-  *    dev_queue_xmit - transmit a buffer
-  *    @skb: buffer to transmit
-@@ -1766,6 +1808,12 @@ int dev_queue_xmit(struct sk_buff *skb)
-       struct Qdisc *q;
-       int rc = -ENOMEM;
-+      /* If a checksum-deferred packet is forwarded to a device that needs a
-+       * checksum, correct the pointers and force checksumming.
-+       */
-+      if (skb_checksum_setup(skb))
-+              goto out_kfree_skb;
-+
-       /* GSO will handle the following emulations directly. */
-       if (netif_needs_gso(dev, skb))
-               goto gso;
-@@ -2274,6 +2322,19 @@ int netif_receive_skb(struct sk_buff *sk
-       }
- #endif
-+#ifdef CONFIG_XEN
-+      switch (skb->ip_summed) {
-+      case CHECKSUM_UNNECESSARY:
-+              skb->proto_data_valid = 1;
-+              break;
-+      case CHECKSUM_HW:
-+              /* XXX Implement me. */
-+      default:
-+              skb->proto_data_valid = 0;
-+              break;
-+      }
-+#endif
-+
-       if (skb_emergency(skb))
-               goto skip_taps;
-@@ -4928,6 +4989,7 @@ EXPORT_SYMBOL(unregister_netdevice_notif
- EXPORT_SYMBOL(net_enable_timestamp);
- EXPORT_SYMBOL(net_disable_timestamp);
- EXPORT_SYMBOL(dev_get_flags);
-+EXPORT_SYMBOL(skb_checksum_setup);
- #if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)
- EXPORT_SYMBOL(br_handle_frame_hook);
---- sle11-2009-07-31.orig/net/core/skbuff.c    2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/net/core/skbuff.c 2009-02-16 15:58:14.000000000 +0100
-@@ -555,6 +555,10 @@ static struct sk_buff *__skb_clone(struc
-       n->hdr_len = skb->nohdr ? skb_headroom(skb) : skb->hdr_len;
-       n->cloned = 1;
-       n->nohdr = 0;
-+#ifdef CONFIG_XEN
-+      C(proto_data_valid);
-+      C(proto_csum_blank);
-+#endif
-       n->destructor = NULL;
-       C(iif);
-       C(tail);
---- sle11-2009-07-31.orig/net/ipv4/netfilter/nf_nat_proto_tcp.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/net/ipv4/netfilter/nf_nat_proto_tcp.c     2009-02-16 15:58:14.000000000 +0100
-@@ -75,6 +75,9 @@ tcp_manip_pkt(struct sk_buff *skb,
-       if (hdrsize < sizeof(*hdr))
-               return true;
-+      if (skb_checksum_setup(skb))
-+              return false;
-+
-       inet_proto_csum_replace4(&hdr->check, skb, oldip, newip, 1);
-       inet_proto_csum_replace2(&hdr->check, skb, oldport, newport, 0);
-       return true;
---- sle11-2009-07-31.orig/net/ipv4/netfilter/nf_nat_proto_udp.c        2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/net/ipv4/netfilter/nf_nat_proto_udp.c     2009-02-16 15:58:14.000000000 +0100
-@@ -60,6 +60,10 @@ udp_manip_pkt(struct sk_buff *skb,
-               newport = tuple->dst.u.udp.port;
-               portptr = &hdr->dest;
-       }
-+
-+      if (skb_checksum_setup(skb))
-+              return false;
-+
-       if (hdr->check || skb->ip_summed == CHECKSUM_PARTIAL) {
-               inet_proto_csum_replace4(&hdr->check, skb, oldip, newip, 1);
-               inet_proto_csum_replace2(&hdr->check, skb, *portptr, newport,
---- sle11-2009-07-31.orig/net/ipv4/xfrm4_output.c      2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/net/ipv4/xfrm4_output.c   2009-02-16 15:58:14.000000000 +0100
-@@ -81,7 +81,7 @@ static int xfrm4_output_finish(struct sk
- #endif
-       skb->protocol = htons(ETH_P_IP);
--      return xfrm_output(skb);
-+      return skb_checksum_setup(skb) ?: xfrm_output(skb);
- }
- int xfrm4_output(struct sk_buff *skb)
---- sle11-2009-07-31.orig/scripts/Makefile.build       2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/scripts/Makefile.build    2009-02-16 15:58:14.000000000 +0100
-@@ -73,6 +73,20 @@ ifndef obj
- $(warning kbuild: Makefile.build is included improperly)
- endif
-+ifeq ($(CONFIG_XEN),y)
-+$(objtree)/scripts/Makefile.xen: $(srctree)/scripts/Makefile.xen.awk $(srctree)/scripts/Makefile.build
-+      @echo '  Updating $@'
-+      $(if $(shell echo a | $(AWK) '{ print gensub(/a/, "AA", "g"); }'),\
-+        ,$(error 'Your awk program does not define gensub.  Use gawk or another awk with gensub'))
-+      @$(AWK) -f $< $(filter-out $<,$^) >$@
-+
-+xen-src-single-used-m := $(patsubst $(srctree)/%,%,$(wildcard $(addprefix $(srctree)/,$(single-used-m:.o=-xen.c))))
-+xen-single-used-m     := $(xen-src-single-used-m:-xen.c=.o)
-+single-used-m         := $(filter-out $(xen-single-used-m),$(single-used-m))
-+
-+-include $(objtree)/scripts/Makefile.xen
-+endif
-+
- # ===========================================================================
- ifneq ($(strip $(lib-y) $(lib-m) $(lib-n) $(lib-)),)
---- sle11-2009-07-31.orig/scripts/Makefile.lib 2009-07-31 14:49:21.000000000 +0200
-+++ sle11-2009-07-31/scripts/Makefile.lib      2009-02-16 15:58:14.000000000 +0100
-@@ -17,6 +17,12 @@ obj-m := $(filter-out $(obj-y),$(obj-m))
- lib-y := $(filter-out $(obj-y), $(sort $(lib-y) $(lib-m)))
-+# Remove objects forcibly disabled
-+
-+obj-y := $(filter-out $(disabled-obj-y),$(obj-y))
-+obj-m := $(filter-out $(disabled-obj-y),$(obj-m))
-+lib-y := $(filter-out $(disabled-obj-y),$(lib-y))
-+
- # Handle objects in subdirs
- # ---------------------------------------------------------------------------
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-include-xen-interface.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-include-xen-interface.diff
deleted file mode 100644 (file)
index dadda2c..0000000
+++ /dev/null
@@ -1,5161 +0,0 @@
-Subject: xen3 include-xen-interface
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-Index: head-2008-11-25/include/xen/interface/COPYING
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/COPYING      2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,38 @@
-+XEN NOTICE
-+==========
-+
-+This copyright applies to all files within this subdirectory and its
-+subdirectories:
-+  include/public/*.h
-+  include/public/hvm/*.h
-+  include/public/io/*.h
-+
-+The intention is that these files can be freely copied into the source
-+tree of an operating system when porting that OS to run on Xen. Doing
-+so does *not* cause the OS to become subject to the terms of the GPL.
-+
-+All other files in the Xen source distribution are covered by version
-+2 of the GNU General Public License except where explicitly stated
-+otherwise within individual source files.
-+
-+ -- Keir Fraser (on behalf of the Xen team)
-+
-+=====================================================================
-+
-+Permission is hereby granted, free of charge, to any person obtaining a copy
-+of this software and associated documentation files (the "Software"), to
-+deal in the Software without restriction, including without limitation the
-+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+sell copies of the Software, and to permit persons to whom the Software is
-+furnished to do so, subject to the following conditions:
-+
-+The above copyright notice and this permission notice shall be included in
-+all copies or substantial portions of the Software.
-+
-+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
-+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
-+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 
-+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 
-+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 
-+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
-+DEALINGS IN THE SOFTWARE.
-Index: head-2008-11-25/include/xen/interface/arch-x86/cpuid.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/cpuid.h     2008-01-21 11:15:27.000000000 +0100
-@@ -0,0 +1,68 @@
-+/******************************************************************************
-+ * arch-x86/cpuid.h
-+ * 
-+ * CPUID interface to Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ * 
-+ * Copyright (c) 2007 Citrix Systems, Inc.
-+ * 
-+ * Authors:
-+ *    Keir Fraser <keir.fraser@citrix.com>
-+ */
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_CPUID_H__
-+#define __XEN_PUBLIC_ARCH_X86_CPUID_H__
-+
-+/* Xen identification leaves start at 0x40000000. */
-+#define XEN_CPUID_FIRST_LEAF 0x40000000
-+#define XEN_CPUID_LEAF(i)    (XEN_CPUID_FIRST_LEAF + (i))
-+
-+/*
-+ * Leaf 1 (0x40000000)
-+ * EAX: Largest Xen-information leaf. All leaves up to an including @EAX
-+ *      are supported by the Xen host.
-+ * EBX-EDX: "XenVMMXenVMM" signature, allowing positive identification
-+ *      of a Xen host.
-+ */
-+#define XEN_CPUID_SIGNATURE_EBX 0x566e6558 /* "XenV" */
-+#define XEN_CPUID_SIGNATURE_ECX 0x65584d4d /* "MMXe" */
-+#define XEN_CPUID_SIGNATURE_EDX 0x4d4d566e /* "nVMM" */
-+
-+/*
-+ * Leaf 2 (0x40000001)
-+ * EAX[31:16]: Xen major version.
-+ * EAX[15: 0]: Xen minor version.
-+ * EBX-EDX: Reserved (currently all zeroes).
-+ */
-+
-+/*
-+ * Leaf 3 (0x40000002)
-+ * EAX: Number of hypercall transfer pages. This register is always guaranteed
-+ *      to specify one hypercall page.
-+ * EBX: Base address of Xen-specific MSRs.
-+ * ECX: Features 1. Unused bits are set to zero.
-+ * EDX: Features 2. Unused bits are set to zero.
-+ */
-+
-+/* Does the host support MMU_PT_UPDATE_PRESERVE_AD for this guest? */
-+#define _XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD 0
-+#define XEN_CPUID_FEAT1_MMU_PT_UPDATE_PRESERVE_AD  (1u<<0)
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_CPUID_H__ */
-Index: head-2008-11-25/include/xen/interface/arch-x86/hvm/save.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/hvm/save.h  2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,440 @@
-+/* 
-+ * Structure definitions for HVM state that is held by Xen and must
-+ * be saved along with the domain's memory and device-model state.
-+ * 
-+ * Copyright (c) 2007 XenSource Ltd.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_SAVE_X86_H__
-+#define __XEN_PUBLIC_HVM_SAVE_X86_H__
-+
-+/* 
-+ * Save/restore header: general info about the save file. 
-+ */
-+
-+#define HVM_FILE_MAGIC   0x54381286
-+#define HVM_FILE_VERSION 0x00000001
-+
-+struct hvm_save_header {
-+    uint32_t magic;             /* Must be HVM_FILE_MAGIC */
-+    uint32_t version;           /* File format version */
-+    uint64_t changeset;         /* Version of Xen that saved this file */
-+    uint32_t cpuid;             /* CPUID[0x01][%eax] on the saving machine */
-+    uint32_t pad0;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(HEADER, 1, struct hvm_save_header);
-+
-+
-+/*
-+ * Processor
-+ */
-+
-+struct hvm_hw_cpu {
-+    uint8_t  fpu_regs[512];
-+
-+    uint64_t rax;
-+    uint64_t rbx;
-+    uint64_t rcx;
-+    uint64_t rdx;
-+    uint64_t rbp;
-+    uint64_t rsi;
-+    uint64_t rdi;
-+    uint64_t rsp;
-+    uint64_t r8;
-+    uint64_t r9;
-+    uint64_t r10;
-+    uint64_t r11;
-+    uint64_t r12;
-+    uint64_t r13;
-+    uint64_t r14;
-+    uint64_t r15;
-+
-+    uint64_t rip;
-+    uint64_t rflags;
-+
-+    uint64_t cr0;
-+    uint64_t cr2;
-+    uint64_t cr3;
-+    uint64_t cr4;
-+
-+    uint64_t dr0;
-+    uint64_t dr1;
-+    uint64_t dr2;
-+    uint64_t dr3;
-+    uint64_t dr6;
-+    uint64_t dr7;    
-+
-+    uint32_t cs_sel;
-+    uint32_t ds_sel;
-+    uint32_t es_sel;
-+    uint32_t fs_sel;
-+    uint32_t gs_sel;
-+    uint32_t ss_sel;
-+    uint32_t tr_sel;
-+    uint32_t ldtr_sel;
-+
-+    uint32_t cs_limit;
-+    uint32_t ds_limit;
-+    uint32_t es_limit;
-+    uint32_t fs_limit;
-+    uint32_t gs_limit;
-+    uint32_t ss_limit;
-+    uint32_t tr_limit;
-+    uint32_t ldtr_limit;
-+    uint32_t idtr_limit;
-+    uint32_t gdtr_limit;
-+
-+    uint64_t cs_base;
-+    uint64_t ds_base;
-+    uint64_t es_base;
-+    uint64_t fs_base;
-+    uint64_t gs_base;
-+    uint64_t ss_base;
-+    uint64_t tr_base;
-+    uint64_t ldtr_base;
-+    uint64_t idtr_base;
-+    uint64_t gdtr_base;
-+
-+    uint32_t cs_arbytes;
-+    uint32_t ds_arbytes;
-+    uint32_t es_arbytes;
-+    uint32_t fs_arbytes;
-+    uint32_t gs_arbytes;
-+    uint32_t ss_arbytes;
-+    uint32_t tr_arbytes;
-+    uint32_t ldtr_arbytes;
-+
-+    uint32_t sysenter_cs;
-+    uint32_t padding0;
-+
-+    uint64_t sysenter_esp;
-+    uint64_t sysenter_eip;
-+
-+    /* msr for em64t */
-+    uint64_t shadow_gs;
-+
-+    /* msr content saved/restored. */
-+    uint64_t msr_flags;
-+    uint64_t msr_lstar;
-+    uint64_t msr_star;
-+    uint64_t msr_cstar;
-+    uint64_t msr_syscall_mask;
-+    uint64_t msr_efer;
-+
-+    /* guest's idea of what rdtsc() would return */
-+    uint64_t tsc;
-+
-+    /* pending event, if any */
-+    union {
-+        uint32_t pending_event;
-+        struct {
-+            uint8_t  pending_vector:8;
-+            uint8_t  pending_type:3;
-+            uint8_t  pending_error_valid:1;
-+            uint32_t pending_reserved:19;
-+            uint8_t  pending_valid:1;
-+        };
-+    };
-+    /* error code for pending event */
-+    uint32_t error_code;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(CPU, 2, struct hvm_hw_cpu);
-+
-+
-+/*
-+ * PIC
-+ */
-+
-+struct hvm_hw_vpic {
-+    /* IR line bitmasks. */
-+    uint8_t irr;
-+    uint8_t imr;
-+    uint8_t isr;
-+
-+    /* Line IRx maps to IRQ irq_base+x */
-+    uint8_t irq_base;
-+
-+    /*
-+     * Where are we in ICW2-4 initialisation (0 means no init in progress)?
-+     * Bits 0-1 (=x): Next write at A=1 sets ICW(x+1).
-+     * Bit 2: ICW1.IC4  (1 == ICW4 included in init sequence)
-+     * Bit 3: ICW1.SNGL (0 == ICW3 included in init sequence)
-+     */
-+    uint8_t init_state:4;
-+
-+    /* IR line with highest priority. */
-+    uint8_t priority_add:4;
-+
-+    /* Reads from A=0 obtain ISR or IRR? */
-+    uint8_t readsel_isr:1;
-+
-+    /* Reads perform a polling read? */
-+    uint8_t poll:1;
-+
-+    /* Automatically clear IRQs from the ISR during INTA? */
-+    uint8_t auto_eoi:1;
-+
-+    /* Automatically rotate IRQ priorities during AEOI? */
-+    uint8_t rotate_on_auto_eoi:1;
-+
-+    /* Exclude slave inputs when considering in-service IRQs? */
-+    uint8_t special_fully_nested_mode:1;
-+
-+    /* Special mask mode excludes masked IRs from AEOI and priority checks. */
-+    uint8_t special_mask_mode:1;
-+
-+    /* Is this a master PIC or slave PIC? (NB. This is not programmable.) */
-+    uint8_t is_master:1;
-+
-+    /* Edge/trigger selection. */
-+    uint8_t elcr;
-+
-+    /* Virtual INT output. */
-+    uint8_t int_output;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(PIC, 3, struct hvm_hw_vpic);
-+
-+
-+/*
-+ * IO-APIC
-+ */
-+
-+#ifdef __ia64__
-+#define VIOAPIC_IS_IOSAPIC 1
-+#define VIOAPIC_NUM_PINS  24
-+#else
-+#define VIOAPIC_NUM_PINS  48 /* 16 ISA IRQs, 32 non-legacy PCI IRQS. */
-+#endif
-+
-+struct hvm_hw_vioapic {
-+    uint64_t base_address;
-+    uint32_t ioregsel;
-+    uint32_t id;
-+    union vioapic_redir_entry
-+    {
-+        uint64_t bits;
-+        struct {
-+            uint8_t vector;
-+            uint8_t delivery_mode:3;
-+            uint8_t dest_mode:1;
-+            uint8_t delivery_status:1;
-+            uint8_t polarity:1;
-+            uint8_t remote_irr:1;
-+            uint8_t trig_mode:1;
-+            uint8_t mask:1;
-+            uint8_t reserve:7;
-+#if !VIOAPIC_IS_IOSAPIC
-+            uint8_t reserved[4];
-+            uint8_t dest_id;
-+#else
-+            uint8_t reserved[3];
-+            uint16_t dest_id;
-+#endif
-+        } fields;
-+    } redirtbl[VIOAPIC_NUM_PINS];
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(IOAPIC, 4, struct hvm_hw_vioapic);
-+
-+
-+/*
-+ * LAPIC
-+ */
-+
-+struct hvm_hw_lapic {
-+    uint64_t             apic_base_msr;
-+    uint32_t             disabled; /* VLAPIC_xx_DISABLED */
-+    uint32_t             timer_divisor;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(LAPIC, 5, struct hvm_hw_lapic);
-+
-+struct hvm_hw_lapic_regs {
-+    uint8_t data[1024];
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(LAPIC_REGS, 6, struct hvm_hw_lapic_regs);
-+
-+
-+/*
-+ * IRQs
-+ */
-+
-+struct hvm_hw_pci_irqs {
-+    /*
-+     * Virtual interrupt wires for a single PCI bus.
-+     * Indexed by: device*4 + INTx#.
-+     */
-+    union {
-+        DECLARE_BITMAP(i, 32*4);
-+        uint64_t pad[2];
-+    };
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(PCI_IRQ, 7, struct hvm_hw_pci_irqs);
-+
-+struct hvm_hw_isa_irqs {
-+    /*
-+     * Virtual interrupt wires for ISA devices.
-+     * Indexed by ISA IRQ (assumes no ISA-device IRQ sharing).
-+     */
-+    union {
-+        DECLARE_BITMAP(i, 16);
-+        uint64_t pad[1];
-+    };
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(ISA_IRQ, 8, struct hvm_hw_isa_irqs);
-+
-+struct hvm_hw_pci_link {
-+    /*
-+     * PCI-ISA interrupt router.
-+     * Each PCI <device:INTx#> is 'wire-ORed' into one of four links using
-+     * the traditional 'barber's pole' mapping ((device + INTx#) & 3).
-+     * The router provides a programmable mapping from each link to a GSI.
-+     */
-+    uint8_t route[4];
-+    uint8_t pad0[4];
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(PCI_LINK, 9, struct hvm_hw_pci_link);
-+
-+/* 
-+ *  PIT
-+ */
-+
-+struct hvm_hw_pit {
-+    struct hvm_hw_pit_channel {
-+        uint32_t count; /* can be 65536 */
-+        uint16_t latched_count;
-+        uint8_t count_latched;
-+        uint8_t status_latched;
-+        uint8_t status;
-+        uint8_t read_state;
-+        uint8_t write_state;
-+        uint8_t write_latch;
-+        uint8_t rw_mode;
-+        uint8_t mode;
-+        uint8_t bcd; /* not supported */
-+        uint8_t gate; /* timer start */
-+    } channels[3];  /* 3 x 16 bytes */
-+    uint32_t speaker_data_on;
-+    uint32_t pad0;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(PIT, 10, struct hvm_hw_pit);
-+
-+
-+/* 
-+ * RTC
-+ */ 
-+
-+#define RTC_CMOS_SIZE 14
-+struct hvm_hw_rtc {
-+    /* CMOS bytes */
-+    uint8_t cmos_data[RTC_CMOS_SIZE];
-+    /* Index register for 2-part operations */
-+    uint8_t cmos_index;
-+    uint8_t pad0;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(RTC, 11, struct hvm_hw_rtc);
-+
-+
-+/*
-+ * HPET
-+ */
-+
-+#define HPET_TIMER_NUM     3    /* 3 timers supported now */
-+struct hvm_hw_hpet {
-+    /* Memory-mapped, software visible registers */
-+    uint64_t capability;        /* capabilities */
-+    uint64_t res0;              /* reserved */
-+    uint64_t config;            /* configuration */
-+    uint64_t res1;              /* reserved */
-+    uint64_t isr;               /* interrupt status reg */
-+    uint64_t res2[25];          /* reserved */
-+    uint64_t mc64;              /* main counter */
-+    uint64_t res3;              /* reserved */
-+    struct {                    /* timers */
-+        uint64_t config;        /* configuration/cap */
-+        uint64_t cmp;           /* comparator */
-+        uint64_t fsb;           /* FSB route, not supported now */
-+        uint64_t res4;          /* reserved */
-+    } timers[HPET_TIMER_NUM];
-+    uint64_t res5[4*(24-HPET_TIMER_NUM)];  /* reserved, up to 0x3ff */
-+
-+    /* Hidden register state */
-+    uint64_t period[HPET_TIMER_NUM]; /* Last value written to comparator */
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(HPET, 12, struct hvm_hw_hpet);
-+
-+
-+/*
-+ * PM timer
-+ */
-+
-+struct hvm_hw_pmtimer {
-+    uint32_t tmr_val;   /* PM_TMR_BLK.TMR_VAL: 32bit free-running counter */
-+    uint16_t pm1a_sts;  /* PM1a_EVT_BLK.PM1a_STS: status register */
-+    uint16_t pm1a_en;   /* PM1a_EVT_BLK.PM1a_EN: enable register */
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(PMTIMER, 13, struct hvm_hw_pmtimer);
-+
-+/*
-+ * MTRR MSRs
-+ */
-+
-+struct hvm_hw_mtrr {
-+#define MTRR_VCNT 8
-+#define NUM_FIXED_MSR 11
-+    uint64_t msr_pat_cr;
-+    /* mtrr physbase & physmask msr pair*/
-+    uint64_t msr_mtrr_var[MTRR_VCNT*2];
-+    uint64_t msr_mtrr_fixed[NUM_FIXED_MSR];
-+    uint64_t msr_mtrr_cap;
-+    uint64_t msr_mtrr_def_type;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(MTRR, 14, struct hvm_hw_mtrr);
-+
-+/*
-+ * Viridian hypervisor context.
-+ */
-+
-+struct hvm_viridian_context {
-+    uint64_t hypercall_gpa;
-+    uint64_t guest_os_id;
-+};
-+
-+DECLARE_HVM_SAVE_TYPE(VIRIDIAN, 15, struct hvm_viridian_context);
-+
-+/* 
-+ * Largest type-code in use
-+ */
-+#define HVM_SAVE_CODE_MAX 15
-+
-+#endif /* __XEN_PUBLIC_HVM_SAVE_X86_H__ */
-Index: head-2008-11-25/include/xen/interface/arch-x86/xen-mca.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/xen-mca.h   2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,279 @@
-+/******************************************************************************
-+ * arch-x86/mca.h
-+ * 
-+ * Contributed by Advanced Micro Devices, Inc.
-+ * Author: Christoph Egger <Christoph.Egger@amd.com>
-+ *
-+ * Guest OS machine check interface to x86 Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+/* Full MCA functionality has the following Usecases from the guest side:
-+ *
-+ * Must have's:
-+ * 1. Dom0 and DomU register machine check trap callback handlers
-+ *    (already done via "set_trap_table" hypercall)
-+ * 2. Dom0 registers machine check event callback handler
-+ *    (doable via EVTCHNOP_bind_virq)
-+ * 3. Dom0 and DomU fetches machine check data
-+ * 4. Dom0 wants Xen to notify a DomU
-+ * 5. Dom0 gets DomU ID from physical address
-+ * 6. Dom0 wants Xen to kill DomU (already done for "xm destroy")
-+ *
-+ * Nice to have's:
-+ * 7. Dom0 wants Xen to deactivate a physical CPU
-+ *    This is better done as separate task, physical CPU hotplugging,
-+ *    and hypercall(s) should be sysctl's
-+ * 8. Page migration proposed from Xen NUMA work, where Dom0 can tell Xen to
-+ *    move a DomU (or Dom0 itself) away from a malicious page
-+ *    producing correctable errors.
-+ * 9. offlining physical page:
-+ *    Xen free's and never re-uses a certain physical page.
-+ * 10. Testfacility: Allow Dom0 to write values into machine check MSR's
-+ *     and tell Xen to trigger a machine check
-+ */
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_MCA_H__
-+#define __XEN_PUBLIC_ARCH_X86_MCA_H__
-+
-+/* Hypercall */
-+#define __HYPERVISOR_mca __HYPERVISOR_arch_0
-+
-+#define XEN_MCA_INTERFACE_VERSION 0x03000001
-+
-+/* IN: Dom0 calls hypercall from MC event handler. */
-+#define XEN_MC_CORRECTABLE  0x0
-+/* IN: Dom0/DomU calls hypercall from MC trap handler. */
-+#define XEN_MC_TRAP         0x1
-+/* XEN_MC_CORRECTABLE and XEN_MC_TRAP are mutually exclusive. */
-+
-+/* OUT: All is ok */
-+#define XEN_MC_OK           0x0
-+/* OUT: Domain could not fetch data. */
-+#define XEN_MC_FETCHFAILED  0x1
-+/* OUT: There was no machine check data to fetch. */
-+#define XEN_MC_NODATA       0x2
-+/* OUT: Between notification time and this hypercall an other
-+ *  (most likely) correctable error happened. The fetched data,
-+ *  does not match the original machine check data. */
-+#define XEN_MC_NOMATCH      0x4
-+
-+/* OUT: DomU did not register MC NMI handler. Try something else. */
-+#define XEN_MC_CANNOTHANDLE 0x8
-+/* OUT: Notifying DomU failed. Retry later or try something else. */
-+#define XEN_MC_NOTDELIVERED 0x10
-+/* Note, XEN_MC_CANNOTHANDLE and XEN_MC_NOTDELIVERED are mutually exclusive. */
-+
-+
-+#ifndef __ASSEMBLY__
-+
-+#define VIRQ_MCA VIRQ_ARCH_0 /* G. (DOM0) Machine Check Architecture */
-+
-+/*
-+ * Machine Check Architecure:
-+ * structs are read-only and used to report all kinds of
-+ * correctable and uncorrectable errors detected by the HW.
-+ * Dom0 and DomU: register a handler to get notified.
-+ * Dom0 only: Correctable errors are reported via VIRQ_MCA
-+ * Dom0 and DomU: Uncorrectable errors are reported via nmi handlers
-+ */
-+#define MC_TYPE_GLOBAL          0
-+#define MC_TYPE_BANK            1
-+#define MC_TYPE_EXTENDED        2
-+
-+struct mcinfo_common {
-+    uint16_t type;      /* structure type */
-+    uint16_t size;      /* size of this struct in bytes */
-+};
-+
-+
-+#define MC_FLAG_CORRECTABLE     (1 << 0)
-+#define MC_FLAG_UNCORRECTABLE   (1 << 1)
-+
-+/* contains global x86 mc information */
-+struct mcinfo_global {
-+    struct mcinfo_common common;
-+
-+    /* running domain at the time in error (most likely the impacted one) */
-+    uint16_t mc_domid;
-+    uint32_t mc_socketid; /* physical socket of the physical core */
-+    uint16_t mc_coreid; /* physical impacted core */
-+    uint16_t mc_core_threadid; /* core thread of physical core */
-+    uint16_t mc_vcpuid; /* virtual cpu scheduled for mc_domid */
-+    uint64_t mc_gstatus; /* global status */
-+    uint32_t mc_flags;
-+};
-+
-+/* contains bank local x86 mc information */
-+struct mcinfo_bank {
-+    struct mcinfo_common common;
-+
-+    uint16_t mc_bank; /* bank nr */
-+    uint16_t mc_domid; /* Usecase 5: domain referenced by mc_addr on dom0
-+                        * and if mc_addr is valid. Never valid on DomU. */
-+    uint64_t mc_status; /* bank status */
-+    uint64_t mc_addr;   /* bank address, only valid
-+                         * if addr bit is set in mc_status */
-+    uint64_t mc_misc;
-+};
-+
-+
-+struct mcinfo_msr {
-+    uint64_t reg;   /* MSR */
-+    uint64_t value; /* MSR value */
-+};
-+
-+/* contains mc information from other
-+ * or additional mc MSRs */ 
-+struct mcinfo_extended {
-+    struct mcinfo_common common;
-+
-+    /* You can fill up to five registers.
-+     * If you need more, then use this structure
-+     * multiple times. */
-+
-+    uint32_t mc_msrs; /* Number of msr with valid values. */
-+    struct mcinfo_msr mc_msr[5];
-+};
-+
-+#define MCINFO_HYPERCALLSIZE  1024
-+#define MCINFO_MAXSIZE                768
-+
-+struct mc_info {
-+    /* Number of mcinfo_* entries in mi_data */
-+    uint32_t mi_nentries;
-+
-+    uint8_t mi_data[MCINFO_MAXSIZE - sizeof(uint32_t)];
-+};
-+typedef struct mc_info mc_info_t;
-+
-+
-+
-+/* 
-+ * OS's should use these instead of writing their own lookup function
-+ * each with its own bugs and drawbacks.
-+ * We use macros instead of static inline functions to allow guests
-+ * to include this header in assembly files (*.S).
-+ */
-+/* Prototype:
-+ *    uint32_t x86_mcinfo_nentries(struct mc_info *mi);
-+ */
-+#define x86_mcinfo_nentries(_mi)    \
-+    (_mi)->mi_nentries
-+/* Prototype:
-+ *    struct mcinfo_common *x86_mcinfo_first(struct mc_info *mi);
-+ */
-+#define x86_mcinfo_first(_mi)       \
-+    (struct mcinfo_common *)((_mi)->mi_data)
-+/* Prototype:
-+ *    struct mcinfo_common *x86_mcinfo_next(struct mcinfo_common *mic);
-+ */
-+#define x86_mcinfo_next(_mic)       \
-+    (struct mcinfo_common *)((uint8_t *)(_mic) + (_mic)->size)
-+
-+/* Prototype:
-+ *    void x86_mcinfo_lookup(void *ret, struct mc_info *mi, uint16_t type);
-+ */
-+#define x86_mcinfo_lookup(_ret, _mi, _type)    \
-+    do {                                                        \
-+        uint32_t found, i;                                      \
-+        struct mcinfo_common *_mic;                             \
-+                                                                \
-+        found = 0;                                              \
-+      (_ret) = NULL;                                          \
-+      if (_mi == NULL) break;                                 \
-+        _mic = x86_mcinfo_first(_mi);                           \
-+        for (i = 0; i < x86_mcinfo_nentries(_mi); i++) {        \
-+            if (_mic->type == (_type)) {                        \
-+                found = 1;                                      \
-+                break;                                          \
-+            }                                                   \
-+            _mic = x86_mcinfo_next(_mic);                       \
-+        }                                                       \
-+        (_ret) = found ? _mic : NULL;                           \
-+    } while (0)
-+
-+
-+/* Usecase 1
-+ * Register machine check trap callback handler
-+ *    (already done via "set_trap_table" hypercall)
-+ */
-+
-+/* Usecase 2
-+ * Dom0 registers machine check event callback handler
-+ * done by EVTCHNOP_bind_virq
-+ */
-+
-+/* Usecase 3
-+ * Fetch machine check data from hypervisor.
-+ * Note, this hypercall is special, because both Dom0 and DomU must use this.
-+ */
-+#define XEN_MC_fetch            1
-+struct xen_mc_fetch {
-+    /* IN/OUT variables. */
-+    uint32_t flags;
-+
-+/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */
-+/* OUT: XEN_MC_OK, XEN_MC_FETCHFAILED, XEN_MC_NODATA, XEN_MC_NOMATCH */
-+
-+    /* OUT variables. */
-+    uint32_t fetch_idx;  /* only useful for Dom0 for the notify hypercall */
-+    struct mc_info mc_info;
-+};
-+typedef struct xen_mc_fetch xen_mc_fetch_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mc_fetch_t);
-+
-+
-+/* Usecase 4
-+ * This tells the hypervisor to notify a DomU about the machine check error
-+ */
-+#define XEN_MC_notifydomain     2
-+struct xen_mc_notifydomain {
-+    /* IN variables. */
-+    uint16_t mc_domid;    /* The unprivileged domain to notify. */
-+    uint16_t mc_vcpuid;   /* The vcpu in mc_domid to notify.
-+                           * Usually echo'd value from the fetch hypercall. */
-+    uint32_t fetch_idx;   /* echo'd value from the fetch hypercall. */
-+
-+    /* IN/OUT variables. */
-+    uint32_t flags;
-+
-+/* IN: XEN_MC_CORRECTABLE, XEN_MC_TRAP */
-+/* OUT: XEN_MC_OK, XEN_MC_CANNOTHANDLE, XEN_MC_NOTDELIVERED, XEN_MC_NOMATCH */
-+};
-+typedef struct xen_mc_notifydomain xen_mc_notifydomain_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mc_notifydomain_t);
-+
-+
-+struct xen_mc {
-+    uint32_t cmd;
-+    uint32_t interface_version; /* XEN_MCA_INTERFACE_VERSION */
-+    union {
-+        struct xen_mc_fetch        mc_fetch;
-+        struct xen_mc_notifydomain mc_notifydomain;
-+        uint8_t pad[MCINFO_HYPERCALLSIZE];
-+    } u;
-+};
-+typedef struct xen_mc xen_mc_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_mc_t);
-+
-+#endif /* __ASSEMBLY__ */
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_MCA_H__ */
-Index: head-2008-11-25/include/xen/interface/arch-x86/xen-x86_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/xen-x86_32.h        2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,180 @@
-+/******************************************************************************
-+ * xen-x86_32.h
-+ * 
-+ * Guest OS interface to x86 32-bit Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2004-2007, K A Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
-+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__
-+
-+/*
-+ * Hypercall interface:
-+ *  Input:  %ebx, %ecx, %edx, %esi, %edi (arguments 1-5)
-+ *  Output: %eax
-+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):
-+ *  call hypercall_page + hypercall-number * 32
-+ * Clobbered: Argument registers (e.g., 2-arg hypercall clobbers %ebx,%ecx)
-+ */
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00030203
-+/*
-+ * Legacy hypercall interface:
-+ * As above, except the entry sequence to the hypervisor is:
-+ *  mov $hypercall-number*32,%eax ; int $0x82
-+ */
-+#define TRAP_INSTR "int $0x82"
-+#endif
-+
-+/*
-+ * These flat segments are in the Xen-private section of every GDT. Since these
-+ * are also present in the initial GDT, many OSes will be able to avoid
-+ * installing their own GDT.
-+ */
-+#define FLAT_RING1_CS 0xe019    /* GDT index 259 */
-+#define FLAT_RING1_DS 0xe021    /* GDT index 260 */
-+#define FLAT_RING1_SS 0xe021    /* GDT index 260 */
-+#define FLAT_RING3_CS 0xe02b    /* GDT index 261 */
-+#define FLAT_RING3_DS 0xe033    /* GDT index 262 */
-+#define FLAT_RING3_SS 0xe033    /* GDT index 262 */
-+
-+#define FLAT_KERNEL_CS FLAT_RING1_CS
-+#define FLAT_KERNEL_DS FLAT_RING1_DS
-+#define FLAT_KERNEL_SS FLAT_RING1_SS
-+#define FLAT_USER_CS    FLAT_RING3_CS
-+#define FLAT_USER_DS    FLAT_RING3_DS
-+#define FLAT_USER_SS    FLAT_RING3_SS
-+
-+#define __HYPERVISOR_VIRT_START_PAE    0xF5800000
-+#define __MACH2PHYS_VIRT_START_PAE     0xF5800000
-+#define __MACH2PHYS_VIRT_END_PAE       0xF6800000
-+#define HYPERVISOR_VIRT_START_PAE      \
-+    mk_unsigned_long(__HYPERVISOR_VIRT_START_PAE)
-+#define MACH2PHYS_VIRT_START_PAE       \
-+    mk_unsigned_long(__MACH2PHYS_VIRT_START_PAE)
-+#define MACH2PHYS_VIRT_END_PAE         \
-+    mk_unsigned_long(__MACH2PHYS_VIRT_END_PAE)
-+
-+/* Non-PAE bounds are obsolete. */
-+#define __HYPERVISOR_VIRT_START_NONPAE 0xFC000000
-+#define __MACH2PHYS_VIRT_START_NONPAE  0xFC000000
-+#define __MACH2PHYS_VIRT_END_NONPAE    0xFC400000
-+#define HYPERVISOR_VIRT_START_NONPAE   \
-+    mk_unsigned_long(__HYPERVISOR_VIRT_START_NONPAE)
-+#define MACH2PHYS_VIRT_START_NONPAE    \
-+    mk_unsigned_long(__MACH2PHYS_VIRT_START_NONPAE)
-+#define MACH2PHYS_VIRT_END_NONPAE      \
-+    mk_unsigned_long(__MACH2PHYS_VIRT_END_NONPAE)
-+
-+#define __HYPERVISOR_VIRT_START __HYPERVISOR_VIRT_START_PAE
-+#define __MACH2PHYS_VIRT_START  __MACH2PHYS_VIRT_START_PAE
-+#define __MACH2PHYS_VIRT_END    __MACH2PHYS_VIRT_END_PAE
-+
-+#ifndef HYPERVISOR_VIRT_START
-+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
-+#endif
-+
-+#define MACH2PHYS_VIRT_START  mk_unsigned_long(__MACH2PHYS_VIRT_START)
-+#define MACH2PHYS_VIRT_END    mk_unsigned_long(__MACH2PHYS_VIRT_END)
-+#define MACH2PHYS_NR_ENTRIES  ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>2)
-+#ifndef machine_to_phys_mapping
-+#define machine_to_phys_mapping ((unsigned long *)MACH2PHYS_VIRT_START)
-+#endif
-+
-+/* 32-/64-bit invariability for control interfaces (domctl/sysctl). */
-+#if defined(__XEN__) || defined(__XEN_TOOLS__)
-+#undef ___DEFINE_XEN_GUEST_HANDLE
-+#define ___DEFINE_XEN_GUEST_HANDLE(name, type)                  \
-+    typedef struct { type *p; }                                 \
-+        __guest_handle_ ## name;                                \
-+    typedef struct { union { type *p; uint64_aligned_t q; }; }  \
-+        __guest_handle_64_ ## name
-+#undef set_xen_guest_handle
-+#define set_xen_guest_handle(hnd, val)                      \
-+    do { if ( sizeof(hnd) == 8 ) *(uint64_t *)&(hnd) = 0;   \
-+         (hnd).p = val;                                     \
-+    } while ( 0 )
-+#define uint64_aligned_t uint64_t __attribute__((aligned(8)))
-+#define __XEN_GUEST_HANDLE_64(name) __guest_handle_64_ ## name
-+#define XEN_GUEST_HANDLE_64(name) __XEN_GUEST_HANDLE_64(name)
-+#endif
-+
-+#ifndef __ASSEMBLY__
-+
-+struct cpu_user_regs {
-+    uint32_t ebx;
-+    uint32_t ecx;
-+    uint32_t edx;
-+    uint32_t esi;
-+    uint32_t edi;
-+    uint32_t ebp;
-+    uint32_t eax;
-+    uint16_t error_code;    /* private */
-+    uint16_t entry_vector;  /* private */
-+    uint32_t eip;
-+    uint16_t cs;
-+    uint8_t  saved_upcall_mask;
-+    uint8_t  _pad0;
-+    uint32_t eflags;        /* eflags.IF == !saved_upcall_mask */
-+    uint32_t esp;
-+    uint16_t ss, _pad1;
-+    uint16_t es, _pad2;
-+    uint16_t ds, _pad3;
-+    uint16_t fs, _pad4;
-+    uint16_t gs, _pad5;
-+};
-+typedef struct cpu_user_regs cpu_user_regs_t;
-+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
-+
-+/*
-+ * Page-directory addresses above 4GB do not fit into architectural %cr3.
-+ * When accessing %cr3, or equivalent field in vcpu_guest_context, guests
-+ * must use the following accessor macros to pack/unpack valid MFNs.
-+ */
-+#define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20))
-+#define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20))
-+
-+struct arch_vcpu_info {
-+    unsigned long cr2;
-+    unsigned long pad[5]; /* sizeof(vcpu_info_t) == 64 */
-+};
-+typedef struct arch_vcpu_info arch_vcpu_info_t;
-+
-+struct xen_callback {
-+    unsigned long cs;
-+    unsigned long eip;
-+};
-+typedef struct xen_callback xen_callback_t;
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_32_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/arch-x86/xen-x86_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/xen-x86_64.h        2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,212 @@
-+/******************************************************************************
-+ * xen-x86_64.h
-+ * 
-+ * Guest OS interface to x86 64-bit Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2004-2006, K A Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
-+#define __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__
-+
-+/*
-+ * Hypercall interface:
-+ *  Input:  %rdi, %rsi, %rdx, %r10, %r8 (arguments 1-5)
-+ *  Output: %rax
-+ * Access is via hypercall page (set up by guest loader or via a Xen MSR):
-+ *  call hypercall_page + hypercall-number * 32
-+ * Clobbered: argument registers (e.g., 2-arg hypercall clobbers %rdi,%rsi)
-+ */
-+
-+#if __XEN_INTERFACE_VERSION__ < 0x00030203
-+/*
-+ * Legacy hypercall interface:
-+ * As above, except the entry sequence to the hypervisor is:
-+ *  mov $hypercall-number*32,%eax ; syscall
-+ * Clobbered: %rcx, %r11, argument registers (as above)
-+ */
-+#define TRAP_INSTR "syscall"
-+#endif
-+
-+/*
-+ * 64-bit segment selectors
-+ * These flat segments are in the Xen-private section of every GDT. Since these
-+ * are also present in the initial GDT, many OSes will be able to avoid
-+ * installing their own GDT.
-+ */
-+
-+#define FLAT_RING3_CS32 0xe023  /* GDT index 260 */
-+#define FLAT_RING3_CS64 0xe033  /* GDT index 261 */
-+#define FLAT_RING3_DS32 0xe02b  /* GDT index 262 */
-+#define FLAT_RING3_DS64 0x0000  /* NULL selector */
-+#define FLAT_RING3_SS32 0xe02b  /* GDT index 262 */
-+#define FLAT_RING3_SS64 0xe02b  /* GDT index 262 */
-+
-+#define FLAT_KERNEL_DS64 FLAT_RING3_DS64
-+#define FLAT_KERNEL_DS32 FLAT_RING3_DS32
-+#define FLAT_KERNEL_DS   FLAT_KERNEL_DS64
-+#define FLAT_KERNEL_CS64 FLAT_RING3_CS64
-+#define FLAT_KERNEL_CS32 FLAT_RING3_CS32
-+#define FLAT_KERNEL_CS   FLAT_KERNEL_CS64
-+#define FLAT_KERNEL_SS64 FLAT_RING3_SS64
-+#define FLAT_KERNEL_SS32 FLAT_RING3_SS32
-+#define FLAT_KERNEL_SS   FLAT_KERNEL_SS64
-+
-+#define FLAT_USER_DS64 FLAT_RING3_DS64
-+#define FLAT_USER_DS32 FLAT_RING3_DS32
-+#define FLAT_USER_DS   FLAT_USER_DS64
-+#define FLAT_USER_CS64 FLAT_RING3_CS64
-+#define FLAT_USER_CS32 FLAT_RING3_CS32
-+#define FLAT_USER_CS   FLAT_USER_CS64
-+#define FLAT_USER_SS64 FLAT_RING3_SS64
-+#define FLAT_USER_SS32 FLAT_RING3_SS32
-+#define FLAT_USER_SS   FLAT_USER_SS64
-+
-+#define __HYPERVISOR_VIRT_START 0xFFFF800000000000
-+#define __HYPERVISOR_VIRT_END   0xFFFF880000000000
-+#define __MACH2PHYS_VIRT_START  0xFFFF800000000000
-+#define __MACH2PHYS_VIRT_END    0xFFFF804000000000
-+
-+#ifndef HYPERVISOR_VIRT_START
-+#define HYPERVISOR_VIRT_START mk_unsigned_long(__HYPERVISOR_VIRT_START)
-+#define HYPERVISOR_VIRT_END   mk_unsigned_long(__HYPERVISOR_VIRT_END)
-+#endif
-+
-+#define MACH2PHYS_VIRT_START  mk_unsigned_long(__MACH2PHYS_VIRT_START)
-+#define MACH2PHYS_VIRT_END    mk_unsigned_long(__MACH2PHYS_VIRT_END)
-+#define MACH2PHYS_NR_ENTRIES  ((MACH2PHYS_VIRT_END-MACH2PHYS_VIRT_START)>>3)
-+#ifndef machine_to_phys_mapping
-+#define machine_to_phys_mapping ((unsigned long *)HYPERVISOR_VIRT_START)
-+#endif
-+
-+/*
-+ * int HYPERVISOR_set_segment_base(unsigned int which, unsigned long base)
-+ *  @which == SEGBASE_*  ;  @base == 64-bit base address
-+ * Returns 0 on success.
-+ */
-+#define SEGBASE_FS          0
-+#define SEGBASE_GS_USER     1
-+#define SEGBASE_GS_KERNEL   2
-+#define SEGBASE_GS_USER_SEL 3 /* Set user %gs specified in base[15:0] */
-+
-+/*
-+ * int HYPERVISOR_iret(void)
-+ * All arguments are on the kernel stack, in the following format.
-+ * Never returns if successful. Current kernel context is lost.
-+ * The saved CS is mapped as follows:
-+ *   RING0 -> RING3 kernel mode.
-+ *   RING1 -> RING3 kernel mode.
-+ *   RING2 -> RING3 kernel mode.
-+ *   RING3 -> RING3 user mode.
-+ * However RING0 indicates that the guest kernel should return to iteself
-+ * directly with
-+ *      orb   $3,1*8(%rsp)
-+ *      iretq
-+ * If flags contains VGCF_in_syscall:
-+ *   Restore RAX, RIP, RFLAGS, RSP.
-+ *   Discard R11, RCX, CS, SS.
-+ * Otherwise:
-+ *   Restore RAX, R11, RCX, CS:RIP, RFLAGS, SS:RSP.
-+ * All other registers are saved on hypercall entry and restored to user.
-+ */
-+/* Guest exited in SYSCALL context? Return to guest with SYSRET? */
-+#define _VGCF_in_syscall 8
-+#define VGCF_in_syscall  (1<<_VGCF_in_syscall)
-+#define VGCF_IN_SYSCALL  VGCF_in_syscall
-+
-+#ifndef __ASSEMBLY__
-+
-+struct iret_context {
-+    /* Top of stack (%rsp at point of hypercall). */
-+    uint64_t rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
-+    /* Bottom of iret stack frame. */
-+};
-+
-+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-+/* Anonymous union includes both 32- and 64-bit names (e.g., eax/rax). */
-+#define __DECL_REG(name) union { \
-+    uint64_t r ## name, e ## name; \
-+    uint32_t _e ## name; \
-+}
-+#else
-+/* Non-gcc sources must always use the proper 64-bit name (e.g., rax). */
-+#define __DECL_REG(name) uint64_t r ## name
-+#endif
-+
-+struct cpu_user_regs {
-+    uint64_t r15;
-+    uint64_t r14;
-+    uint64_t r13;
-+    uint64_t r12;
-+    __DECL_REG(bp);
-+    __DECL_REG(bx);
-+    uint64_t r11;
-+    uint64_t r10;
-+    uint64_t r9;
-+    uint64_t r8;
-+    __DECL_REG(ax);
-+    __DECL_REG(cx);
-+    __DECL_REG(dx);
-+    __DECL_REG(si);
-+    __DECL_REG(di);
-+    uint32_t error_code;    /* private */
-+    uint32_t entry_vector;  /* private */
-+    __DECL_REG(ip);
-+    uint16_t cs, _pad0[1];
-+    uint8_t  saved_upcall_mask;
-+    uint8_t  _pad1[3];
-+    __DECL_REG(flags);      /* rflags.IF == !saved_upcall_mask */
-+    __DECL_REG(sp);
-+    uint16_t ss, _pad2[3];
-+    uint16_t es, _pad3[3];
-+    uint16_t ds, _pad4[3];
-+    uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
-+    uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
-+};
-+typedef struct cpu_user_regs cpu_user_regs_t;
-+DEFINE_XEN_GUEST_HANDLE(cpu_user_regs_t);
-+
-+#undef __DECL_REG
-+
-+#define xen_pfn_to_cr3(pfn) ((unsigned long)(pfn) << 12)
-+#define xen_cr3_to_pfn(cr3) ((unsigned long)(cr3) >> 12)
-+
-+struct arch_vcpu_info {
-+    unsigned long cr2;
-+    unsigned long pad; /* sizeof(vcpu_info_t) == 64 */
-+};
-+typedef struct arch_vcpu_info arch_vcpu_info_t;
-+
-+typedef unsigned long xen_callback_t;
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_X86_64_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/arch-x86/xen.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86/xen.h       2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,204 @@
-+/******************************************************************************
-+ * arch-x86/xen.h
-+ * 
-+ * Guest OS interface to x86 Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2004-2006, K A Fraser
-+ */
-+
-+#include "../xen.h"
-+
-+#ifndef __XEN_PUBLIC_ARCH_X86_XEN_H__
-+#define __XEN_PUBLIC_ARCH_X86_XEN_H__
-+
-+/* Structural guest handles introduced in 0x00030201. */
-+#if __XEN_INTERFACE_VERSION__ >= 0x00030201
-+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
-+    typedef struct { type *p; } __guest_handle_ ## name
-+#else
-+#define ___DEFINE_XEN_GUEST_HANDLE(name, type) \
-+    typedef type * __guest_handle_ ## name
-+#endif
-+
-+#define __DEFINE_XEN_GUEST_HANDLE(name, type) \
-+    ___DEFINE_XEN_GUEST_HANDLE(name, type);   \
-+    ___DEFINE_XEN_GUEST_HANDLE(const_##name, const type)
-+#define DEFINE_XEN_GUEST_HANDLE(name)   __DEFINE_XEN_GUEST_HANDLE(name, name)
-+#define __XEN_GUEST_HANDLE(name)        __guest_handle_ ## name
-+#define XEN_GUEST_HANDLE(name)          __XEN_GUEST_HANDLE(name)
-+#define set_xen_guest_handle(hnd, val)  do { (hnd).p = val; } while (0)
-+#ifdef __XEN_TOOLS__
-+#define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
-+#endif
-+
-+#if defined(__i386__)
-+#include "xen-x86_32.h"
-+#elif defined(__x86_64__)
-+#include "xen-x86_64.h"
-+#endif
-+
-+#ifndef __ASSEMBLY__
-+typedef unsigned long xen_pfn_t;
-+#define PRI_xen_pfn "lx"
-+#endif
-+
-+/*
-+ * SEGMENT DESCRIPTOR TABLES
-+ */
-+/*
-+ * A number of GDT entries are reserved by Xen. These are not situated at the
-+ * start of the GDT because some stupid OSes export hard-coded selector values
-+ * in their ABI. These hard-coded values are always near the start of the GDT,
-+ * so Xen places itself out of the way, at the far end of the GDT.
-+ */
-+#define FIRST_RESERVED_GDT_PAGE  14
-+#define FIRST_RESERVED_GDT_BYTE  (FIRST_RESERVED_GDT_PAGE * 4096)
-+#define FIRST_RESERVED_GDT_ENTRY (FIRST_RESERVED_GDT_BYTE / 8)
-+
-+/* Maximum number of virtual CPUs in multi-processor guests. */
-+#define MAX_VIRT_CPUS 32
-+
-+
-+/* Machine check support */
-+#include "xen-mca.h"
-+
-+#ifndef __ASSEMBLY__
-+
-+typedef unsigned long xen_ulong_t;
-+
-+/*
-+ * Send an array of these to HYPERVISOR_set_trap_table().
-+ * The privilege level specifies which modes may enter a trap via a software
-+ * interrupt. On x86/64, since rings 1 and 2 are unavailable, we allocate
-+ * privilege levels as follows:
-+ *  Level == 0: Noone may enter
-+ *  Level == 1: Kernel may enter
-+ *  Level == 2: Kernel may enter
-+ *  Level == 3: Everyone may enter
-+ */
-+#define TI_GET_DPL(_ti)      ((_ti)->flags & 3)
-+#define TI_GET_IF(_ti)       ((_ti)->flags & 4)
-+#define TI_SET_DPL(_ti,_dpl) ((_ti)->flags |= (_dpl))
-+#define TI_SET_IF(_ti,_if)   ((_ti)->flags |= ((!!(_if))<<2))
-+struct trap_info {
-+    uint8_t       vector;  /* exception vector                              */
-+    uint8_t       flags;   /* 0-3: privilege level; 4: clear event enable?  */
-+    uint16_t      cs;      /* code selector                                 */
-+    unsigned long address; /* code offset                                   */
-+};
-+typedef struct trap_info trap_info_t;
-+DEFINE_XEN_GUEST_HANDLE(trap_info_t);
-+
-+typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
-+
-+/*
-+ * The following is all CPU context. Note that the fpu_ctxt block is filled 
-+ * in by FXSAVE if the CPU has feature FXSR; otherwise FSAVE is used.
-+ */
-+struct vcpu_guest_context {
-+    /* FPU registers come first so they can be aligned for FXSAVE/FXRSTOR. */
-+    struct { char x[512]; } fpu_ctxt;       /* User-level FPU registers     */
-+#define VGCF_I387_VALID                (1<<0)
-+#define VGCF_IN_KERNEL                 (1<<2)
-+#define _VGCF_i387_valid               0
-+#define VGCF_i387_valid                (1<<_VGCF_i387_valid)
-+#define _VGCF_in_kernel                2
-+#define VGCF_in_kernel                 (1<<_VGCF_in_kernel)
-+#define _VGCF_failsafe_disables_events 3
-+#define VGCF_failsafe_disables_events  (1<<_VGCF_failsafe_disables_events)
-+#define _VGCF_syscall_disables_events  4
-+#define VGCF_syscall_disables_events   (1<<_VGCF_syscall_disables_events)
-+#define _VGCF_online                   5
-+#define VGCF_online                    (1<<_VGCF_online)
-+    unsigned long flags;                    /* VGCF_* flags                 */
-+    struct cpu_user_regs user_regs;         /* User-level CPU registers     */
-+    struct trap_info trap_ctxt[256];        /* Virtual IDT                  */
-+    unsigned long ldt_base, ldt_ents;       /* LDT (linear address, # ents) */
-+    unsigned long gdt_frames[16], gdt_ents; /* GDT (machine frames, # ents) */
-+    unsigned long kernel_ss, kernel_sp;     /* Virtual TSS (only SS1/SP1)   */
-+    /* NB. User pagetable on x86/64 is placed in ctrlreg[1]. */
-+    unsigned long ctrlreg[8];               /* CR0-CR7 (control registers)  */
-+    unsigned long debugreg[8];              /* DB0-DB7 (debug registers)    */
-+#ifdef __i386__
-+    unsigned long event_callback_cs;        /* CS:EIP of event callback     */
-+    unsigned long event_callback_eip;
-+    unsigned long failsafe_callback_cs;     /* CS:EIP of failsafe callback  */
-+    unsigned long failsafe_callback_eip;
-+#else
-+    unsigned long event_callback_eip;
-+    unsigned long failsafe_callback_eip;
-+#ifdef __XEN__
-+    union {
-+        unsigned long syscall_callback_eip;
-+        struct {
-+            unsigned int event_callback_cs;    /* compat CS of event cb     */
-+            unsigned int failsafe_callback_cs; /* compat CS of failsafe cb  */
-+        };
-+    };
-+#else
-+    unsigned long syscall_callback_eip;
-+#endif
-+#endif
-+    unsigned long vm_assist;                /* VMASST_TYPE_* bitmap */
-+#ifdef __x86_64__
-+    /* Segment base addresses. */
-+    uint64_t      fs_base;
-+    uint64_t      gs_base_kernel;
-+    uint64_t      gs_base_user;
-+#endif
-+};
-+typedef struct vcpu_guest_context vcpu_guest_context_t;
-+DEFINE_XEN_GUEST_HANDLE(vcpu_guest_context_t);
-+
-+struct arch_shared_info {
-+    unsigned long max_pfn;                  /* max pfn that appears in table */
-+    /* Frame containing list of mfns containing list of mfns containing p2m. */
-+    xen_pfn_t     pfn_to_mfn_frame_list_list;
-+    unsigned long nmi_reason;
-+    uint64_t pad[32];
-+};
-+typedef struct arch_shared_info arch_shared_info_t;
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+/*
-+ * Prefix forces emulation of some non-trapping instructions.
-+ * Currently only CPUID.
-+ */
-+#ifdef __ASSEMBLY__
-+#define XEN_EMULATE_PREFIX .byte 0x0f,0x0b,0x78,0x65,0x6e ;
-+#define XEN_CPUID          XEN_EMULATE_PREFIX cpuid
-+#else
-+#define XEN_EMULATE_PREFIX ".byte 0x0f,0x0b,0x78,0x65,0x6e ; "
-+#define XEN_CPUID          XEN_EMULATE_PREFIX "cpuid"
-+#endif
-+
-+#endif /* __XEN_PUBLIC_ARCH_X86_XEN_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/arch-x86_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86_32.h        2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,27 @@
-+/******************************************************************************
-+ * arch-x86_32.h
-+ * 
-+ * Guest OS interface to x86 32-bit Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2004-2006, K A Fraser
-+ */
-+
-+#include "arch-x86/xen.h"
-Index: head-2008-11-25/include/xen/interface/arch-x86_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/arch-x86_64.h        2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,27 @@
-+/******************************************************************************
-+ * arch-x86_64.h
-+ * 
-+ * Guest OS interface to x86 64-bit Xen.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2004-2006, K A Fraser
-+ */
-+
-+#include "arch-x86/xen.h"
-Index: head-2008-11-25/include/xen/interface/dom0_ops.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/dom0_ops.h   2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,120 @@
-+/******************************************************************************
-+ * dom0_ops.h
-+ * 
-+ * Process command requests from domain-0 guest OS.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2002-2003, B Dragovic
-+ * Copyright (c) 2002-2006, K Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_DOM0_OPS_H__
-+#define __XEN_PUBLIC_DOM0_OPS_H__
-+
-+#include "xen.h"
-+#include "platform.h"
-+
-+#if __XEN_INTERFACE_VERSION__ >= 0x00030204
-+#error "dom0_ops.h is a compatibility interface only"
-+#endif
-+
-+#define DOM0_INTERFACE_VERSION XENPF_INTERFACE_VERSION
-+
-+#define DOM0_SETTIME          XENPF_settime
-+#define dom0_settime          xenpf_settime
-+#define dom0_settime_t        xenpf_settime_t
-+
-+#define DOM0_ADD_MEMTYPE      XENPF_add_memtype
-+#define dom0_add_memtype      xenpf_add_memtype
-+#define dom0_add_memtype_t    xenpf_add_memtype_t
-+
-+#define DOM0_DEL_MEMTYPE      XENPF_del_memtype
-+#define dom0_del_memtype      xenpf_del_memtype
-+#define dom0_del_memtype_t    xenpf_del_memtype_t
-+
-+#define DOM0_READ_MEMTYPE     XENPF_read_memtype
-+#define dom0_read_memtype     xenpf_read_memtype
-+#define dom0_read_memtype_t   xenpf_read_memtype_t
-+
-+#define DOM0_MICROCODE        XENPF_microcode_update
-+#define dom0_microcode        xenpf_microcode_update
-+#define dom0_microcode_t      xenpf_microcode_update_t
-+
-+#define DOM0_PLATFORM_QUIRK   XENPF_platform_quirk
-+#define dom0_platform_quirk   xenpf_platform_quirk
-+#define dom0_platform_quirk_t xenpf_platform_quirk_t
-+
-+typedef uint64_t cpumap_t;
-+
-+/* Unsupported legacy operation -- defined for API compatibility. */
-+#define DOM0_MSR                 15
-+struct dom0_msr {
-+    /* IN variables. */
-+    uint32_t write;
-+    cpumap_t cpu_mask;
-+    uint32_t msr;
-+    uint32_t in1;
-+    uint32_t in2;
-+    /* OUT variables. */
-+    uint32_t out1;
-+    uint32_t out2;
-+};
-+typedef struct dom0_msr dom0_msr_t;
-+DEFINE_XEN_GUEST_HANDLE(dom0_msr_t);
-+
-+/* Unsupported legacy operation -- defined for API compatibility. */
-+#define DOM0_PHYSICAL_MEMORY_MAP 40
-+struct dom0_memory_map_entry {
-+    uint64_t start, end;
-+    uint32_t flags; /* reserved */
-+    uint8_t  is_ram;
-+};
-+typedef struct dom0_memory_map_entry dom0_memory_map_entry_t;
-+DEFINE_XEN_GUEST_HANDLE(dom0_memory_map_entry_t);
-+
-+struct dom0_op {
-+    uint32_t cmd;
-+    uint32_t interface_version; /* DOM0_INTERFACE_VERSION */
-+    union {
-+        struct dom0_msr               msr;
-+        struct dom0_settime           settime;
-+        struct dom0_add_memtype       add_memtype;
-+        struct dom0_del_memtype       del_memtype;
-+        struct dom0_read_memtype      read_memtype;
-+        struct dom0_microcode         microcode;
-+        struct dom0_platform_quirk    platform_quirk;
-+        struct dom0_memory_map_entry  physical_memory_map;
-+        uint8_t                       pad[128];
-+    } u;
-+};
-+typedef struct dom0_op dom0_op_t;
-+DEFINE_XEN_GUEST_HANDLE(dom0_op_t);
-+
-+#endif /* __XEN_PUBLIC_DOM0_OPS_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/domctl.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/domctl.h     2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,680 @@
-+/******************************************************************************
-+ * domctl.h
-+ * 
-+ * Domain management operations. For use by node control stack.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2002-2003, B Dragovic
-+ * Copyright (c) 2002-2006, K Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_DOMCTL_H__
-+#define __XEN_PUBLIC_DOMCTL_H__
-+
-+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
-+#error "domctl operations are intended for use by node control tools only"
-+#endif
-+
-+#include "xen.h"
-+
-+#define XEN_DOMCTL_INTERFACE_VERSION 0x00000005
-+
-+struct xenctl_cpumap {
-+    XEN_GUEST_HANDLE_64(uint8) bitmap;
-+    uint32_t nr_cpus;
-+};
-+
-+/*
-+ * NB. xen_domctl.domain is an IN/OUT parameter for this operation.
-+ * If it is specified as zero, an id is auto-allocated and returned.
-+ */
-+#define XEN_DOMCTL_createdomain       1
-+struct xen_domctl_createdomain {
-+    /* IN parameters */
-+    uint32_t ssidref;
-+    xen_domain_handle_t handle;
-+ /* Is this an HVM guest (as opposed to a PV guest)? */
-+#define _XEN_DOMCTL_CDF_hvm_guest 0
-+#define XEN_DOMCTL_CDF_hvm_guest  (1U<<_XEN_DOMCTL_CDF_hvm_guest)
-+ /* Use hardware-assisted paging if available? */
-+#define _XEN_DOMCTL_CDF_hap       1
-+#define XEN_DOMCTL_CDF_hap        (1U<<_XEN_DOMCTL_CDF_hap)
-+    uint32_t flags;
-+};
-+typedef struct xen_domctl_createdomain xen_domctl_createdomain_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_createdomain_t);
-+
-+#define XEN_DOMCTL_destroydomain      2
-+#define XEN_DOMCTL_pausedomain        3
-+#define XEN_DOMCTL_unpausedomain      4
-+#define XEN_DOMCTL_resumedomain      27
-+
-+#define XEN_DOMCTL_getdomaininfo      5
-+struct xen_domctl_getdomaininfo {
-+    /* OUT variables. */
-+    domid_t  domain;              /* Also echoed in domctl.domain */
-+ /* Domain is scheduled to die. */
-+#define _XEN_DOMINF_dying     0
-+#define XEN_DOMINF_dying      (1U<<_XEN_DOMINF_dying)
-+ /* Domain is an HVM guest (as opposed to a PV guest). */
-+#define _XEN_DOMINF_hvm_guest 1
-+#define XEN_DOMINF_hvm_guest  (1U<<_XEN_DOMINF_hvm_guest)
-+ /* The guest OS has shut down. */
-+#define _XEN_DOMINF_shutdown  2
-+#define XEN_DOMINF_shutdown   (1U<<_XEN_DOMINF_shutdown)
-+ /* Currently paused by control software. */
-+#define _XEN_DOMINF_paused    3
-+#define XEN_DOMINF_paused     (1U<<_XEN_DOMINF_paused)
-+ /* Currently blocked pending an event.     */
-+#define _XEN_DOMINF_blocked   4
-+#define XEN_DOMINF_blocked    (1U<<_XEN_DOMINF_blocked)
-+ /* Domain is currently running.            */
-+#define _XEN_DOMINF_running   5
-+#define XEN_DOMINF_running    (1U<<_XEN_DOMINF_running)
-+ /* Being debugged.  */
-+#define _XEN_DOMINF_debugged  6
-+#define XEN_DOMINF_debugged   (1U<<_XEN_DOMINF_debugged)
-+ /* CPU to which this domain is bound.      */
-+#define XEN_DOMINF_cpumask      255
-+#define XEN_DOMINF_cpushift       8
-+ /* XEN_DOMINF_shutdown guest-supplied code.  */
-+#define XEN_DOMINF_shutdownmask 255
-+#define XEN_DOMINF_shutdownshift 16
-+    uint32_t flags;              /* XEN_DOMINF_* */
-+    uint64_aligned_t tot_pages;
-+    uint64_aligned_t max_pages;
-+    uint64_aligned_t shared_info_frame; /* GMFN of shared_info struct */
-+    uint64_aligned_t cpu_time;
-+    uint32_t nr_online_vcpus;    /* Number of VCPUs currently online. */
-+    uint32_t max_vcpu_id;        /* Maximum VCPUID in use by this domain. */
-+    uint32_t ssidref;
-+    xen_domain_handle_t handle;
-+};
-+typedef struct xen_domctl_getdomaininfo xen_domctl_getdomaininfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getdomaininfo_t);
-+
-+
-+#define XEN_DOMCTL_getmemlist         6
-+struct xen_domctl_getmemlist {
-+    /* IN variables. */
-+    /* Max entries to write to output buffer. */
-+    uint64_aligned_t max_pfns;
-+    /* Start index in guest's page list. */
-+    uint64_aligned_t start_pfn;
-+    XEN_GUEST_HANDLE_64(uint64) buffer;
-+    /* OUT variables. */
-+    uint64_aligned_t num_pfns;
-+};
-+typedef struct xen_domctl_getmemlist xen_domctl_getmemlist_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getmemlist_t);
-+
-+
-+#define XEN_DOMCTL_getpageframeinfo   7
-+
-+#define XEN_DOMCTL_PFINFO_LTAB_SHIFT 28
-+#define XEN_DOMCTL_PFINFO_NOTAB   (0x0U<<28)
-+#define XEN_DOMCTL_PFINFO_L1TAB   (0x1U<<28)
-+#define XEN_DOMCTL_PFINFO_L2TAB   (0x2U<<28)
-+#define XEN_DOMCTL_PFINFO_L3TAB   (0x3U<<28)
-+#define XEN_DOMCTL_PFINFO_L4TAB   (0x4U<<28)
-+#define XEN_DOMCTL_PFINFO_LTABTYPE_MASK (0x7U<<28)
-+#define XEN_DOMCTL_PFINFO_LPINTAB (0x1U<<31)
-+#define XEN_DOMCTL_PFINFO_XTAB    (0xfU<<28) /* invalid page */
-+#define XEN_DOMCTL_PFINFO_LTAB_MASK (0xfU<<28)
-+
-+struct xen_domctl_getpageframeinfo {
-+    /* IN variables. */
-+    uint64_aligned_t gmfn; /* GMFN to query */
-+    /* OUT variables. */
-+    /* Is the page PINNED to a type? */
-+    uint32_t type;         /* see above type defs */
-+};
-+typedef struct xen_domctl_getpageframeinfo xen_domctl_getpageframeinfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo_t);
-+
-+
-+#define XEN_DOMCTL_getpageframeinfo2  8
-+struct xen_domctl_getpageframeinfo2 {
-+    /* IN variables. */
-+    uint64_aligned_t num;
-+    /* IN/OUT variables. */
-+    XEN_GUEST_HANDLE_64(uint32) array;
-+};
-+typedef struct xen_domctl_getpageframeinfo2 xen_domctl_getpageframeinfo2_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getpageframeinfo2_t);
-+
-+
-+/*
-+ * Control shadow pagetables operation
-+ */
-+#define XEN_DOMCTL_shadow_op         10
-+
-+/* Disable shadow mode. */
-+#define XEN_DOMCTL_SHADOW_OP_OFF         0
-+
-+/* Enable shadow mode (mode contains ORed XEN_DOMCTL_SHADOW_ENABLE_* flags). */
-+#define XEN_DOMCTL_SHADOW_OP_ENABLE      32
-+
-+/* Log-dirty bitmap operations. */
-+ /* Return the bitmap and clean internal copy for next round. */
-+#define XEN_DOMCTL_SHADOW_OP_CLEAN       11
-+ /* Return the bitmap but do not modify internal copy. */
-+#define XEN_DOMCTL_SHADOW_OP_PEEK        12
-+
-+/* Memory allocation accessors. */
-+#define XEN_DOMCTL_SHADOW_OP_GET_ALLOCATION   30
-+#define XEN_DOMCTL_SHADOW_OP_SET_ALLOCATION   31
-+
-+/* Legacy enable operations. */
-+ /* Equiv. to ENABLE with no mode flags. */
-+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TEST       1
-+ /* Equiv. to ENABLE with mode flag ENABLE_LOG_DIRTY. */
-+#define XEN_DOMCTL_SHADOW_OP_ENABLE_LOGDIRTY   2
-+ /* Equiv. to ENABLE with mode flags ENABLE_REFCOUNT and ENABLE_TRANSLATE. */
-+#define XEN_DOMCTL_SHADOW_OP_ENABLE_TRANSLATE  3
-+
-+/* Mode flags for XEN_DOMCTL_SHADOW_OP_ENABLE. */
-+ /*
-+  * Shadow pagetables are refcounted: guest does not use explicit mmu
-+  * operations nor write-protect its pagetables.
-+  */
-+#define XEN_DOMCTL_SHADOW_ENABLE_REFCOUNT  (1 << 1)
-+ /*
-+  * Log pages in a bitmap as they are dirtied.
-+  * Used for live relocation to determine which pages must be re-sent.
-+  */
-+#define XEN_DOMCTL_SHADOW_ENABLE_LOG_DIRTY (1 << 2)
-+ /*
-+  * Automatically translate GPFNs into MFNs.
-+  */
-+#define XEN_DOMCTL_SHADOW_ENABLE_TRANSLATE (1 << 3)
-+ /*
-+  * Xen does not steal virtual address space from the guest.
-+  * Requires HVM support.
-+  */
-+#define XEN_DOMCTL_SHADOW_ENABLE_EXTERNAL  (1 << 4)
-+
-+struct xen_domctl_shadow_op_stats {
-+    uint32_t fault_count;
-+    uint32_t dirty_count;
-+};
-+typedef struct xen_domctl_shadow_op_stats xen_domctl_shadow_op_stats_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_stats_t);
-+
-+struct xen_domctl_shadow_op {
-+    /* IN variables. */
-+    uint32_t       op;       /* XEN_DOMCTL_SHADOW_OP_* */
-+
-+    /* OP_ENABLE */
-+    uint32_t       mode;     /* XEN_DOMCTL_SHADOW_ENABLE_* */
-+
-+    /* OP_GET_ALLOCATION / OP_SET_ALLOCATION */
-+    uint32_t       mb;       /* Shadow memory allocation in MB */
-+
-+    /* OP_PEEK / OP_CLEAN */
-+    XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
-+    uint64_aligned_t pages; /* Size of buffer. Updated with actual size. */
-+    struct xen_domctl_shadow_op_stats stats;
-+};
-+typedef struct xen_domctl_shadow_op xen_domctl_shadow_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_shadow_op_t);
-+
-+
-+#define XEN_DOMCTL_max_mem           11
-+struct xen_domctl_max_mem {
-+    /* IN variables. */
-+    uint64_aligned_t max_memkb;
-+};
-+typedef struct xen_domctl_max_mem xen_domctl_max_mem_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_mem_t);
-+
-+
-+#define XEN_DOMCTL_setvcpucontext    12
-+#define XEN_DOMCTL_getvcpucontext    13
-+struct xen_domctl_vcpucontext {
-+    uint32_t              vcpu;                  /* IN */
-+    XEN_GUEST_HANDLE_64(vcpu_guest_context_t) ctxt; /* IN/OUT */
-+};
-+typedef struct xen_domctl_vcpucontext xen_domctl_vcpucontext_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpucontext_t);
-+
-+
-+#define XEN_DOMCTL_getvcpuinfo       14
-+struct xen_domctl_getvcpuinfo {
-+    /* IN variables. */
-+    uint32_t vcpu;
-+    /* OUT variables. */
-+    uint8_t  online;                  /* currently online (not hotplugged)? */
-+    uint8_t  blocked;                 /* blocked waiting for an event? */
-+    uint8_t  running;                 /* currently scheduled on its CPU? */
-+    uint64_aligned_t cpu_time;        /* total cpu time consumed (ns) */
-+    uint32_t cpu;                     /* current mapping   */
-+};
-+typedef struct xen_domctl_getvcpuinfo xen_domctl_getvcpuinfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_getvcpuinfo_t);
-+
-+
-+/* Get/set which physical cpus a vcpu can execute on. */
-+#define XEN_DOMCTL_setvcpuaffinity    9
-+#define XEN_DOMCTL_getvcpuaffinity   25
-+struct xen_domctl_vcpuaffinity {
-+    uint32_t  vcpu;              /* IN */
-+    struct xenctl_cpumap cpumap; /* IN/OUT */
-+};
-+typedef struct xen_domctl_vcpuaffinity xen_domctl_vcpuaffinity_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_vcpuaffinity_t);
-+
-+
-+#define XEN_DOMCTL_max_vcpus         15
-+struct xen_domctl_max_vcpus {
-+    uint32_t max;           /* maximum number of vcpus */
-+};
-+typedef struct xen_domctl_max_vcpus xen_domctl_max_vcpus_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_max_vcpus_t);
-+
-+
-+#define XEN_DOMCTL_scheduler_op      16
-+/* Scheduler types. */
-+#define XEN_SCHEDULER_SEDF     4
-+#define XEN_SCHEDULER_CREDIT   5
-+/* Set or get info? */
-+#define XEN_DOMCTL_SCHEDOP_putinfo 0
-+#define XEN_DOMCTL_SCHEDOP_getinfo 1
-+struct xen_domctl_scheduler_op {
-+    uint32_t sched_id;  /* XEN_SCHEDULER_* */
-+    uint32_t cmd;       /* XEN_DOMCTL_SCHEDOP_* */
-+    union {
-+        struct xen_domctl_sched_sedf {
-+            uint64_aligned_t period;
-+            uint64_aligned_t slice;
-+            uint64_aligned_t latency;
-+            uint32_t extratime;
-+            uint32_t weight;
-+        } sedf;
-+        struct xen_domctl_sched_credit {
-+            uint16_t weight;
-+            uint16_t cap;
-+        } credit;
-+    } u;
-+};
-+typedef struct xen_domctl_scheduler_op xen_domctl_scheduler_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_scheduler_op_t);
-+
-+
-+#define XEN_DOMCTL_setdomainhandle   17
-+struct xen_domctl_setdomainhandle {
-+    xen_domain_handle_t handle;
-+};
-+typedef struct xen_domctl_setdomainhandle xen_domctl_setdomainhandle_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdomainhandle_t);
-+
-+
-+#define XEN_DOMCTL_setdebugging      18
-+struct xen_domctl_setdebugging {
-+    uint8_t enable;
-+};
-+typedef struct xen_domctl_setdebugging xen_domctl_setdebugging_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_setdebugging_t);
-+
-+
-+#define XEN_DOMCTL_irq_permission    19
-+struct xen_domctl_irq_permission {
-+    uint8_t pirq;
-+    uint8_t allow_access;    /* flag to specify enable/disable of IRQ access */
-+};
-+typedef struct xen_domctl_irq_permission xen_domctl_irq_permission_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_irq_permission_t);
-+
-+
-+#define XEN_DOMCTL_iomem_permission  20
-+struct xen_domctl_iomem_permission {
-+    uint64_aligned_t first_mfn;/* first page (physical page number) in range */
-+    uint64_aligned_t nr_mfns;  /* number of pages in range (>0) */
-+    uint8_t  allow_access;     /* allow (!0) or deny (0) access to range? */
-+};
-+typedef struct xen_domctl_iomem_permission xen_domctl_iomem_permission_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_iomem_permission_t);
-+
-+
-+#define XEN_DOMCTL_ioport_permission 21
-+struct xen_domctl_ioport_permission {
-+    uint32_t first_port;              /* first port int range */
-+    uint32_t nr_ports;                /* size of port range */
-+    uint8_t  allow_access;            /* allow or deny access to range? */
-+};
-+typedef struct xen_domctl_ioport_permission xen_domctl_ioport_permission_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_permission_t);
-+
-+
-+#define XEN_DOMCTL_hypercall_init    22
-+struct xen_domctl_hypercall_init {
-+    uint64_aligned_t  gmfn;           /* GMFN to be initialised */
-+};
-+typedef struct xen_domctl_hypercall_init xen_domctl_hypercall_init_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hypercall_init_t);
-+
-+
-+#define XEN_DOMCTL_arch_setup        23
-+#define _XEN_DOMAINSETUP_hvm_guest 0
-+#define XEN_DOMAINSETUP_hvm_guest  (1UL<<_XEN_DOMAINSETUP_hvm_guest)
-+#define _XEN_DOMAINSETUP_query 1 /* Get parameters (for save)  */
-+#define XEN_DOMAINSETUP_query  (1UL<<_XEN_DOMAINSETUP_query)
-+#define _XEN_DOMAINSETUP_sioemu_guest 2
-+#define XEN_DOMAINSETUP_sioemu_guest  (1UL<<_XEN_DOMAINSETUP_sioemu_guest)
-+typedef struct xen_domctl_arch_setup {
-+    uint64_aligned_t flags;  /* XEN_DOMAINSETUP_* */
-+#ifdef __ia64__
-+    uint64_aligned_t bp;     /* mpaddr of boot param area */
-+    uint64_aligned_t maxmem; /* Highest memory address for MDT.  */
-+    uint64_aligned_t xsi_va; /* Xen shared_info area virtual address.  */
-+    uint32_t hypercall_imm;  /* Break imm for Xen hypercalls.  */
-+    int8_t vhpt_size_log2;   /* Log2 of VHPT size. */
-+#endif
-+} xen_domctl_arch_setup_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_arch_setup_t);
-+
-+
-+#define XEN_DOMCTL_settimeoffset     24
-+struct xen_domctl_settimeoffset {
-+    int32_t  time_offset_seconds; /* applied to domain wallclock time */
-+};
-+typedef struct xen_domctl_settimeoffset xen_domctl_settimeoffset_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_settimeoffset_t);
-+
-+ 
-+#define XEN_DOMCTL_gethvmcontext     33
-+#define XEN_DOMCTL_sethvmcontext     34
-+typedef struct xen_domctl_hvmcontext {
-+    uint32_t size; /* IN/OUT: size of buffer / bytes filled */
-+    XEN_GUEST_HANDLE_64(uint8) buffer; /* IN/OUT: data, or call
-+                                        * gethvmcontext with NULL
-+                                        * buffer to get size req'd */
-+} xen_domctl_hvmcontext_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_hvmcontext_t);
-+
-+
-+#define XEN_DOMCTL_set_address_size  35
-+#define XEN_DOMCTL_get_address_size  36
-+typedef struct xen_domctl_address_size {
-+    uint32_t size;
-+} xen_domctl_address_size_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_address_size_t);
-+
-+
-+#define XEN_DOMCTL_real_mode_area    26
-+struct xen_domctl_real_mode_area {
-+    uint32_t log; /* log2 of Real Mode Area size */
-+};
-+typedef struct xen_domctl_real_mode_area xen_domctl_real_mode_area_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_real_mode_area_t);
-+
-+
-+#define XEN_DOMCTL_sendtrigger       28
-+#define XEN_DOMCTL_SENDTRIGGER_NMI    0
-+#define XEN_DOMCTL_SENDTRIGGER_RESET  1
-+#define XEN_DOMCTL_SENDTRIGGER_INIT   2
-+struct xen_domctl_sendtrigger {
-+    uint32_t  trigger;  /* IN */
-+    uint32_t  vcpu;     /* IN */
-+};
-+typedef struct xen_domctl_sendtrigger xen_domctl_sendtrigger_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_sendtrigger_t);
-+
-+
-+/* Assign PCI device to HVM guest. Sets up IOMMU structures. */
-+#define XEN_DOMCTL_assign_device      37
-+#define XEN_DOMCTL_test_assign_device 45
-+#define XEN_DOMCTL_deassign_device 47
-+struct xen_domctl_assign_device {
-+    uint32_t  machine_bdf;   /* machine PCI ID of assigned device */
-+};
-+typedef struct xen_domctl_assign_device xen_domctl_assign_device_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_assign_device_t);
-+
-+/* Retrieve sibling devices infomation of machine_bdf */
-+#define XEN_DOMCTL_get_device_group 50
-+struct xen_domctl_get_device_group {
-+    uint32_t  machine_bdf;      /* IN */
-+    uint32_t  max_sdevs;        /* IN */
-+    uint32_t  num_sdevs;        /* OUT */
-+    XEN_GUEST_HANDLE_64(uint32)  sdev_array;   /* OUT */
-+};
-+typedef struct xen_domctl_get_device_group xen_domctl_get_device_group_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_get_device_group_t);
-+
-+/* Pass-through interrupts: bind real irq -> hvm devfn. */
-+#define XEN_DOMCTL_bind_pt_irq       38
-+#define XEN_DOMCTL_unbind_pt_irq     48
-+typedef enum pt_irq_type_e {
-+    PT_IRQ_TYPE_PCI,
-+    PT_IRQ_TYPE_ISA,
-+    PT_IRQ_TYPE_MSI,
-+} pt_irq_type_t;
-+struct xen_domctl_bind_pt_irq {
-+    uint32_t machine_irq;
-+    pt_irq_type_t irq_type;
-+    uint32_t hvm_domid;
-+
-+    union {
-+        struct {
-+            uint8_t isa_irq;
-+        } isa;
-+        struct {
-+            uint8_t bus;
-+            uint8_t device;
-+            uint8_t intx;
-+        } pci;
-+        struct {
-+            uint8_t gvec;
-+            uint32_t gflags;
-+        } msi;
-+    } u;
-+};
-+typedef struct xen_domctl_bind_pt_irq xen_domctl_bind_pt_irq_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_bind_pt_irq_t);
-+
-+
-+/* Bind machine I/O address range -> HVM address range. */
-+#define XEN_DOMCTL_memory_mapping    39
-+#define DPCI_ADD_MAPPING         1
-+#define DPCI_REMOVE_MAPPING      0
-+struct xen_domctl_memory_mapping {
-+    uint64_aligned_t first_gfn; /* first page (hvm guest phys page) in range */
-+    uint64_aligned_t first_mfn; /* first page (machine page) in range */
-+    uint64_aligned_t nr_mfns;   /* number of pages in range (>0) */
-+    uint32_t add_mapping;       /* add or remove mapping */
-+    uint32_t padding;           /* padding for 64-bit aligned structure */
-+};
-+typedef struct xen_domctl_memory_mapping xen_domctl_memory_mapping_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_memory_mapping_t);
-+
-+
-+/* Bind machine I/O port range -> HVM I/O port range. */
-+#define XEN_DOMCTL_ioport_mapping    40
-+struct xen_domctl_ioport_mapping {
-+    uint32_t first_gport;     /* first guest IO port*/
-+    uint32_t first_mport;     /* first machine IO port */
-+    uint32_t nr_ports;        /* size of port range */
-+    uint32_t add_mapping;     /* add or remove mapping */
-+};
-+typedef struct xen_domctl_ioport_mapping xen_domctl_ioport_mapping_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ioport_mapping_t);
-+
-+
-+/*
-+ * Pin caching type of RAM space for x86 HVM domU.
-+ */
-+#define XEN_DOMCTL_pin_mem_cacheattr 41
-+/* Caching types: these happen to be the same as x86 MTRR/PAT type codes. */
-+#define XEN_DOMCTL_MEM_CACHEATTR_UC  0
-+#define XEN_DOMCTL_MEM_CACHEATTR_WC  1
-+#define XEN_DOMCTL_MEM_CACHEATTR_WT  4
-+#define XEN_DOMCTL_MEM_CACHEATTR_WP  5
-+#define XEN_DOMCTL_MEM_CACHEATTR_WB  6
-+#define XEN_DOMCTL_MEM_CACHEATTR_UCM 7
-+struct xen_domctl_pin_mem_cacheattr {
-+    uint64_aligned_t start, end;
-+    unsigned int type; /* XEN_DOMCTL_MEM_CACHEATTR_* */
-+};
-+typedef struct xen_domctl_pin_mem_cacheattr xen_domctl_pin_mem_cacheattr_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_pin_mem_cacheattr_t);
-+
-+
-+#define XEN_DOMCTL_set_ext_vcpucontext 42
-+#define XEN_DOMCTL_get_ext_vcpucontext 43
-+struct xen_domctl_ext_vcpucontext {
-+    /* IN: VCPU that this call applies to. */
-+    uint32_t         vcpu;
-+    /*
-+     * SET: Size of struct (IN)
-+     * GET: Size of struct (OUT)
-+     */
-+    uint32_t         size;
-+#if defined(__i386__) || defined(__x86_64__)
-+    /* SYSCALL from 32-bit mode and SYSENTER callback information. */
-+    /* NB. SYSCALL from 64-bit mode is contained in vcpu_guest_context_t */
-+    uint64_aligned_t syscall32_callback_eip;
-+    uint64_aligned_t sysenter_callback_eip;
-+    uint16_t         syscall32_callback_cs;
-+    uint16_t         sysenter_callback_cs;
-+    uint8_t          syscall32_disables_events;
-+    uint8_t          sysenter_disables_events;
-+#endif
-+};
-+typedef struct xen_domctl_ext_vcpucontext xen_domctl_ext_vcpucontext_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_ext_vcpucontext_t);
-+
-+/*
-+ * Set optimizaton features for a domain
-+ */
-+#define XEN_DOMCTL_set_opt_feature    44
-+struct xen_domctl_set_opt_feature {
-+#if defined(__ia64__)
-+    struct xen_ia64_opt_feature optf;
-+#else
-+    /* Make struct non-empty: do not depend on this field name! */
-+    uint64_t dummy;
-+#endif
-+};
-+typedef struct xen_domctl_set_opt_feature xen_domctl_set_opt_feature_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_opt_feature_t);
-+
-+/*
-+ * Set the target domain for a domain
-+ */
-+#define XEN_DOMCTL_set_target    46
-+struct xen_domctl_set_target {
-+    domid_t target;
-+};
-+typedef struct xen_domctl_set_target xen_domctl_set_target_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_set_target_t);
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+# define XEN_CPUID_INPUT_UNUSED  0xFFFFFFFF
-+# define XEN_DOMCTL_set_cpuid 49
-+struct xen_domctl_cpuid {
-+  unsigned int  input[2];
-+  unsigned int  eax;
-+  unsigned int  ebx;
-+  unsigned int  ecx;
-+  unsigned int  edx;
-+};
-+typedef struct xen_domctl_cpuid xen_domctl_cpuid_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_cpuid_t);
-+#endif
-+
-+#define XEN_DOMCTL_subscribe          29
-+struct xen_domctl_subscribe {
-+    uint32_t port; /* IN */
-+};
-+typedef struct xen_domctl_subscribe xen_domctl_subscribe_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_subscribe_t);
-+
-+/*
-+ * Define the maximum machine address size which should be allocated
-+ * to a guest.
-+ */
-+#define XEN_DOMCTL_set_machine_address_size  51
-+#define XEN_DOMCTL_get_machine_address_size  52
-+
-+/*
-+ * Do not inject spurious page faults into this domain.
-+ */
-+#define XEN_DOMCTL_suppress_spurious_page_faults 53
-+
-+struct xen_domctl {
-+    uint32_t cmd;
-+    uint32_t interface_version; /* XEN_DOMCTL_INTERFACE_VERSION */
-+    domid_t  domain;
-+    union {
-+        struct xen_domctl_createdomain      createdomain;
-+        struct xen_domctl_getdomaininfo     getdomaininfo;
-+        struct xen_domctl_getmemlist        getmemlist;
-+        struct xen_domctl_getpageframeinfo  getpageframeinfo;
-+        struct xen_domctl_getpageframeinfo2 getpageframeinfo2;
-+        struct xen_domctl_vcpuaffinity      vcpuaffinity;
-+        struct xen_domctl_shadow_op         shadow_op;
-+        struct xen_domctl_max_mem           max_mem;
-+        struct xen_domctl_vcpucontext       vcpucontext;
-+        struct xen_domctl_getvcpuinfo       getvcpuinfo;
-+        struct xen_domctl_max_vcpus         max_vcpus;
-+        struct xen_domctl_scheduler_op      scheduler_op;
-+        struct xen_domctl_setdomainhandle   setdomainhandle;
-+        struct xen_domctl_setdebugging      setdebugging;
-+        struct xen_domctl_irq_permission    irq_permission;
-+        struct xen_domctl_iomem_permission  iomem_permission;
-+        struct xen_domctl_ioport_permission ioport_permission;
-+        struct xen_domctl_hypercall_init    hypercall_init;
-+        struct xen_domctl_arch_setup        arch_setup;
-+        struct xen_domctl_settimeoffset     settimeoffset;
-+        struct xen_domctl_real_mode_area    real_mode_area;
-+        struct xen_domctl_hvmcontext        hvmcontext;
-+        struct xen_domctl_address_size      address_size;
-+        struct xen_domctl_sendtrigger       sendtrigger;
-+        struct xen_domctl_get_device_group  get_device_group;
-+        struct xen_domctl_assign_device     assign_device;
-+        struct xen_domctl_bind_pt_irq       bind_pt_irq;
-+        struct xen_domctl_memory_mapping    memory_mapping;
-+        struct xen_domctl_ioport_mapping    ioport_mapping;
-+        struct xen_domctl_pin_mem_cacheattr pin_mem_cacheattr;
-+        struct xen_domctl_ext_vcpucontext   ext_vcpucontext;
-+        struct xen_domctl_set_opt_feature   set_opt_feature;
-+        struct xen_domctl_set_target        set_target;
-+        struct xen_domctl_subscribe         subscribe;
-+#if defined(__i386__) || defined(__x86_64__)
-+        struct xen_domctl_cpuid             cpuid;
-+#endif
-+        uint8_t                             pad[128];
-+    } u;
-+};
-+typedef struct xen_domctl xen_domctl_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_domctl_t);
-+
-+#endif /* __XEN_PUBLIC_DOMCTL_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/hvm/e820.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/e820.h   2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,34 @@
-+
-+/*
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_E820_H__
-+#define __XEN_PUBLIC_HVM_E820_H__
-+
-+/* E820 location in HVM virtual address space. */
-+#define HVM_E820_PAGE        0x00090000
-+#define HVM_E820_NR_OFFSET   0x000001E8
-+#define HVM_E820_OFFSET      0x000002D0
-+
-+#define HVM_BELOW_4G_RAM_END        0xF0000000
-+#define HVM_BELOW_4G_MMIO_START     HVM_BELOW_4G_RAM_END
-+#define HVM_BELOW_4G_MMIO_LENGTH    ((1ULL << 32) - HVM_BELOW_4G_MMIO_START)
-+
-+#endif /* __XEN_PUBLIC_HVM_E820_H__ */
-Index: head-2008-11-25/include/xen/interface/hvm/hvm_info_table.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/hvm_info_table.h 2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,41 @@
-+/******************************************************************************
-+ * hvm/hvm_info_table.h
-+ * 
-+ * HVM parameter and information table, written into guest memory map.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__
-+#define __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__
-+
-+#define HVM_INFO_PFN         0x09F
-+#define HVM_INFO_OFFSET      0x800
-+#define HVM_INFO_PADDR       ((HVM_INFO_PFN << 12) + HVM_INFO_OFFSET)
-+
-+struct hvm_info_table {
-+    char        signature[8]; /* "HVM INFO" */
-+    uint32_t    length;
-+    uint8_t     checksum;
-+    uint8_t     acpi_enabled;
-+    uint8_t     apic_mode;
-+    uint32_t    nr_vcpus;
-+};
-+
-+#endif /* __XEN_PUBLIC_HVM_HVM_INFO_TABLE_H__ */
-Index: head-2008-11-25/include/xen/interface/hvm/hvm_op.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/hvm_op.h 2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,131 @@
-+/*
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_HVM_OP_H__
-+#define __XEN_PUBLIC_HVM_HVM_OP_H__
-+
-+/* Get/set subcommands: extra argument == pointer to xen_hvm_param struct. */
-+#define HVMOP_set_param           0
-+#define HVMOP_get_param           1
-+struct xen_hvm_param {
-+    domid_t  domid;    /* IN */
-+    uint32_t index;    /* IN */
-+    uint64_t value;    /* IN/OUT */
-+};
-+typedef struct xen_hvm_param xen_hvm_param_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_param_t);
-+
-+/* Set the logical level of one of a domain's PCI INTx wires. */
-+#define HVMOP_set_pci_intx_level  2
-+struct xen_hvm_set_pci_intx_level {
-+    /* Domain to be updated. */
-+    domid_t  domid;
-+    /* PCI INTx identification in PCI topology (domain:bus:device:intx). */
-+    uint8_t  domain, bus, device, intx;
-+    /* Assertion level (0 = unasserted, 1 = asserted). */
-+    uint8_t  level;
-+};
-+typedef struct xen_hvm_set_pci_intx_level xen_hvm_set_pci_intx_level_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_intx_level_t);
-+
-+/* Set the logical level of one of a domain's ISA IRQ wires. */
-+#define HVMOP_set_isa_irq_level   3
-+struct xen_hvm_set_isa_irq_level {
-+    /* Domain to be updated. */
-+    domid_t  domid;
-+    /* ISA device identification, by ISA IRQ (0-15). */
-+    uint8_t  isa_irq;
-+    /* Assertion level (0 = unasserted, 1 = asserted). */
-+    uint8_t  level;
-+};
-+typedef struct xen_hvm_set_isa_irq_level xen_hvm_set_isa_irq_level_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_isa_irq_level_t);
-+
-+#define HVMOP_set_pci_link_route  4
-+struct xen_hvm_set_pci_link_route {
-+    /* Domain to be updated. */
-+    domid_t  domid;
-+    /* PCI link identifier (0-3). */
-+    uint8_t  link;
-+    /* ISA IRQ (1-15), or 0 (disable link). */
-+    uint8_t  isa_irq;
-+};
-+typedef struct xen_hvm_set_pci_link_route xen_hvm_set_pci_link_route_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_pci_link_route_t);
-+
-+/* Flushes all VCPU TLBs: @arg must be NULL. */
-+#define HVMOP_flush_tlbs          5
-+
-+/* Following tools-only interfaces may change in future. */
-+#if defined(__XEN__) || defined(__XEN_TOOLS__)
-+
-+/* Track dirty VRAM. */
-+#define HVMOP_track_dirty_vram    6
-+struct xen_hvm_track_dirty_vram {
-+    /* Domain to be tracked. */
-+    domid_t  domid;
-+    /* First pfn to track. */
-+    uint64_aligned_t first_pfn;
-+    /* Number of pages to track. */
-+    uint64_aligned_t nr;
-+    /* OUT variable. */
-+    /* Dirty bitmap buffer. */
-+    XEN_GUEST_HANDLE_64(uint8) dirty_bitmap;
-+};
-+typedef struct xen_hvm_track_dirty_vram xen_hvm_track_dirty_vram_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_track_dirty_vram_t);
-+
-+/* Notify that some pages got modified by the Device Model. */
-+#define HVMOP_modified_memory    7
-+struct xen_hvm_modified_memory {
-+    /* Domain to be updated. */
-+    domid_t  domid;
-+    /* First pfn. */
-+    uint64_aligned_t first_pfn;
-+    /* Number of pages. */
-+    uint64_aligned_t nr;
-+};
-+typedef struct xen_hvm_modified_memory xen_hvm_modified_memory_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_modified_memory_t);
-+
-+#define HVMOP_set_mem_type    8
-+typedef enum {
-+    HVMMEM_ram_rw,             /* Normal read/write guest RAM */
-+    HVMMEM_ram_ro,             /* Read-only; writes are discarded */
-+    HVMMEM_mmio_dm,            /* Reads and write go to the device model */
-+} hvmmem_type_t;
-+/* Notify that a region of memory is to be treated in a specific way. */
-+struct xen_hvm_set_mem_type {
-+    /* Domain to be updated. */
-+    domid_t domid;
-+    /* Memory type */
-+    hvmmem_type_t hvmmem_type;
-+    /* First pfn. */
-+    uint64_aligned_t first_pfn;
-+    /* Number of pages. */
-+    uint64_aligned_t nr;
-+};
-+typedef struct xen_hvm_set_mem_type xen_hvm_set_mem_type_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_hvm_set_mem_type_t);
-+
-+
-+#endif /* defined(__XEN__) || defined(__XEN_TOOLS__) */
-+
-+#endif /* __XEN_PUBLIC_HVM_HVM_OP_H__ */
-Index: head-2008-11-25/include/xen/interface/hvm/ioreq.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/ioreq.h  2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,127 @@
-+/*
-+ * ioreq.h: I/O request definitions for device models
-+ * Copyright (c) 2004, Intel Corporation.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef _IOREQ_H_
-+#define _IOREQ_H_
-+
-+#define IOREQ_READ      1
-+#define IOREQ_WRITE     0
-+
-+#define STATE_IOREQ_NONE        0
-+#define STATE_IOREQ_READY       1
-+#define STATE_IOREQ_INPROCESS   2
-+#define STATE_IORESP_READY      3
-+
-+#define IOREQ_TYPE_PIO          0 /* pio */
-+#define IOREQ_TYPE_COPY         1 /* mmio ops */
-+#define IOREQ_TYPE_TIMEOFFSET   7
-+#define IOREQ_TYPE_INVALIDATE   8 /* mapcache */
-+
-+/*
-+ * VMExit dispatcher should cooperate with instruction decoder to
-+ * prepare this structure and notify service OS and DM by sending
-+ * virq
-+ */
-+struct ioreq {
-+    uint64_t addr;          /*  physical address            */
-+    uint64_t size;          /*  size in bytes               */
-+    uint64_t count;         /*  for rep prefixes            */
-+    uint64_t data;          /*  data (or paddr of data)     */
-+    uint8_t state:4;
-+    uint8_t data_is_ptr:1;  /*  if 1, data above is the guest paddr 
-+                             *   of the real data to use.   */
-+    uint8_t dir:1;          /*  1=read, 0=write             */
-+    uint8_t df:1;
-+    uint8_t pad:1;
-+    uint8_t type;           /* I/O type                     */
-+    uint8_t _pad0[6];
-+    uint64_t io_count;      /* How many IO done on a vcpu   */
-+};
-+typedef struct ioreq ioreq_t;
-+
-+struct vcpu_iodata {
-+    struct ioreq vp_ioreq;
-+    /* Event channel port, used for notifications to/from the device model. */
-+    uint32_t vp_eport;
-+    uint32_t _pad0;
-+};
-+typedef struct vcpu_iodata vcpu_iodata_t;
-+
-+struct shared_iopage {
-+    struct vcpu_iodata   vcpu_iodata[1];
-+};
-+typedef struct shared_iopage shared_iopage_t;
-+
-+struct buf_ioreq {
-+    uint8_t  type;   /* I/O type                    */
-+    uint8_t  pad:1;
-+    uint8_t  dir:1;  /* 1=read, 0=write             */
-+    uint8_t  size:2; /* 0=>1, 1=>2, 2=>4, 3=>8. If 8, use two buf_ioreqs */
-+    uint32_t addr:20;/* physical address            */
-+    uint32_t data;   /* data                        */
-+};
-+typedef struct buf_ioreq buf_ioreq_t;
-+
-+#define IOREQ_BUFFER_SLOT_NUM     511 /* 8 bytes each, plus 2 4-byte indexes */
-+struct buffered_iopage {
-+    unsigned int read_pointer;
-+    unsigned int write_pointer;
-+    buf_ioreq_t buf_ioreq[IOREQ_BUFFER_SLOT_NUM];
-+}; /* NB. Size of this structure must be no greater than one page. */
-+typedef struct buffered_iopage buffered_iopage_t;
-+
-+#if defined(__ia64__)
-+struct pio_buffer {
-+    uint32_t page_offset;
-+    uint32_t pointer;
-+    uint32_t data_end;
-+    uint32_t buf_size;
-+    void *opaque;
-+};
-+
-+#define PIO_BUFFER_IDE_PRIMARY   0 /* I/O port = 0x1F0 */
-+#define PIO_BUFFER_IDE_SECONDARY 1 /* I/O port = 0x170 */
-+#define PIO_BUFFER_ENTRY_NUM     2
-+struct buffered_piopage {
-+    struct pio_buffer pio[PIO_BUFFER_ENTRY_NUM];
-+    uint8_t buffer[1];
-+};
-+#endif /* defined(__ia64__) */
-+
-+#define ACPI_PM1A_EVT_BLK_ADDRESS           0x0000000000001f40
-+#define ACPI_PM1A_CNT_BLK_ADDRESS           (ACPI_PM1A_EVT_BLK_ADDRESS + 0x04)
-+#define ACPI_PM_TMR_BLK_ADDRESS             (ACPI_PM1A_EVT_BLK_ADDRESS + 0x08)
-+#define ACPI_GPE0_BLK_ADDRESS               (ACPI_PM_TMR_BLK_ADDRESS + 0x20)
-+#define ACPI_GPE0_BLK_LEN                   0x08
-+
-+#endif /* _IOREQ_H_ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/hvm/params.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/params.h 2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,105 @@
-+/*
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_PARAMS_H__
-+#define __XEN_PUBLIC_HVM_PARAMS_H__
-+
-+#include "hvm_op.h"
-+
-+/*
-+ * Parameter space for HVMOP_{set,get}_param.
-+ */
-+
-+/*
-+ * How should CPU0 event-channel notifications be delivered?
-+ * val[63:56] == 0: val[55:0] is a delivery GSI (Global System Interrupt).
-+ * val[63:56] == 1: val[55:0] is a delivery PCI INTx line, as follows:
-+ *                  Domain = val[47:32], Bus  = val[31:16],
-+ *                  DevFn  = val[15: 8], IntX = val[ 1: 0]
-+ * If val == 0 then CPU0 event-channel notifications are not delivered.
-+ */
-+#define HVM_PARAM_CALLBACK_IRQ 0
-+
-+/*
-+ * These are not used by Xen. They are here for convenience of HVM-guest
-+ * xenbus implementations.
-+ */
-+#define HVM_PARAM_STORE_PFN    1
-+#define HVM_PARAM_STORE_EVTCHN 2
-+
-+#define HVM_PARAM_PAE_ENABLED  4
-+
-+#define HVM_PARAM_IOREQ_PFN    5
-+
-+#define HVM_PARAM_BUFIOREQ_PFN 6
-+
-+#ifdef __ia64__
-+
-+#define HVM_PARAM_NVRAM_FD     7
-+#define HVM_PARAM_VHPT_SIZE    8
-+#define HVM_PARAM_BUFPIOREQ_PFN       9
-+
-+#elif defined(__i386__) || defined(__x86_64__)
-+
-+/* Expose Viridian interfaces to this HVM guest? */
-+#define HVM_PARAM_VIRIDIAN     9
-+
-+#endif
-+
-+/*
-+ * Set mode for virtual timers (currently x86 only):
-+ *  delay_for_missed_ticks (default):
-+ *   Do not advance a vcpu's time beyond the correct delivery time for
-+ *   interrupts that have been missed due to preemption. Deliver missed
-+ *   interrupts when the vcpu is rescheduled and advance the vcpu's virtual
-+ *   time stepwise for each one.
-+ *  no_delay_for_missed_ticks:
-+ *   As above, missed interrupts are delivered, but guest time always tracks
-+ *   wallclock (i.e., real) time while doing so.
-+ *  no_missed_ticks_pending:
-+ *   No missed interrupts are held pending. Instead, to ensure ticks are
-+ *   delivered at some non-zero rate, if we detect missed ticks then the
-+ *   internal tick alarm is not disabled if the VCPU is preempted during the
-+ *   next tick period.
-+ *  one_missed_tick_pending:
-+ *   Missed interrupts are collapsed together and delivered as one 'late tick'.
-+ *   Guest time always tracks wallclock (i.e., real) time.
-+ */
-+#define HVM_PARAM_TIMER_MODE   10
-+#define HVMPTM_delay_for_missed_ticks    0
-+#define HVMPTM_no_delay_for_missed_ticks 1
-+#define HVMPTM_no_missed_ticks_pending   2
-+#define HVMPTM_one_missed_tick_pending   3
-+
-+/* Boolean: Enable virtual HPET (high-precision event timer)? (x86-only) */
-+#define HVM_PARAM_HPET_ENABLED 11
-+
-+/* Identity-map page directory used by Intel EPT when CR0.PG=0. */
-+#define HVM_PARAM_IDENT_PT     12
-+
-+/* Device Model domain, defaults to 0. */
-+#define HVM_PARAM_DM_DOMAIN    13
-+
-+/* ACPI S state: currently support S0 and S3 on x86. */
-+#define HVM_PARAM_ACPI_S_STATE 14
-+
-+#define HVM_NR_PARAMS          15
-+
-+#endif /* __XEN_PUBLIC_HVM_PARAMS_H__ */
-Index: head-2008-11-25/include/xen/interface/hvm/save.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/hvm/save.h   2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,88 @@
-+/* 
-+ * hvm/save.h
-+ *
-+ * Structure definitions for HVM state that is held by Xen and must
-+ * be saved along with the domain's memory and device-model state.
-+ * 
-+ * Copyright (c) 2007 XenSource Ltd.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_PUBLIC_HVM_SAVE_H__
-+#define __XEN_PUBLIC_HVM_SAVE_H__
-+
-+/*
-+ * Structures in this header *must* have the same layout in 32bit 
-+ * and 64bit environments: this means that all fields must be explicitly 
-+ * sized types and aligned to their sizes, and the structs must be 
-+ * a multiple of eight bytes long.
-+ *
-+ * Only the state necessary for saving and restoring (i.e. fields 
-+ * that are analogous to actual hardware state) should go in this file. 
-+ * Internal mechanisms should be kept in Xen-private headers.
-+ */
-+
-+#if !defined(__GNUC__) || defined(__STRICT_ANSI__)
-+#error "Anonymous structs/unions are a GNU extension."
-+#endif
-+
-+/* 
-+ * Each entry is preceded by a descriptor giving its type and length
-+ */
-+struct hvm_save_descriptor {
-+    uint16_t typecode;          /* Used to demux the various types below */
-+    uint16_t instance;          /* Further demux within a type */
-+    uint32_t length;            /* In bytes, *not* including this descriptor */
-+};
-+
-+
-+/* 
-+ * Each entry has a datatype associated with it: for example, the CPU state 
-+ * is saved as a HVM_SAVE_TYPE(CPU), which has HVM_SAVE_LENGTH(CPU), 
-+ * and is identified by a descriptor with typecode HVM_SAVE_CODE(CPU).
-+ * DECLARE_HVM_SAVE_TYPE binds these things together with some type-system
-+ * ugliness.
-+ */
-+
-+#define DECLARE_HVM_SAVE_TYPE(_x, _code, _type)                   \
-+  struct __HVM_SAVE_TYPE_##_x { _type t; char c[_code]; }
-+
-+#define HVM_SAVE_TYPE(_x) typeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->t)
-+#define HVM_SAVE_LENGTH(_x) (sizeof (HVM_SAVE_TYPE(_x)))
-+#define HVM_SAVE_CODE(_x) (sizeof (((struct __HVM_SAVE_TYPE_##_x *)(0))->c))
-+
-+
-+/* 
-+ * The series of save records is teminated by a zero-type, zero-length 
-+ * descriptor.
-+ */
-+
-+struct hvm_save_end {};
-+DECLARE_HVM_SAVE_TYPE(END, 0, struct hvm_save_end);
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+#include "../arch-x86/hvm/save.h"
-+#elif defined(__ia64__)
-+#include "../arch-ia64/hvm/save.h"
-+#else
-+#error "unsupported architecture"
-+#endif
-+
-+#endif /* __XEN_PUBLIC_HVM_SAVE_H__ */
-Index: head-2008-11-25/include/xen/interface/io/fsif.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/io/fsif.h    2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,191 @@
-+/******************************************************************************
-+ * fsif.h
-+ * 
-+ * Interface to FS level split device drivers.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2007, Grzegorz Milos, <gm281@cam.ac.uk>.
-+ */
-+
-+#ifndef __XEN_PUBLIC_IO_FSIF_H__
-+#define __XEN_PUBLIC_IO_FSIF_H__
-+
-+#include "ring.h"
-+#include "../grant_table.h"
-+
-+#define REQ_FILE_OPEN        1
-+#define REQ_FILE_CLOSE       2
-+#define REQ_FILE_READ        3
-+#define REQ_FILE_WRITE       4
-+#define REQ_STAT             5
-+#define REQ_FILE_TRUNCATE    6
-+#define REQ_REMOVE           7
-+#define REQ_RENAME           8
-+#define REQ_CREATE           9
-+#define REQ_DIR_LIST        10
-+#define REQ_CHMOD           11
-+#define REQ_FS_SPACE        12
-+#define REQ_FILE_SYNC       13
-+
-+struct fsif_open_request {
-+    grant_ref_t gref;
-+};
-+
-+struct fsif_close_request {
-+    uint32_t fd;
-+};
-+
-+struct fsif_read_request {
-+    uint32_t fd;
-+    int32_t pad;
-+    uint64_t len;
-+    uint64_t offset;
-+    grant_ref_t grefs[1];  /* Variable length */
-+};
-+
-+struct fsif_write_request {
-+    uint32_t fd;
-+    int32_t pad;
-+    uint64_t len;
-+    uint64_t offset;
-+    grant_ref_t grefs[1];  /* Variable length */
-+};
-+
-+struct fsif_stat_request {
-+    uint32_t fd;
-+};
-+
-+/* This structure is a copy of some fields from stat structure, returned
-+ * via the ring. */
-+struct fsif_stat_response {
-+    int32_t  stat_mode;
-+    uint32_t stat_uid;
-+    uint32_t stat_gid;
-+    int32_t  stat_ret;
-+    int64_t  stat_size;
-+    int64_t  stat_atime;
-+    int64_t  stat_mtime;
-+    int64_t  stat_ctime;
-+};
-+
-+struct fsif_truncate_request {
-+    uint32_t fd;
-+    int32_t pad;
-+    int64_t length;
-+};
-+
-+struct fsif_remove_request {
-+    grant_ref_t gref;
-+};
-+
-+struct fsif_rename_request {
-+    uint16_t old_name_offset;
-+    uint16_t new_name_offset;
-+    grant_ref_t gref;
-+};
-+
-+struct fsif_create_request {
-+    int8_t directory;
-+    int8_t pad;
-+    int16_t pad2;
-+    int32_t mode;
-+    grant_ref_t gref;
-+};
-+
-+struct fsif_list_request {
-+    uint32_t offset;
-+    grant_ref_t gref;
-+};
-+
-+#define NR_FILES_SHIFT  0
-+#define NR_FILES_SIZE   16   /* 16 bits for the number of files mask */
-+#define NR_FILES_MASK   (((1ULL << NR_FILES_SIZE) - 1) << NR_FILES_SHIFT)
-+#define ERROR_SIZE      32   /* 32 bits for the error mask */
-+#define ERROR_SHIFT     (NR_FILES_SIZE + NR_FILES_SHIFT)
-+#define ERROR_MASK      (((1ULL << ERROR_SIZE) - 1) << ERROR_SHIFT)
-+#define HAS_MORE_SHIFT  (ERROR_SHIFT + ERROR_SIZE)    
-+#define HAS_MORE_FLAG   (1ULL << HAS_MORE_SHIFT)
-+
-+struct fsif_chmod_request {
-+    uint32_t fd;
-+    int32_t mode;
-+};
-+
-+struct fsif_space_request {
-+    grant_ref_t gref;
-+};
-+
-+struct fsif_sync_request {
-+    uint32_t fd;
-+};
-+
-+
-+/* FS operation request */
-+struct fsif_request {
-+    uint8_t type;                 /* Type of the request                  */
-+    uint8_t pad;
-+    uint16_t id;                  /* Request ID, copied to the response   */
-+    uint32_t pad2;
-+    union {
-+        struct fsif_open_request     fopen;
-+        struct fsif_close_request    fclose;
-+        struct fsif_read_request     fread;
-+        struct fsif_write_request    fwrite;
-+        struct fsif_stat_request     fstat;
-+        struct fsif_truncate_request ftruncate;
-+        struct fsif_remove_request   fremove;
-+        struct fsif_rename_request   frename;
-+        struct fsif_create_request   fcreate;
-+        struct fsif_list_request     flist;
-+        struct fsif_chmod_request    fchmod;
-+        struct fsif_space_request    fspace;
-+        struct fsif_sync_request     fsync;
-+    } u;
-+};
-+typedef struct fsif_request fsif_request_t;
-+
-+/* FS operation response */
-+struct fsif_response {
-+    uint16_t id;
-+    uint16_t pad1;
-+    uint32_t pad2;
-+    union {
-+        uint64_t ret_val;
-+        struct fsif_stat_response fstat;
-+    };
-+};
-+
-+typedef struct fsif_response fsif_response_t;
-+
-+#define FSIF_RING_ENTRY_SIZE   64
-+
-+#define FSIF_NR_READ_GNTS  ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_read_request)) /  \
-+                                sizeof(grant_ref_t) + 1)
-+#define FSIF_NR_WRITE_GNTS ((FSIF_RING_ENTRY_SIZE - sizeof(struct fsif_write_request)) / \
-+                                sizeof(grant_ref_t) + 1)
-+
-+DEFINE_RING_TYPES(fsif, struct fsif_request, struct fsif_response);
-+
-+#define STATE_INITIALISED     "init"
-+#define STATE_READY           "ready"
-+
-+
-+
-+#endif
-Index: head-2008-11-25/include/xen/interface/io/pciif.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/io/pciif.h   2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,101 @@
-+/*
-+ * PCI Backend/Frontend Common Data Structures & Macros
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#ifndef __XEN_PCI_COMMON_H__
-+#define __XEN_PCI_COMMON_H__
-+
-+/* Be sure to bump this number if you change this file */
-+#define XEN_PCI_MAGIC "7"
-+
-+/* xen_pci_sharedinfo flags */
-+#define _XEN_PCIF_active     (0)
-+#define XEN_PCIF_active      (1<<_XEN_PCI_active)
-+
-+/* xen_pci_op commands */
-+#define XEN_PCI_OP_conf_read    (0)
-+#define XEN_PCI_OP_conf_write   (1)
-+#define XEN_PCI_OP_enable_msi   (2)
-+#define XEN_PCI_OP_disable_msi  (3)
-+#define XEN_PCI_OP_enable_msix  (4)
-+#define XEN_PCI_OP_disable_msix (5)
-+
-+/* xen_pci_op error numbers */
-+#define XEN_PCI_ERR_success          (0)
-+#define XEN_PCI_ERR_dev_not_found   (-1)
-+#define XEN_PCI_ERR_invalid_offset  (-2)
-+#define XEN_PCI_ERR_access_denied   (-3)
-+#define XEN_PCI_ERR_not_implemented (-4)
-+/* XEN_PCI_ERR_op_failed - backend failed to complete the operation */
-+#define XEN_PCI_ERR_op_failed       (-5)
-+
-+/*
-+ * it should be PAGE_SIZE-sizeof(struct xen_pci_op))/sizeof(struct msix_entry))
-+ * Should not exceed 128
-+ */
-+#define SH_INFO_MAX_VEC     128
-+
-+struct xen_msix_entry {
-+    uint16_t vector;
-+    uint16_t entry;
-+};
-+struct xen_pci_op {
-+    /* IN: what action to perform: XEN_PCI_OP_* */
-+    uint32_t cmd;
-+
-+    /* OUT: will contain an error number (if any) from errno.h */
-+    int32_t err;
-+
-+    /* IN: which device to touch */
-+    uint32_t domain; /* PCI Domain/Segment */
-+    uint32_t bus;
-+    uint32_t devfn;
-+
-+    /* IN: which configuration registers to touch */
-+    int32_t offset;
-+    int32_t size;
-+
-+    /* IN/OUT: Contains the result after a READ or the value to WRITE */
-+    uint32_t value;
-+    /* IN: Contains extra infor for this operation */
-+    uint32_t info;
-+    /*IN:  param for msi-x */
-+    struct xen_msix_entry msix_entries[SH_INFO_MAX_VEC];
-+};
-+
-+struct xen_pci_sharedinfo {
-+    /* flags - XEN_PCIF_* */
-+    uint32_t flags;
-+    struct xen_pci_op op;
-+};
-+
-+#endif /* __XEN_PCI_COMMON_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/io/tpmif.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/io/tpmif.h   2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,77 @@
-+/******************************************************************************
-+ * tpmif.h
-+ *
-+ * TPM I/O interface for Xen guest OSes.
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2005, IBM Corporation
-+ *
-+ * Author: Stefan Berger, stefanb@us.ibm.com
-+ * Grant table support: Mahadevan Gomathisankaran
-+ *
-+ * This code has been derived from tools/libxc/xen/io/netif.h
-+ *
-+ * Copyright (c) 2003-2004, Keir Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_IO_TPMIF_H__
-+#define __XEN_PUBLIC_IO_TPMIF_H__
-+
-+#include "../grant_table.h"
-+
-+struct tpmif_tx_request {
-+    unsigned long addr;   /* Machine address of packet.   */
-+    grant_ref_t ref;      /* grant table access reference */
-+    uint16_t unused;
-+    uint16_t size;        /* Packet size in bytes.        */
-+};
-+typedef struct tpmif_tx_request tpmif_tx_request_t;
-+
-+/*
-+ * The TPMIF_TX_RING_SIZE defines the number of pages the
-+ * front-end and backend can exchange (= size of array).
-+ */
-+typedef uint32_t TPMIF_RING_IDX;
-+
-+#define TPMIF_TX_RING_SIZE 1
-+
-+/* This structure must fit in a memory page. */
-+
-+struct tpmif_ring {
-+    struct tpmif_tx_request req;
-+};
-+typedef struct tpmif_ring tpmif_ring_t;
-+
-+struct tpmif_tx_interface {
-+    struct tpmif_ring ring[TPMIF_TX_RING_SIZE];
-+};
-+typedef struct tpmif_tx_interface tpmif_tx_interface_t;
-+
-+#endif
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/io/vscsiif.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/io/vscsiif.h 2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,105 @@
-+/******************************************************************************
-+ * vscsiif.h
-+ * 
-+ * Based on the blkif.h code.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright(c) FUJITSU Limited 2008.
-+ */
-+
-+#ifndef __XEN__PUBLIC_IO_SCSI_H__
-+#define __XEN__PUBLIC_IO_SCSI_H__
-+
-+#include "ring.h"
-+#include "../grant_table.h"
-+
-+/* command between backend and frontend */
-+#define VSCSIIF_ACT_SCSI_CDB         1    /* SCSI CDB command */
-+#define VSCSIIF_ACT_SCSI_ABORT       2    /* SCSI Device(Lun) Abort*/
-+#define VSCSIIF_ACT_SCSI_RESET       3    /* SCSI Device(Lun) Reset*/
-+
-+
-+#define VSCSIIF_BACK_MAX_PENDING_REQS    128
-+
-+/*
-+ * Maximum scatter/gather segments per request.
-+ *
-+ * Considering balance between allocating al least 16 "vscsiif_request"
-+ * structures on one page (4096bytes) and number of scatter gather 
-+ * needed, we decided to use 26 as a magic number.
-+ */
-+#define VSCSIIF_SG_TABLESIZE             26
-+
-+/*
-+ * base on linux kernel 2.6.18
-+ */
-+#define VSCSIIF_MAX_COMMAND_SIZE         16
-+#define VSCSIIF_SENSE_BUFFERSIZE         96
-+
-+
-+struct vscsiif_request {
-+    uint16_t rqid;          /* private guest value, echoed in resp  */
-+    uint8_t act;            /* command between backend and frontend */
-+    uint8_t cmd_len;
-+
-+    uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE];
-+    uint16_t timeout_per_command;     /* The command is issued by twice 
-+                                         the value in Backend. */
-+    uint16_t channel, id, lun;
-+    uint16_t padding;
-+    uint8_t sc_data_direction;        /* for DMA_TO_DEVICE(1)
-+                                         DMA_FROM_DEVICE(2)
-+                                         DMA_NONE(3) requests  */
-+    uint8_t nr_segments;              /* Number of pieces of scatter-gather */
-+
-+    struct scsiif_request_segment {
-+        grant_ref_t gref;
-+        uint16_t offset;
-+        uint16_t length;
-+    } seg[VSCSIIF_SG_TABLESIZE];
-+    uint32_t reserved[3];
-+};
-+typedef struct vscsiif_request vscsiif_request_t;
-+
-+struct vscsiif_response {
-+    uint16_t rqid;
-+    uint8_t padding;
-+    uint8_t sense_len;
-+    uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE];
-+    int32_t rslt;
-+    uint32_t residual_len;     /* request bufflen - 
-+                                  return the value from physical device */
-+    uint32_t reserved[36];
-+};
-+typedef struct vscsiif_response vscsiif_response_t;
-+
-+DEFINE_RING_TYPES(vscsiif, struct vscsiif_request, struct vscsiif_response);
-+
-+
-+#endif  /*__XEN__PUBLIC_IO_SCSI_H__*/
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/kexec.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/kexec.h      2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,168 @@
-+/******************************************************************************
-+ * kexec.h - Public portion
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ * 
-+ * Xen port written by:
-+ * - Simon 'Horms' Horman <horms@verge.net.au>
-+ * - Magnus Damm <magnus@valinux.co.jp>
-+ */
-+
-+#ifndef _XEN_PUBLIC_KEXEC_H
-+#define _XEN_PUBLIC_KEXEC_H
-+
-+
-+/* This file describes the Kexec / Kdump hypercall interface for Xen.
-+ *
-+ * Kexec under vanilla Linux allows a user to reboot the physical machine 
-+ * into a new user-specified kernel. The Xen port extends this idea
-+ * to allow rebooting of the machine from dom0. When kexec for dom0
-+ * is used to reboot,  both the hypervisor and the domains get replaced
-+ * with some other kernel. It is possible to kexec between vanilla
-+ * Linux and Xen and back again. Xen to Xen works well too.
-+ *
-+ * The hypercall interface for kexec can be divided into three main
-+ * types of hypercall operations:
-+ *
-+ * 1) Range information:
-+ *    This is used by the dom0 kernel to ask the hypervisor about various 
-+ *    address information. This information is needed to allow kexec-tools 
-+ *    to fill in the ELF headers for /proc/vmcore properly.
-+ *
-+ * 2) Load and unload of images:
-+ *    There are no big surprises here, the kexec binary from kexec-tools
-+ *    runs in userspace in dom0. The tool loads/unloads data into the
-+ *    dom0 kernel such as new kernel, initramfs and hypervisor. When
-+ *    loaded the dom0 kernel performs a load hypercall operation, and
-+ *    before releasing all page references the dom0 kernel calls unload.
-+ *
-+ * 3) Kexec operation:
-+ *    This is used to start a previously loaded kernel.
-+ */
-+
-+#include "xen.h"
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+#define KEXEC_XEN_NO_PAGES 17
-+#endif
-+
-+/*
-+ * Prototype for this hypercall is:
-+ *  int kexec_op(int cmd, void *args)
-+ * @cmd  == KEXEC_CMD_... 
-+ *          KEXEC operation to perform
-+ * @args == Operation-specific extra arguments (NULL if none).
-+ */
-+
-+/*
-+ * Kexec supports two types of operation:
-+ * - kexec into a regular kernel, very similar to a standard reboot
-+ *   - KEXEC_TYPE_DEFAULT is used to specify this type
-+ * - kexec into a special "crash kernel", aka kexec-on-panic
-+ *   - KEXEC_TYPE_CRASH is used to specify this type
-+ *   - parts of our system may be broken at kexec-on-panic time
-+ *     - the code should be kept as simple and self-contained as possible
-+ */
-+
-+#define KEXEC_TYPE_DEFAULT 0
-+#define KEXEC_TYPE_CRASH   1
-+
-+
-+/* The kexec implementation for Xen allows the user to load two
-+ * types of kernels, KEXEC_TYPE_DEFAULT and KEXEC_TYPE_CRASH.
-+ * All data needed for a kexec reboot is kept in one xen_kexec_image_t
-+ * per "instance". The data mainly consists of machine address lists to pages
-+ * together with destination addresses. The data in xen_kexec_image_t
-+ * is passed to the "code page" which is one page of code that performs
-+ * the final relocations before jumping to the new kernel.
-+ */
-+ 
-+typedef struct xen_kexec_image {
-+#if defined(__i386__) || defined(__x86_64__)
-+    unsigned long page_list[KEXEC_XEN_NO_PAGES];
-+#endif
-+#if defined(__ia64__)
-+    unsigned long reboot_code_buffer;
-+#endif
-+    unsigned long indirection_page;
-+    unsigned long start_address;
-+} xen_kexec_image_t;
-+
-+/*
-+ * Perform kexec having previously loaded a kexec or kdump kernel
-+ * as appropriate.
-+ * type == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in]
-+ */
-+#define KEXEC_CMD_kexec                 0
-+typedef struct xen_kexec_exec {
-+    int type;
-+} xen_kexec_exec_t;
-+
-+/*
-+ * Load/Unload kernel image for kexec or kdump.
-+ * type  == KEXEC_TYPE_DEFAULT or KEXEC_TYPE_CRASH [in]
-+ * image == relocation information for kexec (ignored for unload) [in]
-+ */
-+#define KEXEC_CMD_kexec_load            1
-+#define KEXEC_CMD_kexec_unload          2
-+typedef struct xen_kexec_load {
-+    int type;
-+    xen_kexec_image_t image;
-+} xen_kexec_load_t;
-+
-+#define KEXEC_RANGE_MA_CRASH      0 /* machine address and size of crash area */
-+#define KEXEC_RANGE_MA_XEN        1 /* machine address and size of Xen itself */
-+#define KEXEC_RANGE_MA_CPU        2 /* machine address and size of a CPU note */
-+#define KEXEC_RANGE_MA_XENHEAP    3 /* machine address and size of xenheap
-+                                     * Note that although this is adjacent
-+                                     * to Xen it exists in a separate EFI
-+                                     * region on ia64, and thus needs to be
-+                                     * inserted into iomem_machine separately */
-+#define KEXEC_RANGE_MA_BOOT_PARAM 4 /* machine address and size of
-+                                     * the ia64_boot_param */
-+#define KEXEC_RANGE_MA_EFI_MEMMAP 5 /* machine address and size of
-+                                     * of the EFI Memory Map */
-+#define KEXEC_RANGE_MA_VMCOREINFO 6 /* machine address and size of vmcoreinfo */
-+
-+/*
-+ * Find the address and size of certain memory areas
-+ * range == KEXEC_RANGE_... [in]
-+ * nr    == physical CPU number (starting from 0) if KEXEC_RANGE_MA_CPU [in]
-+ * size  == number of bytes reserved in window [out]
-+ * start == address of the first byte in the window [out]
-+ */
-+#define KEXEC_CMD_kexec_get_range       3
-+typedef struct xen_kexec_range {
-+    int range;
-+    int nr;
-+    unsigned long size;
-+    unsigned long start;
-+} xen_kexec_range_t;
-+
-+#endif /* _XEN_PUBLIC_KEXEC_H */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/nmi.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/nmi.h        2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,78 @@
-+/******************************************************************************
-+ * nmi.h
-+ * 
-+ * NMI callback registration and reason codes.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2005, Keir Fraser <keir@xensource.com>
-+ */
-+
-+#ifndef __XEN_PUBLIC_NMI_H__
-+#define __XEN_PUBLIC_NMI_H__
-+
-+/*
-+ * NMI reason codes:
-+ * Currently these are x86-specific, stored in arch_shared_info.nmi_reason.
-+ */
-+ /* I/O-check error reported via ISA port 0x61, bit 6. */
-+#define _XEN_NMIREASON_io_error     0
-+#define XEN_NMIREASON_io_error      (1UL << _XEN_NMIREASON_io_error)
-+ /* Parity error reported via ISA port 0x61, bit 7. */
-+#define _XEN_NMIREASON_parity_error 1
-+#define XEN_NMIREASON_parity_error  (1UL << _XEN_NMIREASON_parity_error)
-+ /* Unknown hardware-generated NMI. */
-+#define _XEN_NMIREASON_unknown      2
-+#define XEN_NMIREASON_unknown       (1UL << _XEN_NMIREASON_unknown)
-+
-+/*
-+ * long nmi_op(unsigned int cmd, void *arg)
-+ * NB. All ops return zero on success, else a negative error code.
-+ */
-+
-+/*
-+ * Register NMI callback for this (calling) VCPU. Currently this only makes
-+ * sense for domain 0, vcpu 0. All other callers will be returned EINVAL.
-+ * arg == pointer to xennmi_callback structure.
-+ */
-+#define XENNMI_register_callback   0
-+struct xennmi_callback {
-+    unsigned long handler_address;
-+    unsigned long pad;
-+};
-+typedef struct xennmi_callback xennmi_callback_t;
-+DEFINE_XEN_GUEST_HANDLE(xennmi_callback_t);
-+
-+/*
-+ * Deregister NMI callback for this (calling) VCPU.
-+ * arg == NULL.
-+ */
-+#define XENNMI_unregister_callback 1
-+
-+#endif /* __XEN_PUBLIC_NMI_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/platform.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/platform.h   2008-09-25 13:55:33.000000000 +0200
-@@ -0,0 +1,346 @@
-+/******************************************************************************
-+ * platform.h
-+ * 
-+ * Hardware platform operations. Intended for use by domain-0 kernel.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2002-2006, K Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_PLATFORM_H__
-+#define __XEN_PUBLIC_PLATFORM_H__
-+
-+#include "xen.h"
-+
-+#define XENPF_INTERFACE_VERSION 0x03000001
-+
-+/*
-+ * Set clock such that it would read <secs,nsecs> after 00:00:00 UTC,
-+ * 1 January, 1970 if the current system time was <system_time>.
-+ */
-+#define XENPF_settime             17
-+struct xenpf_settime {
-+    /* IN variables. */
-+    uint32_t secs;
-+    uint32_t nsecs;
-+    uint64_t system_time;
-+};
-+typedef struct xenpf_settime xenpf_settime_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_settime_t);
-+
-+/*
-+ * Request memory range (@mfn, @mfn+@nr_mfns-1) to have type @type.
-+ * On x86, @type is an architecture-defined MTRR memory type.
-+ * On success, returns the MTRR that was used (@reg) and a handle that can
-+ * be passed to XENPF_DEL_MEMTYPE to accurately tear down the new setting.
-+ * (x86-specific).
-+ */
-+#define XENPF_add_memtype         31
-+struct xenpf_add_memtype {
-+    /* IN variables. */
-+    xen_pfn_t mfn;
-+    uint64_t nr_mfns;
-+    uint32_t type;
-+    /* OUT variables. */
-+    uint32_t handle;
-+    uint32_t reg;
-+};
-+typedef struct xenpf_add_memtype xenpf_add_memtype_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_add_memtype_t);
-+
-+/*
-+ * Tear down an existing memory-range type. If @handle is remembered then it
-+ * should be passed in to accurately tear down the correct setting (in case
-+ * of overlapping memory regions with differing types). If it is not known
-+ * then @handle should be set to zero. In all cases @reg must be set.
-+ * (x86-specific).
-+ */
-+#define XENPF_del_memtype         32
-+struct xenpf_del_memtype {
-+    /* IN variables. */
-+    uint32_t handle;
-+    uint32_t reg;
-+};
-+typedef struct xenpf_del_memtype xenpf_del_memtype_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_del_memtype_t);
-+
-+/* Read current type of an MTRR (x86-specific). */
-+#define XENPF_read_memtype        33
-+struct xenpf_read_memtype {
-+    /* IN variables. */
-+    uint32_t reg;
-+    /* OUT variables. */
-+    xen_pfn_t mfn;
-+    uint64_t nr_mfns;
-+    uint32_t type;
-+};
-+typedef struct xenpf_read_memtype xenpf_read_memtype_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_read_memtype_t);
-+
-+#define XENPF_microcode_update    35
-+struct xenpf_microcode_update {
-+    /* IN variables. */
-+    XEN_GUEST_HANDLE(const_void) data;/* Pointer to microcode data */
-+    uint32_t length;                  /* Length of microcode data. */
-+};
-+typedef struct xenpf_microcode_update xenpf_microcode_update_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_microcode_update_t);
-+
-+#define XENPF_platform_quirk      39
-+#define QUIRK_NOIRQBALANCING      1 /* Do not restrict IO-APIC RTE targets */
-+#define QUIRK_IOAPIC_BAD_REGSEL   2 /* IO-APIC REGSEL forgets its value    */
-+#define QUIRK_IOAPIC_GOOD_REGSEL  3 /* IO-APIC REGSEL behaves properly     */
-+struct xenpf_platform_quirk {
-+    /* IN variables. */
-+    uint32_t quirk_id;
-+};
-+typedef struct xenpf_platform_quirk xenpf_platform_quirk_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_platform_quirk_t);
-+
-+#define XENPF_firmware_info       50
-+#define XEN_FW_DISK_INFO          1 /* from int 13 AH=08/41/48 */
-+#define XEN_FW_DISK_MBR_SIGNATURE 2 /* from MBR offset 0x1b8 */
-+#define XEN_FW_VBEDDC_INFO        3 /* from int 10 AX=4f15 */
-+struct xenpf_firmware_info {
-+    /* IN variables. */
-+    uint32_t type;
-+    uint32_t index;
-+    /* OUT variables. */
-+    union {
-+        struct {
-+            /* Int13, Fn48: Check Extensions Present. */
-+            uint8_t device;                   /* %dl: bios device number */
-+            uint8_t version;                  /* %ah: major version      */
-+            uint16_t interface_support;       /* %cx: support bitmap     */
-+            /* Int13, Fn08: Legacy Get Device Parameters. */
-+            uint16_t legacy_max_cylinder;     /* %cl[7:6]:%ch: max cyl # */
-+            uint8_t legacy_max_head;          /* %dh: max head #         */
-+            uint8_t legacy_sectors_per_track; /* %cl[5:0]: max sector #  */
-+            /* Int13, Fn41: Get Device Parameters (as filled into %ds:%esi). */
-+            /* NB. First uint16_t of buffer must be set to buffer size.      */
-+            XEN_GUEST_HANDLE(void) edd_params;
-+        } disk_info; /* XEN_FW_DISK_INFO */
-+        struct {
-+            uint8_t device;                   /* bios device number  */
-+            uint32_t mbr_signature;           /* offset 0x1b8 in mbr */
-+        } disk_mbr_signature; /* XEN_FW_DISK_MBR_SIGNATURE */
-+        struct {
-+            /* Int10, AX=4F15: Get EDID info. */
-+            uint8_t capabilities;
-+            uint8_t edid_transfer_time;
-+            /* must refer to 128-byte buffer */
-+            XEN_GUEST_HANDLE(uint8) edid;
-+        } vbeddc_info; /* XEN_FW_VBEDDC_INFO */
-+    } u;
-+};
-+typedef struct xenpf_firmware_info xenpf_firmware_info_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_firmware_info_t);
-+
-+#define XENPF_enter_acpi_sleep    51
-+struct xenpf_enter_acpi_sleep {
-+    /* IN variables */
-+    uint16_t pm1a_cnt_val;      /* PM1a control value. */
-+    uint16_t pm1b_cnt_val;      /* PM1b control value. */
-+    uint32_t sleep_state;       /* Which state to enter (Sn). */
-+    uint32_t flags;             /* Must be zero. */
-+};
-+typedef struct xenpf_enter_acpi_sleep xenpf_enter_acpi_sleep_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_enter_acpi_sleep_t);
-+
-+#define XENPF_change_freq         52
-+struct xenpf_change_freq {
-+    /* IN variables */
-+    uint32_t flags; /* Must be zero. */
-+    uint32_t cpu;   /* Physical cpu. */
-+    uint64_t freq;  /* New frequency (Hz). */
-+};
-+typedef struct xenpf_change_freq xenpf_change_freq_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_change_freq_t);
-+
-+/*
-+ * Get idle times (nanoseconds since boot) for physical CPUs specified in the
-+ * @cpumap_bitmap with range [0..@cpumap_nr_cpus-1]. The @idletime array is
-+ * indexed by CPU number; only entries with the corresponding @cpumap_bitmap
-+ * bit set are written to. On return, @cpumap_bitmap is modified so that any
-+ * non-existent CPUs are cleared. Such CPUs have their @idletime array entry
-+ * cleared.
-+ */
-+#define XENPF_getidletime         53
-+struct xenpf_getidletime {
-+    /* IN/OUT variables */
-+    /* IN: CPUs to interrogate; OUT: subset of IN which are present */
-+    XEN_GUEST_HANDLE(uint8) cpumap_bitmap;
-+    /* IN variables */
-+    /* Size of cpumap bitmap. */
-+    uint32_t cpumap_nr_cpus;
-+    /* Must be indexable for every cpu in cpumap_bitmap. */
-+    XEN_GUEST_HANDLE(uint64) idletime;
-+    /* OUT variables */
-+    /* System time when the idletime snapshots were taken. */
-+    uint64_t now;
-+};
-+typedef struct xenpf_getidletime xenpf_getidletime_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_getidletime_t);
-+
-+#define XENPF_set_processor_pminfo      54
-+
-+/* ability bits */
-+#define XEN_PROCESSOR_PM_CX   1
-+#define XEN_PROCESSOR_PM_PX   2
-+#define XEN_PROCESSOR_PM_TX   4
-+
-+/* cmd type */
-+#define XEN_PM_CX   0
-+#define XEN_PM_PX   1
-+#define XEN_PM_TX   2
-+
-+/* Px sub info type */
-+#define XEN_PX_PCT   1
-+#define XEN_PX_PSS   2
-+#define XEN_PX_PPC   4
-+#define XEN_PX_PSD   8
-+
-+struct xen_power_register {
-+    uint32_t     space_id;
-+    uint32_t     bit_width;
-+    uint32_t     bit_offset;
-+    uint32_t     access_size;
-+    uint64_t     address;
-+};
-+
-+struct xen_processor_csd {
-+    uint32_t    domain;      /* domain number of one dependent group */
-+    uint32_t    coord_type;  /* coordination type */
-+    uint32_t    num;         /* number of processors in same domain */
-+};
-+typedef struct xen_processor_csd xen_processor_csd_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_processor_csd_t);
-+
-+struct xen_processor_cx {
-+    struct xen_power_register  reg; /* GAS for Cx trigger register */
-+    uint8_t     type;     /* cstate value, c0: 0, c1: 1, ... */
-+    uint32_t    latency;  /* worst latency (ms) to enter/exit this cstate */
-+    uint32_t    power;    /* average power consumption(mW) */
-+    uint32_t    dpcnt;    /* number of dependency entries */
-+    XEN_GUEST_HANDLE(xen_processor_csd_t) dp; /* NULL if no dependency */
-+};
-+typedef struct xen_processor_cx xen_processor_cx_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_processor_cx_t);
-+
-+struct xen_processor_flags {
-+    uint32_t bm_control:1;
-+    uint32_t bm_check:1;
-+    uint32_t has_cst:1;
-+    uint32_t power_setup_done:1;
-+    uint32_t bm_rld_set:1;
-+};
-+
-+struct xen_processor_power {
-+    uint32_t count;  /* number of C state entries in array below */
-+    struct xen_processor_flags flags;  /* global flags of this processor */
-+    XEN_GUEST_HANDLE(xen_processor_cx_t) states; /* supported c states */
-+};
-+
-+struct xen_pct_register {
-+    uint8_t  descriptor;
-+    uint16_t length;
-+    uint8_t  space_id;
-+    uint8_t  bit_width;
-+    uint8_t  bit_offset;
-+    uint8_t  reserved;
-+    uint64_t address;
-+};
-+
-+struct xen_processor_px {
-+    uint64_t core_frequency; /* megahertz */
-+    uint64_t power;      /* milliWatts */
-+    uint64_t transition_latency; /* microseconds */
-+    uint64_t bus_master_latency; /* microseconds */
-+    uint64_t control;        /* control value */
-+    uint64_t status;     /* success indicator */
-+};
-+typedef struct xen_processor_px xen_processor_px_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_processor_px_t);
-+
-+struct xen_psd_package {
-+    uint64_t num_entries;
-+    uint64_t revision;
-+    uint64_t domain;
-+    uint64_t coord_type;
-+    uint64_t num_processors;
-+};
-+
-+struct xen_processor_performance {
-+    uint32_t flags;     /* flag for Px sub info type */
-+    uint32_t platform_limit;  /* Platform limitation on freq usage */
-+    struct xen_pct_register control_register;
-+    struct xen_pct_register status_register;
-+    uint32_t state_count;     /* total available performance states */
-+    XEN_GUEST_HANDLE(xen_processor_px_t) states;
-+    struct xen_psd_package domain_info;
-+    uint32_t shared_type;     /* coordination type of this processor */
-+};
-+typedef struct xen_processor_performance xen_processor_performance_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_processor_performance_t);
-+
-+struct xenpf_set_processor_pminfo {
-+    /* IN variables */
-+    uint32_t id;    /* ACPI CPU ID */
-+    uint32_t type;  /* {XEN_PM_CX, XEN_PM_PX} */
-+    union {
-+        struct xen_processor_power          power;/* Cx: _CST/_CSD */
-+        struct xen_processor_performance    perf; /* Px: _PPC/_PCT/_PSS/_PSD */
-+    };
-+};
-+typedef struct xenpf_set_processor_pminfo xenpf_set_processor_pminfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xenpf_set_processor_pminfo_t);
-+
-+struct xen_platform_op {
-+    uint32_t cmd;
-+    uint32_t interface_version; /* XENPF_INTERFACE_VERSION */
-+    union {
-+        struct xenpf_settime           settime;
-+        struct xenpf_add_memtype       add_memtype;
-+        struct xenpf_del_memtype       del_memtype;
-+        struct xenpf_read_memtype      read_memtype;
-+        struct xenpf_microcode_update  microcode;
-+        struct xenpf_platform_quirk    platform_quirk;
-+        struct xenpf_firmware_info     firmware_info;
-+        struct xenpf_enter_acpi_sleep  enter_acpi_sleep;
-+        struct xenpf_change_freq       change_freq;
-+        struct xenpf_getidletime       getidletime;
-+        struct xenpf_set_processor_pminfo set_pminfo;
-+        uint8_t                        pad[128];
-+    } u;
-+};
-+typedef struct xen_platform_op xen_platform_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_platform_op_t);
-+
-+#endif /* __XEN_PUBLIC_PLATFORM_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/sysctl.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/sysctl.h     2008-09-25 13:55:33.000000000 +0200
-@@ -0,0 +1,308 @@
-+/******************************************************************************
-+ * sysctl.h
-+ * 
-+ * System management operations. For use by node control stack.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2002-2006, K Fraser
-+ */
-+
-+#ifndef __XEN_PUBLIC_SYSCTL_H__
-+#define __XEN_PUBLIC_SYSCTL_H__
-+
-+#if !defined(__XEN__) && !defined(__XEN_TOOLS__)
-+#error "sysctl operations are intended for use by node control tools only"
-+#endif
-+
-+#include "xen.h"
-+#include "domctl.h"
-+
-+#define XEN_SYSCTL_INTERFACE_VERSION 0x00000006
-+
-+/*
-+ * Read console content from Xen buffer ring.
-+ */
-+#define XEN_SYSCTL_readconsole       1
-+struct xen_sysctl_readconsole {
-+    /* IN: Non-zero -> clear after reading. */
-+    uint8_t clear;
-+    /* IN: Non-zero -> start index specified by @index field. */
-+    uint8_t incremental;
-+    uint8_t pad0, pad1;
-+    /*
-+     * IN:  Start index for consuming from ring buffer (if @incremental);
-+     * OUT: End index after consuming from ring buffer.
-+     */
-+    uint32_t index; 
-+    /* IN: Virtual address to write console data. */
-+    XEN_GUEST_HANDLE_64(char) buffer;
-+    /* IN: Size of buffer; OUT: Bytes written to buffer. */
-+    uint32_t count;
-+};
-+typedef struct xen_sysctl_readconsole xen_sysctl_readconsole_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_readconsole_t);
-+
-+/* Get trace buffers machine base address */
-+#define XEN_SYSCTL_tbuf_op           2
-+struct xen_sysctl_tbuf_op {
-+    /* IN variables */
-+#define XEN_SYSCTL_TBUFOP_get_info     0
-+#define XEN_SYSCTL_TBUFOP_set_cpu_mask 1
-+#define XEN_SYSCTL_TBUFOP_set_evt_mask 2
-+#define XEN_SYSCTL_TBUFOP_set_size     3
-+#define XEN_SYSCTL_TBUFOP_enable       4
-+#define XEN_SYSCTL_TBUFOP_disable      5
-+    uint32_t cmd;
-+    /* IN/OUT variables */
-+    struct xenctl_cpumap cpu_mask;
-+    uint32_t             evt_mask;
-+    /* OUT variables */
-+    uint64_aligned_t buffer_mfn;
-+    uint32_t size;
-+};
-+typedef struct xen_sysctl_tbuf_op xen_sysctl_tbuf_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_tbuf_op_t);
-+
-+/*
-+ * Get physical information about the host machine
-+ */
-+#define XEN_SYSCTL_physinfo          3
-+ /* (x86) The platform supports HVM guests. */
-+#define _XEN_SYSCTL_PHYSCAP_hvm          0
-+#define XEN_SYSCTL_PHYSCAP_hvm           (1u<<_XEN_SYSCTL_PHYSCAP_hvm)
-+ /* (x86) The platform supports HVM-guest direct access to I/O devices. */
-+#define _XEN_SYSCTL_PHYSCAP_hvm_directio 1
-+#define XEN_SYSCTL_PHYSCAP_hvm_directio  (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio)
-+struct xen_sysctl_physinfo {
-+    uint32_t threads_per_core;
-+    uint32_t cores_per_socket;
-+    uint32_t nr_cpus;
-+    uint32_t nr_nodes;
-+    uint32_t cpu_khz;
-+    uint64_aligned_t total_pages;
-+    uint64_aligned_t free_pages;
-+    uint64_aligned_t scrub_pages;
-+    uint32_t hw_cap[8];
-+
-+    /*
-+     * IN: maximum addressable entry in the caller-provided cpu_to_node array.
-+     * OUT: largest cpu identifier in the system.
-+     * If OUT is greater than IN then the cpu_to_node array is truncated!
-+     */
-+    uint32_t max_cpu_id;
-+    /*
-+     * If not NULL, this array is filled with node identifier for each cpu.
-+     * If a cpu has no node information (e.g., cpu not present) then the
-+     * sentinel value ~0u is written.
-+     * The size of this array is specified by the caller in @max_cpu_id.
-+     * If the actual @max_cpu_id is smaller than the array then the trailing
-+     * elements of the array will not be written by the sysctl.
-+     */
-+    XEN_GUEST_HANDLE_64(uint32) cpu_to_node;
-+
-+    /* XEN_SYSCTL_PHYSCAP_??? */
-+    uint32_t capabilities;
-+};
-+typedef struct xen_sysctl_physinfo xen_sysctl_physinfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_physinfo_t);
-+
-+/*
-+ * Get the ID of the current scheduler.
-+ */
-+#define XEN_SYSCTL_sched_id          4
-+struct xen_sysctl_sched_id {
-+    /* OUT variable */
-+    uint32_t sched_id;
-+};
-+typedef struct xen_sysctl_sched_id xen_sysctl_sched_id_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_sched_id_t);
-+
-+/* Interface for controlling Xen software performance counters. */
-+#define XEN_SYSCTL_perfc_op          5
-+/* Sub-operations: */
-+#define XEN_SYSCTL_PERFCOP_reset 1   /* Reset all counters to zero. */
-+#define XEN_SYSCTL_PERFCOP_query 2   /* Get perfctr information. */
-+struct xen_sysctl_perfc_desc {
-+    char         name[80];             /* name of perf counter */
-+    uint32_t     nr_vals;              /* number of values for this counter */
-+};
-+typedef struct xen_sysctl_perfc_desc xen_sysctl_perfc_desc_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_desc_t);
-+typedef uint32_t xen_sysctl_perfc_val_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_val_t);
-+
-+struct xen_sysctl_perfc_op {
-+    /* IN variables. */
-+    uint32_t       cmd;                /*  XEN_SYSCTL_PERFCOP_??? */
-+    /* OUT variables. */
-+    uint32_t       nr_counters;       /*  number of counters description  */
-+    uint32_t       nr_vals;           /*  number of values  */
-+    /* counter information (or NULL) */
-+    XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc;
-+    /* counter values (or NULL) */
-+    XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val;
-+};
-+typedef struct xen_sysctl_perfc_op xen_sysctl_perfc_op_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_perfc_op_t);
-+
-+#define XEN_SYSCTL_getdomaininfolist 6
-+struct xen_sysctl_getdomaininfolist {
-+    /* IN variables. */
-+    domid_t               first_domain;
-+    uint32_t              max_domains;
-+    XEN_GUEST_HANDLE_64(xen_domctl_getdomaininfo_t) buffer;
-+    /* OUT variables. */
-+    uint32_t              num_domains;
-+};
-+typedef struct xen_sysctl_getdomaininfolist xen_sysctl_getdomaininfolist_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getdomaininfolist_t);
-+
-+/* Inject debug keys into Xen. */
-+#define XEN_SYSCTL_debug_keys        7
-+struct xen_sysctl_debug_keys {
-+    /* IN variables. */
-+    XEN_GUEST_HANDLE_64(char) keys;
-+    uint32_t nr_keys;
-+};
-+typedef struct xen_sysctl_debug_keys xen_sysctl_debug_keys_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_debug_keys_t);
-+
-+/* Get physical CPU information. */
-+#define XEN_SYSCTL_getcpuinfo        8
-+struct xen_sysctl_cpuinfo {
-+    uint64_aligned_t idletime;
-+};
-+typedef struct xen_sysctl_cpuinfo xen_sysctl_cpuinfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpuinfo_t); 
-+struct xen_sysctl_getcpuinfo {
-+    /* IN variables. */
-+    uint32_t max_cpus;
-+    XEN_GUEST_HANDLE_64(xen_sysctl_cpuinfo_t) info;
-+    /* OUT variables. */
-+    uint32_t nr_cpus;
-+}; 
-+typedef struct xen_sysctl_getcpuinfo xen_sysctl_getcpuinfo_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_getcpuinfo_t); 
-+
-+#define XEN_SYSCTL_availheap         9
-+struct xen_sysctl_availheap {
-+    /* IN variables. */
-+    uint32_t min_bitwidth;  /* Smallest address width (zero if don't care). */
-+    uint32_t max_bitwidth;  /* Largest address width (zero if don't care). */
-+    int32_t  node;          /* NUMA node of interest (-1 for all nodes). */
-+    /* OUT variables. */
-+    uint64_aligned_t avail_bytes;/* Bytes available in the specified region. */
-+};
-+typedef struct xen_sysctl_availheap xen_sysctl_availheap_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_availheap_t);
-+
-+#define XEN_SYSCTL_get_pmstat        10
-+struct pm_px_val {
-+    uint64_aligned_t freq;        /* Px core frequency */
-+    uint64_aligned_t residency;   /* Px residency time */
-+    uint64_aligned_t count;       /* Px transition count */
-+};
-+typedef struct pm_px_val pm_px_val_t;
-+DEFINE_XEN_GUEST_HANDLE(pm_px_val_t);
-+
-+struct pm_px_stat {
-+    uint8_t total;        /* total Px states */
-+    uint8_t usable;       /* usable Px states */
-+    uint8_t last;         /* last Px state */
-+    uint8_t cur;          /* current Px state */
-+    XEN_GUEST_HANDLE_64(uint64) trans_pt;   /* Px transition table */
-+    XEN_GUEST_HANDLE_64(pm_px_val_t) pt;
-+};
-+typedef struct pm_px_stat pm_px_stat_t;
-+DEFINE_XEN_GUEST_HANDLE(pm_px_stat_t);
-+
-+struct pm_cx_stat {
-+    uint32_t nr;    /* entry nr in triggers & residencies, including C0 */
-+    uint32_t last;  /* last Cx state */
-+    uint64_aligned_t idle_time;                 /* idle time from boot */
-+    XEN_GUEST_HANDLE_64(uint64) triggers;    /* Cx trigger counts */
-+    XEN_GUEST_HANDLE_64(uint64) residencies; /* Cx residencies */
-+};
-+
-+struct xen_sysctl_get_pmstat {
-+#define PMSTAT_CATEGORY_MASK 0xf0
-+#define PMSTAT_PX            0x10
-+#define PMSTAT_CX            0x20
-+#define PMSTAT_get_max_px    (PMSTAT_PX | 0x1)
-+#define PMSTAT_get_pxstat    (PMSTAT_PX | 0x2)
-+#define PMSTAT_reset_pxstat  (PMSTAT_PX | 0x3)
-+#define PMSTAT_get_max_cx    (PMSTAT_CX | 0x1)
-+#define PMSTAT_get_cxstat    (PMSTAT_CX | 0x2)
-+#define PMSTAT_reset_cxstat  (PMSTAT_CX | 0x3)
-+    uint32_t type;
-+    uint32_t cpuid;
-+    union {
-+        struct pm_px_stat getpx;
-+        struct pm_cx_stat getcx;
-+        /* other struct for tx, etc */
-+    } u;
-+};
-+typedef struct xen_sysctl_get_pmstat xen_sysctl_get_pmstat_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_get_pmstat_t);
-+
-+#define XEN_SYSCTL_cpu_hotplug       11
-+struct xen_sysctl_cpu_hotplug {
-+    /* IN variables */
-+    uint32_t cpu;   /* Physical cpu. */
-+#define XEN_SYSCTL_CPU_HOTPLUG_ONLINE  0
-+#define XEN_SYSCTL_CPU_HOTPLUG_OFFLINE 1
-+    uint32_t op;    /* hotplug opcode */
-+};
-+typedef struct xen_sysctl_cpu_hotplug xen_sysctl_cpu_hotplug_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_cpu_hotplug_t);
-+
-+
-+struct xen_sysctl {
-+    uint32_t cmd;
-+    uint32_t interface_version; /* XEN_SYSCTL_INTERFACE_VERSION */
-+    union {
-+        struct xen_sysctl_readconsole       readconsole;
-+        struct xen_sysctl_tbuf_op           tbuf_op;
-+        struct xen_sysctl_physinfo          physinfo;
-+        struct xen_sysctl_sched_id          sched_id;
-+        struct xen_sysctl_perfc_op          perfc_op;
-+        struct xen_sysctl_getdomaininfolist getdomaininfolist;
-+        struct xen_sysctl_debug_keys        debug_keys;
-+        struct xen_sysctl_getcpuinfo        getcpuinfo;
-+        struct xen_sysctl_availheap         availheap;
-+        struct xen_sysctl_get_pmstat        get_pmstat;
-+        struct xen_sysctl_cpu_hotplug       cpu_hotplug;
-+        uint8_t                             pad[128];
-+    } u;
-+};
-+typedef struct xen_sysctl xen_sysctl_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_sysctl_t);
-+
-+#endif /* __XEN_PUBLIC_SYSCTL_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/trace.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/trace.h      2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,205 @@
-+/******************************************************************************
-+ * include/public/trace.h
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Mark Williamson, (C) 2004 Intel Research Cambridge
-+ * Copyright (C) 2005 Bin Ren
-+ */
-+
-+#ifndef __XEN_PUBLIC_TRACE_H__
-+#define __XEN_PUBLIC_TRACE_H__
-+
-+#define TRACE_EXTRA_MAX    7
-+#define TRACE_EXTRA_SHIFT 28
-+
-+/* Trace classes */
-+#define TRC_CLS_SHIFT 16
-+#define TRC_GEN      0x0001f000    /* General trace            */
-+#define TRC_SCHED    0x0002f000    /* Xen Scheduler trace      */
-+#define TRC_DOM0OP   0x0004f000    /* Xen DOM0 operation trace */
-+#define TRC_HVM      0x0008f000    /* Xen HVM trace            */
-+#define TRC_MEM      0x0010f000    /* Xen memory trace         */
-+#define TRC_PV       0x0020f000    /* Xen PV traces            */
-+#define TRC_SHADOW   0x0040f000    /* Xen shadow tracing       */
-+#define TRC_PM       0x0080f000    /* Xen power management trace */
-+#define TRC_ALL      0x0ffff000
-+#define TRC_HD_TO_EVENT(x) ((x)&0x0fffffff)
-+#define TRC_HD_CYCLE_FLAG (1UL<<31)
-+#define TRC_HD_INCLUDES_CYCLE_COUNT(x) ( !!( (x) & TRC_HD_CYCLE_FLAG ) )
-+#define TRC_HD_EXTRA(x)    (((x)>>TRACE_EXTRA_SHIFT)&TRACE_EXTRA_MAX)
-+
-+/* Trace subclasses */
-+#define TRC_SUBCLS_SHIFT 12
-+
-+/* trace subclasses for SVM */
-+#define TRC_HVM_ENTRYEXIT 0x00081000   /* VMENTRY and #VMEXIT       */
-+#define TRC_HVM_HANDLER   0x00082000   /* various HVM handlers      */
-+
-+#define TRC_SCHED_MIN       0x00021000   /* Just runstate changes */
-+#define TRC_SCHED_VERBOSE   0x00028000   /* More inclusive scheduling */
-+
-+/* Trace events per class */
-+#define TRC_LOST_RECORDS        (TRC_GEN + 1)
-+#define TRC_TRACE_WRAP_BUFFER  (TRC_GEN + 2)
-+#define TRC_TRACE_CPU_CHANGE    (TRC_GEN + 3)
-+
-+#define TRC_SCHED_RUNSTATE_CHANGE (TRC_SCHED_MIN + 1)
-+#define TRC_SCHED_DOM_ADD        (TRC_SCHED_VERBOSE +  1)
-+#define TRC_SCHED_DOM_REM        (TRC_SCHED_VERBOSE +  2)
-+#define TRC_SCHED_SLEEP          (TRC_SCHED_VERBOSE +  3)
-+#define TRC_SCHED_WAKE           (TRC_SCHED_VERBOSE +  4)
-+#define TRC_SCHED_YIELD          (TRC_SCHED_VERBOSE +  5)
-+#define TRC_SCHED_BLOCK          (TRC_SCHED_VERBOSE +  6)
-+#define TRC_SCHED_SHUTDOWN       (TRC_SCHED_VERBOSE +  7)
-+#define TRC_SCHED_CTL            (TRC_SCHED_VERBOSE +  8)
-+#define TRC_SCHED_ADJDOM         (TRC_SCHED_VERBOSE +  9)
-+#define TRC_SCHED_SWITCH         (TRC_SCHED_VERBOSE + 10)
-+#define TRC_SCHED_S_TIMER_FN     (TRC_SCHED_VERBOSE + 11)
-+#define TRC_SCHED_T_TIMER_FN     (TRC_SCHED_VERBOSE + 12)
-+#define TRC_SCHED_DOM_TIMER_FN   (TRC_SCHED_VERBOSE + 13)
-+#define TRC_SCHED_SWITCH_INFPREV (TRC_SCHED_VERBOSE + 14)
-+#define TRC_SCHED_SWITCH_INFNEXT (TRC_SCHED_VERBOSE + 15)
-+
-+#define TRC_MEM_PAGE_GRANT_MAP      (TRC_MEM + 1)
-+#define TRC_MEM_PAGE_GRANT_UNMAP    (TRC_MEM + 2)
-+#define TRC_MEM_PAGE_GRANT_TRANSFER (TRC_MEM + 3)
-+
-+#define TRC_PV_HYPERCALL             (TRC_PV +  1)
-+#define TRC_PV_TRAP                  (TRC_PV +  3)
-+#define TRC_PV_PAGE_FAULT            (TRC_PV +  4)
-+#define TRC_PV_FORCED_INVALID_OP     (TRC_PV +  5)
-+#define TRC_PV_EMULATE_PRIVOP        (TRC_PV +  6)
-+#define TRC_PV_EMULATE_4GB           (TRC_PV +  7)
-+#define TRC_PV_MATH_STATE_RESTORE    (TRC_PV +  8)
-+#define TRC_PV_PAGING_FIXUP          (TRC_PV +  9)
-+#define TRC_PV_GDT_LDT_MAPPING_FAULT (TRC_PV + 10)
-+#define TRC_PV_PTWR_EMULATION        (TRC_PV + 11)
-+#define TRC_PV_PTWR_EMULATION_PAE    (TRC_PV + 12)
-+  /* Indicates that addresses in trace record are 64 bits */
-+#define TRC_64_FLAG               (0x100) 
-+
-+#define TRC_SHADOW_NOT_SHADOW                 (TRC_SHADOW +  1)
-+#define TRC_SHADOW_FAST_PROPAGATE             (TRC_SHADOW +  2)
-+#define TRC_SHADOW_FAST_MMIO                  (TRC_SHADOW +  3)
-+#define TRC_SHADOW_FALSE_FAST_PATH            (TRC_SHADOW +  4)
-+#define TRC_SHADOW_MMIO                       (TRC_SHADOW +  5)
-+#define TRC_SHADOW_FIXUP                      (TRC_SHADOW +  6)
-+#define TRC_SHADOW_DOMF_DYING                 (TRC_SHADOW +  7)
-+#define TRC_SHADOW_EMULATE                    (TRC_SHADOW +  8)
-+#define TRC_SHADOW_EMULATE_UNSHADOW_USER      (TRC_SHADOW +  9)
-+#define TRC_SHADOW_EMULATE_UNSHADOW_EVTINJ    (TRC_SHADOW + 10)
-+#define TRC_SHADOW_EMULATE_UNSHADOW_UNHANDLED (TRC_SHADOW + 11)
-+#define TRC_SHADOW_WRMAP_BF                   (TRC_SHADOW + 12)
-+#define TRC_SHADOW_PREALLOC_UNPIN             (TRC_SHADOW + 13)
-+#define TRC_SHADOW_RESYNC_FULL                (TRC_SHADOW + 14)
-+#define TRC_SHADOW_RESYNC_ONLY                (TRC_SHADOW + 15)
-+
-+/* trace events per subclass */
-+#define TRC_HVM_VMENTRY         (TRC_HVM_ENTRYEXIT + 0x01)
-+#define TRC_HVM_VMEXIT          (TRC_HVM_ENTRYEXIT + 0x02)
-+#define TRC_HVM_VMEXIT64        (TRC_HVM_ENTRYEXIT + TRC_64_FLAG + 0x02)
-+#define TRC_HVM_PF_XEN          (TRC_HVM_HANDLER + 0x01)
-+#define TRC_HVM_PF_XEN64        (TRC_HVM_HANDLER + TRC_64_FLAG + 0x01)
-+#define TRC_HVM_PF_INJECT       (TRC_HVM_HANDLER + 0x02)
-+#define TRC_HVM_PF_INJECT64     (TRC_HVM_HANDLER + TRC_64_FLAG + 0x02)
-+#define TRC_HVM_INJ_EXC         (TRC_HVM_HANDLER + 0x03)
-+#define TRC_HVM_INJ_VIRQ        (TRC_HVM_HANDLER + 0x04)
-+#define TRC_HVM_REINJ_VIRQ      (TRC_HVM_HANDLER + 0x05)
-+#define TRC_HVM_IO_READ         (TRC_HVM_HANDLER + 0x06)
-+#define TRC_HVM_IO_WRITE        (TRC_HVM_HANDLER + 0x07)
-+#define TRC_HVM_CR_READ         (TRC_HVM_HANDLER + 0x08)
-+#define TRC_HVM_CR_READ64       (TRC_HVM_HANDLER + TRC_64_FLAG + 0x08)
-+#define TRC_HVM_CR_WRITE        (TRC_HVM_HANDLER + 0x09)
-+#define TRC_HVM_CR_WRITE64      (TRC_HVM_HANDLER + TRC_64_FLAG + 0x09)
-+#define TRC_HVM_DR_READ         (TRC_HVM_HANDLER + 0x0A)
-+#define TRC_HVM_DR_WRITE        (TRC_HVM_HANDLER + 0x0B)
-+#define TRC_HVM_MSR_READ        (TRC_HVM_HANDLER + 0x0C)
-+#define TRC_HVM_MSR_WRITE       (TRC_HVM_HANDLER + 0x0D)
-+#define TRC_HVM_CPUID           (TRC_HVM_HANDLER + 0x0E)
-+#define TRC_HVM_INTR            (TRC_HVM_HANDLER + 0x0F)
-+#define TRC_HVM_NMI             (TRC_HVM_HANDLER + 0x10)
-+#define TRC_HVM_SMI             (TRC_HVM_HANDLER + 0x11)
-+#define TRC_HVM_VMMCALL         (TRC_HVM_HANDLER + 0x12)
-+#define TRC_HVM_HLT             (TRC_HVM_HANDLER + 0x13)
-+#define TRC_HVM_INVLPG          (TRC_HVM_HANDLER + 0x14)
-+#define TRC_HVM_INVLPG64        (TRC_HVM_HANDLER + TRC_64_FLAG + 0x14)
-+#define TRC_HVM_MCE             (TRC_HVM_HANDLER + 0x15)
-+#define TRC_HVM_IO_ASSIST       (TRC_HVM_HANDLER + 0x16)
-+#define TRC_HVM_IO_ASSIST64     (TRC_HVM_HANDLER + TRC_64_FLAG + 0x16)
-+#define TRC_HVM_MMIO_ASSIST     (TRC_HVM_HANDLER + 0x17)
-+#define TRC_HVM_MMIO_ASSIST64   (TRC_HVM_HANDLER + TRC_64_FLAG + 0x17)
-+#define TRC_HVM_CLTS            (TRC_HVM_HANDLER + 0x18)
-+#define TRC_HVM_LMSW            (TRC_HVM_HANDLER + 0x19)
-+#define TRC_HVM_LMSW64          (TRC_HVM_HANDLER + TRC_64_FLAG + 0x19)
-+
-+/* trace subclasses for power management */
-+#define TRC_PM_FREQ     0x00801000      /* xen cpu freq events */
-+#define TRC_PM_IDLE     0x00802000      /* xen cpu idle events */
-+
-+/* trace events for per class */
-+#define TRC_PM_FREQ_CHANGE      (TRC_PM_FREQ + 0x01)
-+#define TRC_PM_IDLE_ENTRY       (TRC_PM_IDLE + 0x01)
-+#define TRC_PM_IDLE_EXIT        (TRC_PM_IDLE + 0x02)
-+
-+/* This structure represents a single trace buffer record. */
-+struct t_rec {
-+    uint32_t event:28;
-+    uint32_t extra_u32:3;         /* # entries in trailing extra_u32[] array */
-+    uint32_t cycles_included:1;   /* u.cycles or u.no_cycles? */
-+    union {
-+        struct {
-+            uint32_t cycles_lo, cycles_hi; /* cycle counter timestamp */
-+            uint32_t extra_u32[7];         /* event data items */
-+        } cycles;
-+        struct {
-+            uint32_t extra_u32[7];         /* event data items */
-+        } nocycles;
-+    } u;
-+};
-+
-+/*
-+ * This structure contains the metadata for a single trace buffer.  The head
-+ * field, indexes into an array of struct t_rec's.
-+ */
-+struct t_buf {
-+    /* Assume the data buffer size is X.  X is generally not a power of 2.
-+     * CONS and PROD are incremented modulo (2*X):
-+     *     0 <= cons < 2*X
-+     *     0 <= prod < 2*X
-+     * This is done because addition modulo X breaks at 2^32 when X is not a
-+     * power of 2:
-+     *     (((2^32 - 1) % X) + 1) % X != (2^32) % X
-+     */
-+    uint32_t cons;   /* Offset of next item to be consumed by control tools. */
-+    uint32_t prod;   /* Offset of next item to be produced by Xen.           */
-+    /*  Records follow immediately after the meta-data header.    */
-+};
-+
-+#endif /* __XEN_PUBLIC_TRACE_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/xen-compat.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/xen-compat.h 2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,44 @@
-+/******************************************************************************
-+ * xen-compat.h
-+ * 
-+ * Guest OS interface to Xen.  Compatibility layer.
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (c) 2006, Christian Limpach
-+ */
-+
-+#ifndef __XEN_PUBLIC_XEN_COMPAT_H__
-+#define __XEN_PUBLIC_XEN_COMPAT_H__
-+
-+#define __XEN_LATEST_INTERFACE_VERSION__ 0x00030209
-+
-+#if defined(__XEN__) || defined(__XEN_TOOLS__)
-+/* Xen is built with matching headers and implements the latest interface. */
-+#define __XEN_INTERFACE_VERSION__ __XEN_LATEST_INTERFACE_VERSION__
-+#elif !defined(__XEN_INTERFACE_VERSION__)
-+/* Guests which do not specify a version get the legacy interface. */
-+#define __XEN_INTERFACE_VERSION__ 0x00000000
-+#endif
-+
-+#if __XEN_INTERFACE_VERSION__ > __XEN_LATEST_INTERFACE_VERSION__
-+#error "These header files do not support the requested interface version."
-+#endif
-+
-+#endif /* __XEN_PUBLIC_XEN_COMPAT_H__ */
-Index: head-2008-11-25/include/xen/interface/xenoprof.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/xenoprof.h   2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,138 @@
-+/******************************************************************************
-+ * xenoprof.h
-+ * 
-+ * Interface for enabling system wide profiling based on hardware performance
-+ * counters
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ * Written by Aravind Menon & Jose Renato Santos
-+ */
-+
-+#ifndef __XEN_PUBLIC_XENOPROF_H__
-+#define __XEN_PUBLIC_XENOPROF_H__
-+
-+#include "xen.h"
-+
-+/*
-+ * Commands to HYPERVISOR_xenoprof_op().
-+ */
-+#define XENOPROF_init                0
-+#define XENOPROF_reset_active_list   1
-+#define XENOPROF_reset_passive_list  2
-+#define XENOPROF_set_active          3
-+#define XENOPROF_set_passive         4
-+#define XENOPROF_reserve_counters    5
-+#define XENOPROF_counter             6
-+#define XENOPROF_setup_events        7
-+#define XENOPROF_enable_virq         8
-+#define XENOPROF_start               9
-+#define XENOPROF_stop               10
-+#define XENOPROF_disable_virq       11
-+#define XENOPROF_release_counters   12
-+#define XENOPROF_shutdown           13
-+#define XENOPROF_get_buffer         14
-+#define XENOPROF_set_backtrace      15
-+#define XENOPROF_last_op            15
-+
-+#define MAX_OPROF_EVENTS    32
-+#define MAX_OPROF_DOMAINS   25
-+#define XENOPROF_CPU_TYPE_SIZE 64
-+
-+/* Xenoprof performance events (not Xen events) */
-+struct event_log {
-+    uint64_t eip;
-+    uint8_t mode;
-+    uint8_t event;
-+};
-+
-+/* PC value that indicates a special code */
-+#define XENOPROF_ESCAPE_CODE ~0UL
-+/* Transient events for the xenoprof->oprofile cpu buf */
-+#define XENOPROF_TRACE_BEGIN 1
-+
-+/* Xenoprof buffer shared between Xen and domain - 1 per VCPU */
-+struct xenoprof_buf {
-+    uint32_t event_head;
-+    uint32_t event_tail;
-+    uint32_t event_size;
-+    uint32_t vcpu_id;
-+    uint64_t xen_samples;
-+    uint64_t kernel_samples;
-+    uint64_t user_samples;
-+    uint64_t lost_samples;
-+    struct event_log event_log[1];
-+};
-+#ifndef __XEN__
-+typedef struct xenoprof_buf xenoprof_buf_t;
-+DEFINE_XEN_GUEST_HANDLE(xenoprof_buf_t);
-+#endif
-+
-+struct xenoprof_init {
-+    int32_t  num_events;
-+    int32_t  is_primary;
-+    char cpu_type[XENOPROF_CPU_TYPE_SIZE];
-+};
-+typedef struct xenoprof_init xenoprof_init_t;
-+DEFINE_XEN_GUEST_HANDLE(xenoprof_init_t);
-+
-+struct xenoprof_get_buffer {
-+    int32_t  max_samples;
-+    int32_t  nbuf;
-+    int32_t  bufsize;
-+    uint64_t buf_gmaddr;
-+};
-+typedef struct xenoprof_get_buffer xenoprof_get_buffer_t;
-+DEFINE_XEN_GUEST_HANDLE(xenoprof_get_buffer_t);
-+
-+struct xenoprof_counter {
-+    uint32_t ind;
-+    uint64_t count;
-+    uint32_t enabled;
-+    uint32_t event;
-+    uint32_t hypervisor;
-+    uint32_t kernel;
-+    uint32_t user;
-+    uint64_t unit_mask;
-+};
-+typedef struct xenoprof_counter xenoprof_counter_t;
-+DEFINE_XEN_GUEST_HANDLE(xenoprof_counter_t);
-+
-+typedef struct xenoprof_passive {
-+    uint16_t domain_id;
-+    int32_t  max_samples;
-+    int32_t  nbuf;
-+    int32_t  bufsize;
-+    uint64_t buf_gmaddr;
-+} xenoprof_passive_t;
-+DEFINE_XEN_GUEST_HANDLE(xenoprof_passive_t);
-+
-+
-+#endif /* __XEN_PUBLIC_XENOPROF_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/xsm/acm.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/xsm/acm.h    2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,235 @@
-+/*
-+ * acm.h: Xen access control module interface defintions
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Reiner Sailer <sailer@watson.ibm.com>
-+ * Copyright (c) 2005, International Business Machines Corporation.
-+ */
-+
-+#ifndef _XEN_PUBLIC_ACM_H
-+#define _XEN_PUBLIC_ACM_H
-+
-+#include "../xen.h"
-+
-+/* if ACM_DEBUG defined, all hooks should
-+ * print a short trace message (comment it out
-+ * when not in testing mode )
-+ */
-+/* #define ACM_DEBUG */
-+
-+#ifdef ACM_DEBUG
-+#  define printkd(fmt, args...) printk(fmt,## args)
-+#else
-+#  define printkd(fmt, args...)
-+#endif
-+
-+/* default ssid reference value if not supplied */
-+#define ACM_DEFAULT_SSID  0x0
-+#define ACM_DEFAULT_LOCAL_SSID  0x0
-+
-+/* Internal ACM ERROR types */
-+#define ACM_OK     0
-+#define ACM_UNDEF   -1
-+#define ACM_INIT_SSID_ERROR  -2
-+#define ACM_INIT_SOID_ERROR  -3
-+#define ACM_ERROR          -4
-+
-+/* External ACCESS DECISIONS */
-+#define ACM_ACCESS_PERMITTED        0
-+#define ACM_ACCESS_DENIED           -111
-+#define ACM_NULL_POINTER_ERROR      -200
-+
-+/*
-+   Error codes reported in when trying to test for a new policy
-+   These error codes are reported in an array of tuples where
-+   each error code is followed by a parameter describing the error
-+   more closely, such as a domain id.
-+*/
-+#define ACM_EVTCHN_SHARING_VIOLATION       0x100
-+#define ACM_GNTTAB_SHARING_VIOLATION       0x101
-+#define ACM_DOMAIN_LOOKUP                  0x102
-+#define ACM_CHWALL_CONFLICT                0x103
-+#define ACM_SSIDREF_IN_USE                 0x104
-+
-+
-+/* primary policy in lower 4 bits */
-+#define ACM_NULL_POLICY 0
-+#define ACM_CHINESE_WALL_POLICY 1
-+#define ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY 2
-+#define ACM_POLICY_UNDEFINED 15
-+
-+/* combinations have secondary policy component in higher 4bit */
-+#define ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY \
-+    ((ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY << 4) | ACM_CHINESE_WALL_POLICY)
-+
-+/* policy: */
-+#define ACM_POLICY_NAME(X) \
-+ ((X) == (ACM_NULL_POLICY)) ? "NULL" :                        \
-+    ((X) == (ACM_CHINESE_WALL_POLICY)) ? "CHINESE WALL" :        \
-+    ((X) == (ACM_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "SIMPLE TYPE ENFORCEMENT" : \
-+    ((X) == (ACM_CHINESE_WALL_AND_SIMPLE_TYPE_ENFORCEMENT_POLICY)) ? "CHINESE WALL AND SIMPLE TYPE ENFORCEMENT" : \
-+     "UNDEFINED"
-+
-+/* the following policy versions must be increased
-+ * whenever the interpretation of the related
-+ * policy's data structure changes
-+ */
-+#define ACM_POLICY_VERSION 4
-+#define ACM_CHWALL_VERSION 1
-+#define ACM_STE_VERSION  1
-+
-+/* defines a ssid reference used by xen */
-+typedef uint32_t ssidref_t;
-+
-+/* hooks that are known to domains */
-+#define ACMHOOK_none          0
-+#define ACMHOOK_sharing       1
-+#define ACMHOOK_authorization 2
-+#define ACMHOOK_conflictset   3
-+
-+/* -------security policy relevant type definitions-------- */
-+
-+/* type identifier; compares to "equal" or "not equal" */
-+typedef uint16_t domaintype_t;
-+
-+/* CHINESE WALL POLICY DATA STRUCTURES
-+ *
-+ * current accumulated conflict type set:
-+ * When a domain is started and has a type that is in
-+ * a conflict set, the conflicting types are incremented in
-+ * the aggregate set. When a domain is destroyed, the 
-+ * conflicting types to its type are decremented.
-+ * If a domain has multiple types, this procedure works over
-+ * all those types.
-+ *
-+ * conflict_aggregate_set[i] holds the number of
-+ *   running domains that have a conflict with type i.
-+ *
-+ * running_types[i] holds the number of running domains
-+ *        that include type i in their ssidref-referenced type set
-+ *
-+ * conflict_sets[i][j] is "0" if type j has no conflict
-+ *    with type i and is "1" otherwise.
-+ */
-+/* high-16 = version, low-16 = check magic */
-+#define ACM_MAGIC  0x0001debc
-+
-+/* size of the SHA1 hash identifying the XML policy from which the
-+   binary policy was created */
-+#define ACM_SHA1_HASH_SIZE    20
-+
-+/* each offset in bytes from start of the struct they
-+ * are part of */
-+
-+/* V3 of the policy buffer aded a version structure */
-+struct acm_policy_version
-+{
-+    uint32_t major;
-+    uint32_t minor;
-+};
-+
-+
-+/* each buffer consists of all policy information for
-+ * the respective policy given in the policy code
-+ *
-+ * acm_policy_buffer, acm_chwall_policy_buffer,
-+ * and acm_ste_policy_buffer need to stay 32-bit aligned
-+ * because we create binary policies also with external
-+ * tools that assume packed representations (e.g. the java tool)
-+ */
-+struct acm_policy_buffer {
-+    uint32_t magic;
-+    uint32_t policy_version; /* ACM_POLICY_VERSION */
-+    uint32_t len;
-+    uint32_t policy_reference_offset;
-+    uint32_t primary_policy_code;
-+    uint32_t primary_buffer_offset;
-+    uint32_t secondary_policy_code;
-+    uint32_t secondary_buffer_offset;
-+    struct acm_policy_version xml_pol_version; /* add in V3 */
-+    uint8_t xml_policy_hash[ACM_SHA1_HASH_SIZE]; /* added in V4 */
-+};
-+
-+
-+struct acm_policy_reference_buffer {
-+    uint32_t len;
-+};
-+
-+struct acm_chwall_policy_buffer {
-+    uint32_t policy_version; /* ACM_CHWALL_VERSION */
-+    uint32_t policy_code;
-+    uint32_t chwall_max_types;
-+    uint32_t chwall_max_ssidrefs;
-+    uint32_t chwall_max_conflictsets;
-+    uint32_t chwall_ssid_offset;
-+    uint32_t chwall_conflict_sets_offset;
-+    uint32_t chwall_running_types_offset;
-+    uint32_t chwall_conflict_aggregate_offset;
-+};
-+
-+struct acm_ste_policy_buffer {
-+    uint32_t policy_version; /* ACM_STE_VERSION */
-+    uint32_t policy_code;
-+    uint32_t ste_max_types;
-+    uint32_t ste_max_ssidrefs;
-+    uint32_t ste_ssid_offset;
-+};
-+
-+struct acm_stats_buffer {
-+    uint32_t magic;
-+    uint32_t len;
-+    uint32_t primary_policy_code;
-+    uint32_t primary_stats_offset;
-+    uint32_t secondary_policy_code;
-+    uint32_t secondary_stats_offset;
-+};
-+
-+struct acm_ste_stats_buffer {
-+    uint32_t ec_eval_count;
-+    uint32_t gt_eval_count;
-+    uint32_t ec_denied_count;
-+    uint32_t gt_denied_count;
-+    uint32_t ec_cachehit_count;
-+    uint32_t gt_cachehit_count;
-+};
-+
-+struct acm_ssid_buffer {
-+    uint32_t len;
-+    ssidref_t ssidref;
-+    uint32_t policy_reference_offset;
-+    uint32_t primary_policy_code;
-+    uint32_t primary_max_types;
-+    uint32_t primary_types_offset;
-+    uint32_t secondary_policy_code;
-+    uint32_t secondary_max_types;
-+    uint32_t secondary_types_offset;
-+};
-+
-+#endif
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/xsm/acm_ops.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/xsm/acm_ops.h        2007-10-22 13:39:15.000000000 +0200
-@@ -0,0 +1,159 @@
-+/*
-+ * acm_ops.h: Xen access control module hypervisor commands
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ *
-+ * Reiner Sailer <sailer@watson.ibm.com>
-+ * Copyright (c) 2005,2006 International Business Machines Corporation.
-+ */
-+
-+#ifndef __XEN_PUBLIC_ACM_OPS_H__
-+#define __XEN_PUBLIC_ACM_OPS_H__
-+
-+#include "../xen.h"
-+#include "acm.h"
-+
-+/*
-+ * Make sure you increment the interface version whenever you modify this file!
-+ * This makes sure that old versions of acm tools will stop working in a
-+ * well-defined way (rather than crashing the machine, for instance).
-+ */
-+#define ACM_INTERFACE_VERSION   0xAAAA000A
-+
-+/************************************************************************/
-+
-+/*
-+ * Prototype for this hypercall is:
-+ *  int acm_op(int cmd, void *args)
-+ * @cmd  == ACMOP_??? (access control module operation).
-+ * @args == Operation-specific extra arguments (NULL if none).
-+ */
-+
-+
-+#define ACMOP_setpolicy         1
-+struct acm_setpolicy {
-+    /* IN */
-+    XEN_GUEST_HANDLE_64(void) pushcache;
-+    uint32_t pushcache_size;
-+};
-+
-+
-+#define ACMOP_getpolicy         2
-+struct acm_getpolicy {
-+    /* IN */
-+    XEN_GUEST_HANDLE_64(void) pullcache;
-+    uint32_t pullcache_size;
-+};
-+
-+
-+#define ACMOP_dumpstats         3
-+struct acm_dumpstats {
-+    /* IN */
-+    XEN_GUEST_HANDLE_64(void) pullcache;
-+    uint32_t pullcache_size;
-+};
-+
-+
-+#define ACMOP_getssid           4
-+#define ACM_GETBY_ssidref  1
-+#define ACM_GETBY_domainid 2
-+struct acm_getssid {
-+    /* IN */
-+    uint32_t get_ssid_by; /* ACM_GETBY_* */
-+    union {
-+        domaintype_t domainid;
-+        ssidref_t    ssidref;
-+    } id;
-+    XEN_GUEST_HANDLE_64(void) ssidbuf;
-+    uint32_t ssidbuf_size;
-+};
-+
-+#define ACMOP_getdecision      5
-+struct acm_getdecision {
-+    /* IN */
-+    uint32_t get_decision_by1; /* ACM_GETBY_* */
-+    uint32_t get_decision_by2; /* ACM_GETBY_* */
-+    union {
-+        domaintype_t domainid;
-+        ssidref_t    ssidref;
-+    } id1;
-+    union {
-+        domaintype_t domainid;
-+        ssidref_t    ssidref;
-+    } id2;
-+    uint32_t hook;
-+    /* OUT */
-+    uint32_t acm_decision;
-+};
-+
-+
-+#define ACMOP_chgpolicy        6
-+struct acm_change_policy {
-+    /* IN */
-+    XEN_GUEST_HANDLE_64(void) policy_pushcache;
-+    uint32_t policy_pushcache_size;
-+    XEN_GUEST_HANDLE_64(void) del_array;
-+    uint32_t delarray_size;
-+    XEN_GUEST_HANDLE_64(void) chg_array;
-+    uint32_t chgarray_size;
-+    /* OUT */
-+    /* array with error code */
-+    XEN_GUEST_HANDLE_64(void) err_array;
-+    uint32_t errarray_size;
-+};
-+
-+#define ACMOP_relabeldoms       7
-+struct acm_relabel_doms {
-+    /* IN */
-+    XEN_GUEST_HANDLE_64(void) relabel_map;
-+    uint32_t relabel_map_size;
-+    /* OUT */
-+    XEN_GUEST_HANDLE_64(void) err_array;
-+    uint32_t errarray_size;
-+};
-+
-+/* future interface to Xen */
-+struct xen_acmctl {
-+    uint32_t cmd;
-+    uint32_t interface_version;
-+    union {
-+        struct acm_setpolicy     setpolicy;
-+        struct acm_getpolicy     getpolicy;
-+        struct acm_dumpstats     dumpstats;
-+        struct acm_getssid       getssid;
-+        struct acm_getdecision   getdecision;
-+        struct acm_change_policy change_policy;
-+        struct acm_relabel_doms  relabel_doms;
-+    } u;
-+};
-+
-+typedef struct xen_acmctl xen_acmctl_t;
-+DEFINE_XEN_GUEST_HANDLE(xen_acmctl_t);
-+
-+#endif /* __XEN_PUBLIC_ACM_OPS_H__ */
-+
-+/*
-+ * Local variables:
-+ * mode: C
-+ * c-set-style: "BSD"
-+ * c-basic-offset: 4
-+ * tab-width: 4
-+ * indent-tabs-mode: nil
-+ * End:
-+ */
-Index: head-2008-11-25/include/xen/interface/xsm/flask_op.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/interface/xsm/flask_op.h       2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,45 @@
-+/*
-+ *  This file contains the flask_op hypercall commands and definitions.
-+ *
-+ *  Author:  George Coker, <gscoker@alpha.ncsc.mil>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License version 2,
-+ *  as published by the Free Software Foundation.
-+ */
-+
-+#ifndef __FLASK_OP_H__
-+#define __FLASK_OP_H__
-+
-+#define FLASK_LOAD              1
-+#define FLASK_GETENFORCE        2
-+#define FLASK_SETENFORCE        3
-+#define FLASK_CONTEXT_TO_SID    4
-+#define FLASK_SID_TO_CONTEXT    5
-+#define FLASK_ACCESS            6
-+#define FLASK_CREATE            7
-+#define FLASK_RELABEL           8
-+#define FLASK_USER              9
-+#define FLASK_POLICYVERS        10
-+#define FLASK_GETBOOL           11
-+#define FLASK_SETBOOL           12
-+#define FLASK_COMMITBOOLS       13
-+#define FLASK_MLS               14
-+#define FLASK_DISABLE           15
-+#define FLASK_GETAVC_THRESHOLD  16
-+#define FLASK_SETAVC_THRESHOLD  17
-+#define FLASK_AVC_HASHSTATS     18
-+#define FLASK_AVC_CACHESTATS    19
-+#define FLASK_MEMBER            20
-+
-+#define FLASK_LAST              FLASK_MEMBER
-+
-+typedef struct flask_op {
-+    uint32_t  cmd;
-+    uint32_t  size;
-+    char      *buf;
-+} flask_op_t;
-+
-+DEFINE_XEN_GUEST_HANDLE(flask_op_t);
-+
-+#endif
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-arch.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-arch.diff
deleted file mode 100644 (file)
index 4d55e4a..0000000
+++ /dev/null
@@ -1,46515 +0,0 @@
-Subject: xen3 xen-arch
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-List of files having Xen derivates (perhaps created during the merging
-of newer kernel versions), for xen-port-patches.py to pick up (i.e. this
-must be retained here until the XenSource tree has these in the right
-places):
-+++ linux/arch/x86/kernel/acpi/sleep-xen.c
-+++ linux/arch/x86/kernel/cpu/common_64-xen.c
-+++ linux/arch/x86/kernel/e820-xen.c
-+++ linux/arch/x86/kernel/head-xen.c
-+++ linux/arch/x86/kernel/head32-xen.c
-+++ linux/arch/x86/kernel/ioport-xen.c
-+++ linux/arch/x86/kernel/ipi-xen.c
-+++ linux/arch/x86/kernel/ldt-xen.c
-+++ linux/arch/x86/kernel/mpparse-xen.c
-+++ linux/arch/x86/kernel/pci-nommu-xen.c
-+++ linux/arch/x86/kernel/process-xen.c
-+++ linux/arch/x86/kernel/setup-xen.c
-+++ linux/arch/x86/kernel/setup_percpu-xen.c
-+++ linux/arch/x86/kernel/smp-xen.c
-+++ linux/arch/x86/mm/fault-xen.c
-+++ linux/arch/x86/mm/ioremap-xen.c
-+++ linux/arch/x86/mm/pageattr-xen.c
-+++ linux/arch/x86/mm/pat-xen.c
-+++ linux/arch/x86/mm/pgtable-xen.c
-+++ linux/arch/x86/vdso/vdso32-setup-xen.c
-+++ linux/drivers/char/mem-xen.c
-+++ linux/include/asm-x86/mach-xen/asm/desc.h
-+++ linux/include/asm-x86/mach-xen/asm/dma-mapping.h
-+++ linux/include/asm-x86/mach-xen/asm/fixmap.h
-+++ linux/include/asm-x86/mach-xen/asm/io.h
-+++ linux/include/asm-x86/mach-xen/asm/irq_vectors.h
-+++ linux/include/asm-x86/mach-xen/asm/irqflags.h
-+++ linux/include/asm-x86/mach-xen/asm/mmu_context.h
-+++ linux/include/asm-x86/mach-xen/asm/page.h
-+++ linux/include/asm-x86/mach-xen/asm/pci.h
-+++ linux/include/asm-x86/mach-xen/asm/pgalloc.h
-+++ linux/include/asm-x86/mach-xen/asm/pgtable.h
-+++ linux/include/asm-x86/mach-xen/asm/processor.h
-+++ linux/include/asm-x86/mach-xen/asm/segment.h
-+++ linux/include/asm-x86/mach-xen/asm/smp.h
-+++ linux/include/asm-x86/mach-xen/asm/spinlock.h
-+++ linux/include/asm-x86/mach-xen/asm/swiotlb.h
-+++ linux/include/asm-x86/mach-xen/asm/system.h
-+++ linux/include/asm-x86/mach-xen/asm/tlbflush.h
-+++ linux/include/asm-x86/mach-xen/asm/xor.h
-
-List of files folded into their native counterparts (and hence removed
-from this patch for xen-port-patches.py to not needlessly pick them up;
-for reference, prefixed with the version the removal occured):
-2.6.18/include/asm-x86/mach-xen/asm/pgtable-2level.h
-2.6.18/include/asm-x86/mach-xen/asm/pgtable-2level-defs.h
-2.6.19/include/asm-x86/mach-xen/asm/ptrace.h
-2.6.23/arch/x86/kernel/vsyscall-note_32-xen.S
-2.6.23/include/asm-x86/mach-xen/asm/ptrace_64.h
-2.6.24/arch/x86/kernel/early_printk_32-xen.c
-2.6.24/include/asm-x86/mach-xen/asm/arch_hooks_64.h
-2.6.24/include/asm-x86/mach-xen/asm/bootsetup_64.h
-2.6.24/include/asm-x86/mach-xen/asm/mmu_32.h
-2.6.24/include/asm-x86/mach-xen/asm/mmu_64.h
-2.6.24/include/asm-x86/mach-xen/asm/nmi_64.h
-2.6.24/include/asm-x86/mach-xen/asm/setup.h
-2.6.24/include/asm-x86/mach-xen/asm/time_64.h (added in 2.6.20)
-2.6.24/include/asm-x86/mach-xen/mach_timer.h
-2.6.25/arch/x86/ia32/syscall32-xen.c
-2.6.25/arch/x86/ia32/syscall32_syscall-xen.S
-2.6.25/arch/x86/ia32/vsyscall-int80.S
-2.6.25/arch/x86/kernel/acpi/boot-xen.c
-2.6.25/include/asm-x86/mach-xen/asm/msr.h
-2.6.25/include/asm-x86/mach-xen/asm/page_32.h
-2.6.25/include/asm-x86/mach-xen/asm/spinlock_32.h
-2.6.25/include/asm-x86/mach-xen/asm/timer.h (added in 2.6.24)
-2.6.25/include/asm-x86/mach-xen/asm/timer_64.h
-2.6.25/include/asm-x86/mach-xen/mach_time.h
-2.6.26/arch/x86/kernel/pci-dma_32-xen.c
-2.6.26/arch/x86/kernel/pci-swiotlb_64-xen.c
-2.6.26/include/asm-x86/mach-xen/asm/dma-mapping_32.h
-2.6.26/include/asm-x86/mach-xen/asm/dma-mapping_64.h
-2.6.26/include/asm-x86/mach-xen/asm/nmi.h (added in 2.6.24)
-2.6.26/include/asm-x86/mach-xen/asm/scatterlist.h (added in 2.6.24)
-2.6.26/include/asm-x86/mach-xen/asm/scatterlist_32.h
-2.6.26/include/xen/xencomm.h
-2.6.27/arch/x86/kernel/e820_32-xen.c
-2.6.27/include/asm-x86/mach-xen/asm/e820.h (added in 2.6.24)
-2.6.27/include/asm-x86/mach-xen/asm/e820_64.h
-2.6.27/include/asm-x86/mach-xen/asm/hw_irq.h (added in 2.6.24)
-2.6.27/include/asm-x86/mach-xen/asm/hw_irq_32.h
-2.6.27/include/asm-x86/mach-xen/asm/hw_irq_64.h
-2.6.27/include/asm-x86/mach-xen/asm/io_32.h
-2.6.27/include/asm-x86/mach-xen/asm/io_64.h
-2.6.27/include/asm-x86/mach-xen/asm/irq.h (added in 2.6.24)
-2.6.27/include/asm-x86/mach-xen/asm/irq_64.h
-2.6.27.8/include/asm-x86/mach-xen/asm/pci_64.h
-
-Index: head-2008-11-25/arch/x86/kernel/acpi/processor_extcntl_xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/acpi/processor_extcntl_xen.c       2008-10-01 15:43:24.000000000 +0200
-@@ -0,0 +1,209 @@
-+/*
-+ * processor_extcntl_xen.c - interface to notify Xen
-+ *
-+ *  Copyright (C) 2008, Intel corporation
-+ *
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; either version 2 of the License, or (at
-+ *  your option) any later version.
-+ *
-+ *  This program is distributed in the hope that it will be useful, but
-+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-+ *  General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License along
-+ *  with this program; if not, write to the Free Software Foundation, Inc.,
-+ *  59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
-+ *
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/acpi.h>
-+#include <linux/pm.h>
-+#include <linux/cpu.h>
-+
-+#include <linux/cpufreq.h>
-+#include <acpi/processor.h>
-+#include <asm/hypercall.h>
-+
-+static int xen_cx_notifier(struct acpi_processor *pr, int action)
-+{
-+      int ret, count = 0, i;
-+      xen_platform_op_t op = {
-+              .cmd                    = XENPF_set_processor_pminfo,
-+              .interface_version      = XENPF_INTERFACE_VERSION,
-+              .u.set_pminfo.id        = pr->acpi_id,
-+              .u.set_pminfo.type      = XEN_PM_CX,
-+      };
-+      struct xen_processor_cx *data, *buf;
-+      struct acpi_processor_cx *cx;
-+
-+      if (action == PROCESSOR_PM_CHANGE)
-+              return -EINVAL;
-+
-+      /* Convert to Xen defined structure and hypercall */
-+      buf = kzalloc(pr->power.count * sizeof(struct xen_processor_cx),
-+                      GFP_KERNEL);
-+      if (!buf)
-+              return -ENOMEM;
-+
-+      data = buf;
-+      for (i = 1; i <= pr->power.count; i++) {
-+              cx = &pr->power.states[i];
-+              /* Skip invalid cstate entry */
-+              if (!cx->valid)
-+                      continue;
-+
-+              data->type = cx->type;
-+              data->latency = cx->latency;
-+              data->power = cx->power;
-+              data->reg.space_id = cx->reg.space_id;
-+              data->reg.bit_width = cx->reg.bit_width;
-+              data->reg.bit_offset = cx->reg.bit_offset;
-+              data->reg.access_size = cx->reg.reserved;
-+              data->reg.address = cx->reg.address;
-+
-+              /* Get dependency relationships */
-+              if (cx->csd_count) {
-+                      printk("Wow! _CSD is found. Not support for now!\n");
-+                      kfree(buf);
-+                      return -EINVAL;
-+              } else {
-+                      data->dpcnt = 0;
-+                      set_xen_guest_handle(data->dp, NULL);
-+              }
-+
-+              data++;
-+              count++;
-+      }
-+
-+      if (!count) {
-+              printk("No available Cx info for cpu %d\n", pr->acpi_id);
-+              kfree(buf);
-+              return -EINVAL;
-+      }
-+
-+      op.u.set_pminfo.power.count = count;
-+      op.u.set_pminfo.power.flags.bm_control = pr->flags.bm_control;
-+      op.u.set_pminfo.power.flags.bm_check = pr->flags.bm_check;
-+      op.u.set_pminfo.power.flags.has_cst = pr->flags.has_cst;
-+      op.u.set_pminfo.power.flags.power_setup_done = pr->flags.power_setup_done;
-+
-+      set_xen_guest_handle(op.u.set_pminfo.power.states, buf);
-+      ret = HYPERVISOR_platform_op(&op);
-+      kfree(buf);
-+      return ret;
-+}
-+
-+static int xen_px_notifier(struct acpi_processor *pr, int action)
-+{
-+      int ret = -EINVAL;
-+      xen_platform_op_t op = {
-+              .cmd                    = XENPF_set_processor_pminfo,
-+              .interface_version      = XENPF_INTERFACE_VERSION,
-+              .u.set_pminfo.id        = pr->acpi_id,
-+              .u.set_pminfo.type      = XEN_PM_PX,
-+      };
-+      struct xen_processor_performance *perf;
-+      struct xen_processor_px *states = NULL;
-+      struct acpi_processor_performance *px;
-+      struct acpi_psd_package *pdomain;
-+
-+      if (!pr)
-+              return -EINVAL;
-+
-+      perf = &op.u.set_pminfo.perf;
-+      px = pr->performance;
-+
-+      switch(action) {
-+      case PROCESSOR_PM_CHANGE:
-+              /* ppc dynamic handle */
-+              perf->flags = XEN_PX_PPC;
-+              perf->platform_limit = pr->performance_platform_limit;
-+
-+              ret = HYPERVISOR_platform_op(&op);
-+              break;
-+
-+      case PROCESSOR_PM_INIT:
-+              /* px normal init */
-+              perf->flags = XEN_PX_PPC | 
-+                            XEN_PX_PCT | 
-+                            XEN_PX_PSS | 
-+                            XEN_PX_PSD;
-+
-+              /* ppc */
-+              perf->platform_limit = pr->performance_platform_limit;
-+
-+              /* pct */
-+              xen_convert_pct_reg(&perf->control_register, &px->control_register);
-+              xen_convert_pct_reg(&perf->status_register, &px->status_register);
-+
-+              /* pss */
-+              perf->state_count = px->state_count;
-+              states = kzalloc(px->state_count*sizeof(xen_processor_px_t),GFP_KERNEL);
-+              if (!states)
-+                      return -ENOMEM;
-+              xen_convert_pss_states(states, px->states, px->state_count);
-+              set_xen_guest_handle(perf->states, states);
-+
-+              /* psd */
-+              pdomain = &px->domain_info;
-+              xen_convert_psd_pack(&perf->domain_info, pdomain);
-+              if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL)
-+                      perf->shared_type = CPUFREQ_SHARED_TYPE_ALL;
-+              else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY)
-+                      perf->shared_type = CPUFREQ_SHARED_TYPE_ANY;
-+              else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL)
-+                      perf->shared_type = CPUFREQ_SHARED_TYPE_HW;
-+              else {
-+                      ret = -ENODEV;
-+                      kfree(states);
-+                      break;
-+              }
-+
-+              ret = HYPERVISOR_platform_op(&op);
-+              kfree(states);
-+              break;
-+
-+      default:
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+static int xen_tx_notifier(struct acpi_processor *pr, int action)
-+{
-+      return -EINVAL;
-+}
-+static int xen_hotplug_notifier(struct acpi_processor *pr, int event)
-+{
-+      return -EINVAL;
-+}
-+
-+static struct processor_extcntl_ops xen_extcntl_ops = {
-+      .hotplug                = xen_hotplug_notifier,
-+};
-+
-+void arch_acpi_processor_init_extcntl(const struct processor_extcntl_ops **ops)
-+{
-+      unsigned int pmbits = (xen_start_info->flags & SIF_PM_MASK) >> 8;
-+
-+      if (!pmbits)
-+              return;
-+      if (pmbits & XEN_PROCESSOR_PM_CX)
-+              xen_extcntl_ops.pm_ops[PM_TYPE_IDLE] = xen_cx_notifier;
-+      if (pmbits & XEN_PROCESSOR_PM_PX)
-+              xen_extcntl_ops.pm_ops[PM_TYPE_PERF] = xen_px_notifier;
-+      if (pmbits & XEN_PROCESSOR_PM_TX)
-+              xen_extcntl_ops.pm_ops[PM_TYPE_THR] = xen_tx_notifier;
-+
-+      *ops = &xen_extcntl_ops;
-+}
-+EXPORT_SYMBOL(arch_acpi_processor_init_extcntl);
-Index: head-2008-11-25/arch/x86/kernel/acpi/sleep_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/acpi/sleep_32-xen.c        2008-04-15 09:29:41.000000000 +0200
-@@ -0,0 +1,113 @@
-+/*
-+ * sleep.c - x86-specific ACPI sleep support.
-+ *
-+ *  Copyright (C) 2001-2003 Patrick Mochel
-+ *  Copyright (C) 2001-2003 Pavel Machek <pavel@suse.cz>
-+ */
-+
-+#include <linux/acpi.h>
-+#include <linux/bootmem.h>
-+#include <linux/dmi.h>
-+#include <linux/cpumask.h>
-+
-+#include <asm/smp.h>
-+
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+/* address in low memory of the wakeup routine. */
-+unsigned long acpi_wakeup_address = 0;
-+unsigned long acpi_video_flags;
-+extern char wakeup_start, wakeup_end;
-+
-+extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
-+#endif
-+
-+/**
-+ * acpi_save_state_mem - save kernel state
-+ *
-+ * Create an identity mapped page table and copy the wakeup routine to
-+ * low memory.
-+ */
-+int acpi_save_state_mem(void)
-+{
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+      if (!acpi_wakeup_address)
-+              return 1;
-+      memcpy((void *)acpi_wakeup_address, &wakeup_start,
-+             &wakeup_end - &wakeup_start);
-+      acpi_copy_wakeup_routine(acpi_wakeup_address);
-+#endif
-+      return 0;
-+}
-+
-+/*
-+ * acpi_restore_state - undo effects of acpi_save_state_mem
-+ */
-+void acpi_restore_state_mem(void)
-+{
-+}
-+
-+/**
-+ * acpi_reserve_bootmem - do _very_ early ACPI initialisation
-+ *
-+ * We allocate a page from the first 1MB of memory for the wakeup
-+ * routine for when we come back from a sleep state. The
-+ * runtime allocator allows specification of <16MB pages, but not
-+ * <1MB pages.
-+ */
-+void __init acpi_reserve_bootmem(void)
-+{
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+      if ((&wakeup_end - &wakeup_start) > PAGE_SIZE) {
-+              printk(KERN_ERR
-+                     "ACPI: Wakeup code way too big, S3 disabled.\n");
-+              return;
-+      }
-+
-+      acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE);
-+      if (!acpi_wakeup_address)
-+              printk(KERN_ERR "ACPI: Cannot allocate lowmem, S3 disabled.\n");
-+#endif
-+}
-+
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+static int __init acpi_sleep_setup(char *str)
-+{
-+      while ((str != NULL) && (*str != '\0')) {
-+              if (strncmp(str, "s3_bios", 7) == 0)
-+                      acpi_video_flags = 1;
-+              if (strncmp(str, "s3_mode", 7) == 0)
-+                      acpi_video_flags |= 2;
-+              str = strchr(str, ',');
-+              if (str != NULL)
-+                      str += strspn(str, ", \t");
-+      }
-+      return 1;
-+}
-+
-+__setup("acpi_sleep=", acpi_sleep_setup);
-+
-+static __init int reset_videomode_after_s3(struct dmi_system_id *d)
-+{
-+      acpi_video_flags |= 2;
-+      return 0;
-+}
-+
-+static __initdata struct dmi_system_id acpisleep_dmi_table[] = {
-+      {                       /* Reset video mode after returning from ACPI S3 sleep */
-+       .callback = reset_videomode_after_s3,
-+       .ident = "Toshiba Satellite 4030cdt",
-+       .matches = {
-+                   DMI_MATCH(DMI_PRODUCT_NAME, "S4030CDT/4.3"),
-+                   },
-+       },
-+      {}
-+};
-+
-+static int __init acpisleep_dmi_init(void)
-+{
-+      dmi_check_system(acpisleep_dmi_table);
-+      return 0;
-+}
-+
-+core_initcall(acpisleep_dmi_init);
-+#endif /* CONFIG_ACPI_PV_SLEEP */
-Index: head-2008-11-25/arch/x86/kernel/apic_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/apic_32-xen.c      2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,155 @@
-+/*
-+ *    Local APIC handling, local APIC timers
-+ *
-+ *    (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *    Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
-+ *                                    thanks to Eric Gilmore
-+ *                                    and Rolf G. Tews
-+ *                                    for testing these extensively.
-+ *    Maciej W. Rozycki       :       Various updates and fixes.
-+ *    Mikael Pettersson       :       Power Management for UP-APIC.
-+ *    Pavel Machek and
-+ *    Mikael Pettersson       :       PM converted to driver model.
-+ */
-+
-+#include <linux/init.h>
-+
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/bootmem.h>
-+#include <linux/smp_lock.h>
-+#include <linux/interrupt.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/sysdev.h>
-+#include <linux/cpu.h>
-+#include <linux/module.h>
-+
-+#include <asm/atomic.h>
-+#include <asm/smp.h>
-+#include <asm/mtrr.h>
-+#include <asm/mpspec.h>
-+#include <asm/desc.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/hpet.h>
-+#include <asm/i8253.h>
-+#include <asm/nmi.h>
-+
-+#include <mach_apic.h>
-+#include <mach_apicdef.h>
-+#include <mach_ipi.h>
-+
-+#include "io_ports.h"
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * cpu_mask that denotes the CPUs that needs timer interrupt coming in as
-+ * IPIs in place of local APIC timers
-+ */
-+static cpumask_t timer_bcast_ipi;
-+#endif
-+
-+/*
-+ * Knob to control our willingness to enable the local APIC.
-+ */
-+int enable_local_apic __initdata = 0; /* -1=force-disable, +1=force-enable */
-+
-+/*
-+ * Debug level
-+ */
-+int apic_verbosity;
-+
-+#ifndef CONFIG_XEN
-+static int modern_apic(void)
-+{
-+      unsigned int lvr, version;
-+      /* AMD systems use old APIC versions, so check the CPU */
-+      if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-+              boot_cpu_data.x86 >= 0xf)
-+              return 1;
-+      lvr = apic_read(APIC_LVR);
-+      version = GET_APIC_VERSION(lvr);
-+      return version >= 0x14;
-+}
-+#endif /* !CONFIG_XEN */
-+
-+/*
-+ * 'what should we do if we get a hw irq event on an illegal vector'.
-+ * each architecture has to answer this themselves.
-+ */
-+void ack_bad_irq(unsigned int irq)
-+{
-+      printk("unexpected IRQ trap at vector %02x\n", irq);
-+      /*
-+       * Currently unexpected vectors happen only on SMP and APIC.
-+       * We _must_ ack these because every local APIC has only N
-+       * irq slots per priority level, and a 'hanging, unacked' IRQ
-+       * holds up an irq slot - in excessive cases (when multiple
-+       * unexpected vectors occur) that might lock up the APIC
-+       * completely.
-+       * But only ack when the APIC is enabled -AK
-+       */
-+      if (cpu_has_apic)
-+              ack_APIC_irq();
-+}
-+
-+int get_physical_broadcast(void)
-+{
-+        return 0xff;
-+}
-+
-+#ifndef CONFIG_XEN
-+#ifndef CONFIG_SMP
-+static void up_apic_timer_interrupt_call(struct pt_regs *regs)
-+{
-+      int cpu = smp_processor_id();
-+
-+      /*
-+       * the NMI deadlock-detector uses this.
-+       */
-+      per_cpu(irq_stat, cpu).apic_timer_irqs++;
-+
-+      smp_local_timer_interrupt(regs);
-+}
-+#endif
-+
-+void smp_send_timer_broadcast_ipi(struct pt_regs *regs)
-+{
-+      cpumask_t mask;
-+
-+      cpus_and(mask, cpu_online_map, timer_bcast_ipi);
-+      if (!cpus_empty(mask)) {
-+#ifdef CONFIG_SMP
-+              send_IPI_mask(mask, LOCAL_TIMER_VECTOR);
-+#else
-+              /*
-+               * We can directly call the apic timer interrupt handler
-+               * in UP case. Minus all irq related functions
-+               */
-+              up_apic_timer_interrupt_call(regs);
-+#endif
-+      }
-+}
-+#endif
-+
-+int setup_profiling_timer(unsigned int multiplier)
-+{
-+      return -EINVAL;
-+}
-+
-+/*
-+ * This initializes the IO-APIC and APIC hardware if this is
-+ * a UP kernel.
-+ */
-+int __init APIC_init_uniprocessor (void)
-+{
-+#ifdef CONFIG_X86_IO_APIC
-+      if (smp_found_config)
-+              if (!skip_ioapic_setup && nr_ioapics)
-+                      setup_IO_APIC();
-+#endif
-+
-+      return 0;
-+}
-Index: head-2008-11-25/arch/x86/kernel/cpu/common-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/cpu/common-xen.c   2007-12-10 08:47:31.000000000 +0100
-@@ -0,0 +1,743 @@
-+#include <linux/init.h>
-+#include <linux/string.h>
-+#include <linux/delay.h>
-+#include <linux/smp.h>
-+#include <linux/module.h>
-+#include <linux/percpu.h>
-+#include <linux/bootmem.h>
-+#include <asm/semaphore.h>
-+#include <asm/processor.h>
-+#include <asm/i387.h>
-+#include <asm/msr.h>
-+#include <asm/io.h>
-+#include <asm/mmu_context.h>
-+#include <asm/mtrr.h>
-+#include <asm/mce.h>
-+#ifdef CONFIG_X86_LOCAL_APIC
-+#include <asm/mpspec.h>
-+#include <asm/apic.h>
-+#include <mach_apic.h>
-+#else
-+#ifdef CONFIG_XEN
-+#define phys_pkg_id(a,b) a
-+#endif
-+#endif
-+#include <asm/hypervisor.h>
-+
-+#include "cpu.h"
-+
-+DEFINE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
-+EXPORT_PER_CPU_SYMBOL(cpu_gdt_descr);
-+
-+#ifndef CONFIG_XEN
-+DEFINE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
-+EXPORT_PER_CPU_SYMBOL(cpu_16bit_stack);
-+#endif
-+
-+static int cachesize_override __cpuinitdata = -1;
-+static int disable_x86_fxsr __cpuinitdata;
-+static int disable_x86_serial_nr __cpuinitdata = 1;
-+static int disable_x86_sep __cpuinitdata;
-+
-+struct cpu_dev * cpu_devs[X86_VENDOR_NUM] = {};
-+
-+extern int disable_pse;
-+
-+static void default_init(struct cpuinfo_x86 * c)
-+{
-+      /* Not much we can do here... */
-+      /* Check if at least it has cpuid */
-+      if (c->cpuid_level == -1) {
-+              /* No cpuid. It must be an ancient CPU */
-+              if (c->x86 == 4)
-+                      strcpy(c->x86_model_id, "486");
-+              else if (c->x86 == 3)
-+                      strcpy(c->x86_model_id, "386");
-+      }
-+}
-+
-+static struct cpu_dev default_cpu = {
-+      .c_init = default_init,
-+      .c_vendor = "Unknown",
-+};
-+static struct cpu_dev * this_cpu = &default_cpu;
-+
-+static int __init cachesize_setup(char *str)
-+{
-+      get_option (&str, &cachesize_override);
-+      return 1;
-+}
-+__setup("cachesize=", cachesize_setup);
-+
-+int __cpuinit get_model_name(struct cpuinfo_x86 *c)
-+{
-+      unsigned int *v;
-+      char *p, *q;
-+
-+      if (cpuid_eax(0x80000000) < 0x80000004)
-+              return 0;
-+
-+      v = (unsigned int *) c->x86_model_id;
-+      cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
-+      cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
-+      cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
-+      c->x86_model_id[48] = 0;
-+
-+      /* Intel chips right-justify this string for some dumb reason;
-+         undo that brain damage */
-+      p = q = &c->x86_model_id[0];
-+      while ( *p == ' ' )
-+           p++;
-+      if ( p != q ) {
-+           while ( *p )
-+                *q++ = *p++;
-+           while ( q <= &c->x86_model_id[48] )
-+                *q++ = '\0';  /* Zero-pad the rest */
-+      }
-+
-+      return 1;
-+}
-+
-+
-+void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
-+{
-+      unsigned int n, dummy, ecx, edx, l2size;
-+
-+      n = cpuid_eax(0x80000000);
-+
-+      if (n >= 0x80000005) {
-+              cpuid(0x80000005, &dummy, &dummy, &ecx, &edx);
-+              printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-+                      edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-+              c->x86_cache_size=(ecx>>24)+(edx>>24);  
-+      }
-+
-+      if (n < 0x80000006)     /* Some chips just has a large L1. */
-+              return;
-+
-+      ecx = cpuid_ecx(0x80000006);
-+      l2size = ecx >> 16;
-+      
-+      /* do processor-specific cache resizing */
-+      if (this_cpu->c_size_cache)
-+              l2size = this_cpu->c_size_cache(c,l2size);
-+
-+      /* Allow user to override all this if necessary. */
-+      if (cachesize_override != -1)
-+              l2size = cachesize_override;
-+
-+      if ( l2size == 0 )
-+              return;         /* Again, no L2 cache is possible */
-+
-+      c->x86_cache_size = l2size;
-+
-+      printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-+             l2size, ecx & 0xFF);
-+}
-+
-+/* Naming convention should be: <Name> [(<Codename>)] */
-+/* This table only is used unless init_<vendor>() below doesn't set it; */
-+/* in particular, if CPUID levels 0x80000002..4 are supported, this isn't used */
-+
-+/* Look up CPU names by table lookup. */
-+static char __cpuinit *table_lookup_model(struct cpuinfo_x86 *c)
-+{
-+      struct cpu_model_info *info;
-+
-+      if ( c->x86_model >= 16 )
-+              return NULL;    /* Range check */
-+
-+      if (!this_cpu)
-+              return NULL;
-+
-+      info = this_cpu->c_models;
-+
-+      while (info && info->family) {
-+              if (info->family == c->x86)
-+                      return info->model_names[c->x86_model];
-+              info++;
-+      }
-+      return NULL;            /* Not found */
-+}
-+
-+
-+static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c, int early)
-+{
-+      char *v = c->x86_vendor_id;
-+      int i;
-+      static int printed;
-+
-+      for (i = 0; i < X86_VENDOR_NUM; i++) {
-+              if (cpu_devs[i]) {
-+                      if (!strcmp(v,cpu_devs[i]->c_ident[0]) ||
-+                          (cpu_devs[i]->c_ident[1] && 
-+                           !strcmp(v,cpu_devs[i]->c_ident[1]))) {
-+                              c->x86_vendor = i;
-+                              if (!early)
-+                                      this_cpu = cpu_devs[i];
-+                              return;
-+                      }
-+              }
-+      }
-+      if (!printed) {
-+              printed++;
-+              printk(KERN_ERR "CPU: Vendor unknown, using generic init.\n");
-+              printk(KERN_ERR "CPU: Your system may be unstable.\n");
-+      }
-+      c->x86_vendor = X86_VENDOR_UNKNOWN;
-+      this_cpu = &default_cpu;
-+}
-+
-+
-+static int __init x86_fxsr_setup(char * s)
-+{
-+      disable_x86_fxsr = 1;
-+      return 1;
-+}
-+__setup("nofxsr", x86_fxsr_setup);
-+
-+
-+static int __init x86_sep_setup(char * s)
-+{
-+      disable_x86_sep = 1;
-+      return 1;
-+}
-+__setup("nosep", x86_sep_setup);
-+
-+
-+/* Standard macro to see if a specific flag is changeable */
-+static inline int flag_is_changeable_p(u32 flag)
-+{
-+      u32 f1, f2;
-+
-+      asm("pushfl\n\t"
-+          "pushfl\n\t"
-+          "popl %0\n\t"
-+          "movl %0,%1\n\t"
-+          "xorl %2,%0\n\t"
-+          "pushl %0\n\t"
-+          "popfl\n\t"
-+          "pushfl\n\t"
-+          "popl %0\n\t"
-+          "popfl\n\t"
-+          : "=&r" (f1), "=&r" (f2)
-+          : "ir" (flag));
-+
-+      return ((f1^f2) & flag) != 0;
-+}
-+
-+
-+/* Probe for the CPUID instruction */
-+static int __cpuinit have_cpuid_p(void)
-+{
-+      return flag_is_changeable_p(X86_EFLAGS_ID);
-+}
-+
-+/* Do minimum CPU detection early.
-+   Fields really needed: vendor, cpuid_level, family, model, mask, cache alignment.
-+   The others are not touched to avoid unwanted side effects.
-+
-+   WARNING: this function is only called on the BP.  Don't add code here
-+   that is supposed to run on all CPUs. */
-+static void __init early_cpu_detect(void)
-+{
-+      struct cpuinfo_x86 *c = &boot_cpu_data;
-+
-+      c->x86_cache_alignment = 32;
-+
-+      if (!have_cpuid_p())
-+              return;
-+
-+      /* Get vendor name */
-+      cpuid(0x00000000, &c->cpuid_level,
-+            (int *)&c->x86_vendor_id[0],
-+            (int *)&c->x86_vendor_id[8],
-+            (int *)&c->x86_vendor_id[4]);
-+
-+      get_cpu_vendor(c, 1);
-+
-+      c->x86 = 4;
-+      if (c->cpuid_level >= 0x00000001) {
-+              u32 junk, tfms, cap0, misc;
-+              cpuid(0x00000001, &tfms, &misc, &junk, &cap0);
-+              c->x86 = (tfms >> 8) & 15;
-+              c->x86_model = (tfms >> 4) & 15;
-+              if (c->x86 == 0xf)
-+                      c->x86 += (tfms >> 20) & 0xff;
-+              if (c->x86 >= 0x6)
-+                      c->x86_model += ((tfms >> 16) & 0xF) << 4;
-+              c->x86_mask = tfms & 15;
-+              if (cap0 & (1<<19))
-+                      c->x86_cache_alignment = ((misc >> 8) & 0xff) * 8;
-+      }
-+}
-+
-+void __cpuinit generic_identify(struct cpuinfo_x86 * c)
-+{
-+      u32 tfms, xlvl;
-+      int ebx;
-+
-+      if (have_cpuid_p()) {
-+              /* Get vendor name */
-+              cpuid(0x00000000, &c->cpuid_level,
-+                    (int *)&c->x86_vendor_id[0],
-+                    (int *)&c->x86_vendor_id[8],
-+                    (int *)&c->x86_vendor_id[4]);
-+              
-+              get_cpu_vendor(c, 0);
-+              /* Initialize the standard set of capabilities */
-+              /* Note that the vendor-specific code below might override */
-+      
-+              /* Intel-defined flags: level 0x00000001 */
-+              if ( c->cpuid_level >= 0x00000001 ) {
-+                      u32 capability, excap;
-+                      cpuid(0x00000001, &tfms, &ebx, &excap, &capability);
-+                      c->x86_capability[0] = capability;
-+                      c->x86_capability[4] = excap;
-+                      c->x86 = (tfms >> 8) & 15;
-+                      c->x86_model = (tfms >> 4) & 15;
-+                      if (c->x86 == 0xf)
-+                              c->x86 += (tfms >> 20) & 0xff;
-+                      if (c->x86 >= 0x6)
-+                              c->x86_model += ((tfms >> 16) & 0xF) << 4;
-+                      c->x86_mask = tfms & 15;
-+#ifdef CONFIG_X86_HT
-+                      c->apicid = phys_pkg_id((ebx >> 24) & 0xFF, 0);
-+#else
-+                      c->apicid = (ebx >> 24) & 0xFF;
-+#endif
-+              } else {
-+                      /* Have CPUID level 0 only - unheard of */
-+                      c->x86 = 4;
-+              }
-+
-+              /* AMD-defined flags: level 0x80000001 */
-+              xlvl = cpuid_eax(0x80000000);
-+              if ( (xlvl & 0xffff0000) == 0x80000000 ) {
-+                      if ( xlvl >= 0x80000001 ) {
-+                              c->x86_capability[1] = cpuid_edx(0x80000001);
-+                              c->x86_capability[6] = cpuid_ecx(0x80000001);
-+                      }
-+                      if ( xlvl >= 0x80000004 )
-+                              get_model_name(c); /* Default name */
-+              }
-+      }
-+
-+      early_intel_workaround(c);
-+
-+#ifdef CONFIG_X86_HT
-+      c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
-+#endif
-+}
-+
-+static void __cpuinit squash_the_stupid_serial_number(struct cpuinfo_x86 *c)
-+{
-+      if (cpu_has(c, X86_FEATURE_PN) && disable_x86_serial_nr ) {
-+              /* Disable processor serial number */
-+              unsigned long lo,hi;
-+              rdmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
-+              lo |= 0x200000;
-+              wrmsr(MSR_IA32_BBL_CR_CTL,lo,hi);
-+              printk(KERN_NOTICE "CPU serial number disabled.\n");
-+              clear_bit(X86_FEATURE_PN, c->x86_capability);
-+
-+              /* Disabling the serial number may affect the cpuid level */
-+              c->cpuid_level = cpuid_eax(0);
-+      }
-+}
-+
-+static int __init x86_serial_nr_setup(char *s)
-+{
-+      disable_x86_serial_nr = 0;
-+      return 1;
-+}
-+__setup("serialnumber", x86_serial_nr_setup);
-+
-+
-+
-+/*
-+ * This does the hard work of actually picking apart the CPU stuff...
-+ */
-+void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
-+{
-+      int i;
-+
-+      c->loops_per_jiffy = loops_per_jiffy;
-+      c->x86_cache_size = -1;
-+      c->x86_vendor = X86_VENDOR_UNKNOWN;
-+      c->cpuid_level = -1;    /* CPUID not detected */
-+      c->x86_model = c->x86_mask = 0; /* So far unknown... */
-+      c->x86_vendor_id[0] = '\0'; /* Unset */
-+      c->x86_model_id[0] = '\0';  /* Unset */
-+      c->x86_max_cores = 1;
-+      memset(&c->x86_capability, 0, sizeof c->x86_capability);
-+
-+      if (!have_cpuid_p()) {
-+              /* First of all, decide if this is a 486 or higher */
-+              /* It's a 486 if we can modify the AC flag */
-+              if ( flag_is_changeable_p(X86_EFLAGS_AC) )
-+                      c->x86 = 4;
-+              else
-+                      c->x86 = 3;
-+      }
-+
-+      generic_identify(c);
-+
-+      printk(KERN_DEBUG "CPU: After generic identify, caps:");
-+      for (i = 0; i < NCAPINTS; i++)
-+              printk(" %08lx", c->x86_capability[i]);
-+      printk("\n");
-+
-+      if (this_cpu->c_identify) {
-+              this_cpu->c_identify(c);
-+
-+              printk(KERN_DEBUG "CPU: After vendor identify, caps:");
-+              for (i = 0; i < NCAPINTS; i++)
-+                      printk(" %08lx", c->x86_capability[i]);
-+              printk("\n");
-+      }
-+
-+      /*
-+       * Vendor-specific initialization.  In this section we
-+       * canonicalize the feature flags, meaning if there are
-+       * features a certain CPU supports which CPUID doesn't
-+       * tell us, CPUID claiming incorrect flags, or other bugs,
-+       * we handle them here.
-+       *
-+       * At the end of this section, c->x86_capability better
-+       * indicate the features this CPU genuinely supports!
-+       */
-+      if (this_cpu->c_init)
-+              this_cpu->c_init(c);
-+
-+      /* Disable the PN if appropriate */
-+      squash_the_stupid_serial_number(c);
-+
-+      /*
-+       * The vendor-specific functions might have changed features.  Now
-+       * we do "generic changes."
-+       */
-+
-+      /* TSC disabled? */
-+      if ( tsc_disable )
-+              clear_bit(X86_FEATURE_TSC, c->x86_capability);
-+
-+      /* FXSR disabled? */
-+      if (disable_x86_fxsr) {
-+              clear_bit(X86_FEATURE_FXSR, c->x86_capability);
-+              clear_bit(X86_FEATURE_XMM, c->x86_capability);
-+      }
-+
-+      /* SEP disabled? */
-+      if (disable_x86_sep)
-+              clear_bit(X86_FEATURE_SEP, c->x86_capability);
-+
-+      if (disable_pse)
-+              clear_bit(X86_FEATURE_PSE, c->x86_capability);
-+
-+      /* If the model name is still unset, do table lookup. */
-+      if ( !c->x86_model_id[0] ) {
-+              char *p;
-+              p = table_lookup_model(c);
-+              if ( p )
-+                      strcpy(c->x86_model_id, p);
-+              else
-+                      /* Last resort... */
-+                      sprintf(c->x86_model_id, "%02x/%02x",
-+                              c->x86, c->x86_model);
-+      }
-+
-+      /* Now the feature flags better reflect actual CPU features! */
-+
-+      printk(KERN_DEBUG "CPU: After all inits, caps:");
-+      for (i = 0; i < NCAPINTS; i++)
-+              printk(" %08lx", c->x86_capability[i]);
-+      printk("\n");
-+
-+      /*
-+       * On SMP, boot_cpu_data holds the common feature set between
-+       * all CPUs; so make sure that we indicate which features are
-+       * common between the CPUs.  The first time this routine gets
-+       * executed, c == &boot_cpu_data.
-+       */
-+      if ( c != &boot_cpu_data ) {
-+              /* AND the already accumulated flags with these */
-+              for ( i = 0 ; i < NCAPINTS ; i++ )
-+                      boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
-+      }
-+
-+      /* Init Machine Check Exception if available. */
-+      mcheck_init(c);
-+
-+      if (c == &boot_cpu_data)
-+              sysenter_setup();
-+      enable_sep_cpu();
-+
-+      if (c == &boot_cpu_data)
-+              mtrr_bp_init();
-+      else
-+              mtrr_ap_init();
-+}
-+
-+#ifdef CONFIG_X86_HT
-+void __cpuinit detect_ht(struct cpuinfo_x86 *c)
-+{
-+      u32     eax, ebx, ecx, edx;
-+      int     index_msb, core_bits;
-+
-+      cpuid(1, &eax, &ebx, &ecx, &edx);
-+
-+      if (!cpu_has(c, X86_FEATURE_HT) || cpu_has(c, X86_FEATURE_CMP_LEGACY))
-+              return;
-+
-+      smp_num_siblings = (ebx & 0xff0000) >> 16;
-+
-+      if (smp_num_siblings == 1) {
-+              printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-+      } else if (smp_num_siblings > 1 ) {
-+
-+              if (smp_num_siblings > NR_CPUS) {
-+                      printk(KERN_WARNING "CPU: Unsupported number of the "
-+                                      "siblings %d", smp_num_siblings);
-+                      smp_num_siblings = 1;
-+                      return;
-+              }
-+
-+              index_msb = get_count_order(smp_num_siblings);
-+              c->phys_proc_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb);
-+
-+              printk(KERN_INFO  "CPU: Physical Processor ID: %d\n",
-+                     c->phys_proc_id);
-+
-+              smp_num_siblings = smp_num_siblings / c->x86_max_cores;
-+
-+              index_msb = get_count_order(smp_num_siblings) ;
-+
-+              core_bits = get_count_order(c->x86_max_cores);
-+
-+              c->cpu_core_id = phys_pkg_id((ebx >> 24) & 0xFF, index_msb) &
-+                                             ((1 << core_bits) - 1);
-+
-+              if (c->x86_max_cores > 1)
-+                      printk(KERN_INFO  "CPU: Processor Core ID: %d\n",
-+                             c->cpu_core_id);
-+      }
-+}
-+#endif
-+
-+void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
-+{
-+      char *vendor = NULL;
-+
-+      if (c->x86_vendor < X86_VENDOR_NUM)
-+              vendor = this_cpu->c_vendor;
-+      else if (c->cpuid_level >= 0)
-+              vendor = c->x86_vendor_id;
-+
-+      if (vendor && strncmp(c->x86_model_id, vendor, strlen(vendor)))
-+              printk("%s ", vendor);
-+
-+      if (!c->x86_model_id[0])
-+              printk("%d86", c->x86);
-+      else
-+              printk("%s", c->x86_model_id);
-+
-+      if (c->x86_mask || c->cpuid_level >= 0) 
-+              printk(" stepping %02x\n", c->x86_mask);
-+      else
-+              printk("\n");
-+}
-+
-+cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
-+
-+/* This is hacky. :)
-+ * We're emulating future behavior.
-+ * In the future, the cpu-specific init functions will be called implicitly
-+ * via the magic of initcalls.
-+ * They will insert themselves into the cpu_devs structure.
-+ * Then, when cpu_init() is called, we can just iterate over that array.
-+ */
-+
-+extern int intel_cpu_init(void);
-+extern int cyrix_init_cpu(void);
-+extern int nsc_init_cpu(void);
-+extern int amd_init_cpu(void);
-+extern int centaur_init_cpu(void);
-+extern int transmeta_init_cpu(void);
-+extern int rise_init_cpu(void);
-+extern int nexgen_init_cpu(void);
-+extern int umc_init_cpu(void);
-+
-+void __init early_cpu_init(void)
-+{
-+      intel_cpu_init();
-+      cyrix_init_cpu();
-+      nsc_init_cpu();
-+      amd_init_cpu();
-+      centaur_init_cpu();
-+      transmeta_init_cpu();
-+      rise_init_cpu();
-+      nexgen_init_cpu();
-+      umc_init_cpu();
-+      early_cpu_detect();
-+
-+#ifdef CONFIG_DEBUG_PAGEALLOC
-+      /* pse is not compatible with on-the-fly unmapping,
-+       * disable it even if the cpus claim to support it.
-+       */
-+      clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
-+      disable_pse = 1;
-+#endif
-+}
-+
-+static void __cpuinit cpu_gdt_init(const struct Xgt_desc_struct *gdt_descr)
-+{
-+      unsigned long frames[16];
-+      unsigned long va;
-+      int f;
-+
-+      for (va = gdt_descr->address, f = 0;
-+           va < gdt_descr->address + gdt_descr->size;
-+           va += PAGE_SIZE, f++) {
-+              frames[f] = virt_to_mfn(va);
-+              make_lowmem_page_readonly(
-+                      (void *)va, XENFEAT_writable_descriptor_tables);
-+      }
-+      if (HYPERVISOR_set_gdt(frames, (gdt_descr->size + 1) / 8))
-+              BUG();
-+}
-+
-+/*
-+ * cpu_init() initializes state that is per-CPU. Some data is already
-+ * initialized (naturally) in the bootstrap process, such as the GDT
-+ * and IDT. We reload them nevertheless, this function acts as a
-+ * 'CPU state barrier', nothing should get across.
-+ */
-+void __cpuinit cpu_init(void)
-+{
-+      int cpu = smp_processor_id();
-+#ifndef CONFIG_X86_NO_TSS
-+      struct tss_struct * t = &per_cpu(init_tss, cpu);
-+#endif
-+      struct thread_struct *thread = &current->thread;
-+      struct desc_struct *gdt;
-+      struct Xgt_desc_struct *cpu_gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-+
-+      if (cpu_test_and_set(cpu, cpu_initialized)) {
-+              printk(KERN_WARNING "CPU#%d already initialized!\n", cpu);
-+              for (;;) local_irq_enable();
-+      }
-+      printk(KERN_INFO "Initializing CPU#%d\n", cpu);
-+
-+      if (cpu_has_vme || cpu_has_de)
-+              clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
-+      if (tsc_disable && cpu_has_tsc) {
-+              printk(KERN_NOTICE "Disabling TSC...\n");
-+              /**** FIX-HPA: DOES THIS REALLY BELONG HERE? ****/
-+              clear_bit(X86_FEATURE_TSC, boot_cpu_data.x86_capability);
-+              set_in_cr4(X86_CR4_TSD);
-+      }
-+
-+#ifndef CONFIG_XEN
-+      /* The CPU hotplug case */
-+      if (cpu_gdt_descr->address) {
-+              gdt = (struct desc_struct *)cpu_gdt_descr->address;
-+              memset(gdt, 0, PAGE_SIZE);
-+              goto old_gdt;
-+      }
-+      /*
-+       * This is a horrible hack to allocate the GDT.  The problem
-+       * is that cpu_init() is called really early for the boot CPU
-+       * (and hence needs bootmem) but much later for the secondary
-+       * CPUs, when bootmem will have gone away
-+       */
-+      if (NODE_DATA(0)->bdata->node_bootmem_map) {
-+              gdt = (struct desc_struct *)alloc_bootmem_pages(PAGE_SIZE);
-+              /* alloc_bootmem_pages panics on failure, so no check */
-+              memset(gdt, 0, PAGE_SIZE);
-+      } else {
-+              gdt = (struct desc_struct *)get_zeroed_page(GFP_KERNEL);
-+              if (unlikely(!gdt)) {
-+                      printk(KERN_CRIT "CPU%d failed to allocate GDT\n", cpu);
-+                      for (;;)
-+                              local_irq_enable();
-+              }
-+      }
-+old_gdt:
-+      /*
-+       * Initialize the per-CPU GDT with the boot GDT,
-+       * and set up the GDT descriptor:
-+       */
-+      memcpy(gdt, cpu_gdt_table, GDT_SIZE);
-+
-+      /* Set up GDT entry for 16bit stack */
-+      *(__u64 *)(&gdt[GDT_ENTRY_ESPFIX_SS]) |=
-+              ((((__u64)stk16_off) << 16) & 0x000000ffffff0000ULL) |
-+              ((((__u64)stk16_off) << 32) & 0xff00000000000000ULL) |
-+              (CPU_16BIT_STACK_SIZE - 1);
-+
-+      cpu_gdt_descr->size = GDT_SIZE - 1;
-+      cpu_gdt_descr->address = (unsigned long)gdt;
-+#else
-+      if (cpu == 0 && cpu_gdt_descr->address == 0) {
-+              gdt = (struct desc_struct *)alloc_bootmem_pages(PAGE_SIZE);
-+              /* alloc_bootmem_pages panics on failure, so no check */
-+              memset(gdt, 0, PAGE_SIZE);
-+
-+              memcpy(gdt, cpu_gdt_table, GDT_SIZE);
-+              
-+              cpu_gdt_descr->size = GDT_SIZE;
-+              cpu_gdt_descr->address = (unsigned long)gdt;
-+      }
-+#endif
-+
-+      cpu_gdt_init(cpu_gdt_descr);
-+
-+      /*
-+       * Set up and load the per-CPU TSS and LDT
-+       */
-+      atomic_inc(&init_mm.mm_count);
-+      current->active_mm = &init_mm;
-+      if (current->mm)
-+              BUG();
-+      enter_lazy_tlb(&init_mm, current);
-+
-+      load_esp0(t, thread);
-+
-+      load_LDT(&init_mm.context);
-+
-+#ifdef CONFIG_DOUBLEFAULT
-+      /* Set up doublefault TSS pointer in the GDT */
-+      __set_tss_desc(cpu, GDT_ENTRY_DOUBLEFAULT_TSS, &doublefault_tss);
-+#endif
-+
-+      /* Clear %fs and %gs. */
-+      asm volatile ("xorl %eax, %eax; movl %eax, %fs; movl %eax, %gs");
-+
-+      /* Clear all 6 debug registers: */
-+      set_debugreg(0, 0);
-+      set_debugreg(0, 1);
-+      set_debugreg(0, 2);
-+      set_debugreg(0, 3);
-+      set_debugreg(0, 6);
-+      set_debugreg(0, 7);
-+
-+      /*
-+       * Force FPU initialization:
-+       */
-+      current_thread_info()->status = 0;
-+      clear_used_math();
-+      mxcsr_feature_mask_init();
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+void __cpuinit cpu_uninit(void)
-+{
-+      int cpu = raw_smp_processor_id();
-+      cpu_clear(cpu, cpu_initialized);
-+
-+      /* lazy TLB state */
-+      per_cpu(cpu_tlbstate, cpu).state = 0;
-+      per_cpu(cpu_tlbstate, cpu).active_mm = &init_mm;
-+}
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/cpu/mtrr/main-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/cpu/mtrr/main-xen.c        2008-01-28 12:24:18.000000000 +0100
-@@ -0,0 +1,198 @@
-+#include <linux/init.h>
-+#include <linux/proc_fs.h>
-+#include <linux/ctype.h>
-+#include <linux/module.h>
-+#include <linux/seq_file.h>
-+#include <asm/uaccess.h>
-+#include <linux/mutex.h>
-+
-+#include <asm/mtrr.h>
-+#include "mtrr.h"
-+
-+static DEFINE_MUTEX(mtrr_mutex);
-+
-+void generic_get_mtrr(unsigned int reg, unsigned long *base,
-+                    unsigned int *size, mtrr_type * type)
-+{
-+      struct xen_platform_op op;
-+
-+      op.cmd = XENPF_read_memtype;
-+      op.u.read_memtype.reg = reg;
-+      if (unlikely(HYPERVISOR_platform_op(&op)))
-+              memset(&op.u.read_memtype, 0, sizeof(op.u.read_memtype));
-+
-+      *size = op.u.read_memtype.nr_mfns;
-+      *base = op.u.read_memtype.mfn;
-+      *type = op.u.read_memtype.type;
-+}
-+
-+struct mtrr_ops generic_mtrr_ops = {
-+      .use_intel_if      = 1,
-+      .get               = generic_get_mtrr,
-+};
-+
-+struct mtrr_ops *mtrr_if = &generic_mtrr_ops;
-+unsigned int num_var_ranges;
-+unsigned int *usage_table;
-+
-+static void __init set_num_var_ranges(void)
-+{
-+      struct xen_platform_op op;
-+
-+      for (num_var_ranges = 0; ; num_var_ranges++) {
-+              op.cmd = XENPF_read_memtype;
-+              op.u.read_memtype.reg = num_var_ranges;
-+              if (HYPERVISOR_platform_op(&op) != 0)
-+                      break;
-+      }
-+}
-+
-+static void __init init_table(void)
-+{
-+      int i, max;
-+
-+      max = num_var_ranges;
-+      if ((usage_table = kmalloc(max * sizeof *usage_table, GFP_KERNEL))
-+          == NULL) {
-+              printk(KERN_ERR "mtrr: could not allocate\n");
-+              return;
-+      }
-+      for (i = 0; i < max; i++)
-+              usage_table[i] = 0;
-+}
-+
-+int mtrr_add_page(unsigned long base, unsigned long size, 
-+                unsigned int type, char increment)
-+{
-+      int error;
-+      struct xen_platform_op op;
-+
-+      mutex_lock(&mtrr_mutex);
-+
-+      op.cmd = XENPF_add_memtype;
-+      op.u.add_memtype.mfn     = base;
-+      op.u.add_memtype.nr_mfns = size;
-+      op.u.add_memtype.type    = type;
-+      error = HYPERVISOR_platform_op(&op);
-+      if (error) {
-+              mutex_unlock(&mtrr_mutex);
-+              BUG_ON(error > 0);
-+              return error;
-+      }
-+
-+      if (increment)
-+              ++usage_table[op.u.add_memtype.reg];
-+
-+      mutex_unlock(&mtrr_mutex);
-+
-+      return op.u.add_memtype.reg;
-+}
-+
-+static int mtrr_check(unsigned long base, unsigned long size)
-+{
-+      if ((base & (PAGE_SIZE - 1)) || (size & (PAGE_SIZE - 1))) {
-+              printk(KERN_WARNING
-+                      "mtrr: size and base must be multiples of 4 kiB\n");
-+              printk(KERN_DEBUG
-+                      "mtrr: size: 0x%lx  base: 0x%lx\n", size, base);
-+              dump_stack();
-+              return -1;
-+      }
-+      return 0;
-+}
-+
-+int
-+mtrr_add(unsigned long base, unsigned long size, unsigned int type,
-+       char increment)
-+{
-+      if (mtrr_check(base, size))
-+              return -EINVAL;
-+      return mtrr_add_page(base >> PAGE_SHIFT, size >> PAGE_SHIFT, type,
-+                           increment);
-+}
-+
-+int mtrr_del_page(int reg, unsigned long base, unsigned long size)
-+{
-+      unsigned i;
-+      mtrr_type ltype;
-+      unsigned long lbase;
-+      unsigned int lsize;
-+      int error = -EINVAL;
-+      struct xen_platform_op op;
-+
-+      mutex_lock(&mtrr_mutex);
-+
-+      if (reg < 0) {
-+              /*  Search for existing MTRR  */
-+              for (i = 0; i < num_var_ranges; ++i) {
-+                      mtrr_if->get(i, &lbase, &lsize, &ltype);
-+                      if (lbase == base && lsize == size) {
-+                              reg = i;
-+                              break;
-+                      }
-+              }
-+              if (reg < 0) {
-+                      printk(KERN_DEBUG "mtrr: no MTRR for %lx000,%lx000 found\n", base,
-+                             size);
-+                      goto out;
-+              }
-+      }
-+      if (usage_table[reg] < 1) {
-+              printk(KERN_WARNING "mtrr: reg: %d has count=0\n", reg);
-+              goto out;
-+      }
-+      if (--usage_table[reg] < 1) {
-+              op.cmd = XENPF_del_memtype;
-+              op.u.del_memtype.handle = 0;
-+              op.u.del_memtype.reg    = reg;
-+              error = HYPERVISOR_platform_op(&op);
-+              if (error) {
-+                      BUG_ON(error > 0);
-+                      goto out;
-+              }
-+      }
-+      error = reg;
-+ out:
-+      mutex_unlock(&mtrr_mutex);
-+      return error;
-+}
-+
-+int
-+mtrr_del(int reg, unsigned long base, unsigned long size)
-+{
-+      if (mtrr_check(base, size))
-+              return -EINVAL;
-+      return mtrr_del_page(reg, base >> PAGE_SHIFT, size >> PAGE_SHIFT);
-+}
-+
-+EXPORT_SYMBOL(mtrr_add);
-+EXPORT_SYMBOL(mtrr_del);
-+
-+void __init mtrr_bp_init(void)
-+{
-+}
-+
-+void mtrr_ap_init(void)
-+{
-+}
-+
-+static int __init mtrr_init(void)
-+{
-+      struct cpuinfo_x86 *c = &boot_cpu_data;
-+
-+      if (!is_initial_xendomain())
-+              return -ENODEV;
-+
-+      if ((!cpu_has(c, X86_FEATURE_MTRR)) &&
-+          (!cpu_has(c, X86_FEATURE_K6_MTRR)) &&
-+          (!cpu_has(c, X86_FEATURE_CYRIX_ARR)) &&
-+          (!cpu_has(c, X86_FEATURE_CENTAUR_MCR)))
-+              return -ENODEV;
-+
-+      set_num_var_ranges();
-+      init_table();
-+
-+      return 0;
-+}
-+
-+subsys_initcall(mtrr_init);
-Index: head-2008-11-25/arch/x86/kernel/entry_32-xen.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/entry_32-xen.S     2007-12-10 08:47:31.000000000 +0100
-@@ -0,0 +1,1238 @@
-+/*
-+ *  linux/arch/i386/entry.S
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ */
-+
-+/*
-+ * entry.S contains the system-call and fault low-level handling routines.
-+ * This also contains the timer-interrupt handler, as well as all interrupts
-+ * and faults that can result in a task-switch.
-+ *
-+ * NOTE: This code handles signal-recognition, which happens every time
-+ * after a timer-interrupt and after each system call.
-+ *
-+ * I changed all the .align's to 4 (16 byte alignment), as that's faster
-+ * on a 486.
-+ *
-+ * Stack layout in 'ret_from_system_call':
-+ *    ptrace needs to have all regs on the stack.
-+ *    if the order here is changed, it needs to be
-+ *    updated in fork.c:copy_process, signal.c:do_signal,
-+ *    ptrace.c and ptrace.h
-+ *
-+ *     0(%esp) - %ebx
-+ *     4(%esp) - %ecx
-+ *     8(%esp) - %edx
-+ *       C(%esp) - %esi
-+ *    10(%esp) - %edi
-+ *    14(%esp) - %ebp
-+ *    18(%esp) - %eax
-+ *    1C(%esp) - %ds
-+ *    20(%esp) - %es
-+ *    24(%esp) - orig_eax
-+ *    28(%esp) - %eip
-+ *    2C(%esp) - %cs
-+ *    30(%esp) - %eflags
-+ *    34(%esp) - %oldesp
-+ *    38(%esp) - %oldss
-+ *
-+ * "current" is in register %ebx during any slow entries.
-+ */
-+
-+#include <linux/linkage.h>
-+#include <asm/thread_info.h>
-+#include <asm/irqflags.h>
-+#include <asm/errno.h>
-+#include <asm/segment.h>
-+#include <asm/smp.h>
-+#include <asm/page.h>
-+#include <asm/desc.h>
-+#include <asm/dwarf2.h>
-+#include "irq_vectors.h"
-+#include <xen/interface/xen.h>
-+
-+#define nr_syscalls ((syscall_table_size)/4)
-+
-+EBX           = 0x00
-+ECX           = 0x04
-+EDX           = 0x08
-+ESI           = 0x0C
-+EDI           = 0x10
-+EBP           = 0x14
-+EAX           = 0x18
-+DS            = 0x1C
-+ES            = 0x20
-+ORIG_EAX      = 0x24
-+EIP           = 0x28
-+CS            = 0x2C
-+EFLAGS                = 0x30
-+OLDESP                = 0x34
-+OLDSS         = 0x38
-+
-+CF_MASK               = 0x00000001
-+TF_MASK               = 0x00000100
-+IF_MASK               = 0x00000200
-+DF_MASK               = 0x00000400 
-+NT_MASK               = 0x00004000
-+VM_MASK               = 0x00020000
-+/* Pseudo-eflags. */
-+NMI_MASK      = 0x80000000
-+
-+#ifndef CONFIG_XEN
-+#define DISABLE_INTERRUPTS    cli
-+#define ENABLE_INTERRUPTS     sti
-+#else
-+/* Offsets into shared_info_t. */
-+#define evtchn_upcall_pending         /* 0 */
-+#define evtchn_upcall_mask            1
-+
-+#define sizeof_vcpu_shift             6
-+
-+#ifdef CONFIG_SMP
-+#define GET_VCPU_INFO         movl TI_cpu(%ebp),%esi                  ; \
-+                              shl  $sizeof_vcpu_shift,%esi            ; \
-+                              addl HYPERVISOR_shared_info,%esi
-+#else
-+#define GET_VCPU_INFO         movl HYPERVISOR_shared_info,%esi
-+#endif
-+
-+#define __DISABLE_INTERRUPTS  movb $1,evtchn_upcall_mask(%esi)
-+#define __ENABLE_INTERRUPTS   movb $0,evtchn_upcall_mask(%esi)
-+#define DISABLE_INTERRUPTS    GET_VCPU_INFO                           ; \
-+                              __DISABLE_INTERRUPTS
-+#define ENABLE_INTERRUPTS     GET_VCPU_INFO                           ; \
-+                              __ENABLE_INTERRUPTS
-+#define __TEST_PENDING                testb $0xFF,evtchn_upcall_pending(%esi)
-+#endif
-+
-+#ifdef CONFIG_PREEMPT
-+#define preempt_stop          cli; TRACE_IRQS_OFF
-+#else
-+#define preempt_stop
-+#define resume_kernel         restore_nocheck
-+#endif
-+
-+.macro TRACE_IRQS_IRET
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+      testl $IF_MASK,EFLAGS(%esp)     # interrupts off?
-+      jz 1f
-+      TRACE_IRQS_ON
-+1:
-+#endif
-+.endm
-+
-+#ifdef CONFIG_VM86
-+#define resume_userspace_sig  check_userspace
-+#else
-+#define resume_userspace_sig  resume_userspace
-+#endif
-+
-+#define SAVE_ALL \
-+      cld; \
-+      pushl %es; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      /*CFI_REL_OFFSET es, 0;*/\
-+      pushl %ds; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      /*CFI_REL_OFFSET ds, 0;*/\
-+      pushl %eax; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET eax, 0;\
-+      pushl %ebp; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET ebp, 0;\
-+      pushl %edi; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET edi, 0;\
-+      pushl %esi; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET esi, 0;\
-+      pushl %edx; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET edx, 0;\
-+      pushl %ecx; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET ecx, 0;\
-+      pushl %ebx; \
-+      CFI_ADJUST_CFA_OFFSET 4;\
-+      CFI_REL_OFFSET ebx, 0;\
-+      movl $(__USER_DS), %edx; \
-+      movl %edx, %ds; \
-+      movl %edx, %es;
-+
-+#define RESTORE_INT_REGS \
-+      popl %ebx;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE ebx;\
-+      popl %ecx;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE ecx;\
-+      popl %edx;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE edx;\
-+      popl %esi;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE esi;\
-+      popl %edi;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE edi;\
-+      popl %ebp;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE ebp;\
-+      popl %eax;      \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      CFI_RESTORE eax
-+
-+#define RESTORE_REGS  \
-+      RESTORE_INT_REGS; \
-+1:    popl %ds;       \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      /*CFI_RESTORE ds;*/\
-+2:    popl %es;       \
-+      CFI_ADJUST_CFA_OFFSET -4;\
-+      /*CFI_RESTORE es;*/\
-+.section .fixup,"ax"; \
-+3:    movl $0,(%esp); \
-+      jmp 1b;         \
-+4:    movl $0,(%esp); \
-+      jmp 2b;         \
-+.previous;            \
-+.section __ex_table,"a";\
-+      .align 4;       \
-+      .long 1b,3b;    \
-+      .long 2b,4b;    \
-+.previous
-+
-+#define RING0_INT_FRAME \
-+      CFI_STARTPROC simple;\
-+      CFI_DEF_CFA esp, 3*4;\
-+      /*CFI_OFFSET cs, -2*4;*/\
-+      CFI_OFFSET eip, -3*4
-+
-+#define RING0_EC_FRAME \
-+      CFI_STARTPROC simple;\
-+      CFI_DEF_CFA esp, 4*4;\
-+      /*CFI_OFFSET cs, -2*4;*/\
-+      CFI_OFFSET eip, -3*4
-+
-+#define RING0_PTREGS_FRAME \
-+      CFI_STARTPROC simple;\
-+      CFI_DEF_CFA esp, OLDESP-EBX;\
-+      /*CFI_OFFSET cs, CS-OLDESP;*/\
-+      CFI_OFFSET eip, EIP-OLDESP;\
-+      /*CFI_OFFSET es, ES-OLDESP;*/\
-+      /*CFI_OFFSET ds, DS-OLDESP;*/\
-+      CFI_OFFSET eax, EAX-OLDESP;\
-+      CFI_OFFSET ebp, EBP-OLDESP;\
-+      CFI_OFFSET edi, EDI-OLDESP;\
-+      CFI_OFFSET esi, ESI-OLDESP;\
-+      CFI_OFFSET edx, EDX-OLDESP;\
-+      CFI_OFFSET ecx, ECX-OLDESP;\
-+      CFI_OFFSET ebx, EBX-OLDESP
-+
-+ENTRY(ret_from_fork)
-+      CFI_STARTPROC
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      call schedule_tail
-+      GET_THREAD_INFO(%ebp)
-+      popl %eax
-+      CFI_ADJUST_CFA_OFFSET -4
-+      pushl $0x0202                   # Reset kernel eflags
-+      CFI_ADJUST_CFA_OFFSET 4
-+      popfl
-+      CFI_ADJUST_CFA_OFFSET -4
-+      jmp syscall_exit
-+      CFI_ENDPROC
-+
-+/*
-+ * Return to user mode is not as complex as all this looks,
-+ * but we want the default path for a system call return to
-+ * go as quickly as possible which is why some of this is
-+ * less clear than it otherwise should be.
-+ */
-+
-+      # userspace resumption stub bypassing syscall exit tracing
-+      ALIGN
-+      RING0_PTREGS_FRAME
-+ret_from_exception:
-+      preempt_stop
-+ret_from_intr:
-+      GET_THREAD_INFO(%ebp)
-+check_userspace:
-+      movl EFLAGS(%esp), %eax         # mix EFLAGS and CS
-+      movb CS(%esp), %al
-+      testl $(VM_MASK | 2), %eax
-+      jz resume_kernel
-+ENTRY(resume_userspace)
-+      DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-+                                      # setting need_resched or sigpending
-+                                      # between sampling and the iret
-+      movl TI_flags(%ebp), %ecx
-+      andl $_TIF_WORK_MASK, %ecx      # is there any work to be done on
-+                                      # int/exception return?
-+      jne work_pending
-+      jmp restore_all
-+
-+#ifdef CONFIG_PREEMPT
-+ENTRY(resume_kernel)
-+      cli
-+      cmpl $0,TI_preempt_count(%ebp)  # non-zero preempt_count ?
-+      jnz restore_nocheck
-+need_resched:
-+      movl TI_flags(%ebp), %ecx       # need_resched set ?
-+      testb $_TIF_NEED_RESCHED, %cl
-+      jz restore_all
-+      testl $IF_MASK,EFLAGS(%esp)     # interrupts off (exception path) ?
-+      jz restore_all
-+      call preempt_schedule_irq
-+      jmp need_resched
-+#endif
-+      CFI_ENDPROC
-+
-+/* SYSENTER_RETURN points to after the "sysenter" instruction in
-+   the vsyscall page.  See vsyscall-sysentry.S, which defines the symbol.  */
-+
-+      # sysenter call handler stub
-+ENTRY(sysenter_entry)
-+      CFI_STARTPROC simple
-+      CFI_DEF_CFA esp, 0
-+      CFI_REGISTER esp, ebp
-+      movl SYSENTER_stack_esp0(%esp),%esp
-+sysenter_past_esp:
-+      /*
-+       * No need to follow this irqs on/off section: the syscall
-+       * disabled irqs and here we enable it straight after entry:
-+       */
-+      sti
-+      pushl $(__USER_DS)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      /*CFI_REL_OFFSET ss, 0*/
-+      pushl %ebp
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET esp, 0
-+      pushfl
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $(__USER_CS)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      /*CFI_REL_OFFSET cs, 0*/
-+      /*
-+       * Push current_thread_info()->sysenter_return to the stack.
-+       * A tiny bit of offset fixup is necessary - 4*4 means the 4 words
-+       * pushed above; +8 corresponds to copy_thread's esp0 setting.
-+       */
-+      pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET eip, 0
-+
-+/*
-+ * Load the potential sixth argument from user stack.
-+ * Careful about security.
-+ */
-+      cmpl $__PAGE_OFFSET-3,%ebp
-+      jae syscall_fault
-+1:    movl (%ebp),%ebp
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,syscall_fault
-+.previous
-+
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      GET_THREAD_INFO(%ebp)
-+
-+      /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
-+      testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
-+      jnz syscall_trace_entry
-+      cmpl $(nr_syscalls), %eax
-+      jae syscall_badsys
-+      call *sys_call_table(,%eax,4)
-+      movl %eax,EAX(%esp)
-+      DISABLE_INTERRUPTS
-+      TRACE_IRQS_OFF
-+      movl TI_flags(%ebp), %ecx
-+      testw $_TIF_ALLWORK_MASK, %cx
-+      jne syscall_exit_work
-+/* if something modifies registers it must also disable sysexit */
-+      movl EIP(%esp), %edx
-+      movl OLDESP(%esp), %ecx
-+      xorl %ebp,%ebp
-+#ifdef CONFIG_XEN
-+      TRACE_IRQS_ON
-+      __ENABLE_INTERRUPTS
-+sysexit_scrit:        /**** START OF SYSEXIT CRITICAL REGION ****/
-+      __TEST_PENDING
-+      jnz  14f                        # process more events if necessary...
-+      movl ESI(%esp), %esi
-+      sysexit
-+14:   __DISABLE_INTERRUPTS
-+      TRACE_IRQS_OFF
-+sysexit_ecrit:        /**** END OF SYSEXIT CRITICAL REGION ****/
-+      push %esp
-+      call evtchn_do_upcall
-+      add  $4,%esp
-+      jmp  ret_from_intr
-+#else
-+      TRACE_IRQS_ON
-+      sti
-+      sysexit
-+#endif /* !CONFIG_XEN */
-+      CFI_ENDPROC
-+
-+      # pv sysenter call handler stub
-+ENTRY(sysenter_entry_pv)
-+      RING0_INT_FRAME
-+      movl $__USER_DS,16(%esp)
-+      movl %ebp,12(%esp)
-+      movl $__USER_CS,4(%esp)
-+      addl $4,%esp
-+      /* +5*4 is SS:ESP,EFLAGS,CS:EIP. +8 is esp0 setting. */
-+      pushl (TI_sysenter_return-THREAD_SIZE+8+4*4)(%esp)
-+/*
-+ * Load the potential sixth argument from user stack.
-+ * Careful about security.
-+ */
-+      cmpl $__PAGE_OFFSET-3,%ebp
-+      jae syscall_fault
-+1:    movl (%ebp),%ebp
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,syscall_fault
-+.previous
-+      /* fall through */
-+      CFI_ENDPROC
-+ENDPROC(sysenter_entry_pv)
-+
-+      # system call handler stub
-+ENTRY(system_call)
-+      RING0_INT_FRAME                 # can't unwind into user space anyway
-+      pushl %eax                      # save orig_eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      GET_THREAD_INFO(%ebp)
-+      testl $TF_MASK,EFLAGS(%esp)
-+      jz no_singlestep
-+      orl $_TIF_SINGLESTEP,TI_flags(%ebp)
-+no_singlestep:
-+                                      # system call tracing in operation / emulation
-+      /* Note, _TIF_SECCOMP is bit number 8, and so it needs testw and not testb */
-+      testw $(_TIF_SYSCALL_EMU|_TIF_SYSCALL_TRACE|_TIF_SECCOMP|_TIF_SYSCALL_AUDIT),TI_flags(%ebp)
-+      jnz syscall_trace_entry
-+      cmpl $(nr_syscalls), %eax
-+      jae syscall_badsys
-+syscall_call:
-+      call *sys_call_table(,%eax,4)
-+      movl %eax,EAX(%esp)             # store the return value
-+syscall_exit:
-+      DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-+                                      # setting need_resched or sigpending
-+                                      # between sampling and the iret
-+      TRACE_IRQS_OFF
-+      movl TI_flags(%ebp), %ecx
-+      testw $_TIF_ALLWORK_MASK, %cx   # current->work
-+      jne syscall_exit_work
-+
-+restore_all:
-+#ifndef CONFIG_XEN
-+      movl EFLAGS(%esp), %eax         # mix EFLAGS, SS and CS
-+      # Warning: OLDSS(%esp) contains the wrong/random values if we
-+      # are returning to the kernel.
-+      # See comments in process.c:copy_thread() for details.
-+      movb OLDSS(%esp), %ah
-+      movb CS(%esp), %al
-+      andl $(VM_MASK | (4 << 8) | 3), %eax
-+      cmpl $((4 << 8) | 3), %eax
-+      CFI_REMEMBER_STATE
-+      je ldt_ss                       # returning to user-space with LDT SS
-+restore_nocheck:
-+#else
-+restore_nocheck:
-+      movl EFLAGS(%esp), %eax
-+      testl $(VM_MASK|NMI_MASK), %eax
-+      CFI_REMEMBER_STATE
-+      jnz hypervisor_iret
-+      shr $9, %eax                    # EAX[0] == IRET_EFLAGS.IF
-+      GET_VCPU_INFO
-+      andb evtchn_upcall_mask(%esi),%al
-+      andb $1,%al                     # EAX[0] == IRET_EFLAGS.IF & event_mask
-+      CFI_REMEMBER_STATE
-+      jnz restore_all_enable_events   #        != 0 => enable event delivery
-+#endif
-+      TRACE_IRQS_IRET
-+restore_nocheck_notrace:
-+      RESTORE_REGS
-+      addl $4, %esp
-+      CFI_ADJUST_CFA_OFFSET -4
-+1:    iret
-+.section .fixup,"ax"
-+iret_exc:
-+#ifndef CONFIG_XEN
-+      TRACE_IRQS_ON
-+      sti
-+#endif
-+      pushl $0                        # no error code
-+      pushl $do_iret_error
-+      jmp error_code
-+.previous
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,iret_exc
-+.previous
-+
-+      CFI_RESTORE_STATE
-+#ifndef CONFIG_XEN
-+ldt_ss:
-+      larl OLDSS(%esp), %eax
-+      jnz restore_nocheck
-+      testl $0x00400000, %eax         # returning to 32bit stack?
-+      jnz restore_nocheck             # allright, normal return
-+      /* If returning to userspace with 16bit stack,
-+       * try to fix the higher word of ESP, as the CPU
-+       * won't restore it.
-+       * This is an "official" bug of all the x86-compatible
-+       * CPUs, which we can try to work around to make
-+       * dosemu and wine happy. */
-+      subl $8, %esp           # reserve space for switch16 pointer
-+      CFI_ADJUST_CFA_OFFSET 8
-+      cli
-+      TRACE_IRQS_OFF
-+      movl %esp, %eax
-+      /* Set up the 16bit stack frame with switch32 pointer on top,
-+       * and a switch16 pointer on top of the current frame. */
-+      call setup_x86_bogus_stack
-+      CFI_ADJUST_CFA_OFFSET -8        # frame has moved
-+      TRACE_IRQS_IRET
-+      RESTORE_REGS
-+      lss 20+4(%esp), %esp    # switch to 16bit stack
-+1:    iret
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,iret_exc
-+.previous
-+#else
-+        ALIGN
-+restore_all_enable_events:
-+      TRACE_IRQS_ON
-+      __ENABLE_INTERRUPTS
-+scrit:        /**** START OF CRITICAL REGION ****/
-+      __TEST_PENDING
-+      jnz  14f                        # process more events if necessary...
-+      RESTORE_REGS
-+      addl $4, %esp
-+      CFI_ADJUST_CFA_OFFSET -4
-+1:    iret
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,iret_exc
-+.previous
-+14:   __DISABLE_INTERRUPTS
-+      TRACE_IRQS_OFF
-+      jmp  11f
-+ecrit:  /**** END OF CRITICAL REGION ****/
-+
-+      CFI_RESTORE_STATE
-+hypervisor_iret:
-+      andl $~NMI_MASK, EFLAGS(%esp)
-+      RESTORE_REGS
-+      addl $4, %esp
-+      CFI_ADJUST_CFA_OFFSET -4
-+      jmp  hypercall_page + (__HYPERVISOR_iret * 32)
-+#endif
-+      CFI_ENDPROC
-+
-+      # perform work that needs to be done immediately before resumption
-+      ALIGN
-+      RING0_PTREGS_FRAME              # can't unwind into user space anyway
-+work_pending:
-+      testb $_TIF_NEED_RESCHED, %cl
-+      jz work_notifysig
-+work_resched:
-+      call schedule
-+      DISABLE_INTERRUPTS              # make sure we don't miss an interrupt
-+                                      # setting need_resched or sigpending
-+                                      # between sampling and the iret
-+      TRACE_IRQS_OFF
-+      movl TI_flags(%ebp), %ecx
-+      andl $_TIF_WORK_MASK, %ecx      # is there any work to be done other
-+                                      # than syscall tracing?
-+      jz restore_all
-+      testb $_TIF_NEED_RESCHED, %cl
-+      jnz work_resched
-+
-+work_notifysig:                               # deal with pending signals and
-+                                      # notify-resume requests
-+      testl $VM_MASK, EFLAGS(%esp)
-+      movl %esp, %eax
-+      jne work_notifysig_v86          # returning to kernel-space or
-+                                      # vm86-space
-+      xorl %edx, %edx
-+      call do_notify_resume
-+      jmp resume_userspace_sig
-+
-+      ALIGN
-+work_notifysig_v86:
-+#ifdef CONFIG_VM86
-+      pushl %ecx                      # save ti_flags for do_notify_resume
-+      CFI_ADJUST_CFA_OFFSET 4
-+      call save_v86_state             # %eax contains pt_regs pointer
-+      popl %ecx
-+      CFI_ADJUST_CFA_OFFSET -4
-+      movl %eax, %esp
-+      xorl %edx, %edx
-+      call do_notify_resume
-+      jmp resume_userspace_sig
-+#endif
-+
-+      # perform syscall exit tracing
-+      ALIGN
-+syscall_trace_entry:
-+      movl $-ENOSYS,EAX(%esp)
-+      movl %esp, %eax
-+      xorl %edx,%edx
-+      call do_syscall_trace
-+      cmpl $0, %eax
-+      jne resume_userspace            # ret != 0 -> running under PTRACE_SYSEMU,
-+                                      # so must skip actual syscall
-+      movl ORIG_EAX(%esp), %eax
-+      cmpl $(nr_syscalls), %eax
-+      jnae syscall_call
-+      jmp syscall_exit
-+
-+      # perform syscall exit tracing
-+      ALIGN
-+syscall_exit_work:
-+      testb $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP), %cl
-+      jz work_pending
-+      TRACE_IRQS_ON
-+      ENABLE_INTERRUPTS               # could let do_syscall_trace() call
-+                                      # schedule() instead
-+      movl %esp, %eax
-+      movl $1, %edx
-+      call do_syscall_trace
-+      jmp resume_userspace
-+      CFI_ENDPROC
-+
-+      RING0_INT_FRAME                 # can't unwind into user space anyway
-+syscall_fault:
-+      pushl %eax                      # save orig_eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      GET_THREAD_INFO(%ebp)
-+      movl $-EFAULT,EAX(%esp)
-+      jmp resume_userspace
-+
-+syscall_badsys:
-+      movl $-ENOSYS,EAX(%esp)
-+      jmp resume_userspace
-+      CFI_ENDPROC
-+
-+#ifndef CONFIG_XEN
-+#define FIXUP_ESPFIX_STACK \
-+      movl %esp, %eax; \
-+      /* switch to 32bit stack using the pointer on top of 16bit stack */ \
-+      lss %ss:CPU_16BIT_STACK_SIZE-8, %esp; \
-+      /* copy data from 16bit stack to 32bit stack */ \
-+      call fixup_x86_bogus_stack; \
-+      /* put ESP to the proper location */ \
-+      movl %eax, %esp;
-+#define UNWIND_ESPFIX_STACK \
-+      pushl %eax; \
-+      CFI_ADJUST_CFA_OFFSET 4; \
-+      movl %ss, %eax; \
-+      /* see if on 16bit stack */ \
-+      cmpw $__ESPFIX_SS, %ax; \
-+      je 28f; \
-+27:   popl %eax; \
-+      CFI_ADJUST_CFA_OFFSET -4; \
-+.section .fixup,"ax"; \
-+28:   movl $__KERNEL_DS, %eax; \
-+      movl %eax, %ds; \
-+      movl %eax, %es; \
-+      /* switch to 32bit stack */ \
-+      FIXUP_ESPFIX_STACK; \
-+      jmp 27b; \
-+.previous
-+
-+/*
-+ * Build the entry stubs and pointer table with
-+ * some assembler magic.
-+ */
-+.data
-+ENTRY(interrupt)
-+.text
-+
-+vector=0
-+ENTRY(irq_entries_start)
-+      RING0_INT_FRAME
-+.rept NR_IRQS
-+      ALIGN
-+ .if vector
-+      CFI_ADJUST_CFA_OFFSET -4
-+ .endif
-+1:    pushl $~(vector)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp common_interrupt
-+.data
-+      .long 1b
-+.text
-+vector=vector+1
-+.endr
-+
-+/*
-+ * the CPU automatically disables interrupts when executing an IRQ vector,
-+ * so IRQ-flags tracing has to follow that:
-+ */
-+      ALIGN
-+common_interrupt:
-+      SAVE_ALL
-+      TRACE_IRQS_OFF
-+      movl %esp,%eax
-+      call do_IRQ
-+      jmp ret_from_intr
-+      CFI_ENDPROC
-+
-+#define BUILD_INTERRUPT(name, nr)     \
-+ENTRY(name)                           \
-+      RING0_INT_FRAME;                \
-+      pushl $~(nr);                   \
-+      CFI_ADJUST_CFA_OFFSET 4;        \
-+      SAVE_ALL;                       \
-+      TRACE_IRQS_OFF                  \
-+      movl %esp,%eax;                 \
-+      call smp_/**/name;              \
-+      jmp ret_from_intr;              \
-+      CFI_ENDPROC
-+
-+/* The include is where all of the SMP etc. interrupts come from */
-+#include "entry_arch.h"
-+#else
-+#define UNWIND_ESPFIX_STACK
-+#endif
-+
-+ENTRY(divide_error)
-+      RING0_INT_FRAME
-+      pushl $0                        # no error code
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_divide_error
-+      CFI_ADJUST_CFA_OFFSET 4
-+      ALIGN
-+error_code:
-+      pushl %ds
-+      CFI_ADJUST_CFA_OFFSET 4
-+      /*CFI_REL_OFFSET ds, 0*/
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET eax, 0
-+      xorl %eax, %eax
-+      pushl %ebp
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET ebp, 0
-+      pushl %edi
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET edi, 0
-+      pushl %esi
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET esi, 0
-+      pushl %edx
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET edx, 0
-+      decl %eax                       # eax = -1
-+      pushl %ecx
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET ecx, 0
-+      pushl %ebx
-+      CFI_ADJUST_CFA_OFFSET 4
-+      CFI_REL_OFFSET ebx, 0
-+      cld
-+      pushl %es
-+      CFI_ADJUST_CFA_OFFSET 4
-+      /*CFI_REL_OFFSET es, 0*/
-+      UNWIND_ESPFIX_STACK
-+      popl %ecx
-+      CFI_ADJUST_CFA_OFFSET -4
-+      /*CFI_REGISTER es, ecx*/
-+      movl ES(%esp), %edi             # get the function address
-+      movl ORIG_EAX(%esp), %edx       # get the error code
-+      movl %eax, ORIG_EAX(%esp)
-+      movl %ecx, ES(%esp)
-+      /*CFI_REL_OFFSET es, ES*/
-+      movl $(__USER_DS), %ecx
-+      movl %ecx, %ds
-+      movl %ecx, %es
-+      movl %esp,%eax                  # pt_regs pointer
-+      call *%edi
-+      jmp ret_from_exception
-+      CFI_ENDPROC
-+
-+#ifdef CONFIG_XEN
-+# A note on the "critical region" in our callback handler.
-+# We want to avoid stacking callback handlers due to events occurring
-+# during handling of the last event. To do this, we keep events disabled
-+# until we've done all processing. HOWEVER, we must enable events before
-+# popping the stack frame (can't be done atomically) and so it would still
-+# be possible to get enough handler activations to overflow the stack.
-+# Although unlikely, bugs of that kind are hard to track down, so we'd
-+# like to avoid the possibility.
-+# So, on entry to the handler we detect whether we interrupted an
-+# existing activation in its critical region -- if so, we pop the current
-+# activation and restart the handler using the previous one.
-+#
-+# The sysexit critical region is slightly different. sysexit
-+# atomically removes the entire stack frame. If we interrupt in the
-+# critical region we know that the entire frame is present and correct
-+# so we can simply throw away the new one.
-+ENTRY(hypervisor_callback)
-+      RING0_INT_FRAME
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      movl EIP(%esp),%eax
-+      cmpl $scrit,%eax
-+      jb   11f
-+      cmpl $ecrit,%eax
-+      jb   critical_region_fixup
-+      cmpl $sysexit_scrit,%eax
-+      jb   11f
-+      cmpl $sysexit_ecrit,%eax
-+      ja   11f
-+      addl $OLDESP,%esp               # Remove eflags...ebx from stack frame.
-+11:   push %esp
-+      CFI_ADJUST_CFA_OFFSET 4
-+      call evtchn_do_upcall
-+      add  $4,%esp
-+      CFI_ADJUST_CFA_OFFSET -4
-+      jmp  ret_from_intr
-+      CFI_ENDPROC
-+
-+# [How we do the fixup]. We want to merge the current stack frame with the
-+# just-interrupted frame. How we do this depends on where in the critical
-+# region the interrupted handler was executing, and so how many saved
-+# registers are in each frame. We do this quickly using the lookup table
-+# 'critical_fixup_table'. For each byte offset in the critical region, it
-+# provides the number of bytes which have already been popped from the
-+# interrupted stack frame.
-+critical_region_fixup:
-+      movzbl critical_fixup_table-scrit(%eax),%ecx # %eax contains num bytes popped
-+      cmpb $0xff,%cl                  # 0xff => vcpu_info critical region
-+      jne  15f
-+      xorl %ecx,%ecx
-+15:   leal (%esp,%ecx),%esi           # %esi points at end of src region
-+      leal OLDESP(%esp),%edi          # %edi points at end of dst region
-+      shrl $2,%ecx                    # convert words to bytes
-+      je   17f                        # skip loop if nothing to copy
-+16:   subl $4,%esi                    # pre-decrementing copy loop
-+      subl $4,%edi
-+      movl (%esi),%eax
-+      movl %eax,(%edi)
-+      loop 16b
-+17:   movl %edi,%esp                  # final %edi is top of merged stack
-+      jmp  11b
-+
-+.section .rodata,"a"
-+critical_fixup_table:
-+      .byte 0xff,0xff,0xff            # testb $0xff,(%esi) = __TEST_PENDING
-+      .byte 0xff,0xff                 # jnz  14f
-+      .byte 0x00                      # pop  %ebx
-+      .byte 0x04                      # pop  %ecx
-+      .byte 0x08                      # pop  %edx
-+      .byte 0x0c                      # pop  %esi
-+      .byte 0x10                      # pop  %edi
-+      .byte 0x14                      # pop  %ebp
-+      .byte 0x18                      # pop  %eax
-+      .byte 0x1c                      # pop  %ds
-+      .byte 0x20                      # pop  %es
-+      .byte 0x24,0x24,0x24            # add  $4,%esp
-+      .byte 0x28                      # iret
-+      .byte 0xff,0xff,0xff,0xff       # movb $1,1(%esi)
-+      .byte 0x00,0x00                 # jmp  11b
-+.previous
-+
-+# Hypervisor uses this for application faults while it executes.
-+# We get here for two reasons:
-+#  1. Fault while reloading DS, ES, FS or GS
-+#  2. Fault while executing IRET
-+# Category 1 we fix up by reattempting the load, and zeroing the segment
-+# register if the load fails.
-+# Category 2 we fix up by jumping to do_iret_error. We cannot use the
-+# normal Linux return path in this case because if we use the IRET hypercall
-+# to pop the stack frame we end up in an infinite loop of failsafe callbacks.
-+# We distinguish between categories by maintaining a status value in EAX.
-+ENTRY(failsafe_callback)
-+      pushl %eax
-+      movl $1,%eax
-+1:    mov 4(%esp),%ds
-+2:    mov 8(%esp),%es
-+3:    mov 12(%esp),%fs
-+4:    mov 16(%esp),%gs
-+      testl %eax,%eax
-+      popl %eax
-+      jz 5f
-+      addl $16,%esp           # EAX != 0 => Category 2 (Bad IRET)
-+      jmp iret_exc
-+5:    addl $16,%esp           # EAX == 0 => Category 1 (Bad segment)
-+      RING0_INT_FRAME
-+      pushl $0
-+      SAVE_ALL
-+      jmp ret_from_exception
-+.section .fixup,"ax";         \
-+6:    xorl %eax,%eax;         \
-+      movl %eax,4(%esp);      \
-+      jmp 1b;                 \
-+7:    xorl %eax,%eax;         \
-+      movl %eax,8(%esp);      \
-+      jmp 2b;                 \
-+8:    xorl %eax,%eax;         \
-+      movl %eax,12(%esp);     \
-+      jmp 3b;                 \
-+9:    xorl %eax,%eax;         \
-+      movl %eax,16(%esp);     \
-+      jmp 4b;                 \
-+.previous;                    \
-+.section __ex_table,"a";      \
-+      .align 4;               \
-+      .long 1b,6b;            \
-+      .long 2b,7b;            \
-+      .long 3b,8b;            \
-+      .long 4b,9b;            \
-+.previous
-+#endif
-+      CFI_ENDPROC
-+
-+ENTRY(coprocessor_error)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_coprocessor_error
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(simd_coprocessor_error)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_simd_coprocessor_error
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(device_not_available)
-+      RING0_INT_FRAME
-+      pushl $-1                       # mark this as an int
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+#ifndef CONFIG_XEN
-+      movl %cr0, %eax
-+      testl $0x4, %eax                # EM (math emulation bit)
-+      je device_available_emulate
-+      pushl $0                        # temporary storage for ORIG_EIP
-+      CFI_ADJUST_CFA_OFFSET 4
-+      call math_emulate
-+      addl $4, %esp
-+      CFI_ADJUST_CFA_OFFSET -4
-+      jmp ret_from_exception
-+device_available_emulate:
-+#endif
-+      preempt_stop
-+      call math_state_restore
-+      jmp ret_from_exception
-+      CFI_ENDPROC
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * Debug traps and NMI can happen at the one SYSENTER instruction
-+ * that sets up the real kernel stack. Check here, since we can't
-+ * allow the wrong stack to be used.
-+ *
-+ * "SYSENTER_stack_esp0+12" is because the NMI/debug handler will have
-+ * already pushed 3 words if it hits on the sysenter instruction:
-+ * eflags, cs and eip.
-+ *
-+ * We just load the right stack, and push the three (known) values
-+ * by hand onto the new stack - while updating the return eip past
-+ * the instruction that would have done it for sysenter.
-+ */
-+#define FIX_STACK(offset, ok, label)          \
-+      cmpw $__KERNEL_CS,4(%esp);              \
-+      jne ok;                                 \
-+label:                                                \
-+      movl SYSENTER_stack_esp0+offset(%esp),%esp;     \
-+      pushfl;                                 \
-+      pushl $__KERNEL_CS;                     \
-+      pushl $sysenter_past_esp
-+#endif /* CONFIG_XEN */
-+
-+KPROBE_ENTRY(debug)
-+      RING0_INT_FRAME
-+#ifndef CONFIG_XEN
-+      cmpl $sysenter_entry,(%esp)
-+      jne debug_stack_correct
-+      FIX_STACK(12, debug_stack_correct, debug_esp_fix_insn)
-+debug_stack_correct:
-+#endif /* !CONFIG_XEN */
-+      pushl $-1                       # mark this as an int
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      xorl %edx,%edx                  # error code 0
-+      movl %esp,%eax                  # pt_regs pointer
-+      call do_debug
-+      jmp ret_from_exception
-+      CFI_ENDPROC
-+      .previous .text
-+#ifndef CONFIG_XEN
-+/*
-+ * NMI is doubly nasty. It can happen _while_ we're handling
-+ * a debug fault, and the debug fault hasn't yet been able to
-+ * clear up the stack. So we first check whether we got  an
-+ * NMI on the sysenter entry path, but after that we need to
-+ * check whether we got an NMI on the debug path where the debug
-+ * fault happened on the sysenter path.
-+ */
-+ENTRY(nmi)
-+      RING0_INT_FRAME
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      movl %ss, %eax
-+      cmpw $__ESPFIX_SS, %ax
-+      popl %eax
-+      CFI_ADJUST_CFA_OFFSET -4
-+      je nmi_16bit_stack
-+      cmpl $sysenter_entry,(%esp)
-+      je nmi_stack_fixup
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      movl %esp,%eax
-+      /* Do not access memory above the end of our stack page,
-+       * it might not exist.
-+       */
-+      andl $(THREAD_SIZE-1),%eax
-+      cmpl $(THREAD_SIZE-20),%eax
-+      popl %eax
-+      CFI_ADJUST_CFA_OFFSET -4
-+      jae nmi_stack_correct
-+      cmpl $sysenter_entry,12(%esp)
-+      je nmi_debug_stack_check
-+nmi_stack_correct:
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      xorl %edx,%edx          # zero error code
-+      movl %esp,%eax          # pt_regs pointer
-+      call do_nmi
-+      jmp restore_nocheck_notrace
-+      CFI_ENDPROC
-+
-+nmi_stack_fixup:
-+      FIX_STACK(12,nmi_stack_correct, 1)
-+      jmp nmi_stack_correct
-+nmi_debug_stack_check:
-+      cmpw $__KERNEL_CS,16(%esp)
-+      jne nmi_stack_correct
-+      cmpl $debug,(%esp)
-+      jb nmi_stack_correct
-+      cmpl $debug_esp_fix_insn,(%esp)
-+      ja nmi_stack_correct
-+      FIX_STACK(24,nmi_stack_correct, 1)
-+      jmp nmi_stack_correct
-+
-+nmi_16bit_stack:
-+      RING0_INT_FRAME
-+      /* create the pointer to lss back */
-+      pushl %ss
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl %esp
-+      CFI_ADJUST_CFA_OFFSET 4
-+      movzwl %sp, %esp
-+      addw $4, (%esp)
-+      /* copy the iret frame of 12 bytes */
-+      .rept 3
-+      pushl 16(%esp)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      .endr
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      FIXUP_ESPFIX_STACK              # %eax == %esp
-+      CFI_ADJUST_CFA_OFFSET -20       # the frame has now moved
-+      xorl %edx,%edx                  # zero error code
-+      call do_nmi
-+      RESTORE_REGS
-+      lss 12+4(%esp), %esp            # back to 16bit stack
-+1:    iret
-+      CFI_ENDPROC
-+.section __ex_table,"a"
-+      .align 4
-+      .long 1b,iret_exc
-+.previous
-+#else
-+ENTRY(nmi)
-+      RING0_INT_FRAME
-+      pushl %eax
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      xorl %edx,%edx          # zero error code
-+      movl %esp,%eax          # pt_regs pointer
-+      call do_nmi
-+      orl  $NMI_MASK, EFLAGS(%esp)
-+      jmp restore_all
-+      CFI_ENDPROC
-+#endif
-+
-+KPROBE_ENTRY(int3)
-+      RING0_INT_FRAME
-+      pushl $-1                       # mark this as an int
-+      CFI_ADJUST_CFA_OFFSET 4
-+      SAVE_ALL
-+      xorl %edx,%edx          # zero error code
-+      movl %esp,%eax          # pt_regs pointer
-+      call do_int3
-+      jmp ret_from_exception
-+      CFI_ENDPROC
-+      .previous .text
-+
-+ENTRY(overflow)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_overflow
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(bounds)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_bounds
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(invalid_op)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_invalid_op
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(coprocessor_segment_overrun)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_coprocessor_segment_overrun
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(invalid_TSS)
-+      RING0_EC_FRAME
-+      pushl $do_invalid_TSS
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(segment_not_present)
-+      RING0_EC_FRAME
-+      pushl $do_segment_not_present
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+ENTRY(stack_segment)
-+      RING0_EC_FRAME
-+      pushl $do_stack_segment
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+KPROBE_ENTRY(general_protection)
-+      RING0_EC_FRAME
-+      pushl $do_general_protection
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+      .previous .text
-+
-+ENTRY(alignment_check)
-+      RING0_EC_FRAME
-+      pushl $do_alignment_check
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+KPROBE_ENTRY(page_fault)
-+      RING0_EC_FRAME
-+      pushl $do_page_fault
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+      .previous .text
-+
-+#ifdef CONFIG_X86_MCE
-+ENTRY(machine_check)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl machine_check_vector
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+#endif
-+
-+#ifndef CONFIG_XEN
-+ENTRY(spurious_interrupt_bug)
-+      RING0_INT_FRAME
-+      pushl $0
-+      CFI_ADJUST_CFA_OFFSET 4
-+      pushl $do_spurious_interrupt_bug
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+#endif /* !CONFIG_XEN */
-+
-+#ifdef CONFIG_STACK_UNWIND
-+ENTRY(arch_unwind_init_running)
-+      CFI_STARTPROC
-+      movl    4(%esp), %edx
-+      movl    (%esp), %ecx
-+      leal    4(%esp), %eax
-+      movl    %ebx, EBX(%edx)
-+      xorl    %ebx, %ebx
-+      movl    %ebx, ECX(%edx)
-+      movl    %ebx, EDX(%edx)
-+      movl    %esi, ESI(%edx)
-+      movl    %edi, EDI(%edx)
-+      movl    %ebp, EBP(%edx)
-+      movl    %ebx, EAX(%edx)
-+      movl    $__USER_DS, DS(%edx)
-+      movl    $__USER_DS, ES(%edx)
-+      movl    %ebx, ORIG_EAX(%edx)
-+      movl    %ecx, EIP(%edx)
-+      movl    12(%esp), %ecx
-+      movl    $__KERNEL_CS, CS(%edx)
-+      movl    %ebx, EFLAGS(%edx)
-+      movl    %eax, OLDESP(%edx)
-+      movl    8(%esp), %eax
-+      movl    %ecx, 8(%esp)
-+      movl    EBX(%edx), %ebx
-+      movl    $__KERNEL_DS, OLDSS(%edx)
-+      jmpl    *%eax
-+      CFI_ENDPROC
-+ENDPROC(arch_unwind_init_running)
-+#endif
-+
-+ENTRY(fixup_4gb_segment)
-+      RING0_EC_FRAME
-+      pushl $do_fixup_4gb_segment
-+      CFI_ADJUST_CFA_OFFSET 4
-+      jmp error_code
-+      CFI_ENDPROC
-+
-+.section .rodata,"a"
-+#include "syscall_table.S"
-+
-+syscall_table_size=(.-sys_call_table)
-Index: head-2008-11-25/arch/x86/kernel/fixup.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/fixup.c    2008-01-28 12:24:18.000000000 +0100
-@@ -0,0 +1,88 @@
-+/******************************************************************************
-+ * fixup.c
-+ * 
-+ * Binary-rewriting of certain IA32 instructions, on notification by Xen.
-+ * Used to avoid repeated slow emulation of common instructions used by the
-+ * user-space TLS (Thread-Local Storage) libraries.
-+ * 
-+ * **** NOTE ****
-+ *  Issues with the binary rewriting have caused it to be removed. Instead
-+ *  we rely on Xen's emulator to boot the kernel, and then print a banner
-+ *  message recommending that the user disables /lib/tls.
-+ * 
-+ * Copyright (c) 2004, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ * 
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ * 
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/kernel.h>
-+#include <linux/delay.h>
-+#include <linux/version.h>
-+
-+#define DP(_f, _args...) printk(KERN_ALERT "  " _f "\n" , ## _args )
-+
-+fastcall void do_fixup_4gb_segment(struct pt_regs *regs, long error_code)
-+{
-+      static unsigned long printed = 0;
-+      char info[100];
-+      int i;
-+
-+      /* Ignore statically-linked init. */
-+      if (current->tgid == 1)
-+              return;
-+            
-+      VOID(HYPERVISOR_vm_assist(VMASST_CMD_disable,
-+                                VMASST_TYPE_4gb_segments_notify));
-+
-+      if (test_and_set_bit(0, &printed))
-+              return;
-+
-+      sprintf(info, "%s (pid=%d)", current->comm, current->tgid);
-+
-+      DP("");
-+      DP("***************************************************************");
-+      DP("***************************************************************");
-+      DP("** WARNING: Currently emulating unsupported memory accesses  **");
-+      DP("**          in /lib/tls glibc libraries. The emulation is    **");
-+      DP("**          slow. To ensure full performance you should      **");
-+      DP("**          install a 'xen-friendly' (nosegneg) version of   **");
-+      DP("**          the library, or disable tls support by executing **");
-+      DP("**          the following as root:                           **");
-+      DP("**          mv /lib/tls /lib/tls.disabled                    **");
-+      DP("** Offending process: %-38.38s **", info);
-+      DP("***************************************************************");
-+      DP("***************************************************************");
-+      DP("");
-+
-+      for (i = 5; i > 0; i--) {
-+              touch_softlockup_watchdog();
-+              printk("Pausing... %d", i);
-+              mdelay(1000);
-+              printk("\b\b\b\b\b\b\b\b\b\b\b\b");
-+      }
-+
-+      printk("Continuing...\n\n");
-+}
-+
-+static int __init fixup_init(void)
-+{
-+      WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
-+                                   VMASST_TYPE_4gb_segments_notify));
-+      return 0;
-+}
-+__initcall(fixup_init);
-Index: head-2008-11-25/arch/x86/kernel/head_32-xen.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/head_32-xen.S      2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,207 @@
-+
-+
-+.text
-+#include <linux/elfnote.h>
-+#include <linux/threads.h>
-+#include <linux/linkage.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/cache.h>
-+#include <asm/thread_info.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/dwarf2.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/elfnote.h>
-+
-+/*
-+ * References to members of the new_cpu_data structure.
-+ */
-+
-+#define X86           new_cpu_data+CPUINFO_x86
-+#define X86_VENDOR    new_cpu_data+CPUINFO_x86_vendor
-+#define X86_MODEL     new_cpu_data+CPUINFO_x86_model
-+#define X86_MASK      new_cpu_data+CPUINFO_x86_mask
-+#define X86_HARD_MATH new_cpu_data+CPUINFO_hard_math
-+#define X86_CPUID     new_cpu_data+CPUINFO_cpuid_level
-+#define X86_CAPABILITY        new_cpu_data+CPUINFO_x86_capability
-+#define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id
-+
-+#define VIRT_ENTRY_OFFSET 0x0
-+.org VIRT_ENTRY_OFFSET
-+ENTRY(startup_32)
-+      movl %esi,xen_start_info
-+      cld
-+
-+      /* Set up the stack pointer */
-+      movl $(init_thread_union+THREAD_SIZE),%esp
-+
-+      /* get vendor info */
-+      xorl %eax,%eax                  # call CPUID with 0 -> return vendor ID
-+      XEN_CPUID
-+      movl %eax,X86_CPUID             # save CPUID level
-+      movl %ebx,X86_VENDOR_ID         # lo 4 chars
-+      movl %edx,X86_VENDOR_ID+4       # next 4 chars
-+      movl %ecx,X86_VENDOR_ID+8       # last 4 chars
-+
-+      movl $1,%eax            # Use the CPUID instruction to get CPU type
-+      XEN_CPUID
-+      movb %al,%cl            # save reg for future use
-+      andb $0x0f,%ah          # mask processor family
-+      movb %ah,X86
-+      andb $0xf0,%al          # mask model
-+      shrb $4,%al
-+      movb %al,X86_MODEL
-+      andb $0x0f,%cl          # mask mask revision
-+      movb %cl,X86_MASK
-+      movl %edx,X86_CAPABILITY
-+
-+      movb $1,X86_HARD_MATH
-+
-+      xorl %eax,%eax                  # Clear FS/GS and LDT
-+      movl %eax,%fs
-+      movl %eax,%gs
-+      cld                     # gcc2 wants the direction flag cleared at all times
-+
-+      pushl %eax              # fake return address
-+      jmp start_kernel
-+
-+#define HYPERCALL_PAGE_OFFSET 0x1000
-+.org HYPERCALL_PAGE_OFFSET
-+ENTRY(hypercall_page)
-+      CFI_STARTPROC
-+.skip 0x1000
-+      CFI_ENDPROC
-+
-+/*
-+ * Real beginning of normal "text" segment
-+ */
-+ENTRY(stext)
-+ENTRY(_stext)
-+
-+/*
-+ * BSS section
-+ */
-+.section ".bss.page_aligned","w"
-+ENTRY(empty_zero_page)
-+      .fill 4096,1,0
-+
-+/*
-+ * This starts the data section.
-+ */
-+.data
-+
-+/*
-+ * The Global Descriptor Table contains 28 quadwords, per-CPU.
-+ */
-+      .align L1_CACHE_BYTES
-+ENTRY(cpu_gdt_table)
-+      .quad 0x0000000000000000        /* NULL descriptor */
-+      .quad 0x0000000000000000        /* 0x0b reserved */
-+      .quad 0x0000000000000000        /* 0x13 reserved */
-+      .quad 0x0000000000000000        /* 0x1b reserved */
-+      .quad 0x0000000000000000        /* 0x20 unused */
-+      .quad 0x0000000000000000        /* 0x28 unused */
-+      .quad 0x0000000000000000        /* 0x33 TLS entry 1 */
-+      .quad 0x0000000000000000        /* 0x3b TLS entry 2 */
-+      .quad 0x0000000000000000        /* 0x43 TLS entry 3 */
-+      .quad 0x0000000000000000        /* 0x4b reserved */
-+      .quad 0x0000000000000000        /* 0x53 reserved */
-+      .quad 0x0000000000000000        /* 0x5b reserved */
-+
-+      .quad 0x00cf9a000000ffff        /* 0x60 kernel 4GB code at 0x00000000 */
-+      .quad 0x00cf92000000ffff        /* 0x68 kernel 4GB data at 0x00000000 */
-+      .quad 0x00cffa000000ffff        /* 0x73 user 4GB code at 0x00000000 */
-+      .quad 0x00cff2000000ffff        /* 0x7b user 4GB data at 0x00000000 */
-+
-+      .quad 0x0000000000000000        /* 0x80 TSS descriptor */
-+      .quad 0x0000000000000000        /* 0x88 LDT descriptor */
-+
-+      /*
-+       * Segments used for calling PnP BIOS have byte granularity.
-+       * They code segments and data segments have fixed 64k limits,
-+       * the transfer segment sizes are set at run time.
-+       */
-+      .quad 0x0000000000000000        /* 0x90 32-bit code */
-+      .quad 0x0000000000000000        /* 0x98 16-bit code */
-+      .quad 0x0000000000000000        /* 0xa0 16-bit data */
-+      .quad 0x0000000000000000        /* 0xa8 16-bit data */
-+      .quad 0x0000000000000000        /* 0xb0 16-bit data */
-+
-+      /*
-+       * The APM segments have byte granularity and their bases
-+       * are set at run time.  All have 64k limits.
-+       */
-+      .quad 0x0000000000000000        /* 0xb8 APM CS    code */
-+      .quad 0x0000000000000000        /* 0xc0 APM CS 16 code (16 bit) */
-+      .quad 0x0000000000000000        /* 0xc8 APM DS    data */
-+
-+      .quad 0x0000000000000000        /* 0xd0 - ESPFIX 16-bit SS */
-+      .quad 0x0000000000000000        /* 0xd8 - unused */
-+      .quad 0x0000000000000000        /* 0xe0 - unused */
-+      .quad 0x0000000000000000        /* 0xe8 - unused */
-+      .quad 0x0000000000000000        /* 0xf0 - unused */
-+      .quad 0x0000000000000000        /* 0xf8 - GDT entry 31: double-fault TSS */
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+/*
-+ * __xen_guest information
-+ */
-+.macro utoa value
-+ .if (\value) < 0 || (\value) >= 0x10
-+      utoa (((\value)>>4)&0x0fffffff)
-+ .endif
-+ .if ((\value) & 0xf) < 10
-+  .byte '0' + ((\value) & 0xf)
-+ .else
-+  .byte 'A' + ((\value) & 0xf) - 10
-+ .endif
-+.endm
-+
-+.section __xen_guest
-+      .ascii  "GUEST_OS=linux,GUEST_VER=2.6"
-+      .ascii  ",XEN_VER=xen-3.0"
-+      .ascii  ",VIRT_BASE=0x"
-+              utoa __PAGE_OFFSET
-+      .ascii  ",ELF_PADDR_OFFSET=0x"
-+              utoa __PAGE_OFFSET
-+      .ascii  ",VIRT_ENTRY=0x"
-+              utoa (__PAGE_OFFSET + __PHYSICAL_START + VIRT_ENTRY_OFFSET)
-+      .ascii  ",HYPERCALL_PAGE=0x"
-+              utoa ((__PHYSICAL_START+HYPERCALL_PAGE_OFFSET)>>PAGE_SHIFT)
-+      .ascii  ",FEATURES=writable_page_tables"
-+      .ascii           "|writable_descriptor_tables"
-+      .ascii           "|auto_translated_physmap"
-+      .ascii           "|pae_pgdir_above_4gb"
-+      .ascii           "|supervisor_mode_kernel"
-+#ifdef CONFIG_X86_PAE
-+      .ascii  ",PAE=yes[extended-cr3]"
-+#else
-+      .ascii  ",PAE=no"
-+#endif
-+      .ascii  ",LOADER=generic"
-+      .byte   0
-+#endif /* CONFIG_XEN_COMPAT <= 0x030002 */
-+
-+
-+      ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz, "linux")       
-+      ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, "2.6")
-+      ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz, "xen-3.0")
-+      ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .long,  __PAGE_OFFSET)
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .long,  __PAGE_OFFSET)
-+#else
-+      ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .long,  0)
-+#endif
-+      ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .long,  startup_32)
-+      ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long,  hypercall_page)
-+      ELFNOTE(Xen, XEN_ELFNOTE_HV_START_LOW,   .long,  HYPERVISOR_VIRT_START)
-+      ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
-+#ifdef CONFIG_X86_PAE
-+      ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "yes")
-+      ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  _PAGE_PRESENT,_PAGE_PRESENT)
-+#else
-+      ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE,       .asciz, "no")
-+      ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .long,  _PAGE_PRESENT,_PAGE_PRESENT)
-+#endif
-+      ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-+      ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)
-Index: head-2008-11-25/arch/x86/kernel/init_task-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/init_task-xen.c    2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,51 @@
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/init.h>
-+#include <linux/init_task.h>
-+#include <linux/fs.h>
-+#include <linux/mqueue.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/desc.h>
-+
-+static struct fs_struct init_fs = INIT_FS;
-+static struct files_struct init_files = INIT_FILES;
-+static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
-+static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
-+
-+#define swapper_pg_dir ((pgd_t *)NULL)
-+struct mm_struct init_mm = INIT_MM(init_mm);
-+#undef swapper_pg_dir
-+
-+EXPORT_SYMBOL(init_mm);
-+
-+/*
-+ * Initial thread structure.
-+ *
-+ * We need to make sure that this is THREAD_SIZE aligned due to the
-+ * way process stacks are handled. This is done by having a special
-+ * "init_task" linker map entry..
-+ */
-+union thread_union init_thread_union 
-+      __attribute__((__section__(".data.init_task"))) =
-+              { INIT_THREAD_INFO(init_task) };
-+
-+/*
-+ * Initial task structure.
-+ *
-+ * All other task structs will be allocated on slabs in fork.c
-+ */
-+struct task_struct init_task = INIT_TASK(init_task);
-+
-+EXPORT_SYMBOL(init_task);
-+
-+#ifndef CONFIG_X86_NO_TSS
-+/*
-+ * per-CPU TSS segments. Threads are completely 'soft' on Linux,
-+ * no more per-task TSS's.
-+ */ 
-+DEFINE_PER_CPU(struct tss_struct, init_tss) ____cacheline_internodealigned_in_smp = INIT_TSS;
-+#endif
-+
-Index: head-2008-11-25/arch/x86/kernel/io_apic_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/io_apic_32-xen.c   2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,2776 @@
-+/*
-+ *    Intel IO-APIC support for multi-Pentium hosts.
-+ *
-+ *    Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar, Hajnalka Szabo
-+ *
-+ *    Many thanks to Stig Venaas for trying out countless experimental
-+ *    patches and reporting/debugging problems patiently!
-+ *
-+ *    (c) 1999, Multiple IO-APIC support, developed by
-+ *    Ken-ichi Yaku <yaku@css1.kbnes.nec.co.jp> and
-+ *      Hidemi Kishimoto <kisimoto@css1.kbnes.nec.co.jp>,
-+ *    further tested and cleaned up by Zach Brown <zab@redhat.com>
-+ *    and Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *    Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
-+ *                                    thanks to Eric Gilmore
-+ *                                    and Rolf G. Tews
-+ *                                    for testing these extensively
-+ *    Paul Diefenbaugh        :       Added full ACPI support
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/sched.h>
-+#include <linux/smp_lock.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/compiler.h>
-+#include <linux/acpi.h>
-+#include <linux/module.h>
-+#include <linux/sysdev.h>
-+
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/desc.h>
-+#include <asm/timer.h>
-+#include <asm/i8259.h>
-+#include <asm/nmi.h>
-+
-+#include <mach_apic.h>
-+
-+#include "io_ports.h"
-+
-+#ifdef CONFIG_XEN
-+
-+#include <xen/interface/xen.h>
-+#include <xen/interface/physdev.h>
-+#include <xen/evtchn.h>
-+
-+/* Fake i8259 */
-+#define make_8259A_irq(_irq)     (io_apic_irqs &= ~(1UL<<(_irq)))
-+#define disable_8259A_irq(_irq)  ((void)0)
-+#define i8259A_irq_pending(_irq) (0)
-+
-+unsigned long io_apic_irqs;
-+
-+static inline unsigned int xen_io_apic_read(unsigned int apic, unsigned int reg)
-+{
-+      struct physdev_apic apic_op;
-+      int ret;
-+
-+      apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-+      apic_op.reg = reg;
-+      ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
-+      if (ret)
-+              return ret;
-+      return apic_op.value;
-+}
-+
-+static inline void xen_io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
-+{
-+      struct physdev_apic apic_op;
-+
-+      apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-+      apic_op.reg = reg;
-+      apic_op.value = value;
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
-+}
-+
-+#define io_apic_read(a,r)    xen_io_apic_read(a,r)
-+#define io_apic_write(a,r,v) xen_io_apic_write(a,r,v)
-+
-+#endif /* CONFIG_XEN */
-+
-+int (*ioapic_renumber_irq)(int ioapic, int irq);
-+atomic_t irq_mis_count;
-+
-+/* Where if anywhere is the i8259 connect in external int mode */
-+static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
-+
-+static DEFINE_SPINLOCK(ioapic_lock);
-+static DEFINE_SPINLOCK(vector_lock);
-+
-+int timer_over_8254 __initdata = 1;
-+
-+/*
-+ *    Is the SiS APIC rmw bug present ?
-+ *    -1 = don't know, 0 = no, 1 = yes
-+ */
-+int sis_apic_bug = -1;
-+
-+/*
-+ * # of IRQ routing registers
-+ */
-+int nr_ioapic_registers[MAX_IO_APICS];
-+
-+int disable_timer_pin_1 __initdata;
-+
-+/*
-+ * Rough estimation of how many shared IRQs there are, can
-+ * be changed anytime.
-+ */
-+#define MAX_PLUS_SHARED_IRQS NR_IRQS
-+#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
-+
-+/*
-+ * This is performance-critical, we want to do it O(1)
-+ *
-+ * the indexing order of this array favors 1:1 mappings
-+ * between pins and IRQs.
-+ */
-+
-+static struct irq_pin_list {
-+      int apic, pin, next;
-+} irq_2_pin[PIN_MAP_SIZE];
-+
-+int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1};
-+#ifdef CONFIG_PCI_MSI
-+#define vector_to_irq(vector)         \
-+      (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-+#else
-+#define vector_to_irq(vector) (vector)
-+#endif
-+
-+/*
-+ * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
-+ * shared ISA-space IRQs, so we have to support them. We are super
-+ * fast in the common case, and fast for shared ISA-space IRQs.
-+ */
-+static void add_pin_to_irq(unsigned int irq, int apic, int pin)
-+{
-+      static int first_free_entry = NR_IRQS;
-+      struct irq_pin_list *entry = irq_2_pin + irq;
-+
-+      while (entry->next)
-+              entry = irq_2_pin + entry->next;
-+
-+      if (entry->pin != -1) {
-+              entry->next = first_free_entry;
-+              entry = irq_2_pin + entry->next;
-+              if (++first_free_entry >= PIN_MAP_SIZE)
-+                      panic("io_apic.c: whoops");
-+      }
-+      entry->apic = apic;
-+      entry->pin = pin;
-+}
-+
-+#ifdef CONFIG_XEN
-+#define clear_IO_APIC() ((void)0)
-+#else
-+/*
-+ * Reroute an IRQ to a different pin.
-+ */
-+static void __init replace_pin_at_irq(unsigned int irq,
-+                                    int oldapic, int oldpin,
-+                                    int newapic, int newpin)
-+{
-+      struct irq_pin_list *entry = irq_2_pin + irq;
-+
-+      while (1) {
-+              if (entry->apic == oldapic && entry->pin == oldpin) {
-+                      entry->apic = newapic;
-+                      entry->pin = newpin;
-+              }
-+              if (!entry->next)
-+                      break;
-+              entry = irq_2_pin + entry->next;
-+      }
-+}
-+
-+static void __modify_IO_APIC_irq (unsigned int irq, unsigned long enable, unsigned long disable)
-+{
-+      struct irq_pin_list *entry = irq_2_pin + irq;
-+      unsigned int pin, reg;
-+
-+      for (;;) {
-+              pin = entry->pin;
-+              if (pin == -1)
-+                      break;
-+              reg = io_apic_read(entry->apic, 0x10 + pin*2);
-+              reg &= ~disable;
-+              reg |= enable;
-+              io_apic_modify(entry->apic, 0x10 + pin*2, reg);
-+              if (!entry->next)
-+                      break;
-+              entry = irq_2_pin + entry->next;
-+      }
-+}
-+
-+/* mask = 1 */
-+static void __mask_IO_APIC_irq (unsigned int irq)
-+{
-+      __modify_IO_APIC_irq(irq, 0x00010000, 0);
-+}
-+
-+/* mask = 0 */
-+static void __unmask_IO_APIC_irq (unsigned int irq)
-+{
-+      __modify_IO_APIC_irq(irq, 0, 0x00010000);
-+}
-+
-+/* mask = 1, trigger = 0 */
-+static void __mask_and_edge_IO_APIC_irq (unsigned int irq)
-+{
-+      __modify_IO_APIC_irq(irq, 0x00010000, 0x00008000);
-+}
-+
-+/* mask = 0, trigger = 1 */
-+static void __unmask_and_level_IO_APIC_irq (unsigned int irq)
-+{
-+      __modify_IO_APIC_irq(irq, 0x00008000, 0x00010000);
-+}
-+
-+static void mask_IO_APIC_irq (unsigned int irq)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      __mask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void unmask_IO_APIC_irq (unsigned int irq)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      __unmask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+      
-+      /* Check delivery_mode to be sure we're not clearing an SMI pin */
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+      *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+      if (entry.delivery_mode == dest_SMI)
-+              return;
-+
-+      /*
-+       * Disable it in the IO-APIC irq-routing table:
-+       */
-+      memset(&entry, 0, sizeof(entry));
-+      entry.mask = 1;
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry) + 0));
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry) + 1));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void clear_IO_APIC (void)
-+{
-+      int apic, pin;
-+
-+      for (apic = 0; apic < nr_ioapics; apic++)
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
-+                      clear_IO_APIC_pin(apic, pin);
-+}
-+
-+#ifdef CONFIG_SMP
-+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t cpumask)
-+{
-+      unsigned long flags;
-+      int pin;
-+      struct irq_pin_list *entry = irq_2_pin + irq;
-+      unsigned int apicid_value;
-+      cpumask_t tmp;
-+      
-+      cpus_and(tmp, cpumask, cpu_online_map);
-+      if (cpus_empty(tmp))
-+              tmp = TARGET_CPUS;
-+
-+      cpus_and(cpumask, tmp, CPU_MASK_ALL);
-+
-+      apicid_value = cpu_mask_to_apicid(cpumask);
-+      /* Prepare to do the io_apic_write */
-+      apicid_value = apicid_value << 24;
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      for (;;) {
-+              pin = entry->pin;
-+              if (pin == -1)
-+                      break;
-+              io_apic_write(entry->apic, 0x10 + 1 + pin*2, apicid_value);
-+              if (!entry->next)
-+                      break;
-+              entry = irq_2_pin + entry->next;
-+      }
-+      set_irq_info(irq, cpumask);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+#if defined(CONFIG_IRQBALANCE)
-+# include <asm/processor.h>   /* kernel_thread() */
-+# include <linux/kernel_stat.h>       /* kstat */
-+# include <linux/slab.h>              /* kmalloc() */
-+# include <linux/timer.h>     /* time_after() */
-+ 
-+#ifdef CONFIG_BALANCED_IRQ_DEBUG
-+#  define TDprintk(x...) do { printk("<%ld:%s:%d>: ", jiffies, __FILE__, __LINE__); printk(x); } while (0)
-+#  define Dprintk(x...) do { TDprintk(x); } while (0)
-+# else
-+#  define TDprintk(x...) 
-+#  define Dprintk(x...) 
-+# endif
-+
-+#define IRQBALANCE_CHECK_ARCH -999
-+#define MAX_BALANCED_IRQ_INTERVAL     (5*HZ)
-+#define MIN_BALANCED_IRQ_INTERVAL     (HZ/2)
-+#define BALANCED_IRQ_MORE_DELTA               (HZ/10)
-+#define BALANCED_IRQ_LESS_DELTA               (HZ)
-+
-+static int irqbalance_disabled __read_mostly = IRQBALANCE_CHECK_ARCH;
-+static int physical_balance __read_mostly;
-+static long balanced_irq_interval __read_mostly = MAX_BALANCED_IRQ_INTERVAL;
-+
-+static struct irq_cpu_info {
-+      unsigned long * last_irq;
-+      unsigned long * irq_delta;
-+      unsigned long irq;
-+} irq_cpu_data[NR_CPUS];
-+
-+#define CPU_IRQ(cpu)          (irq_cpu_data[cpu].irq)
-+#define LAST_CPU_IRQ(cpu,irq)   (irq_cpu_data[cpu].last_irq[irq])
-+#define IRQ_DELTA(cpu,irq)    (irq_cpu_data[cpu].irq_delta[irq])
-+
-+#define IDLE_ENOUGH(cpu,now) \
-+      (idle_cpu(cpu) && ((now) - per_cpu(irq_stat, (cpu)).idle_timestamp > 1))
-+
-+#define IRQ_ALLOWED(cpu, allowed_mask)        cpu_isset(cpu, allowed_mask)
-+
-+#define CPU_TO_PACKAGEINDEX(i) (first_cpu(cpu_sibling_map[i]))
-+
-+static cpumask_t balance_irq_affinity[NR_IRQS] = {
-+      [0 ... NR_IRQS-1] = CPU_MASK_ALL
-+};
-+
-+void set_balance_irq_affinity(unsigned int irq, cpumask_t mask)
-+{
-+      balance_irq_affinity[irq] = mask;
-+}
-+
-+static unsigned long move(int curr_cpu, cpumask_t allowed_mask,
-+                      unsigned long now, int direction)
-+{
-+      int search_idle = 1;
-+      int cpu = curr_cpu;
-+
-+      goto inside;
-+
-+      do {
-+              if (unlikely(cpu == curr_cpu))
-+                      search_idle = 0;
-+inside:
-+              if (direction == 1) {
-+                      cpu++;
-+                      if (cpu >= NR_CPUS)
-+                              cpu = 0;
-+              } else {
-+                      cpu--;
-+                      if (cpu == -1)
-+                              cpu = NR_CPUS-1;
-+              }
-+      } while (!cpu_online(cpu) || !IRQ_ALLOWED(cpu,allowed_mask) ||
-+                      (search_idle && !IDLE_ENOUGH(cpu,now)));
-+
-+      return cpu;
-+}
-+
-+static inline void balance_irq(int cpu, int irq)
-+{
-+      unsigned long now = jiffies;
-+      cpumask_t allowed_mask;
-+      unsigned int new_cpu;
-+              
-+      if (irqbalance_disabled)
-+              return; 
-+
-+      cpus_and(allowed_mask, cpu_online_map, balance_irq_affinity[irq]);
-+      new_cpu = move(cpu, allowed_mask, now, 1);
-+      if (cpu != new_cpu) {
-+              set_pending_irq(irq, cpumask_of_cpu(new_cpu));
-+      }
-+}
-+
-+static inline void rotate_irqs_among_cpus(unsigned long useful_load_threshold)
-+{
-+      int i, j;
-+      Dprintk("Rotating IRQs among CPUs.\n");
-+      for_each_online_cpu(i) {
-+              for (j = 0; j < NR_IRQS; j++) {
-+                      if (!irq_desc[j].action)
-+                              continue;
-+                      /* Is it a significant load ?  */
-+                      if (IRQ_DELTA(CPU_TO_PACKAGEINDEX(i),j) <
-+                                              useful_load_threshold)
-+                              continue;
-+                      balance_irq(i, j);
-+              }
-+      }
-+      balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
-+              balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);       
-+      return;
-+}
-+
-+static void do_irq_balance(void)
-+{
-+      int i, j;
-+      unsigned long max_cpu_irq = 0, min_cpu_irq = (~0);
-+      unsigned long move_this_load = 0;
-+      int max_loaded = 0, min_loaded = 0;
-+      int load;
-+      unsigned long useful_load_threshold = balanced_irq_interval + 10;
-+      int selected_irq;
-+      int tmp_loaded, first_attempt = 1;
-+      unsigned long tmp_cpu_irq;
-+      unsigned long imbalance = 0;
-+      cpumask_t allowed_mask, target_cpu_mask, tmp;
-+
-+      for_each_possible_cpu(i) {
-+              int package_index;
-+              CPU_IRQ(i) = 0;
-+              if (!cpu_online(i))
-+                      continue;
-+              package_index = CPU_TO_PACKAGEINDEX(i);
-+              for (j = 0; j < NR_IRQS; j++) {
-+                      unsigned long value_now, delta;
-+                      /* Is this an active IRQ? */
-+                      if (!irq_desc[j].action)
-+                              continue;
-+                      if ( package_index == i )
-+                              IRQ_DELTA(package_index,j) = 0;
-+                      /* Determine the total count per processor per IRQ */
-+                      value_now = (unsigned long) kstat_cpu(i).irqs[j];
-+
-+                      /* Determine the activity per processor per IRQ */
-+                      delta = value_now - LAST_CPU_IRQ(i,j);
-+
-+                      /* Update last_cpu_irq[][] for the next time */
-+                      LAST_CPU_IRQ(i,j) = value_now;
-+
-+                      /* Ignore IRQs whose rate is less than the clock */
-+                      if (delta < useful_load_threshold)
-+                              continue;
-+                      /* update the load for the processor or package total */
-+                      IRQ_DELTA(package_index,j) += delta;
-+
-+                      /* Keep track of the higher numbered sibling as well */
-+                      if (i != package_index)
-+                              CPU_IRQ(i) += delta;
-+                      /*
-+                       * We have sibling A and sibling B in the package
-+                       *
-+                       * cpu_irq[A] = load for cpu A + load for cpu B
-+                       * cpu_irq[B] = load for cpu B
-+                       */
-+                      CPU_IRQ(package_index) += delta;
-+              }
-+      }
-+      /* Find the least loaded processor package */
-+      for_each_online_cpu(i) {
-+              if (i != CPU_TO_PACKAGEINDEX(i))
-+                      continue;
-+              if (min_cpu_irq > CPU_IRQ(i)) {
-+                      min_cpu_irq = CPU_IRQ(i);
-+                      min_loaded = i;
-+              }
-+      }
-+      max_cpu_irq = ULONG_MAX;
-+
-+tryanothercpu:
-+      /* Look for heaviest loaded processor.
-+       * We may come back to get the next heaviest loaded processor.
-+       * Skip processors with trivial loads.
-+       */
-+      tmp_cpu_irq = 0;
-+      tmp_loaded = -1;
-+      for_each_online_cpu(i) {
-+              if (i != CPU_TO_PACKAGEINDEX(i))
-+                      continue;
-+              if (max_cpu_irq <= CPU_IRQ(i)) 
-+                      continue;
-+              if (tmp_cpu_irq < CPU_IRQ(i)) {
-+                      tmp_cpu_irq = CPU_IRQ(i);
-+                      tmp_loaded = i;
-+              }
-+      }
-+
-+      if (tmp_loaded == -1) {
-+       /* In the case of small number of heavy interrupt sources, 
-+        * loading some of the cpus too much. We use Ingo's original 
-+        * approach to rotate them around.
-+        */
-+              if (!first_attempt && imbalance >= useful_load_threshold) {
-+                      rotate_irqs_among_cpus(useful_load_threshold);
-+                      return;
-+              }
-+              goto not_worth_the_effort;
-+      }
-+      
-+      first_attempt = 0;              /* heaviest search */
-+      max_cpu_irq = tmp_cpu_irq;      /* load */
-+      max_loaded = tmp_loaded;        /* processor */
-+      imbalance = (max_cpu_irq - min_cpu_irq) / 2;
-+      
-+      Dprintk("max_loaded cpu = %d\n", max_loaded);
-+      Dprintk("min_loaded cpu = %d\n", min_loaded);
-+      Dprintk("max_cpu_irq load = %ld\n", max_cpu_irq);
-+      Dprintk("min_cpu_irq load = %ld\n", min_cpu_irq);
-+      Dprintk("load imbalance = %lu\n", imbalance);
-+
-+      /* if imbalance is less than approx 10% of max load, then
-+       * observe diminishing returns action. - quit
-+       */
-+      if (imbalance < (max_cpu_irq >> 3)) {
-+              Dprintk("Imbalance too trivial\n");
-+              goto not_worth_the_effort;
-+      }
-+
-+tryanotherirq:
-+      /* if we select an IRQ to move that can't go where we want, then
-+       * see if there is another one to try.
-+       */
-+      move_this_load = 0;
-+      selected_irq = -1;
-+      for (j = 0; j < NR_IRQS; j++) {
-+              /* Is this an active IRQ? */
-+              if (!irq_desc[j].action)
-+                      continue;
-+              if (imbalance <= IRQ_DELTA(max_loaded,j))
-+                      continue;
-+              /* Try to find the IRQ that is closest to the imbalance
-+               * without going over.
-+               */
-+              if (move_this_load < IRQ_DELTA(max_loaded,j)) {
-+                      move_this_load = IRQ_DELTA(max_loaded,j);
-+                      selected_irq = j;
-+              }
-+      }
-+      if (selected_irq == -1) {
-+              goto tryanothercpu;
-+      }
-+
-+      imbalance = move_this_load;
-+      
-+      /* For physical_balance case, we accumlated both load
-+       * values in the one of the siblings cpu_irq[],
-+       * to use the same code for physical and logical processors
-+       * as much as possible. 
-+       *
-+       * NOTE: the cpu_irq[] array holds the sum of the load for
-+       * sibling A and sibling B in the slot for the lowest numbered
-+       * sibling (A), _AND_ the load for sibling B in the slot for
-+       * the higher numbered sibling.
-+       *
-+       * We seek the least loaded sibling by making the comparison
-+       * (A+B)/2 vs B
-+       */
-+      load = CPU_IRQ(min_loaded) >> 1;
-+      for_each_cpu_mask(j, cpu_sibling_map[min_loaded]) {
-+              if (load > CPU_IRQ(j)) {
-+                      /* This won't change cpu_sibling_map[min_loaded] */
-+                      load = CPU_IRQ(j);
-+                      min_loaded = j;
-+              }
-+      }
-+
-+      cpus_and(allowed_mask,
-+              cpu_online_map,
-+              balance_irq_affinity[selected_irq]);
-+      target_cpu_mask = cpumask_of_cpu(min_loaded);
-+      cpus_and(tmp, target_cpu_mask, allowed_mask);
-+
-+      if (!cpus_empty(tmp)) {
-+
-+              Dprintk("irq = %d moved to cpu = %d\n",
-+                              selected_irq, min_loaded);
-+              /* mark for change destination */
-+              set_pending_irq(selected_irq, cpumask_of_cpu(min_loaded));
-+
-+              /* Since we made a change, come back sooner to 
-+               * check for more variation.
-+               */
-+              balanced_irq_interval = max((long)MIN_BALANCED_IRQ_INTERVAL,
-+                      balanced_irq_interval - BALANCED_IRQ_LESS_DELTA);       
-+              return;
-+      }
-+      goto tryanotherirq;
-+
-+not_worth_the_effort:
-+      /*
-+       * if we did not find an IRQ to move, then adjust the time interval
-+       * upward
-+       */
-+      balanced_irq_interval = min((long)MAX_BALANCED_IRQ_INTERVAL,
-+              balanced_irq_interval + BALANCED_IRQ_MORE_DELTA);       
-+      Dprintk("IRQ worth rotating not found\n");
-+      return;
-+}
-+
-+static int balanced_irq(void *unused)
-+{
-+      int i;
-+      unsigned long prev_balance_time = jiffies;
-+      long time_remaining = balanced_irq_interval;
-+
-+      daemonize("kirqd");
-+      
-+      /* push everything to CPU 0 to give us a starting point.  */
-+      for (i = 0 ; i < NR_IRQS ; i++) {
-+              irq_desc[i].pending_mask = cpumask_of_cpu(0);
-+              set_pending_irq(i, cpumask_of_cpu(0));
-+      }
-+
-+      for ( ; ; ) {
-+              time_remaining = schedule_timeout_interruptible(time_remaining);
-+              try_to_freeze();
-+              if (time_after(jiffies,
-+                              prev_balance_time+balanced_irq_interval)) {
-+                      preempt_disable();
-+                      do_irq_balance();
-+                      prev_balance_time = jiffies;
-+                      time_remaining = balanced_irq_interval;
-+                      preempt_enable();
-+              }
-+      }
-+      return 0;
-+}
-+
-+static int __init balanced_irq_init(void)
-+{
-+      int i;
-+      struct cpuinfo_x86 *c;
-+      cpumask_t tmp;
-+
-+      cpus_shift_right(tmp, cpu_online_map, 2);
-+        c = &boot_cpu_data;
-+      /* When not overwritten by the command line ask subarchitecture. */
-+      if (irqbalance_disabled == IRQBALANCE_CHECK_ARCH)
-+              irqbalance_disabled = NO_BALANCE_IRQ;
-+      if (irqbalance_disabled)
-+              return 0;
-+      
-+       /* disable irqbalance completely if there is only one processor online */
-+      if (num_online_cpus() < 2) {
-+              irqbalance_disabled = 1;
-+              return 0;
-+      }
-+      /*
-+       * Enable physical balance only if more than 1 physical processor
-+       * is present
-+       */
-+      if (smp_num_siblings > 1 && !cpus_empty(tmp))
-+              physical_balance = 1;
-+
-+      for_each_online_cpu(i) {
-+              irq_cpu_data[i].irq_delta = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
-+              irq_cpu_data[i].last_irq = kmalloc(sizeof(unsigned long) * NR_IRQS, GFP_KERNEL);
-+              if (irq_cpu_data[i].irq_delta == NULL || irq_cpu_data[i].last_irq == NULL) {
-+                      printk(KERN_ERR "balanced_irq_init: out of memory");
-+                      goto failed;
-+              }
-+              memset(irq_cpu_data[i].irq_delta,0,sizeof(unsigned long) * NR_IRQS);
-+              memset(irq_cpu_data[i].last_irq,0,sizeof(unsigned long) * NR_IRQS);
-+      }
-+      
-+      printk(KERN_INFO "Starting balanced_irq\n");
-+      if (kernel_thread(balanced_irq, NULL, CLONE_KERNEL) >= 0) 
-+              return 0;
-+      else 
-+              printk(KERN_ERR "balanced_irq_init: failed to spawn balanced_irq");
-+failed:
-+      for_each_possible_cpu(i) {
-+              kfree(irq_cpu_data[i].irq_delta);
-+              irq_cpu_data[i].irq_delta = NULL;
-+              kfree(irq_cpu_data[i].last_irq);
-+              irq_cpu_data[i].last_irq = NULL;
-+      }
-+      return 0;
-+}
-+
-+int __init irqbalance_disable(char *str)
-+{
-+      irqbalance_disabled = 1;
-+      return 1;
-+}
-+
-+__setup("noirqbalance", irqbalance_disable);
-+
-+late_initcall(balanced_irq_init);
-+#endif /* CONFIG_IRQBALANCE */
-+#endif /* CONFIG_SMP */
-+#endif
-+
-+#ifndef CONFIG_SMP
-+void fastcall send_IPI_self(int vector)
-+{
-+#ifndef CONFIG_XEN
-+      unsigned int cfg;
-+
-+      /*
-+       * Wait for idle.
-+       */
-+      apic_wait_icr_idle();
-+      cfg = APIC_DM_FIXED | APIC_DEST_SELF | vector | APIC_DEST_LOGICAL;
-+      /*
-+       * Send the IPI. The write to APIC_ICR fires this off.
-+       */
-+      apic_write_around(APIC_ICR, cfg);
-+#endif
-+}
-+#endif /* !CONFIG_SMP */
-+
-+
-+/*
-+ * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
-+ * specific CPU-side IRQs.
-+ */
-+
-+#define MAX_PIRQS 8
-+static int pirq_entries [MAX_PIRQS];
-+static int pirqs_enabled;
-+int skip_ioapic_setup;
-+
-+static int __init ioapic_setup(char *str)
-+{
-+      skip_ioapic_setup = 1;
-+      return 1;
-+}
-+
-+__setup("noapic", ioapic_setup);
-+
-+static int __init ioapic_pirq_setup(char *str)
-+{
-+      int i, max;
-+      int ints[MAX_PIRQS+1];
-+
-+      get_options(str, ARRAY_SIZE(ints), ints);
-+
-+      for (i = 0; i < MAX_PIRQS; i++)
-+              pirq_entries[i] = -1;
-+
-+      pirqs_enabled = 1;
-+      apic_printk(APIC_VERBOSE, KERN_INFO
-+                      "PIRQ redirection, working around broken MP-BIOS.\n");
-+      max = MAX_PIRQS;
-+      if (ints[0] < MAX_PIRQS)
-+              max = ints[0];
-+
-+      for (i = 0; i < max; i++) {
-+              apic_printk(APIC_VERBOSE, KERN_DEBUG
-+                              "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
-+              /*
-+               * PIRQs are mapped upside down, usually.
-+               */
-+              pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
-+      }
-+      return 1;
-+}
-+
-+__setup("pirq=", ioapic_pirq_setup);
-+
-+/*
-+ * Find the IRQ entry number of a certain pin.
-+ */
-+static int find_irq_entry(int apic, int pin, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++)
-+              if (mp_irqs[i].mpc_irqtype == type &&
-+                  (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid ||
-+                   mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
-+                  mp_irqs[i].mpc_dstirq == pin)
-+                      return i;
-+
-+      return -1;
-+}
-+
-+/*
-+ * Find the pin to which IRQ[irq] (ISA) is connected
-+ */
-+static int __init find_isa_irq_pin(int irq, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_MCA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_NEC98
-+                  ) &&
-+                  (mp_irqs[i].mpc_irqtype == type) &&
-+                  (mp_irqs[i].mpc_srcbusirq == irq))
-+
-+                      return mp_irqs[i].mpc_dstirq;
-+      }
-+      return -1;
-+}
-+
-+static int __init find_isa_irq_apic(int irq, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_MCA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_NEC98
-+                  ) &&
-+                  (mp_irqs[i].mpc_irqtype == type) &&
-+                  (mp_irqs[i].mpc_srcbusirq == irq))
-+                      break;
-+      }
-+      if (i < mp_irq_entries) {
-+              int apic;
-+              for(apic = 0; apic < nr_ioapics; apic++) {
-+                      if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
-+                              return apic;
-+              }
-+      }
-+
-+      return -1;
-+}
-+
-+/*
-+ * Find a specific PCI IRQ entry.
-+ * Not an __init, possibly needed by modules
-+ */
-+static int pin_2_irq(int idx, int apic, int pin);
-+
-+int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
-+{
-+      int apic, i, best_guess = -1;
-+
-+      apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, "
-+              "slot:%d, pin:%d.\n", bus, slot, pin);
-+      if (mp_bus_id_to_pci_bus[bus] == -1) {
-+              printk(KERN_WARNING "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
-+              return -1;
-+      }
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              for (apic = 0; apic < nr_ioapics; apic++)
-+                      if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic ||
-+                          mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
-+                              break;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) &&
-+                  !mp_irqs[i].mpc_irqtype &&
-+                  (bus == lbus) &&
-+                  (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
-+                      int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
-+
-+                      if (!(apic || IO_APIC_IRQ(irq)))
-+                              continue;
-+
-+                      if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
-+                              return irq;
-+                      /*
-+                       * Use the first all-but-pin matching entry as a
-+                       * best-guess fuzzy result for broken mptables.
-+                       */
-+                      if (best_guess < 0)
-+                              best_guess = irq;
-+              }
-+      }
-+      return best_guess;
-+}
-+EXPORT_SYMBOL(IO_APIC_get_PCI_irq_vector);
-+
-+/*
-+ * This function currently is only a helper for the i386 smp boot process where 
-+ * we need to reprogram the ioredtbls to cater for the cpus which have come online
-+ * so mask in all cases should simply be TARGET_CPUS
-+ */
-+#ifdef CONFIG_SMP
-+#ifndef CONFIG_XEN
-+void __init setup_ioapic_dest(void)
-+{
-+      int pin, ioapic, irq, irq_entry;
-+
-+      if (skip_ioapic_setup == 1)
-+              return;
-+
-+      for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
-+              for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
-+                      irq_entry = find_irq_entry(ioapic, pin, mp_INT);
-+                      if (irq_entry == -1)
-+                              continue;
-+                      irq = pin_2_irq(irq_entry, ioapic, pin);
-+                      set_ioapic_affinity_irq(irq, TARGET_CPUS);
-+              }
-+
-+      }
-+}
-+#endif /* !CONFIG_XEN */
-+#endif
-+
-+/*
-+ * EISA Edge/Level control register, ELCR
-+ */
-+static int EISA_ELCR(unsigned int irq)
-+{
-+      if (irq < 16) {
-+              unsigned int port = 0x4d0 + (irq >> 3);
-+              return (inb(port) >> (irq & 7)) & 1;
-+      }
-+      apic_printk(APIC_VERBOSE, KERN_INFO
-+                      "Broken MPtable reports ISA irq %d\n", irq);
-+      return 0;
-+}
-+
-+/* EISA interrupts are always polarity zero and can be edge or level
-+ * trigger depending on the ELCR value.  If an interrupt is listed as
-+ * EISA conforming in the MP table, that means its trigger type must
-+ * be read in from the ELCR */
-+
-+#define default_EISA_trigger(idx)     (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
-+#define default_EISA_polarity(idx)    (0)
-+
-+/* ISA interrupts are always polarity zero edge triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_ISA_trigger(idx)      (0)
-+#define default_ISA_polarity(idx)     (0)
-+
-+/* PCI interrupts are always polarity one level triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_PCI_trigger(idx)      (1)
-+#define default_PCI_polarity(idx)     (1)
-+
-+/* MCA interrupts are always polarity zero level triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_MCA_trigger(idx)      (1)
-+#define default_MCA_polarity(idx)     (0)
-+
-+/* NEC98 interrupts are always polarity zero edge triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_NEC98_trigger(idx)     (0)
-+#define default_NEC98_polarity(idx)    (0)
-+
-+static int __init MPBIOS_polarity(int idx)
-+{
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+      int polarity;
-+
-+      /*
-+       * Determine IRQ line polarity (high active or low active):
-+       */
-+      switch (mp_irqs[idx].mpc_irqflag & 3)
-+      {
-+              case 0: /* conforms, ie. bus-type dependent polarity */
-+              {
-+                      switch (mp_bus_id_to_type[bus])
-+                      {
-+                              case MP_BUS_ISA: /* ISA pin */
-+                              {
-+                                      polarity = default_ISA_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_EISA: /* EISA pin */
-+                              {
-+                                      polarity = default_EISA_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_PCI: /* PCI pin */
-+                              {
-+                                      polarity = default_PCI_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_MCA: /* MCA pin */
-+                              {
-+                                      polarity = default_MCA_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_NEC98: /* NEC 98 pin */
-+                              {
-+                                      polarity = default_NEC98_polarity(idx);
-+                                      break;
-+                              }
-+                              default:
-+                              {
-+                                      printk(KERN_WARNING "broken BIOS!!\n");
-+                                      polarity = 1;
-+                                      break;
-+                              }
-+                      }
-+                      break;
-+              }
-+              case 1: /* high active */
-+              {
-+                      polarity = 0;
-+                      break;
-+              }
-+              case 2: /* reserved */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      polarity = 1;
-+                      break;
-+              }
-+              case 3: /* low active */
-+              {
-+                      polarity = 1;
-+                      break;
-+              }
-+              default: /* invalid */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      polarity = 1;
-+                      break;
-+              }
-+      }
-+      return polarity;
-+}
-+
-+static int MPBIOS_trigger(int idx)
-+{
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+      int trigger;
-+
-+      /*
-+       * Determine IRQ trigger mode (edge or level sensitive):
-+       */
-+      switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
-+      {
-+              case 0: /* conforms, ie. bus-type dependent */
-+              {
-+                      switch (mp_bus_id_to_type[bus])
-+                      {
-+                              case MP_BUS_ISA: /* ISA pin */
-+                              {
-+                                      trigger = default_ISA_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_EISA: /* EISA pin */
-+                              {
-+                                      trigger = default_EISA_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_PCI: /* PCI pin */
-+                              {
-+                                      trigger = default_PCI_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_MCA: /* MCA pin */
-+                              {
-+                                      trigger = default_MCA_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_NEC98: /* NEC 98 pin */
-+                              {
-+                                      trigger = default_NEC98_trigger(idx);
-+                                      break;
-+                              }
-+                              default:
-+                              {
-+                                      printk(KERN_WARNING "broken BIOS!!\n");
-+                                      trigger = 1;
-+                                      break;
-+                              }
-+                      }
-+                      break;
-+              }
-+              case 1: /* edge */
-+              {
-+                      trigger = 0;
-+                      break;
-+              }
-+              case 2: /* reserved */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      trigger = 1;
-+                      break;
-+              }
-+              case 3: /* level */
-+              {
-+                      trigger = 1;
-+                      break;
-+              }
-+              default: /* invalid */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      trigger = 0;
-+                      break;
-+              }
-+      }
-+      return trigger;
-+}
-+
-+static inline int irq_polarity(int idx)
-+{
-+      return MPBIOS_polarity(idx);
-+}
-+
-+static inline int irq_trigger(int idx)
-+{
-+      return MPBIOS_trigger(idx);
-+}
-+
-+static int pin_2_irq(int idx, int apic, int pin)
-+{
-+      int irq, i;
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+
-+      /*
-+       * Debugging check, we are in big trouble if this message pops up!
-+       */
-+      if (mp_irqs[idx].mpc_dstirq != pin)
-+              printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
-+
-+      switch (mp_bus_id_to_type[bus])
-+      {
-+              case MP_BUS_ISA: /* ISA pin */
-+              case MP_BUS_EISA:
-+              case MP_BUS_MCA:
-+              case MP_BUS_NEC98:
-+              {
-+                      irq = mp_irqs[idx].mpc_srcbusirq;
-+                      break;
-+              }
-+              case MP_BUS_PCI: /* PCI pin */
-+              {
-+                      /*
-+                       * PCI IRQs are mapped in order
-+                       */
-+                      i = irq = 0;
-+                      while (i < apic)
-+                              irq += nr_ioapic_registers[i++];
-+                      irq += pin;
-+
-+                      /*
-+                       * For MPS mode, so far only needed by ES7000 platform
-+                       */
-+                      if (ioapic_renumber_irq)
-+                              irq = ioapic_renumber_irq(apic, irq);
-+
-+                      break;
-+              }
-+              default:
-+              {
-+                      printk(KERN_ERR "unknown bus type %d.\n",bus); 
-+                      irq = 0;
-+                      break;
-+              }
-+      }
-+
-+      /*
-+       * PCI IRQ command line redirection. Yes, limits are hardcoded.
-+       */
-+      if ((pin >= 16) && (pin <= 23)) {
-+              if (pirq_entries[pin-16] != -1) {
-+                      if (!pirq_entries[pin-16]) {
-+                              apic_printk(APIC_VERBOSE, KERN_DEBUG
-+                                              "disabling PIRQ%d\n", pin-16);
-+                      } else {
-+                              irq = pirq_entries[pin-16];
-+                              apic_printk(APIC_VERBOSE, KERN_DEBUG
-+                                              "using PIRQ%d -> IRQ %d\n",
-+                                              pin-16, irq);
-+                      }
-+              }
-+      }
-+      return irq;
-+}
-+
-+static inline int IO_APIC_irq_trigger(int irq)
-+{
-+      int apic, idx, pin;
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+                      idx = find_irq_entry(apic,pin,mp_INT);
-+                      if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
-+                              return irq_trigger(idx);
-+              }
-+      }
-+      /*
-+       * nonexistent IRQs are edge default
-+       */
-+      return 0;
-+}
-+
-+/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-+u8 irq_vector[NR_IRQ_VECTORS] __read_mostly; /* = { FIRST_DEVICE_VECTOR , 0 }; */
-+
-+int assign_irq_vector(int irq)
-+{
-+      unsigned long flags;
-+      int vector;
-+      struct physdev_irq irq_op;
-+
-+      BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
-+
-+      if (irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS)
-+              return -EINVAL;
-+
-+      spin_lock_irqsave(&vector_lock, flags);
-+
-+      if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-+              spin_unlock_irqrestore(&vector_lock, flags);
-+              return IO_APIC_VECTOR(irq);
-+      }
-+
-+      irq_op.irq = irq;
-+      if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-+              spin_unlock_irqrestore(&vector_lock, flags);
-+              return -ENOSPC;
-+      }
-+
-+      vector = irq_op.vector;
-+      vector_irq[vector] = irq;
-+      if (irq != AUTO_ASSIGN)
-+              IO_APIC_VECTOR(irq) = vector;
-+
-+      spin_unlock_irqrestore(&vector_lock, flags);
-+
-+      return vector;
-+}
-+
-+#ifndef CONFIG_XEN
-+static struct hw_interrupt_type ioapic_level_type;
-+static struct hw_interrupt_type ioapic_edge_type;
-+
-+#define IOAPIC_AUTO   -1
-+#define IOAPIC_EDGE   0
-+#define IOAPIC_LEVEL  1
-+
-+static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-+{
-+      unsigned idx;
-+
-+      idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq;
-+
-+      if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+                      trigger == IOAPIC_LEVEL)
-+              irq_desc[idx].chip = &ioapic_level_type;
-+      else
-+              irq_desc[idx].chip = &ioapic_edge_type;
-+      set_intr_gate(vector, interrupt[idx]);
-+}
-+#else
-+#define ioapic_register_intr(irq, vector, trigger) evtchn_register_pirq(irq)
-+#endif
-+
-+static void __init setup_IO_APIC_irqs(void)
-+{
-+      struct IO_APIC_route_entry entry;
-+      int apic, pin, idx, irq, first_notcon = 1, vector;
-+      unsigned long flags;
-+
-+      apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+      for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+
-+              /*
-+               * add it to the IO-APIC irq-routing table:
-+               */
-+              memset(&entry,0,sizeof(entry));
-+
-+              entry.delivery_mode = INT_DELIVERY_MODE;
-+              entry.dest_mode = INT_DEST_MODE;
-+              entry.mask = 0;                         /* enable IRQ */
-+              entry.dest.logical.logical_dest = 
-+                                      cpu_mask_to_apicid(TARGET_CPUS);
-+
-+              idx = find_irq_entry(apic,pin,mp_INT);
-+              if (idx == -1) {
-+                      if (first_notcon) {
-+                              apic_printk(APIC_VERBOSE, KERN_DEBUG
-+                                              " IO-APIC (apicid-pin) %d-%d",
-+                                              mp_ioapics[apic].mpc_apicid,
-+                                              pin);
-+                              first_notcon = 0;
-+                      } else
-+                              apic_printk(APIC_VERBOSE, ", %d-%d",
-+                                      mp_ioapics[apic].mpc_apicid, pin);
-+                      continue;
-+              }
-+
-+              entry.trigger = irq_trigger(idx);
-+              entry.polarity = irq_polarity(idx);
-+
-+              if (irq_trigger(idx)) {
-+                      entry.trigger = 1;
-+                      entry.mask = 1;
-+              }
-+
-+              irq = pin_2_irq(idx, apic, pin);
-+              /*
-+               * skip adding the timer int on secondary nodes, which causes
-+               * a small but painful rift in the time-space continuum
-+               */
-+              if (multi_timer_check(apic, irq))
-+                      continue;
-+              else
-+                      add_pin_to_irq(irq, apic, pin);
-+
-+              if (/*!apic &&*/ !IO_APIC_IRQ(irq))
-+                      continue;
-+
-+              if (IO_APIC_IRQ(irq)) {
-+                      vector = assign_irq_vector(irq);
-+                      entry.vector = vector;
-+                      ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-+              
-+                      if (!apic && (irq < 16))
-+                              disable_8259A_irq(irq);
-+              }
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-+              io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-+              set_native_irq_info(irq, TARGET_CPUS);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+      }
-+      }
-+
-+      if (!first_notcon)
-+              apic_printk(APIC_VERBOSE, " not connected.\n");
-+}
-+
-+/*
-+ * Set up the 8259A-master output pin:
-+ */
-+#ifndef CONFIG_XEN
-+static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+
-+      memset(&entry,0,sizeof(entry));
-+
-+      disable_8259A_irq(0);
-+
-+      /* mask LVT0 */
-+      apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-+
-+      /*
-+       * We use logical delivery to get the timer IRQ
-+       * to the first CPU.
-+       */
-+      entry.dest_mode = INT_DEST_MODE;
-+      entry.mask = 0;                                 /* unmask IRQ now */
-+      entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+      entry.delivery_mode = INT_DELIVERY_MODE;
-+      entry.polarity = 0;
-+      entry.trigger = 0;
-+      entry.vector = vector;
-+
-+      /*
-+       * The timer IRQ doesn't have to know that behind the
-+       * scene we have a 8259A-master in AEOI mode ...
-+       */
-+      irq_desc[0].chip = &ioapic_edge_type;
-+
-+      /*
-+       * Add it to the IO-APIC irq-routing table:
-+       */
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-+      io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      enable_8259A_irq(0);
-+}
-+
-+static inline void UNEXPECTED_IO_APIC(void)
-+{
-+}
-+
-+void __init print_IO_APIC(void)
-+{
-+      int apic, i;
-+      union IO_APIC_reg_00 reg_00;
-+      union IO_APIC_reg_01 reg_01;
-+      union IO_APIC_reg_02 reg_02;
-+      union IO_APIC_reg_03 reg_03;
-+      unsigned long flags;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
-+      for (i = 0; i < nr_ioapics; i++)
-+              printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
-+                     mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
-+
-+      /*
-+       * We are a bit conservative about what we expect.  We have to
-+       * know about every hardware change ASAP.
-+       */
-+      printk(KERN_INFO "testing the IO APIC.......................\n");
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_00.raw = io_apic_read(apic, 0);
-+      reg_01.raw = io_apic_read(apic, 1);
-+      if (reg_01.bits.version >= 0x10)
-+              reg_02.raw = io_apic_read(apic, 2);
-+      if (reg_01.bits.version >= 0x20)
-+              reg_03.raw = io_apic_read(apic, 3);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
-+      printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
-+      printk(KERN_DEBUG ".......    : physical APIC id: %02X\n", reg_00.bits.ID);
-+      printk(KERN_DEBUG ".......    : Delivery Type: %X\n", reg_00.bits.delivery_type);
-+      printk(KERN_DEBUG ".......    : LTS          : %X\n", reg_00.bits.LTS);
-+      if (reg_00.bits.ID >= get_physical_broadcast())
-+              UNEXPECTED_IO_APIC();
-+      if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
-+              UNEXPECTED_IO_APIC();
-+
-+      printk(KERN_DEBUG ".... register #01: %08X\n", reg_01.raw);
-+      printk(KERN_DEBUG ".......     : max redirection entries: %04X\n", reg_01.bits.entries);
-+      if (    (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
-+              (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
-+              (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
-+              (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
-+              (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
-+              (reg_01.bits.entries != 0x2E) &&
-+              (reg_01.bits.entries != 0x3F)
-+      )
-+              UNEXPECTED_IO_APIC();
-+
-+      printk(KERN_DEBUG ".......     : PRQ implemented: %X\n", reg_01.bits.PRQ);
-+      printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.bits.version);
-+      if (    (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
-+              (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
-+              (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
-+              (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
-+              (reg_01.bits.version != 0x20)    /* Intel P64H (82806 AA) */
-+      )
-+              UNEXPECTED_IO_APIC();
-+      if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
-+              UNEXPECTED_IO_APIC();
-+
-+      /*
-+       * Some Intel chipsets with IO APIC VERSION of 0x1? don't have reg_02,
-+       * but the value of reg_02 is read as the previous read register
-+       * value, so ignore it if reg_02 == reg_01.
-+       */
-+      if (reg_01.bits.version >= 0x10 && reg_02.raw != reg_01.raw) {
-+              printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
-+              printk(KERN_DEBUG ".......     : arbitration: %02X\n", reg_02.bits.arbitration);
-+              if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
-+                      UNEXPECTED_IO_APIC();
-+      }
-+
-+      /*
-+       * Some Intel chipsets with IO APIC VERSION of 0x2? don't have reg_02
-+       * or reg_03, but the value of reg_0[23] is read as the previous read
-+       * register value, so ignore it if reg_03 == reg_0[12].
-+       */
-+      if (reg_01.bits.version >= 0x20 && reg_03.raw != reg_02.raw &&
-+          reg_03.raw != reg_01.raw) {
-+              printk(KERN_DEBUG ".... register #03: %08X\n", reg_03.raw);
-+              printk(KERN_DEBUG ".......     : Boot DT    : %X\n", reg_03.bits.boot_DT);
-+              if (reg_03.bits.__reserved_1)
-+                      UNEXPECTED_IO_APIC();
-+      }
-+
-+      printk(KERN_DEBUG ".... IRQ redirection table:\n");
-+
-+      printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
-+                        " Stat Dest Deli Vect:   \n");
-+
-+      for (i = 0; i <= reg_01.bits.entries; i++) {
-+              struct IO_APIC_route_entry entry;
-+
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
-+              *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+              printk(KERN_DEBUG " %02x %03X %02X  ",
-+                      i,
-+                      entry.dest.logical.logical_dest,
-+                      entry.dest.physical.physical_dest
-+              );
-+
-+              printk("%1d    %1d    %1d   %1d   %1d    %1d    %1d    %02X\n",
-+                      entry.mask,
-+                      entry.trigger,
-+                      entry.irr,
-+                      entry.polarity,
-+                      entry.delivery_status,
-+                      entry.dest_mode,
-+                      entry.delivery_mode,
-+                      entry.vector
-+              );
-+      }
-+      }
-+      if (use_pci_vector())
-+              printk(KERN_INFO "Using vector-based indexing\n");
-+      printk(KERN_DEBUG "IRQ to pin mappings:\n");
-+      for (i = 0; i < NR_IRQS; i++) {
-+              struct irq_pin_list *entry = irq_2_pin + i;
-+              if (entry->pin < 0)
-+                      continue;
-+              if (use_pci_vector() && !platform_legacy_irq(i))
-+                      printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
-+              else
-+                      printk(KERN_DEBUG "IRQ%d ", i);
-+              for (;;) {
-+                      printk("-> %d:%d", entry->apic, entry->pin);
-+                      if (!entry->next)
-+                              break;
-+                      entry = irq_2_pin + entry->next;
-+              }
-+              printk("\n");
-+      }
-+
-+      printk(KERN_INFO ".................................... done.\n");
-+
-+      return;
-+}
-+
-+static void print_APIC_bitfield (int base)
-+{
-+      unsigned int v;
-+      int i, j;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
-+      for (i = 0; i < 8; i++) {
-+              v = apic_read(base + i*0x10);
-+              for (j = 0; j < 32; j++) {
-+                      if (v & (1<<j))
-+                              printk("1");
-+                      else
-+                              printk("0");
-+              }
-+              printk("\n");
-+      }
-+}
-+
-+void /*__init*/ print_local_APIC(void * dummy)
-+{
-+      unsigned int v, ver, maxlvt;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
-+              smp_processor_id(), hard_smp_processor_id());
-+      v = apic_read(APIC_ID);
-+      printk(KERN_INFO "... APIC ID:      %08x (%01x)\n", v, GET_APIC_ID(v));
-+      v = apic_read(APIC_LVR);
-+      printk(KERN_INFO "... APIC VERSION: %08x\n", v);
-+      ver = GET_APIC_VERSION(v);
-+      maxlvt = get_maxlvt();
-+
-+      v = apic_read(APIC_TASKPRI);
-+      printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
-+
-+      if (APIC_INTEGRATED(ver)) {                     /* !82489DX */
-+              v = apic_read(APIC_ARBPRI);
-+              printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
-+                      v & APIC_ARBPRI_MASK);
-+              v = apic_read(APIC_PROCPRI);
-+              printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
-+      }
-+
-+      v = apic_read(APIC_EOI);
-+      printk(KERN_DEBUG "... APIC EOI: %08x\n", v);
-+      v = apic_read(APIC_RRR);
-+      printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
-+      v = apic_read(APIC_LDR);
-+      printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
-+      v = apic_read(APIC_DFR);
-+      printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
-+      v = apic_read(APIC_SPIV);
-+      printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
-+
-+      printk(KERN_DEBUG "... APIC ISR field:\n");
-+      print_APIC_bitfield(APIC_ISR);
-+      printk(KERN_DEBUG "... APIC TMR field:\n");
-+      print_APIC_bitfield(APIC_TMR);
-+      printk(KERN_DEBUG "... APIC IRR field:\n");
-+      print_APIC_bitfield(APIC_IRR);
-+
-+      if (APIC_INTEGRATED(ver)) {             /* !82489DX */
-+              if (maxlvt > 3)         /* Due to the Pentium erratum 3AP. */
-+                      apic_write(APIC_ESR, 0);
-+              v = apic_read(APIC_ESR);
-+              printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
-+      }
-+
-+      v = apic_read(APIC_ICR);
-+      printk(KERN_DEBUG "... APIC ICR: %08x\n", v);
-+      v = apic_read(APIC_ICR2);
-+      printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
-+
-+      v = apic_read(APIC_LVTT);
-+      printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
-+
-+      if (maxlvt > 3) {                       /* PC is LVT#4. */
-+              v = apic_read(APIC_LVTPC);
-+              printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
-+      }
-+      v = apic_read(APIC_LVT0);
-+      printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
-+      v = apic_read(APIC_LVT1);
-+      printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
-+
-+      if (maxlvt > 2) {                       /* ERR is LVT#3. */
-+              v = apic_read(APIC_LVTERR);
-+              printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
-+      }
-+
-+      v = apic_read(APIC_TMICT);
-+      printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
-+      v = apic_read(APIC_TMCCT);
-+      printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
-+      v = apic_read(APIC_TDCR);
-+      printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
-+      printk("\n");
-+}
-+
-+void print_all_local_APICs (void)
-+{
-+      on_each_cpu(print_local_APIC, NULL, 1, 1);
-+}
-+
-+void /*__init*/ print_PIC(void)
-+{
-+      unsigned int v;
-+      unsigned long flags;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "\nprinting PIC contents\n");
-+
-+      spin_lock_irqsave(&i8259A_lock, flags);
-+
-+      v = inb(0xa1) << 8 | inb(0x21);
-+      printk(KERN_DEBUG "... PIC  IMR: %04x\n", v);
-+
-+      v = inb(0xa0) << 8 | inb(0x20);
-+      printk(KERN_DEBUG "... PIC  IRR: %04x\n", v);
-+
-+      outb(0x0b,0xa0);
-+      outb(0x0b,0x20);
-+      v = inb(0xa0) << 8 | inb(0x20);
-+      outb(0x0a,0xa0);
-+      outb(0x0a,0x20);
-+
-+      spin_unlock_irqrestore(&i8259A_lock, flags);
-+
-+      printk(KERN_DEBUG "... PIC  ISR: %04x\n", v);
-+
-+      v = inb(0x4d1) << 8 | inb(0x4d0);
-+      printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
-+}
-+#endif /* !CONFIG_XEN */
-+
-+static void __init enable_IO_APIC(void)
-+{
-+      union IO_APIC_reg_01 reg_01;
-+      int i8259_apic, i8259_pin;
-+      int i, apic;
-+      unsigned long flags;
-+
-+      for (i = 0; i < PIN_MAP_SIZE; i++) {
-+              irq_2_pin[i].pin = -1;
-+              irq_2_pin[i].next = 0;
-+      }
-+      if (!pirqs_enabled)
-+              for (i = 0; i < MAX_PIRQS; i++)
-+                      pirq_entries[i] = -1;
-+
-+      /*
-+       * The number of IO-APIC IRQ registers (== #pins):
-+       */
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_01.raw = io_apic_read(apic, 1);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              nr_ioapic_registers[apic] = reg_01.bits.entries+1;
-+      }
-+      for(apic = 0; apic < nr_ioapics; apic++) {
-+              int pin;
-+              /* See if any of the pins is in ExtINT mode */
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+                      struct IO_APIC_route_entry entry;
-+                      spin_lock_irqsave(&ioapic_lock, flags);
-+                      *(((int *)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+                      *(((int *)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+                      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+
-+                      /* If the interrupt line is enabled and in ExtInt mode
-+                       * I have found the pin where the i8259 is connected.
-+                       */
-+                      if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
-+                              ioapic_i8259.apic = apic;
-+                              ioapic_i8259.pin  = pin;
-+                              goto found_i8259;
-+                      }
-+              }
-+      }
-+ found_i8259:
-+      /* Look to see what if the MP table has reported the ExtINT */
-+      /* If we could not find the appropriate pin by looking at the ioapic
-+       * the i8259 probably is not connected the ioapic but give the
-+       * mptable a chance anyway.
-+       */
-+      i8259_pin  = find_isa_irq_pin(0, mp_ExtINT);
-+      i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
-+      /* Trust the MP table if nothing is setup in the hardware */
-+      if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
-+              printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
-+              ioapic_i8259.pin  = i8259_pin;
-+              ioapic_i8259.apic = i8259_apic;
-+      }
-+      /* Complain if the MP table and the hardware disagree */
-+      if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
-+              (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
-+      {
-+              printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
-+      }
-+
-+      /*
-+       * Do not trust the IO-APIC being empty at bootup
-+       */
-+      clear_IO_APIC();
-+}
-+
-+/*
-+ * Not an __init, needed by the reboot code
-+ */
-+void disable_IO_APIC(void)
-+{
-+      /*
-+       * Clear the IO-APIC before rebooting:
-+       */
-+      clear_IO_APIC();
-+
-+#ifndef CONFIG_XEN
-+      /*
-+       * If the i8259 is routed through an IOAPIC
-+       * Put that IOAPIC in virtual wire mode
-+       * so legacy interrupts can be delivered.
-+       */
-+      if (ioapic_i8259.pin != -1) {
-+              struct IO_APIC_route_entry entry;
-+              unsigned long flags;
-+
-+              memset(&entry, 0, sizeof(entry));
-+              entry.mask            = 0; /* Enabled */
-+              entry.trigger         = 0; /* Edge */
-+              entry.irr             = 0;
-+              entry.polarity        = 0; /* High */
-+              entry.delivery_status = 0;
-+              entry.dest_mode       = 0; /* Physical */
-+              entry.delivery_mode   = dest_ExtINT; /* ExtInt */
-+              entry.vector          = 0;
-+              entry.dest.physical.physical_dest =
-+                                      GET_APIC_ID(apic_read(APIC_ID));
-+
-+              /*
-+               * Add it to the IO-APIC irq-routing table:
-+               */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(ioapic_i8259.apic, 0x11+2*ioapic_i8259.pin,
-+                      *(((int *)&entry)+1));
-+              io_apic_write(ioapic_i8259.apic, 0x10+2*ioapic_i8259.pin,
-+                      *(((int *)&entry)+0));
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+      }
-+      disconnect_bsp_APIC(ioapic_i8259.pin != -1);
-+#endif
-+}
-+
-+/*
-+ * function to set the IO-APIC physical IDs based on the
-+ * values stored in the MPC table.
-+ *
-+ * by Matt Domsch <Matt_Domsch@dell.com>  Tue Dec 21 12:25:05 CST 1999
-+ */
-+
-+#if !defined(CONFIG_XEN) && !defined(CONFIG_X86_NUMAQ)
-+static void __init setup_ioapic_ids_from_mpc(void)
-+{
-+      union IO_APIC_reg_00 reg_00;
-+      physid_mask_t phys_id_present_map;
-+      int apic;
-+      int i;
-+      unsigned char old_id;
-+      unsigned long flags;
-+
-+      /*
-+       * Don't check I/O APIC IDs for xAPIC systems.  They have
-+       * no meaning without the serial APIC bus.
-+       */
-+      if (!(boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-+              || APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-+              return;
-+      /*
-+       * This is broken; anything with a real cpu count has to
-+       * circumvent this idiocy regardless.
-+       */
-+      phys_id_present_map = ioapic_phys_id_map(phys_cpu_present_map);
-+
-+      /*
-+       * Set the IOAPIC ID to the value stored in the MPC table.
-+       */
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+
-+              /* Read the register 0 value */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_00.raw = io_apic_read(apic, 0);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              
-+              old_id = mp_ioapics[apic].mpc_apicid;
-+
-+              if (mp_ioapics[apic].mpc_apicid >= get_physical_broadcast()) {
-+                      printk(KERN_ERR "BIOS bug, IO-APIC#%d ID is %d in the MPC table!...\n",
-+                              apic, mp_ioapics[apic].mpc_apicid);
-+                      printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
-+                              reg_00.bits.ID);
-+                      mp_ioapics[apic].mpc_apicid = reg_00.bits.ID;
-+              }
-+
-+              /*
-+               * Sanity check, is the ID really free? Every APIC in a
-+               * system must have a unique ID or we get lots of nice
-+               * 'stuck on smp_invalidate_needed IPI wait' messages.
-+               */
-+              if (check_apicid_used(phys_id_present_map,
-+                                      mp_ioapics[apic].mpc_apicid)) {
-+                      printk(KERN_ERR "BIOS bug, IO-APIC#%d ID %d is already used!...\n",
-+                              apic, mp_ioapics[apic].mpc_apicid);
-+                      for (i = 0; i < get_physical_broadcast(); i++)
-+                              if (!physid_isset(i, phys_id_present_map))
-+                                      break;
-+                      if (i >= get_physical_broadcast())
-+                              panic("Max APIC ID exceeded!\n");
-+                      printk(KERN_ERR "... fixing up to %d. (tell your hw vendor)\n",
-+                              i);
-+                      physid_set(i, phys_id_present_map);
-+                      mp_ioapics[apic].mpc_apicid = i;
-+              } else {
-+                      physid_mask_t tmp;
-+                      tmp = apicid_to_cpu_present(mp_ioapics[apic].mpc_apicid);
-+                      apic_printk(APIC_VERBOSE, "Setting %d in the "
-+                                      "phys_id_present_map\n",
-+                                      mp_ioapics[apic].mpc_apicid);
-+                      physids_or(phys_id_present_map, phys_id_present_map, tmp);
-+              }
-+
-+
-+              /*
-+               * We need to adjust the IRQ routing table
-+               * if the ID changed.
-+               */
-+              if (old_id != mp_ioapics[apic].mpc_apicid)
-+                      for (i = 0; i < mp_irq_entries; i++)
-+                              if (mp_irqs[i].mpc_dstapic == old_id)
-+                                      mp_irqs[i].mpc_dstapic
-+                                              = mp_ioapics[apic].mpc_apicid;
-+
-+              /*
-+               * Read the right value from the MPC table and
-+               * write it into the ID register.
-+               */
-+              apic_printk(APIC_VERBOSE, KERN_INFO
-+                      "...changing IO-APIC physical APIC ID to %d ...",
-+                      mp_ioapics[apic].mpc_apicid);
-+
-+              reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(apic, 0, reg_00.raw);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+              /*
-+               * Sanity check
-+               */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_00.raw = io_apic_read(apic, 0);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
-+                      printk("could not set ID!\n");
-+              else
-+                      apic_printk(APIC_VERBOSE, " ok.\n");
-+      }
-+}
-+#else
-+static void __init setup_ioapic_ids_from_mpc(void) { }
-+#endif
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * There is a nasty bug in some older SMP boards, their mptable lies
-+ * about the timer IRQ. We do the following to work around the situation:
-+ *
-+ *    - timer IRQ defaults to IO-APIC IRQ
-+ *    - if this function detects that timer IRQs are defunct, then we fall
-+ *      back to ISA timer IRQs
-+ */
-+static int __init timer_irq_works(void)
-+{
-+      unsigned long t1 = jiffies;
-+
-+      local_irq_enable();
-+      /* Let ten ticks pass... */
-+      mdelay((10 * 1000) / HZ);
-+
-+      /*
-+       * Expect a few ticks at least, to be sure some possible
-+       * glue logic does not lock up after one or two first
-+       * ticks in a non-ExtINT mode.  Also the local APIC
-+       * might have cached one ExtINT interrupt.  Finally, at
-+       * least one tick may be lost due to delays.
-+       */
-+      if (jiffies - t1 > 4)
-+              return 1;
-+
-+      return 0;
-+}
-+
-+/*
-+ * In the SMP+IOAPIC case it might happen that there are an unspecified
-+ * number of pending IRQ events unhandled. These cases are very rare,
-+ * so we 'resend' these IRQs via IPIs, to the same CPU. It's much
-+ * better to do it this way as thus we do not have to be aware of
-+ * 'pending' interrupts in the IRQ path, except at this point.
-+ */
-+/*
-+ * Edge triggered needs to resend any interrupt
-+ * that was delayed but this is now handled in the device
-+ * independent code.
-+ */
-+
-+/*
-+ * Starting up a edge-triggered IO-APIC interrupt is
-+ * nasty - we need to make sure that we get the edge.
-+ * If it is already asserted for some reason, we need
-+ * return 1 to indicate that is was pending.
-+ *
-+ * This is not complete - we should be able to fake
-+ * an edge even if it isn't on the 8259A...
-+ */
-+static unsigned int startup_edge_ioapic_irq(unsigned int irq)
-+{
-+      int was_pending = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      if (irq < 16) {
-+              disable_8259A_irq(irq);
-+              if (i8259A_irq_pending(irq))
-+                      was_pending = 1;
-+      }
-+      __unmask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return was_pending;
-+}
-+
-+/*
-+ * Once we have recorded IRQ_PENDING already, we can mask the
-+ * interrupt for real. This prevents IRQ storms from unhandled
-+ * devices.
-+ */
-+static void ack_edge_ioapic_irq(unsigned int irq)
-+{
-+      move_irq(irq);
-+      if ((irq_desc[irq].status & (IRQ_PENDING | IRQ_DISABLED))
-+                                      == (IRQ_PENDING | IRQ_DISABLED))
-+              mask_IO_APIC_irq(irq);
-+      ack_APIC_irq();
-+}
-+
-+/*
-+ * Level triggered interrupts can just be masked,
-+ * and shutting down and starting up the interrupt
-+ * is the same as enabling and disabling them -- except
-+ * with a startup need to return a "was pending" value.
-+ *
-+ * Level triggered interrupts are special because we
-+ * do not touch any IO-APIC register while handling
-+ * them. We ack the APIC in the end-IRQ handler, not
-+ * in the start-IRQ-handler. Protection against reentrance
-+ * from the same interrupt is still provided, both by the
-+ * generic IRQ layer and by the fact that an unacked local
-+ * APIC does not accept IRQs.
-+ */
-+static unsigned int startup_level_ioapic_irq (unsigned int irq)
-+{
-+      unmask_IO_APIC_irq(irq);
-+
-+      return 0; /* don't check for pending */
-+}
-+
-+static void end_level_ioapic_irq (unsigned int irq)
-+{
-+      unsigned long v;
-+      int i;
-+
-+      move_irq(irq);
-+/*
-+ * It appears there is an erratum which affects at least version 0x11
-+ * of I/O APIC (that's the 82093AA and cores integrated into various
-+ * chipsets).  Under certain conditions a level-triggered interrupt is
-+ * erroneously delivered as edge-triggered one but the respective IRR
-+ * bit gets set nevertheless.  As a result the I/O unit expects an EOI
-+ * message but it will never arrive and further interrupts are blocked
-+ * from the source.  The exact reason is so far unknown, but the
-+ * phenomenon was observed when two consecutive interrupt requests
-+ * from a given source get delivered to the same CPU and the source is
-+ * temporarily disabled in between.
-+ *
-+ * A workaround is to simulate an EOI message manually.  We achieve it
-+ * by setting the trigger mode to edge and then to level when the edge
-+ * trigger mode gets detected in the TMR of a local APIC for a
-+ * level-triggered interrupt.  We mask the source for the time of the
-+ * operation to prevent an edge-triggered interrupt escaping meanwhile.
-+ * The idea is from Manfred Spraul.  --macro
-+ */
-+      i = IO_APIC_VECTOR(irq);
-+
-+      v = apic_read(APIC_TMR + ((i & ~0x1f) >> 1));
-+
-+      ack_APIC_irq();
-+
-+      if (!(v & (1 << (i & 0x1f)))) {
-+              atomic_inc(&irq_mis_count);
-+              spin_lock(&ioapic_lock);
-+              __mask_and_edge_IO_APIC_irq(irq);
-+              __unmask_and_level_IO_APIC_irq(irq);
-+              spin_unlock(&ioapic_lock);
-+      }
-+}
-+
-+#ifdef CONFIG_PCI_MSI
-+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      return startup_edge_ioapic_irq(irq);
-+}
-+
-+static void ack_edge_ioapic_vector(unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      move_native_irq(vector);
-+      ack_edge_ioapic_irq(irq);
-+}
-+
-+static unsigned int startup_level_ioapic_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      return startup_level_ioapic_irq (irq);
-+}
-+
-+static void end_level_ioapic_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      move_native_irq(vector);
-+      end_level_ioapic_irq(irq);
-+}
-+
-+static void mask_IO_APIC_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      mask_IO_APIC_irq(irq);
-+}
-+
-+static void unmask_IO_APIC_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      unmask_IO_APIC_irq(irq);
-+}
-+
-+#ifdef CONFIG_SMP
-+static void set_ioapic_affinity_vector (unsigned int vector,
-+                                      cpumask_t cpu_mask)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      set_native_irq_info(vector, cpu_mask);
-+      set_ioapic_affinity_irq(irq, cpu_mask);
-+}
-+#endif
-+#endif
-+
-+static int ioapic_retrigger(unsigned int irq)
-+{
-+      send_IPI_self(IO_APIC_VECTOR(irq));
-+
-+      return 1;
-+}
-+
-+/*
-+ * Level and edge triggered IO-APIC interrupts need different handling,
-+ * so we use two separate IRQ descriptors. Edge triggered IRQs can be
-+ * handled with the level-triggered descriptor, but that one has slightly
-+ * more overhead. Level-triggered interrupts cannot be handled with the
-+ * edge-triggered handler, without risking IRQ storms and other ugly
-+ * races.
-+ */
-+static struct hw_interrupt_type ioapic_edge_type __read_mostly = {
-+      .typename       = "IO-APIC-edge",
-+      .startup        = startup_edge_ioapic,
-+      .shutdown       = shutdown_edge_ioapic,
-+      .enable         = enable_edge_ioapic,
-+      .disable        = disable_edge_ioapic,
-+      .ack            = ack_edge_ioapic,
-+      .end            = end_edge_ioapic,
-+#ifdef CONFIG_SMP
-+      .set_affinity   = set_ioapic_affinity,
-+#endif
-+      .retrigger      = ioapic_retrigger,
-+};
-+
-+static struct hw_interrupt_type ioapic_level_type __read_mostly = {
-+      .typename       = "IO-APIC-level",
-+      .startup        = startup_level_ioapic,
-+      .shutdown       = shutdown_level_ioapic,
-+      .enable         = enable_level_ioapic,
-+      .disable        = disable_level_ioapic,
-+      .ack            = mask_and_ack_level_ioapic,
-+      .end            = end_level_ioapic,
-+#ifdef CONFIG_SMP
-+      .set_affinity   = set_ioapic_affinity,
-+#endif
-+      .retrigger      = ioapic_retrigger,
-+};
-+#endif /* !CONFIG_XEN */
-+
-+static inline void init_IO_APIC_traps(void)
-+{
-+      int irq;
-+
-+      /*
-+       * NOTE! The local APIC isn't very good at handling
-+       * multiple interrupts at the same interrupt level.
-+       * As the interrupt level is determined by taking the
-+       * vector number and shifting that right by 4, we
-+       * want to spread these out a bit so that they don't
-+       * all fall in the same interrupt level.
-+       *
-+       * Also, we've got to be careful not to trash gate
-+       * 0x80, because int 0x80 is hm, kind of importantish. ;)
-+       */
-+      for (irq = 0; irq < NR_IRQS ; irq++) {
-+              int tmp = irq;
-+              if (use_pci_vector()) {
-+                      if (!platform_legacy_irq(tmp))
-+                              if ((tmp = vector_to_irq(tmp)) == -1)
-+                                      continue;
-+              }
-+              if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
-+                      /*
-+                       * Hmm.. We don't have an entry for this,
-+                       * so default to an old-fashioned 8259
-+                       * interrupt if we can..
-+                       */
-+                      if (irq < 16)
-+                              make_8259A_irq(irq);
-+#ifndef CONFIG_XEN
-+                      else
-+                              /* Strange. Oh, well.. */
-+                              irq_desc[irq].chip = &no_irq_type;
-+#endif
-+              }
-+      }
-+}
-+
-+#ifndef CONFIG_XEN
-+static void enable_lapic_irq (unsigned int irq)
-+{
-+      unsigned long v;
-+
-+      v = apic_read(APIC_LVT0);
-+      apic_write_around(APIC_LVT0, v & ~APIC_LVT_MASKED);
-+}
-+
-+static void disable_lapic_irq (unsigned int irq)
-+{
-+      unsigned long v;
-+
-+      v = apic_read(APIC_LVT0);
-+      apic_write_around(APIC_LVT0, v | APIC_LVT_MASKED);
-+}
-+
-+static void ack_lapic_irq (unsigned int irq)
-+{
-+      ack_APIC_irq();
-+}
-+
-+static void end_lapic_irq (unsigned int i) { /* nothing */ }
-+
-+static struct hw_interrupt_type lapic_irq_type __read_mostly = {
-+      .typename       = "local-APIC-edge",
-+      .startup        = NULL, /* startup_irq() not used for IRQ0 */
-+      .shutdown       = NULL, /* shutdown_irq() not used for IRQ0 */
-+      .enable         = enable_lapic_irq,
-+      .disable        = disable_lapic_irq,
-+      .ack            = ack_lapic_irq,
-+      .end            = end_lapic_irq
-+};
-+
-+static void setup_nmi (void)
-+{
-+      /*
-+       * Dirty trick to enable the NMI watchdog ...
-+       * We put the 8259A master into AEOI mode and
-+       * unmask on all local APICs LVT0 as NMI.
-+       *
-+       * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire')
-+       * is from Maciej W. Rozycki - so we do not have to EOI from
-+       * the NMI handler or the timer interrupt.
-+       */ 
-+      apic_printk(APIC_VERBOSE, KERN_INFO "activating NMI Watchdog ...");
-+
-+      on_each_cpu(enable_NMI_through_LVT0, NULL, 1, 1);
-+
-+      apic_printk(APIC_VERBOSE, " done.\n");
-+}
-+
-+/*
-+ * This looks a bit hackish but it's about the only one way of sending
-+ * a few INTA cycles to 8259As and any associated glue logic.  ICR does
-+ * not support the ExtINT mode, unfortunately.  We need to send these
-+ * cycles as some i82489DX-based boards have glue logic that keeps the
-+ * 8259A interrupt line asserted until INTA.  --macro
-+ */
-+static inline void unlock_ExtINT_logic(void)
-+{
-+      int apic, pin, i;
-+      struct IO_APIC_route_entry entry0, entry1;
-+      unsigned char save_control, save_freq_select;
-+      unsigned long flags;
-+
-+      pin  = find_isa_irq_pin(8, mp_INT);
-+      apic = find_isa_irq_apic(8, mp_INT);
-+      if (pin == -1)
-+              return;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      *(((int *)&entry0) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+      *(((int *)&entry0) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+      clear_IO_APIC_pin(apic, pin);
-+
-+      memset(&entry1, 0, sizeof(entry1));
-+
-+      entry1.dest_mode = 0;                   /* physical delivery */
-+      entry1.mask = 0;                        /* unmask IRQ now */
-+      entry1.dest.physical.physical_dest = hard_smp_processor_id();
-+      entry1.delivery_mode = dest_ExtINT;
-+      entry1.polarity = entry0.polarity;
-+      entry1.trigger = 0;
-+      entry1.vector = 0;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry1) + 1));
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry1) + 0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      save_control = CMOS_READ(RTC_CONTROL);
-+      save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
-+      CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
-+                 RTC_FREQ_SELECT);
-+      CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
-+
-+      i = 100;
-+      while (i-- > 0) {
-+              mdelay(10);
-+              if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
-+                      i -= 10;
-+      }
-+
-+      CMOS_WRITE(save_control, RTC_CONTROL);
-+      CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-+      clear_IO_APIC_pin(apic, pin);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry0) + 1));
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry0) + 0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+int timer_uses_ioapic_pin_0;
-+
-+/*
-+ * This code may look a bit paranoid, but it's supposed to cooperate with
-+ * a wide range of boards and BIOS bugs.  Fortunately only the timer IRQ
-+ * is so screwy.  Thanks to Brian Perkins for testing/hacking this beast
-+ * fanatically on his truly buggy board.
-+ */
-+static inline void check_timer(void)
-+{
-+      int apic1, pin1, apic2, pin2;
-+      int vector;
-+
-+      /*
-+       * get/set the timer IRQ vector:
-+       */
-+      disable_8259A_irq(0);
-+      vector = assign_irq_vector(0);
-+      set_intr_gate(vector, interrupt[0]);
-+
-+      /*
-+       * Subtle, code in do_timer_interrupt() expects an AEOI
-+       * mode for the 8259A whenever interrupts are routed
-+       * through I/O APICs.  Also IRQ0 has to be enabled in
-+       * the 8259A which implies the virtual wire has to be
-+       * disabled in the local APIC.
-+       */
-+      apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-+      init_8259A(1);
-+      timer_ack = 1;
-+      if (timer_over_8254 > 0)
-+              enable_8259A_irq(0);
-+
-+      pin1  = find_isa_irq_pin(0, mp_INT);
-+      apic1 = find_isa_irq_apic(0, mp_INT);
-+      pin2  = ioapic_i8259.pin;
-+      apic2 = ioapic_i8259.apic;
-+
-+      if (pin1 == 0)
-+              timer_uses_ioapic_pin_0 = 1;
-+
-+      printk(KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
-+              vector, apic1, pin1, apic2, pin2);
-+
-+      if (pin1 != -1) {
-+              /*
-+               * Ok, does IRQ0 through the IOAPIC work?
-+               */
-+              unmask_IO_APIC_irq(0);
-+              if (timer_irq_works()) {
-+                      if (nmi_watchdog == NMI_IO_APIC) {
-+                              disable_8259A_irq(0);
-+                              setup_nmi();
-+                              enable_8259A_irq(0);
-+                      }
-+                      if (disable_timer_pin_1 > 0)
-+                              clear_IO_APIC_pin(0, pin1);
-+                      return;
-+              }
-+              clear_IO_APIC_pin(apic1, pin1);
-+              printk(KERN_ERR "..MP-BIOS bug: 8254 timer not connected to "
-+                              "IO-APIC\n");
-+      }
-+
-+      printk(KERN_INFO "...trying to set up timer (IRQ0) through the 8259A ... ");
-+      if (pin2 != -1) {
-+              printk("\n..... (found pin %d) ...", pin2);
-+              /*
-+               * legacy devices should be connected to IO APIC #0
-+               */
-+              setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
-+              if (timer_irq_works()) {
-+                      printk("works.\n");
-+                      if (pin1 != -1)
-+                              replace_pin_at_irq(0, apic1, pin1, apic2, pin2);
-+                      else
-+                              add_pin_to_irq(0, apic2, pin2);
-+                      if (nmi_watchdog == NMI_IO_APIC) {
-+                              setup_nmi();
-+                      }
-+                      return;
-+              }
-+              /*
-+               * Cleanup, just in case ...
-+               */
-+              clear_IO_APIC_pin(apic2, pin2);
-+      }
-+      printk(" failed.\n");
-+
-+      if (nmi_watchdog == NMI_IO_APIC) {
-+              printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
-+              nmi_watchdog = 0;
-+      }
-+
-+      printk(KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
-+
-+      disable_8259A_irq(0);
-+      irq_desc[0].chip = &lapic_irq_type;
-+      apic_write_around(APIC_LVT0, APIC_DM_FIXED | vector);   /* Fixed mode */
-+      enable_8259A_irq(0);
-+
-+      if (timer_irq_works()) {
-+              printk(" works.\n");
-+              return;
-+      }
-+      apic_write_around(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
-+      printk(" failed.\n");
-+
-+      printk(KERN_INFO "...trying to set up timer as ExtINT IRQ...");
-+
-+      timer_ack = 0;
-+      init_8259A(0);
-+      make_8259A_irq(0);
-+      apic_write_around(APIC_LVT0, APIC_DM_EXTINT);
-+
-+      unlock_ExtINT_logic();
-+
-+      if (timer_irq_works()) {
-+              printk(" works.\n");
-+              return;
-+      }
-+      printk(" failed :(.\n");
-+      panic("IO-APIC + timer doesn't work!  Boot with apic=debug and send a "
-+              "report.  Then try booting with the 'noapic' option");
-+}
-+#else
-+int timer_uses_ioapic_pin_0 = 0;
-+#define check_timer() ((void)0)
-+#endif
-+
-+/*
-+ *
-+ * IRQ's that are handled by the PIC in the MPS IOAPIC case.
-+ * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
-+ *   Linux doesn't really care, as it's not actually used
-+ *   for any interrupt handling anyway.
-+ */
-+#define PIC_IRQS      (1 << PIC_CASCADE_IR)
-+
-+void __init setup_IO_APIC(void)
-+{
-+      enable_IO_APIC();
-+
-+      if (acpi_ioapic)
-+              io_apic_irqs = ~0;      /* all IRQs go through IOAPIC */
-+      else
-+              io_apic_irqs = ~PIC_IRQS;
-+
-+      printk("ENABLING IO-APIC IRQs\n");
-+
-+      /*
-+       * Set up IO-APIC IRQ routing.
-+       */
-+      if (!acpi_ioapic)
-+              setup_ioapic_ids_from_mpc();
-+#ifndef CONFIG_XEN
-+      sync_Arb_IDs();
-+#endif
-+      setup_IO_APIC_irqs();
-+      init_IO_APIC_traps();
-+      check_timer();
-+      if (!acpi_ioapic)
-+              print_IO_APIC();
-+}
-+
-+static int __init setup_disable_8254_timer(char *s)
-+{
-+      timer_over_8254 = -1;
-+      return 1;
-+}
-+static int __init setup_enable_8254_timer(char *s)
-+{
-+      timer_over_8254 = 2;
-+      return 1;
-+}
-+
-+__setup("disable_8254_timer", setup_disable_8254_timer);
-+__setup("enable_8254_timer", setup_enable_8254_timer);
-+
-+/*
-+ *    Called after all the initialization is done. If we didnt find any
-+ *    APIC bugs then we can allow the modify fast path
-+ */
-+ 
-+static int __init io_apic_bug_finalize(void)
-+{
-+      if(sis_apic_bug == -1)
-+              sis_apic_bug = 0;
-+      if (is_initial_xendomain()) {
-+              struct xen_platform_op op = { .cmd = XENPF_platform_quirk };
-+              op.u.platform_quirk.quirk_id = sis_apic_bug ?
-+                      QUIRK_IOAPIC_BAD_REGSEL : QUIRK_IOAPIC_GOOD_REGSEL;
-+              VOID(HYPERVISOR_platform_op(&op));
-+      }
-+      return 0;
-+}
-+
-+late_initcall(io_apic_bug_finalize);
-+
-+struct sysfs_ioapic_data {
-+      struct sys_device dev;
-+      struct IO_APIC_route_entry entry[0];
-+};
-+static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
-+
-+static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
-+{
-+      struct IO_APIC_route_entry *entry;
-+      struct sysfs_ioapic_data *data;
-+      unsigned long flags;
-+      int i;
-+      
-+      data = container_of(dev, struct sysfs_ioapic_data, dev);
-+      entry = data->entry;
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-+              *(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i);
-+              *(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i);
-+      }
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+static int ioapic_resume(struct sys_device *dev)
-+{
-+      struct IO_APIC_route_entry *entry;
-+      struct sysfs_ioapic_data *data;
-+      unsigned long flags;
-+      union IO_APIC_reg_00 reg_00;
-+      int i;
-+      
-+      data = container_of(dev, struct sysfs_ioapic_data, dev);
-+      entry = data->entry;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_00.raw = io_apic_read(dev->id, 0);
-+      if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
-+              reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
-+              io_apic_write(dev->id, 0, reg_00.raw);
-+      }
-+      for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-+              io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1));
-+              io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0));
-+      }
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+static struct sysdev_class ioapic_sysdev_class = {
-+      set_kset_name("ioapic"),
-+#ifndef CONFIG_XEN
-+      .suspend = ioapic_suspend,
-+      .resume = ioapic_resume,
-+#endif
-+};
-+
-+static int __init ioapic_init_sysfs(void)
-+{
-+      struct sys_device * dev;
-+      int i, size, error = 0;
-+
-+      error = sysdev_class_register(&ioapic_sysdev_class);
-+      if (error)
-+              return error;
-+
-+      for (i = 0; i < nr_ioapics; i++ ) {
-+              size = sizeof(struct sys_device) + nr_ioapic_registers[i] 
-+                      * sizeof(struct IO_APIC_route_entry);
-+              mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
-+              if (!mp_ioapic_data[i]) {
-+                      printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-+                      continue;
-+              }
-+              memset(mp_ioapic_data[i], 0, size);
-+              dev = &mp_ioapic_data[i]->dev;
-+              dev->id = i; 
-+              dev->cls = &ioapic_sysdev_class;
-+              error = sysdev_register(dev);
-+              if (error) {
-+                      kfree(mp_ioapic_data[i]);
-+                      mp_ioapic_data[i] = NULL;
-+                      printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-+                      continue;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+device_initcall(ioapic_init_sysfs);
-+
-+/* --------------------------------------------------------------------------
-+                          ACPI-based IOAPIC Configuration
-+   -------------------------------------------------------------------------- */
-+
-+#ifdef CONFIG_ACPI
-+
-+int __init io_apic_get_unique_id (int ioapic, int apic_id)
-+{
-+#ifndef CONFIG_XEN
-+      union IO_APIC_reg_00 reg_00;
-+      static physid_mask_t apic_id_map = PHYSID_MASK_NONE;
-+      physid_mask_t tmp;
-+      unsigned long flags;
-+      int i = 0;
-+
-+      /*
-+       * The P4 platform supports up to 256 APIC IDs on two separate APIC 
-+       * buses (one for LAPICs, one for IOAPICs), where predecessors only 
-+       * supports up to 16 on one shared APIC bus.
-+       * 
-+       * TBD: Expand LAPIC/IOAPIC support on P4-class systems to take full
-+       *      advantage of new APIC bus architecture.
-+       */
-+
-+      if (physids_empty(apic_id_map))
-+              apic_id_map = ioapic_phys_id_map(phys_cpu_present_map);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_00.raw = io_apic_read(ioapic, 0);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      if (apic_id >= get_physical_broadcast()) {
-+              printk(KERN_WARNING "IOAPIC[%d]: Invalid apic_id %d, trying "
-+                      "%d\n", ioapic, apic_id, reg_00.bits.ID);
-+              apic_id = reg_00.bits.ID;
-+      }
-+
-+      /*
-+       * Every APIC in a system must have a unique ID or we get lots of nice 
-+       * 'stuck on smp_invalidate_needed IPI wait' messages.
-+       */
-+      if (check_apicid_used(apic_id_map, apic_id)) {
-+
-+              for (i = 0; i < get_physical_broadcast(); i++) {
-+                      if (!check_apicid_used(apic_id_map, i))
-+                              break;
-+              }
-+
-+              if (i == get_physical_broadcast())
-+                      panic("Max apic_id exceeded!\n");
-+
-+              printk(KERN_WARNING "IOAPIC[%d]: apic_id %d already used, "
-+                      "trying %d\n", ioapic, apic_id, i);
-+
-+              apic_id = i;
-+      } 
-+
-+      tmp = apicid_to_cpu_present(apic_id);
-+      physids_or(apic_id_map, apic_id_map, tmp);
-+
-+      if (reg_00.bits.ID != apic_id) {
-+              reg_00.bits.ID = apic_id;
-+
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(ioapic, 0, reg_00.raw);
-+              reg_00.raw = io_apic_read(ioapic, 0);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+              /* Sanity check */
-+              if (reg_00.bits.ID != apic_id) {
-+                      printk("IOAPIC[%d]: Unable to change apic_id!\n", ioapic);
-+                      return -1;
-+              }
-+      }
-+
-+      apic_printk(APIC_VERBOSE, KERN_INFO
-+                      "IOAPIC[%d]: Assigned apic_id %d\n", ioapic, apic_id);
-+#endif /* !CONFIG_XEN */
-+
-+      return apic_id;
-+}
-+
-+
-+int __init io_apic_get_version (int ioapic)
-+{
-+      union IO_APIC_reg_01    reg_01;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_01.raw = io_apic_read(ioapic, 1);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return reg_01.bits.version;
-+}
-+
-+
-+int __init io_apic_get_redir_entries (int ioapic)
-+{
-+      union IO_APIC_reg_01    reg_01;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_01.raw = io_apic_read(ioapic, 1);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return reg_01.bits.entries;
-+}
-+
-+
-+int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+
-+      if (!IO_APIC_IRQ(irq)) {
-+              printk(KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
-+                      ioapic);
-+              return -EINVAL;
-+      }
-+
-+      /*
-+       * Generate a PCI IRQ routing entry and program the IOAPIC accordingly.
-+       * Note that we mask (disable) IRQs now -- these get enabled when the
-+       * corresponding device driver registers for this IRQ.
-+       */
-+
-+      memset(&entry,0,sizeof(entry));
-+
-+      entry.delivery_mode = INT_DELIVERY_MODE;
-+      entry.dest_mode = INT_DEST_MODE;
-+      entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+      entry.trigger = edge_level;
-+      entry.polarity = active_high_low;
-+      entry.mask  = 1;
-+
-+      /*
-+       * IRQs < 16 are already in the irq_2_pin[] map
-+       */
-+      if (irq >= 16)
-+              add_pin_to_irq(irq, ioapic, pin);
-+
-+      entry.vector = assign_irq_vector(irq);
-+
-+      apic_printk(APIC_DEBUG, KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry "
-+              "(%d-%d -> 0x%x -> IRQ %d Mode:%i Active:%i)\n", ioapic,
-+              mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
-+              edge_level, active_high_low);
-+
-+      ioapic_register_intr(irq, entry.vector, edge_level);
-+
-+      if (!ioapic && (irq < 16))
-+              disable_8259A_irq(irq);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
-+      io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
-+      set_native_irq_info(use_pci_vector() ? entry.vector : irq, TARGET_CPUS);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+#endif /* CONFIG_ACPI */
-Index: head-2008-11-25/arch/x86/kernel/ioport_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/ioport_32-xen.c    2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,123 @@
-+/*
-+ *    linux/arch/i386/kernel/ioport.c
-+ *
-+ * This contains the io-permission bitmap code - written by obz, with changes
-+ * by Linus.
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/capability.h>
-+#include <linux/errno.h>
-+#include <linux/types.h>
-+#include <linux/ioport.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/stddef.h>
-+#include <linux/slab.h>
-+#include <linux/thread_info.h>
-+#include <xen/interface/physdev.h>
-+
-+/* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
-+static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
-+{
-+      unsigned long mask;
-+      unsigned long *bitmap_base = bitmap + (base / BITS_PER_LONG);
-+      unsigned int low_index = base & (BITS_PER_LONG-1);
-+      int length = low_index + extent;
-+
-+      if (low_index != 0) {
-+              mask = (~0UL << low_index);
-+              if (length < BITS_PER_LONG)
-+                      mask &= ~(~0UL << length);
-+              if (new_value)
-+                      *bitmap_base++ |= mask;
-+              else
-+                      *bitmap_base++ &= ~mask;
-+              length -= BITS_PER_LONG;
-+      }
-+
-+      mask = (new_value ? ~0UL : 0UL);
-+      while (length >= BITS_PER_LONG) {
-+              *bitmap_base++ = mask;
-+              length -= BITS_PER_LONG;
-+      }
-+
-+      if (length > 0) {
-+              mask = ~(~0UL << length);
-+              if (new_value)
-+                      *bitmap_base++ |= mask;
-+              else
-+                      *bitmap_base++ &= ~mask;
-+      }
-+}
-+
-+
-+/*
-+ * this changes the io permissions bitmap in the current task.
-+ */
-+asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-+{
-+      struct thread_struct * t = &current->thread;
-+      unsigned long *bitmap;
-+      struct physdev_set_iobitmap set_iobitmap;
-+
-+      if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
-+              return -EINVAL;
-+      if (turn_on && !capable(CAP_SYS_RAWIO))
-+              return -EPERM;
-+
-+      /*
-+       * If it's the first ioperm() call in this thread's lifetime, set the
-+       * IO bitmap up. ioperm() is much less timing critical than clone(),
-+       * this is why we delay this operation until now:
-+       */
-+      if (!t->io_bitmap_ptr) {
-+              bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-+              if (!bitmap)
-+                      return -ENOMEM;
-+
-+              memset(bitmap, 0xff, IO_BITMAP_BYTES);
-+              t->io_bitmap_ptr = bitmap;
-+              set_thread_flag(TIF_IO_BITMAP);
-+
-+              set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
-+              set_iobitmap.nr_ports = IO_BITMAP_BITS;
-+              WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
-+                                            &set_iobitmap));
-+      }
-+
-+      set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
-+
-+      return 0;
-+}
-+
-+/*
-+ * sys_iopl has to be used when you want to access the IO ports
-+ * beyond the 0x3ff range: to get the full 65536 ports bitmapped
-+ * you'd need 8kB of bitmaps/process, which is a bit excessive.
-+ *
-+ * Here we just change the eflags value on the stack: we allow
-+ * only the super-user to do it. This depends on the stack-layout
-+ * on system-call entry - see also fork() and the signal handling
-+ * code.
-+ */
-+
-+asmlinkage long sys_iopl(unsigned long unused)
-+{
-+      volatile struct pt_regs * regs = (struct pt_regs *) &unused;
-+      unsigned int level = regs->ebx;
-+      struct thread_struct *t = &current->thread;
-+      unsigned int old = (t->iopl >> 12) & 3;
-+
-+      if (level > 3)
-+              return -EINVAL;
-+      /* Trying to gain more privileges? */
-+      if (level > old) {
-+              if (!capable(CAP_SYS_RAWIO))
-+                      return -EPERM;
-+      }
-+      t->iopl = level << 12;
-+      set_iopl_mask(t->iopl);
-+      return 0;
-+}
-Index: head-2008-11-25/arch/x86/kernel/irq_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/irq_32-xen.c       2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,324 @@
-+/*
-+ *    linux/arch/i386/kernel/irq.c
-+ *
-+ *    Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
-+ *
-+ * This file contains the lowest level x86-specific interrupt
-+ * entry, irq-stacks and irq statistics code. All the remaining
-+ * irq logic is done by the generic kernel/irq/ code and
-+ * by the x86-specific irq controller code. (e.g. i8259.c and
-+ * io_apic.c.)
-+ */
-+
-+#include <asm/uaccess.h>
-+#include <linux/module.h>
-+#include <linux/seq_file.h>
-+#include <linux/interrupt.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/notifier.h>
-+#include <linux/cpu.h>
-+#include <linux/delay.h>
-+
-+DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
-+EXPORT_PER_CPU_SYMBOL(irq_stat);
-+
-+#ifndef CONFIG_X86_LOCAL_APIC
-+/*
-+ * 'what should we do if we get a hw irq event on an illegal vector'.
-+ * each architecture has to answer this themselves.
-+ */
-+void ack_bad_irq(unsigned int irq)
-+{
-+      printk("unexpected IRQ trap at vector %02x\n", irq);
-+}
-+#endif
-+
-+#ifdef CONFIG_4KSTACKS
-+/*
-+ * per-CPU IRQ handling contexts (thread information and stack)
-+ */
-+union irq_ctx {
-+      struct thread_info      tinfo;
-+      u32                     stack[THREAD_SIZE/sizeof(u32)];
-+};
-+
-+static union irq_ctx *hardirq_ctx[NR_CPUS] __read_mostly;
-+static union irq_ctx *softirq_ctx[NR_CPUS] __read_mostly;
-+#endif
-+
-+/*
-+ * do_IRQ handles all normal device IRQ's (the special
-+ * SMP cross-CPU interrupts have their own specific
-+ * handlers).
-+ */
-+fastcall unsigned int do_IRQ(struct pt_regs *regs)
-+{     
-+      /* high bit used in ret_from_ code */
-+      int irq = ~regs->orig_eax;
-+#ifdef CONFIG_4KSTACKS
-+      union irq_ctx *curctx, *irqctx;
-+      u32 *isp;
-+#endif
-+
-+      if (unlikely((unsigned)irq >= NR_IRQS)) {
-+              printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
-+                                      __FUNCTION__, irq);
-+              BUG();
-+      }
-+
-+      /*irq_enter();*/
-+#ifdef CONFIG_DEBUG_STACKOVERFLOW
-+      /* Debugging check for stack overflow: is there less than 1KB free? */
-+      {
-+              long esp;
-+
-+              __asm__ __volatile__("andl %%esp,%0" :
-+                                      "=r" (esp) : "0" (THREAD_SIZE - 1));
-+              if (unlikely(esp < (sizeof(struct thread_info) + STACK_WARN))) {
-+                      printk("do_IRQ: stack overflow: %ld\n",
-+                              esp - sizeof(struct thread_info));
-+                      dump_stack();
-+              }
-+      }
-+#endif
-+
-+#ifdef CONFIG_4KSTACKS
-+
-+      curctx = (union irq_ctx *) current_thread_info();
-+      irqctx = hardirq_ctx[smp_processor_id()];
-+
-+      /*
-+       * this is where we switch to the IRQ stack. However, if we are
-+       * already using the IRQ stack (because we interrupted a hardirq
-+       * handler) we can't do that and just have to keep using the
-+       * current stack (which is the irq stack already after all)
-+       */
-+      if (curctx != irqctx) {
-+              int arg1, arg2, ebx;
-+
-+              /* build the stack frame on the IRQ stack */
-+              isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
-+              irqctx->tinfo.task = curctx->tinfo.task;
-+              irqctx->tinfo.previous_esp = current_stack_pointer;
-+
-+              /*
-+               * Copy the softirq bits in preempt_count so that the
-+               * softirq checks work in the hardirq context.
-+               */
-+              irqctx->tinfo.preempt_count =
-+                      (irqctx->tinfo.preempt_count & ~SOFTIRQ_MASK) |
-+                      (curctx->tinfo.preempt_count & SOFTIRQ_MASK);
-+
-+              asm volatile(
-+                      "       xchgl   %%ebx,%%esp      \n"
-+                      "       call    __do_IRQ         \n"
-+                      "       movl   %%ebx,%%esp      \n"
-+                      : "=a" (arg1), "=d" (arg2), "=b" (ebx)
-+                      :  "0" (irq),   "1" (regs),  "2" (isp)
-+                      : "memory", "cc", "ecx"
-+              );
-+      } else
-+#endif
-+              __do_IRQ(irq, regs);
-+
-+      /*irq_exit();*/
-+
-+      return 1;
-+}
-+
-+#ifdef CONFIG_4KSTACKS
-+
-+/*
-+ * These should really be __section__(".bss.page_aligned") as well, but
-+ * gcc's 3.0 and earlier don't handle that correctly.
-+ */
-+static char softirq_stack[NR_CPUS * THREAD_SIZE]
-+              __attribute__((__aligned__(THREAD_SIZE)));
-+
-+static char hardirq_stack[NR_CPUS * THREAD_SIZE]
-+              __attribute__((__aligned__(THREAD_SIZE)));
-+
-+/*
-+ * allocate per-cpu stacks for hardirq and for softirq processing
-+ */
-+void irq_ctx_init(int cpu)
-+{
-+      union irq_ctx *irqctx;
-+
-+      if (hardirq_ctx[cpu])
-+              return;
-+
-+      irqctx = (union irq_ctx*) &hardirq_stack[cpu*THREAD_SIZE];
-+      irqctx->tinfo.task              = NULL;
-+      irqctx->tinfo.exec_domain       = NULL;
-+      irqctx->tinfo.cpu               = cpu;
-+      irqctx->tinfo.preempt_count     = HARDIRQ_OFFSET;
-+      irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
-+
-+      hardirq_ctx[cpu] = irqctx;
-+
-+      irqctx = (union irq_ctx*) &softirq_stack[cpu*THREAD_SIZE];
-+      irqctx->tinfo.task              = NULL;
-+      irqctx->tinfo.exec_domain       = NULL;
-+      irqctx->tinfo.cpu               = cpu;
-+      irqctx->tinfo.preempt_count     = 0;
-+      irqctx->tinfo.addr_limit        = MAKE_MM_SEG(0);
-+
-+      softirq_ctx[cpu] = irqctx;
-+
-+      printk("CPU %u irqstacks, hard=%p soft=%p\n",
-+              cpu,hardirq_ctx[cpu],softirq_ctx[cpu]);
-+}
-+
-+void irq_ctx_exit(int cpu)
-+{
-+      hardirq_ctx[cpu] = NULL;
-+}
-+
-+extern asmlinkage void __do_softirq(void);
-+
-+asmlinkage void do_softirq(void)
-+{
-+      unsigned long flags;
-+      struct thread_info *curctx;
-+      union irq_ctx *irqctx;
-+      u32 *isp;
-+
-+      if (in_interrupt())
-+              return;
-+
-+      local_irq_save(flags);
-+
-+      if (local_softirq_pending()) {
-+              curctx = current_thread_info();
-+              irqctx = softirq_ctx[smp_processor_id()];
-+              irqctx->tinfo.task = curctx->task;
-+              irqctx->tinfo.previous_esp = current_stack_pointer;
-+
-+              /* build the stack frame on the softirq stack */
-+              isp = (u32*) ((char*)irqctx + sizeof(*irqctx));
-+
-+              asm volatile(
-+                      "       xchgl   %%ebx,%%esp     \n"
-+                      "       call    __do_softirq    \n"
-+                      "       movl    %%ebx,%%esp     \n"
-+                      : "=b"(isp)
-+                      : "0"(isp)
-+                      : "memory", "cc", "edx", "ecx", "eax"
-+              );
-+              /*
-+               * Shouldnt happen, we returned above if in_interrupt():
-+               */
-+              WARN_ON_ONCE(softirq_count());
-+      }
-+
-+      local_irq_restore(flags);
-+}
-+
-+EXPORT_SYMBOL(do_softirq);
-+#endif
-+
-+/*
-+ * Interrupt statistics:
-+ */
-+
-+atomic_t irq_err_count;
-+
-+/*
-+ * /proc/interrupts printing:
-+ */
-+
-+int show_interrupts(struct seq_file *p, void *v)
-+{
-+      int i = *(loff_t *) v, j;
-+      struct irqaction * action;
-+      unsigned long flags;
-+
-+      if (i == 0) {
-+              seq_printf(p, "           ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "CPU%-8d",j);
-+              seq_putc(p, '\n');
-+      }
-+
-+      if (i < NR_IRQS) {
-+              spin_lock_irqsave(&irq_desc[i].lock, flags);
-+              action = irq_desc[i].action;
-+              if (!action)
-+                      goto skip;
-+              seq_printf(p, "%3d: ",i);
-+#ifndef CONFIG_SMP
-+              seq_printf(p, "%10u ", kstat_irqs(i));
-+#else
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
-+#endif
-+              seq_printf(p, " %14s", irq_desc[i].chip->typename);
-+              seq_printf(p, "  %s", action->name);
-+
-+              for (action=action->next; action; action = action->next)
-+                      seq_printf(p, ", %s", action->name);
-+
-+              seq_putc(p, '\n');
-+skip:
-+              spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-+      } else if (i == NR_IRQS) {
-+              seq_printf(p, "NMI: ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ", nmi_count(j));
-+              seq_putc(p, '\n');
-+#ifdef CONFIG_X86_LOCAL_APIC
-+              seq_printf(p, "LOC: ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ",
-+                              per_cpu(irq_stat,j).apic_timer_irqs);
-+              seq_putc(p, '\n');
-+#endif
-+              seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+#if defined(CONFIG_X86_IO_APIC)
-+              seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+#endif
-+      }
-+      return 0;
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+
-+void fixup_irqs(cpumask_t map)
-+{
-+      unsigned int irq;
-+      static int warned;
-+
-+      for (irq = 0; irq < NR_IRQS; irq++) {
-+              cpumask_t mask;
-+              if (irq == 2)
-+                      continue;
-+
-+              cpus_and(mask, irq_desc[irq].affinity, map);
-+              if (any_online_cpu(mask) == NR_CPUS) {
-+                      /*printk("Breaking affinity for irq %i\n", irq);*/
-+                      mask = map;
-+              }
-+              if (irq_desc[irq].chip->set_affinity)
-+                      irq_desc[irq].chip->set_affinity(irq, mask);
-+              else if (irq_desc[irq].action && !(warned++))
-+                      printk("Cannot set affinity for irq %i\n", irq);
-+      }
-+
-+#if 0
-+      barrier();
-+      /* Ingo Molnar says: "after the IO-APIC masks have been redirected
-+         [note the nop - the interrupt-enable boundary on x86 is two
-+         instructions from sti] - to flush out pending hardirqs and
-+         IPIs. After this point nothing is supposed to reach this CPU." */
-+      __asm__ __volatile__("sti; nop; cli");
-+      barrier();
-+#else
-+      /* That doesn't seem sufficient.  Give it 1ms. */
-+      local_irq_enable();
-+      mdelay(1);
-+      local_irq_disable();
-+#endif
-+}
-+#endif
-+
-Index: head-2008-11-25/arch/x86/kernel/ldt_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/ldt_32-xen.c       2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,270 @@
-+/*
-+ * linux/kernel/ldt.c
-+ *
-+ * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
-+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/vmalloc.h>
-+#include <linux/slab.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <asm/ldt.h>
-+#include <asm/desc.h>
-+#include <asm/mmu_context.h>
-+
-+#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
-+static void flush_ldt(void *null)
-+{
-+      if (current->active_mm)
-+              load_LDT(&current->active_mm->context);
-+}
-+#endif
-+
-+static int alloc_ldt(mm_context_t *pc, int mincount, int reload)
-+{
-+      void *oldldt;
-+      void *newldt;
-+      int oldsize;
-+
-+      if (mincount <= pc->size)
-+              return 0;
-+      oldsize = pc->size;
-+      mincount = (mincount+511)&(~511);
-+      if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-+              newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-+      else
-+              newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
-+
-+      if (!newldt)
-+              return -ENOMEM;
-+
-+      if (oldsize)
-+              memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-+      oldldt = pc->ldt;
-+      memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-+      pc->ldt = newldt;
-+      wmb();
-+      pc->size = mincount;
-+      wmb();
-+
-+      if (reload) {
-+#ifdef CONFIG_SMP
-+              cpumask_t mask;
-+              preempt_disable();
-+#endif
-+              make_pages_readonly(
-+                      pc->ldt,
-+                      (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              load_LDT(pc);
-+#ifdef CONFIG_SMP
-+              mask = cpumask_of_cpu(smp_processor_id());
-+              if (!cpus_equal(current->mm->cpu_vm_mask, mask))
-+                      smp_call_function(flush_ldt, NULL, 1, 1);
-+              preempt_enable();
-+#endif
-+      }
-+      if (oldsize) {
-+              make_pages_writable(
-+                      oldldt,
-+                      (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-+                      vfree(oldldt);
-+              else
-+                      kfree(oldldt);
-+      }
-+      return 0;
-+}
-+
-+static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
-+{
-+      int err = alloc_ldt(new, old->size, 0);
-+      if (err < 0)
-+              return err;
-+      memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
-+      make_pages_readonly(
-+              new->ldt,
-+              (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+              XENFEAT_writable_descriptor_tables);
-+      return 0;
-+}
-+
-+/*
-+ * we do not have to muck with descriptors here, that is
-+ * done in switch_mm() as needed.
-+ */
-+int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-+{
-+      struct mm_struct * old_mm;
-+      int retval = 0;
-+
-+      init_MUTEX(&mm->context.sem);
-+      mm->context.size = 0;
-+      mm->context.has_foreign_mappings = 0;
-+      old_mm = current->mm;
-+      if (old_mm && old_mm->context.size > 0) {
-+              down(&old_mm->context.sem);
-+              retval = copy_ldt(&mm->context, &old_mm->context);
-+              up(&old_mm->context.sem);
-+      }
-+      return retval;
-+}
-+
-+/*
-+ * No need to lock the MM as we are the last user
-+ */
-+void destroy_context(struct mm_struct *mm)
-+{
-+      if (mm->context.size) {
-+              if (mm == current->active_mm)
-+                      clear_LDT();
-+              make_pages_writable(
-+                      mm->context.ldt,
-+                      (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-+                      vfree(mm->context.ldt);
-+              else
-+                      kfree(mm->context.ldt);
-+              mm->context.size = 0;
-+      }
-+}
-+
-+static int read_ldt(void __user * ptr, unsigned long bytecount)
-+{
-+      int err;
-+      unsigned long size;
-+      struct mm_struct * mm = current->mm;
-+
-+      if (!mm->context.size)
-+              return 0;
-+      if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
-+              bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
-+
-+      down(&mm->context.sem);
-+      size = mm->context.size*LDT_ENTRY_SIZE;
-+      if (size > bytecount)
-+              size = bytecount;
-+
-+      err = 0;
-+      if (copy_to_user(ptr, mm->context.ldt, size))
-+              err = -EFAULT;
-+      up(&mm->context.sem);
-+      if (err < 0)
-+              goto error_return;
-+      if (size != bytecount) {
-+              /* zero-fill the rest */
-+              if (clear_user(ptr+size, bytecount-size) != 0) {
-+                      err = -EFAULT;
-+                      goto error_return;
-+              }
-+      }
-+      return bytecount;
-+error_return:
-+      return err;
-+}
-+
-+static int read_default_ldt(void __user * ptr, unsigned long bytecount)
-+{
-+      int err;
-+      unsigned long size;
-+      void *address;
-+
-+      err = 0;
-+      address = &default_ldt[0];
-+      size = 5*sizeof(struct desc_struct);
-+      if (size > bytecount)
-+              size = bytecount;
-+
-+      err = size;
-+      if (copy_to_user(ptr, address, size))
-+              err = -EFAULT;
-+
-+      return err;
-+}
-+
-+static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode)
-+{
-+      struct mm_struct * mm = current->mm;
-+      __u32 entry_1, entry_2;
-+      int error;
-+      struct user_desc ldt_info;
-+
-+      error = -EINVAL;
-+      if (bytecount != sizeof(ldt_info))
-+              goto out;
-+      error = -EFAULT;        
-+      if (copy_from_user(&ldt_info, ptr, sizeof(ldt_info)))
-+              goto out;
-+
-+      error = -EINVAL;
-+      if (ldt_info.entry_number >= LDT_ENTRIES)
-+              goto out;
-+      if (ldt_info.contents == 3) {
-+              if (oldmode)
-+                      goto out;
-+              if (ldt_info.seg_not_present == 0)
-+                      goto out;
-+      }
-+
-+      down(&mm->context.sem);
-+      if (ldt_info.entry_number >= mm->context.size) {
-+              error = alloc_ldt(&current->mm->context, ldt_info.entry_number+1, 1);
-+              if (error < 0)
-+                      goto out_unlock;
-+      }
-+
-+      /* Allow LDTs to be cleared by the user. */
-+      if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-+              if (oldmode || LDT_empty(&ldt_info)) {
-+                      entry_1 = 0;
-+                      entry_2 = 0;
-+                      goto install;
-+              }
-+      }
-+
-+      entry_1 = LDT_entry_a(&ldt_info);
-+      entry_2 = LDT_entry_b(&ldt_info);
-+      if (oldmode)
-+              entry_2 &= ~(1 << 20);
-+
-+      /* Install the new entry ...  */
-+install:
-+      error = write_ldt_entry(mm->context.ldt, ldt_info.entry_number,
-+                              entry_1, entry_2);
-+
-+out_unlock:
-+      up(&mm->context.sem);
-+out:
-+      return error;
-+}
-+
-+asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
-+{
-+      int ret = -ENOSYS;
-+
-+      switch (func) {
-+      case 0:
-+              ret = read_ldt(ptr, bytecount);
-+              break;
-+      case 1:
-+              ret = write_ldt(ptr, bytecount, 1);
-+              break;
-+      case 2:
-+              ret = read_default_ldt(ptr, bytecount);
-+              break;
-+      case 0x11:
-+              ret = write_ldt(ptr, bytecount, 0);
-+              break;
-+      }
-+      return ret;
-+}
-Index: head-2008-11-25/arch/x86/kernel/microcode-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/microcode-xen.c    2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,144 @@
-+/*
-+ *    Intel CPU Microcode Update Driver for Linux
-+ *
-+ *    Copyright (C) 2000-2004 Tigran Aivazian
-+ *
-+ *    This driver allows to upgrade microcode on Intel processors
-+ *    belonging to IA-32 family - PentiumPro, Pentium II, 
-+ *    Pentium III, Xeon, Pentium 4, etc.
-+ *
-+ *    Reference: Section 8.10 of Volume III, Intel Pentium 4 Manual, 
-+ *    Order Number 245472 or free download from:
-+ *            
-+ *    http://developer.intel.com/design/pentium4/manuals/245472.htm
-+ *
-+ *    For more information, go to http://www.urbanmyth.org/microcode
-+ *
-+ *    This program is free software; you can redistribute it and/or
-+ *    modify it under the terms of the GNU General Public License
-+ *    as published by the Free Software Foundation; either version
-+ *    2 of the License, or (at your option) any later version.
-+ */
-+
-+//#define DEBUG /* pr_debug */
-+#include <linux/capability.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/sched.h>
-+#include <linux/cpumask.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/miscdevice.h>
-+#include <linux/spinlock.h>
-+#include <linux/mm.h>
-+#include <linux/mutex.h>
-+#include <linux/syscalls.h>
-+
-+#include <asm/msr.h>
-+#include <asm/uaccess.h>
-+#include <asm/processor.h>
-+
-+MODULE_DESCRIPTION("Intel CPU (IA-32) Microcode Update Driver");
-+MODULE_AUTHOR("Tigran Aivazian <tigran@veritas.com>");
-+MODULE_LICENSE("GPL");
-+
-+static int verbose;
-+module_param(verbose, int, 0644);
-+
-+#define MICROCODE_VERSION     "1.14a-xen"
-+
-+#define DEFAULT_UCODE_DATASIZE        (2000)    /* 2000 bytes */
-+#define MC_HEADER_SIZE                (sizeof (microcode_header_t))     /* 48 bytes */
-+#define DEFAULT_UCODE_TOTALSIZE (DEFAULT_UCODE_DATASIZE + MC_HEADER_SIZE) /* 2048 bytes */
-+
-+/* no concurrent ->write()s are allowed on /dev/cpu/microcode */
-+static DEFINE_MUTEX(microcode_mutex);
-+                              
-+static int microcode_open (struct inode *unused1, struct file *unused2)
-+{
-+      return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-+}
-+
-+
-+static int do_microcode_update (const void __user *ubuf, size_t len)
-+{
-+      int err;
-+      void *kbuf;
-+
-+      kbuf = vmalloc(len);
-+      if (!kbuf)
-+              return -ENOMEM;
-+
-+      if (copy_from_user(kbuf, ubuf, len) == 0) {
-+              struct xen_platform_op op;
-+
-+              op.cmd = XENPF_microcode_update;
-+              set_xen_guest_handle(op.u.microcode.data, kbuf);
-+              op.u.microcode.length = len;
-+              err = HYPERVISOR_platform_op(&op);
-+      } else
-+              err = -EFAULT;
-+
-+      vfree(kbuf);
-+
-+      return err;
-+}
-+
-+static ssize_t microcode_write (struct file *file, const char __user *buf, size_t len, loff_t *ppos)
-+{
-+      ssize_t ret;
-+
-+      if (len < MC_HEADER_SIZE) {
-+              printk(KERN_ERR "microcode: not enough data\n"); 
-+              return -EINVAL;
-+      }
-+
-+      mutex_lock(&microcode_mutex);
-+
-+      ret = do_microcode_update(buf, len);
-+      if (!ret)
-+              ret = (ssize_t)len;
-+
-+      mutex_unlock(&microcode_mutex);
-+
-+      return ret;
-+}
-+
-+static struct file_operations microcode_fops = {
-+      .owner          = THIS_MODULE,
-+      .write          = microcode_write,
-+      .open           = microcode_open,
-+};
-+
-+static struct miscdevice microcode_dev = {
-+      .minor          = MICROCODE_MINOR,
-+      .name           = "microcode",
-+      .fops           = &microcode_fops,
-+};
-+
-+static int __init microcode_init (void)
-+{
-+      int error;
-+
-+      error = misc_register(&microcode_dev);
-+      if (error) {
-+              printk(KERN_ERR
-+                      "microcode: can't misc_register on minor=%d\n",
-+                      MICROCODE_MINOR);
-+              return error;
-+      }
-+
-+      printk(KERN_INFO 
-+              "IA-32 Microcode Update Driver: v" MICROCODE_VERSION " <tigran@veritas.com>\n");
-+      return 0;
-+}
-+
-+static void __exit microcode_exit (void)
-+{
-+      misc_deregister(&microcode_dev);
-+}
-+
-+module_init(microcode_init)
-+module_exit(microcode_exit)
-+MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
-Index: head-2008-11-25/arch/x86/kernel/mpparse_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/mpparse_32-xen.c   2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,1185 @@
-+/*
-+ *    Intel Multiprocessor Specification 1.1 and 1.4
-+ *    compliant MP-table parsing routines.
-+ *
-+ *    (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
-+ *    (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *            Erich Boleyn    :       MP v1.4 and additional changes.
-+ *            Alan Cox        :       Added EBDA scanning
-+ *            Ingo Molnar     :       various cleanups and rewrites
-+ *            Maciej W. Rozycki:      Bits for default MP configurations
-+ *            Paul Diefenbaugh:       Added full ACPI support
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/acpi.h>
-+#include <linux/delay.h>
-+#include <linux/bootmem.h>
-+#include <linux/smp_lock.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/bitops.h>
-+
-+#include <asm/smp.h>
-+#include <asm/acpi.h>
-+#include <asm/mtrr.h>
-+#include <asm/mpspec.h>
-+#include <asm/io_apic.h>
-+
-+#include <mach_apic.h>
-+#include <mach_mpparse.h>
-+#include <bios_ebda.h>
-+
-+/* Have we found an MP table */
-+int smp_found_config;
-+unsigned int __initdata maxcpus = NR_CPUS;
-+
-+/*
-+ * Various Linux-internal data structures created from the
-+ * MP-table.
-+ */
-+int apic_version [MAX_APICS];
-+int mp_bus_id_to_type [MAX_MP_BUSSES];
-+int mp_bus_id_to_node [MAX_MP_BUSSES];
-+int mp_bus_id_to_local [MAX_MP_BUSSES];
-+int quad_local_to_mp_bus_id [NR_CPUS/4][4];
-+int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-+static int mp_current_pci_id;
-+
-+/* I/O APIC entries */
-+struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
-+
-+/* # of MP IRQ source entries */
-+struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
-+
-+/* MP IRQ source entries */
-+int mp_irq_entries;
-+
-+int nr_ioapics;
-+
-+int pic_mode;
-+unsigned long mp_lapic_addr;
-+
-+unsigned int def_to_bigsmp = 0;
-+
-+/* Processor that is doing the boot up */
-+unsigned int boot_cpu_physical_apicid = -1U;
-+/* Internal processor count */
-+static unsigned int __devinitdata num_processors;
-+
-+/* Bitmask of physically existing CPUs */
-+physid_mask_t phys_cpu_present_map;
-+
-+u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-+
-+/*
-+ * Intel MP BIOS table parsing routines:
-+ */
-+
-+
-+/*
-+ * Checksum an MP configuration block.
-+ */
-+
-+static int __init mpf_checksum(unsigned char *mp, int len)
-+{
-+      int sum = 0;
-+
-+      while (len--)
-+              sum += *mp++;
-+
-+      return sum & 0xFF;
-+}
-+
-+/*
-+ * Have to match translation table entries to main table entries by counter
-+ * hence the mpc_record variable .... can't see a less disgusting way of
-+ * doing this ....
-+ */
-+
-+static int mpc_record; 
-+static struct mpc_config_translation *translation_table[MAX_MPC_ENTRY] __initdata;
-+
-+#ifndef CONFIG_XEN
-+static void __devinit MP_processor_info (struct mpc_config_processor *m)
-+{
-+      int ver, apicid;
-+      physid_mask_t phys_cpu;
-+      
-+      if (!(m->mpc_cpuflag & CPU_ENABLED))
-+              return;
-+
-+      apicid = mpc_apic_id(m, translation_table[mpc_record]);
-+
-+      if (m->mpc_featureflag&(1<<0))
-+              Dprintk("    Floating point unit present.\n");
-+      if (m->mpc_featureflag&(1<<7))
-+              Dprintk("    Machine Exception supported.\n");
-+      if (m->mpc_featureflag&(1<<8))
-+              Dprintk("    64 bit compare & exchange supported.\n");
-+      if (m->mpc_featureflag&(1<<9))
-+              Dprintk("    Internal APIC present.\n");
-+      if (m->mpc_featureflag&(1<<11))
-+              Dprintk("    SEP present.\n");
-+      if (m->mpc_featureflag&(1<<12))
-+              Dprintk("    MTRR  present.\n");
-+      if (m->mpc_featureflag&(1<<13))
-+              Dprintk("    PGE  present.\n");
-+      if (m->mpc_featureflag&(1<<14))
-+              Dprintk("    MCA  present.\n");
-+      if (m->mpc_featureflag&(1<<15))
-+              Dprintk("    CMOV  present.\n");
-+      if (m->mpc_featureflag&(1<<16))
-+              Dprintk("    PAT  present.\n");
-+      if (m->mpc_featureflag&(1<<17))
-+              Dprintk("    PSE  present.\n");
-+      if (m->mpc_featureflag&(1<<18))
-+              Dprintk("    PSN  present.\n");
-+      if (m->mpc_featureflag&(1<<19))
-+              Dprintk("    Cache Line Flush Instruction present.\n");
-+      /* 20 Reserved */
-+      if (m->mpc_featureflag&(1<<21))
-+              Dprintk("    Debug Trace and EMON Store present.\n");
-+      if (m->mpc_featureflag&(1<<22))
-+              Dprintk("    ACPI Thermal Throttle Registers  present.\n");
-+      if (m->mpc_featureflag&(1<<23))
-+              Dprintk("    MMX  present.\n");
-+      if (m->mpc_featureflag&(1<<24))
-+              Dprintk("    FXSR  present.\n");
-+      if (m->mpc_featureflag&(1<<25))
-+              Dprintk("    XMM  present.\n");
-+      if (m->mpc_featureflag&(1<<26))
-+              Dprintk("    Willamette New Instructions  present.\n");
-+      if (m->mpc_featureflag&(1<<27))
-+              Dprintk("    Self Snoop  present.\n");
-+      if (m->mpc_featureflag&(1<<28))
-+              Dprintk("    HT  present.\n");
-+      if (m->mpc_featureflag&(1<<29))
-+              Dprintk("    Thermal Monitor present.\n");
-+      /* 30, 31 Reserved */
-+
-+
-+      if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-+              Dprintk("    Bootup CPU\n");
-+              boot_cpu_physical_apicid = m->mpc_apicid;
-+      }
-+
-+      ver = m->mpc_apicver;
-+
-+      /*
-+       * Validate version
-+       */
-+      if (ver == 0x0) {
-+              printk(KERN_WARNING "BIOS bug, APIC version is 0 for CPU#%d! "
-+                              "fixing up to 0x10. (tell your hw vendor)\n",
-+                              m->mpc_apicid);
-+              ver = 0x10;
-+      }
-+      apic_version[m->mpc_apicid] = ver;
-+
-+      phys_cpu = apicid_to_cpu_present(apicid);
-+      physids_or(phys_cpu_present_map, phys_cpu_present_map, phys_cpu);
-+
-+      if (num_processors >= NR_CPUS) {
-+              printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
-+                      "  Processor ignored.\n", NR_CPUS);
-+              return;
-+      }
-+
-+      if (num_processors >= maxcpus) {
-+              printk(KERN_WARNING "WARNING: maxcpus limit of %i reached."
-+                      " Processor ignored.\n", maxcpus);
-+              return;
-+      }
-+
-+      cpu_set(num_processors, cpu_possible_map);
-+      num_processors++;
-+
-+      /*
-+       * Would be preferable to switch to bigsmp when CONFIG_HOTPLUG_CPU=y
-+       * but we need to work other dependencies like SMP_SUSPEND etc
-+       * before this can be done without some confusion.
-+       * if (CPU_HOTPLUG_ENABLED || num_processors > 8)
-+       *       - Ashok Raj <ashok.raj@intel.com>
-+       */
-+      if (num_processors > 8) {
-+              switch (boot_cpu_data.x86_vendor) {
-+              case X86_VENDOR_INTEL:
-+                      if (!APIC_XAPIC(ver)) {
-+                              def_to_bigsmp = 0;
-+                              break;
-+                      }
-+                      /* If P4 and above fall through */
-+              case X86_VENDOR_AMD:
-+                      def_to_bigsmp = 1;
-+              }
-+      }
-+      bios_cpu_apicid[num_processors - 1] = m->mpc_apicid;
-+}
-+#else
-+void __init MP_processor_info (struct mpc_config_processor *m)
-+{
-+      num_processors++;
-+}
-+#endif /* CONFIG_XEN */
-+
-+static void __init MP_bus_info (struct mpc_config_bus *m)
-+{
-+      char str[7];
-+
-+      memcpy(str, m->mpc_bustype, 6);
-+      str[6] = 0;
-+
-+      mpc_oem_bus_info(m, str, translation_table[mpc_record]);
-+
-+      if (m->mpc_busid >= MAX_MP_BUSSES) {
-+              printk(KERN_WARNING "MP table busid value (%d) for bustype %s "
-+                      " is too large, max. supported is %d\n",
-+                      m->mpc_busid, str, MAX_MP_BUSSES - 1);
-+              return;
-+      }
-+
-+      if (strncmp(str, BUSTYPE_ISA, sizeof(BUSTYPE_ISA)-1) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
-+      } else if (strncmp(str, BUSTYPE_EISA, sizeof(BUSTYPE_EISA)-1) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
-+      } else if (strncmp(str, BUSTYPE_PCI, sizeof(BUSTYPE_PCI)-1) == 0) {
-+              mpc_oem_pci_bus(m, translation_table[mpc_record]);
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
-+              mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
-+              mp_current_pci_id++;
-+      } else if (strncmp(str, BUSTYPE_MCA, sizeof(BUSTYPE_MCA)-1) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
-+      } else if (strncmp(str, BUSTYPE_NEC98, sizeof(BUSTYPE_NEC98)-1) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_NEC98;
-+      } else {
-+              printk(KERN_WARNING "Unknown bustype %s - ignoring\n", str);
-+      }
-+}
-+
-+static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
-+{
-+      if (!(m->mpc_flags & MPC_APIC_USABLE))
-+              return;
-+
-+      printk(KERN_INFO "I/O APIC #%d Version %d at 0x%lX.\n",
-+              m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
-+      if (nr_ioapics >= MAX_IO_APICS) {
-+              printk(KERN_CRIT "Max # of I/O APICs (%d) exceeded (found %d).\n",
-+                      MAX_IO_APICS, nr_ioapics);
-+              panic("Recompile kernel with bigger MAX_IO_APICS!.\n");
-+      }
-+      if (!m->mpc_apicaddr) {
-+              printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
-+                      " found in MP table, skipping!\n");
-+              return;
-+      }
-+      mp_ioapics[nr_ioapics] = *m;
-+      nr_ioapics++;
-+}
-+
-+static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
-+{
-+      mp_irqs [mp_irq_entries] = *m;
-+      Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
-+              " IRQ %02x, APIC ID %x, APIC INT %02x\n",
-+                      m->mpc_irqtype, m->mpc_irqflag & 3,
-+                      (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
-+                      m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
-+      if (++mp_irq_entries == MAX_IRQ_SOURCES)
-+              panic("Max # of irq sources exceeded!!\n");
-+}
-+
-+static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
-+{
-+      Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
-+              " IRQ %02x, APIC ID %x, APIC LINT %02x\n",
-+                      m->mpc_irqtype, m->mpc_irqflag & 3,
-+                      (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid,
-+                      m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
-+      /*
-+       * Well it seems all SMP boards in existence
-+       * use ExtINT/LVT1 == LINT0 and
-+       * NMI/LVT2 == LINT1 - the following check
-+       * will show us if this assumptions is false.
-+       * Until then we do not have to add baggage.
-+       */
-+      if ((m->mpc_irqtype == mp_ExtINT) &&
-+              (m->mpc_destapiclint != 0))
-+                      BUG();
-+      if ((m->mpc_irqtype == mp_NMI) &&
-+              (m->mpc_destapiclint != 1))
-+                      BUG();
-+}
-+
-+#ifdef CONFIG_X86_NUMAQ
-+static void __init MP_translation_info (struct mpc_config_translation *m)
-+{
-+      printk(KERN_INFO "Translation: record %d, type %d, quad %d, global %d, local %d\n", mpc_record, m->trans_type, m->trans_quad, m->trans_global, m->trans_local);
-+
-+      if (mpc_record >= MAX_MPC_ENTRY) 
-+              printk(KERN_ERR "MAX_MPC_ENTRY exceeded!\n");
-+      else
-+              translation_table[mpc_record] = m; /* stash this for later */
-+      if (m->trans_quad < MAX_NUMNODES && !node_online(m->trans_quad))
-+              node_set_online(m->trans_quad);
-+}
-+
-+/*
-+ * Read/parse the MPC oem tables
-+ */
-+
-+static void __init smp_read_mpc_oem(struct mp_config_oemtable *oemtable, \
-+      unsigned short oemsize)
-+{
-+      int count = sizeof (*oemtable); /* the header size */
-+      unsigned char *oemptr = ((unsigned char *)oemtable)+count;
-+      
-+      mpc_record = 0;
-+      printk(KERN_INFO "Found an OEM MPC table at %8p - parsing it ... \n", oemtable);
-+      if (memcmp(oemtable->oem_signature,MPC_OEM_SIGNATURE,4))
-+      {
-+              printk(KERN_WARNING "SMP mpc oemtable: bad signature [%c%c%c%c]!\n",
-+                      oemtable->oem_signature[0],
-+                      oemtable->oem_signature[1],
-+                      oemtable->oem_signature[2],
-+                      oemtable->oem_signature[3]);
-+              return;
-+      }
-+      if (mpf_checksum((unsigned char *)oemtable,oemtable->oem_length))
-+      {
-+              printk(KERN_WARNING "SMP oem mptable: checksum error!\n");
-+              return;
-+      }
-+      while (count < oemtable->oem_length) {
-+              switch (*oemptr) {
-+                      case MP_TRANSLATION:
-+                      {
-+                              struct mpc_config_translation *m=
-+                                      (struct mpc_config_translation *)oemptr;
-+                              MP_translation_info(m);
-+                              oemptr += sizeof(*m);
-+                              count += sizeof(*m);
-+                              ++mpc_record;
-+                              break;
-+                      }
-+                      default:
-+                      {
-+                              printk(KERN_WARNING "Unrecognised OEM table entry type! - %d\n", (int) *oemptr);
-+                              return;
-+                      }
-+              }
-+       }
-+}
-+
-+static inline void mps_oem_check(struct mp_config_table *mpc, char *oem,
-+              char *productid)
-+{
-+      if (strncmp(oem, "IBM NUMA", 8))
-+              printk("Warning!  May not be a NUMA-Q system!\n");
-+      if (mpc->mpc_oemptr)
-+              smp_read_mpc_oem((struct mp_config_oemtable *) mpc->mpc_oemptr,
-+                              mpc->mpc_oemsize);
-+}
-+#endif        /* CONFIG_X86_NUMAQ */
-+
-+/*
-+ * Read/parse the MPC
-+ */
-+
-+static int __init smp_read_mpc(struct mp_config_table *mpc)
-+{
-+      char str[16];
-+      char oem[10];
-+      int count=sizeof(*mpc);
-+      unsigned char *mpt=((unsigned char *)mpc)+count;
-+
-+      if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-+              printk(KERN_ERR "SMP mptable: bad signature [0x%x]!\n",
-+                      *(u32 *)mpc->mpc_signature);
-+              return 0;
-+      }
-+      if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-+              printk(KERN_ERR "SMP mptable: checksum error!\n");
-+              return 0;
-+      }
-+      if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
-+              printk(KERN_ERR "SMP mptable: bad table version (%d)!!\n",
-+                      mpc->mpc_spec);
-+              return 0;
-+      }
-+      if (!mpc->mpc_lapic) {
-+              printk(KERN_ERR "SMP mptable: null local APIC address!\n");
-+              return 0;
-+      }
-+      memcpy(oem,mpc->mpc_oem,8);
-+      oem[8]=0;
-+      printk(KERN_INFO "OEM ID: %s ",oem);
-+
-+      memcpy(str,mpc->mpc_productid,12);
-+      str[12]=0;
-+      printk("Product ID: %s ",str);
-+
-+      mps_oem_check(mpc, oem, str);
-+
-+      printk("APIC at: 0x%lX\n",mpc->mpc_lapic);
-+
-+      /* 
-+       * Save the local APIC address (it might be non-default) -- but only
-+       * if we're not using ACPI.
-+       */
-+      if (!acpi_lapic)
-+              mp_lapic_addr = mpc->mpc_lapic;
-+
-+      /*
-+       *      Now process the configuration blocks.
-+       */
-+      mpc_record = 0;
-+      while (count < mpc->mpc_length) {
-+              switch(*mpt) {
-+                      case MP_PROCESSOR:
-+                      {
-+                              struct mpc_config_processor *m=
-+                                      (struct mpc_config_processor *)mpt;
-+                              /* ACPI may have already provided this data */
-+                              if (!acpi_lapic)
-+                                      MP_processor_info(m);
-+                              mpt += sizeof(*m);
-+                              count += sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_BUS:
-+                      {
-+                              struct mpc_config_bus *m=
-+                                      (struct mpc_config_bus *)mpt;
-+                              MP_bus_info(m);
-+                              mpt += sizeof(*m);
-+                              count += sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_IOAPIC:
-+                      {
-+                              struct mpc_config_ioapic *m=
-+                                      (struct mpc_config_ioapic *)mpt;
-+                              MP_ioapic_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_INTSRC:
-+                      {
-+                              struct mpc_config_intsrc *m=
-+                                      (struct mpc_config_intsrc *)mpt;
-+
-+                              MP_intsrc_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_LINTSRC:
-+                      {
-+                              struct mpc_config_lintsrc *m=
-+                                      (struct mpc_config_lintsrc *)mpt;
-+                              MP_lintsrc_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+                      default:
-+                      {
-+                              count = mpc->mpc_length;
-+                              break;
-+                      }
-+              }
-+              ++mpc_record;
-+      }
-+      clustered_apic_check();
-+      if (!num_processors)
-+              printk(KERN_ERR "SMP mptable: no processors registered!\n");
-+      return num_processors;
-+}
-+
-+static int __init ELCR_trigger(unsigned int irq)
-+{
-+      unsigned int port;
-+
-+      port = 0x4d0 + (irq >> 3);
-+      return (inb(port) >> (irq & 7)) & 1;
-+}
-+
-+static void __init construct_default_ioirq_mptable(int mpc_default_type)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int i;
-+      int ELCR_fallback = 0;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqflag = 0;                 /* conforming */
-+      intsrc.mpc_srcbus = 0;
-+      intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid;
-+
-+      intsrc.mpc_irqtype = mp_INT;
-+
-+      /*
-+       *  If true, we have an ISA/PCI system with no IRQ entries
-+       *  in the MP table. To prevent the PCI interrupts from being set up
-+       *  incorrectly, we try to use the ELCR. The sanity check to see if
-+       *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
-+       *  never be level sensitive, so we simply see if the ELCR agrees.
-+       *  If it does, we assume it's valid.
-+       */
-+      if (mpc_default_type == 5) {
-+              printk(KERN_INFO "ISA/PCI bus type with no IRQ information... falling back to ELCR\n");
-+
-+              if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13))
-+                      printk(KERN_WARNING "ELCR contains invalid data... not using ELCR\n");
-+              else {
-+                      printk(KERN_INFO "Using ELCR to identify PCI interrupts\n");
-+                      ELCR_fallback = 1;
-+              }
-+      }
-+
-+      for (i = 0; i < 16; i++) {
-+              switch (mpc_default_type) {
-+              case 2:
-+                      if (i == 0 || i == 13)
-+                              continue;       /* IRQ0 & IRQ13 not connected */
-+                      /* fall through */
-+              default:
-+                      if (i == 2)
-+                              continue;       /* IRQ2 is never connected */
-+              }
-+
-+              if (ELCR_fallback) {
-+                      /*
-+                       *  If the ELCR indicates a level-sensitive interrupt, we
-+                       *  copy that information over to the MP table in the
-+                       *  irqflag field (level sensitive, active high polarity).
-+                       */
-+                      if (ELCR_trigger(i))
-+                              intsrc.mpc_irqflag = 13;
-+                      else
-+                              intsrc.mpc_irqflag = 0;
-+              }
-+
-+              intsrc.mpc_srcbusirq = i;
-+              intsrc.mpc_dstirq = i ? i : 2;          /* IRQ0 to INTIN2 */
-+              MP_intsrc_info(&intsrc);
-+      }
-+
-+      intsrc.mpc_irqtype = mp_ExtINT;
-+      intsrc.mpc_srcbusirq = 0;
-+      intsrc.mpc_dstirq = 0;                          /* 8259A to INTIN0 */
-+      MP_intsrc_info(&intsrc);
-+}
-+
-+static inline void __init construct_default_ISA_mptable(int mpc_default_type)
-+{
-+      struct mpc_config_processor processor;
-+      struct mpc_config_bus bus;
-+      struct mpc_config_ioapic ioapic;
-+      struct mpc_config_lintsrc lintsrc;
-+      int linttypes[2] = { mp_ExtINT, mp_NMI };
-+      int i;
-+
-+      /*
-+       * local APIC has default address
-+       */
-+      mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-+
-+      /*
-+       * 2 CPUs, numbered 0 & 1.
-+       */
-+      processor.mpc_type = MP_PROCESSOR;
-+      /* Either an integrated APIC or a discrete 82489DX. */
-+      processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-+      processor.mpc_cpuflag = CPU_ENABLED;
-+      processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
-+                                 (boot_cpu_data.x86_model << 4) |
-+                                 boot_cpu_data.x86_mask;
-+      processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-+      processor.mpc_reserved[0] = 0;
-+      processor.mpc_reserved[1] = 0;
-+      for (i = 0; i < 2; i++) {
-+              processor.mpc_apicid = i;
-+              MP_processor_info(&processor);
-+      }
-+
-+      bus.mpc_type = MP_BUS;
-+      bus.mpc_busid = 0;
-+      switch (mpc_default_type) {
-+              default:
-+                      printk("???\n");
-+                      printk(KERN_ERR "Unknown standard configuration %d\n",
-+                              mpc_default_type);
-+                      /* fall through */
-+              case 1:
-+              case 5:
-+                      memcpy(bus.mpc_bustype, "ISA   ", 6);
-+                      break;
-+              case 2:
-+              case 6:
-+              case 3:
-+                      memcpy(bus.mpc_bustype, "EISA  ", 6);
-+                      break;
-+              case 4:
-+              case 7:
-+                      memcpy(bus.mpc_bustype, "MCA   ", 6);
-+      }
-+      MP_bus_info(&bus);
-+      if (mpc_default_type > 4) {
-+              bus.mpc_busid = 1;
-+              memcpy(bus.mpc_bustype, "PCI   ", 6);
-+              MP_bus_info(&bus);
-+      }
-+
-+      ioapic.mpc_type = MP_IOAPIC;
-+      ioapic.mpc_apicid = 2;
-+      ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-+      ioapic.mpc_flags = MPC_APIC_USABLE;
-+      ioapic.mpc_apicaddr = 0xFEC00000;
-+      MP_ioapic_info(&ioapic);
-+
-+      /*
-+       * We set up most of the low 16 IO-APIC pins according to MPS rules.
-+       */
-+      construct_default_ioirq_mptable(mpc_default_type);
-+
-+      lintsrc.mpc_type = MP_LINTSRC;
-+      lintsrc.mpc_irqflag = 0;                /* conforming */
-+      lintsrc.mpc_srcbusid = 0;
-+      lintsrc.mpc_srcbusirq = 0;
-+      lintsrc.mpc_destapic = MP_APIC_ALL;
-+      for (i = 0; i < 2; i++) {
-+              lintsrc.mpc_irqtype = linttypes[i];
-+              lintsrc.mpc_destapiclint = i;
-+              MP_lintsrc_info(&lintsrc);
-+      }
-+}
-+
-+static struct intel_mp_floating *mpf_found;
-+
-+/*
-+ * Scan the memory blocks for an SMP configuration block.
-+ */
-+void __init get_smp_config (void)
-+{
-+      struct intel_mp_floating *mpf = mpf_found;
-+
-+      /*
-+       * ACPI supports both logical (e.g. Hyper-Threading) and physical 
-+       * processors, where MPS only supports physical.
-+       */
-+      if (acpi_lapic && acpi_ioapic) {
-+              printk(KERN_INFO "Using ACPI (MADT) for SMP configuration information\n");
-+              return;
-+      }
-+      else if (acpi_lapic)
-+              printk(KERN_INFO "Using ACPI for processor (LAPIC) configuration information\n");
-+
-+      printk(KERN_INFO "Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
-+      if (mpf->mpf_feature2 & (1<<7)) {
-+              printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
-+              pic_mode = 1;
-+      } else {
-+              printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
-+              pic_mode = 0;
-+      }
-+
-+      /*
-+       * Now see if we need to read further.
-+       */
-+      if (mpf->mpf_feature1 != 0) {
-+
-+              printk(KERN_INFO "Default MP configuration #%d\n", mpf->mpf_feature1);
-+              construct_default_ISA_mptable(mpf->mpf_feature1);
-+
-+      } else if (mpf->mpf_physptr) {
-+
-+              /*
-+               * Read the physical hardware table.  Anything here will
-+               * override the defaults.
-+               */
-+              if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr))) {
-+                      smp_found_config = 0;
-+                      printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
-+                      printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
-+                      return;
-+              }
-+              /*
-+               * If there are no explicit MP IRQ entries, then we are
-+               * broken.  We set up most of the low 16 IO-APIC pins to
-+               * ISA defaults and hope it will work.
-+               */
-+              if (!mp_irq_entries) {
-+                      struct mpc_config_bus bus;
-+
-+                      printk(KERN_ERR "BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n");
-+
-+                      bus.mpc_type = MP_BUS;
-+                      bus.mpc_busid = 0;
-+                      memcpy(bus.mpc_bustype, "ISA   ", 6);
-+                      MP_bus_info(&bus);
-+
-+                      construct_default_ioirq_mptable(0);
-+              }
-+
-+      } else
-+              BUG();
-+
-+      printk(KERN_INFO "Processors: %d\n", num_processors);
-+      /*
-+       * Only use the first configuration found.
-+       */
-+}
-+
-+static int __init smp_scan_config (unsigned long base, unsigned long length)
-+{
-+      unsigned long *bp = isa_bus_to_virt(base);
-+      struct intel_mp_floating *mpf;
-+
-+      Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length);
-+      if (sizeof(*mpf) != 16)
-+              printk("Error: MPF size\n");
-+
-+      while (length > 0) {
-+              mpf = (struct intel_mp_floating *)bp;
-+              if ((*bp == SMP_MAGIC_IDENT) &&
-+                      (mpf->mpf_length == 1) &&
-+                      !mpf_checksum((unsigned char *)bp, 16) &&
-+                      ((mpf->mpf_specification == 1)
-+                              || (mpf->mpf_specification == 4)) ) {
-+
-+                      smp_found_config = 1;
-+#ifndef CONFIG_XEN
-+                      printk(KERN_INFO "found SMP MP-table at %08lx\n",
-+                                              virt_to_phys(mpf));
-+                      reserve_bootmem(virt_to_phys(mpf), PAGE_SIZE);
-+                      if (mpf->mpf_physptr) {
-+                              /*
-+                               * We cannot access to MPC table to compute
-+                               * table size yet, as only few megabytes from
-+                               * the bottom is mapped now.
-+                               * PC-9800's MPC table places on the very last
-+                               * of physical memory; so that simply reserving
-+                               * PAGE_SIZE from mpg->mpf_physptr yields BUG()
-+                               * in reserve_bootmem.
-+                               */
-+                              unsigned long size = PAGE_SIZE;
-+                              unsigned long end = max_low_pfn * PAGE_SIZE;
-+                              if (mpf->mpf_physptr + size > end)
-+                                      size = end - mpf->mpf_physptr;
-+                              reserve_bootmem(mpf->mpf_physptr, size);
-+                      }
-+#else
-+                      printk(KERN_INFO "found SMP MP-table at %08lx\n",
-+                              ((unsigned long)bp - (unsigned long)isa_bus_to_virt(base)) + base);
-+#endif
-+
-+                      mpf_found = mpf;
-+                      return 1;
-+              }
-+              bp += 4;
-+              length -= 16;
-+      }
-+      return 0;
-+}
-+
-+void __init find_smp_config (void)
-+{
-+#ifndef CONFIG_XEN
-+      unsigned int address;
-+#endif
-+
-+      /*
-+       * FIXME: Linux assumes you have 640K of base ram..
-+       * this continues the error...
-+       *
-+       * 1) Scan the bottom 1K for a signature
-+       * 2) Scan the top 1K of base RAM
-+       * 3) Scan the 64K of bios
-+       */
-+      if (smp_scan_config(0x0,0x400) ||
-+              smp_scan_config(639*0x400,0x400) ||
-+                      smp_scan_config(0xF0000,0x10000))
-+              return;
-+      /*
-+       * If it is an SMP machine we should know now, unless the
-+       * configuration is in an EISA/MCA bus machine with an
-+       * extended bios data area.
-+       *
-+       * there is a real-mode segmented pointer pointing to the
-+       * 4K EBDA area at 0x40E, calculate and scan it here.
-+       *
-+       * NOTE! There are Linux loaders that will corrupt the EBDA
-+       * area, and as such this kind of SMP config may be less
-+       * trustworthy, simply because the SMP table may have been
-+       * stomped on during early boot. These loaders are buggy and
-+       * should be fixed.
-+       *
-+       * MP1.4 SPEC states to only scan first 1K of 4K EBDA.
-+       */
-+
-+#ifndef CONFIG_XEN
-+      address = get_bios_ebda();
-+      if (address)
-+              smp_scan_config(address, 0x400);
-+#endif
-+}
-+
-+int es7000_plat;
-+
-+/* --------------------------------------------------------------------------
-+                            ACPI-based MP Configuration
-+   -------------------------------------------------------------------------- */
-+
-+#ifdef CONFIG_ACPI
-+
-+void __init mp_register_lapic_address (
-+      u64                     address)
-+{
-+#ifndef CONFIG_XEN
-+      mp_lapic_addr = (unsigned long) address;
-+
-+      set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
-+
-+      if (boot_cpu_physical_apicid == -1U)
-+              boot_cpu_physical_apicid = GET_APIC_ID(apic_read(APIC_ID));
-+
-+      Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid);
-+#endif
-+}
-+
-+
-+void __devinit mp_register_lapic (
-+      u8                      id, 
-+      u8                      enabled)
-+{
-+      struct mpc_config_processor processor;
-+      int                     boot_cpu = 0;
-+      
-+      if (MAX_APICS - id <= 0) {
-+              printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
-+                      id, MAX_APICS);
-+              return;
-+      }
-+
-+      if (id == boot_cpu_physical_apicid)
-+              boot_cpu = 1;
-+
-+#ifndef CONFIG_XEN
-+      processor.mpc_type = MP_PROCESSOR;
-+      processor.mpc_apicid = id;
-+      processor.mpc_apicver = GET_APIC_VERSION(apic_read(APIC_LVR));
-+      processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0);
-+      processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0);
-+      processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | 
-+              (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
-+      processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-+      processor.mpc_reserved[0] = 0;
-+      processor.mpc_reserved[1] = 0;
-+#endif
-+
-+      MP_processor_info(&processor);
-+}
-+
-+#ifdef        CONFIG_X86_IO_APIC
-+
-+#define MP_ISA_BUS            0
-+#define MP_MAX_IOAPIC_PIN     127
-+
-+static struct mp_ioapic_routing {
-+      int                     apic_id;
-+      int                     gsi_base;
-+      int                     gsi_end;
-+      u32                     pin_programmed[4];
-+} mp_ioapic_routing[MAX_IO_APICS];
-+
-+
-+static int mp_find_ioapic (
-+      int                     gsi)
-+{
-+      int                     i = 0;
-+
-+      /* Find the IOAPIC that manages this GSI. */
-+      for (i = 0; i < nr_ioapics; i++) {
-+              if ((gsi >= mp_ioapic_routing[i].gsi_base)
-+                      && (gsi <= mp_ioapic_routing[i].gsi_end))
-+                      return i;
-+      }
-+
-+      printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
-+
-+      return -1;
-+}
-+      
-+
-+void __init mp_register_ioapic (
-+      u8                      id, 
-+      u32                     address,
-+      u32                     gsi_base)
-+{
-+      int                     idx = 0;
-+      int                     tmpid;
-+
-+      if (nr_ioapics >= MAX_IO_APICS) {
-+              printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
-+                      "(found %d)\n", MAX_IO_APICS, nr_ioapics);
-+              panic("Recompile kernel with bigger MAX_IO_APICS!\n");
-+      }
-+      if (!address) {
-+              printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
-+                      " found in MADT table, skipping!\n");
-+              return;
-+      }
-+
-+      idx = nr_ioapics++;
-+
-+      mp_ioapics[idx].mpc_type = MP_IOAPIC;
-+      mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
-+      mp_ioapics[idx].mpc_apicaddr = address;
-+
-+#ifndef CONFIG_XEN
-+      set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-+#endif
-+      if ((boot_cpu_data.x86_vendor == X86_VENDOR_INTEL)
-+              && !APIC_XAPIC(apic_version[boot_cpu_physical_apicid]))
-+              tmpid = io_apic_get_unique_id(idx, id);
-+      else
-+              tmpid = id;
-+      if (tmpid == -1) {
-+              nr_ioapics--;
-+              return;
-+      }
-+      mp_ioapics[idx].mpc_apicid = tmpid;
-+      mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx);
-+      
-+      /* 
-+       * Build basic GSI lookup table to facilitate gsi->io_apic lookups
-+       * and to prevent reprogramming of IOAPIC pins (PCI GSIs).
-+       */
-+      mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid;
-+      mp_ioapic_routing[idx].gsi_base = gsi_base;
-+      mp_ioapic_routing[idx].gsi_end = gsi_base + 
-+              io_apic_get_redir_entries(idx);
-+
-+      printk("IOAPIC[%d]: apic_id %d, version %d, address 0x%lx, "
-+              "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, 
-+              mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr,
-+              mp_ioapic_routing[idx].gsi_base,
-+              mp_ioapic_routing[idx].gsi_end);
-+
-+      return;
-+}
-+
-+
-+void __init mp_override_legacy_irq (
-+      u8                      bus_irq,
-+      u8                      polarity, 
-+      u8                      trigger, 
-+      u32                     gsi)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int                     ioapic = -1;
-+      int                     pin = -1;
-+
-+      /* 
-+       * Convert 'gsi' to 'ioapic.pin'.
-+       */
-+      ioapic = mp_find_ioapic(gsi);
-+      if (ioapic < 0)
-+              return;
-+      pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
-+
-+      /*
-+       * TBD: This check is for faulty timer entries, where the override
-+       *      erroneously sets the trigger to level, resulting in a HUGE 
-+       *      increase of timer interrupts!
-+       */
-+      if ((bus_irq == 0) && (trigger == 3))
-+              trigger = 1;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqtype = mp_INT;
-+      intsrc.mpc_irqflag = (trigger << 2) | polarity;
-+      intsrc.mpc_srcbus = MP_ISA_BUS;
-+      intsrc.mpc_srcbusirq = bus_irq;                                /* IRQ */
-+      intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;        /* APIC ID */
-+      intsrc.mpc_dstirq = pin;                                    /* INTIN# */
-+
-+      Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n",
-+              intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-+              (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-+              intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
-+
-+      mp_irqs[mp_irq_entries] = intsrc;
-+      if (++mp_irq_entries == MAX_IRQ_SOURCES)
-+              panic("Max # of irq sources exceeded!\n");
-+
-+      return;
-+}
-+
-+void __init mp_config_acpi_legacy_irqs (void)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int                     i = 0;
-+      int                     ioapic = -1;
-+
-+      /* 
-+       * Fabricate the legacy ISA bus (bus #31).
-+       */
-+      mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
-+      Dprintk("Bus #%d is ISA\n", MP_ISA_BUS);
-+
-+      /*
-+       * Older generations of ES7000 have no legacy identity mappings
-+       */
-+      if (es7000_plat == 1)
-+              return;
-+
-+      /* 
-+       * Locate the IOAPIC that manages the ISA IRQs (0-15). 
-+       */
-+      ioapic = mp_find_ioapic(0);
-+      if (ioapic < 0)
-+              return;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqflag = 0;                                 /* Conforming */
-+      intsrc.mpc_srcbus = MP_ISA_BUS;
-+      intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
-+
-+      /* 
-+       * Use the default configuration for the IRQs 0-15.  Unless
-+       * overriden by (MADT) interrupt source override entries.
-+       */
-+      for (i = 0; i < 16; i++) {
-+              int idx;
-+
-+              for (idx = 0; idx < mp_irq_entries; idx++) {
-+                      struct mpc_config_intsrc *irq = mp_irqs + idx;
-+
-+                      /* Do we already have a mapping for this ISA IRQ? */
-+                      if (irq->mpc_srcbus == MP_ISA_BUS && irq->mpc_srcbusirq == i)
-+                              break;
-+
-+                      /* Do we already have a mapping for this IOAPIC pin */
-+                      if ((irq->mpc_dstapic == intsrc.mpc_dstapic) &&
-+                              (irq->mpc_dstirq == i))
-+                              break;
-+              }
-+
-+              if (idx != mp_irq_entries) {
-+                      printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
-+                      continue;                       /* IRQ already used */
-+              }
-+
-+              intsrc.mpc_irqtype = mp_INT;
-+              intsrc.mpc_srcbusirq = i;                  /* Identity mapped */
-+              intsrc.mpc_dstirq = i;
-+
-+              Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, "
-+                      "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-+                      (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-+                      intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, 
-+                      intsrc.mpc_dstirq);
-+
-+              mp_irqs[mp_irq_entries] = intsrc;
-+              if (++mp_irq_entries == MAX_IRQ_SOURCES)
-+                      panic("Max # of irq sources exceeded!\n");
-+      }
-+}
-+
-+#define MAX_GSI_NUM   4096
-+
-+int mp_register_gsi (u32 gsi, int triggering, int polarity)
-+{
-+      int                     ioapic = -1;
-+      int                     ioapic_pin = 0;
-+      int                     idx, bit = 0;
-+      static int              pci_irq = 16;
-+      /*
-+       * Mapping between Global System Interrups, which
-+       * represent all possible interrupts, and IRQs
-+       * assigned to actual devices.
-+       */
-+      static int              gsi_to_irq[MAX_GSI_NUM];
-+
-+      /* Don't set up the ACPI SCI because it's already set up */
-+      if (acpi_fadt.sci_int == gsi)
-+              return gsi;
-+
-+      ioapic = mp_find_ioapic(gsi);
-+      if (ioapic < 0) {
-+              printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
-+              return gsi;
-+      }
-+
-+      ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
-+
-+      if (ioapic_renumber_irq)
-+              gsi = ioapic_renumber_irq(ioapic, gsi);
-+
-+      /* 
-+       * Avoid pin reprogramming.  PRTs typically include entries  
-+       * with redundant pin->gsi mappings (but unique PCI devices);
-+       * we only program the IOAPIC on the first.
-+       */
-+      bit = ioapic_pin % 32;
-+      idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32);
-+      if (idx > 3) {
-+              printk(KERN_ERR "Invalid reference to IOAPIC pin "
-+                      "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, 
-+                      ioapic_pin);
-+              return gsi;
-+      }
-+      if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
-+              Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n",
-+                      mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-+              return gsi_to_irq[gsi];
-+      }
-+
-+      mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-+
-+      if (triggering == ACPI_LEVEL_SENSITIVE) {
-+              /*
-+               * For PCI devices assign IRQs in order, avoiding gaps
-+               * due to unused I/O APIC pins.
-+               */
-+              int irq = gsi;
-+              if (gsi < MAX_GSI_NUM) {
-+                      /*
-+                       * Retain the VIA chipset work-around (gsi > 15), but
-+                       * avoid a problem where the 8254 timer (IRQ0) is setup
-+                       * via an override (so it's not on pin 0 of the ioapic),
-+                       * and at the same time, the pin 0 interrupt is a PCI
-+                       * type.  The gsi > 15 test could cause these two pins
-+                       * to be shared as IRQ0, and they are not shareable.
-+                       * So test for this condition, and if necessary, avoid
-+                       * the pin collision.
-+                       */
-+                      if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
-+                              gsi = pci_irq++;
-+                      /*
-+                       * Don't assign IRQ used by ACPI SCI
-+                       */
-+                      if (gsi == acpi_fadt.sci_int)
-+                              gsi = pci_irq++;
-+                      gsi_to_irq[irq] = gsi;
-+              } else {
-+                      printk(KERN_ERR "GSI %u is too high\n", gsi);
-+                      return gsi;
-+              }
-+      }
-+
-+      io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-+                  triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
-+                  polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
-+      return gsi;
-+}
-+
-+#endif /* CONFIG_X86_IO_APIC */
-+#endif /* CONFIG_ACPI */
-Index: head-2008-11-25/arch/x86/kernel/pci-dma-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/pci-dma-xen.c      2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,409 @@
-+/*
-+ * Dynamic DMA mapping support.
-+ *
-+ * On i386 there is no hardware dynamic DMA address translation,
-+ * so consistent alloc/free are merely page allocation/freeing.
-+ * The rest of the dynamic DMA mapping interface is implemented
-+ * in asm/pci.h.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/mm.h>
-+#include <linux/string.h>
-+#include <linux/pci.h>
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <asm/io.h>
-+#include <xen/balloon.h>
-+#include <xen/gnttab.h>
-+#include <asm/swiotlb.h>
-+#include <asm/tlbflush.h>
-+#include <asm-i386/mach-xen/asm/swiotlb.h>
-+#include <asm-i386/mach-xen/asm/gnttab_dma.h>
-+#include <asm/bug.h>
-+
-+#ifdef __x86_64__
-+#include <asm/proto.h>
-+
-+int iommu_merge __read_mostly = 0;
-+EXPORT_SYMBOL(iommu_merge);
-+
-+dma_addr_t bad_dma_address __read_mostly;
-+EXPORT_SYMBOL(bad_dma_address);
-+
-+/* This tells the BIO block layer to assume merging. Default to off
-+   because we cannot guarantee merging later. */
-+int iommu_bio_merge __read_mostly = 0;
-+EXPORT_SYMBOL(iommu_bio_merge);
-+
-+int force_iommu __read_mostly= 0;
-+
-+__init int iommu_setup(char *p)
-+{
-+    return 1;
-+}
-+
-+void __init pci_iommu_alloc(void)
-+{
-+#ifdef CONFIG_SWIOTLB
-+      pci_swiotlb_init();
-+#endif
-+}
-+
-+static int __init pci_iommu_init(void)
-+{
-+      no_iommu_init();
-+      return 0;
-+}
-+
-+/* Must execute after PCI subsystem */
-+fs_initcall(pci_iommu_init);
-+#endif
-+
-+struct dma_coherent_mem {
-+      void            *virt_base;
-+      u32             device_base;
-+      int             size;
-+      int             flags;
-+      unsigned long   *bitmap;
-+};
-+
-+#define IOMMU_BUG_ON(test)                            \
-+do {                                                  \
-+      if (unlikely(test)) {                           \
-+              printk(KERN_ALERT "Fatal DMA error! "   \
-+                     "Please use 'swiotlb=force'\n"); \
-+              BUG();                                  \
-+      }                                               \
-+} while (0)
-+
-+static int check_pages_physically_contiguous(unsigned long pfn, 
-+                                           unsigned int offset,
-+                                           size_t length)
-+{
-+      unsigned long next_mfn;
-+      int i;
-+      int nr_pages;
-+      
-+      next_mfn = pfn_to_mfn(pfn);
-+      nr_pages = (offset + length + PAGE_SIZE-1) >> PAGE_SHIFT;
-+      
-+      for (i = 1; i < nr_pages; i++) {
-+              if (pfn_to_mfn(++pfn) != ++next_mfn) 
-+                      return 0;
-+      }
-+      return 1;
-+}
-+
-+int range_straddles_page_boundary(paddr_t p, size_t size)
-+{
-+      unsigned long pfn = p >> PAGE_SHIFT;
-+      unsigned int offset = p & ~PAGE_MASK;
-+
-+      return ((offset + size > PAGE_SIZE) &&
-+              !check_pages_physically_contiguous(pfn, offset, size));
-+}
-+
-+int
-+dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-+         enum dma_data_direction direction)
-+{
-+      int i, rc;
-+
-+      if (direction == DMA_NONE)
-+              BUG();
-+      WARN_ON(nents == 0 || sg[0].length == 0);
-+
-+      if (swiotlb) {
-+              rc = swiotlb_map_sg(hwdev, sg, nents, direction);
-+      } else {
-+              for (i = 0; i < nents; i++ ) {
-+                      BUG_ON(!sg[i].page);
-+                      sg[i].dma_address =
-+                              gnttab_dma_map_page(sg[i].page) + sg[i].offset;
-+                      sg[i].dma_length  = sg[i].length;
-+                      IOMMU_BUG_ON(address_needs_mapping(
-+                              hwdev, sg[i].dma_address));
-+                      IOMMU_BUG_ON(range_straddles_page_boundary(
-+                              page_to_pseudophys(sg[i].page) + sg[i].offset,
-+                              sg[i].length));
-+              }
-+              rc = nents;
-+      }
-+
-+      flush_write_buffers();
-+      return rc;
-+}
-+EXPORT_SYMBOL(dma_map_sg);
-+
-+void
-+dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-+           enum dma_data_direction direction)
-+{
-+      int i;
-+
-+      BUG_ON(direction == DMA_NONE);
-+      if (swiotlb)
-+              swiotlb_unmap_sg(hwdev, sg, nents, direction);
-+      else {
-+              for (i = 0; i < nents; i++ )
-+                      gnttab_dma_unmap_page(sg[i].dma_address);
-+      }
-+}
-+EXPORT_SYMBOL(dma_unmap_sg);
-+
-+#ifdef CONFIG_HIGHMEM
-+dma_addr_t
-+dma_map_page(struct device *dev, struct page *page, unsigned long offset,
-+           size_t size, enum dma_data_direction direction)
-+{
-+      dma_addr_t dma_addr;
-+
-+      BUG_ON(direction == DMA_NONE);
-+
-+      if (swiotlb) {
-+              dma_addr = swiotlb_map_page(
-+                      dev, page, offset, size, direction);
-+      } else {
-+              dma_addr = gnttab_dma_map_page(page) + offset;
-+              IOMMU_BUG_ON(address_needs_mapping(dev, dma_addr));
-+      }
-+
-+      return dma_addr;
-+}
-+EXPORT_SYMBOL(dma_map_page);
-+
-+void
-+dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-+             enum dma_data_direction direction)
-+{
-+      BUG_ON(direction == DMA_NONE);
-+      if (swiotlb)
-+              swiotlb_unmap_page(dev, dma_address, size, direction);
-+      else
-+              gnttab_dma_unmap_page(dma_address);
-+}
-+EXPORT_SYMBOL(dma_unmap_page);
-+#endif /* CONFIG_HIGHMEM */
-+
-+int
-+dma_mapping_error(dma_addr_t dma_addr)
-+{
-+      if (swiotlb)
-+              return swiotlb_dma_mapping_error(dma_addr);
-+      return 0;
-+}
-+EXPORT_SYMBOL(dma_mapping_error);
-+
-+int
-+dma_supported(struct device *dev, u64 mask)
-+{
-+      if (swiotlb)
-+              return swiotlb_dma_supported(dev, mask);
-+      /*
-+       * By default we'll BUG when an infeasible DMA is requested, and
-+       * request swiotlb=force (see IOMMU_BUG_ON).
-+       */
-+      return 1;
-+}
-+EXPORT_SYMBOL(dma_supported);
-+
-+void *dma_alloc_coherent(struct device *dev, size_t size,
-+                         dma_addr_t *dma_handle, gfp_t gfp)
-+{
-+      void *ret;
-+      struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
-+      unsigned int order = get_order(size);
-+      unsigned long vstart;
-+      u64 mask;
-+
-+      /* ignore region specifiers */
-+      gfp &= ~(__GFP_DMA | __GFP_HIGHMEM);
-+
-+      if (mem) {
-+              int page = bitmap_find_free_region(mem->bitmap, mem->size,
-+                                                   order);
-+              if (page >= 0) {
-+                      *dma_handle = mem->device_base + (page << PAGE_SHIFT);
-+                      ret = mem->virt_base + (page << PAGE_SHIFT);
-+                      memset(ret, 0, size);
-+                      return ret;
-+              }
-+              if (mem->flags & DMA_MEMORY_EXCLUSIVE)
-+                      return NULL;
-+      }
-+
-+      if (dev == NULL || (dev->coherent_dma_mask < 0xffffffff))
-+              gfp |= GFP_DMA;
-+
-+      vstart = __get_free_pages(gfp, order);
-+      ret = (void *)vstart;
-+
-+      if (dev != NULL && dev->coherent_dma_mask)
-+              mask = dev->coherent_dma_mask;
-+      else
-+              mask = 0xffffffff;
-+
-+      if (ret != NULL) {
-+              if (xen_create_contiguous_region(vstart, order,
-+                                               fls64(mask)) != 0) {
-+                      free_pages(vstart, order);
-+                      return NULL;
-+              }
-+              memset(ret, 0, size);
-+              *dma_handle = virt_to_bus(ret);
-+      }
-+      return ret;
-+}
-+EXPORT_SYMBOL(dma_alloc_coherent);
-+
-+void dma_free_coherent(struct device *dev, size_t size,
-+                       void *vaddr, dma_addr_t dma_handle)
-+{
-+      struct dma_coherent_mem *mem = dev ? dev->dma_mem : NULL;
-+      int order = get_order(size);
-+      
-+      if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {
-+              int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;
-+
-+              bitmap_release_region(mem->bitmap, page, order);
-+      } else {
-+              xen_destroy_contiguous_region((unsigned long)vaddr, order);
-+              free_pages((unsigned long)vaddr, order);
-+      }
-+}
-+EXPORT_SYMBOL(dma_free_coherent);
-+
-+#ifdef ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
-+int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
-+                              dma_addr_t device_addr, size_t size, int flags)
-+{
-+      void __iomem *mem_base;
-+      int pages = size >> PAGE_SHIFT;
-+      int bitmap_size = (pages + 31)/32;
-+
-+      if ((flags & (DMA_MEMORY_MAP | DMA_MEMORY_IO)) == 0)
-+              goto out;
-+      if (!size)
-+              goto out;
-+      if (dev->dma_mem)
-+              goto out;
-+
-+      /* FIXME: this routine just ignores DMA_MEMORY_INCLUDES_CHILDREN */
-+
-+      mem_base = ioremap(bus_addr, size);
-+      if (!mem_base)
-+              goto out;
-+
-+      dev->dma_mem = kmalloc(sizeof(struct dma_coherent_mem), GFP_KERNEL);
-+      if (!dev->dma_mem)
-+              goto out;
-+      memset(dev->dma_mem, 0, sizeof(struct dma_coherent_mem));
-+      dev->dma_mem->bitmap = kmalloc(bitmap_size, GFP_KERNEL);
-+      if (!dev->dma_mem->bitmap)
-+              goto free1_out;
-+      memset(dev->dma_mem->bitmap, 0, bitmap_size);
-+
-+      dev->dma_mem->virt_base = mem_base;
-+      dev->dma_mem->device_base = device_addr;
-+      dev->dma_mem->size = pages;
-+      dev->dma_mem->flags = flags;
-+
-+      if (flags & DMA_MEMORY_MAP)
-+              return DMA_MEMORY_MAP;
-+
-+      return DMA_MEMORY_IO;
-+
-+ free1_out:
-+      kfree(dev->dma_mem->bitmap);
-+ out:
-+      return 0;
-+}
-+EXPORT_SYMBOL(dma_declare_coherent_memory);
-+
-+void dma_release_declared_memory(struct device *dev)
-+{
-+      struct dma_coherent_mem *mem = dev->dma_mem;
-+      
-+      if(!mem)
-+              return;
-+      dev->dma_mem = NULL;
-+      iounmap(mem->virt_base);
-+      kfree(mem->bitmap);
-+      kfree(mem);
-+}
-+EXPORT_SYMBOL(dma_release_declared_memory);
-+
-+void *dma_mark_declared_memory_occupied(struct device *dev,
-+                                      dma_addr_t device_addr, size_t size)
-+{
-+      struct dma_coherent_mem *mem = dev->dma_mem;
-+      int pages = (size + (device_addr & ~PAGE_MASK) + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+      int pos, err;
-+
-+      if (!mem)
-+              return ERR_PTR(-EINVAL);
-+
-+      pos = (device_addr - mem->device_base) >> PAGE_SHIFT;
-+      err = bitmap_allocate_region(mem->bitmap, pos, get_order(pages));
-+      if (err != 0)
-+              return ERR_PTR(err);
-+      return mem->virt_base + (pos << PAGE_SHIFT);
-+}
-+EXPORT_SYMBOL(dma_mark_declared_memory_occupied);
-+#endif /* ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY */
-+
-+dma_addr_t
-+dma_map_single(struct device *dev, void *ptr, size_t size,
-+             enum dma_data_direction direction)
-+{
-+      dma_addr_t dma;
-+
-+      if (direction == DMA_NONE)
-+              BUG();
-+      WARN_ON(size == 0);
-+
-+      if (swiotlb) {
-+              dma = swiotlb_map_single(dev, ptr, size, direction);
-+      } else {
-+              dma = gnttab_dma_map_page(virt_to_page(ptr)) +
-+                    offset_in_page(ptr);
-+              IOMMU_BUG_ON(range_straddles_page_boundary(__pa(ptr), size));
-+              IOMMU_BUG_ON(address_needs_mapping(dev, dma));
-+      }
-+
-+      flush_write_buffers();
-+      return dma;
-+}
-+EXPORT_SYMBOL(dma_map_single);
-+
-+void
-+dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-+               enum dma_data_direction direction)
-+{
-+      if (direction == DMA_NONE)
-+              BUG();
-+      if (swiotlb)
-+              swiotlb_unmap_single(dev, dma_addr, size, direction);
-+      else
-+              gnttab_dma_unmap_page(dma_addr);
-+}
-+EXPORT_SYMBOL(dma_unmap_single);
-+
-+void
-+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-+                      enum dma_data_direction direction)
-+{
-+      if (swiotlb)
-+              swiotlb_sync_single_for_cpu(dev, dma_handle, size, direction);
-+}
-+EXPORT_SYMBOL(dma_sync_single_for_cpu);
-+
-+void
-+dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-+                           enum dma_data_direction direction)
-+{
-+      if (swiotlb)
-+              swiotlb_sync_single_for_device(dev, dma_handle, size, direction);
-+}
-+EXPORT_SYMBOL(dma_sync_single_for_device);
-Index: head-2008-11-25/arch/x86/kernel/process_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/process_32-xen.c   2008-07-21 11:00:32.000000000 +0200
-@@ -0,0 +1,877 @@
-+/*
-+ *  linux/arch/i386/kernel/process.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *
-+ *  Pentium III FXSR, SSE support
-+ *    Gareth Hughes <gareth@valinux.com>, May 2000
-+ */
-+
-+/*
-+ * This file handles the architecture-dependent parts of process handling..
-+ */
-+
-+#include <stdarg.h>
-+
-+#include <linux/cpu.h>
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/fs.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/elfcore.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/stddef.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/user.h>
-+#include <linux/a.out.h>
-+#include <linux/interrupt.h>
-+#include <linux/utsname.h>
-+#include <linux/delay.h>
-+#include <linux/reboot.h>
-+#include <linux/init.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/module.h>
-+#include <linux/kallsyms.h>
-+#include <linux/ptrace.h>
-+#include <linux/random.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/ldt.h>
-+#include <asm/processor.h>
-+#include <asm/i387.h>
-+#include <asm/desc.h>
-+#include <asm/vm86.h>
-+#ifdef CONFIG_MATH_EMULATION
-+#include <asm/math_emu.h>
-+#endif
-+
-+#include <xen/interface/physdev.h>
-+#include <xen/interface/vcpu.h>
-+#include <xen/cpu_hotplug.h>
-+
-+#include <linux/err.h>
-+
-+#include <asm/tlbflush.h>
-+#include <asm/cpu.h>
-+
-+asmlinkage void ret_from_fork(void) __asm__("ret_from_fork");
-+
-+static int hlt_counter;
-+
-+unsigned long boot_option_idle_override = 0;
-+EXPORT_SYMBOL(boot_option_idle_override);
-+
-+/*
-+ * Return saved PC of a blocked thread.
-+ */
-+unsigned long thread_saved_pc(struct task_struct *tsk)
-+{
-+      return ((unsigned long *)tsk->thread.esp)[3];
-+}
-+
-+/*
-+ * Powermanagement idle function, if any..
-+ */
-+void (*pm_idle)(void);
-+EXPORT_SYMBOL(pm_idle);
-+static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
-+
-+void disable_hlt(void)
-+{
-+      hlt_counter++;
-+}
-+
-+EXPORT_SYMBOL(disable_hlt);
-+
-+void enable_hlt(void)
-+{
-+      hlt_counter--;
-+}
-+
-+EXPORT_SYMBOL(enable_hlt);
-+
-+/*
-+ * On SMP it's slightly faster (but much more power-consuming!)
-+ * to poll the ->work.need_resched flag instead of waiting for the
-+ * cross-CPU IPI to arrive. Use this option with caution.
-+ */
-+static void poll_idle (void)
-+{
-+      local_irq_enable();
-+
-+      asm volatile(
-+              "2:"
-+              "testl %0, %1;"
-+              "rep; nop;"
-+              "je 2b;"
-+              : : "i"(_TIF_NEED_RESCHED), "m" (current_thread_info()->flags));
-+}
-+
-+static void xen_idle(void)
-+{
-+      local_irq_disable();
-+
-+      if (need_resched())
-+              local_irq_enable();
-+      else {
-+              current_thread_info()->status &= ~TS_POLLING;
-+              smp_mb__after_clear_bit();
-+              safe_halt();
-+              current_thread_info()->status |= TS_POLLING;
-+      }
-+}
-+#ifdef CONFIG_APM_MODULE
-+EXPORT_SYMBOL(default_idle);
-+#endif
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+extern cpumask_t cpu_initialized;
-+static inline void play_dead(void)
-+{
-+      idle_task_exit();
-+      local_irq_disable();
-+      cpu_clear(smp_processor_id(), cpu_initialized);
-+      preempt_enable_no_resched();
-+      VOID(HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL));
-+      cpu_bringup();
-+}
-+#else
-+static inline void play_dead(void)
-+{
-+      BUG();
-+}
-+#endif /* CONFIG_HOTPLUG_CPU */
-+
-+/*
-+ * The idle thread. There's no useful work to be
-+ * done, so just try to conserve power and have a
-+ * low exit latency (ie sit in a loop waiting for
-+ * somebody to say that they'd like to reschedule)
-+ */
-+void cpu_idle(void)
-+{
-+      int cpu = smp_processor_id();
-+
-+      current_thread_info()->status |= TS_POLLING;
-+
-+      /* endless idle loop with no priority at all */
-+      while (1) {
-+              while (!need_resched()) {
-+                      void (*idle)(void);
-+
-+                      if (__get_cpu_var(cpu_idle_state))
-+                              __get_cpu_var(cpu_idle_state) = 0;
-+
-+                      rmb();
-+                      idle = xen_idle; /* no alternatives */
-+
-+                      if (cpu_is_offline(cpu))
-+                              play_dead();
-+
-+                      __get_cpu_var(irq_stat).idle_timestamp = jiffies;
-+                      idle();
-+              }
-+              preempt_enable_no_resched();
-+              schedule();
-+              preempt_disable();
-+      }
-+}
-+
-+void cpu_idle_wait(void)
-+{
-+      unsigned int cpu, this_cpu = get_cpu();
-+      cpumask_t map;
-+
-+      set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
-+      put_cpu();
-+
-+      cpus_clear(map);
-+      for_each_online_cpu(cpu) {
-+              per_cpu(cpu_idle_state, cpu) = 1;
-+              cpu_set(cpu, map);
-+      }
-+
-+      __get_cpu_var(cpu_idle_state) = 0;
-+
-+      wmb();
-+      do {
-+              ssleep(1);
-+              for_each_online_cpu(cpu) {
-+                      if (cpu_isset(cpu, map) && !per_cpu(cpu_idle_state, cpu))
-+                              cpu_clear(cpu, map);
-+              }
-+              cpus_and(map, map, cpu_online_map);
-+      } while (!cpus_empty(map));
-+}
-+EXPORT_SYMBOL_GPL(cpu_idle_wait);
-+
-+void __devinit select_idle_routine(const struct cpuinfo_x86 *c)
-+{
-+}
-+
-+static int __init idle_setup (char *str)
-+{
-+      if (!strncmp(str, "poll", 4)) {
-+              printk("using polling idle threads.\n");
-+              pm_idle = poll_idle;
-+      }
-+
-+      boot_option_idle_override = 1;
-+      return 1;
-+}
-+
-+__setup("idle=", idle_setup);
-+
-+void show_regs(struct pt_regs * regs)
-+{
-+      unsigned long cr0 = 0L, cr2 = 0L, cr3 = 0L, cr4 = 0L;
-+
-+      printk("\n");
-+      printk("Pid: %d, comm: %20s\n", current->pid, current->comm);
-+      printk("EIP: %04x:[<%08lx>] CPU: %d\n",0xffff & regs->xcs,regs->eip, smp_processor_id());
-+      print_symbol("EIP is at %s\n", regs->eip);
-+
-+      if (user_mode_vm(regs))
-+              printk(" ESP: %04x:%08lx",0xffff & regs->xss,regs->esp);
-+      printk(" EFLAGS: %08lx    %s  (%s %.*s)\n",
-+             regs->eflags, print_tainted(), system_utsname.release,
-+             (int)strcspn(system_utsname.version, " "),
-+             system_utsname.version);
-+      printk("EAX: %08lx EBX: %08lx ECX: %08lx EDX: %08lx\n",
-+              regs->eax,regs->ebx,regs->ecx,regs->edx);
-+      printk("ESI: %08lx EDI: %08lx EBP: %08lx",
-+              regs->esi, regs->edi, regs->ebp);
-+      printk(" DS: %04x ES: %04x\n",
-+              0xffff & regs->xds,0xffff & regs->xes);
-+
-+      cr0 = read_cr0();
-+      cr2 = read_cr2();
-+      cr3 = read_cr3();
-+      cr4 = read_cr4_safe();
-+      printk("CR0: %08lx CR2: %08lx CR3: %08lx CR4: %08lx\n", cr0, cr2, cr3, cr4);
-+      show_trace(NULL, regs, &regs->esp);
-+}
-+
-+/*
-+ * This gets run with %ebx containing the
-+ * function to call, and %edx containing
-+ * the "args".
-+ */
-+extern void kernel_thread_helper(void);
-+__asm__(".section .text\n"
-+      ".align 4\n"
-+      "kernel_thread_helper:\n\t"
-+      "movl %edx,%eax\n\t"
-+      "pushl %edx\n\t"
-+      "call *%ebx\n\t"
-+      "pushl %eax\n\t"
-+      "call do_exit\n"
-+      ".previous");
-+
-+/*
-+ * Create a kernel thread
-+ */
-+int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-+{
-+      struct pt_regs regs;
-+
-+      memset(&regs, 0, sizeof(regs));
-+
-+      regs.ebx = (unsigned long) fn;
-+      regs.edx = (unsigned long) arg;
-+
-+      regs.xds = __USER_DS;
-+      regs.xes = __USER_DS;
-+      regs.orig_eax = -1;
-+      regs.eip = (unsigned long) kernel_thread_helper;
-+      regs.xcs = GET_KERNEL_CS();
-+      regs.eflags = X86_EFLAGS_IF | X86_EFLAGS_SF | X86_EFLAGS_PF | 0x2;
-+
-+      /* Ok, create the new process.. */
-+      return do_fork(flags | CLONE_VM | CLONE_UNTRACED, 0, &regs, 0, NULL, NULL);
-+}
-+EXPORT_SYMBOL(kernel_thread);
-+
-+/*
-+ * Free current thread data structures etc..
-+ */
-+void exit_thread(void)
-+{
-+      /* The process may have allocated an io port bitmap... nuke it. */
-+      if (unlikely(test_thread_flag(TIF_IO_BITMAP))) {
-+              struct task_struct *tsk = current;
-+              struct thread_struct *t = &tsk->thread;
-+              struct physdev_set_iobitmap set_iobitmap;
-+              memset(&set_iobitmap, 0, sizeof(set_iobitmap));
-+              WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
-+                                            &set_iobitmap));
-+              kfree(t->io_bitmap_ptr);
-+              t->io_bitmap_ptr = NULL;
-+              clear_thread_flag(TIF_IO_BITMAP);
-+      }
-+}
-+
-+void flush_thread(void)
-+{
-+      struct task_struct *tsk = current;
-+
-+      memset(tsk->thread.debugreg, 0, sizeof(unsigned long)*8);
-+      memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
-+      clear_tsk_thread_flag(tsk, TIF_DEBUG);
-+      /*
-+       * Forget coprocessor state..
-+       */
-+      clear_fpu(tsk);
-+      clear_used_math();
-+}
-+
-+void release_thread(struct task_struct *dead_task)
-+{
-+      BUG_ON(dead_task->mm);
-+      release_vm86_irqs(dead_task);
-+}
-+
-+/*
-+ * This gets called before we allocate a new thread and copy
-+ * the current task into it.
-+ */
-+void prepare_to_copy(struct task_struct *tsk)
-+{
-+      unlazy_fpu(tsk);
-+}
-+
-+int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
-+      unsigned long unused,
-+      struct task_struct * p, struct pt_regs * regs)
-+{
-+      struct pt_regs * childregs;
-+      struct task_struct *tsk;
-+      int err;
-+
-+      childregs = task_pt_regs(p);
-+      *childregs = *regs;
-+      childregs->eax = 0;
-+      childregs->esp = esp;
-+
-+      p->thread.esp = (unsigned long) childregs;
-+      p->thread.esp0 = (unsigned long) (childregs+1);
-+
-+      p->thread.eip = (unsigned long) ret_from_fork;
-+
-+      savesegment(fs,p->thread.fs);
-+      savesegment(gs,p->thread.gs);
-+
-+      tsk = current;
-+      if (unlikely(test_tsk_thread_flag(tsk, TIF_IO_BITMAP))) {
-+              p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-+              if (!p->thread.io_bitmap_ptr) {
-+                      p->thread.io_bitmap_max = 0;
-+                      return -ENOMEM;
-+              }
-+              memcpy(p->thread.io_bitmap_ptr, tsk->thread.io_bitmap_ptr,
-+                      IO_BITMAP_BYTES);
-+              set_tsk_thread_flag(p, TIF_IO_BITMAP);
-+      }
-+
-+      /*
-+       * Set a new TLS for the child thread?
-+       */
-+      if (clone_flags & CLONE_SETTLS) {
-+              struct desc_struct *desc;
-+              struct user_desc info;
-+              int idx;
-+
-+              err = -EFAULT;
-+              if (copy_from_user(&info, (void __user *)childregs->esi, sizeof(info)))
-+                      goto out;
-+              err = -EINVAL;
-+              if (LDT_empty(&info))
-+                      goto out;
-+
-+              idx = info.entry_number;
-+              if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-+                      goto out;
-+
-+              desc = p->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
-+              desc->a = LDT_entry_a(&info);
-+              desc->b = LDT_entry_b(&info);
-+      }
-+
-+      p->thread.iopl = current->thread.iopl;
-+
-+      err = 0;
-+ out:
-+      if (err && p->thread.io_bitmap_ptr) {
-+              kfree(p->thread.io_bitmap_ptr);
-+              p->thread.io_bitmap_max = 0;
-+      }
-+      return err;
-+}
-+
-+/*
-+ * fill in the user structure for a core dump..
-+ */
-+void dump_thread(struct pt_regs * regs, struct user * dump)
-+{
-+      int i;
-+
-+/* changed the size calculations - should hopefully work better. lbt */
-+      dump->magic = CMAGIC;
-+      dump->start_code = 0;
-+      dump->start_stack = regs->esp & ~(PAGE_SIZE - 1);
-+      dump->u_tsize = ((unsigned long) current->mm->end_code) >> PAGE_SHIFT;
-+      dump->u_dsize = ((unsigned long) (current->mm->brk + (PAGE_SIZE-1))) >> PAGE_SHIFT;
-+      dump->u_dsize -= dump->u_tsize;
-+      dump->u_ssize = 0;
-+      for (i = 0; i < 8; i++)
-+              dump->u_debugreg[i] = current->thread.debugreg[i];  
-+
-+      if (dump->start_stack < TASK_SIZE)
-+              dump->u_ssize = ((unsigned long) (TASK_SIZE - dump->start_stack)) >> PAGE_SHIFT;
-+
-+      dump->regs.ebx = regs->ebx;
-+      dump->regs.ecx = regs->ecx;
-+      dump->regs.edx = regs->edx;
-+      dump->regs.esi = regs->esi;
-+      dump->regs.edi = regs->edi;
-+      dump->regs.ebp = regs->ebp;
-+      dump->regs.eax = regs->eax;
-+      dump->regs.ds = regs->xds;
-+      dump->regs.es = regs->xes;
-+      savesegment(fs,dump->regs.fs);
-+      savesegment(gs,dump->regs.gs);
-+      dump->regs.orig_eax = regs->orig_eax;
-+      dump->regs.eip = regs->eip;
-+      dump->regs.cs = regs->xcs;
-+      dump->regs.eflags = regs->eflags;
-+      dump->regs.esp = regs->esp;
-+      dump->regs.ss = regs->xss;
-+
-+      dump->u_fpvalid = dump_fpu (regs, &dump->i387);
-+}
-+EXPORT_SYMBOL(dump_thread);
-+
-+/* 
-+ * Capture the user space registers if the task is not running (in user space)
-+ */
-+int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
-+{
-+      struct pt_regs ptregs = *task_pt_regs(tsk);
-+      ptregs.xcs &= 0xffff;
-+      ptregs.xds &= 0xffff;
-+      ptregs.xes &= 0xffff;
-+      ptregs.xss &= 0xffff;
-+
-+      elf_core_copy_regs(regs, &ptregs);
-+
-+      return 1;
-+}
-+
-+static noinline void __switch_to_xtra(struct task_struct *next_p)
-+{
-+      struct thread_struct *next;
-+
-+      next = &next_p->thread;
-+
-+      if (test_tsk_thread_flag(next_p, TIF_DEBUG)) {
-+              set_debugreg(next->debugreg[0], 0);
-+              set_debugreg(next->debugreg[1], 1);
-+              set_debugreg(next->debugreg[2], 2);
-+              set_debugreg(next->debugreg[3], 3);
-+              /* no 4 and 5 */
-+              set_debugreg(next->debugreg[6], 6);
-+              set_debugreg(next->debugreg[7], 7);
-+      }
-+}
-+
-+/*
-+ * This function selects if the context switch from prev to next
-+ * has to tweak the TSC disable bit in the cr4.
-+ */
-+static inline void disable_tsc(struct task_struct *prev_p,
-+                             struct task_struct *next_p)
-+{
-+      struct thread_info *prev, *next;
-+
-+      /*
-+       * gcc should eliminate the ->thread_info dereference if
-+       * has_secure_computing returns 0 at compile time (SECCOMP=n).
-+       */
-+      prev = task_thread_info(prev_p);
-+      next = task_thread_info(next_p);
-+
-+      if (has_secure_computing(prev) || has_secure_computing(next)) {
-+              /* slow path here */
-+              if (has_secure_computing(prev) &&
-+                  !has_secure_computing(next)) {
-+                      write_cr4(read_cr4() & ~X86_CR4_TSD);
-+              } else if (!has_secure_computing(prev) &&
-+                         has_secure_computing(next))
-+                      write_cr4(read_cr4() | X86_CR4_TSD);
-+      }
-+}
-+
-+/*
-+ *    switch_to(x,yn) should switch tasks from x to y.
-+ *
-+ * We fsave/fwait so that an exception goes off at the right time
-+ * (as a call from the fsave or fwait in effect) rather than to
-+ * the wrong process. Lazy FP saving no longer makes any sense
-+ * with modern CPU's, and this simplifies a lot of things (SMP
-+ * and UP become the same).
-+ *
-+ * NOTE! We used to use the x86 hardware context switching. The
-+ * reason for not using it any more becomes apparent when you
-+ * try to recover gracefully from saved state that is no longer
-+ * valid (stale segment register values in particular). With the
-+ * hardware task-switch, there is no way to fix up bad state in
-+ * a reasonable manner.
-+ *
-+ * The fact that Intel documents the hardware task-switching to
-+ * be slow is a fairly red herring - this code is not noticeably
-+ * faster. However, there _is_ some room for improvement here,
-+ * so the performance issues may eventually be a valid point.
-+ * More important, however, is the fact that this allows us much
-+ * more flexibility.
-+ *
-+ * The return value (in %eax) will be the "prev" task after
-+ * the task-switch, and shows up in ret_from_fork in entry.S,
-+ * for example.
-+ */
-+struct task_struct fastcall * __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
-+{
-+      struct thread_struct *prev = &prev_p->thread,
-+                               *next = &next_p->thread;
-+      int cpu = smp_processor_id();
-+#ifndef CONFIG_X86_NO_TSS
-+      struct tss_struct *tss = &per_cpu(init_tss, cpu);
-+#endif
-+#if CONFIG_XEN_COMPAT > 0x030002
-+      struct physdev_set_iopl iopl_op;
-+      struct physdev_set_iobitmap iobmp_op;
-+#else
-+      struct physdev_op _pdo[2], *pdo = _pdo;
-+#define iopl_op pdo->u.set_iopl
-+#define iobmp_op pdo->u.set_iobitmap
-+#endif
-+      multicall_entry_t _mcl[8], *mcl = _mcl;
-+
-+      /* XEN NOTE: FS/GS saved in switch_mm(), not here. */
-+
-+      /*
-+       * This is basically '__unlazy_fpu', except that we queue a
-+       * multicall to indicate FPU task switch, rather than
-+       * synchronously trapping to Xen.
-+       */
-+      if (prev_p->thread_info->status & TS_USEDFPU) {
-+              __save_init_fpu(prev_p); /* _not_ save_init_fpu() */
-+              mcl->op      = __HYPERVISOR_fpu_taskswitch;
-+              mcl->args[0] = 1;
-+              mcl++;
-+      }
-+#if 0 /* lazy fpu sanity check */
-+      else BUG_ON(!(read_cr0() & 8));
-+#endif
-+
-+      /*
-+       * Reload esp0.
-+       * This is load_esp0(tss, next) with a multicall.
-+       */
-+      mcl->op      = __HYPERVISOR_stack_switch;
-+      mcl->args[0] = __KERNEL_DS;
-+      mcl->args[1] = next->esp0;
-+      mcl++;
-+
-+      /*
-+       * Load the per-thread Thread-Local Storage descriptor.
-+       * This is load_TLS(next, cpu) with multicalls.
-+       */
-+#define C(i) do {                                                     \
-+      if (unlikely(next->tls_array[i].a != prev->tls_array[i].a ||    \
-+                   next->tls_array[i].b != prev->tls_array[i].b)) {   \
-+              mcl->op = __HYPERVISOR_update_descriptor;               \
-+              *(u64 *)&mcl->args[0] = virt_to_machine(                \
-+                      &get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i]);\
-+              *(u64 *)&mcl->args[2] = *(u64 *)&next->tls_array[i];    \
-+              mcl++;                                                  \
-+      }                                                               \
-+} while (0)
-+      C(0); C(1); C(2);
-+#undef C
-+
-+      if (unlikely(prev->iopl != next->iopl)) {
-+              iopl_op.iopl = (next->iopl == 0) ? 1 : (next->iopl >> 12) & 3;
-+#if CONFIG_XEN_COMPAT > 0x030002
-+              mcl->op      = __HYPERVISOR_physdev_op;
-+              mcl->args[0] = PHYSDEVOP_set_iopl;
-+              mcl->args[1] = (unsigned long)&iopl_op;
-+#else
-+              mcl->op      = __HYPERVISOR_physdev_op_compat;
-+              pdo->cmd     = PHYSDEVOP_set_iopl;
-+              mcl->args[0] = (unsigned long)pdo++;
-+#endif
-+              mcl++;
-+      }
-+
-+      if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) {
-+              set_xen_guest_handle(iobmp_op.bitmap,
-+                                   (char *)next->io_bitmap_ptr);
-+              iobmp_op.nr_ports = next->io_bitmap_ptr ? IO_BITMAP_BITS : 0;
-+#if CONFIG_XEN_COMPAT > 0x030002
-+              mcl->op      = __HYPERVISOR_physdev_op;
-+              mcl->args[0] = PHYSDEVOP_set_iobitmap;
-+              mcl->args[1] = (unsigned long)&iobmp_op;
-+#else
-+              mcl->op      = __HYPERVISOR_physdev_op_compat;
-+              pdo->cmd     = PHYSDEVOP_set_iobitmap;
-+              mcl->args[0] = (unsigned long)pdo++;
-+#endif
-+              mcl++;
-+      }
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      BUG_ON(pdo > _pdo + ARRAY_SIZE(_pdo));
-+#endif
-+      BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
-+      if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
-+              BUG();
-+
-+      /*
-+       * Restore %fs and %gs if needed.
-+       *
-+       * Glibc normally makes %fs be zero, and %gs is one of
-+       * the TLS segments.
-+       */
-+      if (unlikely(next->fs))
-+              loadsegment(fs, next->fs);
-+
-+      if (next->gs)
-+              loadsegment(gs, next->gs);
-+
-+      /*
-+       * Now maybe handle debug registers
-+       */
-+      if (unlikely(task_thread_info(next_p)->flags & _TIF_WORK_CTXSW))
-+              __switch_to_xtra(next_p);
-+
-+      disable_tsc(prev_p, next_p);
-+
-+      return prev_p;
-+}
-+
-+asmlinkage int sys_fork(struct pt_regs regs)
-+{
-+      return do_fork(SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
-+}
-+
-+asmlinkage int sys_clone(struct pt_regs regs)
-+{
-+      unsigned long clone_flags;
-+      unsigned long newsp;
-+      int __user *parent_tidptr, *child_tidptr;
-+
-+      clone_flags = regs.ebx;
-+      newsp = regs.ecx;
-+      parent_tidptr = (int __user *)regs.edx;
-+      child_tidptr = (int __user *)regs.edi;
-+      if (!newsp)
-+              newsp = regs.esp;
-+      return do_fork(clone_flags, newsp, &regs, 0, parent_tidptr, child_tidptr);
-+}
-+
-+/*
-+ * This is trivial, and on the face of it looks like it
-+ * could equally well be done in user mode.
-+ *
-+ * Not so, for quite unobvious reasons - register pressure.
-+ * In user mode vfork() cannot have a stack frame, and if
-+ * done by calling the "clone()" system call directly, you
-+ * do not have enough call-clobbered registers to hold all
-+ * the information you need.
-+ */
-+asmlinkage int sys_vfork(struct pt_regs regs)
-+{
-+      return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs.esp, &regs, 0, NULL, NULL);
-+}
-+
-+/*
-+ * sys_execve() executes a new program.
-+ */
-+asmlinkage int sys_execve(struct pt_regs regs)
-+{
-+      int error;
-+      char * filename;
-+
-+      filename = getname((char __user *) regs.ebx);
-+      error = PTR_ERR(filename);
-+      if (IS_ERR(filename))
-+              goto out;
-+      error = do_execve(filename,
-+                      (char __user * __user *) regs.ecx,
-+                      (char __user * __user *) regs.edx,
-+                      &regs);
-+      if (error == 0) {
-+              task_lock(current);
-+              current->ptrace &= ~PT_DTRACE;
-+              task_unlock(current);
-+              /* Make sure we don't return using sysenter.. */
-+              set_thread_flag(TIF_IRET);
-+      }
-+      putname(filename);
-+out:
-+      return error;
-+}
-+
-+#define top_esp                (THREAD_SIZE - sizeof(unsigned long))
-+#define top_ebp                (THREAD_SIZE - 2*sizeof(unsigned long))
-+
-+unsigned long get_wchan(struct task_struct *p)
-+{
-+      unsigned long ebp, esp, eip;
-+      unsigned long stack_page;
-+      int count = 0;
-+      if (!p || p == current || p->state == TASK_RUNNING)
-+              return 0;
-+      stack_page = (unsigned long)task_stack_page(p);
-+      esp = p->thread.esp;
-+      if (!stack_page || esp < stack_page || esp > top_esp+stack_page)
-+              return 0;
-+      /* include/asm-i386/system.h:switch_to() pushes ebp last. */
-+      ebp = *(unsigned long *) esp;
-+      do {
-+              if (ebp < stack_page || ebp > top_ebp+stack_page)
-+                      return 0;
-+              eip = *(unsigned long *) (ebp+4);
-+              if (!in_sched_functions(eip))
-+                      return eip;
-+              ebp = *(unsigned long *) ebp;
-+      } while (count++ < 16);
-+      return 0;
-+}
-+
-+/*
-+ * sys_alloc_thread_area: get a yet unused TLS descriptor index.
-+ */
-+static int get_free_idx(void)
-+{
-+      struct thread_struct *t = &current->thread;
-+      int idx;
-+
-+      for (idx = 0; idx < GDT_ENTRY_TLS_ENTRIES; idx++)
-+              if (desc_empty(t->tls_array + idx))
-+                      return idx + GDT_ENTRY_TLS_MIN;
-+      return -ESRCH;
-+}
-+
-+/*
-+ * Set a given TLS descriptor:
-+ */
-+asmlinkage int sys_set_thread_area(struct user_desc __user *u_info)
-+{
-+      struct thread_struct *t = &current->thread;
-+      struct user_desc info;
-+      struct desc_struct *desc;
-+      int cpu, idx;
-+
-+      if (copy_from_user(&info, u_info, sizeof(info)))
-+              return -EFAULT;
-+      idx = info.entry_number;
-+
-+      /*
-+       * index -1 means the kernel should try to find and
-+       * allocate an empty descriptor:
-+       */
-+      if (idx == -1) {
-+              idx = get_free_idx();
-+              if (idx < 0)
-+                      return idx;
-+              if (put_user(idx, &u_info->entry_number))
-+                      return -EFAULT;
-+      }
-+
-+      if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-+              return -EINVAL;
-+
-+      desc = t->tls_array + idx - GDT_ENTRY_TLS_MIN;
-+
-+      /*
-+       * We must not get preempted while modifying the TLS.
-+       */
-+      cpu = get_cpu();
-+
-+      if (LDT_empty(&info)) {
-+              desc->a = 0;
-+              desc->b = 0;
-+      } else {
-+              desc->a = LDT_entry_a(&info);
-+              desc->b = LDT_entry_b(&info);
-+      }
-+      load_TLS(t, cpu);
-+
-+      put_cpu();
-+
-+      return 0;
-+}
-+
-+/*
-+ * Get the current Thread-Local Storage area:
-+ */
-+
-+#define GET_BASE(desc) ( \
-+      (((desc)->a >> 16) & 0x0000ffff) | \
-+      (((desc)->b << 16) & 0x00ff0000) | \
-+      ( (desc)->b        & 0xff000000)   )
-+
-+#define GET_LIMIT(desc) ( \
-+      ((desc)->a & 0x0ffff) | \
-+       ((desc)->b & 0xf0000) )
-+      
-+#define GET_32BIT(desc)               (((desc)->b >> 22) & 1)
-+#define GET_CONTENTS(desc)    (((desc)->b >> 10) & 3)
-+#define GET_WRITABLE(desc)    (((desc)->b >>  9) & 1)
-+#define GET_LIMIT_PAGES(desc) (((desc)->b >> 23) & 1)
-+#define GET_PRESENT(desc)     (((desc)->b >> 15) & 1)
-+#define GET_USEABLE(desc)     (((desc)->b >> 20) & 1)
-+
-+asmlinkage int sys_get_thread_area(struct user_desc __user *u_info)
-+{
-+      struct user_desc info;
-+      struct desc_struct *desc;
-+      int idx;
-+
-+      if (get_user(idx, &u_info->entry_number))
-+              return -EFAULT;
-+      if (idx < GDT_ENTRY_TLS_MIN || idx > GDT_ENTRY_TLS_MAX)
-+              return -EINVAL;
-+
-+      memset(&info, 0, sizeof(info));
-+
-+      desc = current->thread.tls_array + idx - GDT_ENTRY_TLS_MIN;
-+
-+      info.entry_number = idx;
-+      info.base_addr = GET_BASE(desc);
-+      info.limit = GET_LIMIT(desc);
-+      info.seg_32bit = GET_32BIT(desc);
-+      info.contents = GET_CONTENTS(desc);
-+      info.read_exec_only = !GET_WRITABLE(desc);
-+      info.limit_in_pages = GET_LIMIT_PAGES(desc);
-+      info.seg_not_present = !GET_PRESENT(desc);
-+      info.useable = GET_USEABLE(desc);
-+
-+      if (copy_to_user(u_info, &info, sizeof(info)))
-+              return -EFAULT;
-+      return 0;
-+}
-+
-+unsigned long arch_align_stack(unsigned long sp)
-+{
-+      if (randomize_va_space)
-+              sp -= get_random_int() % 8192;
-+      return sp & ~0xf;
-+}
-Index: head-2008-11-25/arch/x86/kernel/quirks-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/quirks-xen.c       2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,47 @@
-+/*
-+ * This file contains work-arounds for x86 and x86_64 platform bugs.
-+ */
-+#include <linux/pci.h>
-+#include <linux/irq.h>
-+
-+#if defined(CONFIG_X86_IO_APIC) && (defined(CONFIG_SMP) || defined(CONFIG_XEN)) && defined(CONFIG_PCI)
-+
-+static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
-+{
-+      u8 config, rev;
-+      u32 word;
-+
-+      /* BIOS may enable hardware IRQ balancing for
-+       * E7520/E7320/E7525(revision ID 0x9 and below)
-+       * based platforms.
-+       * Disable SW irqbalance/affinity on those platforms.
-+       */
-+      pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
-+      if (rev > 0x9)
-+              return;
-+
-+      printk(KERN_INFO "Intel E7520/7320/7525 detected.");
-+
-+      /* enable access to config space*/
-+      pci_read_config_byte(dev, 0xf4, &config);
-+      pci_write_config_byte(dev, 0xf4, config|0x2);
-+
-+      /* read xTPR register */
-+      raw_pci_ops->read(0, 0, 0x40, 0x4c, 2, &word);
-+
-+      if (!(word & (1 << 13))) {
-+              struct xen_platform_op op;
-+              printk(KERN_INFO "Disabling irq balancing and affinity\n");
-+              op.cmd = XENPF_platform_quirk;
-+              op.u.platform_quirk.quirk_id = QUIRK_NOIRQBALANCING;
-+              WARN_ON(HYPERVISOR_platform_op(&op));
-+      }
-+
-+      /* put back the original value for config space*/
-+      if (!(config & 0x2))
-+              pci_write_config_byte(dev, 0xf4, config);
-+}
-+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_E7320_MCH,  quirk_intel_irqbalance);
-+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_E7525_MCH,  quirk_intel_irqbalance);
-+DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_E7520_MCH,  quirk_intel_irqbalance);
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/setup_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/setup_32-xen.c     2008-04-22 15:41:51.000000000 +0200
-@@ -0,0 +1,1919 @@
-+/*
-+ *  linux/arch/i386/kernel/setup.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *
-+ *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
-+ *
-+ *  Memory region support
-+ *    David Parsons <orc@pell.chi.il.us>, July-August 1999
-+ *
-+ *  Added E820 sanitization routine (removes overlapping memory regions);
-+ *  Brian Moyle <bmoyle@mvista.com>, February 2001
-+ *
-+ * Moved CPU detection code to cpu/${cpu}.c
-+ *    Patrick Mochel <mochel@osdl.org>, March 2002
-+ *
-+ *  Provisions for empty E820 memory regions (reported by certain BIOSes).
-+ *  Alex Achenbach <xela@slit.de>, December 2002.
-+ *
-+ */
-+
-+/*
-+ * This file handles the architecture-dependent parts of initialization
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/mmzone.h>
-+#include <linux/screen_info.h>
-+#include <linux/ioport.h>
-+#include <linux/acpi.h>
-+#include <linux/apm_bios.h>
-+#include <linux/initrd.h>
-+#include <linux/bootmem.h>
-+#include <linux/seq_file.h>
-+#include <linux/platform_device.h>
-+#include <linux/console.h>
-+#include <linux/mca.h>
-+#include <linux/root_dev.h>
-+#include <linux/highmem.h>
-+#include <linux/module.h>
-+#include <linux/efi.h>
-+#include <linux/init.h>
-+#include <linux/edd.h>
-+#include <linux/nodemask.h>
-+#include <linux/kernel.h>
-+#include <linux/percpu.h>
-+#include <linux/notifier.h>
-+#include <linux/kexec.h>
-+#include <linux/crash_dump.h>
-+#include <linux/dmi.h>
-+#include <linux/pfn.h>
-+
-+#include <video/edid.h>
-+
-+#include <asm/apic.h>
-+#include <asm/e820.h>
-+#include <asm/mpspec.h>
-+#include <asm/setup.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/sections.h>
-+#include <asm/io_apic.h>
-+#include <asm/ist.h>
-+#include <asm/io.h>
-+#include <asm/hypervisor.h>
-+#include <xen/interface/physdev.h>
-+#include <xen/interface/memory.h>
-+#include <xen/features.h>
-+#include <xen/firmware.h>
-+#include <xen/xencons.h>
-+#include <setup_arch.h>
-+#include <bios_ebda.h>
-+
-+#ifdef CONFIG_XEN
-+#include <xen/interface/kexec.h>
-+#endif
-+
-+/* Forward Declaration. */
-+void __init find_max_pfn(void);
-+
-+static int xen_panic_event(struct notifier_block *, unsigned long, void *);
-+static struct notifier_block xen_panic_block = {
-+      xen_panic_event, NULL, 0 /* try to go last */
-+};
-+
-+extern char hypercall_page[PAGE_SIZE];
-+EXPORT_SYMBOL(hypercall_page);
-+
-+int disable_pse __devinitdata = 0;
-+
-+/*
-+ * Machine setup..
-+ */
-+
-+#ifdef CONFIG_EFI
-+int efi_enabled = 0;
-+EXPORT_SYMBOL(efi_enabled);
-+#endif
-+
-+/* cpu data as detected by the assembly code in head.S */
-+struct cpuinfo_x86 new_cpu_data __initdata = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
-+/* common cpu data for all cpus */
-+struct cpuinfo_x86 boot_cpu_data __read_mostly = { 0, 0, 0, 0, -1, 1, 0, 0, -1 };
-+EXPORT_SYMBOL(boot_cpu_data);
-+
-+unsigned long mmu_cr4_features;
-+
-+#ifdef        CONFIG_ACPI
-+      int acpi_disabled = 0;
-+#else
-+      int acpi_disabled = 1;
-+#endif
-+EXPORT_SYMBOL(acpi_disabled);
-+
-+#ifdef        CONFIG_ACPI
-+int __initdata acpi_force = 0;
-+extern acpi_interrupt_flags   acpi_sci_flags;
-+#endif
-+
-+/* for MCA, but anyone else can use it if they want */
-+unsigned int machine_id;
-+#ifdef CONFIG_MCA
-+EXPORT_SYMBOL(machine_id);
-+#endif
-+unsigned int machine_submodel_id;
-+unsigned int BIOS_revision;
-+unsigned int mca_pentium_flag;
-+
-+/* For PCI or other memory-mapped resources */
-+unsigned long pci_mem_start = 0x10000000;
-+#ifdef CONFIG_PCI
-+EXPORT_SYMBOL(pci_mem_start);
-+#endif
-+
-+/* Boot loader ID as an integer, for the benefit of proc_dointvec */
-+int bootloader_type;
-+
-+/* user-defined highmem size */
-+static unsigned int highmem_pages = -1;
-+
-+/*
-+ * Setup options
-+ */
-+struct drive_info_struct { char dummy[32]; } drive_info;
-+#if defined(CONFIG_BLK_DEV_IDE) || defined(CONFIG_BLK_DEV_HD) || \
-+    defined(CONFIG_BLK_DEV_IDE_MODULE) || defined(CONFIG_BLK_DEV_HD_MODULE)
-+EXPORT_SYMBOL(drive_info);
-+#endif
-+struct screen_info screen_info;
-+EXPORT_SYMBOL(screen_info);
-+struct apm_info apm_info;
-+EXPORT_SYMBOL(apm_info);
-+struct sys_desc_table_struct {
-+      unsigned short length;
-+      unsigned char table[0];
-+};
-+struct edid_info edid_info;
-+EXPORT_SYMBOL_GPL(edid_info);
-+#ifndef CONFIG_XEN
-+#define copy_edid() (edid_info = EDID_INFO)
-+#endif
-+struct ist_info ist_info;
-+#if defined(CONFIG_X86_SPEEDSTEP_SMI) || \
-+      defined(CONFIG_X86_SPEEDSTEP_SMI_MODULE)
-+EXPORT_SYMBOL(ist_info);
-+#endif
-+struct e820map e820;
-+#ifdef CONFIG_XEN
-+struct e820map machine_e820;
-+#endif
-+
-+extern void early_cpu_init(void);
-+extern void generic_apic_probe(char *);
-+extern int root_mountflags;
-+
-+unsigned long saved_videomode;
-+
-+#define RAMDISK_IMAGE_START_MASK      0x07FF
-+#define RAMDISK_PROMPT_FLAG           0x8000
-+#define RAMDISK_LOAD_FLAG             0x4000  
-+
-+static char command_line[COMMAND_LINE_SIZE];
-+
-+unsigned char __initdata boot_params[PARAM_SIZE];
-+
-+static struct resource data_resource = {
-+      .name   = "Kernel data",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-+};
-+
-+static struct resource code_resource = {
-+      .name   = "Kernel code",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-+};
-+
-+static struct resource system_rom_resource = {
-+      .name   = "System ROM",
-+      .start  = 0xf0000,
-+      .end    = 0xfffff,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+};
-+
-+static struct resource extension_rom_resource = {
-+      .name   = "Extension ROM",
-+      .start  = 0xe0000,
-+      .end    = 0xeffff,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+};
-+
-+static struct resource adapter_rom_resources[] = { {
-+      .name   = "Adapter ROM",
-+      .start  = 0xc8000,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+}, {
-+      .name   = "Adapter ROM",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+}, {
-+      .name   = "Adapter ROM",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+}, {
-+      .name   = "Adapter ROM",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+}, {
-+      .name   = "Adapter ROM",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+}, {
-+      .name   = "Adapter ROM",
-+      .start  = 0,
-+      .end    = 0,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+} };
-+
-+#define ADAPTER_ROM_RESOURCES \
-+      (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
-+
-+static struct resource video_rom_resource = {
-+      .name   = "Video ROM",
-+      .start  = 0xc0000,
-+      .end    = 0xc7fff,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM
-+};
-+
-+static struct resource video_ram_resource = {
-+      .name   = "Video RAM area",
-+      .start  = 0xa0000,
-+      .end    = 0xbffff,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
-+};
-+
-+static struct resource standard_io_resources[] = { {
-+      .name   = "dma1",
-+      .start  = 0x0000,
-+      .end    = 0x001f,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "pic1",
-+      .start  = 0x0020,
-+      .end    = 0x0021,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "timer0",
-+      .start  = 0x0040,
-+      .end    = 0x0043,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "timer1",
-+      .start  = 0x0050,
-+      .end    = 0x0053,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "keyboard",
-+      .start  = 0x0060,
-+      .end    = 0x006f,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "dma page reg",
-+      .start  = 0x0080,
-+      .end    = 0x008f,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "pic2",
-+      .start  = 0x00a0,
-+      .end    = 0x00a1,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "dma2",
-+      .start  = 0x00c0,
-+      .end    = 0x00df,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+}, {
-+      .name   = "fpu",
-+      .start  = 0x00f0,
-+      .end    = 0x00ff,
-+      .flags  = IORESOURCE_BUSY | IORESOURCE_IO
-+} };
-+
-+#define STANDARD_IO_RESOURCES \
-+      (sizeof standard_io_resources / sizeof standard_io_resources[0])
-+
-+#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-+
-+static int __init romchecksum(unsigned char *rom, unsigned long length)
-+{
-+      unsigned char *p, sum = 0;
-+
-+      for (p = rom; p < rom + length; p++)
-+              sum += *p;
-+      return sum == 0;
-+}
-+
-+static void __init probe_roms(void)
-+{
-+      unsigned long start, length, upper;
-+      unsigned char *rom;
-+      int           i;
-+
-+#ifdef CONFIG_XEN
-+      /* Nothing to do if not running in dom0. */
-+      if (!is_initial_xendomain())
-+              return;
-+#endif
-+
-+      /* video rom */
-+      upper = adapter_rom_resources[0].start;
-+      for (start = video_rom_resource.start; start < upper; start += 2048) {
-+              rom = isa_bus_to_virt(start);
-+              if (!romsignature(rom))
-+                      continue;
-+
-+              video_rom_resource.start = start;
-+
-+              /* 0 < length <= 0x7f * 512, historically */
-+              length = rom[2] * 512;
-+
-+              /* if checksum okay, trust length byte */
-+              if (length && romchecksum(rom, length))
-+                      video_rom_resource.end = start + length - 1;
-+
-+              request_resource(&iomem_resource, &video_rom_resource);
-+              break;
-+      }
-+
-+      start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
-+      if (start < upper)
-+              start = upper;
-+
-+      /* system rom */
-+      request_resource(&iomem_resource, &system_rom_resource);
-+      upper = system_rom_resource.start;
-+
-+      /* check for extension rom (ignore length byte!) */
-+      rom = isa_bus_to_virt(extension_rom_resource.start);
-+      if (romsignature(rom)) {
-+              length = extension_rom_resource.end - extension_rom_resource.start + 1;
-+              if (romchecksum(rom, length)) {
-+                      request_resource(&iomem_resource, &extension_rom_resource);
-+                      upper = extension_rom_resource.start;
-+              }
-+      }
-+
-+      /* check for adapter roms on 2k boundaries */
-+      for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
-+              rom = isa_bus_to_virt(start);
-+              if (!romsignature(rom))
-+                      continue;
-+
-+              /* 0 < length <= 0x7f * 512, historically */
-+              length = rom[2] * 512;
-+
-+              /* but accept any length that fits if checksum okay */
-+              if (!length || start + length > upper || !romchecksum(rom, length))
-+                      continue;
-+
-+              adapter_rom_resources[i].start = start;
-+              adapter_rom_resources[i].end = start + length - 1;
-+              request_resource(&iomem_resource, &adapter_rom_resources[i]);
-+
-+              start = adapter_rom_resources[i++].end & ~2047UL;
-+      }
-+}
-+
-+/*
-+ * Point at the empty zero page to start with. We map the real shared_info
-+ * page as soon as fixmap is up and running.
-+ */
-+shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-+EXPORT_SYMBOL(HYPERVISOR_shared_info);
-+
-+unsigned long *phys_to_machine_mapping;
-+unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[16];
-+EXPORT_SYMBOL(phys_to_machine_mapping);
-+
-+/* Raw start-of-day parameters from the hypervisor. */
-+start_info_t *xen_start_info;
-+EXPORT_SYMBOL(xen_start_info);
-+
-+void __init add_memory_region(unsigned long long start,
-+                            unsigned long long size, int type)
-+{
-+      int x;
-+
-+      if (!efi_enabled) {
-+                      x = e820.nr_map;
-+
-+              if (x == E820MAX) {
-+                  printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-+                  return;
-+              }
-+
-+              e820.map[x].addr = start;
-+              e820.map[x].size = size;
-+              e820.map[x].type = type;
-+              e820.nr_map++;
-+      }
-+} /* add_memory_region */
-+
-+static void __init limit_regions(unsigned long long size)
-+{
-+      unsigned long long current_addr = 0;
-+      int i;
-+
-+      if (efi_enabled) {
-+              efi_memory_desc_t *md;
-+              void *p;
-+
-+              for (p = memmap.map, i = 0; p < memmap.map_end;
-+                      p += memmap.desc_size, i++) {
-+                      md = p;
-+                      current_addr = md->phys_addr + (md->num_pages << 12);
-+                      if (md->type == EFI_CONVENTIONAL_MEMORY) {
-+                              if (current_addr >= size) {
-+                                      md->num_pages -=
-+                                              (((current_addr-size) + PAGE_SIZE-1) >> PAGE_SHIFT);
-+                                      memmap.nr_map = i + 1;
-+                                      return;
-+                              }
-+                      }
-+              }
-+      }
-+      for (i = 0; i < e820.nr_map; i++) {
-+              current_addr = e820.map[i].addr + e820.map[i].size;
-+              if (current_addr < size)
-+                      continue;
-+
-+              if (e820.map[i].type != E820_RAM)
-+                      continue;
-+
-+              if (e820.map[i].addr >= size) {
-+                      /*
-+                       * This region starts past the end of the
-+                       * requested size, skip it completely.
-+                       */
-+                      e820.nr_map = i;
-+              } else {
-+                      e820.nr_map = i + 1;
-+                      e820.map[i].size -= current_addr - size;
-+              }
-+              return;
-+      }
-+#ifdef CONFIG_XEN
-+      if (i==e820.nr_map && current_addr < size) {
-+              /*
-+                 * The e820 map finished before our requested size so
-+                 * extend the final entry to the requested address.
-+                 */
-+              --i;
-+              if (e820.map[i].type == E820_RAM)
-+                      e820.map[i].size -= current_addr - size;
-+              else
-+                      add_memory_region(current_addr, size - current_addr, E820_RAM);
-+      }
-+#endif
-+}
-+
-+#define E820_DEBUG    1
-+
-+static void __init print_memory_map(char *who)
-+{
-+      int i;
-+
-+      for (i = 0; i < e820.nr_map; i++) {
-+              printk(" %s: %016Lx - %016Lx ", who,
-+                      e820.map[i].addr,
-+                      e820.map[i].addr + e820.map[i].size);
-+              switch (e820.map[i].type) {
-+              case E820_RAM:  printk("(usable)\n");
-+                              break;
-+              case E820_RESERVED:
-+                              printk("(reserved)\n");
-+                              break;
-+              case E820_ACPI:
-+                              printk("(ACPI data)\n");
-+                              break;
-+              case E820_NVS:
-+                              printk("(ACPI NVS)\n");
-+                              break;
-+              default:        printk("type %lu\n", e820.map[i].type);
-+                              break;
-+              }
-+      }
-+}
-+
-+/*
-+ * Sanitize the BIOS e820 map.
-+ *
-+ * Some e820 responses include overlapping entries.  The following 
-+ * replaces the original e820 map with a new one, removing overlaps.
-+ *
-+ */
-+struct change_member {
-+      struct e820entry *pbios; /* pointer to original bios entry */
-+      unsigned long long addr; /* address for this change point */
-+};
-+static struct change_member change_point_list[2*E820MAX] __initdata;
-+static struct change_member *change_point[2*E820MAX] __initdata;
-+static struct e820entry *overlap_list[E820MAX] __initdata;
-+static struct e820entry new_bios[E820MAX] __initdata;
-+
-+int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
-+{
-+      struct change_member *change_tmp;
-+      unsigned long current_type, last_type;
-+      unsigned long long last_addr;
-+      int chgidx, still_changing;
-+      int overlap_entries;
-+      int new_bios_entry;
-+      int old_nr, new_nr, chg_nr;
-+      int i;
-+
-+      /*
-+              Visually we're performing the following (1,2,3,4 = memory types)...
-+
-+              Sample memory map (w/overlaps):
-+                 ____22__________________
-+                 ______________________4_
-+                 ____1111________________
-+                 _44_____________________
-+                 11111111________________
-+                 ____________________33__
-+                 ___________44___________
-+                 __________33333_________
-+                 ______________22________
-+                 ___________________2222_
-+                 _________111111111______
-+                 _____________________11_
-+                 _________________4______
-+
-+              Sanitized equivalent (no overlap):
-+                 1_______________________
-+                 _44_____________________
-+                 ___1____________________
-+                 ____22__________________
-+                 ______11________________
-+                 _________1______________
-+                 __________3_____________
-+                 ___________44___________
-+                 _____________33_________
-+                 _______________2________
-+                 ________________1_______
-+                 _________________4______
-+                 ___________________2____
-+                 ____________________33__
-+                 ______________________4_
-+      */
-+
-+      /* if there's only one memory region, don't bother */
-+      if (*pnr_map < 2)
-+              return -1;
-+
-+      old_nr = *pnr_map;
-+
-+      /* bail out if we find any unreasonable addresses in bios map */
-+      for (i=0; i<old_nr; i++)
-+              if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
-+                      return -1;
-+
-+      /* create pointers for initial change-point information (for sorting) */
-+      for (i=0; i < 2*old_nr; i++)
-+              change_point[i] = &change_point_list[i];
-+
-+      /* record all known change-points (starting and ending addresses),
-+         omitting those that are for empty memory regions */
-+      chgidx = 0;
-+      for (i=0; i < old_nr; i++)      {
-+              if (biosmap[i].size != 0) {
-+                      change_point[chgidx]->addr = biosmap[i].addr;
-+                      change_point[chgidx++]->pbios = &biosmap[i];
-+                      change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
-+                      change_point[chgidx++]->pbios = &biosmap[i];
-+              }
-+      }
-+      chg_nr = chgidx;        /* true number of change-points */
-+
-+      /* sort change-point list by memory addresses (low -> high) */
-+      still_changing = 1;
-+      while (still_changing)  {
-+              still_changing = 0;
-+              for (i=1; i < chg_nr; i++)  {
-+                      /* if <current_addr> > <last_addr>, swap */
-+                      /* or, if current=<start_addr> & last=<end_addr>, swap */
-+                      if ((change_point[i]->addr < change_point[i-1]->addr) ||
-+                              ((change_point[i]->addr == change_point[i-1]->addr) &&
-+                               (change_point[i]->addr == change_point[i]->pbios->addr) &&
-+                               (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
-+                         )
-+                      {
-+                              change_tmp = change_point[i];
-+                              change_point[i] = change_point[i-1];
-+                              change_point[i-1] = change_tmp;
-+                              still_changing=1;
-+                      }
-+              }
-+      }
-+
-+      /* create a new bios memory map, removing overlaps */
-+      overlap_entries=0;       /* number of entries in the overlap table */
-+      new_bios_entry=0;        /* index for creating new bios map entries */
-+      last_type = 0;           /* start with undefined memory type */
-+      last_addr = 0;           /* start with 0 as last starting address */
-+      /* loop through change-points, determining affect on the new bios map */
-+      for (chgidx=0; chgidx < chg_nr; chgidx++)
-+      {
-+              /* keep track of all overlapping bios entries */
-+              if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
-+              {
-+                      /* add map entry to overlap list (> 1 entry implies an overlap) */
-+                      overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
-+              }
-+              else
-+              {
-+                      /* remove entry from list (order independent, so swap with last) */
-+                      for (i=0; i<overlap_entries; i++)
-+                      {
-+                              if (overlap_list[i] == change_point[chgidx]->pbios)
-+                                      overlap_list[i] = overlap_list[overlap_entries-1];
-+                      }
-+                      overlap_entries--;
-+              }
-+              /* if there are overlapping entries, decide which "type" to use */
-+              /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
-+              current_type = 0;
-+              for (i=0; i<overlap_entries; i++)
-+                      if (overlap_list[i]->type > current_type)
-+                              current_type = overlap_list[i]->type;
-+              /* continue building up new bios map based on this information */
-+              if (current_type != last_type)  {
-+                      if (last_type != 0)      {
-+                              new_bios[new_bios_entry].size =
-+                                      change_point[chgidx]->addr - last_addr;
-+                              /* move forward only if the new size was non-zero */
-+                              if (new_bios[new_bios_entry].size != 0)
-+                                      if (++new_bios_entry >= E820MAX)
-+                                              break;  /* no more space left for new bios entries */
-+                      }
-+                      if (current_type != 0)  {
-+                              new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
-+                              new_bios[new_bios_entry].type = current_type;
-+                              last_addr=change_point[chgidx]->addr;
-+                      }
-+                      last_type = current_type;
-+              }
-+      }
-+      new_nr = new_bios_entry;   /* retain count for new bios entries */
-+
-+      /* copy new bios mapping into original location */
-+      memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
-+      *pnr_map = new_nr;
-+
-+      return 0;
-+}
-+
-+/*
-+ * Copy the BIOS e820 map into a safe place.
-+ *
-+ * Sanity-check it while we're at it..
-+ *
-+ * If we're lucky and live on a modern system, the setup code
-+ * will have given us a memory map that we can use to properly
-+ * set up memory.  If we aren't, we'll fake a memory map.
-+ *
-+ * We check to see that the memory map contains at least 2 elements
-+ * before we'll use it, because the detection code in setup.S may
-+ * not be perfect and most every PC known to man has two memory
-+ * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
-+ * thinkpad 560x, for example, does not cooperate with the memory
-+ * detection code.)
-+ */
-+int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
-+{
-+#ifndef CONFIG_XEN
-+      /* Only one memory region (or negative)? Ignore it */
-+      if (nr_map < 2)
-+              return -1;
-+#else
-+      BUG_ON(nr_map < 1);
-+#endif
-+
-+      do {
-+              unsigned long long start = biosmap->addr;
-+              unsigned long long size = biosmap->size;
-+              unsigned long long end = start + size;
-+              unsigned long type = biosmap->type;
-+
-+              /* Overflow in 64 bits? Ignore the memory map. */
-+              if (start > end)
-+                      return -1;
-+
-+#ifndef CONFIG_XEN
-+              /*
-+               * Some BIOSes claim RAM in the 640k - 1M region.
-+               * Not right. Fix it up.
-+               */
-+              if (type == E820_RAM) {
-+                      if (start < 0x100000ULL && end > 0xA0000ULL) {
-+                              if (start < 0xA0000ULL)
-+                                      add_memory_region(start, 0xA0000ULL-start, type);
-+                              if (end <= 0x100000ULL)
-+                                      continue;
-+                              start = 0x100000ULL;
-+                              size = end - start;
-+                      }
-+              }
-+#endif
-+              add_memory_region(start, size, type);
-+      } while (biosmap++,--nr_map);
-+
-+#ifdef CONFIG_XEN
-+      if (is_initial_xendomain()) {
-+              struct xen_memory_map memmap;
-+
-+              memmap.nr_entries = E820MAX;
-+              set_xen_guest_handle(memmap.buffer, machine_e820.map);
-+
-+              if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
-+                      BUG();
-+              machine_e820.nr_map = memmap.nr_entries;
-+      } else
-+              machine_e820 = e820;
-+#endif
-+
-+      return 0;
-+}
-+
-+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-+struct edd edd;
-+#ifdef CONFIG_EDD_MODULE
-+EXPORT_SYMBOL(edd);
-+#endif
-+#ifndef CONFIG_XEN
-+/**
-+ * copy_edd() - Copy the BIOS EDD information
-+ *              from boot_params into a safe place.
-+ *
-+ */
-+static inline void copy_edd(void)
-+{
-+     memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
-+     memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
-+     edd.mbr_signature_nr = EDD_MBR_SIG_NR;
-+     edd.edd_info_nr = EDD_NR;
-+}
-+#endif
-+#else
-+static inline void copy_edd(void)
-+{
-+}
-+#endif
-+
-+static void __init parse_cmdline_early (char ** cmdline_p)
-+{
-+      char c = ' ', *to = command_line, *from = saved_command_line;
-+      int len = 0, max_cmdline;
-+      int userdef = 0;
-+
-+      if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
-+              max_cmdline = COMMAND_LINE_SIZE;
-+      memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
-+      /* Save unparsed command line copy for /proc/cmdline */
-+      saved_command_line[max_cmdline-1] = '\0';
-+
-+      for (;;) {
-+              if (c != ' ')
-+                      goto next_char;
-+              /*
-+               * "mem=nopentium" disables the 4MB page tables.
-+               * "mem=XXX[kKmM]" defines a memory region from HIGH_MEM
-+               * to <mem>, overriding the bios size.
-+               * "memmap=XXX[KkmM]@XXX[KkmM]" defines a memory region from
-+               * <start> to <start>+<mem>, overriding the bios size.
-+               *
-+               * HPA tells me bootloaders need to parse mem=, so no new
-+               * option should be mem=  [also see Documentation/i386/boot.txt]
-+               */
-+              if (!memcmp(from, "mem=", 4)) {
-+                      if (to != command_line)
-+                              to--;
-+                      if (!memcmp(from+4, "nopentium", 9)) {
-+                              from += 9+4;
-+                              clear_bit(X86_FEATURE_PSE, boot_cpu_data.x86_capability);
-+                              disable_pse = 1;
-+                      } else {
-+                              /* If the user specifies memory size, we
-+                               * limit the BIOS-provided memory map to
-+                               * that size. exactmap can be used to specify
-+                               * the exact map. mem=number can be used to
-+                               * trim the existing memory map.
-+                               */
-+                              unsigned long long mem_size;
-+ 
-+                              mem_size = memparse(from+4, &from);
-+                              limit_regions(mem_size);
-+                              userdef=1;
-+                      }
-+              }
-+
-+              else if (!memcmp(from, "memmap=", 7)) {
-+                      if (to != command_line)
-+                              to--;
-+                      if (!memcmp(from+7, "exactmap", 8)) {
-+#ifdef CONFIG_CRASH_DUMP
-+                              /* If we are doing a crash dump, we
-+                               * still need to know the real mem
-+                               * size before original memory map is
-+                               * reset.
-+                               */
-+                              find_max_pfn();
-+                              saved_max_pfn = max_pfn;
-+#endif
-+                              from += 8+7;
-+                              e820.nr_map = 0;
-+                              userdef = 1;
-+                      } else {
-+                              /* If the user specifies memory size, we
-+                               * limit the BIOS-provided memory map to
-+                               * that size. exactmap can be used to specify
-+                               * the exact map. mem=number can be used to
-+                               * trim the existing memory map.
-+                               */
-+                              unsigned long long start_at, mem_size;
-+ 
-+                              mem_size = memparse(from+7, &from);
-+                              if (*from == '@') {
-+                                      start_at = memparse(from+1, &from);
-+                                      add_memory_region(start_at, mem_size, E820_RAM);
-+                              } else if (*from == '#') {
-+                                      start_at = memparse(from+1, &from);
-+                                      add_memory_region(start_at, mem_size, E820_ACPI);
-+                              } else if (*from == '$') {
-+                                      start_at = memparse(from+1, &from);
-+                                      add_memory_region(start_at, mem_size, E820_RESERVED);
-+                              } else {
-+                                      limit_regions(mem_size);
-+                                      userdef=1;
-+                              }
-+                      }
-+              }
-+
-+              else if (!memcmp(from, "noexec=", 7))
-+                      noexec_setup(from + 7);
-+
-+
-+#ifdef  CONFIG_X86_MPPARSE
-+              /*
-+               * If the BIOS enumerates physical processors before logical,
-+               * maxcpus=N at enumeration-time can be used to disable HT.
-+               */
-+              else if (!memcmp(from, "maxcpus=", 8)) {
-+                      extern unsigned int maxcpus;
-+
-+                      maxcpus = simple_strtoul(from + 8, NULL, 0);
-+              }
-+#endif
-+
-+#ifdef CONFIG_ACPI
-+              /* "acpi=off" disables both ACPI table parsing and interpreter */
-+              else if (!memcmp(from, "acpi=off", 8)) {
-+                      disable_acpi();
-+              }
-+
-+              /* acpi=force to over-ride black-list */
-+              else if (!memcmp(from, "acpi=force", 10)) {
-+                      acpi_force = 1;
-+                      acpi_ht = 1;
-+                      acpi_disabled = 0;
-+              }
-+
-+              /* acpi=strict disables out-of-spec workarounds */
-+              else if (!memcmp(from, "acpi=strict", 11)) {
-+                      acpi_strict = 1;
-+              }
-+
-+              /* Limit ACPI just to boot-time to enable HT */
-+              else if (!memcmp(from, "acpi=ht", 7)) {
-+                      if (!acpi_force)
-+                              disable_acpi();
-+                      acpi_ht = 1;
-+              }
-+              
-+              /* "pci=noacpi" disable ACPI IRQ routing and PCI scan */
-+              else if (!memcmp(from, "pci=noacpi", 10)) {
-+                      acpi_disable_pci();
-+              }
-+              /* "acpi=noirq" disables ACPI interrupt routing */
-+              else if (!memcmp(from, "acpi=noirq", 10)) {
-+                      acpi_noirq_set();
-+              }
-+
-+              else if (!memcmp(from, "acpi_sci=edge", 13))
-+                      acpi_sci_flags.trigger =  1;
-+
-+              else if (!memcmp(from, "acpi_sci=level", 14))
-+                      acpi_sci_flags.trigger = 3;
-+
-+              else if (!memcmp(from, "acpi_sci=high", 13))
-+                      acpi_sci_flags.polarity = 1;
-+
-+              else if (!memcmp(from, "acpi_sci=low", 12))
-+                      acpi_sci_flags.polarity = 3;
-+
-+#ifdef CONFIG_X86_IO_APIC
-+              else if (!memcmp(from, "acpi_skip_timer_override", 24))
-+                      acpi_skip_timer_override = 1;
-+
-+              if (!memcmp(from, "disable_timer_pin_1", 19))
-+                      disable_timer_pin_1 = 1;
-+              if (!memcmp(from, "enable_timer_pin_1", 18))
-+                      disable_timer_pin_1 = -1;
-+
-+              /* disable IO-APIC */
-+              else if (!memcmp(from, "noapic", 6))
-+                      disable_ioapic_setup();
-+#endif /* CONFIG_X86_IO_APIC */
-+#endif /* CONFIG_ACPI */
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+              /* enable local APIC */
-+              else if (!memcmp(from, "lapic", 5))
-+                      lapic_enable();
-+
-+              /* disable local APIC */
-+              else if (!memcmp(from, "nolapic", 6))
-+                      lapic_disable();
-+#endif /* CONFIG_X86_LOCAL_APIC */
-+
-+#ifdef CONFIG_KEXEC
-+              /* crashkernel=size@addr specifies the location to reserve for
-+               * a crash kernel.  By reserving this memory we guarantee
-+               * that linux never set's it up as a DMA target.
-+               * Useful for holding code to do something appropriate
-+               * after a kernel panic.
-+               */
-+              else if (!memcmp(from, "crashkernel=", 12)) {
-+#ifndef CONFIG_XEN
-+                      unsigned long size, base;
-+                      size = memparse(from+12, &from);
-+                      if (*from == '@') {
-+                              base = memparse(from+1, &from);
-+                              /* FIXME: Do I want a sanity check
-+                               * to validate the memory range?
-+                               */
-+                              crashk_res.start = base;
-+                              crashk_res.end   = base + size - 1;
-+                      }
-+#else
-+                      printk("Ignoring crashkernel command line, "
-+                             "parameter will be supplied by xen\n");
-+#endif
-+              }
-+#endif
-+#ifdef CONFIG_PROC_VMCORE
-+              /* elfcorehdr= specifies the location of elf core header
-+               * stored by the crashed kernel.
-+               */
-+              else if (!memcmp(from, "elfcorehdr=", 11))
-+                      elfcorehdr_addr = memparse(from+11, &from);
-+#endif
-+
-+              /*
-+               * highmem=size forces highmem to be exactly 'size' bytes.
-+               * This works even on boxes that have no highmem otherwise.
-+               * This also works to reduce highmem size on bigger boxes.
-+               */
-+              else if (!memcmp(from, "highmem=", 8))
-+                      highmem_pages = memparse(from+8, &from) >> PAGE_SHIFT;
-+      
-+              /*
-+               * vmalloc=size forces the vmalloc area to be exactly 'size'
-+               * bytes. This can be used to increase (or decrease) the
-+               * vmalloc area - the default is 128m.
-+               */
-+              else if (!memcmp(from, "vmalloc=", 8))
-+                      __VMALLOC_RESERVE = memparse(from+8, &from);
-+
-+      next_char:
-+              c = *(from++);
-+              if (!c)
-+                      break;
-+              if (COMMAND_LINE_SIZE <= ++len)
-+                      break;
-+              *(to++) = c;
-+      }
-+      *to = '\0';
-+      *cmdline_p = command_line;
-+      if (userdef) {
-+              printk(KERN_INFO "user-defined physical RAM map:\n");
-+              print_memory_map("user");
-+      }
-+}
-+
-+/*
-+ * Callback for efi_memory_walk.
-+ */
-+static int __init
-+efi_find_max_pfn(unsigned long start, unsigned long end, void *arg)
-+{
-+      unsigned long *max_pfn = arg, pfn;
-+
-+      if (start < end) {
-+              pfn = PFN_UP(end -1);
-+              if (pfn > *max_pfn)
-+                      *max_pfn = pfn;
-+      }
-+      return 0;
-+}
-+
-+static int __init
-+efi_memory_present_wrapper(unsigned long start, unsigned long end, void *arg)
-+{
-+      memory_present(0, start, end);
-+      return 0;
-+}
-+
-+/*
-+ * This function checks if any part of the range <start,end> is mapped
-+ * with type.
-+ */
-+int
-+e820_any_mapped(u64 start, u64 end, unsigned type)
-+{
-+      int i;
-+
-+#ifndef CONFIG_XEN
-+      for (i = 0; i < e820.nr_map; i++) {
-+              const struct e820entry *ei = &e820.map[i];
-+#else
-+      if (!is_initial_xendomain())
-+              return 0;
-+      for (i = 0; i < machine_e820.nr_map; ++i) {
-+              const struct e820entry *ei = &machine_e820.map[i];
-+#endif
-+
-+              if (type && ei->type != type)
-+                      continue;
-+              if (ei->addr >= end || ei->addr + ei->size <= start)
-+                      continue;
-+              return 1;
-+      }
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(e820_any_mapped);
-+
-+ /*
-+  * This function checks if the entire range <start,end> is mapped with type.
-+  *
-+  * Note: this function only works correct if the e820 table is sorted and
-+  * not-overlapping, which is the case
-+  */
-+int __init
-+e820_all_mapped(unsigned long s, unsigned long e, unsigned type)
-+{
-+      u64 start = s;
-+      u64 end = e;
-+      int i;
-+
-+#ifndef CONFIG_XEN
-+      for (i = 0; i < e820.nr_map; i++) {
-+              struct e820entry *ei = &e820.map[i];
-+#else
-+      if (!is_initial_xendomain())
-+              return 0;
-+      for (i = 0; i < machine_e820.nr_map; ++i) {
-+              const struct e820entry *ei = &machine_e820.map[i];
-+#endif
-+              if (type && ei->type != type)
-+                      continue;
-+              /* is the region (part) in overlap with the current region ?*/
-+              if (ei->addr >= end || ei->addr + ei->size <= start)
-+                      continue;
-+              /* if the region is at the beginning of <start,end> we move
-+               * start to the end of the region since it's ok until there
-+               */
-+              if (ei->addr <= start)
-+                      start = ei->addr + ei->size;
-+              /* if start is now at or beyond end, we're done, full
-+               * coverage */
-+              if (start >= end)
-+                      return 1; /* we're done */
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * Find the highest page frame number we have available
-+ */
-+void __init find_max_pfn(void)
-+{
-+      int i;
-+
-+      max_pfn = 0;
-+      if (efi_enabled) {
-+              efi_memmap_walk(efi_find_max_pfn, &max_pfn);
-+              efi_memmap_walk(efi_memory_present_wrapper, NULL);
-+              return;
-+      }
-+
-+      for (i = 0; i < e820.nr_map; i++) {
-+              unsigned long start, end;
-+              /* RAM? */
-+              if (e820.map[i].type != E820_RAM)
-+                      continue;
-+              start = PFN_UP(e820.map[i].addr);
-+              end = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
-+              if (start >= end)
-+                      continue;
-+              if (end > max_pfn)
-+                      max_pfn = end;
-+              memory_present(0, start, end);
-+      }
-+}
-+
-+/*
-+ * Determine low and high memory ranges:
-+ */
-+unsigned long __init find_max_low_pfn(void)
-+{
-+      unsigned long max_low_pfn;
-+
-+      max_low_pfn = max_pfn;
-+      if (max_low_pfn > MAXMEM_PFN) {
-+              if (highmem_pages == -1)
-+                      highmem_pages = max_pfn - MAXMEM_PFN;
-+              if (highmem_pages + MAXMEM_PFN < max_pfn)
-+                      max_pfn = MAXMEM_PFN + highmem_pages;
-+              if (highmem_pages + MAXMEM_PFN > max_pfn) {
-+                      printk("only %luMB highmem pages available, ignoring highmem size of %uMB.\n", pages_to_mb(max_pfn - MAXMEM_PFN), pages_to_mb(highmem_pages));
-+                      highmem_pages = 0;
-+              }
-+              max_low_pfn = MAXMEM_PFN;
-+#ifndef CONFIG_HIGHMEM
-+              /* Maximum memory usable is what is directly addressable */
-+              printk(KERN_WARNING "Warning only %ldMB will be used.\n",
-+                                      MAXMEM>>20);
-+              if (max_pfn > MAX_NONPAE_PFN)
-+                      printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-+              else
-+                      printk(KERN_WARNING "Use a HIGHMEM enabled kernel.\n");
-+              max_pfn = MAXMEM_PFN;
-+#else /* !CONFIG_HIGHMEM */
-+#ifndef CONFIG_X86_PAE
-+              if (max_pfn > MAX_NONPAE_PFN) {
-+                      max_pfn = MAX_NONPAE_PFN;
-+                      printk(KERN_WARNING "Warning only 4GB will be used.\n");
-+                      printk(KERN_WARNING "Use a PAE enabled kernel.\n");
-+              }
-+#endif /* !CONFIG_X86_PAE */
-+#endif /* !CONFIG_HIGHMEM */
-+      } else {
-+              if (highmem_pages == -1)
-+                      highmem_pages = 0;
-+#ifdef CONFIG_HIGHMEM
-+              if (highmem_pages >= max_pfn) {
-+                      printk(KERN_ERR "highmem size specified (%uMB) is bigger than pages available (%luMB)!.\n", pages_to_mb(highmem_pages), pages_to_mb(max_pfn));
-+                      highmem_pages = 0;
-+              }
-+              if (highmem_pages) {
-+                      if (max_low_pfn-highmem_pages < 64*1024*1024/PAGE_SIZE){
-+                              printk(KERN_ERR "highmem size %uMB results in smaller than 64MB lowmem, ignoring it.\n", pages_to_mb(highmem_pages));
-+                              highmem_pages = 0;
-+                      }
-+                      max_low_pfn -= highmem_pages;
-+              }
-+#else
-+              if (highmem_pages)
-+                      printk(KERN_ERR "ignoring highmem size on non-highmem kernel!\n");
-+#endif
-+      }
-+      return max_low_pfn;
-+}
-+
-+/*
-+ * Free all available memory for boot time allocation.  Used
-+ * as a callback function by efi_memory_walk()
-+ */
-+
-+static int __init
-+free_available_memory(unsigned long start, unsigned long end, void *arg)
-+{
-+      /* check max_low_pfn */
-+      if (start >= (max_low_pfn << PAGE_SHIFT))
-+              return 0;
-+      if (end >= (max_low_pfn << PAGE_SHIFT))
-+              end = max_low_pfn << PAGE_SHIFT;
-+      if (start < end)
-+              free_bootmem(start, end - start);
-+
-+      return 0;
-+}
-+/*
-+ * Register fully available low RAM pages with the bootmem allocator.
-+ */
-+static void __init register_bootmem_low_pages(unsigned long max_low_pfn)
-+{
-+      int i;
-+
-+      if (efi_enabled) {
-+              efi_memmap_walk(free_available_memory, NULL);
-+              return;
-+      }
-+      for (i = 0; i < e820.nr_map; i++) {
-+              unsigned long curr_pfn, last_pfn, size;
-+              /*
-+               * Reserve usable low memory
-+               */
-+              if (e820.map[i].type != E820_RAM)
-+                      continue;
-+              /*
-+               * We are rounding up the start address of usable memory:
-+               */
-+              curr_pfn = PFN_UP(e820.map[i].addr);
-+              if (curr_pfn >= max_low_pfn)
-+                      continue;
-+              /*
-+               * ... and at the end of the usable range downwards:
-+               */
-+              last_pfn = PFN_DOWN(e820.map[i].addr + e820.map[i].size);
-+
-+#ifdef CONFIG_XEN
-+              /*
-+                 * Truncate to the number of actual pages currently
-+                 * present.
-+                 */
-+              if (last_pfn > xen_start_info->nr_pages)
-+                      last_pfn = xen_start_info->nr_pages;
-+#endif
-+
-+              if (last_pfn > max_low_pfn)
-+                      last_pfn = max_low_pfn;
-+
-+              /*
-+               * .. finally, did all the rounding and playing
-+               * around just make the area go away?
-+               */
-+              if (last_pfn <= curr_pfn)
-+                      continue;
-+
-+              size = last_pfn - curr_pfn;
-+              free_bootmem(PFN_PHYS(curr_pfn), PFN_PHYS(size));
-+      }
-+}
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * workaround for Dell systems that neglect to reserve EBDA
-+ */
-+static void __init reserve_ebda_region(void)
-+{
-+      unsigned int addr;
-+      addr = get_bios_ebda();
-+      if (addr)
-+              reserve_bootmem(addr, PAGE_SIZE);       
-+}
-+#endif
-+
-+#ifndef CONFIG_NEED_MULTIPLE_NODES
-+void __init setup_bootmem_allocator(void);
-+static unsigned long __init setup_memory(void)
-+{
-+      /*
-+       * partially used pages are not usable - thus
-+       * we are rounding upwards:
-+       */
-+      min_low_pfn = PFN_UP(__pa(xen_start_info->pt_base)) +
-+              xen_start_info->nr_pt_frames;
-+
-+      find_max_pfn();
-+
-+      max_low_pfn = find_max_low_pfn();
-+
-+#ifdef CONFIG_HIGHMEM
-+      highstart_pfn = highend_pfn = max_pfn;
-+      if (max_pfn > max_low_pfn) {
-+              highstart_pfn = max_low_pfn;
-+      }
-+      printk(KERN_NOTICE "%ldMB HIGHMEM available.\n",
-+              pages_to_mb(highend_pfn - highstart_pfn));
-+#endif
-+      printk(KERN_NOTICE "%ldMB LOWMEM available.\n",
-+                      pages_to_mb(max_low_pfn));
-+
-+      setup_bootmem_allocator();
-+
-+      return max_low_pfn;
-+}
-+
-+void __init zone_sizes_init(void)
-+{
-+      unsigned long zones_size[MAX_NR_ZONES] = {0, 0, 0};
-+      unsigned int max_dma, low;
-+
-+      max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-+      low = max_low_pfn;
-+
-+      if (low < max_dma)
-+              zones_size[ZONE_DMA] = low;
-+      else {
-+              zones_size[ZONE_DMA] = max_dma;
-+              zones_size[ZONE_NORMAL] = low - max_dma;
-+#ifdef CONFIG_HIGHMEM
-+              zones_size[ZONE_HIGHMEM] = highend_pfn - low;
-+#endif
-+      }
-+      free_area_init(zones_size);
-+}
-+#else
-+extern unsigned long __init setup_memory(void);
-+extern void zone_sizes_init(void);
-+#endif /* !CONFIG_NEED_MULTIPLE_NODES */
-+
-+void __init setup_bootmem_allocator(void)
-+{
-+      unsigned long bootmap_size;
-+      /*
-+       * Initialize the boot-time allocator (with low memory only):
-+       */
-+      bootmap_size = init_bootmem(min_low_pfn, max_low_pfn);
-+
-+      register_bootmem_low_pages(max_low_pfn);
-+
-+      /*
-+       * Reserve the bootmem bitmap itself as well. We do this in two
-+       * steps (first step was init_bootmem()) because this catches
-+       * the (very unlikely) case of us accidentally initializing the
-+       * bootmem allocator with an invalid RAM area.
-+       */
-+      reserve_bootmem(__PHYSICAL_START, (PFN_PHYS(min_low_pfn) +
-+                       bootmap_size + PAGE_SIZE-1) - (__PHYSICAL_START));
-+
-+#ifndef CONFIG_XEN
-+      /*
-+       * reserve physical page 0 - it's a special BIOS page on many boxes,
-+       * enabling clean reboots, SMP operation, laptop functions.
-+       */
-+      reserve_bootmem(0, PAGE_SIZE);
-+
-+      /* reserve EBDA region, it's a 4K region */
-+      reserve_ebda_region();
-+
-+    /* could be an AMD 768MPX chipset. Reserve a page  before VGA to prevent
-+       PCI prefetch into it (errata #56). Usually the page is reserved anyways,
-+       unless you have no PS/2 mouse plugged in. */
-+      if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-+          boot_cpu_data.x86 == 6)
-+           reserve_bootmem(0xa0000 - 4096, 4096);
-+
-+#ifdef CONFIG_SMP
-+      /*
-+       * But first pinch a few for the stack/trampoline stuff
-+       * FIXME: Don't need the extra page at 4K, but need to fix
-+       * trampoline before removing it. (see the GDT stuff)
-+       */
-+      reserve_bootmem(PAGE_SIZE, PAGE_SIZE);
-+#endif
-+#ifdef CONFIG_ACPI_SLEEP
-+      /*
-+       * Reserve low memory region for sleep support.
-+       */
-+      acpi_reserve_bootmem();
-+#endif
-+#endif /* !CONFIG_XEN */
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+      if (xen_start_info->mod_start) {
-+              if (INITRD_START + INITRD_SIZE <= (max_low_pfn << PAGE_SHIFT)) {
-+                      /*reserve_bootmem(INITRD_START, INITRD_SIZE);*/
-+                      initrd_start = INITRD_START + PAGE_OFFSET;
-+                      initrd_end = initrd_start+INITRD_SIZE;
-+                      initrd_below_start_ok = 1;
-+              }
-+              else {
-+                      printk(KERN_ERR "initrd extends beyond end of memory "
-+                          "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-+                          INITRD_START + INITRD_SIZE,
-+                          max_low_pfn << PAGE_SHIFT);
-+                      initrd_start = 0;
-+              }
-+      }
-+#endif
-+#ifdef CONFIG_KEXEC
-+#ifdef CONFIG_XEN
-+      xen_machine_kexec_setup_resources();
-+#else
-+      if (crashk_res.start != crashk_res.end)
-+              reserve_bootmem(crashk_res.start,
-+                      crashk_res.end - crashk_res.start + 1);
-+#endif
-+#endif
-+}
-+
-+/*
-+ * The node 0 pgdat is initialized before all of these because
-+ * it's needed for bootmem.  node>0 pgdats have their virtual
-+ * space allocated before the pagetables are in place to access
-+ * them, so they can't be cleared then.
-+ *
-+ * This should all compile down to nothing when NUMA is off.
-+ */
-+void __init remapped_pgdat_init(void)
-+{
-+      int nid;
-+
-+      for_each_online_node(nid) {
-+              if (nid != 0)
-+                      memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
-+      }
-+}
-+
-+/*
-+ * Request address space for all standard RAM and ROM resources
-+ * and also for regions reported as reserved by the e820.
-+ */
-+static void __init
-+legacy_init_iomem_resources(struct e820entry *e820, int nr_map,
-+                          struct resource *code_resource,
-+                          struct resource *data_resource)
-+{
-+      int i;
-+
-+      probe_roms();
-+
-+      for (i = 0; i < nr_map; i++) {
-+              struct resource *res;
-+#ifndef CONFIG_RESOURCES_64BIT
-+              if (e820[i].addr + e820[i].size > 0x100000000ULL)
-+                      continue;
-+#endif
-+              res = kzalloc(sizeof(struct resource), GFP_ATOMIC);
-+              switch (e820[i].type) {
-+              case E820_RAM:  res->name = "System RAM"; break;
-+              case E820_ACPI: res->name = "ACPI Tables"; break;
-+              case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
-+              default:        res->name = "reserved";
-+              }
-+              res->start = e820[i].addr;
-+              res->end = res->start + e820[i].size - 1;
-+              res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-+              if (request_resource(&iomem_resource, res)) {
-+                      kfree(res);
-+                      continue;
-+              }
-+              if (e820[i].type == E820_RAM) {
-+                      /*
-+                       *  We don't know which RAM region contains kernel data,
-+                       *  so we try it repeatedly and let the resource manager
-+                       *  test it.
-+                       */
-+#ifndef CONFIG_XEN
-+                      request_resource(res, code_resource);
-+                      request_resource(res, data_resource);
-+#endif
-+#ifdef CONFIG_KEXEC
-+                      if (crashk_res.start != crashk_res.end)
-+                           request_resource(res, &crashk_res);
-+#ifdef CONFIG_XEN
-+                      xen_machine_kexec_register_resources(res);
-+#endif
-+#endif
-+              }
-+      }
-+}
-+
-+/*
-+ * Locate a unused range of the physical address space below 4G which
-+ * can be used for PCI mappings.
-+ */
-+static void __init
-+e820_setup_gap(struct e820entry *e820, int nr_map)
-+{
-+      unsigned long gapstart, gapsize, round;
-+      unsigned long long last;
-+      int i;
-+
-+      /*
-+       * Search for the bigest gap in the low 32 bits of the e820
-+       * memory space.
-+       */
-+      last = 0x100000000ull;
-+      gapstart = 0x10000000;
-+      gapsize = 0x400000;
-+      i = nr_map;
-+      while (--i >= 0) {
-+              unsigned long long start = e820[i].addr;
-+              unsigned long long end = start + e820[i].size;
-+
-+              /*
-+               * Since "last" is at most 4GB, we know we'll
-+               * fit in 32 bits if this condition is true
-+               */
-+              if (last > end) {
-+                      unsigned long gap = last - end;
-+
-+                      if (gap > gapsize) {
-+                              gapsize = gap;
-+                              gapstart = end;
-+                      }
-+              }
-+              if (start < last)
-+                      last = start;
-+      }
-+
-+      /*
-+       * See how much we want to round up: start off with
-+       * rounding to the next 1MB area.
-+       */
-+      round = 0x100000;
-+      while ((gapsize >> 4) > round)
-+              round += round;
-+      /* Fun with two's complement */
-+      pci_mem_start = (gapstart + round) & -round;
-+
-+      printk("Allocating PCI resources starting at %08lx (gap: %08lx:%08lx)\n",
-+              pci_mem_start, gapstart, gapsize);
-+}
-+
-+/*
-+ * Request address space for all standard resources
-+ *
-+ * This is called just before pcibios_init(), which is also a
-+ * subsys_initcall, but is linked in later (in arch/i386/pci/common.c).
-+ */
-+static int __init request_standard_resources(void)
-+{
-+      int           i;
-+
-+      /* Nothing to do if not running in dom0. */
-+      if (!is_initial_xendomain())
-+              return 0;
-+
-+      printk("Setting up standard PCI resources\n");
-+#ifdef CONFIG_XEN
-+      legacy_init_iomem_resources(machine_e820.map, machine_e820.nr_map,
-+                                  &code_resource, &data_resource);
-+#else
-+      if (efi_enabled)
-+              efi_initialize_iomem_resources(&code_resource, &data_resource);
-+      else
-+              legacy_init_iomem_resources(e820.map, e820.nr_map,
-+                                          &code_resource, &data_resource);
-+#endif
-+
-+      /* EFI systems may still have VGA */
-+      request_resource(&iomem_resource, &video_ram_resource);
-+
-+      /* request I/O space for devices used on all i[345]86 PCs */
-+      for (i = 0; i < STANDARD_IO_RESOURCES; i++)
-+              request_resource(&ioport_resource, &standard_io_resources[i]);
-+      return 0;
-+}
-+
-+subsys_initcall(request_standard_resources);
-+
-+static void __init register_memory(void)
-+{
-+#ifdef CONFIG_XEN
-+      if (is_initial_xendomain())
-+              e820_setup_gap(machine_e820.map, machine_e820.nr_map);
-+      else
-+#endif
-+              e820_setup_gap(e820.map, e820.nr_map);
-+}
-+
-+#ifdef CONFIG_MCA
-+static void set_mca_bus(int x)
-+{
-+      MCA_bus = x;
-+}
-+#else
-+static void set_mca_bus(int x) { }
-+#endif
-+
-+/*
-+ * Determine if we were loaded by an EFI loader.  If so, then we have also been
-+ * passed the efi memmap, systab, etc., so we should use these data structures
-+ * for initialization.  Note, the efi init code path is determined by the
-+ * global efi_enabled. This allows the same kernel image to be used on existing
-+ * systems (with a traditional BIOS) as well as on EFI systems.
-+ */
-+void __init setup_arch(char **cmdline_p)
-+{
-+      int i, j, k, fpp;
-+      struct physdev_set_iopl set_iopl;
-+      unsigned long max_low_pfn;
-+      unsigned long p2m_pages;
-+
-+      /* Force a quick death if the kernel panics (not domain 0). */
-+      extern int panic_timeout;
-+      if (!panic_timeout && !is_initial_xendomain())
-+              panic_timeout = 1;
-+
-+      /* Register a call for panic conditions. */
-+      atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
-+
-+      WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
-+                                   VMASST_TYPE_4gb_segments));
-+      WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
-+                                   VMASST_TYPE_writable_pagetables));
-+
-+      memcpy(&boot_cpu_data, &new_cpu_data, sizeof(new_cpu_data));
-+      pre_setup_arch_hook();
-+      early_cpu_init();
-+#ifdef CONFIG_SMP
-+      prefill_possible_map();
-+#endif
-+
-+      /*
-+       * FIXME: This isn't an official loader_type right
-+       * now but does currently work with elilo.
-+       * If we were configured as an EFI kernel, check to make
-+       * sure that we were loaded correctly from elilo and that
-+       * the system table is valid.  If not, then initialize normally.
-+       */
-+#ifdef CONFIG_EFI
-+      if ((LOADER_TYPE == 0x50) && EFI_SYSTAB)
-+              efi_enabled = 1;
-+#endif
-+
-+      /* This must be initialized to UNNAMED_MAJOR for ipconfig to work
-+         properly.  Setting ROOT_DEV to default to /dev/ram0 breaks initrd.
-+      */
-+      ROOT_DEV = MKDEV(UNNAMED_MAJOR,0);
-+      drive_info = DRIVE_INFO;
-+      screen_info = SCREEN_INFO;
-+      copy_edid();
-+      apm_info.bios = APM_BIOS_INFO;
-+      ist_info = IST_INFO;
-+      saved_videomode = VIDEO_MODE;
-+      if( SYS_DESC_TABLE.length != 0 ) {
-+              set_mca_bus(SYS_DESC_TABLE.table[3] & 0x2);
-+              machine_id = SYS_DESC_TABLE.table[0];
-+              machine_submodel_id = SYS_DESC_TABLE.table[1];
-+              BIOS_revision = SYS_DESC_TABLE.table[2];
-+      }
-+      bootloader_type = LOADER_TYPE;
-+
-+      if (is_initial_xendomain()) {
-+              const struct dom0_vga_console_info *info =
-+                      (void *)((char *)xen_start_info +
-+                               xen_start_info->console.dom0.info_off);
-+
-+              dom0_init_screen_info(info,
-+                                    xen_start_info->console.dom0.info_size);
-+              xen_start_info->console.domU.mfn = 0;
-+              xen_start_info->console.domU.evtchn = 0;
-+      } else
-+              screen_info.orig_video_isVGA = 0;
-+
-+#ifdef CONFIG_BLK_DEV_RAM
-+      rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
-+      rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-+      rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
-+#endif
-+
-+      ARCH_SETUP
-+      if (efi_enabled)
-+              efi_init();
-+      else {
-+              printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-+              print_memory_map(machine_specific_memory_setup());
-+      }
-+
-+      copy_edd();
-+
-+      if (!MOUNT_ROOT_RDONLY)
-+              root_mountflags &= ~MS_RDONLY;
-+      init_mm.start_code = (unsigned long) _text;
-+      init_mm.end_code = (unsigned long) _etext;
-+      init_mm.end_data = (unsigned long) _edata;
-+      init_mm.brk = (PFN_UP(__pa(xen_start_info->pt_base)) +
-+                     xen_start_info->nr_pt_frames) << PAGE_SHIFT;
-+
-+      code_resource.start = virt_to_phys(_text);
-+      code_resource.end = virt_to_phys(_etext)-1;
-+      data_resource.start = virt_to_phys(_etext);
-+      data_resource.end = virt_to_phys(_edata)-1;
-+
-+      parse_cmdline_early(cmdline_p);
-+
-+#ifdef CONFIG_EARLY_PRINTK
-+      {
-+              char *s = strstr(*cmdline_p, "earlyprintk=");
-+              if (s) {
-+                      setup_early_printk(strchr(s, '=') + 1);
-+                      printk("early console enabled\n");
-+              }
-+      }
-+#endif
-+
-+      max_low_pfn = setup_memory();
-+
-+      /*
-+       * NOTE: before this point _nobody_ is allowed to allocate
-+       * any memory using the bootmem allocator.  Although the
-+       * alloctor is now initialised only the first 8Mb of the kernel
-+       * virtual address space has been mapped.  All allocations before
-+       * paging_init() has completed must use the alloc_bootmem_low_pages()
-+       * variant (which allocates DMA'able memory) and care must be taken
-+       * not to exceed the 8Mb limit.
-+       */
-+
-+#ifdef CONFIG_SMP
-+      smp_alloc_memory(); /* AP processor realmode stacks in low memory*/
-+#endif
-+      paging_init();
-+      remapped_pgdat_init();
-+      sparse_init();
-+      zone_sizes_init();
-+
-+#ifdef CONFIG_X86_FIND_SMP_CONFIG
-+      /*
-+       * Find and reserve possible boot-time SMP configuration:
-+       */
-+      find_smp_config();
-+#endif
-+
-+      p2m_pages = max_pfn;
-+      if (xen_start_info->nr_pages > max_pfn) {
-+              /*
-+               * the max_pfn was shrunk (probably by mem= or highmem=
-+               * kernel parameter); shrink reservation with the HV
-+               */
-+              struct xen_memory_reservation reservation = {
-+                      .address_bits = 0,
-+                      .extent_order = 0,
-+                      .domid = DOMID_SELF
-+              };
-+              unsigned int difference;
-+              int ret;
-+
-+              difference = xen_start_info->nr_pages - max_pfn;
-+
-+              set_xen_guest_handle(reservation.extent_start,
-+                                   ((unsigned long *)xen_start_info->mfn_list) + max_pfn);
-+              reservation.nr_extents = difference;
-+              ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                         &reservation);
-+              BUG_ON (ret != difference);
-+      }
-+      else if (max_pfn > xen_start_info->nr_pages)
-+              p2m_pages = xen_start_info->nr_pages;
-+
-+      /* Make sure we have a correctly sized P->M table. */
-+      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+              phys_to_machine_mapping = alloc_bootmem_low_pages(
-+                   max_pfn * sizeof(unsigned long));
-+              memset(phys_to_machine_mapping, ~0,
-+                     max_pfn * sizeof(unsigned long));
-+              memcpy(phys_to_machine_mapping,
-+                     (unsigned long *)xen_start_info->mfn_list,
-+                     p2m_pages * sizeof(unsigned long));
-+              free_bootmem(
-+                   __pa(xen_start_info->mfn_list),
-+                   PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
-+                                   sizeof(unsigned long))));
-+
-+              /*
-+               * Initialise the list of the frames that specify the list of
-+               * frames that make up the p2m table. Used by save/restore
-+               */
-+              pfn_to_mfn_frame_list_list = alloc_bootmem_low_pages(PAGE_SIZE);
-+
-+              fpp = PAGE_SIZE/sizeof(unsigned long);
-+              for (i=0, j=0, k=-1; i< max_pfn; i+=fpp, j++) {
-+                      if ((j % fpp) == 0) {
-+                              k++;
-+                              BUG_ON(k>=16);
-+                              pfn_to_mfn_frame_list[k] =
-+                                      alloc_bootmem_low_pages(PAGE_SIZE);
-+                              pfn_to_mfn_frame_list_list[k] =
-+                                      virt_to_mfn(pfn_to_mfn_frame_list[k]);
-+                              j=0;
-+                      }
-+                      pfn_to_mfn_frame_list[k][j] =
-+                              virt_to_mfn(&phys_to_machine_mapping[i]);
-+              }
-+              HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
-+              HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-+                   virt_to_mfn(pfn_to_mfn_frame_list_list);
-+      }
-+
-+      /* Mark all ISA DMA channels in-use - using them wouldn't work. */
-+      for (i = 0; i < MAX_DMA_CHANNELS; ++i)
-+              if (i != 4 && request_dma(i, "xen") != 0)
-+                      BUG();
-+
-+      /*
-+       * NOTE: at this point the bootmem allocator is fully available.
-+       */
-+
-+      if (is_initial_xendomain())
-+              dmi_scan_machine();
-+
-+#ifdef CONFIG_X86_GENERICARCH
-+      generic_apic_probe(*cmdline_p);
-+#endif        
-+      if (efi_enabled)
-+              efi_map_memmap();
-+
-+      set_iopl.iopl = 1;
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
-+
-+#ifdef CONFIG_ACPI
-+      if (!is_initial_xendomain()) {
-+              printk(KERN_INFO "ACPI in unprivileged domain disabled\n");
-+              acpi_disabled = 1;
-+              acpi_ht = 0;
-+      }
-+
-+      /*
-+       * Parse the ACPI tables for possible boot-time SMP configuration.
-+       */
-+      acpi_boot_table_init();
-+#endif
-+
-+#ifdef CONFIG_X86_IO_APIC
-+      check_acpi_pci();       /* Checks more than just ACPI actually */
-+#endif
-+
-+#ifdef CONFIG_ACPI
-+      acpi_boot_init();
-+
-+#if defined(CONFIG_SMP) && defined(CONFIG_X86_PC)
-+      if (def_to_bigsmp)
-+              printk(KERN_WARNING "More than 8 CPUs detected and "
-+                      "CONFIG_X86_PC cannot handle it.\nUse "
-+                      "CONFIG_X86_GENERICARCH or CONFIG_X86_BIGSMP.\n");
-+#endif
-+#endif
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      if (smp_found_config)
-+              get_smp_config();
-+#endif
-+
-+      register_memory();
-+
-+      if (is_initial_xendomain()) {
-+#ifdef CONFIG_VT
-+#if defined(CONFIG_VGA_CONSOLE)
-+              if (!efi_enabled ||
-+                  (efi_mem_type(0xa0000) != EFI_CONVENTIONAL_MEMORY))
-+                      conswitchp = &vga_con;
-+#elif defined(CONFIG_DUMMY_CONSOLE)
-+              conswitchp = &dummy_con;
-+#endif
-+#endif
-+      } else {
-+#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
-+              conswitchp = &dummy_con;
-+#endif
-+      }
-+      tsc_init();
-+}
-+
-+static int
-+xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
-+{
-+      HYPERVISOR_shutdown(SHUTDOWN_crash);
-+      /* we're never actually going to get here... */
-+      return NOTIFY_DONE;
-+}
-+
-+static __init int add_pcspkr(void)
-+{
-+      struct platform_device *pd;
-+      int ret;
-+
-+      if (!is_initial_xendomain())
-+              return 0;
-+
-+      pd = platform_device_alloc("pcspkr", -1);
-+      if (!pd)
-+              return -ENOMEM;
-+
-+      ret = platform_device_add(pd);
-+      if (ret)
-+              platform_device_put(pd);
-+
-+      return ret;
-+}
-+device_initcall(add_pcspkr);
-+
-+/*
-+ * Local Variables:
-+ * mode:c
-+ * c-file-style:"k&r"
-+ * c-basic-offset:8
-+ * End:
-+ */
-Index: head-2008-11-25/arch/x86/kernel/smp_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/smp_32-xen.c       2007-12-10 08:47:31.000000000 +0100
-@@ -0,0 +1,605 @@
-+/*
-+ *    Intel SMP support routines.
-+ *
-+ *    (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
-+ *    (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    This code is released under the GNU General Public License version 2 or
-+ *    later.
-+ */
-+
-+#include <linux/init.h>
-+
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/cache.h>
-+#include <linux/interrupt.h>
-+#include <linux/cpu.h>
-+#include <linux/module.h>
-+
-+#include <asm/mtrr.h>
-+#include <asm/tlbflush.h>
-+#if 0
-+#include <mach_apic.h>
-+#endif
-+#include <xen/evtchn.h>
-+
-+/*
-+ *    Some notes on x86 processor bugs affecting SMP operation:
-+ *
-+ *    Pentium, Pentium Pro, II, III (and all CPUs) have bugs.
-+ *    The Linux implications for SMP are handled as follows:
-+ *
-+ *    Pentium III / [Xeon]
-+ *            None of the E1AP-E3AP errata are visible to the user.
-+ *
-+ *    E1AP.   see PII A1AP
-+ *    E2AP.   see PII A2AP
-+ *    E3AP.   see PII A3AP
-+ *
-+ *    Pentium II / [Xeon]
-+ *            None of the A1AP-A3AP errata are visible to the user.
-+ *
-+ *    A1AP.   see PPro 1AP
-+ *    A2AP.   see PPro 2AP
-+ *    A3AP.   see PPro 7AP
-+ *
-+ *    Pentium Pro
-+ *            None of 1AP-9AP errata are visible to the normal user,
-+ *    except occasional delivery of 'spurious interrupt' as trap #15.
-+ *    This is very rare and a non-problem.
-+ *
-+ *    1AP.    Linux maps APIC as non-cacheable
-+ *    2AP.    worked around in hardware
-+ *    3AP.    fixed in C0 and above steppings microcode update.
-+ *            Linux does not use excessive STARTUP_IPIs.
-+ *    4AP.    worked around in hardware
-+ *    5AP.    symmetric IO mode (normal Linux operation) not affected.
-+ *            'noapic' mode has vector 0xf filled out properly.
-+ *    6AP.    'noapic' mode might be affected - fixed in later steppings
-+ *    7AP.    We do not assume writes to the LVT deassering IRQs
-+ *    8AP.    We do not enable low power mode (deep sleep) during MP bootup
-+ *    9AP.    We do not use mixed mode
-+ *
-+ *    Pentium
-+ *            There is a marginal case where REP MOVS on 100MHz SMP
-+ *    machines with B stepping processors can fail. XXX should provide
-+ *    an L1cache=Writethrough or L1cache=off option.
-+ *
-+ *            B stepping CPUs may hang. There are hardware work arounds
-+ *    for this. We warn about it in case your board doesn't have the work
-+ *    arounds. Basically thats so I can tell anyone with a B stepping
-+ *    CPU and SMP problems "tough".
-+ *
-+ *    Specific items [From Pentium Processor Specification Update]
-+ *
-+ *    1AP.    Linux doesn't use remote read
-+ *    2AP.    Linux doesn't trust APIC errors
-+ *    3AP.    We work around this
-+ *    4AP.    Linux never generated 3 interrupts of the same priority
-+ *            to cause a lost local interrupt.
-+ *    5AP.    Remote read is never used
-+ *    6AP.    not affected - worked around in hardware
-+ *    7AP.    not affected - worked around in hardware
-+ *    8AP.    worked around in hardware - we get explicit CS errors if not
-+ *    9AP.    only 'noapic' mode affected. Might generate spurious
-+ *            interrupts, we log only the first one and count the
-+ *            rest silently.
-+ *    10AP.   not affected - worked around in hardware
-+ *    11AP.   Linux reads the APIC between writes to avoid this, as per
-+ *            the documentation. Make sure you preserve this as it affects
-+ *            the C stepping chips too.
-+ *    12AP.   not affected - worked around in hardware
-+ *    13AP.   not affected - worked around in hardware
-+ *    14AP.   we always deassert INIT during bootup
-+ *    15AP.   not affected - worked around in hardware
-+ *    16AP.   not affected - worked around in hardware
-+ *    17AP.   not affected - worked around in hardware
-+ *    18AP.   not affected - worked around in hardware
-+ *    19AP.   not affected - worked around in BIOS
-+ *
-+ *    If this sounds worrying believe me these bugs are either ___RARE___,
-+ *    or are signal timing bugs worked around in hardware and there's
-+ *    about nothing of note with C stepping upwards.
-+ */
-+
-+DEFINE_PER_CPU(struct tlb_state, cpu_tlbstate) ____cacheline_aligned = { &init_mm, 0, };
-+
-+/*
-+ * the following functions deal with sending IPIs between CPUs.
-+ *
-+ * We use 'broadcast', CPU->CPU IPIs and self-IPIs too.
-+ */
-+
-+static inline int __prepare_ICR (unsigned int shortcut, int vector)
-+{
-+      unsigned int icr = shortcut | APIC_DEST_LOGICAL;
-+
-+      switch (vector) {
-+      default:
-+              icr |= APIC_DM_FIXED | vector;
-+              break;
-+      case NMI_VECTOR:
-+              icr |= APIC_DM_NMI;
-+              break;
-+      }
-+      return icr;
-+}
-+
-+static inline int __prepare_ICR2 (unsigned int mask)
-+{
-+      return SET_APIC_DEST_FIELD(mask);
-+}
-+
-+DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
-+
-+static inline void __send_IPI_one(unsigned int cpu, int vector)
-+{
-+      int irq = per_cpu(ipi_to_irq, cpu)[vector];
-+      BUG_ON(irq < 0);
-+      notify_remote_via_irq(irq);
-+}
-+
-+void __send_IPI_shortcut(unsigned int shortcut, int vector)
-+{
-+      int cpu;
-+
-+      switch (shortcut) {
-+      case APIC_DEST_SELF:
-+              __send_IPI_one(smp_processor_id(), vector);
-+              break;
-+      case APIC_DEST_ALLBUT:
-+              for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-+                      if (cpu == smp_processor_id())
-+                              continue;
-+                      if (cpu_isset(cpu, cpu_online_map)) {
-+                              __send_IPI_one(cpu, vector);
-+                      }
-+              }
-+              break;
-+      default:
-+              printk("XXXXXX __send_IPI_shortcut %08x vector %d\n", shortcut,
-+                     vector);
-+              break;
-+      }
-+}
-+
-+void fastcall send_IPI_self(int vector)
-+{
-+      __send_IPI_shortcut(APIC_DEST_SELF, vector);
-+}
-+
-+/*
-+ * This is only used on smaller machines.
-+ */
-+void send_IPI_mask_bitmask(cpumask_t mask, int vector)
-+{
-+      unsigned long flags;
-+      unsigned int cpu;
-+
-+      local_irq_save(flags);
-+      WARN_ON(cpus_addr(mask)[0] & ~cpus_addr(cpu_online_map)[0]);
-+
-+      for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-+              if (cpu_isset(cpu, mask)) {
-+                      __send_IPI_one(cpu, vector);
-+              }
-+      }
-+
-+      local_irq_restore(flags);
-+}
-+
-+void send_IPI_mask_sequence(cpumask_t mask, int vector)
-+{
-+
-+      send_IPI_mask_bitmask(mask, vector);
-+}
-+
-+#include <mach_ipi.h> /* must come after the send_IPI functions above for inlining */
-+
-+#if 0 /* XEN */
-+/*
-+ *    Smarter SMP flushing macros. 
-+ *            c/o Linus Torvalds.
-+ *
-+ *    These mean you can really definitely utterly forget about
-+ *    writing to user space from interrupts. (Its not allowed anyway).
-+ *
-+ *    Optimizations Manfred Spraul <manfred@colorfullife.com>
-+ */
-+
-+static cpumask_t flush_cpumask;
-+static struct mm_struct * flush_mm;
-+static unsigned long flush_va;
-+static DEFINE_SPINLOCK(tlbstate_lock);
-+#define FLUSH_ALL     0xffffffff
-+
-+/*
-+ * We cannot call mmdrop() because we are in interrupt context, 
-+ * instead update mm->cpu_vm_mask.
-+ *
-+ * We need to reload %cr3 since the page tables may be going
-+ * away from under us..
-+ */
-+static inline void leave_mm (unsigned long cpu)
-+{
-+      if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK)
-+              BUG();
-+      cpu_clear(cpu, per_cpu(cpu_tlbstate, cpu).active_mm->cpu_vm_mask);
-+      load_cr3(swapper_pg_dir);
-+}
-+
-+/*
-+ *
-+ * The flush IPI assumes that a thread switch happens in this order:
-+ * [cpu0: the cpu that switches]
-+ * 1) switch_mm() either 1a) or 1b)
-+ * 1a) thread switch to a different mm
-+ * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
-+ *    Stop ipi delivery for the old mm. This is not synchronized with
-+ *    the other cpus, but smp_invalidate_interrupt ignore flush ipis
-+ *    for the wrong mm, and in the worst case we perform a superflous
-+ *    tlb flush.
-+ * 1a2) set cpu_tlbstate to TLBSTATE_OK
-+ *    Now the smp_invalidate_interrupt won't call leave_mm if cpu0
-+ *    was in lazy tlb mode.
-+ * 1a3) update cpu_tlbstate[].active_mm
-+ *    Now cpu0 accepts tlb flushes for the new mm.
-+ * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
-+ *    Now the other cpus will send tlb flush ipis.
-+ * 1a4) change cr3.
-+ * 1b) thread switch without mm change
-+ *    cpu_tlbstate[].active_mm is correct, cpu0 already handles
-+ *    flush ipis.
-+ * 1b1) set cpu_tlbstate to TLBSTATE_OK
-+ * 1b2) test_and_set the cpu bit in cpu_vm_mask.
-+ *    Atomically set the bit [other cpus will start sending flush ipis],
-+ *    and test the bit.
-+ * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
-+ * 2) switch %%esp, ie current
-+ *
-+ * The interrupt must handle 2 special cases:
-+ * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
-+ * - the cpu performs speculative tlb reads, i.e. even if the cpu only
-+ *   runs in kernel space, the cpu could load tlb entries for user space
-+ *   pages.
-+ *
-+ * The good news is that cpu_tlbstate is local to each cpu, no
-+ * write/read ordering problems.
-+ */
-+
-+/*
-+ * TLB flush IPI:
-+ *
-+ * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
-+ * 2) Leave the mm if we are in the lazy tlb mode.
-+ */
-+
-+irqreturn_t smp_invalidate_interrupt(int irq, void *dev_id,
-+                                   struct pt_regs *regs)
-+{
-+      unsigned long cpu;
-+
-+      cpu = get_cpu();
-+
-+      if (!cpu_isset(cpu, flush_cpumask))
-+              goto out;
-+              /* 
-+               * This was a BUG() but until someone can quote me the
-+               * line from the intel manual that guarantees an IPI to
-+               * multiple CPUs is retried _only_ on the erroring CPUs
-+               * its staying as a return
-+               *
-+               * BUG();
-+               */
-+               
-+      if (flush_mm == per_cpu(cpu_tlbstate, cpu).active_mm) {
-+              if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK) {
-+                      if (flush_va == FLUSH_ALL)
-+                              local_flush_tlb();
-+                      else
-+                              __flush_tlb_one(flush_va);
-+              } else
-+                      leave_mm(cpu);
-+      }
-+      smp_mb__before_clear_bit();
-+      cpu_clear(cpu, flush_cpumask);
-+      smp_mb__after_clear_bit();
-+out:
-+      put_cpu_no_resched();
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
-+                                              unsigned long va)
-+{
-+      /*
-+       * A couple of (to be removed) sanity checks:
-+       *
-+       * - current CPU must not be in mask
-+       * - mask must exist :)
-+       */
-+      BUG_ON(cpus_empty(cpumask));
-+      BUG_ON(cpu_isset(smp_processor_id(), cpumask));
-+      BUG_ON(!mm);
-+
-+      /* If a CPU which we ran on has gone down, OK. */
-+      cpus_and(cpumask, cpumask, cpu_online_map);
-+      if (cpus_empty(cpumask))
-+              return;
-+
-+      /*
-+       * i'm not happy about this global shared spinlock in the
-+       * MM hot path, but we'll see how contended it is.
-+       * Temporarily this turns IRQs off, so that lockups are
-+       * detected by the NMI watchdog.
-+       */
-+      spin_lock(&tlbstate_lock);
-+      
-+      flush_mm = mm;
-+      flush_va = va;
-+#if NR_CPUS <= BITS_PER_LONG
-+      atomic_set_mask(cpumask, &flush_cpumask);
-+#else
-+      {
-+              int k;
-+              unsigned long *flush_mask = (unsigned long *)&flush_cpumask;
-+              unsigned long *cpu_mask = (unsigned long *)&cpumask;
-+              for (k = 0; k < BITS_TO_LONGS(NR_CPUS); ++k)
-+                      atomic_set_mask(cpu_mask[k], &flush_mask[k]);
-+      }
-+#endif
-+      /*
-+       * We have to send the IPI only to
-+       * CPUs affected.
-+       */
-+      send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR);
-+
-+      while (!cpus_empty(flush_cpumask))
-+              /* nothing. lockup detection does not belong here */
-+              mb();
-+
-+      flush_mm = NULL;
-+      flush_va = 0;
-+      spin_unlock(&tlbstate_lock);
-+}
-+      
-+void flush_tlb_current_task(void)
-+{
-+      struct mm_struct *mm = current->mm;
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      local_flush_tlb();
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-+      preempt_enable();
-+}
-+
-+void flush_tlb_mm (struct mm_struct * mm)
-+{
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      if (current->active_mm == mm) {
-+              if (current->mm)
-+                      local_flush_tlb();
-+              else
-+                      leave_mm(smp_processor_id());
-+      }
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-+
-+      preempt_enable();
-+}
-+
-+void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
-+{
-+      struct mm_struct *mm = vma->vm_mm;
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      if (current->active_mm == mm) {
-+              if(current->mm)
-+                      __flush_tlb_one(va);
-+              else
-+                      leave_mm(smp_processor_id());
-+      }
-+
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, va);
-+
-+      preempt_enable();
-+}
-+EXPORT_SYMBOL(flush_tlb_page);
-+
-+static void do_flush_tlb_all(void* info)
-+{
-+      unsigned long cpu = smp_processor_id();
-+
-+      __flush_tlb_all();
-+      if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_LAZY)
-+              leave_mm(cpu);
-+}
-+
-+void flush_tlb_all(void)
-+{
-+      on_each_cpu(do_flush_tlb_all, NULL, 1, 1);
-+}
-+
-+#endif /* XEN */
-+
-+/*
-+ * this function sends a 'reschedule' IPI to another CPU.
-+ * it goes straight through and wastes no time serializing
-+ * anything. Worst case is that we lose a reschedule ...
-+ */
-+void smp_send_reschedule(int cpu)
-+{
-+      WARN_ON(cpu_is_offline(cpu));
-+      send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
-+}
-+
-+/*
-+ * Structure and data for smp_call_function(). This is designed to minimise
-+ * static memory requirements. It also looks cleaner.
-+ */
-+static DEFINE_SPINLOCK(call_lock);
-+
-+struct call_data_struct {
-+      void (*func) (void *info);
-+      void *info;
-+      atomic_t started;
-+      atomic_t finished;
-+      int wait;
-+};
-+
-+void lock_ipi_call_lock(void)
-+{
-+      spin_lock_irq(&call_lock);
-+}
-+
-+void unlock_ipi_call_lock(void)
-+{
-+      spin_unlock_irq(&call_lock);
-+}
-+
-+static struct call_data_struct *call_data;
-+
-+/**
-+ * smp_call_function(): Run a function on all other CPUs.
-+ * @func: The function to run. This must be fast and non-blocking.
-+ * @info: An arbitrary pointer to pass to the function.
-+ * @nonatomic: currently unused.
-+ * @wait: If true, wait (atomically) until function has completed on other CPUs.
-+ *
-+ * Returns 0 on success, else a negative status code. Does not return until
-+ * remote CPUs are nearly ready to execute <<func>> or are or have executed.
-+ *
-+ * You must not call this function with disabled interrupts or from a
-+ * hardware interrupt handler or from a bottom half handler.
-+ */
-+int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
-+                      int wait)
-+{
-+      struct call_data_struct data;
-+      int cpus;
-+
-+      /* Holding any lock stops cpus from going down. */
-+      spin_lock(&call_lock);
-+      cpus = num_online_cpus() - 1;
-+      if (!cpus) {
-+              spin_unlock(&call_lock);
-+              return 0;
-+      }
-+
-+      /* Can deadlock when called with interrupts disabled */
-+      WARN_ON(irqs_disabled());
-+
-+      data.func = func;
-+      data.info = info;
-+      atomic_set(&data.started, 0);
-+      data.wait = wait;
-+      if (wait)
-+              atomic_set(&data.finished, 0);
-+
-+      call_data = &data;
-+      mb();
-+      
-+      /* Send a message to all other CPUs and wait for them to respond */
-+      send_IPI_allbutself(CALL_FUNCTION_VECTOR);
-+
-+      /* Wait for response */
-+      while (atomic_read(&data.started) != cpus)
-+              cpu_relax();
-+
-+      if (wait)
-+              while (atomic_read(&data.finished) != cpus)
-+                      cpu_relax();
-+      spin_unlock(&call_lock);
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL(smp_call_function);
-+
-+static void stop_this_cpu (void * dummy)
-+{
-+      /*
-+       * Remove this CPU:
-+       */
-+      cpu_clear(smp_processor_id(), cpu_online_map);
-+      local_irq_disable();
-+      disable_all_local_evtchn();
-+      if (cpu_data[smp_processor_id()].hlt_works_ok)
-+              for(;;) halt();
-+      for (;;);
-+}
-+
-+/*
-+ * this function calls the 'stop' function on all other CPUs in the system.
-+ */
-+
-+void smp_send_stop(void)
-+{
-+      smp_call_function(stop_this_cpu, NULL, 1, 0);
-+
-+      local_irq_disable();
-+      disable_all_local_evtchn();
-+      local_irq_enable();
-+}
-+
-+/*
-+ * Reschedule call back. Nothing to do,
-+ * all the work is done automatically when
-+ * we return from the interrupt.
-+ */
-+irqreturn_t smp_reschedule_interrupt(int irq, void *dev_id,
-+                                   struct pt_regs *regs)
-+{
-+
-+      return IRQ_HANDLED;
-+}
-+
-+#include <linux/kallsyms.h>
-+irqreturn_t smp_call_function_interrupt(int irq, void *dev_id,
-+                                      struct pt_regs *regs)
-+{
-+      void (*func) (void *info) = call_data->func;
-+      void *info = call_data->info;
-+      int wait = call_data->wait;
-+
-+      /*
-+       * Notify initiating CPU that I've grabbed the data and am
-+       * about to execute the function
-+       */
-+      mb();
-+      atomic_inc(&call_data->started);
-+      /*
-+       * At this point the info structure may be out of scope unless wait==1
-+       */
-+      irq_enter();
-+      (*func)(info);
-+      irq_exit();
-+
-+      if (wait) {
-+              mb();
-+              atomic_inc(&call_data->finished);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-Index: head-2008-11-25/arch/x86/kernel/time_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/time_32-xen.c      2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,1209 @@
-+/*
-+ *  linux/arch/i386/kernel/time.c
-+ *
-+ *  Copyright (C) 1991, 1992, 1995  Linus Torvalds
-+ *
-+ * This file contains the PC-specific time handling details:
-+ * reading the RTC at bootup, etc..
-+ * 1994-07-02    Alan Modra
-+ *    fixed set_rtc_mmss, fixed time.year for >= 2000, new mktime
-+ * 1995-03-26    Markus Kuhn
-+ *      fixed 500 ms bug at call to set_rtc_mmss, fixed DS12887
-+ *      precision CMOS clock update
-+ * 1996-05-03    Ingo Molnar
-+ *      fixed time warps in do_[slow|fast]_gettimeoffset()
-+ * 1997-09-10 Updated NTP code according to technical memorandum Jan '96
-+ *            "A Kernel Model for Precision Timekeeping" by Dave Mills
-+ * 1998-09-05    (Various)
-+ *    More robust do_fast_gettimeoffset() algorithm implemented
-+ *    (works with APM, Cyrix 6x86MX and Centaur C6),
-+ *    monotonic gettimeofday() with fast_get_timeoffset(),
-+ *    drift-proof precision TSC calibration on boot
-+ *    (C. Scott Ananian <cananian@alumni.princeton.edu>, Andrew D.
-+ *    Balsa <andrebalsa@altern.org>, Philip Gladstone <philip@raptor.com>;
-+ *    ported from 2.0.35 Jumbo-9 by Michael Krause <m.krause@tu-harburg.de>).
-+ * 1998-12-16    Andrea Arcangeli
-+ *    Fixed Jumbo-9 code in 2.1.131: do_gettimeofday was missing 1 jiffy
-+ *    because was not accounting lost_ticks.
-+ * 1998-12-24 Copyright (C) 1998  Andrea Arcangeli
-+ *    Fixed a xtime SMP race (we need the xtime_lock rw spinlock to
-+ *    serialize accesses to xtime/lost_ticks).
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/param.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/interrupt.h>
-+#include <linux/time.h>
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/smp.h>
-+#include <linux/module.h>
-+#include <linux/sysdev.h>
-+#include <linux/bcd.h>
-+#include <linux/efi.h>
-+#include <linux/mca.h>
-+#include <linux/sysctl.h>
-+#include <linux/percpu.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/posix-timers.h>
-+#include <linux/cpufreq.h>
-+
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/irq.h>
-+#include <asm/msr.h>
-+#include <asm/delay.h>
-+#include <asm/mpspec.h>
-+#include <asm/uaccess.h>
-+#include <asm/processor.h>
-+#include <asm/timer.h>
-+#include <asm/sections.h>
-+
-+#include "mach_time.h"
-+
-+#include <linux/timex.h>
-+
-+#include <asm/hpet.h>
-+
-+#include <asm/arch_hooks.h>
-+
-+#include <xen/evtchn.h>
-+#include <xen/interface/vcpu.h>
-+
-+#if defined (__i386__)
-+#include <asm/i8259.h>
-+#endif
-+
-+int pit_latch_buggy;              /* extern */
-+
-+#if defined(__x86_64__)
-+unsigned long vxtime_hz = PIT_TICK_RATE;
-+struct vxtime_data __vxtime __section_vxtime;   /* for vsyscalls */
-+volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
-+unsigned long __wall_jiffies __section_wall_jiffies = INITIAL_JIFFIES;
-+struct timespec __xtime __section_xtime;
-+struct timezone __sys_tz __section_sys_tz;
-+#endif
-+
-+unsigned int cpu_khz; /* Detected as we calibrate the TSC */
-+EXPORT_SYMBOL(cpu_khz);
-+
-+extern unsigned long wall_jiffies;
-+
-+DEFINE_SPINLOCK(rtc_lock);
-+EXPORT_SYMBOL(rtc_lock);
-+
-+extern struct init_timer_opts timer_tsc_init;
-+extern struct timer_opts timer_tsc;
-+#define timer_none timer_tsc
-+
-+/* These are peridically updated in shared_info, and then copied here. */
-+struct shadow_time_info {
-+      u64 tsc_timestamp;     /* TSC at last update of time vals.  */
-+      u64 system_timestamp;  /* Time, in nanosecs, since boot.    */
-+      u32 tsc_to_nsec_mul;
-+      u32 tsc_to_usec_mul;
-+      int tsc_shift;
-+      u32 version;
-+};
-+static DEFINE_PER_CPU(struct shadow_time_info, shadow_time);
-+static struct timespec shadow_tv;
-+static u32 shadow_tv_version;
-+
-+static struct timeval monotonic_tv;
-+static spinlock_t monotonic_lock = SPIN_LOCK_UNLOCKED;
-+
-+/* Keep track of last time we did processing/updating of jiffies and xtime. */
-+static u64 processed_system_time;   /* System time (ns) at last processing. */
-+static DEFINE_PER_CPU(u64, processed_system_time);
-+
-+/* How much CPU time was spent blocked and how much was 'stolen'? */
-+static DEFINE_PER_CPU(u64, processed_stolen_time);
-+static DEFINE_PER_CPU(u64, processed_blocked_time);
-+
-+/* Current runstate of each CPU (updated automatically by the hypervisor). */
-+static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
-+
-+/* Must be signed, as it's compared with s64 quantities which can be -ve. */
-+#define NS_PER_TICK (1000000000LL/HZ)
-+
-+static void __clock_was_set(void *unused)
-+{
-+      clock_was_set();
-+}
-+static DECLARE_WORK(clock_was_set_work, __clock_was_set, NULL);
-+
-+/*
-+ * GCC 4.3 can turn loops over an induction variable into division. We do
-+ * not support arbitrary 64-bit division, and so must break the induction.
-+ */
-+#define clobber_induction_variable(v) asm ( "" : "+r" (v) )
-+
-+static inline void __normalize_time(time_t *sec, s64 *nsec)
-+{
-+      while (*nsec >= NSEC_PER_SEC) {
-+              clobber_induction_variable(*nsec);
-+              (*nsec) -= NSEC_PER_SEC;
-+              (*sec)++;
-+      }
-+      while (*nsec < 0) {
-+              clobber_induction_variable(*nsec);
-+              (*nsec) += NSEC_PER_SEC;
-+              (*sec)--;
-+      }
-+}
-+
-+/* Does this guest OS track Xen time, or set its wall clock independently? */
-+static int independent_wallclock = 0;
-+static int __init __independent_wallclock(char *str)
-+{
-+      independent_wallclock = 1;
-+      return 1;
-+}
-+__setup("independent_wallclock", __independent_wallclock);
-+
-+/* Permitted clock jitter, in nsecs, beyond which a warning will be printed. */
-+static unsigned long permitted_clock_jitter = 10000000UL; /* 10ms */
-+static int __init __permitted_clock_jitter(char *str)
-+{
-+      permitted_clock_jitter = simple_strtoul(str, NULL, 0);
-+      return 1;
-+}
-+__setup("permitted_clock_jitter=", __permitted_clock_jitter);
-+
-+#if 0
-+static void delay_tsc(unsigned long loops)
-+{
-+      unsigned long bclock, now;
-+
-+      rdtscl(bclock);
-+      do {
-+              rep_nop();
-+              rdtscl(now);
-+      } while ((now - bclock) < loops);
-+}
-+
-+struct timer_opts timer_tsc = {
-+      .name = "tsc",
-+      .delay = delay_tsc,
-+};
-+#endif
-+
-+/*
-+ * Scale a 64-bit delta by scaling and multiplying by a 32-bit fraction,
-+ * yielding a 64-bit result.
-+ */
-+static inline u64 scale_delta(u64 delta, u32 mul_frac, int shift)
-+{
-+      u64 product;
-+#ifdef __i386__
-+      u32 tmp1, tmp2;
-+#endif
-+
-+      if (shift < 0)
-+              delta >>= -shift;
-+      else
-+              delta <<= shift;
-+
-+#ifdef __i386__
-+      __asm__ (
-+              "mul  %5       ; "
-+              "mov  %4,%%eax ; "
-+              "mov  %%edx,%4 ; "
-+              "mul  %5       ; "
-+              "xor  %5,%5    ; "
-+              "add  %4,%%eax ; "
-+              "adc  %5,%%edx ; "
-+              : "=A" (product), "=r" (tmp1), "=r" (tmp2)
-+              : "a" ((u32)delta), "1" ((u32)(delta >> 32)), "2" (mul_frac) );
-+#else
-+      __asm__ (
-+              "mul %%rdx ; shrd $32,%%rdx,%%rax"
-+              : "=a" (product) : "0" (delta), "d" ((u64)mul_frac) );
-+#endif
-+
-+      return product;
-+}
-+
-+#if 0 /* defined (__i386__) */
-+int read_current_timer(unsigned long *timer_val)
-+{
-+      rdtscl(*timer_val);
-+      return 0;
-+}
-+#endif
-+
-+void init_cpu_khz(void)
-+{
-+      u64 __cpu_khz = 1000000ULL << 32;
-+      struct vcpu_time_info *info = &vcpu_info(0)->time;
-+      do_div(__cpu_khz, info->tsc_to_system_mul);
-+      if (info->tsc_shift < 0)
-+              cpu_khz = __cpu_khz << -info->tsc_shift;
-+      else
-+              cpu_khz = __cpu_khz >> info->tsc_shift;
-+}
-+
-+static u64 get_nsec_offset(struct shadow_time_info *shadow)
-+{
-+      u64 now, delta;
-+      rdtscll(now);
-+      delta = now - shadow->tsc_timestamp;
-+      return scale_delta(delta, shadow->tsc_to_nsec_mul, shadow->tsc_shift);
-+}
-+
-+static unsigned long get_usec_offset(struct shadow_time_info *shadow)
-+{
-+      u64 now, delta;
-+      rdtscll(now);
-+      delta = now - shadow->tsc_timestamp;
-+      return scale_delta(delta, shadow->tsc_to_usec_mul, shadow->tsc_shift);
-+}
-+
-+static void __update_wallclock(time_t sec, long nsec)
-+{
-+      long wtm_nsec, xtime_nsec;
-+      time_t wtm_sec, xtime_sec;
-+      u64 tmp, wc_nsec;
-+
-+      /* Adjust wall-clock time base based on wall_jiffies ticks. */
-+      wc_nsec = processed_system_time;
-+      wc_nsec += sec * (u64)NSEC_PER_SEC;
-+      wc_nsec += nsec;
-+      wc_nsec -= (jiffies - wall_jiffies) * (u64)NS_PER_TICK;
-+
-+      /* Split wallclock base into seconds and nanoseconds. */
-+      tmp = wc_nsec;
-+      xtime_nsec = do_div(tmp, 1000000000);
-+      xtime_sec  = (time_t)tmp;
-+
-+      wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - xtime_sec);
-+      wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - xtime_nsec);
-+
-+      set_normalized_timespec(&xtime, xtime_sec, xtime_nsec);
-+      set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
-+
-+      ntp_clear();
-+}
-+
-+static void update_wallclock(void)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+
-+      do {
-+              shadow_tv_version = s->wc_version;
-+              rmb();
-+              shadow_tv.tv_sec  = s->wc_sec;
-+              shadow_tv.tv_nsec = s->wc_nsec;
-+              rmb();
-+      } while ((s->wc_version & 1) | (shadow_tv_version ^ s->wc_version));
-+
-+      if (!independent_wallclock)
-+              __update_wallclock(shadow_tv.tv_sec, shadow_tv.tv_nsec);
-+}
-+
-+/*
-+ * Reads a consistent set of time-base values from Xen, into a shadow data
-+ * area.
-+ */
-+static void get_time_values_from_xen(unsigned int cpu)
-+{
-+      struct vcpu_time_info   *src;
-+      struct shadow_time_info *dst;
-+      unsigned long flags;
-+      u32 pre_version, post_version;
-+
-+      src = &vcpu_info(cpu)->time;
-+      dst = &per_cpu(shadow_time, cpu);
-+
-+      local_irq_save(flags);
-+
-+      do {
-+              pre_version = dst->version = src->version;
-+              rmb();
-+              dst->tsc_timestamp     = src->tsc_timestamp;
-+              dst->system_timestamp  = src->system_time;
-+              dst->tsc_to_nsec_mul   = src->tsc_to_system_mul;
-+              dst->tsc_shift         = src->tsc_shift;
-+              rmb();
-+              post_version = src->version;
-+      } while ((pre_version & 1) | (pre_version ^ post_version));
-+
-+      dst->tsc_to_usec_mul = dst->tsc_to_nsec_mul / 1000;
-+
-+      local_irq_restore(flags);
-+}
-+
-+static inline int time_values_up_to_date(unsigned int cpu)
-+{
-+      struct vcpu_time_info   *src;
-+      struct shadow_time_info *dst;
-+
-+      src = &vcpu_info(cpu)->time;
-+      dst = &per_cpu(shadow_time, cpu);
-+
-+      rmb();
-+      return (dst->version == src->version);
-+}
-+
-+/*
-+ * This is a special lock that is owned by the CPU and holds the index
-+ * register we are working with.  It is required for NMI access to the
-+ * CMOS/RTC registers.  See include/asm-i386/mc146818rtc.h for details.
-+ */
-+volatile unsigned long cmos_lock = 0;
-+EXPORT_SYMBOL(cmos_lock);
-+
-+/* Routines for accessing the CMOS RAM/RTC. */
-+unsigned char rtc_cmos_read(unsigned char addr)
-+{
-+      unsigned char val;
-+      lock_cmos_prefix(addr);
-+      outb_p(addr, RTC_PORT(0));
-+      val = inb_p(RTC_PORT(1));
-+      lock_cmos_suffix(addr);
-+      return val;
-+}
-+EXPORT_SYMBOL(rtc_cmos_read);
-+
-+void rtc_cmos_write(unsigned char val, unsigned char addr)
-+{
-+      lock_cmos_prefix(addr);
-+      outb_p(addr, RTC_PORT(0));
-+      outb_p(val, RTC_PORT(1));
-+      lock_cmos_suffix(addr);
-+}
-+EXPORT_SYMBOL(rtc_cmos_write);
-+
-+/*
-+ * This version of gettimeofday has microsecond resolution
-+ * and better than microsecond precision on fast x86 machines with TSC.
-+ */
-+void do_gettimeofday(struct timeval *tv)
-+{
-+      unsigned long seq;
-+      unsigned long usec, sec;
-+      unsigned long flags;
-+      s64 nsec;
-+      unsigned int cpu;
-+      struct shadow_time_info *shadow;
-+      u32 local_time_version;
-+
-+      cpu = get_cpu();
-+      shadow = &per_cpu(shadow_time, cpu);
-+
-+      do {
-+              unsigned long lost;
-+
-+              local_time_version = shadow->version;
-+              seq = read_seqbegin(&xtime_lock);
-+
-+              usec = get_usec_offset(shadow);
-+              lost = jiffies - wall_jiffies;
-+
-+              if (unlikely(lost))
-+                      usec += lost * (USEC_PER_SEC / HZ);
-+
-+              sec = xtime.tv_sec;
-+              usec += (xtime.tv_nsec / NSEC_PER_USEC);
-+
-+              nsec = shadow->system_timestamp - processed_system_time;
-+              __normalize_time(&sec, &nsec);
-+              usec += (long)nsec / NSEC_PER_USEC;
-+
-+              if (unlikely(!time_values_up_to_date(cpu))) {
-+                      /*
-+                       * We may have blocked for a long time,
-+                       * rendering our calculations invalid
-+                       * (e.g. the time delta may have
-+                       * overflowed). Detect that and recalculate
-+                       * with fresh values.
-+                       */
-+                      get_time_values_from_xen(cpu);
-+                      continue;
-+              }
-+      } while (read_seqretry(&xtime_lock, seq) ||
-+               (local_time_version != shadow->version));
-+
-+      put_cpu();
-+
-+      while (usec >= USEC_PER_SEC) {
-+              usec -= USEC_PER_SEC;
-+              sec++;
-+      }
-+
-+      spin_lock_irqsave(&monotonic_lock, flags);
-+      if ((sec > monotonic_tv.tv_sec) ||
-+          ((sec == monotonic_tv.tv_sec) && (usec > monotonic_tv.tv_usec)))
-+      {
-+              monotonic_tv.tv_sec = sec;
-+              monotonic_tv.tv_usec = usec;
-+      } else {
-+              sec = monotonic_tv.tv_sec;
-+              usec = monotonic_tv.tv_usec;
-+      }
-+      spin_unlock_irqrestore(&monotonic_lock, flags);
-+
-+      tv->tv_sec = sec;
-+      tv->tv_usec = usec;
-+}
-+
-+EXPORT_SYMBOL(do_gettimeofday);
-+
-+int do_settimeofday(struct timespec *tv)
-+{
-+      time_t sec;
-+      s64 nsec;
-+      unsigned int cpu;
-+      struct shadow_time_info *shadow;
-+      struct xen_platform_op op;
-+
-+      if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
-+              return -EINVAL;
-+
-+      cpu = get_cpu();
-+      shadow = &per_cpu(shadow_time, cpu);
-+
-+      write_seqlock_irq(&xtime_lock);
-+
-+      /*
-+       * Ensure we don't get blocked for a long time so that our time delta
-+       * overflows. If that were to happen then our shadow time values would
-+       * be stale, so we can retry with fresh ones.
-+       */
-+      for (;;) {
-+              nsec = tv->tv_nsec - get_nsec_offset(shadow);
-+              if (time_values_up_to_date(cpu))
-+                      break;
-+              get_time_values_from_xen(cpu);
-+      }
-+      sec = tv->tv_sec;
-+      __normalize_time(&sec, &nsec);
-+
-+      if (is_initial_xendomain() && !independent_wallclock) {
-+              op.cmd = XENPF_settime;
-+              op.u.settime.secs        = sec;
-+              op.u.settime.nsecs       = nsec;
-+              op.u.settime.system_time = shadow->system_timestamp;
-+              WARN_ON(HYPERVISOR_platform_op(&op));
-+              update_wallclock();
-+      } else if (independent_wallclock) {
-+              nsec -= shadow->system_timestamp;
-+              __normalize_time(&sec, &nsec);
-+              __update_wallclock(sec, nsec);
-+      }
-+
-+      /* Reset monotonic gettimeofday() timeval. */
-+      spin_lock(&monotonic_lock);
-+      monotonic_tv.tv_sec = 0;
-+      monotonic_tv.tv_usec = 0;
-+      spin_unlock(&monotonic_lock);
-+
-+      write_sequnlock_irq(&xtime_lock);
-+
-+      put_cpu();
-+
-+      clock_was_set();
-+      return 0;
-+}
-+
-+EXPORT_SYMBOL(do_settimeofday);
-+
-+static void sync_xen_wallclock(unsigned long dummy);
-+static DEFINE_TIMER(sync_xen_wallclock_timer, sync_xen_wallclock, 0, 0);
-+static void sync_xen_wallclock(unsigned long dummy)
-+{
-+      time_t sec;
-+      s64 nsec;
-+      struct xen_platform_op op;
-+
-+      if (!ntp_synced() || independent_wallclock || !is_initial_xendomain())
-+              return;
-+
-+      write_seqlock_irq(&xtime_lock);
-+
-+      sec  = xtime.tv_sec;
-+      nsec = xtime.tv_nsec + ((jiffies - wall_jiffies) * (u64)NS_PER_TICK);
-+      __normalize_time(&sec, &nsec);
-+
-+      op.cmd = XENPF_settime;
-+      op.u.settime.secs        = sec;
-+      op.u.settime.nsecs       = nsec;
-+      op.u.settime.system_time = processed_system_time;
-+      WARN_ON(HYPERVISOR_platform_op(&op));
-+
-+      update_wallclock();
-+
-+      write_sequnlock_irq(&xtime_lock);
-+
-+      /* Once per minute. */
-+      mod_timer(&sync_xen_wallclock_timer, jiffies + 60*HZ);
-+}
-+
-+static int set_rtc_mmss(unsigned long nowtime)
-+{
-+      int retval;
-+      unsigned long flags;
-+
-+      if (independent_wallclock || !is_initial_xendomain())
-+              return 0;
-+
-+      /* gets recalled with irq locally disabled */
-+      /* XXX - does irqsave resolve this? -johnstul */
-+      spin_lock_irqsave(&rtc_lock, flags);
-+      if (efi_enabled)
-+              retval = efi_set_rtc_mmss(nowtime);
-+      else
-+              retval = mach_set_rtc_mmss(nowtime);
-+      spin_unlock_irqrestore(&rtc_lock, flags);
-+
-+      return retval;
-+}
-+
-+/* monotonic_clock(): returns # of nanoseconds passed since time_init()
-+ *            Note: This function is required to return accurate
-+ *            time even in the absence of multiple timer ticks.
-+ */
-+unsigned long long monotonic_clock(void)
-+{
-+      unsigned int cpu = get_cpu();
-+      struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
-+      u64 time;
-+      u32 local_time_version;
-+
-+      do {
-+              local_time_version = shadow->version;
-+              barrier();
-+              time = shadow->system_timestamp + get_nsec_offset(shadow);
-+              if (!time_values_up_to_date(cpu))
-+                      get_time_values_from_xen(cpu);
-+              barrier();
-+      } while (local_time_version != shadow->version);
-+
-+      put_cpu();
-+
-+      return time;
-+}
-+EXPORT_SYMBOL(monotonic_clock);
-+
-+#ifdef __x86_64__
-+unsigned long long sched_clock(void)
-+{
-+      return monotonic_clock();
-+}
-+#endif
-+
-+#if defined(CONFIG_SMP) && defined(CONFIG_FRAME_POINTER)
-+unsigned long profile_pc(struct pt_regs *regs)
-+{
-+      unsigned long pc = instruction_pointer(regs);
-+
-+#ifdef __x86_64__
-+      /* Assume the lock function has either no stack frame or only a single word.
-+         This checks if the address on the stack looks like a kernel text address.
-+         There is a small window for false hits, but in that case the tick
-+         is just accounted to the spinlock function.
-+         Better would be to write these functions in assembler again
-+         and check exactly. */
-+      if (!user_mode_vm(regs) && in_lock_functions(pc)) {
-+              char *v = *(char **)regs->rsp;
-+              if ((v >= _stext && v <= _etext) ||
-+                      (v >= _sinittext && v <= _einittext) ||
-+                      (v >= (char *)MODULES_VADDR  && v <= (char *)MODULES_END))
-+                      return (unsigned long)v;
-+              return ((unsigned long *)regs->rsp)[1];
-+      }
-+#else
-+      if (!user_mode_vm(regs) && in_lock_functions(pc))
-+              return *(unsigned long *)(regs->ebp + 4);
-+#endif
-+
-+      return pc;
-+}
-+EXPORT_SYMBOL(profile_pc);
-+#endif
-+
-+/*
-+ * This is the same as the above, except we _also_ save the current
-+ * Time Stamp Counter value at the time of the timer interrupt, so that
-+ * we later on can estimate the time of day more exactly.
-+ */
-+irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      s64 delta, delta_cpu, stolen, blocked;
-+      u64 sched_time;
-+      unsigned int i, cpu = smp_processor_id();
-+      struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
-+      struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
-+
-+      /*
-+       * Here we are in the timer irq handler. We just have irqs locally
-+       * disabled but we don't know if the timer_bh is running on the other
-+       * CPU. We need to avoid to SMP race with it. NOTE: we don' t need
-+       * the irq version of write_lock because as just said we have irq
-+       * locally disabled. -arca
-+       */
-+      write_seqlock(&xtime_lock);
-+
-+      do {
-+              get_time_values_from_xen(cpu);
-+
-+              /* Obtain a consistent snapshot of elapsed wallclock cycles. */
-+              delta = delta_cpu =
-+                      shadow->system_timestamp + get_nsec_offset(shadow);
-+              delta     -= processed_system_time;
-+              delta_cpu -= per_cpu(processed_system_time, cpu);
-+
-+              /*
-+               * Obtain a consistent snapshot of stolen/blocked cycles. We
-+               * can use state_entry_time to detect if we get preempted here.
-+               */
-+              do {
-+                      sched_time = runstate->state_entry_time;
-+                      barrier();
-+                      stolen = runstate->time[RUNSTATE_runnable] +
-+                              runstate->time[RUNSTATE_offline] -
-+                              per_cpu(processed_stolen_time, cpu);
-+                      blocked = runstate->time[RUNSTATE_blocked] -
-+                              per_cpu(processed_blocked_time, cpu);
-+                      barrier();
-+              } while (sched_time != runstate->state_entry_time);
-+      } while (!time_values_up_to_date(cpu));
-+
-+      if ((unlikely(delta < -(s64)permitted_clock_jitter) ||
-+           unlikely(delta_cpu < -(s64)permitted_clock_jitter))
-+          && printk_ratelimit()) {
-+              printk("Timer ISR/%u: Time went backwards: "
-+                     "delta=%lld delta_cpu=%lld shadow=%lld "
-+                     "off=%lld processed=%lld cpu_processed=%lld\n",
-+                     cpu, delta, delta_cpu, shadow->system_timestamp,
-+                     (s64)get_nsec_offset(shadow),
-+                     processed_system_time,
-+                     per_cpu(processed_system_time, cpu));
-+              for (i = 0; i < num_online_cpus(); i++)
-+                      printk(" %d: %lld\n", i,
-+                             per_cpu(processed_system_time, i));
-+      }
-+
-+      /* System-wide jiffy work. */
-+      while (delta >= NS_PER_TICK) {
-+              delta -= NS_PER_TICK;
-+              processed_system_time += NS_PER_TICK;
-+              do_timer(regs);
-+      }
-+
-+      if (shadow_tv_version != HYPERVISOR_shared_info->wc_version) {
-+              update_wallclock();
-+              if (keventd_up())
-+                      schedule_work(&clock_was_set_work);
-+      }
-+
-+      write_sequnlock(&xtime_lock);
-+
-+      /*
-+       * Account stolen ticks.
-+       * HACK: Passing NULL to account_steal_time()
-+       * ensures that the ticks are accounted as stolen.
-+       */
-+      if ((stolen > 0) && (delta_cpu > 0)) {
-+              delta_cpu -= stolen;
-+              if (unlikely(delta_cpu < 0))
-+                      stolen += delta_cpu; /* clamp local-time progress */
-+              do_div(stolen, NS_PER_TICK);
-+              per_cpu(processed_stolen_time, cpu) += stolen * NS_PER_TICK;
-+              per_cpu(processed_system_time, cpu) += stolen * NS_PER_TICK;
-+              account_steal_time(NULL, (cputime_t)stolen);
-+      }
-+
-+      /*
-+       * Account blocked ticks.
-+       * HACK: Passing idle_task to account_steal_time()
-+       * ensures that the ticks are accounted as idle/wait.
-+       */
-+      if ((blocked > 0) && (delta_cpu > 0)) {
-+              delta_cpu -= blocked;
-+              if (unlikely(delta_cpu < 0))
-+                      blocked += delta_cpu; /* clamp local-time progress */
-+              do_div(blocked, NS_PER_TICK);
-+              per_cpu(processed_blocked_time, cpu) += blocked * NS_PER_TICK;
-+              per_cpu(processed_system_time, cpu)  += blocked * NS_PER_TICK;
-+              account_steal_time(idle_task(cpu), (cputime_t)blocked);
-+      }
-+
-+      /* Account user/system ticks. */
-+      if (delta_cpu > 0) {
-+              do_div(delta_cpu, NS_PER_TICK);
-+              per_cpu(processed_system_time, cpu) += delta_cpu * NS_PER_TICK;
-+              if (user_mode_vm(regs))
-+                      account_user_time(current, (cputime_t)delta_cpu);
-+              else
-+                      account_system_time(current, HARDIRQ_OFFSET,
-+                                          (cputime_t)delta_cpu);
-+      }
-+
-+      /* Offlined for more than a few seconds? Avoid lockup warnings. */
-+      if (stolen > 5*HZ)
-+              touch_softlockup_watchdog();
-+
-+      /* Local timer processing (see update_process_times()). */
-+      run_local_timers();
-+      if (rcu_pending(cpu))
-+              rcu_check_callbacks(cpu, user_mode_vm(regs));
-+      scheduler_tick();
-+      run_posix_cpu_timers(current);
-+      profile_tick(CPU_PROFILING, regs);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void init_missing_ticks_accounting(unsigned int cpu)
-+{
-+      struct vcpu_register_runstate_memory_area area;
-+      struct vcpu_runstate_info *runstate = &per_cpu(runstate, cpu);
-+      int rc;
-+
-+      memset(runstate, 0, sizeof(*runstate));
-+
-+      area.addr.v = runstate;
-+      rc = HYPERVISOR_vcpu_op(VCPUOP_register_runstate_memory_area, cpu, &area);
-+      WARN_ON(rc && rc != -ENOSYS);
-+
-+      per_cpu(processed_blocked_time, cpu) =
-+              runstate->time[RUNSTATE_blocked];
-+      per_cpu(processed_stolen_time, cpu) =
-+              runstate->time[RUNSTATE_runnable] +
-+              runstate->time[RUNSTATE_offline];
-+}
-+
-+/* not static: needed by APM */
-+unsigned long get_cmos_time(void)
-+{
-+      unsigned long retval;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&rtc_lock, flags);
-+
-+      if (efi_enabled)
-+              retval = efi_get_time();
-+      else
-+              retval = mach_get_cmos_time();
-+
-+      spin_unlock_irqrestore(&rtc_lock, flags);
-+
-+      return retval;
-+}
-+EXPORT_SYMBOL(get_cmos_time);
-+
-+static void sync_cmos_clock(unsigned long dummy);
-+
-+static DEFINE_TIMER(sync_cmos_timer, sync_cmos_clock, 0, 0);
-+
-+static void sync_cmos_clock(unsigned long dummy)
-+{
-+      struct timeval now, next;
-+      int fail = 1;
-+
-+      /*
-+       * If we have an externally synchronized Linux clock, then update
-+       * CMOS clock accordingly every ~11 minutes. Set_rtc_mmss() has to be
-+       * called as close as possible to 500 ms before the new second starts.
-+       * This code is run on a timer.  If the clock is set, that timer
-+       * may not expire at the correct time.  Thus, we adjust...
-+       */
-+      if (!ntp_synced())
-+              /*
-+               * Not synced, exit, do not restart a timer (if one is
-+               * running, let it run out).
-+               */
-+              return;
-+
-+      do_gettimeofday(&now);
-+      if (now.tv_usec >= USEC_AFTER - ((unsigned) TICK_SIZE) / 2 &&
-+          now.tv_usec <= USEC_BEFORE + ((unsigned) TICK_SIZE) / 2)
-+              fail = set_rtc_mmss(now.tv_sec);
-+
-+      next.tv_usec = USEC_AFTER - now.tv_usec;
-+      if (next.tv_usec <= 0)
-+              next.tv_usec += USEC_PER_SEC;
-+
-+      if (!fail)
-+              next.tv_sec = 659;
-+      else
-+              next.tv_sec = 0;
-+
-+      if (next.tv_usec >= USEC_PER_SEC) {
-+              next.tv_sec++;
-+              next.tv_usec -= USEC_PER_SEC;
-+      }
-+      mod_timer(&sync_cmos_timer, jiffies + timeval_to_jiffies(&next));
-+}
-+
-+void notify_arch_cmos_timer(void)
-+{
-+      mod_timer(&sync_cmos_timer, jiffies + 1);
-+      mod_timer(&sync_xen_wallclock_timer, jiffies + 1);
-+}
-+
-+static int timer_resume(struct sys_device *dev)
-+{
-+      extern void time_resume(void);
-+      time_resume();
-+      return 0;
-+}
-+
-+static struct sysdev_class timer_sysclass = {
-+      .resume = timer_resume,
-+      set_kset_name("timer"),
-+};
-+
-+
-+/* XXX this driverfs stuff should probably go elsewhere later -john */
-+static struct sys_device device_timer = {
-+      .id     = 0,
-+      .cls    = &timer_sysclass,
-+};
-+
-+static int time_init_device(void)
-+{
-+      int error = sysdev_class_register(&timer_sysclass);
-+      if (!error)
-+              error = sysdev_register(&device_timer);
-+      return error;
-+}
-+
-+device_initcall(time_init_device);
-+
-+#ifdef CONFIG_HPET_TIMER
-+extern void (*late_time_init)(void);
-+/* Duplicate of time_init() below, with hpet_enable part added */
-+static void __init hpet_time_init(void)
-+{
-+      xtime.tv_sec = get_cmos_time();
-+      xtime.tv_nsec = (INITIAL_JIFFIES % HZ) * (NSEC_PER_SEC / HZ);
-+      set_normalized_timespec(&wall_to_monotonic,
-+              -xtime.tv_sec, -xtime.tv_nsec);
-+
-+      if ((hpet_enable() >= 0) && hpet_use_timer) {
-+              printk("Using HPET for base-timer\n");
-+      }
-+
-+      time_init_hook();
-+}
-+#endif
-+
-+/* Dynamically-mapped IRQ. */
-+DEFINE_PER_CPU(int, timer_irq);
-+
-+extern void (*late_time_init)(void);
-+static void setup_cpu0_timer_irq(void)
-+{
-+      per_cpu(timer_irq, 0) =
-+              bind_virq_to_irqhandler(
-+                      VIRQ_TIMER,
-+                      0,
-+                      timer_interrupt,
-+                      SA_INTERRUPT,
-+                      "timer0",
-+                      NULL);
-+      BUG_ON(per_cpu(timer_irq, 0) < 0);
-+}
-+
-+static struct vcpu_set_periodic_timer xen_set_periodic_tick = {
-+      .period_ns = NS_PER_TICK
-+};
-+
-+void __init time_init(void)
-+{
-+#ifdef CONFIG_HPET_TIMER
-+      if (is_hpet_capable()) {
-+              /*
-+               * HPET initialization needs to do memory-mapped io. So, let
-+               * us do a late initialization after mem_init().
-+               */
-+              late_time_init = hpet_time_init;
-+              return;
-+      }
-+#endif
-+
-+      switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
-+                                 &xen_set_periodic_tick)) {
-+      case 0:
-+#if CONFIG_XEN_COMPAT <= 0x030004
-+      case -ENOSYS:
-+#endif
-+              break;
-+      default:
-+              BUG();
-+      }
-+
-+      get_time_values_from_xen(0);
-+
-+      processed_system_time = per_cpu(shadow_time, 0).system_timestamp;
-+      per_cpu(processed_system_time, 0) = processed_system_time;
-+      init_missing_ticks_accounting(0);
-+
-+      update_wallclock();
-+
-+      init_cpu_khz();
-+      printk(KERN_INFO "Xen reported: %u.%03u MHz processor.\n",
-+             cpu_khz / 1000, cpu_khz % 1000);
-+
-+#if defined(__x86_64__)
-+      vxtime.mode = VXTIME_TSC;
-+      vxtime.quot = (1000000L << 32) / vxtime_hz;
-+      vxtime.tsc_quot = (1000L << 32) / cpu_khz;
-+      sync_core();
-+      rdtscll(vxtime.last_tsc);
-+#endif
-+
-+      /* Cannot request_irq() until kmem is initialised. */
-+      late_time_init = setup_cpu0_timer_irq;
-+}
-+
-+/* Convert jiffies to system time. */
-+u64 jiffies_to_st(unsigned long j)
-+{
-+      unsigned long seq;
-+      long delta;
-+      u64 st;
-+
-+      do {
-+              seq = read_seqbegin(&xtime_lock);
-+              delta = j - jiffies;
-+              if (delta < 1) {
-+                      /* Triggers in some wrap-around cases, but that's okay:
-+                       * we just end up with a shorter timeout. */
-+                      st = processed_system_time + NS_PER_TICK;
-+              } else if (((unsigned long)delta >> (BITS_PER_LONG-3)) != 0) {
-+                      /* Very long timeout means there is no pending timer.
-+                       * We indicate this to Xen by passing zero timeout. */
-+                      st = 0;
-+              } else {
-+                      st = processed_system_time + delta * (u64)NS_PER_TICK;
-+              }
-+      } while (read_seqretry(&xtime_lock, seq));
-+
-+      return st;
-+}
-+EXPORT_SYMBOL(jiffies_to_st);
-+
-+/*
-+ * stop_hz_timer / start_hz_timer - enter/exit 'tickless mode' on an idle cpu
-+ * These functions are based on implementations from arch/s390/kernel/time.c
-+ */
-+static void stop_hz_timer(void)
-+{
-+      struct vcpu_set_singleshot_timer singleshot;
-+      unsigned int cpu = smp_processor_id();
-+      unsigned long j;
-+      int rc;
-+
-+      cpu_set(cpu, nohz_cpu_mask);
-+
-+      /* See matching smp_mb in rcu_start_batch in rcupdate.c.  These mbs  */
-+      /* ensure that if __rcu_pending (nested in rcu_needs_cpu) fetches a  */
-+      /* value of rcp->cur that matches rdp->quiescbatch and allows us to  */
-+      /* stop the hz timer then the cpumasks created for subsequent values */
-+      /* of cur in rcu_start_batch are guaranteed to pick up the updated   */
-+      /* nohz_cpu_mask and so will not depend on this cpu.                 */
-+
-+      smp_mb();
-+
-+      /* Leave ourselves in tick mode if rcu or softirq or timer pending. */
-+      if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
-+          (j = next_timer_interrupt(), time_before_eq(j, jiffies))) {
-+              cpu_clear(cpu, nohz_cpu_mask);
-+              j = jiffies + 1;
-+      }
-+
-+      singleshot.timeout_abs_ns = jiffies_to_st(j) + NS_PER_TICK/2;
-+      singleshot.flags = 0;
-+      rc = HYPERVISOR_vcpu_op(VCPUOP_set_singleshot_timer, cpu, &singleshot);
-+#if CONFIG_XEN_COMPAT <= 0x030004
-+      if (rc) {
-+              BUG_ON(rc != -ENOSYS);
-+              rc = HYPERVISOR_set_timer_op(singleshot.timeout_abs_ns);
-+      }
-+#endif
-+      BUG_ON(rc);
-+}
-+
-+static void start_hz_timer(void)
-+{
-+      cpu_clear(smp_processor_id(), nohz_cpu_mask);
-+}
-+
-+void raw_safe_halt(void)
-+{
-+      stop_hz_timer();
-+      /* Blocking includes an implicit local_irq_enable(). */
-+      HYPERVISOR_block();
-+      start_hz_timer();
-+}
-+EXPORT_SYMBOL(raw_safe_halt);
-+
-+void halt(void)
-+{
-+      if (irqs_disabled())
-+              VOID(HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL));
-+}
-+EXPORT_SYMBOL(halt);
-+
-+/* No locking required. Interrupts are disabled on all CPUs. */
-+void time_resume(void)
-+{
-+      unsigned int cpu;
-+
-+      init_cpu_khz();
-+
-+      for_each_online_cpu(cpu) {
-+              switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-+                                         &xen_set_periodic_tick)) {
-+              case 0:
-+#if CONFIG_XEN_COMPAT <= 0x030004
-+              case -ENOSYS:
-+#endif
-+                      break;
-+              default:
-+                      BUG();
-+              }
-+              get_time_values_from_xen(cpu);
-+              per_cpu(processed_system_time, cpu) =
-+                      per_cpu(shadow_time, 0).system_timestamp;
-+              init_missing_ticks_accounting(cpu);
-+      }
-+
-+      processed_system_time = per_cpu(shadow_time, 0).system_timestamp;
-+
-+      update_wallclock();
-+}
-+
-+#ifdef CONFIG_SMP
-+static char timer_name[NR_CPUS][15];
-+
-+int __cpuinit local_setup_timer(unsigned int cpu)
-+{
-+      int seq, irq;
-+
-+      BUG_ON(cpu == 0);
-+
-+      switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, cpu,
-+                         &xen_set_periodic_tick)) {
-+      case 0:
-+#if CONFIG_XEN_COMPAT <= 0x030004
-+      case -ENOSYS:
-+#endif
-+              break;
-+      default:
-+              BUG();
-+      }
-+
-+      do {
-+              seq = read_seqbegin(&xtime_lock);
-+              /* Use cpu0 timestamp: cpu's shadow is not initialised yet. */
-+              per_cpu(processed_system_time, cpu) =
-+                      per_cpu(shadow_time, 0).system_timestamp;
-+              init_missing_ticks_accounting(cpu);
-+      } while (read_seqretry(&xtime_lock, seq));
-+
-+      sprintf(timer_name[cpu], "timer%u", cpu);
-+      irq = bind_virq_to_irqhandler(VIRQ_TIMER,
-+                                    cpu,
-+                                    timer_interrupt,
-+                                    SA_INTERRUPT,
-+                                    timer_name[cpu],
-+                                    NULL);
-+      if (irq < 0)
-+              return irq;
-+      per_cpu(timer_irq, cpu) = irq;
-+
-+      return 0;
-+}
-+
-+void __cpuexit local_teardown_timer(unsigned int cpu)
-+{
-+      BUG_ON(cpu == 0);
-+      unbind_from_irqhandler(per_cpu(timer_irq, cpu), NULL);
-+}
-+#endif
-+
-+#ifdef CONFIG_CPU_FREQ
-+static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val, 
-+                              void *data)
-+{
-+      struct cpufreq_freqs *freq = data;
-+      struct xen_platform_op op;
-+
-+      if (cpu_has(&cpu_data[freq->cpu], X86_FEATURE_CONSTANT_TSC))
-+              return 0;
-+
-+      if (val == CPUFREQ_PRECHANGE)
-+              return 0;
-+
-+      op.cmd = XENPF_change_freq;
-+      op.u.change_freq.flags = 0;
-+      op.u.change_freq.cpu = freq->cpu;
-+      op.u.change_freq.freq = (u64)freq->new * 1000;
-+      WARN_ON(HYPERVISOR_platform_op(&op));
-+
-+      return 0;
-+}
-+
-+static struct notifier_block time_cpufreq_notifier_block = {
-+      .notifier_call = time_cpufreq_notifier
-+};
-+
-+static int __init cpufreq_time_setup(void)
-+{
-+      if (!cpufreq_register_notifier(&time_cpufreq_notifier_block,
-+                      CPUFREQ_TRANSITION_NOTIFIER)) {
-+              printk(KERN_ERR "failed to set up cpufreq notifier\n");
-+              return -ENODEV;
-+      }
-+      return 0;
-+}
-+
-+core_initcall(cpufreq_time_setup);
-+#endif
-+
-+/*
-+ * /proc/sys/xen: This really belongs in another file. It can stay here for
-+ * now however.
-+ */
-+static ctl_table xen_subtable[] = {
-+      {
-+              .ctl_name       = 1,
-+              .procname       = "independent_wallclock",
-+              .data           = &independent_wallclock,
-+              .maxlen         = sizeof(independent_wallclock),
-+              .mode           = 0644,
-+              .proc_handler   = proc_dointvec
-+      },
-+      {
-+              .ctl_name       = 2,
-+              .procname       = "permitted_clock_jitter",
-+              .data           = &permitted_clock_jitter,
-+              .maxlen         = sizeof(permitted_clock_jitter),
-+              .mode           = 0644,
-+              .proc_handler   = proc_doulongvec_minmax
-+      },
-+      { 0 }
-+};
-+static ctl_table xen_table[] = {
-+      {
-+              .ctl_name       = 123,
-+              .procname       = "xen",
-+              .mode           = 0555,
-+              .child          = xen_subtable},
-+      { 0 }
-+};
-+static int __init xen_sysctl_init(void)
-+{
-+      (void)register_sysctl_table(xen_table, 0);
-+      return 0;
-+}
-+__initcall(xen_sysctl_init);
-Index: head-2008-11-25/arch/x86/kernel/traps_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/traps_32-xen.c     2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,1190 @@
-+/*
-+ *  linux/arch/i386/traps.c
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ *  Pentium III FXSR, SSE support
-+ *    Gareth Hughes <gareth@valinux.com>, May 2000
-+ */
-+
-+/*
-+ * 'Traps.c' handles hardware traps and faults after we have saved some
-+ * state in 'asm.s'.
-+ */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/timer.h>
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/interrupt.h>
-+#include <linux/highmem.h>
-+#include <linux/kallsyms.h>
-+#include <linux/ptrace.h>
-+#include <linux/utsname.h>
-+#include <linux/kprobes.h>
-+#include <linux/kexec.h>
-+#include <linux/unwind.h>
-+
-+#ifdef CONFIG_EISA
-+#include <linux/ioport.h>
-+#include <linux/eisa.h>
-+#endif
-+
-+#ifdef CONFIG_MCA
-+#include <linux/mca.h>
-+#endif
-+
-+#include <asm/processor.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/atomic.h>
-+#include <asm/debugreg.h>
-+#include <asm/desc.h>
-+#include <asm/i387.h>
-+#include <asm/nmi.h>
-+#include <asm/unwind.h>
-+#include <asm/smp.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/kdebug.h>
-+
-+#include <linux/module.h>
-+
-+#include "mach_traps.h"
-+
-+asmlinkage int system_call(void);
-+
-+struct desc_struct default_ldt[] = { { 0, 0 }, { 0, 0 }, { 0, 0 },
-+              { 0, 0 }, { 0, 0 } };
-+
-+/* Do we ignore FPU interrupts ? */
-+char ignore_fpu_irq = 0;
-+
-+#ifndef CONFIG_X86_NO_IDT
-+/*
-+ * The IDT has to be page-aligned to simplify the Pentium
-+ * F0 0F bug workaround.. We have a special link segment
-+ * for this.
-+ */
-+struct desc_struct idt_table[256] __attribute__((__section__(".data.idt"))) = { {0, 0}, };
-+#endif
-+
-+asmlinkage void divide_error(void);
-+asmlinkage void debug(void);
-+asmlinkage void nmi(void);
-+asmlinkage void int3(void);
-+asmlinkage void overflow(void);
-+asmlinkage void bounds(void);
-+asmlinkage void invalid_op(void);
-+asmlinkage void device_not_available(void);
-+asmlinkage void coprocessor_segment_overrun(void);
-+asmlinkage void invalid_TSS(void);
-+asmlinkage void segment_not_present(void);
-+asmlinkage void stack_segment(void);
-+asmlinkage void general_protection(void);
-+asmlinkage void page_fault(void);
-+asmlinkage void coprocessor_error(void);
-+asmlinkage void simd_coprocessor_error(void);
-+asmlinkage void alignment_check(void);
-+#ifndef CONFIG_XEN
-+asmlinkage void spurious_interrupt_bug(void);
-+#else
-+asmlinkage void fixup_4gb_segment(void);
-+#endif
-+asmlinkage void machine_check(void);
-+
-+static int kstack_depth_to_print = 24;
-+#ifdef CONFIG_STACK_UNWIND
-+static int call_trace = 1;
-+#else
-+#define call_trace (-1)
-+#endif
-+ATOMIC_NOTIFIER_HEAD(i386die_chain);
-+
-+int register_die_notifier(struct notifier_block *nb)
-+{
-+      vmalloc_sync_all();
-+      return atomic_notifier_chain_register(&i386die_chain, nb);
-+}
-+EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
-+
-+int unregister_die_notifier(struct notifier_block *nb)
-+{
-+      return atomic_notifier_chain_unregister(&i386die_chain, nb);
-+}
-+EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
-+
-+static inline int valid_stack_ptr(struct thread_info *tinfo, void *p)
-+{
-+      return  p > (void *)tinfo &&
-+              p < (void *)tinfo + THREAD_SIZE - 3;
-+}
-+
-+/*
-+ * Print one address/symbol entries per line.
-+ */
-+static inline void print_addr_and_symbol(unsigned long addr, char *log_lvl)
-+{
-+      printk(" [<%08lx>] ", addr);
-+
-+      print_symbol("%s\n", addr);
-+}
-+
-+static inline unsigned long print_context_stack(struct thread_info *tinfo,
-+                              unsigned long *stack, unsigned long ebp,
-+                              char *log_lvl)
-+{
-+      unsigned long addr;
-+
-+#ifdef        CONFIG_FRAME_POINTER
-+      while (valid_stack_ptr(tinfo, (void *)ebp)) {
-+              addr = *(unsigned long *)(ebp + 4);
-+              print_addr_and_symbol(addr, log_lvl);
-+              /*
-+               * break out of recursive entries (such as
-+               * end_of_stack_stop_unwind_function):
-+               */
-+              if (ebp == *(unsigned long *)ebp)
-+                      break;
-+              ebp = *(unsigned long *)ebp;
-+      }
-+#else
-+      while (valid_stack_ptr(tinfo, stack)) {
-+              addr = *stack++;
-+              if (__kernel_text_address(addr))
-+                      print_addr_and_symbol(addr, log_lvl);
-+      }
-+#endif
-+      return ebp;
-+}
-+
-+static asmlinkage int
-+show_trace_unwind(struct unwind_frame_info *info, void *log_lvl)
-+{
-+      int n = 0;
-+
-+      while (unwind(info) == 0 && UNW_PC(info)) {
-+              n++;
-+              print_addr_and_symbol(UNW_PC(info), log_lvl);
-+              if (arch_unw_user_mode(info))
-+                      break;
-+      }
-+      return n;
-+}
-+
-+static void show_trace_log_lvl(struct task_struct *task, struct pt_regs *regs,
-+                             unsigned long *stack, char *log_lvl)
-+{
-+      unsigned long ebp;
-+
-+      if (!task)
-+              task = current;
-+
-+      if (call_trace >= 0) {
-+              int unw_ret = 0;
-+              struct unwind_frame_info info;
-+
-+              if (regs) {
-+                      if (unwind_init_frame_info(&info, task, regs) == 0)
-+                              unw_ret = show_trace_unwind(&info, log_lvl);
-+              } else if (task == current)
-+                      unw_ret = unwind_init_running(&info, show_trace_unwind, log_lvl);
-+              else {
-+                      if (unwind_init_blocked(&info, task) == 0)
-+                              unw_ret = show_trace_unwind(&info, log_lvl);
-+              }
-+              if (unw_ret > 0) {
-+                      if (call_trace == 1 && !arch_unw_user_mode(&info)) {
-+                              print_symbol("DWARF2 unwinder stuck at %s\n",
-+                                           UNW_PC(&info));
-+                              if (UNW_SP(&info) >= PAGE_OFFSET) {
-+                                      printk("Leftover inexact backtrace:\n");
-+                                      stack = (void *)UNW_SP(&info);
-+                              } else
-+                                      printk("Full inexact backtrace again:\n");
-+                      } else if (call_trace >= 1)
-+                              return;
-+                      else
-+                              printk("Full inexact backtrace again:\n");
-+              } else
-+                      printk("Inexact backtrace:\n");
-+      }
-+
-+      if (task == current) {
-+              /* Grab ebp right from our regs */
-+              asm ("movl %%ebp, %0" : "=r" (ebp) : );
-+      } else {
-+              /* ebp is the last reg pushed by switch_to */
-+              ebp = *(unsigned long *) task->thread.esp;
-+      }
-+
-+      while (1) {
-+              struct thread_info *context;
-+              context = (struct thread_info *)
-+                      ((unsigned long)stack & (~(THREAD_SIZE - 1)));
-+              ebp = print_context_stack(context, stack, ebp, log_lvl);
-+              stack = (unsigned long*)context->previous_esp;
-+              if (!stack)
-+                      break;
-+              printk("%s =======================\n", log_lvl);
-+      }
-+}
-+
-+void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long * stack)
-+{
-+      show_trace_log_lvl(task, regs, stack, "");
-+}
-+
-+static void show_stack_log_lvl(struct task_struct *task, struct pt_regs *regs,
-+                             unsigned long *esp, char *log_lvl)
-+{
-+      unsigned long *stack;
-+      int i;
-+
-+      if (esp == NULL) {
-+              if (task)
-+                      esp = (unsigned long*)task->thread.esp;
-+              else
-+                      esp = (unsigned long *)&esp;
-+      }
-+
-+      stack = esp;
-+      for(i = 0; i < kstack_depth_to_print; i++) {
-+              if (kstack_end(stack))
-+                      break;
-+              if (i && ((i % 8) == 0))
-+                      printk("\n%s       ", log_lvl);
-+              printk("%08lx ", *stack++);
-+      }
-+      printk("\n%sCall Trace:\n", log_lvl);
-+      show_trace_log_lvl(task, regs, esp, log_lvl);
-+}
-+
-+void show_stack(struct task_struct *task, unsigned long *esp)
-+{
-+      printk("       ");
-+      show_stack_log_lvl(task, NULL, esp, "");
-+}
-+
-+/*
-+ * The architecture-independent dump_stack generator
-+ */
-+void dump_stack(void)
-+{
-+      unsigned long stack;
-+
-+      show_trace(current, NULL, &stack);
-+}
-+
-+EXPORT_SYMBOL(dump_stack);
-+
-+void show_registers(struct pt_regs *regs)
-+{
-+      int i;
-+      int in_kernel = 1;
-+      unsigned long esp;
-+      unsigned short ss;
-+
-+      esp = (unsigned long) (&regs->esp);
-+      savesegment(ss, ss);
-+      if (user_mode_vm(regs)) {
-+              in_kernel = 0;
-+              esp = regs->esp;
-+              ss = regs->xss & 0xffff;
-+      }
-+      print_modules();
-+      printk(KERN_EMERG "CPU:    %d\nEIP:    %04x:[<%08lx>]    %s VLI\n"
-+                      "EFLAGS: %08lx   (%s %.*s) \n",
-+              smp_processor_id(), 0xffff & regs->xcs, regs->eip,
-+              print_tainted(), regs->eflags, system_utsname.release,
-+              (int)strcspn(system_utsname.version, " "),
-+              system_utsname.version);
-+      print_symbol(KERN_EMERG "EIP is at %s\n", regs->eip);
-+      printk(KERN_EMERG "eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
-+              regs->eax, regs->ebx, regs->ecx, regs->edx);
-+      printk(KERN_EMERG "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
-+              regs->esi, regs->edi, regs->ebp, esp);
-+      printk(KERN_EMERG "ds: %04x   es: %04x   ss: %04x\n",
-+              regs->xds & 0xffff, regs->xes & 0xffff, ss);
-+      printk(KERN_EMERG "Process %.*s (pid: %d, ti=%p task=%p task.ti=%p)",
-+              TASK_COMM_LEN, current->comm, current->pid,
-+              current_thread_info(), current, current->thread_info);
-+      /*
-+       * When in-kernel, we also print out the stack and code at the
-+       * time of the fault..
-+       */
-+      if (in_kernel) {
-+              u8 __user *eip;
-+
-+              printk("\n" KERN_EMERG "Stack: ");
-+              show_stack_log_lvl(NULL, regs, (unsigned long *)esp, KERN_EMERG);
-+
-+              printk(KERN_EMERG "Code: ");
-+
-+              eip = (u8 __user *)regs->eip - 43;
-+              for (i = 0; i < 64; i++, eip++) {
-+                      unsigned char c;
-+
-+                      if (eip < (u8 __user *)PAGE_OFFSET || __get_user(c, eip)) {
-+                              printk(" Bad EIP value.");
-+                              break;
-+                      }
-+                      if (eip == (u8 __user *)regs->eip)
-+                              printk("<%02x> ", c);
-+                      else
-+                              printk("%02x ", c);
-+              }
-+      }
-+      printk("\n");
-+}     
-+
-+static void handle_BUG(struct pt_regs *regs)
-+{
-+      unsigned long eip = regs->eip;
-+      unsigned short ud2;
-+
-+      if (eip < PAGE_OFFSET)
-+              return;
-+      if (__get_user(ud2, (unsigned short __user *)eip))
-+              return;
-+      if (ud2 != 0x0b0f)
-+              return;
-+
-+      printk(KERN_EMERG "------------[ cut here ]------------\n");
-+
-+#ifdef CONFIG_DEBUG_BUGVERBOSE
-+      do {
-+              unsigned short line;
-+              char *file;
-+              char c;
-+
-+              if (__get_user(line, (unsigned short __user *)(eip + 2)))
-+                      break;
-+              if (__get_user(file, (char * __user *)(eip + 4)) ||
-+                  (unsigned long)file < PAGE_OFFSET || __get_user(c, file))
-+                      file = "<bad filename>";
-+
-+              printk(KERN_EMERG "kernel BUG at %s:%d!\n", file, line);
-+              return;
-+      } while (0);
-+#endif
-+      printk(KERN_EMERG "Kernel BUG at [verbose debug info unavailable]\n");
-+}
-+
-+/* This is gone through when something in the kernel
-+ * has done something bad and is about to be terminated.
-+*/
-+void die(const char * str, struct pt_regs * regs, long err)
-+{
-+      static struct {
-+              spinlock_t lock;
-+              u32 lock_owner;
-+              int lock_owner_depth;
-+      } die = {
-+              .lock =                 SPIN_LOCK_UNLOCKED,
-+              .lock_owner =           -1,
-+              .lock_owner_depth =     0
-+      };
-+      static int die_counter;
-+      unsigned long flags;
-+
-+      oops_enter();
-+
-+      if (die.lock_owner != raw_smp_processor_id()) {
-+              console_verbose();
-+              spin_lock_irqsave(&die.lock, flags);
-+              die.lock_owner = smp_processor_id();
-+              die.lock_owner_depth = 0;
-+              bust_spinlocks(1);
-+      }
-+      else
-+              local_save_flags(flags);
-+
-+      if (++die.lock_owner_depth < 3) {
-+              int nl = 0;
-+              unsigned long esp;
-+              unsigned short ss;
-+
-+              handle_BUG(regs);
-+              printk(KERN_EMERG "%s: %04lx [#%d]\n", str, err & 0xffff, ++die_counter);
-+#ifdef CONFIG_PREEMPT
-+              printk(KERN_EMERG "PREEMPT ");
-+              nl = 1;
-+#endif
-+#ifdef CONFIG_SMP
-+              if (!nl)
-+                      printk(KERN_EMERG);
-+              printk("SMP ");
-+              nl = 1;
-+#endif
-+#ifdef CONFIG_DEBUG_PAGEALLOC
-+              if (!nl)
-+                      printk(KERN_EMERG);
-+              printk("DEBUG_PAGEALLOC");
-+              nl = 1;
-+#endif
-+              if (nl)
-+                      printk("\n");
-+              if (notify_die(DIE_OOPS, str, regs, err,
-+                                      current->thread.trap_no, SIGSEGV) !=
-+                              NOTIFY_STOP) {
-+                      show_registers(regs);
-+                      /* Executive summary in case the oops scrolled away */
-+                      esp = (unsigned long) (&regs->esp);
-+                      savesegment(ss, ss);
-+                      if (user_mode(regs)) {
-+                              esp = regs->esp;
-+                              ss = regs->xss & 0xffff;
-+                      }
-+                      printk(KERN_EMERG "EIP: [<%08lx>] ", regs->eip);
-+                      print_symbol("%s", regs->eip);
-+                      printk(" SS:ESP %04x:%08lx\n", ss, esp);
-+              }
-+              else
-+                      regs = NULL;
-+      } else
-+              printk(KERN_EMERG "Recursive die() failure, output suppressed\n");
-+
-+      bust_spinlocks(0);
-+      die.lock_owner = -1;
-+      spin_unlock_irqrestore(&die.lock, flags);
-+
-+      if (!regs)
-+              return;
-+
-+      if (kexec_should_crash(current))
-+              crash_kexec(regs);
-+
-+      if (in_interrupt())
-+              panic("Fatal exception in interrupt");
-+
-+      if (panic_on_oops)
-+              panic("Fatal exception");
-+
-+      oops_exit();
-+      do_exit(SIGSEGV);
-+}
-+
-+static inline void die_if_kernel(const char * str, struct pt_regs * regs, long err)
-+{
-+      if (!user_mode_vm(regs))
-+              die(str, regs, err);
-+}
-+
-+static void __kprobes do_trap(int trapnr, int signr, char *str, int vm86,
-+                            struct pt_regs * regs, long error_code,
-+                            siginfo_t *info)
-+{
-+      struct task_struct *tsk = current;
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = trapnr;
-+
-+      if (regs->eflags & VM_MASK) {
-+              if (vm86)
-+                      goto vm86_trap;
-+              goto trap_signal;
-+      }
-+
-+      if (!user_mode(regs))
-+              goto kernel_trap;
-+
-+      trap_signal: {
-+              if (info)
-+                      force_sig_info(signr, info, tsk);
-+              else
-+                      force_sig(signr, tsk);
-+              return;
-+      }
-+
-+      kernel_trap: {
-+              if (!fixup_exception(regs))
-+                      die(str, regs, error_code);
-+              return;
-+      }
-+
-+      vm86_trap: {
-+              int ret = handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, trapnr);
-+              if (ret) goto trap_signal;
-+              return;
-+      }
-+}
-+
-+#define DO_ERROR(trapnr, signr, str, name) \
-+fastcall void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                              == NOTIFY_STOP) \
-+              return; \
-+      do_trap(trapnr, signr, str, 0, regs, error_code, NULL); \
-+}
-+
-+#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-+fastcall void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      siginfo_t info; \
-+      info.si_signo = signr; \
-+      info.si_errno = 0; \
-+      info.si_code = sicode; \
-+      info.si_addr = (void __user *)siaddr; \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                              == NOTIFY_STOP) \
-+              return; \
-+      do_trap(trapnr, signr, str, 0, regs, error_code, &info); \
-+}
-+
-+#define DO_VM86_ERROR(trapnr, signr, str, name) \
-+fastcall void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                              == NOTIFY_STOP) \
-+              return; \
-+      do_trap(trapnr, signr, str, 1, regs, error_code, NULL); \
-+}
-+
-+#define DO_VM86_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-+fastcall void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      siginfo_t info; \
-+      info.si_signo = signr; \
-+      info.si_errno = 0; \
-+      info.si_code = sicode; \
-+      info.si_addr = (void __user *)siaddr; \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                              == NOTIFY_STOP) \
-+              return; \
-+      do_trap(trapnr, signr, str, 1, regs, error_code, &info); \
-+}
-+
-+DO_VM86_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->eip)
-+#ifndef CONFIG_KPROBES
-+DO_VM86_ERROR( 3, SIGTRAP, "int3", int3)
-+#endif
-+DO_VM86_ERROR( 4, SIGSEGV, "overflow", overflow)
-+DO_VM86_ERROR( 5, SIGSEGV, "bounds", bounds)
-+DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->eip)
-+DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
-+DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
-+DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
-+DO_ERROR(12, SIGBUS,  "stack segment", stack_segment)
-+DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
-+DO_ERROR_INFO(32, SIGSEGV, "iret exception", iret_error, ILL_BADSTK, 0)
-+
-+fastcall void __kprobes do_general_protection(struct pt_regs * regs,
-+                                            long error_code)
-+{
-+      current->thread.error_code = error_code;
-+      current->thread.trap_no = 13;
-+
-+      if (regs->eflags & VM_MASK)
-+              goto gp_in_vm86;
-+
-+      if (!user_mode(regs))
-+              goto gp_in_kernel;
-+
-+      current->thread.error_code = error_code;
-+      current->thread.trap_no = 13;
-+      force_sig(SIGSEGV, current);
-+      return;
-+
-+gp_in_vm86:
-+      local_irq_enable();
-+      handle_vm86_fault((struct kernel_vm86_regs *) regs, error_code);
-+      return;
-+
-+gp_in_kernel:
-+      if (!fixup_exception(regs)) {
-+              if (notify_die(DIE_GPF, "general protection fault", regs,
-+                              error_code, 13, SIGSEGV) == NOTIFY_STOP)
-+                      return;
-+              die("general protection fault", regs, error_code);
-+      }
-+}
-+
-+static void mem_parity_error(unsigned char reason, struct pt_regs * regs)
-+{
-+      printk(KERN_EMERG "Uhhuh. NMI received. Dazed and confused, but trying "
-+                      "to continue\n");
-+      printk(KERN_EMERG "You probably have a hardware problem with your RAM "
-+                      "chips\n");
-+
-+      /* Clear and disable the memory parity error line. */
-+      clear_mem_error(reason);
-+}
-+
-+static void io_check_error(unsigned char reason, struct pt_regs * regs)
-+{
-+      printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-+      show_registers(regs);
-+
-+      /* Re-enable the IOCK line, wait for a few seconds */
-+      clear_io_check_error(reason);
-+}
-+
-+static void unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-+{
-+#ifdef CONFIG_MCA
-+      /* Might actually be able to figure out what the guilty party
-+      * is. */
-+      if( MCA_bus ) {
-+              mca_handle_nmi();
-+              return;
-+      }
-+#endif
-+      printk("Uhhuh. NMI received for unknown reason %02x on CPU %d.\n",
-+              reason, smp_processor_id());
-+      printk("Dazed and confused, but trying to continue\n");
-+      printk("Do you have a strange power saving mode enabled?\n");
-+}
-+
-+static DEFINE_SPINLOCK(nmi_print_lock);
-+
-+void die_nmi (struct pt_regs *regs, const char *msg)
-+{
-+      if (notify_die(DIE_NMIWATCHDOG, msg, regs, 0, 2, SIGINT) ==
-+          NOTIFY_STOP)
-+              return;
-+
-+      spin_lock(&nmi_print_lock);
-+      /*
-+      * We are in trouble anyway, lets at least try
-+      * to get a message out.
-+      */
-+      bust_spinlocks(1);
-+      printk(KERN_EMERG "%s", msg);
-+      printk(" on CPU%d, eip %08lx, registers:\n",
-+              smp_processor_id(), regs->eip);
-+      show_registers(regs);
-+      printk(KERN_EMERG "console shuts up ...\n");
-+      console_silent();
-+      spin_unlock(&nmi_print_lock);
-+      bust_spinlocks(0);
-+
-+      /* If we are in kernel we are probably nested up pretty bad
-+       * and might aswell get out now while we still can.
-+      */
-+      if (!user_mode_vm(regs)) {
-+              current->thread.trap_no = 2;
-+              crash_kexec(regs);
-+      }
-+
-+      do_exit(SIGSEGV);
-+}
-+
-+static void default_do_nmi(struct pt_regs * regs)
-+{
-+      unsigned char reason = 0;
-+
-+      /* Only the BSP gets external NMIs from the system.  */
-+      if (!smp_processor_id())
-+              reason = get_nmi_reason();
-+ 
-+      if (!(reason & 0xc0)) {
-+              if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
-+                                                      == NOTIFY_STOP)
-+                      return;
-+#ifdef CONFIG_X86_LOCAL_APIC
-+              /*
-+               * Ok, so this is none of the documented NMI sources,
-+               * so it must be the NMI watchdog.
-+               */
-+              if (nmi_watchdog) {
-+                      nmi_watchdog_tick(regs);
-+                      return;
-+              }
-+#endif
-+              unknown_nmi_error(reason, regs);
-+              return;
-+      }
-+      if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
-+              return;
-+      if (reason & 0x80)
-+              mem_parity_error(reason, regs);
-+      if (reason & 0x40)
-+              io_check_error(reason, regs);
-+      /*
-+       * Reassert NMI in case it became active meanwhile
-+       * as it's edge-triggered.
-+       */
-+      reassert_nmi();
-+}
-+
-+static int dummy_nmi_callback(struct pt_regs * regs, int cpu)
-+{
-+      return 0;
-+}
-+ 
-+static nmi_callback_t nmi_callback = dummy_nmi_callback;
-+ 
-+fastcall void do_nmi(struct pt_regs * regs, long error_code)
-+{
-+      int cpu;
-+
-+      nmi_enter();
-+
-+      cpu = smp_processor_id();
-+
-+      ++nmi_count(cpu);
-+
-+      if (!rcu_dereference(nmi_callback)(regs, cpu))
-+              default_do_nmi(regs);
-+
-+      nmi_exit();
-+}
-+
-+void set_nmi_callback(nmi_callback_t callback)
-+{
-+      vmalloc_sync_all();
-+      rcu_assign_pointer(nmi_callback, callback);
-+}
-+EXPORT_SYMBOL_GPL(set_nmi_callback);
-+
-+void unset_nmi_callback(void)
-+{
-+      nmi_callback = dummy_nmi_callback;
-+}
-+EXPORT_SYMBOL_GPL(unset_nmi_callback);
-+
-+#ifdef CONFIG_KPROBES
-+fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
-+{
-+      if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP)
-+                      == NOTIFY_STOP)
-+              return;
-+      /* This is an interrupt gate, because kprobes wants interrupts
-+      disabled.  Normal trap handlers don't. */
-+      restore_interrupts(regs);
-+      do_trap(3, SIGTRAP, "int3", 1, regs, error_code, NULL);
-+}
-+#endif
-+
-+/*
-+ * Our handling of the processor debug registers is non-trivial.
-+ * We do not clear them on entry and exit from the kernel. Therefore
-+ * it is possible to get a watchpoint trap here from inside the kernel.
-+ * However, the code in ./ptrace.c has ensured that the user can
-+ * only set watchpoints on userspace addresses. Therefore the in-kernel
-+ * watchpoint trap can only occur in code which is reading/writing
-+ * from user space. Such code must not hold kernel locks (since it
-+ * can equally take a page fault), therefore it is safe to call
-+ * force_sig_info even though that claims and releases locks.
-+ * 
-+ * Code in ./signal.c ensures that the debug control register
-+ * is restored before we deliver any signal, and therefore that
-+ * user code runs with the correct debug control register even though
-+ * we clear it here.
-+ *
-+ * Being careful here means that we don't have to be as careful in a
-+ * lot of more complicated places (task switching can be a bit lazy
-+ * about restoring all the debug state, and ptrace doesn't have to
-+ * find every occurrence of the TF bit that could be saved away even
-+ * by user code)
-+ */
-+fastcall void __kprobes do_debug(struct pt_regs * regs, long error_code)
-+{
-+      unsigned int condition;
-+      struct task_struct *tsk = current;
-+
-+      get_debugreg(condition, 6);
-+
-+      if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
-+                                      SIGTRAP) == NOTIFY_STOP)
-+              return;
-+      /* It's safe to allow irq's after DR6 has been saved */
-+      if (regs->eflags & X86_EFLAGS_IF)
-+              local_irq_enable();
-+
-+      /* Mask out spurious debug traps due to lazy DR7 setting */
-+      if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
-+              if (!tsk->thread.debugreg[7])
-+                      goto clear_dr7;
-+      }
-+
-+      if (regs->eflags & VM_MASK)
-+              goto debug_vm86;
-+
-+      /* Save debug status register where ptrace can see it */
-+      tsk->thread.debugreg[6] = condition;
-+
-+      /*
-+       * Single-stepping through TF: make sure we ignore any events in
-+       * kernel space (but re-enable TF when returning to user mode).
-+       */
-+      if (condition & DR_STEP) {
-+              /*
-+               * We already checked v86 mode above, so we can
-+               * check for kernel mode by just checking the CPL
-+               * of CS.
-+               */
-+              if (!user_mode(regs))
-+                      goto clear_TF_reenable;
-+      }
-+
-+      /* Ok, finally something we can handle */
-+      send_sigtrap(tsk, regs, error_code);
-+
-+      /* Disable additional traps. They'll be re-enabled when
-+       * the signal is delivered.
-+       */
-+clear_dr7:
-+      set_debugreg(0, 7);
-+      return;
-+
-+debug_vm86:
-+      handle_vm86_trap((struct kernel_vm86_regs *) regs, error_code, 1);
-+      return;
-+
-+clear_TF_reenable:
-+      set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
-+      regs->eflags &= ~TF_MASK;
-+      return;
-+}
-+
-+/*
-+ * Note that we play around with the 'TS' bit in an attempt to get
-+ * the correct behaviour even in the presence of the asynchronous
-+ * IRQ13 behaviour
-+ */
-+void math_error(void __user *eip)
-+{
-+      struct task_struct * task;
-+      siginfo_t info;
-+      unsigned short cwd, swd;
-+
-+      /*
-+       * Save the info for the exception handler and clear the error.
-+       */
-+      task = current;
-+      save_init_fpu(task);
-+      task->thread.trap_no = 16;
-+      task->thread.error_code = 0;
-+      info.si_signo = SIGFPE;
-+      info.si_errno = 0;
-+      info.si_code = __SI_FAULT;
-+      info.si_addr = eip;
-+      /*
-+       * (~cwd & swd) will mask out exceptions that are not set to unmasked
-+       * status.  0x3f is the exception bits in these regs, 0x200 is the
-+       * C1 reg you need in case of a stack fault, 0x040 is the stack
-+       * fault bit.  We should only be taking one exception at a time,
-+       * so if this combination doesn't produce any single exception,
-+       * then we have a bad program that isn't syncronizing its FPU usage
-+       * and it will suffer the consequences since we won't be able to
-+       * fully reproduce the context of the exception
-+       */
-+      cwd = get_fpu_cwd(task);
-+      swd = get_fpu_swd(task);
-+      switch (swd & ~cwd & 0x3f) {
-+              case 0x000: /* No unmasked exception */
-+                      return;
-+              default:    /* Multiple exceptions */
-+                      break;
-+              case 0x001: /* Invalid Op */
-+                      /*
-+                       * swd & 0x240 == 0x040: Stack Underflow
-+                       * swd & 0x240 == 0x240: Stack Overflow
-+                       * User must clear the SF bit (0x40) if set
-+                       */
-+                      info.si_code = FPE_FLTINV;
-+                      break;
-+              case 0x002: /* Denormalize */
-+              case 0x010: /* Underflow */
-+                      info.si_code = FPE_FLTUND;
-+                      break;
-+              case 0x004: /* Zero Divide */
-+                      info.si_code = FPE_FLTDIV;
-+                      break;
-+              case 0x008: /* Overflow */
-+                      info.si_code = FPE_FLTOVF;
-+                      break;
-+              case 0x020: /* Precision */
-+                      info.si_code = FPE_FLTRES;
-+                      break;
-+      }
-+      force_sig_info(SIGFPE, &info, task);
-+}
-+
-+fastcall void do_coprocessor_error(struct pt_regs * regs, long error_code)
-+{
-+      ignore_fpu_irq = 1;
-+      math_error((void __user *)regs->eip);
-+}
-+
-+static void simd_math_error(void __user *eip)
-+{
-+      struct task_struct * task;
-+      siginfo_t info;
-+      unsigned short mxcsr;
-+
-+      /*
-+       * Save the info for the exception handler and clear the error.
-+       */
-+      task = current;
-+      save_init_fpu(task);
-+      task->thread.trap_no = 19;
-+      task->thread.error_code = 0;
-+      info.si_signo = SIGFPE;
-+      info.si_errno = 0;
-+      info.si_code = __SI_FAULT;
-+      info.si_addr = eip;
-+      /*
-+       * The SIMD FPU exceptions are handled a little differently, as there
-+       * is only a single status/control register.  Thus, to determine which
-+       * unmasked exception was caught we must mask the exception mask bits
-+       * at 0x1f80, and then use these to mask the exception bits at 0x3f.
-+       */
-+      mxcsr = get_fpu_mxcsr(task);
-+      switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
-+              case 0x000:
-+              default:
-+                      break;
-+              case 0x001: /* Invalid Op */
-+                      info.si_code = FPE_FLTINV;
-+                      break;
-+              case 0x002: /* Denormalize */
-+              case 0x010: /* Underflow */
-+                      info.si_code = FPE_FLTUND;
-+                      break;
-+              case 0x004: /* Zero Divide */
-+                      info.si_code = FPE_FLTDIV;
-+                      break;
-+              case 0x008: /* Overflow */
-+                      info.si_code = FPE_FLTOVF;
-+                      break;
-+              case 0x020: /* Precision */
-+                      info.si_code = FPE_FLTRES;
-+                      break;
-+      }
-+      force_sig_info(SIGFPE, &info, task);
-+}
-+
-+fastcall void do_simd_coprocessor_error(struct pt_regs * regs,
-+                                        long error_code)
-+{
-+      if (cpu_has_xmm) {
-+              /* Handle SIMD FPU exceptions on PIII+ processors. */
-+              ignore_fpu_irq = 1;
-+              simd_math_error((void __user *)regs->eip);
-+      } else {
-+              /*
-+               * Handle strange cache flush from user space exception
-+               * in all other cases.  This is undocumented behaviour.
-+               */
-+              if (regs->eflags & VM_MASK) {
-+                      handle_vm86_fault((struct kernel_vm86_regs *)regs,
-+                                        error_code);
-+                      return;
-+              }
-+              current->thread.trap_no = 19;
-+              current->thread.error_code = error_code;
-+              die_if_kernel("cache flush denied", regs, error_code);
-+              force_sig(SIGSEGV, current);
-+      }
-+}
-+
-+#ifndef CONFIG_XEN
-+fastcall void do_spurious_interrupt_bug(struct pt_regs * regs,
-+                                        long error_code)
-+{
-+#if 0
-+      /* No need to warn about this any longer. */
-+      printk("Ignoring P6 Local APIC Spurious Interrupt Bug...\n");
-+#endif
-+}
-+
-+fastcall void setup_x86_bogus_stack(unsigned char * stk)
-+{
-+      unsigned long *switch16_ptr, *switch32_ptr;
-+      struct pt_regs *regs;
-+      unsigned long stack_top, stack_bot;
-+      unsigned short iret_frame16_off;
-+      int cpu = smp_processor_id();
-+      /* reserve the space on 32bit stack for the magic switch16 pointer */
-+      memmove(stk, stk + 8, sizeof(struct pt_regs));
-+      switch16_ptr = (unsigned long *)(stk + sizeof(struct pt_regs));
-+      regs = (struct pt_regs *)stk;
-+      /* now the switch32 on 16bit stack */
-+      stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
-+      stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
-+      switch32_ptr = (unsigned long *)(stack_top - 8);
-+      iret_frame16_off = CPU_16BIT_STACK_SIZE - 8 - 20;
-+      /* copy iret frame on 16bit stack */
-+      memcpy((void *)(stack_bot + iret_frame16_off), &regs->eip, 20);
-+      /* fill in the switch pointers */
-+      switch16_ptr[0] = (regs->esp & 0xffff0000) | iret_frame16_off;
-+      switch16_ptr[1] = __ESPFIX_SS;
-+      switch32_ptr[0] = (unsigned long)stk + sizeof(struct pt_regs) +
-+              8 - CPU_16BIT_STACK_SIZE;
-+      switch32_ptr[1] = __KERNEL_DS;
-+}
-+
-+fastcall unsigned char * fixup_x86_bogus_stack(unsigned short sp)
-+{
-+      unsigned long *switch32_ptr;
-+      unsigned char *stack16, *stack32;
-+      unsigned long stack_top, stack_bot;
-+      int len;
-+      int cpu = smp_processor_id();
-+      stack_bot = (unsigned long)&per_cpu(cpu_16bit_stack, cpu);
-+      stack_top = stack_bot + CPU_16BIT_STACK_SIZE;
-+      switch32_ptr = (unsigned long *)(stack_top - 8);
-+      /* copy the data from 16bit stack to 32bit stack */
-+      len = CPU_16BIT_STACK_SIZE - 8 - sp;
-+      stack16 = (unsigned char *)(stack_bot + sp);
-+      stack32 = (unsigned char *)
-+              (switch32_ptr[0] + CPU_16BIT_STACK_SIZE - 8 - len);
-+      memcpy(stack32, stack16, len);
-+      return stack32;
-+}
-+#endif
-+
-+/*
-+ *  'math_state_restore()' saves the current math information in the
-+ * old math state array, and gets the new ones from the current task
-+ *
-+ * Careful.. There are problems with IBM-designed IRQ13 behaviour.
-+ * Don't touch unless you *really* know how it works.
-+ *
-+ * Must be called with kernel preemption disabled (in this case,
-+ * local interrupts are disabled at the call-site in entry.S).
-+ */
-+asmlinkage void math_state_restore(struct pt_regs regs)
-+{
-+      struct thread_info *thread = current_thread_info();
-+      struct task_struct *tsk = thread->task;
-+
-+      /* NB. 'clts' is done for us by Xen during virtual trap. */
-+      if (!tsk_used_math(tsk))
-+              init_fpu(tsk);
-+      restore_fpu(tsk);
-+      thread->status |= TS_USEDFPU;   /* So we fnsave on switch_to() */
-+}
-+
-+#ifndef CONFIG_MATH_EMULATION
-+
-+asmlinkage void math_emulate(long arg)
-+{
-+      printk(KERN_EMERG "math-emulation not enabled and no coprocessor found.\n");
-+      printk(KERN_EMERG "killing %s.\n",current->comm);
-+      force_sig(SIGFPE,current);
-+      schedule();
-+}
-+
-+#endif /* CONFIG_MATH_EMULATION */
-+
-+#ifdef CONFIG_X86_F00F_BUG
-+void __init trap_init_f00f_bug(void)
-+{
-+      __set_fixmap(FIX_F00F_IDT, __pa(&idt_table), PAGE_KERNEL_RO);
-+
-+      /*
-+       * Update the IDT descriptor and reload the IDT so that
-+       * it uses the read-only mapped virtual address.
-+       */
-+      idt_descr.address = fix_to_virt(FIX_F00F_IDT);
-+      load_idt(&idt_descr);
-+}
-+#endif
-+
-+
-+/*
-+ * NB. All these are "trap gates" (i.e. events_mask isn't set) except
-+ * for those that specify <dpl>|4 in the second field.
-+ */
-+static trap_info_t __cpuinitdata trap_table[] = {
-+      {  0, 0, __KERNEL_CS, (unsigned long)divide_error               },
-+      {  1, 0|4, __KERNEL_CS, (unsigned long)debug                    },
-+      {  3, 3|4, __KERNEL_CS, (unsigned long)int3                     },
-+      {  4, 3, __KERNEL_CS, (unsigned long)overflow                   },
-+      {  5, 0, __KERNEL_CS, (unsigned long)bounds                     },
-+      {  6, 0, __KERNEL_CS, (unsigned long)invalid_op                 },
-+      {  7, 0|4, __KERNEL_CS, (unsigned long)device_not_available     },
-+      {  9, 0, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun },
-+      { 10, 0, __KERNEL_CS, (unsigned long)invalid_TSS                },
-+      { 11, 0, __KERNEL_CS, (unsigned long)segment_not_present        },
-+      { 12, 0, __KERNEL_CS, (unsigned long)stack_segment              },
-+      { 13, 0, __KERNEL_CS, (unsigned long)general_protection         },
-+      { 14, 0|4, __KERNEL_CS, (unsigned long)page_fault               },
-+      { 15, 0, __KERNEL_CS, (unsigned long)fixup_4gb_segment          },
-+      { 16, 0, __KERNEL_CS, (unsigned long)coprocessor_error          },
-+      { 17, 0, __KERNEL_CS, (unsigned long)alignment_check            },
-+#ifdef CONFIG_X86_MCE
-+      { 18, 0, __KERNEL_CS, (unsigned long)machine_check              },
-+#endif
-+      { 19, 0, __KERNEL_CS, (unsigned long)simd_coprocessor_error     },
-+      { SYSCALL_VECTOR,  3, __KERNEL_CS, (unsigned long)system_call   },
-+      {  0, 0,           0, 0                                         }
-+};
-+
-+void __init trap_init(void)
-+{
-+      int ret;
-+
-+      ret = HYPERVISOR_set_trap_table(trap_table);
-+      if (ret)
-+              printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
-+
-+      if (cpu_has_fxsr) {
-+              /*
-+               * Verify that the FXSAVE/FXRSTOR data will be 16-byte aligned.
-+               * Generates a compile-time "error: zero width for bit-field" if
-+               * the alignment is wrong.
-+               */
-+              struct fxsrAlignAssert {
-+                      int _:!(offsetof(struct task_struct,
-+                                      thread.i387.fxsave) & 15);
-+              };
-+
-+              printk(KERN_INFO "Enabling fast FPU save and restore... ");
-+              set_in_cr4(X86_CR4_OSFXSR);
-+              printk("done.\n");
-+      }
-+      if (cpu_has_xmm) {
-+              printk(KERN_INFO "Enabling unmasked SIMD FPU exception "
-+                              "support... ");
-+              set_in_cr4(X86_CR4_OSXMMEXCPT);
-+              printk("done.\n");
-+      }
-+
-+      /*
-+       * Should be a barrier for any external CPU state.
-+       */
-+      cpu_init();
-+}
-+
-+void __cpuinit smp_trap_init(trap_info_t *trap_ctxt)
-+{
-+      const trap_info_t *t = trap_table;
-+
-+      for (t = trap_table; t->address; t++) {
-+              trap_ctxt[t->vector].flags = t->flags;
-+              trap_ctxt[t->vector].cs = t->cs;
-+              trap_ctxt[t->vector].address = t->address;
-+      }
-+}
-+
-+static int __init kstack_setup(char *s)
-+{
-+      kstack_depth_to_print = simple_strtoul(s, NULL, 0);
-+      return 1;
-+}
-+__setup("kstack=", kstack_setup);
-+
-+#ifdef CONFIG_STACK_UNWIND
-+static int __init call_trace_setup(char *s)
-+{
-+      if (strcmp(s, "old") == 0)
-+              call_trace = -1;
-+      else if (strcmp(s, "both") == 0)
-+              call_trace = 0;
-+      else if (strcmp(s, "newfallback") == 0)
-+              call_trace = 1;
-+      else if (strcmp(s, "new") == 2)
-+              call_trace = 2;
-+      return 1;
-+}
-+__setup("call_trace=", call_trace_setup);
-+#endif
-Index: head-2008-11-25/arch/x86/mach-xen/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mach-xen/Makefile 2007-06-12 13:12:48.000000000 +0200
-@@ -0,0 +1,5 @@
-+#
-+# Makefile for the linux kernel.
-+#
-+
-+obj-y                         := setup.o
-Index: head-2008-11-25/arch/x86/mach-xen/setup.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mach-xen/setup.c  2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,158 @@
-+/*
-+ *    Machine specific setup for generic
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/init.h>
-+#include <linux/interrupt.h>
-+#include <linux/module.h>
-+#include <asm/acpi.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/e820.h>
-+#include <asm/setup.h>
-+#include <asm/fixmap.h>
-+
-+#include <xen/interface/callback.h>
-+#include <xen/interface/memory.h>
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+#define DEFAULT_SEND_IPI      (1)
-+#else
-+#define DEFAULT_SEND_IPI      (0)
-+#endif
-+
-+int no_broadcast=DEFAULT_SEND_IPI;
-+
-+static __init int no_ipi_broadcast(char *str)
-+{
-+      get_option(&str, &no_broadcast);
-+      printk ("Using %s mode\n", no_broadcast ? "No IPI Broadcast" :
-+                                                                                      "IPI Broadcast");
-+      return 1;
-+}
-+
-+__setup("no_ipi_broadcast", no_ipi_broadcast);
-+
-+static int __init print_ipi_mode(void)
-+{
-+      printk ("Using IPI %s mode\n", no_broadcast ? "No-Shortcut" :
-+                                                                                      "Shortcut");
-+      return 0;
-+}
-+
-+late_initcall(print_ipi_mode);
-+
-+/**
-+ * machine_specific_memory_setup - Hook for machine specific memory setup.
-+ *
-+ * Description:
-+ *    This is included late in kernel/setup.c so that it can make
-+ *    use of all of the static functions.
-+ **/
-+
-+char * __init machine_specific_memory_setup(void)
-+{
-+      int rc;
-+      struct xen_memory_map memmap;
-+      /*
-+       * This is rather large for a stack variable but this early in
-+       * the boot process we know we have plenty slack space.
-+       */
-+      struct e820entry map[E820MAX];
-+
-+      memmap.nr_entries = E820MAX;
-+      set_xen_guest_handle(memmap.buffer, map);
-+
-+      rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
-+      if ( rc == -ENOSYS ) {
-+              memmap.nr_entries = 1;
-+              map[0].addr = 0ULL;
-+              map[0].size = PFN_PHYS((unsigned long long)xen_start_info->nr_pages);
-+              /* 8MB slack (to balance backend allocations). */
-+              map[0].size += 8ULL << 20;
-+              map[0].type = E820_RAM;
-+              rc = 0;
-+      }
-+      BUG_ON(rc);
-+
-+      sanitize_e820_map(map, (char *)&memmap.nr_entries);
-+
-+      BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
-+
-+      return "Xen";
-+}
-+
-+
-+extern void hypervisor_callback(void);
-+extern void failsafe_callback(void);
-+extern void nmi(void);
-+
-+unsigned long *machine_to_phys_mapping = (void *)MACH2PHYS_VIRT_START;
-+EXPORT_SYMBOL(machine_to_phys_mapping);
-+unsigned int machine_to_phys_order;
-+EXPORT_SYMBOL(machine_to_phys_order);
-+
-+void __init pre_setup_arch_hook(void)
-+{
-+      struct xen_machphys_mapping mapping;
-+      unsigned long machine_to_phys_nr_ents;
-+      struct xen_platform_parameters pp;
-+
-+      init_mm.pgd = swapper_pg_dir = (pgd_t *)xen_start_info->pt_base;
-+
-+      setup_xen_features();
-+
-+      if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0)
-+              set_fixaddr_top(pp.virt_start);
-+
-+      if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
-+              machine_to_phys_mapping = (unsigned long *)mapping.v_start;
-+              machine_to_phys_nr_ents = mapping.max_mfn + 1;
-+      } else
-+              machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES;
-+      machine_to_phys_order = fls(machine_to_phys_nr_ents - 1);
-+
-+      if (!xen_feature(XENFEAT_auto_translated_physmap))
-+              phys_to_machine_mapping =
-+                      (unsigned long *)xen_start_info->mfn_list;
-+}
-+
-+void __init machine_specific_arch_setup(void)
-+{
-+      int ret;
-+      static struct callback_register __initdata event = {
-+              .type = CALLBACKTYPE_event,
-+              .address = { __KERNEL_CS, (unsigned long)hypervisor_callback },
-+      };
-+      static struct callback_register __initdata failsafe = {
-+              .type = CALLBACKTYPE_failsafe,
-+              .address = { __KERNEL_CS, (unsigned long)failsafe_callback },
-+      };
-+      static struct callback_register __initdata nmi_cb = {
-+              .type = CALLBACKTYPE_nmi,
-+              .address = { __KERNEL_CS, (unsigned long)nmi },
-+      };
-+
-+      ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-+      if (ret == 0)
-+              ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (ret == -ENOSYS)
-+              ret = HYPERVISOR_set_callbacks(
-+                      event.address.cs, event.address.eip,
-+                      failsafe.address.cs, failsafe.address.eip);
-+#endif
-+      BUG_ON(ret);
-+
-+      ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (ret == -ENOSYS) {
-+              static struct xennmi_callback __initdata cb = {
-+                      .handler_address = (unsigned long)nmi
-+              };
-+
-+              HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
-+      }
-+#endif
-+}
-Index: head-2008-11-25/arch/x86/lib/scrub.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/lib/scrub.c       2008-02-08 12:30:51.000000000 +0100
-@@ -0,0 +1,21 @@
-+#include <asm/cpufeature.h>
-+#include <asm/page.h>
-+#include <asm/processor.h>
-+
-+void scrub_pages(void *v, unsigned int count)
-+{
-+      if (likely(cpu_has_xmm2)) {
-+              unsigned long n = count * (PAGE_SIZE / sizeof(long) / 4);
-+
-+              for (; n--; v += sizeof(long) * 4)
-+                      asm("movnti %1,(%0)\n\t"
-+                          "movnti %1,%c2(%0)\n\t"
-+                          "movnti %1,2*%c2(%0)\n\t"
-+                          "movnti %1,3*%c2(%0)\n\t"
-+                          : : "r" (v), "r" (0L), "i" (sizeof(long))
-+                          : "memory");
-+              asm volatile("sfence" : : : "memory");
-+      } else
-+              for (; count--; v += PAGE_SIZE)
-+                      clear_page(v);
-+}
-Index: head-2008-11-25/arch/x86/mm/fault_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/fault_32-xen.c 2007-12-10 08:47:31.000000000 +0100
-@@ -0,0 +1,779 @@
-+/*
-+ *  linux/arch/i386/mm/fault.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ptrace.h>
-+#include <linux/mman.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/tty.h>
-+#include <linux/vt_kern.h>            /* For unblank_screen() */
-+#include <linux/highmem.h>
-+#include <linux/module.h>
-+#include <linux/kprobes.h>
-+
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/desc.h>
-+#include <asm/kdebug.h>
-+
-+extern void die(const char *,struct pt_regs *,long);
-+
-+#ifdef CONFIG_KPROBES
-+ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
-+int register_page_fault_notifier(struct notifier_block *nb)
-+{
-+      vmalloc_sync_all();
-+      return atomic_notifier_chain_register(&notify_page_fault_chain, nb);
-+}
-+
-+int unregister_page_fault_notifier(struct notifier_block *nb)
-+{
-+      return atomic_notifier_chain_unregister(&notify_page_fault_chain, nb);
-+}
-+
-+static inline int notify_page_fault(enum die_val val, const char *str,
-+                      struct pt_regs *regs, long err, int trap, int sig)
-+{
-+      struct die_args args = {
-+              .regs = regs,
-+              .str = str,
-+              .err = err,
-+              .trapnr = trap,
-+              .signr = sig
-+      };
-+      return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-+}
-+#else
-+static inline int notify_page_fault(enum die_val val, const char *str,
-+                      struct pt_regs *regs, long err, int trap, int sig)
-+{
-+      return NOTIFY_DONE;
-+}
-+#endif
-+
-+
-+/*
-+ * Unlock any spinlocks which will prevent us from getting the
-+ * message out 
-+ */
-+void bust_spinlocks(int yes)
-+{
-+      int loglevel_save = console_loglevel;
-+
-+      if (yes) {
-+              oops_in_progress = 1;
-+              return;
-+      }
-+#ifdef CONFIG_VT
-+      unblank_screen();
-+#endif
-+      oops_in_progress = 0;
-+      /*
-+       * OK, the message is on the console.  Now we call printk()
-+       * without oops_in_progress set so that printk will give klogd
-+       * a poke.  Hold onto your hats...
-+       */
-+      console_loglevel = 15;          /* NMI oopser may have shut the console up */
-+      printk(" ");
-+      console_loglevel = loglevel_save;
-+}
-+
-+/*
-+ * Return EIP plus the CS segment base.  The segment limit is also
-+ * adjusted, clamped to the kernel/user address space (whichever is
-+ * appropriate), and returned in *eip_limit.
-+ *
-+ * The segment is checked, because it might have been changed by another
-+ * task between the original faulting instruction and here.
-+ *
-+ * If CS is no longer a valid code segment, or if EIP is beyond the
-+ * limit, or if it is a kernel address when CS is not a kernel segment,
-+ * then the returned value will be greater than *eip_limit.
-+ * 
-+ * This is slow, but is very rarely executed.
-+ */
-+static inline unsigned long get_segment_eip(struct pt_regs *regs,
-+                                          unsigned long *eip_limit)
-+{
-+      unsigned long eip = regs->eip;
-+      unsigned seg = regs->xcs & 0xffff;
-+      u32 seg_ar, seg_limit, base, *desc;
-+
-+      /* Unlikely, but must come before segment checks. */
-+      if (unlikely(regs->eflags & VM_MASK)) {
-+              base = seg << 4;
-+              *eip_limit = base + 0xffff;
-+              return base + (eip & 0xffff);
-+      }
-+
-+      /* The standard kernel/user address space limit. */
-+      *eip_limit = (seg & 2) ? USER_DS.seg : KERNEL_DS.seg;
-+      
-+      /* By far the most common cases. */
-+      if (likely(seg == __USER_CS || seg == GET_KERNEL_CS()))
-+              return eip;
-+
-+      /* Check the segment exists, is within the current LDT/GDT size,
-+         that kernel/user (ring 0..3) has the appropriate privilege,
-+         that it's a code segment, and get the limit. */
-+      __asm__ ("larl %3,%0; lsll %3,%1"
-+               : "=&r" (seg_ar), "=r" (seg_limit) : "0" (0), "rm" (seg));
-+      if ((~seg_ar & 0x9800) || eip > seg_limit) {
-+              *eip_limit = 0;
-+              return 1;        /* So that returned eip > *eip_limit. */
-+      }
-+
-+      /* Get the GDT/LDT descriptor base. 
-+         When you look for races in this code remember that
-+         LDT and other horrors are only used in user space. */
-+      if (seg & (1<<2)) {
-+              /* Must lock the LDT while reading it. */
-+              down(&current->mm->context.sem);
-+              desc = current->mm->context.ldt;
-+              desc = (void *)desc + (seg & ~7);
-+      } else {
-+              /* Must disable preemption while reading the GDT. */
-+              desc = (u32 *)get_cpu_gdt_table(get_cpu());
-+              desc = (void *)desc + (seg & ~7);
-+      }
-+
-+      /* Decode the code segment base from the descriptor */
-+      base = get_desc_base((unsigned long *)desc);
-+
-+      if (seg & (1<<2)) { 
-+              up(&current->mm->context.sem);
-+      } else
-+              put_cpu();
-+
-+      /* Adjust EIP and segment limit, and clamp at the kernel limit.
-+         It's legitimate for segments to wrap at 0xffffffff. */
-+      seg_limit += base;
-+      if (seg_limit < *eip_limit && seg_limit >= base)
-+              *eip_limit = seg_limit;
-+      return eip + base;
-+}
-+
-+/* 
-+ * Sometimes AMD Athlon/Opteron CPUs report invalid exceptions on prefetch.
-+ * Check that here and ignore it.
-+ */
-+static int __is_prefetch(struct pt_regs *regs, unsigned long addr)
-+{ 
-+      unsigned long limit;
-+      unsigned long instr = get_segment_eip (regs, &limit);
-+      int scan_more = 1;
-+      int prefetch = 0; 
-+      int i;
-+
-+      for (i = 0; scan_more && i < 15; i++) { 
-+              unsigned char opcode;
-+              unsigned char instr_hi;
-+              unsigned char instr_lo;
-+
-+              if (instr > limit)
-+                      break;
-+              if (__get_user(opcode, (unsigned char __user *) instr))
-+                      break; 
-+
-+              instr_hi = opcode & 0xf0; 
-+              instr_lo = opcode & 0x0f; 
-+              instr++;
-+
-+              switch (instr_hi) { 
-+              case 0x20:
-+              case 0x30:
-+                      /* Values 0x26,0x2E,0x36,0x3E are valid x86 prefixes. */
-+                      scan_more = ((instr_lo & 7) == 0x6);
-+                      break;
-+                      
-+              case 0x60:
-+                      /* 0x64 thru 0x67 are valid prefixes in all modes. */
-+                      scan_more = (instr_lo & 0xC) == 0x4;
-+                      break;          
-+              case 0xF0:
-+                      /* 0xF0, 0xF2, and 0xF3 are valid prefixes */
-+                      scan_more = !instr_lo || (instr_lo>>1) == 1;
-+                      break;                  
-+              case 0x00:
-+                      /* Prefetch instruction is 0x0F0D or 0x0F18 */
-+                      scan_more = 0;
-+                      if (instr > limit)
-+                              break;
-+                      if (__get_user(opcode, (unsigned char __user *) instr))
-+                              break;
-+                      prefetch = (instr_lo == 0xF) &&
-+                              (opcode == 0x0D || opcode == 0x18);
-+                      break;                  
-+              default:
-+                      scan_more = 0;
-+                      break;
-+              } 
-+      }
-+      return prefetch;
-+}
-+
-+static inline int is_prefetch(struct pt_regs *regs, unsigned long addr,
-+                            unsigned long error_code)
-+{
-+      if (unlikely(boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
-+                   boot_cpu_data.x86 >= 6)) {
-+              /* Catch an obscure case of prefetch inside an NX page. */
-+              if (nx_enabled && (error_code & 16))
-+                      return 0;
-+              return __is_prefetch(regs, addr);
-+      }
-+      return 0;
-+} 
-+
-+static noinline void force_sig_info_fault(int si_signo, int si_code,
-+      unsigned long address, struct task_struct *tsk)
-+{
-+      siginfo_t info;
-+
-+      info.si_signo = si_signo;
-+      info.si_errno = 0;
-+      info.si_code = si_code;
-+      info.si_addr = (void __user *)address;
-+      force_sig_info(si_signo, &info, tsk);
-+}
-+
-+fastcall void do_invalid_op(struct pt_regs *, unsigned long);
-+
-+#ifdef CONFIG_X86_PAE
-+static void dump_fault_path(unsigned long address)
-+{
-+      unsigned long *p, page;
-+      unsigned long mfn; 
-+
-+      page = read_cr3();
-+      p  = (unsigned long *)__va(page);
-+      p += (address >> 30) * 2;
-+      printk(KERN_ALERT "%08lx -> *pde = %08lx:%08lx\n", page, p[1], p[0]);
-+      if (p[0] & _PAGE_PRESENT) {
-+              mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
-+              page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
-+              p  = (unsigned long *)__va(page);
-+              address &= 0x3fffffff;
-+              p += (address >> 21) * 2;
-+              printk(KERN_ALERT "%08lx -> *pme = %08lx:%08lx\n", 
-+                     page, p[1], p[0]);
-+              mfn  = (p[0] >> PAGE_SHIFT) | (p[1] << 20);
-+#ifdef CONFIG_HIGHPTE
-+              if (mfn_to_pfn(mfn) >= highstart_pfn)
-+                      return;
-+#endif
-+              if (p[0] & _PAGE_PRESENT) {
-+                      page = mfn_to_pfn(mfn) << PAGE_SHIFT; 
-+                      p  = (unsigned long *) __va(page);
-+                      address &= 0x001fffff;
-+                      p += (address >> 12) * 2;
-+                      printk(KERN_ALERT "%08lx -> *pte = %08lx:%08lx\n",
-+                             page, p[1], p[0]);
-+              }
-+      }
-+}
-+#else
-+static void dump_fault_path(unsigned long address)
-+{
-+      unsigned long page;
-+
-+      page = read_cr3();
-+      page = ((unsigned long *) __va(page))[address >> 22];
-+      if (oops_may_print())
-+              printk(KERN_ALERT "*pde = ma %08lx pa %08lx\n", page,
-+                     machine_to_phys(page));
-+      /*
-+       * We must not directly access the pte in the highpte
-+       * case if the page table is located in highmem.
-+       * And lets rather not kmap-atomic the pte, just in case
-+       * it's allocated already.
-+       */
-+#ifdef CONFIG_HIGHPTE
-+      if ((page >> PAGE_SHIFT) >= highstart_pfn)
-+              return;
-+#endif
-+      if ((page & 1) && oops_may_print()) {
-+              page &= PAGE_MASK;
-+              address &= 0x003ff000;
-+              page = machine_to_phys(page);
-+              page = ((unsigned long *) __va(page))[address >> PAGE_SHIFT];
-+              printk(KERN_ALERT "*pte = ma %08lx pa %08lx\n", page,
-+                     machine_to_phys(page));
-+      }
-+}
-+#endif
-+
-+static int spurious_fault(struct pt_regs *regs,
-+                        unsigned long address,
-+                        unsigned long error_code)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+
-+      /* Reserved-bit violation or user access to kernel space? */
-+      if (error_code & 0x0c)
-+              return 0;
-+
-+      pgd = init_mm.pgd + pgd_index(address);
-+      if (!pgd_present(*pgd))
-+              return 0;
-+
-+      pud = pud_offset(pgd, address);
-+      if (!pud_present(*pud))
-+              return 0;
-+
-+      pmd = pmd_offset(pud, address);
-+      if (!pmd_present(*pmd))
-+              return 0;
-+
-+      pte = pte_offset_kernel(pmd, address);
-+      if (!pte_present(*pte))
-+              return 0;
-+      if ((error_code & 0x02) && !pte_write(*pte))
-+              return 0;
-+#ifdef CONFIG_X86_PAE
-+      if ((error_code & 0x10) && (__pte_val(*pte) & _PAGE_NX))
-+              return 0;
-+#endif
-+
-+      return 1;
-+}
-+
-+static inline pmd_t *vmalloc_sync_one(pgd_t *pgd, unsigned long address)
-+{
-+      unsigned index = pgd_index(address);
-+      pgd_t *pgd_k;
-+      pud_t *pud, *pud_k;
-+      pmd_t *pmd, *pmd_k;
-+
-+      pgd += index;
-+      pgd_k = init_mm.pgd + index;
-+
-+      if (!pgd_present(*pgd_k))
-+              return NULL;
-+
-+      /*
-+       * set_pgd(pgd, *pgd_k); here would be useless on PAE
-+       * and redundant with the set_pmd() on non-PAE. As would
-+       * set_pud.
-+       */
-+
-+      pud = pud_offset(pgd, address);
-+      pud_k = pud_offset(pgd_k, address);
-+      if (!pud_present(*pud_k))
-+              return NULL;
-+
-+      pmd = pmd_offset(pud, address);
-+      pmd_k = pmd_offset(pud_k, address);
-+      if (!pmd_present(*pmd_k))
-+              return NULL;
-+      if (!pmd_present(*pmd))
-+#if CONFIG_XEN_COMPAT > 0x030002
-+              set_pmd(pmd, *pmd_k);
-+#else
-+              /*
-+               * When running on older Xen we must launder *pmd_k through
-+               * pmd_val() to ensure that _PAGE_PRESENT is correctly set.
-+               */
-+              set_pmd(pmd, __pmd(pmd_val(*pmd_k)));
-+#endif
-+      else
-+              BUG_ON(pmd_page(*pmd) != pmd_page(*pmd_k));
-+      return pmd_k;
-+}
-+
-+/*
-+ * Handle a fault on the vmalloc or module mapping area
-+ *
-+ * This assumes no large pages in there.
-+ */
-+static inline int vmalloc_fault(unsigned long address)
-+{
-+      unsigned long pgd_paddr;
-+      pmd_t *pmd_k;
-+      pte_t *pte_k;
-+      /*
-+       * Synchronize this task's top level page-table
-+       * with the 'reference' page table.
-+       *
-+       * Do _not_ use "current" here. We might be inside
-+       * an interrupt in the middle of a task switch..
-+       */
-+      pgd_paddr = read_cr3();
-+      pmd_k = vmalloc_sync_one(__va(pgd_paddr), address);
-+      if (!pmd_k)
-+              return -1;
-+      pte_k = pte_offset_kernel(pmd_k, address);
-+      if (!pte_present(*pte_k))
-+              return -1;
-+      return 0;
-+}
-+
-+/*
-+ * This routine handles page faults.  It determines the address,
-+ * and the problem, and then passes it off to one of the appropriate
-+ * routines.
-+ *
-+ * error_code:
-+ *    bit 0 == 0 means no page found, 1 means protection fault
-+ *    bit 1 == 0 means read, 1 means write
-+ *    bit 2 == 0 means kernel, 1 means user-mode
-+ *    bit 3 == 1 means use of reserved bit detected
-+ *    bit 4 == 1 means fault was an instruction fetch
-+ */
-+fastcall void __kprobes do_page_fault(struct pt_regs *regs,
-+                                    unsigned long error_code)
-+{
-+      struct task_struct *tsk;
-+      struct mm_struct *mm;
-+      struct vm_area_struct * vma;
-+      unsigned long address;
-+      int write, si_code;
-+
-+      /* get the address */
-+        address = read_cr2();
-+
-+      /* Set the "privileged fault" bit to something sane. */
-+      error_code &= ~4;
-+      error_code |= (regs->xcs & 2) << 1;
-+      if (regs->eflags & X86_EFLAGS_VM)
-+              error_code |= 4;
-+
-+      tsk = current;
-+
-+      si_code = SEGV_MAPERR;
-+
-+      /*
-+       * We fault-in kernel-space virtual memory on-demand. The
-+       * 'reference' page table is init_mm.pgd.
-+       *
-+       * NOTE! We MUST NOT take any locks for this case. We may
-+       * be in an interrupt or a critical region, and should
-+       * only copy the information from the master page table,
-+       * nothing more.
-+       *
-+       * This verifies that the fault happens in kernel space
-+       * (error_code & 4) == 0, and that the fault was not a
-+       * protection error (error_code & 9) == 0.
-+       */
-+      if (unlikely(address >= TASK_SIZE)) {
-+#ifdef CONFIG_XEN
-+              /* Faults in hypervisor area can never be patched up. */
-+              if (address >= hypervisor_virt_start)
-+                      goto bad_area_nosemaphore;
-+#endif
-+              if (!(error_code & 0x0000000d) && vmalloc_fault(address) >= 0)
-+                      return;
-+              /* Can take a spurious fault if mapping changes R/O -> R/W. */
-+              if (spurious_fault(regs, address, error_code))
-+                      return;
-+              if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-+                                              SIGSEGV) == NOTIFY_STOP)
-+                      return;
-+              /* 
-+               * Don't take the mm semaphore here. If we fixup a prefetch
-+               * fault we could otherwise deadlock.
-+               */
-+              goto bad_area_nosemaphore;
-+      }
-+
-+      if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-+                                      SIGSEGV) == NOTIFY_STOP)
-+              return;
-+
-+      /* It's safe to allow irq's after cr2 has been saved and the vmalloc
-+         fault has been handled. */
-+      if (regs->eflags & (X86_EFLAGS_IF|VM_MASK))
-+              local_irq_enable();
-+
-+      mm = tsk->mm;
-+
-+      /*
-+       * If we're in an interrupt, have no user context or are running in an
-+       * atomic region then we must not take the fault..
-+       */
-+      if (in_atomic() || !mm)
-+              goto bad_area_nosemaphore;
-+
-+      /* When running in the kernel we expect faults to occur only to
-+       * addresses in user space.  All other faults represent errors in the
-+       * kernel and should generate an OOPS.  Unfortunatly, in the case of an
-+       * erroneous fault occurring in a code path which already holds mmap_sem
-+       * we will deadlock attempting to validate the fault against the
-+       * address space.  Luckily the kernel only validly references user
-+       * space from well defined areas of code, which are listed in the
-+       * exceptions table.
-+       *
-+       * As the vast majority of faults will be valid we will only perform
-+       * the source reference check when there is a possibilty of a deadlock.
-+       * Attempt to lock the address space, if we cannot we then validate the
-+       * source.  If this is invalid we can skip the address space check,
-+       * thus avoiding the deadlock.
-+       */
-+      if (!down_read_trylock(&mm->mmap_sem)) {
-+              if ((error_code & 4) == 0 &&
-+                  !search_exception_tables(regs->eip))
-+                      goto bad_area_nosemaphore;
-+              down_read(&mm->mmap_sem);
-+      }
-+
-+      vma = find_vma(mm, address);
-+      if (!vma)
-+              goto bad_area;
-+      if (vma->vm_start <= address)
-+              goto good_area;
-+      if (!(vma->vm_flags & VM_GROWSDOWN))
-+              goto bad_area;
-+      if (error_code & 4) {
-+              /*
-+               * Accessing the stack below %esp is always a bug.
-+               * The large cushion allows instructions like enter
-+               * and pusha to work.  ("enter $65535,$31" pushes
-+               * 32 pointers and then decrements %esp by 65535.)
-+               */
-+              if (address + 65536 + 32 * sizeof(unsigned long) < regs->esp)
-+                      goto bad_area;
-+      }
-+      if (expand_stack(vma, address))
-+              goto bad_area;
-+/*
-+ * Ok, we have a good vm_area for this memory access, so
-+ * we can handle it..
-+ */
-+good_area:
-+      si_code = SEGV_ACCERR;
-+      write = 0;
-+      switch (error_code & 3) {
-+              default:        /* 3: write, present */
-+#ifdef TEST_VERIFY_AREA
-+                      if (regs->cs == GET_KERNEL_CS())
-+                              printk("WP fault at %08lx\n", regs->eip);
-+#endif
-+                      /* fall through */
-+              case 2:         /* write, not present */
-+                      if (!(vma->vm_flags & VM_WRITE))
-+                              goto bad_area;
-+                      write++;
-+                      break;
-+              case 1:         /* read, present */
-+                      goto bad_area;
-+              case 0:         /* read, not present */
-+                      if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-+                              goto bad_area;
-+      }
-+
-+ survive:
-+      /*
-+       * If for any reason at all we couldn't handle the fault,
-+       * make sure we exit gracefully rather than endlessly redo
-+       * the fault.
-+       */
-+      switch (handle_mm_fault(mm, vma, address, write)) {
-+              case VM_FAULT_MINOR:
-+                      tsk->min_flt++;
-+                      break;
-+              case VM_FAULT_MAJOR:
-+                      tsk->maj_flt++;
-+                      break;
-+              case VM_FAULT_SIGBUS:
-+                      goto do_sigbus;
-+              case VM_FAULT_OOM:
-+                      goto out_of_memory;
-+              default:
-+                      BUG();
-+      }
-+
-+      /*
-+       * Did it hit the DOS screen memory VA from vm86 mode?
-+       */
-+      if (regs->eflags & VM_MASK) {
-+              unsigned long bit = (address - 0xA0000) >> PAGE_SHIFT;
-+              if (bit < 32)
-+                      tsk->thread.screen_bitmap |= 1 << bit;
-+      }
-+      up_read(&mm->mmap_sem);
-+      return;
-+
-+/*
-+ * Something tried to access memory that isn't in our memory map..
-+ * Fix it, but check if it's kernel or user first..
-+ */
-+bad_area:
-+      up_read(&mm->mmap_sem);
-+
-+bad_area_nosemaphore:
-+      /* User mode accesses just cause a SIGSEGV */
-+      if (error_code & 4) {
-+              /* 
-+               * Valid to do another page fault here because this one came 
-+               * from user space.
-+               */
-+              if (is_prefetch(regs, address, error_code))
-+                      return;
-+
-+              tsk->thread.cr2 = address;
-+              /* Kernel addresses are always protection faults */
-+              tsk->thread.error_code = error_code | (address >= TASK_SIZE);
-+              tsk->thread.trap_no = 14;
-+              force_sig_info_fault(SIGSEGV, si_code, address, tsk);
-+              return;
-+      }
-+
-+#ifdef CONFIG_X86_F00F_BUG
-+      /*
-+       * Pentium F0 0F C7 C8 bug workaround.
-+       */
-+      if (boot_cpu_data.f00f_bug) {
-+              unsigned long nr;
-+              
-+              nr = (address - idt_descr.address) >> 3;
-+
-+              if (nr == 6) {
-+                      do_invalid_op(regs, 0);
-+                      return;
-+              }
-+      }
-+#endif
-+
-+no_context:
-+      /* Are we prepared to handle this kernel fault?  */
-+      if (fixup_exception(regs))
-+              return;
-+
-+      /* 
-+       * Valid to do another page fault here, because if this fault
-+       * had been triggered by is_prefetch fixup_exception would have 
-+       * handled it.
-+       */
-+      if (is_prefetch(regs, address, error_code))
-+              return;
-+
-+/*
-+ * Oops. The kernel tried to access some bad page. We'll have to
-+ * terminate things with extreme prejudice.
-+ */
-+
-+      bust_spinlocks(1);
-+
-+      if (oops_may_print()) {
-+      #ifdef CONFIG_X86_PAE
-+              if (error_code & 16) {
-+                      pte_t *pte = lookup_address(address);
-+
-+                      if (pte && pte_present(*pte) && !pte_exec_kernel(*pte))
-+                              printk(KERN_CRIT "kernel tried to execute "
-+                                      "NX-protected page - exploit attempt? "
-+                                      "(uid: %d)\n", current->uid);
-+              }
-+      #endif
-+              if (address < PAGE_SIZE)
-+                      printk(KERN_ALERT "BUG: unable to handle kernel NULL "
-+                                      "pointer dereference");
-+              else
-+                      printk(KERN_ALERT "BUG: unable to handle kernel paging"
-+                                      " request");
-+              printk(" at virtual address %08lx\n",address);
-+              printk(KERN_ALERT " printing eip:\n");
-+              printk("%08lx\n", regs->eip);
-+      }
-+      dump_fault_path(address);
-+      tsk->thread.cr2 = address;
-+      tsk->thread.trap_no = 14;
-+      tsk->thread.error_code = error_code;
-+      die("Oops", regs, error_code);
-+      bust_spinlocks(0);
-+      do_exit(SIGKILL);
-+
-+/*
-+ * We ran out of memory, or some other thing happened to us that made
-+ * us unable to handle the page fault gracefully.
-+ */
-+out_of_memory:
-+      up_read(&mm->mmap_sem);
-+      if (tsk->pid == 1) {
-+              yield();
-+              down_read(&mm->mmap_sem);
-+              goto survive;
-+      }
-+      printk("VM: killing process %s\n", tsk->comm);
-+      if (error_code & 4)
-+              do_exit(SIGKILL);
-+      goto no_context;
-+
-+do_sigbus:
-+      up_read(&mm->mmap_sem);
-+
-+      /* Kernel mode? Handle exceptions or die */
-+      if (!(error_code & 4))
-+              goto no_context;
-+
-+      /* User space => ok to do another page fault */
-+      if (is_prefetch(regs, address, error_code))
-+              return;
-+
-+      tsk->thread.cr2 = address;
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = 14;
-+      force_sig_info_fault(SIGBUS, BUS_ADRERR, address, tsk);
-+}
-+
-+#if !HAVE_SHARED_KERNEL_PMD
-+void vmalloc_sync_all(void)
-+{
-+      /*
-+       * Note that races in the updates of insync and start aren't
-+       * problematic: insync can only get set bits added, and updates to
-+       * start are only improving performance (without affecting correctness
-+       * if undone).
-+       * XEN: To work on PAE, we need to iterate over PMDs rather than PGDs.
-+       *      This change works just fine with 2-level paging too.
-+       */
-+#define sync_index(a) ((a) >> PMD_SHIFT)
-+      static DECLARE_BITMAP(insync, PTRS_PER_PGD*PTRS_PER_PMD);
-+      static unsigned long start = TASK_SIZE;
-+      unsigned long address;
-+
-+      BUILD_BUG_ON(TASK_SIZE & ~PGDIR_MASK);
-+      for (address = start;
-+           address >= TASK_SIZE && address < hypervisor_virt_start;
-+           address += 1UL << PMD_SHIFT) {
-+              if (!test_bit(sync_index(address), insync)) {
-+                      unsigned long flags;
-+                      struct page *page;
-+
-+                      spin_lock_irqsave(&pgd_lock, flags);
-+                      /* XEN: failure path assumes non-empty pgd_list. */
-+                      if (unlikely(!pgd_list)) {
-+                              spin_unlock_irqrestore(&pgd_lock, flags);
-+                              return;
-+                      }
-+                      for (page = pgd_list; page; page =
-+                                      (struct page *)page->index)
-+                              if (!vmalloc_sync_one(page_address(page),
-+                                                              address)) {
-+                                      BUG_ON(page != pgd_list);
-+                                      break;
-+                              }
-+                      spin_unlock_irqrestore(&pgd_lock, flags);
-+                      if (!page)
-+                              set_bit(sync_index(address), insync);
-+              }
-+              if (address == start && test_bit(sync_index(address), insync))
-+                      start = address + (1UL << PMD_SHIFT);
-+      }
-+}
-+#endif
-Index: head-2008-11-25/arch/x86/mm/highmem_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/highmem_32-xen.c       2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,183 @@
-+#include <linux/highmem.h>
-+#include <linux/module.h>
-+
-+void *kmap(struct page *page)
-+{
-+      might_sleep();
-+      if (!PageHighMem(page))
-+              return page_address(page);
-+      return kmap_high(page);
-+}
-+
-+void kunmap(struct page *page)
-+{
-+      if (in_interrupt())
-+              BUG();
-+      if (!PageHighMem(page))
-+              return;
-+      kunmap_high(page);
-+}
-+
-+/*
-+ * kmap_atomic/kunmap_atomic is significantly faster than kmap/kunmap because
-+ * no global lock is needed and because the kmap code must perform a global TLB
-+ * invalidation when the kmap pool wraps.
-+ *
-+ * However when holding an atomic kmap is is not legal to sleep, so atomic
-+ * kmaps are appropriate for short, tight code paths only.
-+ */
-+static void *__kmap_atomic(struct page *page, enum km_type type, pgprot_t prot)
-+{
-+      enum fixed_addresses idx;
-+      unsigned long vaddr;
-+
-+      /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
-+      inc_preempt_count();
-+      if (!PageHighMem(page))
-+              return page_address(page);
-+
-+      idx = type + KM_TYPE_NR*smp_processor_id();
-+      vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-+#ifdef CONFIG_DEBUG_HIGHMEM
-+      if (!pte_none(*(kmap_pte-idx)))
-+              BUG();
-+#endif
-+      set_pte_at_sync(&init_mm, vaddr, kmap_pte-idx, mk_pte(page, prot));
-+
-+      return (void*) vaddr;
-+}
-+
-+void *kmap_atomic(struct page *page, enum km_type type)
-+{
-+      return __kmap_atomic(page, type, kmap_prot);
-+}
-+
-+/* Same as kmap_atomic but with PAGE_KERNEL_RO page protection. */
-+void *kmap_atomic_pte(struct page *page, enum km_type type)
-+{
-+      return __kmap_atomic(page, type,
-+                           test_bit(PG_pinned, &page->flags)
-+                           ? PAGE_KERNEL_RO : kmap_prot);
-+}
-+
-+void kunmap_atomic(void *kvaddr, enum km_type type)
-+{
-+#if defined(CONFIG_DEBUG_HIGHMEM) || defined(CONFIG_XEN)
-+      unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK;
-+      enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id();
-+
-+      if (vaddr < FIXADDR_START) { // FIXME
-+              dec_preempt_count();
-+              preempt_check_resched();
-+              return;
-+      }
-+#endif
-+
-+#if defined(CONFIG_DEBUG_HIGHMEM)
-+      if (vaddr != __fix_to_virt(FIX_KMAP_BEGIN+idx))
-+              BUG();
-+
-+      /*
-+       * force other mappings to Oops if they'll try to access
-+       * this pte without first remap it
-+       */
-+      pte_clear(&init_mm, vaddr, kmap_pte-idx);
-+      __flush_tlb_one(vaddr);
-+#elif defined(CONFIG_XEN)
-+      /*
-+       * We must ensure there are no dangling pagetable references when
-+       * returning memory to Xen (decrease_reservation).
-+       * XXX TODO: We could make this faster by only zapping when
-+       * kmap_flush_unused is called but that is trickier and more invasive.
-+       */
-+      pte_clear(&init_mm, vaddr, kmap_pte-idx);
-+#endif
-+
-+      dec_preempt_count();
-+      preempt_check_resched();
-+}
-+
-+/* This is the same as kmap_atomic() but can map memory that doesn't
-+ * have a struct page associated with it.
-+ */
-+void *kmap_atomic_pfn(unsigned long pfn, enum km_type type)
-+{
-+      enum fixed_addresses idx;
-+      unsigned long vaddr;
-+
-+      inc_preempt_count();
-+
-+      idx = type + KM_TYPE_NR*smp_processor_id();
-+      vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
-+      set_pte(kmap_pte-idx, pfn_pte(pfn, kmap_prot));
-+      __flush_tlb_one(vaddr);
-+
-+      return (void*) vaddr;
-+}
-+
-+struct page *kmap_atomic_to_page(void *ptr)
-+{
-+      unsigned long idx, vaddr = (unsigned long)ptr;
-+      pte_t *pte;
-+
-+      if (vaddr < FIXADDR_START)
-+              return virt_to_page(ptr);
-+
-+      idx = virt_to_fix(vaddr);
-+      pte = kmap_pte - (idx - FIX_KMAP_BEGIN);
-+      return pte_page(*pte);
-+}
-+
-+void clear_highpage(struct page *page)
-+{
-+      void *kaddr;
-+
-+      if (likely(xen_feature(XENFEAT_highmem_assist))
-+          && PageHighMem(page)) {
-+              struct mmuext_op meo;
-+
-+              meo.cmd = MMUEXT_CLEAR_PAGE;
-+              meo.arg1.mfn = pfn_to_mfn(page_to_pfn(page));
-+              if (HYPERVISOR_mmuext_op(&meo, 1, NULL, DOMID_SELF) == 0)
-+                      return;
-+      }
-+
-+      kaddr = kmap_atomic(page, KM_USER0);
-+      clear_page(kaddr);
-+      kunmap_atomic(kaddr, KM_USER0);
-+}
-+
-+void copy_highpage(struct page *to, struct page *from)
-+{
-+      void *vfrom, *vto;
-+
-+      if (likely(xen_feature(XENFEAT_highmem_assist))
-+          && (PageHighMem(from) || PageHighMem(to))) {
-+              unsigned long from_pfn = page_to_pfn(from);
-+              unsigned long to_pfn = page_to_pfn(to);
-+              struct mmuext_op meo;
-+
-+              meo.cmd = MMUEXT_COPY_PAGE;
-+              meo.arg1.mfn = pfn_to_mfn(to_pfn);
-+              meo.arg2.src_mfn = pfn_to_mfn(from_pfn);
-+              if (mfn_to_pfn(meo.arg2.src_mfn) == from_pfn
-+                  && mfn_to_pfn(meo.arg1.mfn) == to_pfn
-+                  && HYPERVISOR_mmuext_op(&meo, 1, NULL, DOMID_SELF) == 0)
-+                      return;
-+      }
-+
-+      vfrom = kmap_atomic(from, KM_USER0);
-+      vto = kmap_atomic(to, KM_USER1);
-+      copy_page(vto, vfrom);
-+      kunmap_atomic(vfrom, KM_USER0);
-+      kunmap_atomic(vto, KM_USER1);
-+}
-+
-+EXPORT_SYMBOL(kmap);
-+EXPORT_SYMBOL(kunmap);
-+EXPORT_SYMBOL(kmap_atomic);
-+EXPORT_SYMBOL(kmap_atomic_pte);
-+EXPORT_SYMBOL(kunmap_atomic);
-+EXPORT_SYMBOL(kmap_atomic_to_page);
-+EXPORT_SYMBOL(clear_highpage);
-+EXPORT_SYMBOL(copy_highpage);
-Index: head-2008-11-25/arch/x86/mm/hypervisor.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/hypervisor.c   2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,547 @@
-+/******************************************************************************
-+ * mm/hypervisor.c
-+ * 
-+ * Update page tables via the hypervisor.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/vmalloc.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/hypervisor.h>
-+#include <xen/balloon.h>
-+#include <xen/features.h>
-+#include <xen/interface/memory.h>
-+#include <linux/module.h>
-+#include <linux/percpu.h>
-+#include <asm/tlbflush.h>
-+#include <linux/highmem.h>
-+
-+void xen_l1_entry_update(pte_t *ptr, pte_t val)
-+{
-+      mmu_update_t u;
-+#ifdef CONFIG_HIGHPTE
-+      u.ptr = ((unsigned long)ptr >= (unsigned long)high_memory) ?
-+              arbitrary_virt_to_machine(ptr) : virt_to_machine(ptr);
-+#else
-+      u.ptr = virt_to_machine(ptr);
-+#endif
-+      u.val = __pte_val(val);
-+      BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-+}
-+EXPORT_SYMBOL_GPL(xen_l1_entry_update);
-+
-+void xen_l2_entry_update(pmd_t *ptr, pmd_t val)
-+{
-+      mmu_update_t u;
-+      u.ptr = virt_to_machine(ptr);
-+      u.val = __pmd_val(val);
-+      BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+#if defined(CONFIG_X86_PAE) || defined(CONFIG_X86_64)
-+void xen_l3_entry_update(pud_t *ptr, pud_t val)
-+{
-+      mmu_update_t u;
-+      u.ptr = virt_to_machine(ptr);
-+      u.val = __pud_val(val);
-+      BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-+}
-+#endif
-+
-+#ifdef CONFIG_X86_64
-+void xen_l4_entry_update(pgd_t *ptr, pgd_t val)
-+{
-+      mmu_update_t u;
-+      u.ptr = virt_to_machine(ptr);
-+      u.val = __pgd_val(val);
-+      BUG_ON(HYPERVISOR_mmu_update(&u, 1, NULL, DOMID_SELF) < 0);
-+}
-+#endif /* CONFIG_X86_64 */
-+
-+void xen_pt_switch(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_NEW_BASEPTR;
-+      op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_new_user_pt(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_NEW_USER_BASEPTR;
-+      op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_tlb_flush(void)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_TLB_FLUSH_LOCAL;
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+EXPORT_SYMBOL(xen_tlb_flush);
-+
-+void xen_invlpg(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_INVLPG_LOCAL;
-+      op.arg1.linear_addr = ptr & PAGE_MASK;
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+EXPORT_SYMBOL(xen_invlpg);
-+
-+#ifdef CONFIG_SMP
-+
-+void xen_tlb_flush_all(void)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_TLB_FLUSH_ALL;
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_tlb_flush_mask(cpumask_t *mask)
-+{
-+      struct mmuext_op op;
-+      if ( cpus_empty(*mask) )
-+              return;
-+      op.cmd = MMUEXT_TLB_FLUSH_MULTI;
-+      set_xen_guest_handle(op.arg2.vcpumask, mask->bits);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_invlpg_all(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_INVLPG_ALL;
-+      op.arg1.linear_addr = ptr & PAGE_MASK;
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      if ( cpus_empty(*mask) )
-+              return;
-+      op.cmd = MMUEXT_INVLPG_MULTI;
-+      op.arg1.linear_addr = ptr & PAGE_MASK;
-+      set_xen_guest_handle(op.arg2.vcpumask, mask->bits);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+#endif /* CONFIG_SMP */
-+
-+void xen_pgd_pin(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+#ifdef CONFIG_X86_64
-+      op.cmd = MMUEXT_PIN_L4_TABLE;
-+#elif defined(CONFIG_X86_PAE)
-+      op.cmd = MMUEXT_PIN_L3_TABLE;
-+#else
-+      op.cmd = MMUEXT_PIN_L2_TABLE;
-+#endif
-+      op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_pgd_unpin(unsigned long ptr)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_UNPIN_TABLE;
-+      op.arg1.mfn = pfn_to_mfn(ptr >> PAGE_SHIFT);
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+void xen_set_ldt(const void *ptr, unsigned int ents)
-+{
-+      struct mmuext_op op;
-+      op.cmd = MMUEXT_SET_LDT;
-+      op.arg1.linear_addr = (unsigned long)ptr;
-+      op.arg2.nr_ents     = ents;
-+      BUG_ON(HYPERVISOR_mmuext_op(&op, 1, NULL, DOMID_SELF) < 0);
-+}
-+
-+/* Protected by balloon_lock. */
-+#define MAX_CONTIG_ORDER 9 /* 2MB */
-+static unsigned long discontig_frames[1<<MAX_CONTIG_ORDER];
-+static unsigned long limited_frames[1<<MAX_CONTIG_ORDER];
-+static multicall_entry_t cr_mcl[1<<MAX_CONTIG_ORDER];
-+
-+/* Ensure multi-page extents are contiguous in machine memory. */
-+int xen_create_contiguous_region(
-+      unsigned long vstart, unsigned int order, unsigned int address_bits)
-+{
-+      unsigned long *in_frames = discontig_frames, out_frame;
-+      unsigned long  frame, flags;
-+      unsigned int   i;
-+      int            rc, success;
-+      struct xen_memory_exchange exchange = {
-+              .in = {
-+                      .nr_extents   = 1UL << order,
-+                      .extent_order = 0,
-+                      .domid        = DOMID_SELF
-+              },
-+              .out = {
-+                      .nr_extents   = 1,
-+                      .extent_order = order,
-+                      .address_bits = address_bits,
-+                      .domid        = DOMID_SELF
-+              }
-+      };
-+
-+      /*
-+       * Currently an auto-translated guest will not perform I/O, nor will
-+       * it require PAE page directories below 4GB. Therefore any calls to
-+       * this function are redundant and can be ignored.
-+       */
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return 0;
-+
-+      if (unlikely(order > MAX_CONTIG_ORDER))
-+              return -ENOMEM;
-+
-+      set_xen_guest_handle(exchange.in.extent_start, in_frames);
-+      set_xen_guest_handle(exchange.out.extent_start, &out_frame);
-+
-+      scrub_pages((void *)vstart, 1 << order);
-+
-+      balloon_lock(flags);
-+
-+      /* 1. Zap current PTEs, remembering MFNs. */
-+      for (i = 0; i < (1U<<order); i++) {
-+              in_frames[i] = pfn_to_mfn((__pa(vstart) >> PAGE_SHIFT) + i);
-+              MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-+                                      __pte_ma(0), 0);
-+              set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
-+                      INVALID_P2M_ENTRY);
-+      }
-+      if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-+              BUG();
-+
-+      /* 2. Get a new contiguous memory extent. */
-+      out_frame = __pa(vstart) >> PAGE_SHIFT;
-+      rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-+      success = (exchange.nr_exchanged == (1UL << order));
-+      BUG_ON(!success && ((exchange.nr_exchanged != 0) || (rc == 0)));
-+      BUG_ON(success && (rc != 0));
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              /* Compatibility when XENMEM_exchange is unsupported. */
-+              if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                       &exchange.in) != (1UL << order))
-+                      BUG();
-+              success = (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-+                                              &exchange.out) == 1);
-+              if (!success) {
-+                      /* Couldn't get special memory: fall back to normal. */
-+                      for (i = 0; i < (1U<<order); i++)
-+                              in_frames[i] = (__pa(vstart)>>PAGE_SHIFT) + i;
-+                      if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-+                                               &exchange.in) != (1UL<<order))
-+                              BUG();
-+              }
-+      }
-+#endif
-+
-+      /* 3. Map the new extent in place of old pages. */
-+      for (i = 0; i < (1U<<order); i++) {
-+              frame = success ? (out_frame + i) : in_frames[i];
-+              MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-+                                      pfn_pte_ma(frame, PAGE_KERNEL), 0);
-+              set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
-+      }
-+
-+      cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
-+                                                 ? UVMF_TLB_FLUSH|UVMF_ALL
-+                                                 : UVMF_INVLPG|UVMF_ALL;
-+      if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-+              BUG();
-+
-+      balloon_unlock(flags);
-+
-+      return success ? 0 : -ENOMEM;
-+}
-+EXPORT_SYMBOL_GPL(xen_create_contiguous_region);
-+
-+void xen_destroy_contiguous_region(unsigned long vstart, unsigned int order)
-+{
-+      unsigned long *out_frames = discontig_frames, in_frame;
-+      unsigned long  frame, flags;
-+      unsigned int   i;
-+      int            rc, success;
-+      struct xen_memory_exchange exchange = {
-+              .in = {
-+                      .nr_extents   = 1,
-+                      .extent_order = order,
-+                      .domid        = DOMID_SELF
-+              },
-+              .out = {
-+                      .nr_extents   = 1UL << order,
-+                      .extent_order = 0,
-+                      .domid        = DOMID_SELF
-+              }
-+      };
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return;
-+
-+      if (unlikely(order > MAX_CONTIG_ORDER))
-+              return;
-+
-+      set_xen_guest_handle(exchange.in.extent_start, &in_frame);
-+      set_xen_guest_handle(exchange.out.extent_start, out_frames);
-+
-+      scrub_pages((void *)vstart, 1 << order);
-+
-+      balloon_lock(flags);
-+
-+      /* 1. Find start MFN of contiguous extent. */
-+      in_frame = pfn_to_mfn(__pa(vstart) >> PAGE_SHIFT);
-+
-+      /* 2. Zap current PTEs. */
-+      for (i = 0; i < (1U<<order); i++) {
-+              MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-+                                      __pte_ma(0), 0);
-+              set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i,
-+                      INVALID_P2M_ENTRY);
-+              out_frames[i] = (__pa(vstart) >> PAGE_SHIFT) + i;
-+      }
-+      if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-+              BUG();
-+
-+      /* 3. Do the exchange for non-contiguous MFNs. */
-+      rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-+      success = (exchange.nr_exchanged == 1);
-+      BUG_ON(!success && ((exchange.nr_exchanged != 0) || (rc == 0)));
-+      BUG_ON(success && (rc != 0));
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              /* Compatibility when XENMEM_exchange is unsupported. */
-+              if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                       &exchange.in) != 1)
-+                      BUG();
-+              if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-+                                       &exchange.out) != (1UL << order))
-+                      BUG();
-+              success = 1;
-+      }
-+#endif
-+
-+      /* 4. Map new pages in place of old pages. */
-+      for (i = 0; i < (1U<<order); i++) {
-+              frame = success ? out_frames[i] : (in_frame + i);
-+              MULTI_update_va_mapping(cr_mcl + i, vstart + (i*PAGE_SIZE),
-+                                      pfn_pte_ma(frame, PAGE_KERNEL), 0);
-+              set_phys_to_machine((__pa(vstart)>>PAGE_SHIFT)+i, frame);
-+      }
-+
-+      cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
-+                                                 ? UVMF_TLB_FLUSH|UVMF_ALL
-+                                                 : UVMF_INVLPG|UVMF_ALL;
-+      if (HYPERVISOR_multicall_check(cr_mcl, i, NULL))
-+              BUG();
-+
-+      balloon_unlock(flags);
-+}
-+EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
-+
-+int xen_limit_pages_to_max_mfn(
-+      struct page *pages, unsigned int order, unsigned int address_bits)
-+{
-+      unsigned long flags, frame;
-+      unsigned long *in_frames = discontig_frames, *out_frames = limited_frames;
-+      struct page *page;
-+      unsigned int i, n, nr_mcl;
-+      int rc, success;
-+      DECLARE_BITMAP(limit_map, 1 << MAX_CONTIG_ORDER);
-+
-+      struct xen_memory_exchange exchange = {
-+              .in = {
-+                      .extent_order = 0,
-+                      .domid        = DOMID_SELF
-+              },
-+              .out = {
-+                      .extent_order = 0,
-+                      .address_bits = address_bits,
-+                      .domid        = DOMID_SELF
-+              }
-+      };
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return 0;
-+
-+      if (unlikely(order > MAX_CONTIG_ORDER))
-+              return -ENOMEM;
-+
-+      bitmap_zero(limit_map, 1U << order);
-+      set_xen_guest_handle(exchange.in.extent_start, in_frames);
-+      set_xen_guest_handle(exchange.out.extent_start, out_frames);
-+
-+      /* 0. Scrub the pages. */
-+      for (i = 0, n = 0; i < 1U<<order ; i++) {
-+              page = &pages[i];
-+              if (!(pfn_to_mfn(page_to_pfn(page)) >> (address_bits - PAGE_SHIFT)))
-+                      continue;
-+              __set_bit(i, limit_map);
-+
-+              if (!PageHighMem(page))
-+                      scrub_pages(page_address(page), 1);
-+#ifdef CONFIG_XEN_SCRUB_PAGES
-+              else {
-+                      scrub_pages(kmap(page), 1);
-+                      kunmap(page);
-+                      ++n;
-+              }
-+#endif
-+      }
-+      if (bitmap_empty(limit_map, 1U << order))
-+              return 0;
-+
-+      if (n)
-+              kmap_flush_unused();
-+
-+      balloon_lock(flags);
-+
-+      /* 1. Zap current PTEs (if any), remembering MFNs. */
-+      for (i = 0, n = 0, nr_mcl = 0; i < (1U<<order); i++) {
-+              if(!test_bit(i, limit_map))
-+                      continue;
-+              page = &pages[i];
-+
-+              out_frames[n] = page_to_pfn(page);
-+              in_frames[n] = pfn_to_mfn(out_frames[n]);
-+
-+              if (!PageHighMem(page))
-+                      MULTI_update_va_mapping(cr_mcl + nr_mcl++,
-+                                              (unsigned long)page_address(page),
-+                                              __pte_ma(0), 0);
-+
-+              set_phys_to_machine(out_frames[n], INVALID_P2M_ENTRY);
-+              ++n;
-+      }
-+      if (nr_mcl && HYPERVISOR_multicall_check(cr_mcl, nr_mcl, NULL))
-+              BUG();
-+
-+      /* 2. Get new memory below the required limit. */
-+      exchange.in.nr_extents = n;
-+      exchange.out.nr_extents = n;
-+      rc = HYPERVISOR_memory_op(XENMEM_exchange, &exchange);
-+      success = (exchange.nr_exchanged == n);
-+      BUG_ON(!success && ((exchange.nr_exchanged != 0) || (rc == 0)));
-+      BUG_ON(success && (rc != 0));
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              /* Compatibility when XENMEM_exchange is unsupported. */
-+              if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                       &exchange.in) != n)
-+                      BUG();
-+              if (HYPERVISOR_memory_op(XENMEM_populate_physmap,
-+                                       &exchange.out) != n)
-+                      BUG();
-+              success = 1;
-+      }
-+#endif
-+
-+      /* 3. Map the new pages in place of old pages. */
-+      for (i = 0, n = 0, nr_mcl = 0; i < (1U<<order); i++) {
-+              if(!test_bit(i, limit_map))
-+                      continue;
-+              page = &pages[i];
-+
-+              frame = success ? out_frames[n] : in_frames[n];
-+
-+              if (!PageHighMem(page))
-+                      MULTI_update_va_mapping(cr_mcl + nr_mcl++,
-+                                              (unsigned long)page_address(page),
-+                                              pfn_pte_ma(frame, PAGE_KERNEL), 0);
-+
-+              set_phys_to_machine(page_to_pfn(page), frame);
-+              ++n;
-+      }
-+      if (nr_mcl) {
-+              cr_mcl[nr_mcl - 1].args[MULTI_UVMFLAGS_INDEX] = order
-+                                                              ? UVMF_TLB_FLUSH|UVMF_ALL
-+                                                              : UVMF_INVLPG|UVMF_ALL;
-+              if (HYPERVISOR_multicall_check(cr_mcl, nr_mcl, NULL))
-+                      BUG();
-+      }
-+
-+      balloon_unlock(flags);
-+
-+      return success ? 0 : -ENOMEM;
-+}
-+EXPORT_SYMBOL_GPL(xen_limit_pages_to_max_mfn);
-+
-+#ifdef __i386__
-+int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b)
-+{
-+      __u32 *lp = (__u32 *)((char *)ldt + entry * 8);
-+      maddr_t mach_lp = arbitrary_virt_to_machine(lp);
-+      return HYPERVISOR_update_descriptor(
-+              mach_lp, (u64)entry_a | ((u64)entry_b<<32));
-+}
-+#endif
-+
-+#define MAX_BATCHED_FULL_PTES 32
-+
-+int xen_change_pte_range(struct mm_struct *mm, pmd_t *pmd,
-+                       unsigned long addr, unsigned long end, pgprot_t newprot)
-+{
-+      int rc = 0, i = 0;
-+      mmu_update_t u[MAX_BATCHED_FULL_PTES];
-+      pte_t *pte;
-+      spinlock_t *ptl;
-+
-+      if (!xen_feature(XENFEAT_mmu_pt_update_preserve_ad))
-+              return 0;
-+
-+      pte = pte_offset_map_lock(mm, pmd, addr, &ptl);
-+      do {
-+              if (pte_present(*pte)) {
-+                      u[i].ptr = (__pmd_val(*pmd) & PHYSICAL_PAGE_MASK)
-+                                 | ((unsigned long)pte & ~PAGE_MASK)
-+                                 | MMU_PT_UPDATE_PRESERVE_AD;
-+                      u[i].val = __pte_val(pte_modify(*pte, newprot));
-+                      if (++i == MAX_BATCHED_FULL_PTES) {
-+                              if ((rc = HYPERVISOR_mmu_update(
-+                                      &u[0], i, NULL, DOMID_SELF)) != 0)
-+                                      break;
-+                              i = 0;
-+                      }
-+              }
-+      } while (pte++, addr += PAGE_SIZE, addr != end);
-+      if (i)
-+              rc = HYPERVISOR_mmu_update( &u[0], i, NULL, DOMID_SELF);
-+      pte_unmap_unlock(pte - 1, ptl);
-+      BUG_ON(rc && rc != -ENOSYS);
-+      return !rc;
-+}
-Index: head-2008-11-25/arch/x86/mm/init_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/init_32-xen.c  2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,840 @@
-+/*
-+ *  linux/arch/i386/mm/init.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *
-+ *  Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ptrace.h>
-+#include <linux/mman.h>
-+#include <linux/mm.h>
-+#include <linux/hugetlb.h>
-+#include <linux/swap.h>
-+#include <linux/smp.h>
-+#include <linux/init.h>
-+#include <linux/highmem.h>
-+#include <linux/pagemap.h>
-+#include <linux/poison.h>
-+#include <linux/bootmem.h>
-+#include <linux/slab.h>
-+#include <linux/proc_fs.h>
-+#include <linux/efi.h>
-+#include <linux/memory_hotplug.h>
-+#include <linux/initrd.h>
-+#include <linux/cpumask.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/scatterlist.h>
-+
-+#include <asm/processor.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/dma.h>
-+#include <asm/fixmap.h>
-+#include <asm/e820.h>
-+#include <asm/apic.h>
-+#include <asm/tlb.h>
-+#include <asm/tlbflush.h>
-+#include <asm/sections.h>
-+#include <asm/hypervisor.h>
-+#include <asm/swiotlb.h>
-+
-+unsigned int __VMALLOC_RESERVE = 128 << 20;
-+
-+DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
-+unsigned long highstart_pfn, highend_pfn;
-+
-+static int noinline do_test_wp_bit(void);
-+
-+/*
-+ * Creates a middle page table and puts a pointer to it in the
-+ * given global directory entry. This only returns the gd entry
-+ * in non-PAE compilation mode, since the middle layer is folded.
-+ */
-+static pmd_t * __init one_md_table_init(pgd_t *pgd)
-+{
-+      pud_t *pud;
-+      pmd_t *pmd_table;
-+              
-+#ifdef CONFIG_X86_PAE
-+      pmd_table = (pmd_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-+      make_lowmem_page_readonly(pmd_table, XENFEAT_writable_page_tables);
-+      set_pgd(pgd, __pgd(__pa(pmd_table) | _PAGE_PRESENT));
-+      pud = pud_offset(pgd, 0);
-+      if (pmd_table != pmd_offset(pud, 0)) 
-+              BUG();
-+#else
-+      pud = pud_offset(pgd, 0);
-+      pmd_table = pmd_offset(pud, 0);
-+#endif
-+
-+      return pmd_table;
-+}
-+
-+/*
-+ * Create a page table and place a pointer to it in a middle page
-+ * directory entry.
-+ */
-+static pte_t * __init one_page_table_init(pmd_t *pmd)
-+{
-+      if (pmd_none(*pmd)) {
-+              pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
-+              make_lowmem_page_readonly(page_table,
-+                                        XENFEAT_writable_page_tables);
-+              set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
-+              if (page_table != pte_offset_kernel(pmd, 0))
-+                      BUG();  
-+
-+              return page_table;
-+      }
-+      
-+      return pte_offset_kernel(pmd, 0);
-+}
-+
-+/*
-+ * This function initializes a certain range of kernel virtual memory 
-+ * with new bootmem page tables, everywhere page tables are missing in
-+ * the given range.
-+ */
-+
-+/*
-+ * NOTE: The pagetables are allocated contiguous on the physical space 
-+ * so we can cache the place of the first one and move around without 
-+ * checking the pgd every time.
-+ */
-+static void __init page_table_range_init (unsigned long start, unsigned long end, pgd_t *pgd_base)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      int pgd_idx, pmd_idx;
-+      unsigned long vaddr;
-+
-+      vaddr = start;
-+      pgd_idx = pgd_index(vaddr);
-+      pmd_idx = pmd_index(vaddr);
-+      pgd = pgd_base + pgd_idx;
-+
-+      for ( ; (pgd_idx < PTRS_PER_PGD) && (vaddr != end); pgd++, pgd_idx++) {
-+              if (pgd_none(*pgd)) 
-+                      one_md_table_init(pgd);
-+              pud = pud_offset(pgd, vaddr);
-+              pmd = pmd_offset(pud, vaddr);
-+              for (; (pmd_idx < PTRS_PER_PMD) && (vaddr != end); pmd++, pmd_idx++) {
-+                      if (vaddr < hypervisor_virt_start && pmd_none(*pmd))
-+                              one_page_table_init(pmd);
-+
-+                      vaddr += PMD_SIZE;
-+              }
-+              pmd_idx = 0;
-+      }
-+}
-+
-+static inline int is_kernel_text(unsigned long addr)
-+{
-+      if (addr >= PAGE_OFFSET && addr <= (unsigned long)__init_end)
-+              return 1;
-+      return 0;
-+}
-+
-+/*
-+ * This maps the physical memory to kernel virtual address space, a total 
-+ * of max_low_pfn pages, by creating page tables starting from address 
-+ * PAGE_OFFSET.
-+ */
-+static void __init kernel_physical_mapping_init(pgd_t *pgd_base)
-+{
-+      unsigned long pfn;
-+      pgd_t *pgd;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+      int pgd_idx, pmd_idx, pte_ofs;
-+
-+      unsigned long max_ram_pfn = xen_start_info->nr_pages;
-+      if (max_ram_pfn > max_low_pfn)
-+              max_ram_pfn = max_low_pfn;
-+
-+      pgd_idx = pgd_index(PAGE_OFFSET);
-+      pgd = pgd_base + pgd_idx;
-+      pfn = 0;
-+      pmd_idx = pmd_index(PAGE_OFFSET);
-+      pte_ofs = pte_index(PAGE_OFFSET);
-+
-+      for (; pgd_idx < PTRS_PER_PGD; pgd++, pgd_idx++) {
-+#ifdef CONFIG_XEN
-+              /*
-+               * Native linux hasn't PAE-paging enabled yet at this
-+               * point.  When running as xen domain we are in PAE
-+               * mode already, thus we can't simply hook a empty
-+               * pmd.  That would kill the mappings we are currently
-+               * using ...
-+               */
-+              pmd = pmd_offset(pud_offset(pgd, PAGE_OFFSET), PAGE_OFFSET);
-+#else
-+              pmd = one_md_table_init(pgd);
-+#endif
-+              if (pfn >= max_low_pfn)
-+                      continue;
-+              pmd += pmd_idx;
-+              for (; pmd_idx < PTRS_PER_PMD && pfn < max_low_pfn; pmd++, pmd_idx++) {
-+                      unsigned int address = pfn * PAGE_SIZE + PAGE_OFFSET;
-+                      if (address >= hypervisor_virt_start)
-+                              continue;
-+
-+                      /* Map with big pages if possible, otherwise create normal page tables. */
-+                      if (cpu_has_pse) {
-+                              unsigned int address2 = (pfn + PTRS_PER_PTE - 1) * PAGE_SIZE + PAGE_OFFSET + PAGE_SIZE-1;
-+
-+                              if (is_kernel_text(address) || is_kernel_text(address2))
-+                                      set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE_EXEC));
-+                              else
-+                                      set_pmd(pmd, pfn_pmd(pfn, PAGE_KERNEL_LARGE));
-+                              pfn += PTRS_PER_PTE;
-+                      } else {
-+                              pte = one_page_table_init(pmd);
-+
-+                              pte += pte_ofs;
-+                              for (; pte_ofs < PTRS_PER_PTE && pfn < max_low_pfn; pte++, pfn++, pte_ofs++) {
-+                                              /* XEN: Only map initial RAM allocation. */
-+                                              if ((pfn >= max_ram_pfn) || pte_present(*pte))
-+                                                      continue;
-+                                              if (is_kernel_text(address))
-+                                                      set_pte(pte, pfn_pte(pfn, PAGE_KERNEL_EXEC));
-+                                              else
-+                                                      set_pte(pte, pfn_pte(pfn, PAGE_KERNEL));
-+                              }
-+                              pte_ofs = 0;
-+                      }
-+              }
-+              pmd_idx = 0;
-+      }
-+}
-+
-+#ifndef CONFIG_XEN
-+
-+static inline int page_kills_ppro(unsigned long pagenr)
-+{
-+      if (pagenr >= 0x70000 && pagenr <= 0x7003F)
-+              return 1;
-+      return 0;
-+}
-+
-+#else
-+
-+#define page_kills_ppro(p)    0
-+
-+#endif
-+
-+extern int is_available_memory(efi_memory_desc_t *);
-+
-+int page_is_ram(unsigned long pagenr)
-+{
-+      int i;
-+      unsigned long addr, end;
-+
-+      if (efi_enabled) {
-+              efi_memory_desc_t *md;
-+              void *p;
-+
-+              for (p = memmap.map; p < memmap.map_end; p += memmap.desc_size) {
-+                      md = p;
-+                      if (!is_available_memory(md))
-+                              continue;
-+                      addr = (md->phys_addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-+                      end = (md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT)) >> PAGE_SHIFT;
-+
-+                      if ((pagenr >= addr) && (pagenr < end))
-+                              return 1;
-+              }
-+              return 0;
-+      }
-+
-+      for (i = 0; i < e820.nr_map; i++) {
-+
-+              if (e820.map[i].type != E820_RAM)       /* not usable memory */
-+                      continue;
-+              /*
-+               *      !!!FIXME!!! Some BIOSen report areas as RAM that
-+               *      are not. Notably the 640->1Mb area. We need a sanity
-+               *      check here.
-+               */
-+              addr = (e820.map[i].addr+PAGE_SIZE-1) >> PAGE_SHIFT;
-+              end = (e820.map[i].addr+e820.map[i].size) >> PAGE_SHIFT;
-+              if  ((pagenr >= addr) && (pagenr < end))
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+#ifdef CONFIG_HIGHMEM
-+pte_t *kmap_pte;
-+pgprot_t kmap_prot;
-+
-+#define kmap_get_fixmap_pte(vaddr)                                    \
-+      pte_offset_kernel(pmd_offset(pud_offset(pgd_offset_k(vaddr), vaddr), (vaddr)), (vaddr))
-+
-+static void __init kmap_init(void)
-+{
-+      unsigned long kmap_vstart;
-+
-+      /* cache the first kmap pte */
-+      kmap_vstart = __fix_to_virt(FIX_KMAP_BEGIN);
-+      kmap_pte = kmap_get_fixmap_pte(kmap_vstart);
-+
-+      kmap_prot = PAGE_KERNEL;
-+}
-+
-+static void __init permanent_kmaps_init(pgd_t *pgd_base)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+      unsigned long vaddr;
-+
-+      vaddr = PKMAP_BASE;
-+      page_table_range_init(vaddr, vaddr + PAGE_SIZE*LAST_PKMAP, pgd_base);
-+
-+      pgd = swapper_pg_dir + pgd_index(vaddr);
-+      pud = pud_offset(pgd, vaddr);
-+      pmd = pmd_offset(pud, vaddr);
-+      pte = pte_offset_kernel(pmd, vaddr);
-+      pkmap_page_table = pte; 
-+}
-+
-+static void __meminit free_new_highpage(struct page *page, int pfn)
-+{
-+      init_page_count(page);
-+      if (pfn < xen_start_info->nr_pages)
-+              __free_page(page);
-+      totalhigh_pages++;
-+}
-+
-+void __init add_one_highpage_init(struct page *page, int pfn, int bad_ppro)
-+{
-+      if (page_is_ram(pfn) && !(bad_ppro && page_kills_ppro(pfn))) {
-+              ClearPageReserved(page);
-+              free_new_highpage(page, pfn);
-+      } else
-+              SetPageReserved(page);
-+}
-+
-+static int add_one_highpage_hotplug(struct page *page, unsigned long pfn)
-+{
-+      free_new_highpage(page, pfn);
-+      totalram_pages++;
-+#ifdef CONFIG_FLATMEM
-+      max_mapnr = max(pfn, max_mapnr);
-+#endif
-+      num_physpages++;
-+      return 0;
-+}
-+
-+/*
-+ * Not currently handling the NUMA case.
-+ * Assuming single node and all memory that
-+ * has been added dynamically that would be
-+ * onlined here is in HIGHMEM
-+ */
-+void online_page(struct page *page)
-+{
-+      ClearPageReserved(page);
-+      add_one_highpage_hotplug(page, page_to_pfn(page));
-+}
-+
-+
-+#ifdef CONFIG_NUMA
-+extern void set_highmem_pages_init(int);
-+#else
-+static void __init set_highmem_pages_init(int bad_ppro)
-+{
-+      int pfn;
-+      for (pfn = highstart_pfn; pfn < highend_pfn; pfn++)
-+              add_one_highpage_init(pfn_to_page(pfn), pfn, bad_ppro);
-+      totalram_pages += totalhigh_pages;
-+}
-+#endif /* CONFIG_FLATMEM */
-+
-+#else
-+#define kmap_init() do { } while (0)
-+#define permanent_kmaps_init(pgd_base) do { } while (0)
-+#define set_highmem_pages_init(bad_ppro) do { } while (0)
-+#endif /* CONFIG_HIGHMEM */
-+
-+unsigned long long __PAGE_KERNEL = _PAGE_KERNEL;
-+EXPORT_SYMBOL(__PAGE_KERNEL);
-+unsigned long long __PAGE_KERNEL_EXEC = _PAGE_KERNEL_EXEC;
-+
-+#ifdef CONFIG_NUMA
-+extern void __init remap_numa_kva(void);
-+#else
-+#define remap_numa_kva() do {} while (0)
-+#endif
-+
-+pgd_t *swapper_pg_dir;
-+
-+static void __init pagetable_init (void)
-+{
-+      unsigned long vaddr;
-+      pgd_t *pgd_base = (pgd_t *)xen_start_info->pt_base;
-+
-+      /* Enable PSE if available */
-+      if (cpu_has_pse) {
-+              set_in_cr4(X86_CR4_PSE);
-+      }
-+
-+      /* Enable PGE if available */
-+      if (cpu_has_pge) {
-+              set_in_cr4(X86_CR4_PGE);
-+              __PAGE_KERNEL |= _PAGE_GLOBAL;
-+              __PAGE_KERNEL_EXEC |= _PAGE_GLOBAL;
-+      }
-+
-+      kernel_physical_mapping_init(pgd_base);
-+      remap_numa_kva();
-+
-+      /*
-+       * Fixed mappings, only the page table structure has to be
-+       * created - mappings will be set by set_fixmap():
-+       */
-+      vaddr = __fix_to_virt(__end_of_fixed_addresses - 1) & PMD_MASK;
-+      page_table_range_init(vaddr, hypervisor_virt_start, pgd_base);
-+
-+      permanent_kmaps_init(pgd_base);
-+}
-+
-+#if defined(CONFIG_SOFTWARE_SUSPEND) || defined(CONFIG_ACPI_SLEEP)
-+/*
-+ * Swap suspend & friends need this for resume because things like the intel-agp
-+ * driver might have split up a kernel 4MB mapping.
-+ */
-+char __nosavedata swsusp_pg_dir[PAGE_SIZE]
-+      __attribute__ ((aligned (PAGE_SIZE)));
-+
-+static inline void save_pg_dir(void)
-+{
-+      memcpy(swsusp_pg_dir, swapper_pg_dir, PAGE_SIZE);
-+}
-+#else
-+static inline void save_pg_dir(void)
-+{
-+}
-+#endif
-+
-+void zap_low_mappings (void)
-+{
-+      int i;
-+
-+      save_pg_dir();
-+
-+      /*
-+       * Zap initial low-memory mappings.
-+       *
-+       * Note that "pgd_clear()" doesn't do it for
-+       * us, because pgd_clear() is a no-op on i386.
-+       */
-+      for (i = 0; i < USER_PTRS_PER_PGD; i++)
-+#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
-+              set_pgd(swapper_pg_dir+i, __pgd(1 + __pa(empty_zero_page)));
-+#else
-+              set_pgd(swapper_pg_dir+i, __pgd(0));
-+#endif
-+      flush_tlb_all();
-+}
-+
-+static int disable_nx __initdata = 0;
-+u64 __supported_pte_mask __read_mostly = ~_PAGE_NX;
-+EXPORT_SYMBOL(__supported_pte_mask);
-+
-+/*
-+ * noexec = on|off
-+ *
-+ * Control non executable mappings.
-+ *
-+ * on      Enable
-+ * off     Disable
-+ */
-+void __init noexec_setup(const char *str)
-+{
-+      if (!strncmp(str, "on",2) && cpu_has_nx) {
-+              __supported_pte_mask |= _PAGE_NX;
-+              disable_nx = 0;
-+      } else if (!strncmp(str,"off",3)) {
-+              disable_nx = 1;
-+              __supported_pte_mask &= ~_PAGE_NX;
-+      }
-+}
-+
-+int nx_enabled = 0;
-+#ifdef CONFIG_X86_PAE
-+
-+static void __init set_nx(void)
-+{
-+      unsigned int v[4], l, h;
-+
-+      if (cpu_has_pae && (cpuid_eax(0x80000000) > 0x80000001)) {
-+              cpuid(0x80000001, &v[0], &v[1], &v[2], &v[3]);
-+              if ((v[3] & (1 << 20)) && !disable_nx) {
-+                      rdmsr(MSR_EFER, l, h);
-+                      l |= EFER_NX;
-+                      wrmsr(MSR_EFER, l, h);
-+                      nx_enabled = 1;
-+                      __supported_pte_mask |= _PAGE_NX;
-+              }
-+      }
-+}
-+
-+/*
-+ * Enables/disables executability of a given kernel page and
-+ * returns the previous setting.
-+ */
-+int __init set_kernel_exec(unsigned long vaddr, int enable)
-+{
-+      pte_t *pte;
-+      int ret = 1;
-+
-+      if (!nx_enabled)
-+              goto out;
-+
-+      pte = lookup_address(vaddr);
-+      BUG_ON(!pte);
-+
-+      if (!pte_exec_kernel(*pte))
-+              ret = 0;
-+
-+      if (enable)
-+              pte->pte_high &= ~(1 << (_PAGE_BIT_NX - 32));
-+      else
-+              pte->pte_high |= 1 << (_PAGE_BIT_NX - 32);
-+      __flush_tlb_all();
-+out:
-+      return ret;
-+}
-+
-+#endif
-+
-+/*
-+ * paging_init() sets up the page tables - note that the first 8MB are
-+ * already mapped by head.S.
-+ *
-+ * This routines also unmaps the page at virtual kernel address 0, so
-+ * that we can trap those pesky NULL-reference errors in the kernel.
-+ */
-+void __init paging_init(void)
-+{
-+      int i;
-+
-+#ifdef CONFIG_X86_PAE
-+      set_nx();
-+      if (nx_enabled)
-+              printk("NX (Execute Disable) protection: active\n");
-+#endif
-+
-+      pagetable_init();
-+
-+#if defined(CONFIG_X86_PAE) && !defined(CONFIG_XEN)
-+      /*
-+       * We will bail out later - printk doesn't work right now so
-+       * the user would just see a hanging kernel.
-+       * when running as xen domain we are already in PAE mode at
-+       * this point.
-+       */
-+      if (cpu_has_pae)
-+              set_in_cr4(X86_CR4_PAE);
-+#endif
-+      __flush_tlb_all();
-+
-+      kmap_init();
-+
-+      /* Switch to the real shared_info page, and clear the
-+       * dummy page. */
-+      set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
-+      HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-+      memset(empty_zero_page, 0, sizeof(empty_zero_page));
-+
-+      /* Setup mapping of lower 1st MB */
-+      for (i = 0; i < NR_FIX_ISAMAPS; i++)
-+              if (is_initial_xendomain())
-+                      set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
-+              else
-+                      __set_fixmap(FIX_ISAMAP_BEGIN - i,
-+                                   virt_to_machine(empty_zero_page),
-+                                   PAGE_KERNEL_RO);
-+}
-+
-+/*
-+ * Test if the WP bit works in supervisor mode. It isn't supported on 386's
-+ * and also on some strange 486's (NexGen etc.). All 586+'s are OK. This
-+ * used to involve black magic jumps to work around some nasty CPU bugs,
-+ * but fortunately the switch to using exceptions got rid of all that.
-+ */
-+
-+static void __init test_wp_bit(void)
-+{
-+      printk("Checking if this processor honours the WP bit even in supervisor mode... ");
-+
-+      /* Any page-aligned address will do, the test is non-destructive */
-+      __set_fixmap(FIX_WP_TEST, __pa(&swapper_pg_dir), PAGE_READONLY);
-+      boot_cpu_data.wp_works_ok = do_test_wp_bit();
-+      clear_fixmap(FIX_WP_TEST);
-+
-+      if (!boot_cpu_data.wp_works_ok) {
-+              printk("No.\n");
-+#ifdef CONFIG_X86_WP_WORKS_OK
-+              panic("This kernel doesn't support CPU's with broken WP. Recompile it for a 386!");
-+#endif
-+      } else {
-+              printk("Ok.\n");
-+      }
-+}
-+
-+static void __init set_max_mapnr_init(void)
-+{
-+#ifdef CONFIG_HIGHMEM
-+      num_physpages = highend_pfn;
-+#else
-+      num_physpages = max_low_pfn;
-+#endif
-+#ifdef CONFIG_FLATMEM
-+      max_mapnr = num_physpages;
-+#endif
-+}
-+
-+static struct kcore_list kcore_mem, kcore_vmalloc; 
-+
-+void __init mem_init(void)
-+{
-+      extern int ppro_with_ram_bug(void);
-+      int codesize, reservedpages, datasize, initsize;
-+      int tmp;
-+      int bad_ppro;
-+      unsigned long pfn;
-+
-+#if defined(CONFIG_SWIOTLB)
-+      swiotlb_init(); 
-+#endif
-+
-+#ifdef CONFIG_FLATMEM
-+      if (!mem_map)
-+              BUG();
-+#endif
-+      
-+      bad_ppro = ppro_with_ram_bug();
-+
-+#ifdef CONFIG_HIGHMEM
-+      /* check that fixmap and pkmap do not overlap */
-+      if (PKMAP_BASE+LAST_PKMAP*PAGE_SIZE >= FIXADDR_START) {
-+              printk(KERN_ERR "fixmap and kmap areas overlap - this will crash\n");
-+              printk(KERN_ERR "pkstart: %lxh pkend: %lxh fixstart %lxh\n",
-+                              PKMAP_BASE, PKMAP_BASE+LAST_PKMAP*PAGE_SIZE, FIXADDR_START);
-+              BUG();
-+      }
-+#endif
-+ 
-+      set_max_mapnr_init();
-+
-+#ifdef CONFIG_HIGHMEM
-+      high_memory = (void *) __va(highstart_pfn * PAGE_SIZE - 1) + 1;
-+#else
-+      high_memory = (void *) __va(max_low_pfn * PAGE_SIZE - 1) + 1;
-+#endif
-+      printk("vmalloc area: %lx-%lx, maxmem %lx\n",
-+             VMALLOC_START,VMALLOC_END,MAXMEM);
-+      BUG_ON(VMALLOC_START > VMALLOC_END);
-+      
-+      /* this will put all low memory onto the freelists */
-+      totalram_pages += free_all_bootmem();
-+      /* XEN: init and count low-mem pages outside initial allocation. */
-+      for (pfn = xen_start_info->nr_pages; pfn < max_low_pfn; pfn++) {
-+              ClearPageReserved(pfn_to_page(pfn));
-+              init_page_count(pfn_to_page(pfn));
-+              totalram_pages++;
-+      }
-+
-+      reservedpages = 0;
-+      for (tmp = 0; tmp < max_low_pfn; tmp++)
-+              /*
-+               * Only count reserved RAM pages
-+               */
-+              if (page_is_ram(tmp) && PageReserved(pfn_to_page(tmp)))
-+                      reservedpages++;
-+
-+      set_highmem_pages_init(bad_ppro);
-+
-+      codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-+      datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-+      initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-+
-+      kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 
-+      kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 
-+                 VMALLOC_END-VMALLOC_START);
-+
-+      printk(KERN_INFO "Memory: %luk/%luk available (%dk kernel code, %dk reserved, %dk data, %dk init, %ldk highmem)\n",
-+              (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-+              num_physpages << (PAGE_SHIFT-10),
-+              codesize >> 10,
-+              reservedpages << (PAGE_SHIFT-10),
-+              datasize >> 10,
-+              initsize >> 10,
-+              (unsigned long) (totalhigh_pages << (PAGE_SHIFT-10))
-+             );
-+
-+#ifdef CONFIG_X86_PAE
-+      if (!cpu_has_pae)
-+              panic("cannot execute a PAE-enabled kernel on a PAE-less CPU!");
-+#endif
-+      if (boot_cpu_data.wp_works_ok < 0)
-+              test_wp_bit();
-+
-+      /*
-+       * Subtle. SMP is doing it's boot stuff late (because it has to
-+       * fork idle threads) - but it also needs low mappings for the
-+       * protected-mode entry to work. We zap these entries only after
-+       * the WP-bit has been tested.
-+       */
-+#ifndef CONFIG_SMP
-+      zap_low_mappings();
-+#endif
-+
-+      set_bit(PG_pinned, &virt_to_page(init_mm.pgd)->flags);
-+}
-+
-+/*
-+ * this is for the non-NUMA, single node SMP system case.
-+ * Specifically, in the case of x86, we will always add
-+ * memory to the highmem for now.
-+ */
-+#ifdef CONFIG_MEMORY_HOTPLUG
-+#ifndef CONFIG_NEED_MULTIPLE_NODES
-+int arch_add_memory(int nid, u64 start, u64 size)
-+{
-+      struct pglist_data *pgdata = &contig_page_data;
-+      struct zone *zone = pgdata->node_zones + MAX_NR_ZONES-1;
-+      unsigned long start_pfn = start >> PAGE_SHIFT;
-+      unsigned long nr_pages = size >> PAGE_SHIFT;
-+
-+      return __add_pages(zone, start_pfn, nr_pages);
-+}
-+
-+int remove_memory(u64 start, u64 size)
-+{
-+      return -EINVAL;
-+}
-+#endif
-+#endif
-+
-+kmem_cache_t *pgd_cache;
-+kmem_cache_t *pmd_cache;
-+
-+void __init pgtable_cache_init(void)
-+{
-+      if (PTRS_PER_PMD > 1) {
-+              pmd_cache = kmem_cache_create("pmd",
-+                                      PTRS_PER_PMD*sizeof(pmd_t),
-+                                      PTRS_PER_PMD*sizeof(pmd_t),
-+                                      0,
-+                                      pmd_ctor,
-+                                      NULL);
-+              if (!pmd_cache)
-+                      panic("pgtable_cache_init(): cannot create pmd cache");
-+      }
-+      pgd_cache = kmem_cache_create("pgd",
-+#ifndef CONFIG_XEN
-+                              PTRS_PER_PGD*sizeof(pgd_t),
-+                              PTRS_PER_PGD*sizeof(pgd_t),
-+#else
-+                              PAGE_SIZE,
-+                              PAGE_SIZE,
-+#endif
-+                              0,
-+                              pgd_ctor,
-+                              PTRS_PER_PMD == 1 ? pgd_dtor : NULL);
-+      if (!pgd_cache)
-+              panic("pgtable_cache_init(): Cannot create pgd cache");
-+}
-+
-+/*
-+ * This function cannot be __init, since exceptions don't work in that
-+ * section.  Put this after the callers, so that it cannot be inlined.
-+ */
-+static int noinline do_test_wp_bit(void)
-+{
-+      char tmp_reg;
-+      int flag;
-+
-+      __asm__ __volatile__(
-+              "       movb %0,%1      \n"
-+              "1:     movb %1,%0      \n"
-+              "       xorl %2,%2      \n"
-+              "2:                     \n"
-+              ".section __ex_table,\"a\"\n"
-+              "       .align 4        \n"
-+              "       .long 1b,2b     \n"
-+              ".previous              \n"
-+              :"=m" (*(char *)fix_to_virt(FIX_WP_TEST)),
-+               "=q" (tmp_reg),
-+               "=r" (flag)
-+              :"2" (1)
-+              :"memory");
-+      
-+      return flag;
-+}
-+
-+#ifdef CONFIG_DEBUG_RODATA
-+
-+void mark_rodata_ro(void)
-+{
-+      unsigned long addr = (unsigned long)__start_rodata;
-+
-+      for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
-+              change_page_attr(virt_to_page(addr), 1, PAGE_KERNEL_RO);
-+
-+      printk("Write protecting the kernel read-only data: %uk\n",
-+                      (__end_rodata - __start_rodata) >> 10);
-+
-+      /*
-+       * change_page_attr() requires a global_flush_tlb() call after it.
-+       * We do this after the printk so that if something went wrong in the
-+       * change, the printk gets out at least to give a better debug hint
-+       * of who is the culprit.
-+       */
-+      global_flush_tlb();
-+}
-+#endif
-+
-+void free_init_pages(char *what, unsigned long begin, unsigned long end)
-+{
-+      unsigned long addr;
-+
-+      for (addr = begin; addr < end; addr += PAGE_SIZE) {
-+              ClearPageReserved(virt_to_page(addr));
-+              init_page_count(virt_to_page(addr));
-+              memset((void *)addr, POISON_FREE_INITMEM, PAGE_SIZE);
-+              free_page(addr);
-+              totalram_pages++;
-+      }
-+      printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
-+}
-+
-+void free_initmem(void)
-+{
-+      free_init_pages("unused kernel memory",
-+                      (unsigned long)(&__init_begin),
-+                      (unsigned long)(&__init_end));
-+}
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+void free_initrd_mem(unsigned long start, unsigned long end)
-+{
-+      free_init_pages("initrd memory", start, end);
-+}
-+#endif
-+
-Index: head-2008-11-25/arch/x86/mm/ioremap_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/ioremap_32-xen.c       2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,443 @@
-+/*
-+ * arch/i386/mm/ioremap.c
-+ *
-+ * Re-map IO memory to kernel address space so that we can access it.
-+ * This is needed for high PCI addresses that aren't mapped in the
-+ * 640k-1MB IO memory area on PC's
-+ *
-+ * (C) Copyright 1995 1996 Linus Torvalds
-+ */
-+
-+#include <linux/vmalloc.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/module.h>
-+#include <asm/io.h>
-+#include <asm/fixmap.h>
-+#include <asm/cacheflush.h>
-+#include <asm/tlbflush.h>
-+#include <asm/pgtable.h>
-+#include <asm/pgalloc.h>
-+
-+#define ISA_START_ADDRESS     0x0
-+#define ISA_END_ADDRESS               0x100000
-+
-+static int direct_remap_area_pte_fn(pte_t *pte, 
-+                                  struct page *pmd_page,
-+                                  unsigned long address, 
-+                                  void *data)
-+{
-+      mmu_update_t **v = (mmu_update_t **)data;
-+
-+      BUG_ON(!pte_none(*pte));
-+
-+      (*v)->ptr = ((u64)pfn_to_mfn(page_to_pfn(pmd_page)) <<
-+                   PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
-+      (*v)++;
-+
-+      return 0;
-+}
-+
-+static int __direct_remap_pfn_range(struct mm_struct *mm,
-+                                  unsigned long address, 
-+                                  unsigned long mfn,
-+                                  unsigned long size, 
-+                                  pgprot_t prot,
-+                                  domid_t  domid)
-+{
-+      int rc;
-+      unsigned long i, start_address;
-+      mmu_update_t *u, *v, *w;
-+
-+      u = v = w = (mmu_update_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT);
-+      if (u == NULL)
-+              return -ENOMEM;
-+
-+      start_address = address;
-+
-+      flush_cache_all();
-+
-+      for (i = 0; i < size; i += PAGE_SIZE) {
-+              if ((v - u) == (PAGE_SIZE / sizeof(mmu_update_t))) {
-+                      /* Flush a full batch after filling in the PTE ptrs. */
-+                      rc = apply_to_page_range(mm, start_address, 
-+                                               address - start_address,
-+                                               direct_remap_area_pte_fn, &w);
-+                      if (rc)
-+                              goto out;
-+                      rc = -EFAULT;
-+                      if (HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0)
-+                              goto out;
-+                      v = w = u;
-+                      start_address = address;
-+              }
-+
-+              /*
-+               * Fill in the machine address: PTE ptr is done later by
-+               * apply_to_page_range(). 
-+               */
-+              v->val = __pte_val(pfn_pte_ma(mfn, prot)) | _PAGE_IO;
-+
-+              mfn++;
-+              address += PAGE_SIZE; 
-+              v++;
-+      }
-+
-+      if (v != u) {
-+              /* Final batch. */
-+              rc = apply_to_page_range(mm, start_address,
-+                                       address - start_address,
-+                                       direct_remap_area_pte_fn, &w);
-+              if (rc)
-+                      goto out;
-+              rc = -EFAULT;
-+              if (unlikely(HYPERVISOR_mmu_update(u, v - u, NULL, domid) < 0))
-+                      goto out;
-+      }
-+
-+      rc = 0;
-+
-+ out:
-+      flush_tlb_all();
-+
-+      free_page((unsigned long)u);
-+
-+      return rc;
-+}
-+
-+int direct_remap_pfn_range(struct vm_area_struct *vma,
-+                         unsigned long address, 
-+                         unsigned long mfn,
-+                         unsigned long size, 
-+                         pgprot_t prot,
-+                         domid_t  domid)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return remap_pfn_range(vma, address, mfn, size, prot);
-+
-+      if (domid == DOMID_SELF)
-+              return -EINVAL;
-+
-+      vma->vm_flags |= VM_IO | VM_RESERVED;
-+
-+      vma->vm_mm->context.has_foreign_mappings = 1;
-+
-+      return __direct_remap_pfn_range(
-+              vma->vm_mm, address, mfn, size, prot, domid);
-+}
-+EXPORT_SYMBOL(direct_remap_pfn_range);
-+
-+int direct_kernel_remap_pfn_range(unsigned long address, 
-+                                unsigned long mfn,
-+                                unsigned long size, 
-+                                pgprot_t prot,
-+                                domid_t  domid)
-+{
-+      return __direct_remap_pfn_range(
-+              &init_mm, address, mfn, size, prot, domid);
-+}
-+EXPORT_SYMBOL(direct_kernel_remap_pfn_range);
-+
-+static int lookup_pte_fn(
-+      pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-+{
-+      uint64_t *ptep = (uint64_t *)data;
-+      if (ptep)
-+              *ptep = ((uint64_t)pfn_to_mfn(page_to_pfn(pmd_page)) <<
-+                       PAGE_SHIFT) | ((unsigned long)pte & ~PAGE_MASK);
-+      return 0;
-+}
-+
-+int create_lookup_pte_addr(struct mm_struct *mm, 
-+                         unsigned long address,
-+                         uint64_t *ptep)
-+{
-+      return apply_to_page_range(mm, address, PAGE_SIZE,
-+                                 lookup_pte_fn, ptep);
-+}
-+
-+EXPORT_SYMBOL(create_lookup_pte_addr);
-+
-+static int noop_fn(
-+      pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-+{
-+      return 0;
-+}
-+
-+int touch_pte_range(struct mm_struct *mm,
-+                  unsigned long address,
-+                  unsigned long size)
-+{
-+      return apply_to_page_range(mm, address, size, noop_fn, NULL);
-+} 
-+
-+EXPORT_SYMBOL(touch_pte_range);
-+
-+/*
-+ * Does @address reside within a non-highmem page that is local to this virtual
-+ * machine (i.e., not an I/O page, nor a memory page belonging to another VM).
-+ * See the comment that accompanies mfn_to_local_pfn() in page.h to understand
-+ * why this works.
-+ */
-+static inline int is_local_lowmem(unsigned long address)
-+{
-+      extern unsigned long max_low_pfn;
-+      return (mfn_to_local_pfn(address >> PAGE_SHIFT) < max_low_pfn);
-+}
-+
-+/*
-+ * Generic mapping function (not visible outside):
-+ */
-+
-+/*
-+ * Remap an arbitrary physical address space into the kernel virtual
-+ * address space. Needed when the kernel wants to access high addresses
-+ * directly.
-+ *
-+ * NOTE! We need to allow non-page-aligned mappings too: we will obviously
-+ * have to convert them into an offset in a page-aligned mapping, but the
-+ * caller shouldn't need to know that small detail.
-+ */
-+void __iomem * __ioremap(unsigned long phys_addr, unsigned long size, unsigned long flags)
-+{
-+      void __iomem * addr;
-+      struct vm_struct * area;
-+      unsigned long offset, last_addr;
-+      domid_t domid = DOMID_IO;
-+
-+      /* Don't allow wraparound or zero size */
-+      last_addr = phys_addr + size - 1;
-+      if (!size || last_addr < phys_addr)
-+              return NULL;
-+
-+      /*
-+       * Don't remap the low PCI/ISA area, it's always mapped..
-+       */
-+      if (is_initial_xendomain() &&
-+          phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
-+              return (void __iomem *) isa_bus_to_virt(phys_addr);
-+
-+      /*
-+       * Don't allow anybody to remap normal RAM that we're using..
-+       */
-+      if (is_local_lowmem(phys_addr)) {
-+              char *t_addr, *t_end;
-+              struct page *page;
-+
-+              t_addr = bus_to_virt(phys_addr);
-+              t_end = t_addr + (size - 1);
-+         
-+              for(page = virt_to_page(t_addr); page <= virt_to_page(t_end); page++)
-+                      if(!PageReserved(page))
-+                              return NULL;
-+
-+              domid = DOMID_SELF;
-+      }
-+
-+      /*
-+       * Mappings have to be page-aligned
-+       */
-+      offset = phys_addr & ~PAGE_MASK;
-+      phys_addr &= PAGE_MASK;
-+      size = PAGE_ALIGN(last_addr+1) - phys_addr;
-+
-+      /*
-+       * Ok, go for it..
-+       */
-+      area = get_vm_area(size, VM_IOREMAP | (flags << 20));
-+      if (!area)
-+              return NULL;
-+      area->phys_addr = phys_addr;
-+      addr = (void __iomem *) area->addr;
-+      flags |= _KERNPG_TABLE;
-+      if (__direct_remap_pfn_range(&init_mm, (unsigned long)addr,
-+                                   phys_addr>>PAGE_SHIFT,
-+                                   size, __pgprot(flags), domid)) {
-+              vunmap((void __force *) addr);
-+              return NULL;
-+      }
-+      return (void __iomem *) (offset + (char __iomem *)addr);
-+}
-+EXPORT_SYMBOL(__ioremap);
-+
-+/**
-+ * ioremap_nocache     -   map bus memory into CPU space
-+ * @offset:    bus address of the memory
-+ * @size:      size of the resource to map
-+ *
-+ * ioremap_nocache performs a platform specific sequence of operations to
-+ * make bus memory CPU accessible via the readb/readw/readl/writeb/
-+ * writew/writel functions and the other mmio helpers. The returned
-+ * address is not guaranteed to be usable directly as a virtual
-+ * address. 
-+ *
-+ * This version of ioremap ensures that the memory is marked uncachable
-+ * on the CPU as well as honouring existing caching rules from things like
-+ * the PCI bus. Note that there are other caches and buffers on many 
-+ * busses. In particular driver authors should read up on PCI writes
-+ *
-+ * It's useful if some control registers are in such an area and
-+ * write combining or read caching is not desirable:
-+ * 
-+ * Must be freed with iounmap.
-+ */
-+
-+void __iomem *ioremap_nocache (unsigned long phys_addr, unsigned long size)
-+{
-+      unsigned long last_addr;
-+      void __iomem *p = __ioremap(phys_addr, size, _PAGE_PCD);
-+      if (!p) 
-+              return p; 
-+
-+      /* Guaranteed to be > phys_addr, as per __ioremap() */
-+      last_addr = phys_addr + size - 1;
-+
-+      if (is_local_lowmem(last_addr)) { 
-+              struct page *ppage = virt_to_page(bus_to_virt(phys_addr));
-+              unsigned long npages;
-+
-+              phys_addr &= PAGE_MASK;
-+
-+              /* This might overflow and become zero.. */
-+              last_addr = PAGE_ALIGN(last_addr);
-+
-+              /* .. but that's ok, because modulo-2**n arithmetic will make
-+              * the page-aligned "last - first" come out right.
-+              */
-+              npages = (last_addr - phys_addr) >> PAGE_SHIFT;
-+
-+              if (change_page_attr(ppage, npages, PAGE_KERNEL_NOCACHE) < 0) { 
-+                      iounmap(p); 
-+                      p = NULL;
-+              }
-+              global_flush_tlb();
-+      }
-+
-+      return p;                                       
-+}
-+EXPORT_SYMBOL(ioremap_nocache);
-+
-+/**
-+ * iounmap - Free a IO remapping
-+ * @addr: virtual address from ioremap_*
-+ *
-+ * Caller must ensure there is only one unmapping for the same pointer.
-+ */
-+void iounmap(volatile void __iomem *addr)
-+{
-+      struct vm_struct *p, *o;
-+
-+      if ((void __force *)addr <= high_memory)
-+              return;
-+
-+      /*
-+       * __ioremap special-cases the PCI/ISA range by not instantiating a
-+       * vm_area and by simply returning an address into the kernel mapping
-+       * of ISA space.   So handle that here.
-+       */
-+      if ((unsigned long) addr >= fix_to_virt(FIX_ISAMAP_BEGIN))
-+              return;
-+
-+      addr = (volatile void __iomem *)(PAGE_MASK & (unsigned long __force)addr);
-+
-+      /* Use the vm area unlocked, assuming the caller
-+         ensures there isn't another iounmap for the same address
-+         in parallel. Reuse of the virtual address is prevented by
-+         leaving it in the global lists until we're done with it.
-+         cpa takes care of the direct mappings. */
-+      read_lock(&vmlist_lock);
-+      for (p = vmlist; p; p = p->next) {
-+              if (p->addr == addr)
-+                      break;
-+      }
-+      read_unlock(&vmlist_lock);
-+
-+      if (!p) {
-+              printk("iounmap: bad address %p\n", addr);
-+              dump_stack();
-+              return;
-+      }
-+
-+      /* Reset the direct mapping. Can block */
-+      if ((p->flags >> 20) && is_local_lowmem(p->phys_addr)) {
-+              /* p->size includes the guard page, but cpa doesn't like that */
-+              change_page_attr(virt_to_page(bus_to_virt(p->phys_addr)),
-+                               (p->size - PAGE_SIZE) >> PAGE_SHIFT,
-+                               PAGE_KERNEL);
-+              global_flush_tlb();
-+      } 
-+
-+      /* Finally remove it */
-+      o = remove_vm_area((void *)addr);
-+      BUG_ON(p != o || o == NULL);
-+      kfree(p); 
-+}
-+EXPORT_SYMBOL(iounmap);
-+
-+void __init *bt_ioremap(unsigned long phys_addr, unsigned long size)
-+{
-+      unsigned long offset, last_addr;
-+      unsigned int nrpages;
-+      enum fixed_addresses idx;
-+
-+      /* Don't allow wraparound or zero size */
-+      last_addr = phys_addr + size - 1;
-+      if (!size || last_addr < phys_addr)
-+              return NULL;
-+
-+      /*
-+       * Don't remap the low PCI/ISA area, it's always mapped..
-+       */
-+      if (is_initial_xendomain() &&
-+          phys_addr >= ISA_START_ADDRESS && last_addr < ISA_END_ADDRESS)
-+              return isa_bus_to_virt(phys_addr);
-+
-+      /*
-+       * Mappings have to be page-aligned
-+       */
-+      offset = phys_addr & ~PAGE_MASK;
-+      phys_addr &= PAGE_MASK;
-+      size = PAGE_ALIGN(last_addr) - phys_addr;
-+
-+      /*
-+       * Mappings have to fit in the FIX_BTMAP area.
-+       */
-+      nrpages = size >> PAGE_SHIFT;
-+      if (nrpages > NR_FIX_BTMAPS)
-+              return NULL;
-+
-+      /*
-+       * Ok, go for it..
-+       */
-+      idx = FIX_BTMAP_BEGIN;
-+      while (nrpages > 0) {
-+              set_fixmap(idx, phys_addr);
-+              phys_addr += PAGE_SIZE;
-+              --idx;
-+              --nrpages;
-+      }
-+      return (void*) (offset + fix_to_virt(FIX_BTMAP_BEGIN));
-+}
-+
-+void __init bt_iounmap(void *addr, unsigned long size)
-+{
-+      unsigned long virt_addr;
-+      unsigned long offset;
-+      unsigned int nrpages;
-+      enum fixed_addresses idx;
-+
-+      virt_addr = (unsigned long)addr;
-+      if (virt_addr < fix_to_virt(FIX_BTMAP_BEGIN))
-+              return;
-+      if (virt_addr >= fix_to_virt(FIX_ISAMAP_BEGIN))
-+              return;
-+      offset = virt_addr & ~PAGE_MASK;
-+      nrpages = PAGE_ALIGN(offset + size - 1) >> PAGE_SHIFT;
-+
-+      idx = FIX_BTMAP_BEGIN;
-+      while (nrpages > 0) {
-+              clear_fixmap(idx);
-+              --idx;
-+              --nrpages;
-+      }
-+}
-Index: head-2008-11-25/arch/x86/mm/pgtable_32-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/pgtable_32-xen.c       2007-10-09 11:48:25.000000000 +0200
-@@ -0,0 +1,725 @@
-+/*
-+ *  linux/arch/i386/mm/pgtable.c
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/swap.h>
-+#include <linux/smp.h>
-+#include <linux/highmem.h>
-+#include <linux/slab.h>
-+#include <linux/pagemap.h>
-+#include <linux/spinlock.h>
-+#include <linux/module.h>
-+
-+#include <asm/system.h>
-+#include <asm/pgtable.h>
-+#include <asm/pgalloc.h>
-+#include <asm/fixmap.h>
-+#include <asm/e820.h>
-+#include <asm/tlb.h>
-+#include <asm/tlbflush.h>
-+#include <asm/io.h>
-+#include <asm/mmu_context.h>
-+
-+#include <xen/features.h>
-+#include <asm/hypervisor.h>
-+
-+static void pgd_test_and_unpin(pgd_t *pgd);
-+
-+void show_mem(void)
-+{
-+      int total = 0, reserved = 0;
-+      int shared = 0, cached = 0;
-+      int highmem = 0;
-+      struct page *page;
-+      pg_data_t *pgdat;
-+      unsigned long i;
-+      unsigned long flags;
-+
-+      printk(KERN_INFO "Mem-info:\n");
-+      show_free_areas();
-+      printk(KERN_INFO "Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-+      for_each_online_pgdat(pgdat) {
-+              pgdat_resize_lock(pgdat, &flags);
-+              for (i = 0; i < pgdat->node_spanned_pages; ++i) {
-+                      page = pgdat_page_nr(pgdat, i);
-+                      total++;
-+                      if (PageHighMem(page))
-+                              highmem++;
-+                      if (PageReserved(page))
-+                              reserved++;
-+                      else if (PageSwapCache(page))
-+                              cached++;
-+                      else if (page_count(page))
-+                              shared += page_count(page) - 1;
-+              }
-+              pgdat_resize_unlock(pgdat, &flags);
-+      }
-+      printk(KERN_INFO "%d pages of RAM\n", total);
-+      printk(KERN_INFO "%d pages of HIGHMEM\n", highmem);
-+      printk(KERN_INFO "%d reserved pages\n", reserved);
-+      printk(KERN_INFO "%d pages shared\n", shared);
-+      printk(KERN_INFO "%d pages swap cached\n", cached);
-+
-+      printk(KERN_INFO "%lu pages dirty\n", global_page_state(NR_FILE_DIRTY));
-+      printk(KERN_INFO "%lu pages writeback\n",
-+                                      global_page_state(NR_WRITEBACK));
-+      printk(KERN_INFO "%lu pages mapped\n", global_page_state(NR_FILE_MAPPED));
-+      printk(KERN_INFO "%lu pages slab\n", global_page_state(NR_SLAB));
-+      printk(KERN_INFO "%lu pages pagetables\n",
-+                                      global_page_state(NR_PAGETABLE));
-+}
-+
-+/*
-+ * Associate a large virtual page frame with a given physical page frame 
-+ * and protection flags for that frame. pfn is for the base of the page,
-+ * vaddr is what the page gets mapped to - both must be properly aligned. 
-+ * The pmd must already be instantiated. Assumes PAE mode.
-+ */ 
-+void set_pmd_pfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+
-+      if (vaddr & (PMD_SIZE-1)) {             /* vaddr is misaligned */
-+              printk(KERN_WARNING "set_pmd_pfn: vaddr misaligned\n");
-+              return; /* BUG(); */
-+      }
-+      if (pfn & (PTRS_PER_PTE-1)) {           /* pfn is misaligned */
-+              printk(KERN_WARNING "set_pmd_pfn: pfn misaligned\n");
-+              return; /* BUG(); */
-+      }
-+      pgd = swapper_pg_dir + pgd_index(vaddr);
-+      if (pgd_none(*pgd)) {
-+              printk(KERN_WARNING "set_pmd_pfn: pgd_none\n");
-+              return; /* BUG(); */
-+      }
-+      pud = pud_offset(pgd, vaddr);
-+      pmd = pmd_offset(pud, vaddr);
-+      set_pmd(pmd, pfn_pmd(pfn, flags));
-+      /*
-+       * It's enough to flush this one mapping.
-+       * (PGE mappings get flushed as well)
-+       */
-+      __flush_tlb_one(vaddr);
-+}
-+
-+static int nr_fixmaps = 0;
-+unsigned long hypervisor_virt_start = HYPERVISOR_VIRT_START;
-+unsigned long __FIXADDR_TOP = (HYPERVISOR_VIRT_START - 2 * PAGE_SIZE);
-+EXPORT_SYMBOL(__FIXADDR_TOP);
-+
-+void __init set_fixaddr_top(unsigned long top)
-+{
-+      BUG_ON(nr_fixmaps > 0);
-+      hypervisor_virt_start = top;
-+      __FIXADDR_TOP = hypervisor_virt_start - 2 * PAGE_SIZE;
-+}
-+
-+void __set_fixmap (enum fixed_addresses idx, maddr_t phys, pgprot_t flags)
-+{
-+      unsigned long address = __fix_to_virt(idx);
-+      pte_t pte;
-+
-+      if (idx >= __end_of_fixed_addresses) {
-+              BUG();
-+              return;
-+      }
-+      switch (idx) {
-+      case FIX_WP_TEST:
-+      case FIX_VDSO:
-+              pte = pfn_pte(phys >> PAGE_SHIFT, flags);
-+              break;
-+      default:
-+              pte = pfn_pte_ma(phys >> PAGE_SHIFT, flags);
-+              break;
-+      }
-+      if (HYPERVISOR_update_va_mapping(address, pte,
-+                                       UVMF_INVLPG|UVMF_ALL))
-+              BUG();
-+      nr_fixmaps++;
-+}
-+
-+pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
-+{
-+      pte_t *pte = (pte_t *)__get_free_page(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO);
-+      if (pte)
-+              make_lowmem_page_readonly(pte, XENFEAT_writable_page_tables);
-+      return pte;
-+}
-+
-+struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-+{
-+      struct page *pte;
-+
-+#ifdef CONFIG_HIGHPTE
-+      pte = alloc_pages(GFP_KERNEL|__GFP_HIGHMEM|__GFP_REPEAT|__GFP_ZERO, 0);
-+#else
-+      pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
-+#endif
-+      if (pte) {
-+              SetPageForeign(pte, pte_free);
-+              init_page_count(pte);
-+      }
-+      return pte;
-+}
-+
-+void pte_free(struct page *pte)
-+{
-+      unsigned long pfn = page_to_pfn(pte);
-+
-+      if (!PageHighMem(pte)) {
-+              unsigned long va = (unsigned long)__va(pfn << PAGE_SHIFT);
-+
-+              if (!pte_write(*virt_to_ptep(va)))
-+                      if (HYPERVISOR_update_va_mapping(
-+                              va, pfn_pte(pfn, PAGE_KERNEL), 0))
-+                              BUG();
-+      } else
-+              clear_bit(PG_pinned, &pte->flags);
-+
-+      ClearPageForeign(pte);
-+      init_page_count(pte);
-+
-+      __free_page(pte);
-+}
-+
-+void pmd_ctor(void *pmd, kmem_cache_t *cache, unsigned long flags)
-+{
-+      memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-+}
-+
-+/*
-+ * List of all pgd's needed for non-PAE so it can invalidate entries
-+ * in both cached and uncached pgd's; not needed for PAE since the
-+ * kernel pmd is shared. If PAE were not to share the pmd a similar
-+ * tactic would be needed. This is essentially codepath-based locking
-+ * against pageattr.c; it is the unique case in which a valid change
-+ * of kernel pagetables can't be lazily synchronized by vmalloc faults.
-+ * vmalloc faults work because attached pagetables are never freed.
-+ * The locking scheme was chosen on the basis of manfred's
-+ * recommendations and having no core impact whatsoever.
-+ * -- wli
-+ */
-+DEFINE_SPINLOCK(pgd_lock);
-+struct page *pgd_list;
-+
-+static inline void pgd_list_add(pgd_t *pgd)
-+{
-+      struct page *page = virt_to_page(pgd);
-+      page->index = (unsigned long)pgd_list;
-+      if (pgd_list)
-+              set_page_private(pgd_list, (unsigned long)&page->index);
-+      pgd_list = page;
-+      set_page_private(page, (unsigned long)&pgd_list);
-+}
-+
-+static inline void pgd_list_del(pgd_t *pgd)
-+{
-+      struct page *next, **pprev, *page = virt_to_page(pgd);
-+      next = (struct page *)page->index;
-+      pprev = (struct page **)page_private(page);
-+      *pprev = next;
-+      if (next)
-+              set_page_private(next, (unsigned long)pprev);
-+}
-+
-+void pgd_ctor(void *pgd, kmem_cache_t *cache, unsigned long unused)
-+{
-+      unsigned long flags;
-+
-+      if (PTRS_PER_PMD > 1) {
-+              if (HAVE_SHARED_KERNEL_PMD)
-+                      clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-+                                      swapper_pg_dir + USER_PTRS_PER_PGD,
-+                                      KERNEL_PGD_PTRS);
-+      } else {
-+              spin_lock_irqsave(&pgd_lock, flags);
-+              clone_pgd_range((pgd_t *)pgd + USER_PTRS_PER_PGD,
-+                              swapper_pg_dir + USER_PTRS_PER_PGD,
-+                              KERNEL_PGD_PTRS);
-+              memset(pgd, 0, USER_PTRS_PER_PGD*sizeof(pgd_t));
-+              pgd_list_add(pgd);
-+              spin_unlock_irqrestore(&pgd_lock, flags);
-+      }
-+}
-+
-+/* never called when PTRS_PER_PMD > 1 */
-+void pgd_dtor(void *pgd, kmem_cache_t *cache, unsigned long unused)
-+{
-+      unsigned long flags; /* can be called from interrupt context */
-+
-+      spin_lock_irqsave(&pgd_lock, flags);
-+      pgd_list_del(pgd);
-+      spin_unlock_irqrestore(&pgd_lock, flags);
-+
-+      pgd_test_and_unpin(pgd);
-+}
-+
-+pgd_t *pgd_alloc(struct mm_struct *mm)
-+{
-+      int i;
-+      pgd_t *pgd = kmem_cache_alloc(pgd_cache, GFP_KERNEL);
-+      pmd_t **pmd;
-+      unsigned long flags;
-+
-+      pgd_test_and_unpin(pgd);
-+
-+      if (PTRS_PER_PMD == 1 || !pgd)
-+              return pgd;
-+
-+      if (HAVE_SHARED_KERNEL_PMD) {
-+              for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+                      pmd_t *pmd = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+                      if (!pmd)
-+                              goto out_oom;
-+                      set_pgd(&pgd[i], __pgd(1 + __pa(pmd)));
-+              }
-+              return pgd;
-+      }
-+
-+      /*
-+       * We can race save/restore (if we sleep during a GFP_KERNEL memory
-+       * allocation). We therefore store virtual addresses of pmds as they
-+       * do not change across save/restore, and poke the machine addresses
-+       * into the pgdir under the pgd_lock.
-+       */
-+      pmd = kmalloc(PTRS_PER_PGD * sizeof(pmd_t *), GFP_KERNEL);
-+      if (!pmd) {
-+              kmem_cache_free(pgd_cache, pgd);
-+              return NULL;
-+      }
-+
-+      /* Allocate pmds, remember virtual addresses. */
-+      for (i = 0; i < PTRS_PER_PGD; ++i) {
-+              pmd[i] = kmem_cache_alloc(pmd_cache, GFP_KERNEL);
-+              if (!pmd[i])
-+                      goto out_oom;
-+      }
-+
-+      spin_lock_irqsave(&pgd_lock, flags);
-+
-+      /* Protect against save/restore: move below 4GB under pgd_lock. */
-+      if (!xen_feature(XENFEAT_pae_pgdir_above_4gb)) {
-+              int rc = xen_create_contiguous_region(
-+                      (unsigned long)pgd, 0, 32);
-+              if (rc) {
-+                      spin_unlock_irqrestore(&pgd_lock, flags);
-+                      goto out_oom;
-+              }
-+      }
-+
-+      /* Copy kernel pmd contents and write-protect the new pmds. */
-+      for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+              unsigned long v = (unsigned long)i << PGDIR_SHIFT;
-+              pgd_t *kpgd = pgd_offset_k(v);
-+              pud_t *kpud = pud_offset(kpgd, v);
-+              pmd_t *kpmd = pmd_offset(kpud, v);
-+              memcpy(pmd[i], kpmd, PAGE_SIZE);
-+              make_lowmem_page_readonly(
-+                      pmd[i], XENFEAT_writable_page_tables);
-+      }
-+
-+      /* It is safe to poke machine addresses of pmds under the pmd_lock. */
-+      for (i = 0; i < PTRS_PER_PGD; i++)
-+              set_pgd(&pgd[i], __pgd(1 + __pa(pmd[i])));
-+
-+      /* Ensure this pgd gets picked up and pinned on save/restore. */
-+      pgd_list_add(pgd);
-+
-+      spin_unlock_irqrestore(&pgd_lock, flags);
-+
-+      kfree(pmd);
-+
-+      return pgd;
-+
-+out_oom:
-+      if (HAVE_SHARED_KERNEL_PMD) {
-+              for (i--; i >= 0; i--)
-+                      kmem_cache_free(pmd_cache,
-+                                      (void *)__va(pgd_val(pgd[i])-1));
-+      } else {
-+              for (i--; i >= 0; i--)
-+                      kmem_cache_free(pmd_cache, pmd[i]);
-+              kfree(pmd);
-+      }
-+      kmem_cache_free(pgd_cache, pgd);
-+      return NULL;
-+}
-+
-+void pgd_free(pgd_t *pgd)
-+{
-+      int i;
-+
-+      /*
-+       * After this the pgd should not be pinned for the duration of this
-+       * function's execution. We should never sleep and thus never race:
-+       *  1. User pmds will not become write-protected under our feet due
-+       *     to a concurrent mm_pin_all().
-+       *  2. The machine addresses in PGD entries will not become invalid
-+       *     due to a concurrent save/restore.
-+       */
-+      pgd_test_and_unpin(pgd);
-+
-+      /* in the PAE case user pgd entries are overwritten before usage */
-+      if (PTRS_PER_PMD > 1) {
-+              for (i = 0; i < USER_PTRS_PER_PGD; ++i) {
-+                      pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                      kmem_cache_free(pmd_cache, pmd);
-+              }
-+
-+              if (!HAVE_SHARED_KERNEL_PMD) {
-+                      unsigned long flags;
-+                      spin_lock_irqsave(&pgd_lock, flags);
-+                      pgd_list_del(pgd);
-+                      spin_unlock_irqrestore(&pgd_lock, flags);
-+
-+                      for (i = USER_PTRS_PER_PGD; i < PTRS_PER_PGD; i++) {
-+                              pmd_t *pmd = (void *)__va(pgd_val(pgd[i])-1);
-+                              make_lowmem_page_writable(
-+                                      pmd, XENFEAT_writable_page_tables);
-+                              memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
-+                              kmem_cache_free(pmd_cache, pmd);
-+                      }
-+
-+                      if (!xen_feature(XENFEAT_pae_pgdir_above_4gb))
-+                              xen_destroy_contiguous_region(
-+                                      (unsigned long)pgd, 0);
-+              }
-+      }
-+
-+      /* in the non-PAE case, free_pgtables() clears user pgd entries */
-+      kmem_cache_free(pgd_cache, pgd);
-+}
-+
-+void make_lowmem_page_readonly(void *va, unsigned int feature)
-+{
-+      pte_t *pte;
-+      int rc;
-+
-+      if (xen_feature(feature))
-+              return;
-+
-+      pte = virt_to_ptep(va);
-+      rc = HYPERVISOR_update_va_mapping(
-+              (unsigned long)va, pte_wrprotect(*pte), 0);
-+      BUG_ON(rc);
-+}
-+
-+void make_lowmem_page_writable(void *va, unsigned int feature)
-+{
-+      pte_t *pte;
-+      int rc;
-+
-+      if (xen_feature(feature))
-+              return;
-+
-+      pte = virt_to_ptep(va);
-+      rc = HYPERVISOR_update_va_mapping(
-+              (unsigned long)va, pte_mkwrite(*pte), 0);
-+      BUG_ON(rc);
-+}
-+
-+void make_page_readonly(void *va, unsigned int feature)
-+{
-+      pte_t *pte;
-+      int rc;
-+
-+      if (xen_feature(feature))
-+              return;
-+
-+      pte = virt_to_ptep(va);
-+      rc = HYPERVISOR_update_va_mapping(
-+              (unsigned long)va, pte_wrprotect(*pte), 0);
-+      if (rc) /* fallback? */
-+              xen_l1_entry_update(pte, pte_wrprotect(*pte));
-+      if ((unsigned long)va >= (unsigned long)high_memory) {
-+              unsigned long pfn = pte_pfn(*pte);
-+#ifdef CONFIG_HIGHMEM
-+              if (pfn >= highstart_pfn)
-+                      kmap_flush_unused(); /* flush stale writable kmaps */
-+              else
-+#endif
-+                      make_lowmem_page_readonly(
-+                              phys_to_virt(pfn << PAGE_SHIFT), feature); 
-+      }
-+}
-+
-+void make_page_writable(void *va, unsigned int feature)
-+{
-+      pte_t *pte;
-+      int rc;
-+
-+      if (xen_feature(feature))
-+              return;
-+
-+      pte = virt_to_ptep(va);
-+      rc = HYPERVISOR_update_va_mapping(
-+              (unsigned long)va, pte_mkwrite(*pte), 0);
-+      if (rc) /* fallback? */
-+              xen_l1_entry_update(pte, pte_mkwrite(*pte));
-+      if ((unsigned long)va >= (unsigned long)high_memory) {
-+              unsigned long pfn = pte_pfn(*pte); 
-+#ifdef CONFIG_HIGHMEM
-+              if (pfn < highstart_pfn)
-+#endif
-+                      make_lowmem_page_writable(
-+                              phys_to_virt(pfn << PAGE_SHIFT), feature);
-+      }
-+}
-+
-+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature)
-+{
-+      if (xen_feature(feature))
-+              return;
-+
-+      while (nr-- != 0) {
-+              make_page_readonly(va, feature);
-+              va = (void *)((unsigned long)va + PAGE_SIZE);
-+      }
-+}
-+
-+void make_pages_writable(void *va, unsigned int nr, unsigned int feature)
-+{
-+      if (xen_feature(feature))
-+              return;
-+
-+      while (nr-- != 0) {
-+              make_page_writable(va, feature);
-+              va = (void *)((unsigned long)va + PAGE_SIZE);
-+      }
-+}
-+
-+static void _pin_lock(struct mm_struct *mm, int lock) {
-+      if (lock)
-+              spin_lock(&mm->page_table_lock);
-+#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
-+      /* While mm->page_table_lock protects us against insertions and
-+       * removals of higher level page table pages, it doesn't protect
-+       * against updates of pte-s. Such updates, however, require the
-+       * pte pages to be in consistent state (unpinned+writable or
-+       * pinned+readonly). The pinning and attribute changes, however
-+       * cannot be done atomically, which is why such updates must be
-+       * prevented from happening concurrently.
-+       * Note that no pte lock can ever elsewhere be acquired nesting
-+       * with an already acquired one in the same mm, or with the mm's
-+       * page_table_lock already acquired, as that would break in the
-+       * non-split case (where all these are actually resolving to the
-+       * one page_table_lock). Thus acquiring all of them here is not
-+       * going to result in dead locks, and the order of acquires
-+       * doesn't matter.
-+       */
-+      {
-+              pgd_t *pgd = mm->pgd;
-+              unsigned g;
-+
-+              for (g = 0; g < USER_PTRS_PER_PGD; g++, pgd++) {
-+                      pud_t *pud;
-+                      unsigned u;
-+
-+                      if (pgd_none(*pgd))
-+                              continue;
-+                      pud = pud_offset(pgd, 0);
-+                      for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-+                              pmd_t *pmd;
-+                              unsigned m;
-+
-+                              if (pud_none(*pud))
-+                                      continue;
-+                              pmd = pmd_offset(pud, 0);
-+                              for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-+                                      spinlock_t *ptl;
-+
-+                                      if (pmd_none(*pmd))
-+                                              continue;
-+                                      ptl = pte_lockptr(0, pmd);
-+                                      if (lock)
-+                                              spin_lock(ptl);
-+                                      else
-+                                              spin_unlock(ptl);
-+                              }
-+                      }
-+              }
-+      }
-+#endif
-+      if (!lock)
-+              spin_unlock(&mm->page_table_lock);
-+}
-+#define pin_lock(mm) _pin_lock(mm, 1)
-+#define pin_unlock(mm) _pin_lock(mm, 0)
-+
-+#define PIN_BATCH 4
-+static DEFINE_PER_CPU(multicall_entry_t[PIN_BATCH], pb_mcl);
-+
-+static inline unsigned int pgd_walk_set_prot(struct page *page, pgprot_t flags,
-+                                             unsigned int cpu, unsigned seq)
-+{
-+      unsigned long pfn = page_to_pfn(page);
-+
-+      if (PageHighMem(page)) {
-+              if (pgprot_val(flags) & _PAGE_RW)
-+                      clear_bit(PG_pinned, &page->flags);
-+              else
-+                      set_bit(PG_pinned, &page->flags);
-+      } else {
-+              MULTI_update_va_mapping(per_cpu(pb_mcl, cpu) + seq,
-+                              (unsigned long)__va(pfn << PAGE_SHIFT),
-+                              pfn_pte(pfn, flags), 0);
-+              if (unlikely(++seq == PIN_BATCH)) {
-+                      if (unlikely(HYPERVISOR_multicall_check(per_cpu(pb_mcl, cpu),
-+                                                              PIN_BATCH, NULL)))
-+                              BUG();
-+                      seq = 0;
-+              }
-+      }
-+
-+      return seq;
-+}
-+
-+static void pgd_walk(pgd_t *pgd_base, pgprot_t flags)
-+{
-+      pgd_t *pgd = pgd_base;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      int    g, u, m;
-+      unsigned int cpu, seq;
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return;
-+
-+      cpu = get_cpu();
-+
-+      for (g = 0, seq = 0; g < USER_PTRS_PER_PGD; g++, pgd++) {
-+              if (pgd_none(*pgd))
-+                      continue;
-+              pud = pud_offset(pgd, 0);
-+              if (PTRS_PER_PUD > 1) /* not folded */
-+                      seq = pgd_walk_set_prot(virt_to_page(pud),flags,cpu,seq);
-+              for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-+                      if (pud_none(*pud))
-+                              continue;
-+                      pmd = pmd_offset(pud, 0);
-+                      if (PTRS_PER_PMD > 1) /* not folded */
-+                              seq = pgd_walk_set_prot(virt_to_page(pmd),flags,cpu,seq);
-+                      for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-+                              if (pmd_none(*pmd))
-+                                      continue;
-+                              seq = pgd_walk_set_prot(pmd_page(*pmd),flags,cpu,seq);
-+                      }
-+              }
-+      }
-+
-+      if (likely(seq != 0)) {
-+              MULTI_update_va_mapping(per_cpu(pb_mcl, cpu) + seq,
-+                      (unsigned long)pgd_base,
-+                      pfn_pte(virt_to_phys(pgd_base)>>PAGE_SHIFT, flags),
-+                      UVMF_TLB_FLUSH);
-+              if (unlikely(HYPERVISOR_multicall_check(per_cpu(pb_mcl, cpu),
-+                                                      seq + 1, NULL)))
-+                      BUG();
-+      } else if(HYPERVISOR_update_va_mapping((unsigned long)pgd_base,
-+                      pfn_pte(virt_to_phys(pgd_base)>>PAGE_SHIFT, flags),
-+                      UVMF_TLB_FLUSH))
-+              BUG();
-+
-+      put_cpu();
-+}
-+
-+static void __pgd_pin(pgd_t *pgd)
-+{
-+      pgd_walk(pgd, PAGE_KERNEL_RO);
-+      kmap_flush_unused();
-+      xen_pgd_pin(__pa(pgd));
-+      set_bit(PG_pinned, &virt_to_page(pgd)->flags);
-+}
-+
-+static void __pgd_unpin(pgd_t *pgd)
-+{
-+      xen_pgd_unpin(__pa(pgd));
-+      pgd_walk(pgd, PAGE_KERNEL);
-+      clear_bit(PG_pinned, &virt_to_page(pgd)->flags);
-+}
-+
-+static void pgd_test_and_unpin(pgd_t *pgd)
-+{
-+      if (test_bit(PG_pinned, &virt_to_page(pgd)->flags))
-+              __pgd_unpin(pgd);
-+}
-+
-+void mm_pin(struct mm_struct *mm)
-+{
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+      pin_lock(mm);
-+      __pgd_pin(mm->pgd);
-+      pin_unlock(mm);
-+}
-+
-+void mm_unpin(struct mm_struct *mm)
-+{
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+      pin_lock(mm);
-+      __pgd_unpin(mm->pgd);
-+      pin_unlock(mm);
-+}
-+
-+void mm_pin_all(void)
-+{
-+      struct page *page;
-+      unsigned long flags;
-+
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+
-+      /*
-+       * Allow uninterrupted access to the pgd_list. Also protects
-+       * __pgd_pin() by disabling preemption.
-+       * All other CPUs must be at a safe point (e.g., in stop_machine
-+       * or offlined entirely).
-+       */
-+      spin_lock_irqsave(&pgd_lock, flags);
-+      for (page = pgd_list; page; page = (struct page *)page->index) {
-+              if (!test_bit(PG_pinned, &page->flags))
-+                      __pgd_pin((pgd_t *)page_address(page));
-+      }
-+      spin_unlock_irqrestore(&pgd_lock, flags);
-+}
-+
-+void _arch_dup_mmap(struct mm_struct *mm)
-+{
-+      if (!test_bit(PG_pinned, &virt_to_page(mm->pgd)->flags))
-+              mm_pin(mm);
-+}
-+
-+void _arch_exit_mmap(struct mm_struct *mm)
-+{
-+      struct task_struct *tsk = current;
-+
-+      task_lock(tsk);
-+
-+      /*
-+       * We aggressively remove defunct pgd from cr3. We execute unmap_vmas()
-+       * *much* faster this way, as no tlb flushes means bigger wrpt batches.
-+       */
-+      if (tsk->active_mm == mm) {
-+              tsk->active_mm = &init_mm;
-+              atomic_inc(&init_mm.mm_count);
-+
-+              switch_mm(mm, &init_mm, tsk);
-+
-+              atomic_dec(&mm->mm_count);
-+              BUG_ON(atomic_read(&mm->mm_count) == 0);
-+      }
-+
-+      task_unlock(tsk);
-+
-+      if (test_bit(PG_pinned, &virt_to_page(mm->pgd)->flags) &&
-+          (atomic_read(&mm->mm_count) == 1) &&
-+          !mm->context.has_foreign_mappings)
-+              mm_unpin(mm);
-+}
-Index: head-2008-11-25/arch/x86/oprofile/xenoprof.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/oprofile/xenoprof.c       2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,179 @@
-+/**
-+ * @file xenoprof.c
-+ *
-+ * @remark Copyright 2002 OProfile authors
-+ * @remark Read the file COPYING
-+ *
-+ * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon and Jose Renato Santos for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-+ * x86-specific part
-+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
-+ *                    VA Linux Systems Japan K.K.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/oprofile.h>
-+#include <linux/sched.h>
-+#include <asm/pgtable.h>
-+
-+#include <xen/driver_util.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/xenoprof.h>
-+#include <xen/xenoprof.h>
-+#include "op_counter.h"
-+
-+static unsigned int num_events = 0;
-+
-+void __init xenoprof_arch_init_counter(struct xenoprof_init *init)
-+{
-+      num_events = init->num_events;
-+      /* just in case - make sure we do not overflow event list 
-+         (i.e. counter_config list) */
-+      if (num_events > OP_MAX_COUNTER) {
-+              num_events = OP_MAX_COUNTER;
-+              init->num_events = num_events;
-+      }
-+}
-+
-+void xenoprof_arch_counter(void)
-+{
-+      int i;
-+      struct xenoprof_counter counter;
-+
-+      for (i=0; i<num_events; i++) {
-+              counter.ind       = i;
-+              counter.count     = (uint64_t)counter_config[i].count;
-+              counter.enabled   = (uint32_t)counter_config[i].enabled;
-+              counter.event     = (uint32_t)counter_config[i].event;
-+              counter.kernel    = (uint32_t)counter_config[i].kernel;
-+              counter.user      = (uint32_t)counter_config[i].user;
-+              counter.unit_mask = (uint64_t)counter_config[i].unit_mask;
-+              WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_counter,
-+                                             &counter));
-+      }
-+}
-+
-+void xenoprof_arch_start(void) 
-+{
-+      /* nothing */
-+}
-+
-+void xenoprof_arch_stop(void)
-+{
-+      /* nothing */
-+}
-+
-+void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer * sbuf)
-+{
-+      if (sbuf->buffer) {
-+              vunmap(sbuf->buffer);
-+              sbuf->buffer = NULL;
-+      }
-+}
-+
-+int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer * get_buffer,
-+                                  struct xenoprof_shared_buffer * sbuf)
-+{
-+      int npages, ret;
-+      struct vm_struct *area;
-+
-+      sbuf->buffer = NULL;
-+      if ( (ret = HYPERVISOR_xenoprof_op(XENOPROF_get_buffer, get_buffer)) )
-+              return ret;
-+
-+      npages = (get_buffer->bufsize * get_buffer->nbuf - 1) / PAGE_SIZE + 1;
-+
-+      area = alloc_vm_area(npages * PAGE_SIZE);
-+      if (area == NULL)
-+              return -ENOMEM;
-+
-+      if ( (ret = direct_kernel_remap_pfn_range(
-+                    (unsigned long)area->addr,
-+                    get_buffer->buf_gmaddr >> PAGE_SHIFT,
-+                    npages * PAGE_SIZE, __pgprot(_KERNPG_TABLE),
-+                    DOMID_SELF)) ) {
-+              vunmap(area->addr);
-+              return ret;
-+      }
-+
-+      sbuf->buffer = area->addr;
-+      return ret;
-+}
-+
-+int xenoprof_arch_set_passive(struct xenoprof_passive * pdomain,
-+                            struct xenoprof_shared_buffer * sbuf)
-+{
-+      int ret;
-+      int npages;
-+      struct vm_struct *area;
-+      pgprot_t prot = __pgprot(_KERNPG_TABLE);
-+
-+      sbuf->buffer = NULL;
-+      ret = HYPERVISOR_xenoprof_op(XENOPROF_set_passive, pdomain);
-+      if (ret)
-+              goto out;
-+
-+      npages = (pdomain->bufsize * pdomain->nbuf - 1) / PAGE_SIZE + 1;
-+
-+      area = alloc_vm_area(npages * PAGE_SIZE);
-+      if (area == NULL) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      ret = direct_kernel_remap_pfn_range(
-+              (unsigned long)area->addr,
-+              pdomain->buf_gmaddr >> PAGE_SHIFT,
-+              npages * PAGE_SIZE, prot, DOMID_SELF);
-+      if (ret) {
-+              vunmap(area->addr);
-+              goto out;
-+      }
-+      sbuf->buffer = area->addr;
-+
-+out:
-+      return ret;
-+}
-+
-+struct op_counter_config counter_config[OP_MAX_COUNTER];
-+
-+int xenoprof_create_files(struct super_block * sb, struct dentry * root)
-+{
-+      unsigned int i;
-+
-+      for (i = 0; i < num_events; ++i) {
-+              struct dentry * dir;
-+              char buf[2];
-+ 
-+              snprintf(buf, 2, "%d", i);
-+              dir = oprofilefs_mkdir(sb, root, buf);
-+              oprofilefs_create_ulong(sb, dir, "enabled",
-+                                      &counter_config[i].enabled);
-+              oprofilefs_create_ulong(sb, dir, "event",
-+                                      &counter_config[i].event);
-+              oprofilefs_create_ulong(sb, dir, "count",
-+                                      &counter_config[i].count);
-+              oprofilefs_create_ulong(sb, dir, "unit_mask",
-+                                      &counter_config[i].unit_mask);
-+              oprofilefs_create_ulong(sb, dir, "kernel",
-+                                      &counter_config[i].kernel);
-+              oprofilefs_create_ulong(sb, dir, "user",
-+                                      &counter_config[i].user);
-+      }
-+
-+      return 0;
-+}
-+
-+int __init oprofile_arch_init(struct oprofile_operations * ops)
-+{
-+      return xenoprofile_init(ops);
-+}
-+
-+void oprofile_arch_exit(void)
-+{
-+      xenoprofile_exit();
-+}
-Index: head-2008-11-25/arch/x86/pci/irq-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/pci/irq-xen.c     2008-03-06 08:54:32.000000000 +0100
-@@ -0,0 +1,1211 @@
-+/*
-+ *    Low-Level PCI Support for PC -- Routing of Interrupts
-+ *
-+ *    (c) 1999--2000 Martin Mares <mj@ucw.cz>
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include <linux/init.h>
-+#include <linux/slab.h>
-+#include <linux/interrupt.h>
-+#include <linux/dmi.h>
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/io_apic.h>
-+#include <linux/irq.h>
-+#include <linux/acpi.h>
-+
-+#include "pci.h"
-+
-+#define PIRQ_SIGNATURE        (('$' << 0) + ('P' << 8) + ('I' << 16) + ('R' << 24))
-+#define PIRQ_VERSION 0x0100
-+
-+static int broken_hp_bios_irq9;
-+static int acer_tm360_irqrouting;
-+
-+static struct irq_routing_table *pirq_table;
-+
-+static int pirq_enable_irq(struct pci_dev *dev);
-+
-+/*
-+ * Never use: 0, 1, 2 (timer, keyboard, and cascade)
-+ * Avoid using: 13, 14 and 15 (FP error and IDE).
-+ * Penalize: 3, 4, 6, 7, 12 (known ISA uses: serial, floppy, parallel and mouse)
-+ */
-+unsigned int pcibios_irq_mask = 0xfff8;
-+
-+static int pirq_penalty[16] = {
-+      1000000, 1000000, 1000000, 1000, 1000, 0, 1000, 1000,
-+      0, 0, 0, 0, 1000, 100000, 100000, 100000
-+};
-+
-+struct irq_router {
-+      char *name;
-+      u16 vendor, device;
-+      int (*get)(struct pci_dev *router, struct pci_dev *dev, int pirq);
-+      int (*set)(struct pci_dev *router, struct pci_dev *dev, int pirq, int new);
-+};
-+
-+struct irq_router_handler {
-+      u16 vendor;
-+      int (*probe)(struct irq_router *r, struct pci_dev *router, u16 device);
-+};
-+
-+int (*pcibios_enable_irq)(struct pci_dev *dev) = NULL;
-+void (*pcibios_disable_irq)(struct pci_dev *dev) = NULL;
-+
-+/*
-+ *  Check passed address for the PCI IRQ Routing Table signature
-+ *  and perform checksum verification.
-+ */
-+
-+static inline struct irq_routing_table * pirq_check_routing_table(u8 *addr)
-+{
-+      struct irq_routing_table *rt;
-+      int i;
-+      u8 sum;
-+
-+      rt = (struct irq_routing_table *) addr;
-+      if (rt->signature != PIRQ_SIGNATURE ||
-+          rt->version != PIRQ_VERSION ||
-+          rt->size % 16 ||
-+          rt->size < sizeof(struct irq_routing_table))
-+              return NULL;
-+      sum = 0;
-+      for (i=0; i < rt->size; i++)
-+              sum += addr[i];
-+      if (!sum) {
-+              DBG(KERN_DEBUG "PCI: Interrupt Routing Table found at 0x%p\n", rt);
-+              return rt;
-+      }
-+      return NULL;
-+}
-+
-+
-+
-+/*
-+ *  Search 0xf0000 -- 0xfffff for the PCI IRQ Routing Table.
-+ */
-+
-+static struct irq_routing_table * __init pirq_find_routing_table(void)
-+{
-+      u8 *addr;
-+      struct irq_routing_table *rt;
-+
-+#ifdef CONFIG_XEN
-+      if (!is_initial_xendomain())
-+              return NULL;
-+#endif
-+      if (pirq_table_addr) {
-+              rt = pirq_check_routing_table((u8 *) isa_bus_to_virt(pirq_table_addr));
-+              if (rt)
-+                      return rt;
-+              printk(KERN_WARNING "PCI: PIRQ table NOT found at pirqaddr\n");
-+      }
-+      for(addr = (u8 *) isa_bus_to_virt(0xf0000); addr < (u8 *) isa_bus_to_virt(0x100000); addr += 16) {
-+              rt = pirq_check_routing_table(addr);
-+              if (rt)
-+                      return rt;
-+      }
-+      return NULL;
-+}
-+
-+/*
-+ *  If we have a IRQ routing table, use it to search for peer host
-+ *  bridges.  It's a gross hack, but since there are no other known
-+ *  ways how to get a list of buses, we have to go this way.
-+ */
-+
-+static void __init pirq_peer_trick(void)
-+{
-+      struct irq_routing_table *rt = pirq_table;
-+      u8 busmap[256];
-+      int i;
-+      struct irq_info *e;
-+
-+      memset(busmap, 0, sizeof(busmap));
-+      for(i=0; i < (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info); i++) {
-+              e = &rt->slots[i];
-+#ifdef DEBUG
-+              {
-+                      int j;
-+                      DBG(KERN_DEBUG "%02x:%02x slot=%02x", e->bus, e->devfn/8, e->slot);
-+                      for(j=0; j<4; j++)
-+                              DBG(" %d:%02x/%04x", j, e->irq[j].link, e->irq[j].bitmap);
-+                      DBG("\n");
-+              }
-+#endif
-+              busmap[e->bus] = 1;
-+      }
-+      for(i = 1; i < 256; i++) {
-+              if (!busmap[i] || pci_find_bus(0, i))
-+                      continue;
-+              if (pci_scan_bus(i, &pci_root_ops, NULL))
-+                      printk(KERN_INFO "PCI: Discovered primary peer bus %02x [IRQ]\n", i);
-+      }
-+      pcibios_last_bus = -1;
-+}
-+
-+/*
-+ *  Code for querying and setting of IRQ routes on various interrupt routers.
-+ */
-+
-+void eisa_set_level_irq(unsigned int irq)
-+{
-+      unsigned char mask = 1 << (irq & 7);
-+      unsigned int port = 0x4d0 + (irq >> 3);
-+      unsigned char val;
-+      static u16 eisa_irq_mask;
-+
-+      if (irq >= 16 || (1 << irq) & eisa_irq_mask)
-+              return;
-+
-+      eisa_irq_mask |= (1 << irq);
-+      printk(KERN_DEBUG "PCI: setting IRQ %u as level-triggered\n", irq);
-+      val = inb(port);
-+      if (!(val & mask)) {
-+              DBG(KERN_DEBUG " -> edge");
-+              outb(val | mask, port);
-+      }
-+}
-+
-+/*
-+ * Common IRQ routing practice: nybbles in config space,
-+ * offset by some magic constant.
-+ */
-+static unsigned int read_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr)
-+{
-+      u8 x;
-+      unsigned reg = offset + (nr >> 1);
-+
-+      pci_read_config_byte(router, reg, &x);
-+      return (nr & 1) ? (x >> 4) : (x & 0xf);
-+}
-+
-+static void write_config_nybble(struct pci_dev *router, unsigned offset, unsigned nr, unsigned int val)
-+{
-+      u8 x;
-+      unsigned reg = offset + (nr >> 1);
-+
-+      pci_read_config_byte(router, reg, &x);
-+      x = (nr & 1) ? ((x & 0x0f) | (val << 4)) : ((x & 0xf0) | val);
-+      pci_write_config_byte(router, reg, x);
-+}
-+
-+/*
-+ * ALI pirq entries are damn ugly, and completely undocumented.
-+ * This has been figured out from pirq tables, and it's not a pretty
-+ * picture.
-+ */
-+static int pirq_ali_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
-+
-+      return irqmap[read_config_nybble(router, 0x48, pirq-1)];
-+}
-+
-+static int pirq_ali_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      static const unsigned char irqmap[16] = { 0, 8, 0, 2, 4, 5, 7, 6, 0, 1, 3, 9, 11, 0, 13, 15 };
-+      unsigned int val = irqmap[irq];
-+              
-+      if (val) {
-+              write_config_nybble(router, 0x48, pirq-1, val);
-+              return 1;
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * The Intel PIIX4 pirq rules are fairly simple: "pirq" is
-+ * just a pointer to the config space.
-+ */
-+static int pirq_piix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      u8 x;
-+
-+      pci_read_config_byte(router, pirq, &x);
-+      return (x < 16) ? x : 0;
-+}
-+
-+static int pirq_piix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      pci_write_config_byte(router, pirq, irq);
-+      return 1;
-+}
-+
-+/*
-+ * The VIA pirq rules are nibble-based, like ALI,
-+ * but without the ugly irq number munging.
-+ * However, PIRQD is in the upper instead of lower 4 bits.
-+ */
-+static int pirq_via_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      return read_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq);
-+}
-+
-+static int pirq_via_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      write_config_nybble(router, 0x55, pirq == 4 ? 5 : pirq, irq);
-+      return 1;
-+}
-+
-+/*
-+ * The VIA pirq rules are nibble-based, like ALI,
-+ * but without the ugly irq number munging.
-+ * However, for 82C586, nibble map is different .
-+ */
-+static int pirq_via586_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
-+      return read_config_nybble(router, 0x55, pirqmap[pirq-1]);
-+}
-+
-+static int pirq_via586_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      static const unsigned int pirqmap[5] = { 3, 2, 5, 1, 1 };
-+      write_config_nybble(router, 0x55, pirqmap[pirq-1], irq);
-+      return 1;
-+}
-+
-+/*
-+ * ITE 8330G pirq rules are nibble-based
-+ * FIXME: pirqmap may be { 1, 0, 3, 2 },
-+ *      2+3 are both mapped to irq 9 on my system
-+ */
-+static int pirq_ite_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
-+      return read_config_nybble(router,0x43, pirqmap[pirq-1]);
-+}
-+
-+static int pirq_ite_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      static const unsigned char pirqmap[4] = { 1, 0, 2, 3 };
-+      write_config_nybble(router, 0x43, pirqmap[pirq-1], irq);
-+      return 1;
-+}
-+
-+/*
-+ * OPTI: high four bits are nibble pointer..
-+ * I wonder what the low bits do?
-+ */
-+static int pirq_opti_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      return read_config_nybble(router, 0xb8, pirq >> 4);
-+}
-+
-+static int pirq_opti_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      write_config_nybble(router, 0xb8, pirq >> 4, irq);
-+      return 1;
-+}
-+
-+/*
-+ * Cyrix: nibble offset 0x5C
-+ * 0x5C bits 7:4 is INTB bits 3:0 is INTA 
-+ * 0x5D bits 7:4 is INTD bits 3:0 is INTC
-+ */
-+static int pirq_cyrix_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      return read_config_nybble(router, 0x5C, (pirq-1)^1);
-+}
-+
-+static int pirq_cyrix_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      write_config_nybble(router, 0x5C, (pirq-1)^1, irq);
-+      return 1;
-+}
-+
-+/*
-+ *    PIRQ routing for SiS 85C503 router used in several SiS chipsets.
-+ *    We have to deal with the following issues here:
-+ *    - vendors have different ideas about the meaning of link values
-+ *    - some onboard devices (integrated in the chipset) have special
-+ *      links and are thus routed differently (i.e. not via PCI INTA-INTD)
-+ *    - different revision of the router have a different layout for
-+ *      the routing registers, particularly for the onchip devices
-+ *
-+ *    For all routing registers the common thing is we have one byte
-+ *    per routeable link which is defined as:
-+ *             bit 7      IRQ mapping enabled (0) or disabled (1)
-+ *             bits [6:4] reserved (sometimes used for onchip devices)
-+ *             bits [3:0] IRQ to map to
-+ *                 allowed: 3-7, 9-12, 14-15
-+ *                 reserved: 0, 1, 2, 8, 13
-+ *
-+ *    The config-space registers located at 0x41/0x42/0x43/0x44 are
-+ *    always used to route the normal PCI INT A/B/C/D respectively.
-+ *    Apparently there are systems implementing PCI routing table using
-+ *    link values 0x01-0x04 and others using 0x41-0x44 for PCI INTA..D.
-+ *    We try our best to handle both link mappings.
-+ *    
-+ *    Currently (2003-05-21) it appears most SiS chipsets follow the
-+ *    definition of routing registers from the SiS-5595 southbridge.
-+ *    According to the SiS 5595 datasheets the revision id's of the
-+ *    router (ISA-bridge) should be 0x01 or 0xb0.
-+ *
-+ *    Furthermore we've also seen lspci dumps with revision 0x00 and 0xb1.
-+ *    Looks like these are used in a number of SiS 5xx/6xx/7xx chipsets.
-+ *    They seem to work with the current routing code. However there is
-+ *    some concern because of the two USB-OHCI HCs (original SiS 5595
-+ *    had only one). YMMV.
-+ *
-+ *    Onchip routing for router rev-id 0x01/0xb0 and probably 0x00/0xb1:
-+ *
-+ *    0x61:   IDEIRQ:
-+ *            bits [6:5] must be written 01
-+ *            bit 4 channel-select primary (0), secondary (1)
-+ *
-+ *    0x62:   USBIRQ:
-+ *            bit 6 OHCI function disabled (0), enabled (1)
-+ *    
-+ *    0x6a:   ACPI/SCI IRQ: bits 4-6 reserved
-+ *
-+ *    0x7e:   Data Acq. Module IRQ - bits 4-6 reserved
-+ *
-+ *    We support USBIRQ (in addition to INTA-INTD) and keep the
-+ *    IDE, ACPI and DAQ routing untouched as set by the BIOS.
-+ *
-+ *    Currently the only reported exception is the new SiS 65x chipset
-+ *    which includes the SiS 69x southbridge. Here we have the 85C503
-+ *    router revision 0x04 and there are changes in the register layout
-+ *    mostly related to the different USB HCs with USB 2.0 support.
-+ *
-+ *    Onchip routing for router rev-id 0x04 (try-and-error observation)
-+ *
-+ *    0x60/0x61/0x62/0x63:    1xEHCI and 3xOHCI (companion) USB-HCs
-+ *                            bit 6-4 are probably unused, not like 5595
-+ */
-+
-+#define PIRQ_SIS_IRQ_MASK     0x0f
-+#define PIRQ_SIS_IRQ_DISABLE  0x80
-+#define PIRQ_SIS_USB_ENABLE   0x40
-+
-+static int pirq_sis_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      u8 x;
-+      int reg;
-+
-+      reg = pirq;
-+      if (reg >= 0x01 && reg <= 0x04)
-+              reg += 0x40;
-+      pci_read_config_byte(router, reg, &x);
-+      return (x & PIRQ_SIS_IRQ_DISABLE) ? 0 : (x & PIRQ_SIS_IRQ_MASK);
-+}
-+
-+static int pirq_sis_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      u8 x;
-+      int reg;
-+
-+      reg = pirq;
-+      if (reg >= 0x01 && reg <= 0x04)
-+              reg += 0x40;
-+      pci_read_config_byte(router, reg, &x);
-+      x &= ~(PIRQ_SIS_IRQ_MASK | PIRQ_SIS_IRQ_DISABLE);
-+      x |= irq ? irq: PIRQ_SIS_IRQ_DISABLE;
-+      pci_write_config_byte(router, reg, x);
-+      return 1;
-+}
-+
-+
-+/*
-+ * VLSI: nibble offset 0x74 - educated guess due to routing table and
-+ *       config space of VLSI 82C534 PCI-bridge/router (1004:0102)
-+ *       Tested on HP OmniBook 800 covering PIRQ 1, 2, 4, 8 for onboard
-+ *       devices, PIRQ 3 for non-pci(!) soundchip and (untested) PIRQ 6
-+ *       for the busbridge to the docking station.
-+ */
-+
-+static int pirq_vlsi_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      if (pirq > 8) {
-+              printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq);
-+              return 0;
-+      }
-+      return read_config_nybble(router, 0x74, pirq-1);
-+}
-+
-+static int pirq_vlsi_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      if (pirq > 8) {
-+              printk(KERN_INFO "VLSI router pirq escape (%d)\n", pirq);
-+              return 0;
-+      }
-+      write_config_nybble(router, 0x74, pirq-1, irq);
-+      return 1;
-+}
-+
-+/*
-+ * ServerWorks: PCI interrupts mapped to system IRQ lines through Index
-+ * and Redirect I/O registers (0x0c00 and 0x0c01).  The Index register
-+ * format is (PCIIRQ## | 0x10), e.g.: PCIIRQ10=0x1a.  The Redirect
-+ * register is a straight binary coding of desired PIC IRQ (low nibble).
-+ *
-+ * The 'link' value in the PIRQ table is already in the correct format
-+ * for the Index register.  There are some special index values:
-+ * 0x00 for ACPI (SCI), 0x01 for USB, 0x02 for IDE0, 0x04 for IDE1,
-+ * and 0x03 for SMBus.
-+ */
-+static int pirq_serverworks_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      outb_p(pirq, 0xc00);
-+      return inb(0xc01) & 0xf;
-+}
-+
-+static int pirq_serverworks_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      outb_p(pirq, 0xc00);
-+      outb_p(irq, 0xc01);
-+      return 1;
-+}
-+
-+/* Support for AMD756 PCI IRQ Routing
-+ * Jhon H. Caicedo <jhcaiced@osso.org.co>
-+ * Jun/21/2001 0.2.0 Release, fixed to use "nybble" functions... (jhcaiced)
-+ * Jun/19/2001 Alpha Release 0.1.0 (jhcaiced)
-+ * The AMD756 pirq rules are nibble-based
-+ * offset 0x56 0-3 PIRQA  4-7  PIRQB
-+ * offset 0x57 0-3 PIRQC  4-7  PIRQD
-+ */
-+static int pirq_amd756_get(struct pci_dev *router, struct pci_dev *dev, int pirq)
-+{
-+      u8 irq;
-+      irq = 0;
-+      if (pirq <= 4)
-+      {
-+              irq = read_config_nybble(router, 0x56, pirq - 1);
-+      }
-+      printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d get irq : %2d\n",
-+              dev->vendor, dev->device, pirq, irq);
-+      return irq;
-+}
-+
-+static int pirq_amd756_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      printk(KERN_INFO "AMD756: dev %04x:%04x, router pirq : %d SET irq : %2d\n", 
-+              dev->vendor, dev->device, pirq, irq);
-+      if (pirq <= 4)
-+      {
-+              write_config_nybble(router, 0x56, pirq - 1, irq);
-+      }
-+      return 1;
-+}
-+
-+#ifdef CONFIG_PCI_BIOS
-+
-+static int pirq_bios_set(struct pci_dev *router, struct pci_dev *dev, int pirq, int irq)
-+{
-+      struct pci_dev *bridge;
-+      int pin = pci_get_interrupt_pin(dev, &bridge);
-+      return pcibios_set_irq_routing(bridge, pin, irq);
-+}
-+
-+#endif
-+
-+static __init int intel_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      static struct pci_device_id __initdata pirq_440gx[] = {
-+              { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_0) },
-+              { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443GX_2) },
-+              { },
-+      };
-+
-+      /* 440GX has a proprietary PIRQ router -- don't use it */
-+      if (pci_dev_present(pirq_440gx))
-+              return 0;
-+
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_INTEL_82371FB_0:
-+              case PCI_DEVICE_ID_INTEL_82371SB_0:
-+              case PCI_DEVICE_ID_INTEL_82371AB_0:
-+              case PCI_DEVICE_ID_INTEL_82371MX:
-+              case PCI_DEVICE_ID_INTEL_82443MX_0:
-+              case PCI_DEVICE_ID_INTEL_82801AA_0:
-+              case PCI_DEVICE_ID_INTEL_82801AB_0:
-+              case PCI_DEVICE_ID_INTEL_82801BA_0:
-+              case PCI_DEVICE_ID_INTEL_82801BA_10:
-+              case PCI_DEVICE_ID_INTEL_82801CA_0:
-+              case PCI_DEVICE_ID_INTEL_82801CA_12:
-+              case PCI_DEVICE_ID_INTEL_82801DB_0:
-+              case PCI_DEVICE_ID_INTEL_82801E_0:
-+              case PCI_DEVICE_ID_INTEL_82801EB_0:
-+              case PCI_DEVICE_ID_INTEL_ESB_1:
-+              case PCI_DEVICE_ID_INTEL_ICH6_0:
-+              case PCI_DEVICE_ID_INTEL_ICH6_1:
-+              case PCI_DEVICE_ID_INTEL_ICH7_0:
-+              case PCI_DEVICE_ID_INTEL_ICH7_1:
-+              case PCI_DEVICE_ID_INTEL_ICH7_30:
-+              case PCI_DEVICE_ID_INTEL_ICH7_31:
-+              case PCI_DEVICE_ID_INTEL_ESB2_0:
-+              case PCI_DEVICE_ID_INTEL_ICH8_0:
-+              case PCI_DEVICE_ID_INTEL_ICH8_1:
-+              case PCI_DEVICE_ID_INTEL_ICH8_2:
-+              case PCI_DEVICE_ID_INTEL_ICH8_3:
-+              case PCI_DEVICE_ID_INTEL_ICH8_4:
-+              case PCI_DEVICE_ID_INTEL_ICH9_0:
-+              case PCI_DEVICE_ID_INTEL_ICH9_1:
-+              case PCI_DEVICE_ID_INTEL_ICH9_2:
-+              case PCI_DEVICE_ID_INTEL_ICH9_3:
-+              case PCI_DEVICE_ID_INTEL_ICH9_4:
-+              case PCI_DEVICE_ID_INTEL_ICH9_5:
-+                      r->name = "PIIX/ICH";
-+                      r->get = pirq_piix_get;
-+                      r->set = pirq_piix_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int via_router_probe(struct irq_router *r,
-+                              struct pci_dev *router, u16 device)
-+{
-+      /* FIXME: We should move some of the quirk fixup stuff here */
-+
-+      /*
-+       * work arounds for some buggy BIOSes
-+       */
-+      if (device == PCI_DEVICE_ID_VIA_82C586_0) {
-+              switch(router->device) {
-+              case PCI_DEVICE_ID_VIA_82C686:
-+                      /*
-+                       * Asus k7m bios wrongly reports 82C686A
-+                       * as 586-compatible
-+                       */
-+                      device = PCI_DEVICE_ID_VIA_82C686;
-+                      break;
-+              case PCI_DEVICE_ID_VIA_8235:
-+                      /**
-+                       * Asus a7v-x bios wrongly reports 8235
-+                       * as 586-compatible
-+                       */
-+                      device = PCI_DEVICE_ID_VIA_8235;
-+                      break;
-+              }
-+      }
-+
-+      switch(device) {
-+      case PCI_DEVICE_ID_VIA_82C586_0:
-+              r->name = "VIA";
-+              r->get = pirq_via586_get;
-+              r->set = pirq_via586_set;
-+              return 1;
-+      case PCI_DEVICE_ID_VIA_82C596:
-+      case PCI_DEVICE_ID_VIA_82C686:
-+      case PCI_DEVICE_ID_VIA_8231:
-+      case PCI_DEVICE_ID_VIA_8233A:
-+      case PCI_DEVICE_ID_VIA_8235:
-+      case PCI_DEVICE_ID_VIA_8237:
-+              /* FIXME: add new ones for 8233/5 */
-+              r->name = "VIA";
-+              r->get = pirq_via_get;
-+              r->set = pirq_via_set;
-+              return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int vlsi_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_VLSI_82C534:
-+                      r->name = "VLSI 82C534";
-+                      r->get = pirq_vlsi_get;
-+                      r->set = pirq_vlsi_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+
-+static __init int serverworks_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_SERVERWORKS_OSB4:
-+              case PCI_DEVICE_ID_SERVERWORKS_CSB5:
-+                      r->name = "ServerWorks";
-+                      r->get = pirq_serverworks_get;
-+                      r->set = pirq_serverworks_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int sis_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      if (device != PCI_DEVICE_ID_SI_503)
-+              return 0;
-+              
-+      r->name = "SIS";
-+      r->get = pirq_sis_get;
-+      r->set = pirq_sis_set;
-+      return 1;
-+}
-+
-+static __init int cyrix_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_CYRIX_5520:
-+                      r->name = "NatSemi";
-+                      r->get = pirq_cyrix_get;
-+                      r->set = pirq_cyrix_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int opti_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_OPTI_82C700:
-+                      r->name = "OPTI";
-+                      r->get = pirq_opti_get;
-+                      r->set = pirq_opti_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int ite_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_ITE_IT8330G_0:
-+                      r->name = "ITE";
-+                      r->get = pirq_ite_get;
-+                      r->set = pirq_ite_set;
-+                      return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int ali_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+      case PCI_DEVICE_ID_AL_M1533:
-+      case PCI_DEVICE_ID_AL_M1563:
-+              printk(KERN_DEBUG "PCI: Using ALI IRQ Router\n");
-+              r->name = "ALI";
-+              r->get = pirq_ali_get;
-+              r->set = pirq_ali_set;
-+              return 1;
-+      }
-+      return 0;
-+}
-+
-+static __init int amd_router_probe(struct irq_router *r, struct pci_dev *router, u16 device)
-+{
-+      switch(device)
-+      {
-+              case PCI_DEVICE_ID_AMD_VIPER_740B:
-+                      r->name = "AMD756";
-+                      break;
-+              case PCI_DEVICE_ID_AMD_VIPER_7413:
-+                      r->name = "AMD766";
-+                      break;
-+              case PCI_DEVICE_ID_AMD_VIPER_7443:
-+                      r->name = "AMD768";
-+                      break;
-+              default:
-+                      return 0;
-+      }
-+      r->get = pirq_amd756_get;
-+      r->set = pirq_amd756_set;
-+      return 1;
-+}
-+              
-+static __initdata struct irq_router_handler pirq_routers[] = {
-+      { PCI_VENDOR_ID_INTEL, intel_router_probe },
-+      { PCI_VENDOR_ID_AL, ali_router_probe },
-+      { PCI_VENDOR_ID_ITE, ite_router_probe },
-+      { PCI_VENDOR_ID_VIA, via_router_probe },
-+      { PCI_VENDOR_ID_OPTI, opti_router_probe },
-+      { PCI_VENDOR_ID_SI, sis_router_probe },
-+      { PCI_VENDOR_ID_CYRIX, cyrix_router_probe },
-+      { PCI_VENDOR_ID_VLSI, vlsi_router_probe },
-+      { PCI_VENDOR_ID_SERVERWORKS, serverworks_router_probe },
-+      { PCI_VENDOR_ID_AMD, amd_router_probe },
-+      /* Someone with docs needs to add the ATI Radeon IGP */
-+      { 0, NULL }
-+};
-+static struct irq_router pirq_router;
-+static struct pci_dev *pirq_router_dev;
-+
-+
-+/*
-+ *    FIXME: should we have an option to say "generic for
-+ *    chipset" ?
-+ */
-+ 
-+static void __init pirq_find_router(struct irq_router *r)
-+{
-+      struct irq_routing_table *rt = pirq_table;
-+      struct irq_router_handler *h;
-+
-+#ifdef CONFIG_PCI_BIOS
-+      if (!rt->signature) {
-+              printk(KERN_INFO "PCI: Using BIOS for IRQ routing\n");
-+              r->set = pirq_bios_set;
-+              r->name = "BIOS";
-+              return;
-+      }
-+#endif
-+
-+      /* Default unless a driver reloads it */
-+      r->name = "default";
-+      r->get = NULL;
-+      r->set = NULL;
-+      
-+      DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n",
-+          rt->rtr_vendor, rt->rtr_device);
-+
-+      pirq_router_dev = pci_find_slot(rt->rtr_bus, rt->rtr_devfn);
-+      if (!pirq_router_dev) {
-+              DBG(KERN_DEBUG "PCI: Interrupt router not found at "
-+                      "%02x:%02x\n", rt->rtr_bus, rt->rtr_devfn);
-+              return;
-+      }
-+
-+      for( h = pirq_routers; h->vendor; h++) {
-+              /* First look for a router match */
-+              if (rt->rtr_vendor == h->vendor && h->probe(r, pirq_router_dev, rt->rtr_device))
-+                      break;
-+              /* Fall back to a device match */
-+              if (pirq_router_dev->vendor == h->vendor && h->probe(r, pirq_router_dev, pirq_router_dev->device))
-+                      break;
-+      }
-+      printk(KERN_INFO "PCI: Using IRQ router %s [%04x/%04x] at %s\n",
-+              pirq_router.name,
-+              pirq_router_dev->vendor,
-+              pirq_router_dev->device,
-+              pci_name(pirq_router_dev));
-+}
-+
-+static struct irq_info *pirq_get_info(struct pci_dev *dev)
-+{
-+      struct irq_routing_table *rt = pirq_table;
-+      int entries = (rt->size - sizeof(struct irq_routing_table)) / sizeof(struct irq_info);
-+      struct irq_info *info;
-+
-+      for (info = rt->slots; entries--; info++)
-+              if (info->bus == dev->bus->number && PCI_SLOT(info->devfn) == PCI_SLOT(dev->devfn))
-+                      return info;
-+      return NULL;
-+}
-+
-+static int pcibios_lookup_irq(struct pci_dev *dev, int assign)
-+{
-+      u8 pin;
-+      struct irq_info *info;
-+      int i, pirq, newirq;
-+      int irq = 0;
-+      u32 mask;
-+      struct irq_router *r = &pirq_router;
-+      struct pci_dev *dev2 = NULL;
-+      char *msg = NULL;
-+
-+      /* Find IRQ pin */
-+      pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-+      if (!pin) {
-+              DBG(KERN_DEBUG " -> no interrupt pin\n");
-+              return 0;
-+      }
-+      pin = pin - 1;
-+
-+      /* Find IRQ routing entry */
-+
-+      if (!pirq_table)
-+              return 0;
-+      
-+      DBG(KERN_DEBUG "IRQ for %s[%c]", pci_name(dev), 'A' + pin);
-+      info = pirq_get_info(dev);
-+      if (!info) {
-+              DBG(" -> not found in routing table\n" KERN_DEBUG);
-+              return 0;
-+      }
-+      pirq = info->irq[pin].link;
-+      mask = info->irq[pin].bitmap;
-+      if (!pirq) {
-+              DBG(" -> not routed\n" KERN_DEBUG);
-+              return 0;
-+      }
-+      DBG(" -> PIRQ %02x, mask %04x, excl %04x", pirq, mask, pirq_table->exclusive_irqs);
-+      mask &= pcibios_irq_mask;
-+
-+      /* Work around broken HP Pavilion Notebooks which assign USB to
-+         IRQ 9 even though it is actually wired to IRQ 11 */
-+
-+      if (broken_hp_bios_irq9 && pirq == 0x59 && dev->irq == 9) {
-+              dev->irq = 11;
-+              pci_write_config_byte(dev, PCI_INTERRUPT_LINE, 11);
-+              r->set(pirq_router_dev, dev, pirq, 11);
-+      }
-+
-+      /* same for Acer Travelmate 360, but with CB and irq 11 -> 10 */
-+      if (acer_tm360_irqrouting && dev->irq == 11 && dev->vendor == PCI_VENDOR_ID_O2) {
-+              pirq = 0x68;
-+              mask = 0x400;
-+              dev->irq = r->get(pirq_router_dev, dev, pirq);
-+              pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
-+      }
-+
-+      /*
-+       * Find the best IRQ to assign: use the one
-+       * reported by the device if possible.
-+       */
-+      newirq = dev->irq;
-+      if (newirq && !((1 << newirq) & mask)) {
-+              if ( pci_probe & PCI_USE_PIRQ_MASK) newirq = 0;
-+              else printk("\n" KERN_WARNING
-+                      "PCI: IRQ %i for device %s doesn't match PIRQ mask "
-+                      "- try pci=usepirqmask\n" KERN_DEBUG, newirq,
-+                      pci_name(dev));
-+      }
-+      if (!newirq && assign) {
-+              for (i = 0; i < 16; i++) {
-+                      if (!(mask & (1 << i)))
-+                              continue;
-+                      if (pirq_penalty[i] < pirq_penalty[newirq] && can_request_irq(i, IRQF_SHARED))
-+                              newirq = i;
-+              }
-+      }
-+      DBG(" -> newirq=%d", newirq);
-+
-+      /* Check if it is hardcoded */
-+      if ((pirq & 0xf0) == 0xf0) {
-+              irq = pirq & 0xf;
-+              DBG(" -> hardcoded IRQ %d\n", irq);
-+              msg = "Hardcoded";
-+      } else if ( r->get && (irq = r->get(pirq_router_dev, dev, pirq)) && \
-+      ((!(pci_probe & PCI_USE_PIRQ_MASK)) || ((1 << irq) & mask)) ) {
-+              DBG(" -> got IRQ %d\n", irq);
-+              msg = "Found";
-+              eisa_set_level_irq(irq);
-+      } else if (newirq && r->set && (dev->class >> 8) != PCI_CLASS_DISPLAY_VGA) {
-+              DBG(" -> assigning IRQ %d", newirq);
-+              if (r->set(pirq_router_dev, dev, pirq, newirq)) {
-+                      eisa_set_level_irq(newirq);
-+                      DBG(" ... OK\n");
-+                      msg = "Assigned";
-+                      irq = newirq;
-+              }
-+      }
-+
-+      if (!irq) {
-+              DBG(" ... failed\n");
-+              if (newirq && mask == (1 << newirq)) {
-+                      msg = "Guessed";
-+                      irq = newirq;
-+              } else
-+                      return 0;
-+      }
-+      printk(KERN_INFO "PCI: %s IRQ %d for device %s\n", msg, irq, pci_name(dev));
-+
-+      /* Update IRQ for all devices with the same pirq value */
-+      while ((dev2 = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev2)) != NULL) {
-+              pci_read_config_byte(dev2, PCI_INTERRUPT_PIN, &pin);
-+              if (!pin)
-+                      continue;
-+              pin--;
-+              info = pirq_get_info(dev2);
-+              if (!info)
-+                      continue;
-+              if (info->irq[pin].link == pirq) {
-+                      /* We refuse to override the dev->irq information. Give a warning! */
-+                      if ( dev2->irq && dev2->irq != irq && \
-+                      (!(pci_probe & PCI_USE_PIRQ_MASK) || \
-+                      ((1 << dev2->irq) & mask)) ) {
-+#ifndef CONFIG_PCI_MSI
-+                              printk(KERN_INFO "IRQ routing conflict for %s, have irq %d, want irq %d\n",
-+                                     pci_name(dev2), dev2->irq, irq);
-+#endif
-+                              continue;
-+                      }
-+                      dev2->irq = irq;
-+                      pirq_penalty[irq]++;
-+                      if (dev != dev2)
-+                              printk(KERN_INFO "PCI: Sharing IRQ %d with %s\n", irq, pci_name(dev2));
-+              }
-+      }
-+      return 1;
-+}
-+
-+static void __init pcibios_fixup_irqs(void)
-+{
-+      struct pci_dev *dev = NULL;
-+      u8 pin;
-+
-+      DBG(KERN_DEBUG "PCI: IRQ fixup\n");
-+      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-+              /*
-+               * If the BIOS has set an out of range IRQ number, just ignore it.
-+               * Also keep track of which IRQ's are already in use.
-+               */
-+              if (dev->irq >= 16) {
-+                      DBG(KERN_DEBUG "%s: ignoring bogus IRQ %d\n", pci_name(dev), dev->irq);
-+                      dev->irq = 0;
-+              }
-+              /* If the IRQ is already assigned to a PCI device, ignore its ISA use penalty */
-+              if (pirq_penalty[dev->irq] >= 100 && pirq_penalty[dev->irq] < 100000)
-+                      pirq_penalty[dev->irq] = 0;
-+              pirq_penalty[dev->irq]++;
-+      }
-+
-+      dev = NULL;
-+      while ((dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) {
-+              pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-+#ifdef CONFIG_X86_IO_APIC
-+              /*
-+               * Recalculate IRQ numbers if we use the I/O APIC.
-+               */
-+              if (io_apic_assign_pci_irqs)
-+              {
-+                      int irq;
-+
-+                      if (pin) {
-+                              pin--;          /* interrupt pins are numbered starting from 1 */
-+                              irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-+      /*
-+       * Busses behind bridges are typically not listed in the MP-table.
-+       * In this case we have to look up the IRQ based on the parent bus,
-+       * parent slot, and pin number. The SMP code detects such bridged
-+       * busses itself so we should get into this branch reliably.
-+       */
-+                              if (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-+                                      struct pci_dev * bridge = dev->bus->self;
-+
-+                                      pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-+                                      irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-+                                                      PCI_SLOT(bridge->devfn), pin);
-+                                      if (irq >= 0)
-+                                              printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
-+                                                      pci_name(bridge), 'A' + pin, irq);
-+                              }
-+                              if (irq >= 0) {
-+                                      if (use_pci_vector() &&
-+                                              !platform_legacy_irq(irq))
-+                                              irq = IO_APIC_VECTOR(irq);
-+
-+                                      printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
-+                                              pci_name(dev), 'A' + pin, irq);
-+                                      dev->irq = irq;
-+                              }
-+                      }
-+              }
-+#endif
-+              /*
-+               * Still no IRQ? Try to lookup one...
-+               */
-+              if (pin && !dev->irq)
-+                      pcibios_lookup_irq(dev, 0);
-+      }
-+}
-+
-+/*
-+ * Work around broken HP Pavilion Notebooks which assign USB to
-+ * IRQ 9 even though it is actually wired to IRQ 11
-+ */
-+static int __init fix_broken_hp_bios_irq9(struct dmi_system_id *d)
-+{
-+      if (!broken_hp_bios_irq9) {
-+              broken_hp_bios_irq9 = 1;
-+              printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * Work around broken Acer TravelMate 360 Notebooks which assign
-+ * Cardbus to IRQ 11 even though it is actually wired to IRQ 10
-+ */
-+static int __init fix_acer_tm360_irqrouting(struct dmi_system_id *d)
-+{
-+      if (!acer_tm360_irqrouting) {
-+              acer_tm360_irqrouting = 1;
-+              printk(KERN_INFO "%s detected - fixing broken IRQ routing\n", d->ident);
-+      }
-+      return 0;
-+}
-+
-+static struct dmi_system_id __initdata pciirq_dmi_table[] = {
-+      {
-+              .callback = fix_broken_hp_bios_irq9,
-+              .ident = "HP Pavilion N5400 Series Laptop",
-+              .matches = {
-+                      DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
-+                      DMI_MATCH(DMI_BIOS_VERSION, "GE.M1.03"),
-+                      DMI_MATCH(DMI_PRODUCT_VERSION, "HP Pavilion Notebook Model GE"),
-+                      DMI_MATCH(DMI_BOARD_VERSION, "OmniBook N32N-736"),
-+              },
-+      },
-+      {
-+              .callback = fix_acer_tm360_irqrouting,
-+              .ident = "Acer TravelMate 36x Laptop",
-+              .matches = {
-+                      DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
-+                      DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
-+              },
-+      },
-+      { }
-+};
-+
-+static int __init pcibios_irq_init(void)
-+{
-+      DBG(KERN_DEBUG "PCI: IRQ init\n");
-+
-+      if (pcibios_enable_irq || raw_pci_ops == NULL)
-+              return 0;
-+
-+      dmi_check_system(pciirq_dmi_table);
-+
-+      pirq_table = pirq_find_routing_table();
-+
-+#ifdef CONFIG_PCI_BIOS
-+      if (!pirq_table && (pci_probe & PCI_BIOS_IRQ_SCAN))
-+              pirq_table = pcibios_get_irq_routing_table();
-+#endif
-+      if (pirq_table) {
-+              pirq_peer_trick();
-+              pirq_find_router(&pirq_router);
-+              if (pirq_table->exclusive_irqs) {
-+                      int i;
-+                      for (i=0; i<16; i++)
-+                              if (!(pirq_table->exclusive_irqs & (1 << i)))
-+                                      pirq_penalty[i] += 100;
-+              }
-+              /* If we're using the I/O APIC, avoid using the PCI IRQ routing table */
-+              if (io_apic_assign_pci_irqs)
-+                      pirq_table = NULL;
-+      }
-+
-+      pcibios_enable_irq = pirq_enable_irq;
-+
-+      pcibios_fixup_irqs();
-+      return 0;
-+}
-+
-+subsys_initcall(pcibios_irq_init);
-+
-+
-+static void pirq_penalize_isa_irq(int irq, int active)
-+{
-+      /*
-+       *  If any ISAPnP device reports an IRQ in its list of possible
-+       *  IRQ's, we try to avoid assigning it to PCI devices.
-+       */
-+      if (irq < 16) {
-+              if (active)
-+                      pirq_penalty[irq] += 1000;
-+              else
-+                      pirq_penalty[irq] += 100;
-+      }
-+}
-+
-+void pcibios_penalize_isa_irq(int irq, int active)
-+{
-+#ifdef CONFIG_ACPI
-+      if (!acpi_noirq)
-+              acpi_penalize_isa_irq(irq, active);
-+      else
-+#endif
-+              pirq_penalize_isa_irq(irq, active);
-+}
-+
-+static int pirq_enable_irq(struct pci_dev *dev)
-+{
-+      u8 pin;
-+      struct pci_dev *temp_dev;
-+
-+      pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
-+      if (pin && !pcibios_lookup_irq(dev, 1) && !dev->irq) {
-+              char *msg = "";
-+
-+              pin--;          /* interrupt pins are numbered starting from 1 */
-+
-+              if (io_apic_assign_pci_irqs) {
-+                      int irq;
-+
-+                      irq = IO_APIC_get_PCI_irq_vector(dev->bus->number, PCI_SLOT(dev->devfn), pin);
-+                      /*
-+                       * Busses behind bridges are typically not listed in the MP-table.
-+                       * In this case we have to look up the IRQ based on the parent bus,
-+                       * parent slot, and pin number. The SMP code detects such bridged
-+                       * busses itself so we should get into this branch reliably.
-+                       */
-+                      temp_dev = dev;
-+                      while (irq < 0 && dev->bus->parent) { /* go back to the bridge */
-+                              struct pci_dev * bridge = dev->bus->self;
-+
-+                              pin = (pin + PCI_SLOT(dev->devfn)) % 4;
-+                              irq = IO_APIC_get_PCI_irq_vector(bridge->bus->number, 
-+                                              PCI_SLOT(bridge->devfn), pin);
-+                              if (irq >= 0)
-+                                      printk(KERN_WARNING "PCI: using PPB %s[%c] to get irq %d\n",
-+                                              pci_name(bridge), 'A' + pin, irq);
-+                              dev = bridge;
-+                      }
-+                      dev = temp_dev;
-+                      if (irq >= 0) {
-+#ifdef CONFIG_PCI_MSI
-+                              if (!platform_legacy_irq(irq))
-+                                      irq = IO_APIC_VECTOR(irq);
-+#endif
-+                              printk(KERN_INFO "PCI->APIC IRQ transform: %s[%c] -> IRQ %d\n",
-+                                      pci_name(dev), 'A' + pin, irq);
-+                              dev->irq = irq;
-+                              return 0;
-+                      } else
-+                              msg = " Probably buggy MP table.";
-+              } else if (pci_probe & PCI_BIOS_IRQ_SCAN)
-+                      msg = "";
-+              else
-+                      msg = " Please try using pci=biosirq.";
-+
-+              /* With IDE legacy devices the IRQ lookup failure is not a problem.. */
-+              if (dev->class >> 8 == PCI_CLASS_STORAGE_IDE && !(dev->class & 0x5))
-+                      return 0;
-+
-+              printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
-+                     'A' + pin, pci_name(dev), msg);
-+      }
-+      return 0;
-+}
-+
-+int pci_vector_resources(int last, int nr_released)
-+{
-+      int count = nr_released;
-+
-+      int next = last;
-+      int offset = (last % 8);
-+
-+      while (next < FIRST_SYSTEM_VECTOR) {
-+              next += 8;
-+#ifdef CONFIG_X86_64
-+              if (next == IA32_SYSCALL_VECTOR)
-+                      continue;
-+#else
-+              if (next == SYSCALL_VECTOR)
-+                      continue;
-+#endif
-+              count++;
-+              if (next >= FIRST_SYSTEM_VECTOR) {
-+                      if (offset%8) {
-+                              next = FIRST_DEVICE_VECTOR + offset;
-+                              offset++;
-+                              continue;
-+                      }
-+                      count--;
-+              }
-+      }
-+
-+      return count;
-+}
-Index: head-2008-11-25/arch/x86/pci/pcifront.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/pci/pcifront.c    2007-06-12 13:12:49.000000000 +0200
-@@ -0,0 +1,55 @@
-+/*
-+ * PCI Frontend Stub - puts some "dummy" functions in to the Linux x86 PCI core
-+ *                     to support the Xen PCI Frontend's operation
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+#include <asm/acpi.h>
-+#include "pci.h"
-+
-+static int pcifront_enable_irq(struct pci_dev *dev)
-+{
-+      u8 irq;
-+      pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &irq);
-+      dev->irq = irq;
-+
-+      return 0;
-+}
-+
-+extern u8 pci_cache_line_size;
-+
-+static int __init pcifront_x86_stub_init(void)
-+{
-+      struct cpuinfo_x86 *c = &boot_cpu_data;
-+
-+      /* Only install our method if we haven't found real hardware already */
-+      if (raw_pci_ops)
-+              return 0;
-+
-+      printk(KERN_INFO "PCI: setting up Xen PCI frontend stub\n");
-+
-+      /* Copied from arch/i386/pci/common.c */
-+      pci_cache_line_size = 32 >> 2;
-+      if (c->x86 >= 6 && c->x86_vendor == X86_VENDOR_AMD)
-+              pci_cache_line_size = 64 >> 2;  /* K7 & K8 */
-+      else if (c->x86 > 6 && c->x86_vendor == X86_VENDOR_INTEL)
-+              pci_cache_line_size = 128 >> 2; /* P4 */
-+
-+      /* On x86, we need to disable the normal IRQ routing table and
-+       * just ask the backend
-+       */
-+      pcibios_enable_irq = pcifront_enable_irq;
-+      pcibios_disable_irq = NULL;
-+
-+#ifdef CONFIG_ACPI
-+      /* Keep ACPI out of the picture */
-+      acpi_noirq = 1;
-+#endif
-+
-+      return 0;
-+}
-+
-+arch_initcall(pcifront_x86_stub_init);
-Index: head-2008-11-25/arch/x86/ia32/ia32entry-xen.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/ia32/ia32entry-xen.S      2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,666 @@
-+/*
-+ * Compatibility mode system call entry point for x86-64. 
-+ *            
-+ * Copyright 2000-2002 Andi Kleen, SuSE Labs.
-+ */            
-+
-+#include <asm/dwarf2.h>
-+#include <asm/calling.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/current.h>
-+#include <asm/errno.h>
-+#include <asm/ia32_unistd.h>  
-+#include <asm/thread_info.h>  
-+#include <asm/segment.h>
-+#include <asm/vsyscall32.h>
-+#include <asm/irqflags.h>
-+#include <linux/linkage.h>
-+
-+#define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)
-+
-+      .macro IA32_ARG_FIXUP noebp=0
-+      movl    %edi,%r8d
-+      .if \noebp
-+      .else
-+      movl    %ebp,%r9d
-+      .endif
-+      xchg    %ecx,%esi
-+      movl    %ebx,%edi
-+      movl    %edx,%edx       /* zero extension */
-+      .endm 
-+
-+      /* clobbers %eax */     
-+      .macro  CLEAR_RREGS
-+      xorl    %eax,%eax
-+      movq    %rax,R11(%rsp)
-+      movq    %rax,R10(%rsp)
-+      movq    %rax,R9(%rsp)
-+      movq    %rax,R8(%rsp)
-+      .endm
-+
-+      .macro LOAD_ARGS32 offset
-+      movl \offset(%rsp),%r11d
-+      movl \offset+8(%rsp),%r10d
-+      movl \offset+16(%rsp),%r9d
-+      movl \offset+24(%rsp),%r8d
-+      movl \offset+40(%rsp),%ecx
-+      movl \offset+48(%rsp),%edx
-+      movl \offset+56(%rsp),%esi
-+      movl \offset+64(%rsp),%edi
-+      movl \offset+72(%rsp),%eax
-+      .endm
-+
-+      .macro CFI_STARTPROC32 simple
-+      CFI_STARTPROC   \simple
-+      CFI_UNDEFINED   r8
-+      CFI_UNDEFINED   r9
-+      CFI_UNDEFINED   r10
-+      CFI_UNDEFINED   r11
-+      CFI_UNDEFINED   r12
-+      CFI_UNDEFINED   r13
-+      CFI_UNDEFINED   r14
-+      CFI_UNDEFINED   r15
-+      .endm
-+
-+/*
-+ * 32bit SYSENTER instruction entry.
-+ *
-+ * Arguments:
-+ * %eax       System call number.
-+ * %ebx Arg1
-+ * %ecx Arg2
-+ * %edx Arg3
-+ * %esi Arg4
-+ * %edi Arg5
-+ * %ebp user stack
-+ * 0(%ebp) Arg6       
-+ *    
-+ * Interrupts on.
-+ *    
-+ * This is purely a fast path. For anything complicated we use the int 0x80
-+ * path below.        Set up a complete hardware stack frame to share code
-+ * with the int 0x80 path.
-+ */   
-+ENTRY(ia32_sysenter_target)
-+      CFI_STARTPROC32 simple
-+      CFI_DEF_CFA     rsp,SS+8-RIP+16
-+      /*CFI_REL_OFFSET        ss,SS-RIP+16*/
-+      CFI_REL_OFFSET  rsp,RSP-RIP+16
-+      /*CFI_REL_OFFSET        rflags,EFLAGS-RIP+16*/
-+      /*CFI_REL_OFFSET        cs,CS-RIP+16*/
-+      CFI_REL_OFFSET  rip,RIP-RIP+16
-+      CFI_REL_OFFSET  r11,8
-+      CFI_REL_OFFSET  rcx,0
-+      movq    8(%rsp),%r11
-+      CFI_RESTORE     r11
-+      popq    %rcx
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_RESTORE     rcx
-+      movl    %ebp,%ebp               /* zero extension */
-+      movl    %eax,%eax
-+      movl    $__USER32_DS,40(%rsp)
-+      movq    %rbp,32(%rsp)
-+      movl    $__USER32_CS,16(%rsp)
-+      movl    $VSYSCALL32_SYSEXIT,8(%rsp)
-+      movq    %rax,(%rsp)
-+      cld
-+      SAVE_ARGS 0,0,0
-+      /* no need to do an access_ok check here because rbp has been
-+         32bit zero extended */ 
-+1:    movl    (%rbp),%r9d
-+      .section __ex_table,"a"
-+      .quad 1b,ia32_badarg
-+      .previous       
-+      GET_THREAD_INFO(%r10)
-+      orl    $TS_COMPAT,threadinfo_status(%r10)
-+      testl  $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-+      jnz  sysenter_tracesys
-+sysenter_do_call:     
-+      cmpl    $(IA32_NR_syscalls-1),%eax
-+      ja      ia32_badsys
-+      IA32_ARG_FIXUP 1
-+      call    *ia32_sys_call_table(,%rax,8)
-+      movq    %rax,RAX-ARGOFFSET(%rsp)
-+      jmp int_ret_from_sys_call
-+
-+sysenter_tracesys:
-+      SAVE_REST
-+      CLEAR_RREGS
-+      movq    $-ENOSYS,RAX(%rsp)      /* really needed? */
-+      movq    %rsp,%rdi        /* &pt_regs -> arg1 */
-+      call    syscall_trace_enter
-+      LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
-+      RESTORE_REST
-+      movl    %ebp, %ebp
-+      /* no need to do an access_ok check here because rbp has been
-+         32bit zero extended */ 
-+1:    movl    (%rbp),%r9d
-+      .section __ex_table,"a"
-+      .quad 1b,ia32_badarg
-+      .previous
-+      jmp     sysenter_do_call
-+      CFI_ENDPROC
-+ENDPROC(ia32_sysenter_target)
-+
-+/*
-+ * 32bit SYSCALL instruction entry.
-+ *
-+ * Arguments:
-+ * %eax       System call number.
-+ * %ebx Arg1
-+ * %ecx return EIP 
-+ * %edx Arg3
-+ * %esi Arg4
-+ * %edi Arg5
-+ * %ebp Arg2    [note: not saved in the stack frame, should not be touched]
-+ * %esp user stack 
-+ * 0(%esp) Arg6
-+ *    
-+ * Interrupts on.
-+ *    
-+ * This is purely a fast path. For anything complicated we use the int 0x80
-+ * path below.        Set up a complete hardware stack frame to share code
-+ * with the int 0x80 path.    
-+ */   
-+ENTRY(ia32_cstar_target)
-+      CFI_STARTPROC32 simple
-+      CFI_DEF_CFA     rsp,SS+8-RIP+16
-+      /*CFI_REL_OFFSET        ss,SS-RIP+16*/
-+      CFI_REL_OFFSET  rsp,RSP-RIP+16
-+      /*CFI_REL_OFFSET        rflags,EFLAGS-RIP+16*/
-+      /*CFI_REL_OFFSET        cs,CS-RIP+16*/
-+      CFI_REL_OFFSET  rip,RIP-RIP+16
-+      movl    %eax,%eax       /* zero extension */
-+      movl    RSP-RIP+16(%rsp),%r8d
-+      SAVE_ARGS -8,1,1
-+      movq    %rax,ORIG_RAX-ARGOFFSET(%rsp)
-+      movq    %rbp,RCX-ARGOFFSET(%rsp) /* this lies slightly to ptrace */
-+      movl    %ebp,%ecx
-+      movl    $__USER32_CS,CS-ARGOFFSET(%rsp)
-+      movl    $__USER32_DS,SS-ARGOFFSET(%rsp)
-+      /* no need to do an access_ok check here because r8 has been
-+         32bit zero extended */ 
-+      /* hardware stack frame is complete now */      
-+1:    movl    (%r8),%r9d
-+      .section __ex_table,"a"
-+      .quad 1b,ia32_badarg
-+      .previous       
-+      GET_THREAD_INFO(%r10)
-+      orl   $TS_COMPAT,threadinfo_status(%r10)
-+      testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-+      jnz   cstar_tracesys
-+cstar_do_call:        
-+      cmpl $IA32_NR_syscalls-1,%eax
-+      ja  ia32_badsys
-+      IA32_ARG_FIXUP 1
-+      call *ia32_sys_call_table(,%rax,8)
-+      movq %rax,RAX-ARGOFFSET(%rsp)
-+      jmp int_ret_from_sys_call
-+      
-+cstar_tracesys:       
-+      SAVE_REST
-+      CLEAR_RREGS
-+      movq $-ENOSYS,RAX(%rsp) /* really needed? */
-+      movq %rsp,%rdi        /* &pt_regs -> arg1 */
-+      call syscall_trace_enter
-+      LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
-+      RESTORE_REST
-+      movl RSP-ARGOFFSET(%rsp), %r8d
-+      /* no need to do an access_ok check here because r8 has been
-+         32bit zero extended */ 
-+1:    movl    (%r8),%r9d
-+      .section __ex_table,"a"
-+      .quad 1b,ia32_badarg
-+      .previous
-+      jmp cstar_do_call
-+END(ia32_cstar_target)
-+                              
-+ia32_badarg:
-+      movq $-EFAULT,%rax
-+      jmp ia32_sysret
-+      CFI_ENDPROC
-+
-+/* 
-+ * Emulated IA32 system calls via int 0x80. 
-+ *
-+ * Arguments:  
-+ * %eax       System call number.
-+ * %ebx Arg1
-+ * %ecx Arg2
-+ * %edx Arg3
-+ * %esi Arg4
-+ * %edi Arg5
-+ * %ebp Arg6    [note: not saved in the stack frame, should not be touched]
-+ *
-+ * Notes:
-+ * Uses the same stack frame as the x86-64 version.   
-+ * All registers except %eax must be saved (but ptrace may violate that)
-+ * Arguments are zero extended. For system calls that want sign extension and
-+ * take long arguments a wrapper is needed. Most calls can just be called
-+ * directly.
-+ * Assumes it is only called from user space and entered with interrupts on.
-+ */                           
-+
-+ENTRY(ia32_syscall)
-+      CFI_STARTPROC   simple
-+      CFI_DEF_CFA     rsp,SS+8-RIP+16
-+      /*CFI_REL_OFFSET        ss,SS-RIP+16*/
-+      CFI_REL_OFFSET  rsp,RSP-RIP+16
-+      /*CFI_REL_OFFSET        rflags,EFLAGS-RIP+16*/
-+      /*CFI_REL_OFFSET        cs,CS-RIP+16*/
-+      CFI_REL_OFFSET  rip,RIP-RIP+16
-+      CFI_REL_OFFSET  r11,8
-+      CFI_REL_OFFSET  rcx,0
-+      movq 8(%rsp),%r11
-+      CFI_RESTORE     r11
-+      popq %rcx
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_RESTORE     rcx
-+      movl %eax,%eax
-+      movq %rax,(%rsp)
-+      cld
-+      /* note the registers are not zero extended to the sf.
-+         this could be a problem. */
-+      SAVE_ARGS 0,0,1
-+      GET_THREAD_INFO(%r10)
-+      orl   $TS_COMPAT,threadinfo_status(%r10)
-+      testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%r10)
-+      jnz ia32_tracesys
-+ia32_do_syscall:      
-+      cmpl $(IA32_NR_syscalls-1),%eax
-+      ja  ia32_badsys
-+      IA32_ARG_FIXUP
-+      call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
-+ia32_sysret:
-+      movq %rax,RAX-ARGOFFSET(%rsp)
-+      jmp int_ret_from_sys_call 
-+
-+ia32_tracesys:                         
-+      SAVE_REST
-+      movq $-ENOSYS,RAX(%rsp) /* really needed? */
-+      movq %rsp,%rdi        /* &pt_regs -> arg1 */
-+      call syscall_trace_enter
-+      LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
-+      RESTORE_REST
-+      jmp ia32_do_syscall
-+END(ia32_syscall)
-+
-+ia32_badsys:
-+      movq $0,ORIG_RAX-ARGOFFSET(%rsp)
-+      movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-+      jmp int_ret_from_sys_call
-+
-+quiet_ni_syscall:
-+      movq $-ENOSYS,%rax
-+      ret
-+      CFI_ENDPROC
-+      
-+      .macro PTREGSCALL label, func, arg
-+      .globl \label
-+\label:
-+      leaq \func(%rip),%rax
-+      leaq -ARGOFFSET+8(%rsp),\arg    /* 8 for return address */
-+      jmp  ia32_ptregs_common 
-+      .endm
-+
-+      CFI_STARTPROC32
-+
-+      PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
-+      PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
-+      PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
-+      PTREGSCALL stub32_sigsuspend, sys32_sigsuspend, %rcx
-+      PTREGSCALL stub32_execve, sys32_execve, %rcx
-+      PTREGSCALL stub32_fork, sys_fork, %rdi
-+      PTREGSCALL stub32_clone, sys32_clone, %rdx
-+      PTREGSCALL stub32_vfork, sys_vfork, %rdi
-+      PTREGSCALL stub32_iopl, sys_iopl, %rsi
-+      PTREGSCALL stub32_rt_sigsuspend, sys_rt_sigsuspend, %rdx
-+
-+ENTRY(ia32_ptregs_common)
-+      popq %r11
-+      CFI_ENDPROC
-+      CFI_STARTPROC32 simple
-+      CFI_DEF_CFA     rsp,SS+8-ARGOFFSET
-+      CFI_REL_OFFSET  rax,RAX-ARGOFFSET
-+      CFI_REL_OFFSET  rcx,RCX-ARGOFFSET
-+      CFI_REL_OFFSET  rdx,RDX-ARGOFFSET
-+      CFI_REL_OFFSET  rsi,RSI-ARGOFFSET
-+      CFI_REL_OFFSET  rdi,RDI-ARGOFFSET
-+      CFI_REL_OFFSET  rip,RIP-ARGOFFSET
-+/*    CFI_REL_OFFSET  cs,CS-ARGOFFSET*/
-+/*    CFI_REL_OFFSET  rflags,EFLAGS-ARGOFFSET*/
-+      CFI_REL_OFFSET  rsp,RSP-ARGOFFSET
-+/*    CFI_REL_OFFSET  ss,SS-ARGOFFSET*/
-+      SAVE_REST
-+      call *%rax
-+      RESTORE_REST
-+      jmp  ia32_sysret        /* misbalances the return cache */
-+      CFI_ENDPROC
-+END(ia32_ptregs_common)
-+
-+      .section .rodata,"a"
-+      .align 8
-+ia32_sys_call_table:
-+      .quad sys_restart_syscall
-+      .quad sys_exit
-+      .quad stub32_fork
-+      .quad sys_read
-+      .quad sys_write
-+      .quad compat_sys_open           /* 5 */
-+      .quad sys_close
-+      .quad sys32_waitpid
-+      .quad sys_creat
-+      .quad sys_link
-+      .quad sys_unlink                /* 10 */
-+      .quad stub32_execve
-+      .quad sys_chdir
-+      .quad compat_sys_time
-+      .quad sys_mknod
-+      .quad sys_chmod         /* 15 */
-+      .quad sys_lchown16
-+      .quad quiet_ni_syscall                  /* old break syscall holder */
-+      .quad sys_stat
-+      .quad sys32_lseek
-+      .quad sys_getpid                /* 20 */
-+      .quad compat_sys_mount  /* mount  */
-+      .quad sys_oldumount     /* old_umount  */
-+      .quad sys_setuid16
-+      .quad sys_getuid16
-+      .quad compat_sys_stime  /* stime */             /* 25 */
-+      .quad sys32_ptrace      /* ptrace */
-+      .quad sys_alarm
-+      .quad sys_fstat /* (old)fstat */
-+      .quad sys_pause
-+      .quad compat_sys_utime  /* 30 */
-+      .quad quiet_ni_syscall  /* old stty syscall holder */
-+      .quad quiet_ni_syscall  /* old gtty syscall holder */
-+      .quad sys_access
-+      .quad sys_nice  
-+      .quad quiet_ni_syscall  /* 35 */        /* old ftime syscall holder */
-+      .quad sys_sync
-+      .quad sys32_kill
-+      .quad sys_rename
-+      .quad sys_mkdir
-+      .quad sys_rmdir         /* 40 */
-+      .quad sys_dup
-+      .quad sys32_pipe
-+      .quad compat_sys_times
-+      .quad quiet_ni_syscall                  /* old prof syscall holder */
-+      .quad sys_brk           /* 45 */
-+      .quad sys_setgid16
-+      .quad sys_getgid16
-+      .quad sys_signal
-+      .quad sys_geteuid16
-+      .quad sys_getegid16     /* 50 */
-+      .quad sys_acct
-+      .quad sys_umount                        /* new_umount */
-+      .quad quiet_ni_syscall                  /* old lock syscall holder */
-+      .quad compat_sys_ioctl
-+      .quad compat_sys_fcntl64                /* 55 */
-+      .quad quiet_ni_syscall                  /* old mpx syscall holder */
-+      .quad sys_setpgid
-+      .quad quiet_ni_syscall                  /* old ulimit syscall holder */
-+      .quad sys32_olduname
-+      .quad sys_umask         /* 60 */
-+      .quad sys_chroot
-+      .quad sys32_ustat
-+      .quad sys_dup2
-+      .quad sys_getppid
-+      .quad sys_getpgrp               /* 65 */
-+      .quad sys_setsid
-+      .quad sys32_sigaction
-+      .quad sys_sgetmask
-+      .quad sys_ssetmask
-+      .quad sys_setreuid16    /* 70 */
-+      .quad sys_setregid16
-+      .quad stub32_sigsuspend
-+      .quad compat_sys_sigpending
-+      .quad sys_sethostname
-+      .quad compat_sys_setrlimit      /* 75 */
-+      .quad compat_sys_old_getrlimit  /* old_getrlimit */
-+      .quad compat_sys_getrusage
-+      .quad sys32_gettimeofday
-+      .quad sys32_settimeofday
-+      .quad sys_getgroups16   /* 80 */
-+      .quad sys_setgroups16
-+      .quad sys32_old_select
-+      .quad sys_symlink
-+      .quad sys_lstat
-+      .quad sys_readlink              /* 85 */
-+#ifdef CONFIG_IA32_AOUT
-+      .quad sys_uselib
-+#else
-+      .quad quiet_ni_syscall
-+#endif
-+      .quad sys_swapon
-+      .quad sys_reboot
-+      .quad compat_sys_old_readdir
-+      .quad sys32_mmap                /* 90 */
-+      .quad sys_munmap
-+      .quad sys_truncate
-+      .quad sys_ftruncate
-+      .quad sys_fchmod
-+      .quad sys_fchown16              /* 95 */
-+      .quad sys_getpriority
-+      .quad sys_setpriority
-+      .quad quiet_ni_syscall                  /* old profil syscall holder */
-+      .quad compat_sys_statfs
-+      .quad compat_sys_fstatfs                /* 100 */
-+      .quad sys_ioperm
-+      .quad compat_sys_socketcall
-+      .quad sys_syslog
-+      .quad compat_sys_setitimer
-+      .quad compat_sys_getitimer      /* 105 */
-+      .quad compat_sys_newstat
-+      .quad compat_sys_newlstat
-+      .quad compat_sys_newfstat
-+      .quad sys32_uname
-+      .quad stub32_iopl               /* 110 */
-+      .quad sys_vhangup
-+      .quad quiet_ni_syscall  /* old "idle" system call */
-+      .quad sys32_vm86_warning        /* vm86old */ 
-+      .quad compat_sys_wait4
-+      .quad sys_swapoff               /* 115 */
-+      .quad sys32_sysinfo
-+      .quad sys32_ipc
-+      .quad sys_fsync
-+      .quad stub32_sigreturn
-+      .quad stub32_clone              /* 120 */
-+      .quad sys_setdomainname
-+      .quad sys_uname
-+      .quad sys_modify_ldt
-+      .quad compat_sys_adjtimex
-+      .quad sys32_mprotect            /* 125 */
-+      .quad compat_sys_sigprocmask
-+      .quad quiet_ni_syscall          /* create_module */
-+      .quad sys_init_module
-+      .quad sys_delete_module
-+      .quad quiet_ni_syscall          /* 130  get_kernel_syms */
-+      .quad sys_quotactl
-+      .quad sys_getpgid
-+      .quad sys_fchdir
-+      .quad quiet_ni_syscall  /* bdflush */
-+      .quad sys_sysfs         /* 135 */
-+      .quad sys_personality
-+      .quad quiet_ni_syscall  /* for afs_syscall */
-+      .quad sys_setfsuid16
-+      .quad sys_setfsgid16
-+      .quad sys_llseek                /* 140 */
-+      .quad compat_sys_getdents
-+      .quad compat_sys_select
-+      .quad sys_flock
-+      .quad sys_msync
-+      .quad compat_sys_readv          /* 145 */
-+      .quad compat_sys_writev
-+      .quad sys_getsid
-+      .quad sys_fdatasync
-+      .quad sys32_sysctl      /* sysctl */
-+      .quad sys_mlock         /* 150 */
-+      .quad sys_munlock
-+      .quad sys_mlockall
-+      .quad sys_munlockall
-+      .quad sys_sched_setparam
-+      .quad sys_sched_getparam   /* 155 */
-+      .quad sys_sched_setscheduler
-+      .quad sys_sched_getscheduler
-+      .quad sys_sched_yield
-+      .quad sys_sched_get_priority_max
-+      .quad sys_sched_get_priority_min  /* 160 */
-+      .quad sys_sched_rr_get_interval
-+      .quad compat_sys_nanosleep
-+      .quad sys_mremap
-+      .quad sys_setresuid16
-+      .quad sys_getresuid16   /* 165 */
-+      .quad sys32_vm86_warning        /* vm86 */ 
-+      .quad quiet_ni_syscall  /* query_module */
-+      .quad sys_poll
-+      .quad compat_sys_nfsservctl
-+      .quad sys_setresgid16   /* 170 */
-+      .quad sys_getresgid16
-+      .quad sys_prctl
-+      .quad stub32_rt_sigreturn
-+      .quad sys32_rt_sigaction
-+      .quad sys32_rt_sigprocmask      /* 175 */
-+      .quad sys32_rt_sigpending
-+      .quad compat_sys_rt_sigtimedwait
-+      .quad sys32_rt_sigqueueinfo
-+      .quad stub32_rt_sigsuspend
-+      .quad sys32_pread               /* 180 */
-+      .quad sys32_pwrite
-+      .quad sys_chown16
-+      .quad sys_getcwd
-+      .quad sys_capget
-+      .quad sys_capset
-+      .quad stub32_sigaltstack
-+      .quad sys32_sendfile
-+      .quad quiet_ni_syscall          /* streams1 */
-+      .quad quiet_ni_syscall          /* streams2 */
-+      .quad stub32_vfork            /* 190 */
-+      .quad compat_sys_getrlimit
-+      .quad sys32_mmap2
-+      .quad sys32_truncate64
-+      .quad sys32_ftruncate64
-+      .quad sys32_stat64              /* 195 */
-+      .quad sys32_lstat64
-+      .quad sys32_fstat64
-+      .quad sys_lchown
-+      .quad sys_getuid
-+      .quad sys_getgid                /* 200 */
-+      .quad sys_geteuid
-+      .quad sys_getegid
-+      .quad sys_setreuid
-+      .quad sys_setregid
-+      .quad sys_getgroups     /* 205 */
-+      .quad sys_setgroups
-+      .quad sys_fchown
-+      .quad sys_setresuid
-+      .quad sys_getresuid
-+      .quad sys_setresgid     /* 210 */
-+      .quad sys_getresgid
-+      .quad sys_chown
-+      .quad sys_setuid
-+      .quad sys_setgid
-+      .quad sys_setfsuid              /* 215 */
-+      .quad sys_setfsgid
-+      .quad sys_pivot_root
-+      .quad sys_mincore
-+      .quad sys_madvise
-+      .quad compat_sys_getdents64     /* 220 getdents64 */
-+      .quad compat_sys_fcntl64        
-+      .quad quiet_ni_syscall          /* tux */
-+      .quad quiet_ni_syscall          /* security */
-+      .quad sys_gettid        
-+      .quad sys_readahead     /* 225 */
-+      .quad sys_setxattr
-+      .quad sys_lsetxattr
-+      .quad sys_fsetxattr
-+      .quad sys_getxattr
-+      .quad sys_lgetxattr     /* 230 */
-+      .quad sys_fgetxattr
-+      .quad sys_listxattr
-+      .quad sys_llistxattr
-+      .quad sys_flistxattr
-+      .quad sys_removexattr   /* 235 */
-+      .quad sys_lremovexattr
-+      .quad sys_fremovexattr
-+      .quad sys_tkill
-+      .quad sys_sendfile64 
-+      .quad compat_sys_futex          /* 240 */
-+      .quad compat_sys_sched_setaffinity
-+      .quad compat_sys_sched_getaffinity
-+      .quad sys32_set_thread_area
-+      .quad sys32_get_thread_area
-+      .quad compat_sys_io_setup       /* 245 */
-+      .quad sys_io_destroy
-+      .quad compat_sys_io_getevents
-+      .quad compat_sys_io_submit
-+      .quad sys_io_cancel
-+      .quad sys_fadvise64             /* 250 */
-+      .quad quiet_ni_syscall  /* free_huge_pages */
-+      .quad sys_exit_group
-+      .quad sys32_lookup_dcookie
-+      .quad sys_epoll_create
-+      .quad sys_epoll_ctl             /* 255 */
-+      .quad sys_epoll_wait
-+      .quad sys_remap_file_pages
-+      .quad sys_set_tid_address
-+      .quad compat_sys_timer_create
-+      .quad compat_sys_timer_settime  /* 260 */
-+      .quad compat_sys_timer_gettime
-+      .quad sys_timer_getoverrun
-+      .quad sys_timer_delete
-+      .quad compat_sys_clock_settime
-+      .quad compat_sys_clock_gettime  /* 265 */
-+      .quad compat_sys_clock_getres
-+      .quad compat_sys_clock_nanosleep
-+      .quad compat_sys_statfs64
-+      .quad compat_sys_fstatfs64
-+      .quad sys_tgkill                /* 270 */
-+      .quad compat_sys_utimes
-+      .quad sys32_fadvise64_64
-+      .quad quiet_ni_syscall  /* sys_vserver */
-+      .quad sys_mbind
-+      .quad compat_sys_get_mempolicy  /* 275 */
-+      .quad sys_set_mempolicy
-+      .quad compat_sys_mq_open
-+      .quad sys_mq_unlink
-+      .quad compat_sys_mq_timedsend
-+      .quad compat_sys_mq_timedreceive        /* 280 */
-+      .quad compat_sys_mq_notify
-+      .quad compat_sys_mq_getsetattr
-+      .quad compat_sys_kexec_load     /* reserved for kexec */
-+      .quad compat_sys_waitid
-+      .quad quiet_ni_syscall          /* 285: sys_altroot */
-+      .quad sys_add_key
-+      .quad sys_request_key
-+      .quad sys_keyctl
-+      .quad sys_ioprio_set
-+      .quad sys_ioprio_get            /* 290 */
-+      .quad sys_inotify_init
-+      .quad sys_inotify_add_watch
-+      .quad sys_inotify_rm_watch
-+      .quad sys_migrate_pages
-+      .quad compat_sys_openat         /* 295 */
-+      .quad sys_mkdirat
-+      .quad sys_mknodat
-+      .quad sys_fchownat
-+      .quad compat_sys_futimesat
-+      .quad sys32_fstatat             /* 300 */
-+      .quad sys_unlinkat
-+      .quad sys_renameat
-+      .quad sys_linkat
-+      .quad sys_symlinkat
-+      .quad sys_readlinkat            /* 305 */
-+      .quad sys_fchmodat
-+      .quad sys_faccessat
-+      .quad quiet_ni_syscall          /* pselect6 for now */
-+      .quad quiet_ni_syscall          /* ppoll for now */
-+      .quad sys_unshare               /* 310 */
-+      .quad compat_sys_set_robust_list
-+      .quad compat_sys_get_robust_list
-+      .quad sys_splice
-+      .quad sys_sync_file_range
-+      .quad sys_tee
-+      .quad compat_sys_vmsplice
-+      .quad compat_sys_move_pages
-+ia32_syscall_end:             
-Index: head-2008-11-25/arch/x86/kernel/acpi/sleep_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/acpi/sleep_64-xen.c        2008-04-15 09:29:41.000000000 +0200
-@@ -0,0 +1,146 @@
-+/*
-+ *  acpi.c - Architecture-Specific Low-Level ACPI Support
-+ *
-+ *  Copyright (C) 2001, 2002 Paul Diefenbaugh <paul.s.diefenbaugh@intel.com>
-+ *  Copyright (C) 2001 Jun Nakajima <jun.nakajima@intel.com>
-+ *  Copyright (C) 2001 Patrick Mochel <mochel@osdl.org>
-+ *  Copyright (C) 2002 Andi Kleen, SuSE Labs (x86-64 port)
-+ *  Copyright (C) 2003 Pavel Machek, SuSE Labs
-+ *
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License as published by
-+ *  the Free Software Foundation; either version 2 of the License, or
-+ *  (at your option) any later version.
-+ *
-+ *  This program is distributed in the hope that it will be useful,
-+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ *  GNU General Public License for more details.
-+ *
-+ *  You should have received a copy of the GNU General Public License
-+ *  along with this program; if not, write to the Free Software
-+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/types.h>
-+#include <linux/stddef.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/bootmem.h>
-+#include <linux/acpi.h>
-+#include <linux/cpumask.h>
-+
-+#include <asm/mpspec.h>
-+#include <asm/io.h>
-+#include <asm/apic.h>
-+#include <asm/apicdef.h>
-+#include <asm/page.h>
-+#include <asm/pgtable.h>
-+#include <asm/pgalloc.h>
-+#include <asm/io_apic.h>
-+#include <asm/proto.h>
-+#include <asm/tlbflush.h>
-+
-+/* --------------------------------------------------------------------------
-+                              Low-Level Sleep Support
-+   -------------------------------------------------------------------------- */
-+
-+#ifdef CONFIG_ACPI_SLEEP
-+
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+/* address in low memory of the wakeup routine. */
-+unsigned long acpi_wakeup_address = 0;
-+unsigned long acpi_video_flags;
-+extern char wakeup_start, wakeup_end;
-+
-+extern unsigned long FASTCALL(acpi_copy_wakeup_routine(unsigned long));
-+
-+static pgd_t low_ptr;
-+
-+static void init_low_mapping(void)
-+{
-+      pgd_t *slot0 = pgd_offset(current->mm, 0UL);
-+      low_ptr = *slot0;
-+      set_pgd(slot0, *pgd_offset(current->mm, PAGE_OFFSET));
-+      WARN_ON(num_online_cpus() != 1);
-+      local_flush_tlb();
-+}
-+#endif
-+
-+/**
-+ * acpi_save_state_mem - save kernel state
-+ *
-+ * Create an identity mapped page table and copy the wakeup routine to
-+ * low memory.
-+ */
-+int acpi_save_state_mem(void)
-+{
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+      init_low_mapping();
-+
-+      memcpy((void *)acpi_wakeup_address, &wakeup_start,
-+             &wakeup_end - &wakeup_start);
-+      acpi_copy_wakeup_routine(acpi_wakeup_address);
-+#endif
-+      return 0;
-+}
-+
-+/*
-+ * acpi_restore_state
-+ */
-+void acpi_restore_state_mem(void)
-+{
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+      set_pgd(pgd_offset(current->mm, 0UL), low_ptr);
-+      local_flush_tlb();
-+#endif
-+}
-+
-+/**
-+ * acpi_reserve_bootmem - do _very_ early ACPI initialisation
-+ *
-+ * We allocate a page in low memory for the wakeup
-+ * routine for when we come back from a sleep state. The
-+ * runtime allocator allows specification of <16M pages, but not
-+ * <1M pages.
-+ */
-+void __init acpi_reserve_bootmem(void)
-+{
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+      acpi_wakeup_address = (unsigned long)alloc_bootmem_low(PAGE_SIZE);
-+      if ((&wakeup_end - &wakeup_start) > PAGE_SIZE)
-+              printk(KERN_CRIT
-+                     "ACPI: Wakeup code way too big, will crash on attempt to suspend\n");
-+#endif
-+}
-+
-+#ifndef CONFIG_ACPI_PV_SLEEP
-+static int __init acpi_sleep_setup(char *str)
-+{
-+      while ((str != NULL) && (*str != '\0')) {
-+              if (strncmp(str, "s3_bios", 7) == 0)
-+                      acpi_video_flags = 1;
-+              if (strncmp(str, "s3_mode", 7) == 0)
-+                      acpi_video_flags |= 2;
-+              str = strchr(str, ',');
-+              if (str != NULL)
-+                      str += strspn(str, ", \t");
-+      }
-+
-+      return 1;
-+}
-+
-+__setup("acpi_sleep=", acpi_sleep_setup);
-+#endif                                /* CONFIG_ACPI_PV_SLEEP */
-+
-+#endif                                /*CONFIG_ACPI_SLEEP */
-+
-+void acpi_pci_link_exit(void)
-+{
-+}
-Index: head-2008-11-25/arch/x86/kernel/apic_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/apic_64-xen.c      2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,197 @@
-+/*
-+ *    Local APIC handling, local APIC timers
-+ *
-+ *    (c) 1999, 2000 Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *    Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
-+ *                                    thanks to Eric Gilmore
-+ *                                    and Rolf G. Tews
-+ *                                    for testing these extensively.
-+ *    Maciej W. Rozycki       :       Various updates and fixes.
-+ *    Mikael Pettersson       :       Power Management for UP-APIC.
-+ *    Pavel Machek and
-+ *    Mikael Pettersson       :       PM converted to driver model.
-+ */
-+
-+#include <linux/init.h>
-+
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/bootmem.h>
-+#include <linux/smp_lock.h>
-+#include <linux/interrupt.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/sysdev.h>
-+#include <linux/module.h>
-+
-+#include <asm/atomic.h>
-+#include <asm/smp.h>
-+#include <asm/mtrr.h>
-+#include <asm/mpspec.h>
-+#include <asm/desc.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/hpet.h>
-+#include <asm/idle.h>
-+
-+int apic_verbosity;
-+
-+/*
-+ * 'what should we do if we get a hw irq event on an illegal vector'.
-+ * each architecture has to answer this themselves.
-+ */
-+void ack_bad_irq(unsigned int irq)
-+{
-+      printk("unexpected IRQ trap at vector %02x\n", irq);
-+      /*
-+       * Currently unexpected vectors happen only on SMP and APIC.
-+       * We _must_ ack these because every local APIC has only N
-+       * irq slots per priority level, and a 'hanging, unacked' IRQ
-+       * holds up an irq slot - in excessive cases (when multiple
-+       * unexpected vectors occur) that might lock up the APIC
-+       * completely.
-+       * But don't ack when the APIC is disabled. -AK
-+       */
-+      if (!disable_apic)
-+              ack_APIC_irq();
-+}
-+
-+int setup_profiling_timer(unsigned int multiplier)
-+{
-+      return -EINVAL;
-+}
-+
-+void smp_local_timer_interrupt(struct pt_regs *regs)
-+{
-+      profile_tick(CPU_PROFILING, regs);
-+#ifndef CONFIG_XEN
-+#ifdef CONFIG_SMP
-+              update_process_times(user_mode(regs));
-+#endif
-+#endif
-+      /*
-+       * We take the 'long' return path, and there every subsystem
-+       * grabs the appropriate locks (kernel lock/ irq lock).
-+       *
-+       * we might want to decouple profiling from the 'long path',
-+       * and do the profiling totally in assembly.
-+       *
-+       * Currently this isn't too much of an issue (performance wise),
-+       * we can take more than 100K local irqs per second on a 100 MHz P5.
-+       */
-+}
-+
-+/*
-+ * Local APIC timer interrupt. This is the most natural way for doing
-+ * local interrupts, but local timer interrupts can be emulated by
-+ * broadcast interrupts too. [in case the hw doesn't support APIC timers]
-+ *
-+ * [ if a single-CPU system runs an SMP kernel then we call the local
-+ *   interrupt as well. Thus we cannot inline the local irq ... ]
-+ */
-+void smp_apic_timer_interrupt(struct pt_regs *regs)
-+{
-+      /*
-+       * the NMI deadlock-detector uses this.
-+       */
-+      add_pda(apic_timer_irqs, 1);
-+
-+      /*
-+       * NOTE! We'd better ACK the irq immediately,
-+       * because timer handling can be slow.
-+       */
-+      ack_APIC_irq();
-+      /*
-+       * update_process_times() expects us to have done irq_enter().
-+       * Besides, if we don't timer interrupts ignore the global
-+       * interrupt lock, which is the WrongThing (tm) to do.
-+       */
-+      exit_idle();
-+      irq_enter();
-+      smp_local_timer_interrupt(regs);
-+      irq_exit();
-+}
-+
-+/*
-+ * This interrupt should _never_ happen with our APIC/SMP architecture
-+ */
-+asmlinkage void smp_spurious_interrupt(void)
-+{
-+      unsigned int v;
-+      exit_idle();
-+      irq_enter();
-+      /*
-+       * Check if this really is a spurious interrupt and ACK it
-+       * if it is a vectored one.  Just in case...
-+       * Spurious interrupts should not be ACKed.
-+       */
-+      v = apic_read(APIC_ISR + ((SPURIOUS_APIC_VECTOR & ~0x1f) >> 1));
-+      if (v & (1 << (SPURIOUS_APIC_VECTOR & 0x1f)))
-+              ack_APIC_irq();
-+
-+#if 0
-+      static unsigned long last_warning; 
-+      static unsigned long skipped; 
-+
-+      /* see sw-dev-man vol 3, chapter 7.4.13.5 */
-+      if (time_before(last_warning+30*HZ,jiffies)) { 
-+              printk(KERN_INFO "spurious APIC interrupt on CPU#%d, %ld skipped.\n",
-+                     smp_processor_id(), skipped);
-+              last_warning = jiffies; 
-+              skipped = 0;
-+      } else { 
-+              skipped++; 
-+      } 
-+#endif 
-+      irq_exit();
-+}
-+
-+/*
-+ * This interrupt should never happen with our APIC/SMP architecture
-+ */
-+
-+asmlinkage void smp_error_interrupt(void)
-+{
-+      unsigned int v, v1;
-+
-+      exit_idle();
-+      irq_enter();
-+      /* First tickle the hardware, only then report what went on. -- REW */
-+      v = apic_read(APIC_ESR);
-+      apic_write(APIC_ESR, 0);
-+      v1 = apic_read(APIC_ESR);
-+      ack_APIC_irq();
-+      atomic_inc(&irq_err_count);
-+
-+      /* Here is what the APIC error bits mean:
-+         0: Send CS error
-+         1: Receive CS error
-+         2: Send accept error
-+         3: Receive accept error
-+         4: Reserved
-+         5: Send illegal vector
-+         6: Received illegal vector
-+         7: Illegal register address
-+      */
-+      printk (KERN_DEBUG "APIC error on CPU%d: %02x(%02x)\n",
-+              smp_processor_id(), v , v1);
-+      irq_exit();
-+}
-+
-+int disable_apic;
-+
-+/*
-+ * This initializes the IO-APIC and APIC hardware if this is
-+ * a UP kernel.
-+ */
-+int __init APIC_init_uniprocessor (void)
-+{
-+#ifdef CONFIG_X86_IO_APIC
-+      if (smp_found_config)
-+              if (!skip_ioapic_setup && nr_ioapics)
-+                      setup_IO_APIC();
-+#endif
-+
-+      return 1;
-+}
-Index: head-2008-11-25/arch/x86/kernel/e820_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/e820_64-xen.c      2008-04-22 19:56:27.000000000 +0200
-@@ -0,0 +1,798 @@
-+/* 
-+ * Handle the memory map.
-+ * The functions here do the job until bootmem takes over.
-+ *
-+ *  Getting sanitize_e820_map() in sync with i386 version by applying change:
-+ *  -  Provisions for empty E820 memory regions (reported by certain BIOSes).
-+ *     Alex Achenbach <xela@slit.de>, December 2002.
-+ *  Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
-+ *
-+ */
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <linux/init.h>
-+#include <linux/bootmem.h>
-+#include <linux/ioport.h>
-+#include <linux/string.h>
-+#include <linux/kexec.h>
-+#include <linux/module.h>
-+
-+#include <asm/pgtable.h>
-+#include <asm/page.h>
-+#include <asm/e820.h>
-+#include <asm/proto.h>
-+#include <asm/bootsetup.h>
-+#include <asm/sections.h>
-+#include <xen/interface/memory.h>
-+
-+/* 
-+ * PFN of last memory page.
-+ */
-+unsigned long end_pfn; 
-+EXPORT_SYMBOL(end_pfn);
-+
-+/* 
-+ * end_pfn only includes RAM, while end_pfn_map includes all e820 entries.
-+ * The direct mapping extends to end_pfn_map, so that we can directly access
-+ * apertures, ACPI and other tables without having to play with fixmaps.
-+ */ 
-+unsigned long end_pfn_map; 
-+
-+/* 
-+ * Last pfn which the user wants to use.
-+ */
-+unsigned long end_user_pfn = MAXMEM>>PAGE_SHIFT;  
-+
-+extern struct resource code_resource, data_resource;
-+
-+#ifdef CONFIG_XEN
-+extern struct e820map machine_e820;
-+#endif
-+
-+/* Check for some hardcoded bad areas that early boot is not allowed to touch */ 
-+static inline int bad_addr(unsigned long *addrp, unsigned long size)
-+{ 
-+      unsigned long addr = *addrp, last = addr + size; 
-+
-+#ifndef CONFIG_XEN
-+      /* various gunk below that needed for SMP startup */
-+      if (addr < 0x8000) { 
-+              *addrp = 0x8000;
-+              return 1; 
-+      }
-+
-+      /* direct mapping tables of the kernel */
-+      if (last >= table_start<<PAGE_SHIFT && addr < table_end<<PAGE_SHIFT) { 
-+              *addrp = table_end << PAGE_SHIFT; 
-+              return 1;
-+      } 
-+
-+      /* initrd */ 
-+#ifdef CONFIG_BLK_DEV_INITRD
-+      if (LOADER_TYPE && INITRD_START && last >= INITRD_START && 
-+          addr < INITRD_START+INITRD_SIZE) { 
-+              *addrp = INITRD_START + INITRD_SIZE; 
-+              return 1;
-+      } 
-+#endif
-+      /* kernel code + 640k memory hole (later should not be needed, but 
-+         be paranoid for now) */
-+      if (last >= 640*1024 && addr < 1024*1024) {
-+              *addrp = 1024*1024;
-+              return 1;
-+      }
-+      if (last >= __pa_symbol(&_text) && last < __pa_symbol(&_end)) {
-+              *addrp = __pa_symbol(&_end);
-+              return 1;
-+      }
-+
-+      if (last >= ebda_addr && addr < ebda_addr + ebda_size) {
-+              *addrp = ebda_addr + ebda_size;
-+              return 1;
-+      }
-+
-+      /* XXX ramdisk image here? */ 
-+#else
-+      if (last < (table_end<<PAGE_SHIFT)) {
-+              *addrp = table_end << PAGE_SHIFT;
-+              return 1;
-+      }
-+#endif
-+      return 0;
-+} 
-+
-+/*
-+ * This function checks if any part of the range <start,end> is mapped
-+ * with type.
-+ */
-+int e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
-+{ 
-+      int i;
-+
-+#ifndef CONFIG_XEN
-+      for (i = 0; i < e820.nr_map; i++) { 
-+              struct e820entry *ei = &e820.map[i]; 
-+#else
-+      if (!is_initial_xendomain())
-+              return 0;
-+      for (i = 0; i < machine_e820.nr_map; i++) {
-+              const struct e820entry *ei = &machine_e820.map[i];
-+#endif
-+
-+              if (type && ei->type != type) 
-+                      continue;
-+              if (ei->addr >= end || ei->addr + ei->size <= start)
-+                      continue; 
-+              return 1; 
-+      } 
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(e820_any_mapped);
-+
-+/*
-+ * This function checks if the entire range <start,end> is mapped with type.
-+ *
-+ * Note: this function only works correct if the e820 table is sorted and
-+ * not-overlapping, which is the case
-+ */
-+int __init e820_all_mapped(unsigned long start, unsigned long end, unsigned type)
-+{
-+      int i;
-+
-+#ifndef CONFIG_XEN
-+      for (i = 0; i < e820.nr_map; i++) {
-+              struct e820entry *ei = &e820.map[i];
-+#else
-+      if (!is_initial_xendomain())
-+              return 0;
-+      for (i = 0; i < machine_e820.nr_map; i++) {
-+              const struct e820entry *ei = &machine_e820.map[i];
-+#endif
-+
-+              if (type && ei->type != type)
-+                      continue;
-+              /* is the region (part) in overlap with the current region ?*/
-+              if (ei->addr >= end || ei->addr + ei->size <= start)
-+                      continue;
-+
-+              /* if the region is at the beginning of <start,end> we move
-+               * start to the end of the region since it's ok until there
-+               */
-+              if (ei->addr <= start)
-+                      start = ei->addr + ei->size;
-+              /* if start is now at or beyond end, we're done, full coverage */
-+              if (start >= end)
-+                      return 1; /* we're done */
-+      }
-+      return 0;
-+}
-+
-+/* 
-+ * Find a free area in a specific range. 
-+ */ 
-+unsigned long __init find_e820_area(unsigned long start, unsigned long end, unsigned size) 
-+{ 
-+      int i; 
-+      for (i = 0; i < e820.nr_map; i++) { 
-+              struct e820entry *ei = &e820.map[i]; 
-+              unsigned long addr = ei->addr, last; 
-+              if (ei->type != E820_RAM) 
-+                      continue; 
-+              if (addr < start) 
-+                      addr = start;
-+              if (addr > ei->addr + ei->size) 
-+                      continue; 
-+              while (bad_addr(&addr, size) && addr+size <= ei->addr+ei->size)
-+                      ;
-+              last = addr + size;
-+              if (last > ei->addr + ei->size)
-+                      continue;
-+              if (last > end) 
-+                      continue;
-+              return addr; 
-+      } 
-+      return -1UL;            
-+} 
-+
-+/* 
-+ * Free bootmem based on the e820 table for a node.
-+ */
-+void __init e820_bootmem_free(pg_data_t *pgdat, unsigned long start,unsigned long end)
-+{
-+      int i;
-+      for (i = 0; i < e820.nr_map; i++) {
-+              struct e820entry *ei = &e820.map[i]; 
-+              unsigned long last, addr;
-+
-+              if (ei->type != E820_RAM || 
-+                  ei->addr+ei->size <= start || 
-+                  ei->addr >= end)
-+                      continue;
-+
-+              addr = round_up(ei->addr, PAGE_SIZE);
-+              if (addr < start) 
-+                      addr = start;
-+
-+              last = round_down(ei->addr + ei->size, PAGE_SIZE); 
-+              if (last >= end)
-+                      last = end; 
-+
-+              if (last > addr && last-addr >= PAGE_SIZE)
-+                      free_bootmem_node(pgdat, addr, last-addr);
-+      }
-+}
-+
-+/*
-+ * Find the highest page frame number we have available
-+ */
-+unsigned long __init e820_end_of_ram(void)
-+{
-+      int i;
-+      unsigned long end_pfn = 0;
-+      
-+      for (i = 0; i < e820.nr_map; i++) {
-+              struct e820entry *ei = &e820.map[i]; 
-+              unsigned long start, end;
-+
-+              start = round_up(ei->addr, PAGE_SIZE); 
-+              end = round_down(ei->addr + ei->size, PAGE_SIZE); 
-+              if (start >= end)
-+                      continue;
-+              if (ei->type == E820_RAM) { 
-+              if (end > end_pfn<<PAGE_SHIFT)
-+                      end_pfn = end>>PAGE_SHIFT;
-+              } else { 
-+                      if (end > end_pfn_map<<PAGE_SHIFT) 
-+                              end_pfn_map = end>>PAGE_SHIFT;
-+              } 
-+      }
-+
-+      if (end_pfn > end_pfn_map) 
-+              end_pfn_map = end_pfn;
-+      if (end_pfn_map > MAXMEM>>PAGE_SHIFT)
-+              end_pfn_map = MAXMEM>>PAGE_SHIFT;
-+      if (end_pfn > end_user_pfn)
-+              end_pfn = end_user_pfn;
-+      if (end_pfn > end_pfn_map) 
-+              end_pfn = end_pfn_map; 
-+
-+      return end_pfn; 
-+}
-+
-+/* 
-+ * Compute how much memory is missing in a range.
-+ * Unlike the other functions in this file the arguments are in page numbers.
-+ */
-+unsigned long __init
-+e820_hole_size(unsigned long start_pfn, unsigned long end_pfn)
-+{
-+      unsigned long ram = 0;
-+      unsigned long start = start_pfn << PAGE_SHIFT;
-+      unsigned long end = end_pfn << PAGE_SHIFT;
-+      int i;
-+      for (i = 0; i < e820.nr_map; i++) {
-+              struct e820entry *ei = &e820.map[i];
-+              unsigned long last, addr;
-+
-+              if (ei->type != E820_RAM ||
-+                  ei->addr+ei->size <= start ||
-+                  ei->addr >= end)
-+                      continue;
-+
-+              addr = round_up(ei->addr, PAGE_SIZE);
-+              if (addr < start)
-+                      addr = start;
-+
-+              last = round_down(ei->addr + ei->size, PAGE_SIZE);
-+              if (last >= end)
-+                      last = end;
-+
-+              if (last > addr)
-+                      ram += last - addr;
-+      }
-+      return ((end - start) - ram) >> PAGE_SHIFT;
-+}
-+
-+/*
-+ * Mark e820 reserved areas as busy for the resource manager.
-+ */
-+void __init e820_reserve_resources(struct e820entry *e820, int nr_map)
-+{
-+      int i;
-+      for (i = 0; i < nr_map; i++) {
-+              struct resource *res;
-+              res = alloc_bootmem_low(sizeof(struct resource));
-+              switch (e820[i].type) {
-+              case E820_RAM:  res->name = "System RAM"; break;
-+              case E820_ACPI: res->name = "ACPI Tables"; break;
-+              case E820_NVS:  res->name = "ACPI Non-volatile Storage"; break;
-+              default:        res->name = "reserved";
-+              }
-+              res->start = e820[i].addr;
-+              res->end = res->start + e820[i].size - 1;
-+              res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-+              request_resource(&iomem_resource, res);
-+              if (e820[i].type == E820_RAM) {
-+                      /*
-+                       *  We don't know which RAM region contains kernel data,
-+                       *  so we try it repeatedly and let the resource manager
-+                       *  test it.
-+                       */
-+#ifndef CONFIG_XEN
-+                      request_resource(res, &code_resource);
-+                      request_resource(res, &data_resource);
-+#endif
-+#ifdef CONFIG_KEXEC
-+                      if (crashk_res.start != crashk_res.end)
-+                              request_resource(res, &crashk_res);
-+#ifdef CONFIG_XEN
-+                      xen_machine_kexec_register_resources(res);
-+#endif
-+#endif
-+              }
-+      }
-+}
-+
-+/* 
-+ * Add a memory region to the kernel e820 map.
-+ */ 
-+void __init add_memory_region(unsigned long start, unsigned long size, int type)
-+{
-+      int x = e820.nr_map;
-+
-+      if (x == E820MAX) {
-+              printk(KERN_ERR "Ooops! Too many entries in the memory map!\n");
-+              return;
-+      }
-+
-+      e820.map[x].addr = start;
-+      e820.map[x].size = size;
-+      e820.map[x].type = type;
-+      e820.nr_map++;
-+}
-+
-+void __init e820_print_map(char *who)
-+{
-+      int i;
-+
-+      for (i = 0; i < e820.nr_map; i++) {
-+              printk(" %s: %016Lx - %016Lx ", who,
-+                      (unsigned long long) e820.map[i].addr,
-+                      (unsigned long long) (e820.map[i].addr + e820.map[i].size));
-+              switch (e820.map[i].type) {
-+              case E820_RAM:  printk("(usable)\n");
-+                              break;
-+              case E820_RESERVED:
-+                              printk("(reserved)\n");
-+                              break;
-+              case E820_ACPI:
-+                              printk("(ACPI data)\n");
-+                              break;
-+              case E820_NVS:
-+                              printk("(ACPI NVS)\n");
-+                              break;
-+              default:        printk("type %u\n", e820.map[i].type);
-+                              break;
-+              }
-+      }
-+}
-+
-+/*
-+ * Sanitize the BIOS e820 map.
-+ *
-+ * Some e820 responses include overlapping entries.  The following 
-+ * replaces the original e820 map with a new one, removing overlaps.
-+ *
-+ */
-+static int __init sanitize_e820_map(struct e820entry * biosmap, char * pnr_map)
-+{
-+      struct change_member {
-+              struct e820entry *pbios; /* pointer to original bios entry */
-+              unsigned long long addr; /* address for this change point */
-+      };
-+      static struct change_member change_point_list[2*E820MAX] __initdata;
-+      static struct change_member *change_point[2*E820MAX] __initdata;
-+      static struct e820entry *overlap_list[E820MAX] __initdata;
-+      static struct e820entry new_bios[E820MAX] __initdata;
-+      struct change_member *change_tmp;
-+      unsigned long current_type, last_type;
-+      unsigned long long last_addr;
-+      int chgidx, still_changing;
-+      int overlap_entries;
-+      int new_bios_entry;
-+      int old_nr, new_nr, chg_nr;
-+      int i;
-+
-+      /*
-+              Visually we're performing the following (1,2,3,4 = memory types)...
-+
-+              Sample memory map (w/overlaps):
-+                 ____22__________________
-+                 ______________________4_
-+                 ____1111________________
-+                 _44_____________________
-+                 11111111________________
-+                 ____________________33__
-+                 ___________44___________
-+                 __________33333_________
-+                 ______________22________
-+                 ___________________2222_
-+                 _________111111111______
-+                 _____________________11_
-+                 _________________4______
-+
-+              Sanitized equivalent (no overlap):
-+                 1_______________________
-+                 _44_____________________
-+                 ___1____________________
-+                 ____22__________________
-+                 ______11________________
-+                 _________1______________
-+                 __________3_____________
-+                 ___________44___________
-+                 _____________33_________
-+                 _______________2________
-+                 ________________1_______
-+                 _________________4______
-+                 ___________________2____
-+                 ____________________33__
-+                 ______________________4_
-+      */
-+
-+      /* if there's only one memory region, don't bother */
-+      if (*pnr_map < 2)
-+              return -1;
-+
-+      old_nr = *pnr_map;
-+
-+      /* bail out if we find any unreasonable addresses in bios map */
-+      for (i=0; i<old_nr; i++)
-+              if (biosmap[i].addr + biosmap[i].size < biosmap[i].addr)
-+                      return -1;
-+
-+      /* create pointers for initial change-point information (for sorting) */
-+      for (i=0; i < 2*old_nr; i++)
-+              change_point[i] = &change_point_list[i];
-+
-+      /* record all known change-points (starting and ending addresses),
-+         omitting those that are for empty memory regions */
-+      chgidx = 0;
-+      for (i=0; i < old_nr; i++)      {
-+              if (biosmap[i].size != 0) {
-+                      change_point[chgidx]->addr = biosmap[i].addr;
-+                      change_point[chgidx++]->pbios = &biosmap[i];
-+                      change_point[chgidx]->addr = biosmap[i].addr + biosmap[i].size;
-+                      change_point[chgidx++]->pbios = &biosmap[i];
-+              }
-+      }
-+      chg_nr = chgidx;
-+
-+      /* sort change-point list by memory addresses (low -> high) */
-+      still_changing = 1;
-+      while (still_changing)  {
-+              still_changing = 0;
-+              for (i=1; i < chg_nr; i++)  {
-+                      /* if <current_addr> > <last_addr>, swap */
-+                      /* or, if current=<start_addr> & last=<end_addr>, swap */
-+                      if ((change_point[i]->addr < change_point[i-1]->addr) ||
-+                              ((change_point[i]->addr == change_point[i-1]->addr) &&
-+                               (change_point[i]->addr == change_point[i]->pbios->addr) &&
-+                               (change_point[i-1]->addr != change_point[i-1]->pbios->addr))
-+                         )
-+                      {
-+                              change_tmp = change_point[i];
-+                              change_point[i] = change_point[i-1];
-+                              change_point[i-1] = change_tmp;
-+                              still_changing=1;
-+                      }
-+              }
-+      }
-+
-+      /* create a new bios memory map, removing overlaps */
-+      overlap_entries=0;       /* number of entries in the overlap table */
-+      new_bios_entry=0;        /* index for creating new bios map entries */
-+      last_type = 0;           /* start with undefined memory type */
-+      last_addr = 0;           /* start with 0 as last starting address */
-+      /* loop through change-points, determining affect on the new bios map */
-+      for (chgidx=0; chgidx < chg_nr; chgidx++)
-+      {
-+              /* keep track of all overlapping bios entries */
-+              if (change_point[chgidx]->addr == change_point[chgidx]->pbios->addr)
-+              {
-+                      /* add map entry to overlap list (> 1 entry implies an overlap) */
-+                      overlap_list[overlap_entries++]=change_point[chgidx]->pbios;
-+              }
-+              else
-+              {
-+                      /* remove entry from list (order independent, so swap with last) */
-+                      for (i=0; i<overlap_entries; i++)
-+                      {
-+                              if (overlap_list[i] == change_point[chgidx]->pbios)
-+                                      overlap_list[i] = overlap_list[overlap_entries-1];
-+                      }
-+                      overlap_entries--;
-+              }
-+              /* if there are overlapping entries, decide which "type" to use */
-+              /* (larger value takes precedence -- 1=usable, 2,3,4,4+=unusable) */
-+              current_type = 0;
-+              for (i=0; i<overlap_entries; i++)
-+                      if (overlap_list[i]->type > current_type)
-+                              current_type = overlap_list[i]->type;
-+              /* continue building up new bios map based on this information */
-+              if (current_type != last_type)  {
-+                      if (last_type != 0)      {
-+                              new_bios[new_bios_entry].size =
-+                                      change_point[chgidx]->addr - last_addr;
-+                              /* move forward only if the new size was non-zero */
-+                              if (new_bios[new_bios_entry].size != 0)
-+                                      if (++new_bios_entry >= E820MAX)
-+                                              break;  /* no more space left for new bios entries */
-+                      }
-+                      if (current_type != 0)  {
-+                              new_bios[new_bios_entry].addr = change_point[chgidx]->addr;
-+                              new_bios[new_bios_entry].type = current_type;
-+                              last_addr=change_point[chgidx]->addr;
-+                      }
-+                      last_type = current_type;
-+              }
-+      }
-+      new_nr = new_bios_entry;   /* retain count for new bios entries */
-+
-+      /* copy new bios mapping into original location */
-+      memcpy(biosmap, new_bios, new_nr*sizeof(struct e820entry));
-+      *pnr_map = new_nr;
-+
-+      return 0;
-+}
-+
-+/*
-+ * Copy the BIOS e820 map into a safe place.
-+ *
-+ * Sanity-check it while we're at it..
-+ *
-+ * If we're lucky and live on a modern system, the setup code
-+ * will have given us a memory map that we can use to properly
-+ * set up memory.  If we aren't, we'll fake a memory map.
-+ *
-+ * We check to see that the memory map contains at least 2 elements
-+ * before we'll use it, because the detection code in setup.S may
-+ * not be perfect and most every PC known to man has two memory
-+ * regions: one from 0 to 640k, and one from 1mb up.  (The IBM
-+ * thinkpad 560x, for example, does not cooperate with the memory
-+ * detection code.)
-+ */
-+static int __init copy_e820_map(struct e820entry * biosmap, int nr_map)
-+{
-+#ifndef CONFIG_XEN
-+      /* Only one memory region (or negative)? Ignore it */
-+      if (nr_map < 2)
-+              return -1;
-+#else
-+      BUG_ON(nr_map < 1);
-+#endif
-+
-+      do {
-+              unsigned long start = biosmap->addr;
-+              unsigned long size = biosmap->size;
-+              unsigned long end = start + size;
-+              unsigned long type = biosmap->type;
-+
-+              /* Overflow in 64 bits? Ignore the memory map. */
-+              if (start > end)
-+                      return -1;
-+
-+#ifndef CONFIG_XEN
-+              /*
-+               * Some BIOSes claim RAM in the 640k - 1M region.
-+               * Not right. Fix it up.
-+               * 
-+               * This should be removed on Hammer which is supposed to not
-+               * have non e820 covered ISA mappings there, but I had some strange
-+               * problems so it stays for now.  -AK
-+               */
-+              if (type == E820_RAM) {
-+                      if (start < 0x100000ULL && end > 0xA0000ULL) {
-+                              if (start < 0xA0000ULL)
-+                                      add_memory_region(start, 0xA0000ULL-start, type);
-+                              if (end <= 0x100000ULL)
-+                                      continue;
-+                              start = 0x100000ULL;
-+                              size = end - start;
-+                      }
-+              }
-+#endif
-+
-+              add_memory_region(start, size, type);
-+      } while (biosmap++,--nr_map);
-+
-+#ifdef CONFIG_XEN
-+      if (is_initial_xendomain()) {
-+              struct xen_memory_map memmap;
-+
-+              memmap.nr_entries = E820MAX;
-+              set_xen_guest_handle(memmap.buffer, machine_e820.map);
-+
-+              if (HYPERVISOR_memory_op(XENMEM_machine_memory_map, &memmap))
-+                      BUG();
-+              machine_e820.nr_map = memmap.nr_entries;
-+      } else
-+              machine_e820 = e820;
-+#endif
-+
-+      return 0;
-+}
-+
-+#ifndef CONFIG_XEN
-+void __init setup_memory_region(void)
-+{
-+      char *who = "BIOS-e820";
-+
-+      /*
-+       * Try to copy the BIOS-supplied E820-map.
-+       *
-+       * Otherwise fake a memory map; one section from 0k->640k,
-+       * the next section from 1mb->appropriate_mem_k
-+       */
-+      sanitize_e820_map(E820_MAP, &E820_MAP_NR);
-+      if (copy_e820_map(E820_MAP, E820_MAP_NR) < 0) {
-+              unsigned long mem_size;
-+
-+              /* compare results from other methods and take the greater */
-+              if (ALT_MEM_K < EXT_MEM_K) {
-+                      mem_size = EXT_MEM_K;
-+                      who = "BIOS-88";
-+              } else {
-+                      mem_size = ALT_MEM_K;
-+                      who = "BIOS-e801";
-+              }
-+
-+              e820.nr_map = 0;
-+              add_memory_region(0, LOWMEMSIZE(), E820_RAM);
-+              add_memory_region(HIGH_MEMORY, mem_size << 10, E820_RAM);
-+      }
-+      printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-+      e820_print_map(who);
-+}
-+
-+#else  /* CONFIG_XEN */
-+
-+void __init setup_memory_region(void)
-+{
-+      int rc;
-+      struct xen_memory_map memmap;
-+      /*
-+       * This is rather large for a stack variable but this early in
-+       * the boot process we know we have plenty slack space.
-+       */
-+      struct e820entry map[E820MAX];
-+
-+      memmap.nr_entries = E820MAX;
-+      set_xen_guest_handle(memmap.buffer, map);
-+
-+      rc = HYPERVISOR_memory_op(XENMEM_memory_map, &memmap);
-+      if ( rc == -ENOSYS ) {
-+              memmap.nr_entries = 1;
-+              map[0].addr = 0ULL;
-+              map[0].size = xen_start_info->nr_pages << PAGE_SHIFT;
-+              /* 8MB slack (to balance backend allocations). */
-+              map[0].size += 8 << 20;
-+              map[0].type = E820_RAM;
-+              rc = 0;
-+      }
-+      BUG_ON(rc);
-+
-+      sanitize_e820_map(map, (char *)&memmap.nr_entries);
-+
-+      BUG_ON(copy_e820_map(map, (char)memmap.nr_entries) < 0);
-+
-+      printk(KERN_INFO "BIOS-provided physical RAM map:\n");
-+      e820_print_map("Xen");
-+}
-+#endif
-+
-+void __init parse_memopt(char *p, char **from) 
-+{ 
-+      int i;
-+      unsigned long current_end;
-+      unsigned long end;
-+
-+      end_user_pfn = memparse(p, from);
-+      end_user_pfn >>= PAGE_SHIFT;    
-+
-+      end = end_user_pfn<<PAGE_SHIFT;
-+      i = e820.nr_map-1;
-+      current_end = e820.map[i].addr + e820.map[i].size;
-+
-+      if (current_end < end) {
-+              /*
-+                 * The e820 map ends before our requested size so
-+                 * extend the final entry to the requested address.
-+                 */
-+              if (e820.map[i].type == E820_RAM)
-+                      e820.map[i].size = end - e820.map[i].addr;
-+              else
-+                      add_memory_region(current_end, end - current_end, E820_RAM);
-+      }
-+} 
-+
-+void __init parse_memmapopt(char *p, char **from)
-+{
-+      unsigned long long start_at, mem_size;
-+
-+      mem_size = memparse(p, from);
-+      p = *from;
-+      if (*p == '@') {
-+              start_at = memparse(p+1, from);
-+              add_memory_region(start_at, mem_size, E820_RAM);
-+      } else if (*p == '#') {
-+              start_at = memparse(p+1, from);
-+              add_memory_region(start_at, mem_size, E820_ACPI);
-+      } else if (*p == '$') {
-+              start_at = memparse(p+1, from);
-+              add_memory_region(start_at, mem_size, E820_RESERVED);
-+      } else {
-+              end_user_pfn = (mem_size >> PAGE_SHIFT);
-+      }
-+      p = *from;
-+}
-+
-+unsigned long pci_mem_start = 0xaeedbabe;
-+EXPORT_SYMBOL(pci_mem_start);
-+
-+/*
-+ * Search for the biggest gap in the low 32 bits of the e820
-+ * memory space.  We pass this space to PCI to assign MMIO resources
-+ * for hotplug or unconfigured devices in.
-+ * Hopefully the BIOS let enough space left.
-+ */
-+__init void e820_setup_gap(struct e820entry *e820, int nr_map)
-+{
-+      unsigned long gapstart, gapsize, round;
-+      unsigned long last;
-+      int i;
-+      int found = 0;
-+
-+      last = 0x100000000ull;
-+      gapstart = 0x10000000;
-+      gapsize = 0x400000;
-+      i = nr_map;
-+      while (--i >= 0) {
-+              unsigned long long start = e820[i].addr;
-+              unsigned long long end = start + e820[i].size;
-+
-+              /*
-+               * Since "last" is at most 4GB, we know we'll
-+               * fit in 32 bits if this condition is true
-+               */
-+              if (last > end) {
-+                      unsigned long gap = last - end;
-+
-+                      if (gap > gapsize) {
-+                              gapsize = gap;
-+                              gapstart = end;
-+                              found = 1;
-+                      }
-+              }
-+              if (start < last)
-+                      last = start;
-+      }
-+
-+      if (!found) {
-+              gapstart = (end_pfn << PAGE_SHIFT) + 1024*1024;
-+              printk(KERN_ERR "PCI: Warning: Cannot find a gap in the 32bit address range\n"
-+                     KERN_ERR "PCI: Unassigned devices with 32bit resource registers may break!\n");
-+      }
-+
-+      /*
-+       * See how much we want to round up: start off with
-+       * rounding to the next 1MB area.
-+       */
-+      round = 0x100000;
-+      while ((gapsize >> 4) > round)
-+              round += round;
-+      /* Fun with two's complement */
-+      pci_mem_start = (gapstart + round) & -round;
-+
-+      printk(KERN_INFO "Allocating PCI resources starting at %lx (gap: %lx:%lx)\n",
-+              pci_mem_start, gapstart, gapsize);
-+}
-Index: head-2008-11-25/arch/x86/kernel/early_printk-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/early_printk-xen.c 2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,302 @@
-+#include <linux/console.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/string.h>
-+#include <linux/screen_info.h>
-+#include <asm/io.h>
-+#include <asm/processor.h>
-+#include <asm/fcntl.h>
-+
-+/* Simple VGA output */
-+
-+#ifdef __i386__
-+#include <asm/setup.h>
-+#define VGABASE               (__ISA_IO_base + 0xb8000)
-+#else
-+#include <asm/bootsetup.h>
-+#define VGABASE               ((void __iomem *)0xffffffff800b8000UL)
-+#endif
-+
-+#ifndef CONFIG_XEN
-+static int max_ypos = 25, max_xpos = 80;
-+static int current_ypos = 25, current_xpos = 0; 
-+
-+static void early_vga_write(struct console *con, const char *str, unsigned n)
-+{
-+      char c;
-+      int  i, k, j;
-+
-+      while ((c = *str++) != '\0' && n-- > 0) {
-+              if (current_ypos >= max_ypos) {
-+                      /* scroll 1 line up */
-+                      for (k = 1, j = 0; k < max_ypos; k++, j++) {
-+                              for (i = 0; i < max_xpos; i++) {
-+                                      writew(readw(VGABASE+2*(max_xpos*k+i)),
-+                                             VGABASE + 2*(max_xpos*j + i));
-+                              }
-+                      }
-+                      for (i = 0; i < max_xpos; i++)
-+                              writew(0x720, VGABASE + 2*(max_xpos*j + i));
-+                      current_ypos = max_ypos-1;
-+              }
-+              if (c == '\n') {
-+                      current_xpos = 0;
-+                      current_ypos++;
-+              } else if (c != '\r')  {
-+                      writew(((0x7 << 8) | (unsigned short) c),
-+                             VGABASE + 2*(max_xpos*current_ypos +
-+                                              current_xpos++));
-+                      if (current_xpos >= max_xpos) {
-+                              current_xpos = 0;
-+                              current_ypos++;
-+                      }
-+              }
-+      }
-+}
-+
-+static struct console early_vga_console = {
-+      .name =         "earlyvga",
-+      .write =        early_vga_write,
-+      .flags =        CON_PRINTBUFFER,
-+      .index =        -1,
-+};
-+
-+/* Serial functions loosely based on a similar package from Klaus P. Gerlicher */
-+
-+static int early_serial_base = 0x3f8;  /* ttyS0 */
-+
-+#define XMTRDY          0x20
-+
-+#define DLAB          0x80
-+
-+#define TXR             0       /*  Transmit register (WRITE) */
-+#define RXR             0       /*  Receive register  (READ)  */
-+#define IER             1       /*  Interrupt Enable          */
-+#define IIR             2       /*  Interrupt ID              */
-+#define FCR             2       /*  FIFO control              */
-+#define LCR             3       /*  Line control              */
-+#define MCR             4       /*  Modem control             */
-+#define LSR             5       /*  Line Status               */
-+#define MSR             6       /*  Modem Status              */
-+#define DLL             0       /*  Divisor Latch Low         */
-+#define DLH             1       /*  Divisor latch High        */
-+
-+static int early_serial_putc(unsigned char ch)
-+{
-+      unsigned timeout = 0xffff;
-+      while ((inb(early_serial_base + LSR) & XMTRDY) == 0 && --timeout)
-+              cpu_relax();
-+      outb(ch, early_serial_base + TXR);
-+      return timeout ? 0 : -1;
-+}
-+
-+static void early_serial_write(struct console *con, const char *s, unsigned n)
-+{
-+      while (*s && n-- > 0) {
-+              early_serial_putc(*s);
-+              if (*s == '\n')
-+                      early_serial_putc('\r');
-+              s++;
-+      }
-+}
-+
-+#define DEFAULT_BAUD 9600
-+
-+static __init void early_serial_init(char *s)
-+{
-+      unsigned char c;
-+      unsigned divisor;
-+      unsigned baud = DEFAULT_BAUD;
-+      char *e;
-+
-+      if (*s == ',')
-+              ++s;
-+
-+      if (*s) {
-+              unsigned port;
-+              if (!strncmp(s,"0x",2)) {
-+                      early_serial_base = simple_strtoul(s, &e, 16);
-+              } else {
-+                      static int bases[] = { 0x3f8, 0x2f8 };
-+
-+                      if (!strncmp(s,"ttyS",4))
-+                              s += 4;
-+                      port = simple_strtoul(s, &e, 10);
-+                      if (port > 1 || s == e)
-+                              port = 0;
-+                      early_serial_base = bases[port];
-+              }
-+              s += strcspn(s, ",");
-+              if (*s == ',')
-+                      s++;
-+      }
-+
-+      outb(0x3, early_serial_base + LCR);     /* 8n1 */
-+      outb(0, early_serial_base + IER);       /* no interrupt */
-+      outb(0, early_serial_base + FCR);       /* no fifo */
-+      outb(0x3, early_serial_base + MCR);     /* DTR + RTS */
-+
-+      if (*s) {
-+              baud = simple_strtoul(s, &e, 0);
-+              if (baud == 0 || s == e)
-+                      baud = DEFAULT_BAUD;
-+      }
-+
-+      divisor = 115200 / baud;
-+      c = inb(early_serial_base + LCR);
-+      outb(c | DLAB, early_serial_base + LCR);
-+      outb(divisor & 0xff, early_serial_base + DLL);
-+      outb((divisor >> 8) & 0xff, early_serial_base + DLH);
-+      outb(c & ~DLAB, early_serial_base + LCR);
-+}
-+
-+#else /* CONFIG_XEN */
-+
-+static void
-+early_serial_write(struct console *con, const char *s, unsigned count)
-+{
-+      int n;
-+
-+      while (count > 0) {
-+              n = HYPERVISOR_console_io(CONSOLEIO_write, count, (char *)s);
-+              if (n <= 0)
-+                      break;
-+              count -= n;
-+              s += n;
-+      }
-+} 
-+
-+static __init void early_serial_init(char *s)
-+{
-+}
-+
-+/*
-+ * No early VGA console on Xen, as we do not have convenient ISA-space
-+ * mappings. Someone should fix this for domain 0. For now, use fake serial.
-+ */
-+#define early_vga_console early_serial_console
-+
-+#endif
-+
-+static struct console early_serial_console = {
-+      .name =         "earlyser",
-+      .write =        early_serial_write,
-+      .flags =        CON_PRINTBUFFER,
-+      .index =        -1,
-+};
-+
-+/* Console interface to a host file on AMD's SimNow! */
-+
-+static int simnow_fd;
-+
-+enum {
-+      MAGIC1 = 0xBACCD00A,
-+      MAGIC2 = 0xCA110000,
-+      XOPEN = 5,
-+      XWRITE = 4,
-+};
-+
-+static noinline long simnow(long cmd, long a, long b, long c)
-+{
-+      long ret;
-+      asm volatile("cpuid" :
-+                   "=a" (ret) :
-+                   "b" (a), "c" (b), "d" (c), "0" (MAGIC1), "D" (cmd + MAGIC2));
-+      return ret;
-+}
-+
-+void __init simnow_init(char *str)
-+{
-+      char *fn = "klog";
-+      if (*str == '=')
-+              fn = ++str;
-+      /* error ignored */
-+      simnow_fd = simnow(XOPEN, (unsigned long)fn, O_WRONLY|O_APPEND|O_CREAT, 0644);
-+}
-+
-+static void simnow_write(struct console *con, const char *s, unsigned n)
-+{
-+      simnow(XWRITE, simnow_fd, (unsigned long)s, n);
-+}
-+
-+static struct console simnow_console = {
-+      .name =         "simnow",
-+      .write =        simnow_write,
-+      .flags =        CON_PRINTBUFFER,
-+      .index =        -1,
-+};
-+
-+/* Direct interface for emergencies */
-+struct console *early_console = &early_vga_console;
-+static int early_console_initialized = 0;
-+
-+void early_printk(const char *fmt, ...)
-+{
-+      char buf[512];
-+      int n;
-+      va_list ap;
-+
-+      va_start(ap,fmt);
-+      n = vscnprintf(buf,512,fmt,ap);
-+      early_console->write(early_console,buf,n);
-+      va_end(ap);
-+}
-+
-+static int __initdata keep_early;
-+
-+int __init setup_early_printk(char *opt)
-+{
-+      char *space;
-+      char buf[256];
-+
-+      if (early_console_initialized)
-+              return 1;
-+
-+      strlcpy(buf,opt,sizeof(buf));
-+      space = strchr(buf, ' ');
-+      if (space)
-+              *space = 0;
-+
-+      if (strstr(buf,"keep"))
-+              keep_early = 1;
-+
-+      if (!strncmp(buf, "serial", 6)) {
-+              early_serial_init(buf + 6);
-+              early_console = &early_serial_console;
-+      } else if (!strncmp(buf, "ttyS", 4)) {
-+              early_serial_init(buf);
-+              early_console = &early_serial_console;
-+      } else if (!strncmp(buf, "vga", 3)
-+#ifndef CONFIG_XEN
-+                 && SCREEN_INFO.orig_video_isVGA == 1) {
-+              max_xpos = SCREEN_INFO.orig_video_cols;
-+              max_ypos = SCREEN_INFO.orig_video_lines;
-+              current_ypos = SCREEN_INFO.orig_y;
-+#else
-+                 || !strncmp(buf, "xen", 3)) {
-+#endif
-+              early_console = &early_vga_console;
-+      } else if (!strncmp(buf, "simnow", 6)) {
-+              simnow_init(buf + 6);
-+              early_console = &simnow_console;
-+              keep_early = 1;
-+      }
-+      early_console_initialized = 1;
-+      register_console(early_console);
-+      return 0;
-+}
-+
-+void __init disable_early_printk(void)
-+{
-+      if (!early_console_initialized || !early_console)
-+              return;
-+      if (!keep_early) {
-+              printk("disabling early console\n");
-+              unregister_console(early_console);
-+              early_console_initialized = 0;
-+      } else {
-+              printk("keeping early console\n");
-+      }
-+}
-+
-+__setup("earlyprintk=", setup_early_printk);
-Index: head-2008-11-25/arch/x86/kernel/entry_64-xen.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/entry_64-xen.S     2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,1322 @@
-+/*
-+ *  linux/arch/x86_64/entry.S
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *  Copyright (C) 2000, 2001, 2002  Andi Kleen SuSE Labs
-+ *  Copyright (C) 2000  Pavel Machek <pavel@suse.cz>
-+ * 
-+ *  $Id$
-+ *
-+ *  Jun Nakajima <jun.nakajima@intel.com>
-+ *  Asit Mallick <asit.k.mallick@intel.com>
-+ *      Modified for Xen
-+ */
-+
-+/*
-+ * entry.S contains the system-call and fault low-level handling routines.
-+ *
-+ * NOTE: This code handles signal-recognition, which happens every time
-+ * after an interrupt and after each system call.
-+ * 
-+ * Normal syscalls and interrupts don't save a full stack frame, this is 
-+ * only done for syscall tracing, signals or fork/exec et.al.
-+ * 
-+ * A note on terminology:      
-+ * - top of stack: Architecture defined interrupt frame from SS to RIP 
-+ * at the top of the kernel process stack.    
-+ * - partial stack frame: partially saved registers upto R11.
-+ * - full stack frame: Like partial stack frame, but all register saved. 
-+ *    
-+ * TODO:       
-+ * - schedule it carefully for the final hardware.
-+ */
-+
-+#define ASSEMBLY 1
-+#include <linux/linkage.h>
-+#include <asm/segment.h>
-+#include <asm/smp.h>
-+#include <asm/cache.h>
-+#include <asm/errno.h>
-+#include <asm/dwarf2.h>
-+#include <asm/calling.h>
-+#include <asm/asm-offsets.h>
-+#include <asm/msr.h>
-+#include <asm/unistd.h>
-+#include <asm/thread_info.h>
-+#include <asm/hw_irq.h>
-+#include <asm/page.h>
-+#include <asm/irqflags.h>
-+#include <asm/errno.h>
-+#include <xen/interface/arch-x86_64.h>
-+#include <xen/interface/features.h>
-+
-+#include "xen_entry.S"
-+      
-+      .code64
-+
-+#ifndef CONFIG_PREEMPT
-+#define retint_kernel retint_restore_args
-+#endif        
-+
-+
-+.macro TRACE_IRQS_IRETQ offset=ARGOFFSET
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+      bt   $9,EFLAGS-\offset(%rsp)    /* interrupts off? */
-+      jnc  1f
-+      TRACE_IRQS_ON
-+1:
-+#endif
-+.endm
-+
-+NMI_MASK = 0x80000000
-+      
-+/*
-+ * C code is not supposed to know about undefined top of stack. Every time 
-+ * a C function with an pt_regs argument is called from the SYSCALL based 
-+ * fast path FIXUP_TOP_OF_STACK is needed.
-+ * RESTORE_TOP_OF_STACK syncs the syscall state after any possible ptregs
-+ * manipulation.
-+ */           
-+              
-+      /* %rsp:at FRAMEEND */ 
-+      .macro FIXUP_TOP_OF_STACK tmp
-+      movq    $__USER_CS,CS(%rsp)
-+      movq    $-1,RCX(%rsp)
-+      .endm
-+
-+      .macro RESTORE_TOP_OF_STACK tmp,offset=0
-+      .endm
-+
-+      .macro FAKE_STACK_FRAME child_rip
-+      /* push in order ss, rsp, eflags, cs, rip */
-+      xorl %eax, %eax
-+      pushq %rax /* ss */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      /*CFI_REL_OFFSET        ss,0*/
-+      pushq %rax /* rsp */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      CFI_REL_OFFSET  rsp,0
-+      pushq $(1<<9) /* eflags - interrupts on */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      /*CFI_REL_OFFSET        rflags,0*/
-+      pushq $__KERNEL_CS /* cs */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      /*CFI_REL_OFFSET        cs,0*/
-+      pushq \child_rip /* rip */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      CFI_REL_OFFSET  rip,0
-+      pushq   %rax /* orig rax */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      .endm
-+
-+      .macro UNFAKE_STACK_FRAME
-+      addq $8*6, %rsp
-+      CFI_ADJUST_CFA_OFFSET   -(6*8)
-+      .endm
-+
-+      .macro  CFI_DEFAULT_STACK start=1,adj=0
-+      .if \start
-+      CFI_STARTPROC   simple
-+      CFI_DEF_CFA     rsp,SS+8 - \adj*ARGOFFSET
-+      .else
-+      CFI_DEF_CFA_OFFSET SS+8 - \adj*ARGOFFSET
-+      .endif
-+      .if \adj == 0
-+      CFI_REL_OFFSET  r15,R15
-+      CFI_REL_OFFSET  r14,R14
-+      CFI_REL_OFFSET  r13,R13
-+      CFI_REL_OFFSET  r12,R12
-+      CFI_REL_OFFSET  rbp,RBP
-+      CFI_REL_OFFSET  rbx,RBX
-+      .endif
-+      CFI_REL_OFFSET  r11,R11 - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  r10,R10 - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  r9,R9 - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  r8,R8 - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rax,RAX - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rcx,RCX - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rdx,RDX - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rsi,RSI - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rdi,RDI - \adj*ARGOFFSET
-+      CFI_REL_OFFSET  rip,RIP - \adj*ARGOFFSET
-+      /*CFI_REL_OFFSET        cs,CS - \adj*ARGOFFSET*/
-+      /*CFI_REL_OFFSET        rflags,EFLAGS - \adj*ARGOFFSET*/
-+      CFI_REL_OFFSET  rsp,RSP - \adj*ARGOFFSET
-+      /*CFI_REL_OFFSET        ss,SS - \adj*ARGOFFSET*/
-+      .endm
-+
-+        /*
-+         * Must be consistent with the definition in arch-x86/xen-x86_64.h:
-+         *     struct iret_context {
-+         *        u64 rax, r11, rcx, flags, rip, cs, rflags, rsp, ss;
-+         *     };
-+         * with rax, r11, and rcx being taken care of in the hypercall stub.
-+         */
-+      .macro HYPERVISOR_IRET flag
-+      testb $3,1*8(%rsp)
-+      jnz   2f
-+      testl $NMI_MASK,2*8(%rsp)
-+      jnz   2f
-+
-+      cmpb  $0,(xen_features+XENFEAT_supervisor_mode_kernel)(%rip)
-+      jne   1f
-+
-+      /* Direct iret to kernel space. Correct CS and SS. */
-+      orl   $3,1*8(%rsp)
-+      orl   $3,4*8(%rsp)
-+1:    iretq
-+
-+2:    /* Slow iret via hypervisor. */
-+      andl  $~NMI_MASK, 2*8(%rsp)
-+      pushq $\flag
-+      jmp  hypercall_page + (__HYPERVISOR_iret * 32)
-+      .endm
-+
-+/*
-+ * A newly forked process directly context switches into this.
-+ */   
-+/* rdi:       prev */ 
-+ENTRY(ret_from_fork)
-+      CFI_DEFAULT_STACK
-+      push kernel_eflags(%rip)
-+      CFI_ADJUST_CFA_OFFSET 4
-+      popf                            # reset kernel eflags
-+      CFI_ADJUST_CFA_OFFSET -4
-+      call schedule_tail
-+      GET_THREAD_INFO(%rcx)
-+      testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT),threadinfo_flags(%rcx)
-+      jnz rff_trace
-+rff_action:   
-+      RESTORE_REST
-+      testl $3,CS-ARGOFFSET(%rsp)     # from kernel_thread?
-+      je   int_ret_from_sys_call
-+      testl $_TIF_IA32,threadinfo_flags(%rcx)
-+      jnz  int_ret_from_sys_call
-+      RESTORE_TOP_OF_STACK %rdi,ARGOFFSET
-+      jmp ret_from_sys_call
-+rff_trace:
-+      movq %rsp,%rdi
-+      call syscall_trace_leave
-+      GET_THREAD_INFO(%rcx)   
-+      jmp rff_action
-+      CFI_ENDPROC
-+END(ret_from_fork)
-+
-+/*
-+ * initial frame state for interrupts and exceptions
-+ */
-+      .macro _frame ref
-+      CFI_STARTPROC simple
-+      CFI_DEF_CFA rsp,SS+8-\ref
-+      /*CFI_REL_OFFSET ss,SS-\ref*/
-+      CFI_REL_OFFSET rsp,RSP-\ref
-+      /*CFI_REL_OFFSET rflags,EFLAGS-\ref*/
-+      /*CFI_REL_OFFSET cs,CS-\ref*/
-+      CFI_REL_OFFSET rip,RIP-\ref
-+      .endm
-+
-+/*
-+ * System call entry. Upto 6 arguments in registers are supported.
-+ *
-+ * SYSCALL does not save anything on the stack and does not change the
-+ * stack pointer.
-+ */
-+              
-+/*
-+ * Register setup:    
-+ * rax  system call number
-+ * rdi  arg0
-+ * rcx  return address for syscall/sysret, C arg3 
-+ * rsi  arg1
-+ * rdx  arg2  
-+ * r10  arg3  (--> moved to rcx for C)
-+ * r8   arg4
-+ * r9   arg5
-+ * r11  eflags for syscall/sysret, temporary for C
-+ * r12-r15,rbp,rbx saved by C code, not touched.              
-+ * 
-+ * Interrupts are enabled on entry.
-+ * Only called from user space.
-+ *
-+ * XXX        if we had a free scratch register we could save the RSP into the stack frame
-+ *      and report it properly in ps. Unfortunately we haven't.
-+ *
-+ * When user can change the frames always force IRET. That is because
-+ * it deals with uncanonical addresses better. SYSRET has trouble
-+ * with them due to bugs in both AMD and Intel CPUs.
-+ */                                   
-+
-+ENTRY(system_call)
-+      _frame (RIP-0x10)
-+      SAVE_ARGS -8,0
-+      movq  %rax,ORIG_RAX-ARGOFFSET(%rsp) 
-+      GET_THREAD_INFO(%rcx)
-+      testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SECCOMP),threadinfo_flags(%rcx)
-+      CFI_REMEMBER_STATE
-+      jnz tracesys
-+      cmpq $__NR_syscall_max,%rax
-+      ja badsys
-+      movq %r10,%rcx
-+      call *sys_call_table(,%rax,8)  # XXX:    rip relative
-+      movq %rax,RAX-ARGOFFSET(%rsp)
-+/*
-+ * Syscall return path ending with SYSRET (fast path)
-+ * Has incomplete stack frame and undefined top of stack. 
-+ */           
-+      .globl ret_from_sys_call
-+ret_from_sys_call:
-+      movl $_TIF_ALLWORK_MASK,%edi
-+      /* edi: flagmask */
-+sysret_check:         
-+      GET_THREAD_INFO(%rcx)
-+        XEN_BLOCK_EVENTS(%rsi)        
-+      TRACE_IRQS_OFF
-+      movl threadinfo_flags(%rcx),%edx
-+      andl %edi,%edx
-+      CFI_REMEMBER_STATE
-+      jnz  sysret_careful 
-+      /*
-+       * sysretq will re-enable interrupts:
-+       */
-+      TRACE_IRQS_ON
-+        XEN_UNBLOCK_EVENTS(%rsi)                
-+      RESTORE_ARGS 0,8,0
-+        HYPERVISOR_IRET VGCF_IN_SYSCALL
-+
-+      /* Handle reschedules */
-+      /* edx: work, edi: workmask */  
-+sysret_careful:
-+      CFI_RESTORE_STATE
-+      bt $TIF_NEED_RESCHED,%edx
-+      jnc sysret_signal
-+      TRACE_IRQS_ON
-+      XEN_UNBLOCK_EVENTS(%rsi)
-+      pushq %rdi
-+      CFI_ADJUST_CFA_OFFSET 8
-+      call schedule
-+      popq  %rdi
-+      CFI_ADJUST_CFA_OFFSET -8
-+      jmp sysret_check
-+
-+      /* Handle a signal */ 
-+sysret_signal:
-+      TRACE_IRQS_ON
-+/*    sti */
-+        XEN_UNBLOCK_EVENTS(%rsi)        
-+      testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
-+      jz    1f
-+
-+      /* Really a signal */
-+      /* edx: work flags (arg3) */
-+      leaq do_notify_resume(%rip),%rax
-+      leaq -ARGOFFSET(%rsp),%rdi # &pt_regs -> arg1
-+      xorl %esi,%esi # oldset -> arg2
-+      call ptregscall_common
-+1:    movl $_TIF_NEED_RESCHED,%edi
-+      /* Use IRET because user could have changed frame. This
-+         works because ptregscall_common has called FIXUP_TOP_OF_STACK. */
-+      XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+      jmp int_with_check
-+      
-+badsys:
-+      movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
-+      jmp ret_from_sys_call
-+
-+      /* Do syscall tracing */
-+tracesys:                      
-+      CFI_RESTORE_STATE
-+      SAVE_REST
-+      movq $-ENOSYS,RAX(%rsp)
-+      FIXUP_TOP_OF_STACK %rdi
-+      movq %rsp,%rdi
-+      call syscall_trace_enter
-+      LOAD_ARGS ARGOFFSET  /* reload args from stack in case ptrace changed it */
-+      RESTORE_REST
-+      cmpq $__NR_syscall_max,%rax
-+      ja  1f
-+      movq %r10,%rcx  /* fixup for C */
-+      call *sys_call_table(,%rax,8)
-+1:    movq %rax,RAX-ARGOFFSET(%rsp)
-+      /* Use IRET because user could have changed frame */
-+      jmp int_ret_from_sys_call
-+      CFI_ENDPROC
-+END(system_call)
-+              
-+/* 
-+ * Syscall return path ending with IRET.
-+ * Has correct top of stack, but partial stack frame.
-+ */   
-+ENTRY(int_ret_from_sys_call)
-+      CFI_STARTPROC   simple
-+      CFI_DEF_CFA     rsp,SS+8-ARGOFFSET
-+      /*CFI_REL_OFFSET        ss,SS-ARGOFFSET*/
-+      CFI_REL_OFFSET  rsp,RSP-ARGOFFSET
-+      /*CFI_REL_OFFSET        rflags,EFLAGS-ARGOFFSET*/
-+      /*CFI_REL_OFFSET        cs,CS-ARGOFFSET*/
-+      CFI_REL_OFFSET  rip,RIP-ARGOFFSET
-+      CFI_REL_OFFSET  rdx,RDX-ARGOFFSET
-+      CFI_REL_OFFSET  rcx,RCX-ARGOFFSET
-+      CFI_REL_OFFSET  rax,RAX-ARGOFFSET
-+      CFI_REL_OFFSET  rdi,RDI-ARGOFFSET
-+      CFI_REL_OFFSET  rsi,RSI-ARGOFFSET
-+      CFI_REL_OFFSET  r8,R8-ARGOFFSET
-+      CFI_REL_OFFSET  r9,R9-ARGOFFSET
-+      CFI_REL_OFFSET  r10,R10-ARGOFFSET
-+      CFI_REL_OFFSET  r11,R11-ARGOFFSET
-+        XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+      testb $3,CS-ARGOFFSET(%rsp)
-+        jnz 1f
-+        /* Need to set the proper %ss (not NULL) for ring 3 iretq */
-+        movl $__KERNEL_DS,SS-ARGOFFSET(%rsp)
-+        jmp retint_restore_args   # retrun from ring3 kernel
-+1:              
-+      movl $_TIF_ALLWORK_MASK,%edi
-+      /* edi: mask to check */
-+int_with_check:
-+      GET_THREAD_INFO(%rcx)
-+      movl threadinfo_flags(%rcx),%edx
-+      andl %edi,%edx
-+      jnz   int_careful
-+      andl    $~TS_COMPAT,threadinfo_status(%rcx)
-+      jmp   retint_restore_args
-+
-+      /* Either reschedule or signal or syscall exit tracking needed. */
-+      /* First do a reschedule test. */
-+      /* edx: work, edi: workmask */
-+int_careful:
-+      bt $TIF_NEED_RESCHED,%edx
-+      jnc  int_very_careful
-+      TRACE_IRQS_ON
-+/*    sti */
-+        XEN_UNBLOCK_EVENTS(%rsi)
-+      pushq %rdi
-+      CFI_ADJUST_CFA_OFFSET 8
-+      call schedule
-+      popq %rdi
-+      CFI_ADJUST_CFA_OFFSET -8
-+      XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+      jmp int_with_check
-+
-+      /* handle signals and tracing -- both require a full stack frame */
-+int_very_careful:
-+      TRACE_IRQS_ON
-+/*    sti */
-+        XEN_UNBLOCK_EVENTS(%rsi)
-+      SAVE_REST
-+      /* Check for syscall exit trace */      
-+      testl $(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edx
-+      jz int_signal
-+      pushq %rdi
-+      CFI_ADJUST_CFA_OFFSET 8
-+      leaq 8(%rsp),%rdi       # &ptregs -> arg1       
-+      call syscall_trace_leave
-+      popq %rdi
-+      CFI_ADJUST_CFA_OFFSET -8
-+      andl $~(_TIF_SYSCALL_TRACE|_TIF_SYSCALL_AUDIT|_TIF_SINGLESTEP),%edi
-+      XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+      jmp int_restore_rest
-+      
-+int_signal:
-+      testl $(_TIF_NOTIFY_RESUME|_TIF_SIGPENDING|_TIF_SINGLESTEP),%edx
-+      jz 1f
-+      movq %rsp,%rdi          # &ptregs -> arg1
-+      xorl %esi,%esi          # oldset -> arg2
-+      call do_notify_resume
-+1:    movl $_TIF_NEED_RESCHED,%edi    
-+int_restore_rest:
-+      RESTORE_REST
-+      XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+      jmp int_with_check
-+      CFI_ENDPROC
-+END(int_ret_from_sys_call)
-+              
-+/* 
-+ * Certain special system calls that need to save a complete full stack frame.
-+ */                                                           
-+      
-+      .macro PTREGSCALL label,func,arg
-+      .globl \label
-+\label:
-+      leaq    \func(%rip),%rax
-+      leaq    -ARGOFFSET+8(%rsp),\arg /* 8 for return address */
-+      jmp     ptregscall_common
-+END(\label)
-+      .endm
-+
-+      CFI_STARTPROC
-+
-+      PTREGSCALL stub_clone, sys_clone, %r8
-+      PTREGSCALL stub_fork, sys_fork, %rdi
-+      PTREGSCALL stub_vfork, sys_vfork, %rdi
-+      PTREGSCALL stub_rt_sigsuspend, sys_rt_sigsuspend, %rdx
-+      PTREGSCALL stub_sigaltstack, sys_sigaltstack, %rdx
-+      PTREGSCALL stub_iopl, sys_iopl, %rsi
-+
-+ENTRY(ptregscall_common)
-+      popq %r11
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_REGISTER rip, r11
-+      SAVE_REST
-+      movq %r11, %r15
-+      CFI_REGISTER rip, r15
-+      FIXUP_TOP_OF_STACK %r11
-+      call *%rax
-+      RESTORE_TOP_OF_STACK %r11
-+      movq %r15, %r11
-+      CFI_REGISTER rip, r11
-+      RESTORE_REST
-+      pushq %r11
-+      CFI_ADJUST_CFA_OFFSET 8
-+      CFI_REL_OFFSET rip, 0
-+      ret
-+      CFI_ENDPROC
-+END(ptregscall_common)
-+      
-+ENTRY(stub_execve)
-+      CFI_STARTPROC
-+      popq %r11
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_REGISTER rip, r11
-+      SAVE_REST
-+      FIXUP_TOP_OF_STACK %r11
-+      call sys_execve
-+      RESTORE_TOP_OF_STACK %r11
-+      movq %rax,RAX(%rsp)
-+      RESTORE_REST
-+      jmp int_ret_from_sys_call
-+      CFI_ENDPROC
-+END(stub_execve)
-+      
-+/*
-+ * sigreturn is special because it needs to restore all registers on return.
-+ * This cannot be done with SYSRET, so use the IRET return path instead.
-+ */                
-+ENTRY(stub_rt_sigreturn)
-+      CFI_STARTPROC
-+      addq $8, %rsp
-+      CFI_ADJUST_CFA_OFFSET   -8
-+      SAVE_REST
-+      movq %rsp,%rdi
-+      FIXUP_TOP_OF_STACK %r11
-+      call sys_rt_sigreturn
-+      movq %rax,RAX(%rsp) # fixme, this could be done at the higher layer
-+      RESTORE_REST
-+      jmp int_ret_from_sys_call
-+      CFI_ENDPROC
-+END(stub_rt_sigreturn)
-+
-+/* initial frame state for interrupts (and exceptions without error code) */
-+#define INTR_FRAME _frame (RIP-0x10); \
-+      CFI_REL_OFFSET rcx,0; \
-+      CFI_REL_OFFSET r11,8
-+
-+/* initial frame state for exceptions with error code (and interrupts with
-+   vector already pushed) */
-+#define XCPT_FRAME _frame (RIP-0x18); \
-+      CFI_REL_OFFSET rcx,0; \
-+      CFI_REL_OFFSET r11,8
-+
-+/* 
-+ * Interrupt exit.
-+ *
-+ */ 
-+
-+retint_check:
-+      CFI_DEFAULT_STACK adj=1
-+      movl threadinfo_flags(%rcx),%edx
-+      andl %edi,%edx
-+      CFI_REMEMBER_STATE
-+      jnz  retint_careful
-+retint_restore_args:
-+      movl EFLAGS-REST_SKIP(%rsp), %eax
-+      shr $9, %eax                    # EAX[0] == IRET_EFLAGS.IF
-+      XEN_GET_VCPU_INFO(%rsi)
-+      andb evtchn_upcall_mask(%rsi),%al
-+      andb $1,%al                     # EAX[0] == IRET_EFLAGS.IF & event_mask
-+      jnz restore_all_enable_events   #        != 0 => enable event delivery
-+      XEN_PUT_VCPU_INFO(%rsi)
-+              
-+      RESTORE_ARGS 0,8,0
-+      HYPERVISOR_IRET 0
-+      
-+      /* edi: workmask, edx: work */
-+retint_careful:
-+      CFI_RESTORE_STATE
-+      bt    $TIF_NEED_RESCHED,%edx
-+      jnc   retint_signal
-+      TRACE_IRQS_ON
-+      XEN_UNBLOCK_EVENTS(%rsi)
-+/*    sti */        
-+      pushq %rdi
-+      CFI_ADJUST_CFA_OFFSET   8
-+      call  schedule
-+      popq %rdi               
-+      CFI_ADJUST_CFA_OFFSET   -8
-+      GET_THREAD_INFO(%rcx)
-+      XEN_BLOCK_EVENTS(%rsi)          
-+/*    cli */
-+      TRACE_IRQS_OFF
-+      jmp retint_check
-+      
-+retint_signal:
-+      testl $(_TIF_SIGPENDING|_TIF_NOTIFY_RESUME|_TIF_SINGLESTEP),%edx
-+      jz    retint_restore_args
-+      TRACE_IRQS_ON
-+        XEN_UNBLOCK_EVENTS(%rsi)
-+      SAVE_REST
-+      movq $-1,ORIG_RAX(%rsp)                         
-+      xorl %esi,%esi          # oldset
-+      movq %rsp,%rdi          # &pt_regs
-+      call do_notify_resume
-+      RESTORE_REST
-+        XEN_BLOCK_EVENTS(%rsi)                
-+      TRACE_IRQS_OFF
-+      movl $_TIF_NEED_RESCHED,%edi
-+      GET_THREAD_INFO(%rcx)
-+      jmp retint_check
-+
-+#ifdef CONFIG_PREEMPT
-+      /* Returning to kernel space. Check if we need preemption */
-+      /* rcx:  threadinfo. interrupts off. */
-+      .p2align
-+retint_kernel:        
-+      cmpl $0,threadinfo_preempt_count(%rcx)
-+      jnz  retint_restore_args
-+      bt  $TIF_NEED_RESCHED,threadinfo_flags(%rcx)
-+      jnc  retint_restore_args
-+      bt   $9,EFLAGS-ARGOFFSET(%rsp)  /* interrupts off? */
-+      jnc  retint_restore_args
-+      call preempt_schedule_irq
-+      jmp retint_kernel       /* check again */
-+#endif        
-+
-+      CFI_ENDPROC
-+END(retint_check)
-+      
-+#ifndef CONFIG_XEN
-+/*
-+ * APIC interrupts.
-+ */           
-+      .macro apicinterrupt num,func
-+      INTR_FRAME
-+      pushq $~(\num)
-+      CFI_ADJUST_CFA_OFFSET 8
-+      interrupt \func
-+      jmp error_entry
-+      CFI_ENDPROC
-+      .endm
-+
-+ENTRY(thermal_interrupt)
-+      apicinterrupt THERMAL_APIC_VECTOR,smp_thermal_interrupt
-+END(thermal_interrupt)
-+
-+ENTRY(threshold_interrupt)
-+      apicinterrupt THRESHOLD_APIC_VECTOR,mce_threshold_interrupt
-+END(threshold_interrupt)
-+
-+#ifdef CONFIG_SMP     
-+ENTRY(reschedule_interrupt)
-+      apicinterrupt RESCHEDULE_VECTOR,smp_reschedule_interrupt
-+END(reschedule_interrupt)
-+
-+      .macro INVALIDATE_ENTRY num
-+ENTRY(invalidate_interrupt\num)
-+      apicinterrupt INVALIDATE_TLB_VECTOR_START+\num,smp_invalidate_interrupt 
-+END(invalidate_interrupt\num)
-+      .endm
-+
-+      INVALIDATE_ENTRY 0
-+      INVALIDATE_ENTRY 1
-+      INVALIDATE_ENTRY 2
-+      INVALIDATE_ENTRY 3
-+      INVALIDATE_ENTRY 4
-+      INVALIDATE_ENTRY 5
-+      INVALIDATE_ENTRY 6
-+      INVALIDATE_ENTRY 7
-+
-+ENTRY(call_function_interrupt)
-+      apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt
-+END(call_function_interrupt)
-+#endif
-+
-+#ifdef CONFIG_X86_LOCAL_APIC  
-+ENTRY(apic_timer_interrupt)
-+      apicinterrupt LOCAL_TIMER_VECTOR,smp_apic_timer_interrupt
-+END(apic_timer_interrupt)
-+
-+ENTRY(error_interrupt)
-+      apicinterrupt ERROR_APIC_VECTOR,smp_error_interrupt
-+END(error_interrupt)
-+
-+ENTRY(spurious_interrupt)
-+      apicinterrupt SPURIOUS_APIC_VECTOR,smp_spurious_interrupt
-+END(spurious_interrupt)
-+#endif
-+#endif /* !CONFIG_XEN */
-+                              
-+/*
-+ * Exception entry points.
-+ */           
-+      .macro zeroentry sym
-+      INTR_FRAME
-+        movq (%rsp),%rcx
-+      CFI_RESTORE rcx
-+        movq 8(%rsp),%r11
-+      CFI_RESTORE r11
-+        addq $0x10,%rsp /* skip rcx and r11 */
-+      CFI_ADJUST_CFA_OFFSET -0x10
-+      pushq $0        /* push error code/oldrax */ 
-+      CFI_ADJUST_CFA_OFFSET 8
-+      pushq %rax      /* push real oldrax to the rdi slot */ 
-+      CFI_ADJUST_CFA_OFFSET 8
-+      CFI_REL_OFFSET rax,0
-+      leaq  \sym(%rip),%rax
-+      jmp error_entry
-+      CFI_ENDPROC
-+      .endm   
-+
-+      .macro errorentry sym
-+      XCPT_FRAME
-+        movq (%rsp),%rcx
-+      CFI_RESTORE rcx
-+        movq 8(%rsp),%r11
-+      CFI_RESTORE r11
-+        addq $0x10,%rsp /* rsp points to the error code */
-+      CFI_ADJUST_CFA_OFFSET -0x10
-+      pushq %rax
-+      CFI_ADJUST_CFA_OFFSET 8
-+      CFI_REL_OFFSET rax,0
-+      leaq  \sym(%rip),%rax
-+      jmp error_entry
-+      CFI_ENDPROC
-+      .endm
-+
-+#if 0 /* not XEN */
-+      /* error code is on the stack already */
-+      /* handle NMI like exceptions that can happen everywhere */
-+      .macro paranoidentry sym, ist=0, irqtrace=1
-+        movq (%rsp),%rcx
-+        movq 8(%rsp),%r11
-+        addq $0x10,%rsp /* skip rcx and r11 */        
-+      SAVE_ALL
-+      cld
-+#if 0 /* not XEN */
-+      movl $1,%ebx
-+      movl  $MSR_GS_BASE,%ecx
-+      rdmsr
-+      testl %edx,%edx
-+      js    1f
-+      swapgs
-+      xorl  %ebx,%ebx
-+1:
-+#endif
-+      .if \ist
-+      movq    %gs:pda_data_offset, %rbp
-+      .endif
-+      movq %rsp,%rdi
-+      movq ORIG_RAX(%rsp),%rsi
-+      movq $-1,ORIG_RAX(%rsp)
-+      .if \ist
-+      subq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
-+      .endif
-+      call \sym
-+      .if \ist
-+      addq    $EXCEPTION_STKSZ, per_cpu__init_tss + TSS_ist + (\ist - 1) * 8(%rbp)
-+      .endif
-+/*    cli */
-+      XEN_BLOCK_EVENTS(%rsi)          
-+      .if \irqtrace
-+      TRACE_IRQS_OFF
-+      .endif
-+      .endm
-+
-+      /*
-+       * "Paranoid" exit path from exception stack.
-+       * Paranoid because this is used by NMIs and cannot take
-+       * any kernel state for granted.
-+       * We don't do kernel preemption checks here, because only
-+       * NMI should be common and it does not enable IRQs and
-+       * cannot get reschedule ticks.
-+       *
-+       * "trace" is 0 for the NMI handler only, because irq-tracing
-+       * is fundamentally NMI-unsafe. (we cannot change the soft and
-+       * hard flags at once, atomically)
-+       */
-+      .macro paranoidexit trace=1
-+      /* ebx: no swapgs flag */
-+paranoid_exit\trace:
-+      testl %ebx,%ebx                         /* swapgs needed? */
-+      jnz paranoid_restore\trace
-+      testl $3,CS(%rsp)
-+      jnz   paranoid_userspace\trace
-+paranoid_swapgs\trace:
-+      TRACE_IRQS_IRETQ 0
-+      swapgs
-+paranoid_restore\trace:
-+      RESTORE_ALL 8
-+      iretq
-+paranoid_userspace\trace:
-+      GET_THREAD_INFO(%rcx)
-+      movl threadinfo_flags(%rcx),%ebx
-+      andl $_TIF_WORK_MASK,%ebx
-+      jz paranoid_swapgs\trace
-+      movq %rsp,%rdi                  /* &pt_regs */
-+      call sync_regs
-+      movq %rax,%rsp                  /* switch stack for scheduling */
-+      testl $_TIF_NEED_RESCHED,%ebx
-+      jnz paranoid_schedule\trace
-+      movl %ebx,%edx                  /* arg3: thread flags */
-+      .if \trace
-+      TRACE_IRQS_ON
-+      .endif
-+      sti
-+      xorl %esi,%esi                  /* arg2: oldset */
-+      movq %rsp,%rdi                  /* arg1: &pt_regs */
-+      call do_notify_resume
-+      cli
-+      .if \trace
-+      TRACE_IRQS_OFF
-+      .endif
-+      jmp paranoid_userspace\trace
-+paranoid_schedule\trace:
-+      .if \trace
-+      TRACE_IRQS_ON
-+      .endif
-+      sti
-+      call schedule
-+      cli
-+      .if \trace
-+      TRACE_IRQS_OFF
-+      .endif
-+      jmp paranoid_userspace\trace
-+      CFI_ENDPROC
-+      .endm
-+#endif
-+
-+/*
-+ * Exception entry point. This expects an error code/orig_rax on the stack
-+ * and the exception handler in %rax. 
-+ */                                           
-+ENTRY(error_entry)
-+      _frame RDI
-+      CFI_REL_OFFSET rax,0
-+      /* rdi slot contains rax, oldrax contains error code */
-+      cld     
-+      subq  $14*8,%rsp
-+      CFI_ADJUST_CFA_OFFSET   (14*8)
-+      movq %rsi,13*8(%rsp)
-+      CFI_REL_OFFSET  rsi,RSI
-+      movq 14*8(%rsp),%rsi    /* load rax from rdi slot */
-+      CFI_REGISTER    rax,rsi
-+      movq %rdx,12*8(%rsp)
-+      CFI_REL_OFFSET  rdx,RDX
-+      movq %rcx,11*8(%rsp)
-+      CFI_REL_OFFSET  rcx,RCX
-+      movq %rsi,10*8(%rsp)    /* store rax */ 
-+      CFI_REL_OFFSET  rax,RAX
-+      movq %r8, 9*8(%rsp)
-+      CFI_REL_OFFSET  r8,R8
-+      movq %r9, 8*8(%rsp)
-+      CFI_REL_OFFSET  r9,R9
-+      movq %r10,7*8(%rsp)
-+      CFI_REL_OFFSET  r10,R10
-+      movq %r11,6*8(%rsp)
-+      CFI_REL_OFFSET  r11,R11
-+      movq %rbx,5*8(%rsp) 
-+      CFI_REL_OFFSET  rbx,RBX
-+      movq %rbp,4*8(%rsp) 
-+      CFI_REL_OFFSET  rbp,RBP
-+      movq %r12,3*8(%rsp) 
-+      CFI_REL_OFFSET  r12,R12
-+      movq %r13,2*8(%rsp) 
-+      CFI_REL_OFFSET  r13,R13
-+      movq %r14,1*8(%rsp) 
-+      CFI_REL_OFFSET  r14,R14
-+      movq %r15,(%rsp) 
-+      CFI_REL_OFFSET  r15,R15
-+#if 0        
-+      cmpl $__KERNEL_CS,CS(%rsp)
-+      CFI_REMEMBER_STATE
-+      je  error_kernelspace
-+#endif        
-+error_call_handler:
-+      movq %rdi, RDI(%rsp)            
-+      CFI_REL_OFFSET  rdi,RDI
-+      movq %rsp,%rdi
-+      movq ORIG_RAX(%rsp),%rsi        # get error code 
-+      movq $-1,ORIG_RAX(%rsp)
-+      call *%rax
-+error_exit:           
-+      RESTORE_REST
-+/*    cli */
-+      XEN_BLOCK_EVENTS(%rsi)          
-+      TRACE_IRQS_OFF
-+      GET_THREAD_INFO(%rcx)   
-+      testb $3,CS-ARGOFFSET(%rsp)
-+      jz retint_kernel
-+      movl  threadinfo_flags(%rcx),%edx
-+      movl  $_TIF_WORK_MASK,%edi      
-+      andl  %edi,%edx
-+      jnz   retint_careful
-+      /*
-+       * The iret might restore flags:
-+       */
-+      TRACE_IRQS_IRETQ
-+      jmp   retint_restore_args
-+
-+#if 0
-+         /*
-+         * We need to re-write the logic here because we don't do iretq to 
-+         * to return to user mode. It's still possible that we get trap/fault
-+         * in the kernel (when accessing buffers pointed to by system calls, 
-+         * for example).
-+         *
-+         */           
-+      CFI_RESTORE_STATE
-+error_kernelspace:
-+      incl %ebx
-+       /* There are two places in the kernel that can potentially fault with
-+          usergs. Handle them here. The exception handlers after
-+         iret run with kernel gs again, so don't set the user space flag.
-+         B stepping K8s sometimes report an truncated RIP for IRET 
-+         exceptions returning to compat mode. Check for these here too. */
-+      leaq iret_label(%rip),%rbp
-+      cmpq %rbp,RIP(%rsp) 
-+      je   error_swapgs
-+      movl %ebp,%ebp  /* zero extend */
-+      cmpq %rbp,RIP(%rsp) 
-+      je   error_swapgs
-+      cmpq $gs_change,RIP(%rsp)
-+        je   error_swapgs
-+      jmp  error_sti
-+#endif
-+      CFI_ENDPROC
-+END(error_entry)
-+      
-+ENTRY(hypervisor_callback)
-+      zeroentry do_hypervisor_callback
-+END(hypervisor_callback)
-+        
-+/*
-+ * Copied from arch/xen/i386/kernel/entry.S
-+ */               
-+# A note on the "critical region" in our callback handler.
-+# We want to avoid stacking callback handlers due to events occurring
-+# during handling of the last event. To do this, we keep events disabled
-+# until we've done all processing. HOWEVER, we must enable events before
-+# popping the stack frame (can't be done atomically) and so it would still
-+# be possible to get enough handler activations to overflow the stack.
-+# Although unlikely, bugs of that kind are hard to track down, so we'd
-+# like to avoid the possibility.
-+# So, on entry to the handler we detect whether we interrupted an
-+# existing activation in its critical region -- if so, we pop the current
-+# activation and restart the handler using the previous one.
-+ENTRY(do_hypervisor_callback)   # do_hypervisor_callback(struct *pt_regs)
-+      CFI_STARTPROC
-+# Since we don't modify %rdi, evtchn_do_upall(struct *pt_regs) will
-+# see the correct pointer to the pt_regs
-+      movq %rdi, %rsp            # we don't return, adjust the stack frame
-+      CFI_ENDPROC
-+      CFI_DEFAULT_STACK
-+11:   incl %gs:pda_irqcount
-+      movq %rsp,%rbp
-+      CFI_DEF_CFA_REGISTER rbp
-+      cmovzq %gs:pda_irqstackptr,%rsp
-+      pushq %rbp                      # backlink for old unwinder
-+      call evtchn_do_upcall
-+      popq %rsp
-+      CFI_DEF_CFA_REGISTER rsp
-+      decl %gs:pda_irqcount
-+      jmp  error_exit
-+      CFI_ENDPROC
-+END(do_hypervisor_callback)
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+KPROBE_ENTRY(nmi)
-+      zeroentry do_nmi_callback
-+ENTRY(do_nmi_callback)
-+      CFI_STARTPROC
-+        addq $8, %rsp
-+      CFI_ENDPROC
-+      CFI_DEFAULT_STACK
-+        call do_nmi
-+        orl  $NMI_MASK,EFLAGS(%rsp)
-+        RESTORE_REST
-+        XEN_BLOCK_EVENTS(%rsi)
-+      TRACE_IRQS_OFF
-+        GET_THREAD_INFO(%rcx)
-+        jmp  retint_restore_args
-+      CFI_ENDPROC
-+      .previous .text
-+END(nmi)
-+#endif
-+
-+        ALIGN
-+restore_all_enable_events:  
-+      CFI_DEFAULT_STACK adj=1
-+      TRACE_IRQS_ON
-+      XEN_UNBLOCK_EVENTS(%rsi)        # %rsi is already set up...
-+
-+scrit:        /**** START OF CRITICAL REGION ****/
-+      XEN_TEST_PENDING(%rsi)
-+      CFI_REMEMBER_STATE
-+      jnz  14f                        # process more events if necessary...
-+      XEN_PUT_VCPU_INFO(%rsi)
-+        RESTORE_ARGS 0,8,0
-+        HYPERVISOR_IRET 0
-+        
-+      CFI_RESTORE_STATE
-+14:   XEN_LOCKED_BLOCK_EVENTS(%rsi)
-+      XEN_PUT_VCPU_INFO(%rsi)
-+      SAVE_REST
-+        movq %rsp,%rdi                  # set the argument again
-+      jmp  11b
-+      CFI_ENDPROC
-+ecrit:  /**** END OF CRITICAL REGION ****/
-+# At this point, unlike on x86-32, we don't do the fixup to simplify the 
-+# code and the stack frame is more complex on x86-64.
-+# When the kernel is interrupted in the critical section, the kernel 
-+# will do IRET in that case, and everything will be restored at that point, 
-+# i.e. it just resumes from the next instruction interrupted with the same context. 
-+
-+# Hypervisor uses this for application faults while it executes.
-+# We get here for two reasons:
-+#  1. Fault while reloading DS, ES, FS or GS
-+#  2. Fault while executing IRET
-+# Category 1 we do not need to fix up as Xen has already reloaded all segment
-+# registers that could be reloaded and zeroed the others.
-+# Category 2 we fix up by killing the current process. We cannot use the
-+# normal Linux return path in this case because if we use the IRET hypercall
-+# to pop the stack frame we end up in an infinite loop of failsafe callbacks.
-+# We distinguish between categories by comparing each saved segment register
-+# with its current contents: any discrepancy means we in category 1.
-+ENTRY(failsafe_callback)
-+      _frame (RIP-0x30)
-+      CFI_REL_OFFSET rcx, 0
-+      CFI_REL_OFFSET r11, 8
-+      movw %ds,%cx
-+      cmpw %cx,0x10(%rsp)
-+      CFI_REMEMBER_STATE
-+      jne 1f
-+      movw %es,%cx
-+      cmpw %cx,0x18(%rsp)
-+      jne 1f
-+      movw %fs,%cx
-+      cmpw %cx,0x20(%rsp)
-+      jne 1f
-+      movw %gs,%cx
-+      cmpw %cx,0x28(%rsp)
-+      jne 1f
-+      /* All segments match their saved values => Category 2 (Bad IRET). */
-+      movq (%rsp),%rcx
-+      CFI_RESTORE rcx
-+      movq 8(%rsp),%r11
-+      CFI_RESTORE r11
-+      addq $0x30,%rsp
-+      CFI_ADJUST_CFA_OFFSET -0x30
-+      movq $11,%rdi   /* SIGSEGV */
-+      jmp do_exit                     
-+      CFI_RESTORE_STATE
-+1:    /* Segment mismatch => Category 1 (Bad segment). Retry the IRET. */
-+      movq (%rsp),%rcx
-+      CFI_RESTORE rcx
-+      movq 8(%rsp),%r11
-+      CFI_RESTORE r11
-+      addq $0x30,%rsp
-+      CFI_ADJUST_CFA_OFFSET -0x30
-+      pushq $0
-+      CFI_ADJUST_CFA_OFFSET 8
-+      SAVE_ALL
-+      jmp error_exit
-+      CFI_ENDPROC
-+#if 0       
-+        .section __ex_table,"a"
-+        .align 8
-+        .quad gs_change,bad_gs
-+        .previous
-+        .section .fixup,"ax"
-+      /* running with kernelgs */
-+bad_gs: 
-+/*    swapgs          */      /* switch back to user gs */
-+      xorl %eax,%eax
-+        movl %eax,%gs
-+        jmp  2b
-+        .previous       
-+#endif
-+      
-+/*
-+ * Create a kernel thread.
-+ *
-+ * C extern interface:
-+ *    extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags)
-+ *
-+ * asm input arguments:
-+ *    rdi: fn, rsi: arg, rdx: flags
-+ */
-+ENTRY(kernel_thread)
-+      CFI_STARTPROC
-+      FAKE_STACK_FRAME $child_rip
-+      SAVE_ALL
-+
-+      # rdi: flags, rsi: usp, rdx: will be &pt_regs
-+      movq %rdx,%rdi
-+      orq  kernel_thread_flags(%rip),%rdi
-+      movq $-1, %rsi
-+      movq %rsp, %rdx
-+
-+      xorl %r8d,%r8d
-+      xorl %r9d,%r9d
-+      
-+      # clone now
-+      call do_fork
-+      movq %rax,RAX(%rsp)
-+      xorl %edi,%edi
-+
-+      /*
-+       * It isn't worth to check for reschedule here,
-+       * so internally to the x86_64 port you can rely on kernel_thread()
-+       * not to reschedule the child before returning, this avoids the need
-+       * of hacks for example to fork off the per-CPU idle tasks.
-+         * [Hopefully no generic code relies on the reschedule -AK]   
-+       */
-+      RESTORE_ALL
-+      UNFAKE_STACK_FRAME
-+      ret
-+      CFI_ENDPROC
-+ENDPROC(kernel_thread)
-+      
-+child_rip:
-+      pushq $0                # fake return address
-+      CFI_STARTPROC
-+      /*
-+       * Here we are in the child and the registers are set as they were
-+       * at kernel_thread() invocation in the parent.
-+       */
-+      movq %rdi, %rax
-+      movq %rsi, %rdi
-+      call *%rax
-+      # exit
-+      xorl %edi, %edi
-+      call do_exit
-+      CFI_ENDPROC
-+ENDPROC(child_rip)
-+
-+/*
-+ * execve(). This function needs to use IRET, not SYSRET, to set up all state properly.
-+ *
-+ * C extern interface:
-+ *     extern long execve(char *name, char **argv, char **envp)
-+ *
-+ * asm input arguments:
-+ *    rdi: name, rsi: argv, rdx: envp
-+ *
-+ * We want to fallback into:
-+ *    extern long sys_execve(char *name, char **argv,char **envp, struct pt_regs regs)
-+ *
-+ * do_sys_execve asm fallback arguments:
-+ *    rdi: name, rsi: argv, rdx: envp, fake frame on the stack
-+ */
-+ENTRY(execve)
-+      CFI_STARTPROC
-+      FAKE_STACK_FRAME $0
-+      SAVE_ALL        
-+      call sys_execve
-+      movq %rax, RAX(%rsp)    
-+      RESTORE_REST
-+      testq %rax,%rax
-+      jne 1f
-+        jmp int_ret_from_sys_call
-+1:      RESTORE_ARGS
-+      UNFAKE_STACK_FRAME
-+      ret
-+      CFI_ENDPROC
-+ENDPROC(execve)
-+
-+KPROBE_ENTRY(page_fault)
-+      errorentry do_page_fault
-+END(page_fault)
-+      .previous .text
-+
-+ENTRY(coprocessor_error)
-+      zeroentry do_coprocessor_error
-+END(coprocessor_error)
-+
-+ENTRY(simd_coprocessor_error)
-+      zeroentry do_simd_coprocessor_error     
-+END(simd_coprocessor_error)
-+
-+ENTRY(device_not_available)
-+      zeroentry math_state_restore
-+END(device_not_available)
-+
-+      /* runs on exception stack */
-+KPROBE_ENTRY(debug)
-+/*    INTR_FRAME
-+      pushq $0
-+      CFI_ADJUST_CFA_OFFSET 8 */
-+      zeroentry do_debug
-+/*    paranoidexit
-+      CFI_ENDPROC */
-+END(debug)
-+      .previous .text
-+
-+#if 0
-+      /* runs on exception stack */   
-+KPROBE_ENTRY(nmi)
-+      INTR_FRAME
-+      pushq $-1
-+      CFI_ADJUST_CFA_OFFSET 8
-+      paranoidentry do_nmi, 0, 0
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+      paranoidexit 0
-+#else
-+      jmp paranoid_exit1
-+      CFI_ENDPROC
-+#endif
-+END(nmi)
-+      .previous .text
-+#endif        
-+
-+KPROBE_ENTRY(int3)
-+/*    INTR_FRAME
-+      pushq $0
-+      CFI_ADJUST_CFA_OFFSET 8 */
-+      zeroentry do_int3
-+/*    jmp paranoid_exit1
-+      CFI_ENDPROC */
-+END(int3)
-+      .previous .text
-+
-+ENTRY(overflow)
-+      zeroentry do_overflow
-+END(overflow)
-+
-+ENTRY(bounds)
-+      zeroentry do_bounds
-+END(bounds)
-+
-+ENTRY(invalid_op)
-+      zeroentry do_invalid_op 
-+END(invalid_op)
-+
-+ENTRY(coprocessor_segment_overrun)
-+      zeroentry do_coprocessor_segment_overrun
-+END(coprocessor_segment_overrun)
-+
-+ENTRY(reserved)
-+      zeroentry do_reserved
-+END(reserved)
-+
-+#if 0
-+      /* runs on exception stack */
-+ENTRY(double_fault)
-+      XCPT_FRAME
-+      paranoidentry do_double_fault
-+      jmp paranoid_exit1
-+      CFI_ENDPROC
-+END(double_fault)
-+#endif
-+
-+ENTRY(invalid_TSS)
-+      errorentry do_invalid_TSS
-+END(invalid_TSS)
-+
-+ENTRY(segment_not_present)
-+      errorentry do_segment_not_present
-+END(segment_not_present)
-+
-+      /* runs on exception stack */
-+ENTRY(stack_segment)
-+/*    XCPT_FRAME
-+      paranoidentry do_stack_segment */
-+      errorentry do_stack_segment
-+/*    jmp paranoid_exit1
-+      CFI_ENDPROC */
-+END(stack_segment)
-+
-+KPROBE_ENTRY(general_protection)
-+      errorentry do_general_protection
-+END(general_protection)
-+      .previous .text
-+
-+ENTRY(alignment_check)
-+      errorentry do_alignment_check
-+END(alignment_check)
-+
-+ENTRY(divide_error)
-+      zeroentry do_divide_error
-+END(divide_error)
-+
-+ENTRY(spurious_interrupt_bug)
-+      zeroentry do_spurious_interrupt_bug
-+END(spurious_interrupt_bug)
-+
-+#ifdef CONFIG_X86_MCE
-+      /* runs on exception stack */
-+ENTRY(machine_check)
-+      INTR_FRAME
-+      pushq $0
-+      CFI_ADJUST_CFA_OFFSET 8 
-+      paranoidentry do_machine_check
-+      jmp paranoid_exit1
-+      CFI_ENDPROC
-+END(machine_check)
-+#endif
-+
-+/* Call softirq on interrupt stack. Interrupts are off. */
-+ENTRY(call_softirq)
-+      CFI_STARTPROC
-+      push %rbp
-+      CFI_ADJUST_CFA_OFFSET   8
-+      CFI_REL_OFFSET rbp,0
-+      mov  %rsp,%rbp
-+      CFI_DEF_CFA_REGISTER rbp
-+      incl %gs:pda_irqcount
-+      cmove %gs:pda_irqstackptr,%rsp
-+      push  %rbp                      # backlink for old unwinder
-+      call __do_softirq
-+      leaveq
-+      CFI_DEF_CFA_REGISTER    rsp
-+      CFI_ADJUST_CFA_OFFSET   -8
-+      decl %gs:pda_irqcount
-+      ret
-+      CFI_ENDPROC
-+ENDPROC(call_softirq)
-+
-+#ifdef CONFIG_STACK_UNWIND
-+ENTRY(arch_unwind_init_running)
-+      CFI_STARTPROC
-+      movq    %r15, R15(%rdi)
-+      movq    %r14, R14(%rdi)
-+      xchgq   %rsi, %rdx
-+      movq    %r13, R13(%rdi)
-+      movq    %r12, R12(%rdi)
-+      xorl    %eax, %eax
-+      movq    %rbp, RBP(%rdi)
-+      movq    %rbx, RBX(%rdi)
-+      movq    (%rsp), %rcx
-+      movq    %rax, R11(%rdi)
-+      movq    %rax, R10(%rdi)
-+      movq    %rax, R9(%rdi)
-+      movq    %rax, R8(%rdi)
-+      movq    %rax, RAX(%rdi)
-+      movq    %rax, RCX(%rdi)
-+      movq    %rax, RDX(%rdi)
-+      movq    %rax, RSI(%rdi)
-+      movq    %rax, RDI(%rdi)
-+      movq    %rax, ORIG_RAX(%rdi)
-+      movq    %rcx, RIP(%rdi)
-+      leaq    8(%rsp), %rcx
-+      movq    $__KERNEL_CS, CS(%rdi)
-+      movq    %rax, EFLAGS(%rdi)
-+      movq    %rcx, RSP(%rdi)
-+      movq    $__KERNEL_DS, SS(%rdi)
-+      jmpq    *%rdx
-+      CFI_ENDPROC
-+ENDPROC(arch_unwind_init_running)
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/genapic_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/genapic_64-xen.c   2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,143 @@
-+/*
-+ * Copyright 2004 James Cleverdon, IBM.
-+ * Subject to the GNU Public License, v.2
-+ *
-+ * Generic APIC sub-arch probe layer.
-+ *
-+ * Hacked for x86-64 by James Cleverdon from i386 architecture code by
-+ * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
-+ * James Cleverdon.
-+ */
-+#include <linux/threads.h>
-+#include <linux/cpumask.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+#include <linux/ctype.h>
-+#include <linux/init.h>
-+#include <linux/module.h>
-+
-+#include <asm/smp.h>
-+#include <asm/ipi.h>
-+
-+#if defined(CONFIG_ACPI)
-+#include <acpi/acpi_bus.h>
-+#endif
-+
-+/* which logical CPU number maps to which CPU (physical APIC ID) */
-+u8 x86_cpu_to_apicid[NR_CPUS] __read_mostly = { [0 ... NR_CPUS-1] = BAD_APICID };
-+EXPORT_SYMBOL(x86_cpu_to_apicid);
-+u8 x86_cpu_to_log_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-+
-+extern struct genapic apic_cluster;
-+extern struct genapic apic_flat;
-+extern struct genapic apic_physflat;
-+
-+#ifndef CONFIG_XEN
-+struct genapic *genapic = &apic_flat;
-+#else
-+extern struct genapic apic_xen;
-+struct genapic *genapic = &apic_xen;
-+#endif
-+
-+
-+/*
-+ * Check the APIC IDs in bios_cpu_apicid and choose the APIC mode.
-+ */
-+void __init clustered_apic_check(void)
-+{
-+#ifndef CONFIG_XEN
-+      long i;
-+      u8 clusters, max_cluster;
-+      u8 id;
-+      u8 cluster_cnt[NUM_APIC_CLUSTERS];
-+      int max_apic = 0;
-+
-+#if defined(CONFIG_ACPI)
-+      /*
-+       * Some x86_64 machines use physical APIC mode regardless of how many
-+       * procs/clusters are present (x86_64 ES7000 is an example).
-+       */
-+      if (acpi_fadt.revision > FADT2_REVISION_ID)
-+              if (acpi_fadt.force_apic_physical_destination_mode) {
-+                      genapic = &apic_cluster;
-+                      goto print;
-+              }
-+#endif
-+
-+      memset(cluster_cnt, 0, sizeof(cluster_cnt));
-+      for (i = 0; i < NR_CPUS; i++) {
-+              id = bios_cpu_apicid[i];
-+              if (id == BAD_APICID)
-+                      continue;
-+              if (id > max_apic)
-+                      max_apic = id;
-+              cluster_cnt[APIC_CLUSTERID(id)]++;
-+      }
-+
-+      /* Don't use clustered mode on AMD platforms. */
-+      if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD) {
-+              genapic = &apic_physflat;
-+#ifndef CONFIG_HOTPLUG_CPU
-+              /* In the CPU hotplug case we cannot use broadcast mode
-+                 because that opens a race when a CPU is removed.
-+                 Stay at physflat mode in this case.
-+                 It is bad to do this unconditionally though. Once
-+                 we have ACPI platform support for CPU hotplug
-+                 we should detect hotplug capablity from ACPI tables and
-+                 only do this when really needed. -AK */
-+              if (max_apic <= 8)
-+                      genapic = &apic_flat;
-+#endif
-+              goto print;
-+      }
-+
-+      clusters = 0;
-+      max_cluster = 0;
-+
-+      for (i = 0; i < NUM_APIC_CLUSTERS; i++) {
-+              if (cluster_cnt[i] > 0) {
-+                      ++clusters;
-+                      if (cluster_cnt[i] > max_cluster)
-+                              max_cluster = cluster_cnt[i];
-+              }
-+      }
-+
-+      /*
-+       * If we have clusters <= 1 and CPUs <= 8 in cluster 0, then flat mode,
-+       * else if max_cluster <= 4 and cluster_cnt[15] == 0, clustered logical
-+       * else physical mode.
-+       * (We don't use lowest priority delivery + HW APIC IRQ steering, so
-+       * can ignore the clustered logical case and go straight to physical.)
-+       */
-+      if (clusters <= 1 && max_cluster <= 8 && cluster_cnt[0] == max_cluster) {
-+#ifdef CONFIG_HOTPLUG_CPU
-+              /* Don't use APIC shortcuts in CPU hotplug to avoid races */
-+              genapic = &apic_physflat;
-+#else
-+              genapic = &apic_flat;
-+#endif
-+      } else
-+              genapic = &apic_cluster;
-+
-+print:
-+#else
-+      /* hardcode to xen apic functions */
-+      genapic = &apic_xen;
-+#endif
-+      printk(KERN_INFO "Setting APIC routing to %s\n", genapic->name);
-+}
-+
-+/* Same for both flat and clustered. */
-+
-+#ifdef CONFIG_XEN
-+extern void xen_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest);
-+#endif
-+
-+void send_IPI_self(int vector)
-+{
-+#ifndef CONFIG_XEN
-+      __send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
-+#else
-+      xen_send_IPI_shortcut(APIC_DEST_SELF, vector, APIC_DEST_PHYSICAL);
-+#endif
-+}
-Index: head-2008-11-25/arch/x86/kernel/genapic_xen_64.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/genapic_xen_64.c   2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,161 @@
-+/*
-+ * Copyright 2004 James Cleverdon, IBM.
-+ * Subject to the GNU Public License, v.2
-+ *
-+ * Xen APIC subarch code.  Maximum 8 CPUs, logical delivery.
-+ *
-+ * Hacked for x86-64 by James Cleverdon from i386 architecture code by
-+ * Martin Bligh, Andi Kleen, James Bottomley, John Stultz, and
-+ * James Cleverdon.
-+ *
-+ * Hacked to pieces for Xen by Chris Wright.
-+ */
-+#include <linux/threads.h>
-+#include <linux/cpumask.h>
-+#include <linux/string.h>
-+#include <linux/kernel.h>
-+#include <linux/ctype.h>
-+#include <linux/init.h>
-+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-+#include <asm/smp.h>
-+#include <asm/ipi.h>
-+#else
-+#include <asm/apic.h>
-+#include <asm/apicdef.h>
-+#include <asm/genapic.h>
-+#endif
-+#include <xen/evtchn.h>
-+
-+DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
-+
-+static inline void __send_IPI_one(unsigned int cpu, int vector)
-+{
-+      int irq = per_cpu(ipi_to_irq, cpu)[vector];
-+      BUG_ON(irq < 0);
-+      notify_remote_via_irq(irq);
-+}
-+
-+void xen_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest)
-+{
-+      int cpu;
-+
-+      switch (shortcut) {
-+      case APIC_DEST_SELF:
-+              __send_IPI_one(smp_processor_id(), vector);
-+              break;
-+      case APIC_DEST_ALLBUT:
-+              for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-+                      if (cpu == smp_processor_id())
-+                              continue;
-+                      if (cpu_isset(cpu, cpu_online_map)) {
-+                              __send_IPI_one(cpu, vector);
-+                      }
-+              }
-+              break;
-+      case APIC_DEST_ALLINC:
-+              for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-+                      if (cpu_isset(cpu, cpu_online_map)) {
-+                              __send_IPI_one(cpu, vector);
-+                      }
-+              }
-+              break;
-+      default:
-+              printk("XXXXXX __send_IPI_shortcut %08x vector %d\n", shortcut,
-+                     vector);
-+              break;
-+      }
-+}
-+
-+static cpumask_t xen_target_cpus(void)
-+{
-+      return cpu_online_map;
-+}
-+
-+/*
-+ * Set up the logical destination ID.
-+ * Do nothing, not called now.
-+ */
-+static void xen_init_apic_ldr(void)
-+{
-+      Dprintk("%s\n", __FUNCTION__);
-+      return;
-+}
-+
-+static void xen_send_IPI_allbutself(int vector)
-+{
-+      /*
-+       * if there are no other CPUs in the system then
-+       * we get an APIC send error if we try to broadcast.
-+       * thus we have to avoid sending IPIs in this case.
-+       */
-+      Dprintk("%s\n", __FUNCTION__);
-+      if (num_online_cpus() > 1)
-+              xen_send_IPI_shortcut(APIC_DEST_ALLBUT, vector, APIC_DEST_LOGICAL);
-+}
-+
-+static void xen_send_IPI_all(int vector)
-+{
-+      Dprintk("%s\n", __FUNCTION__);
-+      xen_send_IPI_shortcut(APIC_DEST_ALLINC, vector, APIC_DEST_LOGICAL);
-+}
-+
-+static void xen_send_IPI_mask(cpumask_t cpumask, int vector)
-+{
-+      unsigned long mask = cpus_addr(cpumask)[0];
-+      unsigned int cpu;
-+      unsigned long flags;
-+
-+      Dprintk("%s\n", __FUNCTION__);
-+      local_irq_save(flags);
-+      WARN_ON(mask & ~cpus_addr(cpu_online_map)[0]);
-+
-+      for (cpu = 0; cpu < NR_CPUS; ++cpu) {
-+              if (cpu_isset(cpu, cpumask)) {
-+                      __send_IPI_one(cpu, vector);
-+              }
-+      }
-+      local_irq_restore(flags);
-+}
-+
-+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-+static int xen_apic_id_registered(void)
-+{
-+      /* better be set */
-+      Dprintk("%s\n", __FUNCTION__);
-+      return physid_isset(smp_processor_id(), phys_cpu_present_map);
-+}
-+#endif
-+
-+static unsigned int xen_cpu_mask_to_apicid(cpumask_t cpumask)
-+{
-+      Dprintk("%s\n", __FUNCTION__);
-+      return cpus_addr(cpumask)[0] & APIC_ALL_CPUS;
-+}
-+
-+static unsigned int phys_pkg_id(int index_msb)
-+{
-+      u32 ebx;
-+
-+      Dprintk("%s\n", __FUNCTION__);
-+      ebx = cpuid_ebx(1);
-+      return ((ebx >> 24) & 0xFF) >> index_msb;
-+}
-+
-+struct genapic apic_xen =  {
-+      .name = "xen",
-+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-+      .int_delivery_mode = dest_LowestPrio,
-+#endif
-+      .int_dest_mode = (APIC_DEST_LOGICAL != 0),
-+      .int_delivery_dest = APIC_DEST_LOGICAL | APIC_DM_LOWEST,
-+      .target_cpus = xen_target_cpus,
-+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-+      .apic_id_registered = xen_apic_id_registered,
-+#endif
-+      .init_apic_ldr = xen_init_apic_ldr,
-+      .send_IPI_all = xen_send_IPI_all,
-+      .send_IPI_allbutself = xen_send_IPI_allbutself,
-+      .send_IPI_mask = xen_send_IPI_mask,
-+      .cpu_mask_to_apicid = xen_cpu_mask_to_apicid,
-+      .phys_pkg_id = phys_pkg_id,
-+};
-Index: head-2008-11-25/arch/x86/kernel/head_64-xen.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/head_64-xen.S      2007-08-06 15:10:49.000000000 +0200
-@@ -0,0 +1,214 @@
-+/*
-+ *  linux/arch/x86_64/kernel/head.S -- start in 32bit and switch to 64bit
-+ *
-+ *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
-+ *  Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
-+ *  Copyright (C) 2000 Karsten Keil <kkeil@suse.de>
-+ *  Copyright (C) 2001,2002 Andi Kleen <ak@suse.de>
-+ *
-+ *  $Id: head.S,v 1.49 2002/03/19 17:39:25 ak Exp $
-+ *
-+ *  Jun Nakajima <jun.nakajima@intel.com>
-+ *    Modified for Xen                                
-+ */
-+
-+
-+#include <linux/linkage.h>
-+#include <linux/threads.h>
-+#include <linux/init.h>
-+#include <linux/elfnote.h>
-+#include <asm/desc.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/msr.h>
-+#include <asm/cache.h>
-+#include <asm/dwarf2.h>
-+#include <xen/interface/elfnote.h>
-+
-+      .section .bootstrap.text, "ax", @progbits
-+      .code64
-+      .globl startup_64
-+startup_64:
-+      movq $(init_thread_union+THREAD_SIZE-8),%rsp
-+
-+      /* rsi is pointer to startup info structure.
-+         pass it to C */
-+      movq %rsi,%rdi
-+      pushq $0                # fake return address
-+      jmp x86_64_start_kernel
-+
-+#ifdef CONFIG_ACPI_SLEEP
-+.org 0xf00
-+      .globl pGDT32
-+pGDT32:
-+      .word   gdt_end-cpu_gdt_table-1
-+      .long   cpu_gdt_table-__START_KERNEL_map
-+#endif
-+ENTRY(stext)
-+ENTRY(_stext)
-+
-+      $page = 0
-+#define NEXT_PAGE(name) \
-+      $page = $page + 1; \
-+      .org $page * 0x1000; \
-+      phys_##name = $page * 0x1000 + __PHYSICAL_START; \
-+ENTRY(name)
-+
-+NEXT_PAGE(init_level4_pgt)
-+      /* This gets initialized in x86_64_start_kernel */
-+      .fill   512,8,0
-+NEXT_PAGE(init_level4_user_pgt)
-+        /*
-+         * We update two pgd entries to make kernel and user pgd consistent
-+         * at pgd_populate(). It can be used for kernel modules. So we place 
-+         * this page here for those cases to avoid memory corruption.
-+         * We also use this page to establish the initial mapping for the
-+         * vsyscall area.
-+         */
-+      .fill   512,8,0
-+
-+NEXT_PAGE(level3_kernel_pgt)
-+      .fill   512,8,0
-+
-+        /*
-+         * This is used for vsyscall area mapping as we have a different
-+         * level4 page table for user.
-+         */
-+NEXT_PAGE(level3_user_pgt)
-+        .fill 512,8,0
-+
-+NEXT_PAGE(level2_kernel_pgt)
-+      .fill   512,8,0
-+
-+NEXT_PAGE(hypercall_page)
-+      CFI_STARTPROC
-+      .rept 0x1000 / 0x20
-+      .skip 1 /* push %rcx */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      CFI_REL_OFFSET  rcx,0
-+      .skip 2 /* push %r11 */
-+      CFI_ADJUST_CFA_OFFSET   8
-+      CFI_REL_OFFSET  rcx,0
-+      .skip 5 /* mov $#,%eax */
-+      .skip 2 /* syscall */
-+      .skip 2 /* pop %r11 */
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_RESTORE r11
-+      .skip 1 /* pop %rcx */
-+      CFI_ADJUST_CFA_OFFSET -8
-+      CFI_RESTORE rcx
-+      .align 0x20,0 /* ret */
-+      .endr
-+      CFI_ENDPROC
-+
-+#undef NEXT_PAGE
-+
-+      .data
-+/* Just dummy symbol to allow compilation. Not used in sleep path */
-+#ifdef CONFIG_ACPI_SLEEP
-+      .align PAGE_SIZE
-+ENTRY(wakeup_level4_pgt)
-+      .fill   512,8,0
-+#endif
-+
-+      .data
-+
-+      .align 16
-+      .globl cpu_gdt_descr
-+cpu_gdt_descr:
-+      .word   gdt_end-cpu_gdt_table-1
-+gdt:
-+      .quad   cpu_gdt_table
-+#ifdef CONFIG_SMP
-+      .rept   NR_CPUS-1
-+      .word   0
-+      .quad   0
-+      .endr
-+#endif
-+
-+/* We need valid kernel segments for data and code in long mode too
-+ * IRET will check the segment types  kkeil 2000/10/28
-+ * Also sysret mandates a special GDT layout 
-+ */
-+                              
-+      .section .data.page_aligned, "aw"
-+      .align PAGE_SIZE
-+
-+/* The TLS descriptors are currently at a different place compared to i386.
-+   Hopefully nobody expects them at a fixed place (Wine?) */
-+
-+ENTRY(cpu_gdt_table)
-+      .quad   0x0000000000000000      /* NULL descriptor */
-+      .quad   0x0                     /* unused */
-+      .quad   0x00af9a000000ffff      /* __KERNEL_CS */
-+      .quad   0x00cf92000000ffff      /* __KERNEL_DS */
-+      .quad   0x00cffa000000ffff      /* __USER32_CS */
-+      .quad   0x00cff2000000ffff      /* __USER_DS, __USER32_DS  */
-+      .quad   0x00affa000000ffff      /* __USER_CS */
-+      .quad   0x00cf9a000000ffff      /* __KERNEL32_CS */
-+      .quad   0,0                     /* TSS */
-+      .quad   0,0                     /* LDT */
-+      .quad   0,0,0                   /* three TLS descriptors */
-+      .quad   0                       /* unused */
-+gdt_end:
-+      /* asm/segment.h:GDT_ENTRIES must match this */
-+      /* This should be a multiple of the cache line size */
-+      /* GDTs of other CPUs are now dynamically allocated */
-+
-+      /* zero the remaining page */
-+      .fill PAGE_SIZE / 8 - GDT_ENTRIES,8,0
-+
-+      .section .bss.page_aligned, "aw", @nobits
-+      .align PAGE_SIZE
-+ENTRY(empty_zero_page)
-+      .skip PAGE_SIZE
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+/*
-+ * __xen_guest information
-+ */
-+.macro utoh value
-+ .if (\value) < 0 || (\value) >= 0x10
-+      utoh (((\value)>>4)&0x0fffffffffffffff)
-+ .endif
-+ .if ((\value) & 0xf) < 10
-+  .byte '0' + ((\value) & 0xf)
-+ .else
-+  .byte 'A' + ((\value) & 0xf) - 10
-+ .endif
-+.endm
-+
-+.section __xen_guest
-+      .ascii  "GUEST_OS=linux,GUEST_VER=2.6"
-+      .ascii  ",XEN_VER=xen-3.0"
-+      .ascii  ",VIRT_BASE=0x"
-+              utoh __START_KERNEL_map
-+      .ascii  ",ELF_PADDR_OFFSET=0x"
-+              utoh __START_KERNEL_map
-+      .ascii  ",VIRT_ENTRY=0x"
-+              utoh (__START_KERNEL_map + __PHYSICAL_START)
-+      .ascii  ",HYPERCALL_PAGE=0x"
-+              utoh (phys_hypercall_page >> PAGE_SHIFT)
-+      .ascii  ",FEATURES=writable_page_tables"
-+      .ascii           "|writable_descriptor_tables"
-+      .ascii           "|auto_translated_physmap"
-+      .ascii           "|supervisor_mode_kernel"
-+      .ascii  ",LOADER=generic"
-+      .byte   0
-+#endif /* CONFIG_XEN_COMPAT <= 0x030002 */
-+      
-+      ELFNOTE(Xen, XEN_ELFNOTE_GUEST_OS,       .asciz, "linux")
-+      ELFNOTE(Xen, XEN_ELFNOTE_GUEST_VERSION,  .asciz, "2.6")
-+      ELFNOTE(Xen, XEN_ELFNOTE_XEN_VERSION,    .asciz, "xen-3.0")
-+      ELFNOTE(Xen, XEN_ELFNOTE_VIRT_BASE,      .quad,  __START_KERNEL_map)
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  __START_KERNEL_map)
-+#else
-+      ELFNOTE(Xen, XEN_ELFNOTE_PADDR_OFFSET,   .quad,  0)
-+#endif
-+      ELFNOTE(Xen, XEN_ELFNOTE_ENTRY,          .quad,  startup_64)
-+      ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .quad,  hypercall_page)
-+      ELFNOTE(Xen, XEN_ELFNOTE_L1_MFN_VALID,   .quad,  _PAGE_PRESENT,_PAGE_PRESENT)
-+      ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz, "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
-+      ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz, "generic")
-+      ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)
-Index: head-2008-11-25/arch/x86/kernel/head64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/head64-xen.c       2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,162 @@
-+/*
-+ *  linux/arch/x86_64/kernel/head64.c -- prepare to run common code
-+ *
-+ *  Copyright (C) 2000 Andrea Arcangeli <andrea@suse.de> SuSE
-+ *
-+ *  Jun Nakajima <jun.nakajima@intel.com>
-+ *    Modified for Xen.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/linkage.h>
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/percpu.h>
-+#include <linux/module.h>
-+
-+#include <asm/processor.h>
-+#include <asm/proto.h>
-+#include <asm/smp.h>
-+#include <asm/bootsetup.h>
-+#include <asm/setup.h>
-+#include <asm/desc.h>
-+#include <asm/pgtable.h>
-+#include <asm/sections.h>
-+
-+unsigned long start_pfn;
-+
-+/* Don't add a printk in there. printk relies on the PDA which is not initialized 
-+   yet. */
-+#if 0
-+static void __init clear_bss(void)
-+{
-+      memset(__bss_start, 0,
-+             (unsigned long) __bss_stop - (unsigned long) __bss_start);
-+}
-+#endif
-+
-+#define NEW_CL_POINTER                0x228   /* Relative to real mode data */
-+#define OLD_CL_MAGIC_ADDR     0x90020
-+#define OLD_CL_MAGIC            0xA33F
-+#define OLD_CL_BASE_ADDR        0x90000
-+#define OLD_CL_OFFSET           0x90022
-+
-+extern char saved_command_line[];
-+
-+static void __init copy_bootdata(char *real_mode_data)
-+{
-+#ifndef CONFIG_XEN
-+      int new_data;
-+      char * command_line;
-+
-+      memcpy(x86_boot_params, real_mode_data, BOOT_PARAM_SIZE);
-+      new_data = *(int *) (x86_boot_params + NEW_CL_POINTER);
-+      if (!new_data) {
-+              if (OLD_CL_MAGIC != * (u16 *) OLD_CL_MAGIC_ADDR) {
-+                      printk("so old bootloader that it does not support commandline?!\n");
-+                      return;
-+              }
-+              new_data = OLD_CL_BASE_ADDR + * (u16 *) OLD_CL_OFFSET;
-+              printk("old bootloader convention, maybe loadlin?\n");
-+      }
-+      command_line = (char *) ((u64)(new_data));
-+      memcpy(saved_command_line, command_line, COMMAND_LINE_SIZE);
-+#else
-+      int max_cmdline;
-+      
-+      if ((max_cmdline = MAX_GUEST_CMDLINE) > COMMAND_LINE_SIZE)
-+              max_cmdline = COMMAND_LINE_SIZE;
-+      memcpy(saved_command_line, xen_start_info->cmd_line, max_cmdline);
-+      saved_command_line[max_cmdline-1] = '\0';
-+#endif
-+      printk("Bootdata ok (command line is %s)\n", saved_command_line);
-+}
-+
-+static void __init setup_boot_cpu_data(void)
-+{
-+      unsigned int dummy, eax;
-+
-+      /* get vendor info */
-+      cpuid(0, (unsigned int *)&boot_cpu_data.cpuid_level,
-+            (unsigned int *)&boot_cpu_data.x86_vendor_id[0],
-+            (unsigned int *)&boot_cpu_data.x86_vendor_id[8],
-+            (unsigned int *)&boot_cpu_data.x86_vendor_id[4]);
-+
-+      /* get cpu type */
-+      cpuid(1, &eax, &dummy, &dummy,
-+              (unsigned int *) &boot_cpu_data.x86_capability);
-+      boot_cpu_data.x86 = (eax >> 8) & 0xf;
-+      boot_cpu_data.x86_model = (eax >> 4) & 0xf;
-+      boot_cpu_data.x86_mask = eax & 0xf;
-+}
-+
-+#include <xen/interface/memory.h>
-+unsigned long *machine_to_phys_mapping;
-+EXPORT_SYMBOL(machine_to_phys_mapping);
-+unsigned int machine_to_phys_order;
-+EXPORT_SYMBOL(machine_to_phys_order);
-+
-+void __init x86_64_start_kernel(char * real_mode_data)
-+{
-+      struct xen_machphys_mapping mapping;
-+      unsigned long machine_to_phys_nr_ents;
-+      char *s;
-+      int i;
-+
-+      setup_xen_features();
-+
-+      xen_start_info = (struct start_info *)real_mode_data;
-+      if (!xen_feature(XENFEAT_auto_translated_physmap))
-+              phys_to_machine_mapping =
-+                      (unsigned long *)xen_start_info->mfn_list;
-+      start_pfn = (__pa(xen_start_info->pt_base) >> PAGE_SHIFT) +
-+              xen_start_info->nr_pt_frames;
-+
-+      machine_to_phys_mapping = (unsigned long *)MACH2PHYS_VIRT_START;
-+      machine_to_phys_nr_ents = MACH2PHYS_NR_ENTRIES;
-+      if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
-+              machine_to_phys_mapping = (unsigned long *)mapping.v_start;
-+              machine_to_phys_nr_ents = mapping.max_mfn + 1;
-+      }
-+      while ((1UL << machine_to_phys_order) < machine_to_phys_nr_ents )
-+              machine_to_phys_order++;
-+
-+#if 0
-+      for (i = 0; i < 256; i++)
-+              set_intr_gate(i, early_idt_handler);
-+      asm volatile("lidt %0" :: "m" (idt_descr));
-+#endif
-+
-+      /*
-+       * This must be called really, really early:
-+       */
-+      lockdep_init();
-+
-+      for (i = 0; i < NR_CPUS; i++)
-+              cpu_pda(i) = &boot_cpu_pda[i];
-+
-+      pda_init(0);
-+      copy_bootdata(real_mode_data);
-+#ifdef CONFIG_SMP
-+      cpu_set(0, cpu_online_map);
-+#endif
-+      s = strstr(saved_command_line, "earlyprintk=");
-+      if (s != NULL)
-+              setup_early_printk(strchr(s, '=') + 1);
-+#ifdef CONFIG_NUMA
-+      s = strstr(saved_command_line, "numa=");
-+      if (s != NULL)
-+              numa_setup(s+5);
-+#endif
-+#ifdef CONFIG_X86_IO_APIC
-+      if (strstr(saved_command_line, "disableapic"))
-+              disable_apic = 1;
-+#endif
-+      /* You need early console to see that */
-+      if (__pa_symbol(&_end) >= KERNEL_TEXT_SIZE)
-+              panic("Kernel too big for kernel mapping\n");
-+
-+      setup_boot_cpu_data();
-+      start_kernel();
-+}
-Index: head-2008-11-25/arch/x86/kernel/io_apic_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/io_apic_64-xen.c   2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,2268 @@
-+/*
-+ *    Intel IO-APIC support for multi-Pentium hosts.
-+ *
-+ *    Copyright (C) 1997, 1998, 1999, 2000 Ingo Molnar, Hajnalka Szabo
-+ *
-+ *    Many thanks to Stig Venaas for trying out countless experimental
-+ *    patches and reporting/debugging problems patiently!
-+ *
-+ *    (c) 1999, Multiple IO-APIC support, developed by
-+ *    Ken-ichi Yaku <yaku@css1.kbnes.nec.co.jp> and
-+ *      Hidemi Kishimoto <kisimoto@css1.kbnes.nec.co.jp>,
-+ *    further tested and cleaned up by Zach Brown <zab@redhat.com>
-+ *    and Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *    Maciej W. Rozycki       :       Bits for genuine 82489DX APICs;
-+ *                                    thanks to Eric Gilmore
-+ *                                    and Rolf G. Tews
-+ *                                    for testing these extensively
-+ *    Paul Diefenbaugh        :       Added full ACPI support
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/sched.h>
-+#include <linux/smp_lock.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/acpi.h>
-+#include <linux/sysdev.h>
-+#ifdef CONFIG_ACPI
-+#include <acpi/acpi_bus.h>
-+#endif
-+
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/desc.h>
-+#include <asm/proto.h>
-+#include <asm/mach_apic.h>
-+#include <asm/acpi.h>
-+#include <asm/dma.h>
-+#include <asm/nmi.h>
-+
-+#define __apicdebuginit  __init
-+
-+int sis_apic_bug; /* not actually supported, dummy for compile */
-+
-+static int no_timer_check;
-+
-+int disable_timer_pin_1 __initdata;
-+
-+#ifndef CONFIG_XEN
-+int timer_over_8254 __initdata = 0;
-+
-+/* Where if anywhere is the i8259 connect in external int mode */
-+static struct { int pin, apic; } ioapic_i8259 = { -1, -1 };
-+#endif
-+
-+static DEFINE_SPINLOCK(ioapic_lock);
-+static DEFINE_SPINLOCK(vector_lock);
-+
-+/*
-+ * # of IRQ routing registers
-+ */
-+int nr_ioapic_registers[MAX_IO_APICS];
-+
-+/*
-+ * Rough estimation of how many shared IRQs there are, can
-+ * be changed anytime.
-+ */
-+#define MAX_PLUS_SHARED_IRQS NR_IRQ_VECTORS
-+#define PIN_MAP_SIZE (MAX_PLUS_SHARED_IRQS + NR_IRQS)
-+
-+/*
-+ * This is performance-critical, we want to do it O(1)
-+ *
-+ * the indexing order of this array favors 1:1 mappings
-+ * between pins and IRQs.
-+ */
-+
-+static struct irq_pin_list {
-+      short apic, pin, next;
-+} irq_2_pin[PIN_MAP_SIZE];
-+
-+int vector_irq[NR_VECTORS] __read_mostly = { [0 ... NR_VECTORS - 1] = -1};
-+#ifdef CONFIG_PCI_MSI
-+#define vector_to_irq(vector)         \
-+      (platform_legacy_irq(vector) ? vector : vector_irq[vector])
-+#else
-+#define vector_to_irq(vector) (vector)
-+#endif
-+
-+#ifdef CONFIG_XEN
-+
-+#include <xen/interface/xen.h>
-+#include <xen/interface/physdev.h>
-+#include <xen/evtchn.h>
-+
-+/* Fake i8259 */
-+#define make_8259A_irq(_irq)     (io_apic_irqs &= ~(1UL<<(_irq)))
-+#define disable_8259A_irq(_irq)  ((void)0)
-+#define i8259A_irq_pending(_irq) (0)
-+
-+unsigned long io_apic_irqs;
-+
-+static inline unsigned int xen_io_apic_read(unsigned int apic, unsigned int reg)
-+{
-+      struct physdev_apic apic_op;
-+      int ret;
-+
-+      apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-+      apic_op.reg = reg;
-+      ret = HYPERVISOR_physdev_op(PHYSDEVOP_apic_read, &apic_op);
-+      if (ret)
-+              return ret;
-+      return apic_op.value;
-+}
-+
-+static inline void xen_io_apic_write(unsigned int apic, unsigned int reg, unsigned int value)
-+{
-+      struct physdev_apic apic_op;
-+
-+      apic_op.apic_physbase = mp_ioapics[apic].mpc_apicaddr;
-+      apic_op.reg = reg;
-+      apic_op.value = value;
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_apic_write, &apic_op));
-+}
-+
-+#define io_apic_read(a,r)    xen_io_apic_read(a,r)
-+#define io_apic_write(a,r,v) xen_io_apic_write(a,r,v)
-+
-+#define clear_IO_APIC() ((void)0)
-+
-+#else
-+
-+#ifdef CONFIG_SMP
-+static void set_ioapic_affinity_irq(unsigned int irq, cpumask_t mask)
-+{
-+      unsigned long flags;
-+      unsigned int dest;
-+      cpumask_t tmp;
-+
-+      cpus_and(tmp, mask, cpu_online_map);
-+      if (cpus_empty(tmp))
-+              tmp = TARGET_CPUS;
-+
-+      cpus_and(mask, tmp, CPU_MASK_ALL);
-+
-+      dest = cpu_mask_to_apicid(mask);
-+
-+      /*
-+       * Only the high 8 bits are valid.
-+       */
-+      dest = SET_APIC_LOGICAL_ID(dest);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      __DO_ACTION(1, = dest, )
-+      set_irq_info(irq, mask);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+#endif
-+
-+#endif /* !CONFIG_XEN */
-+
-+/*
-+ * The common case is 1:1 IRQ<->pin mappings. Sometimes there are
-+ * shared ISA-space IRQs, so we have to support them. We are super
-+ * fast in the common case, and fast for shared ISA-space IRQs.
-+ */
-+static void add_pin_to_irq(unsigned int irq, int apic, int pin)
-+{
-+      static int first_free_entry = NR_IRQS;
-+      struct irq_pin_list *entry = irq_2_pin + irq;
-+
-+      BUG_ON(irq >= NR_IRQS);
-+      while (entry->next)
-+              entry = irq_2_pin + entry->next;
-+
-+      if (entry->pin != -1) {
-+              entry->next = first_free_entry;
-+              entry = irq_2_pin + entry->next;
-+              if (++first_free_entry >= PIN_MAP_SIZE)
-+                      panic("io_apic.c: ran out of irq_2_pin entries!");
-+      }
-+      entry->apic = apic;
-+      entry->pin = pin;
-+}
-+
-+#ifndef CONFIG_XEN
-+#define __DO_ACTION(R, ACTION, FINAL)                                 \
-+                                                                      \
-+{                                                                     \
-+      int pin;                                                        \
-+      struct irq_pin_list *entry = irq_2_pin + irq;                   \
-+                                                                      \
-+      BUG_ON(irq >= NR_IRQS);                                         \
-+      for (;;) {                                                      \
-+              unsigned int reg;                                       \
-+              pin = entry->pin;                                       \
-+              if (pin == -1)                                          \
-+                      break;                                          \
-+              reg = io_apic_read(entry->apic, 0x10 + R + pin*2);      \
-+              reg ACTION;                                             \
-+              io_apic_modify(entry->apic, reg);                       \
-+              if (!entry->next)                                       \
-+                      break;                                          \
-+              entry = irq_2_pin + entry->next;                        \
-+      }                                                               \
-+      FINAL;                                                          \
-+}
-+
-+#define DO_ACTION(name,R,ACTION, FINAL)                                       \
-+                                                                      \
-+      static void name##_IO_APIC_irq (unsigned int irq)               \
-+      __DO_ACTION(R, ACTION, FINAL)
-+
-+DO_ACTION( __mask,             0, |= 0x00010000, io_apic_sync(entry->apic) )
-+                                              /* mask = 1 */
-+DO_ACTION( __unmask,           0, &= 0xfffeffff, )
-+                                              /* mask = 0 */
-+
-+static void mask_IO_APIC_irq (unsigned int irq)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      __mask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void unmask_IO_APIC_irq (unsigned int irq)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      __unmask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void clear_IO_APIC_pin(unsigned int apic, unsigned int pin)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+
-+      /* Check delivery_mode to be sure we're not clearing an SMI pin */
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      *(((int*)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+      *(((int*)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+      if (entry.delivery_mode == dest_SMI)
-+              return;
-+      /*
-+       * Disable it in the IO-APIC irq-routing table:
-+       */
-+      memset(&entry, 0, sizeof(entry));
-+      entry.mask = 1;
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry) + 0));
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry) + 1));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+static void clear_IO_APIC (void)
-+{
-+      int apic, pin;
-+
-+      for (apic = 0; apic < nr_ioapics; apic++)
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++)
-+                      clear_IO_APIC_pin(apic, pin);
-+}
-+
-+#endif /* !CONFIG_XEN */
-+
-+static u8 gsi_2_irq[NR_IRQ_VECTORS] = { [0 ... NR_IRQ_VECTORS-1] = 0xFF };
-+
-+/*
-+ * support for broken MP BIOSs, enables hand-redirection of PIRQ0-7 to
-+ * specific CPU-side IRQs.
-+ */
-+
-+#define MAX_PIRQS 8
-+static int pirq_entries [MAX_PIRQS];
-+static int pirqs_enabled;
-+int skip_ioapic_setup;
-+int ioapic_force;
-+
-+/* dummy parsing: see setup.c */
-+
-+static int __init disable_ioapic_setup(char *str)
-+{
-+      skip_ioapic_setup = 1;
-+      return 1;
-+}
-+
-+static int __init enable_ioapic_setup(char *str)
-+{
-+      ioapic_force = 1;
-+      skip_ioapic_setup = 0;
-+      return 1;
-+}
-+
-+__setup("noapic", disable_ioapic_setup);
-+__setup("apic", enable_ioapic_setup);
-+
-+#ifndef CONFIG_XEN
-+static int __init setup_disable_8254_timer(char *s)
-+{
-+      timer_over_8254 = -1;
-+      return 1;
-+}
-+static int __init setup_enable_8254_timer(char *s)
-+{
-+      timer_over_8254 = 2;
-+      return 1;
-+}
-+
-+__setup("disable_8254_timer", setup_disable_8254_timer);
-+__setup("enable_8254_timer", setup_enable_8254_timer);
-+#endif /* !CONFIG_XEN */
-+
-+#include <asm/pci-direct.h>
-+#include <linux/pci_ids.h>
-+#include <linux/pci.h>
-+
-+
-+#ifdef CONFIG_ACPI
-+
-+static int nvidia_hpet_detected __initdata;
-+
-+static int __init nvidia_hpet_check(unsigned long phys, unsigned long size)
-+{
-+      nvidia_hpet_detected = 1;
-+      return 0;
-+}
-+#endif
-+
-+/* Temporary Hack. Nvidia and VIA boards currently only work with IO-APIC
-+   off. Check for an Nvidia or VIA PCI bridge and turn it off.
-+   Use pci direct infrastructure because this runs before the PCI subsystem. 
-+
-+   Can be overwritten with "apic"
-+
-+   And another hack to disable the IOMMU on VIA chipsets.
-+
-+   ... and others. Really should move this somewhere else.
-+
-+   Kludge-O-Rama. */
-+void __init check_ioapic(void) 
-+{ 
-+      int num,slot,func; 
-+      /* Poor man's PCI discovery */
-+      for (num = 0; num < 32; num++) { 
-+              for (slot = 0; slot < 32; slot++) { 
-+                      for (func = 0; func < 8; func++) { 
-+                              u32 class;
-+                              u32 vendor;
-+                              u8 type;
-+                              class = read_pci_config(num,slot,func,
-+                                                      PCI_CLASS_REVISION);
-+                              if (class == 0xffffffff)
-+                                      break; 
-+
-+                              if ((class >> 16) != PCI_CLASS_BRIDGE_PCI)
-+                                      continue; 
-+
-+                              vendor = read_pci_config(num, slot, func, 
-+                                                       PCI_VENDOR_ID);
-+                              vendor &= 0xffff;
-+                              switch (vendor) { 
-+                              case PCI_VENDOR_ID_VIA:
-+#ifdef CONFIG_IOMMU
-+                                      if ((end_pfn > MAX_DMA32_PFN ||
-+                                           force_iommu) &&
-+                                          !iommu_aperture_allowed) {
-+                                              printk(KERN_INFO
-+    "Looks like a VIA chipset. Disabling IOMMU. Override with \"iommu=allowed\"\n");
-+                                              iommu_aperture_disabled = 1;
-+                                      }
-+#endif
-+                                      return;
-+                              case PCI_VENDOR_ID_NVIDIA:
-+#ifdef CONFIG_ACPI
-+                                      /*
-+                                       * All timer overrides on Nvidia are
-+                                       * wrong unless HPET is enabled.
-+                                       */
-+                                      nvidia_hpet_detected = 0;
-+                                      acpi_table_parse(ACPI_HPET,
-+                                                      nvidia_hpet_check);
-+                                      if (nvidia_hpet_detected == 0) {
-+                                              acpi_skip_timer_override = 1;
-+                                              printk(KERN_INFO "Nvidia board "
-+                                                  "detected. Ignoring ACPI "
-+                                                  "timer override.\n");
-+                                      }
-+#endif
-+                                      /* RED-PEN skip them on mptables too? */
-+                                      return;
-+                              case PCI_VENDOR_ID_ATI:
-+
-+                              /* This should be actually default, but
-+                                 for 2.6.16 let's do it for ATI only where
-+                                 it's really needed. */
-+#ifndef CONFIG_XEN
-+                                      if (timer_over_8254 == 1) {     
-+                                              timer_over_8254 = 0;    
-+                                      printk(KERN_INFO
-+              "ATI board detected. Disabling timer routing over 8254.\n");
-+                                      }       
-+#endif
-+                                      return;
-+                              } 
-+
-+
-+                              /* No multi-function device? */
-+                              type = read_pci_config_byte(num,slot,func,
-+                                                          PCI_HEADER_TYPE);
-+                              if (!(type & 0x80))
-+                                      break;
-+                      } 
-+              }
-+      }
-+} 
-+
-+static int __init ioapic_pirq_setup(char *str)
-+{
-+      int i, max;
-+      int ints[MAX_PIRQS+1];
-+
-+      get_options(str, ARRAY_SIZE(ints), ints);
-+
-+      for (i = 0; i < MAX_PIRQS; i++)
-+              pirq_entries[i] = -1;
-+
-+      pirqs_enabled = 1;
-+      apic_printk(APIC_VERBOSE, "PIRQ redirection, working around broken MP-BIOS.\n");
-+      max = MAX_PIRQS;
-+      if (ints[0] < MAX_PIRQS)
-+              max = ints[0];
-+
-+      for (i = 0; i < max; i++) {
-+              apic_printk(APIC_VERBOSE, "... PIRQ%d -> IRQ %d\n", i, ints[i+1]);
-+              /*
-+               * PIRQs are mapped upside down, usually.
-+               */
-+              pirq_entries[MAX_PIRQS-i-1] = ints[i+1];
-+      }
-+      return 1;
-+}
-+
-+__setup("pirq=", ioapic_pirq_setup);
-+
-+/*
-+ * Find the IRQ entry number of a certain pin.
-+ */
-+static int find_irq_entry(int apic, int pin, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++)
-+              if (mp_irqs[i].mpc_irqtype == type &&
-+                  (mp_irqs[i].mpc_dstapic == mp_ioapics[apic].mpc_apicid ||
-+                   mp_irqs[i].mpc_dstapic == MP_APIC_ALL) &&
-+                  mp_irqs[i].mpc_dstirq == pin)
-+                      return i;
-+
-+      return -1;
-+}
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * Find the pin to which IRQ[irq] (ISA) is connected
-+ */
-+static int __init find_isa_irq_pin(int irq, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_MCA) &&
-+                  (mp_irqs[i].mpc_irqtype == type) &&
-+                  (mp_irqs[i].mpc_srcbusirq == irq))
-+
-+                      return mp_irqs[i].mpc_dstirq;
-+      }
-+      return -1;
-+}
-+
-+static int __init find_isa_irq_apic(int irq, int type)
-+{
-+      int i;
-+
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_ISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_EISA ||
-+                   mp_bus_id_to_type[lbus] == MP_BUS_MCA) &&
-+                  (mp_irqs[i].mpc_irqtype == type) &&
-+                  (mp_irqs[i].mpc_srcbusirq == irq))
-+                      break;
-+      }
-+      if (i < mp_irq_entries) {
-+              int apic;
-+              for(apic = 0; apic < nr_ioapics; apic++) {
-+                      if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic)
-+                              return apic;
-+              }
-+      }
-+
-+      return -1;
-+}
-+#endif
-+
-+/*
-+ * Find a specific PCI IRQ entry.
-+ * Not an __init, possibly needed by modules
-+ */
-+static int pin_2_irq(int idx, int apic, int pin);
-+
-+int IO_APIC_get_PCI_irq_vector(int bus, int slot, int pin)
-+{
-+      int apic, i, best_guess = -1;
-+
-+      apic_printk(APIC_DEBUG, "querying PCI -> IRQ mapping bus:%d, slot:%d, pin:%d.\n",
-+              bus, slot, pin);
-+      if (mp_bus_id_to_pci_bus[bus] == -1) {
-+              apic_printk(APIC_VERBOSE, "PCI BIOS passed nonexistent PCI bus %d!\n", bus);
-+              return -1;
-+      }
-+      for (i = 0; i < mp_irq_entries; i++) {
-+              int lbus = mp_irqs[i].mpc_srcbus;
-+
-+              for (apic = 0; apic < nr_ioapics; apic++)
-+                      if (mp_ioapics[apic].mpc_apicid == mp_irqs[i].mpc_dstapic ||
-+                          mp_irqs[i].mpc_dstapic == MP_APIC_ALL)
-+                              break;
-+
-+              if ((mp_bus_id_to_type[lbus] == MP_BUS_PCI) &&
-+                  !mp_irqs[i].mpc_irqtype &&
-+                  (bus == lbus) &&
-+                  (slot == ((mp_irqs[i].mpc_srcbusirq >> 2) & 0x1f))) {
-+                      int irq = pin_2_irq(i,apic,mp_irqs[i].mpc_dstirq);
-+
-+                      if (!(apic || IO_APIC_IRQ(irq)))
-+                              continue;
-+
-+                      if (pin == (mp_irqs[i].mpc_srcbusirq & 3))
-+                              return irq;
-+                      /*
-+                       * Use the first all-but-pin matching entry as a
-+                       * best-guess fuzzy result for broken mptables.
-+                       */
-+                      if (best_guess < 0)
-+                              best_guess = irq;
-+              }
-+      }
-+      BUG_ON(best_guess >= NR_IRQS);
-+      return best_guess;
-+}
-+
-+/*
-+ * EISA Edge/Level control register, ELCR
-+ */
-+static int EISA_ELCR(unsigned int irq)
-+{
-+      if (irq < 16) {
-+              unsigned int port = 0x4d0 + (irq >> 3);
-+              return (inb(port) >> (irq & 7)) & 1;
-+      }
-+      apic_printk(APIC_VERBOSE, "Broken MPtable reports ISA irq %d\n", irq);
-+      return 0;
-+}
-+
-+/* EISA interrupts are always polarity zero and can be edge or level
-+ * trigger depending on the ELCR value.  If an interrupt is listed as
-+ * EISA conforming in the MP table, that means its trigger type must
-+ * be read in from the ELCR */
-+
-+#define default_EISA_trigger(idx)     (EISA_ELCR(mp_irqs[idx].mpc_srcbusirq))
-+#define default_EISA_polarity(idx)    (0)
-+
-+/* ISA interrupts are always polarity zero edge triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_ISA_trigger(idx)      (0)
-+#define default_ISA_polarity(idx)     (0)
-+
-+/* PCI interrupts are always polarity one level triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_PCI_trigger(idx)      (1)
-+#define default_PCI_polarity(idx)     (1)
-+
-+/* MCA interrupts are always polarity zero level triggered,
-+ * when listed as conforming in the MP table. */
-+
-+#define default_MCA_trigger(idx)      (1)
-+#define default_MCA_polarity(idx)     (0)
-+
-+static int __init MPBIOS_polarity(int idx)
-+{
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+      int polarity;
-+
-+      /*
-+       * Determine IRQ line polarity (high active or low active):
-+       */
-+      switch (mp_irqs[idx].mpc_irqflag & 3)
-+      {
-+              case 0: /* conforms, ie. bus-type dependent polarity */
-+              {
-+                      switch (mp_bus_id_to_type[bus])
-+                      {
-+                              case MP_BUS_ISA: /* ISA pin */
-+                              {
-+                                      polarity = default_ISA_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_EISA: /* EISA pin */
-+                              {
-+                                      polarity = default_EISA_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_PCI: /* PCI pin */
-+                              {
-+                                      polarity = default_PCI_polarity(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_MCA: /* MCA pin */
-+                              {
-+                                      polarity = default_MCA_polarity(idx);
-+                                      break;
-+                              }
-+                              default:
-+                              {
-+                                      printk(KERN_WARNING "broken BIOS!!\n");
-+                                      polarity = 1;
-+                                      break;
-+                              }
-+                      }
-+                      break;
-+              }
-+              case 1: /* high active */
-+              {
-+                      polarity = 0;
-+                      break;
-+              }
-+              case 2: /* reserved */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      polarity = 1;
-+                      break;
-+              }
-+              case 3: /* low active */
-+              {
-+                      polarity = 1;
-+                      break;
-+              }
-+              default: /* invalid */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      polarity = 1;
-+                      break;
-+              }
-+      }
-+      return polarity;
-+}
-+
-+static int MPBIOS_trigger(int idx)
-+{
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+      int trigger;
-+
-+      /*
-+       * Determine IRQ trigger mode (edge or level sensitive):
-+       */
-+      switch ((mp_irqs[idx].mpc_irqflag>>2) & 3)
-+      {
-+              case 0: /* conforms, ie. bus-type dependent */
-+              {
-+                      switch (mp_bus_id_to_type[bus])
-+                      {
-+                              case MP_BUS_ISA: /* ISA pin */
-+                              {
-+                                      trigger = default_ISA_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_EISA: /* EISA pin */
-+                              {
-+                                      trigger = default_EISA_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_PCI: /* PCI pin */
-+                              {
-+                                      trigger = default_PCI_trigger(idx);
-+                                      break;
-+                              }
-+                              case MP_BUS_MCA: /* MCA pin */
-+                              {
-+                                      trigger = default_MCA_trigger(idx);
-+                                      break;
-+                              }
-+                              default:
-+                              {
-+                                      printk(KERN_WARNING "broken BIOS!!\n");
-+                                      trigger = 1;
-+                                      break;
-+                              }
-+                      }
-+                      break;
-+              }
-+              case 1: /* edge */
-+              {
-+                      trigger = 0;
-+                      break;
-+              }
-+              case 2: /* reserved */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      trigger = 1;
-+                      break;
-+              }
-+              case 3: /* level */
-+              {
-+                      trigger = 1;
-+                      break;
-+              }
-+              default: /* invalid */
-+              {
-+                      printk(KERN_WARNING "broken BIOS!!\n");
-+                      trigger = 0;
-+                      break;
-+              }
-+      }
-+      return trigger;
-+}
-+
-+static inline int irq_polarity(int idx)
-+{
-+      return MPBIOS_polarity(idx);
-+}
-+
-+static inline int irq_trigger(int idx)
-+{
-+      return MPBIOS_trigger(idx);
-+}
-+
-+static int next_irq = 16;
-+
-+/*
-+ * gsi_irq_sharing -- Name overload!  "irq" can be either a legacy IRQ
-+ * in the range 0-15, a linux IRQ in the range 0-223, or a GSI number
-+ * from ACPI, which can reach 800 in large boxen.
-+ *
-+ * Compact the sparse GSI space into a sequential IRQ series and reuse
-+ * vectors if possible.
-+ */
-+int gsi_irq_sharing(int gsi)
-+{
-+      int i, tries, vector;
-+
-+      BUG_ON(gsi >= NR_IRQ_VECTORS);
-+
-+      if (platform_legacy_irq(gsi))
-+              return gsi;
-+
-+      if (gsi_2_irq[gsi] != 0xFF)
-+              return (int)gsi_2_irq[gsi];
-+
-+      tries = NR_IRQS;
-+  try_again:
-+      vector = assign_irq_vector(gsi);
-+
-+      /*
-+       * Sharing vectors means sharing IRQs, so scan irq_vectors for previous
-+       * use of vector and if found, return that IRQ.  However, we never want
-+       * to share legacy IRQs, which usually have a different trigger mode
-+       * than PCI.
-+       */
-+      for (i = 0; i < NR_IRQS; i++)
-+              if (IO_APIC_VECTOR(i) == vector)
-+                      break;
-+      if (platform_legacy_irq(i)) {
-+              if (--tries >= 0) {
-+                      IO_APIC_VECTOR(i) = 0;
-+                      goto try_again;
-+              }
-+              panic("gsi_irq_sharing: didn't find an IRQ using vector 0x%02X for GSI %d", vector, gsi);
-+      }
-+      if (i < NR_IRQS) {
-+              gsi_2_irq[gsi] = i;
-+              printk(KERN_INFO "GSI %d sharing vector 0x%02X and IRQ %d\n",
-+                              gsi, vector, i);
-+              return i;
-+      }
-+
-+      i = next_irq++;
-+      BUG_ON(i >= NR_IRQS);
-+      gsi_2_irq[gsi] = i;
-+      IO_APIC_VECTOR(i) = vector;
-+      printk(KERN_INFO "GSI %d assigned vector 0x%02X and IRQ %d\n",
-+                      gsi, vector, i);
-+      return i;
-+}
-+
-+static int pin_2_irq(int idx, int apic, int pin)
-+{
-+      int irq, i;
-+      int bus = mp_irqs[idx].mpc_srcbus;
-+
-+      /*
-+       * Debugging check, we are in big trouble if this message pops up!
-+       */
-+      if (mp_irqs[idx].mpc_dstirq != pin)
-+              printk(KERN_ERR "broken BIOS or MPTABLE parser, ayiee!!\n");
-+
-+      switch (mp_bus_id_to_type[bus])
-+      {
-+              case MP_BUS_ISA: /* ISA pin */
-+              case MP_BUS_EISA:
-+              case MP_BUS_MCA:
-+              {
-+                      irq = mp_irqs[idx].mpc_srcbusirq;
-+                      break;
-+              }
-+              case MP_BUS_PCI: /* PCI pin */
-+              {
-+                      /*
-+                       * PCI IRQs are mapped in order
-+                       */
-+                      i = irq = 0;
-+                      while (i < apic)
-+                              irq += nr_ioapic_registers[i++];
-+                      irq += pin;
-+                      irq = gsi_irq_sharing(irq);
-+                      break;
-+              }
-+              default:
-+              {
-+                      printk(KERN_ERR "unknown bus type %d.\n",bus); 
-+                      irq = 0;
-+                      break;
-+              }
-+      }
-+      BUG_ON(irq >= NR_IRQS);
-+
-+      /*
-+       * PCI IRQ command line redirection. Yes, limits are hardcoded.
-+       */
-+      if ((pin >= 16) && (pin <= 23)) {
-+              if (pirq_entries[pin-16] != -1) {
-+                      if (!pirq_entries[pin-16]) {
-+                              apic_printk(APIC_VERBOSE, "disabling PIRQ%d\n", pin-16);
-+                      } else {
-+                              irq = pirq_entries[pin-16];
-+                              apic_printk(APIC_VERBOSE, "using PIRQ%d -> IRQ %d\n",
-+                                              pin-16, irq);
-+                      }
-+              }
-+      }
-+      BUG_ON(irq >= NR_IRQS);
-+      return irq;
-+}
-+
-+static inline int IO_APIC_irq_trigger(int irq)
-+{
-+      int apic, idx, pin;
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+                      idx = find_irq_entry(apic,pin,mp_INT);
-+                      if ((idx != -1) && (irq == pin_2_irq(idx,apic,pin)))
-+                              return irq_trigger(idx);
-+              }
-+      }
-+      /*
-+       * nonexistent IRQs are edge default
-+       */
-+      return 0;
-+}
-+
-+/* irq_vectors is indexed by the sum of all RTEs in all I/O APICs. */
-+u8 irq_vector[NR_IRQ_VECTORS] __read_mostly;
-+
-+int assign_irq_vector(int irq)
-+{
-+      unsigned long flags;
-+      int vector;
-+      struct physdev_irq irq_op;
-+  
-+      BUG_ON(irq != AUTO_ASSIGN && (unsigned)irq >= NR_IRQ_VECTORS);
-+
-+      if (irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS)
-+              return -EINVAL;
-+
-+      spin_lock_irqsave(&vector_lock, flags);
-+
-+      if (irq != AUTO_ASSIGN && IO_APIC_VECTOR(irq) > 0) {
-+              spin_unlock_irqrestore(&vector_lock, flags);
-+              return IO_APIC_VECTOR(irq);
-+      }
-+
-+      irq_op.irq = irq;
-+      if (HYPERVISOR_physdev_op(PHYSDEVOP_alloc_irq_vector, &irq_op)) {
-+              spin_unlock_irqrestore(&vector_lock, flags);
-+              return -ENOSPC;
-+      }
-+
-+      vector = irq_op.vector;
-+      vector_irq[vector] = irq;
-+      if (irq != AUTO_ASSIGN)
-+              IO_APIC_VECTOR(irq) = vector;
-+
-+      spin_unlock_irqrestore(&vector_lock, flags);
-+
-+      return vector;
-+}
-+
-+extern void (*interrupt[NR_IRQS])(void);
-+#ifndef CONFIG_XEN
-+static struct hw_interrupt_type ioapic_level_type;
-+static struct hw_interrupt_type ioapic_edge_type;
-+
-+#define IOAPIC_AUTO   -1
-+#define IOAPIC_EDGE   0
-+#define IOAPIC_LEVEL  1
-+
-+static void ioapic_register_intr(int irq, int vector, unsigned long trigger)
-+{
-+      unsigned idx;
-+
-+      idx = use_pci_vector() && !platform_legacy_irq(irq) ? vector : irq;
-+
-+      if ((trigger == IOAPIC_AUTO && IO_APIC_irq_trigger(irq)) ||
-+                      trigger == IOAPIC_LEVEL)
-+              irq_desc[idx].chip = &ioapic_level_type;
-+      else
-+              irq_desc[idx].chip = &ioapic_edge_type;
-+      set_intr_gate(vector, interrupt[idx]);
-+}
-+#else
-+#define ioapic_register_intr(irq, vector, trigger) evtchn_register_pirq(irq)
-+#endif /* !CONFIG_XEN */
-+
-+static void __init setup_IO_APIC_irqs(void)
-+{
-+      struct IO_APIC_route_entry entry;
-+      int apic, pin, idx, irq, first_notcon = 1, vector;
-+      unsigned long flags;
-+
-+      apic_printk(APIC_VERBOSE, KERN_DEBUG "init IO_APIC IRQs\n");
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+      for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+
-+              /*
-+               * add it to the IO-APIC irq-routing table:
-+               */
-+              memset(&entry,0,sizeof(entry));
-+
-+              entry.delivery_mode = INT_DELIVERY_MODE;
-+              entry.dest_mode = INT_DEST_MODE;
-+              entry.mask = 0;                         /* enable IRQ */
-+              entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+
-+              idx = find_irq_entry(apic,pin,mp_INT);
-+              if (idx == -1) {
-+                      if (first_notcon) {
-+                              apic_printk(APIC_VERBOSE, KERN_DEBUG " IO-APIC (apicid-pin) %d-%d", mp_ioapics[apic].mpc_apicid, pin);
-+                              first_notcon = 0;
-+                      } else
-+                              apic_printk(APIC_VERBOSE, ", %d-%d", mp_ioapics[apic].mpc_apicid, pin);
-+                      continue;
-+              }
-+
-+              entry.trigger = irq_trigger(idx);
-+              entry.polarity = irq_polarity(idx);
-+
-+              if (irq_trigger(idx)) {
-+                      entry.trigger = 1;
-+                      entry.mask = 1;
-+                      entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+              }
-+
-+              irq = pin_2_irq(idx, apic, pin);
-+              add_pin_to_irq(irq, apic, pin);
-+
-+              if (/* !apic && */ !IO_APIC_IRQ(irq))
-+                      continue;
-+
-+              if (IO_APIC_IRQ(irq)) {
-+                      vector = assign_irq_vector(irq);
-+                      entry.vector = vector;
-+
-+                      ioapic_register_intr(irq, vector, IOAPIC_AUTO);
-+                      if (!apic && (irq < 16))
-+                              disable_8259A_irq(irq);
-+              }
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-+              io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-+              set_native_irq_info(irq, TARGET_CPUS);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+      }
-+      }
-+
-+      if (!first_notcon)
-+              apic_printk(APIC_VERBOSE," not connected.\n");
-+}
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * Set up the 8259A-master output pin as broadcast to all
-+ * CPUs.
-+ */
-+static void __init setup_ExtINT_IRQ0_pin(unsigned int apic, unsigned int pin, int vector)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+
-+      memset(&entry,0,sizeof(entry));
-+
-+      disable_8259A_irq(0);
-+
-+      /* mask LVT0 */
-+      apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-+
-+      /*
-+       * We use logical delivery to get the timer IRQ
-+       * to the first CPU.
-+       */
-+      entry.dest_mode = INT_DEST_MODE;
-+      entry.mask = 0;                                 /* unmask IRQ now */
-+      entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+      entry.delivery_mode = INT_DELIVERY_MODE;
-+      entry.polarity = 0;
-+      entry.trigger = 0;
-+      entry.vector = vector;
-+
-+      /*
-+       * The timer IRQ doesn't have to know that behind the
-+       * scene we have a 8259A-master in AEOI mode ...
-+       */
-+      irq_desc[0].chip = &ioapic_edge_type;
-+
-+      /*
-+       * Add it to the IO-APIC irq-routing table:
-+       */
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11+2*pin, *(((int *)&entry)+1));
-+      io_apic_write(apic, 0x10+2*pin, *(((int *)&entry)+0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      enable_8259A_irq(0);
-+}
-+
-+void __init UNEXPECTED_IO_APIC(void)
-+{
-+}
-+
-+void __apicdebuginit print_IO_APIC(void)
-+{
-+      int apic, i;
-+      union IO_APIC_reg_00 reg_00;
-+      union IO_APIC_reg_01 reg_01;
-+      union IO_APIC_reg_02 reg_02;
-+      unsigned long flags;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "number of MP IRQ sources: %d.\n", mp_irq_entries);
-+      for (i = 0; i < nr_ioapics; i++)
-+              printk(KERN_DEBUG "number of IO-APIC #%d registers: %d.\n",
-+                     mp_ioapics[i].mpc_apicid, nr_ioapic_registers[i]);
-+
-+      /*
-+       * We are a bit conservative about what we expect.  We have to
-+       * know about every hardware change ASAP.
-+       */
-+      printk(KERN_INFO "testing the IO APIC.......................\n");
-+
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_00.raw = io_apic_read(apic, 0);
-+      reg_01.raw = io_apic_read(apic, 1);
-+      if (reg_01.bits.version >= 0x10)
-+              reg_02.raw = io_apic_read(apic, 2);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      printk("\n");
-+      printk(KERN_DEBUG "IO APIC #%d......\n", mp_ioapics[apic].mpc_apicid);
-+      printk(KERN_DEBUG ".... register #00: %08X\n", reg_00.raw);
-+      printk(KERN_DEBUG ".......    : physical APIC id: %02X\n", reg_00.bits.ID);
-+      if (reg_00.bits.__reserved_1 || reg_00.bits.__reserved_2)
-+              UNEXPECTED_IO_APIC();
-+
-+      printk(KERN_DEBUG ".... register #01: %08X\n", *(int *)&reg_01);
-+      printk(KERN_DEBUG ".......     : max redirection entries: %04X\n", reg_01.bits.entries);
-+      if (    (reg_01.bits.entries != 0x0f) && /* older (Neptune) boards */
-+              (reg_01.bits.entries != 0x17) && /* typical ISA+PCI boards */
-+              (reg_01.bits.entries != 0x1b) && /* Compaq Proliant boards */
-+              (reg_01.bits.entries != 0x1f) && /* dual Xeon boards */
-+              (reg_01.bits.entries != 0x22) && /* bigger Xeon boards */
-+              (reg_01.bits.entries != 0x2E) &&
-+              (reg_01.bits.entries != 0x3F) &&
-+              (reg_01.bits.entries != 0x03) 
-+      )
-+              UNEXPECTED_IO_APIC();
-+
-+      printk(KERN_DEBUG ".......     : PRQ implemented: %X\n", reg_01.bits.PRQ);
-+      printk(KERN_DEBUG ".......     : IO APIC version: %04X\n", reg_01.bits.version);
-+      if (    (reg_01.bits.version != 0x01) && /* 82489DX IO-APICs */
-+              (reg_01.bits.version != 0x02) && /* 82801BA IO-APICs (ICH2) */
-+              (reg_01.bits.version != 0x10) && /* oldest IO-APICs */
-+              (reg_01.bits.version != 0x11) && /* Pentium/Pro IO-APICs */
-+              (reg_01.bits.version != 0x13) && /* Xeon IO-APICs */
-+              (reg_01.bits.version != 0x20)    /* Intel P64H (82806 AA) */
-+      )
-+              UNEXPECTED_IO_APIC();
-+      if (reg_01.bits.__reserved_1 || reg_01.bits.__reserved_2)
-+              UNEXPECTED_IO_APIC();
-+
-+      if (reg_01.bits.version >= 0x10) {
-+              printk(KERN_DEBUG ".... register #02: %08X\n", reg_02.raw);
-+              printk(KERN_DEBUG ".......     : arbitration: %02X\n", reg_02.bits.arbitration);
-+              if (reg_02.bits.__reserved_1 || reg_02.bits.__reserved_2)
-+                      UNEXPECTED_IO_APIC();
-+      }
-+
-+      printk(KERN_DEBUG ".... IRQ redirection table:\n");
-+
-+      printk(KERN_DEBUG " NR Log Phy Mask Trig IRR Pol"
-+                        " Stat Dest Deli Vect:   \n");
-+
-+      for (i = 0; i <= reg_01.bits.entries; i++) {
-+              struct IO_APIC_route_entry entry;
-+
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              *(((int *)&entry)+0) = io_apic_read(apic, 0x10+i*2);
-+              *(((int *)&entry)+1) = io_apic_read(apic, 0x11+i*2);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+              printk(KERN_DEBUG " %02x %03X %02X  ",
-+                      i,
-+                      entry.dest.logical.logical_dest,
-+                      entry.dest.physical.physical_dest
-+              );
-+
-+              printk("%1d    %1d    %1d   %1d   %1d    %1d    %1d    %02X\n",
-+                      entry.mask,
-+                      entry.trigger,
-+                      entry.irr,
-+                      entry.polarity,
-+                      entry.delivery_status,
-+                      entry.dest_mode,
-+                      entry.delivery_mode,
-+                      entry.vector
-+              );
-+      }
-+      }
-+      if (use_pci_vector())
-+              printk(KERN_INFO "Using vector-based indexing\n");
-+      printk(KERN_DEBUG "IRQ to pin mappings:\n");
-+      for (i = 0; i < NR_IRQS; i++) {
-+              struct irq_pin_list *entry = irq_2_pin + i;
-+              if (entry->pin < 0)
-+                      continue;
-+              if (use_pci_vector() && !platform_legacy_irq(i))
-+                      printk(KERN_DEBUG "IRQ%d ", IO_APIC_VECTOR(i));
-+              else
-+                      printk(KERN_DEBUG "IRQ%d ", i);
-+              for (;;) {
-+                      printk("-> %d:%d", entry->apic, entry->pin);
-+                      if (!entry->next)
-+                              break;
-+                      entry = irq_2_pin + entry->next;
-+              }
-+              printk("\n");
-+      }
-+
-+      printk(KERN_INFO ".................................... done.\n");
-+
-+      return;
-+}
-+
-+static __apicdebuginit void print_APIC_bitfield (int base)
-+{
-+      unsigned int v;
-+      int i, j;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "0123456789abcdef0123456789abcdef\n" KERN_DEBUG);
-+      for (i = 0; i < 8; i++) {
-+              v = apic_read(base + i*0x10);
-+              for (j = 0; j < 32; j++) {
-+                      if (v & (1<<j))
-+                              printk("1");
-+                      else
-+                              printk("0");
-+              }
-+              printk("\n");
-+      }
-+}
-+
-+void __apicdebuginit print_local_APIC(void * dummy)
-+{
-+      unsigned int v, ver, maxlvt;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk("\n" KERN_DEBUG "printing local APIC contents on CPU#%d/%d:\n",
-+              smp_processor_id(), hard_smp_processor_id());
-+      v = apic_read(APIC_ID);
-+      printk(KERN_INFO "... APIC ID:      %08x (%01x)\n", v, GET_APIC_ID(v));
-+      v = apic_read(APIC_LVR);
-+      printk(KERN_INFO "... APIC VERSION: %08x\n", v);
-+      ver = GET_APIC_VERSION(v);
-+      maxlvt = get_maxlvt();
-+
-+      v = apic_read(APIC_TASKPRI);
-+      printk(KERN_DEBUG "... APIC TASKPRI: %08x (%02x)\n", v, v & APIC_TPRI_MASK);
-+
-+      v = apic_read(APIC_ARBPRI);
-+      printk(KERN_DEBUG "... APIC ARBPRI: %08x (%02x)\n", v,
-+              v & APIC_ARBPRI_MASK);
-+      v = apic_read(APIC_PROCPRI);
-+      printk(KERN_DEBUG "... APIC PROCPRI: %08x\n", v);
-+
-+      v = apic_read(APIC_EOI);
-+      printk(KERN_DEBUG "... APIC EOI: %08x\n", v);
-+      v = apic_read(APIC_RRR);
-+      printk(KERN_DEBUG "... APIC RRR: %08x\n", v);
-+      v = apic_read(APIC_LDR);
-+      printk(KERN_DEBUG "... APIC LDR: %08x\n", v);
-+      v = apic_read(APIC_DFR);
-+      printk(KERN_DEBUG "... APIC DFR: %08x\n", v);
-+      v = apic_read(APIC_SPIV);
-+      printk(KERN_DEBUG "... APIC SPIV: %08x\n", v);
-+
-+      printk(KERN_DEBUG "... APIC ISR field:\n");
-+      print_APIC_bitfield(APIC_ISR);
-+      printk(KERN_DEBUG "... APIC TMR field:\n");
-+      print_APIC_bitfield(APIC_TMR);
-+      printk(KERN_DEBUG "... APIC IRR field:\n");
-+      print_APIC_bitfield(APIC_IRR);
-+
-+      v = apic_read(APIC_ESR);
-+      printk(KERN_DEBUG "... APIC ESR: %08x\n", v);
-+
-+      v = apic_read(APIC_ICR);
-+      printk(KERN_DEBUG "... APIC ICR: %08x\n", v);
-+      v = apic_read(APIC_ICR2);
-+      printk(KERN_DEBUG "... APIC ICR2: %08x\n", v);
-+
-+      v = apic_read(APIC_LVTT);
-+      printk(KERN_DEBUG "... APIC LVTT: %08x\n", v);
-+
-+      if (maxlvt > 3) {                       /* PC is LVT#4. */
-+              v = apic_read(APIC_LVTPC);
-+              printk(KERN_DEBUG "... APIC LVTPC: %08x\n", v);
-+      }
-+      v = apic_read(APIC_LVT0);
-+      printk(KERN_DEBUG "... APIC LVT0: %08x\n", v);
-+      v = apic_read(APIC_LVT1);
-+      printk(KERN_DEBUG "... APIC LVT1: %08x\n", v);
-+
-+      if (maxlvt > 2) {                       /* ERR is LVT#3. */
-+              v = apic_read(APIC_LVTERR);
-+              printk(KERN_DEBUG "... APIC LVTERR: %08x\n", v);
-+      }
-+
-+      v = apic_read(APIC_TMICT);
-+      printk(KERN_DEBUG "... APIC TMICT: %08x\n", v);
-+      v = apic_read(APIC_TMCCT);
-+      printk(KERN_DEBUG "... APIC TMCCT: %08x\n", v);
-+      v = apic_read(APIC_TDCR);
-+      printk(KERN_DEBUG "... APIC TDCR: %08x\n", v);
-+      printk("\n");
-+}
-+
-+void print_all_local_APICs (void)
-+{
-+      on_each_cpu(print_local_APIC, NULL, 1, 1);
-+}
-+
-+void __apicdebuginit print_PIC(void)
-+{
-+      unsigned int v;
-+      unsigned long flags;
-+
-+      if (apic_verbosity == APIC_QUIET)
-+              return;
-+
-+      printk(KERN_DEBUG "\nprinting PIC contents\n");
-+
-+      spin_lock_irqsave(&i8259A_lock, flags);
-+
-+      v = inb(0xa1) << 8 | inb(0x21);
-+      printk(KERN_DEBUG "... PIC  IMR: %04x\n", v);
-+
-+      v = inb(0xa0) << 8 | inb(0x20);
-+      printk(KERN_DEBUG "... PIC  IRR: %04x\n", v);
-+
-+      outb(0x0b,0xa0);
-+      outb(0x0b,0x20);
-+      v = inb(0xa0) << 8 | inb(0x20);
-+      outb(0x0a,0xa0);
-+      outb(0x0a,0x20);
-+
-+      spin_unlock_irqrestore(&i8259A_lock, flags);
-+
-+      printk(KERN_DEBUG "... PIC  ISR: %04x\n", v);
-+
-+      v = inb(0x4d1) << 8 | inb(0x4d0);
-+      printk(KERN_DEBUG "... PIC ELCR: %04x\n", v);
-+}
-+#endif /* !CONFIG_XEN */
-+
-+static void __init enable_IO_APIC(void)
-+{
-+      union IO_APIC_reg_01 reg_01;
-+#ifndef CONFIG_XEN
-+      int i8259_apic, i8259_pin;
-+#endif
-+      int i, apic;
-+      unsigned long flags;
-+
-+      for (i = 0; i < PIN_MAP_SIZE; i++) {
-+              irq_2_pin[i].pin = -1;
-+              irq_2_pin[i].next = 0;
-+      }
-+      if (!pirqs_enabled)
-+              for (i = 0; i < MAX_PIRQS; i++)
-+                      pirq_entries[i] = -1;
-+
-+      /*
-+       * The number of IO-APIC IRQ registers (== #pins):
-+       */
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_01.raw = io_apic_read(apic, 1);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              nr_ioapic_registers[apic] = reg_01.bits.entries+1;
-+      }
-+#ifndef CONFIG_XEN
-+      for(apic = 0; apic < nr_ioapics; apic++) {
-+              int pin;
-+              /* See if any of the pins is in ExtINT mode */
-+              for (pin = 0; pin < nr_ioapic_registers[apic]; pin++) {
-+                      struct IO_APIC_route_entry entry;
-+                      spin_lock_irqsave(&ioapic_lock, flags);
-+                      *(((int *)&entry) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+                      *(((int *)&entry) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+                      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+
-+                      /* If the interrupt line is enabled and in ExtInt mode
-+                       * I have found the pin where the i8259 is connected.
-+                       */
-+                      if ((entry.mask == 0) && (entry.delivery_mode == dest_ExtINT)) {
-+                              ioapic_i8259.apic = apic;
-+                              ioapic_i8259.pin  = pin;
-+                              goto found_i8259;
-+                      }
-+              }
-+      }
-+ found_i8259:
-+      /* Look to see what if the MP table has reported the ExtINT */
-+      i8259_pin  = find_isa_irq_pin(0, mp_ExtINT);
-+      i8259_apic = find_isa_irq_apic(0, mp_ExtINT);
-+      /* Trust the MP table if nothing is setup in the hardware */
-+      if ((ioapic_i8259.pin == -1) && (i8259_pin >= 0)) {
-+              printk(KERN_WARNING "ExtINT not setup in hardware but reported by MP table\n");
-+              ioapic_i8259.pin  = i8259_pin;
-+              ioapic_i8259.apic = i8259_apic;
-+      }
-+      /* Complain if the MP table and the hardware disagree */
-+      if (((ioapic_i8259.apic != i8259_apic) || (ioapic_i8259.pin != i8259_pin)) &&
-+              (i8259_pin >= 0) && (ioapic_i8259.pin >= 0))
-+      {
-+              printk(KERN_WARNING "ExtINT in hardware and MP table differ\n");
-+      }
-+#endif
-+
-+      /*
-+       * Do not trust the IO-APIC being empty at bootup
-+       */
-+      clear_IO_APIC();
-+}
-+
-+/*
-+ * Not an __init, needed by the reboot code
-+ */
-+void disable_IO_APIC(void)
-+{
-+      /*
-+       * Clear the IO-APIC before rebooting:
-+       */
-+      clear_IO_APIC();
-+
-+#ifndef CONFIG_XEN
-+      /*
-+       * If the i8259 is routed through an IOAPIC
-+       * Put that IOAPIC in virtual wire mode
-+       * so legacy interrupts can be delivered.
-+       */
-+      if (ioapic_i8259.pin != -1) {
-+              struct IO_APIC_route_entry entry;
-+              unsigned long flags;
-+
-+              memset(&entry, 0, sizeof(entry));
-+              entry.mask            = 0; /* Enabled */
-+              entry.trigger         = 0; /* Edge */
-+              entry.irr             = 0;
-+              entry.polarity        = 0; /* High */
-+              entry.delivery_status = 0;
-+              entry.dest_mode       = 0; /* Physical */
-+              entry.delivery_mode   = dest_ExtINT; /* ExtInt */
-+              entry.vector          = 0;
-+              entry.dest.physical.physical_dest =
-+                                      GET_APIC_ID(apic_read(APIC_ID));
-+
-+              /*
-+               * Add it to the IO-APIC irq-routing table:
-+               */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(ioapic_i8259.apic, 0x11+2*ioapic_i8259.pin,
-+                      *(((int *)&entry)+1));
-+              io_apic_write(ioapic_i8259.apic, 0x10+2*ioapic_i8259.pin,
-+                      *(((int *)&entry)+0));
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+      }
-+
-+      disconnect_bsp_APIC(ioapic_i8259.pin != -1);
-+#endif
-+}
-+
-+/*
-+ * function to set the IO-APIC physical IDs based on the
-+ * values stored in the MPC table.
-+ *
-+ * by Matt Domsch <Matt_Domsch@dell.com>  Tue Dec 21 12:25:05 CST 1999
-+ */
-+
-+#ifndef CONFIG_XEN
-+static void __init setup_ioapic_ids_from_mpc (void)
-+{
-+      union IO_APIC_reg_00 reg_00;
-+      int apic;
-+      int i;
-+      unsigned char old_id;
-+      unsigned long flags;
-+
-+      /*
-+       * Set the IOAPIC ID to the value stored in the MPC table.
-+       */
-+      for (apic = 0; apic < nr_ioapics; apic++) {
-+
-+              /* Read the register 0 value */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_00.raw = io_apic_read(apic, 0);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              
-+              old_id = mp_ioapics[apic].mpc_apicid;
-+
-+
-+              printk(KERN_INFO "Using IO-APIC %d\n", mp_ioapics[apic].mpc_apicid);
-+
-+
-+              /*
-+               * We need to adjust the IRQ routing table
-+               * if the ID changed.
-+               */
-+              if (old_id != mp_ioapics[apic].mpc_apicid)
-+                      for (i = 0; i < mp_irq_entries; i++)
-+                              if (mp_irqs[i].mpc_dstapic == old_id)
-+                                      mp_irqs[i].mpc_dstapic
-+                                              = mp_ioapics[apic].mpc_apicid;
-+
-+              /*
-+               * Read the right value from the MPC table and
-+               * write it into the ID register.
-+               */
-+              apic_printk(APIC_VERBOSE,KERN_INFO "...changing IO-APIC physical APIC ID to %d ...",
-+                              mp_ioapics[apic].mpc_apicid);
-+
-+              reg_00.bits.ID = mp_ioapics[apic].mpc_apicid;
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              io_apic_write(apic, 0, reg_00.raw);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+              /*
-+               * Sanity check
-+               */
-+              spin_lock_irqsave(&ioapic_lock, flags);
-+              reg_00.raw = io_apic_read(apic, 0);
-+              spin_unlock_irqrestore(&ioapic_lock, flags);
-+              if (reg_00.bits.ID != mp_ioapics[apic].mpc_apicid)
-+                      printk("could not set ID!\n");
-+              else
-+                      apic_printk(APIC_VERBOSE," ok.\n");
-+      }
-+}
-+#else
-+static void __init setup_ioapic_ids_from_mpc(void) { }
-+#endif
-+
-+/*
-+ * There is a nasty bug in some older SMP boards, their mptable lies
-+ * about the timer IRQ. We do the following to work around the situation:
-+ *
-+ *    - timer IRQ defaults to IO-APIC IRQ
-+ *    - if this function detects that timer IRQs are defunct, then we fall
-+ *      back to ISA timer IRQs
-+ */
-+#ifndef CONFIG_XEN
-+static int __init timer_irq_works(void)
-+{
-+      unsigned long t1 = jiffies;
-+
-+      local_irq_enable();
-+      /* Let ten ticks pass... */
-+      mdelay((10 * 1000) / HZ);
-+
-+      /*
-+       * Expect a few ticks at least, to be sure some possible
-+       * glue logic does not lock up after one or two first
-+       * ticks in a non-ExtINT mode.  Also the local APIC
-+       * might have cached one ExtINT interrupt.  Finally, at
-+       * least one tick may be lost due to delays.
-+       */
-+
-+      /* jiffies wrap? */
-+      if (jiffies - t1 > 4)
-+              return 1;
-+      return 0;
-+}
-+
-+/*
-+ * In the SMP+IOAPIC case it might happen that there are an unspecified
-+ * number of pending IRQ events unhandled. These cases are very rare,
-+ * so we 'resend' these IRQs via IPIs, to the same CPU. It's much
-+ * better to do it this way as thus we do not have to be aware of
-+ * 'pending' interrupts in the IRQ path, except at this point.
-+ */
-+/*
-+ * Edge triggered needs to resend any interrupt
-+ * that was delayed but this is now handled in the device
-+ * independent code.
-+ */
-+
-+/*
-+ * Starting up a edge-triggered IO-APIC interrupt is
-+ * nasty - we need to make sure that we get the edge.
-+ * If it is already asserted for some reason, we need
-+ * return 1 to indicate that is was pending.
-+ *
-+ * This is not complete - we should be able to fake
-+ * an edge even if it isn't on the 8259A...
-+ */
-+
-+static unsigned int startup_edge_ioapic_irq(unsigned int irq)
-+{
-+      int was_pending = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      if (irq < 16) {
-+              disable_8259A_irq(irq);
-+              if (i8259A_irq_pending(irq))
-+                      was_pending = 1;
-+      }
-+      __unmask_IO_APIC_irq(irq);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return was_pending;
-+}
-+
-+/*
-+ * Once we have recorded IRQ_PENDING already, we can mask the
-+ * interrupt for real. This prevents IRQ storms from unhandled
-+ * devices.
-+ */
-+static void ack_edge_ioapic_irq(unsigned int irq)
-+{
-+      move_irq(irq);
-+      if ((irq_desc[irq].status & (IRQ_PENDING | IRQ_DISABLED))
-+                                      == (IRQ_PENDING | IRQ_DISABLED))
-+              mask_IO_APIC_irq(irq);
-+      ack_APIC_irq();
-+}
-+
-+/*
-+ * Level triggered interrupts can just be masked,
-+ * and shutting down and starting up the interrupt
-+ * is the same as enabling and disabling them -- except
-+ * with a startup need to return a "was pending" value.
-+ *
-+ * Level triggered interrupts are special because we
-+ * do not touch any IO-APIC register while handling
-+ * them. We ack the APIC in the end-IRQ handler, not
-+ * in the start-IRQ-handler. Protection against reentrance
-+ * from the same interrupt is still provided, both by the
-+ * generic IRQ layer and by the fact that an unacked local
-+ * APIC does not accept IRQs.
-+ */
-+static unsigned int startup_level_ioapic_irq (unsigned int irq)
-+{
-+      unmask_IO_APIC_irq(irq);
-+
-+      return 0; /* don't check for pending */
-+}
-+
-+static void end_level_ioapic_irq (unsigned int irq)
-+{
-+      move_irq(irq);
-+      ack_APIC_irq();
-+}
-+
-+#ifdef CONFIG_PCI_MSI
-+static unsigned int startup_edge_ioapic_vector(unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      return startup_edge_ioapic_irq(irq);
-+}
-+
-+static void ack_edge_ioapic_vector(unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      move_native_irq(vector);
-+      ack_edge_ioapic_irq(irq);
-+}
-+
-+static unsigned int startup_level_ioapic_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      return startup_level_ioapic_irq (irq);
-+}
-+
-+static void end_level_ioapic_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      move_native_irq(vector);
-+      end_level_ioapic_irq(irq);
-+}
-+
-+static void mask_IO_APIC_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      mask_IO_APIC_irq(irq);
-+}
-+
-+static void unmask_IO_APIC_vector (unsigned int vector)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      unmask_IO_APIC_irq(irq);
-+}
-+
-+#ifdef CONFIG_SMP
-+static void set_ioapic_affinity_vector (unsigned int vector,
-+                                      cpumask_t cpu_mask)
-+{
-+      int irq = vector_to_irq(vector);
-+
-+      set_native_irq_info(vector, cpu_mask);
-+      set_ioapic_affinity_irq(irq, cpu_mask);
-+}
-+#endif // CONFIG_SMP
-+#endif // CONFIG_PCI_MSI
-+
-+static int ioapic_retrigger(unsigned int irq)
-+{
-+      send_IPI_self(IO_APIC_VECTOR(irq));
-+
-+      return 1;
-+}
-+
-+/*
-+ * Level and edge triggered IO-APIC interrupts need different handling,
-+ * so we use two separate IRQ descriptors. Edge triggered IRQs can be
-+ * handled with the level-triggered descriptor, but that one has slightly
-+ * more overhead. Level-triggered interrupts cannot be handled with the
-+ * edge-triggered handler, without risking IRQ storms and other ugly
-+ * races.
-+ */
-+
-+static struct hw_interrupt_type ioapic_edge_type __read_mostly = {
-+      .typename = "IO-APIC-edge",
-+      .startup        = startup_edge_ioapic,
-+      .shutdown       = shutdown_edge_ioapic,
-+      .enable         = enable_edge_ioapic,
-+      .disable        = disable_edge_ioapic,
-+      .ack            = ack_edge_ioapic,
-+      .end            = end_edge_ioapic,
-+#ifdef CONFIG_SMP
-+      .set_affinity = set_ioapic_affinity,
-+#endif
-+      .retrigger      = ioapic_retrigger,
-+};
-+
-+static struct hw_interrupt_type ioapic_level_type __read_mostly = {
-+      .typename = "IO-APIC-level",
-+      .startup        = startup_level_ioapic,
-+      .shutdown       = shutdown_level_ioapic,
-+      .enable         = enable_level_ioapic,
-+      .disable        = disable_level_ioapic,
-+      .ack            = mask_and_ack_level_ioapic,
-+      .end            = end_level_ioapic,
-+#ifdef CONFIG_SMP
-+      .set_affinity = set_ioapic_affinity,
-+#endif
-+      .retrigger      = ioapic_retrigger,
-+};
-+#endif /* !CONFIG_XEN */
-+
-+static inline void init_IO_APIC_traps(void)
-+{
-+      int irq;
-+
-+      /*
-+       * NOTE! The local APIC isn't very good at handling
-+       * multiple interrupts at the same interrupt level.
-+       * As the interrupt level is determined by taking the
-+       * vector number and shifting that right by 4, we
-+       * want to spread these out a bit so that they don't
-+       * all fall in the same interrupt level.
-+       *
-+       * Also, we've got to be careful not to trash gate
-+       * 0x80, because int 0x80 is hm, kind of importantish. ;)
-+       */
-+      for (irq = 0; irq < NR_IRQS ; irq++) {
-+              int tmp = irq;
-+              if (use_pci_vector()) {
-+                      if (!platform_legacy_irq(tmp))
-+                              if ((tmp = vector_to_irq(tmp)) == -1)
-+                                      continue;
-+              }
-+              if (IO_APIC_IRQ(tmp) && !IO_APIC_VECTOR(tmp)) {
-+                      /*
-+                       * Hmm.. We don't have an entry for this,
-+                       * so default to an old-fashioned 8259
-+                       * interrupt if we can..
-+                       */
-+                      if (irq < 16)
-+                              make_8259A_irq(irq);
-+#ifndef CONFIG_XEN
-+                      else
-+                              /* Strange. Oh, well.. */
-+                              irq_desc[irq].chip = &no_irq_type;
-+#endif
-+              }
-+      }
-+}
-+
-+#ifndef CONFIG_XEN
-+static void enable_lapic_irq (unsigned int irq)
-+{
-+      unsigned long v;
-+
-+      v = apic_read(APIC_LVT0);
-+      apic_write(APIC_LVT0, v & ~APIC_LVT_MASKED);
-+}
-+
-+static void disable_lapic_irq (unsigned int irq)
-+{
-+      unsigned long v;
-+
-+      v = apic_read(APIC_LVT0);
-+      apic_write(APIC_LVT0, v | APIC_LVT_MASKED);
-+}
-+
-+static void ack_lapic_irq (unsigned int irq)
-+{
-+      ack_APIC_irq();
-+}
-+
-+static void end_lapic_irq (unsigned int i) { /* nothing */ }
-+
-+static struct hw_interrupt_type lapic_irq_type __read_mostly = {
-+      .typename = "local-APIC-edge",
-+      .startup = NULL, /* startup_irq() not used for IRQ0 */
-+      .shutdown = NULL, /* shutdown_irq() not used for IRQ0 */
-+      .enable = enable_lapic_irq,
-+      .disable = disable_lapic_irq,
-+      .ack = ack_lapic_irq,
-+      .end = end_lapic_irq,
-+};
-+
-+static void setup_nmi (void)
-+{
-+      /*
-+       * Dirty trick to enable the NMI watchdog ...
-+       * We put the 8259A master into AEOI mode and
-+       * unmask on all local APICs LVT0 as NMI.
-+       *
-+       * The idea to use the 8259A in AEOI mode ('8259A Virtual Wire')
-+       * is from Maciej W. Rozycki - so we do not have to EOI from
-+       * the NMI handler or the timer interrupt.
-+       */ 
-+      printk(KERN_INFO "activating NMI Watchdog ...");
-+
-+      enable_NMI_through_LVT0(NULL);
-+
-+      printk(" done.\n");
-+}
-+
-+/*
-+ * This looks a bit hackish but it's about the only one way of sending
-+ * a few INTA cycles to 8259As and any associated glue logic.  ICR does
-+ * not support the ExtINT mode, unfortunately.  We need to send these
-+ * cycles as some i82489DX-based boards have glue logic that keeps the
-+ * 8259A interrupt line asserted until INTA.  --macro
-+ */
-+static inline void unlock_ExtINT_logic(void)
-+{
-+      int apic, pin, i;
-+      struct IO_APIC_route_entry entry0, entry1;
-+      unsigned char save_control, save_freq_select;
-+      unsigned long flags;
-+
-+      pin  = find_isa_irq_pin(8, mp_INT);
-+      apic = find_isa_irq_apic(8, mp_INT);
-+      if (pin == -1)
-+              return;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      *(((int *)&entry0) + 1) = io_apic_read(apic, 0x11 + 2 * pin);
-+      *(((int *)&entry0) + 0) = io_apic_read(apic, 0x10 + 2 * pin);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+      clear_IO_APIC_pin(apic, pin);
-+
-+      memset(&entry1, 0, sizeof(entry1));
-+
-+      entry1.dest_mode = 0;                   /* physical delivery */
-+      entry1.mask = 0;                        /* unmask IRQ now */
-+      entry1.dest.physical.physical_dest = hard_smp_processor_id();
-+      entry1.delivery_mode = dest_ExtINT;
-+      entry1.polarity = entry0.polarity;
-+      entry1.trigger = 0;
-+      entry1.vector = 0;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry1) + 1));
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry1) + 0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      save_control = CMOS_READ(RTC_CONTROL);
-+      save_freq_select = CMOS_READ(RTC_FREQ_SELECT);
-+      CMOS_WRITE((save_freq_select & ~RTC_RATE_SELECT) | 0x6,
-+                 RTC_FREQ_SELECT);
-+      CMOS_WRITE(save_control | RTC_PIE, RTC_CONTROL);
-+
-+      i = 100;
-+      while (i-- > 0) {
-+              mdelay(10);
-+              if ((CMOS_READ(RTC_INTR_FLAGS) & RTC_PF) == RTC_PF)
-+                      i -= 10;
-+      }
-+
-+      CMOS_WRITE(save_control, RTC_CONTROL);
-+      CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-+      clear_IO_APIC_pin(apic, pin);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(apic, 0x11 + 2 * pin, *(((int *)&entry0) + 1));
-+      io_apic_write(apic, 0x10 + 2 * pin, *(((int *)&entry0) + 0));
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+}
-+
-+int timer_uses_ioapic_pin_0;
-+
-+/*
-+ * This code may look a bit paranoid, but it's supposed to cooperate with
-+ * a wide range of boards and BIOS bugs.  Fortunately only the timer IRQ
-+ * is so screwy.  Thanks to Brian Perkins for testing/hacking this beast
-+ * fanatically on his truly buggy board.
-+ *
-+ * FIXME: really need to revamp this for modern platforms only.
-+ */
-+static inline void check_timer(void)
-+{
-+      int apic1, pin1, apic2, pin2;
-+      int vector;
-+
-+      /*
-+       * get/set the timer IRQ vector:
-+       */
-+      disable_8259A_irq(0);
-+      vector = assign_irq_vector(0);
-+      set_intr_gate(vector, interrupt[0]);
-+
-+      /*
-+       * Subtle, code in do_timer_interrupt() expects an AEOI
-+       * mode for the 8259A whenever interrupts are routed
-+       * through I/O APICs.  Also IRQ0 has to be enabled in
-+       * the 8259A which implies the virtual wire has to be
-+       * disabled in the local APIC.
-+       */
-+      apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_EXTINT);
-+      init_8259A(1);
-+      if (timer_over_8254 > 0)
-+              enable_8259A_irq(0);
-+
-+      pin1  = find_isa_irq_pin(0, mp_INT);
-+      apic1 = find_isa_irq_apic(0, mp_INT);
-+      pin2  = ioapic_i8259.pin;
-+      apic2 = ioapic_i8259.apic;
-+
-+      if (pin1 == 0)
-+              timer_uses_ioapic_pin_0 = 1;
-+
-+      apic_printk(APIC_VERBOSE,KERN_INFO "..TIMER: vector=0x%02X apic1=%d pin1=%d apic2=%d pin2=%d\n",
-+              vector, apic1, pin1, apic2, pin2);
-+
-+      if (pin1 != -1) {
-+              /*
-+               * Ok, does IRQ0 through the IOAPIC work?
-+               */
-+              unmask_IO_APIC_irq(0);
-+              if (!no_timer_check && timer_irq_works()) {
-+                      nmi_watchdog_default();
-+                      if (nmi_watchdog == NMI_IO_APIC) {
-+                              disable_8259A_irq(0);
-+                              setup_nmi();
-+                              enable_8259A_irq(0);
-+                      }
-+                      if (disable_timer_pin_1 > 0)
-+                              clear_IO_APIC_pin(0, pin1);
-+                      return;
-+              }
-+              clear_IO_APIC_pin(apic1, pin1);
-+              apic_printk(APIC_QUIET,KERN_ERR "..MP-BIOS bug: 8254 timer not "
-+                              "connected to IO-APIC\n");
-+      }
-+
-+      apic_printk(APIC_VERBOSE,KERN_INFO "...trying to set up timer (IRQ0) "
-+                              "through the 8259A ... ");
-+      if (pin2 != -1) {
-+              apic_printk(APIC_VERBOSE,"\n..... (found apic %d pin %d) ...",
-+                      apic2, pin2);
-+              /*
-+               * legacy devices should be connected to IO APIC #0
-+               */
-+              setup_ExtINT_IRQ0_pin(apic2, pin2, vector);
-+              if (timer_irq_works()) {
-+                      apic_printk(APIC_VERBOSE," works.\n");
-+                      nmi_watchdog_default();
-+                      if (nmi_watchdog == NMI_IO_APIC) {
-+                              setup_nmi();
-+                      }
-+                      return;
-+              }
-+              /*
-+               * Cleanup, just in case ...
-+               */
-+              clear_IO_APIC_pin(apic2, pin2);
-+      }
-+      apic_printk(APIC_VERBOSE," failed.\n");
-+
-+      if (nmi_watchdog == NMI_IO_APIC) {
-+              printk(KERN_WARNING "timer doesn't work through the IO-APIC - disabling NMI Watchdog!\n");
-+              nmi_watchdog = 0;
-+      }
-+
-+      apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as Virtual Wire IRQ...");
-+
-+      disable_8259A_irq(0);
-+      irq_desc[0].chip = &lapic_irq_type;
-+      apic_write(APIC_LVT0, APIC_DM_FIXED | vector);  /* Fixed mode */
-+      enable_8259A_irq(0);
-+
-+      if (timer_irq_works()) {
-+              apic_printk(APIC_VERBOSE," works.\n");
-+              return;
-+      }
-+      apic_write(APIC_LVT0, APIC_LVT_MASKED | APIC_DM_FIXED | vector);
-+      apic_printk(APIC_VERBOSE," failed.\n");
-+
-+      apic_printk(APIC_VERBOSE, KERN_INFO "...trying to set up timer as ExtINT IRQ...");
-+
-+      init_8259A(0);
-+      make_8259A_irq(0);
-+      apic_write(APIC_LVT0, APIC_DM_EXTINT);
-+
-+      unlock_ExtINT_logic();
-+
-+      if (timer_irq_works()) {
-+              apic_printk(APIC_VERBOSE," works.\n");
-+              return;
-+      }
-+      apic_printk(APIC_VERBOSE," failed :(.\n");
-+      panic("IO-APIC + timer doesn't work! Try using the 'noapic' kernel parameter\n");
-+}
-+#else
-+#define check_timer() ((void)0)
-+int timer_uses_ioapic_pin_0 = 0;
-+#endif /* !CONFIG_XEN */
-+
-+static int __init notimercheck(char *s)
-+{
-+      no_timer_check = 1;
-+      return 1;
-+}
-+__setup("no_timer_check", notimercheck);
-+
-+/*
-+ *
-+ * IRQ's that are handled by the PIC in the MPS IOAPIC case.
-+ * - IRQ2 is the cascade IRQ, and cannot be a io-apic IRQ.
-+ *   Linux doesn't really care, as it's not actually used
-+ *   for any interrupt handling anyway.
-+ */
-+#define PIC_IRQS      (1<<2)
-+
-+void __init setup_IO_APIC(void)
-+{
-+      enable_IO_APIC();
-+
-+      if (acpi_ioapic)
-+              io_apic_irqs = ~0;      /* all IRQs go through IOAPIC */
-+      else
-+              io_apic_irqs = ~PIC_IRQS;
-+
-+      apic_printk(APIC_VERBOSE, "ENABLING IO-APIC IRQs\n");
-+
-+      /*
-+       * Set up the IO-APIC IRQ routing table.
-+       */
-+      if (!acpi_ioapic)
-+              setup_ioapic_ids_from_mpc();
-+#ifndef CONFIG_XEN
-+      sync_Arb_IDs();
-+#endif /* !CONFIG_XEN */
-+      setup_IO_APIC_irqs();
-+      init_IO_APIC_traps();
-+      check_timer();
-+      if (!acpi_ioapic)
-+              print_IO_APIC();
-+}
-+
-+struct sysfs_ioapic_data {
-+      struct sys_device dev;
-+      struct IO_APIC_route_entry entry[0];
-+};
-+static struct sysfs_ioapic_data * mp_ioapic_data[MAX_IO_APICS];
-+
-+static int ioapic_suspend(struct sys_device *dev, pm_message_t state)
-+{
-+      struct IO_APIC_route_entry *entry;
-+      struct sysfs_ioapic_data *data;
-+      unsigned long flags;
-+      int i;
-+
-+      data = container_of(dev, struct sysfs_ioapic_data, dev);
-+      entry = data->entry;
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-+              *(((int *)entry) + 1) = io_apic_read(dev->id, 0x11 + 2 * i);
-+              *(((int *)entry) + 0) = io_apic_read(dev->id, 0x10 + 2 * i);
-+      }
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+static int ioapic_resume(struct sys_device *dev)
-+{
-+      struct IO_APIC_route_entry *entry;
-+      struct sysfs_ioapic_data *data;
-+      unsigned long flags;
-+      union IO_APIC_reg_00 reg_00;
-+      int i;
-+
-+      data = container_of(dev, struct sysfs_ioapic_data, dev);
-+      entry = data->entry;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_00.raw = io_apic_read(dev->id, 0);
-+      if (reg_00.bits.ID != mp_ioapics[dev->id].mpc_apicid) {
-+              reg_00.bits.ID = mp_ioapics[dev->id].mpc_apicid;
-+              io_apic_write(dev->id, 0, reg_00.raw);
-+      }
-+      for (i = 0; i < nr_ioapic_registers[dev->id]; i ++, entry ++ ) {
-+              io_apic_write(dev->id, 0x11+2*i, *(((int *)entry)+1));
-+              io_apic_write(dev->id, 0x10+2*i, *(((int *)entry)+0));
-+      }
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+static struct sysdev_class ioapic_sysdev_class = {
-+      set_kset_name("ioapic"),
-+#ifndef CONFIG_XEN
-+      .suspend = ioapic_suspend,
-+      .resume = ioapic_resume,
-+#endif
-+};
-+
-+static int __init ioapic_init_sysfs(void)
-+{
-+      struct sys_device * dev;
-+      int i, size, error = 0;
-+
-+      error = sysdev_class_register(&ioapic_sysdev_class);
-+      if (error)
-+              return error;
-+
-+      for (i = 0; i < nr_ioapics; i++ ) {
-+              size = sizeof(struct sys_device) + nr_ioapic_registers[i]
-+                      * sizeof(struct IO_APIC_route_entry);
-+              mp_ioapic_data[i] = kmalloc(size, GFP_KERNEL);
-+              if (!mp_ioapic_data[i]) {
-+                      printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-+                      continue;
-+              }
-+              memset(mp_ioapic_data[i], 0, size);
-+              dev = &mp_ioapic_data[i]->dev;
-+              dev->id = i;
-+              dev->cls = &ioapic_sysdev_class;
-+              error = sysdev_register(dev);
-+              if (error) {
-+                      kfree(mp_ioapic_data[i]);
-+                      mp_ioapic_data[i] = NULL;
-+                      printk(KERN_ERR "Can't suspend/resume IOAPIC %d\n", i);
-+                      continue;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+device_initcall(ioapic_init_sysfs);
-+
-+/* --------------------------------------------------------------------------
-+                          ACPI-based IOAPIC Configuration
-+   -------------------------------------------------------------------------- */
-+
-+#ifdef CONFIG_ACPI
-+
-+#define IO_APIC_MAX_ID                0xFE
-+
-+int __init io_apic_get_version (int ioapic)
-+{
-+      union IO_APIC_reg_01    reg_01;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_01.raw = io_apic_read(ioapic, 1);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return reg_01.bits.version;
-+}
-+
-+
-+int __init io_apic_get_redir_entries (int ioapic)
-+{
-+      union IO_APIC_reg_01    reg_01;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      reg_01.raw = io_apic_read(ioapic, 1);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return reg_01.bits.entries;
-+}
-+
-+
-+int io_apic_set_pci_routing (int ioapic, int pin, int irq, int edge_level, int active_high_low)
-+{
-+      struct IO_APIC_route_entry entry;
-+      unsigned long flags;
-+
-+      if (!IO_APIC_IRQ(irq)) {
-+              apic_printk(APIC_QUIET,KERN_ERR "IOAPIC[%d]: Invalid reference to IRQ 0\n",
-+                      ioapic);
-+              return -EINVAL;
-+      }
-+
-+      /*
-+       * Generate a PCI IRQ routing entry and program the IOAPIC accordingly.
-+       * Note that we mask (disable) IRQs now -- these get enabled when the
-+       * corresponding device driver registers for this IRQ.
-+       */
-+
-+      memset(&entry,0,sizeof(entry));
-+
-+      entry.delivery_mode = INT_DELIVERY_MODE;
-+      entry.dest_mode = INT_DEST_MODE;
-+      entry.dest.logical.logical_dest = cpu_mask_to_apicid(TARGET_CPUS);
-+      entry.trigger = edge_level;
-+      entry.polarity = active_high_low;
-+      entry.mask = 1;                                  /* Disabled (masked) */
-+
-+      irq = gsi_irq_sharing(irq);
-+      /*
-+       * IRQs < 16 are already in the irq_2_pin[] map
-+       */
-+      if (irq >= 16)
-+              add_pin_to_irq(irq, ioapic, pin);
-+
-+      entry.vector = assign_irq_vector(irq);
-+
-+      apic_printk(APIC_VERBOSE,KERN_DEBUG "IOAPIC[%d]: Set PCI routing entry (%d-%d -> 0x%x -> "
-+              "IRQ %d Mode:%i Active:%i)\n", ioapic, 
-+             mp_ioapics[ioapic].mpc_apicid, pin, entry.vector, irq,
-+             edge_level, active_high_low);
-+
-+      ioapic_register_intr(irq, entry.vector, edge_level);
-+
-+      if (!ioapic && (irq < 16))
-+              disable_8259A_irq(irq);
-+
-+      spin_lock_irqsave(&ioapic_lock, flags);
-+      io_apic_write(ioapic, 0x11+2*pin, *(((int *)&entry)+1));
-+      io_apic_write(ioapic, 0x10+2*pin, *(((int *)&entry)+0));
-+      set_native_irq_info(use_pci_vector() ?  entry.vector : irq, TARGET_CPUS);
-+      spin_unlock_irqrestore(&ioapic_lock, flags);
-+
-+      return 0;
-+}
-+
-+#endif /* CONFIG_ACPI */
-+
-+
-+#ifndef CONFIG_XEN
-+/*
-+ * This function currently is only a helper for the i386 smp boot process where
-+ * we need to reprogram the ioredtbls to cater for the cpus which have come online
-+ * so mask in all cases should simply be TARGET_CPUS
-+ */
-+#ifdef CONFIG_SMP
-+void __init setup_ioapic_dest(void)
-+{
-+      int pin, ioapic, irq, irq_entry;
-+
-+      if (skip_ioapic_setup == 1)
-+              return;
-+
-+      for (ioapic = 0; ioapic < nr_ioapics; ioapic++) {
-+              for (pin = 0; pin < nr_ioapic_registers[ioapic]; pin++) {
-+                      irq_entry = find_irq_entry(ioapic, pin, mp_INT);
-+                      if (irq_entry == -1)
-+                              continue;
-+                      irq = pin_2_irq(irq_entry, ioapic, pin);
-+                      set_ioapic_affinity_irq(irq, TARGET_CPUS);
-+              }
-+
-+      }
-+}
-+#endif
-+#endif /* !CONFIG_XEN */
-Index: head-2008-11-25/arch/x86/kernel/ioport_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/ioport_64-xen.c    2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,100 @@
-+/*
-+ *    linux/arch/x86_64/kernel/ioport.c
-+ *
-+ * This contains the io-permission bitmap code - written by obz, with changes
-+ * by Linus.
-+ */
-+
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/capability.h>
-+#include <linux/errno.h>
-+#include <linux/types.h>
-+#include <linux/ioport.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/stddef.h>
-+#include <linux/slab.h>
-+#include <linux/thread_info.h>
-+#include <xen/interface/physdev.h>
-+
-+/* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
-+static void set_bitmap(unsigned long *bitmap, unsigned int base, unsigned int extent, int new_value)
-+{
-+      int i;
-+
-+      if (new_value)
-+              for (i = base; i < base + extent; i++)
-+                      __set_bit(i, bitmap);
-+      else
-+              for (i = base; i < base + extent; i++)
-+                      clear_bit(i, bitmap);
-+}
-+
-+/*
-+ * this changes the io permissions bitmap in the current task.
-+ */
-+asmlinkage long sys_ioperm(unsigned long from, unsigned long num, int turn_on)
-+{
-+      struct thread_struct * t = &current->thread;
-+      unsigned long *bitmap;
-+      struct physdev_set_iobitmap set_iobitmap;
-+
-+      if ((from + num <= from) || (from + num > IO_BITMAP_BITS))
-+              return -EINVAL;
-+      if (turn_on && !capable(CAP_SYS_RAWIO))
-+              return -EPERM;
-+
-+      /*
-+       * If it's the first ioperm() call in this thread's lifetime, set the
-+       * IO bitmap up. ioperm() is much less timing critical than clone(),
-+       * this is why we delay this operation until now:
-+       */
-+      if (!t->io_bitmap_ptr) {
-+              bitmap = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-+              if (!bitmap)
-+                      return -ENOMEM;
-+
-+              memset(bitmap, 0xff, IO_BITMAP_BYTES);
-+              t->io_bitmap_ptr = bitmap;
-+
-+              set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
-+              set_iobitmap.nr_ports = IO_BITMAP_BITS;
-+              WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
-+                                            &set_iobitmap));
-+      }
-+
-+      set_bitmap(t->io_bitmap_ptr, from, num, !turn_on);
-+
-+      return 0;
-+}
-+
-+/*
-+ * sys_iopl has to be used when you want to access the IO ports
-+ * beyond the 0x3ff range: to get the full 65536 ports bitmapped
-+ * you'd need 8kB of bitmaps/process, which is a bit excessive.
-+ *
-+ */
-+
-+asmlinkage long sys_iopl(unsigned int new_iopl, struct pt_regs *regs)
-+{
-+      unsigned int old_iopl = current->thread.iopl;
-+      struct physdev_set_iopl set_iopl;
-+
-+      if (new_iopl > 3)
-+              return -EINVAL;
-+
-+      /* Need "raw I/O" privileges for direct port access. */
-+      if ((new_iopl > old_iopl) && !capable(CAP_SYS_RAWIO))
-+              return -EPERM;
-+
-+      /* Change our version of the privilege levels. */
-+      current->thread.iopl = new_iopl;
-+
-+      /* Force the change at ring 0. */
-+      set_iopl.iopl = (new_iopl == 0) ? 1 : new_iopl;
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
-+
-+      return 0;
-+}
-Index: head-2008-11-25/arch/x86/kernel/irq_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/irq_64-xen.c       2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,197 @@
-+/*
-+ *    linux/arch/x86_64/kernel/irq.c
-+ *
-+ *    Copyright (C) 1992, 1998 Linus Torvalds, Ingo Molnar
-+ *
-+ * This file contains the lowest level x86_64-specific interrupt
-+ * entry and irq statistics code. All the remaining irq logic is
-+ * done by the generic kernel/irq/ code and in the
-+ * x86_64-specific irq controller code. (e.g. i8259.c and
-+ * io_apic.c.)
-+ */
-+
-+#include <linux/kernel_stat.h>
-+#include <linux/interrupt.h>
-+#include <linux/seq_file.h>
-+#include <linux/module.h>
-+#include <linux/delay.h>
-+#include <asm/uaccess.h>
-+#include <asm/io_apic.h>
-+#include <asm/idle.h>
-+
-+atomic_t irq_err_count;
-+#ifdef CONFIG_X86_IO_APIC
-+#ifdef APIC_MISMATCH_DEBUG
-+atomic_t irq_mis_count;
-+#endif
-+#endif
-+
-+#ifdef CONFIG_DEBUG_STACKOVERFLOW
-+/*
-+ * Probabilistic stack overflow check:
-+ *
-+ * Only check the stack in process context, because everything else
-+ * runs on the big interrupt stacks. Checking reliably is too expensive,
-+ * so we just check from interrupts.
-+ */
-+static inline void stack_overflow_check(struct pt_regs *regs)
-+{
-+      u64 curbase = (u64) current->thread_info;
-+      static unsigned long warned = -60*HZ;
-+
-+      if (regs->rsp >= curbase && regs->rsp <= curbase + THREAD_SIZE &&
-+          regs->rsp <  curbase + sizeof(struct thread_info) + 128 &&
-+          time_after(jiffies, warned + 60*HZ)) {
-+              printk("do_IRQ: %s near stack overflow (cur:%Lx,rsp:%lx)\n",
-+                     current->comm, curbase, regs->rsp);
-+              show_stack(NULL,NULL);
-+              warned = jiffies;
-+      }
-+}
-+#endif
-+
-+/*
-+ * Generic, controller-independent functions:
-+ */
-+
-+int show_interrupts(struct seq_file *p, void *v)
-+{
-+      int i = *(loff_t *) v, j;
-+      struct irqaction * action;
-+      unsigned long flags;
-+
-+      if (i == 0) {
-+              seq_printf(p, "           ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "CPU%-8d",j);
-+              seq_putc(p, '\n');
-+      }
-+
-+      if (i < NR_IRQS) {
-+              spin_lock_irqsave(&irq_desc[i].lock, flags);
-+              action = irq_desc[i].action;
-+              if (!action) 
-+                      goto skip;
-+              seq_printf(p, "%3d: ",i);
-+#ifndef CONFIG_SMP
-+              seq_printf(p, "%10u ", kstat_irqs(i));
-+#else
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ", kstat_cpu(j).irqs[i]);
-+#endif
-+              seq_printf(p, " %14s", irq_desc[i].chip->typename);
-+
-+              seq_printf(p, "  %s", action->name);
-+              for (action=action->next; action; action = action->next)
-+                      seq_printf(p, ", %s", action->name);
-+              seq_putc(p, '\n');
-+skip:
-+              spin_unlock_irqrestore(&irq_desc[i].lock, flags);
-+      } else if (i == NR_IRQS) {
-+              seq_printf(p, "NMI: ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ", cpu_pda(j)->__nmi_count);
-+              seq_putc(p, '\n');
-+#ifdef CONFIG_X86_LOCAL_APIC
-+              seq_printf(p, "LOC: ");
-+              for_each_online_cpu(j)
-+                      seq_printf(p, "%10u ", cpu_pda(j)->apic_timer_irqs);
-+              seq_putc(p, '\n');
-+#endif
-+              seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
-+#ifdef CONFIG_X86_IO_APIC
-+#ifdef APIC_MISMATCH_DEBUG
-+              seq_printf(p, "MIS: %10u\n", atomic_read(&irq_mis_count));
-+#endif
-+#endif
-+      }
-+      return 0;
-+}
-+
-+/*
-+ * do_IRQ handles all normal device IRQ's (the special
-+ * SMP cross-CPU interrupts have their own specific
-+ * handlers).
-+ */
-+asmlinkage unsigned int do_IRQ(struct pt_regs *regs)
-+{     
-+      /* high bit used in ret_from_ code  */
-+      unsigned irq = ~regs->orig_rax;
-+
-+      if (unlikely(irq >= NR_IRQS)) {
-+              printk(KERN_EMERG "%s: cannot handle IRQ %d\n",
-+                                      __FUNCTION__, irq);
-+              BUG();
-+      }
-+
-+      /*exit_idle();*/
-+      /*irq_enter();*/
-+#ifdef CONFIG_DEBUG_STACKOVERFLOW
-+      stack_overflow_check(regs);
-+#endif
-+      __do_IRQ(irq, regs);
-+      /*irq_exit();*/
-+
-+      return 1;
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+void fixup_irqs(cpumask_t map)
-+{
-+      unsigned int irq;
-+      static int warned;
-+
-+      for (irq = 0; irq < NR_IRQS; irq++) {
-+              cpumask_t mask;
-+              if (irq == 2)
-+                      continue;
-+
-+              cpus_and(mask, irq_desc[irq].affinity, map);
-+              if (any_online_cpu(mask) == NR_CPUS) {
-+                      /*printk("Breaking affinity for irq %i\n", irq);*/
-+                      mask = map;
-+              }
-+              if (irq_desc[irq].chip->set_affinity)
-+                      irq_desc[irq].chip->set_affinity(irq, mask);
-+              else if (irq_desc[irq].action && !(warned++))
-+                      printk("Cannot set affinity for irq %i\n", irq);
-+      }
-+
-+      /* That doesn't seem sufficient.  Give it 1ms. */
-+      local_irq_enable();
-+      mdelay(1);
-+      local_irq_disable();
-+}
-+#endif
-+
-+extern void call_softirq(void);
-+
-+asmlinkage void do_softirq(void)
-+{
-+      __u32 pending;
-+      unsigned long flags;
-+
-+      if (in_interrupt())
-+              return;
-+
-+      local_irq_save(flags);
-+      pending = local_softirq_pending();
-+      /* Switch to interrupt stack */
-+      if (pending) {
-+              call_softirq();
-+              WARN_ON_ONCE(softirq_count());
-+      }
-+      local_irq_restore(flags);
-+}
-+EXPORT_SYMBOL(do_softirq);
-+
-+#ifndef CONFIG_X86_LOCAL_APIC
-+/*
-+ * 'what should we do if we get a hw irq event on an illegal vector'.
-+ * each architecture has to answer this themselves.
-+ */
-+void ack_bad_irq(unsigned int irq)
-+{
-+        printk("unexpected IRQ trap at vector %02x\n", irq);
-+}
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/ldt_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/ldt_64-xen.c       2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,282 @@
-+/*
-+ * linux/arch/x86_64/kernel/ldt.c
-+ *
-+ * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
-+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
-+ * Copyright (C) 2002 Andi Kleen
-+ * 
-+ * This handles calls from both 32bit and 64bit mode.
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/string.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/vmalloc.h>
-+#include <linux/slab.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <asm/ldt.h>
-+#include <asm/desc.h>
-+#include <asm/proto.h>
-+#include <asm/pgalloc.h>
-+
-+#ifdef CONFIG_SMP /* avoids "defined but not used" warnig */
-+static void flush_ldt(void *null)
-+{
-+      if (current->active_mm)
-+               load_LDT(&current->active_mm->context);
-+}
-+#endif
-+
-+static int alloc_ldt(mm_context_t *pc, unsigned mincount, int reload)
-+{
-+      void *oldldt;
-+      void *newldt;
-+      unsigned oldsize;
-+
-+      if (mincount <= (unsigned)pc->size)
-+              return 0;
-+      oldsize = pc->size;
-+      mincount = (mincount+511)&(~511);
-+      if (mincount*LDT_ENTRY_SIZE > PAGE_SIZE)
-+              newldt = vmalloc(mincount*LDT_ENTRY_SIZE);
-+      else
-+              newldt = kmalloc(mincount*LDT_ENTRY_SIZE, GFP_KERNEL);
-+
-+      if (!newldt)
-+              return -ENOMEM;
-+
-+      if (oldsize)
-+              memcpy(newldt, pc->ldt, oldsize*LDT_ENTRY_SIZE);
-+      oldldt = pc->ldt;
-+      memset(newldt+oldsize*LDT_ENTRY_SIZE, 0, (mincount-oldsize)*LDT_ENTRY_SIZE);
-+      wmb();
-+      pc->ldt = newldt;
-+      wmb();
-+      pc->size = mincount;
-+      wmb();
-+      if (reload) {
-+#ifdef CONFIG_SMP
-+              cpumask_t mask;
-+
-+              preempt_disable();
-+#endif
-+              make_pages_readonly(
-+                      pc->ldt,
-+                      (pc->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              load_LDT(pc);
-+#ifdef CONFIG_SMP
-+              mask = cpumask_of_cpu(smp_processor_id());
-+              if (!cpus_equal(current->mm->cpu_vm_mask, mask))
-+                      smp_call_function(flush_ldt, NULL, 1, 1);
-+              preempt_enable();
-+#endif
-+      }
-+      if (oldsize) {
-+              make_pages_writable(
-+                      oldldt,
-+                      (oldsize * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              if (oldsize*LDT_ENTRY_SIZE > PAGE_SIZE)
-+                      vfree(oldldt);
-+              else
-+                      kfree(oldldt);
-+      }
-+      return 0;
-+}
-+
-+static inline int copy_ldt(mm_context_t *new, mm_context_t *old)
-+{
-+      int err = alloc_ldt(new, old->size, 0);
-+      if (err < 0)
-+              return err;
-+      memcpy(new->ldt, old->ldt, old->size*LDT_ENTRY_SIZE);
-+      make_pages_readonly(
-+              new->ldt,
-+              (new->size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+              XENFEAT_writable_descriptor_tables);
-+      return 0;
-+}
-+
-+/*
-+ * we do not have to muck with descriptors here, that is
-+ * done in switch_mm() as needed.
-+ */
-+int init_new_context(struct task_struct *tsk, struct mm_struct *mm)
-+{
-+      struct mm_struct * old_mm;
-+      int retval = 0;
-+
-+      memset(&mm->context, 0, sizeof(mm->context));
-+      init_MUTEX(&mm->context.sem);
-+      old_mm = current->mm;
-+      if (old_mm && old_mm->context.size > 0) {
-+              down(&old_mm->context.sem);
-+              retval = copy_ldt(&mm->context, &old_mm->context);
-+              up(&old_mm->context.sem);
-+      }
-+      if (retval == 0) {
-+              spin_lock(&mm_unpinned_lock);
-+              list_add(&mm->context.unpinned, &mm_unpinned);
-+              spin_unlock(&mm_unpinned_lock);
-+      }
-+      return retval;
-+}
-+
-+/*
-+ * 
-+ * Don't touch the LDT register - we're already in the next thread.
-+ */
-+void destroy_context(struct mm_struct *mm)
-+{
-+      if (mm->context.size) {
-+              if (mm == current->active_mm)
-+                      clear_LDT();
-+              make_pages_writable(
-+                      mm->context.ldt,
-+                      (mm->context.size * LDT_ENTRY_SIZE) / PAGE_SIZE,
-+                      XENFEAT_writable_descriptor_tables);
-+              if (mm->context.size*LDT_ENTRY_SIZE > PAGE_SIZE)
-+                      vfree(mm->context.ldt);
-+              else
-+                      kfree(mm->context.ldt);
-+              mm->context.size = 0;
-+      }
-+      if (!mm->context.pinned) {
-+              spin_lock(&mm_unpinned_lock);
-+              list_del(&mm->context.unpinned);
-+              spin_unlock(&mm_unpinned_lock);
-+      }
-+}
-+
-+static int read_ldt(void __user * ptr, unsigned long bytecount)
-+{
-+      int err;
-+      unsigned long size;
-+      struct mm_struct * mm = current->mm;
-+
-+      if (!mm->context.size)
-+              return 0;
-+      if (bytecount > LDT_ENTRY_SIZE*LDT_ENTRIES)
-+              bytecount = LDT_ENTRY_SIZE*LDT_ENTRIES;
-+
-+      down(&mm->context.sem);
-+      size = mm->context.size*LDT_ENTRY_SIZE;
-+      if (size > bytecount)
-+              size = bytecount;
-+
-+      err = 0;
-+      if (copy_to_user(ptr, mm->context.ldt, size))
-+              err = -EFAULT;
-+      up(&mm->context.sem);
-+      if (err < 0)
-+              goto error_return;
-+      if (size != bytecount) {
-+              /* zero-fill the rest */
-+              if (clear_user(ptr+size, bytecount-size) != 0) {
-+                      err = -EFAULT;
-+                      goto error_return;
-+              }
-+      }
-+      return bytecount;
-+error_return:
-+      return err;
-+}
-+
-+static int read_default_ldt(void __user * ptr, unsigned long bytecount)
-+{
-+      /* Arbitrary number */ 
-+      /* x86-64 default LDT is all zeros */
-+      if (bytecount > 128) 
-+              bytecount = 128;        
-+      if (clear_user(ptr, bytecount))
-+              return -EFAULT;
-+      return bytecount; 
-+}
-+
-+static int write_ldt(void __user * ptr, unsigned long bytecount, int oldmode)
-+{
-+      struct task_struct *me = current;
-+      struct mm_struct * mm = me->mm;
-+      __u32 entry_1, entry_2, *lp;
-+      unsigned long mach_lp;
-+      int error;
-+      struct user_desc ldt_info;
-+
-+      error = -EINVAL;
-+
-+      if (bytecount != sizeof(ldt_info))
-+              goto out;
-+      error = -EFAULT;        
-+      if (copy_from_user(&ldt_info, ptr, bytecount))
-+              goto out;
-+
-+      error = -EINVAL;
-+      if (ldt_info.entry_number >= LDT_ENTRIES)
-+              goto out;
-+      if (ldt_info.contents == 3) {
-+              if (oldmode)
-+                      goto out;
-+              if (ldt_info.seg_not_present == 0)
-+                      goto out;
-+      }
-+
-+      down(&mm->context.sem);
-+      if (ldt_info.entry_number >= (unsigned)mm->context.size) {
-+              error = alloc_ldt(&current->mm->context, ldt_info.entry_number+1, 1);
-+              if (error < 0)
-+                      goto out_unlock;
-+      }
-+
-+      lp = (__u32 *) ((ldt_info.entry_number << 3) + (char *) mm->context.ldt);
-+      mach_lp = arbitrary_virt_to_machine(lp);
-+
-+      /* Allow LDTs to be cleared by the user. */
-+      if (ldt_info.base_addr == 0 && ldt_info.limit == 0) {
-+              if (oldmode || LDT_empty(&ldt_info)) {
-+                      entry_1 = 0;
-+                      entry_2 = 0;
-+                      goto install;
-+              }
-+      }
-+
-+      entry_1 = LDT_entry_a(&ldt_info);
-+      entry_2 = LDT_entry_b(&ldt_info);
-+      if (oldmode)
-+              entry_2 &= ~(1 << 20);
-+
-+      /* Install the new entry ...  */
-+install:
-+      error = HYPERVISOR_update_descriptor(mach_lp, (unsigned long)((entry_1 | (unsigned long) entry_2 << 32)));
-+
-+out_unlock:
-+      up(&mm->context.sem);
-+out:
-+      return error;
-+}
-+
-+asmlinkage int sys_modify_ldt(int func, void __user *ptr, unsigned long bytecount)
-+{
-+      int ret = -ENOSYS;
-+
-+      switch (func) {
-+      case 0:
-+              ret = read_ldt(ptr, bytecount);
-+              break;
-+      case 1:
-+              ret = write_ldt(ptr, bytecount, 1);
-+              break;
-+      case 2:
-+              ret = read_default_ldt(ptr, bytecount);
-+              break;
-+      case 0x11:
-+              ret = write_ldt(ptr, bytecount, 0);
-+              break;
-+      }
-+      return ret;
-+}
-Index: head-2008-11-25/arch/x86/kernel/mpparse_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/mpparse_64-xen.c   2007-06-12 13:13:01.000000000 +0200
-@@ -0,0 +1,1011 @@
-+/*
-+ *    Intel Multiprocessor Specification 1.1 and 1.4
-+ *    compliant MP-table parsing routines.
-+ *
-+ *    (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
-+ *    (c) 1998, 1999, 2000 Ingo Molnar <mingo@redhat.com>
-+ *
-+ *    Fixes
-+ *            Erich Boleyn    :       MP v1.4 and additional changes.
-+ *            Alan Cox        :       Added EBDA scanning
-+ *            Ingo Molnar     :       various cleanups and rewrites
-+ *            Maciej W. Rozycki:      Bits for default MP configurations
-+ *            Paul Diefenbaugh:       Added full ACPI support
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/bootmem.h>
-+#include <linux/smp_lock.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/acpi.h>
-+#include <linux/module.h>
-+
-+#include <asm/smp.h>
-+#include <asm/mtrr.h>
-+#include <asm/mpspec.h>
-+#include <asm/pgalloc.h>
-+#include <asm/io_apic.h>
-+#include <asm/proto.h>
-+#include <asm/acpi.h>
-+
-+/* Have we found an MP table */
-+int smp_found_config;
-+unsigned int __initdata maxcpus = NR_CPUS;
-+
-+int acpi_found_madt;
-+
-+/*
-+ * Various Linux-internal data structures created from the
-+ * MP-table.
-+ */
-+unsigned char apic_version [MAX_APICS];
-+unsigned char mp_bus_id_to_type [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-+int mp_bus_id_to_pci_bus [MAX_MP_BUSSES] = { [0 ... MAX_MP_BUSSES-1] = -1 };
-+
-+static int mp_current_pci_id = 0;
-+/* I/O APIC entries */
-+struct mpc_config_ioapic mp_ioapics[MAX_IO_APICS];
-+
-+/* # of MP IRQ source entries */
-+struct mpc_config_intsrc mp_irqs[MAX_IRQ_SOURCES];
-+
-+/* MP IRQ source entries */
-+int mp_irq_entries;
-+
-+int nr_ioapics;
-+int pic_mode;
-+unsigned long mp_lapic_addr = 0;
-+
-+
-+
-+/* Processor that is doing the boot up */
-+unsigned int boot_cpu_id = -1U;
-+/* Internal processor count */
-+unsigned int num_processors __initdata = 0;
-+
-+unsigned disabled_cpus __initdata;
-+
-+/* Bitmask of physically existing CPUs */
-+physid_mask_t phys_cpu_present_map = PHYSID_MASK_NONE;
-+
-+/* ACPI MADT entry parsing functions */
-+#ifdef CONFIG_ACPI
-+extern struct acpi_boot_flags acpi_boot;
-+#ifdef CONFIG_X86_LOCAL_APIC
-+extern int acpi_parse_lapic (acpi_table_entry_header *header);
-+extern int acpi_parse_lapic_addr_ovr (acpi_table_entry_header *header);
-+extern int acpi_parse_lapic_nmi (acpi_table_entry_header *header);
-+#endif /*CONFIG_X86_LOCAL_APIC*/
-+#ifdef CONFIG_X86_IO_APIC
-+extern int acpi_parse_ioapic (acpi_table_entry_header *header);
-+#endif /*CONFIG_X86_IO_APIC*/
-+#endif /*CONFIG_ACPI*/
-+
-+u8 bios_cpu_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-+
-+
-+/*
-+ * Intel MP BIOS table parsing routines:
-+ */
-+
-+/*
-+ * Checksum an MP configuration block.
-+ */
-+
-+static int __init mpf_checksum(unsigned char *mp, int len)
-+{
-+      int sum = 0;
-+
-+      while (len--)
-+              sum += *mp++;
-+
-+      return sum & 0xFF;
-+}
-+
-+#ifndef CONFIG_XEN
-+static void __cpuinit MP_processor_info (struct mpc_config_processor *m)
-+{
-+      int cpu;
-+      unsigned char ver;
-+      cpumask_t tmp_map;
-+
-+      if (!(m->mpc_cpuflag & CPU_ENABLED)) {
-+              disabled_cpus++;
-+              return;
-+      }
-+
-+      printk(KERN_INFO "Processor #%d %d:%d APIC version %d\n",
-+              m->mpc_apicid,
-+             (m->mpc_cpufeature & CPU_FAMILY_MASK)>>8,
-+             (m->mpc_cpufeature & CPU_MODEL_MASK)>>4,
-+              m->mpc_apicver);
-+
-+      if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-+              Dprintk("    Bootup CPU\n");
-+              boot_cpu_id = m->mpc_apicid;
-+      }
-+      if (num_processors >= NR_CPUS) {
-+              printk(KERN_WARNING "WARNING: NR_CPUS limit of %i reached."
-+                      " Processor ignored.\n", NR_CPUS);
-+              return;
-+      }
-+
-+      num_processors++;
-+      cpus_complement(tmp_map, cpu_present_map);
-+      cpu = first_cpu(tmp_map);
-+
-+#if MAX_APICS < 255   
-+      if ((int)m->mpc_apicid > MAX_APICS) {
-+              printk(KERN_ERR "Processor #%d INVALID. (Max ID: %d).\n",
-+                      m->mpc_apicid, MAX_APICS);
-+              return;
-+      }
-+#endif
-+      ver = m->mpc_apicver;
-+
-+      physid_set(m->mpc_apicid, phys_cpu_present_map);
-+      /*
-+       * Validate version
-+       */
-+      if (ver == 0x0) {
-+              printk(KERN_ERR "BIOS bug, APIC version is 0 for CPU#%d! fixing up to 0x10. (tell your hw vendor)\n", m->mpc_apicid);
-+              ver = 0x10;
-+      }
-+      apic_version[m->mpc_apicid] = ver;
-+      if (m->mpc_cpuflag & CPU_BOOTPROCESSOR) {
-+              /*
-+               * bios_cpu_apicid is required to have processors listed
-+               * in same order as logical cpu numbers. Hence the first
-+               * entry is BSP, and so on.
-+               */
-+              cpu = 0;
-+      }
-+      bios_cpu_apicid[cpu] = m->mpc_apicid;
-+      x86_cpu_to_apicid[cpu] = m->mpc_apicid;
-+
-+      cpu_set(cpu, cpu_possible_map);
-+      cpu_set(cpu, cpu_present_map);
-+}
-+#else
-+static void __cpuinit MP_processor_info (struct mpc_config_processor *m)
-+{
-+      num_processors++;
-+}
-+#endif /* CONFIG_XEN */
-+
-+static void __init MP_bus_info (struct mpc_config_bus *m)
-+{
-+      char str[7];
-+
-+      memcpy(str, m->mpc_bustype, 6);
-+      str[6] = 0;
-+      Dprintk("Bus #%d is %s\n", m->mpc_busid, str);
-+
-+      if (strncmp(str, "ISA", 3) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_ISA;
-+      } else if (strncmp(str, "EISA", 4) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_EISA;
-+      } else if (strncmp(str, "PCI", 3) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_PCI;
-+              mp_bus_id_to_pci_bus[m->mpc_busid] = mp_current_pci_id;
-+              mp_current_pci_id++;
-+      } else if (strncmp(str, "MCA", 3) == 0) {
-+              mp_bus_id_to_type[m->mpc_busid] = MP_BUS_MCA;
-+      } else {
-+              printk(KERN_ERR "Unknown bustype %s\n", str);
-+      }
-+}
-+
-+static void __init MP_ioapic_info (struct mpc_config_ioapic *m)
-+{
-+      if (!(m->mpc_flags & MPC_APIC_USABLE))
-+              return;
-+
-+      printk("I/O APIC #%d Version %d at 0x%X.\n",
-+              m->mpc_apicid, m->mpc_apicver, m->mpc_apicaddr);
-+      if (nr_ioapics >= MAX_IO_APICS) {
-+              printk(KERN_ERR "Max # of I/O APICs (%d) exceeded (found %d).\n",
-+                      MAX_IO_APICS, nr_ioapics);
-+              panic("Recompile kernel with bigger MAX_IO_APICS!.\n");
-+      }
-+      if (!m->mpc_apicaddr) {
-+              printk(KERN_ERR "WARNING: bogus zero I/O APIC address"
-+                      " found in MP table, skipping!\n");
-+              return;
-+      }
-+      mp_ioapics[nr_ioapics] = *m;
-+      nr_ioapics++;
-+}
-+
-+static void __init MP_intsrc_info (struct mpc_config_intsrc *m)
-+{
-+      mp_irqs [mp_irq_entries] = *m;
-+      Dprintk("Int: type %d, pol %d, trig %d, bus %d,"
-+              " IRQ %02x, APIC ID %x, APIC INT %02x\n",
-+                      m->mpc_irqtype, m->mpc_irqflag & 3,
-+                      (m->mpc_irqflag >> 2) & 3, m->mpc_srcbus,
-+                      m->mpc_srcbusirq, m->mpc_dstapic, m->mpc_dstirq);
-+      if (++mp_irq_entries >= MAX_IRQ_SOURCES)
-+              panic("Max # of irq sources exceeded!!\n");
-+}
-+
-+static void __init MP_lintsrc_info (struct mpc_config_lintsrc *m)
-+{
-+      Dprintk("Lint: type %d, pol %d, trig %d, bus %d,"
-+              " IRQ %02x, APIC ID %x, APIC LINT %02x\n",
-+                      m->mpc_irqtype, m->mpc_irqflag & 3,
-+                      (m->mpc_irqflag >> 2) &3, m->mpc_srcbusid,
-+                      m->mpc_srcbusirq, m->mpc_destapic, m->mpc_destapiclint);
-+      /*
-+       * Well it seems all SMP boards in existence
-+       * use ExtINT/LVT1 == LINT0 and
-+       * NMI/LVT2 == LINT1 - the following check
-+       * will show us if this assumptions is false.
-+       * Until then we do not have to add baggage.
-+       */
-+      if ((m->mpc_irqtype == mp_ExtINT) &&
-+              (m->mpc_destapiclint != 0))
-+                      BUG();
-+      if ((m->mpc_irqtype == mp_NMI) &&
-+              (m->mpc_destapiclint != 1))
-+                      BUG();
-+}
-+
-+/*
-+ * Read/parse the MPC
-+ */
-+
-+static int __init smp_read_mpc(struct mp_config_table *mpc)
-+{
-+      char str[16];
-+      int count=sizeof(*mpc);
-+      unsigned char *mpt=((unsigned char *)mpc)+count;
-+
-+      if (memcmp(mpc->mpc_signature,MPC_SIGNATURE,4)) {
-+              printk("SMP mptable: bad signature [%c%c%c%c]!\n",
-+                      mpc->mpc_signature[0],
-+                      mpc->mpc_signature[1],
-+                      mpc->mpc_signature[2],
-+                      mpc->mpc_signature[3]);
-+              return 0;
-+      }
-+      if (mpf_checksum((unsigned char *)mpc,mpc->mpc_length)) {
-+              printk("SMP mptable: checksum error!\n");
-+              return 0;
-+      }
-+      if (mpc->mpc_spec!=0x01 && mpc->mpc_spec!=0x04) {
-+              printk(KERN_ERR "SMP mptable: bad table version (%d)!!\n",
-+                      mpc->mpc_spec);
-+              return 0;
-+      }
-+      if (!mpc->mpc_lapic) {
-+              printk(KERN_ERR "SMP mptable: null local APIC address!\n");
-+              return 0;
-+      }
-+      memcpy(str,mpc->mpc_oem,8);
-+      str[8]=0;
-+      printk(KERN_INFO "OEM ID: %s ",str);
-+
-+      memcpy(str,mpc->mpc_productid,12);
-+      str[12]=0;
-+      printk("Product ID: %s ",str);
-+
-+      printk("APIC at: 0x%X\n",mpc->mpc_lapic);
-+
-+      /* save the local APIC address, it might be non-default */
-+      if (!acpi_lapic)
-+      mp_lapic_addr = mpc->mpc_lapic;
-+
-+      /*
-+       *      Now process the configuration blocks.
-+       */
-+      while (count < mpc->mpc_length) {
-+              switch(*mpt) {
-+                      case MP_PROCESSOR:
-+                      {
-+                              struct mpc_config_processor *m=
-+                                      (struct mpc_config_processor *)mpt;
-+                              if (!acpi_lapic)
-+                              MP_processor_info(m);
-+                              mpt += sizeof(*m);
-+                              count += sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_BUS:
-+                      {
-+                              struct mpc_config_bus *m=
-+                                      (struct mpc_config_bus *)mpt;
-+                              MP_bus_info(m);
-+                              mpt += sizeof(*m);
-+                              count += sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_IOAPIC:
-+                      {
-+                              struct mpc_config_ioapic *m=
-+                                      (struct mpc_config_ioapic *)mpt;
-+                              MP_ioapic_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_INTSRC:
-+                      {
-+                              struct mpc_config_intsrc *m=
-+                                      (struct mpc_config_intsrc *)mpt;
-+
-+                              MP_intsrc_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+                      case MP_LINTSRC:
-+                      {
-+                              struct mpc_config_lintsrc *m=
-+                                      (struct mpc_config_lintsrc *)mpt;
-+                              MP_lintsrc_info(m);
-+                              mpt+=sizeof(*m);
-+                              count+=sizeof(*m);
-+                              break;
-+                      }
-+              }
-+      }
-+      clustered_apic_check();
-+      if (!num_processors)
-+              printk(KERN_ERR "SMP mptable: no processors registered!\n");
-+      return num_processors;
-+}
-+
-+static int __init ELCR_trigger(unsigned int irq)
-+{
-+      unsigned int port;
-+
-+      port = 0x4d0 + (irq >> 3);
-+      return (inb(port) >> (irq & 7)) & 1;
-+}
-+
-+static void __init construct_default_ioirq_mptable(int mpc_default_type)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int i;
-+      int ELCR_fallback = 0;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqflag = 0;                 /* conforming */
-+      intsrc.mpc_srcbus = 0;
-+      intsrc.mpc_dstapic = mp_ioapics[0].mpc_apicid;
-+
-+      intsrc.mpc_irqtype = mp_INT;
-+
-+      /*
-+       *  If true, we have an ISA/PCI system with no IRQ entries
-+       *  in the MP table. To prevent the PCI interrupts from being set up
-+       *  incorrectly, we try to use the ELCR. The sanity check to see if
-+       *  there is good ELCR data is very simple - IRQ0, 1, 2 and 13 can
-+       *  never be level sensitive, so we simply see if the ELCR agrees.
-+       *  If it does, we assume it's valid.
-+       */
-+      if (mpc_default_type == 5) {
-+              printk(KERN_INFO "ISA/PCI bus type with no IRQ information... falling back to ELCR\n");
-+
-+              if (ELCR_trigger(0) || ELCR_trigger(1) || ELCR_trigger(2) || ELCR_trigger(13))
-+                      printk(KERN_ERR "ELCR contains invalid data... not using ELCR\n");
-+              else {
-+                      printk(KERN_INFO "Using ELCR to identify PCI interrupts\n");
-+                      ELCR_fallback = 1;
-+              }
-+      }
-+
-+      for (i = 0; i < 16; i++) {
-+              switch (mpc_default_type) {
-+              case 2:
-+                      if (i == 0 || i == 13)
-+                              continue;       /* IRQ0 & IRQ13 not connected */
-+                      /* fall through */
-+              default:
-+                      if (i == 2)
-+                              continue;       /* IRQ2 is never connected */
-+              }
-+
-+              if (ELCR_fallback) {
-+                      /*
-+                       *  If the ELCR indicates a level-sensitive interrupt, we
-+                       *  copy that information over to the MP table in the
-+                       *  irqflag field (level sensitive, active high polarity).
-+                       */
-+                      if (ELCR_trigger(i))
-+                              intsrc.mpc_irqflag = 13;
-+                      else
-+                              intsrc.mpc_irqflag = 0;
-+              }
-+
-+              intsrc.mpc_srcbusirq = i;
-+              intsrc.mpc_dstirq = i ? i : 2;          /* IRQ0 to INTIN2 */
-+              MP_intsrc_info(&intsrc);
-+      }
-+
-+      intsrc.mpc_irqtype = mp_ExtINT;
-+      intsrc.mpc_srcbusirq = 0;
-+      intsrc.mpc_dstirq = 0;                          /* 8259A to INTIN0 */
-+      MP_intsrc_info(&intsrc);
-+}
-+
-+static inline void __init construct_default_ISA_mptable(int mpc_default_type)
-+{
-+      struct mpc_config_processor processor;
-+      struct mpc_config_bus bus;
-+      struct mpc_config_ioapic ioapic;
-+      struct mpc_config_lintsrc lintsrc;
-+      int linttypes[2] = { mp_ExtINT, mp_NMI };
-+      int i;
-+
-+      /*
-+       * local APIC has default address
-+       */
-+      mp_lapic_addr = APIC_DEFAULT_PHYS_BASE;
-+
-+      /*
-+       * 2 CPUs, numbered 0 & 1.
-+       */
-+      processor.mpc_type = MP_PROCESSOR;
-+      /* Either an integrated APIC or a discrete 82489DX. */
-+      processor.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-+      processor.mpc_cpuflag = CPU_ENABLED;
-+      processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) |
-+                                 (boot_cpu_data.x86_model << 4) |
-+                                 boot_cpu_data.x86_mask;
-+      processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-+      processor.mpc_reserved[0] = 0;
-+      processor.mpc_reserved[1] = 0;
-+      for (i = 0; i < 2; i++) {
-+              processor.mpc_apicid = i;
-+              MP_processor_info(&processor);
-+      }
-+
-+      bus.mpc_type = MP_BUS;
-+      bus.mpc_busid = 0;
-+      switch (mpc_default_type) {
-+              default:
-+                      printk(KERN_ERR "???\nUnknown standard configuration %d\n",
-+                              mpc_default_type);
-+                      /* fall through */
-+              case 1:
-+              case 5:
-+                      memcpy(bus.mpc_bustype, "ISA   ", 6);
-+                      break;
-+              case 2:
-+              case 6:
-+              case 3:
-+                      memcpy(bus.mpc_bustype, "EISA  ", 6);
-+                      break;
-+              case 4:
-+              case 7:
-+                      memcpy(bus.mpc_bustype, "MCA   ", 6);
-+      }
-+      MP_bus_info(&bus);
-+      if (mpc_default_type > 4) {
-+              bus.mpc_busid = 1;
-+              memcpy(bus.mpc_bustype, "PCI   ", 6);
-+              MP_bus_info(&bus);
-+      }
-+
-+      ioapic.mpc_type = MP_IOAPIC;
-+      ioapic.mpc_apicid = 2;
-+      ioapic.mpc_apicver = mpc_default_type > 4 ? 0x10 : 0x01;
-+      ioapic.mpc_flags = MPC_APIC_USABLE;
-+      ioapic.mpc_apicaddr = 0xFEC00000;
-+      MP_ioapic_info(&ioapic);
-+
-+      /*
-+       * We set up most of the low 16 IO-APIC pins according to MPS rules.
-+       */
-+      construct_default_ioirq_mptable(mpc_default_type);
-+
-+      lintsrc.mpc_type = MP_LINTSRC;
-+      lintsrc.mpc_irqflag = 0;                /* conforming */
-+      lintsrc.mpc_srcbusid = 0;
-+      lintsrc.mpc_srcbusirq = 0;
-+      lintsrc.mpc_destapic = MP_APIC_ALL;
-+      for (i = 0; i < 2; i++) {
-+              lintsrc.mpc_irqtype = linttypes[i];
-+              lintsrc.mpc_destapiclint = i;
-+              MP_lintsrc_info(&lintsrc);
-+      }
-+}
-+
-+static struct intel_mp_floating *mpf_found;
-+
-+/*
-+ * Scan the memory blocks for an SMP configuration block.
-+ */
-+void __init get_smp_config (void)
-+{
-+      struct intel_mp_floating *mpf = mpf_found;
-+
-+      /*
-+       * ACPI supports both logical (e.g. Hyper-Threading) and physical 
-+       * processors, where MPS only supports physical.
-+       */
-+      if (acpi_lapic && acpi_ioapic) {
-+              printk(KERN_INFO "Using ACPI (MADT) for SMP configuration information\n");
-+              return;
-+      }
-+      else if (acpi_lapic)
-+              printk(KERN_INFO "Using ACPI for processor (LAPIC) configuration information\n");
-+
-+      printk("Intel MultiProcessor Specification v1.%d\n", mpf->mpf_specification);
-+      if (mpf->mpf_feature2 & (1<<7)) {
-+              printk(KERN_INFO "    IMCR and PIC compatibility mode.\n");
-+              pic_mode = 1;
-+      } else {
-+              printk(KERN_INFO "    Virtual Wire compatibility mode.\n");
-+              pic_mode = 0;
-+      }
-+
-+      /*
-+       * Now see if we need to read further.
-+       */
-+      if (mpf->mpf_feature1 != 0) {
-+
-+              printk(KERN_INFO "Default MP configuration #%d\n", mpf->mpf_feature1);
-+              construct_default_ISA_mptable(mpf->mpf_feature1);
-+
-+      } else if (mpf->mpf_physptr) {
-+
-+              /*
-+               * Read the physical hardware table.  Anything here will
-+               * override the defaults.
-+               */
-+              if (!smp_read_mpc(isa_bus_to_virt(mpf->mpf_physptr))) {
-+                      smp_found_config = 0;
-+                      printk(KERN_ERR "BIOS bug, MP table errors detected!...\n");
-+                      printk(KERN_ERR "... disabling SMP support. (tell your hw vendor)\n");
-+                      return;
-+              }
-+              /*
-+               * If there are no explicit MP IRQ entries, then we are
-+               * broken.  We set up most of the low 16 IO-APIC pins to
-+               * ISA defaults and hope it will work.
-+               */
-+              if (!mp_irq_entries) {
-+                      struct mpc_config_bus bus;
-+
-+                      printk(KERN_ERR "BIOS bug, no explicit IRQ entries, using default mptable. (tell your hw vendor)\n");
-+
-+                      bus.mpc_type = MP_BUS;
-+                      bus.mpc_busid = 0;
-+                      memcpy(bus.mpc_bustype, "ISA   ", 6);
-+                      MP_bus_info(&bus);
-+
-+                      construct_default_ioirq_mptable(0);
-+              }
-+
-+      } else
-+              BUG();
-+
-+      printk(KERN_INFO "Processors: %d\n", num_processors);
-+      /*
-+       * Only use the first configuration found.
-+       */
-+}
-+
-+static int __init smp_scan_config (unsigned long base, unsigned long length)
-+{
-+      extern void __bad_mpf_size(void); 
-+      unsigned int *bp = isa_bus_to_virt(base);
-+      struct intel_mp_floating *mpf;
-+
-+      Dprintk("Scan SMP from %p for %ld bytes.\n", bp,length);
-+      if (sizeof(*mpf) != 16)
-+              __bad_mpf_size();
-+
-+      while (length > 0) {
-+              mpf = (struct intel_mp_floating *)bp;
-+              if ((*bp == SMP_MAGIC_IDENT) &&
-+                      (mpf->mpf_length == 1) &&
-+                      !mpf_checksum((unsigned char *)bp, 16) &&
-+                      ((mpf->mpf_specification == 1)
-+                              || (mpf->mpf_specification == 4)) ) {
-+
-+                      smp_found_config = 1;
-+                      mpf_found = mpf;
-+                      return 1;
-+              }
-+              bp += 4;
-+              length -= 16;
-+      }
-+      return 0;
-+}
-+
-+void __init find_intel_smp (void)
-+{
-+      unsigned int address;
-+
-+      /*
-+       * FIXME: Linux assumes you have 640K of base ram..
-+       * this continues the error...
-+       *
-+       * 1) Scan the bottom 1K for a signature
-+       * 2) Scan the top 1K of base RAM
-+       * 3) Scan the 64K of bios
-+       */
-+      if (smp_scan_config(0x0,0x400) ||
-+              smp_scan_config(639*0x400,0x400) ||
-+                      smp_scan_config(0xF0000,0x10000))
-+              return;
-+      /*
-+       * If it is an SMP machine we should know now, unless the
-+       * configuration is in an EISA/MCA bus machine with an
-+       * extended bios data area.
-+       *
-+       * there is a real-mode segmented pointer pointing to the
-+       * 4K EBDA area at 0x40E, calculate and scan it here.
-+       *
-+       * NOTE! There are Linux loaders that will corrupt the EBDA
-+       * area, and as such this kind of SMP config may be less
-+       * trustworthy, simply because the SMP table may have been
-+       * stomped on during early boot. These loaders are buggy and
-+       * should be fixed.
-+       */
-+
-+      address = *(unsigned short *)phys_to_virt(0x40E);
-+      address <<= 4;
-+      if (smp_scan_config(address, 0x1000))
-+              return;
-+
-+      /* If we have come this far, we did not find an MP table  */
-+       printk(KERN_INFO "No mptable found.\n");
-+}
-+
-+/*
-+ * - Intel MP Configuration Table
-+ */
-+void __init find_smp_config (void)
-+{
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      find_intel_smp();
-+#endif
-+}
-+
-+
-+/* --------------------------------------------------------------------------
-+                            ACPI-based MP Configuration
-+   -------------------------------------------------------------------------- */
-+
-+#ifdef CONFIG_ACPI
-+
-+void __init mp_register_lapic_address (
-+      u64                     address)
-+{
-+#ifndef CONFIG_XEN
-+      mp_lapic_addr = (unsigned long) address;
-+
-+      set_fixmap_nocache(FIX_APIC_BASE, mp_lapic_addr);
-+
-+      if (boot_cpu_id == -1U)
-+              boot_cpu_id = GET_APIC_ID(apic_read(APIC_ID));
-+
-+      Dprintk("Boot CPU = %d\n", boot_cpu_physical_apicid);
-+#endif
-+}
-+
-+
-+void __cpuinit mp_register_lapic (
-+      u8                      id, 
-+      u8                      enabled)
-+{
-+      struct mpc_config_processor processor;
-+      int                     boot_cpu = 0;
-+      
-+      if (id >= MAX_APICS) {
-+              printk(KERN_WARNING "Processor #%d invalid (max %d)\n",
-+                      id, MAX_APICS);
-+              return;
-+      }
-+
-+      if (id == boot_cpu_physical_apicid)
-+              boot_cpu = 1;
-+
-+#ifndef CONFIG_XEN
-+      processor.mpc_type = MP_PROCESSOR;
-+      processor.mpc_apicid = id;
-+      processor.mpc_apicver = GET_APIC_VERSION(apic_read(APIC_LVR));
-+      processor.mpc_cpuflag = (enabled ? CPU_ENABLED : 0);
-+      processor.mpc_cpuflag |= (boot_cpu ? CPU_BOOTPROCESSOR : 0);
-+      processor.mpc_cpufeature = (boot_cpu_data.x86 << 8) | 
-+              (boot_cpu_data.x86_model << 4) | boot_cpu_data.x86_mask;
-+      processor.mpc_featureflag = boot_cpu_data.x86_capability[0];
-+      processor.mpc_reserved[0] = 0;
-+      processor.mpc_reserved[1] = 0;
-+#endif
-+
-+      MP_processor_info(&processor);
-+}
-+
-+#ifdef CONFIG_X86_IO_APIC
-+
-+#define MP_ISA_BUS            0
-+#define MP_MAX_IOAPIC_PIN     127
-+
-+static struct mp_ioapic_routing {
-+      int                     apic_id;
-+      int                     gsi_start;
-+      int                     gsi_end;
-+      u32                     pin_programmed[4];
-+} mp_ioapic_routing[MAX_IO_APICS];
-+
-+
-+static int mp_find_ioapic (
-+      int                     gsi)
-+{
-+      int                     i = 0;
-+
-+      /* Find the IOAPIC that manages this GSI. */
-+      for (i = 0; i < nr_ioapics; i++) {
-+              if ((gsi >= mp_ioapic_routing[i].gsi_start)
-+                      && (gsi <= mp_ioapic_routing[i].gsi_end))
-+                      return i;
-+      }
-+
-+      printk(KERN_ERR "ERROR: Unable to locate IOAPIC for GSI %d\n", gsi);
-+
-+      return -1;
-+}
-+      
-+
-+void __init mp_register_ioapic (
-+      u8                      id, 
-+      u32                     address,
-+      u32                     gsi_base)
-+{
-+      int                     idx = 0;
-+
-+      if (nr_ioapics >= MAX_IO_APICS) {
-+              printk(KERN_ERR "ERROR: Max # of I/O APICs (%d) exceeded "
-+                      "(found %d)\n", MAX_IO_APICS, nr_ioapics);
-+              panic("Recompile kernel with bigger MAX_IO_APICS!\n");
-+      }
-+      if (!address) {
-+              printk(KERN_ERR "WARNING: Bogus (zero) I/O APIC address"
-+                      " found in MADT table, skipping!\n");
-+              return;
-+      }
-+
-+      idx = nr_ioapics++;
-+
-+      mp_ioapics[idx].mpc_type = MP_IOAPIC;
-+      mp_ioapics[idx].mpc_flags = MPC_APIC_USABLE;
-+      mp_ioapics[idx].mpc_apicaddr = address;
-+
-+#ifndef CONFIG_XEN
-+      set_fixmap_nocache(FIX_IO_APIC_BASE_0 + idx, address);
-+#endif
-+      mp_ioapics[idx].mpc_apicid = id;
-+      mp_ioapics[idx].mpc_apicver = io_apic_get_version(idx);
-+      
-+      /* 
-+       * Build basic IRQ lookup table to facilitate gsi->io_apic lookups
-+       * and to prevent reprogramming of IOAPIC pins (PCI IRQs).
-+       */
-+      mp_ioapic_routing[idx].apic_id = mp_ioapics[idx].mpc_apicid;
-+      mp_ioapic_routing[idx].gsi_start = gsi_base;
-+      mp_ioapic_routing[idx].gsi_end = gsi_base + 
-+              io_apic_get_redir_entries(idx);
-+
-+      printk(KERN_INFO "IOAPIC[%d]: apic_id %d, version %d, address 0x%x, "
-+              "GSI %d-%d\n", idx, mp_ioapics[idx].mpc_apicid, 
-+              mp_ioapics[idx].mpc_apicver, mp_ioapics[idx].mpc_apicaddr,
-+              mp_ioapic_routing[idx].gsi_start,
-+              mp_ioapic_routing[idx].gsi_end);
-+
-+      return;
-+}
-+
-+
-+void __init mp_override_legacy_irq (
-+      u8                      bus_irq,
-+      u8                      polarity, 
-+      u8                      trigger, 
-+      u32                     gsi)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int                     ioapic = -1;
-+      int                     pin = -1;
-+
-+      /* 
-+       * Convert 'gsi' to 'ioapic.pin'.
-+       */
-+      ioapic = mp_find_ioapic(gsi);
-+      if (ioapic < 0)
-+              return;
-+      pin = gsi - mp_ioapic_routing[ioapic].gsi_start;
-+
-+      /*
-+       * TBD: This check is for faulty timer entries, where the override
-+       *      erroneously sets the trigger to level, resulting in a HUGE 
-+       *      increase of timer interrupts!
-+       */
-+      if ((bus_irq == 0) && (trigger == 3))
-+              trigger = 1;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqtype = mp_INT;
-+      intsrc.mpc_irqflag = (trigger << 2) | polarity;
-+      intsrc.mpc_srcbus = MP_ISA_BUS;
-+      intsrc.mpc_srcbusirq = bus_irq;                                /* IRQ */
-+      intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;        /* APIC ID */
-+      intsrc.mpc_dstirq = pin;                                    /* INTIN# */
-+
-+      Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, %d-%d\n", 
-+              intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-+              (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-+              intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, intsrc.mpc_dstirq);
-+
-+      mp_irqs[mp_irq_entries] = intsrc;
-+      if (++mp_irq_entries == MAX_IRQ_SOURCES)
-+              panic("Max # of irq sources exceeded!\n");
-+
-+      return;
-+}
-+
-+
-+void __init mp_config_acpi_legacy_irqs (void)
-+{
-+      struct mpc_config_intsrc intsrc;
-+      int                     i = 0;
-+      int                     ioapic = -1;
-+
-+      /* 
-+       * Fabricate the legacy ISA bus (bus #31).
-+       */
-+      mp_bus_id_to_type[MP_ISA_BUS] = MP_BUS_ISA;
-+      Dprintk("Bus #%d is ISA\n", MP_ISA_BUS);
-+
-+      /* 
-+       * Locate the IOAPIC that manages the ISA IRQs (0-15). 
-+       */
-+      ioapic = mp_find_ioapic(0);
-+      if (ioapic < 0)
-+              return;
-+
-+      intsrc.mpc_type = MP_INTSRC;
-+      intsrc.mpc_irqflag = 0;                                 /* Conforming */
-+      intsrc.mpc_srcbus = MP_ISA_BUS;
-+      intsrc.mpc_dstapic = mp_ioapics[ioapic].mpc_apicid;
-+
-+      /* 
-+       * Use the default configuration for the IRQs 0-15.  Unless
-+       * overridden by (MADT) interrupt source override entries.
-+       */
-+      for (i = 0; i < 16; i++) {
-+              int idx;
-+
-+              for (idx = 0; idx < mp_irq_entries; idx++) {
-+                      struct mpc_config_intsrc *irq = mp_irqs + idx;
-+
-+                      /* Do we already have a mapping for this ISA IRQ? */
-+                      if (irq->mpc_srcbus == MP_ISA_BUS && irq->mpc_srcbusirq == i)
-+                              break;
-+
-+                      /* Do we already have a mapping for this IOAPIC pin */
-+                      if ((irq->mpc_dstapic == intsrc.mpc_dstapic) &&
-+                              (irq->mpc_dstirq == i))
-+                              break;
-+              }
-+
-+              if (idx != mp_irq_entries) {
-+                      printk(KERN_DEBUG "ACPI: IRQ%d used by override.\n", i);
-+                      continue;                       /* IRQ already used */
-+              }
-+
-+              intsrc.mpc_irqtype = mp_INT;
-+              intsrc.mpc_srcbusirq = i;                  /* Identity mapped */
-+              intsrc.mpc_dstirq = i;
-+
-+              Dprintk("Int: type %d, pol %d, trig %d, bus %d, irq %d, "
-+                      "%d-%d\n", intsrc.mpc_irqtype, intsrc.mpc_irqflag & 3, 
-+                      (intsrc.mpc_irqflag >> 2) & 3, intsrc.mpc_srcbus, 
-+                      intsrc.mpc_srcbusirq, intsrc.mpc_dstapic, 
-+                      intsrc.mpc_dstirq);
-+
-+              mp_irqs[mp_irq_entries] = intsrc;
-+              if (++mp_irq_entries == MAX_IRQ_SOURCES)
-+                      panic("Max # of irq sources exceeded!\n");
-+      }
-+
-+      return;
-+}
-+
-+#define MAX_GSI_NUM   4096
-+
-+int mp_register_gsi(u32 gsi, int triggering, int polarity)
-+{
-+      int                     ioapic = -1;
-+      int                     ioapic_pin = 0;
-+      int                     idx, bit = 0;
-+      static int              pci_irq = 16;
-+      /*
-+       * Mapping between Global System Interrupts, which
-+       * represent all possible interrupts, to the IRQs
-+       * assigned to actual devices.
-+       */
-+      static int              gsi_to_irq[MAX_GSI_NUM];
-+
-+      if (acpi_irq_model != ACPI_IRQ_MODEL_IOAPIC)
-+              return gsi;
-+
-+      /* Don't set up the ACPI SCI because it's already set up */
-+      if (acpi_fadt.sci_int == gsi)
-+              return gsi;
-+
-+      ioapic = mp_find_ioapic(gsi);
-+      if (ioapic < 0) {
-+              printk(KERN_WARNING "No IOAPIC for GSI %u\n", gsi);
-+              return gsi;
-+      }
-+
-+      ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_start;
-+
-+      /* 
-+       * Avoid pin reprogramming.  PRTs typically include entries  
-+       * with redundant pin->gsi mappings (but unique PCI devices);
-+       * we only program the IOAPIC on the first.
-+       */
-+      bit = ioapic_pin % 32;
-+      idx = (ioapic_pin < 32) ? 0 : (ioapic_pin / 32);
-+      if (idx > 3) {
-+              printk(KERN_ERR "Invalid reference to IOAPIC pin "
-+                      "%d-%d\n", mp_ioapic_routing[ioapic].apic_id, 
-+                      ioapic_pin);
-+              return gsi;
-+      }
-+      if ((1<<bit) & mp_ioapic_routing[ioapic].pin_programmed[idx]) {
-+              Dprintk(KERN_DEBUG "Pin %d-%d already programmed\n",
-+                      mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
-+              return gsi_to_irq[gsi];
-+      }
-+
-+      mp_ioapic_routing[ioapic].pin_programmed[idx] |= (1<<bit);
-+
-+      if (triggering == ACPI_LEVEL_SENSITIVE) {
-+              /*
-+               * For PCI devices assign IRQs in order, avoiding gaps
-+               * due to unused I/O APIC pins.
-+               */
-+              int irq = gsi;
-+              if (gsi < MAX_GSI_NUM) {
-+                      /*
-+                       * Retain the VIA chipset work-around (gsi > 15), but
-+                       * avoid a problem where the 8254 timer (IRQ0) is setup
-+                       * via an override (so it's not on pin 0 of the ioapic),
-+                       * and at the same time, the pin 0 interrupt is a PCI
-+                       * type.  The gsi > 15 test could cause these two pins
-+                       * to be shared as IRQ0, and they are not shareable.
-+                       * So test for this condition, and if necessary, avoid
-+                       * the pin collision.
-+                       */
-+                      if (gsi > 15 || (gsi == 0 && !timer_uses_ioapic_pin_0))
-+                              gsi = pci_irq++;
-+                      /*
-+                       * Don't assign IRQ used by ACPI SCI
-+                       */
-+                      if (gsi == acpi_fadt.sci_int)
-+                              gsi = pci_irq++;
-+                      gsi_to_irq[irq] = gsi;
-+              } else {
-+                      printk(KERN_ERR "GSI %u is too high\n", gsi);
-+                      return gsi;
-+              }
-+      }
-+
-+      io_apic_set_pci_routing(ioapic, ioapic_pin, gsi,
-+              triggering == ACPI_EDGE_SENSITIVE ? 0 : 1,
-+              polarity == ACPI_ACTIVE_HIGH ? 0 : 1);
-+      return gsi;
-+}
-+
-+#endif /*CONFIG_X86_IO_APIC*/
-+#endif /*CONFIG_ACPI*/
-Index: head-2008-11-25/arch/x86/kernel/process_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/process_64-xen.c   2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,848 @@
-+/*
-+ *  linux/arch/x86-64/kernel/process.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *
-+ *  Pentium III FXSR, SSE support
-+ *    Gareth Hughes <gareth@valinux.com>, May 2000
-+ * 
-+ *  X86-64 port
-+ *    Andi Kleen.
-+ *
-+ *    CPU hotplug support - ashok.raj@intel.com
-+ * 
-+ *  Jun Nakajima <jun.nakajima@intel.com> 
-+ *     Modified for Xen
-+ */
-+
-+/*
-+ * This file handles the architecture-dependent parts of process handling..
-+ */
-+
-+#include <stdarg.h>
-+
-+#include <linux/cpu.h>
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/elfcore.h>
-+#include <linux/smp.h>
-+#include <linux/slab.h>
-+#include <linux/user.h>
-+#include <linux/module.h>
-+#include <linux/a.out.h>
-+#include <linux/interrupt.h>
-+#include <linux/delay.h>
-+#include <linux/ptrace.h>
-+#include <linux/utsname.h>
-+#include <linux/random.h>
-+#include <linux/notifier.h>
-+#include <linux/kprobes.h>
-+
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/processor.h>
-+#include <asm/i387.h>
-+#include <asm/mmu_context.h>
-+#include <asm/pda.h>
-+#include <asm/prctl.h>
-+#include <asm/kdebug.h>
-+#include <xen/interface/platform.h>
-+#include <xen/interface/physdev.h>
-+#include <xen/interface/vcpu.h>
-+#include <asm/desc.h>
-+#include <asm/proto.h>
-+#include <asm/hardirq.h>
-+#include <asm/ia32.h>
-+#include <asm/idle.h>
-+
-+#include <xen/cpu_hotplug.h>
-+
-+asmlinkage extern void ret_from_fork(void);
-+
-+unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
-+
-+unsigned long boot_option_idle_override = 0;
-+EXPORT_SYMBOL(boot_option_idle_override);
-+
-+/*
-+ * Powermanagement idle function, if any..
-+ */
-+void (*pm_idle)(void);
-+EXPORT_SYMBOL(pm_idle);
-+static DEFINE_PER_CPU(unsigned int, cpu_idle_state);
-+
-+static ATOMIC_NOTIFIER_HEAD(idle_notifier);
-+
-+void idle_notifier_register(struct notifier_block *n)
-+{
-+      atomic_notifier_chain_register(&idle_notifier, n);
-+}
-+EXPORT_SYMBOL_GPL(idle_notifier_register);
-+
-+void idle_notifier_unregister(struct notifier_block *n)
-+{
-+      atomic_notifier_chain_unregister(&idle_notifier, n);
-+}
-+EXPORT_SYMBOL(idle_notifier_unregister);
-+
-+enum idle_state { CPU_IDLE, CPU_NOT_IDLE };
-+static DEFINE_PER_CPU(enum idle_state, idle_state) = CPU_NOT_IDLE;
-+
-+void enter_idle(void)
-+{
-+      __get_cpu_var(idle_state) = CPU_IDLE;
-+      atomic_notifier_call_chain(&idle_notifier, IDLE_START, NULL);
-+}
-+
-+static void __exit_idle(void)
-+{
-+      __get_cpu_var(idle_state) = CPU_NOT_IDLE;
-+      atomic_notifier_call_chain(&idle_notifier, IDLE_END, NULL);
-+}
-+
-+/* Called from interrupts to signify idle end */
-+void exit_idle(void)
-+{
-+      if (current->pid | read_pda(irqcount))
-+              return;
-+      __exit_idle();
-+}
-+
-+/*
-+ * On SMP it's slightly faster (but much more power-consuming!)
-+ * to poll the ->need_resched flag instead of waiting for the
-+ * cross-CPU IPI to arrive. Use this option with caution.
-+ */
-+static void poll_idle (void)
-+{
-+      local_irq_enable();
-+
-+      asm volatile(
-+              "2:"
-+              "testl %0,%1;"
-+              "rep; nop;"
-+              "je 2b;"
-+              : :
-+              "i" (_TIF_NEED_RESCHED),
-+              "m" (current_thread_info()->flags));
-+}
-+
-+static void xen_idle(void)
-+{
-+      local_irq_disable();
-+
-+      if (need_resched())
-+              local_irq_enable();
-+      else {
-+              current_thread_info()->status &= ~TS_POLLING;
-+              smp_mb__after_clear_bit();
-+              safe_halt();
-+              current_thread_info()->status |= TS_POLLING;
-+      }
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+static inline void play_dead(void)
-+{
-+      idle_task_exit();
-+      local_irq_disable();
-+      cpu_clear(smp_processor_id(), cpu_initialized);
-+      preempt_enable_no_resched();
-+      VOID(HYPERVISOR_vcpu_op(VCPUOP_down, smp_processor_id(), NULL));
-+      cpu_bringup();
-+}
-+#else
-+static inline void play_dead(void)
-+{
-+      BUG();
-+}
-+#endif /* CONFIG_HOTPLUG_CPU */
-+
-+/*
-+ * The idle thread. There's no useful work to be
-+ * done, so just try to conserve power and have a
-+ * low exit latency (ie sit in a loop waiting for
-+ * somebody to say that they'd like to reschedule)
-+ */
-+void cpu_idle (void)
-+{
-+      current_thread_info()->status |= TS_POLLING;
-+      /* endless idle loop with no priority at all */
-+      while (1) {
-+              while (!need_resched()) {
-+                      void (*idle)(void);
-+
-+                      if (__get_cpu_var(cpu_idle_state))
-+                              __get_cpu_var(cpu_idle_state) = 0;
-+                      rmb();
-+                      idle = xen_idle; /* no alternatives */
-+                      if (cpu_is_offline(smp_processor_id()))
-+                              play_dead();
-+                      enter_idle();
-+                      idle();
-+                      __exit_idle();
-+              }
-+
-+              preempt_enable_no_resched();
-+              schedule();
-+              preempt_disable();
-+      }
-+}
-+
-+void cpu_idle_wait(void)
-+{
-+      unsigned int cpu, this_cpu = get_cpu();
-+      cpumask_t map;
-+
-+      set_cpus_allowed(current, cpumask_of_cpu(this_cpu));
-+      put_cpu();
-+
-+      cpus_clear(map);
-+      for_each_online_cpu(cpu) {
-+              per_cpu(cpu_idle_state, cpu) = 1;
-+              cpu_set(cpu, map);
-+      }
-+
-+      __get_cpu_var(cpu_idle_state) = 0;
-+
-+      wmb();
-+      do {
-+              ssleep(1);
-+              for_each_online_cpu(cpu) {
-+                      if (cpu_isset(cpu, map) &&
-+                                      !per_cpu(cpu_idle_state, cpu))
-+                              cpu_clear(cpu, map);
-+              }
-+              cpus_and(map, map, cpu_online_map);
-+      } while (!cpus_empty(map));
-+}
-+EXPORT_SYMBOL_GPL(cpu_idle_wait);
-+
-+void __cpuinit select_idle_routine(const struct cpuinfo_x86 *c) 
-+{
-+}
-+
-+static int __init idle_setup (char *str)
-+{
-+      if (!strncmp(str, "poll", 4)) {
-+              printk("using polling idle threads.\n");
-+              pm_idle = poll_idle;
-+      }
-+
-+      boot_option_idle_override = 1;
-+      return 1;
-+}
-+
-+__setup("idle=", idle_setup);
-+
-+/* Prints also some state that isn't saved in the pt_regs */ 
-+void __show_regs(struct pt_regs * regs)
-+{
-+      unsigned long fs, gs, shadowgs;
-+      unsigned int fsindex,gsindex;
-+      unsigned int ds,cs,es; 
-+
-+      printk("\n");
-+      print_modules();
-+      printk("Pid: %d, comm: %.20s %s %s %.*s\n",
-+              current->pid, current->comm, print_tainted(),
-+              system_utsname.release,
-+              (int)strcspn(system_utsname.version, " "),
-+              system_utsname.version);
-+      printk("RIP: %04lx:[<%016lx>] ", regs->cs & 0xffff, regs->rip);
-+      printk_address(regs->rip); 
-+      printk("RSP: %04lx:%016lx  EFLAGS: %08lx\n", regs->ss, regs->rsp,
-+              regs->eflags);
-+      printk("RAX: %016lx RBX: %016lx RCX: %016lx\n",
-+             regs->rax, regs->rbx, regs->rcx);
-+      printk("RDX: %016lx RSI: %016lx RDI: %016lx\n",
-+             regs->rdx, regs->rsi, regs->rdi); 
-+      printk("RBP: %016lx R08: %016lx R09: %016lx\n",
-+             regs->rbp, regs->r8, regs->r9); 
-+      printk("R10: %016lx R11: %016lx R12: %016lx\n",
-+             regs->r10, regs->r11, regs->r12); 
-+      printk("R13: %016lx R14: %016lx R15: %016lx\n",
-+             regs->r13, regs->r14, regs->r15); 
-+
-+      asm("mov %%ds,%0" : "=r" (ds)); 
-+      asm("mov %%cs,%0" : "=r" (cs)); 
-+      asm("mov %%es,%0" : "=r" (es)); 
-+      asm("mov %%fs,%0" : "=r" (fsindex));
-+      asm("mov %%gs,%0" : "=r" (gsindex));
-+
-+      rdmsrl(MSR_FS_BASE, fs);
-+      rdmsrl(MSR_GS_BASE, gs); 
-+      rdmsrl(MSR_KERNEL_GS_BASE, shadowgs); 
-+
-+      printk("FS:  %016lx(%04x) GS:%016lx(%04x) knlGS:%016lx\n", 
-+             fs,fsindex,gs,gsindex,shadowgs); 
-+      printk("CS:  %04x DS: %04x ES: %04x\n", cs, ds, es); 
-+
-+}
-+
-+void show_regs(struct pt_regs *regs)
-+{
-+      printk("CPU %d:", smp_processor_id());
-+      __show_regs(regs);
-+      show_trace(NULL, regs, (void *)(regs + 1));
-+}
-+
-+/*
-+ * Free current thread data structures etc..
-+ */
-+void exit_thread(void)
-+{
-+      struct task_struct *me = current;
-+      struct thread_struct *t = &me->thread;
-+
-+      if (me->thread.io_bitmap_ptr) { 
-+#ifndef CONFIG_X86_NO_TSS
-+              struct tss_struct *tss = &per_cpu(init_tss, get_cpu());
-+#endif
-+#ifdef CONFIG_XEN
-+              struct physdev_set_iobitmap iobmp_op;
-+              memset(&iobmp_op, 0, sizeof(iobmp_op));
-+#endif
-+
-+              kfree(t->io_bitmap_ptr);
-+              t->io_bitmap_ptr = NULL;
-+              /*
-+               * Careful, clear this in the TSS too:
-+               */
-+#ifndef CONFIG_X86_NO_TSS
-+              memset(tss->io_bitmap, 0xff, t->io_bitmap_max);
-+              put_cpu();
-+#endif
-+#ifdef CONFIG_XEN
-+              WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iobitmap,
-+                                            &iobmp_op));
-+#endif
-+              t->io_bitmap_max = 0;
-+      }
-+}
-+
-+void load_gs_index(unsigned gs)
-+{
-+      WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER_SEL, gs));
-+}
-+
-+void flush_thread(void)
-+{
-+      struct task_struct *tsk = current;
-+      struct thread_info *t = current_thread_info();
-+
-+      if (t->flags & _TIF_ABI_PENDING) {
-+              t->flags ^= (_TIF_ABI_PENDING | _TIF_IA32);
-+              if (t->flags & _TIF_IA32)
-+                      current_thread_info()->status |= TS_COMPAT;
-+      }
-+
-+      tsk->thread.debugreg0 = 0;
-+      tsk->thread.debugreg1 = 0;
-+      tsk->thread.debugreg2 = 0;
-+      tsk->thread.debugreg3 = 0;
-+      tsk->thread.debugreg6 = 0;
-+      tsk->thread.debugreg7 = 0;
-+      memset(tsk->thread.tls_array, 0, sizeof(tsk->thread.tls_array));        
-+      /*
-+       * Forget coprocessor state..
-+       */
-+      clear_fpu(tsk);
-+      clear_used_math();
-+}
-+
-+void release_thread(struct task_struct *dead_task)
-+{
-+      if (dead_task->mm) {
-+              if (dead_task->mm->context.size) {
-+                      printk("WARNING: dead process %8s still has LDT? <%p/%d>\n",
-+                                      dead_task->comm,
-+                                      dead_task->mm->context.ldt,
-+                                      dead_task->mm->context.size);
-+                      BUG();
-+              }
-+      }
-+}
-+
-+static inline void set_32bit_tls(struct task_struct *t, int tls, u32 addr)
-+{
-+      struct user_desc ud = { 
-+              .base_addr = addr,
-+              .limit = 0xfffff,
-+              .seg_32bit = 1,
-+              .limit_in_pages = 1,
-+              .useable = 1,
-+      };
-+      struct n_desc_struct *desc = (void *)t->thread.tls_array;
-+      desc += tls;
-+      desc->a = LDT_entry_a(&ud); 
-+      desc->b = LDT_entry_b(&ud); 
-+}
-+
-+static inline u32 read_32bit_tls(struct task_struct *t, int tls)
-+{
-+      struct desc_struct *desc = (void *)t->thread.tls_array;
-+      desc += tls;
-+      return desc->base0 | 
-+              (((u32)desc->base1) << 16) | 
-+              (((u32)desc->base2) << 24);
-+}
-+
-+/*
-+ * This gets called before we allocate a new thread and copy
-+ * the current task into it.
-+ */
-+void prepare_to_copy(struct task_struct *tsk)
-+{
-+      unlazy_fpu(tsk);
-+}
-+
-+int copy_thread(int nr, unsigned long clone_flags, unsigned long rsp, 
-+              unsigned long unused,
-+      struct task_struct * p, struct pt_regs * regs)
-+{
-+      int err;
-+      struct pt_regs * childregs;
-+      struct task_struct *me = current;
-+
-+      childregs = ((struct pt_regs *)
-+                      (THREAD_SIZE + task_stack_page(p))) - 1;
-+      *childregs = *regs;
-+
-+      childregs->rax = 0;
-+      childregs->rsp = rsp;
-+      if (rsp == ~0UL)
-+              childregs->rsp = (unsigned long)childregs;
-+
-+      p->thread.rsp = (unsigned long) childregs;
-+      p->thread.rsp0 = (unsigned long) (childregs+1);
-+      p->thread.userrsp = me->thread.userrsp; 
-+
-+      set_tsk_thread_flag(p, TIF_FORK);
-+
-+      p->thread.fs = me->thread.fs;
-+      p->thread.gs = me->thread.gs;
-+
-+      asm("mov %%gs,%0" : "=m" (p->thread.gsindex));
-+      asm("mov %%fs,%0" : "=m" (p->thread.fsindex));
-+      asm("mov %%es,%0" : "=m" (p->thread.es));
-+      asm("mov %%ds,%0" : "=m" (p->thread.ds));
-+
-+      if (unlikely(me->thread.io_bitmap_ptr != NULL)) { 
-+              p->thread.io_bitmap_ptr = kmalloc(IO_BITMAP_BYTES, GFP_KERNEL);
-+              if (!p->thread.io_bitmap_ptr) {
-+                      p->thread.io_bitmap_max = 0;
-+                      return -ENOMEM;
-+              }
-+              memcpy(p->thread.io_bitmap_ptr, me->thread.io_bitmap_ptr,
-+                              IO_BITMAP_BYTES);
-+      } 
-+
-+      /*
-+       * Set a new TLS for the child thread?
-+       */
-+      if (clone_flags & CLONE_SETTLS) {
-+#ifdef CONFIG_IA32_EMULATION
-+              if (test_thread_flag(TIF_IA32))
-+                      err = ia32_child_tls(p, childregs); 
-+              else                    
-+#endif         
-+                      err = do_arch_prctl(p, ARCH_SET_FS, childregs->r8); 
-+              if (err) 
-+                      goto out;
-+      }
-+        p->thread.iopl = current->thread.iopl;
-+
-+      err = 0;
-+out:
-+      if (err && p->thread.io_bitmap_ptr) {
-+              kfree(p->thread.io_bitmap_ptr);
-+              p->thread.io_bitmap_max = 0;
-+      }
-+      return err;
-+}
-+
-+static inline void __save_init_fpu( struct task_struct *tsk )
-+{
-+      asm volatile( "rex64 ; fxsave %0 ; fnclex"
-+                    : "=m" (tsk->thread.i387.fxsave));
-+      tsk->thread_info->status &= ~TS_USEDFPU;
-+}
-+
-+/*
-+ *    switch_to(x,y) should switch tasks from x to y.
-+ *
-+ * This could still be optimized: 
-+ * - fold all the options into a flag word and test it with a single test.
-+ * - could test fs/gs bitsliced
-+ *
-+ * Kprobes not supported here. Set the probe on schedule instead.
-+ */
-+__kprobes struct task_struct *
-+__switch_to(struct task_struct *prev_p, struct task_struct *next_p)
-+{
-+      struct thread_struct *prev = &prev_p->thread,
-+                               *next = &next_p->thread;
-+      int cpu = smp_processor_id();  
-+#ifndef CONFIG_X86_NO_TSS
-+      struct tss_struct *tss = &per_cpu(init_tss, cpu);
-+#endif
-+#if CONFIG_XEN_COMPAT > 0x030002
-+      struct physdev_set_iopl iopl_op;
-+      struct physdev_set_iobitmap iobmp_op;
-+#else
-+      struct physdev_op _pdo[2], *pdo = _pdo;
-+#define iopl_op pdo->u.set_iopl
-+#define iobmp_op pdo->u.set_iobitmap
-+#endif
-+      multicall_entry_t _mcl[8], *mcl = _mcl;
-+
-+      /*
-+       * This is basically '__unlazy_fpu', except that we queue a
-+       * multicall to indicate FPU task switch, rather than
-+       * synchronously trapping to Xen.
-+       * The AMD workaround requires it to be after DS reload, or
-+       * after DS has been cleared, which we do in __prepare_arch_switch.
-+       */
-+      if (prev_p->thread_info->status & TS_USEDFPU) {
-+              __save_init_fpu(prev_p); /* _not_ save_init_fpu() */
-+              mcl->op      = __HYPERVISOR_fpu_taskswitch;
-+              mcl->args[0] = 1;
-+              mcl++;
-+      }
-+
-+      /*
-+       * Reload esp0, LDT and the page table pointer:
-+       */
-+      mcl->op      = __HYPERVISOR_stack_switch;
-+      mcl->args[0] = __KERNEL_DS;
-+      mcl->args[1] = next->rsp0;
-+      mcl++;
-+
-+      /*
-+       * Load the per-thread Thread-Local Storage descriptor.
-+       * This is load_TLS(next, cpu) with multicalls.
-+       */
-+#define C(i) do {                                                     \
-+      if (unlikely(next->tls_array[i] != prev->tls_array[i])) {       \
-+              mcl->op      = __HYPERVISOR_update_descriptor;          \
-+              mcl->args[0] = virt_to_machine(                         \
-+                      &cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + i]);          \
-+              mcl->args[1] = next->tls_array[i];                      \
-+              mcl++;                                                  \
-+      }                                                               \
-+} while (0)
-+      C(0); C(1); C(2);
-+#undef C
-+
-+      if (unlikely(prev->iopl != next->iopl)) {
-+              iopl_op.iopl = (next->iopl == 0) ? 1 : next->iopl;
-+#if CONFIG_XEN_COMPAT > 0x030002
-+              mcl->op      = __HYPERVISOR_physdev_op;
-+              mcl->args[0] = PHYSDEVOP_set_iopl;
-+              mcl->args[1] = (unsigned long)&iopl_op;
-+#else
-+              mcl->op      = __HYPERVISOR_physdev_op_compat;
-+              pdo->cmd     = PHYSDEVOP_set_iopl;
-+              mcl->args[0] = (unsigned long)pdo++;
-+#endif
-+              mcl++;
-+      }
-+
-+      if (unlikely(prev->io_bitmap_ptr || next->io_bitmap_ptr)) {
-+              set_xen_guest_handle(iobmp_op.bitmap,
-+                                   (char *)next->io_bitmap_ptr);
-+              iobmp_op.nr_ports = next->io_bitmap_ptr ? IO_BITMAP_BITS : 0;
-+#if CONFIG_XEN_COMPAT > 0x030002
-+              mcl->op      = __HYPERVISOR_physdev_op;
-+              mcl->args[0] = PHYSDEVOP_set_iobitmap;
-+              mcl->args[1] = (unsigned long)&iobmp_op;
-+#else
-+              mcl->op      = __HYPERVISOR_physdev_op_compat;
-+              pdo->cmd     = PHYSDEVOP_set_iobitmap;
-+              mcl->args[0] = (unsigned long)pdo++;
-+#endif
-+              mcl++;
-+      }
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      BUG_ON(pdo > _pdo + ARRAY_SIZE(_pdo));
-+#endif
-+      BUG_ON(mcl > _mcl + ARRAY_SIZE(_mcl));
-+      if (unlikely(HYPERVISOR_multicall_check(_mcl, mcl - _mcl, NULL)))
-+              BUG();
-+
-+      /* 
-+       * Switch DS and ES.
-+       * This won't pick up thread selector changes, but I guess that is ok.
-+       */
-+      if (unlikely(next->es))
-+              loadsegment(es, next->es); 
-+      
-+      if (unlikely(next->ds))
-+              loadsegment(ds, next->ds);
-+
-+      /* 
-+       * Switch FS and GS.
-+       */
-+      if (unlikely(next->fsindex))
-+              loadsegment(fs, next->fsindex);
-+
-+      if (next->fs)
-+              WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_FS, next->fs));
-+      
-+      if (unlikely(next->gsindex))
-+              load_gs_index(next->gsindex);
-+
-+      if (next->gs)
-+              WARN_ON(HYPERVISOR_set_segment_base(SEGBASE_GS_USER, next->gs));
-+
-+      /* 
-+       * Switch the PDA context.
-+       */
-+      prev->userrsp = read_pda(oldrsp); 
-+      write_pda(oldrsp, next->userrsp); 
-+      write_pda(pcurrent, next_p); 
-+      write_pda(kernelstack,
-+                task_stack_page(next_p) + THREAD_SIZE - PDA_STACKOFFSET);
-+
-+      /*
-+       * Now maybe reload the debug registers
-+       */
-+      if (unlikely(next->debugreg7)) {
-+              set_debugreg(next->debugreg0, 0);
-+              set_debugreg(next->debugreg1, 1);
-+              set_debugreg(next->debugreg2, 2);
-+              set_debugreg(next->debugreg3, 3);
-+              /* no 4 and 5 */
-+              set_debugreg(next->debugreg6, 6);
-+              set_debugreg(next->debugreg7, 7);
-+      }
-+
-+      return prev_p;
-+}
-+
-+/*
-+ * sys_execve() executes a new program.
-+ */
-+asmlinkage 
-+long sys_execve(char __user *name, char __user * __user *argv,
-+              char __user * __user *envp, struct pt_regs regs)
-+{
-+      long error;
-+      char * filename;
-+
-+      filename = getname(name);
-+      error = PTR_ERR(filename);
-+      if (IS_ERR(filename)) 
-+              return error;
-+      error = do_execve(filename, argv, envp, &regs); 
-+      if (error == 0) {
-+              task_lock(current);
-+              current->ptrace &= ~PT_DTRACE;
-+              task_unlock(current);
-+      }
-+      putname(filename);
-+      return error;
-+}
-+
-+void set_personality_64bit(void)
-+{
-+      /* inherit personality from parent */
-+
-+      /* Make sure to be in 64bit mode */
-+      clear_thread_flag(TIF_IA32); 
-+
-+      /* TBD: overwrites user setup. Should have two bits.
-+         But 64bit processes have always behaved this way,
-+         so it's not too bad. The main problem is just that
-+         32bit childs are affected again. */
-+      current->personality &= ~READ_IMPLIES_EXEC;
-+}
-+
-+asmlinkage long sys_fork(struct pt_regs *regs)
-+{
-+      return do_fork(SIGCHLD, regs->rsp, regs, 0, NULL, NULL);
-+}
-+
-+asmlinkage long
-+sys_clone(unsigned long clone_flags, unsigned long newsp,
-+        void __user *parent_tid, void __user *child_tid, struct pt_regs *regs)
-+{
-+      if (!newsp)
-+              newsp = regs->rsp;
-+      return do_fork(clone_flags, newsp, regs, 0, parent_tid, child_tid);
-+}
-+
-+/*
-+ * This is trivial, and on the face of it looks like it
-+ * could equally well be done in user mode.
-+ *
-+ * Not so, for quite unobvious reasons - register pressure.
-+ * In user mode vfork() cannot have a stack frame, and if
-+ * done by calling the "clone()" system call directly, you
-+ * do not have enough call-clobbered registers to hold all
-+ * the information you need.
-+ */
-+asmlinkage long sys_vfork(struct pt_regs *regs)
-+{
-+      return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->rsp, regs, 0,
-+                  NULL, NULL);
-+}
-+
-+unsigned long get_wchan(struct task_struct *p)
-+{
-+      unsigned long stack;
-+      u64 fp,rip;
-+      int count = 0;
-+
-+      if (!p || p == current || p->state==TASK_RUNNING)
-+              return 0; 
-+      stack = (unsigned long)task_stack_page(p);
-+      if (p->thread.rsp < stack || p->thread.rsp > stack+THREAD_SIZE)
-+              return 0;
-+      fp = *(u64 *)(p->thread.rsp);
-+      do { 
-+              if (fp < (unsigned long)stack ||
-+                  fp > (unsigned long)stack+THREAD_SIZE)
-+                      return 0; 
-+              rip = *(u64 *)(fp+8); 
-+              if (!in_sched_functions(rip))
-+                      return rip; 
-+              fp = *(u64 *)fp; 
-+      } while (count++ < 16); 
-+      return 0;
-+}
-+
-+long do_arch_prctl(struct task_struct *task, int code, unsigned long addr)
-+{ 
-+      int ret = 0; 
-+      int doit = task == current;
-+      int cpu;
-+
-+      switch (code) { 
-+      case ARCH_SET_GS:
-+              if (addr >= TASK_SIZE_OF(task))
-+                      return -EPERM; 
-+              cpu = get_cpu();
-+              /* handle small bases via the GDT because that's faster to 
-+                 switch. */
-+              if (addr <= 0xffffffff) {  
-+                      set_32bit_tls(task, GS_TLS, addr); 
-+                      if (doit) { 
-+                              load_TLS(&task->thread, cpu);
-+                              load_gs_index(GS_TLS_SEL); 
-+                      }
-+                      task->thread.gsindex = GS_TLS_SEL; 
-+                      task->thread.gs = 0;
-+              } else { 
-+                      task->thread.gsindex = 0;
-+                      task->thread.gs = addr;
-+                      if (doit) {
-+                              load_gs_index(0);
-+                              ret = HYPERVISOR_set_segment_base(
-+                                      SEGBASE_GS_USER, addr);
-+                      } 
-+              }
-+              put_cpu();
-+              break;
-+      case ARCH_SET_FS:
-+              /* Not strictly needed for fs, but do it for symmetry
-+                 with gs */
-+              if (addr >= TASK_SIZE_OF(task))
-+                      return -EPERM; 
-+              cpu = get_cpu();
-+              /* handle small bases via the GDT because that's faster to 
-+                 switch. */
-+              if (addr <= 0xffffffff) { 
-+                      set_32bit_tls(task, FS_TLS, addr);
-+                      if (doit) { 
-+                              load_TLS(&task->thread, cpu); 
-+                              asm volatile("movl %0,%%fs" :: "r"(FS_TLS_SEL));
-+                      }
-+                      task->thread.fsindex = FS_TLS_SEL;
-+                      task->thread.fs = 0;
-+              } else { 
-+                      task->thread.fsindex = 0;
-+                      task->thread.fs = addr;
-+                      if (doit) {
-+                              /* set the selector to 0 to not confuse
-+                                 __switch_to */
-+                              asm volatile("movl %0,%%fs" :: "r" (0));
-+                                ret = HYPERVISOR_set_segment_base(SEGBASE_FS,
-+                                                                addr);
-+                      }
-+              }
-+              put_cpu();
-+              break;
-+      case ARCH_GET_FS: { 
-+              unsigned long base; 
-+              if (task->thread.fsindex == FS_TLS_SEL)
-+                      base = read_32bit_tls(task, FS_TLS);
-+              else if (doit)
-+                      rdmsrl(MSR_FS_BASE, base);
-+              else
-+                      base = task->thread.fs;
-+              ret = put_user(base, (unsigned long __user *)addr); 
-+              break; 
-+      }
-+      case ARCH_GET_GS: { 
-+              unsigned long base;
-+              unsigned gsindex;
-+              if (task->thread.gsindex == GS_TLS_SEL)
-+                      base = read_32bit_tls(task, GS_TLS);
-+              else if (doit) {
-+                      asm("movl %%gs,%0" : "=r" (gsindex));
-+                      if (gsindex)
-+                              rdmsrl(MSR_KERNEL_GS_BASE, base);
-+                      else
-+                              base = task->thread.gs;
-+              }
-+              else
-+                      base = task->thread.gs;
-+              ret = put_user(base, (unsigned long __user *)addr); 
-+              break;
-+      }
-+
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      } 
-+
-+      return ret;     
-+} 
-+
-+long sys_arch_prctl(int code, unsigned long addr)
-+{
-+      return do_arch_prctl(current, code, addr);
-+} 
-+
-+/* 
-+ * Capture the user space registers if the task is not running (in user space)
-+ */
-+int dump_task_regs(struct task_struct *tsk, elf_gregset_t *regs)
-+{
-+      struct pt_regs *pp, ptregs;
-+
-+      pp = task_pt_regs(tsk);
-+
-+      ptregs = *pp; 
-+      ptregs.cs &= 0xffff;
-+      ptregs.ss &= 0xffff;
-+
-+      elf_core_copy_regs(regs, &ptregs);
-+ 
-+        boot_option_idle_override = 1;
-+      return 1;
-+}
-+
-+unsigned long arch_align_stack(unsigned long sp)
-+{
-+      if (randomize_va_space)
-+              sp -= get_random_int() % 8192;
-+      return sp & ~0xf;
-+}
-Index: head-2008-11-25/arch/x86/kernel/setup_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/setup_64-xen.c     2008-04-22 15:41:51.000000000 +0200
-@@ -0,0 +1,1652 @@
-+/*
-+ *  linux/arch/x86-64/kernel/setup.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *
-+ *  Nov 2001 Dave Jones <davej@suse.de>
-+ *  Forked from i386 setup code.
-+ */
-+
-+/*
-+ * This file handles the architecture-dependent parts of initialization
-+ */
-+
-+#include <linux/errno.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/stddef.h>
-+#include <linux/unistd.h>
-+#include <linux/ptrace.h>
-+#include <linux/slab.h>
-+#include <linux/user.h>
-+#include <linux/a.out.h>
-+#include <linux/screen_info.h>
-+#include <linux/ioport.h>
-+#include <linux/delay.h>
-+#include <linux/init.h>
-+#include <linux/initrd.h>
-+#include <linux/highmem.h>
-+#include <linux/bootmem.h>
-+#include <linux/module.h>
-+#include <asm/processor.h>
-+#include <linux/console.h>
-+#include <linux/seq_file.h>
-+#include <linux/crash_dump.h>
-+#include <linux/root_dev.h>
-+#include <linux/pci.h>
-+#include <linux/acpi.h>
-+#include <linux/kallsyms.h>
-+#include <linux/edd.h>
-+#include <linux/mmzone.h>
-+#include <linux/kexec.h>
-+#include <linux/cpufreq.h>
-+#include <linux/dmi.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/ctype.h>
-+
-+#include <asm/mtrr.h>
-+#include <asm/uaccess.h>
-+#include <asm/system.h>
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+#include <asm/msr.h>
-+#include <asm/desc.h>
-+#include <video/edid.h>
-+#include <asm/e820.h>
-+#include <asm/dma.h>
-+#include <asm/mpspec.h>
-+#include <asm/mmu_context.h>
-+#include <asm/bootsetup.h>
-+#include <asm/proto.h>
-+#include <asm/setup.h>
-+#include <asm/mach_apic.h>
-+#include <asm/numa.h>
-+#include <asm/sections.h>
-+#include <asm/dmi.h>
-+#ifdef CONFIG_XEN
-+#include <linux/percpu.h>
-+#include <xen/interface/physdev.h>
-+#include "setup_arch_pre.h"
-+#include <asm/hypervisor.h>
-+#include <xen/interface/nmi.h>
-+#include <xen/features.h>
-+#include <xen/firmware.h>
-+#include <xen/xencons.h>
-+#define PFN_UP(x)       (((x) + PAGE_SIZE-1) >> PAGE_SHIFT)
-+#define PFN_PHYS(x)     ((x) << PAGE_SHIFT)
-+#include <asm/mach-xen/setup_arch_post.h>
-+#include <xen/interface/memory.h>
-+
-+#ifdef CONFIG_XEN
-+#include <xen/interface/kexec.h>
-+#endif
-+
-+extern unsigned long start_pfn;
-+extern struct edid_info edid_info;
-+
-+shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-+EXPORT_SYMBOL(HYPERVISOR_shared_info);
-+
-+extern char hypercall_page[PAGE_SIZE];
-+EXPORT_SYMBOL(hypercall_page);
-+
-+static int xen_panic_event(struct notifier_block *, unsigned long, void *);
-+static struct notifier_block xen_panic_block = {
-+      xen_panic_event, NULL, 0 /* try to go last */
-+};
-+
-+unsigned long *phys_to_machine_mapping;
-+unsigned long *pfn_to_mfn_frame_list_list, *pfn_to_mfn_frame_list[512];
-+
-+EXPORT_SYMBOL(phys_to_machine_mapping);
-+
-+DEFINE_PER_CPU(multicall_entry_t, multicall_list[8]);
-+DEFINE_PER_CPU(int, nr_multicall_ents);
-+
-+/* Raw start-of-day parameters from the hypervisor. */
-+start_info_t *xen_start_info;
-+EXPORT_SYMBOL(xen_start_info);
-+#endif
-+
-+/*
-+ * Machine setup..
-+ */
-+
-+struct cpuinfo_x86 boot_cpu_data __read_mostly;
-+EXPORT_SYMBOL(boot_cpu_data);
-+
-+unsigned long mmu_cr4_features;
-+
-+int acpi_disabled;
-+EXPORT_SYMBOL(acpi_disabled);
-+#ifdef        CONFIG_ACPI
-+extern int __initdata acpi_ht;
-+extern acpi_interrupt_flags   acpi_sci_flags;
-+int __initdata acpi_force = 0;
-+#endif
-+
-+int acpi_numa __initdata;
-+
-+/* Boot loader ID as an integer, for the benefit of proc_dointvec */
-+int bootloader_type;
-+
-+unsigned long saved_video_mode;
-+
-+/* 
-+ * Early DMI memory
-+ */
-+int dmi_alloc_index;
-+char dmi_alloc_data[DMI_MAX_DATA];
-+
-+/*
-+ * Setup options
-+ */
-+struct screen_info screen_info;
-+EXPORT_SYMBOL(screen_info);
-+struct sys_desc_table_struct {
-+      unsigned short length;
-+      unsigned char table[0];
-+};
-+
-+struct edid_info edid_info;
-+EXPORT_SYMBOL_GPL(edid_info);
-+struct e820map e820;
-+#ifdef CONFIG_XEN
-+struct e820map machine_e820;
-+#endif
-+
-+extern int root_mountflags;
-+
-+char command_line[COMMAND_LINE_SIZE];
-+
-+struct resource standard_io_resources[] = {
-+      { .name = "dma1", .start = 0x00, .end = 0x1f,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "pic1", .start = 0x20, .end = 0x21,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "timer0", .start = 0x40, .end = 0x43,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "timer1", .start = 0x50, .end = 0x53,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "keyboard", .start = 0x60, .end = 0x6f,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "dma page reg", .start = 0x80, .end = 0x8f,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "pic2", .start = 0xa0, .end = 0xa1,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "dma2", .start = 0xc0, .end = 0xdf,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO },
-+      { .name = "fpu", .start = 0xf0, .end = 0xff,
-+              .flags = IORESOURCE_BUSY | IORESOURCE_IO }
-+};
-+
-+#define STANDARD_IO_RESOURCES \
-+      (sizeof standard_io_resources / sizeof standard_io_resources[0])
-+
-+#define IORESOURCE_RAM (IORESOURCE_BUSY | IORESOURCE_MEM)
-+
-+struct resource data_resource = {
-+      .name = "Kernel data",
-+      .start = 0,
-+      .end = 0,
-+      .flags = IORESOURCE_RAM,
-+};
-+struct resource code_resource = {
-+      .name = "Kernel code",
-+      .start = 0,
-+      .end = 0,
-+      .flags = IORESOURCE_RAM,
-+};
-+
-+#define IORESOURCE_ROM (IORESOURCE_BUSY | IORESOURCE_READONLY | IORESOURCE_MEM)
-+
-+static struct resource system_rom_resource = {
-+      .name = "System ROM",
-+      .start = 0xf0000,
-+      .end = 0xfffff,
-+      .flags = IORESOURCE_ROM,
-+};
-+
-+static struct resource extension_rom_resource = {
-+      .name = "Extension ROM",
-+      .start = 0xe0000,
-+      .end = 0xeffff,
-+      .flags = IORESOURCE_ROM,
-+};
-+
-+static struct resource adapter_rom_resources[] = {
-+      { .name = "Adapter ROM", .start = 0xc8000, .end = 0,
-+              .flags = IORESOURCE_ROM },
-+      { .name = "Adapter ROM", .start = 0, .end = 0,
-+              .flags = IORESOURCE_ROM },
-+      { .name = "Adapter ROM", .start = 0, .end = 0,
-+              .flags = IORESOURCE_ROM },
-+      { .name = "Adapter ROM", .start = 0, .end = 0,
-+              .flags = IORESOURCE_ROM },
-+      { .name = "Adapter ROM", .start = 0, .end = 0,
-+              .flags = IORESOURCE_ROM },
-+      { .name = "Adapter ROM", .start = 0, .end = 0,
-+              .flags = IORESOURCE_ROM }
-+};
-+
-+#define ADAPTER_ROM_RESOURCES \
-+      (sizeof adapter_rom_resources / sizeof adapter_rom_resources[0])
-+
-+static struct resource video_rom_resource = {
-+      .name = "Video ROM",
-+      .start = 0xc0000,
-+      .end = 0xc7fff,
-+      .flags = IORESOURCE_ROM,
-+};
-+
-+static struct resource video_ram_resource = {
-+      .name = "Video RAM area",
-+      .start = 0xa0000,
-+      .end = 0xbffff,
-+      .flags = IORESOURCE_RAM,
-+};
-+
-+#define romsignature(x) (*(unsigned short *)(x) == 0xaa55)
-+
-+static int __init romchecksum(unsigned char *rom, unsigned long length)
-+{
-+      unsigned char *p, sum = 0;
-+
-+      for (p = rom; p < rom + length; p++)
-+              sum += *p;
-+      return sum == 0;
-+}
-+
-+static void __init probe_roms(void)
-+{
-+      unsigned long start, length, upper;
-+      unsigned char *rom;
-+      int           i;
-+
-+#ifdef CONFIG_XEN
-+      /* Nothing to do if not running in dom0. */
-+      if (!is_initial_xendomain())
-+              return;
-+#endif
-+
-+      /* video rom */
-+      upper = adapter_rom_resources[0].start;
-+      for (start = video_rom_resource.start; start < upper; start += 2048) {
-+              rom = isa_bus_to_virt(start);
-+              if (!romsignature(rom))
-+                      continue;
-+
-+              video_rom_resource.start = start;
-+
-+              /* 0 < length <= 0x7f * 512, historically */
-+              length = rom[2] * 512;
-+
-+              /* if checksum okay, trust length byte */
-+              if (length && romchecksum(rom, length))
-+                      video_rom_resource.end = start + length - 1;
-+
-+              request_resource(&iomem_resource, &video_rom_resource);
-+              break;
-+                      }
-+
-+      start = (video_rom_resource.end + 1 + 2047) & ~2047UL;
-+      if (start < upper)
-+              start = upper;
-+
-+      /* system rom */
-+      request_resource(&iomem_resource, &system_rom_resource);
-+      upper = system_rom_resource.start;
-+
-+      /* check for extension rom (ignore length byte!) */
-+      rom = isa_bus_to_virt(extension_rom_resource.start);
-+      if (romsignature(rom)) {
-+              length = extension_rom_resource.end - extension_rom_resource.start + 1;
-+              if (romchecksum(rom, length)) {
-+                      request_resource(&iomem_resource, &extension_rom_resource);
-+                      upper = extension_rom_resource.start;
-+              }
-+      }
-+
-+      /* check for adapter roms on 2k boundaries */
-+      for (i = 0; i < ADAPTER_ROM_RESOURCES && start < upper; start += 2048) {
-+              rom = isa_bus_to_virt(start);
-+              if (!romsignature(rom))
-+                      continue;
-+
-+              /* 0 < length <= 0x7f * 512, historically */
-+              length = rom[2] * 512;
-+
-+              /* but accept any length that fits if checksum okay */
-+              if (!length || start + length > upper || !romchecksum(rom, length))
-+                      continue;
-+
-+              adapter_rom_resources[i].start = start;
-+              adapter_rom_resources[i].end = start + length - 1;
-+              request_resource(&iomem_resource, &adapter_rom_resources[i]);
-+
-+              start = adapter_rom_resources[i++].end & ~2047UL;
-+      }
-+}
-+
-+/* Check for full argument with no trailing characters */
-+static int fullarg(char *p, char *arg)
-+{
-+      int l = strlen(arg);
-+      return !memcmp(p, arg, l) && (p[l] == 0 || isspace(p[l]));
-+}
-+
-+static __init void parse_cmdline_early (char ** cmdline_p)
-+{
-+      char c = ' ', *to = command_line, *from = COMMAND_LINE;
-+      int len = 0;
-+      int userdef = 0;
-+
-+      for (;;) {
-+              if (c != ' ') 
-+                      goto next_char; 
-+
-+#ifdef  CONFIG_SMP
-+              /*
-+               * If the BIOS enumerates physical processors before logical,
-+               * maxcpus=N at enumeration-time can be used to disable HT.
-+               */
-+              else if (!memcmp(from, "maxcpus=", 8)) {
-+                      extern unsigned int maxcpus;
-+
-+                      maxcpus = simple_strtoul(from + 8, NULL, 0);
-+              }
-+#endif
-+#ifdef CONFIG_ACPI
-+              /* "acpi=off" disables both ACPI table parsing and interpreter init */
-+              if (fullarg(from,"acpi=off"))
-+                      disable_acpi();
-+
-+              if (fullarg(from, "acpi=force")) { 
-+                      /* add later when we do DMI horrors: */
-+                      acpi_force = 1;
-+                      acpi_disabled = 0;
-+              }
-+
-+              /* acpi=ht just means: do ACPI MADT parsing 
-+                 at bootup, but don't enable the full ACPI interpreter */
-+              if (fullarg(from, "acpi=ht")) { 
-+                      if (!acpi_force)
-+                              disable_acpi();
-+                      acpi_ht = 1; 
-+              }
-+                else if (fullarg(from, "pci=noacpi")) 
-+                      acpi_disable_pci();
-+              else if (fullarg(from, "acpi=noirq"))
-+                      acpi_noirq_set();
-+
-+              else if (fullarg(from, "acpi_sci=edge"))
-+                      acpi_sci_flags.trigger =  1;
-+              else if (fullarg(from, "acpi_sci=level"))
-+                      acpi_sci_flags.trigger = 3;
-+              else if (fullarg(from, "acpi_sci=high"))
-+                      acpi_sci_flags.polarity = 1;
-+              else if (fullarg(from, "acpi_sci=low"))
-+                      acpi_sci_flags.polarity = 3;
-+
-+              /* acpi=strict disables out-of-spec workarounds */
-+              else if (fullarg(from, "acpi=strict")) {
-+                      acpi_strict = 1;
-+              }
-+#ifdef CONFIG_X86_IO_APIC
-+              else if (fullarg(from, "acpi_skip_timer_override"))
-+                      acpi_skip_timer_override = 1;
-+#endif
-+#endif
-+
-+#ifndef CONFIG_XEN
-+              if (fullarg(from, "nolapic") || fullarg(from, "disableapic")) {
-+                      clear_bit(X86_FEATURE_APIC, boot_cpu_data.x86_capability);
-+                      disable_apic = 1;
-+              }
-+
-+              if (fullarg(from, "noapic"))
-+                      skip_ioapic_setup = 1;
-+
-+              if (fullarg(from,"apic")) {
-+                      skip_ioapic_setup = 0;
-+                      ioapic_force = 1;
-+              }
-+#endif
-+                      
-+              if (!memcmp(from, "mem=", 4))
-+                      parse_memopt(from+4, &from); 
-+
-+              if (!memcmp(from, "memmap=", 7)) {
-+                      /* exactmap option is for used defined memory */
-+                      if (!memcmp(from+7, "exactmap", 8)) {
-+#ifdef CONFIG_CRASH_DUMP
-+                              /* If we are doing a crash dump, we
-+                               * still need to know the real mem
-+                               * size before original memory map is
-+                               * reset.
-+                               */
-+                              saved_max_pfn = e820_end_of_ram();
-+#endif
-+                              from += 8+7;
-+                              end_pfn_map = 0;
-+                              e820.nr_map = 0;
-+                              userdef = 1;
-+                      }
-+                      else {
-+                              parse_memmapopt(from+7, &from);
-+                              userdef = 1;
-+                      }
-+              }
-+
-+#ifdef CONFIG_NUMA
-+              if (!memcmp(from, "numa=", 5))
-+                      numa_setup(from+5); 
-+#endif
-+
-+              if (!memcmp(from,"iommu=",6)) { 
-+                      iommu_setup(from+6); 
-+              }
-+
-+              if (fullarg(from,"oops=panic"))
-+                      panic_on_oops = 1;
-+
-+              if (!memcmp(from, "noexec=", 7))
-+                      nonx_setup(from + 7);
-+
-+#ifdef CONFIG_KEXEC
-+              /* crashkernel=size@addr specifies the location to reserve for
-+               * a crash kernel.  By reserving this memory we guarantee
-+               * that linux never set's it up as a DMA target.
-+               * Useful for holding code to do something appropriate
-+               * after a kernel panic.
-+               */
-+              else if (!memcmp(from, "crashkernel=", 12)) {
-+#ifndef CONFIG_XEN
-+                      unsigned long size, base;
-+                      size = memparse(from+12, &from);
-+                      if (*from == '@') {
-+                              base = memparse(from+1, &from);
-+                              /* FIXME: Do I want a sanity check
-+                               * to validate the memory range?
-+                               */
-+                              crashk_res.start = base;
-+                              crashk_res.end   = base + size - 1;
-+                      }
-+#else
-+                      printk("Ignoring crashkernel command line, "
-+                             "parameter will be supplied by xen\n");
-+#endif
-+              }
-+#endif
-+
-+#ifdef CONFIG_PROC_VMCORE
-+              /* elfcorehdr= specifies the location of elf core header
-+               * stored by the crashed kernel. This option will be passed
-+               * by kexec loader to the capture kernel.
-+               */
-+              else if(!memcmp(from, "elfcorehdr=", 11))
-+                      elfcorehdr_addr = memparse(from+11, &from);
-+#endif
-+
-+#if defined(CONFIG_HOTPLUG_CPU) && !defined(CONFIG_XEN)
-+              else if (!memcmp(from, "additional_cpus=", 16))
-+                      setup_additional_cpus(from+16);
-+#endif
-+
-+      next_char:
-+              c = *(from++);
-+              if (!c)
-+                      break;
-+              if (COMMAND_LINE_SIZE <= ++len)
-+                      break;
-+              *(to++) = c;
-+      }
-+      if (userdef) {
-+              printk(KERN_INFO "user-defined physical RAM map:\n");
-+              e820_print_map("user");
-+      }
-+      *to = '\0';
-+      *cmdline_p = command_line;
-+}
-+
-+#ifndef CONFIG_NUMA
-+static void __init
-+contig_initmem_init(unsigned long start_pfn, unsigned long end_pfn)
-+{
-+      unsigned long bootmap_size, bootmap;
-+
-+      bootmap_size = bootmem_bootmap_pages(end_pfn)<<PAGE_SHIFT;
-+      bootmap = find_e820_area(0, end_pfn<<PAGE_SHIFT, bootmap_size);
-+      if (bootmap == -1L)
-+              panic("Cannot find bootmem map of size %ld\n",bootmap_size);
-+      bootmap_size = init_bootmem(bootmap >> PAGE_SHIFT, end_pfn);
-+#ifdef CONFIG_XEN
-+      e820_bootmem_free(NODE_DATA(0), 0, xen_start_info->nr_pages<<PAGE_SHIFT);
-+#else
-+      e820_bootmem_free(NODE_DATA(0), 0, end_pfn << PAGE_SHIFT);
-+#endif
-+      reserve_bootmem(bootmap, bootmap_size);
-+} 
-+#endif
-+
-+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-+struct edd edd;
-+#ifdef CONFIG_EDD_MODULE
-+EXPORT_SYMBOL(edd);
-+#endif
-+#ifndef CONFIG_XEN
-+/**
-+ * copy_edd() - Copy the BIOS EDD information
-+ *              from boot_params into a safe place.
-+ *
-+ */
-+static inline void copy_edd(void)
-+{
-+     memcpy(edd.mbr_signature, EDD_MBR_SIGNATURE, sizeof(edd.mbr_signature));
-+     memcpy(edd.edd_info, EDD_BUF, sizeof(edd.edd_info));
-+     edd.mbr_signature_nr = EDD_MBR_SIG_NR;
-+     edd.edd_info_nr = EDD_NR;
-+}
-+#endif
-+#else
-+static inline void copy_edd(void)
-+{
-+}
-+#endif
-+
-+#ifndef CONFIG_XEN
-+#define EBDA_ADDR_POINTER 0x40E
-+
-+unsigned __initdata ebda_addr;
-+unsigned __initdata ebda_size;
-+
-+static void discover_ebda(void)
-+{
-+      /*
-+       * there is a real-mode segmented pointer pointing to the 
-+       * 4K EBDA area at 0x40E
-+       */
-+      ebda_addr = *(unsigned short *)EBDA_ADDR_POINTER;
-+      ebda_addr <<= 4;
-+
-+      ebda_size = *(unsigned short *)(unsigned long)ebda_addr;
-+
-+      /* Round EBDA up to pages */
-+      if (ebda_size == 0)
-+              ebda_size = 1;
-+      ebda_size <<= 10;
-+      ebda_size = round_up(ebda_size + (ebda_addr & ~PAGE_MASK), PAGE_SIZE);
-+      if (ebda_size > 64*1024)
-+              ebda_size = 64*1024;
-+}
-+#else
-+#define discover_ebda() ((void)0)
-+#endif
-+
-+void __init setup_arch(char **cmdline_p)
-+{
-+#ifdef CONFIG_XEN
-+      /* Register a call for panic conditions. */
-+      atomic_notifier_chain_register(&panic_notifier_list, &xen_panic_block);
-+
-+      ROOT_DEV = MKDEV(RAMDISK_MAJOR,0); 
-+      screen_info = SCREEN_INFO;
-+
-+      if (is_initial_xendomain()) {
-+              const struct dom0_vga_console_info *info =
-+                      (void *)((char *)xen_start_info +
-+                               xen_start_info->console.dom0.info_off);
-+
-+              dom0_init_screen_info(info,
-+                                    xen_start_info->console.dom0.info_size);
-+              xen_start_info->console.domU.mfn = 0;
-+              xen_start_info->console.domU.evtchn = 0;
-+      } else
-+              screen_info.orig_video_isVGA = 0;
-+
-+      copy_edid();
-+
-+      WARN_ON(HYPERVISOR_vm_assist(VMASST_CMD_enable,
-+                                   VMASST_TYPE_writable_pagetables));
-+
-+      ARCH_SETUP
-+#else
-+      ROOT_DEV = old_decode_dev(ORIG_ROOT_DEV);
-+      screen_info = SCREEN_INFO;
-+      edid_info = EDID_INFO;
-+#endif        /* !CONFIG_XEN */
-+      saved_video_mode = SAVED_VIDEO_MODE;
-+      bootloader_type = LOADER_TYPE;
-+
-+#ifdef CONFIG_BLK_DEV_RAM
-+      rd_image_start = RAMDISK_FLAGS & RAMDISK_IMAGE_START_MASK;
-+      rd_prompt = ((RAMDISK_FLAGS & RAMDISK_PROMPT_FLAG) != 0);
-+      rd_doload = ((RAMDISK_FLAGS & RAMDISK_LOAD_FLAG) != 0);
-+#endif
-+      setup_memory_region();
-+      copy_edd();
-+
-+      if (!MOUNT_ROOT_RDONLY)
-+              root_mountflags &= ~MS_RDONLY;
-+      init_mm.start_code = (unsigned long) &_text;
-+      init_mm.end_code = (unsigned long) &_etext;
-+      init_mm.end_data = (unsigned long) &_edata;
-+      init_mm.brk = (unsigned long) &_end;
-+
-+      code_resource.start = virt_to_phys(&_text);
-+      code_resource.end = virt_to_phys(&_etext)-1;
-+      data_resource.start = virt_to_phys(&_etext);
-+      data_resource.end = virt_to_phys(&_edata)-1;
-+
-+      parse_cmdline_early(cmdline_p);
-+
-+      early_identify_cpu(&boot_cpu_data);
-+
-+      /*
-+       * partially used pages are not usable - thus
-+       * we are rounding upwards:
-+       */
-+      end_pfn = e820_end_of_ram();
-+      num_physpages = end_pfn;                /* for pfn_valid */
-+
-+      check_efer();
-+
-+      discover_ebda();
-+
-+      init_memory_mapping(0, (end_pfn_map << PAGE_SHIFT));
-+
-+      if (is_initial_xendomain())
-+              dmi_scan_machine();
-+
-+#ifdef CONFIG_ACPI_NUMA
-+      /*
-+       * Parse SRAT to discover nodes.
-+       */
-+      acpi_numa_init();
-+#endif
-+
-+#ifdef CONFIG_NUMA
-+      numa_initmem_init(0, end_pfn); 
-+#else
-+      contig_initmem_init(0, end_pfn);
-+#endif
-+
-+#ifdef CONFIG_XEN
-+      /*
-+       * Reserve kernel, physmap, start info, initial page tables, and
-+       * direct mapping.
-+       */
-+      reserve_bootmem_generic(__pa_symbol(&_text),
-+                              (table_end << PAGE_SHIFT) - __pa_symbol(&_text));
-+#else
-+      /* Reserve direct mapping */
-+      reserve_bootmem_generic(table_start << PAGE_SHIFT, 
-+                              (table_end - table_start) << PAGE_SHIFT);
-+
-+      /* reserve kernel */
-+      reserve_bootmem_generic(__pa_symbol(&_text),
-+                              __pa_symbol(&_end) - __pa_symbol(&_text));
-+
-+      /*
-+       * reserve physical page 0 - it's a special BIOS page on many boxes,
-+       * enabling clean reboots, SMP operation, laptop functions.
-+       */
-+      reserve_bootmem_generic(0, PAGE_SIZE);
-+
-+      /* reserve ebda region */
-+      if (ebda_addr)
-+              reserve_bootmem_generic(ebda_addr, ebda_size);
-+
-+#ifdef CONFIG_SMP
-+      /*
-+       * But first pinch a few for the stack/trampoline stuff
-+       * FIXME: Don't need the extra page at 4K, but need to fix
-+       * trampoline before removing it. (see the GDT stuff)
-+       */
-+      reserve_bootmem_generic(PAGE_SIZE, PAGE_SIZE);
-+
-+      /* Reserve SMP trampoline */
-+      reserve_bootmem_generic(SMP_TRAMPOLINE_BASE, PAGE_SIZE);
-+#endif
-+#endif
-+
-+#ifdef CONFIG_ACPI_SLEEP
-+       /*
-+        * Reserve low memory region for sleep support.
-+        */
-+       acpi_reserve_bootmem();
-+#endif
-+#ifdef CONFIG_XEN
-+#ifdef CONFIG_BLK_DEV_INITRD
-+      if (xen_start_info->mod_start) {
-+              if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
-+                      /*reserve_bootmem_generic(INITRD_START, INITRD_SIZE);*/
-+                      initrd_start = INITRD_START + PAGE_OFFSET;
-+                      initrd_end = initrd_start+INITRD_SIZE;
-+                      initrd_below_start_ok = 1;
-+              } else {
-+                      printk(KERN_ERR "initrd extends beyond end of memory "
-+                              "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-+                              (unsigned long)(INITRD_START + INITRD_SIZE),
-+                              (unsigned long)(end_pfn << PAGE_SHIFT));
-+                      initrd_start = 0;
-+              }
-+      }
-+#endif
-+#else /* CONFIG_XEN */
-+#ifdef CONFIG_BLK_DEV_INITRD
-+      if (LOADER_TYPE && INITRD_START) {
-+              if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
-+                      reserve_bootmem_generic(INITRD_START, INITRD_SIZE);
-+                      initrd_start =
-+                              INITRD_START ? INITRD_START + PAGE_OFFSET : 0;
-+                      initrd_end = initrd_start+INITRD_SIZE;
-+              }
-+              else {
-+                      printk(KERN_ERR "initrd extends beyond end of memory "
-+                          "(0x%08lx > 0x%08lx)\ndisabling initrd\n",
-+                          (unsigned long)(INITRD_START + INITRD_SIZE),
-+                          (unsigned long)(end_pfn << PAGE_SHIFT));
-+                      initrd_start = 0;
-+              }
-+      }
-+#endif
-+#endif        /* !CONFIG_XEN */
-+#ifdef CONFIG_KEXEC
-+#ifdef CONFIG_XEN
-+      xen_machine_kexec_setup_resources();
-+#else
-+      if (crashk_res.start != crashk_res.end) {
-+              reserve_bootmem_generic(crashk_res.start,
-+                      crashk_res.end - crashk_res.start + 1);
-+      }
-+#endif
-+#endif
-+
-+      paging_init();
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      /*
-+       * Find and reserve possible boot-time SMP configuration:
-+       */
-+      find_smp_config();
-+#endif
-+#ifdef CONFIG_XEN
-+      {
-+              int i, j, k, fpp;
-+              unsigned long p2m_pages;
-+
-+              p2m_pages = end_pfn;
-+              if (xen_start_info->nr_pages > end_pfn) {
-+                      /*
-+                       * the end_pfn was shrunk (probably by mem= or highmem=
-+                       * kernel parameter); shrink reservation with the HV
-+                       */
-+                      struct xen_memory_reservation reservation = {
-+                              .address_bits = 0,
-+                              .extent_order = 0,
-+                              .domid = DOMID_SELF
-+                      };
-+                      unsigned int difference;
-+                      int ret;
-+                      
-+                      difference = xen_start_info->nr_pages - end_pfn;
-+                      
-+                      set_xen_guest_handle(reservation.extent_start,
-+                                           ((unsigned long *)xen_start_info->mfn_list) + end_pfn);
-+                      reservation.nr_extents = difference;
-+                      ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                                 &reservation);
-+                      BUG_ON (ret != difference);
-+              }
-+              else if (end_pfn > xen_start_info->nr_pages)
-+                      p2m_pages = xen_start_info->nr_pages;
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* Make sure we have a large enough P->M table. */
-+                      phys_to_machine_mapping = alloc_bootmem_pages(
-+                              end_pfn * sizeof(unsigned long));
-+                      memset(phys_to_machine_mapping, ~0,
-+                             end_pfn * sizeof(unsigned long));
-+                      memcpy(phys_to_machine_mapping,
-+                             (unsigned long *)xen_start_info->mfn_list,
-+                             p2m_pages * sizeof(unsigned long));
-+                      free_bootmem(
-+                              __pa(xen_start_info->mfn_list),
-+                              PFN_PHYS(PFN_UP(xen_start_info->nr_pages *
-+                                              sizeof(unsigned long))));
-+
-+                      /*
-+                       * Initialise the list of the frames that specify the
-+                       * list of frames that make up the p2m table. Used by
-+                         * save/restore.
-+                       */
-+                      pfn_to_mfn_frame_list_list = alloc_bootmem_pages(PAGE_SIZE);
-+
-+                      fpp = PAGE_SIZE/sizeof(unsigned long);
-+                      for (i=0, j=0, k=-1; i< end_pfn; i+=fpp, j++) {
-+                              if ((j % fpp) == 0) {
-+                                      k++;
-+                                      BUG_ON(k>=fpp);
-+                                      pfn_to_mfn_frame_list[k] =
-+                                              alloc_bootmem_pages(PAGE_SIZE);
-+                                      pfn_to_mfn_frame_list_list[k] =
-+                                              virt_to_mfn(pfn_to_mfn_frame_list[k]);
-+                                      j=0;
-+                              }
-+                              pfn_to_mfn_frame_list[k][j] =
-+                                      virt_to_mfn(&phys_to_machine_mapping[i]);
-+                      }
-+                      HYPERVISOR_shared_info->arch.max_pfn = end_pfn;
-+                      HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-+                              virt_to_mfn(pfn_to_mfn_frame_list_list);
-+              }
-+
-+              /* Mark all ISA DMA channels in-use - using them wouldn't work. */
-+              for (i = 0; i < MAX_DMA_CHANNELS; ++i)
-+                      if (i != 4 && request_dma(i, "xen") != 0)
-+                              BUG();
-+      }
-+
-+      if (!is_initial_xendomain()) {
-+              acpi_disabled = 1;
-+#ifdef  CONFIG_ACPI
-+              acpi_ht = 0;
-+#endif
-+      }
-+#endif
-+
-+#ifndef CONFIG_XEN
-+      check_ioapic();
-+#endif
-+
-+      zap_low_mappings(0);
-+
-+      /*
-+       * set this early, so we dont allocate cpu0
-+       * if MADT list doesnt list BSP first
-+       * mpparse.c/MP_processor_info() allocates logical cpu numbers.
-+       */
-+      cpu_set(0, cpu_present_map);
-+#ifdef CONFIG_ACPI
-+      /*
-+       * Initialize the ACPI boot-time table parser (gets the RSDP and SDT).
-+       * Call this early for SRAT node setup.
-+       */
-+      acpi_boot_table_init();
-+
-+      /*
-+       * Read APIC and some other early information from ACPI tables.
-+       */
-+      acpi_boot_init();
-+#endif
-+
-+      init_cpu_to_node();
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      /*
-+       * get boot-time SMP configuration:
-+       */
-+      if (smp_found_config)
-+              get_smp_config();
-+#ifndef CONFIG_XEN
-+      init_apic_mappings();
-+#endif
-+#endif
-+#if defined(CONFIG_XEN) && defined(CONFIG_SMP) && !defined(CONFIG_HOTPLUG_CPU)
-+      prefill_possible_map();
-+#endif
-+
-+      /*
-+       * Request address space for all standard RAM and ROM resources
-+       * and also for regions reported as reserved by the e820.
-+       */
-+      probe_roms();
-+#ifdef CONFIG_XEN
-+      if (is_initial_xendomain())
-+              e820_reserve_resources(machine_e820.map, machine_e820.nr_map);
-+#else
-+      e820_reserve_resources(e820.map, e820.nr_map);
-+#endif
-+
-+      request_resource(&iomem_resource, &video_ram_resource);
-+
-+      {
-+      unsigned i;
-+      /* request I/O space for devices used on all i[345]86 PCs */
-+      for (i = 0; i < STANDARD_IO_RESOURCES; i++)
-+              request_resource(&ioport_resource, &standard_io_resources[i]);
-+      }
-+
-+#ifdef CONFIG_XEN
-+      if (is_initial_xendomain())
-+              e820_setup_gap(machine_e820.map, machine_e820.nr_map);
-+#else
-+      e820_setup_gap(e820.map, e820.nr_map);
-+#endif
-+
-+#ifdef CONFIG_XEN
-+      {
-+              struct physdev_set_iopl set_iopl;
-+
-+              set_iopl.iopl = 1;
-+              WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
-+
-+              if (is_initial_xendomain()) {
-+#ifdef CONFIG_VT
-+#if defined(CONFIG_VGA_CONSOLE)
-+                      conswitchp = &vga_con;
-+#elif defined(CONFIG_DUMMY_CONSOLE)
-+                      conswitchp = &dummy_con;
-+#endif
-+#endif
-+              } else {
-+#if defined(CONFIG_VT) && defined(CONFIG_DUMMY_CONSOLE)
-+                      conswitchp = &dummy_con;
-+#endif
-+                }
-+      }
-+#else /* CONFIG_XEN */
-+
-+#ifdef CONFIG_VT
-+#if defined(CONFIG_VGA_CONSOLE)
-+      conswitchp = &vga_con;
-+#elif defined(CONFIG_DUMMY_CONSOLE)
-+      conswitchp = &dummy_con;
-+#endif
-+#endif
-+
-+#endif /* !CONFIG_XEN */
-+}
-+
-+#ifdef CONFIG_XEN
-+static int
-+xen_panic_event(struct notifier_block *this, unsigned long event, void *ptr)
-+{
-+      HYPERVISOR_shutdown(SHUTDOWN_crash);
-+      /* we're never actually going to get here... */
-+      return NOTIFY_DONE;
-+}
-+#endif /* !CONFIG_XEN */
-+
-+
-+static int __cpuinit get_model_name(struct cpuinfo_x86 *c)
-+{
-+      unsigned int *v;
-+
-+      if (c->extended_cpuid_level < 0x80000004)
-+              return 0;
-+
-+      v = (unsigned int *) c->x86_model_id;
-+      cpuid(0x80000002, &v[0], &v[1], &v[2], &v[3]);
-+      cpuid(0x80000003, &v[4], &v[5], &v[6], &v[7]);
-+      cpuid(0x80000004, &v[8], &v[9], &v[10], &v[11]);
-+      c->x86_model_id[48] = 0;
-+      return 1;
-+}
-+
-+
-+static void __cpuinit display_cacheinfo(struct cpuinfo_x86 *c)
-+{
-+      unsigned int n, dummy, eax, ebx, ecx, edx;
-+
-+      n = c->extended_cpuid_level;
-+
-+      if (n >= 0x80000005) {
-+              cpuid(0x80000005, &dummy, &ebx, &ecx, &edx);
-+              printk(KERN_INFO "CPU: L1 I Cache: %dK (%d bytes/line), D cache %dK (%d bytes/line)\n",
-+                      edx>>24, edx&0xFF, ecx>>24, ecx&0xFF);
-+              c->x86_cache_size=(ecx>>24)+(edx>>24);
-+              /* On K8 L1 TLB is inclusive, so don't count it */
-+              c->x86_tlbsize = 0;
-+      }
-+
-+      if (n >= 0x80000006) {
-+              cpuid(0x80000006, &dummy, &ebx, &ecx, &edx);
-+              ecx = cpuid_ecx(0x80000006);
-+              c->x86_cache_size = ecx >> 16;
-+              c->x86_tlbsize += ((ebx >> 16) & 0xfff) + (ebx & 0xfff);
-+
-+              printk(KERN_INFO "CPU: L2 Cache: %dK (%d bytes/line)\n",
-+              c->x86_cache_size, ecx & 0xFF);
-+      }
-+
-+      if (n >= 0x80000007)
-+              cpuid(0x80000007, &dummy, &dummy, &dummy, &c->x86_power); 
-+      if (n >= 0x80000008) {
-+              cpuid(0x80000008, &eax, &dummy, &dummy, &dummy); 
-+              c->x86_virt_bits = (eax >> 8) & 0xff;
-+              c->x86_phys_bits = eax & 0xff;
-+      }
-+}
-+
-+#ifdef CONFIG_NUMA
-+static int nearby_node(int apicid)
-+{
-+      int i;
-+      for (i = apicid - 1; i >= 0; i--) {
-+              int node = apicid_to_node[i];
-+              if (node != NUMA_NO_NODE && node_online(node))
-+                      return node;
-+      }
-+      for (i = apicid + 1; i < MAX_LOCAL_APIC; i++) {
-+              int node = apicid_to_node[i];
-+              if (node != NUMA_NO_NODE && node_online(node))
-+                      return node;
-+      }
-+      return first_node(node_online_map); /* Shouldn't happen */
-+}
-+#endif
-+
-+/*
-+ * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
-+ * Assumes number of cores is a power of two.
-+ */
-+static void __init amd_detect_cmp(struct cpuinfo_x86 *c)
-+{
-+#ifdef CONFIG_SMP
-+      unsigned bits;
-+#ifdef CONFIG_NUMA
-+      int cpu = smp_processor_id();
-+      int node = 0;
-+      unsigned apicid = hard_smp_processor_id();
-+#endif
-+      unsigned ecx = cpuid_ecx(0x80000008);
-+
-+      c->x86_max_cores = (ecx & 0xff) + 1;
-+
-+      /* CPU telling us the core id bits shift? */
-+      bits = (ecx >> 12) & 0xF;
-+
-+      /* Otherwise recompute */
-+      if (bits == 0) {
-+              while ((1 << bits) < c->x86_max_cores)
-+                      bits++;
-+      }
-+
-+      /* Low order bits define the core id (index of core in socket) */
-+      c->cpu_core_id = c->phys_proc_id & ((1 << bits)-1);
-+      /* Convert the APIC ID into the socket ID */
-+      c->phys_proc_id = phys_pkg_id(bits);
-+
-+#ifdef CONFIG_NUMA
-+      node = c->phys_proc_id;
-+      if (apicid_to_node[apicid] != NUMA_NO_NODE)
-+              node = apicid_to_node[apicid];
-+      if (!node_online(node)) {
-+              /* Two possibilities here:
-+                 - The CPU is missing memory and no node was created.
-+                 In that case try picking one from a nearby CPU
-+                 - The APIC IDs differ from the HyperTransport node IDs
-+                 which the K8 northbridge parsing fills in.
-+                 Assume they are all increased by a constant offset,
-+                 but in the same order as the HT nodeids.
-+                 If that doesn't result in a usable node fall back to the
-+                 path for the previous case.  */
-+              int ht_nodeid = apicid - (cpu_data[0].phys_proc_id << bits);
-+              if (ht_nodeid >= 0 &&
-+                  apicid_to_node[ht_nodeid] != NUMA_NO_NODE)
-+                      node = apicid_to_node[ht_nodeid];
-+              /* Pick a nearby node */
-+              if (!node_online(node))
-+                      node = nearby_node(apicid);
-+      }
-+      numa_set_node(cpu, node);
-+
-+      printk(KERN_INFO "CPU %d/%x -> Node %d\n", cpu, apicid, node);
-+#endif
-+#endif
-+}
-+
-+static void __init init_amd(struct cpuinfo_x86 *c)
-+{
-+      unsigned level;
-+
-+#ifdef CONFIG_SMP
-+      unsigned long value;
-+
-+      /*
-+       * Disable TLB flush filter by setting HWCR.FFDIS on K8
-+       * bit 6 of msr C001_0015
-+       *
-+       * Errata 63 for SH-B3 steppings
-+       * Errata 122 for all steppings (F+ have it disabled by default)
-+       */
-+      if (c->x86 == 15) {
-+              rdmsrl(MSR_K8_HWCR, value);
-+              value |= 1 << 6;
-+              wrmsrl(MSR_K8_HWCR, value);
-+      }
-+#endif
-+
-+      /* Bit 31 in normal CPUID used for nonstandard 3DNow ID;
-+         3DNow is IDd by bit 31 in extended CPUID (1*32+31) anyway */
-+      clear_bit(0*32+31, &c->x86_capability);
-+      
-+      /* On C+ stepping K8 rep microcode works well for copy/memset */
-+      level = cpuid_eax(1);
-+      if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58))
-+              set_bit(X86_FEATURE_REP_GOOD, &c->x86_capability);
-+
-+      /* Enable workaround for FXSAVE leak */
-+      if (c->x86 >= 6)
-+              set_bit(X86_FEATURE_FXSAVE_LEAK, &c->x86_capability);
-+
-+      level = get_model_name(c);
-+      if (!level) {
-+              switch (c->x86) { 
-+              case 15:
-+                      /* Should distinguish Models here, but this is only
-+                         a fallback anyways. */
-+                      strcpy(c->x86_model_id, "Hammer");
-+                      break; 
-+              } 
-+      } 
-+      display_cacheinfo(c);
-+
-+      /* c->x86_power is 8000_0007 edx. Bit 8 is constant TSC */
-+      if (c->x86_power & (1<<8))
-+              set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-+
-+      /* Multi core CPU? */
-+      if (c->extended_cpuid_level >= 0x80000008)
-+              amd_detect_cmp(c);
-+
-+      /* Fix cpuid4 emulation for more */
-+      num_cache_leaves = 3;
-+}
-+
-+static void __cpuinit detect_ht(struct cpuinfo_x86 *c)
-+{
-+#ifdef CONFIG_SMP
-+      u32     eax, ebx, ecx, edx;
-+      int     index_msb, core_bits;
-+
-+      cpuid(1, &eax, &ebx, &ecx, &edx);
-+
-+
-+      if (!cpu_has(c, X86_FEATURE_HT))
-+              return;
-+      if (cpu_has(c, X86_FEATURE_CMP_LEGACY))
-+              goto out;
-+
-+      smp_num_siblings = (ebx & 0xff0000) >> 16;
-+
-+      if (smp_num_siblings == 1) {
-+              printk(KERN_INFO  "CPU: Hyper-Threading is disabled\n");
-+      } else if (smp_num_siblings > 1 ) {
-+
-+              if (smp_num_siblings > NR_CPUS) {
-+                      printk(KERN_WARNING "CPU: Unsupported number of the siblings %d", smp_num_siblings);
-+                      smp_num_siblings = 1;
-+                      return;
-+              }
-+
-+              index_msb = get_count_order(smp_num_siblings);
-+              c->phys_proc_id = phys_pkg_id(index_msb);
-+
-+              smp_num_siblings = smp_num_siblings / c->x86_max_cores;
-+
-+              index_msb = get_count_order(smp_num_siblings) ;
-+
-+              core_bits = get_count_order(c->x86_max_cores);
-+
-+              c->cpu_core_id = phys_pkg_id(index_msb) &
-+                                             ((1 << core_bits) - 1);
-+      }
-+out:
-+      if ((c->x86_max_cores * smp_num_siblings) > 1) {
-+              printk(KERN_INFO  "CPU: Physical Processor ID: %d\n", c->phys_proc_id);
-+              printk(KERN_INFO  "CPU: Processor Core ID: %d\n", c->cpu_core_id);
-+      }
-+
-+#endif
-+}
-+
-+/*
-+ * find out the number of processor cores on the die
-+ */
-+static int __cpuinit intel_num_cpu_cores(struct cpuinfo_x86 *c)
-+{
-+      unsigned int eax, t;
-+
-+      if (c->cpuid_level < 4)
-+              return 1;
-+
-+      cpuid_count(4, 0, &eax, &t, &t, &t);
-+
-+      if (eax & 0x1f)
-+              return ((eax >> 26) + 1);
-+      else
-+              return 1;
-+}
-+
-+static void srat_detect_node(void)
-+{
-+#ifdef CONFIG_NUMA
-+      unsigned node;
-+      int cpu = smp_processor_id();
-+      int apicid = hard_smp_processor_id();
-+
-+      /* Don't do the funky fallback heuristics the AMD version employs
-+         for now. */
-+      node = apicid_to_node[apicid];
-+      if (node == NUMA_NO_NODE)
-+              node = first_node(node_online_map);
-+      numa_set_node(cpu, node);
-+
-+      if (acpi_numa > 0)
-+              printk(KERN_INFO "CPU %d/%x -> Node %d\n", cpu, apicid, node);
-+#endif
-+}
-+
-+static void __cpuinit init_intel(struct cpuinfo_x86 *c)
-+{
-+      /* Cache sizes */
-+      unsigned n;
-+
-+      init_intel_cacheinfo(c);
-+      if (c->cpuid_level > 9 ) {
-+              unsigned eax = cpuid_eax(10);
-+              /* Check for version and the number of counters */
-+              if ((eax & 0xff) && (((eax>>8) & 0xff) > 1))
-+                      set_bit(X86_FEATURE_ARCH_PERFMON, &c->x86_capability);
-+      }
-+
-+      n = c->extended_cpuid_level;
-+      if (n >= 0x80000008) {
-+              unsigned eax = cpuid_eax(0x80000008);
-+              c->x86_virt_bits = (eax >> 8) & 0xff;
-+              c->x86_phys_bits = eax & 0xff;
-+              /* CPUID workaround for Intel 0F34 CPU */
-+              if (c->x86_vendor == X86_VENDOR_INTEL &&
-+                  c->x86 == 0xF && c->x86_model == 0x3 &&
-+                  c->x86_mask == 0x4)
-+                      c->x86_phys_bits = 36;
-+      }
-+
-+      if (c->x86 == 15)
-+              c->x86_cache_alignment = c->x86_clflush_size * 2;
-+      if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
-+          (c->x86 == 0x6 && c->x86_model >= 0x0e))
-+              set_bit(X86_FEATURE_CONSTANT_TSC, &c->x86_capability);
-+      set_bit(X86_FEATURE_SYNC_RDTSC, &c->x86_capability);
-+      c->x86_max_cores = intel_num_cpu_cores(c);
-+
-+      srat_detect_node();
-+}
-+
-+static void __cpuinit get_cpu_vendor(struct cpuinfo_x86 *c)
-+{
-+      char *v = c->x86_vendor_id;
-+
-+      if (!strcmp(v, "AuthenticAMD"))
-+              c->x86_vendor = X86_VENDOR_AMD;
-+      else if (!strcmp(v, "GenuineIntel"))
-+              c->x86_vendor = X86_VENDOR_INTEL;
-+      else
-+              c->x86_vendor = X86_VENDOR_UNKNOWN;
-+}
-+
-+struct cpu_model_info {
-+      int vendor;
-+      int family;
-+      char *model_names[16];
-+};
-+
-+/* Do some early cpuid on the boot CPU to get some parameter that are
-+   needed before check_bugs. Everything advanced is in identify_cpu
-+   below. */
-+void __cpuinit early_identify_cpu(struct cpuinfo_x86 *c)
-+{
-+      u32 tfms;
-+
-+      c->loops_per_jiffy = loops_per_jiffy;
-+      c->x86_cache_size = -1;
-+      c->x86_vendor = X86_VENDOR_UNKNOWN;
-+      c->x86_model = c->x86_mask = 0; /* So far unknown... */
-+      c->x86_vendor_id[0] = '\0'; /* Unset */
-+      c->x86_model_id[0] = '\0';  /* Unset */
-+      c->x86_clflush_size = 64;
-+      c->x86_cache_alignment = c->x86_clflush_size;
-+      c->x86_max_cores = 1;
-+      c->extended_cpuid_level = 0;
-+      memset(&c->x86_capability, 0, sizeof c->x86_capability);
-+
-+      /* Get vendor name */
-+      cpuid(0x00000000, (unsigned int *)&c->cpuid_level,
-+            (unsigned int *)&c->x86_vendor_id[0],
-+            (unsigned int *)&c->x86_vendor_id[8],
-+            (unsigned int *)&c->x86_vendor_id[4]);
-+              
-+      get_cpu_vendor(c);
-+
-+      /* Initialize the standard set of capabilities */
-+      /* Note that the vendor-specific code below might override */
-+
-+      /* Intel-defined flags: level 0x00000001 */
-+      if (c->cpuid_level >= 0x00000001) {
-+              __u32 misc;
-+              cpuid(0x00000001, &tfms, &misc, &c->x86_capability[4],
-+                    &c->x86_capability[0]);
-+              c->x86 = (tfms >> 8) & 0xf;
-+              c->x86_model = (tfms >> 4) & 0xf;
-+              c->x86_mask = tfms & 0xf;
-+              if (c->x86 == 0xf)
-+                      c->x86 += (tfms >> 20) & 0xff;
-+              if (c->x86 >= 0x6)
-+                      c->x86_model += ((tfms >> 16) & 0xF) << 4;
-+              if (c->x86_capability[0] & (1<<19)) 
-+                      c->x86_clflush_size = ((misc >> 8) & 0xff) * 8;
-+      } else {
-+              /* Have CPUID level 0 only - unheard of */
-+              c->x86 = 4;
-+      }
-+
-+#ifdef CONFIG_SMP
-+      c->phys_proc_id = (cpuid_ebx(1) >> 24) & 0xff;
-+#endif
-+}
-+
-+/*
-+ * This does the hard work of actually picking apart the CPU stuff...
-+ */
-+void __cpuinit identify_cpu(struct cpuinfo_x86 *c)
-+{
-+      int i;
-+      u32 xlvl;
-+
-+      early_identify_cpu(c);
-+
-+      /* AMD-defined flags: level 0x80000001 */
-+      xlvl = cpuid_eax(0x80000000);
-+      c->extended_cpuid_level = xlvl;
-+      if ((xlvl & 0xffff0000) == 0x80000000) {
-+              if (xlvl >= 0x80000001) {
-+                      c->x86_capability[1] = cpuid_edx(0x80000001);
-+                      c->x86_capability[6] = cpuid_ecx(0x80000001);
-+              }
-+              if (xlvl >= 0x80000004)
-+                      get_model_name(c); /* Default name */
-+      }
-+
-+      /* Transmeta-defined flags: level 0x80860001 */
-+      xlvl = cpuid_eax(0x80860000);
-+      if ((xlvl & 0xffff0000) == 0x80860000) {
-+              /* Don't set x86_cpuid_level here for now to not confuse. */
-+              if (xlvl >= 0x80860001)
-+                      c->x86_capability[2] = cpuid_edx(0x80860001);
-+      }
-+
-+      c->apicid = phys_pkg_id(0);
-+
-+      /*
-+       * Vendor-specific initialization.  In this section we
-+       * canonicalize the feature flags, meaning if there are
-+       * features a certain CPU supports which CPUID doesn't
-+       * tell us, CPUID claiming incorrect flags, or other bugs,
-+       * we handle them here.
-+       *
-+       * At the end of this section, c->x86_capability better
-+       * indicate the features this CPU genuinely supports!
-+       */
-+      switch (c->x86_vendor) {
-+      case X86_VENDOR_AMD:
-+              init_amd(c);
-+              break;
-+
-+      case X86_VENDOR_INTEL:
-+              init_intel(c);
-+              break;
-+
-+      case X86_VENDOR_UNKNOWN:
-+      default:
-+              display_cacheinfo(c);
-+              break;
-+      }
-+
-+      select_idle_routine(c);
-+      detect_ht(c); 
-+
-+      /*
-+       * On SMP, boot_cpu_data holds the common feature set between
-+       * all CPUs; so make sure that we indicate which features are
-+       * common between the CPUs.  The first time this routine gets
-+       * executed, c == &boot_cpu_data.
-+       */
-+      if (c != &boot_cpu_data) {
-+              /* AND the already accumulated flags with these */
-+              for (i = 0 ; i < NCAPINTS ; i++)
-+                      boot_cpu_data.x86_capability[i] &= c->x86_capability[i];
-+      }
-+
-+#ifdef CONFIG_X86_MCE
-+      mcheck_init(c);
-+#endif
-+      if (c == &boot_cpu_data)
-+              mtrr_bp_init();
-+      else
-+              mtrr_ap_init();
-+#ifdef CONFIG_NUMA
-+      numa_add_cpu(smp_processor_id());
-+#endif
-+}
-+ 
-+
-+void __cpuinit print_cpu_info(struct cpuinfo_x86 *c)
-+{
-+      if (c->x86_model_id[0])
-+              printk("%s", c->x86_model_id);
-+
-+      if (c->x86_mask || c->cpuid_level >= 0) 
-+              printk(" stepping %02x\n", c->x86_mask);
-+      else
-+              printk("\n");
-+}
-+
-+/*
-+ *    Get CPU information for use by the procfs.
-+ */
-+
-+static int show_cpuinfo(struct seq_file *m, void *v)
-+{
-+      struct cpuinfo_x86 *c = v;
-+
-+      /* 
-+       * These flag bits must match the definitions in <asm/cpufeature.h>.
-+       * NULL means this bit is undefined or reserved; either way it doesn't
-+       * have meaning as far as Linux is concerned.  Note that it's important
-+       * to realize there is a difference between this table and CPUID -- if
-+       * applications want to get the raw CPUID data, they should access
-+       * /dev/cpu/<cpu_nr>/cpuid instead.
-+       */
-+      static char *x86_cap_flags[] = {
-+              /* Intel-defined */
-+              "fpu", "vme", "de", "pse", "tsc", "msr", "pae", "mce",
-+              "cx8", "apic", NULL, "sep", "mtrr", "pge", "mca", "cmov",
-+              "pat", "pse36", "pn", "clflush", NULL, "dts", "acpi", "mmx",
-+              "fxsr", "sse", "sse2", "ss", "ht", "tm", "ia64", NULL,
-+
-+              /* AMD-defined */
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, "syscall", NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, "nx", NULL, "mmxext", NULL,
-+              NULL, "fxsr_opt", NULL, "rdtscp", NULL, "lm", "3dnowext", "3dnow",
-+
-+              /* Transmeta-defined */
-+              "recovery", "longrun", NULL, "lrti", NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+
-+              /* Other (Linux-defined) */
-+              "cxmmx", NULL, "cyrix_arr", "centaur_mcr", NULL,
-+              "constant_tsc", NULL, NULL,
-+              "up", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+
-+              /* Intel-defined (#2) */
-+              "pni", NULL, NULL, "monitor", "ds_cpl", "vmx", "smx", "est",
-+              "tm2", NULL, "cid", NULL, NULL, "cx16", "xtpr", NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+
-+              /* VIA/Cyrix/Centaur-defined */
-+              NULL, NULL, "rng", "rng_en", NULL, NULL, "ace", "ace_en",
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+
-+              /* AMD-defined (#2) */
-+              "lahf_lm", "cmp_legacy", "svm", NULL, "cr8_legacy", NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+              NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
-+      };
-+      static char *x86_power_flags[] = { 
-+              "ts",   /* temperature sensor */
-+              "fid",  /* frequency id control */
-+              "vid",  /* voltage id control */
-+              "ttp",  /* thermal trip */
-+              "tm",
-+              "stc",
-+              NULL,
-+              /* nothing */   /* constant_tsc - moved to flags */
-+      };
-+
-+
-+#ifdef CONFIG_SMP
-+      if (!cpu_online(c-cpu_data))
-+              return 0;
-+#endif
-+
-+      seq_printf(m,"processor\t: %u\n"
-+                   "vendor_id\t: %s\n"
-+                   "cpu family\t: %d\n"
-+                   "model\t\t: %d\n"
-+                   "model name\t: %s\n",
-+                   (unsigned)(c-cpu_data),
-+                   c->x86_vendor_id[0] ? c->x86_vendor_id : "unknown",
-+                   c->x86,
-+                   (int)c->x86_model,
-+                   c->x86_model_id[0] ? c->x86_model_id : "unknown");
-+      
-+      if (c->x86_mask || c->cpuid_level >= 0)
-+              seq_printf(m, "stepping\t: %d\n", c->x86_mask);
-+      else
-+              seq_printf(m, "stepping\t: unknown\n");
-+      
-+      if (cpu_has(c,X86_FEATURE_TSC)) {
-+              unsigned int freq = cpufreq_quick_get((unsigned)(c-cpu_data));
-+              if (!freq)
-+                      freq = cpu_khz;
-+              seq_printf(m, "cpu MHz\t\t: %u.%03u\n",
-+                           freq / 1000, (freq % 1000));
-+      }
-+
-+      /* Cache size */
-+      if (c->x86_cache_size >= 0) 
-+              seq_printf(m, "cache size\t: %d KB\n", c->x86_cache_size);
-+      
-+#ifdef CONFIG_SMP
-+      if (smp_num_siblings * c->x86_max_cores > 1) {
-+              int cpu = c - cpu_data;
-+              seq_printf(m, "physical id\t: %d\n", c->phys_proc_id);
-+              seq_printf(m, "siblings\t: %d\n", cpus_weight(cpu_core_map[cpu]));
-+              seq_printf(m, "core id\t\t: %d\n", c->cpu_core_id);
-+              seq_printf(m, "cpu cores\t: %d\n", c->booted_cores);
-+      }
-+#endif        
-+
-+      seq_printf(m,
-+              "fpu\t\t: yes\n"
-+              "fpu_exception\t: yes\n"
-+              "cpuid level\t: %d\n"
-+              "wp\t\t: yes\n"
-+              "flags\t\t:",
-+                 c->cpuid_level);
-+
-+      { 
-+              int i; 
-+              for ( i = 0 ; i < 32*NCAPINTS ; i++ )
-+                      if (cpu_has(c, i) && x86_cap_flags[i] != NULL)
-+                              seq_printf(m, " %s", x86_cap_flags[i]);
-+      }
-+              
-+      seq_printf(m, "\nbogomips\t: %lu.%02lu\n",
-+                 c->loops_per_jiffy/(500000/HZ),
-+                 (c->loops_per_jiffy/(5000/HZ)) % 100);
-+
-+      if (c->x86_tlbsize > 0) 
-+              seq_printf(m, "TLB size\t: %d 4K pages\n", c->x86_tlbsize);
-+      seq_printf(m, "clflush size\t: %d\n", c->x86_clflush_size);
-+      seq_printf(m, "cache_alignment\t: %d\n", c->x86_cache_alignment);
-+
-+      seq_printf(m, "address sizes\t: %u bits physical, %u bits virtual\n", 
-+                 c->x86_phys_bits, c->x86_virt_bits);
-+
-+      seq_printf(m, "power management:");
-+      {
-+              unsigned i;
-+              for (i = 0; i < 32; i++) 
-+                      if (c->x86_power & (1 << i)) {
-+                              if (i < ARRAY_SIZE(x86_power_flags) &&
-+                                      x86_power_flags[i])
-+                                      seq_printf(m, "%s%s",
-+                                              x86_power_flags[i][0]?" ":"",
-+                                              x86_power_flags[i]);
-+                              else
-+                                      seq_printf(m, " [%d]", i);
-+                      }
-+      }
-+
-+      seq_printf(m, "\n\n");
-+
-+      return 0;
-+}
-+
-+static void *c_start(struct seq_file *m, loff_t *pos)
-+{
-+      return *pos < NR_CPUS ? cpu_data + *pos : NULL;
-+}
-+
-+static void *c_next(struct seq_file *m, void *v, loff_t *pos)
-+{
-+      ++*pos;
-+      return c_start(m, pos);
-+}
-+
-+static void c_stop(struct seq_file *m, void *v)
-+{
-+}
-+
-+struct seq_operations cpuinfo_op = {
-+      .start =c_start,
-+      .next = c_next,
-+      .stop = c_stop,
-+      .show = show_cpuinfo,
-+};
-+
-+#if defined(CONFIG_INPUT_PCSPKR) || defined(CONFIG_INPUT_PCSPKR_MODULE)
-+#include <linux/platform_device.h>
-+static __init int add_pcspkr(void)
-+{
-+      struct platform_device *pd;
-+      int ret;
-+
-+      if (!is_initial_xendomain())
-+              return 0;
-+
-+      pd = platform_device_alloc("pcspkr", -1);
-+      if (!pd)
-+              return -ENOMEM;
-+
-+      ret = platform_device_add(pd);
-+      if (ret)
-+              platform_device_put(pd);
-+
-+      return ret;
-+}
-+device_initcall(add_pcspkr);
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/setup64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/setup64-xen.c      2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,367 @@
-+/* 
-+ * X86-64 specific CPU setup.
-+ * Copyright (C) 1995  Linus Torvalds
-+ * Copyright 2001, 2002, 2003 SuSE Labs / Andi Kleen.
-+ * See setup.c for older changelog.
-+ *
-+ * Jun Nakajima <jun.nakajima@intel.com> 
-+ *   Modified for Xen
-+ *
-+ */ 
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/string.h>
-+#include <linux/bootmem.h>
-+#include <linux/bitops.h>
-+#include <linux/module.h>
-+#include <asm/bootsetup.h>
-+#include <asm/pda.h>
-+#include <asm/pgtable.h>
-+#include <asm/processor.h>
-+#include <asm/desc.h>
-+#include <asm/atomic.h>
-+#include <asm/mmu_context.h>
-+#include <asm/smp.h>
-+#include <asm/i387.h>
-+#include <asm/percpu.h>
-+#include <asm/proto.h>
-+#include <asm/sections.h>
-+#ifdef CONFIG_XEN
-+#include <asm/hypervisor.h>
-+#endif
-+
-+char x86_boot_params[BOOT_PARAM_SIZE] __initdata = {0,};
-+
-+cpumask_t cpu_initialized __cpuinitdata = CPU_MASK_NONE;
-+
-+struct x8664_pda *_cpu_pda[NR_CPUS] __read_mostly;
-+EXPORT_SYMBOL(_cpu_pda);
-+struct x8664_pda boot_cpu_pda[NR_CPUS] __cacheline_aligned;
-+
-+#ifndef CONFIG_X86_NO_IDT
-+struct desc_ptr idt_descr = { 256 * 16 - 1, (unsigned long) idt_table }; 
-+#endif
-+
-+char boot_cpu_stack[IRQSTACKSIZE] __attribute__((section(".bss.page_aligned")));
-+
-+unsigned long __supported_pte_mask __read_mostly = ~0UL;
-+EXPORT_SYMBOL(__supported_pte_mask);
-+static int do_not_nx __cpuinitdata = 0;
-+
-+/* noexec=on|off
-+Control non executable mappings for 64bit processes.
-+
-+on    Enable(default)
-+off   Disable
-+*/ 
-+int __init nonx_setup(char *str)
-+{
-+      if (!strncmp(str, "on", 2)) {
-+                __supported_pte_mask |= _PAGE_NX; 
-+              do_not_nx = 0; 
-+      } else if (!strncmp(str, "off", 3)) {
-+              do_not_nx = 1;
-+              __supported_pte_mask &= ~_PAGE_NX;
-+        }
-+      return 1;
-+} 
-+__setup("noexec=", nonx_setup);       /* parsed early actually */
-+
-+int force_personality32 = 0; 
-+
-+/* noexec32=on|off
-+Control non executable heap for 32bit processes.
-+To control the stack too use noexec=off
-+
-+on    PROT_READ does not imply PROT_EXEC for 32bit processes
-+off   PROT_READ implies PROT_EXEC (default)
-+*/
-+static int __init nonx32_setup(char *str)
-+{
-+      if (!strcmp(str, "on"))
-+              force_personality32 &= ~READ_IMPLIES_EXEC;
-+      else if (!strcmp(str, "off"))
-+              force_personality32 |= READ_IMPLIES_EXEC;
-+      return 1;
-+}
-+__setup("noexec32=", nonx32_setup);
-+
-+/*
-+ * Great future plan:
-+ * Declare PDA itself and support (irqstack,tss,pgd) as per cpu data.
-+ * Always point %gs to its beginning
-+ */
-+void __init setup_per_cpu_areas(void)
-+{ 
-+      int i;
-+      unsigned long size;
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+      prefill_possible_map();
-+#endif
-+
-+      /* Copy section for each CPU (we discard the original) */
-+      size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
-+#ifdef CONFIG_MODULES
-+      if (size < PERCPU_ENOUGH_ROOM)
-+              size = PERCPU_ENOUGH_ROOM;
-+#endif
-+
-+      for_each_cpu_mask (i, cpu_possible_map) {
-+              char *ptr;
-+
-+              if (!NODE_DATA(cpu_to_node(i))) {
-+                      printk("cpu with no node %d, num_online_nodes %d\n",
-+                             i, num_online_nodes());
-+                      ptr = alloc_bootmem(size);
-+              } else { 
-+                      ptr = alloc_bootmem_node(NODE_DATA(cpu_to_node(i)), size);
-+              }
-+              if (!ptr)
-+                      panic("Cannot allocate cpu data for CPU %d\n", i);
-+              cpu_pda(i)->data_offset = ptr - __per_cpu_start;
-+              memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
-+      }
-+} 
-+
-+#ifdef CONFIG_XEN
-+static void switch_pt(void)
-+{
-+      xen_pt_switch(__pa_symbol(init_level4_pgt));
-+      xen_new_user_pt(__pa_symbol(__user_pgd(init_level4_pgt)));
-+}
-+
-+static void __cpuinit cpu_gdt_init(const struct desc_ptr *gdt_descr)
-+{
-+      unsigned long frames[16];
-+      unsigned long va;
-+      int f;
-+
-+      for (va = gdt_descr->address, f = 0;
-+           va < gdt_descr->address + gdt_descr->size;
-+           va += PAGE_SIZE, f++) {
-+              frames[f] = virt_to_mfn(va);
-+              make_page_readonly(
-+                      (void *)va, XENFEAT_writable_descriptor_tables);
-+      }
-+      if (HYPERVISOR_set_gdt(frames, (gdt_descr->size + 1) /
-+                               sizeof (struct desc_struct)))
-+              BUG();
-+}
-+#else
-+static void switch_pt(void)
-+{
-+      asm volatile("movq %0,%%cr3" :: "r" (__pa_symbol(&init_level4_pgt)));
-+}
-+
-+static void __cpuinit cpu_gdt_init(const struct desc_ptr *gdt_descr)
-+{
-+      asm volatile("lgdt %0" :: "m" (*gdt_descr));
-+      asm volatile("lidt %0" :: "m" (idt_descr));
-+}
-+#endif
-+
-+void pda_init(int cpu)
-+{ 
-+      struct x8664_pda *pda = cpu_pda(cpu);
-+
-+      /* Setup up data that may be needed in __get_free_pages early */
-+      asm volatile("movl %0,%%fs ; movl %0,%%gs" :: "r" (0)); 
-+#ifndef CONFIG_XEN
-+      wrmsrl(MSR_GS_BASE, pda);
-+#else
-+      if (HYPERVISOR_set_segment_base(SEGBASE_GS_KERNEL,
-+                                      (unsigned long)pda))
-+              BUG();
-+#endif
-+      pda->cpunumber = cpu; 
-+      pda->irqcount = -1;
-+      pda->kernelstack = 
-+              (unsigned long)stack_thread_info() - PDA_STACKOFFSET + THREAD_SIZE; 
-+      pda->active_mm = &init_mm;
-+      pda->mmu_state = 0;
-+
-+      if (cpu == 0) {
-+#ifdef CONFIG_XEN
-+              xen_init_pt();
-+#endif
-+              /* others are initialized in smpboot.c */
-+              pda->pcurrent = &init_task;
-+              pda->irqstackptr = boot_cpu_stack; 
-+      } else {
-+              pda->irqstackptr = (char *)
-+                      __get_free_pages(GFP_ATOMIC, IRQSTACK_ORDER);
-+              if (!pda->irqstackptr)
-+                      panic("cannot allocate irqstack for cpu %d", cpu); 
-+      }
-+
-+      switch_pt();
-+
-+      pda->irqstackptr += IRQSTACKSIZE-64;
-+} 
-+
-+#ifndef CONFIG_X86_NO_TSS
-+char boot_exception_stacks[(N_EXCEPTION_STACKS - 1) * EXCEPTION_STKSZ + DEBUG_STKSZ]
-+__attribute__((section(".bss.page_aligned")));
-+#endif
-+
-+/* May not be marked __init: used by software suspend */
-+void syscall_init(void)
-+{
-+#ifndef CONFIG_XEN
-+      /* 
-+       * LSTAR and STAR live in a bit strange symbiosis.
-+       * They both write to the same internal register. STAR allows to set CS/DS
-+       * but only a 32bit target. LSTAR sets the 64bit rip.    
-+       */ 
-+      wrmsrl(MSR_STAR,  ((u64)__USER32_CS)<<48  | ((u64)__KERNEL_CS)<<32); 
-+      wrmsrl(MSR_LSTAR, system_call); 
-+
-+      /* Flags to clear on syscall */
-+      wrmsrl(MSR_SYSCALL_MASK, EF_TF|EF_DF|EF_IE|0x3000); 
-+#endif
-+#ifdef CONFIG_IA32_EMULATION                  
-+      syscall32_cpu_init ();
-+#endif
-+}
-+
-+void __cpuinit check_efer(void)
-+{
-+      unsigned long efer;
-+
-+      rdmsrl(MSR_EFER, efer); 
-+        if (!(efer & EFER_NX) || do_not_nx) { 
-+                __supported_pte_mask &= ~_PAGE_NX; 
-+        }       
-+}
-+
-+unsigned long kernel_eflags;
-+
-+/*
-+ * cpu_init() initializes state that is per-CPU. Some data is already
-+ * initialized (naturally) in the bootstrap process, such as the GDT
-+ * and IDT. We reload them nevertheless, this function acts as a
-+ * 'CPU state barrier', nothing should get across.
-+ * A lot of state is already set up in PDA init.
-+ */
-+void __cpuinit cpu_init (void)
-+{
-+      int cpu = stack_smp_processor_id();
-+#ifndef CONFIG_X86_NO_TSS
-+      struct tss_struct *t = &per_cpu(init_tss, cpu);
-+      struct orig_ist *orig_ist = &per_cpu(orig_ist, cpu);
-+      unsigned long v; 
-+      char *estacks = NULL; 
-+      unsigned i;
-+#endif
-+      struct task_struct *me;
-+
-+      /* CPU 0 is initialised in head64.c */
-+      if (cpu != 0) {
-+              pda_init(cpu);
-+              zap_low_mappings(cpu);
-+      }
-+#ifndef CONFIG_X86_NO_TSS
-+      else
-+              estacks = boot_exception_stacks; 
-+#endif
-+
-+      me = current;
-+
-+      if (cpu_test_and_set(cpu, cpu_initialized))
-+              panic("CPU#%d already initialized!\n", cpu);
-+
-+      printk("Initializing CPU#%d\n", cpu);
-+
-+      clear_in_cr4(X86_CR4_VME|X86_CR4_PVI|X86_CR4_TSD|X86_CR4_DE);
-+
-+      /*
-+       * Initialize the per-CPU GDT with the boot GDT,
-+       * and set up the GDT descriptor:
-+       */
-+#ifndef CONFIG_XEN 
-+      if (cpu)
-+              memcpy(cpu_gdt(cpu), cpu_gdt_table, GDT_SIZE);
-+#endif
-+
-+      cpu_gdt_descr[cpu].size = GDT_SIZE;
-+      cpu_gdt_init(&cpu_gdt_descr[cpu]);
-+
-+      memset(me->thread.tls_array, 0, GDT_ENTRY_TLS_ENTRIES * 8);
-+      syscall_init();
-+
-+      wrmsrl(MSR_FS_BASE, 0);
-+      wrmsrl(MSR_KERNEL_GS_BASE, 0);
-+      barrier(); 
-+
-+      check_efer();
-+
-+#ifndef CONFIG_X86_NO_TSS
-+      /*
-+       * set up and load the per-CPU TSS
-+       */
-+      for (v = 0; v < N_EXCEPTION_STACKS; v++) {
-+              if (cpu) {
-+                      static const unsigned int order[N_EXCEPTION_STACKS] = {
-+                              [0 ... N_EXCEPTION_STACKS - 1] = EXCEPTION_STACK_ORDER,
-+                              [DEBUG_STACK - 1] = DEBUG_STACK_ORDER
-+                      };
-+
-+                      estacks = (char *)__get_free_pages(GFP_ATOMIC, order[v]);
-+                      if (!estacks)
-+                              panic("Cannot allocate exception stack %ld %d\n",
-+                                    v, cpu); 
-+              }
-+              switch (v + 1) {
-+#if DEBUG_STKSZ > EXCEPTION_STKSZ
-+              case DEBUG_STACK:
-+                      cpu_pda(cpu)->debugstack = (unsigned long)estacks;
-+                      estacks += DEBUG_STKSZ;
-+                      break;
-+#endif
-+              default:
-+                      estacks += EXCEPTION_STKSZ;
-+                      break;
-+              }
-+              orig_ist->ist[v] = t->ist[v] = (unsigned long)estacks;
-+      }
-+
-+      t->io_bitmap_base = offsetof(struct tss_struct, io_bitmap);
-+      /*
-+       * <= is required because the CPU will access up to
-+       * 8 bits beyond the end of the IO permission bitmap.
-+       */
-+      for (i = 0; i <= IO_BITMAP_LONGS; i++)
-+              t->io_bitmap[i] = ~0UL;
-+#endif
-+
-+      atomic_inc(&init_mm.mm_count);
-+      me->active_mm = &init_mm;
-+      if (me->mm)
-+              BUG();
-+      enter_lazy_tlb(&init_mm, me);
-+
-+#ifndef CONFIG_X86_NO_TSS
-+      set_tss_desc(cpu, t);
-+#endif
-+#ifndef CONFIG_XEN
-+      load_TR_desc();
-+#endif
-+      load_LDT(&init_mm.context);
-+
-+      /*
-+       * Clear all 6 debug registers:
-+       */
-+
-+      set_debugreg(0UL, 0);
-+      set_debugreg(0UL, 1);
-+      set_debugreg(0UL, 2);
-+      set_debugreg(0UL, 3);
-+      set_debugreg(0UL, 6);
-+      set_debugreg(0UL, 7);
-+
-+      fpu_init(); 
-+
-+      raw_local_save_flags(kernel_eflags);
-+}
-Index: head-2008-11-25/arch/x86/kernel/smp_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/smp_64-xen.c       2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,575 @@
-+/*
-+ *    Intel SMP support routines.
-+ *
-+ *    (c) 1995 Alan Cox, Building #3 <alan@redhat.com>
-+ *    (c) 1998-99, 2000 Ingo Molnar <mingo@redhat.com>
-+ *      (c) 2002,2003 Andi Kleen, SuSE Labs.
-+ *
-+ *    This code is released under the GNU General Public License version 2 or
-+ *    later.
-+ */
-+
-+#include <linux/init.h>
-+
-+#include <linux/mm.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/smp_lock.h>
-+#include <linux/smp.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/mc146818rtc.h>
-+#include <linux/interrupt.h>
-+
-+#include <asm/mtrr.h>
-+#include <asm/pgalloc.h>
-+#include <asm/tlbflush.h>
-+#include <asm/mach_apic.h>
-+#include <asm/mmu_context.h>
-+#include <asm/proto.h>
-+#include <asm/apicdef.h>
-+#include <asm/idle.h>
-+#ifdef CONFIG_XEN
-+#include <xen/evtchn.h>
-+#endif
-+
-+#ifndef CONFIG_XEN
-+/*
-+ *    Smarter SMP flushing macros. 
-+ *            c/o Linus Torvalds.
-+ *
-+ *    These mean you can really definitely utterly forget about
-+ *    writing to user space from interrupts. (Its not allowed anyway).
-+ *
-+ *    Optimizations Manfred Spraul <manfred@colorfullife.com>
-+ *
-+ *    More scalable flush, from Andi Kleen
-+ *
-+ *    To avoid global state use 8 different call vectors.
-+ *    Each CPU uses a specific vector to trigger flushes on other
-+ *    CPUs. Depending on the received vector the target CPUs look into
-+ *    the right per cpu variable for the flush data.
-+ *
-+ *    With more than 8 CPUs they are hashed to the 8 available
-+ *    vectors. The limited global vector space forces us to this right now.
-+ *    In future when interrupts are split into per CPU domains this could be
-+ *    fixed, at the cost of triggering multiple IPIs in some cases.
-+ */
-+
-+union smp_flush_state {
-+      struct {
-+              cpumask_t flush_cpumask;
-+              struct mm_struct *flush_mm;
-+              unsigned long flush_va;
-+#define FLUSH_ALL     -1ULL
-+              spinlock_t tlbstate_lock;
-+      };
-+      char pad[SMP_CACHE_BYTES];
-+} ____cacheline_aligned;
-+
-+/* State is put into the per CPU data section, but padded
-+   to a full cache line because other CPUs can access it and we don't
-+   want false sharing in the per cpu data segment. */
-+static DEFINE_PER_CPU(union smp_flush_state, flush_state);
-+
-+/*
-+ * We cannot call mmdrop() because we are in interrupt context, 
-+ * instead update mm->cpu_vm_mask.
-+ */
-+static inline void leave_mm(unsigned long cpu)
-+{
-+      if (read_pda(mmu_state) == TLBSTATE_OK)
-+              BUG();
-+      cpu_clear(cpu, read_pda(active_mm)->cpu_vm_mask);
-+      load_cr3(swapper_pg_dir);
-+}
-+
-+/*
-+ *
-+ * The flush IPI assumes that a thread switch happens in this order:
-+ * [cpu0: the cpu that switches]
-+ * 1) switch_mm() either 1a) or 1b)
-+ * 1a) thread switch to a different mm
-+ * 1a1) cpu_clear(cpu, old_mm->cpu_vm_mask);
-+ *    Stop ipi delivery for the old mm. This is not synchronized with
-+ *    the other cpus, but smp_invalidate_interrupt ignore flush ipis
-+ *    for the wrong mm, and in the worst case we perform a superfluous
-+ *    tlb flush.
-+ * 1a2) set cpu mmu_state to TLBSTATE_OK
-+ *    Now the smp_invalidate_interrupt won't call leave_mm if cpu0
-+ *    was in lazy tlb mode.
-+ * 1a3) update cpu active_mm
-+ *    Now cpu0 accepts tlb flushes for the new mm.
-+ * 1a4) cpu_set(cpu, new_mm->cpu_vm_mask);
-+ *    Now the other cpus will send tlb flush ipis.
-+ * 1a4) change cr3.
-+ * 1b) thread switch without mm change
-+ *    cpu active_mm is correct, cpu0 already handles
-+ *    flush ipis.
-+ * 1b1) set cpu mmu_state to TLBSTATE_OK
-+ * 1b2) test_and_set the cpu bit in cpu_vm_mask.
-+ *    Atomically set the bit [other cpus will start sending flush ipis],
-+ *    and test the bit.
-+ * 1b3) if the bit was 0: leave_mm was called, flush the tlb.
-+ * 2) switch %%esp, ie current
-+ *
-+ * The interrupt must handle 2 special cases:
-+ * - cr3 is changed before %%esp, ie. it cannot use current->{active_,}mm.
-+ * - the cpu performs speculative tlb reads, i.e. even if the cpu only
-+ *   runs in kernel space, the cpu could load tlb entries for user space
-+ *   pages.
-+ *
-+ * The good news is that cpu mmu_state is local to each cpu, no
-+ * write/read ordering problems.
-+ */
-+
-+/*
-+ * TLB flush IPI:
-+ *
-+ * 1) Flush the tlb entries if the cpu uses the mm that's being flushed.
-+ * 2) Leave the mm if we are in the lazy tlb mode.
-+ *
-+ * Interrupts are disabled.
-+ */
-+
-+asmlinkage void smp_invalidate_interrupt(struct pt_regs *regs)
-+{
-+      int cpu;
-+      int sender;
-+      union smp_flush_state *f;
-+
-+      cpu = smp_processor_id();
-+      /*
-+       * orig_rax contains the negated interrupt vector.
-+       * Use that to determine where the sender put the data.
-+       */
-+      sender = ~regs->orig_rax - INVALIDATE_TLB_VECTOR_START;
-+      f = &per_cpu(flush_state, sender);
-+
-+      if (!cpu_isset(cpu, f->flush_cpumask))
-+              goto out;
-+              /* 
-+               * This was a BUG() but until someone can quote me the
-+               * line from the intel manual that guarantees an IPI to
-+               * multiple CPUs is retried _only_ on the erroring CPUs
-+               * its staying as a return
-+               *
-+               * BUG();
-+               */
-+               
-+      if (f->flush_mm == read_pda(active_mm)) {
-+              if (read_pda(mmu_state) == TLBSTATE_OK) {
-+                      if (f->flush_va == FLUSH_ALL)
-+                              local_flush_tlb();
-+                      else
-+                              __flush_tlb_one(f->flush_va);
-+              } else
-+                      leave_mm(cpu);
-+      }
-+out:
-+      ack_APIC_irq();
-+      cpu_clear(cpu, f->flush_cpumask);
-+}
-+
-+static void flush_tlb_others(cpumask_t cpumask, struct mm_struct *mm,
-+                                              unsigned long va)
-+{
-+      int sender;
-+      union smp_flush_state *f;
-+
-+      /* Caller has disabled preemption */
-+      sender = smp_processor_id() % NUM_INVALIDATE_TLB_VECTORS;
-+      f = &per_cpu(flush_state, sender);
-+
-+      /* Could avoid this lock when
-+         num_online_cpus() <= NUM_INVALIDATE_TLB_VECTORS, but it is
-+         probably not worth checking this for a cache-hot lock. */
-+      spin_lock(&f->tlbstate_lock);
-+
-+      f->flush_mm = mm;
-+      f->flush_va = va;
-+      cpus_or(f->flush_cpumask, cpumask, f->flush_cpumask);
-+
-+      /*
-+       * We have to send the IPI only to
-+       * CPUs affected.
-+       */
-+      send_IPI_mask(cpumask, INVALIDATE_TLB_VECTOR_START + sender);
-+
-+      while (!cpus_empty(f->flush_cpumask))
-+              cpu_relax();
-+
-+      f->flush_mm = NULL;
-+      f->flush_va = 0;
-+      spin_unlock(&f->tlbstate_lock);
-+}
-+
-+int __cpuinit init_smp_flush(void)
-+{
-+      int i;
-+      for_each_cpu_mask(i, cpu_possible_map) {
-+              spin_lock_init(&per_cpu(flush_state, i).tlbstate_lock);
-+      }
-+      return 0;
-+}
-+
-+core_initcall(init_smp_flush);
-+      
-+void flush_tlb_current_task(void)
-+{
-+      struct mm_struct *mm = current->mm;
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      local_flush_tlb();
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-+      preempt_enable();
-+}
-+EXPORT_SYMBOL(flush_tlb_current_task);
-+
-+void flush_tlb_mm (struct mm_struct * mm)
-+{
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      if (current->active_mm == mm) {
-+              if (current->mm)
-+                      local_flush_tlb();
-+              else
-+                      leave_mm(smp_processor_id());
-+      }
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, FLUSH_ALL);
-+
-+      preempt_enable();
-+}
-+EXPORT_SYMBOL(flush_tlb_mm);
-+
-+void flush_tlb_page(struct vm_area_struct * vma, unsigned long va)
-+{
-+      struct mm_struct *mm = vma->vm_mm;
-+      cpumask_t cpu_mask;
-+
-+      preempt_disable();
-+      cpu_mask = mm->cpu_vm_mask;
-+      cpu_clear(smp_processor_id(), cpu_mask);
-+
-+      if (current->active_mm == mm) {
-+              if(current->mm)
-+                      __flush_tlb_one(va);
-+               else
-+                      leave_mm(smp_processor_id());
-+      }
-+
-+      if (!cpus_empty(cpu_mask))
-+              flush_tlb_others(cpu_mask, mm, va);
-+
-+      preempt_enable();
-+}
-+EXPORT_SYMBOL(flush_tlb_page);
-+
-+static void do_flush_tlb_all(void* info)
-+{
-+      unsigned long cpu = smp_processor_id();
-+
-+      __flush_tlb_all();
-+      if (read_pda(mmu_state) == TLBSTATE_LAZY)
-+              leave_mm(cpu);
-+}
-+
-+void flush_tlb_all(void)
-+{
-+      on_each_cpu(do_flush_tlb_all, NULL, 1, 1);
-+}
-+#endif /* Xen */
-+
-+/*
-+ * this function sends a 'reschedule' IPI to another CPU.
-+ * it goes straight through and wastes no time serializing
-+ * anything. Worst case is that we lose a reschedule ...
-+ */
-+
-+void smp_send_reschedule(int cpu)
-+{
-+      send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
-+}
-+
-+/*
-+ * Structure and data for smp_call_function(). This is designed to minimise
-+ * static memory requirements. It also looks cleaner.
-+ */
-+static DEFINE_SPINLOCK(call_lock);
-+
-+struct call_data_struct {
-+      void (*func) (void *info);
-+      void *info;
-+      atomic_t started;
-+      atomic_t finished;
-+      int wait;
-+};
-+
-+static struct call_data_struct * call_data;
-+
-+void lock_ipi_call_lock(void)
-+{
-+      spin_lock_irq(&call_lock);
-+}
-+
-+void unlock_ipi_call_lock(void)
-+{
-+      spin_unlock_irq(&call_lock);
-+}
-+
-+/*
-+ * this function sends a 'generic call function' IPI to one other CPU
-+ * in the system.
-+ *
-+ * cpu is a standard Linux logical CPU number.
-+ */
-+static void
-+__smp_call_function_single(int cpu, void (*func) (void *info), void *info,
-+                              int nonatomic, int wait)
-+{
-+      struct call_data_struct data;
-+      int cpus = 1;
-+
-+      data.func = func;
-+      data.info = info;
-+      atomic_set(&data.started, 0);
-+      data.wait = wait;
-+      if (wait)
-+              atomic_set(&data.finished, 0);
-+
-+      call_data = &data;
-+      wmb();
-+      /* Send a message to all other CPUs and wait for them to respond */
-+      send_IPI_mask(cpumask_of_cpu(cpu), CALL_FUNCTION_VECTOR);
-+
-+      /* Wait for response */
-+      while (atomic_read(&data.started) != cpus)
-+              cpu_relax();
-+
-+      if (!wait)
-+              return;
-+
-+      while (atomic_read(&data.finished) != cpus)
-+              cpu_relax();
-+}
-+
-+/*
-+ * smp_call_function_single - Run a function on another CPU
-+ * @func: The function to run. This must be fast and non-blocking.
-+ * @info: An arbitrary pointer to pass to the function.
-+ * @nonatomic: Currently unused.
-+ * @wait: If true, wait until function has completed on other CPUs.
-+ *
-+ * Retrurns 0 on success, else a negative status code.
-+ *
-+ * Does not return until the remote CPU is nearly ready to execute <func>
-+ * or is or has executed.
-+ */
-+
-+int smp_call_function_single (int cpu, void (*func) (void *info), void *info,
-+      int nonatomic, int wait)
-+{
-+      /* prevent preemption and reschedule on another processor */
-+      int me = get_cpu();
-+      if (cpu == me) {
-+              WARN_ON(1);
-+              put_cpu();
-+              return -EBUSY;
-+      }
-+      spin_lock_bh(&call_lock);
-+      __smp_call_function_single(cpu, func, info, nonatomic, wait);
-+      spin_unlock_bh(&call_lock);
-+      put_cpu();
-+      return 0;
-+}
-+
-+/*
-+ * this function sends a 'generic call function' IPI to all other CPUs
-+ * in the system.
-+ */
-+static void __smp_call_function (void (*func) (void *info), void *info,
-+                              int nonatomic, int wait)
-+{
-+      struct call_data_struct data;
-+      int cpus = num_online_cpus()-1;
-+
-+      if (!cpus)
-+              return;
-+
-+      data.func = func;
-+      data.info = info;
-+      atomic_set(&data.started, 0);
-+      data.wait = wait;
-+      if (wait)
-+              atomic_set(&data.finished, 0);
-+
-+      call_data = &data;
-+      wmb();
-+      /* Send a message to all other CPUs and wait for them to respond */
-+      send_IPI_allbutself(CALL_FUNCTION_VECTOR);
-+
-+      /* Wait for response */
-+      while (atomic_read(&data.started) != cpus)
-+              cpu_relax();
-+
-+      if (!wait)
-+              return;
-+
-+      while (atomic_read(&data.finished) != cpus)
-+              cpu_relax();
-+}
-+
-+/*
-+ * smp_call_function - run a function on all other CPUs.
-+ * @func: The function to run. This must be fast and non-blocking.
-+ * @info: An arbitrary pointer to pass to the function.
-+ * @nonatomic: currently unused.
-+ * @wait: If true, wait (atomically) until function has completed on other
-+ *        CPUs.
-+ *
-+ * Returns 0 on success, else a negative status code. Does not return until
-+ * remote CPUs are nearly ready to execute func or are or have executed.
-+ *
-+ * You must not call this function with disabled interrupts or from a
-+ * hardware interrupt handler or from a bottom half handler.
-+ * Actually there are a few legal cases, like panic.
-+ */
-+int smp_call_function (void (*func) (void *info), void *info, int nonatomic,
-+                      int wait)
-+{
-+      spin_lock(&call_lock);
-+      __smp_call_function(func,info,nonatomic,wait);
-+      spin_unlock(&call_lock);
-+      return 0;
-+}
-+EXPORT_SYMBOL(smp_call_function);
-+
-+void smp_stop_cpu(void)
-+{
-+      unsigned long flags;
-+      /*
-+       * Remove this CPU:
-+       */
-+      cpu_clear(smp_processor_id(), cpu_online_map);
-+      local_irq_save(flags);
-+      disable_all_local_evtchn();
-+      local_irq_restore(flags); 
-+}
-+
-+static void smp_really_stop_cpu(void *dummy)
-+{
-+      smp_stop_cpu(); 
-+      for (;;) 
-+              halt();
-+} 
-+
-+void smp_send_stop(void)
-+{
-+      int nolock = 0;
-+#ifndef CONFIG_XEN
-+      if (reboot_force)
-+              return;
-+#endif
-+      /* Don't deadlock on the call lock in panic */
-+      if (!spin_trylock(&call_lock)) {
-+              /* ignore locking because we have panicked anyways */
-+              nolock = 1;
-+      }
-+      __smp_call_function(smp_really_stop_cpu, NULL, 0, 0);
-+      if (!nolock)
-+              spin_unlock(&call_lock);
-+
-+      local_irq_disable();
-+      disable_all_local_evtchn();
-+      local_irq_enable();
-+}
-+
-+/*
-+ * Reschedule call back. Nothing to do,
-+ * all the work is done automatically when
-+ * we return from the interrupt.
-+ */
-+#ifndef CONFIG_XEN
-+asmlinkage void smp_reschedule_interrupt(void)
-+#else
-+asmlinkage irqreturn_t smp_reschedule_interrupt(void)
-+#endif
-+{
-+#ifndef CONFIG_XEN
-+      ack_APIC_irq();
-+#else
-+      return IRQ_HANDLED;
-+#endif
-+}
-+
-+#ifndef CONFIG_XEN
-+asmlinkage void smp_call_function_interrupt(void)
-+#else
-+asmlinkage irqreturn_t smp_call_function_interrupt(void)
-+#endif
-+{
-+      void (*func) (void *info) = call_data->func;
-+      void *info = call_data->info;
-+      int wait = call_data->wait;
-+
-+#ifndef CONFIG_XEN
-+      ack_APIC_irq();
-+#endif
-+      /*
-+       * Notify initiating CPU that I've grabbed the data and am
-+       * about to execute the function
-+       */
-+      mb();
-+      atomic_inc(&call_data->started);
-+      /*
-+       * At this point the info structure may be out of scope unless wait==1
-+       */
-+      exit_idle();
-+      irq_enter();
-+      (*func)(info);
-+      irq_exit();
-+      if (wait) {
-+              mb();
-+              atomic_inc(&call_data->finished);
-+      }
-+#ifdef CONFIG_XEN
-+      return IRQ_HANDLED;
-+#endif
-+}
-+
-+int safe_smp_processor_id(void)
-+{
-+#ifdef CONFIG_XEN
-+      return smp_processor_id();
-+#else
-+      unsigned apicid, i;
-+
-+      if (disable_apic)
-+              return 0;
-+
-+      apicid = hard_smp_processor_id();
-+      if (apicid < NR_CPUS && x86_cpu_to_apicid[apicid] == apicid)
-+              return apicid;
-+
-+      for (i = 0; i < NR_CPUS; ++i) {
-+              if (x86_cpu_to_apicid[i] == apicid)
-+                      return i;
-+      }
-+
-+      /* No entries in x86_cpu_to_apicid?  Either no MPS|ACPI,
-+       * or called too early.  Either way, we must be CPU 0. */
-+              if (x86_cpu_to_apicid[0] == BAD_APICID)
-+              return 0;
-+
-+      return 0; /* Should not happen */
-+#endif
-+}
-Index: head-2008-11-25/arch/x86/kernel/traps_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/traps_64-xen.c     2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,1173 @@
-+/*
-+ *  linux/arch/x86-64/traps.c
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *  Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
-+ *
-+ *  Pentium III FXSR, SSE support
-+ *    Gareth Hughes <gareth@valinux.com>, May 2000
-+ */
-+
-+/*
-+ * 'Traps.c' handles hardware traps and faults after we have saved some
-+ * state in 'entry.S'.
-+ */
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/ptrace.h>
-+#include <linux/timer.h>
-+#include <linux/mm.h>
-+#include <linux/init.h>
-+#include <linux/delay.h>
-+#include <linux/spinlock.h>
-+#include <linux/interrupt.h>
-+#include <linux/module.h>
-+#include <linux/moduleparam.h>
-+#include <linux/nmi.h>
-+#include <linux/kprobes.h>
-+#include <linux/kexec.h>
-+#include <linux/unwind.h>
-+
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/atomic.h>
-+#include <asm/debugreg.h>
-+#include <asm/desc.h>
-+#include <asm/i387.h>
-+#include <asm/kdebug.h>
-+#include <asm/processor.h>
-+#include <asm/unwind.h>
-+#include <asm/smp.h>
-+#include <asm/pgalloc.h>
-+#include <asm/pda.h>
-+#include <asm/proto.h>
-+#include <asm/nmi.h>
-+
-+asmlinkage void divide_error(void);
-+asmlinkage void debug(void);
-+asmlinkage void nmi(void);
-+asmlinkage void int3(void);
-+asmlinkage void overflow(void);
-+asmlinkage void bounds(void);
-+asmlinkage void invalid_op(void);
-+asmlinkage void device_not_available(void);
-+asmlinkage void double_fault(void);
-+asmlinkage void coprocessor_segment_overrun(void);
-+asmlinkage void invalid_TSS(void);
-+asmlinkage void segment_not_present(void);
-+asmlinkage void stack_segment(void);
-+asmlinkage void general_protection(void);
-+asmlinkage void page_fault(void);
-+asmlinkage void coprocessor_error(void);
-+asmlinkage void simd_coprocessor_error(void);
-+asmlinkage void reserved(void);
-+asmlinkage void alignment_check(void);
-+asmlinkage void machine_check(void);
-+asmlinkage void spurious_interrupt_bug(void);
-+
-+ATOMIC_NOTIFIER_HEAD(die_chain);
-+EXPORT_SYMBOL(die_chain);
-+
-+int register_die_notifier(struct notifier_block *nb)
-+{
-+      vmalloc_sync_all();
-+      return atomic_notifier_chain_register(&die_chain, nb);
-+}
-+EXPORT_SYMBOL(register_die_notifier); /* used modular by kdb */
-+
-+int unregister_die_notifier(struct notifier_block *nb)
-+{
-+      return atomic_notifier_chain_unregister(&die_chain, nb);
-+}
-+EXPORT_SYMBOL(unregister_die_notifier); /* used modular by kdb */
-+
-+static inline void conditional_sti(struct pt_regs *regs)
-+{
-+      if (regs->eflags & X86_EFLAGS_IF)
-+              local_irq_enable();
-+}
-+
-+static inline void preempt_conditional_sti(struct pt_regs *regs)
-+{
-+      preempt_disable();
-+      if (regs->eflags & X86_EFLAGS_IF)
-+              local_irq_enable();
-+}
-+
-+static inline void preempt_conditional_cli(struct pt_regs *regs)
-+{
-+      if (regs->eflags & X86_EFLAGS_IF)
-+              local_irq_disable();
-+      /* Make sure to not schedule here because we could be running
-+         on an exception stack. */
-+      preempt_enable_no_resched();
-+}
-+
-+static int kstack_depth_to_print = 12;
-+#ifdef CONFIG_STACK_UNWIND
-+static int call_trace = 1;
-+#else
-+#define call_trace (-1)
-+#endif
-+
-+#ifdef CONFIG_KALLSYMS
-+# include <linux/kallsyms.h>
-+void printk_address(unsigned long address)
-+{
-+      unsigned long offset = 0, symsize;
-+      const char *symname;
-+      char *modname;
-+      char *delim = ":";
-+      char namebuf[128];
-+
-+      symname = kallsyms_lookup(address, &symsize, &offset,
-+                                      &modname, namebuf);
-+      if (!symname) {
-+              printk(" [<%016lx>]\n", address);
-+              return;
-+      }
-+      if (!modname)
-+              modname = delim = "";           
-+      printk(" [<%016lx>] %s%s%s%s+0x%lx/0x%lx\n",
-+              address, delim, modname, delim, symname, offset, symsize);
-+}
-+#else
-+void printk_address(unsigned long address)
-+{
-+      printk(" [<%016lx>]\n", address);
-+}
-+#endif
-+
-+static unsigned long *in_exception_stack(unsigned cpu, unsigned long stack,
-+                                      unsigned *usedp, const char **idp)
-+{
-+#ifndef CONFIG_X86_NO_TSS
-+      static char ids[][8] = {
-+              [DEBUG_STACK - 1] = "#DB",
-+              [NMI_STACK - 1] = "NMI",
-+              [DOUBLEFAULT_STACK - 1] = "#DF",
-+              [STACKFAULT_STACK - 1] = "#SS",
-+              [MCE_STACK - 1] = "#MC",
-+#if DEBUG_STKSZ > EXCEPTION_STKSZ
-+              [N_EXCEPTION_STACKS ... N_EXCEPTION_STACKS + DEBUG_STKSZ / EXCEPTION_STKSZ - 2] = "#DB[?]"
-+#endif
-+      };
-+      unsigned k;
-+
-+      /*
-+       * Iterate over all exception stacks, and figure out whether
-+       * 'stack' is in one of them:
-+       */
-+      for (k = 0; k < N_EXCEPTION_STACKS; k++) {
-+              unsigned long end;
-+
-+              /*
-+               * set 'end' to the end of the exception stack.
-+               */
-+              switch (k + 1) {
-+              /*
-+               * TODO: this block is not needed i think, because
-+               * setup64.c:cpu_init() sets up t->ist[DEBUG_STACK]
-+               * properly too.
-+               */
-+#if DEBUG_STKSZ > EXCEPTION_STKSZ
-+              case DEBUG_STACK:
-+                      end = cpu_pda(cpu)->debugstack + DEBUG_STKSZ;
-+                      break;
-+#endif
-+              default:
-+                      end = per_cpu(orig_ist, cpu).ist[k];
-+                      break;
-+              }
-+              /*
-+               * Is 'stack' above this exception frame's end?
-+               * If yes then skip to the next frame.
-+               */
-+              if (stack >= end)
-+                      continue;
-+              /*
-+               * Is 'stack' above this exception frame's start address?
-+               * If yes then we found the right frame.
-+               */
-+              if (stack >= end - EXCEPTION_STKSZ) {
-+                      /*
-+                       * Make sure we only iterate through an exception
-+                       * stack once. If it comes up for the second time
-+                       * then there's something wrong going on - just
-+                       * break out and return NULL:
-+                       */
-+                      if (*usedp & (1U << k))
-+                              break;
-+                      *usedp |= 1U << k;
-+                      *idp = ids[k];
-+                      return (unsigned long *)end;
-+              }
-+              /*
-+               * If this is a debug stack, and if it has a larger size than
-+               * the usual exception stacks, then 'stack' might still
-+               * be within the lower portion of the debug stack:
-+               */
-+#if DEBUG_STKSZ > EXCEPTION_STKSZ
-+              if (k == DEBUG_STACK - 1 && stack >= end - DEBUG_STKSZ) {
-+                      unsigned j = N_EXCEPTION_STACKS - 1;
-+
-+                      /*
-+                       * Black magic. A large debug stack is composed of
-+                       * multiple exception stack entries, which we
-+                       * iterate through now. Dont look:
-+                       */
-+                      do {
-+                              ++j;
-+                              end -= EXCEPTION_STKSZ;
-+                              ids[j][4] = '1' + (j - N_EXCEPTION_STACKS);
-+                      } while (stack < end - EXCEPTION_STKSZ);
-+                      if (*usedp & (1U << j))
-+                              break;
-+                      *usedp |= 1U << j;
-+                      *idp = ids[j];
-+                      return (unsigned long *)end;
-+              }
-+#endif
-+      }
-+#endif
-+      return NULL;
-+}
-+
-+static int show_trace_unwind(struct unwind_frame_info *info, void *context)
-+{
-+      int n = 0;
-+
-+      while (unwind(info) == 0 && UNW_PC(info)) {
-+              n++;
-+              printk_address(UNW_PC(info));
-+              if (arch_unw_user_mode(info))
-+                      break;
-+      }
-+      return n;
-+}
-+
-+/*
-+ * x86-64 can have upto three kernel stacks: 
-+ * process stack
-+ * interrupt stack
-+ * severe exception (double fault, nmi, stack fault, debug, mce) hardware stack
-+ */
-+
-+void show_trace(struct task_struct *tsk, struct pt_regs *regs, unsigned long * stack)
-+{
-+      const unsigned cpu = safe_smp_processor_id();
-+      unsigned long *irqstack_end = (unsigned long *)cpu_pda(cpu)->irqstackptr;
-+      unsigned used = 0;
-+
-+      printk("\nCall Trace:\n");
-+
-+      if (!tsk)
-+              tsk = current;
-+
-+      if (call_trace >= 0) {
-+              int unw_ret = 0;
-+              struct unwind_frame_info info;
-+
-+              if (regs) {
-+                      if (unwind_init_frame_info(&info, tsk, regs) == 0)
-+                              unw_ret = show_trace_unwind(&info, NULL);
-+              } else if (tsk == current)
-+                      unw_ret = unwind_init_running(&info, show_trace_unwind, NULL);
-+              else {
-+                      if (unwind_init_blocked(&info, tsk) == 0)
-+                              unw_ret = show_trace_unwind(&info, NULL);
-+              }
-+              if (unw_ret > 0) {
-+                      if (call_trace == 1 && !arch_unw_user_mode(&info)) {
-+                              print_symbol("DWARF2 unwinder stuck at %s\n",
-+                                           UNW_PC(&info));
-+                              if ((long)UNW_SP(&info) < 0) {
-+                                      printk("Leftover inexact backtrace:\n");
-+                                      stack = (unsigned long *)UNW_SP(&info);
-+                              } else
-+                                      printk("Full inexact backtrace again:\n");
-+                      } else if (call_trace >= 1)
-+                              return;
-+                      else
-+                              printk("Full inexact backtrace again:\n");
-+              } else
-+                      printk("Inexact backtrace:\n");
-+      }
-+
-+      /*
-+       * Print function call entries within a stack. 'cond' is the
-+       * "end of stackframe" condition, that the 'stack++'
-+       * iteration will eventually trigger.
-+       */
-+#define HANDLE_STACK(cond) \
-+      do while (cond) { \
-+              unsigned long addr = *stack++; \
-+              if (kernel_text_address(addr)) { \
-+                      /* \
-+                       * If the address is either in the text segment of the \
-+                       * kernel, or in the region which contains vmalloc'ed \
-+                       * memory, it *may* be the address of a calling \
-+                       * routine; if so, print it so that someone tracing \
-+                       * down the cause of the crash will be able to figure \
-+                       * out the call path that was taken. \
-+                       */ \
-+                      printk_address(addr); \
-+              } \
-+      } while (0)
-+
-+      /*
-+       * Print function call entries in all stacks, starting at the
-+       * current stack address. If the stacks consist of nested
-+       * exceptions
-+       */
-+      for ( ; ; ) {
-+              const char *id;
-+              unsigned long *estack_end;
-+              estack_end = in_exception_stack(cpu, (unsigned long)stack,
-+                                              &used, &id);
-+
-+              if (estack_end) {
-+                      printk(" <%s>", id);
-+                      HANDLE_STACK (stack < estack_end);
-+                      printk(" <EOE>");
-+                      /*
-+                       * We link to the next stack via the
-+                       * second-to-last pointer (index -2 to end) in the
-+                       * exception stack:
-+                       */
-+                      stack = (unsigned long *) estack_end[-2];
-+                      continue;
-+              }
-+              if (irqstack_end) {
-+                      unsigned long *irqstack;
-+                      irqstack = irqstack_end -
-+                              (IRQSTACKSIZE - 64) / sizeof(*irqstack);
-+
-+                      if (stack >= irqstack && stack < irqstack_end) {
-+                              printk(" <IRQ>");
-+                              HANDLE_STACK (stack < irqstack_end);
-+                              /*
-+                               * We link to the next stack (which would be
-+                               * the process stack normally) the last
-+                               * pointer (index -1 to end) in the IRQ stack:
-+                               */
-+                              stack = (unsigned long *) (irqstack_end[-1]);
-+                              irqstack_end = NULL;
-+                              printk(" <EOI>");
-+                              continue;
-+                      }
-+              }
-+              break;
-+      }
-+
-+      /*
-+       * This prints the process stack:
-+       */
-+      HANDLE_STACK (((long) stack & (THREAD_SIZE-1)) != 0);
-+#undef HANDLE_STACK
-+
-+      printk("\n");
-+}
-+
-+static void _show_stack(struct task_struct *tsk, struct pt_regs *regs, unsigned long * rsp)
-+{
-+      unsigned long *stack;
-+      int i;
-+      const int cpu = safe_smp_processor_id();
-+      unsigned long *irqstack_end = (unsigned long *) (cpu_pda(cpu)->irqstackptr);
-+      unsigned long *irqstack = (unsigned long *) (cpu_pda(cpu)->irqstackptr - IRQSTACKSIZE);
-+
-+      // debugging aid: "show_stack(NULL, NULL);" prints the
-+      // back trace for this cpu.
-+
-+      if (rsp == NULL) {
-+              if (tsk)
-+                      rsp = (unsigned long *)tsk->thread.rsp;
-+              else
-+                      rsp = (unsigned long *)&rsp;
-+      }
-+
-+      stack = rsp;
-+      for(i=0; i < kstack_depth_to_print; i++) {
-+              if (stack >= irqstack && stack <= irqstack_end) {
-+                      if (stack == irqstack_end) {
-+                              stack = (unsigned long *) (irqstack_end[-1]);
-+                              printk(" <EOI> ");
-+                      }
-+              } else {
-+              if (((long) stack & (THREAD_SIZE-1)) == 0)
-+                      break;
-+              }
-+              if (i && ((i % 4) == 0))
-+                      printk("\n");
-+              printk(" %016lx", *stack++);
-+              touch_nmi_watchdog();
-+      }
-+      show_trace(tsk, regs, rsp);
-+}
-+
-+void show_stack(struct task_struct *tsk, unsigned long * rsp)
-+{
-+      _show_stack(tsk, NULL, rsp);
-+}
-+
-+/*
-+ * The architecture-independent dump_stack generator
-+ */
-+void dump_stack(void)
-+{
-+      unsigned long dummy;
-+      show_trace(NULL, NULL, &dummy);
-+}
-+
-+EXPORT_SYMBOL(dump_stack);
-+
-+void show_registers(struct pt_regs *regs)
-+{
-+      int i;
-+      int in_kernel = !user_mode(regs);
-+      unsigned long rsp;
-+      const int cpu = safe_smp_processor_id(); 
-+      struct task_struct *cur = cpu_pda(cpu)->pcurrent;
-+
-+              rsp = regs->rsp;
-+
-+      printk("CPU %d ", cpu);
-+      __show_regs(regs);
-+      printk("Process %s (pid: %d, threadinfo %p, task %p)\n",
-+              cur->comm, cur->pid, task_thread_info(cur), cur);
-+
-+      /*
-+       * When in-kernel, we also print out the stack and code at the
-+       * time of the fault..
-+       */
-+      if (in_kernel) {
-+
-+              printk("Stack: ");
-+              _show_stack(NULL, regs, (unsigned long*)rsp);
-+
-+              printk("\nCode: ");
-+              if (regs->rip < PAGE_OFFSET)
-+                      goto bad;
-+
-+              for (i=0; i<20; i++) {
-+                      unsigned char c;
-+                      if (__get_user(c, &((unsigned char*)regs->rip)[i])) {
-+bad:
-+                              printk(" Bad RIP value.");
-+                              break;
-+                      }
-+                      printk("%02x ", c);
-+              }
-+      }
-+      printk("\n");
-+}     
-+
-+void handle_BUG(struct pt_regs *regs)
-+{ 
-+      struct bug_frame f;
-+      long len;
-+      const char *prefix = "";
-+
-+      if (user_mode(regs))
-+              return; 
-+      if (__copy_from_user(&f, (const void __user *) regs->rip,
-+                           sizeof(struct bug_frame)))
-+              return; 
-+      if (f.filename >= 0 ||
-+          f.ud2[0] != 0x0f || f.ud2[1] != 0x0b) 
-+              return;
-+      len = __strnlen_user((char *)(long)f.filename, PATH_MAX) - 1;
-+      if (len < 0 || len >= PATH_MAX)
-+              f.filename = (int)(long)"unmapped filename";
-+      else if (len > 50) {
-+              f.filename += len - 50;
-+              prefix = "...";
-+      }
-+      printk("----------- [cut here ] --------- [please bite here ] ---------\n");
-+      printk(KERN_ALERT "Kernel BUG at %s%.50s:%d\n", prefix, (char *)(long)f.filename, f.line);
-+} 
-+
-+#ifdef CONFIG_BUG
-+void out_of_line_bug(void)
-+{ 
-+      BUG(); 
-+} 
-+EXPORT_SYMBOL(out_of_line_bug);
-+#endif
-+
-+static DEFINE_SPINLOCK(die_lock);
-+static int die_owner = -1;
-+static unsigned int die_nest_count;
-+
-+unsigned __kprobes long oops_begin(void)
-+{
-+      int cpu = safe_smp_processor_id();
-+      unsigned long flags;
-+
-+      /* racy, but better than risking deadlock. */
-+      local_irq_save(flags);
-+      if (!spin_trylock(&die_lock)) { 
-+              if (cpu == die_owner) 
-+                      /* nested oops. should stop eventually */;
-+              else
-+                      spin_lock(&die_lock);
-+      }
-+      die_nest_count++;
-+      die_owner = cpu;
-+      console_verbose();
-+      bust_spinlocks(1);
-+      return flags;
-+}
-+
-+void __kprobes oops_end(unsigned long flags)
-+{ 
-+      die_owner = -1;
-+      bust_spinlocks(0);
-+      die_nest_count--;
-+      if (die_nest_count)
-+              /* We still own the lock */
-+              local_irq_restore(flags);
-+      else
-+              /* Nest count reaches zero, release the lock. */
-+              spin_unlock_irqrestore(&die_lock, flags);
-+      if (panic_on_oops)
-+              panic("Fatal exception");
-+}
-+
-+void __kprobes __die(const char * str, struct pt_regs * regs, long err)
-+{
-+      static int die_counter;
-+      printk(KERN_EMERG "%s: %04lx [%u] ", str, err & 0xffff,++die_counter);
-+#ifdef CONFIG_PREEMPT
-+      printk("PREEMPT ");
-+#endif
-+#ifdef CONFIG_SMP
-+      printk("SMP ");
-+#endif
-+#ifdef CONFIG_DEBUG_PAGEALLOC
-+      printk("DEBUG_PAGEALLOC");
-+#endif
-+      printk("\n");
-+      notify_die(DIE_OOPS, str, regs, err, current->thread.trap_no, SIGSEGV);
-+      show_registers(regs);
-+      /* Executive summary in case the oops scrolled away */
-+      printk(KERN_ALERT "RIP ");
-+      printk_address(regs->rip); 
-+      printk(" RSP <%016lx>\n", regs->rsp); 
-+      if (kexec_should_crash(current))
-+              crash_kexec(regs);
-+}
-+
-+void die(const char * str, struct pt_regs * regs, long err)
-+{
-+      unsigned long flags = oops_begin();
-+
-+      handle_BUG(regs);
-+      __die(str, regs, err);
-+      oops_end(flags);
-+      do_exit(SIGSEGV); 
-+}
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+void __kprobes die_nmi(char *str, struct pt_regs *regs)
-+{
-+      unsigned long flags = oops_begin();
-+
-+      /*
-+       * We are in trouble anyway, lets at least try
-+       * to get a message out.
-+       */
-+      printk(str, safe_smp_processor_id());
-+      show_registers(regs);
-+      if (kexec_should_crash(current))
-+              crash_kexec(regs);
-+      if (panic_on_timeout || panic_on_oops)
-+              panic("nmi watchdog");
-+      printk("console shuts up ...\n");
-+      oops_end(flags);
-+      nmi_exit();
-+      local_irq_enable();
-+      do_exit(SIGSEGV);
-+}
-+#endif
-+
-+static void __kprobes do_trap(int trapnr, int signr, char *str,
-+                            struct pt_regs * regs, long error_code,
-+                            siginfo_t *info)
-+{
-+      struct task_struct *tsk = current;
-+
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = trapnr;
-+
-+      if (user_mode(regs)) {
-+              if (exception_trace && unhandled_signal(tsk, signr))
-+                      printk(KERN_INFO
-+                             "%s[%d] trap %s rip:%lx rsp:%lx error:%lx\n",
-+                             tsk->comm, tsk->pid, str,
-+                             regs->rip, regs->rsp, error_code); 
-+
-+              if (info)
-+                      force_sig_info(signr, info, tsk);
-+              else
-+                      force_sig(signr, tsk);
-+              return;
-+      }
-+
-+
-+      /* kernel trap */ 
-+      {            
-+              const struct exception_table_entry *fixup;
-+              fixup = search_exception_tables(regs->rip);
-+              if (fixup)
-+                      regs->rip = fixup->fixup;
-+              else    
-+                      die(str, regs, error_code);
-+              return;
-+      }
-+}
-+
-+#define DO_ERROR(trapnr, signr, str, name) \
-+asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                                      == NOTIFY_STOP) \
-+              return; \
-+      conditional_sti(regs);                                          \
-+      do_trap(trapnr, signr, str, regs, error_code, NULL); \
-+}
-+
-+#define DO_ERROR_INFO(trapnr, signr, str, name, sicode, siaddr) \
-+asmlinkage void do_##name(struct pt_regs * regs, long error_code) \
-+{ \
-+      siginfo_t info; \
-+      info.si_signo = signr; \
-+      info.si_errno = 0; \
-+      info.si_code = sicode; \
-+      info.si_addr = (void __user *)siaddr; \
-+      if (notify_die(DIE_TRAP, str, regs, error_code, trapnr, signr) \
-+                                                      == NOTIFY_STOP) \
-+              return; \
-+      conditional_sti(regs);                                          \
-+      do_trap(trapnr, signr, str, regs, error_code, &info); \
-+}
-+
-+DO_ERROR_INFO( 0, SIGFPE,  "divide error", divide_error, FPE_INTDIV, regs->rip)
-+DO_ERROR( 4, SIGSEGV, "overflow", overflow)
-+DO_ERROR( 5, SIGSEGV, "bounds", bounds)
-+DO_ERROR_INFO( 6, SIGILL,  "invalid opcode", invalid_op, ILL_ILLOPN, regs->rip)
-+DO_ERROR( 7, SIGSEGV, "device not available", device_not_available)
-+DO_ERROR( 9, SIGFPE,  "coprocessor segment overrun", coprocessor_segment_overrun)
-+DO_ERROR(10, SIGSEGV, "invalid TSS", invalid_TSS)
-+DO_ERROR(11, SIGBUS,  "segment not present", segment_not_present)
-+DO_ERROR_INFO(17, SIGBUS, "alignment check", alignment_check, BUS_ADRALN, 0)
-+DO_ERROR(18, SIGSEGV, "reserved", reserved)
-+
-+/* Runs on IST stack */
-+asmlinkage void do_stack_segment(struct pt_regs *regs, long error_code)
-+{
-+      if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
-+                      12, SIGBUS) == NOTIFY_STOP)
-+              return;
-+      preempt_conditional_sti(regs);
-+      do_trap(12, SIGBUS, "stack segment", regs, error_code, NULL);
-+      preempt_conditional_cli(regs);
-+}
-+
-+asmlinkage void do_double_fault(struct pt_regs * regs, long error_code)
-+{
-+      static const char str[] = "double fault";
-+      struct task_struct *tsk = current;
-+
-+      /* Return not checked because double check cannot be ignored */
-+      notify_die(DIE_TRAP, str, regs, error_code, 8, SIGSEGV);
-+
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = 8;
-+
-+      /* This is always a kernel trap and never fixable (and thus must
-+         never return). */
-+      for (;;)
-+              die(str, regs, error_code);
-+}
-+
-+asmlinkage void __kprobes do_general_protection(struct pt_regs * regs,
-+                                              long error_code)
-+{
-+      struct task_struct *tsk = current;
-+
-+      conditional_sti(regs);
-+
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = 13;
-+
-+      if (user_mode(regs)) {
-+              if (exception_trace && unhandled_signal(tsk, SIGSEGV))
-+                      printk(KERN_INFO
-+                     "%s[%d] general protection rip:%lx rsp:%lx error:%lx\n",
-+                             tsk->comm, tsk->pid,
-+                             regs->rip, regs->rsp, error_code); 
-+
-+              force_sig(SIGSEGV, tsk);
-+              return;
-+      } 
-+
-+      /* kernel gp */
-+      {
-+              const struct exception_table_entry *fixup;
-+              fixup = search_exception_tables(regs->rip);
-+              if (fixup) {
-+                      regs->rip = fixup->fixup;
-+                      return;
-+              }
-+              if (notify_die(DIE_GPF, "general protection fault", regs,
-+                                      error_code, 13, SIGSEGV) == NOTIFY_STOP)
-+                      return;
-+              die("general protection fault", regs, error_code);
-+      }
-+}
-+
-+static __kprobes void
-+mem_parity_error(unsigned char reason, struct pt_regs * regs)
-+{
-+      printk("Uhhuh. NMI received. Dazed and confused, but trying to continue\n");
-+      printk("You probably have a hardware problem with your RAM chips\n");
-+
-+#if 0 /* XEN */
-+      /* Clear and disable the memory parity error line. */
-+      reason = (reason & 0xf) | 4;
-+      outb(reason, 0x61);
-+#endif /* XEN */
-+}
-+
-+static __kprobes void
-+io_check_error(unsigned char reason, struct pt_regs * regs)
-+{
-+      printk("NMI: IOCK error (debug interrupt?)\n");
-+      show_registers(regs);
-+
-+#if 0 /* XEN */
-+      /* Re-enable the IOCK line, wait for a few seconds */
-+      reason = (reason & 0xf) | 8;
-+      outb(reason, 0x61);
-+      mdelay(2000);
-+      reason &= ~8;
-+      outb(reason, 0x61);
-+#endif /* XEN */
-+}
-+
-+static __kprobes void
-+unknown_nmi_error(unsigned char reason, struct pt_regs * regs)
-+{     printk("Uhhuh. NMI received for unknown reason %02x.\n", reason);
-+      printk("Dazed and confused, but trying to continue\n");
-+      printk("Do you have a strange power saving mode enabled?\n");
-+}
-+
-+/* Runs on IST stack. This code must keep interrupts off all the time.
-+   Nested NMIs are prevented by the CPU. */
-+asmlinkage __kprobes void default_do_nmi(struct pt_regs *regs)
-+{
-+      unsigned char reason = 0;
-+      int cpu;
-+
-+      cpu = smp_processor_id();
-+
-+      /* Only the BSP gets external NMIs from the system.  */
-+      if (!cpu)
-+              reason = get_nmi_reason();
-+
-+      if (!(reason & 0xc0)) {
-+              if (notify_die(DIE_NMI_IPI, "nmi_ipi", regs, reason, 2, SIGINT)
-+                                                              == NOTIFY_STOP)
-+                      return;
-+#ifdef CONFIG_X86_LOCAL_APIC
-+              /*
-+               * Ok, so this is none of the documented NMI sources,
-+               * so it must be the NMI watchdog.
-+               */
-+              if (nmi_watchdog > 0) {
-+                      nmi_watchdog_tick(regs,reason);
-+                      return;
-+              }
-+#endif
-+              unknown_nmi_error(reason, regs);
-+              return;
-+      }
-+      if (notify_die(DIE_NMI, "nmi", regs, reason, 2, SIGINT) == NOTIFY_STOP)
-+              return; 
-+
-+      /* AK: following checks seem to be broken on modern chipsets. FIXME */
-+
-+      if (reason & 0x80)
-+              mem_parity_error(reason, regs);
-+      if (reason & 0x40)
-+              io_check_error(reason, regs);
-+}
-+
-+/* runs on IST stack. */
-+asmlinkage void __kprobes do_int3(struct pt_regs * regs, long error_code)
-+{
-+      if (notify_die(DIE_INT3, "int3", regs, error_code, 3, SIGTRAP) == NOTIFY_STOP) {
-+              return;
-+      }
-+      preempt_conditional_sti(regs);
-+      do_trap(3, SIGTRAP, "int3", regs, error_code, NULL);
-+      preempt_conditional_cli(regs);
-+}
-+
-+/* Help handler running on IST stack to switch back to user stack
-+   for scheduling or signal handling. The actual stack switch is done in
-+   entry.S */
-+asmlinkage __kprobes struct pt_regs *sync_regs(struct pt_regs *eregs)
-+{
-+      struct pt_regs *regs = eregs;
-+      /* Did already sync */
-+      if (eregs == (struct pt_regs *)eregs->rsp)
-+              ;
-+      /* Exception from user space */
-+      else if (user_mode(eregs))
-+              regs = task_pt_regs(current);
-+      /* Exception from kernel and interrupts are enabled. Move to
-+         kernel process stack. */
-+      else if (eregs->eflags & X86_EFLAGS_IF)
-+              regs = (struct pt_regs *)(eregs->rsp -= sizeof(struct pt_regs));
-+      if (eregs != regs)
-+              *regs = *eregs;
-+      return regs;
-+}
-+
-+/* runs on IST stack. */
-+asmlinkage void __kprobes do_debug(struct pt_regs * regs,
-+                                 unsigned long error_code)
-+{
-+      unsigned long condition;
-+      struct task_struct *tsk = current;
-+      siginfo_t info;
-+
-+      get_debugreg(condition, 6);
-+
-+      if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
-+                                              SIGTRAP) == NOTIFY_STOP)
-+              return;
-+
-+      preempt_conditional_sti(regs);
-+
-+      /* Mask out spurious debug traps due to lazy DR7 setting */
-+      if (condition & (DR_TRAP0|DR_TRAP1|DR_TRAP2|DR_TRAP3)) {
-+              if (!tsk->thread.debugreg7) { 
-+                      goto clear_dr7;
-+              }
-+      }
-+
-+      tsk->thread.debugreg6 = condition;
-+
-+      /* Mask out spurious TF errors due to lazy TF clearing */
-+      if (condition & DR_STEP) {
-+              /*
-+               * The TF error should be masked out only if the current
-+               * process is not traced and if the TRAP flag has been set
-+               * previously by a tracing process (condition detected by
-+               * the PT_DTRACE flag); remember that the i386 TRAP flag
-+               * can be modified by the process itself in user mode,
-+               * allowing programs to debug themselves without the ptrace()
-+               * interface.
-+               */
-+                if (!user_mode(regs))
-+                       goto clear_TF_reenable;
-+              /*
-+               * Was the TF flag set by a debugger? If so, clear it now,
-+               * so that register information is correct.
-+               */
-+              if (tsk->ptrace & PT_DTRACE) {
-+                      regs->eflags &= ~TF_MASK;
-+                      tsk->ptrace &= ~PT_DTRACE;
-+              }
-+      }
-+
-+      /* Ok, finally something we can handle */
-+      tsk->thread.trap_no = 1;
-+      tsk->thread.error_code = error_code;
-+      info.si_signo = SIGTRAP;
-+      info.si_errno = 0;
-+      info.si_code = TRAP_BRKPT;
-+      info.si_addr = user_mode(regs) ? (void __user *)regs->rip : NULL;
-+      force_sig_info(SIGTRAP, &info, tsk);
-+
-+clear_dr7:
-+      set_debugreg(0UL, 7);
-+      preempt_conditional_cli(regs);
-+      return;
-+
-+clear_TF_reenable:
-+      set_tsk_thread_flag(tsk, TIF_SINGLESTEP);
-+      regs->eflags &= ~TF_MASK;
-+      preempt_conditional_cli(regs);
-+}
-+
-+static int kernel_math_error(struct pt_regs *regs, const char *str, int trapnr)
-+{
-+      const struct exception_table_entry *fixup;
-+      fixup = search_exception_tables(regs->rip);
-+      if (fixup) {
-+              regs->rip = fixup->fixup;
-+              return 1;
-+      }
-+      notify_die(DIE_GPF, str, regs, 0, trapnr, SIGFPE);
-+      /* Illegal floating point operation in the kernel */
-+      current->thread.trap_no = trapnr;
-+      die(str, regs, 0);
-+      return 0;
-+}
-+
-+/*
-+ * Note that we play around with the 'TS' bit in an attempt to get
-+ * the correct behaviour even in the presence of the asynchronous
-+ * IRQ13 behaviour
-+ */
-+asmlinkage void do_coprocessor_error(struct pt_regs *regs)
-+{
-+      void __user *rip = (void __user *)(regs->rip);
-+      struct task_struct * task;
-+      siginfo_t info;
-+      unsigned short cwd, swd;
-+
-+      conditional_sti(regs);
-+      if (!user_mode(regs) &&
-+          kernel_math_error(regs, "kernel x87 math error", 16))
-+              return;
-+
-+      /*
-+       * Save the info for the exception handler and clear the error.
-+       */
-+      task = current;
-+      save_init_fpu(task);
-+      task->thread.trap_no = 16;
-+      task->thread.error_code = 0;
-+      info.si_signo = SIGFPE;
-+      info.si_errno = 0;
-+      info.si_code = __SI_FAULT;
-+      info.si_addr = rip;
-+      /*
-+       * (~cwd & swd) will mask out exceptions that are not set to unmasked
-+       * status.  0x3f is the exception bits in these regs, 0x200 is the
-+       * C1 reg you need in case of a stack fault, 0x040 is the stack
-+       * fault bit.  We should only be taking one exception at a time,
-+       * so if this combination doesn't produce any single exception,
-+       * then we have a bad program that isn't synchronizing its FPU usage
-+       * and it will suffer the consequences since we won't be able to
-+       * fully reproduce the context of the exception
-+       */
-+      cwd = get_fpu_cwd(task);
-+      swd = get_fpu_swd(task);
-+      switch (swd & ~cwd & 0x3f) {
-+              case 0x000:
-+              default:
-+                      break;
-+              case 0x001: /* Invalid Op */
-+                      /*
-+                       * swd & 0x240 == 0x040: Stack Underflow
-+                       * swd & 0x240 == 0x240: Stack Overflow
-+                       * User must clear the SF bit (0x40) if set
-+                       */
-+                      info.si_code = FPE_FLTINV;
-+                      break;
-+              case 0x002: /* Denormalize */
-+              case 0x010: /* Underflow */
-+                      info.si_code = FPE_FLTUND;
-+                      break;
-+              case 0x004: /* Zero Divide */
-+                      info.si_code = FPE_FLTDIV;
-+                      break;
-+              case 0x008: /* Overflow */
-+                      info.si_code = FPE_FLTOVF;
-+                      break;
-+              case 0x020: /* Precision */
-+                      info.si_code = FPE_FLTRES;
-+                      break;
-+      }
-+      force_sig_info(SIGFPE, &info, task);
-+}
-+
-+asmlinkage void bad_intr(void)
-+{
-+      printk("bad interrupt"); 
-+}
-+
-+asmlinkage void do_simd_coprocessor_error(struct pt_regs *regs)
-+{
-+      void __user *rip = (void __user *)(regs->rip);
-+      struct task_struct * task;
-+      siginfo_t info;
-+      unsigned short mxcsr;
-+
-+      conditional_sti(regs);
-+      if (!user_mode(regs) &&
-+              kernel_math_error(regs, "kernel simd math error", 19))
-+              return;
-+
-+      /*
-+       * Save the info for the exception handler and clear the error.
-+       */
-+      task = current;
-+      save_init_fpu(task);
-+      task->thread.trap_no = 19;
-+      task->thread.error_code = 0;
-+      info.si_signo = SIGFPE;
-+      info.si_errno = 0;
-+      info.si_code = __SI_FAULT;
-+      info.si_addr = rip;
-+      /*
-+       * The SIMD FPU exceptions are handled a little differently, as there
-+       * is only a single status/control register.  Thus, to determine which
-+       * unmasked exception was caught we must mask the exception mask bits
-+       * at 0x1f80, and then use these to mask the exception bits at 0x3f.
-+       */
-+      mxcsr = get_fpu_mxcsr(task);
-+      switch (~((mxcsr & 0x1f80) >> 7) & (mxcsr & 0x3f)) {
-+              case 0x000:
-+              default:
-+                      break;
-+              case 0x001: /* Invalid Op */
-+                      info.si_code = FPE_FLTINV;
-+                      break;
-+              case 0x002: /* Denormalize */
-+              case 0x010: /* Underflow */
-+                      info.si_code = FPE_FLTUND;
-+                      break;
-+              case 0x004: /* Zero Divide */
-+                      info.si_code = FPE_FLTDIV;
-+                      break;
-+              case 0x008: /* Overflow */
-+                      info.si_code = FPE_FLTOVF;
-+                      break;
-+              case 0x020: /* Precision */
-+                      info.si_code = FPE_FLTRES;
-+                      break;
-+      }
-+      force_sig_info(SIGFPE, &info, task);
-+}
-+
-+asmlinkage void do_spurious_interrupt_bug(struct pt_regs * regs)
-+{
-+}
-+
-+#if 0
-+asmlinkage void __attribute__((weak)) smp_thermal_interrupt(void)
-+{
-+}
-+#endif
-+
-+asmlinkage void __attribute__((weak)) mce_threshold_interrupt(void)
-+{
-+}
-+
-+/*
-+ *  'math_state_restore()' saves the current math information in the
-+ * old math state array, and gets the new ones from the current task
-+ *
-+ * Careful.. There are problems with IBM-designed IRQ13 behaviour.
-+ * Don't touch unless you *really* know how it works.
-+ */
-+asmlinkage void math_state_restore(void)
-+{
-+      struct task_struct *me = current;
-+        /* clts(); */ /* 'clts' is done for us by Xen during virtual trap. */
-+
-+      if (!used_math())
-+              init_fpu(me);
-+      restore_fpu_checking(&me->thread.i387.fxsave);
-+      task_thread_info(me)->status |= TS_USEDFPU;
-+}
-+
-+
-+/*
-+ * NB. All these are "interrupt gates" (i.e. events_mask is set) because we
-+ * specify <dpl>|4 in the second field.
-+ */
-+static trap_info_t __cpuinitdata trap_table[] = {
-+        {  0, 0|4, __KERNEL_CS, (unsigned long)divide_error               },
-+        {  1, 0|4, __KERNEL_CS, (unsigned long)debug                      },
-+        {  3, 3|4, __KERNEL_CS, (unsigned long)int3                       },
-+        {  4, 3|4, __KERNEL_CS, (unsigned long)overflow                   },
-+        {  5, 0|4, __KERNEL_CS, (unsigned long)bounds                     },
-+        {  6, 0|4, __KERNEL_CS, (unsigned long)invalid_op                 },
-+        {  7, 0|4, __KERNEL_CS, (unsigned long)device_not_available       },
-+        {  9, 0|4, __KERNEL_CS, (unsigned long)coprocessor_segment_overrun},
-+        { 10, 0|4, __KERNEL_CS, (unsigned long)invalid_TSS                },
-+        { 11, 0|4, __KERNEL_CS, (unsigned long)segment_not_present        },
-+        { 12, 0|4, __KERNEL_CS, (unsigned long)stack_segment              },
-+        { 13, 0|4, __KERNEL_CS, (unsigned long)general_protection         },
-+        { 14, 0|4, __KERNEL_CS, (unsigned long)page_fault                 },
-+        { 15, 0|4, __KERNEL_CS, (unsigned long)spurious_interrupt_bug     },
-+        { 16, 0|4, __KERNEL_CS, (unsigned long)coprocessor_error          },
-+        { 17, 0|4, __KERNEL_CS, (unsigned long)alignment_check            },
-+#ifdef CONFIG_X86_MCE
-+        { 18, 0|4, __KERNEL_CS, (unsigned long)machine_check              },
-+#endif
-+        { 19, 0|4, __KERNEL_CS, (unsigned long)simd_coprocessor_error     },
-+#ifdef CONFIG_IA32_EMULATION
-+      { IA32_SYSCALL_VECTOR, 3, __KERNEL_CS, (unsigned long)ia32_syscall},
-+#endif
-+        {  0, 0,           0, 0                                              }
-+};
-+
-+void __init trap_init(void)
-+{
-+        int ret;
-+
-+        ret = HYPERVISOR_set_trap_table(trap_table);
-+        if (ret) 
-+              printk("HYPERVISOR_set_trap_table failed: error %d\n", ret);
-+
-+      /*
-+       * Should be a barrier for any external CPU state.
-+       */
-+      cpu_init();
-+}
-+
-+void __cpuinit smp_trap_init(trap_info_t *trap_ctxt)
-+{
-+      const trap_info_t *t = trap_table;
-+
-+      for (t = trap_table; t->address; t++) {
-+              trap_ctxt[t->vector].flags = t->flags;
-+              trap_ctxt[t->vector].cs = t->cs;
-+              trap_ctxt[t->vector].address = t->address;
-+      }
-+}
-+
-+
-+/* Actual parsing is done early in setup.c. */
-+static int __init oops_dummy(char *s)
-+{ 
-+      panic_on_oops = 1;
-+      return 1;
-+} 
-+__setup("oops=", oops_dummy); 
-+
-+static int __init kstack_setup(char *s)
-+{
-+      kstack_depth_to_print = simple_strtoul(s,NULL,0);
-+      return 1;
-+}
-+__setup("kstack=", kstack_setup);
-+
-+#ifdef CONFIG_STACK_UNWIND
-+static int __init call_trace_setup(char *s)
-+{
-+      if (strcmp(s, "old") == 0)
-+              call_trace = -1;
-+      else if (strcmp(s, "both") == 0)
-+              call_trace = 0;
-+      else if (strcmp(s, "newfallback") == 0)
-+              call_trace = 1;
-+      else if (strcmp(s, "new") == 0)
-+              call_trace = 2;
-+      return 1;
-+}
-+__setup("call_trace=", call_trace_setup);
-+#endif
-Index: head-2008-11-25/arch/x86/kernel/vsyscall_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/vsyscall_64-xen.c  2007-06-18 08:38:13.000000000 +0200
-@@ -0,0 +1,227 @@
-+/*
-+ *  linux/arch/x86_64/kernel/vsyscall.c
-+ *
-+ *  Copyright (C) 2001 Andrea Arcangeli <andrea@suse.de> SuSE
-+ *  Copyright 2003 Andi Kleen, SuSE Labs.
-+ *
-+ *  Thanks to hpa@transmeta.com for some useful hint.
-+ *  Special thanks to Ingo Molnar for his early experience with
-+ *  a different vsyscall implementation for Linux/IA32 and for the name.
-+ *
-+ *  vsyscall 1 is located at -10Mbyte, vsyscall 2 is located
-+ *  at virtual address -10Mbyte+1024bytes etc... There are at max 4
-+ *  vsyscalls. One vsyscall can reserve more than 1 slot to avoid
-+ *  jumping out of line if necessary. We cannot add more with this
-+ *  mechanism because older kernels won't return -ENOSYS.
-+ *  If we want more than four we need a vDSO.
-+ *
-+ *  Note: the concept clashes with user mode linux. If you use UML and
-+ *  want per guest time just set the kernel.vsyscall64 sysctl to 0.
-+ */
-+
-+#include <linux/time.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/timer.h>
-+#include <linux/seqlock.h>
-+#include <linux/jiffies.h>
-+#include <linux/sysctl.h>
-+
-+#include <asm/vsyscall.h>
-+#include <asm/pgtable.h>
-+#include <asm/page.h>
-+#include <asm/fixmap.h>
-+#include <asm/errno.h>
-+#include <asm/io.h>
-+
-+#define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
-+
-+int __sysctl_vsyscall __section_sysctl_vsyscall = 1;
-+seqlock_t __xtime_lock __section_xtime_lock = SEQLOCK_UNLOCKED;
-+
-+#include <asm/unistd.h>
-+
-+static __always_inline void timeval_normalize(struct timeval * tv)
-+{
-+      time_t __sec;
-+
-+      __sec = tv->tv_usec / 1000000;
-+      if (__sec) {
-+              tv->tv_usec %= 1000000;
-+              tv->tv_sec += __sec;
-+      }
-+}
-+
-+static __always_inline void do_vgettimeofday(struct timeval * tv)
-+{
-+      long sequence, t;
-+      unsigned long sec, usec;
-+
-+      do {
-+              sequence = read_seqbegin(&__xtime_lock);
-+              
-+              sec = __xtime.tv_sec;
-+              usec = (__xtime.tv_nsec / 1000) +
-+                      (__jiffies - __wall_jiffies) * (1000000 / HZ);
-+
-+              if (__vxtime.mode != VXTIME_HPET) {
-+                      t = get_cycles_sync();
-+                      if (t < __vxtime.last_tsc)
-+                              t = __vxtime.last_tsc;
-+                      usec += ((t - __vxtime.last_tsc) *
-+                               __vxtime.tsc_quot) >> 32;
-+                      /* See comment in x86_64 do_gettimeofday. */
-+              } else {
-+                      usec += ((readl((void *)fix_to_virt(VSYSCALL_HPET) + 0xf0) -
-+                                __vxtime.last) * __vxtime.quot) >> 32;
-+              }
-+      } while (read_seqretry(&__xtime_lock, sequence));
-+
-+      tv->tv_sec = sec + usec / 1000000;
-+      tv->tv_usec = usec % 1000000;
-+}
-+
-+/* RED-PEN may want to readd seq locking, but then the variable should be write-once. */
-+static __always_inline void do_get_tz(struct timezone * tz)
-+{
-+      *tz = __sys_tz;
-+}
-+
-+static __always_inline int gettimeofday(struct timeval *tv, struct timezone *tz)
-+{
-+      int ret;
-+      asm volatile("vsysc2: syscall"
-+              : "=a" (ret)
-+              : "0" (__NR_gettimeofday),"D" (tv),"S" (tz) : __syscall_clobber );
-+      return ret;
-+}
-+
-+static __always_inline long time_syscall(long *t)
-+{
-+      long secs;
-+      asm volatile("vsysc1: syscall"
-+              : "=a" (secs)
-+              : "0" (__NR_time),"D" (t) : __syscall_clobber);
-+      return secs;
-+}
-+
-+int __vsyscall(0) vgettimeofday(struct timeval * tv, struct timezone * tz)
-+{
-+      if (!__sysctl_vsyscall)
-+              return gettimeofday(tv,tz);
-+      if (tv)
-+              do_vgettimeofday(tv);
-+      if (tz)
-+              do_get_tz(tz);
-+      return 0;
-+}
-+
-+/* This will break when the xtime seconds get inaccurate, but that is
-+ * unlikely */
-+time_t __vsyscall(1) vtime(time_t *t)
-+{
-+      if (!__sysctl_vsyscall)
-+              return time_syscall(t);
-+      else if (t)
-+              *t = __xtime.tv_sec;            
-+      return __xtime.tv_sec;
-+}
-+
-+long __vsyscall(2) venosys_0(void)
-+{
-+      return -ENOSYS;
-+}
-+
-+long __vsyscall(3) venosys_1(void)
-+{
-+      return -ENOSYS;
-+}
-+
-+#ifdef CONFIG_SYSCTL
-+
-+#define SYSCALL 0x050f
-+#define NOP2    0x9090
-+
-+/*
-+ * NOP out syscall in vsyscall page when not needed.
-+ */
-+static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
-+                        void __user *buffer, size_t *lenp, loff_t *ppos)
-+{
-+      extern u16 vsysc1, vsysc2;
-+      u16 *map1, *map2;
-+      int ret = proc_dointvec(ctl, write, filp, buffer, lenp, ppos);
-+      if (!write)
-+              return ret;
-+      /* gcc has some trouble with __va(__pa()), so just do it this
-+         way. */
-+      map1 = ioremap(__pa_symbol(&vsysc1), 2);
-+      if (!map1)
-+              return -ENOMEM;
-+      map2 = ioremap(__pa_symbol(&vsysc2), 2);
-+      if (!map2) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+      if (!sysctl_vsyscall) {
-+              *map1 = SYSCALL;
-+              *map2 = SYSCALL;
-+      } else {
-+              *map1 = NOP2;
-+              *map2 = NOP2;
-+      }
-+      iounmap(map2);
-+out:
-+      iounmap(map1);
-+      return ret;
-+}
-+
-+static int vsyscall_sysctl_nostrat(ctl_table *t, int __user *name, int nlen,
-+                              void __user *oldval, size_t __user *oldlenp,
-+                              void __user *newval, size_t newlen,
-+                              void **context)
-+{
-+      return -ENOSYS;
-+}
-+
-+static ctl_table kernel_table2[] = {
-+      { .ctl_name = 99, .procname = "vsyscall64",
-+        .data = &sysctl_vsyscall, .maxlen = sizeof(int), .mode = 0644,
-+        .strategy = vsyscall_sysctl_nostrat,
-+        .proc_handler = vsyscall_sysctl_change },
-+      { 0, }
-+};
-+
-+static ctl_table kernel_root_table2[] = {
-+      { .ctl_name = CTL_KERN, .procname = "kernel", .mode = 0555,
-+        .child = kernel_table2 },
-+      { 0 },
-+};
-+
-+#endif
-+
-+static void __init map_vsyscall(void)
-+{
-+      extern char __vsyscall_0;
-+      unsigned long physaddr_page0 = __pa_symbol(&__vsyscall_0);
-+
-+      __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_page0, PAGE_KERNEL_VSYSCALL);
-+}
-+
-+static int __init vsyscall_init(void)
-+{
-+      BUG_ON(((unsigned long) &vgettimeofday !=
-+                      VSYSCALL_ADDR(__NR_vgettimeofday)));
-+      BUG_ON((unsigned long) &vtime != VSYSCALL_ADDR(__NR_vtime));
-+      BUG_ON((VSYSCALL_ADDR(0) != __fix_to_virt(VSYSCALL_FIRST_PAGE)));
-+      map_vsyscall();
-+#ifdef CONFIG_XEN
-+      sysctl_vsyscall = 0; /* disable vgettimeofay() */
-+#endif
-+#ifdef CONFIG_SYSCTL
-+      register_sysctl_table(kernel_root_table2, 0);
-+#endif
-+      return 0;
-+}
-+
-+__initcall(vsyscall_init);
-Index: head-2008-11-25/arch/x86/kernel/xen_entry_64.S
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/kernel/xen_entry_64.S     2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,36 @@
-+/*
-+ * Copied from arch/xen/i386/kernel/entry.S
-+ */                        
-+/* Offsets into shared_info_t. */                
-+#define evtchn_upcall_pending         /* 0 */
-+#define evtchn_upcall_mask            1
-+
-+#define sizeof_vcpu_shift             6
-+
-+#ifdef CONFIG_SMP
-+//#define preempt_disable(reg)        incl threadinfo_preempt_count(reg)
-+//#define preempt_enable(reg) decl threadinfo_preempt_count(reg)
-+#define preempt_disable(reg)
-+#define preempt_enable(reg)
-+#define XEN_GET_VCPU_INFO(reg)        preempt_disable(%rbp)                   ; \
-+                              movq %gs:pda_cpunumber,reg              ; \
-+                              shl  $32, reg                           ; \
-+                              shr  $32-sizeof_vcpu_shift,reg          ; \
-+                              addq HYPERVISOR_shared_info,reg
-+#define XEN_PUT_VCPU_INFO(reg)        preempt_enable(%rbp)                    ; \
-+#define XEN_PUT_VCPU_INFO_fixup .byte 0xff,0xff,0xff
-+#else
-+#define XEN_GET_VCPU_INFO(reg)        movq HYPERVISOR_shared_info,reg
-+#define XEN_PUT_VCPU_INFO(reg)
-+#define XEN_PUT_VCPU_INFO_fixup
-+#endif
-+
-+#define XEN_LOCKED_BLOCK_EVENTS(reg)  movb $1,evtchn_upcall_mask(reg)
-+#define XEN_LOCKED_UNBLOCK_EVENTS(reg)        movb $0,evtchn_upcall_mask(reg)
-+#define XEN_BLOCK_EVENTS(reg) XEN_GET_VCPU_INFO(reg)                  ; \
-+                              XEN_LOCKED_BLOCK_EVENTS(reg)            ; \
-+                              XEN_PUT_VCPU_INFO(reg)
-+#define XEN_UNBLOCK_EVENTS(reg)       XEN_GET_VCPU_INFO(reg)                  ; \
-+                              XEN_LOCKED_UNBLOCK_EVENTS(reg)          ; \
-+                              XEN_PUT_VCPU_INFO(reg)
-+#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg)
-Index: head-2008-11-25/arch/x86/mm/fault_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/fault_64-xen.c 2007-11-02 17:34:23.000000000 +0100
-@@ -0,0 +1,724 @@
-+/*
-+ *  linux/arch/x86-64/mm/fault.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *  Copyright (C) 2001,2002 Andi Kleen, SuSE Labs.
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ptrace.h>
-+#include <linux/mman.h>
-+#include <linux/mm.h>
-+#include <linux/smp.h>
-+#include <linux/smp_lock.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/tty.h>
-+#include <linux/vt_kern.h>            /* For unblank_screen() */
-+#include <linux/compiler.h>
-+#include <linux/module.h>
-+#include <linux/kprobes.h>
-+
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgalloc.h>
-+#include <asm/smp.h>
-+#include <asm/tlbflush.h>
-+#include <asm/proto.h>
-+#include <asm/kdebug.h>
-+#include <asm-generic/sections.h>
-+
-+/* Page fault error code bits */
-+#define PF_PROT       (1<<0)          /* or no page found */
-+#define PF_WRITE      (1<<1)
-+#define PF_USER       (1<<2)
-+#define PF_RSVD       (1<<3)
-+#define PF_INSTR      (1<<4)
-+
-+#ifdef CONFIG_KPROBES
-+ATOMIC_NOTIFIER_HEAD(notify_page_fault_chain);
-+
-+/* Hook to register for page fault notifications */
-+int register_page_fault_notifier(struct notifier_block *nb)
-+{
-+      vmalloc_sync_all();
-+      return atomic_notifier_chain_register(&notify_page_fault_chain, nb);
-+}
-+
-+int unregister_page_fault_notifier(struct notifier_block *nb)
-+{
-+      return atomic_notifier_chain_unregister(&notify_page_fault_chain, nb);
-+}
-+
-+static inline int notify_page_fault(enum die_val val, const char *str,
-+                      struct pt_regs *regs, long err, int trap, int sig)
-+{
-+      struct die_args args = {
-+              .regs = regs,
-+              .str = str,
-+              .err = err,
-+              .trapnr = trap,
-+              .signr = sig
-+      };
-+      return atomic_notifier_call_chain(&notify_page_fault_chain, val, &args);
-+}
-+#else
-+static inline int notify_page_fault(enum die_val val, const char *str,
-+                      struct pt_regs *regs, long err, int trap, int sig)
-+{
-+      return NOTIFY_DONE;
-+}
-+#endif
-+
-+void bust_spinlocks(int yes)
-+{
-+      int loglevel_save = console_loglevel;
-+      if (yes) {
-+              oops_in_progress = 1;
-+      } else {
-+#ifdef CONFIG_VT
-+              unblank_screen();
-+#endif
-+              oops_in_progress = 0;
-+              /*
-+               * OK, the message is on the console.  Now we call printk()
-+               * without oops_in_progress set so that printk will give klogd
-+               * a poke.  Hold onto your hats...
-+               */
-+              console_loglevel = 15;          /* NMI oopser may have shut the console up */
-+              printk(" ");
-+              console_loglevel = loglevel_save;
-+      }
-+}
-+
-+/* Sometimes the CPU reports invalid exceptions on prefetch.
-+   Check that here and ignore.
-+   Opcode checker based on code by Richard Brunner */
-+static noinline int is_prefetch(struct pt_regs *regs, unsigned long addr,
-+                              unsigned long error_code)
-+{ 
-+      unsigned char *instr;
-+      int scan_more = 1;
-+      int prefetch = 0; 
-+      unsigned char *max_instr;
-+
-+      /* If it was a exec fault ignore */
-+      if (error_code & PF_INSTR)
-+              return 0;
-+      
-+      instr = (unsigned char *)convert_rip_to_linear(current, regs);
-+      max_instr = instr + 15;
-+
-+      if (user_mode(regs) && instr >= (unsigned char *)TASK_SIZE)
-+              return 0;
-+
-+      while (scan_more && instr < max_instr) { 
-+              unsigned char opcode;
-+              unsigned char instr_hi;
-+              unsigned char instr_lo;
-+
-+              if (__get_user(opcode, instr))
-+                      break; 
-+
-+              instr_hi = opcode & 0xf0; 
-+              instr_lo = opcode & 0x0f; 
-+              instr++;
-+
-+              switch (instr_hi) { 
-+              case 0x20:
-+              case 0x30:
-+                      /* Values 0x26,0x2E,0x36,0x3E are valid x86
-+                         prefixes.  In long mode, the CPU will signal
-+                         invalid opcode if some of these prefixes are
-+                         present so we will never get here anyway */
-+                      scan_more = ((instr_lo & 7) == 0x6);
-+                      break;
-+                      
-+              case 0x40:
-+                      /* In AMD64 long mode, 0x40 to 0x4F are valid REX prefixes
-+                         Need to figure out under what instruction mode the
-+                         instruction was issued ... */
-+                      /* Could check the LDT for lm, but for now it's good
-+                         enough to assume that long mode only uses well known
-+                         segments or kernel. */
-+                      scan_more = (!user_mode(regs)) || (regs->cs == __USER_CS);
-+                      break;
-+                      
-+              case 0x60:
-+                      /* 0x64 thru 0x67 are valid prefixes in all modes. */
-+                      scan_more = (instr_lo & 0xC) == 0x4;
-+                      break;          
-+              case 0xF0:
-+                      /* 0xF0, 0xF2, and 0xF3 are valid prefixes in all modes. */
-+                      scan_more = !instr_lo || (instr_lo>>1) == 1;
-+                      break;                  
-+              case 0x00:
-+                      /* Prefetch instruction is 0x0F0D or 0x0F18 */
-+                      scan_more = 0;
-+                      if (__get_user(opcode, instr)) 
-+                              break;
-+                      prefetch = (instr_lo == 0xF) &&
-+                              (opcode == 0x0D || opcode == 0x18);
-+                      break;                  
-+              default:
-+                      scan_more = 0;
-+                      break;
-+              } 
-+      }
-+      return prefetch;
-+}
-+
-+static int bad_address(void *p) 
-+{ 
-+      unsigned long dummy;
-+      return __get_user(dummy, (unsigned long *)p);
-+} 
-+
-+void dump_pagetable(unsigned long address)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+
-+      pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
-+      pgd += pgd_index(address);
-+      if (bad_address(pgd)) goto bad;
-+      printk("PGD %lx ", pgd_val(*pgd));
-+      if (!pgd_present(*pgd)) goto ret; 
-+
-+      pud = pud_offset(pgd, address);
-+      if (bad_address(pud)) goto bad;
-+      printk("PUD %lx ", pud_val(*pud));
-+      if (!pud_present(*pud)) goto ret;
-+
-+      pmd = pmd_offset(pud, address);
-+      if (bad_address(pmd)) goto bad;
-+      printk("PMD %lx ", pmd_val(*pmd));
-+      if (!pmd_present(*pmd)) goto ret;        
-+
-+      pte = pte_offset_kernel(pmd, address);
-+      if (bad_address(pte)) goto bad;
-+      printk("PTE %lx", pte_val(*pte)); 
-+ret:
-+      printk("\n");
-+      return;
-+bad:
-+      printk("BAD\n");
-+}
-+
-+static const char errata93_warning[] = 
-+KERN_ERR "******* Your BIOS seems to not contain a fix for K8 errata #93\n"
-+KERN_ERR "******* Working around it, but it may cause SEGVs or burn power.\n"
-+KERN_ERR "******* Please consider a BIOS update.\n"
-+KERN_ERR "******* Disabling USB legacy in the BIOS may also help.\n";
-+
-+/* Workaround for K8 erratum #93 & buggy BIOS.
-+   BIOS SMM functions are required to use a specific workaround
-+   to avoid corruption of the 64bit RIP register on C stepping K8. 
-+   A lot of BIOS that didn't get tested properly miss this. 
-+   The OS sees this as a page fault with the upper 32bits of RIP cleared.
-+   Try to work around it here.
-+   Note we only handle faults in kernel here. */
-+
-+static int is_errata93(struct pt_regs *regs, unsigned long address) 
-+{
-+      static int warned;
-+      if (address != regs->rip)
-+              return 0;
-+      if ((address >> 32) != 0) 
-+              return 0;
-+      address |= 0xffffffffUL << 32;
-+      if ((address >= (u64)_stext && address <= (u64)_etext) || 
-+          (address >= MODULES_VADDR && address <= MODULES_END)) { 
-+              if (!warned) {
-+                      printk(errata93_warning);               
-+                      warned = 1;
-+              }
-+              regs->rip = address;
-+              return 1;
-+      }
-+      return 0;
-+} 
-+
-+int unhandled_signal(struct task_struct *tsk, int sig)
-+{
-+      if (tsk->pid == 1)
-+              return 1;
-+      if (tsk->ptrace & PT_PTRACED)
-+              return 0;
-+      return (tsk->sighand->action[sig-1].sa.sa_handler == SIG_IGN) ||
-+              (tsk->sighand->action[sig-1].sa.sa_handler == SIG_DFL);
-+}
-+
-+static noinline void pgtable_bad(unsigned long address, struct pt_regs *regs,
-+                               unsigned long error_code)
-+{
-+      unsigned long flags = oops_begin();
-+      struct task_struct *tsk;
-+
-+      printk(KERN_ALERT "%s: Corrupted page table at address %lx\n",
-+             current->comm, address);
-+      dump_pagetable(address);
-+      tsk = current;
-+      tsk->thread.cr2 = address;
-+      tsk->thread.trap_no = 14;
-+      tsk->thread.error_code = error_code;
-+      __die("Bad pagetable", regs, error_code);
-+      oops_end(flags);
-+      do_exit(SIGKILL);
-+}
-+
-+/*
-+ * Handle a fault on the vmalloc area
-+ *
-+ * This assumes no large pages in there.
-+ */
-+static int vmalloc_fault(unsigned long address)
-+{
-+      pgd_t *pgd, *pgd_ref;
-+      pud_t *pud, *pud_ref;
-+      pmd_t *pmd, *pmd_ref;
-+      pte_t *pte, *pte_ref;
-+
-+      /* Copy kernel mappings over when needed. This can also
-+         happen within a race in page table update. In the later
-+         case just flush. */
-+
-+      /* On Xen the line below does not always work. Needs investigating! */
-+      /*pgd = pgd_offset(current->mm ?: &init_mm, address);*/
-+      pgd = __va(read_cr3() & PHYSICAL_PAGE_MASK);
-+      pgd += pgd_index(address);
-+      pgd_ref = pgd_offset_k(address);
-+      if (pgd_none(*pgd_ref))
-+              return -1;
-+      if (pgd_none(*pgd))
-+              set_pgd(pgd, *pgd_ref);
-+      else
-+              BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref));
-+
-+      /* Below here mismatches are bugs because these lower tables
-+         are shared */
-+
-+      pud = pud_offset(pgd, address);
-+      pud_ref = pud_offset(pgd_ref, address);
-+      if (pud_none(*pud_ref))
-+              return -1;
-+      if (pud_none(*pud) || pud_page(*pud) != pud_page(*pud_ref))
-+              BUG();
-+      pmd = pmd_offset(pud, address);
-+      pmd_ref = pmd_offset(pud_ref, address);
-+      if (pmd_none(*pmd_ref))
-+              return -1;
-+      if (pmd_none(*pmd) || pmd_page(*pmd) != pmd_page(*pmd_ref))
-+              BUG();
-+      pte_ref = pte_offset_kernel(pmd_ref, address);
-+      if (!pte_present(*pte_ref))
-+              return -1;
-+      pte = pte_offset_kernel(pmd, address);
-+      /* Don't use pte_page here, because the mappings can point
-+         outside mem_map, and the NUMA hash lookup cannot handle
-+         that. */
-+      if (!pte_present(*pte) || pte_pfn(*pte) != pte_pfn(*pte_ref))
-+              BUG();
-+      return 0;
-+}
-+
-+int page_fault_trace = 0;
-+int exception_trace = 1;
-+
-+
-+#define MEM_VERBOSE 1
-+
-+#ifdef MEM_VERBOSE
-+#define MEM_LOG(_f, _a...)                    \
-+      printk("fault.c:[%d]-> " _f "\n",       \
-+      __LINE__ , ## _a )
-+#else
-+#define MEM_LOG(_f, _a...) ((void)0)
-+#endif
-+
-+static int spurious_fault(struct pt_regs *regs,
-+                        unsigned long address,
-+                        unsigned long error_code)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+
-+#ifdef CONFIG_XEN
-+      /* Faults in hypervisor area are never spurious. */
-+      if ((address >= HYPERVISOR_VIRT_START) &&
-+          (address < HYPERVISOR_VIRT_END))
-+              return 0;
-+#endif
-+
-+      /* Reserved-bit violation or user access to kernel space? */
-+      if (error_code & (PF_RSVD|PF_USER))
-+              return 0;
-+
-+      pgd = init_mm.pgd + pgd_index(address);
-+      if (!pgd_present(*pgd))
-+              return 0;
-+
-+      pud = pud_offset(pgd, address);
-+      if (!pud_present(*pud))
-+              return 0;
-+
-+      pmd = pmd_offset(pud, address);
-+      if (!pmd_present(*pmd))
-+              return 0;
-+
-+      pte = pte_offset_kernel(pmd, address);
-+      if (!pte_present(*pte))
-+              return 0;
-+      if ((error_code & PF_WRITE) && !pte_write(*pte))
-+              return 0;
-+      if ((error_code & PF_INSTR) && (__pte_val(*pte) & _PAGE_NX))
-+              return 0;
-+
-+      return 1;
-+}
-+
-+/*
-+ * This routine handles page faults.  It determines the address,
-+ * and the problem, and then passes it off to one of the appropriate
-+ * routines.
-+ */
-+asmlinkage void __kprobes do_page_fault(struct pt_regs *regs,
-+                                      unsigned long error_code)
-+{
-+      struct task_struct *tsk;
-+      struct mm_struct *mm;
-+      struct vm_area_struct * vma;
-+      unsigned long address;
-+      const struct exception_table_entry *fixup;
-+      int write;
-+      unsigned long flags;
-+      siginfo_t info;
-+
-+      if (!user_mode(regs))
-+              error_code &= ~PF_USER; /* means kernel */
-+
-+      tsk = current;
-+      mm = tsk->mm;
-+      prefetchw(&mm->mmap_sem);
-+
-+      /* get the address */
-+      address = current_vcpu_info()->arch.cr2;
-+
-+      info.si_code = SEGV_MAPERR;
-+
-+
-+      /*
-+       * We fault-in kernel-space virtual memory on-demand. The
-+       * 'reference' page table is init_mm.pgd.
-+       *
-+       * NOTE! We MUST NOT take any locks for this case. We may
-+       * be in an interrupt or a critical region, and should
-+       * only copy the information from the master page table,
-+       * nothing more.
-+       *
-+       * This verifies that the fault happens in kernel space
-+       * (error_code & 4) == 0, and that the fault was not a
-+       * protection error (error_code & 9) == 0.
-+       */
-+      if (unlikely(address >= TASK_SIZE64)) {
-+              /*
-+               * Don't check for the module range here: its PML4
-+               * is always initialized because it's shared with the main
-+               * kernel text. Only vmalloc may need PML4 syncups.
-+               */
-+              if (!(error_code & (PF_RSVD|PF_USER|PF_PROT)) &&
-+                    ((address >= VMALLOC_START && address < VMALLOC_END))) {
-+                      if (vmalloc_fault(address) >= 0)
-+                              return;
-+              }
-+              /* Can take a spurious fault if mapping changes R/O -> R/W. */
-+              if (spurious_fault(regs, address, error_code))
-+                      return;
-+              if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-+                                              SIGSEGV) == NOTIFY_STOP)
-+                      return;
-+              /*
-+               * Don't take the mm semaphore here. If we fixup a prefetch
-+               * fault we could otherwise deadlock.
-+               */
-+              goto bad_area_nosemaphore;
-+      }
-+
-+      if (notify_page_fault(DIE_PAGE_FAULT, "page fault", regs, error_code, 14,
-+                                      SIGSEGV) == NOTIFY_STOP)
-+              return;
-+
-+      if (likely(regs->eflags & X86_EFLAGS_IF))
-+              local_irq_enable();
-+
-+      if (unlikely(page_fault_trace))
-+              printk("pagefault rip:%lx rsp:%lx cs:%lu ss:%lu address %lx error %lx\n",
-+                     regs->rip,regs->rsp,regs->cs,regs->ss,address,error_code); 
-+
-+      if (unlikely(error_code & PF_RSVD))
-+              pgtable_bad(address, regs, error_code);
-+
-+      /*
-+       * If we're in an interrupt or have no user
-+       * context, we must not take the fault..
-+       */
-+      if (unlikely(in_atomic() || !mm))
-+              goto bad_area_nosemaphore;
-+
-+ again:
-+      /* When running in the kernel we expect faults to occur only to
-+       * addresses in user space.  All other faults represent errors in the
-+       * kernel and should generate an OOPS.  Unfortunatly, in the case of an
-+       * erroneous fault occurring in a code path which already holds mmap_sem
-+       * we will deadlock attempting to validate the fault against the
-+       * address space.  Luckily the kernel only validly references user
-+       * space from well defined areas of code, which are listed in the
-+       * exceptions table.
-+       *
-+       * As the vast majority of faults will be valid we will only perform
-+       * the source reference check when there is a possibilty of a deadlock.
-+       * Attempt to lock the address space, if we cannot we then validate the
-+       * source.  If this is invalid we can skip the address space check,
-+       * thus avoiding the deadlock.
-+       */
-+      if (!down_read_trylock(&mm->mmap_sem)) {
-+              if ((error_code & PF_USER) == 0 &&
-+                  !search_exception_tables(regs->rip))
-+                      goto bad_area_nosemaphore;
-+              down_read(&mm->mmap_sem);
-+      }
-+
-+      vma = find_vma(mm, address);
-+      if (!vma)
-+              goto bad_area;
-+      if (likely(vma->vm_start <= address))
-+              goto good_area;
-+      if (!(vma->vm_flags & VM_GROWSDOWN))
-+              goto bad_area;
-+      if (error_code & 4) {
-+              /* Allow userspace just enough access below the stack pointer
-+               * to let the 'enter' instruction work.
-+               */
-+              if (address + 65536 + 32 * sizeof(unsigned long) < regs->rsp)
-+                      goto bad_area;
-+      }
-+      if (expand_stack(vma, address))
-+              goto bad_area;
-+/*
-+ * Ok, we have a good vm_area for this memory access, so
-+ * we can handle it..
-+ */
-+good_area:
-+      info.si_code = SEGV_ACCERR;
-+      write = 0;
-+      switch (error_code & (PF_PROT|PF_WRITE)) {
-+              default:        /* 3: write, present */
-+                      /* fall through */
-+              case PF_WRITE:          /* write, not present */
-+                      if (!(vma->vm_flags & VM_WRITE))
-+                              goto bad_area;
-+                      write++;
-+                      break;
-+              case PF_PROT:           /* read, present */
-+                      goto bad_area;
-+              case 0:                 /* read, not present */
-+                      if (!(vma->vm_flags & (VM_READ | VM_EXEC)))
-+                              goto bad_area;
-+      }
-+
-+      /*
-+       * If for any reason at all we couldn't handle the fault,
-+       * make sure we exit gracefully rather than endlessly redo
-+       * the fault.
-+       */
-+      switch (handle_mm_fault(mm, vma, address, write)) {
-+      case VM_FAULT_MINOR:
-+              tsk->min_flt++;
-+              break;
-+      case VM_FAULT_MAJOR:
-+              tsk->maj_flt++;
-+              break;
-+      case VM_FAULT_SIGBUS:
-+              goto do_sigbus;
-+      default:
-+              goto out_of_memory;
-+      }
-+
-+      up_read(&mm->mmap_sem);
-+      return;
-+
-+/*
-+ * Something tried to access memory that isn't in our memory map..
-+ * Fix it, but check if it's kernel or user first..
-+ */
-+bad_area:
-+      up_read(&mm->mmap_sem);
-+
-+bad_area_nosemaphore:
-+      /* User mode accesses just cause a SIGSEGV */
-+      if (error_code & PF_USER) {
-+              if (is_prefetch(regs, address, error_code))
-+                      return;
-+
-+              /* Work around K8 erratum #100 K8 in compat mode
-+                 occasionally jumps to illegal addresses >4GB.  We
-+                 catch this here in the page fault handler because
-+                 these addresses are not reachable. Just detect this
-+                 case and return.  Any code segment in LDT is
-+                 compatibility mode. */
-+              if ((regs->cs == __USER32_CS || (regs->cs & (1<<2))) &&
-+                  (address >> 32))
-+                      return;
-+
-+              if (exception_trace && unhandled_signal(tsk, SIGSEGV)) {
-+                      printk(
-+                     "%s%s[%d]: segfault at %016lx rip %016lx rsp %016lx error %lx\n",
-+                                      tsk->pid > 1 ? KERN_INFO : KERN_EMERG,
-+                                      tsk->comm, tsk->pid, address, regs->rip,
-+                                      regs->rsp, error_code);
-+              }
-+       
-+              tsk->thread.cr2 = address;
-+              /* Kernel addresses are always protection faults */
-+              tsk->thread.error_code = error_code | (address >= TASK_SIZE);
-+              tsk->thread.trap_no = 14;
-+              info.si_signo = SIGSEGV;
-+              info.si_errno = 0;
-+              /* info.si_code has been set above */
-+              info.si_addr = (void __user *)address;
-+              force_sig_info(SIGSEGV, &info, tsk);
-+              return;
-+      }
-+
-+no_context:
-+      
-+      /* Are we prepared to handle this kernel fault?  */
-+      fixup = search_exception_tables(regs->rip);
-+      if (fixup) {
-+              regs->rip = fixup->fixup;
-+              return;
-+      }
-+
-+      /* 
-+       * Hall of shame of CPU/BIOS bugs.
-+       */
-+
-+      if (is_prefetch(regs, address, error_code))
-+              return;
-+
-+      if (is_errata93(regs, address))
-+              return; 
-+
-+/*
-+ * Oops. The kernel tried to access some bad page. We'll have to
-+ * terminate things with extreme prejudice.
-+ */
-+
-+      flags = oops_begin();
-+
-+      if (address < PAGE_SIZE)
-+              printk(KERN_ALERT "Unable to handle kernel NULL pointer dereference");
-+      else
-+              printk(KERN_ALERT "Unable to handle kernel paging request");
-+      printk(" at %016lx RIP: \n" KERN_ALERT,address);
-+      printk_address(regs->rip);
-+      dump_pagetable(address);
-+      tsk->thread.cr2 = address;
-+      tsk->thread.trap_no = 14;
-+      tsk->thread.error_code = error_code;
-+      __die("Oops", regs, error_code);
-+      /* Executive summary in case the body of the oops scrolled away */
-+      printk(KERN_EMERG "CR2: %016lx\n", address);
-+      oops_end(flags);
-+      do_exit(SIGKILL);
-+
-+/*
-+ * We ran out of memory, or some other thing happened to us that made
-+ * us unable to handle the page fault gracefully.
-+ */
-+out_of_memory:
-+      up_read(&mm->mmap_sem);
-+      if (current->pid == 1) { 
-+              yield();
-+              goto again;
-+      }
-+      printk("VM: killing process %s\n", tsk->comm);
-+      if (error_code & 4)
-+              do_exit(SIGKILL);
-+      goto no_context;
-+
-+do_sigbus:
-+      up_read(&mm->mmap_sem);
-+
-+      /* Kernel mode? Handle exceptions or die */
-+      if (!(error_code & PF_USER))
-+              goto no_context;
-+
-+      tsk->thread.cr2 = address;
-+      tsk->thread.error_code = error_code;
-+      tsk->thread.trap_no = 14;
-+      info.si_signo = SIGBUS;
-+      info.si_errno = 0;
-+      info.si_code = BUS_ADRERR;
-+      info.si_addr = (void __user *)address;
-+      force_sig_info(SIGBUS, &info, tsk);
-+      return;
-+}
-+
-+DEFINE_SPINLOCK(pgd_lock);
-+struct page *pgd_list;
-+
-+void vmalloc_sync_all(void)
-+{
-+      /* Note that races in the updates of insync and start aren't 
-+         problematic:
-+         insync can only get set bits added, and updates to start are only
-+         improving performance (without affecting correctness if undone). */
-+      static DECLARE_BITMAP(insync, PTRS_PER_PGD);
-+      static unsigned long start = VMALLOC_START & PGDIR_MASK;
-+      unsigned long address;
-+
-+      for (address = start; address <= VMALLOC_END; address += PGDIR_SIZE) {
-+              if (!test_bit(pgd_index(address), insync)) {
-+                      const pgd_t *pgd_ref = pgd_offset_k(address);
-+                      struct page *page;
-+
-+                      if (pgd_none(*pgd_ref))
-+                              continue;
-+                      spin_lock(&pgd_lock);
-+                      for (page = pgd_list; page;
-+                           page = (struct page *)page->index) {
-+                              pgd_t *pgd;
-+                              pgd = (pgd_t *)page_address(page) + pgd_index(address);
-+                              if (pgd_none(*pgd))
-+                                      set_pgd(pgd, *pgd_ref);
-+                              else
-+                                      BUG_ON(pgd_page(*pgd) != pgd_page(*pgd_ref));
-+                      }
-+                      spin_unlock(&pgd_lock);
-+                      set_bit(pgd_index(address), insync);
-+              }
-+              if (address == start)
-+                      start = address + PGDIR_SIZE;
-+      }
-+      /* Check that there is no need to do the same for the modules area. */
-+      BUILD_BUG_ON(!(MODULES_VADDR > __START_KERNEL));
-+      BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == 
-+                              (__START_KERNEL & PGDIR_MASK)));
-+}
-+
-+static int __init enable_pagefaulttrace(char *str)
-+{
-+      page_fault_trace = 1;
-+      return 1;
-+}
-+__setup("pagefaulttrace", enable_pagefaulttrace);
-Index: head-2008-11-25/arch/x86/mm/init_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/init_64-xen.c  2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,1206 @@
-+/*
-+ *  linux/arch/x86_64/mm/init.c
-+ *
-+ *  Copyright (C) 1995  Linus Torvalds
-+ *  Copyright (C) 2000  Pavel Machek <pavel@suse.cz>
-+ *  Copyright (C) 2002,2003 Andi Kleen <ak@suse.de>
-+ *
-+ *  Jun Nakajima <jun.nakajima@intel.com>
-+ *    Modified for Xen.
-+ */
-+
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ptrace.h>
-+#include <linux/mman.h>
-+#include <linux/mm.h>
-+#include <linux/swap.h>
-+#include <linux/smp.h>
-+#include <linux/init.h>
-+#include <linux/pagemap.h>
-+#include <linux/bootmem.h>
-+#include <linux/proc_fs.h>
-+#include <linux/pci.h>
-+#include <linux/poison.h>
-+#include <linux/dma-mapping.h>
-+#include <linux/module.h>
-+#include <linux/memory_hotplug.h>
-+
-+#include <asm/processor.h>
-+#include <asm/system.h>
-+#include <asm/uaccess.h>
-+#include <asm/pgtable.h>
-+#include <asm/pgalloc.h>
-+#include <asm/dma.h>
-+#include <asm/fixmap.h>
-+#include <asm/e820.h>
-+#include <asm/apic.h>
-+#include <asm/tlb.h>
-+#include <asm/mmu_context.h>
-+#include <asm/proto.h>
-+#include <asm/smp.h>
-+#include <asm/sections.h>
-+
-+#include <xen/features.h>
-+
-+#ifndef Dprintk
-+#define Dprintk(x...)
-+#endif
-+
-+struct dma_mapping_ops* dma_ops;
-+EXPORT_SYMBOL(dma_ops);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+unsigned int __kernel_page_user;
-+EXPORT_SYMBOL(__kernel_page_user);
-+#endif
-+
-+int after_bootmem;
-+
-+static unsigned long dma_reserve __initdata;
-+
-+DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
-+extern unsigned long start_pfn;
-+
-+/*
-+ * Use this until direct mapping is established, i.e. before __va() is 
-+ * available in init_memory_mapping().
-+ */
-+
-+#define addr_to_page(addr, page)                              \
-+      (addr) &= PHYSICAL_PAGE_MASK;                           \
-+      (page) = ((unsigned long *) ((unsigned long)            \
-+      (((mfn_to_pfn((addr) >> PAGE_SHIFT)) << PAGE_SHIFT) +   \
-+      __START_KERNEL_map)))
-+
-+static void __meminit early_make_page_readonly(void *va, unsigned int feature)
-+{
-+      unsigned long addr, _va = (unsigned long)va;
-+      pte_t pte, *ptep;
-+      unsigned long *page = (unsigned long *) init_level4_pgt;
-+
-+      BUG_ON(after_bootmem);
-+
-+      if (xen_feature(feature))
-+              return;
-+
-+      addr = (unsigned long) page[pgd_index(_va)];
-+      addr_to_page(addr, page);
-+
-+      addr = page[pud_index(_va)];
-+      addr_to_page(addr, page);
-+
-+      addr = page[pmd_index(_va)];
-+      addr_to_page(addr, page);
-+
-+      ptep = (pte_t *) &page[pte_index(_va)];
-+
-+      pte.pte = ptep->pte & ~_PAGE_RW;
-+      if (HYPERVISOR_update_va_mapping(_va, pte, 0))
-+              BUG();
-+}
-+
-+static void __make_page_readonly(void *va)
-+{
-+      pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
-+      unsigned long addr = (unsigned long) va;
-+
-+      pgd = pgd_offset_k(addr);
-+      pud = pud_offset(pgd, addr);
-+      pmd = pmd_offset(pud, addr);
-+      ptep = pte_offset_kernel(pmd, addr);
-+
-+      pte.pte = ptep->pte & ~_PAGE_RW;
-+      if (HYPERVISOR_update_va_mapping(addr, pte, 0))
-+              xen_l1_entry_update(ptep, pte); /* fallback */
-+
-+      if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
-+              __make_page_readonly(__va(pte_pfn(pte) << PAGE_SHIFT));
-+}
-+
-+static void __make_page_writable(void *va)
-+{
-+      pgd_t *pgd; pud_t *pud; pmd_t *pmd; pte_t pte, *ptep;
-+      unsigned long addr = (unsigned long) va;
-+
-+      pgd = pgd_offset_k(addr);
-+      pud = pud_offset(pgd, addr);
-+      pmd = pmd_offset(pud, addr);
-+      ptep = pte_offset_kernel(pmd, addr);
-+
-+      pte.pte = ptep->pte | _PAGE_RW;
-+      if (HYPERVISOR_update_va_mapping(addr, pte, 0))
-+              xen_l1_entry_update(ptep, pte); /* fallback */
-+
-+      if ((addr >= VMALLOC_START) && (addr < VMALLOC_END))
-+              __make_page_writable(__va(pte_pfn(pte) << PAGE_SHIFT));
-+}
-+
-+void make_page_readonly(void *va, unsigned int feature)
-+{
-+      if (!xen_feature(feature))
-+              __make_page_readonly(va);
-+}
-+
-+void make_page_writable(void *va, unsigned int feature)
-+{
-+      if (!xen_feature(feature))
-+              __make_page_writable(va);
-+}
-+
-+void make_pages_readonly(void *va, unsigned nr, unsigned int feature)
-+{
-+      if (xen_feature(feature))
-+              return;
-+
-+      while (nr-- != 0) {
-+              __make_page_readonly(va);
-+              va = (void*)((unsigned long)va + PAGE_SIZE);
-+      }
-+}
-+
-+void make_pages_writable(void *va, unsigned nr, unsigned int feature)
-+{
-+      if (xen_feature(feature))
-+              return;
-+
-+      while (nr-- != 0) {
-+              __make_page_writable(va);
-+              va = (void*)((unsigned long)va + PAGE_SIZE);
-+      }
-+}
-+
-+/*
-+ * NOTE: pagetable_init alloc all the fixmap pagetables contiguous on the
-+ * physical space so we can cache the place of the first one and move
-+ * around without checking the pgd every time.
-+ */
-+
-+void show_mem(void)
-+{
-+      long i, total = 0, reserved = 0;
-+      long shared = 0, cached = 0;
-+      pg_data_t *pgdat;
-+      struct page *page;
-+
-+      printk(KERN_INFO "Mem-info:\n");
-+      show_free_areas();
-+      printk(KERN_INFO "Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
-+
-+      for_each_online_pgdat(pgdat) {
-+               for (i = 0; i < pgdat->node_spanned_pages; ++i) {
-+                      page = pfn_to_page(pgdat->node_start_pfn + i);
-+                      total++;
-+                      if (PageReserved(page))
-+                              reserved++;
-+                      else if (PageSwapCache(page))
-+                              cached++;
-+                      else if (page_count(page))
-+                              shared += page_count(page) - 1;
-+               }
-+      }
-+      printk(KERN_INFO "%lu pages of RAM\n", total);
-+      printk(KERN_INFO "%lu reserved pages\n",reserved);
-+      printk(KERN_INFO "%lu pages shared\n",shared);
-+      printk(KERN_INFO "%lu pages swap cached\n",cached);
-+}
-+
-+
-+static __init void *spp_getpage(void)
-+{ 
-+      void *ptr;
-+      if (after_bootmem)
-+              ptr = (void *) get_zeroed_page(GFP_ATOMIC); 
-+      else if (start_pfn < table_end) {
-+              ptr = __va(start_pfn << PAGE_SHIFT);
-+              start_pfn++;
-+              memset(ptr, 0, PAGE_SIZE);
-+      } else
-+              ptr = alloc_bootmem_pages(PAGE_SIZE);
-+      if (!ptr || ((unsigned long)ptr & ~PAGE_MASK))
-+              panic("set_pte_phys: cannot allocate page data %s\n", after_bootmem?"after bootmem":"");
-+
-+      Dprintk("spp_getpage %p\n", ptr);
-+      return ptr;
-+} 
-+
-+#define pgd_offset_u(address) (__user_pgd(init_level4_pgt) + pgd_index(address))
-+#define pud_offset_u(address) (level3_user_pgt + pud_index(address))
-+
-+static __init void set_pte_phys(unsigned long vaddr,
-+                       unsigned long phys, pgprot_t prot, int user_mode)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte, new_pte;
-+
-+      Dprintk("set_pte_phys %lx to %lx\n", vaddr, phys);
-+
-+      pgd = (user_mode ? pgd_offset_u(vaddr) : pgd_offset_k(vaddr));
-+      if (pgd_none(*pgd)) {
-+              printk("PGD FIXMAP MISSING, it should be setup in head.S!\n");
-+              return;
-+      }
-+      pud = (user_mode ? pud_offset_u(vaddr) : pud_offset(pgd, vaddr));
-+      if (pud_none(*pud)) {
-+              pmd = (pmd_t *) spp_getpage(); 
-+              make_page_readonly(pmd, XENFEAT_writable_page_tables);
-+              set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
-+              if (pmd != pmd_offset(pud, 0)) {
-+                      printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
-+                      return;
-+              }
-+      }
-+      pmd = pmd_offset(pud, vaddr);
-+      if (pmd_none(*pmd)) {
-+              pte = (pte_t *) spp_getpage();
-+              make_page_readonly(pte, XENFEAT_writable_page_tables);
-+              set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
-+              if (pte != pte_offset_kernel(pmd, 0)) {
-+                      printk("PAGETABLE BUG #02!\n");
-+                      return;
-+              }
-+      }
-+      if (pgprot_val(prot))
-+              new_pte = pfn_pte(phys >> PAGE_SHIFT, prot);
-+      else
-+              new_pte = __pte(0);
-+
-+      pte = pte_offset_kernel(pmd, vaddr);
-+      if (!pte_none(*pte) && __pte_val(new_pte) &&
-+          __pte_val(*pte) != (__pte_val(new_pte) & __supported_pte_mask))
-+              pte_ERROR(*pte);
-+      set_pte(pte, new_pte);
-+
-+      /*
-+       * It's enough to flush this one mapping.
-+       * (PGE mappings get flushed as well)
-+       */
-+      __flush_tlb_one(vaddr);
-+}
-+
-+static __init void set_pte_phys_ma(unsigned long vaddr,
-+                                 unsigned long phys, pgprot_t prot)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte, new_pte;
-+
-+      Dprintk("set_pte_phys %lx to %lx\n", vaddr, phys);
-+
-+      pgd = pgd_offset_k(vaddr);
-+      if (pgd_none(*pgd)) {
-+              printk("PGD FIXMAP MISSING, it should be setup in head.S!\n");
-+              return;
-+      }
-+      pud = pud_offset(pgd, vaddr);
-+      if (pud_none(*pud)) {
-+
-+              pmd = (pmd_t *) spp_getpage(); 
-+              make_page_readonly(pmd, XENFEAT_writable_page_tables);
-+              set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
-+              if (pmd != pmd_offset(pud, 0)) {
-+                      printk("PAGETABLE BUG #01! %p <-> %p\n", pmd, pmd_offset(pud,0));
-+                      return;
-+              }
-+      }
-+      pmd = pmd_offset(pud, vaddr);
-+      if (pmd_none(*pmd)) {
-+              pte = (pte_t *) spp_getpage();
-+              make_page_readonly(pte, XENFEAT_writable_page_tables);
-+              set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
-+              if (pte != pte_offset_kernel(pmd, 0)) {
-+                      printk("PAGETABLE BUG #02!\n");
-+                      return;
-+              }
-+      }
-+      new_pte = pfn_pte_ma(phys >> PAGE_SHIFT, prot);
-+
-+      pte = pte_offset_kernel(pmd, vaddr);
-+      if (!pte_none(*pte) && __pte_val(new_pte) &&
-+#ifdef CONFIG_ACPI
-+          /* __acpi_map_table() fails to properly call clear_fixmap() */
-+          (vaddr < __fix_to_virt(FIX_ACPI_END) ||
-+           vaddr > __fix_to_virt(FIX_ACPI_BEGIN)) &&
-+#endif
-+          __pte_val(*pte) != (__pte_val(new_pte) & __supported_pte_mask))
-+              pte_ERROR(*pte);
-+      set_pte(pte, new_pte);
-+
-+      /*
-+       * It's enough to flush this one mapping.
-+       * (PGE mappings get flushed as well)
-+       */
-+      __flush_tlb_one(vaddr);
-+}
-+
-+/* NOTE: this is meant to be run only at boot */
-+void __init 
-+__set_fixmap (enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
-+{
-+      unsigned long address = __fix_to_virt(idx);
-+
-+      if (idx >= __end_of_fixed_addresses) {
-+              printk("Invalid __set_fixmap\n");
-+              return;
-+      }
-+      switch (idx) {
-+      case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE:
-+              set_pte_phys(address, phys, prot, 0);
-+              set_pte_phys(address, phys, prot, 1);
-+              break;
-+      default:
-+              set_pte_phys_ma(address, phys, prot);
-+              break;
-+      }
-+}
-+
-+unsigned long __initdata table_start, table_end; 
-+
-+static __meminit void *alloc_static_page(unsigned long *phys)
-+{
-+      unsigned long va = (start_pfn << PAGE_SHIFT) + __START_KERNEL_map;
-+
-+      if (after_bootmem) {
-+              void *adr = (void *)get_zeroed_page(GFP_ATOMIC);
-+
-+              *phys = __pa(adr);
-+              return adr;
-+      }
-+
-+      *phys = start_pfn << PAGE_SHIFT;
-+      start_pfn++;
-+      memset((void *)va, 0, PAGE_SIZE);
-+      return (void *)va;
-+} 
-+
-+#define PTE_SIZE PAGE_SIZE
-+
-+static inline int make_readonly(unsigned long paddr)
-+{
-+      extern char __vsyscall_0;
-+      int readonly = 0;
-+
-+      /* Make new page tables read-only. */
-+      if (!xen_feature(XENFEAT_writable_page_tables)
-+          && (paddr >= (table_start << PAGE_SHIFT))
-+          && (paddr < (table_end << PAGE_SHIFT)))
-+              readonly = 1;
-+      /* Make old page tables read-only. */
-+      if (!xen_feature(XENFEAT_writable_page_tables)
-+          && (paddr >= (xen_start_info->pt_base - __START_KERNEL_map))
-+          && (paddr < (start_pfn << PAGE_SHIFT)))
-+              readonly = 1;
-+
-+      /*
-+       * No need for writable mapping of kernel image. This also ensures that
-+       * page and descriptor tables embedded inside don't have writable
-+       * mappings. Exclude the vsyscall area here, allowing alternative
-+       * instruction patching to work.
-+       */
-+      if ((paddr >= __pa_symbol(&_text)) && (paddr < __pa_symbol(&_end))
-+          && !(paddr >= __pa_symbol(&__vsyscall_0)
-+               && paddr < __pa_symbol(&__vsyscall_0) + PAGE_SIZE))
-+              readonly = 1;
-+
-+      return readonly;
-+}
-+
-+#ifndef CONFIG_XEN
-+/* Must run before zap_low_mappings */
-+__init void *early_ioremap(unsigned long addr, unsigned long size)
-+{
-+      unsigned long map = round_down(addr, LARGE_PAGE_SIZE);
-+
-+      /* actually usually some more */
-+      if (size >= LARGE_PAGE_SIZE) {
-+              printk("SMBIOS area too long %lu\n", size);
-+              return NULL;
-+      }
-+      set_pmd(temp_mappings[0].pmd,  __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
-+      map += LARGE_PAGE_SIZE;
-+      set_pmd(temp_mappings[1].pmd,  __pmd(map | _KERNPG_TABLE | _PAGE_PSE));
-+      __flush_tlb();
-+      return temp_mappings[0].address + (addr & (LARGE_PAGE_SIZE-1));
-+}
-+
-+/* To avoid virtual aliases later */
-+__init void early_iounmap(void *addr, unsigned long size)
-+{
-+      if ((void *)round_down((unsigned long)addr, LARGE_PAGE_SIZE) != temp_mappings[0].address)
-+              printk("early_iounmap: bad address %p\n", addr);
-+      set_pmd(temp_mappings[0].pmd, __pmd(0));
-+      set_pmd(temp_mappings[1].pmd, __pmd(0));
-+      __flush_tlb();
-+}
-+#endif
-+
-+static void __meminit
-+phys_pmd_init(pmd_t *pmd, unsigned long address, unsigned long end)
-+{
-+      int i, k;
-+
-+      for (i = 0; i < PTRS_PER_PMD; pmd++, i++) {
-+              unsigned long pte_phys;
-+              pte_t *pte, *pte_save;
-+
-+              if (address >= end)
-+                      break;
-+              pte = alloc_static_page(&pte_phys);
-+              pte_save = pte;
-+              for (k = 0; k < PTRS_PER_PTE; pte++, k++, address += PTE_SIZE) {
-+                      unsigned long pteval = address | _PAGE_NX | _KERNPG_TABLE;
-+
-+                      if (address >= (after_bootmem
-+                                      ? end
-+                                      : xen_start_info->nr_pages << PAGE_SHIFT))
-+                              pteval = 0;
-+                      else if (make_readonly(address))
-+                              pteval &= ~_PAGE_RW;
-+                      set_pte(pte, __pte(pteval & __supported_pte_mask));
-+              }
-+              if (!after_bootmem) {
-+                      early_make_page_readonly(pte_save, XENFEAT_writable_page_tables);
-+                      *pmd = __pmd(pte_phys | _KERNPG_TABLE);
-+              } else {
-+                      make_page_readonly(pte_save, XENFEAT_writable_page_tables);
-+                      set_pmd(pmd, __pmd(pte_phys | _KERNPG_TABLE));
-+              }
-+      }
-+}
-+
-+static void __meminit
-+phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end)
-+{
-+      pmd_t *pmd = pmd_offset(pud, (unsigned long)__va(address));
-+
-+      if (pmd_none(*pmd)) {
-+              spin_lock(&init_mm.page_table_lock);
-+              phys_pmd_init(pmd, address, end);
-+              spin_unlock(&init_mm.page_table_lock);
-+              __flush_tlb_all();
-+      }
-+}
-+
-+static void __meminit phys_pud_init(pud_t *pud, unsigned long address, unsigned long end)
-+{ 
-+      long i = pud_index(address);
-+
-+      pud = pud + i;
-+
-+      if (after_bootmem && pud_val(*pud)) {
-+              phys_pmd_update(pud, address, end);
-+              return;
-+      }
-+
-+      for (; i < PTRS_PER_PUD; pud++, i++) {
-+              unsigned long paddr, pmd_phys;
-+              pmd_t *pmd;
-+
-+              paddr = (address & PGDIR_MASK) + i*PUD_SIZE;
-+              if (paddr >= end)
-+                      break;
-+
-+              pmd = alloc_static_page(&pmd_phys);
-+
-+              spin_lock(&init_mm.page_table_lock);
-+              *pud = __pud(pmd_phys | _KERNPG_TABLE);
-+              phys_pmd_init(pmd, paddr, end);
-+              spin_unlock(&init_mm.page_table_lock);
-+
-+              early_make_page_readonly(pmd, XENFEAT_writable_page_tables);
-+      }
-+      __flush_tlb();
-+} 
-+
-+void __init xen_init_pt(void)
-+{
-+      unsigned long addr, *page;
-+
-+      /* Find the initial pte page that was built for us. */
-+      page = (unsigned long *)xen_start_info->pt_base;
-+      addr = page[pgd_index(__START_KERNEL_map)];
-+      addr_to_page(addr, page);
-+      addr = page[pud_index(__START_KERNEL_map)];
-+      addr_to_page(addr, page);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      /* On Xen 3.0.2 and older we may need to explicitly specify _PAGE_USER
-+         in kernel PTEs. We check that here. */
-+      if (HYPERVISOR_xen_version(XENVER_version, NULL) <= 0x30000) {
-+              unsigned long *pg;
-+              pte_t pte;
-+
-+              /* Mess with the initial mapping of page 0. It's not needed. */
-+              BUILD_BUG_ON(__START_KERNEL <= __START_KERNEL_map);
-+              addr = page[pmd_index(__START_KERNEL_map)];
-+              addr_to_page(addr, pg);
-+              pte.pte = pg[pte_index(__START_KERNEL_map)];
-+              BUG_ON(!(pte.pte & _PAGE_PRESENT));
-+
-+              /* If _PAGE_USER isn't set, we obviously do not need it. */
-+              if (pte.pte & _PAGE_USER) {
-+                      /* _PAGE_USER is needed, but is it set implicitly? */
-+                      pte.pte &= ~_PAGE_USER;
-+                      if ((HYPERVISOR_update_va_mapping(__START_KERNEL_map,
-+                                                        pte, 0) != 0) ||
-+                          !(pg[pte_index(__START_KERNEL_map)] & _PAGE_USER))
-+                              /* We need to explicitly specify _PAGE_USER. */
-+                              __kernel_page_user = _PAGE_USER;
-+              }
-+      }
-+#endif
-+
-+      /* Construct mapping of initial pte page in our own directories. */
-+      init_level4_pgt[pgd_index(__START_KERNEL_map)] = 
-+              __pgd(__pa_symbol(level3_kernel_pgt) | _PAGE_TABLE);
-+      level3_kernel_pgt[pud_index(__START_KERNEL_map)] = 
-+              __pud(__pa_symbol(level2_kernel_pgt) | _PAGE_TABLE);
-+      memcpy(level2_kernel_pgt, page, PAGE_SIZE);
-+
-+      __user_pgd(init_level4_pgt)[pgd_index(VSYSCALL_START)] =
-+              __pgd(__pa_symbol(level3_user_pgt) | _PAGE_TABLE);
-+
-+      early_make_page_readonly(init_level4_pgt,
-+                               XENFEAT_writable_page_tables);
-+      early_make_page_readonly(__user_pgd(init_level4_pgt),
-+                               XENFEAT_writable_page_tables);
-+      early_make_page_readonly(level3_kernel_pgt,
-+                               XENFEAT_writable_page_tables);
-+      early_make_page_readonly(level3_user_pgt,
-+                               XENFEAT_writable_page_tables);
-+      early_make_page_readonly(level2_kernel_pgt,
-+                               XENFEAT_writable_page_tables);
-+
-+      if (!xen_feature(XENFEAT_writable_page_tables)) {
-+              xen_pgd_pin(__pa_symbol(init_level4_pgt));
-+              xen_pgd_pin(__pa_symbol(__user_pgd(init_level4_pgt)));
-+      }
-+}
-+
-+static void __init extend_init_mapping(unsigned long tables_space)
-+{
-+      unsigned long va = __START_KERNEL_map;
-+      unsigned long phys, addr, *pte_page;
-+      pmd_t *pmd;
-+      pte_t *pte, new_pte;
-+      unsigned long *page = (unsigned long *)init_level4_pgt;
-+
-+      addr = page[pgd_index(va)];
-+      addr_to_page(addr, page);
-+      addr = page[pud_index(va)];
-+      addr_to_page(addr, page);
-+
-+      /* Kill mapping of low 1MB. */
-+      while (va < (unsigned long)&_text) {
-+              if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
-+                      BUG();
-+              va += PAGE_SIZE;
-+      }
-+
-+      /* Ensure init mappings cover kernel text/data and initial tables. */
-+      while (va < (__START_KERNEL_map
-+                   + (start_pfn << PAGE_SHIFT)
-+                   + tables_space)) {
-+              pmd = (pmd_t *)&page[pmd_index(va)];
-+              if (pmd_none(*pmd)) {
-+                      pte_page = alloc_static_page(&phys);
-+                      early_make_page_readonly(
-+                              pte_page, XENFEAT_writable_page_tables);
-+                      set_pmd(pmd, __pmd(phys | _KERNPG_TABLE));
-+              } else {
-+                      addr = page[pmd_index(va)];
-+                      addr_to_page(addr, pte_page);
-+              }
-+              pte = (pte_t *)&pte_page[pte_index(va)];
-+              if (pte_none(*pte)) {
-+                      new_pte = pfn_pte(
-+                              (va - __START_KERNEL_map) >> PAGE_SHIFT, 
-+                              __pgprot(_KERNPG_TABLE));
-+                      xen_l1_entry_update(pte, new_pte);
-+              }
-+              va += PAGE_SIZE;
-+      }
-+
-+      /* Finally, blow away any spurious initial mappings. */
-+      while (1) {
-+              pmd = (pmd_t *)&page[pmd_index(va)];
-+              if (pmd_none(*pmd))
-+                      break;
-+              if (HYPERVISOR_update_va_mapping(va, __pte_ma(0), 0))
-+                      BUG();
-+              va += PAGE_SIZE;
-+      }
-+}
-+
-+static void __init find_early_table_space(unsigned long end)
-+{
-+      unsigned long puds, pmds, ptes, tables;
-+
-+      puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
-+      pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
-+      ptes = (end + PTE_SIZE - 1) >> PAGE_SHIFT;
-+
-+      tables = round_up(puds * 8, PAGE_SIZE) + 
-+              round_up(pmds * 8, PAGE_SIZE) + 
-+              round_up(ptes * 8, PAGE_SIZE); 
-+
-+      extend_init_mapping(tables);
-+
-+      table_start = start_pfn;
-+      table_end = table_start + (tables>>PAGE_SHIFT);
-+
-+      early_printk("kernel direct mapping tables up to %lx @ %lx-%lx\n",
-+              end, table_start << PAGE_SHIFT,
-+              (table_start << PAGE_SHIFT) + tables);
-+}
-+
-+static void xen_finish_init_mapping(void)
-+{
-+      unsigned long i, start, end;
-+
-+      /* Re-vector virtual addresses pointing into the initial
-+         mapping to the just-established permanent ones. */
-+      xen_start_info = __va(__pa(xen_start_info));
-+      xen_start_info->pt_base = (unsigned long)
-+              __va(__pa(xen_start_info->pt_base));
-+      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+              phys_to_machine_mapping =
-+                      __va(__pa(xen_start_info->mfn_list));
-+              xen_start_info->mfn_list = (unsigned long)
-+                      phys_to_machine_mapping;
-+      }
-+      if (xen_start_info->mod_start)
-+              xen_start_info->mod_start = (unsigned long)
-+                      __va(__pa(xen_start_info->mod_start));
-+
-+      /* Destroy the Xen-created mappings beyond the kernel image as
-+       * well as the temporary mappings created above. Prevents
-+       * overlap with modules area (if init mapping is very big).
-+       */
-+      start = PAGE_ALIGN((unsigned long)_end);
-+      end   = __START_KERNEL_map + (table_end << PAGE_SHIFT);
-+      for (; start < end; start += PAGE_SIZE)
-+              if (HYPERVISOR_update_va_mapping(start, __pte_ma(0), 0))
-+                      BUG();
-+
-+      /* Allocate pte's for initial fixmaps from 'start_pfn' allocator. */
-+      table_end = ~0UL;
-+
-+      /*
-+       * Prefetch pte's for the bt_ioremap() area. It gets used before the
-+       * boot-time allocator is online, so allocate-on-demand would fail.
-+       */
-+      for (i = FIX_BTMAP_END; i <= FIX_BTMAP_BEGIN; i++)
-+              __set_fixmap(i, 0, __pgprot(0));
-+
-+      /* Switch to the real shared_info page, and clear the dummy page. */
-+      set_fixmap(FIX_SHARED_INFO, xen_start_info->shared_info);
-+      HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-+      memset(empty_zero_page, 0, sizeof(empty_zero_page));
-+
-+      /* Set up mapping of lowest 1MB of physical memory. */
-+      for (i = 0; i < NR_FIX_ISAMAPS; i++)
-+              if (is_initial_xendomain())
-+                      set_fixmap(FIX_ISAMAP_BEGIN - i, i * PAGE_SIZE);
-+              else
-+                      __set_fixmap(FIX_ISAMAP_BEGIN - i,
-+                                   virt_to_mfn(empty_zero_page)
-+                                   << PAGE_SHIFT,
-+                                   PAGE_KERNEL_RO);
-+
-+      /* Disable the 'start_pfn' allocator. */
-+      table_end = start_pfn;
-+}
-+
-+/* Setup the direct mapping of the physical memory at PAGE_OFFSET.
-+   This runs before bootmem is initialized and gets pages directly from the 
-+   physical memory. To access them they are temporarily mapped. */
-+void __meminit init_memory_mapping(unsigned long start, unsigned long end)
-+{ 
-+      unsigned long next;
-+
-+      Dprintk("init_memory_mapping\n");
-+
-+      /* 
-+       * Find space for the kernel direct mapping tables.
-+       * Later we should allocate these tables in the local node of the memory
-+       * mapped.  Unfortunately this is done currently before the nodes are 
-+       * discovered.
-+       */
-+      if (!after_bootmem)
-+              find_early_table_space(end);
-+
-+      start = (unsigned long)__va(start);
-+      end = (unsigned long)__va(end);
-+
-+      for (; start < end; start = next) {
-+              unsigned long pud_phys; 
-+              pgd_t *pgd = pgd_offset_k(start);
-+              pud_t *pud;
-+
-+              if (after_bootmem)
-+                      pud = pud_offset(pgd, start & PGDIR_MASK);
-+              else
-+                      pud = alloc_static_page(&pud_phys);
-+              next = start + PGDIR_SIZE;
-+              if (next > end) 
-+                      next = end; 
-+              phys_pud_init(pud, __pa(start), __pa(next));
-+              if (!after_bootmem) {
-+                      early_make_page_readonly(pud, XENFEAT_writable_page_tables);
-+                      set_pgd(pgd_offset_k(start), mk_kernel_pgd(pud_phys));
-+              }
-+      }
-+
-+      if (!after_bootmem) {
-+              BUG_ON(start_pfn != table_end);
-+              xen_finish_init_mapping();
-+      }
-+
-+      __flush_tlb_all();
-+}
-+
-+void __cpuinit zap_low_mappings(int cpu)
-+{
-+      /* this is not required for Xen */
-+#if 0
-+      swap_low_mappings();
-+#endif
-+}
-+
-+/* Compute zone sizes for the DMA and DMA32 zones in a node. */
-+__init void
-+size_zones(unsigned long *z, unsigned long *h,
-+         unsigned long start_pfn, unsigned long end_pfn)
-+{
-+      int i;
-+      unsigned long w;
-+
-+      for (i = 0; i < MAX_NR_ZONES; i++)
-+              z[i] = 0;
-+
-+      if (start_pfn < MAX_DMA_PFN)
-+              z[ZONE_DMA] = MAX_DMA_PFN - start_pfn;
-+      if (start_pfn < MAX_DMA32_PFN) {
-+              unsigned long dma32_pfn = MAX_DMA32_PFN;
-+              if (dma32_pfn > end_pfn)
-+                      dma32_pfn = end_pfn;
-+              z[ZONE_DMA32] = dma32_pfn - start_pfn;
-+      }
-+      z[ZONE_NORMAL] = end_pfn - start_pfn;
-+
-+      /* Remove lower zones from higher ones. */
-+      w = 0;
-+      for (i = 0; i < MAX_NR_ZONES; i++) {
-+              if (z[i])
-+                      z[i] -= w;
-+              w += z[i];
-+      }
-+
-+      /* Compute holes */
-+      w = start_pfn;
-+      for (i = 0; i < MAX_NR_ZONES; i++) {
-+              unsigned long s = w;
-+              w += z[i];
-+              h[i] = e820_hole_size(s, w);
-+      }
-+
-+      /* Add the space pace needed for mem_map to the holes too. */
-+      for (i = 0; i < MAX_NR_ZONES; i++)
-+              h[i] += (z[i] * sizeof(struct page)) / PAGE_SIZE;
-+
-+      /* The 16MB DMA zone has the kernel and other misc mappings.
-+         Account them too */
-+      if (h[ZONE_DMA]) {
-+              h[ZONE_DMA] += dma_reserve;
-+              if (h[ZONE_DMA] >= z[ZONE_DMA]) {
-+                      printk(KERN_WARNING
-+                              "Kernel too large and filling up ZONE_DMA?\n");
-+                      h[ZONE_DMA] = z[ZONE_DMA];
-+              }
-+      }
-+}
-+
-+#ifndef CONFIG_NUMA
-+void __init paging_init(void)
-+{
-+      unsigned long zones[MAX_NR_ZONES], holes[MAX_NR_ZONES];
-+
-+      memory_present(0, 0, end_pfn);
-+      sparse_init();
-+      size_zones(zones, holes, 0, end_pfn);
-+      free_area_init_node(0, NODE_DATA(0), zones,
-+                          __pa(PAGE_OFFSET) >> PAGE_SHIFT, holes);
-+
-+      init_mm.context.pinned = 1;
-+}
-+#endif
-+
-+/* Unmap a kernel mapping if it exists. This is useful to avoid prefetches
-+   from the CPU leading to inconsistent cache lines. address and size
-+   must be aligned to 2MB boundaries. 
-+   Does nothing when the mapping doesn't exist. */
-+void __init clear_kernel_mapping(unsigned long address, unsigned long size) 
-+{
-+      unsigned long end = address + size;
-+
-+      BUG_ON(address & ~LARGE_PAGE_MASK);
-+      BUG_ON(size & ~LARGE_PAGE_MASK); 
-+      
-+      for (; address < end; address += LARGE_PAGE_SIZE) { 
-+              pgd_t *pgd = pgd_offset_k(address);
-+              pud_t *pud;
-+              pmd_t *pmd;
-+              if (pgd_none(*pgd))
-+                      continue;
-+              pud = pud_offset(pgd, address);
-+              if (pud_none(*pud))
-+                      continue; 
-+              pmd = pmd_offset(pud, address);
-+              if (!pmd || pmd_none(*pmd))
-+                      continue; 
-+              if (0 == (__pmd_val(*pmd) & _PAGE_PSE)) {
-+                      /* Could handle this, but it should not happen currently. */
-+                      printk(KERN_ERR 
-+             "clear_kernel_mapping: mapping has been split. will leak memory\n"); 
-+                      pmd_ERROR(*pmd); 
-+              }
-+              set_pmd(pmd, __pmd(0));                 
-+      }
-+      __flush_tlb_all();
-+} 
-+
-+/*
-+ * Memory hotplug specific functions
-+ */
-+void online_page(struct page *page)
-+{
-+      ClearPageReserved(page);
-+      init_page_count(page);
-+      __free_page(page);
-+      totalram_pages++;
-+      num_physpages++;
-+}
-+
-+#ifdef CONFIG_MEMORY_HOTPLUG
-+/*
-+ * XXX: memory_add_physaddr_to_nid() is to find node id from physical address
-+ *    via probe interface of sysfs. If acpi notifies hot-add event, then it
-+ *    can tell node id by searching dsdt. But, probe interface doesn't have
-+ *    node id. So, return 0 as node id at this time.
-+ */
-+#ifdef CONFIG_NUMA
-+int memory_add_physaddr_to_nid(u64 start)
-+{
-+      return 0;
-+}
-+#endif
-+
-+/*
-+ * Memory is added always to NORMAL zone. This means you will never get
-+ * additional DMA/DMA32 memory.
-+ */
-+int arch_add_memory(int nid, u64 start, u64 size)
-+{
-+      struct pglist_data *pgdat = NODE_DATA(nid);
-+      struct zone *zone = pgdat->node_zones + MAX_NR_ZONES-2;
-+      unsigned long start_pfn = start >> PAGE_SHIFT;
-+      unsigned long nr_pages = size >> PAGE_SHIFT;
-+      int ret;
-+
-+      ret = __add_pages(zone, start_pfn, nr_pages);
-+      if (ret)
-+              goto error;
-+
-+      init_memory_mapping(start, (start + size -1));
-+
-+      return ret;
-+error:
-+      printk("%s: Problem encountered in __add_pages!\n", __func__);
-+      return ret;
-+}
-+EXPORT_SYMBOL_GPL(arch_add_memory);
-+
-+int remove_memory(u64 start, u64 size)
-+{
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(remove_memory);
-+
-+#else /* CONFIG_MEMORY_HOTPLUG */
-+/*
-+ * Memory Hotadd without sparsemem. The mem_maps have been allocated in advance,
-+ * just online the pages.
-+ */
-+int __add_pages(struct zone *z, unsigned long start_pfn, unsigned long nr_pages)
-+{
-+      int err = -EIO;
-+      unsigned long pfn;
-+      unsigned long total = 0, mem = 0;
-+      for (pfn = start_pfn; pfn < start_pfn + nr_pages; pfn++) {
-+              if (pfn_valid(pfn)) {
-+                      online_page(pfn_to_page(pfn));
-+                      err = 0;
-+                      mem++;
-+              }
-+              total++;
-+      }
-+      if (!err) {
-+              z->spanned_pages += total;
-+              z->present_pages += mem;
-+              z->zone_pgdat->node_spanned_pages += total;
-+              z->zone_pgdat->node_present_pages += mem;
-+      }
-+      return err;
-+}
-+#endif /* CONFIG_MEMORY_HOTPLUG */
-+
-+static struct kcore_list kcore_mem, kcore_vmalloc, kcore_kernel, kcore_modules,
-+                       kcore_vsyscall;
-+
-+void __init mem_init(void)
-+{
-+      long codesize, reservedpages, datasize, initsize;
-+      unsigned long pfn;
-+
-+      pci_iommu_alloc();
-+
-+      /* How many end-of-memory variables you have, grandma! */
-+      max_low_pfn = end_pfn;
-+      max_pfn = end_pfn;
-+      num_physpages = end_pfn;
-+      high_memory = (void *) __va(end_pfn * PAGE_SIZE);
-+
-+      /* clear the zero-page */
-+      memset(empty_zero_page, 0, PAGE_SIZE);
-+
-+      reservedpages = 0;
-+
-+      /* this will put all low memory onto the freelists */
-+#ifdef CONFIG_NUMA
-+      totalram_pages = numa_free_all_bootmem();
-+#else
-+      totalram_pages = free_all_bootmem();
-+#endif
-+      /* XEN: init and count pages outside initial allocation. */
-+      for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
-+              ClearPageReserved(pfn_to_page(pfn));
-+              init_page_count(pfn_to_page(pfn));
-+              totalram_pages++;
-+      }
-+      reservedpages = end_pfn - totalram_pages - e820_hole_size(0, end_pfn);
-+
-+      after_bootmem = 1;
-+
-+      codesize =  (unsigned long) &_etext - (unsigned long) &_text;
-+      datasize =  (unsigned long) &_edata - (unsigned long) &_etext;
-+      initsize =  (unsigned long) &__init_end - (unsigned long) &__init_begin;
-+
-+      /* Register memory areas for /proc/kcore */
-+      kclist_add(&kcore_mem, __va(0), max_low_pfn << PAGE_SHIFT); 
-+      kclist_add(&kcore_vmalloc, (void *)VMALLOC_START, 
-+                 VMALLOC_END-VMALLOC_START);
-+      kclist_add(&kcore_kernel, &_stext, _end - _stext);
-+      kclist_add(&kcore_modules, (void *)MODULES_VADDR, MODULES_LEN);
-+      kclist_add(&kcore_vsyscall, (void *)VSYSCALL_START, 
-+                               VSYSCALL_END - VSYSCALL_START);
-+
-+      printk("Memory: %luk/%luk available (%ldk kernel code, %ldk reserved, %ldk data, %ldk init)\n",
-+              (unsigned long) nr_free_pages() << (PAGE_SHIFT-10),
-+              end_pfn << (PAGE_SHIFT-10),
-+              codesize >> 10,
-+              reservedpages << (PAGE_SHIFT-10),
-+              datasize >> 10,
-+              initsize >> 10);
-+
-+#ifndef CONFIG_XEN
-+#ifdef CONFIG_SMP
-+      /*
-+       * Sync boot_level4_pgt mappings with the init_level4_pgt
-+       * except for the low identity mappings which are already zapped
-+       * in init_level4_pgt. This sync-up is essential for AP's bringup
-+       */
-+      memcpy(boot_level4_pgt+1, init_level4_pgt+1, (PTRS_PER_PGD-1)*sizeof(pgd_t));
-+#endif
-+#endif
-+}
-+
-+void free_init_pages(char *what, unsigned long begin, unsigned long end)
-+{
-+      unsigned long addr;
-+
-+      if (begin >= end)
-+              return;
-+
-+      printk(KERN_INFO "Freeing %s: %ldk freed\n", what, (end - begin) >> 10);
-+      for (addr = begin; addr < end; addr += PAGE_SIZE) {
-+              ClearPageReserved(virt_to_page(addr));
-+              init_page_count(virt_to_page(addr));
-+              memset((void *)(addr & ~(PAGE_SIZE-1)),
-+                     POISON_FREE_INITMEM, PAGE_SIZE); 
-+              if (addr >= __START_KERNEL_map) {
-+                      /* make_readonly() reports all kernel addresses. */
-+                      __make_page_writable(__va(__pa(addr)));
-+                      if (HYPERVISOR_update_va_mapping(addr, __pte(0), 0)) {
-+                              pgd_t *pgd = pgd_offset_k(addr);
-+                              pud_t *pud = pud_offset(pgd, addr);
-+                              pmd_t *pmd = pmd_offset(pud, addr);
-+                              pte_t *pte = pte_offset_kernel(pmd, addr);
-+
-+                              xen_l1_entry_update(pte, __pte(0)); /* fallback */
-+                      }
-+              }
-+              free_page(addr);
-+              totalram_pages++;
-+      }
-+}
-+
-+void free_initmem(void)
-+{
-+      memset(__initdata_begin, POISON_FREE_INITDATA,
-+              __initdata_end - __initdata_begin);
-+      free_init_pages("unused kernel memory",
-+                      (unsigned long)(&__init_begin),
-+                      (unsigned long)(&__init_end));
-+}
-+
-+#ifdef CONFIG_DEBUG_RODATA
-+
-+void mark_rodata_ro(void)
-+{
-+      unsigned long addr = (unsigned long)__start_rodata;
-+
-+      for (; addr < (unsigned long)__end_rodata; addr += PAGE_SIZE)
-+              change_page_attr_addr(addr, 1, PAGE_KERNEL_RO);
-+
-+      printk ("Write protecting the kernel read-only data: %luk\n",
-+                      (__end_rodata - __start_rodata) >> 10);
-+
-+      /*
-+       * change_page_attr_addr() requires a global_flush_tlb() call after it.
-+       * We do this after the printk so that if something went wrong in the
-+       * change, the printk gets out at least to give a better debug hint
-+       * of who is the culprit.
-+       */
-+      global_flush_tlb();
-+}
-+#endif
-+
-+#ifdef CONFIG_BLK_DEV_INITRD
-+void free_initrd_mem(unsigned long start, unsigned long end)
-+{
-+      free_init_pages("initrd memory", start, end);
-+}
-+#endif
-+
-+void __init reserve_bootmem_generic(unsigned long phys, unsigned len) 
-+{ 
-+      /* Should check here against the e820 map to avoid double free */ 
-+#ifdef CONFIG_NUMA
-+      int nid = phys_to_nid(phys);
-+      reserve_bootmem_node(NODE_DATA(nid), phys, len);
-+#else                 
-+      reserve_bootmem(phys, len);    
-+#endif
-+      if (phys+len <= MAX_DMA_PFN*PAGE_SIZE)
-+              dma_reserve += len / PAGE_SIZE;
-+}
-+
-+int kern_addr_valid(unsigned long addr) 
-+{ 
-+      unsigned long above = ((long)addr) >> __VIRTUAL_MASK_SHIFT;
-+       pgd_t *pgd;
-+       pud_t *pud;
-+       pmd_t *pmd;
-+       pte_t *pte;
-+
-+      if (above != 0 && above != -1UL)
-+              return 0; 
-+      
-+      pgd = pgd_offset_k(addr);
-+      if (pgd_none(*pgd))
-+              return 0;
-+
-+      pud = pud_offset(pgd, addr);
-+      if (pud_none(*pud))
-+              return 0; 
-+
-+      pmd = pmd_offset(pud, addr);
-+      if (pmd_none(*pmd))
-+              return 0;
-+      if (pmd_large(*pmd))
-+              return pfn_valid(pmd_pfn(*pmd));
-+
-+      pte = pte_offset_kernel(pmd, addr);
-+      if (pte_none(*pte))
-+              return 0;
-+      return pfn_valid(pte_pfn(*pte));
-+}
-+
-+#ifdef CONFIG_SYSCTL
-+#include <linux/sysctl.h>
-+
-+extern int exception_trace, page_fault_trace;
-+
-+static ctl_table debug_table2[] = {
-+      { 99, "exception-trace", &exception_trace, sizeof(int), 0644, NULL,
-+        proc_dointvec },
-+      { 0, }
-+}; 
-+
-+static ctl_table debug_root_table2[] = { 
-+      { .ctl_name = CTL_DEBUG, .procname = "debug", .mode = 0555, 
-+         .child = debug_table2 }, 
-+      { 0 }, 
-+}; 
-+
-+static __init int x8664_sysctl_init(void)
-+{ 
-+      register_sysctl_table(debug_root_table2, 1);
-+      return 0;
-+}
-+__initcall(x8664_sysctl_init);
-+#endif
-+
-+/* A pseudo VMAs to allow ptrace access for the vsyscall page.   This only
-+   covers the 64bit vsyscall page now. 32bit has a real VMA now and does
-+   not need special handling anymore. */
-+
-+static struct vm_area_struct gate_vma = {
-+      .vm_start = VSYSCALL_START,
-+      .vm_end = VSYSCALL_END,
-+      .vm_page_prot = PAGE_READONLY
-+};
-+
-+struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
-+{
-+#ifdef CONFIG_IA32_EMULATION
-+      if (test_tsk_thread_flag(tsk, TIF_IA32))
-+              return NULL;
-+#endif
-+      return &gate_vma;
-+}
-+
-+int in_gate_area(struct task_struct *task, unsigned long addr)
-+{
-+      struct vm_area_struct *vma = get_gate_vma(task);
-+      if (!vma)
-+              return 0;
-+      return (addr >= vma->vm_start) && (addr < vma->vm_end);
-+}
-+
-+/* Use this when you have no reliable task/vma, typically from interrupt
-+ * context.  It is less reliable than using the task's vma and may give
-+ * false positives.
-+ */
-+int in_gate_area_no_task(unsigned long addr)
-+{
-+      return (addr >= VSYSCALL_START) && (addr < VSYSCALL_END);
-+}
-Index: head-2008-11-25/arch/x86/mm/pageattr_64-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/arch/x86/mm/pageattr_64-xen.c      2008-07-21 11:00:32.000000000 +0200
-@@ -0,0 +1,502 @@
-+/* 
-+ * Copyright 2002 Andi Kleen, SuSE Labs. 
-+ * Thanks to Ben LaHaise for precious feedback.
-+ */ 
-+
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/highmem.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <asm/uaccess.h>
-+#include <asm/processor.h>
-+#include <asm/tlbflush.h>
-+#include <asm/io.h>
-+
-+#ifdef CONFIG_XEN
-+#include <asm/pgalloc.h>
-+#include <asm/mmu_context.h>
-+
-+LIST_HEAD(mm_unpinned);
-+DEFINE_SPINLOCK(mm_unpinned_lock);
-+
-+static void _pin_lock(struct mm_struct *mm, int lock) {
-+      if (lock)
-+              spin_lock(&mm->page_table_lock);
-+#if NR_CPUS >= CONFIG_SPLIT_PTLOCK_CPUS
-+      /* While mm->page_table_lock protects us against insertions and
-+       * removals of higher level page table pages, it doesn't protect
-+       * against updates of pte-s. Such updates, however, require the
-+       * pte pages to be in consistent state (unpinned+writable or
-+       * pinned+readonly). The pinning and attribute changes, however
-+       * cannot be done atomically, which is why such updates must be
-+       * prevented from happening concurrently.
-+       * Note that no pte lock can ever elsewhere be acquired nesting
-+       * with an already acquired one in the same mm, or with the mm's
-+       * page_table_lock already acquired, as that would break in the
-+       * non-split case (where all these are actually resolving to the
-+       * one page_table_lock). Thus acquiring all of them here is not
-+       * going to result in dead locks, and the order of acquires
-+       * doesn't matter.
-+       */
-+      {
-+              pgd_t *pgd = mm->pgd;
-+              unsigned g;
-+
-+              for (g = 0; g <= ((TASK_SIZE64-1) / PGDIR_SIZE); g++, pgd++) {
-+                      pud_t *pud;
-+                      unsigned u;
-+
-+                      if (pgd_none(*pgd))
-+                              continue;
-+                      pud = pud_offset(pgd, 0);
-+                      for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-+                              pmd_t *pmd;
-+                              unsigned m;
-+
-+                              if (pud_none(*pud))
-+                                      continue;
-+                              pmd = pmd_offset(pud, 0);
-+                              for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-+                                      spinlock_t *ptl;
-+
-+                                      if (pmd_none(*pmd))
-+                                              continue;
-+                                      ptl = pte_lockptr(0, pmd);
-+                                      if (lock)
-+                                              spin_lock(ptl);
-+                                      else
-+                                              spin_unlock(ptl);
-+                              }
-+                      }
-+              }
-+      }
-+#endif
-+      if (!lock)
-+              spin_unlock(&mm->page_table_lock);
-+}
-+#define pin_lock(mm) _pin_lock(mm, 1)
-+#define pin_unlock(mm) _pin_lock(mm, 0)
-+
-+#define PIN_BATCH 8
-+static DEFINE_PER_CPU(multicall_entry_t[PIN_BATCH], pb_mcl);
-+
-+static inline unsigned int mm_walk_set_prot(void *pt, pgprot_t flags,
-+                                            unsigned int cpu, unsigned int seq)
-+{
-+      struct page *page = virt_to_page(pt);
-+      unsigned long pfn = page_to_pfn(page);
-+
-+      MULTI_update_va_mapping(per_cpu(pb_mcl, cpu) + seq,
-+              (unsigned long)__va(pfn << PAGE_SHIFT),
-+              pfn_pte(pfn, flags), 0);
-+      if (unlikely(++seq == PIN_BATCH)) {
-+              if (unlikely(HYPERVISOR_multicall_check(per_cpu(pb_mcl, cpu),
-+                                                      PIN_BATCH, NULL)))
-+                      BUG();
-+              seq = 0;
-+      }
-+
-+      return seq;
-+}
-+
-+static void mm_walk(struct mm_struct *mm, pgprot_t flags)
-+{
-+      pgd_t       *pgd;
-+      pud_t       *pud;
-+      pmd_t       *pmd;
-+      pte_t       *pte;
-+      int          g,u,m;
-+      unsigned int cpu, seq;
-+      multicall_entry_t *mcl;
-+
-+      pgd = mm->pgd;
-+      cpu = get_cpu();
-+
-+      /*
-+       * Cannot iterate up to USER_PTRS_PER_PGD as these pagetables may not
-+       * be the 'current' task's pagetables (e.g., current may be 32-bit,
-+       * but the pagetables may be for a 64-bit task).
-+       * Subtracting 1 from TASK_SIZE64 means the loop limit is correct
-+       * regardless of whether TASK_SIZE64 is a multiple of PGDIR_SIZE.
-+       */
-+      for (g = 0, seq = 0; g <= ((TASK_SIZE64-1) / PGDIR_SIZE); g++, pgd++) {
-+              if (pgd_none(*pgd))
-+                      continue;
-+              pud = pud_offset(pgd, 0);
-+              if (PTRS_PER_PUD > 1) /* not folded */ 
-+                      seq = mm_walk_set_prot(pud,flags,cpu,seq);
-+              for (u = 0; u < PTRS_PER_PUD; u++, pud++) {
-+                      if (pud_none(*pud))
-+                              continue;
-+                      pmd = pmd_offset(pud, 0);
-+                      if (PTRS_PER_PMD > 1) /* not folded */ 
-+                              seq = mm_walk_set_prot(pmd,flags,cpu,seq);
-+                      for (m = 0; m < PTRS_PER_PMD; m++, pmd++) {
-+                              if (pmd_none(*pmd))
-+                                      continue;
-+                              pte = pte_offset_kernel(pmd,0);
-+                              seq = mm_walk_set_prot(pte,flags,cpu,seq);
-+                      }
-+              }
-+      }
-+
-+      mcl = per_cpu(pb_mcl, cpu);
-+      if (unlikely(seq > PIN_BATCH - 2)) {
-+              if (unlikely(HYPERVISOR_multicall_check(mcl, seq, NULL)))
-+                      BUG();
-+              seq = 0;
-+      }
-+      MULTI_update_va_mapping(mcl + seq,
-+             (unsigned long)__user_pgd(mm->pgd),
-+             pfn_pte(virt_to_phys(__user_pgd(mm->pgd))>>PAGE_SHIFT, flags),
-+             0);
-+      MULTI_update_va_mapping(mcl + seq + 1,
-+             (unsigned long)mm->pgd,
-+             pfn_pte(virt_to_phys(mm->pgd)>>PAGE_SHIFT, flags),
-+             UVMF_TLB_FLUSH);
-+      if (unlikely(HYPERVISOR_multicall_check(mcl, seq + 2, NULL)))
-+              BUG();
-+
-+      put_cpu();
-+}
-+
-+void mm_pin(struct mm_struct *mm)
-+{
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+
-+      pin_lock(mm);
-+
-+      mm_walk(mm, PAGE_KERNEL_RO);
-+      xen_pgd_pin(__pa(mm->pgd)); /* kernel */
-+      xen_pgd_pin(__pa(__user_pgd(mm->pgd))); /* user */
-+      mm->context.pinned = 1;
-+      spin_lock(&mm_unpinned_lock);
-+      list_del(&mm->context.unpinned);
-+      spin_unlock(&mm_unpinned_lock);
-+
-+      pin_unlock(mm);
-+}
-+
-+void mm_unpin(struct mm_struct *mm)
-+{
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+
-+      pin_lock(mm);
-+
-+      xen_pgd_unpin(__pa(mm->pgd));
-+      xen_pgd_unpin(__pa(__user_pgd(mm->pgd)));
-+      mm_walk(mm, PAGE_KERNEL);
-+      mm->context.pinned = 0;
-+      spin_lock(&mm_unpinned_lock);
-+      list_add(&mm->context.unpinned, &mm_unpinned);
-+      spin_unlock(&mm_unpinned_lock);
-+
-+      pin_unlock(mm);
-+}
-+
-+void mm_pin_all(void)
-+{
-+      if (xen_feature(XENFEAT_writable_page_tables))
-+              return;
-+
-+      /*
-+       * Allow uninterrupted access to the mm_unpinned list. We don't
-+       * actually take the mm_unpinned_lock as it is taken inside mm_pin().
-+       * All other CPUs must be at a safe point (e.g., in stop_machine
-+       * or offlined entirely).
-+       */
-+      preempt_disable();
-+      while (!list_empty(&mm_unpinned))       
-+              mm_pin(list_entry(mm_unpinned.next, struct mm_struct,
-+                                context.unpinned));
-+      preempt_enable();
-+}
-+
-+void _arch_dup_mmap(struct mm_struct *mm)
-+{
-+      if (!mm->context.pinned)
-+              mm_pin(mm);
-+}
-+
-+void _arch_exit_mmap(struct mm_struct *mm)
-+{
-+      struct task_struct *tsk = current;
-+
-+      task_lock(tsk);
-+
-+      /*
-+       * We aggressively remove defunct pgd from cr3. We execute unmap_vmas()
-+       * *much* faster this way, as no tlb flushes means bigger wrpt batches.
-+       */
-+      if (tsk->active_mm == mm) {
-+              tsk->active_mm = &init_mm;
-+              atomic_inc(&init_mm.mm_count);
-+
-+              switch_mm(mm, &init_mm, tsk);
-+
-+              atomic_dec(&mm->mm_count);
-+              BUG_ON(atomic_read(&mm->mm_count) == 0);
-+      }
-+
-+      task_unlock(tsk);
-+
-+      if ( mm->context.pinned && (atomic_read(&mm->mm_count) == 1) &&
-+           !mm->context.has_foreign_mappings )
-+              mm_unpin(mm);
-+}
-+
-+struct page *pte_alloc_one(struct mm_struct *mm, unsigned long address)
-+{
-+      struct page *pte;
-+
-+      pte = alloc_pages(GFP_KERNEL|__GFP_REPEAT|__GFP_ZERO, 0);
-+      if (pte) {
-+              SetPageForeign(pte, pte_free);
-+              init_page_count(pte);
-+      }
-+      return pte;
-+}
-+
-+void pte_free(struct page *pte)
-+{
-+      unsigned long va = (unsigned long)__va(page_to_pfn(pte)<<PAGE_SHIFT);
-+
-+      if (!pte_write(*virt_to_ptep(va)))
-+              if (HYPERVISOR_update_va_mapping(
-+                      va, pfn_pte(page_to_pfn(pte), PAGE_KERNEL), 0))
-+                      BUG();
-+
-+      ClearPageForeign(pte);
-+      init_page_count(pte);
-+
-+      __free_page(pte);
-+}
-+#endif        /* CONFIG_XEN */
-+
-+pte_t *lookup_address(unsigned long address) 
-+{ 
-+      pgd_t *pgd = pgd_offset_k(address);
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t *pte;
-+      if (pgd_none(*pgd))
-+              return NULL;
-+      pud = pud_offset(pgd, address);
-+      if (!pud_present(*pud))
-+              return NULL; 
-+      pmd = pmd_offset(pud, address);
-+      if (!pmd_present(*pmd))
-+              return NULL; 
-+      if (pmd_large(*pmd))
-+              return (pte_t *)pmd;
-+      pte = pte_offset_kernel(pmd, address);
-+      if (pte && !pte_present(*pte))
-+              pte = NULL; 
-+      return pte;
-+} 
-+
-+static struct page *split_large_page(unsigned long address, pgprot_t prot,
-+                                   pgprot_t ref_prot)
-+{ 
-+      int i; 
-+      unsigned long addr;
-+      struct page *base = alloc_pages(GFP_KERNEL, 0);
-+      pte_t *pbase;
-+      if (!base) 
-+              return NULL;
-+      /*
-+       * page_private is used to track the number of entries in
-+       * the page table page have non standard attributes.
-+       */
-+      SetPagePrivate(base);
-+      page_private(base) = 0;
-+
-+      address = __pa(address);
-+      addr = address & LARGE_PAGE_MASK; 
-+      pbase = (pte_t *)page_address(base);
-+      for (i = 0; i < PTRS_PER_PTE; i++, addr += PAGE_SIZE) {
-+              pbase[i] = pfn_pte(addr >> PAGE_SHIFT, 
-+                                 addr == address ? prot : ref_prot);
-+      }
-+      return base;
-+} 
-+
-+
-+static void flush_kernel_map(void *address) 
-+{
-+      if (0 && address && cpu_has_clflush) {
-+              /* is this worth it? */ 
-+              int i;
-+              for (i = 0; i < PAGE_SIZE; i += boot_cpu_data.x86_clflush_size) 
-+                      asm volatile("clflush (%0)" :: "r" (address + i)); 
-+      } else
-+              asm volatile("wbinvd":::"memory"); 
-+      if (address)
-+              __flush_tlb_one(address);
-+      else
-+              __flush_tlb_all();
-+}
-+
-+
-+static inline void flush_map(unsigned long address)
-+{     
-+      on_each_cpu(flush_kernel_map, (void *)address, 1, 1);
-+}
-+
-+static struct page *deferred_pages; /* protected by init_mm.mmap_sem */
-+
-+static inline void save_page(struct page *fpage)
-+{
-+      fpage->lru.next = (struct list_head *)deferred_pages;
-+      deferred_pages = fpage;
-+}
-+
-+/* 
-+ * No more special protections in this 2/4MB area - revert to a
-+ * large page again. 
-+ */
-+static void revert_page(unsigned long address, pgprot_t ref_prot)
-+{
-+      pgd_t *pgd;
-+      pud_t *pud;
-+      pmd_t *pmd;
-+      pte_t large_pte;
-+
-+      pgd = pgd_offset_k(address);
-+      BUG_ON(pgd_none(*pgd));
-+      pud = pud_offset(pgd,address);
-+      BUG_ON(pud_none(*pud));
-+      pmd = pmd_offset(pud, address);
-+      BUG_ON(__pmd_val(*pmd) & _PAGE_PSE);
-+      pgprot_val(ref_prot) |= _PAGE_PSE;
-+      large_pte = mk_pte_phys(__pa(address) & LARGE_PAGE_MASK, ref_prot);
-+      set_pte((pte_t *)pmd, large_pte);
-+}      
-+
-+static int
-+__change_page_attr(unsigned long address, unsigned long pfn, pgprot_t prot,
-+                                 pgprot_t ref_prot)
-+{ 
-+      pte_t *kpte; 
-+      struct page *kpte_page;
-+      unsigned kpte_flags;
-+      pgprot_t ref_prot2;
-+      kpte = lookup_address(address);
-+      if (!kpte) return 0;
-+      kpte_page = virt_to_page(((unsigned long)kpte) & PAGE_MASK);
-+      kpte_flags = pte_val(*kpte); 
-+      if (pgprot_val(prot) != pgprot_val(ref_prot)) { 
-+              if ((kpte_flags & _PAGE_PSE) == 0) { 
-+                      set_pte(kpte, pfn_pte(pfn, prot));
-+              } else {
-+                      /*
-+                       * split_large_page will take the reference for this
-+                       * change_page_attr on the split page.
-+                       */
-+
-+                      struct page *split;
-+                      ref_prot2 = __pgprot(pgprot_val(pte_pgprot(*lookup_address(address))) & ~(1<<_PAGE_BIT_PSE));
-+
-+                      split = split_large_page(address, prot, ref_prot2);
-+                      if (!split)
-+                              return -ENOMEM;
-+                      set_pte(kpte,mk_pte(split, ref_prot2));
-+                      kpte_page = split;
-+              }       
-+              page_private(kpte_page)++;
-+      } else if ((kpte_flags & _PAGE_PSE) == 0) { 
-+              set_pte(kpte, pfn_pte(pfn, ref_prot));
-+              BUG_ON(page_private(kpte_page) == 0);
-+              page_private(kpte_page)--;
-+      } else
-+              BUG();
-+
-+      /* on x86-64 the direct mapping set at boot is not using 4k pages */
-+      /*
-+       * ..., but the XEN guest kernels (currently) do:
-+       * If the pte was reserved, it means it was created at boot
-+       * time (not via split_large_page) and in turn we must not
-+       * replace it with a large page.
-+       */
-+#ifndef CONFIG_XEN
-+      BUG_ON(PageReserved(kpte_page));
-+#else
-+      if (PageReserved(kpte_page))
-+              return 0;
-+#endif
-+
-+      if (page_private(kpte_page) == 0) {
-+              save_page(kpte_page);
-+              revert_page(address, ref_prot);
-+      }
-+      return 0;
-+} 
-+
-+/*
-+ * Change the page attributes of an page in the linear mapping.
-+ *
-+ * This should be used when a page is mapped with a different caching policy
-+ * than write-back somewhere - some CPUs do not like it when mappings with
-+ * different caching policies exist. This changes the page attributes of the
-+ * in kernel linear mapping too.
-+ * 
-+ * The caller needs to ensure that there are no conflicting mappings elsewhere.
-+ * This function only deals with the kernel linear map.
-+ * 
-+ * Caller must call global_flush_tlb() after this.
-+ */
-+int change_page_attr_addr(unsigned long address, int numpages, pgprot_t prot)
-+{
-+      int err = 0; 
-+      int i; 
-+
-+      down_write(&init_mm.mmap_sem);
-+      for (i = 0; i < numpages; i++, address += PAGE_SIZE) {
-+              unsigned long pfn = __pa(address) >> PAGE_SHIFT;
-+
-+              err = __change_page_attr(address, pfn, prot, PAGE_KERNEL);
-+              if (err) 
-+                      break; 
-+              /* Handle kernel mapping too which aliases part of the
-+               * lowmem */
-+              if (__pa(address) < KERNEL_TEXT_SIZE) {
-+                      unsigned long addr2;
-+                      pgprot_t prot2 = prot;
-+                      addr2 = __START_KERNEL_map + __pa(address);
-+                      pgprot_val(prot2) &= ~_PAGE_NX;
-+                      err = __change_page_attr(addr2, pfn, prot2, PAGE_KERNEL_EXEC);
-+              } 
-+      }       
-+      up_write(&init_mm.mmap_sem); 
-+      return err;
-+}
-+
-+/* Don't call this for MMIO areas that may not have a mem_map entry */
-+int change_page_attr(struct page *page, int numpages, pgprot_t prot)
-+{
-+      unsigned long addr = (unsigned long)page_address(page);
-+      return change_page_attr_addr(addr, numpages, prot);
-+}
-+
-+void global_flush_tlb(void)
-+{ 
-+      struct page *dpage;
-+
-+      down_read(&init_mm.mmap_sem);
-+      dpage = xchg(&deferred_pages, NULL);
-+      up_read(&init_mm.mmap_sem);
-+
-+      flush_map((dpage && !dpage->lru.next) ? (unsigned long)page_address(dpage) : 0);
-+      while (dpage) {
-+              struct page *tmp = dpage;
-+              dpage = (struct page *)dpage->lru.next;
-+              ClearPagePrivate(tmp);
-+              __free_page(tmp);
-+      } 
-+} 
-+
-+EXPORT_SYMBOL(change_page_attr);
-+EXPORT_SYMBOL(global_flush_tlb);
-Index: head-2008-11-25/drivers/pci/msi-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/pci/msi-xen.c      2008-10-13 13:43:45.000000000 +0200
-@@ -0,0 +1,809 @@
-+/*
-+ * File:      msi.c
-+ * Purpose:   PCI Message Signaled Interrupt (MSI)
-+ *
-+ * Copyright (C) 2003-2004 Intel
-+ * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/irq.h>
-+#include <linux/interrupt.h>
-+#include <linux/init.h>
-+#include <linux/ioport.h>
-+#include <linux/smp_lock.h>
-+#include <linux/pci.h>
-+#include <linux/proc_fs.h>
-+
-+#include <xen/evtchn.h>
-+
-+#include <asm/errno.h>
-+#include <asm/io.h>
-+#include <asm/smp.h>
-+
-+#include "pci.h"
-+#include "msi.h"
-+
-+static int pci_msi_enable = 1;
-+
-+static struct msi_ops *msi_ops;
-+
-+int msi_register(struct msi_ops *ops)
-+{
-+      msi_ops = ops;
-+      return 0;
-+}
-+
-+static LIST_HEAD(msi_dev_head);
-+DEFINE_SPINLOCK(msi_dev_lock);
-+
-+struct msi_dev_list {
-+      struct pci_dev *dev;
-+      struct list_head list;
-+      spinlock_t pirq_list_lock;
-+      struct list_head pirq_list_head;
-+};
-+
-+struct msi_pirq_entry {
-+      struct list_head list;
-+      int pirq;
-+      int entry_nr;
-+};
-+
-+static struct msi_dev_list *get_msi_dev_pirq_list(struct pci_dev *dev)
-+{
-+      struct msi_dev_list *msi_dev_list, *ret = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&msi_dev_lock, flags);
-+
-+      list_for_each_entry(msi_dev_list, &msi_dev_head, list)
-+              if ( msi_dev_list->dev == dev )
-+                      ret = msi_dev_list;
-+
-+      if ( ret ) {
-+              spin_unlock_irqrestore(&msi_dev_lock, flags);
-+              return ret;
-+      }
-+
-+      /* Has not allocate msi_dev until now. */
-+      ret = kzalloc(sizeof(struct msi_dev_list), GFP_ATOMIC);
-+
-+      /* Failed to allocate msi_dev structure */
-+      if ( !ret ) {
-+              spin_unlock_irqrestore(&msi_dev_lock, flags);
-+              return NULL;
-+      }
-+
-+      ret->dev = dev;
-+      spin_lock_init(&ret->pirq_list_lock);
-+      INIT_LIST_HEAD(&ret->pirq_list_head);
-+      list_add_tail(&ret->list, &msi_dev_head);
-+      spin_unlock_irqrestore(&msi_dev_lock, flags);
-+      return ret;
-+}
-+
-+static int attach_pirq_entry(int pirq, int entry_nr,
-+                             struct msi_dev_list *msi_dev_entry)
-+{
-+      struct msi_pirq_entry *entry = kmalloc(sizeof(*entry), GFP_ATOMIC);
-+      unsigned long flags;
-+
-+      if (!entry)
-+              return -ENOMEM;
-+      entry->pirq = pirq;
-+      entry->entry_nr = entry_nr;
-+      spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-+      list_add_tail(&entry->list, &msi_dev_entry->pirq_list_head);
-+      spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-+      return 0;
-+}
-+
-+static void detach_pirq_entry(int entry_nr,
-+                                                      struct msi_dev_list *msi_dev_entry)
-+{
-+      unsigned long flags;
-+      struct msi_pirq_entry *pirq_entry;
-+
-+      list_for_each_entry(pirq_entry, &msi_dev_entry->pirq_list_head, list) {
-+              if (pirq_entry->entry_nr == entry_nr) {
-+                      spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-+                      list_del(&pirq_entry->list);
-+                      spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-+                      kfree(pirq_entry);
-+                      return;
-+              }
-+      }
-+}
-+
-+/*
-+ * pciback will provide device's owner
-+ */
-+static int (*get_owner)(struct pci_dev *dev);
-+
-+int register_msi_get_owner(int (*func)(struct pci_dev *dev))
-+{
-+      if (get_owner) {
-+              printk(KERN_WARNING "register msi_get_owner again\n");
-+              return -EEXIST;
-+      }
-+      get_owner = func;
-+      return 0;
-+}
-+
-+int unregister_msi_get_owner(int (*func)(struct pci_dev *dev))
-+{
-+      if (get_owner != func)
-+              return -EINVAL;
-+      get_owner = NULL;
-+      return 0;
-+}
-+
-+static int msi_get_dev_owner(struct pci_dev *dev)
-+{
-+      int owner;
-+
-+      BUG_ON(!is_initial_xendomain());
-+      if (get_owner && (owner = get_owner(dev)) >= 0) {
-+              printk(KERN_INFO "get owner for dev %x get %x \n",
-+                     dev->devfn, owner);
-+              return owner;
-+      }
-+
-+      return DOMID_SELF;
-+}
-+
-+static int msi_unmap_pirq(struct pci_dev *dev, int pirq)
-+{
-+      struct physdev_unmap_pirq unmap;
-+      int rc;
-+
-+      unmap.domid = msi_get_dev_owner(dev);
-+      /* See comments in msi_map_pirq_to_vector, input parameter pirq
-+       * mean irq number only if the device belongs to dom0 itself.
-+       */
-+      unmap.pirq = (unmap.domid != DOMID_SELF)
-+              ? pirq : evtchn_get_xen_pirq(pirq);
-+
-+      if ((rc = HYPERVISOR_physdev_op(PHYSDEVOP_unmap_pirq, &unmap)))
-+              printk(KERN_WARNING "unmap irq %x failed\n", pirq);
-+
-+      if (rc < 0)
-+              return rc;
-+
-+      if (unmap.domid == DOMID_SELF)
-+              evtchn_map_pirq(pirq, 0);
-+
-+      return 0;
-+}
-+
-+static u64 find_table_base(struct pci_dev *dev, int pos)
-+{
-+      u8 bar;
-+      u32 reg;
-+      unsigned long flags;
-+
-+      pci_read_config_dword(dev, msix_table_offset_reg(pos), &reg);
-+      bar = reg & PCI_MSIX_FLAGS_BIRMASK;
-+
-+      flags = pci_resource_flags(dev, bar);
-+      if (flags & (IORESOURCE_DISABLED | IORESOURCE_UNSET | IORESOURCE_BUSY))
-+              return 0;
-+
-+      return pci_resource_start(dev, bar);
-+}
-+
-+/*
-+ * Protected by msi_lock
-+ */
-+static int msi_map_pirq_to_vector(struct pci_dev *dev, int pirq,
-+                                int entry_nr, u64 table_base)
-+{
-+      struct physdev_map_pirq map_irq;
-+      int rc;
-+      domid_t domid = DOMID_SELF;
-+
-+      domid = msi_get_dev_owner(dev);
-+
-+      map_irq.domid = domid;
-+      map_irq.type = MAP_PIRQ_TYPE_MSI;
-+      map_irq.index = -1;
-+      map_irq.pirq = pirq < 0 ? -1 : evtchn_get_xen_pirq(pirq);
-+      map_irq.bus = dev->bus->number;
-+      map_irq.devfn = dev->devfn;
-+      map_irq.entry_nr = entry_nr;
-+      map_irq.table_base = table_base;
-+
-+      if ((rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq)))
-+              printk(KERN_WARNING "map irq failed\n");
-+
-+      if (rc < 0)
-+              return rc;
-+      /* This happens when MSI support is not enabled in Xen. */
-+      if (rc == 0 && map_irq.pirq < 0)
-+              return -ENOSYS;
-+
-+      BUG_ON(map_irq.pirq <= 0);
-+
-+      /* If mapping of this particular MSI is on behalf of another domain,
-+       * we do not need to get an irq in dom0. This also implies:
-+       * dev->irq in dom0 will be 'Xen pirq' if this device belongs to
-+       * to another domain, and will be 'Linux irq' if it belongs to dom0.
-+       */
-+      return ((domid != DOMID_SELF) ?
-+              map_irq.pirq : evtchn_map_pirq(pirq, map_irq.pirq));
-+}
-+
-+static int msi_map_vector(struct pci_dev *dev, int entry_nr, u64 table_base)
-+{
-+      return msi_map_pirq_to_vector(dev, -1, entry_nr, table_base);
-+}
-+
-+static int msi_init(void)
-+{
-+      static int status = 0;
-+
-+      if (pci_msi_quirk) {
-+              pci_msi_enable = 0;
-+              printk(KERN_WARNING "PCI: MSI quirk detected. MSI disabled.\n");
-+              status = -EINVAL;
-+      }
-+
-+      return status;
-+}
-+
-+void pci_scan_msi_device(struct pci_dev *dev) { }
-+
-+void disable_msi_mode(struct pci_dev *dev, int pos, int type)
-+{
-+      u16 control;
-+
-+      pci_read_config_word(dev, msi_control_reg(pos), &control);
-+      if (type == PCI_CAP_ID_MSI) {
-+              /* Set enabled bits to single MSI & enable MSI_enable bit */
-+              msi_disable(control);
-+              pci_write_config_word(dev, msi_control_reg(pos), control);
-+              dev->msi_enabled = 0;
-+      } else {
-+              msix_disable(control);
-+              pci_write_config_word(dev, msi_control_reg(pos), control);
-+              dev->msix_enabled = 0;
-+      }
-+      if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
-+              /* PCI Express Endpoint device detected */
-+              pci_intx(dev, 1);  /* enable intx */
-+      }
-+}
-+
-+static void enable_msi_mode(struct pci_dev *dev, int pos, int type)
-+{
-+      u16 control;
-+
-+      pci_read_config_word(dev, msi_control_reg(pos), &control);
-+      if (type == PCI_CAP_ID_MSI) {
-+              /* Set enabled bits to single MSI & enable MSI_enable bit */
-+              msi_enable(control, 1);
-+              pci_write_config_word(dev, msi_control_reg(pos), control);
-+              dev->msi_enabled = 1;
-+      } else {
-+              msix_enable(control);
-+              pci_write_config_word(dev, msi_control_reg(pos), control);
-+              dev->msix_enabled = 1;
-+      }
-+      if (pci_find_capability(dev, PCI_CAP_ID_EXP)) {
-+              /* PCI Express Endpoint device detected */
-+              pci_intx(dev, 0);  /* disable intx */
-+      }
-+}
-+
-+#ifdef CONFIG_PM
-+int pci_save_msi_state(struct pci_dev *dev)
-+{
-+      int pos;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+      if (pos <= 0 || dev->no_msi)
-+              return 0;
-+
-+      if (!dev->msi_enabled)
-+              return 0;
-+
-+      /* Restore dev->irq to its default pin-assertion vector */
-+      msi_unmap_pirq(dev, dev->irq);
-+      /* Disable MSI mode */
-+      disable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+      /* Set the flags for use of restore */
-+      dev->msi_enabled = 1;
-+      return 0;
-+}
-+
-+void pci_restore_msi_state(struct pci_dev *dev)
-+{
-+      int pos, pirq;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+      if (pos <= 0)
-+              return;
-+
-+      if (!dev->msi_enabled)
-+              return;
-+
-+      pirq = msi_map_pirq_to_vector(dev, dev->irq, 0, 0);
-+      if (pirq < 0)
-+              return;
-+      enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+}
-+
-+int pci_save_msix_state(struct pci_dev *dev)
-+{
-+      int pos;
-+      unsigned long flags;
-+      struct msi_dev_list *msi_dev_entry;
-+      struct msi_pirq_entry *pirq_entry, *tmp;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+      if (pos <= 0 || dev->no_msi)
-+              return 0;
-+
-+      /* save the capability */
-+      if (!dev->msix_enabled)
-+              return 0;
-+
-+      msi_dev_entry = get_msi_dev_pirq_list(dev);
-+
-+      spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-+        list_for_each_entry_safe(pirq_entry, tmp,
-+                                 &msi_dev_entry->pirq_list_head, list)
-+              msi_unmap_pirq(dev, pirq_entry->pirq);
-+      spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-+
-+      disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+      /* Set the flags for use of restore */
-+      dev->msix_enabled = 1;
-+
-+      return 0;
-+}
-+
-+void pci_restore_msix_state(struct pci_dev *dev)
-+{
-+      int pos;
-+      unsigned long flags;
-+      u64 table_base;
-+      struct msi_dev_list *msi_dev_entry;
-+      struct msi_pirq_entry *pirq_entry, *tmp;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+      if (pos <= 0)
-+              return;
-+
-+      if (!dev->msix_enabled)
-+              return;
-+
-+      msi_dev_entry = get_msi_dev_pirq_list(dev);
-+      table_base = find_table_base(dev, pos);
-+      if (!table_base)
-+              return;
-+
-+      spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-+      list_for_each_entry_safe(pirq_entry, tmp,
-+                               &msi_dev_entry->pirq_list_head, list) {
-+              int rc = msi_map_pirq_to_vector(dev, pirq_entry->pirq,
-+                                              pirq_entry->entry_nr, table_base);
-+              if (rc < 0)
-+                      printk(KERN_WARNING
-+                             "%s: re-mapping irq #%d (pirq%d) failed: %d\n",
-+                             pci_name(dev), pirq_entry->entry_nr,
-+                             pirq_entry->pirq, rc);
-+      }
-+      spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-+
-+      enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+}
-+#endif
-+
-+/**
-+ * msi_capability_init - configure device's MSI capability structure
-+ * @dev: pointer to the pci_dev data structure of MSI device function
-+ *
-+ * Setup the MSI capability structure of device function with a single
-+ * MSI vector, regardless of device function is capable of handling
-+ * multiple messages. A return of zero indicates the successful setup
-+ * of an entry zero with the new MSI vector or non-zero for otherwise.
-+ **/
-+static int msi_capability_init(struct pci_dev *dev)
-+{
-+      int pos, pirq;
-+      u16 control;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+      pci_read_config_word(dev, msi_control_reg(pos), &control);
-+
-+      pirq = msi_map_vector(dev, 0, 0);
-+      if (pirq < 0)
-+              return -EBUSY;
-+
-+      dev->irq = pirq;
-+      /* Set MSI enabled bits  */
-+      enable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+      dev->msi_enabled = 1;
-+
-+      return 0;
-+}
-+
-+/**
-+ * msix_capability_init - configure device's MSI-X capability
-+ * @dev: pointer to the pci_dev data structure of MSI-X device function
-+ * @entries: pointer to an array of struct msix_entry entries
-+ * @nvec: number of @entries
-+ *
-+ * Setup the MSI-X capability structure of device function with a
-+ * single MSI-X vector. A return of zero indicates the successful setup of
-+ * requested MSI-X entries with allocated vectors or non-zero for otherwise.
-+ **/
-+static int msix_capability_init(struct pci_dev *dev,
-+                              struct msix_entry *entries, int nvec)
-+{
-+      u64 table_base;
-+      int pirq, i, j, mapped, pos;
-+      struct msi_dev_list *msi_dev_entry = get_msi_dev_pirq_list(dev);
-+      struct msi_pirq_entry *pirq_entry;
-+
-+      if (!msi_dev_entry)
-+              return -ENOMEM;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+      table_base = find_table_base(dev, pos);
-+      if (!table_base)
-+              return -ENODEV;
-+
-+      /* MSI-X Table Initialization */
-+      for (i = 0; i < nvec; i++) {
-+              mapped = 0;
-+              list_for_each_entry(pirq_entry, &msi_dev_entry->pirq_list_head, list) {
-+                      if (pirq_entry->entry_nr == entries[i].entry) {
-+                              printk(KERN_WARNING "msix entry %d for dev %02x:%02x:%01x are \
-+                                     not freed before acquire again.\n", entries[i].entry,
-+                                         dev->bus->number, PCI_SLOT(dev->devfn),
-+                                         PCI_FUNC(dev->devfn));
-+                              (entries + i)->vector = pirq_entry->pirq;
-+                              mapped = 1;
-+                              break;
-+                      }
-+              }
-+              if (mapped)
-+                      continue;
-+              pirq = msi_map_vector(dev, entries[i].entry, table_base);
-+              if (pirq < 0)
-+                      break;
-+              attach_pirq_entry(pirq, entries[i].entry, msi_dev_entry);
-+              (entries + i)->vector = pirq;
-+      }
-+
-+      if (i != nvec) {
-+              for (j = --i; j >= 0; j--) {
-+                      msi_unmap_pirq(dev, entries[j].vector);
-+                      detach_pirq_entry(entries[j].entry, msi_dev_entry);
-+                      entries[j].vector = 0;
-+              }
-+              return -EBUSY;
-+      }
-+
-+      enable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+      dev->msix_enabled = 1;
-+
-+      return 0;
-+}
-+
-+/**
-+ * pci_enable_msi - configure device's MSI capability structure
-+ * @dev: pointer to the pci_dev data structure of MSI device function
-+ *
-+ * Setup the MSI capability structure of device function with
-+ * a single MSI vector upon its software driver call to request for
-+ * MSI mode enabled on its hardware device function. A return of zero
-+ * indicates the successful setup of an entry zero with the new MSI
-+ * vector or non-zero for otherwise.
-+ **/
-+extern int pci_frontend_enable_msi(struct pci_dev *dev);
-+int pci_enable_msi(struct pci_dev* dev)
-+{
-+      struct pci_bus *bus;
-+      int pos, temp, status = -EINVAL;
-+
-+      if (!pci_msi_enable || !dev)
-+              return status;
-+
-+      if (dev->no_msi)
-+              return status;
-+
-+      for (bus = dev->bus; bus; bus = bus->parent)
-+              if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
-+                      return -EINVAL;
-+
-+      status = msi_init();
-+      if (status < 0)
-+              return status;
-+
-+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-+      if (!is_initial_xendomain())
-+      {
-+              int ret;
-+
-+              temp = dev->irq;
-+              ret = pci_frontend_enable_msi(dev);
-+              if (ret)
-+                      return ret;
-+
-+              dev->irq = evtchn_map_pirq(-1, dev->irq);
-+              dev->irq_old = temp;
-+
-+              return ret;
-+      }
-+#endif
-+
-+      temp = dev->irq;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+      if (!pos)
-+              return -EINVAL;
-+
-+      /* Check whether driver already requested for MSI-X vectors */
-+      if (dev->msix_enabled) {
-+              printk(KERN_INFO "PCI: %s: Can't enable MSI.  "
-+                         "Device already has MSI-X vectors assigned\n",
-+                         pci_name(dev));
-+              dev->irq = temp;
-+              return -EINVAL;
-+      }
-+
-+      status = msi_capability_init(dev);
-+      if ( !status )
-+              dev->irq_old = temp;
-+    else
-+              dev->irq = temp;
-+
-+      return status;
-+}
-+
-+extern void pci_frontend_disable_msi(struct pci_dev* dev);
-+void pci_disable_msi(struct pci_dev* dev)
-+{
-+      int pos;
-+      int pirq;
-+
-+      if (!pci_msi_enable)
-+              return;
-+      if (!dev)
-+              return;
-+
-+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-+      if (!is_initial_xendomain()) {
-+              evtchn_map_pirq(dev->irq, 0);
-+              pci_frontend_disable_msi(dev);
-+              dev->irq = dev->irq_old;
-+              return;
-+      }
-+#endif
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSI);
-+      if (!pos)
-+              return;
-+
-+      pirq = dev->irq;
-+      /* Restore dev->irq to its default pin-assertion vector */
-+      dev->irq = dev->irq_old;
-+      msi_unmap_pirq(dev, pirq);
-+
-+      /* Disable MSI mode */
-+      disable_msi_mode(dev, pos, PCI_CAP_ID_MSI);
-+}
-+
-+/**
-+ * pci_enable_msix - configure device's MSI-X capability structure
-+ * @dev: pointer to the pci_dev data structure of MSI-X device function
-+ * @entries: pointer to an array of MSI-X entries
-+ * @nvec: number of MSI-X vectors requested for allocation by device driver
-+ *
-+ * Setup the MSI-X capability structure of device function with the number
-+ * of requested vectors upon its software driver call to request for
-+ * MSI-X mode enabled on its hardware device function. A return of zero
-+ * indicates the successful configuration of MSI-X capability structure
-+ * with new allocated MSI-X vectors. A return of < 0 indicates a failure.
-+ * Or a return of > 0 indicates that driver request is exceeding the number
-+ * of vectors available. Driver should use the returned value to re-send
-+ * its request.
-+ **/
-+extern int pci_frontend_enable_msix(struct pci_dev *dev,
-+              struct msix_entry *entries, int nvec);
-+int pci_enable_msix(struct pci_dev* dev, struct msix_entry *entries, int nvec)
-+{
-+      struct pci_bus *bus;
-+      int status, pos, nr_entries;
-+      int i, j, temp;
-+      u16 control;
-+
-+      if (!pci_msi_enable || !dev || !entries)
-+              return -EINVAL;
-+
-+      if (dev->no_msi)
-+              return -EINVAL;
-+
-+      for (bus = dev->bus; bus; bus = bus->parent)
-+              if (bus->bus_flags & PCI_BUS_FLAGS_NO_MSI)
-+                      return -EINVAL;
-+
-+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-+      if (!is_initial_xendomain()) {
-+              struct msi_dev_list *msi_dev_entry;
-+              struct msi_pirq_entry *pirq_entry;
-+              int ret, irq;
-+
-+              ret = pci_frontend_enable_msix(dev, entries, nvec);
-+              if (ret) {
-+                      printk("get %x from pci_frontend_enable_msix\n", ret);
-+                      return ret;
-+              }
-+
-+              msi_dev_entry = get_msi_dev_pirq_list(dev);
-+              for (i = 0; i < nvec; i++) {
-+                      int mapped = 0;
-+
-+                      list_for_each_entry(pirq_entry, &msi_dev_entry->pirq_list_head, list) {
-+                              if (pirq_entry->entry_nr == entries[i].entry) {
-+                                      irq = pirq_entry->pirq;
-+                                      BUG_ON(entries[i].vector != evtchn_get_xen_pirq(irq));
-+                                      entries[i].vector = irq;
-+                                      mapped = 1;
-+                                      break;
-+                              }
-+                      }
-+                      if (mapped)
-+                              continue;
-+                      irq = evtchn_map_pirq(-1, entries[i].vector);
-+                      attach_pirq_entry(irq, entries[i].entry, msi_dev_entry);
-+                      entries[i].vector = irq;
-+              }
-+        return 0;
-+      }
-+#endif
-+
-+      status = msi_init();
-+      if (status < 0)
-+              return status;
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+      if (!pos)
-+              return -EINVAL;
-+
-+      pci_read_config_word(dev, msi_control_reg(pos), &control);
-+      nr_entries = multi_msix_capable(control);
-+      if (nvec > nr_entries)
-+              return -EINVAL;
-+
-+      /* Check for any invalid entries */
-+      for (i = 0; i < nvec; i++) {
-+              if (entries[i].entry >= nr_entries)
-+                      return -EINVAL;         /* invalid entry */
-+              for (j = i + 1; j < nvec; j++) {
-+                      if (entries[i].entry == entries[j].entry)
-+                              return -EINVAL; /* duplicate entry */
-+              }
-+      }
-+
-+      temp = dev->irq;
-+      /* Check whether driver already requested for MSI vector */
-+      if (dev->msi_enabled) {
-+              printk(KERN_INFO "PCI: %s: Can't enable MSI-X.  "
-+                     "Device already has an MSI vector assigned\n",
-+                     pci_name(dev));
-+              dev->irq = temp;
-+              return -EINVAL;
-+      }
-+
-+      status = msix_capability_init(dev, entries, nvec);
-+
-+      if ( !status )
-+              dev->irq_old = temp;
-+      else
-+              dev->irq = temp;
-+
-+      return status;
-+}
-+
-+extern void pci_frontend_disable_msix(struct pci_dev* dev);
-+void pci_disable_msix(struct pci_dev* dev)
-+{
-+      int pos;
-+      u16 control;
-+
-+
-+      if (!pci_msi_enable)
-+              return;
-+      if (!dev)
-+              return;
-+
-+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-+      if (!is_initial_xendomain()) {
-+              struct msi_dev_list *msi_dev_entry;
-+              struct msi_pirq_entry *pirq_entry, *tmp;
-+
-+              pci_frontend_disable_msix(dev);
-+
-+              msi_dev_entry = get_msi_dev_pirq_list(dev);
-+              list_for_each_entry_safe(pirq_entry, tmp,
-+                                       &msi_dev_entry->pirq_list_head, list) {
-+                      evtchn_map_pirq(pirq_entry->pirq, 0);
-+                      list_del(&pirq_entry->list);
-+                      kfree(pirq_entry);
-+              }
-+
-+              dev->irq = dev->irq_old;
-+              return;
-+      }
-+#endif
-+
-+      pos = pci_find_capability(dev, PCI_CAP_ID_MSIX);
-+      if (!pos)
-+              return;
-+
-+      pci_read_config_word(dev, msi_control_reg(pos), &control);
-+      if (!(control & PCI_MSIX_FLAGS_ENABLE))
-+              return;
-+
-+      msi_remove_pci_irq_vectors(dev);
-+
-+      /* Disable MSI mode */
-+      disable_msi_mode(dev, pos, PCI_CAP_ID_MSIX);
-+}
-+
-+/**
-+ * msi_remove_pci_irq_vectors - reclaim MSI(X) vectors to unused state
-+ * @dev: pointer to the pci_dev data structure of MSI(X) device function
-+ *
-+ * Being called during hotplug remove, from which the device function
-+ * is hot-removed. All previous assigned MSI/MSI-X vectors, if
-+ * allocated for this device function, are reclaimed to unused state,
-+ * which may be used later on.
-+ **/
-+void msi_remove_pci_irq_vectors(struct pci_dev* dev)
-+{
-+      unsigned long flags;
-+      struct msi_dev_list *msi_dev_entry;
-+      struct msi_pirq_entry *pirq_entry, *tmp;
-+
-+      if (!pci_msi_enable || !dev)
-+              return;
-+
-+      msi_dev_entry = get_msi_dev_pirq_list(dev);
-+
-+      spin_lock_irqsave(&msi_dev_entry->pirq_list_lock, flags);
-+      if (!list_empty(&msi_dev_entry->pirq_list_head))
-+      {
-+              printk(KERN_WARNING "msix pirqs for dev %02x:%02x:%01x are not freed \
-+                     before acquire again.\n", dev->bus->number, PCI_SLOT(dev->devfn),
-+                         PCI_FUNC(dev->devfn));
-+              list_for_each_entry_safe(pirq_entry, tmp,
-+                                       &msi_dev_entry->pirq_list_head, list) {
-+                      msi_unmap_pirq(dev, pirq_entry->pirq);
-+                      list_del(&pirq_entry->list);
-+                      kfree(pirq_entry);
-+              }
-+      }
-+      spin_unlock_irqrestore(&msi_dev_entry->pirq_list_lock, flags);
-+      dev->irq = dev->irq_old;
-+}
-+
-+void pci_no_msi(void)
-+{
-+      pci_msi_enable = 0;
-+}
-+
-+EXPORT_SYMBOL(pci_enable_msi);
-+EXPORT_SYMBOL(pci_disable_msi);
-+EXPORT_SYMBOL(pci_enable_msix);
-+EXPORT_SYMBOL(pci_disable_msix);
-+#ifdef CONFIG_XEN
-+EXPORT_SYMBOL(register_msi_get_owner);
-+EXPORT_SYMBOL(unregister_msi_get_owner);
-+#endif
-+
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/agp.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/agp.h 2007-06-22 09:08:06.000000000 +0200
-@@ -0,0 +1,44 @@
-+#ifndef AGP_H
-+#define AGP_H 1
-+
-+#include <asm/pgtable.h>
-+#include <asm/cacheflush.h>
-+#include <asm/system.h>
-+
-+/* 
-+ * Functions to keep the agpgart mappings coherent with the MMU.
-+ * The GART gives the CPU a physical alias of pages in memory. The alias region is
-+ * mapped uncacheable. Make sure there are no conflicting mappings
-+ * with different cachability attributes for the same page. This avoids
-+ * data corruption on some CPUs.
-+ */
-+
-+/* Caller's responsibility to call global_flush_tlb() for
-+ * performance reasons */
-+#define map_page_into_agp(page) ( \
-+      xen_create_contiguous_region((unsigned long)page_address(page), 0, 32) \
-+      ?: change_page_attr(page, 1, PAGE_KERNEL_NOCACHE))
-+#define unmap_page_from_agp(page) ( \
-+      xen_destroy_contiguous_region((unsigned long)page_address(page), 0), \
-+      /* only a fallback: xen_destroy_contiguous_region uses PAGE_KERNEL */ \
-+      change_page_attr(page, 1, PAGE_KERNEL))
-+#define flush_agp_mappings() global_flush_tlb()
-+
-+/* Could use CLFLUSH here if the cpu supports it. But then it would
-+   need to be called for each cacheline of the whole page so it may not be 
-+   worth it. Would need a page for it. */
-+#define flush_agp_cache() wbinvd()
-+
-+/* Convert a physical address to an address suitable for the GART. */
-+#define phys_to_gart(x) phys_to_machine(x)
-+#define gart_to_phys(x) machine_to_phys(x)
-+
-+/* GATT allocation. Returns/accepts GATT kernel virtual address. */
-+#define alloc_gatt_pages(order)       ({                                          \
-+      char *_t; dma_addr_t _d;                                            \
-+      _t = dma_alloc_coherent(NULL,PAGE_SIZE<<(order),&_d,GFP_KERNEL);    \
-+      _t; })
-+#define free_gatt_pages(table, order) \
-+      dma_free_coherent(NULL,PAGE_SIZE<<(order),(table),virt_to_bus(table))
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/desc_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/desc_32.h     2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,166 @@
-+#ifndef __ARCH_DESC_H
-+#define __ARCH_DESC_H
-+
-+#include <asm/ldt.h>
-+#include <asm/segment.h>
-+
-+#define CPU_16BIT_STACK_SIZE 1024
-+
-+#ifndef __ASSEMBLY__
-+
-+#include <linux/preempt.h>
-+#include <linux/smp.h>
-+
-+#include <asm/mmu.h>
-+
-+extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
-+
-+DECLARE_PER_CPU(unsigned char, cpu_16bit_stack[CPU_16BIT_STACK_SIZE]);
-+
-+struct Xgt_desc_struct {
-+      unsigned short size;
-+      unsigned long address __attribute__((packed));
-+      unsigned short pad;
-+} __attribute__ ((packed));
-+
-+extern struct Xgt_desc_struct idt_descr;
-+DECLARE_PER_CPU(struct Xgt_desc_struct, cpu_gdt_descr);
-+
-+
-+static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
-+{
-+      return (struct desc_struct *)per_cpu(cpu_gdt_descr, cpu).address;
-+}
-+
-+#define load_TR_desc() __asm__ __volatile__("ltr %w0"::"q" (GDT_ENTRY_TSS*8))
-+#define load_LDT_desc() __asm__ __volatile__("lldt %w0"::"q" (GDT_ENTRY_LDT*8))
-+
-+#define load_gdt(dtr) __asm__ __volatile("lgdt %0"::"m" (*dtr))
-+#define load_idt(dtr) __asm__ __volatile("lidt %0"::"m" (*dtr))
-+#define load_tr(tr) __asm__ __volatile("ltr %0"::"mr" (tr))
-+#define load_ldt(ldt) __asm__ __volatile("lldt %0"::"mr" (ldt))
-+
-+#define store_gdt(dtr) __asm__ ("sgdt %0":"=m" (*dtr))
-+#define store_idt(dtr) __asm__ ("sidt %0":"=m" (*dtr))
-+#define store_tr(tr) __asm__ ("str %0":"=mr" (tr))
-+#define store_ldt(ldt) __asm__ ("sldt %0":"=mr" (ldt))
-+
-+/*
-+ * This is the ldt that every process will get unless we need
-+ * something other than this.
-+ */
-+extern struct desc_struct default_ldt[];
-+extern void set_intr_gate(unsigned int irq, void * addr);
-+
-+#define _set_tssldt_desc(n,addr,limit,type) \
-+__asm__ __volatile__ ("movw %w3,0(%2)\n\t" \
-+      "movw %w1,2(%2)\n\t" \
-+      "rorl $16,%1\n\t" \
-+      "movb %b1,4(%2)\n\t" \
-+      "movb %4,5(%2)\n\t" \
-+      "movb $0,6(%2)\n\t" \
-+      "movb %h1,7(%2)\n\t" \
-+      "rorl $16,%1" \
-+      : "=m"(*(n)) : "q" (addr), "r"(n), "ir"(limit), "i"(type))
-+
-+#ifndef CONFIG_X86_NO_TSS
-+static inline void __set_tss_desc(unsigned int cpu, unsigned int entry, void *addr)
-+{
-+      _set_tssldt_desc(&get_cpu_gdt_table(cpu)[entry], (int)addr,
-+              offsetof(struct tss_struct, __cacheline_filler) - 1, 0x89);
-+}
-+
-+#define set_tss_desc(cpu,addr) __set_tss_desc(cpu, GDT_ENTRY_TSS, addr)
-+#endif
-+
-+static inline void set_ldt_desc(unsigned int cpu, void *addr, unsigned int size)
-+{
-+      _set_tssldt_desc(&get_cpu_gdt_table(cpu)[GDT_ENTRY_LDT], (int)addr, ((size << 3)-1), 0x82);
-+}
-+
-+#define LDT_entry_a(info) \
-+      ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
-+
-+#define LDT_entry_b(info) \
-+      (((info)->base_addr & 0xff000000) | \
-+      (((info)->base_addr & 0x00ff0000) >> 16) | \
-+      ((info)->limit & 0xf0000) | \
-+      (((info)->read_exec_only ^ 1) << 9) | \
-+      ((info)->contents << 10) | \
-+      (((info)->seg_not_present ^ 1) << 15) | \
-+      ((info)->seg_32bit << 22) | \
-+      ((info)->limit_in_pages << 23) | \
-+      ((info)->useable << 20) | \
-+      0x7000)
-+
-+#define LDT_empty(info) (\
-+      (info)->base_addr       == 0    && \
-+      (info)->limit           == 0    && \
-+      (info)->contents        == 0    && \
-+      (info)->read_exec_only  == 1    && \
-+      (info)->seg_32bit       == 0    && \
-+      (info)->limit_in_pages  == 0    && \
-+      (info)->seg_not_present == 1    && \
-+      (info)->useable         == 0    )
-+
-+extern int write_ldt_entry(void *ldt, int entry, __u32 entry_a, __u32 entry_b);
-+
-+#if TLS_SIZE != 24
-+# error update this code.
-+#endif
-+
-+static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
-+{
-+#define C(i) if (HYPERVISOR_update_descriptor(virt_to_machine(&get_cpu_gdt_table(cpu)[GDT_ENTRY_TLS_MIN + i]), \
-+                                             *(u64 *)&t->tls_array[i])) \
-+              BUG();
-+      C(0); C(1); C(2);
-+#undef C
-+}
-+
-+static inline void clear_LDT(void)
-+{
-+      int cpu = get_cpu();
-+
-+      /*
-+       * NB. We load the default_ldt for lcall7/27 handling on demand, as
-+       * it slows down context switching. Noone uses it anyway.
-+       */
-+      cpu = cpu;              /* XXX avoid compiler warning */
-+      xen_set_ldt(NULL, 0);
-+      put_cpu();
-+}
-+
-+/*
-+ * load one particular LDT into the current CPU
-+ */
-+static inline void load_LDT_nolock(mm_context_t *pc, int cpu)
-+{
-+      void *segments = pc->ldt;
-+      int count = pc->size;
-+
-+      if (likely(!count))
-+              segments = NULL;
-+
-+      xen_set_ldt(segments, count);
-+}
-+
-+static inline void load_LDT(mm_context_t *pc)
-+{
-+      int cpu = get_cpu();
-+      load_LDT_nolock(pc, cpu);
-+      put_cpu();
-+}
-+
-+static inline unsigned long get_desc_base(unsigned long *desc)
-+{
-+      unsigned long base;
-+      base = ((desc[0] >> 16)  & 0x0000ffff) |
-+              ((desc[1] << 16) & 0x00ff0000) |
-+              (desc[1] & 0xff000000);
-+      return base;
-+}
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/dma-mapping_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/dma-mapping_32.h      2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,151 @@
-+#ifndef _ASM_I386_DMA_MAPPING_H
-+#define _ASM_I386_DMA_MAPPING_H
-+
-+/*
-+ * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
-+ * documentation.
-+ */
-+
-+#include <linux/mm.h>
-+#include <asm/cache.h>
-+#include <asm/io.h>
-+#include <asm/scatterlist.h>
-+#include <asm/swiotlb.h>
-+
-+static inline int
-+address_needs_mapping(struct device *hwdev, dma_addr_t addr)
-+{
-+      dma_addr_t mask = 0xffffffff;
-+      /* If the device has a mask, use it, otherwise default to 32 bits */
-+      if (hwdev && hwdev->dma_mask)
-+              mask = *hwdev->dma_mask;
-+      return (addr & ~mask) != 0;
-+}
-+
-+extern int range_straddles_page_boundary(paddr_t p, size_t size);
-+
-+#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
-+#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
-+
-+void *dma_alloc_coherent(struct device *dev, size_t size,
-+                         dma_addr_t *dma_handle, gfp_t flag);
-+
-+void dma_free_coherent(struct device *dev, size_t size,
-+                       void *vaddr, dma_addr_t dma_handle);
-+
-+extern dma_addr_t
-+dma_map_single(struct device *dev, void *ptr, size_t size,
-+             enum dma_data_direction direction);
-+
-+extern void
-+dma_unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
-+               enum dma_data_direction direction);
-+
-+extern int dma_map_sg(struct device *hwdev, struct scatterlist *sg,
-+                    int nents, enum dma_data_direction direction);
-+extern void dma_unmap_sg(struct device *hwdev, struct scatterlist *sg,
-+                       int nents, enum dma_data_direction direction);
-+
-+#ifdef CONFIG_HIGHMEM
-+extern dma_addr_t
-+dma_map_page(struct device *dev, struct page *page, unsigned long offset,
-+           size_t size, enum dma_data_direction direction);
-+
-+extern void
-+dma_unmap_page(struct device *dev, dma_addr_t dma_address, size_t size,
-+             enum dma_data_direction direction);
-+#else
-+#define dma_map_page(dev, page, offset, size, dir) \
-+      dma_map_single(dev, page_address(page) + (offset), (size), (dir))
-+#define dma_unmap_page dma_unmap_single
-+#endif
-+
-+extern void
-+dma_sync_single_for_cpu(struct device *dev, dma_addr_t dma_handle, size_t size,
-+                      enum dma_data_direction direction);
-+
-+extern void
-+dma_sync_single_for_device(struct device *dev, dma_addr_t dma_handle, size_t size,
-+                           enum dma_data_direction direction);
-+
-+static inline void
-+dma_sync_single_range_for_cpu(struct device *dev, dma_addr_t dma_handle,
-+                            unsigned long offset, size_t size,
-+                            enum dma_data_direction direction)
-+{
-+      dma_sync_single_for_cpu(dev, dma_handle+offset, size, direction);
-+}
-+
-+static inline void
-+dma_sync_single_range_for_device(struct device *dev, dma_addr_t dma_handle,
-+                               unsigned long offset, size_t size,
-+                               enum dma_data_direction direction)
-+{
-+      dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
-+}
-+
-+static inline void
-+dma_sync_sg_for_cpu(struct device *dev, struct scatterlist *sg, int nelems,
-+                  enum dma_data_direction direction)
-+{
-+      if (swiotlb)
-+              swiotlb_sync_sg_for_cpu(dev,sg,nelems,direction);
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nelems,
-+                  enum dma_data_direction direction)
-+{
-+      if (swiotlb)
-+              swiotlb_sync_sg_for_device(dev,sg,nelems,direction);
-+      flush_write_buffers();
-+}
-+
-+extern int
-+dma_mapping_error(dma_addr_t dma_addr);
-+
-+extern int
-+dma_supported(struct device *dev, u64 mask);
-+
-+static inline int
-+dma_set_mask(struct device *dev, u64 mask)
-+{
-+      if(!dev->dma_mask || !dma_supported(dev, mask))
-+              return -EIO;
-+
-+      *dev->dma_mask = mask;
-+
-+      return 0;
-+}
-+
-+static inline int
-+dma_get_cache_alignment(void)
-+{
-+      /* no easy way to get cache size on all x86, so return the
-+       * maximum possible, to be safe */
-+      return (1 << INTERNODE_CACHE_SHIFT);
-+}
-+
-+#define dma_is_consistent(d)  (1)
-+
-+static inline void
-+dma_cache_sync(void *vaddr, size_t size,
-+             enum dma_data_direction direction)
-+{
-+      flush_write_buffers();
-+}
-+
-+#define ARCH_HAS_DMA_DECLARE_COHERENT_MEMORY
-+extern int
-+dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
-+                          dma_addr_t device_addr, size_t size, int flags);
-+
-+extern void
-+dma_release_declared_memory(struct device *dev);
-+
-+extern void *
-+dma_mark_declared_memory_occupied(struct device *dev,
-+                                dma_addr_t device_addr, size_t size);
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/fixmap_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/fixmap_32.h   2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,155 @@
-+/*
-+ * fixmap.h: compile-time virtual memory allocation
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1998 Ingo Molnar
-+ *
-+ * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
-+ */
-+
-+#ifndef _ASM_FIXMAP_H
-+#define _ASM_FIXMAP_H
-+
-+
-+/* used by vmalloc.c, vsyscall.lds.S.
-+ *
-+ * Leave one empty page between vmalloc'ed areas and
-+ * the start of the fixmap.
-+ */
-+extern unsigned long __FIXADDR_TOP;
-+
-+#ifndef __ASSEMBLY__
-+#include <linux/kernel.h>
-+#include <asm/acpi.h>
-+#include <asm/apicdef.h>
-+#include <asm/page.h>
-+#ifdef CONFIG_HIGHMEM
-+#include <linux/threads.h>
-+#include <asm/kmap_types.h>
-+#endif
-+
-+/*
-+ * Here we define all the compile-time 'special' virtual
-+ * addresses. The point is to have a constant address at
-+ * compile time, but to set the physical address only
-+ * in the boot process. We allocate these special addresses
-+ * from the end of virtual memory (0xfffff000) backwards.
-+ * Also this lets us do fail-safe vmalloc(), we
-+ * can guarantee that these special addresses and
-+ * vmalloc()-ed addresses never overlap.
-+ *
-+ * these 'compile-time allocated' memory buffers are
-+ * fixed-size 4k pages. (or larger if used with an increment
-+ * highger than 1) use fixmap_set(idx,phys) to associate
-+ * physical memory with fixmap indices.
-+ *
-+ * TLB entries of such buffers will not be flushed across
-+ * task switches.
-+ */
-+enum fixed_addresses {
-+      FIX_HOLE,
-+      FIX_VDSO,
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
-+#endif
-+#ifdef CONFIG_X86_IO_APIC
-+      FIX_IO_APIC_BASE_0,
-+      FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
-+#endif
-+#ifdef CONFIG_X86_VISWS_APIC
-+      FIX_CO_CPU,     /* Cobalt timer */
-+      FIX_CO_APIC,    /* Cobalt APIC Redirection Table */ 
-+      FIX_LI_PCIA,    /* Lithium PCI Bridge A */
-+      FIX_LI_PCIB,    /* Lithium PCI Bridge B */
-+#endif
-+#ifdef CONFIG_X86_F00F_BUG
-+      FIX_F00F_IDT,   /* Virtual mapping for IDT */
-+#endif
-+#ifdef CONFIG_X86_CYCLONE_TIMER
-+      FIX_CYCLONE_TIMER, /*cyclone timer register*/
-+#endif 
-+#ifdef CONFIG_HIGHMEM
-+      FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */
-+      FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1,
-+#endif
-+#ifdef CONFIG_ACPI
-+      FIX_ACPI_BEGIN,
-+      FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-+#endif
-+#ifdef CONFIG_PCI_MMCONFIG
-+      FIX_PCIE_MCFG,
-+#endif
-+      FIX_SHARED_INFO,
-+#define NR_FIX_ISAMAPS        256
-+      FIX_ISAMAP_END,
-+      FIX_ISAMAP_BEGIN = FIX_ISAMAP_END + NR_FIX_ISAMAPS - 1,
-+      __end_of_permanent_fixed_addresses,
-+      /* temporary boot-time mappings, used before ioremap() is functional */
-+#define NR_FIX_BTMAPS 16
-+      FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
-+      FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
-+      FIX_WP_TEST,
-+      __end_of_fixed_addresses
-+};
-+
-+extern void set_fixaddr_top(unsigned long top);
-+
-+extern void __set_fixmap(enum fixed_addresses idx,
-+                                      maddr_t phys, pgprot_t flags);
-+
-+#define set_fixmap(idx, phys) \
-+              __set_fixmap(idx, phys, PAGE_KERNEL)
-+/*
-+ * Some hardware wants to get fixmapped without caching.
-+ */
-+#define set_fixmap_nocache(idx, phys) \
-+              __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-+
-+#define clear_fixmap(idx) \
-+              __set_fixmap(idx, 0, __pgprot(0))
-+
-+#define FIXADDR_TOP   ((unsigned long)__FIXADDR_TOP)
-+
-+#define __FIXADDR_SIZE        (__end_of_permanent_fixed_addresses << PAGE_SHIFT)
-+#define __FIXADDR_BOOT_SIZE   (__end_of_fixed_addresses << PAGE_SHIFT)
-+#define FIXADDR_START         (FIXADDR_TOP - __FIXADDR_SIZE)
-+#define FIXADDR_BOOT_START    (FIXADDR_TOP - __FIXADDR_BOOT_SIZE)
-+
-+#define __fix_to_virt(x)      (FIXADDR_TOP - ((x) << PAGE_SHIFT))
-+#define __virt_to_fix(x)      ((FIXADDR_TOP - ((x)&PAGE_MASK)) >> PAGE_SHIFT)
-+
-+extern void __this_fixmap_does_not_exist(void);
-+
-+/*
-+ * 'index to address' translation. If anyone tries to use the idx
-+ * directly without tranlation, we catch the bug with a NULL-deference
-+ * kernel oops. Illegal ranges of incoming indices are caught too.
-+ */
-+static __always_inline unsigned long fix_to_virt(const unsigned int idx)
-+{
-+      /*
-+       * this branch gets completely eliminated after inlining,
-+       * except when someone tries to use fixaddr indices in an
-+       * illegal way. (such as mixing up address types or using
-+       * out-of-range indices).
-+       *
-+       * If it doesn't get removed, the linker will complain
-+       * loudly with a reasonably clear error message..
-+       */
-+      if (idx >= __end_of_fixed_addresses)
-+              __this_fixmap_does_not_exist();
-+
-+        return __fix_to_virt(idx);
-+}
-+
-+static inline unsigned long virt_to_fix(const unsigned long vaddr)
-+{
-+      BUG_ON(vaddr >= FIXADDR_TOP || vaddr < FIXADDR_START);
-+      return __virt_to_fix(vaddr);
-+}
-+
-+#endif /* !__ASSEMBLY__ */
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/gnttab_dma.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/gnttab_dma.h  2007-08-06 15:10:49.000000000 +0200
-@@ -0,0 +1,41 @@
-+/*
-+ * Copyright (c) 2007 Herbert Xu <herbert@gondor.apana.org.au>
-+ * Copyright (c) 2007 Isaku Yamahata <yamahata at valinux co jp>
-+ *                    VA Linux Systems Japan K.K.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+
-+#ifndef _ASM_I386_GNTTAB_DMA_H
-+#define _ASM_I386_GNTTAB_DMA_H
-+
-+static inline int gnttab_dma_local_pfn(struct page *page)
-+{
-+      /* Has it become a local MFN? */
-+      return pfn_valid(mfn_to_local_pfn(pfn_to_mfn(page_to_pfn(page))));
-+}
-+
-+static inline maddr_t gnttab_dma_map_page(struct page *page)
-+{
-+      __gnttab_dma_map_page(page);
-+      return ((maddr_t)pfn_to_mfn(page_to_pfn(page)) << PAGE_SHIFT);
-+}
-+
-+static inline void gnttab_dma_unmap_page(maddr_t maddr)
-+{
-+      __gnttab_dma_unmap_page(virt_to_page(bus_to_virt(maddr)));
-+}
-+
-+#endif /* _ASM_I386_GNTTAB_DMA_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/highmem.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/highmem.h     2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,97 @@
-+/*
-+ * highmem.h: virtual kernel memory mappings for high memory
-+ *
-+ * Used in CONFIG_HIGHMEM systems for memory pages which
-+ * are not addressable by direct kernel virtual addresses.
-+ *
-+ * Copyright (C) 1999 Gerhard Wichert, Siemens AG
-+ *                  Gerhard.Wichert@pdb.siemens.de
-+ *
-+ *
-+ * Redesigned the x86 32-bit VM architecture to deal with 
-+ * up to 16 Terabyte physical memory. With current x86 CPUs
-+ * we now support up to 64 Gigabytes physical RAM.
-+ *
-+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
-+ */
-+
-+#ifndef _ASM_HIGHMEM_H
-+#define _ASM_HIGHMEM_H
-+
-+#ifdef __KERNEL__
-+
-+#include <linux/interrupt.h>
-+#include <linux/threads.h>
-+#include <asm/kmap_types.h>
-+#include <asm/tlbflush.h>
-+
-+/* declarations for highmem.c */
-+extern unsigned long highstart_pfn, highend_pfn;
-+
-+extern pte_t *kmap_pte;
-+extern pgprot_t kmap_prot;
-+extern pte_t *pkmap_page_table;
-+
-+/*
-+ * Right now we initialize only a single pte table. It can be extended
-+ * easily, subsequent pte tables have to be allocated in one physical
-+ * chunk of RAM.
-+ */
-+#ifdef CONFIG_X86_PAE
-+#define LAST_PKMAP 512
-+#else
-+#define LAST_PKMAP 1024
-+#endif
-+/*
-+ * Ordering is:
-+ *
-+ * FIXADDR_TOP
-+ *                    fixed_addresses
-+ * FIXADDR_START
-+ *                    temp fixed addresses
-+ * FIXADDR_BOOT_START
-+ *                    Persistent kmap area
-+ * PKMAP_BASE
-+ * VMALLOC_END
-+ *                    Vmalloc area
-+ * VMALLOC_START
-+ * high_memory
-+ */
-+#define PKMAP_BASE ( (FIXADDR_BOOT_START - PAGE_SIZE*(LAST_PKMAP + 1)) & PMD_MASK )
-+#define LAST_PKMAP_MASK (LAST_PKMAP-1)
-+#define PKMAP_NR(virt)  ((virt-PKMAP_BASE) >> PAGE_SHIFT)
-+#define PKMAP_ADDR(nr)  (PKMAP_BASE + ((nr) << PAGE_SHIFT))
-+
-+extern void * FASTCALL(kmap_high(struct page *page));
-+extern void FASTCALL(kunmap_high(struct page *page));
-+
-+void *kmap(struct page *page);
-+void kunmap(struct page *page);
-+void *kmap_atomic(struct page *page, enum km_type type);
-+void *kmap_atomic_pte(struct page *page, enum km_type type);
-+void kunmap_atomic(void *kvaddr, enum km_type type);
-+void *kmap_atomic_pfn(unsigned long pfn, enum km_type type);
-+struct page *kmap_atomic_to_page(void *ptr);
-+
-+#define flush_cache_kmaps()   do { } while (0)
-+
-+void clear_highpage(struct page *);
-+static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
-+{
-+      clear_highpage(page);
-+}
-+#define __HAVE_ARCH_CLEAR_HIGHPAGE
-+#define __HAVE_ARCH_CLEAR_USER_HIGHPAGE
-+
-+void copy_highpage(struct page *to, struct page *from);
-+static inline void copy_user_highpage(struct page *to, struct page *from,
-+      unsigned long vaddr)
-+{
-+      copy_highpage(to, from);
-+}
-+#define __HAVE_ARCH_COPY_HIGHPAGE
-+#define __HAVE_ARCH_COPY_USER_HIGHPAGE
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _ASM_HIGHMEM_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/hypercall_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/hypercall_32.h        2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,409 @@
-+/******************************************************************************
-+ * hypercall.h
-+ * 
-+ * Linux-specific hypervisor handling.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __HYPERCALL_H__
-+#define __HYPERCALL_H__
-+
-+#include <linux/string.h> /* memcpy() */
-+#include <linux/stringify.h>
-+
-+#ifndef __HYPERVISOR_H__
-+# error "please don't include this file directly"
-+#endif
-+
-+#ifdef CONFIG_XEN
-+#define HYPERCALL_STR(name)                                   \
-+      "call hypercall_page + ("__stringify(__HYPERVISOR_##name)" * 32)"
-+#else
-+#define HYPERCALL_STR(name)                                   \
-+      "mov hypercall_stubs,%%eax; "                           \
-+      "add $("__stringify(__HYPERVISOR_##name)" * 32),%%eax; "\
-+      "call *%%eax"
-+#endif
-+
-+#define _hypercall0(type, name)                       \
-+({                                            \
-+      type __res;                             \
-+      asm volatile (                          \
-+              HYPERCALL_STR(name)             \
-+              : "=a" (__res)                  \
-+              :                               \
-+              : "memory" );                   \
-+      __res;                                  \
-+})
-+
-+#define _hypercall1(type, name, a1)                           \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1;                                            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=b" (__ign1)                   \
-+              : "1" ((long)(a1))                              \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall2(type, name, a1, a2)                               \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2;                                    \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=b" (__ign1), "=c" (__ign2)    \
-+              : "1" ((long)(a1)), "2" ((long)(a2))            \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall3(type, name, a1, a2, a3)                   \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3;                            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-+              "=d" (__ign3)                                   \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+              "3" ((long)(a3))                                \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall4(type, name, a1, a2, a3, a4)                       \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3, __ign4;                    \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-+              "=d" (__ign3), "=S" (__ign4)                    \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+              "3" ((long)(a3)), "4" ((long)(a4))              \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall5(type, name, a1, a2, a3, a4, a5)           \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3, __ign4, __ign5;            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=b" (__ign1), "=c" (__ign2),   \
-+              "=d" (__ign3), "=S" (__ign4), "=D" (__ign5)     \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+              "3" ((long)(a3)), "4" ((long)(a4)),             \
-+              "5" ((long)(a5))                                \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+static inline int __must_check
-+HYPERVISOR_set_trap_table(
-+      const trap_info_t *table)
-+{
-+      return _hypercall1(int, set_trap_table, table);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_mmu_update(
-+      mmu_update_t *req, unsigned int count, unsigned int *success_count,
-+      domid_t domid)
-+{
-+      return _hypercall4(int, mmu_update, req, count, success_count, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_mmuext_op(
-+      struct mmuext_op *op, unsigned int count, unsigned int *success_count,
-+      domid_t domid)
-+{
-+      return _hypercall4(int, mmuext_op, op, count, success_count, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_gdt(
-+      unsigned long *frame_list, unsigned int entries)
-+{
-+      return _hypercall2(int, set_gdt, frame_list, entries);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_stack_switch(
-+      unsigned long ss, unsigned long esp)
-+{
-+      return _hypercall2(int, stack_switch, ss, esp);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_callbacks(
-+      unsigned long event_selector, unsigned long event_address,
-+      unsigned long failsafe_selector, unsigned long failsafe_address)
-+{
-+      return _hypercall4(int, set_callbacks,
-+                         event_selector, event_address,
-+                         failsafe_selector, failsafe_address);
-+}
-+
-+static inline int
-+HYPERVISOR_fpu_taskswitch(
-+      int set)
-+{
-+      return _hypercall1(int, fpu_taskswitch, set);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_sched_op_compat(
-+      int cmd, unsigned long arg)
-+{
-+      return _hypercall2(int, sched_op_compat, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_sched_op(
-+      int cmd, void *arg)
-+{
-+      return _hypercall2(int, sched_op, cmd, arg);
-+}
-+
-+static inline long __must_check
-+HYPERVISOR_set_timer_op(
-+      u64 timeout)
-+{
-+      unsigned long timeout_hi = (unsigned long)(timeout>>32);
-+      unsigned long timeout_lo = (unsigned long)timeout;
-+      return _hypercall2(long, set_timer_op, timeout_lo, timeout_hi);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_platform_op(
-+      struct xen_platform_op *platform_op)
-+{
-+      platform_op->interface_version = XENPF_INTERFACE_VERSION;
-+      return _hypercall1(int, platform_op, platform_op);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_debugreg(
-+      unsigned int reg, unsigned long value)
-+{
-+      return _hypercall2(int, set_debugreg, reg, value);
-+}
-+
-+static inline unsigned long __must_check
-+HYPERVISOR_get_debugreg(
-+      unsigned int reg)
-+{
-+      return _hypercall1(unsigned long, get_debugreg, reg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_descriptor(
-+      u64 ma, u64 desc)
-+{
-+      return _hypercall4(int, update_descriptor, ma, ma>>32, desc, desc>>32);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_memory_op(
-+      unsigned int cmd, void *arg)
-+{
-+      return _hypercall2(int, memory_op, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_multicall(
-+      multicall_entry_t *call_list, unsigned int nr_calls)
-+{
-+      return _hypercall2(int, multicall, call_list, nr_calls);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_va_mapping(
-+      unsigned long va, pte_t new_val, unsigned long flags)
-+{
-+      unsigned long pte_hi = 0;
-+#ifdef CONFIG_X86_PAE
-+      pte_hi = new_val.pte_high;
-+#endif
-+      return _hypercall4(int, update_va_mapping, va,
-+                         new_val.pte_low, pte_hi, flags);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_event_channel_op(
-+      int cmd, void *arg)
-+{
-+      int rc = _hypercall2(int, event_channel_op, cmd, arg);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              struct evtchn_op op;
-+              op.cmd = cmd;
-+              memcpy(&op.u, arg, sizeof(op.u));
-+              rc = _hypercall1(int, event_channel_op_compat, &op);
-+              memcpy(arg, &op.u, sizeof(op.u));
-+      }
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_xen_version(
-+      int cmd, void *arg)
-+{
-+      return _hypercall2(int, xen_version, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_console_io(
-+      int cmd, unsigned int count, char *str)
-+{
-+      return _hypercall3(int, console_io, cmd, count, str);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_physdev_op(
-+      int cmd, void *arg)
-+{
-+      int rc = _hypercall2(int, physdev_op, cmd, arg);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              struct physdev_op op;
-+              op.cmd = cmd;
-+              memcpy(&op.u, arg, sizeof(op.u));
-+              rc = _hypercall1(int, physdev_op_compat, &op);
-+              memcpy(arg, &op.u, sizeof(op.u));
-+      }
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_grant_table_op(
-+      unsigned int cmd, void *uop, unsigned int count)
-+{
-+      return _hypercall3(int, grant_table_op, cmd, uop, count);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_va_mapping_otherdomain(
-+      unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
-+{
-+      unsigned long pte_hi = 0;
-+#ifdef CONFIG_X86_PAE
-+      pte_hi = new_val.pte_high;
-+#endif
-+      return _hypercall5(int, update_va_mapping_otherdomain, va,
-+                         new_val.pte_low, pte_hi, flags, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_vm_assist(
-+      unsigned int cmd, unsigned int type)
-+{
-+      return _hypercall2(int, vm_assist, cmd, type);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_vcpu_op(
-+      int cmd, unsigned int vcpuid, void *extra_args)
-+{
-+      return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_suspend(
-+      unsigned long srec)
-+{
-+      struct sched_shutdown sched_shutdown = {
-+              .reason = SHUTDOWN_suspend
-+      };
-+
-+      int rc = _hypercall3(int, sched_op, SCHEDOP_shutdown,
-+                           &sched_shutdown, srec);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (rc == -ENOSYS)
-+              rc = _hypercall3(int, sched_op_compat, SCHEDOP_shutdown,
-+                               SHUTDOWN_suspend, srec);
-+#endif
-+
-+      return rc;
-+}
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+static inline int
-+HYPERVISOR_nmi_op(
-+      unsigned long op, void *arg)
-+{
-+      return _hypercall2(int, nmi_op, op, arg);
-+}
-+#endif
-+
-+#ifndef CONFIG_XEN
-+static inline unsigned long __must_check
-+HYPERVISOR_hvm_op(
-+    int op, void *arg)
-+{
-+    return _hypercall2(unsigned long, hvm_op, op, arg);
-+}
-+#endif
-+
-+static inline int __must_check
-+HYPERVISOR_callback_op(
-+      int cmd, const void *arg)
-+{
-+      return _hypercall2(int, callback_op, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_xenoprof_op(
-+      int op, void *arg)
-+{
-+      return _hypercall2(int, xenoprof_op, op, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_kexec_op(
-+      unsigned long op, void *args)
-+{
-+      return _hypercall2(int, kexec_op, op, args);
-+}
-+
-+
-+
-+#endif /* __HYPERCALL_H__ */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/hypervisor.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/hypervisor.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,259 @@
-+/******************************************************************************
-+ * hypervisor.h
-+ * 
-+ * Linux-specific hypervisor handling.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __HYPERVISOR_H__
-+#define __HYPERVISOR_H__
-+
-+#include <linux/types.h>
-+#include <linux/kernel.h>
-+#include <linux/version.h>
-+#include <linux/errno.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/platform.h>
-+#include <xen/interface/event_channel.h>
-+#include <xen/interface/physdev.h>
-+#include <xen/interface/sched.h>
-+#include <xen/interface/nmi.h>
-+#include <asm/ptrace.h>
-+#include <asm/page.h>
-+#if defined(__i386__)
-+#  ifdef CONFIG_X86_PAE
-+#   include <asm-generic/pgtable-nopud.h>
-+#  else
-+#   include <asm-generic/pgtable-nopmd.h>
-+#  endif
-+#elif defined(__x86_64__) && LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-+#  include <asm-generic/pgtable-nopud.h>
-+#endif
-+
-+extern shared_info_t *HYPERVISOR_shared_info;
-+
-+#define vcpu_info(cpu) (HYPERVISOR_shared_info->vcpu_info + (cpu))
-+#ifdef CONFIG_SMP
-+#define current_vcpu_info() vcpu_info(smp_processor_id())
-+#else
-+#define current_vcpu_info() vcpu_info(0)
-+#endif
-+
-+#ifdef CONFIG_X86_32
-+extern unsigned long hypervisor_virt_start;
-+#endif
-+
-+/* arch/xen/i386/kernel/setup.c */
-+extern start_info_t *xen_start_info;
-+#ifdef CONFIG_XEN_PRIVILEGED_GUEST
-+#define is_initial_xendomain() (xen_start_info->flags & SIF_INITDOMAIN)
-+#else
-+#define is_initial_xendomain() 0
-+#endif
-+
-+/* arch/xen/kernel/evtchn.c */
-+/* Force a proper event-channel callback from Xen. */
-+void force_evtchn_callback(void);
-+
-+/* arch/xen/kernel/process.c */
-+void xen_cpu_idle (void);
-+
-+/* arch/xen/i386/kernel/hypervisor.c */
-+void do_hypervisor_callback(struct pt_regs *regs);
-+
-+/* arch/xen/i386/mm/hypervisor.c */
-+/*
-+ * NB. ptr values should be PHYSICAL, not MACHINE. 'vals' should be already
-+ * be MACHINE addresses.
-+ */
-+
-+void xen_pt_switch(unsigned long ptr);
-+void xen_new_user_pt(unsigned long ptr); /* x86_64 only */
-+void xen_load_gs(unsigned int selector); /* x86_64 only */
-+void xen_tlb_flush(void);
-+void xen_invlpg(unsigned long ptr);
-+
-+void xen_l1_entry_update(pte_t *ptr, pte_t val);
-+void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
-+void xen_l3_entry_update(pud_t *ptr, pud_t val); /* x86_64/PAE */
-+void xen_l4_entry_update(pgd_t *ptr, pgd_t val); /* x86_64 only */
-+void xen_pgd_pin(unsigned long ptr);
-+void xen_pgd_unpin(unsigned long ptr);
-+
-+void xen_set_ldt(const void *ptr, unsigned int ents);
-+
-+#ifdef CONFIG_SMP
-+#include <linux/cpumask.h>
-+void xen_tlb_flush_all(void);
-+void xen_invlpg_all(unsigned long ptr);
-+void xen_tlb_flush_mask(cpumask_t *mask);
-+void xen_invlpg_mask(cpumask_t *mask, unsigned long ptr);
-+#endif
-+
-+/* Returns zero on success else negative errno. */
-+int xen_create_contiguous_region(
-+    unsigned long vstart, unsigned int order, unsigned int address_bits);
-+void xen_destroy_contiguous_region(
-+    unsigned long vstart, unsigned int order);
-+
-+struct page;
-+
-+int xen_limit_pages_to_max_mfn(
-+      struct page *pages, unsigned int order, unsigned int address_bits);
-+
-+/* Turn jiffies into Xen system time. */
-+u64 jiffies_to_st(unsigned long jiffies);
-+
-+#ifdef CONFIG_XEN_SCRUB_PAGES
-+void scrub_pages(void *, unsigned int);
-+#else
-+#define scrub_pages(_p,_n) ((void)0)
-+#endif
-+
-+#include <xen/hypercall.h>
-+
-+#if defined(CONFIG_X86_64)
-+#define MULTI_UVMFLAGS_INDEX 2
-+#define MULTI_UVMDOMID_INDEX 3
-+#else
-+#define MULTI_UVMFLAGS_INDEX 3
-+#define MULTI_UVMDOMID_INDEX 4
-+#endif
-+
-+#ifdef CONFIG_XEN
-+#define is_running_on_xen() 1
-+#else
-+extern char *hypercall_stubs;
-+#define is_running_on_xen() (!!hypercall_stubs)
-+#endif
-+
-+static inline int
-+HYPERVISOR_yield(
-+      void)
-+{
-+      int rc = HYPERVISOR_sched_op(SCHEDOP_yield, NULL);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (rc == -ENOSYS)
-+              rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline int
-+HYPERVISOR_block(
-+      void)
-+{
-+      int rc = HYPERVISOR_sched_op(SCHEDOP_block, NULL);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (rc == -ENOSYS)
-+              rc = HYPERVISOR_sched_op_compat(SCHEDOP_block, 0);
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline void /*__noreturn*/
-+HYPERVISOR_shutdown(
-+      unsigned int reason)
-+{
-+      struct sched_shutdown sched_shutdown = {
-+              .reason = reason
-+      };
-+
-+      VOID(HYPERVISOR_sched_op(SCHEDOP_shutdown, &sched_shutdown));
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      VOID(HYPERVISOR_sched_op_compat(SCHEDOP_shutdown, reason));
-+#endif
-+      /* Don't recurse needlessly. */
-+      BUG_ON(reason != SHUTDOWN_crash);
-+      for(;;);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_poll(
-+      evtchn_port_t *ports, unsigned int nr_ports, u64 timeout)
-+{
-+      int rc;
-+      struct sched_poll sched_poll = {
-+              .nr_ports = nr_ports,
-+              .timeout = jiffies_to_st(timeout)
-+      };
-+      set_xen_guest_handle(sched_poll.ports, ports);
-+
-+      rc = HYPERVISOR_sched_op(SCHEDOP_poll, &sched_poll);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (rc == -ENOSYS)
-+              rc = HYPERVISOR_sched_op_compat(SCHEDOP_yield, 0);
-+#endif
-+
-+      return rc;
-+}
-+
-+#ifdef CONFIG_XEN
-+
-+static inline void
-+MULTI_update_va_mapping(
-+    multicall_entry_t *mcl, unsigned long va,
-+    pte_t new_val, unsigned long flags)
-+{
-+    mcl->op = __HYPERVISOR_update_va_mapping;
-+    mcl->args[0] = va;
-+#if defined(CONFIG_X86_64)
-+    mcl->args[1] = new_val.pte;
-+#elif defined(CONFIG_X86_PAE)
-+    mcl->args[1] = new_val.pte_low;
-+    mcl->args[2] = new_val.pte_high;
-+#else
-+    mcl->args[1] = new_val.pte_low;
-+    mcl->args[2] = 0;
-+#endif
-+    mcl->args[MULTI_UVMFLAGS_INDEX] = flags;
-+}
-+
-+static inline void
-+MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
-+                   void *uop, unsigned int count)
-+{
-+    mcl->op = __HYPERVISOR_grant_table_op;
-+    mcl->args[0] = cmd;
-+    mcl->args[1] = (unsigned long)uop;
-+    mcl->args[2] = count;
-+}
-+
-+#else /* !defined(CONFIG_XEN) */
-+
-+/* Multicalls not supported for HVM guests. */
-+#define MULTI_update_va_mapping(a,b,c,d) ((void)0)
-+#define MULTI_grant_table_op(a,b,c,d) ((void)0)
-+
-+#endif
-+
-+#endif /* __HYPERVISOR_H__ */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/irqflags_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/irqflags_32.h 2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,127 @@
-+/*
-+ * include/asm-i386/irqflags.h
-+ *
-+ * IRQ flags handling
-+ *
-+ * This file gets included from lowlevel asm headers too, to provide
-+ * wrapped versions of the local_irq_*() APIs, based on the
-+ * raw_local_irq_*() functions from the lowlevel headers.
-+ */
-+#ifndef _ASM_IRQFLAGS_H
-+#define _ASM_IRQFLAGS_H
-+
-+#ifndef __ASSEMBLY__
-+
-+/* 
-+ * The use of 'barrier' in the following reflects their use as local-lock
-+ * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
-+ * critical operations are executed. All critical operations must complete
-+ * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also
-+ * includes these barriers, for example.
-+ */
-+
-+#define __raw_local_save_flags() (current_vcpu_info()->evtchn_upcall_mask)
-+
-+#define raw_local_save_flags(flags) \
-+              do { (flags) = __raw_local_save_flags(); } while (0)
-+
-+#define raw_local_irq_restore(x)                                      \
-+do {                                                                  \
-+      vcpu_info_t *_vcpu;                                             \
-+      barrier();                                                      \
-+      _vcpu = current_vcpu_info();                                    \
-+      if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                   \
-+              barrier(); /* unmask then check (avoid races) */        \
-+              if (unlikely(_vcpu->evtchn_upcall_pending))             \
-+                      force_evtchn_callback();                        \
-+      }                                                               \
-+} while (0)
-+
-+#define raw_local_irq_disable()                                               \
-+do {                                                                  \
-+      current_vcpu_info()->evtchn_upcall_mask = 1;                    \
-+      barrier();                                                      \
-+} while (0)
-+
-+#define raw_local_irq_enable()                                                \
-+do {                                                                  \
-+      vcpu_info_t *_vcpu;                                             \
-+      barrier();                                                      \
-+      _vcpu = current_vcpu_info();                                    \
-+      _vcpu->evtchn_upcall_mask = 0;                                  \
-+      barrier(); /* unmask then check (avoid races) */                \
-+      if (unlikely(_vcpu->evtchn_upcall_pending))                     \
-+              force_evtchn_callback();                                \
-+} while (0)
-+
-+/*
-+ * Used in the idle loop; sti takes one instruction cycle
-+ * to complete:
-+ */
-+void raw_safe_halt(void);
-+
-+/*
-+ * Used when interrupts are already enabled or to
-+ * shutdown the processor:
-+ */
-+void halt(void);
-+
-+static inline int raw_irqs_disabled_flags(unsigned long flags)
-+{
-+      return (flags != 0);
-+}
-+
-+#define raw_irqs_disabled()                                           \
-+({                                                                    \
-+      unsigned long flags = __raw_local_save_flags();                 \
-+                                                                      \
-+      raw_irqs_disabled_flags(flags);                                 \
-+})
-+
-+/*
-+ * For spinlocks, etc:
-+ */
-+#define __raw_local_irq_save()                                                \
-+({                                                                    \
-+      unsigned long flags = __raw_local_save_flags();                 \
-+                                                                      \
-+      raw_local_irq_disable();                                        \
-+                                                                      \
-+      flags;                                                          \
-+})
-+
-+#define raw_local_irq_save(flags) \
-+              do { (flags) = __raw_local_irq_save(); } while (0)
-+
-+#endif /* __ASSEMBLY__ */
-+
-+/*
-+ * Do the CPU's IRQ-state tracing from assembly code. We call a
-+ * C function, so save all the C-clobbered registers:
-+ */
-+#ifdef CONFIG_TRACE_IRQFLAGS
-+
-+# define TRACE_IRQS_ON                                \
-+      pushl %eax;                             \
-+      pushl %ecx;                             \
-+      pushl %edx;                             \
-+      call trace_hardirqs_on;                 \
-+      popl %edx;                              \
-+      popl %ecx;                              \
-+      popl %eax;
-+
-+# define TRACE_IRQS_OFF                               \
-+      pushl %eax;                             \
-+      pushl %ecx;                             \
-+      pushl %edx;                             \
-+      call trace_hardirqs_off;                \
-+      popl %edx;                              \
-+      popl %ecx;                              \
-+      popl %eax;
-+
-+#else
-+# define TRACE_IRQS_ON
-+# define TRACE_IRQS_OFF
-+#endif
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/maddr_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/maddr_32.h    2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,193 @@
-+#ifndef _I386_MADDR_H
-+#define _I386_MADDR_H
-+
-+#include <xen/features.h>
-+#include <xen/interface/xen.h>
-+
-+/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-+#define INVALID_P2M_ENTRY     (~0UL)
-+#define FOREIGN_FRAME_BIT     (1UL<<31)
-+#define FOREIGN_FRAME(m)      ((m) | FOREIGN_FRAME_BIT)
-+
-+/* Definitions for machine and pseudophysical addresses. */
-+#ifdef CONFIG_X86_PAE
-+typedef unsigned long long paddr_t;
-+typedef unsigned long long maddr_t;
-+#else
-+typedef unsigned long paddr_t;
-+typedef unsigned long maddr_t;
-+#endif
-+
-+#ifdef CONFIG_XEN
-+
-+extern unsigned long *phys_to_machine_mapping;
-+extern unsigned long  max_mapnr;
-+
-+#undef machine_to_phys_mapping
-+extern unsigned long *machine_to_phys_mapping;
-+extern unsigned int   machine_to_phys_order;
-+
-+static inline unsigned long pfn_to_mfn(unsigned long pfn)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return pfn;
-+      BUG_ON(max_mapnr && pfn >= max_mapnr);
-+      return phys_to_machine_mapping[pfn] & ~FOREIGN_FRAME_BIT;
-+}
-+
-+static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return 1;
-+      BUG_ON(max_mapnr && pfn >= max_mapnr);
-+      return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-+}
-+
-+static inline unsigned long mfn_to_pfn(unsigned long mfn)
-+{
-+      unsigned long pfn;
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return mfn;
-+
-+      if (unlikely((mfn >> machine_to_phys_order) != 0))
-+              return max_mapnr;
-+
-+      /* The array access can fail (e.g., device space beyond end of RAM). */
-+      asm (
-+              "1:     movl %1,%0\n"
-+              "2:\n"
-+              ".section .fixup,\"ax\"\n"
-+              "3:     movl %2,%0\n"
-+              "       jmp  2b\n"
-+              ".previous\n"
-+              ".section __ex_table,\"a\"\n"
-+              "       .align 4\n"
-+              "       .long 1b,3b\n"
-+              ".previous"
-+              : "=r" (pfn)
-+              : "m" (machine_to_phys_mapping[mfn]), "m" (max_mapnr) );
-+
-+      return pfn;
-+}
-+
-+/*
-+ * We detect special mappings in one of two ways:
-+ *  1. If the MFN is an I/O page then Xen will set the m2p entry
-+ *     to be outside our maximum possible pseudophys range.
-+ *  2. If the MFN belongs to a different domain then we will certainly
-+ *     not have MFN in our p2m table. Conversely, if the page is ours,
-+ *     then we'll have p2m(m2p(MFN))==MFN.
-+ * If we detect a special mapping then it doesn't have a 'struct page'.
-+ * We force !pfn_valid() by returning an out-of-range pointer.
-+ *
-+ * NB. These checks require that, for any MFN that is not in our reservation,
-+ * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
-+ * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
-+ * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
-+ *
-+ * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
-+ *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
-+ *      require. In all the cases we care about, the FOREIGN_FRAME bit is
-+ *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
-+ */
-+static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-+{
-+      unsigned long pfn = mfn_to_pfn(mfn);
-+      if ((pfn < max_mapnr)
-+          && !xen_feature(XENFEAT_auto_translated_physmap)
-+          && (phys_to_machine_mapping[pfn] != mfn))
-+              return max_mapnr; /* force !pfn_valid() */
-+      return pfn;
-+}
-+
-+static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-+{
-+      BUG_ON(max_mapnr && pfn >= max_mapnr);
-+      if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+              BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-+              return;
-+      }
-+      phys_to_machine_mapping[pfn] = mfn;
-+}
-+
-+static inline maddr_t phys_to_machine(paddr_t phys)
-+{
-+      maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-+      machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-+      return machine;
-+}
-+
-+static inline paddr_t machine_to_phys(maddr_t machine)
-+{
-+      paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-+      phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-+      return phys;
-+}
-+
-+#ifdef CONFIG_X86_PAE
-+static inline paddr_t pte_phys_to_machine(paddr_t phys)
-+{
-+      /*
-+       * In PAE mode, the NX bit needs to be dealt with in the value
-+       * passed to pfn_to_mfn(). On x86_64, we need to mask it off,
-+       * but for i386 the conversion to ulong for the argument will
-+       * clip it off.
-+       */
-+      maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-+      machine = (machine << PAGE_SHIFT) | (phys & ~PHYSICAL_PAGE_MASK);
-+      return machine;
-+}
-+
-+static inline paddr_t pte_machine_to_phys(maddr_t machine)
-+{
-+      /*
-+       * In PAE mode, the NX bit needs to be dealt with in the value
-+       * passed to mfn_to_pfn(). On x86_64, we need to mask it off,
-+       * but for i386 the conversion to ulong for the argument will
-+       * clip it off.
-+       */
-+      paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-+      phys = (phys << PAGE_SHIFT) | (machine & ~PHYSICAL_PAGE_MASK);
-+      return phys;
-+}
-+#endif
-+
-+#ifdef CONFIG_X86_PAE
-+#define __pte_ma(x)   ((pte_t) { (x), (maddr_t)(x) >> 32 } )
-+static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
-+{
-+      pte_t pte;
-+
-+      pte.pte_high = (page_nr >> (32 - PAGE_SHIFT)) | \
-+                                      (pgprot_val(pgprot) >> 32);
-+      pte.pte_high &= (__supported_pte_mask >> 32);
-+      pte.pte_low = ((page_nr << PAGE_SHIFT) | pgprot_val(pgprot)) & \
-+                                                      __supported_pte_mask;
-+      return pte;
-+}
-+#else
-+#define __pte_ma(x)   ((pte_t) { (x) } )
-+#define pfn_pte_ma(pfn, prot) __pte_ma(((pfn) << PAGE_SHIFT) | pgprot_val(prot))
-+#endif
-+
-+#else /* !CONFIG_XEN */
-+
-+#define pfn_to_mfn(pfn) (pfn)
-+#define mfn_to_pfn(mfn) (mfn)
-+#define mfn_to_local_pfn(mfn) (mfn)
-+#define set_phys_to_machine(pfn, mfn) ((void)0)
-+#define phys_to_machine_mapping_valid(pfn) (1)
-+#define phys_to_machine(phys) ((maddr_t)(phys))
-+#define machine_to_phys(mach) ((paddr_t)(mach))
-+#define pfn_pte_ma(pfn, prot) pfn_pte(pfn, prot)
-+#define __pte_ma(x) __pte(x)
-+
-+#endif /* !CONFIG_XEN */
-+
-+/* VIRT <-> MACHINE conversion */
-+#define virt_to_machine(v)    (phys_to_machine(__pa(v)))
-+#define virt_to_mfn(v)                (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-+#define mfn_to_virt(m)                (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-+
-+#endif /* _I386_MADDR_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/mmu_context_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/mmu_context_32.h      2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,108 @@
-+#ifndef __I386_SCHED_H
-+#define __I386_SCHED_H
-+
-+#include <asm/desc.h>
-+#include <asm/atomic.h>
-+#include <asm/pgalloc.h>
-+#include <asm/tlbflush.h>
-+
-+/*
-+ * Used for LDT copy/destruction.
-+ */
-+int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
-+void destroy_context(struct mm_struct *mm);
-+
-+
-+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-+{
-+#if 0 /* XEN: no lazy tlb */
-+      unsigned cpu = smp_processor_id();
-+      if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK)
-+              per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_LAZY;
-+#endif
-+}
-+
-+#define prepare_arch_switch(next)     __prepare_arch_switch()
-+
-+static inline void __prepare_arch_switch(void)
-+{
-+      /*
-+       * Save away %fs and %gs. No need to save %es and %ds, as those
-+       * are always kernel segments while inside the kernel. Must
-+       * happen before reload of cr3/ldt (i.e., not in __switch_to).
-+       */
-+      asm volatile ( "mov %%fs,%0 ; mov %%gs,%1"
-+              : "=m" (current->thread.fs),
-+                "=m" (current->thread.gs));
-+      asm volatile ( "movl %0,%%fs ; movl %0,%%gs"
-+              : : "r" (0) );
-+}
-+
-+extern void mm_pin(struct mm_struct *mm);
-+extern void mm_unpin(struct mm_struct *mm);
-+void mm_pin_all(void);
-+
-+static inline void switch_mm(struct mm_struct *prev,
-+                           struct mm_struct *next,
-+                           struct task_struct *tsk)
-+{
-+      int cpu = smp_processor_id();
-+      struct mmuext_op _op[2], *op = _op;
-+
-+      if (likely(prev != next)) {
-+              BUG_ON(!xen_feature(XENFEAT_writable_page_tables) &&
-+                     !test_bit(PG_pinned, &virt_to_page(next->pgd)->flags));
-+
-+              /* stop flush ipis for the previous mm */
-+              cpu_clear(cpu, prev->cpu_vm_mask);
-+#if 0 /* XEN: no lazy tlb */
-+              per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK;
-+              per_cpu(cpu_tlbstate, cpu).active_mm = next;
-+#endif
-+              cpu_set(cpu, next->cpu_vm_mask);
-+
-+              /* Re-load page tables: load_cr3(next->pgd) */
-+              op->cmd = MMUEXT_NEW_BASEPTR;
-+              op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
-+              op++;
-+
-+              /*
-+               * load the LDT, if the LDT is different:
-+               */
-+              if (unlikely(prev->context.ldt != next->context.ldt)) {
-+                      /* load_LDT_nolock(&next->context, cpu) */
-+                      op->cmd = MMUEXT_SET_LDT;
-+                      op->arg1.linear_addr = (unsigned long)next->context.ldt;
-+                      op->arg2.nr_ents     = next->context.size;
-+                      op++;
-+              }
-+
-+              BUG_ON(HYPERVISOR_mmuext_op(_op, op-_op, NULL, DOMID_SELF));
-+      }
-+#if 0 /* XEN: no lazy tlb */
-+      else {
-+              per_cpu(cpu_tlbstate, cpu).state = TLBSTATE_OK;
-+              BUG_ON(per_cpu(cpu_tlbstate, cpu).active_mm != next);
-+
-+              if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
-+                      /* We were in lazy tlb mode and leave_mm disabled 
-+                       * tlb flush IPI delivery. We must reload %cr3.
-+                       */
-+                      load_cr3(next->pgd);
-+                      load_LDT_nolock(&next->context, cpu);
-+              }
-+      }
-+#endif
-+}
-+
-+#define deactivate_mm(tsk, mm) \
-+      asm("movl %0,%%fs ; movl %0,%%gs": :"r" (0))
-+
-+static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
-+{
-+      if (!test_bit(PG_pinned, &virt_to_page(next->pgd)->flags))
-+              mm_pin(next);
-+      switch_mm(prev, next, NULL);
-+}
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pci_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pci_32.h      2007-09-14 11:14:51.000000000 +0200
-@@ -0,0 +1,148 @@
-+#ifndef __i386_PCI_H
-+#define __i386_PCI_H
-+
-+
-+#ifdef __KERNEL__
-+#include <linux/mm.h>         /* for struct page */
-+
-+/* Can be used to override the logic in pci_scan_bus for skipping
-+   already-configured bus numbers - to be used for buggy BIOSes
-+   or architectures with incomplete PCI setup by the loader */
-+
-+#ifdef CONFIG_PCI
-+extern unsigned int pcibios_assign_all_busses(void);
-+#else
-+#define pcibios_assign_all_busses()   0
-+#endif
-+
-+#include <asm/hypervisor.h>
-+#define pcibios_scan_all_fns(a, b)    (!is_initial_xendomain())
-+
-+extern unsigned long pci_mem_start;
-+#define PCIBIOS_MIN_IO                0x1000
-+#define PCIBIOS_MIN_MEM               (pci_mem_start)
-+
-+#define PCIBIOS_MIN_CARDBUS_IO        0x4000
-+
-+void pcibios_config_init(void);
-+struct pci_bus * pcibios_scan_root(int bus);
-+
-+void pcibios_set_master(struct pci_dev *dev);
-+void pcibios_penalize_isa_irq(int irq, int active);
-+struct irq_routing_table *pcibios_get_irq_routing_table(void);
-+int pcibios_set_irq_routing(struct pci_dev *dev, int pin, int irq);
-+
-+/* Dynamic DMA mapping stuff.
-+ * i386 has everything mapped statically.
-+ */
-+
-+#include <linux/types.h>
-+#include <linux/slab.h>
-+#include <asm/scatterlist.h>
-+#include <linux/string.h>
-+#include <asm/io.h>
-+
-+struct pci_dev;
-+
-+#ifdef CONFIG_SWIOTLB
-+
-+
-+/* On Xen we use SWIOTLB instead of blk-specific bounce buffers. */
-+#define PCI_DMA_BUS_IS_PHYS   (0)
-+
-+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)     \
-+      dma_addr_t ADDR_NAME;
-+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)               \
-+      __u32 LEN_NAME;
-+#define pci_unmap_addr(PTR, ADDR_NAME)                        \
-+      ((PTR)->ADDR_NAME)
-+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)               \
-+      (((PTR)->ADDR_NAME) = (VAL))
-+#define pci_unmap_len(PTR, LEN_NAME)                  \
-+      ((PTR)->LEN_NAME)
-+#define pci_unmap_len_set(PTR, LEN_NAME, VAL)         \
-+      (((PTR)->LEN_NAME) = (VAL))
-+
-+#else
-+
-+/* The PCI address space does equal the physical memory
-+ * address space.  The networking and block device layers use
-+ * this boolean for bounce buffer decisions.
-+ */
-+#define PCI_DMA_BUS_IS_PHYS   (1)
-+
-+/* pci_unmap_{page,single} is a nop so... */
-+#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
-+#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
-+#define pci_unmap_addr(PTR, ADDR_NAME)                (0)
-+#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)       do { } while (0)
-+#define pci_unmap_len(PTR, LEN_NAME)          (0)
-+#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
-+
-+#endif
-+
-+/* This is always fine. */
-+#define pci_dac_dma_supported(pci_dev, mask)  (1)
-+
-+static inline dma64_addr_t
-+pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction)
-+{
-+      return ((dma64_addr_t) page_to_phys(page) +
-+              (dma64_addr_t) offset);
-+}
-+
-+static inline struct page *
-+pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
-+{
-+      return pfn_to_page(dma_addr >> PAGE_SHIFT);
-+}
-+
-+static inline unsigned long
-+pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr)
-+{
-+      return (dma_addr & ~PAGE_MASK);
-+}
-+
-+static inline void
-+pci_dac_dma_sync_single_for_cpu(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-+{
-+}
-+
-+static inline void
-+pci_dac_dma_sync_single_for_device(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
-+{
-+      flush_write_buffers();
-+}
-+
-+#define HAVE_PCI_MMAP
-+extern int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
-+                             enum pci_mmap_state mmap_state, int write_combine);
-+
-+
-+static inline void pcibios_add_platform_entries(struct pci_dev *dev)
-+{
-+}
-+
-+#ifdef CONFIG_PCI
-+static inline void pci_dma_burst_advice(struct pci_dev *pdev,
-+                                      enum pci_dma_burst_strategy *strat,
-+                                      unsigned long *strategy_parameter)
-+{
-+      *strat = PCI_DMA_BURST_INFINITY;
-+      *strategy_parameter = ~0UL;
-+}
-+#endif
-+
-+#endif /* __KERNEL__ */
-+
-+#ifdef CONFIG_XEN_PCIDEV_FRONTEND
-+#include <xen/pcifront.h>
-+#endif /* CONFIG_XEN_PCIDEV_FRONTEND */
-+
-+/* implement the pci_ DMA API in terms of the generic device dma_ one */
-+#include <asm-generic/pci-dma-compat.h>
-+
-+/* generic pci stuff */
-+#include <asm-generic/pci.h>
-+
-+#endif /* __i386_PCI_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgalloc_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgalloc_32.h  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,59 @@
-+#ifndef _I386_PGALLOC_H
-+#define _I386_PGALLOC_H
-+
-+#include <asm/fixmap.h>
-+#include <linux/threads.h>
-+#include <linux/mm.h>         /* for struct page */
-+#include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
-+
-+#define pmd_populate_kernel(mm, pmd, pte) \
-+              set_pmd(pmd, __pmd(_PAGE_TABLE + __pa(pte)))
-+
-+#define pmd_populate(mm, pmd, pte)                                    \
-+do {                                                                  \
-+      unsigned long pfn = page_to_pfn(pte);                           \
-+      if (test_bit(PG_pinned, &virt_to_page((mm)->pgd)->flags)) {     \
-+              if (!PageHighMem(pte))                                  \
-+                      BUG_ON(HYPERVISOR_update_va_mapping(            \
-+                        (unsigned long)__va(pfn << PAGE_SHIFT),       \
-+                        pfn_pte(pfn, PAGE_KERNEL_RO), 0));            \
-+              else if (!test_and_set_bit(PG_pinned, &pte->flags))     \
-+                      kmap_flush_unused();                            \
-+              set_pmd(pmd,                                            \
-+                      __pmd(_PAGE_TABLE + ((paddr_t)pfn << PAGE_SHIFT))); \
-+      } else                                                  \
-+              *(pmd) = __pmd(_PAGE_TABLE + ((paddr_t)pfn << PAGE_SHIFT)); \
-+} while (0)
-+
-+/*
-+ * Allocate and free page tables.
-+ */
-+extern pgd_t *pgd_alloc(struct mm_struct *);
-+extern void pgd_free(pgd_t *pgd);
-+
-+extern pte_t *pte_alloc_one_kernel(struct mm_struct *, unsigned long);
-+extern struct page *pte_alloc_one(struct mm_struct *, unsigned long);
-+
-+static inline void pte_free_kernel(pte_t *pte)
-+{
-+      make_lowmem_page_writable(pte, XENFEAT_writable_page_tables);
-+      free_page((unsigned long)pte);
-+}
-+
-+extern void pte_free(struct page *pte);
-+
-+#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
-+
-+#ifdef CONFIG_X86_PAE
-+/*
-+ * In the PAE case we free the pmds as part of the pgd.
-+ */
-+#define pmd_alloc_one(mm, addr)               ({ BUG(); ((pmd_t *)2); })
-+#define pmd_free(x)                   do { } while (0)
-+#define __pmd_free_tlb(tlb,x)         do { } while (0)
-+#define pud_populate(mm, pmd, pte)    BUG()
-+#endif
-+
-+#define check_pgt_cache()     do { } while (0)
-+
-+#endif /* _I386_PGALLOC_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h 2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,24 @@
-+#ifndef _I386_PGTABLE_3LEVEL_DEFS_H
-+#define _I386_PGTABLE_3LEVEL_DEFS_H
-+
-+#define HAVE_SHARED_KERNEL_PMD 0
-+
-+/*
-+ * PGDIR_SHIFT determines what a top-level page table entry can map
-+ */
-+#define PGDIR_SHIFT   30
-+#define PTRS_PER_PGD  4
-+
-+/*
-+ * PMD_SHIFT determines the size of the area a middle-level
-+ * page table can map
-+ */
-+#define PMD_SHIFT     21
-+#define PTRS_PER_PMD  512
-+
-+/*
-+ * entries per page directory level
-+ */
-+#define PTRS_PER_PTE  512
-+
-+#endif /* _I386_PGTABLE_3LEVEL_DEFS_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable-3level.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable-3level.h      2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,211 @@
-+#ifndef _I386_PGTABLE_3LEVEL_H
-+#define _I386_PGTABLE_3LEVEL_H
-+
-+#include <asm-generic/pgtable-nopud.h>
-+
-+/*
-+ * Intel Physical Address Extension (PAE) Mode - three-level page
-+ * tables on PPro+ CPUs.
-+ *
-+ * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
-+ */
-+
-+#define pte_ERROR(e) \
-+      printk("%s:%d: bad pte %p(%016Lx pfn %08lx).\n", __FILE__, __LINE__, \
-+             &(e), __pte_val(e), pte_pfn(e))
-+#define pmd_ERROR(e) \
-+      printk("%s:%d: bad pmd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
-+             &(e), __pmd_val(e), (pmd_val(e) & PTE_MASK) >> PAGE_SHIFT)
-+#define pgd_ERROR(e) \
-+      printk("%s:%d: bad pgd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
-+             &(e), __pgd_val(e), (pgd_val(e) & PTE_MASK) >> PAGE_SHIFT)
-+
-+#define pud_none(pud)                         0
-+#define pud_bad(pud)                          0
-+#define pud_present(pud)                      1
-+
-+/*
-+ * Is the pte executable?
-+ */
-+static inline int pte_x(pte_t pte)
-+{
-+      return !(__pte_val(pte) & _PAGE_NX);
-+}
-+
-+/*
-+ * All present user-pages with !NX bit are user-executable:
-+ */
-+static inline int pte_exec(pte_t pte)
-+{
-+      return pte_user(pte) && pte_x(pte);
-+}
-+/*
-+ * All present pages with !NX bit are kernel-executable:
-+ */
-+static inline int pte_exec_kernel(pte_t pte)
-+{
-+      return pte_x(pte);
-+}
-+
-+/* Rules for using set_pte: the pte being assigned *must* be
-+ * either not present or in a state where the hardware will
-+ * not attempt to update the pte.  In places where this is
-+ * not possible, use pte_get_and_clear to obtain the old pte
-+ * value and then use set_pte to update it.  -ben
-+ */
-+#define __HAVE_ARCH_SET_PTE_ATOMIC
-+
-+static inline void set_pte(pte_t *ptep, pte_t pte)
-+{
-+      ptep->pte_high = pte.pte_high;
-+      smp_wmb();
-+      ptep->pte_low = pte.pte_low;
-+}
-+#define set_pte_atomic(pteptr,pteval) \
-+              set_64bit((unsigned long long *)(pteptr),__pte_val(pteval))
-+
-+#define set_pte_at(_mm,addr,ptep,pteval) do {                         \
-+      if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-+          HYPERVISOR_update_va_mapping((addr), (pteval), 0))          \
-+              set_pte((ptep), (pteval));                              \
-+} while (0)
-+
-+#define set_pte_at_sync(_mm,addr,ptep,pteval) do {                    \
-+      if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-+          HYPERVISOR_update_va_mapping((addr), (pteval), UVMF_INVLPG)) { \
-+              set_pte((ptep), (pteval));                              \
-+              xen_invlpg((addr));                                     \
-+      }                                                               \
-+} while (0)
-+
-+#define set_pmd(pmdptr,pmdval)                                \
-+              xen_l2_entry_update((pmdptr), (pmdval))
-+#define set_pud(pudptr,pudval) \
-+              xen_l3_entry_update((pudptr), (pudval))
-+
-+/*
-+ * Pentium-II erratum A13: in PAE mode we explicitly have to flush
-+ * the TLB via cr3 if the top-level pgd is changed...
-+ * We do not let the generic code free and clear pgd entries due to
-+ * this erratum.
-+ */
-+static inline void pud_clear (pud_t * pud) { }
-+
-+#define pud_page(pud) \
-+((struct page *) __va(pud_val(pud) & PAGE_MASK))
-+
-+#define pud_page_kernel(pud) \
-+((unsigned long) __va(pud_val(pud) & PAGE_MASK))
-+
-+
-+/* Find an entry in the second-level page table.. */
-+#define pmd_offset(pud, address) ((pmd_t *) pud_page(*(pud)) + \
-+                      pmd_index(address))
-+
-+static inline int pte_none(pte_t pte)
-+{
-+      return !(pte.pte_low | pte.pte_high);
-+}
-+
-+/*
-+ * For PTEs and PDEs, we must clear the P-bit first when clearing a page table
-+ * entry, so clear the bottom half first and enforce ordering with a compiler
-+ * barrier.
-+ */
-+static inline void pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      if ((mm != current->mm && mm != &init_mm)
-+          || HYPERVISOR_update_va_mapping(addr, __pte(0), 0)) {
-+              ptep->pte_low = 0;
-+              smp_wmb();
-+              ptep->pte_high = 0;
-+      }
-+}
-+
-+#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
-+
-+static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      pte_t pte = *ptep;
-+      if (!pte_none(pte)) {
-+              if ((mm != &init_mm) ||
-+                  HYPERVISOR_update_va_mapping(addr, __pte(0), 0)) {
-+                      uint64_t val = __pte_val(pte);
-+                      if (__cmpxchg64(ptep, val, 0) != val) {
-+                              /* xchg acts as a barrier before the setting of the high bits */
-+                              pte.pte_low = xchg(&ptep->pte_low, 0);
-+                              pte.pte_high = ptep->pte_high;
-+                              ptep->pte_high = 0;
-+                      }
-+              }
-+      }
-+      return pte;
-+}
-+
-+#define ptep_clear_flush(vma, addr, ptep)                     \
-+({                                                            \
-+      pte_t *__ptep = (ptep);                                 \
-+      pte_t __res = *__ptep;                                  \
-+      if (!pte_none(__res) &&                                 \
-+          ((vma)->vm_mm != current->mm ||                     \
-+           HYPERVISOR_update_va_mapping(addr, __pte(0),       \
-+                      (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-+                              UVMF_INVLPG|UVMF_MULTI))) {     \
-+              __ptep->pte_low = 0;                            \
-+              smp_wmb();                                      \
-+              __ptep->pte_high = 0;                           \
-+              flush_tlb_page(vma, addr);                      \
-+      }                                                       \
-+      __res;                                                  \
-+})
-+
-+static inline int pte_same(pte_t a, pte_t b)
-+{
-+      return a.pte_low == b.pte_low && a.pte_high == b.pte_high;
-+}
-+
-+#define pte_page(x)   pfn_to_page(pte_pfn(x))
-+
-+#define __pte_mfn(_pte) (((_pte).pte_low >> PAGE_SHIFT) | \
-+                       ((_pte).pte_high << (32-PAGE_SHIFT)))
-+#define pte_mfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
-+      __pte_mfn(_pte) : pfn_to_mfn(__pte_mfn(_pte)))
-+#define pte_pfn(_pte) ((_pte).pte_low & _PAGE_IO ? max_mapnr :        \
-+                     (_pte).pte_low & _PAGE_PRESENT ?         \
-+                     mfn_to_local_pfn(__pte_mfn(_pte)) :      \
-+                     __pte_mfn(_pte))
-+
-+extern unsigned long long __supported_pte_mask;
-+
-+static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
-+{
-+      return __pte((((unsigned long long)page_nr << PAGE_SHIFT) |
-+                      pgprot_val(pgprot)) & __supported_pte_mask);
-+}
-+
-+static inline pmd_t pfn_pmd(unsigned long page_nr, pgprot_t pgprot)
-+{
-+      return __pmd((((unsigned long long)page_nr << PAGE_SHIFT) |
-+                      pgprot_val(pgprot)) & __supported_pte_mask);
-+}
-+
-+/*
-+ * Bits 0, 6 and 7 are taken in the low part of the pte,
-+ * put the 32 bits of offset into the high part.
-+ */
-+#define pte_to_pgoff(pte) ((pte).pte_high)
-+#define pgoff_to_pte(off) ((pte_t) { _PAGE_FILE, (off) })
-+#define PTE_FILE_MAX_BITS       32
-+
-+/* Encode and de-code a swap entry */
-+#define __swp_type(x)                 (((x).val) & 0x1f)
-+#define __swp_offset(x)                       ((x).val >> 5)
-+#define __swp_entry(type, offset)     ((swp_entry_t){(type) | (offset) << 5})
-+#define __pte_to_swp_entry(pte)               ((swp_entry_t){ (pte).pte_high })
-+#define __swp_entry_to_pte(x)         ((pte_t){ 0, (x).val })
-+
-+#define __pmd_free_tlb(tlb, x)                do { } while (0)
-+
-+void vmalloc_sync_all(void);
-+
-+#endif /* _I386_PGTABLE_3LEVEL_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable_32.h  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,537 @@
-+#ifndef _I386_PGTABLE_H
-+#define _I386_PGTABLE_H
-+
-+#include <asm/hypervisor.h>
-+
-+/*
-+ * The Linux memory management assumes a three-level page table setup. On
-+ * the i386, we use that, but "fold" the mid level into the top-level page
-+ * table, so that we physically have the same two-level page table as the
-+ * i386 mmu expects.
-+ *
-+ * This file contains the functions and defines necessary to modify and use
-+ * the i386 page table tree.
-+ */
-+#ifndef __ASSEMBLY__
-+#include <asm/processor.h>
-+#include <asm/fixmap.h>
-+#include <linux/threads.h>
-+
-+#ifndef _I386_BITOPS_H
-+#include <asm/bitops.h>
-+#endif
-+
-+#include <linux/slab.h>
-+#include <linux/list.h>
-+#include <linux/spinlock.h>
-+
-+/* Is this pagetable pinned? */
-+#define PG_pinned     PG_arch_1
-+
-+struct mm_struct;
-+struct vm_area_struct;
-+
-+/*
-+ * ZERO_PAGE is a global shared page that is always zero: used
-+ * for zero-mapped memory areas etc..
-+ */
-+#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-+extern unsigned long empty_zero_page[1024];
-+extern pgd_t *swapper_pg_dir;
-+extern kmem_cache_t *pgd_cache;
-+extern kmem_cache_t *pmd_cache;
-+extern spinlock_t pgd_lock;
-+extern struct page *pgd_list;
-+
-+void pmd_ctor(void *, kmem_cache_t *, unsigned long);
-+void pgd_ctor(void *, kmem_cache_t *, unsigned long);
-+void pgd_dtor(void *, kmem_cache_t *, unsigned long);
-+void pgtable_cache_init(void);
-+void paging_init(void);
-+
-+/*
-+ * The Linux x86 paging architecture is 'compile-time dual-mode', it
-+ * implements both the traditional 2-level x86 page tables and the
-+ * newer 3-level PAE-mode page tables.
-+ */
-+#ifdef CONFIG_X86_PAE
-+# include <asm/pgtable-3level-defs.h>
-+# define PMD_SIZE     (1UL << PMD_SHIFT)
-+# define PMD_MASK     (~(PMD_SIZE-1))
-+#else
-+# include <asm/pgtable-2level-defs.h>
-+#endif
-+
-+#define PGDIR_SIZE    (1UL << PGDIR_SHIFT)
-+#define PGDIR_MASK    (~(PGDIR_SIZE-1))
-+
-+#define USER_PTRS_PER_PGD     (TASK_SIZE/PGDIR_SIZE)
-+#define FIRST_USER_ADDRESS    0
-+
-+#define USER_PGD_PTRS (PAGE_OFFSET >> PGDIR_SHIFT)
-+#define KERNEL_PGD_PTRS (PTRS_PER_PGD-USER_PGD_PTRS)
-+
-+#define TWOLEVEL_PGDIR_SHIFT  22
-+#define BOOT_USER_PGD_PTRS (__PAGE_OFFSET >> TWOLEVEL_PGDIR_SHIFT)
-+#define BOOT_KERNEL_PGD_PTRS (1024-BOOT_USER_PGD_PTRS)
-+
-+/* Just any arbitrary offset to the start of the vmalloc VM area: the
-+ * current 8MB value just means that there will be a 8MB "hole" after the
-+ * physical memory until the kernel virtual memory starts.  That means that
-+ * any out-of-bounds memory accesses will hopefully be caught.
-+ * The vmalloc() routines leaves a hole of 4kB between each vmalloced
-+ * area for the same reason. ;)
-+ */
-+#define VMALLOC_OFFSET        (8*1024*1024)
-+#define VMALLOC_START (((unsigned long) high_memory + vmalloc_earlyreserve + \
-+                      2*VMALLOC_OFFSET-1) & ~(VMALLOC_OFFSET-1))
-+#ifdef CONFIG_HIGHMEM
-+# define VMALLOC_END  (PKMAP_BASE-2*PAGE_SIZE)
-+#else
-+# define VMALLOC_END  (FIXADDR_START-2*PAGE_SIZE)
-+#endif
-+
-+/*
-+ * _PAGE_PSE set in the page directory entry just means that
-+ * the page directory entry points directly to a 4MB-aligned block of
-+ * memory. 
-+ */
-+#define _PAGE_BIT_PRESENT     0
-+#define _PAGE_BIT_RW          1
-+#define _PAGE_BIT_USER                2
-+#define _PAGE_BIT_PWT         3
-+#define _PAGE_BIT_PCD         4
-+#define _PAGE_BIT_ACCESSED    5
-+#define _PAGE_BIT_DIRTY               6
-+#define _PAGE_BIT_PSE         7       /* 4 MB (or 2MB) page, Pentium+, if present.. */
-+#define _PAGE_BIT_GLOBAL      8       /* Global TLB entry PPro+ */
-+/*#define _PAGE_BIT_UNUSED1   9*/     /* available for programmer */
-+#define _PAGE_BIT_UNUSED2     10
-+#define _PAGE_BIT_UNUSED3     11
-+#define _PAGE_BIT_NX          63
-+
-+#define _PAGE_PRESENT 0x001
-+#define _PAGE_RW      0x002
-+#define _PAGE_USER    0x004
-+#define _PAGE_PWT     0x008
-+#define _PAGE_PCD     0x010
-+#define _PAGE_ACCESSED        0x020
-+#define _PAGE_DIRTY   0x040
-+#define _PAGE_PSE     0x080   /* 4 MB (or 2MB) page, Pentium+, if present.. */
-+#define _PAGE_GLOBAL  0x100   /* Global TLB entry PPro+ */
-+/*#define _PAGE_UNUSED1       0x200*/ /* available for programmer */
-+#define _PAGE_UNUSED2 0x400
-+#define _PAGE_UNUSED3 0x800
-+
-+/* If _PAGE_PRESENT is clear, we use these: */
-+#define _PAGE_FILE    0x040   /* nonlinear file mapping, saved PTE; unset:swap */
-+#define _PAGE_PROTNONE        0x080   /* if the user mapped it with PROT_NONE;
-+                                 pte_present gives true */
-+#ifdef CONFIG_X86_PAE
-+#define _PAGE_NX      (1ULL<<_PAGE_BIT_NX)
-+#else
-+#define _PAGE_NX      0
-+#endif
-+
-+/* Mapped page is I/O or foreign and has no associated page struct. */
-+#define _PAGE_IO      0x200
-+
-+#define _PAGE_TABLE   (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-+#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY)
-+#define _PAGE_CHG_MASK        (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_IO)
-+
-+#define PAGE_NONE \
-+      __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-+#define PAGE_SHARED \
-+      __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-+
-+#define PAGE_SHARED_EXEC \
-+      __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_COPY_NOEXEC \
-+      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-+#define PAGE_COPY_EXEC \
-+      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_COPY \
-+      PAGE_COPY_NOEXEC
-+#define PAGE_READONLY \
-+      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-+#define PAGE_READONLY_EXEC \
-+      __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+
-+#define _PAGE_KERNEL \
-+      (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX)
-+#define _PAGE_KERNEL_EXEC \
-+      (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED)
-+
-+extern unsigned long long __PAGE_KERNEL, __PAGE_KERNEL_EXEC;
-+#define __PAGE_KERNEL_RO              (__PAGE_KERNEL & ~_PAGE_RW)
-+#define __PAGE_KERNEL_NOCACHE         (__PAGE_KERNEL | _PAGE_PCD)
-+#define __PAGE_KERNEL_LARGE           (__PAGE_KERNEL | _PAGE_PSE)
-+#define __PAGE_KERNEL_LARGE_EXEC      (__PAGE_KERNEL_EXEC | _PAGE_PSE)
-+
-+#define PAGE_KERNEL           __pgprot(__PAGE_KERNEL)
-+#define PAGE_KERNEL_RO                __pgprot(__PAGE_KERNEL_RO)
-+#define PAGE_KERNEL_EXEC      __pgprot(__PAGE_KERNEL_EXEC)
-+#define PAGE_KERNEL_NOCACHE   __pgprot(__PAGE_KERNEL_NOCACHE)
-+#define PAGE_KERNEL_LARGE     __pgprot(__PAGE_KERNEL_LARGE)
-+#define PAGE_KERNEL_LARGE_EXEC        __pgprot(__PAGE_KERNEL_LARGE_EXEC)
-+
-+/*
-+ * The i386 can't do page protection for execute, and considers that
-+ * the same are read. Also, write permissions imply read permissions.
-+ * This is the closest we can get..
-+ */
-+#define __P000        PAGE_NONE
-+#define __P001        PAGE_READONLY
-+#define __P010        PAGE_COPY
-+#define __P011        PAGE_COPY
-+#define __P100        PAGE_READONLY_EXEC
-+#define __P101        PAGE_READONLY_EXEC
-+#define __P110        PAGE_COPY_EXEC
-+#define __P111        PAGE_COPY_EXEC
-+
-+#define __S000        PAGE_NONE
-+#define __S001        PAGE_READONLY
-+#define __S010        PAGE_SHARED
-+#define __S011        PAGE_SHARED
-+#define __S100        PAGE_READONLY_EXEC
-+#define __S101        PAGE_READONLY_EXEC
-+#define __S110        PAGE_SHARED_EXEC
-+#define __S111        PAGE_SHARED_EXEC
-+
-+/*
-+ * Define this if things work differently on an i386 and an i486:
-+ * it will (on an i486) warn about kernel memory accesses that are
-+ * done without a 'access_ok(VERIFY_WRITE,..)'
-+ */
-+#undef TEST_ACCESS_OK
-+
-+/* The boot page tables (all created as a single array) */
-+extern unsigned long pg0[];
-+
-+#define pte_present(x)        ((x).pte_low & (_PAGE_PRESENT | _PAGE_PROTNONE))
-+
-+/* To avoid harmful races, pmd_none(x) should check only the lower when PAE */
-+#define pmd_none(x)   (!(unsigned long)__pmd_val(x))
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+/* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
-+   can temporarily clear it. */
-+#define pmd_present(x)        (__pmd_val(x))
-+#define pmd_bad(x)    ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER & ~_PAGE_PRESENT)) != (_KERNPG_TABLE & ~_PAGE_PRESENT))
-+#else
-+#define pmd_present(x)        (__pmd_val(x) & _PAGE_PRESENT)
-+#define pmd_bad(x)    ((__pmd_val(x) & (~PAGE_MASK & ~_PAGE_USER)) != _KERNPG_TABLE)
-+#endif
-+
-+
-+#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-+
-+/*
-+ * The following only work if pte_present() is true.
-+ * Undefined behaviour if not..
-+ */
-+static inline int pte_user(pte_t pte)         { return (pte).pte_low & _PAGE_USER; }
-+static inline int pte_read(pte_t pte)         { return (pte).pte_low & _PAGE_USER; }
-+static inline int pte_dirty(pte_t pte)                { return (pte).pte_low & _PAGE_DIRTY; }
-+static inline int pte_young(pte_t pte)                { return (pte).pte_low & _PAGE_ACCESSED; }
-+static inline int pte_write(pte_t pte)                { return (pte).pte_low & _PAGE_RW; }
-+static inline int pte_huge(pte_t pte)         { return (pte).pte_low & _PAGE_PSE; }
-+
-+/*
-+ * The following only works if pte_present() is not true.
-+ */
-+static inline int pte_file(pte_t pte)         { return (pte).pte_low & _PAGE_FILE; }
-+
-+static inline pte_t pte_rdprotect(pte_t pte)  { (pte).pte_low &= ~_PAGE_USER; return pte; }
-+static inline pte_t pte_exprotect(pte_t pte)  { (pte).pte_low &= ~_PAGE_USER; return pte; }
-+static inline pte_t pte_mkclean(pte_t pte)    { (pte).pte_low &= ~_PAGE_DIRTY; return pte; }
-+static inline pte_t pte_mkold(pte_t pte)      { (pte).pte_low &= ~_PAGE_ACCESSED; return pte; }
-+static inline pte_t pte_wrprotect(pte_t pte)  { (pte).pte_low &= ~_PAGE_RW; return pte; }
-+static inline pte_t pte_mkread(pte_t pte)     { (pte).pte_low |= _PAGE_USER; return pte; }
-+static inline pte_t pte_mkexec(pte_t pte)     { (pte).pte_low |= _PAGE_USER; return pte; }
-+static inline pte_t pte_mkdirty(pte_t pte)    { (pte).pte_low |= _PAGE_DIRTY; return pte; }
-+static inline pte_t pte_mkyoung(pte_t pte)    { (pte).pte_low |= _PAGE_ACCESSED; return pte; }
-+static inline pte_t pte_mkwrite(pte_t pte)    { (pte).pte_low |= _PAGE_RW; return pte; }
-+static inline pte_t pte_mkhuge(pte_t pte)     { (pte).pte_low |= _PAGE_PSE; return pte; }
-+
-+#ifdef CONFIG_X86_PAE
-+# include <asm/pgtable-3level.h>
-+#else
-+# include <asm/pgtable-2level.h>
-+#endif
-+
-+#define ptep_test_and_clear_dirty(vma, addr, ptep)                    \
-+({                                                                    \
-+      pte_t __pte = *(ptep);                                          \
-+      int __ret = pte_dirty(__pte);                                   \
-+      if (__ret) {                                                    \
-+              __pte = pte_mkclean(__pte);                             \
-+              if ((vma)->vm_mm != current->mm ||                      \
-+                  HYPERVISOR_update_va_mapping(addr, __pte, 0))       \
-+                      (ptep)->pte_low = __pte.pte_low;                \
-+      }                                                               \
-+      __ret;                                                          \
-+})
-+
-+#define ptep_test_and_clear_young(vma, addr, ptep)                    \
-+({                                                                    \
-+      pte_t __pte = *(ptep);                                          \
-+      int __ret = pte_young(__pte);                                   \
-+      if (__ret)                                                      \
-+              __pte = pte_mkold(__pte);                               \
-+              if ((vma)->vm_mm != current->mm ||                      \
-+                  HYPERVISOR_update_va_mapping(addr, __pte, 0))       \
-+                      (ptep)->pte_low = __pte.pte_low;                \
-+      __ret;                                                          \
-+})
-+
-+#define ptep_get_and_clear_full(mm, addr, ptep, full)                 \
-+      ((full) ? ({                                                    \
-+              pte_t __res = *(ptep);                                  \
-+              if (test_bit(PG_pinned, &virt_to_page((mm)->pgd)->flags)) \
-+                      xen_l1_entry_update(ptep, __pte(0));            \
-+              else                                                    \
-+                      *(ptep) = __pte(0);                             \
-+              __res;                                                  \
-+       }) :                                                           \
-+       ptep_get_and_clear(mm, addr, ptep))
-+
-+static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      pte_t pte = *ptep;
-+      if (pte_write(pte))
-+              set_pte_at(mm, addr, ptep, pte_wrprotect(pte));
-+}
-+
-+/*
-+ * clone_pgd_range(pgd_t *dst, pgd_t *src, int count);
-+ *
-+ *  dst - pointer to pgd range anwhere on a pgd page
-+ *  src - ""
-+ *  count - the number of pgds to copy.
-+ *
-+ * dst and src can be on the same page, but the range must not overlap,
-+ * and must not cross a page boundary.
-+ */
-+static inline void clone_pgd_range(pgd_t *dst, pgd_t *src, int count)
-+{
-+       memcpy(dst, src, count * sizeof(pgd_t));
-+}
-+
-+/*
-+ * Macro to mark a page protection value as "uncacheable".  On processors which do not support
-+ * it, this is a no-op.
-+ */
-+#define pgprot_noncached(prot)        ((boot_cpu_data.x86 > 3)                                          \
-+                               ? (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT)) : (prot))
-+
-+/*
-+ * Conversion functions: convert a page and protection to a page entry,
-+ * and a page entry and page directory to the page they refer to.
-+ */
-+
-+#define mk_pte(page, pgprot)  pfn_pte(page_to_pfn(page), (pgprot))
-+
-+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-+{
-+      /*
-+       * Since this might change the present bit (which controls whether
-+       * a pte_t object has undergone p2m translation), we must use
-+       * pte_val() on the input pte and __pte() for the return value.
-+       */
-+      paddr_t pteval = pte_val(pte);
-+
-+      pteval &= _PAGE_CHG_MASK;
-+      pteval |= pgprot_val(newprot);
-+#ifdef CONFIG_X86_PAE
-+      pteval &= __supported_pte_mask;
-+#endif
-+      return __pte(pteval);
-+}
-+
-+#define pmd_large(pmd) \
-+((__pmd_val(pmd) & (_PAGE_PSE|_PAGE_PRESENT)) == (_PAGE_PSE|_PAGE_PRESENT))
-+
-+/*
-+ * the pgd page can be thought of an array like this: pgd_t[PTRS_PER_PGD]
-+ *
-+ * this macro returns the index of the entry in the pgd page which would
-+ * control the given virtual address
-+ */
-+#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-+#define pgd_index_k(addr) pgd_index(addr)
-+
-+/*
-+ * pgd_offset() returns a (pgd_t *)
-+ * pgd_index() is used get the offset into the pgd page's array of pgd_t's;
-+ */
-+#define pgd_offset(mm, address) ((mm)->pgd+pgd_index(address))
-+
-+/*
-+ * a shortcut which implies the use of the kernel's pgd, instead
-+ * of a process's
-+ */
-+#define pgd_offset_k(address) pgd_offset(&init_mm, address)
-+
-+/*
-+ * the pmd page can be thought of an array like this: pmd_t[PTRS_PER_PMD]
-+ *
-+ * this macro returns the index of the entry in the pmd page which would
-+ * control the given virtual address
-+ */
-+#define pmd_index(address) \
-+              (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-+
-+/*
-+ * the pte page can be thought of an array like this: pte_t[PTRS_PER_PTE]
-+ *
-+ * this macro returns the index of the entry in the pte page which would
-+ * control the given virtual address
-+ */
-+#define pte_index(address) \
-+              (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-+#define pte_offset_kernel(dir, address) \
-+      ((pte_t *) pmd_page_kernel(*(dir)) +  pte_index(address))
-+
-+#define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-+
-+#define pmd_page_kernel(pmd) \
-+              ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK))
-+
-+/*
-+ * Helper function that returns the kernel pagetable entry controlling
-+ * the virtual address 'address'. NULL means no pagetable entry present.
-+ * NOTE: the return type is pte_t but if the pmd is PSE then we return it
-+ * as a pte too.
-+ */
-+extern pte_t *lookup_address(unsigned long address);
-+
-+/*
-+ * Make a given kernel text page executable/non-executable.
-+ * Returns the previous executability setting of that page (which
-+ * is used to restore the previous state). Used by the SMP bootup code.
-+ * NOTE: this is an __init function for security reasons.
-+ */
-+#ifdef CONFIG_X86_PAE
-+ extern int set_kernel_exec(unsigned long vaddr, int enable);
-+#else
-+ static inline int set_kernel_exec(unsigned long vaddr, int enable) { return 0;}
-+#endif
-+
-+extern void noexec_setup(const char *str);
-+
-+#if defined(CONFIG_HIGHPTE)
-+#define pte_offset_map(dir, address) \
-+      ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE0) + \
-+       pte_index(address))
-+#define pte_offset_map_nested(dir, address) \
-+      ((pte_t *)kmap_atomic_pte(pmd_page(*(dir)),KM_PTE1) + \
-+       pte_index(address))
-+#define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
-+#define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
-+#else
-+#define pte_offset_map(dir, address) \
-+      ((pte_t *)page_address(pmd_page(*(dir))) + pte_index(address))
-+#define pte_offset_map_nested(dir, address) pte_offset_map(dir, address)
-+#define pte_unmap(pte) do { } while (0)
-+#define pte_unmap_nested(pte) do { } while (0)
-+#endif
-+
-+#define __HAVE_ARCH_PTEP_ESTABLISH
-+#define ptep_establish(vma, address, ptep, pteval)                    \
-+      do {                                                            \
-+              if ( likely((vma)->vm_mm == current->mm) ) {            \
-+                      BUG_ON(HYPERVISOR_update_va_mapping(address,    \
-+                              pteval,                                 \
-+                              (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-+                                      UVMF_INVLPG|UVMF_MULTI));       \
-+              } else {                                                \
-+                      xen_l1_entry_update(ptep, pteval);              \
-+                      flush_tlb_page(vma, address);                   \
-+              }                                                       \
-+      } while (0)
-+
-+/*
-+ * The i386 doesn't have any external MMU info: the kernel page
-+ * tables contain all the necessary information.
-+ *
-+ * Also, we only update the dirty/accessed state if we set
-+ * the dirty bit by hand in the kernel, since the hardware
-+ * will do the accessed bit for us, and we don't want to
-+ * race with other CPU's that might be updating the dirty
-+ * bit at the same time.
-+ */
-+#define update_mmu_cache(vma,address,pte) do { } while (0)
-+#define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
-+#define ptep_set_access_flags(vma, address, ptep, entry, dirty)               \
-+      do {                                                            \
-+              if (dirty)                                              \
-+                      ptep_establish(vma, address, ptep, entry);      \
-+      } while (0)
-+
-+#include <xen/features.h>
-+void make_lowmem_page_readonly(void *va, unsigned int feature);
-+void make_lowmem_page_writable(void *va, unsigned int feature);
-+void make_page_readonly(void *va, unsigned int feature);
-+void make_page_writable(void *va, unsigned int feature);
-+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
-+void make_pages_writable(void *va, unsigned int nr, unsigned int feature);
-+
-+#define virt_to_ptep(va)                                              \
-+({                                                                    \
-+      pte_t *__ptep = lookup_address((unsigned long)(va));            \
-+      BUG_ON(!__ptep || !pte_present(*__ptep));                       \
-+      __ptep;                                                         \
-+})
-+
-+#define arbitrary_virt_to_machine(va)                                 \
-+      (((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT)            \
-+       | ((unsigned long)(va) & (PAGE_SIZE - 1)))
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#ifdef CONFIG_FLATMEM
-+#define kern_addr_valid(addr) (1)
-+#endif /* CONFIG_FLATMEM */
-+
-+int direct_remap_pfn_range(struct vm_area_struct *vma,
-+                           unsigned long address, 
-+                           unsigned long mfn,
-+                           unsigned long size, 
-+                           pgprot_t prot,
-+                           domid_t  domid);
-+int direct_kernel_remap_pfn_range(unsigned long address, 
-+                                unsigned long mfn,
-+                                unsigned long size, 
-+                                pgprot_t prot,
-+                                domid_t  domid);
-+int create_lookup_pte_addr(struct mm_struct *mm,
-+                           unsigned long address,
-+                           uint64_t *ptep);
-+int touch_pte_range(struct mm_struct *mm,
-+                    unsigned long address,
-+                    unsigned long size);
-+
-+int xen_change_pte_range(struct mm_struct *mm, pmd_t *pmd,
-+              unsigned long addr, unsigned long end, pgprot_t newprot);
-+
-+#define arch_change_pte_range(mm, pmd, addr, end, newprot)    \
-+              xen_change_pte_range(mm, pmd, addr, end, newprot)
-+
-+#define io_remap_pfn_range(vma,from,pfn,size,prot) \
-+direct_remap_pfn_range(vma,from,pfn,size,prot,DOMID_IO)
-+
-+#define MK_IOSPACE_PFN(space, pfn)    (pfn)
-+#define GET_IOSPACE(pfn)              0
-+#define GET_PFN(pfn)                  (pfn)
-+
-+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
-+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
-+#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
-+#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-+#define __HAVE_ARCH_PTE_SAME
-+#include <asm-generic/pgtable.h>
-+
-+#endif /* _I386_PGTABLE_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/processor_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/processor_32.h        2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,743 @@
-+/*
-+ * include/asm-i386/processor.h
-+ *
-+ * Copyright (C) 1994 Linus Torvalds
-+ */
-+
-+#ifndef __ASM_I386_PROCESSOR_H
-+#define __ASM_I386_PROCESSOR_H
-+
-+#include <asm/vm86.h>
-+#include <asm/math_emu.h>
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/types.h>
-+#include <asm/sigcontext.h>
-+#include <asm/cpufeature.h>
-+#include <asm/msr.h>
-+#include <asm/system.h>
-+#include <linux/cache.h>
-+#include <linux/threads.h>
-+#include <asm/percpu.h>
-+#include <linux/cpumask.h>
-+#include <xen/interface/physdev.h>
-+
-+/* flag for disabling the tsc */
-+extern int tsc_disable;
-+
-+struct desc_struct {
-+      unsigned long a,b;
-+};
-+
-+#define desc_empty(desc) \
-+              (!((desc)->a | (desc)->b))
-+
-+#define desc_equal(desc1, desc2) \
-+              (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
-+/*
-+ * Default implementation of macro that returns current
-+ * instruction pointer ("program counter").
-+ */
-+#define current_text_addr() ({ void *pc; __asm__("movl $1f,%0\n1:":"=g" (pc)); pc; })
-+
-+/*
-+ *  CPU type and hardware bug flags. Kept separately for each CPU.
-+ *  Members of this structure are referenced in head.S, so think twice
-+ *  before touching them. [mj]
-+ */
-+
-+struct cpuinfo_x86 {
-+      __u8    x86;            /* CPU family */
-+      __u8    x86_vendor;     /* CPU vendor */
-+      __u8    x86_model;
-+      __u8    x86_mask;
-+      char    wp_works_ok;    /* It doesn't on 386's */
-+      char    hlt_works_ok;   /* Problems on some 486Dx4's and old 386's */
-+      char    hard_math;
-+      char    rfu;
-+              int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
-+      unsigned long   x86_capability[NCAPINTS];
-+      char    x86_vendor_id[16];
-+      char    x86_model_id[64];
-+      int     x86_cache_size;  /* in KB - valid for CPUS which support this
-+                                  call  */
-+      int     x86_cache_alignment;    /* In bytes */
-+      char    fdiv_bug;
-+      char    f00f_bug;
-+      char    coma_bug;
-+      char    pad0;
-+      int     x86_power;
-+      unsigned long loops_per_jiffy;
-+#ifdef CONFIG_SMP
-+      cpumask_t llc_shared_map;       /* cpus sharing the last level cache */
-+#endif
-+      unsigned char x86_max_cores;    /* cpuid returned max cores value */
-+      unsigned char apicid;
-+#ifdef CONFIG_SMP
-+      unsigned char booted_cores;     /* number of cores as seen by OS */
-+      __u8 phys_proc_id;              /* Physical processor id. */
-+      __u8 cpu_core_id;               /* Core id */
-+#endif
-+} __attribute__((__aligned__(SMP_CACHE_BYTES)));
-+
-+#define X86_VENDOR_INTEL 0
-+#define X86_VENDOR_CYRIX 1
-+#define X86_VENDOR_AMD 2
-+#define X86_VENDOR_UMC 3
-+#define X86_VENDOR_NEXGEN 4
-+#define X86_VENDOR_CENTAUR 5
-+#define X86_VENDOR_RISE 6
-+#define X86_VENDOR_TRANSMETA 7
-+#define X86_VENDOR_NSC 8
-+#define X86_VENDOR_NUM 9
-+#define X86_VENDOR_UNKNOWN 0xff
-+
-+/*
-+ * capabilities of CPUs
-+ */
-+
-+extern struct cpuinfo_x86 boot_cpu_data;
-+extern struct cpuinfo_x86 new_cpu_data;
-+#ifndef CONFIG_X86_NO_TSS
-+extern struct tss_struct doublefault_tss;
-+DECLARE_PER_CPU(struct tss_struct, init_tss);
-+#endif
-+
-+#ifdef CONFIG_SMP
-+extern struct cpuinfo_x86 cpu_data[];
-+#define current_cpu_data cpu_data[smp_processor_id()]
-+#else
-+#define cpu_data (&boot_cpu_data)
-+#define current_cpu_data boot_cpu_data
-+#endif
-+
-+extern        int cpu_llc_id[NR_CPUS];
-+extern char ignore_fpu_irq;
-+
-+extern void identify_cpu(struct cpuinfo_x86 *);
-+extern void print_cpu_info(struct cpuinfo_x86 *);
-+extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
-+extern unsigned short num_cache_leaves;
-+
-+#ifdef CONFIG_X86_HT
-+extern void detect_ht(struct cpuinfo_x86 *c);
-+#else
-+static inline void detect_ht(struct cpuinfo_x86 *c) {}
-+#endif
-+
-+/*
-+ * EFLAGS bits
-+ */
-+#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */
-+#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */
-+#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */
-+#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */
-+#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */
-+#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */
-+#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */
-+#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */
-+#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */
-+#define X86_EFLAGS_IOPL       0x00003000 /* IOPL mask */
-+#define X86_EFLAGS_NT 0x00004000 /* Nested Task */
-+#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */
-+#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */
-+#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */
-+#define X86_EFLAGS_VIF        0x00080000 /* Virtual Interrupt Flag */
-+#define X86_EFLAGS_VIP        0x00100000 /* Virtual Interrupt Pending */
-+#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */
-+
-+/*
-+ * Generic CPUID function
-+ * clear %ecx since some cpus (Cyrix MII) do not set or clear %ecx
-+ * resulting in stale register contents being returned.
-+ */
-+static inline void cpuid(unsigned int op, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx)
-+{
-+      __asm__(XEN_CPUID
-+              : "=a" (*eax),
-+                "=b" (*ebx),
-+                "=c" (*ecx),
-+                "=d" (*edx)
-+              : "0" (op), "c"(0));
-+}
-+
-+/* Some CPUID calls want 'count' to be placed in ecx */
-+static inline void cpuid_count(int op, int count, int *eax, int *ebx, int *ecx,
-+              int *edx)
-+{
-+      __asm__(XEN_CPUID
-+              : "=a" (*eax),
-+                "=b" (*ebx),
-+                "=c" (*ecx),
-+                "=d" (*edx)
-+              : "0" (op), "c" (count));
-+}
-+
-+/*
-+ * CPUID functions returning a single datum
-+ */
-+static inline unsigned int cpuid_eax(unsigned int op)
-+{
-+      unsigned int eax;
-+
-+      __asm__(XEN_CPUID
-+              : "=a" (eax)
-+              : "0" (op)
-+              : "bx", "cx", "dx");
-+      return eax;
-+}
-+static inline unsigned int cpuid_ebx(unsigned int op)
-+{
-+      unsigned int eax, ebx;
-+
-+      __asm__(XEN_CPUID
-+              : "=a" (eax), "=b" (ebx)
-+              : "0" (op)
-+              : "cx", "dx" );
-+      return ebx;
-+}
-+static inline unsigned int cpuid_ecx(unsigned int op)
-+{
-+      unsigned int eax, ecx;
-+
-+      __asm__(XEN_CPUID
-+              : "=a" (eax), "=c" (ecx)
-+              : "0" (op)
-+              : "bx", "dx" );
-+      return ecx;
-+}
-+static inline unsigned int cpuid_edx(unsigned int op)
-+{
-+      unsigned int eax, edx;
-+
-+      __asm__(XEN_CPUID
-+              : "=a" (eax), "=d" (edx)
-+              : "0" (op)
-+              : "bx", "cx");
-+      return edx;
-+}
-+
-+#define load_cr3(pgdir) write_cr3(__pa(pgdir))
-+
-+/*
-+ * Intel CPU features in CR4
-+ */
-+#define X86_CR4_VME           0x0001  /* enable vm86 extensions */
-+#define X86_CR4_PVI           0x0002  /* virtual interrupts flag enable */
-+#define X86_CR4_TSD           0x0004  /* disable time stamp at ipl 3 */
-+#define X86_CR4_DE            0x0008  /* enable debugging extensions */
-+#define X86_CR4_PSE           0x0010  /* enable page size extensions */
-+#define X86_CR4_PAE           0x0020  /* enable physical address extensions */
-+#define X86_CR4_MCE           0x0040  /* Machine check enable */
-+#define X86_CR4_PGE           0x0080  /* enable global pages */
-+#define X86_CR4_PCE           0x0100  /* enable performance counters at ipl 3 */
-+#define X86_CR4_OSFXSR                0x0200  /* enable fast FPU save and restore */
-+#define X86_CR4_OSXMMEXCPT    0x0400  /* enable unmasked SSE exceptions */
-+
-+/*
-+ * Save the cr4 feature set we're using (ie
-+ * Pentium 4MB enable and PPro Global page
-+ * enable), so that any CPU's that boot up
-+ * after us can get the correct flags.
-+ */
-+extern unsigned long mmu_cr4_features;
-+
-+static inline void set_in_cr4 (unsigned long mask)
-+{
-+      unsigned cr4;
-+      mmu_cr4_features |= mask;
-+      cr4 = read_cr4();
-+      cr4 |= mask;
-+      write_cr4(cr4);
-+}
-+
-+static inline void clear_in_cr4 (unsigned long mask)
-+{
-+      unsigned cr4;
-+      mmu_cr4_features &= ~mask;
-+      cr4 = read_cr4();
-+      cr4 &= ~mask;
-+      write_cr4(cr4);
-+}
-+
-+/*
-+ *      NSC/Cyrix CPU configuration register indexes
-+ */
-+
-+#define CX86_PCR0 0x20
-+#define CX86_GCR  0xb8
-+#define CX86_CCR0 0xc0
-+#define CX86_CCR1 0xc1
-+#define CX86_CCR2 0xc2
-+#define CX86_CCR3 0xc3
-+#define CX86_CCR4 0xe8
-+#define CX86_CCR5 0xe9
-+#define CX86_CCR6 0xea
-+#define CX86_CCR7 0xeb
-+#define CX86_PCR1 0xf0
-+#define CX86_DIR0 0xfe
-+#define CX86_DIR1 0xff
-+#define CX86_ARR_BASE 0xc4
-+#define CX86_RCR_BASE 0xdc
-+
-+/*
-+ *      NSC/Cyrix CPU indexed register access macros
-+ */
-+
-+#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-+
-+#define setCx86(reg, data) do { \
-+      outb((reg), 0x22); \
-+      outb((data), 0x23); \
-+} while (0)
-+
-+/* Stop speculative execution */
-+static inline void sync_core(void)
-+{
-+      int tmp;
-+      asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
-+}
-+
-+static inline void __monitor(const void *eax, unsigned long ecx,
-+              unsigned long edx)
-+{
-+      /* "monitor %eax,%ecx,%edx;" */
-+      asm volatile(
-+              ".byte 0x0f,0x01,0xc8;"
-+              : :"a" (eax), "c" (ecx), "d"(edx));
-+}
-+
-+static inline void __mwait(unsigned long eax, unsigned long ecx)
-+{
-+      /* "mwait %eax,%ecx;" */
-+      asm volatile(
-+              ".byte 0x0f,0x01,0xc9;"
-+              : :"a" (eax), "c" (ecx));
-+}
-+
-+/* from system description table in BIOS.  Mostly for MCA use, but
-+others may find it useful. */
-+extern unsigned int machine_id;
-+extern unsigned int machine_submodel_id;
-+extern unsigned int BIOS_revision;
-+extern unsigned int mca_pentium_flag;
-+
-+/* Boot loader type from the setup header */
-+extern int bootloader_type;
-+
-+/*
-+ * User space process size: 3GB (default).
-+ */
-+#define TASK_SIZE     (PAGE_OFFSET)
-+
-+/* This decides where the kernel will search for a free chunk of vm
-+ * space during mmap's.
-+ */
-+#define TASK_UNMAPPED_BASE    (PAGE_ALIGN(TASK_SIZE / 3))
-+
-+#define HAVE_ARCH_PICK_MMAP_LAYOUT
-+
-+/*
-+ * Size of io_bitmap.
-+ */
-+#define IO_BITMAP_BITS  65536
-+#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
-+#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
-+#ifndef CONFIG_X86_NO_TSS
-+#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
-+#endif
-+#define INVALID_IO_BITMAP_OFFSET 0x8000
-+#define INVALID_IO_BITMAP_OFFSET_LAZY 0x9000
-+
-+struct i387_fsave_struct {
-+      long    cwd;
-+      long    swd;
-+      long    twd;
-+      long    fip;
-+      long    fcs;
-+      long    foo;
-+      long    fos;
-+      long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-+      long    status;         /* software status information */
-+};
-+
-+struct i387_fxsave_struct {
-+      unsigned short  cwd;
-+      unsigned short  swd;
-+      unsigned short  twd;
-+      unsigned short  fop;
-+      long    fip;
-+      long    fcs;
-+      long    foo;
-+      long    fos;
-+      long    mxcsr;
-+      long    mxcsr_mask;
-+      long    st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-+      long    xmm_space[32];  /* 8*16 bytes for each XMM-reg = 128 bytes */
-+      long    padding[56];
-+} __attribute__ ((aligned (16)));
-+
-+struct i387_soft_struct {
-+      long    cwd;
-+      long    swd;
-+      long    twd;
-+      long    fip;
-+      long    fcs;
-+      long    foo;
-+      long    fos;
-+      long    st_space[20];   /* 8*10 bytes for each FP-reg = 80 bytes */
-+      unsigned char   ftop, changed, lookahead, no_update, rm, alimit;
-+      struct info     *info;
-+      unsigned long   entry_eip;
-+};
-+
-+union i387_union {
-+      struct i387_fsave_struct        fsave;
-+      struct i387_fxsave_struct       fxsave;
-+      struct i387_soft_struct soft;
-+};
-+
-+typedef struct {
-+      unsigned long seg;
-+} mm_segment_t;
-+
-+struct thread_struct;
-+
-+#ifndef CONFIG_X86_NO_TSS
-+struct tss_struct {
-+      unsigned short  back_link,__blh;
-+      unsigned long   esp0;
-+      unsigned short  ss0,__ss0h;
-+      unsigned long   esp1;
-+      unsigned short  ss1,__ss1h;     /* ss1 is used to cache MSR_IA32_SYSENTER_CS */
-+      unsigned long   esp2;
-+      unsigned short  ss2,__ss2h;
-+      unsigned long   __cr3;
-+      unsigned long   eip;
-+      unsigned long   eflags;
-+      unsigned long   eax,ecx,edx,ebx;
-+      unsigned long   esp;
-+      unsigned long   ebp;
-+      unsigned long   esi;
-+      unsigned long   edi;
-+      unsigned short  es, __esh;
-+      unsigned short  cs, __csh;
-+      unsigned short  ss, __ssh;
-+      unsigned short  ds, __dsh;
-+      unsigned short  fs, __fsh;
-+      unsigned short  gs, __gsh;
-+      unsigned short  ldt, __ldth;
-+      unsigned short  trace, io_bitmap_base;
-+      /*
-+       * The extra 1 is there because the CPU will access an
-+       * additional byte beyond the end of the IO permission
-+       * bitmap. The extra byte must be all 1 bits, and must
-+       * be within the limit.
-+       */
-+      unsigned long   io_bitmap[IO_BITMAP_LONGS + 1];
-+      /*
-+       * Cache the current maximum and the last task that used the bitmap:
-+       */
-+      unsigned long io_bitmap_max;
-+      struct thread_struct *io_bitmap_owner;
-+      /*
-+       * pads the TSS to be cacheline-aligned (size is 0x100)
-+       */
-+      unsigned long __cacheline_filler[35];
-+      /*
-+       * .. and then another 0x100 bytes for emergency kernel stack
-+       */
-+      unsigned long stack[64];
-+} __attribute__((packed));
-+#endif
-+
-+#define ARCH_MIN_TASKALIGN    16
-+
-+struct thread_struct {
-+/* cached TLS descriptors. */
-+      struct desc_struct tls_array[GDT_ENTRY_TLS_ENTRIES];
-+      unsigned long   esp0;
-+      unsigned long   sysenter_cs;
-+      unsigned long   eip;
-+      unsigned long   esp;
-+      unsigned long   fs;
-+      unsigned long   gs;
-+/* Hardware debugging registers */
-+      unsigned long   debugreg[8];  /* %%db0-7 debug registers */
-+/* fault info */
-+      unsigned long   cr2, trap_no, error_code;
-+/* floating point info */
-+      union i387_union        i387;
-+/* virtual 86 mode info */
-+      struct vm86_struct __user * vm86_info;
-+      unsigned long           screen_bitmap;
-+      unsigned long           v86flags, v86mask, saved_esp0;
-+      unsigned int            saved_fs, saved_gs;
-+/* IO permissions */
-+      unsigned long   *io_bitmap_ptr;
-+      unsigned long   iopl;
-+/* max allowed port in the bitmap, in bytes: */
-+      unsigned long   io_bitmap_max;
-+};
-+
-+#define INIT_THREAD  {                                                        \
-+      .vm86_info = NULL,                                              \
-+      .sysenter_cs = __KERNEL_CS,                                     \
-+      .io_bitmap_ptr = NULL,                                          \
-+}
-+
-+#ifndef CONFIG_X86_NO_TSS
-+/*
-+ * Note that the .io_bitmap member must be extra-big. This is because
-+ * the CPU will access an additional byte beyond the end of the IO
-+ * permission bitmap. The extra byte must be all 1 bits, and must
-+ * be within the limit.
-+ */
-+#define INIT_TSS  {                                                   \
-+      .esp0           = sizeof(init_stack) + (long)&init_stack,       \
-+      .ss0            = __KERNEL_DS,                                  \
-+      .ss1            = __KERNEL_CS,                                  \
-+      .io_bitmap_base = INVALID_IO_BITMAP_OFFSET,                     \
-+      .io_bitmap      = { [ 0 ... IO_BITMAP_LONGS] = ~0 },            \
-+}
-+
-+static inline void __load_esp0(struct tss_struct *tss, struct thread_struct *thread)
-+{
-+      tss->esp0 = thread->esp0;
-+      /* This can only happen when SEP is enabled, no need to test "SEP"arately */
-+      if (unlikely(tss->ss1 != thread->sysenter_cs)) {
-+              tss->ss1 = thread->sysenter_cs;
-+              wrmsr(MSR_IA32_SYSENTER_CS, thread->sysenter_cs, 0);
-+      }
-+}
-+#define load_esp0(tss, thread) \
-+      __load_esp0(tss, thread)
-+#else
-+#define load_esp0(tss, thread) do { \
-+      if (HYPERVISOR_stack_switch(__KERNEL_DS, (thread)->esp0)) \
-+              BUG(); \
-+} while (0)
-+#endif
-+
-+#define start_thread(regs, new_eip, new_esp) do {             \
-+      __asm__("movl %0,%%fs ; movl %0,%%gs": :"r" (0));       \
-+      set_fs(USER_DS);                                        \
-+      regs->xds = __USER_DS;                                  \
-+      regs->xes = __USER_DS;                                  \
-+      regs->xss = __USER_DS;                                  \
-+      regs->xcs = __USER_CS;                                  \
-+      regs->eip = new_eip;                                    \
-+      regs->esp = new_esp;                                    \
-+} while (0)
-+
-+/*
-+ * These special macros can be used to get or set a debugging register
-+ */
-+#define get_debugreg(var, register)                           \
-+              (var) = HYPERVISOR_get_debugreg((register))
-+#define set_debugreg(value, register)                 \
-+              WARN_ON(HYPERVISOR_set_debugreg((register), (value)))
-+
-+/*
-+ * Set IOPL bits in EFLAGS from given mask
-+ */
-+static inline void set_iopl_mask(unsigned mask)
-+{
-+      struct physdev_set_iopl set_iopl;
-+
-+      /* Force the change at ring 0. */
-+      set_iopl.iopl = (mask == 0) ? 1 : (mask >> 12) & 3;
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_set_iopl, &set_iopl));
-+}
-+
-+/* Forward declaration, a strange C thing */
-+struct task_struct;
-+struct mm_struct;
-+
-+/* Free all resources held by a thread. */
-+extern void release_thread(struct task_struct *);
-+
-+/* Prepare to copy thread state - unlazy all lazy status */
-+extern void prepare_to_copy(struct task_struct *tsk);
-+
-+/*
-+ * create a kernel thread without removing it from tasklists
-+ */
-+extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-+
-+extern unsigned long thread_saved_pc(struct task_struct *tsk);
-+void show_trace(struct task_struct *task, struct pt_regs *regs, unsigned long *stack);
-+
-+unsigned long get_wchan(struct task_struct *p);
-+
-+#define THREAD_SIZE_LONGS      (THREAD_SIZE/sizeof(unsigned long))
-+#define KSTK_TOP(info)                                                 \
-+({                                                                     \
-+       unsigned long *__ptr = (unsigned long *)(info);                 \
-+       (unsigned long)(&__ptr[THREAD_SIZE_LONGS]);                     \
-+})
-+
-+/*
-+ * The below -8 is to reserve 8 bytes on top of the ring0 stack.
-+ * This is necessary to guarantee that the entire "struct pt_regs"
-+ * is accessable even if the CPU haven't stored the SS/ESP registers
-+ * on the stack (interrupt gate does not save these registers
-+ * when switching to the same priv ring).
-+ * Therefore beware: accessing the xss/esp fields of the
-+ * "struct pt_regs" is possible, but they may contain the
-+ * completely wrong values.
-+ */
-+#define task_pt_regs(task)                                             \
-+({                                                                     \
-+       struct pt_regs *__regs__;                                       \
-+       __regs__ = (struct pt_regs *)(KSTK_TOP(task_stack_page(task))-8); \
-+       __regs__ - 1;                                                   \
-+})
-+
-+#define KSTK_EIP(task) (task_pt_regs(task)->eip)
-+#define KSTK_ESP(task) (task_pt_regs(task)->esp)
-+
-+
-+struct microcode_header {
-+      unsigned int hdrver;
-+      unsigned int rev;
-+      unsigned int date;
-+      unsigned int sig;
-+      unsigned int cksum;
-+      unsigned int ldrver;
-+      unsigned int pf;
-+      unsigned int datasize;
-+      unsigned int totalsize;
-+      unsigned int reserved[3];
-+};
-+
-+struct microcode {
-+      struct microcode_header hdr;
-+      unsigned int bits[0];
-+};
-+
-+typedef struct microcode microcode_t;
-+typedef struct microcode_header microcode_header_t;
-+
-+/* microcode format is extended from prescott processors */
-+struct extended_signature {
-+      unsigned int sig;
-+      unsigned int pf;
-+      unsigned int cksum;
-+};
-+
-+struct extended_sigtable {
-+      unsigned int count;
-+      unsigned int cksum;
-+      unsigned int reserved[3];
-+      struct extended_signature sigs[0];
-+};
-+
-+/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
-+static inline void rep_nop(void)
-+{
-+      __asm__ __volatile__("rep;nop": : :"memory");
-+}
-+
-+#define cpu_relax()   rep_nop()
-+
-+/* generic versions from gas */
-+#define GENERIC_NOP1  ".byte 0x90\n"
-+#define GENERIC_NOP2          ".byte 0x89,0xf6\n"
-+#define GENERIC_NOP3        ".byte 0x8d,0x76,0x00\n"
-+#define GENERIC_NOP4        ".byte 0x8d,0x74,0x26,0x00\n"
-+#define GENERIC_NOP5        GENERIC_NOP1 GENERIC_NOP4
-+#define GENERIC_NOP6  ".byte 0x8d,0xb6,0x00,0x00,0x00,0x00\n"
-+#define GENERIC_NOP7  ".byte 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00\n"
-+#define GENERIC_NOP8  GENERIC_NOP1 GENERIC_NOP7
-+
-+/* Opteron nops */
-+#define K8_NOP1 GENERIC_NOP1
-+#define K8_NOP2       ".byte 0x66,0x90\n" 
-+#define K8_NOP3       ".byte 0x66,0x66,0x90\n" 
-+#define K8_NOP4       ".byte 0x66,0x66,0x66,0x90\n" 
-+#define K8_NOP5       K8_NOP3 K8_NOP2 
-+#define K8_NOP6       K8_NOP3 K8_NOP3
-+#define K8_NOP7       K8_NOP4 K8_NOP3
-+#define K8_NOP8       K8_NOP4 K8_NOP4
-+
-+/* K7 nops */
-+/* uses eax dependencies (arbitary choice) */
-+#define K7_NOP1  GENERIC_NOP1
-+#define K7_NOP2       ".byte 0x8b,0xc0\n" 
-+#define K7_NOP3       ".byte 0x8d,0x04,0x20\n"
-+#define K7_NOP4       ".byte 0x8d,0x44,0x20,0x00\n"
-+#define K7_NOP5       K7_NOP4 ASM_NOP1
-+#define K7_NOP6       ".byte 0x8d,0x80,0,0,0,0\n"
-+#define K7_NOP7        ".byte 0x8D,0x04,0x05,0,0,0,0\n"
-+#define K7_NOP8        K7_NOP7 ASM_NOP1
-+
-+#ifdef CONFIG_MK8
-+#define ASM_NOP1 K8_NOP1
-+#define ASM_NOP2 K8_NOP2
-+#define ASM_NOP3 K8_NOP3
-+#define ASM_NOP4 K8_NOP4
-+#define ASM_NOP5 K8_NOP5
-+#define ASM_NOP6 K8_NOP6
-+#define ASM_NOP7 K8_NOP7
-+#define ASM_NOP8 K8_NOP8
-+#elif defined(CONFIG_MK7)
-+#define ASM_NOP1 K7_NOP1
-+#define ASM_NOP2 K7_NOP2
-+#define ASM_NOP3 K7_NOP3
-+#define ASM_NOP4 K7_NOP4
-+#define ASM_NOP5 K7_NOP5
-+#define ASM_NOP6 K7_NOP6
-+#define ASM_NOP7 K7_NOP7
-+#define ASM_NOP8 K7_NOP8
-+#else
-+#define ASM_NOP1 GENERIC_NOP1
-+#define ASM_NOP2 GENERIC_NOP2
-+#define ASM_NOP3 GENERIC_NOP3
-+#define ASM_NOP4 GENERIC_NOP4
-+#define ASM_NOP5 GENERIC_NOP5
-+#define ASM_NOP6 GENERIC_NOP6
-+#define ASM_NOP7 GENERIC_NOP7
-+#define ASM_NOP8 GENERIC_NOP8
-+#endif
-+
-+#define ASM_NOP_MAX 8
-+
-+/* Prefetch instructions for Pentium III and AMD Athlon */
-+/* It's not worth to care about 3dnow! prefetches for the K6
-+   because they are microcoded there and very slow.
-+   However we don't do prefetches for pre XP Athlons currently
-+   That should be fixed. */
-+#define ARCH_HAS_PREFETCH
-+static inline void prefetch(const void *x)
-+{
-+      alternative_input(ASM_NOP4,
-+                        "prefetchnta (%1)",
-+                        X86_FEATURE_XMM,
-+                        "r" (x));
-+}
-+
-+#define ARCH_HAS_PREFETCH
-+#define ARCH_HAS_PREFETCHW
-+#define ARCH_HAS_SPINLOCK_PREFETCH
-+
-+/* 3dnow! prefetch to get an exclusive cache line. Useful for 
-+   spinlocks to avoid one state transition in the cache coherency protocol. */
-+static inline void prefetchw(const void *x)
-+{
-+      alternative_input(ASM_NOP4,
-+                        "prefetchw (%1)",
-+                        X86_FEATURE_3DNOW,
-+                        "r" (x));
-+}
-+#define spin_lock_prefetch(x) prefetchw(x)
-+
-+extern void select_idle_routine(const struct cpuinfo_x86 *c);
-+
-+#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
-+
-+extern unsigned long boot_option_idle_override;
-+extern void enable_sep_cpu(void);
-+extern int sysenter_setup(void);
-+
-+#endif /* __ASM_I386_PROCESSOR_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/segment_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/segment_32.h  2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,117 @@
-+#ifndef _ASM_SEGMENT_H
-+#define _ASM_SEGMENT_H
-+
-+/*
-+ * The layout of the per-CPU GDT under Linux:
-+ *
-+ *   0 - null
-+ *   1 - reserved
-+ *   2 - reserved
-+ *   3 - reserved
-+ *
-+ *   4 - unused                       <==== new cacheline
-+ *   5 - unused
-+ *
-+ *  ------- start of TLS (Thread-Local Storage) segments:
-+ *
-+ *   6 - TLS segment #1                       [ glibc's TLS segment ]
-+ *   7 - TLS segment #2                       [ Wine's %fs Win32 segment ]
-+ *   8 - TLS segment #3
-+ *   9 - reserved
-+ *  10 - reserved
-+ *  11 - reserved
-+ *
-+ *  ------- start of kernel segments:
-+ *
-+ *  12 - kernel code segment          <==== new cacheline
-+ *  13 - kernel data segment
-+ *  14 - default user CS
-+ *  15 - default user DS
-+ *  16 - TSS
-+ *  17 - LDT
-+ *  18 - PNPBIOS support (16->32 gate)
-+ *  19 - PNPBIOS support
-+ *  20 - PNPBIOS support
-+ *  21 - PNPBIOS support
-+ *  22 - PNPBIOS support
-+ *  23 - APM BIOS support
-+ *  24 - APM BIOS support
-+ *  25 - APM BIOS support 
-+ *
-+ *  26 - ESPFIX small SS
-+ *  27 - unused
-+ *  28 - unused
-+ *  29 - unused
-+ *  30 - unused
-+ *  31 - TSS for double fault handler
-+ */
-+#define GDT_ENTRY_TLS_ENTRIES 3
-+#define GDT_ENTRY_TLS_MIN     6
-+#define GDT_ENTRY_TLS_MAX     (GDT_ENTRY_TLS_MIN + GDT_ENTRY_TLS_ENTRIES - 1)
-+
-+#define TLS_SIZE (GDT_ENTRY_TLS_ENTRIES * 8)
-+
-+#define GDT_ENTRY_DEFAULT_USER_CS     14
-+#define __USER_CS (GDT_ENTRY_DEFAULT_USER_CS * 8 + 3)
-+
-+#define GDT_ENTRY_DEFAULT_USER_DS     15
-+#define __USER_DS (GDT_ENTRY_DEFAULT_USER_DS * 8 + 3)
-+
-+#define GDT_ENTRY_KERNEL_BASE 12
-+
-+#define GDT_ENTRY_KERNEL_CS           (GDT_ENTRY_KERNEL_BASE + 0)
-+#define __KERNEL_CS (GDT_ENTRY_KERNEL_CS * 8)
-+#define GET_KERNEL_CS() (__KERNEL_CS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) )
-+
-+#define GDT_ENTRY_KERNEL_DS           (GDT_ENTRY_KERNEL_BASE + 1)
-+#define __KERNEL_DS (GDT_ENTRY_KERNEL_DS * 8)
-+#define GET_KERNEL_DS() (__KERNEL_DS | (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1) )
-+
-+#define GDT_ENTRY_TSS                 (GDT_ENTRY_KERNEL_BASE + 4)
-+#define GDT_ENTRY_LDT                 (GDT_ENTRY_KERNEL_BASE + 5)
-+
-+#define GDT_ENTRY_PNPBIOS_BASE                (GDT_ENTRY_KERNEL_BASE + 6)
-+#define GDT_ENTRY_APMBIOS_BASE                (GDT_ENTRY_KERNEL_BASE + 11)
-+
-+#define GDT_ENTRY_ESPFIX_SS           (GDT_ENTRY_KERNEL_BASE + 14)
-+#define __ESPFIX_SS (GDT_ENTRY_ESPFIX_SS * 8)
-+
-+#define GDT_ENTRY_DOUBLEFAULT_TSS     31
-+
-+/*
-+ * The GDT has 32 entries
-+ */
-+#define GDT_ENTRIES 32
-+
-+#define GDT_SIZE (GDT_ENTRIES * 8)
-+
-+/* Simple and small GDT entries for booting only */
-+
-+#define GDT_ENTRY_BOOT_CS             2
-+#define __BOOT_CS     (GDT_ENTRY_BOOT_CS * 8)
-+
-+#define GDT_ENTRY_BOOT_DS             (GDT_ENTRY_BOOT_CS + 1)
-+#define __BOOT_DS     (GDT_ENTRY_BOOT_DS * 8)
-+
-+/* The PnP BIOS entries in the GDT */
-+#define GDT_ENTRY_PNPBIOS_CS32                (GDT_ENTRY_PNPBIOS_BASE + 0)
-+#define GDT_ENTRY_PNPBIOS_CS16                (GDT_ENTRY_PNPBIOS_BASE + 1)
-+#define GDT_ENTRY_PNPBIOS_DS          (GDT_ENTRY_PNPBIOS_BASE + 2)
-+#define GDT_ENTRY_PNPBIOS_TS1         (GDT_ENTRY_PNPBIOS_BASE + 3)
-+#define GDT_ENTRY_PNPBIOS_TS2         (GDT_ENTRY_PNPBIOS_BASE + 4)
-+
-+/* The PnP BIOS selectors */
-+#define PNP_CS32   (GDT_ENTRY_PNPBIOS_CS32 * 8)       /* segment for calling fn */
-+#define PNP_CS16   (GDT_ENTRY_PNPBIOS_CS16 * 8)       /* code segment for BIOS */
-+#define PNP_DS     (GDT_ENTRY_PNPBIOS_DS * 8) /* data segment for BIOS */
-+#define PNP_TS1    (GDT_ENTRY_PNPBIOS_TS1 * 8)        /* transfer data segment */
-+#define PNP_TS2    (GDT_ENTRY_PNPBIOS_TS2 * 8)        /* another data segment */
-+
-+/*
-+ * The interrupt descriptor table has room for 256 idt's,
-+ * the global descriptor table is dependent on the number
-+ * of tasks we can have..
-+ */
-+#define IDT_ENTRIES 256
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/smp_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/smp_32.h      2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,103 @@
-+#ifndef __ASM_SMP_H
-+#define __ASM_SMP_H
-+
-+/*
-+ * We need the APIC definitions automatically as part of 'smp.h'
-+ */
-+#ifndef __ASSEMBLY__
-+#include <linux/kernel.h>
-+#include <linux/threads.h>
-+#include <linux/cpumask.h>
-+#endif
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+#ifndef __ASSEMBLY__
-+#include <asm/fixmap.h>
-+#include <asm/bitops.h>
-+#include <asm/mpspec.h>
-+#ifdef CONFIG_X86_IO_APIC
-+#include <asm/io_apic.h>
-+#endif
-+#include <asm/apic.h>
-+#endif
-+#endif
-+
-+#define BAD_APICID 0xFFu
-+#ifdef CONFIG_SMP
-+#ifndef __ASSEMBLY__
-+
-+/*
-+ * Private routines/data
-+ */
-+ 
-+extern void smp_alloc_memory(void);
-+extern int pic_mode;
-+extern int smp_num_siblings;
-+extern cpumask_t cpu_sibling_map[];
-+extern cpumask_t cpu_core_map[];
-+
-+extern void (*mtrr_hook) (void);
-+extern void zap_low_mappings (void);
-+extern void lock_ipi_call_lock(void);
-+extern void unlock_ipi_call_lock(void);
-+
-+#define MAX_APICID 256
-+extern u8 x86_cpu_to_apicid[];
-+
-+#define cpu_physical_id(cpu)  x86_cpu_to_apicid[cpu]
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+extern void cpu_exit_clear(void);
-+extern void cpu_uninit(void);
-+#endif
-+
-+/*
-+ * This function is needed by all SMP systems. It must _always_ be valid
-+ * from the initial startup. We map APIC_BASE very early in page_setup(),
-+ * so this is correct in the x86 case.
-+ */
-+#define raw_smp_processor_id() (current_thread_info()->cpu)
-+
-+extern cpumask_t cpu_possible_map;
-+#define cpu_callin_map cpu_possible_map
-+
-+/* We don't mark CPUs online until __cpu_up(), so we need another measure */
-+static inline int num_booting_cpus(void)
-+{
-+      return cpus_weight(cpu_possible_map);
-+}
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+
-+#ifdef APIC_DEFINITION
-+extern int hard_smp_processor_id(void);
-+#else
-+#include <mach_apicdef.h>
-+static inline int hard_smp_processor_id(void)
-+{
-+      /* we don't want to mark this access volatile - bad code generation */
-+      return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID));
-+}
-+#endif
-+
-+static __inline int logical_smp_processor_id(void)
-+{
-+      /* we don't want to mark this access volatile - bad code generation */
-+      return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
-+}
-+
-+#endif
-+
-+extern int __cpu_disable(void);
-+extern void __cpu_die(unsigned int cpu);
-+extern void prefill_possible_map(void);
-+#endif /* !__ASSEMBLY__ */
-+
-+#else /* CONFIG_SMP */
-+
-+#define cpu_physical_id(cpu)          boot_cpu_physical_apicid
-+
-+#define NO_PROC_ID            0xFF            /* No processor magic marker */
-+
-+#endif
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/swiotlb_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/swiotlb_32.h  2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,43 @@
-+#ifndef _ASM_SWIOTLB_H
-+#define _ASM_SWIOTLB_H 1
-+
-+/* SWIOTLB interface */
-+
-+extern dma_addr_t swiotlb_map_single(struct device *hwdev, void *ptr, size_t size,
-+                                    int dir);
-+extern void swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr,
-+                                size_t size, int dir);
-+extern void swiotlb_sync_single_for_cpu(struct device *hwdev,
-+                                       dma_addr_t dev_addr,
-+                                       size_t size, int dir);
-+extern void swiotlb_sync_single_for_device(struct device *hwdev,
-+                                          dma_addr_t dev_addr,
-+                                          size_t size, int dir);
-+extern void swiotlb_sync_sg_for_cpu(struct device *hwdev,
-+                                   struct scatterlist *sg, int nelems,
-+                                   int dir);
-+extern void swiotlb_sync_sg_for_device(struct device *hwdev,
-+                                      struct scatterlist *sg, int nelems,
-+                                      int dir);
-+extern int swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg,
-+                    int nents, int direction);
-+extern void swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg,
-+                       int nents, int direction);
-+extern int swiotlb_dma_mapping_error(dma_addr_t dma_addr);
-+#ifdef CONFIG_HIGHMEM
-+extern dma_addr_t swiotlb_map_page(struct device *hwdev, struct page *page,
-+                                   unsigned long offset, size_t size,
-+                                   enum dma_data_direction direction);
-+extern void swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
-+                               size_t size, enum dma_data_direction direction);
-+#endif
-+extern int swiotlb_dma_supported(struct device *hwdev, u64 mask);
-+extern void swiotlb_init(void);
-+
-+#ifdef CONFIG_SWIOTLB
-+extern int swiotlb;
-+#else
-+#define swiotlb 0
-+#endif
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/synch_bitops.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/synch_bitops.h        2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,126 @@
-+#ifndef __XEN_SYNCH_BITOPS_H__
-+#define __XEN_SYNCH_BITOPS_H__
-+
-+/*
-+ * Copyright 1992, Linus Torvalds.
-+ * Heavily modified to provide guaranteed strong synchronisation
-+ * when communicating with Xen or other guest OSes running on other CPUs.
-+ */
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+#define ADDR (*(volatile long *) addr)
-+
-+static __inline__ void synch_set_bit(int nr, volatile void * addr)
-+{
-+    __asm__ __volatile__ ( 
-+        "lock btsl %1,%0"
-+        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-+}
-+
-+static __inline__ void synch_clear_bit(int nr, volatile void * addr)
-+{
-+    __asm__ __volatile__ (
-+        "lock btrl %1,%0"
-+        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-+}
-+
-+static __inline__ void synch_change_bit(int nr, volatile void * addr)
-+{
-+    __asm__ __volatile__ (
-+        "lock btcl %1,%0"
-+        : "+m" (ADDR) : "Ir" (nr) : "memory" );
-+}
-+
-+static __inline__ int synch_test_and_set_bit(int nr, volatile void * addr)
-+{
-+    int oldbit;
-+    __asm__ __volatile__ (
-+        "lock btsl %2,%1\n\tsbbl %0,%0"
-+        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-+    return oldbit;
-+}
-+
-+static __inline__ int synch_test_and_clear_bit(int nr, volatile void * addr)
-+{
-+    int oldbit;
-+    __asm__ __volatile__ (
-+        "lock btrl %2,%1\n\tsbbl %0,%0"
-+        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-+    return oldbit;
-+}
-+
-+static __inline__ int synch_test_and_change_bit(int nr, volatile void * addr)
-+{
-+    int oldbit;
-+
-+    __asm__ __volatile__ (
-+        "lock btcl %2,%1\n\tsbbl %0,%0"
-+        : "=r" (oldbit), "+m" (ADDR) : "Ir" (nr) : "memory");
-+    return oldbit;
-+}
-+
-+struct __synch_xchg_dummy { unsigned long a[100]; };
-+#define __synch_xg(x) ((struct __synch_xchg_dummy *)(x))
-+
-+#define synch_cmpxchg(ptr, old, new) \
-+((__typeof__(*(ptr)))__synch_cmpxchg((ptr),\
-+                                     (unsigned long)(old), \
-+                                     (unsigned long)(new), \
-+                                     sizeof(*(ptr))))
-+
-+static inline unsigned long __synch_cmpxchg(volatile void *ptr,
-+                                          unsigned long old,
-+                                          unsigned long new, int size)
-+{
-+      unsigned long prev;
-+      switch (size) {
-+      case 1:
-+              __asm__ __volatile__("lock; cmpxchgb %b1,%2"
-+                                   : "=a"(prev)
-+                                   : "q"(new), "m"(*__synch_xg(ptr)),
-+                                     "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 2:
-+              __asm__ __volatile__("lock; cmpxchgw %w1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__synch_xg(ptr)),
-+                                     "0"(old)
-+                                   : "memory");
-+              return prev;
-+#ifdef CONFIG_X86_64
-+      case 4:
-+              __asm__ __volatile__("lock; cmpxchgl %k1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__synch_xg(ptr)),
-+                                     "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 8:
-+              __asm__ __volatile__("lock; cmpxchgq %1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__synch_xg(ptr)),
-+                                     "0"(old)
-+                                   : "memory");
-+              return prev;
-+#else
-+      case 4:
-+              __asm__ __volatile__("lock; cmpxchgl %1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__synch_xg(ptr)),
-+                                     "0"(old)
-+                                   : "memory");
-+              return prev;
-+#endif
-+      }
-+      return old;
-+}
-+
-+#define synch_test_bit test_bit
-+
-+#define synch_cmpxchg_subword synch_cmpxchg
-+
-+#endif /* __XEN_SYNCH_BITOPS_H__ */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/system_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/system_32.h   2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,488 @@
-+#ifndef __ASM_SYSTEM_H
-+#define __ASM_SYSTEM_H
-+
-+#include <linux/kernel.h>
-+#include <asm/segment.h>
-+#include <asm/cpufeature.h>
-+#include <linux/bitops.h> /* for LOCK_PREFIX */
-+#include <asm/synch_bitops.h>
-+#include <asm/hypervisor.h>
-+
-+#ifdef __KERNEL__
-+
-+struct task_struct;   /* one of the stranger aspects of C forward declarations.. */
-+extern struct task_struct * FASTCALL(__switch_to(struct task_struct *prev, struct task_struct *next));
-+
-+/*
-+ * Saving eflags is important. It switches not only IOPL between tasks,
-+ * it also protects other tasks from NT leaking through sysenter etc.
-+ */
-+#define switch_to(prev,next,last) do {                                        \
-+      unsigned long esi,edi;                                          \
-+      asm volatile("pushfl\n\t"               /* Save flags */        \
-+                   "pushl %%ebp\n\t"                                  \
-+                   "movl %%esp,%0\n\t"        /* save ESP */          \
-+                   "movl %5,%%esp\n\t"        /* restore ESP */       \
-+                   "movl $1f,%1\n\t"          /* save EIP */          \
-+                   "pushl %6\n\t"             /* restore EIP */       \
-+                   "jmp __switch_to\n"                                \
-+                   "1:\t"                                             \
-+                   "popl %%ebp\n\t"                                   \
-+                   "popfl"                                            \
-+                   :"=m" (prev->thread.esp),"=m" (prev->thread.eip),  \
-+                    "=a" (last),"=S" (esi),"=D" (edi)                 \
-+                   :"m" (next->thread.esp),"m" (next->thread.eip),    \
-+                    "2" (prev), "d" (next));                          \
-+} while (0)
-+
-+#define _set_base(addr,base) do { unsigned long __pr; \
-+__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-+      "rorl $16,%%edx\n\t" \
-+      "movb %%dl,%2\n\t" \
-+      "movb %%dh,%3" \
-+      :"=&d" (__pr) \
-+      :"m" (*((addr)+2)), \
-+       "m" (*((addr)+4)), \
-+       "m" (*((addr)+7)), \
-+         "0" (base) \
-+        ); } while(0)
-+
-+#define _set_limit(addr,limit) do { unsigned long __lr; \
-+__asm__ __volatile__ ("movw %%dx,%1\n\t" \
-+      "rorl $16,%%edx\n\t" \
-+      "movb %2,%%dh\n\t" \
-+      "andb $0xf0,%%dh\n\t" \
-+      "orb %%dh,%%dl\n\t" \
-+      "movb %%dl,%2" \
-+      :"=&d" (__lr) \
-+      :"m" (*(addr)), \
-+       "m" (*((addr)+6)), \
-+       "0" (limit) \
-+        ); } while(0)
-+
-+#define set_base(ldt,base) _set_base( ((char *)&(ldt)) , (base) )
-+#define set_limit(ldt,limit) _set_limit( ((char *)&(ldt)) , ((limit)-1) )
-+
-+/*
-+ * Load a segment. Fall back on loading the zero
-+ * segment if something goes wrong..
-+ */
-+#define loadsegment(seg,value)                        \
-+      asm volatile("\n"                       \
-+              "1:\t"                          \
-+              "mov %0,%%" #seg "\n"           \
-+              "2:\n"                          \
-+              ".section .fixup,\"ax\"\n"      \
-+              "3:\t"                          \
-+              "pushl $0\n\t"                  \
-+              "popl %%" #seg "\n\t"           \
-+              "jmp 2b\n"                      \
-+              ".previous\n"                   \
-+              ".section __ex_table,\"a\"\n\t" \
-+              ".align 4\n\t"                  \
-+              ".long 1b,3b\n"                 \
-+              ".previous"                     \
-+              : :"rm" (value))
-+
-+/*
-+ * Save a segment register away
-+ */
-+#define savesegment(seg, value) \
-+      asm volatile("mov %%" #seg ",%0":"=rm" (value))
-+
-+#define read_cr0() ({ \
-+      unsigned int __dummy; \
-+      __asm__ __volatile__( \
-+              "movl %%cr0,%0\n\t" \
-+              :"=r" (__dummy)); \
-+      __dummy; \
-+})
-+#define write_cr0(x) \
-+      __asm__ __volatile__("movl %0,%%cr0": :"r" (x))
-+
-+#define read_cr2() (current_vcpu_info()->arch.cr2)
-+#define write_cr2(x) \
-+      __asm__ __volatile__("movl %0,%%cr2": :"r" (x))
-+
-+#define read_cr3() ({ \
-+      unsigned int __dummy; \
-+      __asm__ ( \
-+              "movl %%cr3,%0\n\t" \
-+              :"=r" (__dummy)); \
-+      __dummy = xen_cr3_to_pfn(__dummy); \
-+      mfn_to_pfn(__dummy) << PAGE_SHIFT; \
-+})
-+#define write_cr3(x) ({                                               \
-+      unsigned int __dummy = pfn_to_mfn((x) >> PAGE_SHIFT);   \
-+      __dummy = xen_pfn_to_cr3(__dummy);                      \
-+      __asm__ __volatile__("movl %0,%%cr3": :"r" (__dummy));  \
-+})
-+#define read_cr4() ({ \
-+      unsigned int __dummy; \
-+      __asm__( \
-+              "movl %%cr4,%0\n\t" \
-+              :"=r" (__dummy)); \
-+      __dummy; \
-+})
-+#define read_cr4_safe() ({                          \
-+      unsigned int __dummy;                         \
-+      /* This could fault if %cr4 does not exist */ \
-+      __asm__("1: movl %%cr4, %0              \n"   \
-+              "2:                             \n"   \
-+              ".section __ex_table,\"a\"      \n"   \
-+              ".long 1b,2b                    \n"   \
-+              ".previous                      \n"   \
-+              : "=r" (__dummy): "0" (0));           \
-+      __dummy;                                      \
-+})
-+
-+#define write_cr4(x) \
-+      __asm__ __volatile__("movl %0,%%cr4": :"r" (x))
-+
-+/*
-+ * Clear and set 'TS' bit respectively
-+ */
-+#define clts() (HYPERVISOR_fpu_taskswitch(0))
-+#define stts() (HYPERVISOR_fpu_taskswitch(1))
-+
-+#endif        /* __KERNEL__ */
-+
-+#define wbinvd() \
-+      __asm__ __volatile__ ("wbinvd": : :"memory")
-+
-+static inline unsigned long get_limit(unsigned long segment)
-+{
-+      unsigned long __limit;
-+      __asm__("lsll %1,%0"
-+              :"=r" (__limit):"r" (segment));
-+      return __limit+1;
-+}
-+
-+#define nop() __asm__ __volatile__ ("nop")
-+
-+#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-+
-+#define tas(ptr) (xchg((ptr),1))
-+
-+struct __xchg_dummy { unsigned long a[100]; };
-+#define __xg(x) ((struct __xchg_dummy *)(x))
-+
-+
-+#ifdef CONFIG_X86_CMPXCHG64
-+
-+/*
-+ * The semantics of XCHGCMP8B are a bit strange, this is why
-+ * there is a loop and the loading of %%eax and %%edx has to
-+ * be inside. This inlines well in most cases, the cached
-+ * cost is around ~38 cycles. (in the future we might want
-+ * to do an SIMD/3DNOW!/MMX/FPU 64-bit store here, but that
-+ * might have an implicit FPU-save as a cost, so it's not
-+ * clear which path to go.)
-+ *
-+ * cmpxchg8b must be used with the lock prefix here to allow
-+ * the instruction to be executed atomically, see page 3-102
-+ * of the instruction set reference 24319102.pdf. We need
-+ * the reader side to see the coherent 64bit value.
-+ */
-+static inline void __set_64bit (unsigned long long * ptr,
-+              unsigned int low, unsigned int high)
-+{
-+      __asm__ __volatile__ (
-+              "\n1:\t"
-+              "movl (%0), %%eax\n\t"
-+              "movl 4(%0), %%edx\n\t"
-+              "lock cmpxchg8b (%0)\n\t"
-+              "jnz 1b"
-+              : /* no outputs */
-+              :       "D"(ptr),
-+                      "b"(low),
-+                      "c"(high)
-+              :       "ax","dx","memory");
-+}
-+
-+static inline void __set_64bit_constant (unsigned long long *ptr,
-+                                               unsigned long long value)
-+{
-+      __set_64bit(ptr,(unsigned int)(value), (unsigned int)((value)>>32ULL));
-+}
-+#define ll_low(x)     *(((unsigned int*)&(x))+0)
-+#define ll_high(x)    *(((unsigned int*)&(x))+1)
-+
-+static inline void __set_64bit_var (unsigned long long *ptr,
-+                       unsigned long long value)
-+{
-+      __set_64bit(ptr,ll_low(value), ll_high(value));
-+}
-+
-+#define set_64bit(ptr,value) \
-+(__builtin_constant_p(value) ? \
-+ __set_64bit_constant(ptr, value) : \
-+ __set_64bit_var(ptr, value) )
-+
-+#define _set_64bit(ptr,value) \
-+(__builtin_constant_p(value) ? \
-+ __set_64bit(ptr, (unsigned int)(value), (unsigned int)((value)>>32ULL) ) : \
-+ __set_64bit(ptr, ll_low(value), ll_high(value)) )
-+
-+#endif
-+
-+/*
-+ * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
-+ * Note 2: xchg has side effect, so that attribute volatile is necessary,
-+ *      but generally the primitive is invalid, *ptr is output argument. --ANK
-+ */
-+static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+{
-+      switch (size) {
-+              case 1:
-+                      __asm__ __volatile__("xchgb %b0,%1"
-+                              :"=q" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+              case 2:
-+                      __asm__ __volatile__("xchgw %w0,%1"
-+                              :"=r" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+              case 4:
-+                      __asm__ __volatile__("xchgl %0,%1"
-+                              :"=r" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+      }
-+      return x;
-+}
-+
-+/*
-+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
-+ * store NEW in MEM.  Return the initial value in MEM.  Success is
-+ * indicated by comparing RETURN with OLD.
-+ */
-+
-+#ifdef CONFIG_X86_CMPXCHG
-+#define __HAVE_ARCH_CMPXCHG 1
-+#define cmpxchg(ptr,o,n)\
-+      ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-+                                      (unsigned long)(n),sizeof(*(ptr))))
-+#endif
-+
-+static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-+                                    unsigned long new, int size)
-+{
-+      unsigned long prev;
-+      switch (size) {
-+      case 1:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-+                                   : "=a"(prev)
-+                                   : "q"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 2:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 4:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      }
-+      return old;
-+}
-+
-+#ifndef CONFIG_X86_CMPXCHG
-+/*
-+ * Building a kernel capable running on 80386. It may be necessary to
-+ * simulate the cmpxchg on the 80386 CPU. For that purpose we define
-+ * a function for each of the sizes we support.
-+ */
-+
-+extern unsigned long cmpxchg_386_u8(volatile void *, u8, u8);
-+extern unsigned long cmpxchg_386_u16(volatile void *, u16, u16);
-+extern unsigned long cmpxchg_386_u32(volatile void *, u32, u32);
-+
-+static inline unsigned long cmpxchg_386(volatile void *ptr, unsigned long old,
-+                                    unsigned long new, int size)
-+{
-+      switch (size) {
-+      case 1:
-+              return cmpxchg_386_u8(ptr, old, new);
-+      case 2:
-+              return cmpxchg_386_u16(ptr, old, new);
-+      case 4:
-+              return cmpxchg_386_u32(ptr, old, new);
-+      }
-+      return old;
-+}
-+
-+#define cmpxchg(ptr,o,n)                                              \
-+({                                                                    \
-+      __typeof__(*(ptr)) __ret;                                       \
-+      if (likely(boot_cpu_data.x86 > 3))                              \
-+              __ret = __cmpxchg((ptr), (unsigned long)(o),            \
-+                                      (unsigned long)(n), sizeof(*(ptr))); \
-+      else                                                            \
-+              __ret = cmpxchg_386((ptr), (unsigned long)(o),          \
-+                                      (unsigned long)(n), sizeof(*(ptr))); \
-+      __ret;                                                          \
-+})
-+#endif
-+
-+#ifdef CONFIG_X86_CMPXCHG64
-+
-+static inline unsigned long long __cmpxchg64(volatile void *ptr, unsigned long long old,
-+                                    unsigned long long new)
-+{
-+      unsigned long long prev;
-+      __asm__ __volatile__(LOCK_PREFIX "cmpxchg8b %3"
-+                           : "=A"(prev)
-+                           : "b"((unsigned long)new),
-+                             "c"((unsigned long)(new >> 32)),
-+                             "m"(*__xg(ptr)),
-+                             "0"(old)
-+                           : "memory");
-+      return prev;
-+}
-+
-+#define cmpxchg64(ptr,o,n)\
-+      ((__typeof__(*(ptr)))__cmpxchg64((ptr),(unsigned long long)(o),\
-+                                      (unsigned long long)(n)))
-+
-+#endif
-+    
-+/*
-+ * Force strict CPU ordering.
-+ * And yes, this is required on UP too when we're talking
-+ * to devices.
-+ *
-+ * For now, "wmb()" doesn't actually do anything, as all
-+ * Intel CPU's follow what Intel calls a *Processor Order*,
-+ * in which all writes are seen in the program order even
-+ * outside the CPU.
-+ *
-+ * I expect future Intel CPU's to have a weaker ordering,
-+ * but I'd also expect them to finally get their act together
-+ * and add some real memory barriers if so.
-+ *
-+ * Some non intel clones support out of order store. wmb() ceases to be a
-+ * nop for these.
-+ */
-+ 
-+
-+/* 
-+ * Actually only lfence would be needed for mb() because all stores done 
-+ * by the kernel should be already ordered. But keep a full barrier for now. 
-+ */
-+
-+#define mb() alternative("lock; addl $0,0(%%esp)", "mfence", X86_FEATURE_XMM2)
-+#define rmb() alternative("lock; addl $0,0(%%esp)", "lfence", X86_FEATURE_XMM2)
-+
-+/**
-+ * read_barrier_depends - Flush all pending reads that subsequents reads
-+ * depend on.
-+ *
-+ * No data-dependent reads from memory-like regions are ever reordered
-+ * over this barrier.  All reads preceding this primitive are guaranteed
-+ * to access memory (but not necessarily other CPUs' caches) before any
-+ * reads following this primitive that depend on the data return by
-+ * any of the preceding reads.  This primitive is much lighter weight than
-+ * rmb() on most CPUs, and is never heavier weight than is
-+ * rmb().
-+ *
-+ * These ordering constraints are respected by both the local CPU
-+ * and the compiler.
-+ *
-+ * Ordering is not guaranteed by anything other than these primitives,
-+ * not even by data dependencies.  See the documentation for
-+ * memory_barrier() for examples and URLs to more information.
-+ *
-+ * For example, the following code would force ordering (the initial
-+ * value of "a" is zero, "b" is one, and "p" is "&a"):
-+ *
-+ * <programlisting>
-+ *    CPU 0                           CPU 1
-+ *
-+ *    b = 2;
-+ *    memory_barrier();
-+ *    p = &b;                         q = p;
-+ *                                    read_barrier_depends();
-+ *                                    d = *q;
-+ * </programlisting>
-+ *
-+ * because the read of "*q" depends on the read of "p" and these
-+ * two reads are separated by a read_barrier_depends().  However,
-+ * the following code, with the same initial values for "a" and "b":
-+ *
-+ * <programlisting>
-+ *    CPU 0                           CPU 1
-+ *
-+ *    a = 2;
-+ *    memory_barrier();
-+ *    b = 3;                          y = b;
-+ *                                    read_barrier_depends();
-+ *                                    x = a;
-+ * </programlisting>
-+ *
-+ * does not enforce ordering, since there is no data dependency between
-+ * the read of "a" and the read of "b".  Therefore, on some CPUs, such
-+ * as Alpha, "y" could be set to 3 and "x" to 0.  Use rmb()
-+ * in cases like this where there are no data dependencies.
-+ **/
-+
-+#define read_barrier_depends()        do { } while(0)
-+
-+#ifdef CONFIG_X86_OOSTORE
-+/* Actually there are no OOO store capable CPUs for now that do SSE, 
-+   but make it already an possibility. */
-+#define wmb() alternative("lock; addl $0,0(%%esp)", "sfence", X86_FEATURE_XMM)
-+#else
-+#define wmb() __asm__ __volatile__ ("": : :"memory")
-+#endif
-+
-+#ifdef CONFIG_SMP
-+#define smp_mb()      mb()
-+#define smp_rmb()     rmb()
-+#define smp_wmb()     wmb()
-+#define smp_read_barrier_depends()    read_barrier_depends()
-+#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-+#else
-+#define smp_mb()      barrier()
-+#define smp_rmb()     barrier()
-+#define smp_wmb()     barrier()
-+#define smp_read_barrier_depends()    do { } while(0)
-+#define set_mb(var, value) do { var = value; barrier(); } while (0)
-+#endif
-+
-+#include <linux/irqflags.h>
-+
-+/*
-+ * disable hlt during certain critical i/o operations
-+ */
-+#define HAVE_DISABLE_HLT
-+void disable_hlt(void);
-+void enable_hlt(void);
-+
-+extern int es7000_plat;
-+void cpu_idle_wait(void);
-+
-+/*
-+ * On SMP systems, when the scheduler does migration-cost autodetection,
-+ * it needs a way to flush as much of the CPU's caches as possible:
-+ */
-+static inline void sched_cacheflush(void)
-+{
-+      wbinvd();
-+}
-+
-+extern unsigned long arch_align_stack(unsigned long sp);
-+extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
-+
-+void default_idle(void);
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/tlbflush_32.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/tlbflush_32.h 2007-11-26 16:59:25.000000000 +0100
-@@ -0,0 +1,101 @@
-+#ifndef _I386_TLBFLUSH_H
-+#define _I386_TLBFLUSH_H
-+
-+#include <linux/mm.h>
-+#include <asm/processor.h>
-+
-+#define __flush_tlb() xen_tlb_flush()
-+#define __flush_tlb_global() xen_tlb_flush()
-+#define __flush_tlb_all() xen_tlb_flush()
-+
-+extern unsigned long pgkern_mask;
-+
-+#define cpu_has_invlpg        (boot_cpu_data.x86 > 3)
-+
-+#define __flush_tlb_single(addr) xen_invlpg(addr)
-+
-+#define __flush_tlb_one(addr) __flush_tlb_single(addr)
-+
-+/*
-+ * TLB flushing:
-+ *
-+ *  - flush_tlb() flushes the current mm struct TLBs
-+ *  - flush_tlb_all() flushes all processes TLBs
-+ *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
-+ *  - flush_tlb_page(vma, vmaddr) flushes one page
-+ *  - flush_tlb_range(vma, start, end) flushes a range of pages
-+ *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
-+ *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
-+ *
-+ * ..but the i386 has somewhat limited tlb flushing capabilities,
-+ * and page-granular flushes are available only on i486 and up.
-+ */
-+
-+#ifndef CONFIG_SMP
-+
-+#define flush_tlb() __flush_tlb()
-+#define flush_tlb_all() __flush_tlb_all()
-+#define local_flush_tlb() __flush_tlb()
-+
-+static inline void flush_tlb_mm(struct mm_struct *mm)
-+{
-+      if (mm == current->active_mm)
-+              __flush_tlb();
-+}
-+
-+static inline void flush_tlb_page(struct vm_area_struct *vma,
-+      unsigned long addr)
-+{
-+      if (vma->vm_mm == current->active_mm)
-+              __flush_tlb_one(addr);
-+}
-+
-+static inline void flush_tlb_range(struct vm_area_struct *vma,
-+      unsigned long start, unsigned long end)
-+{
-+      if (vma->vm_mm == current->active_mm)
-+              __flush_tlb();
-+}
-+
-+#else
-+
-+#include <asm/smp.h>
-+
-+#define local_flush_tlb() \
-+      __flush_tlb()
-+
-+#define flush_tlb_all xen_tlb_flush_all
-+#define flush_tlb_current_task() xen_tlb_flush_mask(&current->mm->cpu_vm_mask)
-+#define flush_tlb_mm(mm) xen_tlb_flush_mask(&(mm)->cpu_vm_mask)
-+#define flush_tlb_page(vma, va) xen_invlpg_mask(&(vma)->vm_mm->cpu_vm_mask, va)
-+
-+#define flush_tlb()   flush_tlb_current_task()
-+
-+static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
-+{
-+      flush_tlb_mm(vma->vm_mm);
-+}
-+
-+#define TLBSTATE_OK   1
-+#define TLBSTATE_LAZY 2
-+
-+struct tlb_state
-+{
-+      struct mm_struct *active_mm;
-+      int state;
-+      char __cacheline_padding[L1_CACHE_BYTES-8];
-+};
-+DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate);
-+
-+
-+#endif
-+
-+#define flush_tlb_kernel_range(start, end) flush_tlb_all()
-+
-+static inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+      /* i386 does not keep any page table caches in TLB */
-+}
-+
-+#endif /* _I386_TLBFLUSH_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/vga.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/vga.h 2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,20 @@
-+/*
-+ *    Access to VGA videoram
-+ *
-+ *    (c) 1998 Martin Mares <mj@ucw.cz>
-+ */
-+
-+#ifndef _LINUX_ASM_VGA_H_
-+#define _LINUX_ASM_VGA_H_
-+
-+/*
-+ *    On the PC, we can just recalculate addresses and then
-+ *    access the videoram directly without any black magic.
-+ */
-+
-+#define VGA_MAP_MEM(x,s) (unsigned long)isa_bus_to_virt(x)
-+
-+#define vga_readb(x) (*(x))
-+#define vga_writeb(x,y) (*(y) = (x))
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/xenoprof.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/xenoprof.h    2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,48 @@
-+/******************************************************************************
-+ * asm-i386/mach-xen/asm/xenoprof.h
-+ *
-+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
-+ *                    VA Linux Systems Japan K.K.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ */
-+#ifndef __ASM_XENOPROF_H__
-+#define __ASM_XENOPROF_H__
-+#ifdef CONFIG_XEN
-+
-+struct super_block;
-+struct dentry;
-+int xenoprof_create_files(struct super_block * sb, struct dentry * root);
-+#define HAVE_XENOPROF_CREATE_FILES
-+
-+struct xenoprof_init;
-+void xenoprof_arch_init_counter(struct xenoprof_init *init);
-+void xenoprof_arch_counter(void);
-+void xenoprof_arch_start(void);
-+void xenoprof_arch_stop(void);
-+
-+struct xenoprof_arch_shared_buffer {
-+      /* nothing */
-+};
-+struct xenoprof_shared_buffer;
-+void xenoprof_arch_unmap_shared_buffer(struct xenoprof_shared_buffer* sbuf);
-+struct xenoprof_get_buffer;
-+int xenoprof_arch_map_shared_buffer(struct xenoprof_get_buffer* get_buffer, struct xenoprof_shared_buffer* sbuf);
-+struct xenoprof_passive;
-+int xenoprof_arch_set_passive(struct xenoprof_passive* pdomain, struct xenoprof_shared_buffer* sbuf);
-+
-+#endif /* CONFIG_XEN */
-+#endif /* __ASM_XENOPROF_H__ */
-Index: head-2008-11-25/include/asm-x86/mach-xen/irq_vectors.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/irq_vectors.h     2008-09-25 13:55:32.000000000 +0200
-@@ -0,0 +1,125 @@
-+/*
-+ * This file should contain #defines for all of the interrupt vector
-+ * numbers used by this architecture.
-+ *
-+ * In addition, there are some standard defines:
-+ *
-+ *    FIRST_EXTERNAL_VECTOR:
-+ *            The first free place for external interrupts
-+ *
-+ *    SYSCALL_VECTOR:
-+ *            The IRQ vector a syscall makes the user to kernel transition
-+ *            under.
-+ *
-+ *    TIMER_IRQ:
-+ *            The IRQ number the timer interrupt comes in at.
-+ *
-+ *    NR_IRQS:
-+ *            The total number of interrupt vectors (including all the
-+ *            architecture specific interrupts) needed.
-+ *
-+ */                   
-+#ifndef _ASM_IRQ_VECTORS_H
-+#define _ASM_IRQ_VECTORS_H
-+
-+/*
-+ * IDT vectors usable for external interrupt sources start
-+ * at 0x20:
-+ */
-+#define FIRST_EXTERNAL_VECTOR 0x20
-+
-+#define SYSCALL_VECTOR                0x80
-+
-+/*
-+ * Vectors 0x20-0x2f are used for ISA interrupts.
-+ */
-+
-+#if 0
-+/*
-+ * Special IRQ vectors used by the SMP architecture, 0xf0-0xff
-+ *
-+ *  some of the following vectors are 'rare', they are merged
-+ *  into a single vector (CALL_FUNCTION_VECTOR) to save vector space.
-+ *  TLB, reschedule and local APIC vectors are performance-critical.
-+ *
-+ *  Vectors 0xf0-0xfa are free (reserved for future Linux use).
-+ */
-+#define SPURIOUS_APIC_VECTOR  0xff
-+#define ERROR_APIC_VECTOR     0xfe
-+#define INVALIDATE_TLB_VECTOR 0xfd
-+#define RESCHEDULE_VECTOR     0xfc
-+#define CALL_FUNCTION_VECTOR  0xfb
-+
-+#define THERMAL_APIC_VECTOR   0xf0
-+/*
-+ * Local APIC timer IRQ vector is on a different priority level,
-+ * to work around the 'lost local interrupt if more than 2 IRQ
-+ * sources per level' errata.
-+ */
-+#define LOCAL_TIMER_VECTOR    0xef
-+#endif
-+
-+#define SPURIOUS_APIC_VECTOR  0xff
-+#define ERROR_APIC_VECTOR     0xfe
-+
-+/*
-+ * First APIC vector available to drivers: (vectors 0x30-0xee)
-+ * we start at 0x31 to spread out vectors evenly between priority
-+ * levels. (0x80 is the syscall vector)
-+ */
-+#define FIRST_DEVICE_VECTOR   0x31
-+#define FIRST_SYSTEM_VECTOR   0xef
-+
-+/*
-+ * 16 8259A IRQ's, 208 potential APIC interrupt sources.
-+ * Right now the APIC is mostly only used for SMP.
-+ * 256 vectors is an architectural limit. (we can have
-+ * more than 256 devices theoretically, but they will
-+ * have to use shared interrupts)
-+ * Since vectors 0x00-0x1f are used/reserved for the CPU,
-+ * the usable vector space is 0x20-0xff (224 vectors)
-+ */
-+
-+#define RESCHEDULE_VECTOR     0
-+#define CALL_FUNCTION_VECTOR  1
-+#define NR_IPIS                       2
-+
-+/*
-+ * The maximum number of vectors supported by i386 processors
-+ * is limited to 256. For processors other than i386, NR_VECTORS
-+ * should be changed accordingly.
-+ */
-+#define NR_VECTORS 256
-+
-+#define FPU_IRQ                       13
-+
-+#define       FIRST_VM86_IRQ          3
-+#define LAST_VM86_IRQ         15
-+#define invalid_vm86_irq(irq) ((irq) < 3 || (irq) > 15)
-+
-+/*
-+ * The flat IRQ space is divided into two regions:
-+ *  1. A one-to-one mapping of real physical IRQs. This space is only used
-+ *     if we have physical device-access privilege. This region is at the 
-+ *     start of the IRQ space so that existing device drivers do not need
-+ *     to be modified to translate physical IRQ numbers into our IRQ space.
-+ *  3. A dynamic mapping of inter-domain and Xen-sourced virtual IRQs. These
-+ *     are bound using the provided bind/unbind functions.
-+ */
-+
-+#define PIRQ_BASE             0
-+#if !defined(MAX_IO_APICS)
-+# define NR_PIRQS             (NR_VECTORS + 32 * NR_CPUS)
-+#elif NR_CPUS < MAX_IO_APICS
-+# define NR_PIRQS             (NR_VECTORS + 32 * NR_CPUS)
-+#else
-+# define NR_PIRQS             (NR_VECTORS + 32 * MAX_IO_APICS)
-+#endif
-+
-+#define DYNIRQ_BASE           (PIRQ_BASE + NR_PIRQS)
-+#define NR_DYNIRQS            256
-+
-+#define NR_IRQS                       (NR_PIRQS + NR_DYNIRQS)
-+#define NR_IRQ_VECTORS                NR_IRQS
-+
-+#endif /* _ASM_IRQ_VECTORS_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/mach_traps.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/mach_traps.h      2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,33 @@
-+/*
-+ *  include/asm-xen/asm-i386/mach-xen/mach_traps.h
-+ *
-+ *  Machine specific NMI handling for Xen
-+ */
-+#ifndef _MACH_TRAPS_H
-+#define _MACH_TRAPS_H
-+
-+#include <linux/bitops.h>
-+#include <xen/interface/nmi.h>
-+
-+static inline void clear_mem_error(unsigned char reason) {}
-+static inline void clear_io_check_error(unsigned char reason) {}
-+
-+static inline unsigned char get_nmi_reason(void)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      unsigned char reason = 0;
-+
-+      /* construct a value which looks like it came from
-+       * port 0x61.
-+       */
-+      if (test_bit(_XEN_NMIREASON_io_error, &s->arch.nmi_reason))
-+              reason |= 0x40;
-+      if (test_bit(_XEN_NMIREASON_parity_error, &s->arch.nmi_reason))
-+              reason |= 0x80;
-+
-+        return reason;
-+}
-+
-+static inline void reassert_nmi(void) {}
-+
-+#endif /* !_MACH_TRAPS_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/setup_arch.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/setup_arch.h      2007-06-12 13:14:02.000000000 +0200
-@@ -0,0 +1,5 @@
-+/* Hook to call BIOS initialisation function */
-+
-+#define ARCH_SETUP machine_specific_arch_setup();
-+
-+void __init machine_specific_arch_setup(void);
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/desc_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/desc_64.h     2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,265 @@
-+/* Written 2000 by Andi Kleen */ 
-+#ifndef __ARCH_DESC_H
-+#define __ARCH_DESC_H
-+
-+#include <linux/threads.h>
-+#include <asm/ldt.h>
-+
-+#ifndef __ASSEMBLY__
-+
-+#include <linux/string.h>
-+#include <linux/smp.h>
-+
-+#include <asm/segment.h>
-+#include <asm/mmu.h>
-+
-+// 8 byte segment descriptor
-+struct desc_struct { 
-+      u16 limit0;
-+      u16 base0;
-+      unsigned base1 : 8, type : 4, s : 1, dpl : 2, p : 1;
-+      unsigned limit : 4, avl : 1, l : 1, d : 1, g : 1, base2 : 8;
-+} __attribute__((packed)); 
-+
-+struct n_desc_struct { 
-+      unsigned int a,b;
-+};    
-+
-+enum { 
-+      GATE_INTERRUPT = 0xE, 
-+      GATE_TRAP = 0xF,        
-+      GATE_CALL = 0xC,
-+};    
-+
-+// 16byte gate
-+struct gate_struct {          
-+      u16 offset_low;
-+      u16 segment; 
-+      unsigned ist : 3, zero0 : 5, type : 5, dpl : 2, p : 1;
-+      u16 offset_middle;
-+      u32 offset_high;
-+      u32 zero1; 
-+} __attribute__((packed));
-+
-+#define PTR_LOW(x) ((unsigned long)(x) & 0xFFFF) 
-+#define PTR_MIDDLE(x) (((unsigned long)(x) >> 16) & 0xFFFF)
-+#define PTR_HIGH(x) ((unsigned long)(x) >> 32)
-+
-+enum { 
-+      DESC_TSS = 0x9,
-+      DESC_LDT = 0x2,
-+}; 
-+
-+// LDT or TSS descriptor in the GDT. 16 bytes.
-+struct ldttss_desc { 
-+      u16 limit0;
-+      u16 base0;
-+      unsigned base1 : 8, type : 5, dpl : 2, p : 1;
-+      unsigned limit1 : 4, zero0 : 3, g : 1, base2 : 8;
-+      u32 base3;
-+      u32 zero1; 
-+} __attribute__((packed)); 
-+
-+struct desc_ptr {
-+      unsigned short size;
-+      unsigned long address;
-+} __attribute__((packed)) ;
-+
-+extern struct desc_ptr idt_descr, cpu_gdt_descr[NR_CPUS];
-+
-+extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
-+
-+#define load_TR_desc() asm volatile("ltr %w0"::"r" (GDT_ENTRY_TSS*8))
-+#define load_LDT_desc() asm volatile("lldt %w0"::"r" (GDT_ENTRY_LDT*8))
-+
-+static inline void clear_LDT(void)
-+{
-+      int cpu = get_cpu();
-+
-+      /*
-+       * NB. We load the default_ldt for lcall7/27 handling on demand, as
-+       * it slows down context switching. Noone uses it anyway.
-+       */
-+      cpu = cpu;              /* XXX avoid compiler warning */
-+      xen_set_ldt(NULL, 0);
-+      put_cpu();
-+}
-+
-+/*
-+ * This is the ldt that every process will get unless we need
-+ * something other than this.
-+ */
-+extern struct desc_struct default_ldt[];
-+#ifndef CONFIG_X86_NO_IDT
-+extern struct gate_struct idt_table[]; 
-+#endif
-+extern struct desc_ptr cpu_gdt_descr[];
-+
-+/* the cpu gdt accessor */
-+#define cpu_gdt(_cpu) ((struct desc_struct *)cpu_gdt_descr[_cpu].address)
-+
-+static inline void _set_gate(void *adr, unsigned type, unsigned long func, unsigned dpl, unsigned ist)  
-+{
-+      struct gate_struct s;   
-+      s.offset_low = PTR_LOW(func); 
-+      s.segment = __KERNEL_CS;
-+      s.ist = ist; 
-+      s.p = 1;
-+      s.dpl = dpl; 
-+      s.zero0 = 0;
-+      s.zero1 = 0; 
-+      s.type = type; 
-+      s.offset_middle = PTR_MIDDLE(func); 
-+      s.offset_high = PTR_HIGH(func); 
-+      /* does not need to be atomic because it is only done once at setup time */ 
-+      memcpy(adr, &s, 16); 
-+} 
-+
-+#ifndef CONFIG_X86_NO_IDT
-+static inline void set_intr_gate(int nr, void *func) 
-+{ 
-+      BUG_ON((unsigned)nr > 0xFF);
-+      _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, 0); 
-+} 
-+
-+static inline void set_intr_gate_ist(int nr, void *func, unsigned ist) 
-+{ 
-+      BUG_ON((unsigned)nr > 0xFF);
-+      _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 0, ist); 
-+} 
-+
-+static inline void set_system_gate(int nr, void *func) 
-+{ 
-+      BUG_ON((unsigned)nr > 0xFF);
-+      _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, 0); 
-+} 
-+
-+static inline void set_system_gate_ist(int nr, void *func, unsigned ist)
-+{
-+      _set_gate(&idt_table[nr], GATE_INTERRUPT, (unsigned long) func, 3, ist);
-+}
-+#endif
-+
-+static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned type, 
-+                                       unsigned size) 
-+{ 
-+      struct ldttss_desc d;
-+      memset(&d,0,sizeof(d)); 
-+      d.limit0 = size & 0xFFFF;
-+      d.base0 = PTR_LOW(tss); 
-+      d.base1 = PTR_MIDDLE(tss) & 0xFF; 
-+      d.type = type;
-+      d.p = 1; 
-+      d.limit1 = (size >> 16) & 0xF;
-+      d.base2 = (PTR_MIDDLE(tss) >> 8) & 0xFF; 
-+      d.base3 = PTR_HIGH(tss); 
-+      memcpy(ptr, &d, 16); 
-+}
-+
-+#ifndef CONFIG_X86_NO_TSS
-+static inline void set_tss_desc(unsigned cpu, void *addr)
-+{ 
-+      /*
-+       * sizeof(unsigned long) coming from an extra "long" at the end
-+       * of the iobitmap. See tss_struct definition in processor.h
-+       *
-+       * -1? seg base+limit should be pointing to the address of the
-+       * last valid byte
-+       */
-+      set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_TSS], 
-+              (unsigned long)addr, DESC_TSS,
-+              IO_BITMAP_OFFSET + IO_BITMAP_BYTES + sizeof(unsigned long) - 1);
-+} 
-+#endif
-+
-+static inline void set_ldt_desc(unsigned cpu, void *addr, int size)
-+{ 
-+      set_tssldt_descriptor(&cpu_gdt(cpu)[GDT_ENTRY_LDT], (unsigned long)addr,
-+                            DESC_LDT, size * 8 - 1);
-+}
-+
-+static inline void set_seg_base(unsigned cpu, int entry, void *base)
-+{ 
-+      struct desc_struct *d = &cpu_gdt(cpu)[entry];
-+      u32 addr = (u32)(u64)base;
-+      BUG_ON((u64)base >> 32); 
-+      d->base0 = addr & 0xffff;
-+      d->base1 = (addr >> 16) & 0xff;
-+      d->base2 = (addr >> 24) & 0xff;
-+} 
-+
-+#define LDT_entry_a(info) \
-+      ((((info)->base_addr & 0x0000ffff) << 16) | ((info)->limit & 0x0ffff))
-+/* Don't allow setting of the lm bit. It is useless anyways because 
-+   64bit system calls require __USER_CS. */ 
-+#define LDT_entry_b(info) \
-+      (((info)->base_addr & 0xff000000) | \
-+      (((info)->base_addr & 0x00ff0000) >> 16) | \
-+      ((info)->limit & 0xf0000) | \
-+      (((info)->read_exec_only ^ 1) << 9) | \
-+      ((info)->contents << 10) | \
-+      (((info)->seg_not_present ^ 1) << 15) | \
-+      ((info)->seg_32bit << 22) | \
-+      ((info)->limit_in_pages << 23) | \
-+      ((info)->useable << 20) | \
-+      /* ((info)->lm << 21) | */ \
-+      0x7000)
-+
-+#define LDT_empty(info) (\
-+      (info)->base_addr       == 0    && \
-+      (info)->limit           == 0    && \
-+      (info)->contents        == 0    && \
-+      (info)->read_exec_only  == 1    && \
-+      (info)->seg_32bit       == 0    && \
-+      (info)->limit_in_pages  == 0    && \
-+      (info)->seg_not_present == 1    && \
-+      (info)->useable         == 0    && \
-+      (info)->lm              == 0)
-+
-+#if TLS_SIZE != 24
-+# error update this code.
-+#endif
-+
-+static inline void load_TLS(struct thread_struct *t, unsigned int cpu)
-+{
-+#if 0
-+      u64 *gdt = (u64 *)(cpu_gdt(cpu) + GDT_ENTRY_TLS_MIN);
-+      gdt[0] = t->tls_array[0];
-+      gdt[1] = t->tls_array[1];
-+      gdt[2] = t->tls_array[2];
-+#endif
-+#define C(i) \
-+      if (HYPERVISOR_update_descriptor(virt_to_machine(&cpu_gdt(cpu)[GDT_ENTRY_TLS_MIN + i]), \
-+                                               t->tls_array[i])) \
-+              BUG();
-+
-+      C(0); C(1); C(2);
-+#undef C
-+} 
-+
-+/*
-+ * load one particular LDT into the current CPU
-+ */
-+static inline void load_LDT_nolock (mm_context_t *pc, int cpu)
-+{
-+      void *segments = pc->ldt;
-+      int count = pc->size;
-+
-+      if (likely(!count))
-+              segments = NULL;
-+
-+      xen_set_ldt(segments, count);
-+}
-+
-+static inline void load_LDT(mm_context_t *pc)
-+{
-+      int cpu = get_cpu();
-+      load_LDT_nolock(pc, cpu);
-+      put_cpu();
-+}
-+
-+extern struct desc_ptr idt_descr;
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/dma-mapping_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/dma-mapping_64.h      2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,207 @@
-+#ifndef _X8664_DMA_MAPPING_H
-+#define _X8664_DMA_MAPPING_H 1
-+
-+/*
-+ * IOMMU interface. See Documentation/DMA-mapping.txt and DMA-API.txt for
-+ * documentation.
-+ */
-+
-+
-+#include <asm/scatterlist.h>
-+#include <asm/io.h>
-+#include <asm/swiotlb.h>
-+
-+struct dma_mapping_ops {
-+      int             (*mapping_error)(dma_addr_t dma_addr);
-+      void*           (*alloc_coherent)(struct device *dev, size_t size,
-+                                dma_addr_t *dma_handle, gfp_t gfp);
-+      void            (*free_coherent)(struct device *dev, size_t size,
-+                                void *vaddr, dma_addr_t dma_handle);
-+      dma_addr_t      (*map_single)(struct device *hwdev, void *ptr,
-+                                size_t size, int direction);
-+      /* like map_single, but doesn't check the device mask */
-+      dma_addr_t      (*map_simple)(struct device *hwdev, char *ptr,
-+                                size_t size, int direction);
-+      void            (*unmap_single)(struct device *dev, dma_addr_t addr,
-+                              size_t size, int direction);
-+      void            (*sync_single_for_cpu)(struct device *hwdev,
-+                              dma_addr_t dma_handle, size_t size,
-+                              int direction);
-+      void            (*sync_single_for_device)(struct device *hwdev,
-+                                dma_addr_t dma_handle, size_t size,
-+                              int direction);
-+      void            (*sync_single_range_for_cpu)(struct device *hwdev,
-+                                dma_addr_t dma_handle, unsigned long offset,
-+                              size_t size, int direction);
-+      void            (*sync_single_range_for_device)(struct device *hwdev,
-+                              dma_addr_t dma_handle, unsigned long offset,
-+                              size_t size, int direction);
-+      void            (*sync_sg_for_cpu)(struct device *hwdev,
-+                                struct scatterlist *sg, int nelems,
-+                              int direction);
-+      void            (*sync_sg_for_device)(struct device *hwdev,
-+                              struct scatterlist *sg, int nelems,
-+                              int direction);
-+      int             (*map_sg)(struct device *hwdev, struct scatterlist *sg,
-+                              int nents, int direction);
-+      void            (*unmap_sg)(struct device *hwdev,
-+                              struct scatterlist *sg, int nents,
-+                              int direction);
-+      int             (*dma_supported)(struct device *hwdev, u64 mask);
-+      int             is_phys;
-+};
-+
-+extern dma_addr_t bad_dma_address;
-+extern struct dma_mapping_ops* dma_ops;
-+extern int iommu_merge;
-+
-+static inline int valid_dma_direction(int dma_direction)
-+{
-+      return ((dma_direction == DMA_BIDIRECTIONAL) ||
-+              (dma_direction == DMA_TO_DEVICE) ||
-+              (dma_direction == DMA_FROM_DEVICE));
-+}
-+
-+#if 0
-+static inline int dma_mapping_error(dma_addr_t dma_addr)
-+{
-+      if (dma_ops->mapping_error)
-+              return dma_ops->mapping_error(dma_addr);
-+
-+      return (dma_addr == bad_dma_address);
-+}
-+
-+extern void *dma_alloc_coherent(struct device *dev, size_t size,
-+                              dma_addr_t *dma_handle, gfp_t gfp);
-+extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
-+                            dma_addr_t dma_handle);
-+
-+static inline dma_addr_t
-+dma_map_single(struct device *hwdev, void *ptr, size_t size,
-+             int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      return dma_ops->map_single(hwdev, ptr, size, direction);
-+}
-+
-+static inline void
-+dma_unmap_single(struct device *dev, dma_addr_t addr,size_t size,
-+               int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      dma_ops->unmap_single(dev, addr, size, direction);
-+}
-+
-+#define dma_map_page(dev,page,offset,size,dir) \
-+      dma_map_single((dev), page_address(page)+(offset), (size), (dir))
-+
-+#define dma_unmap_page dma_unmap_single
-+
-+static inline void
-+dma_sync_single_for_cpu(struct device *hwdev, dma_addr_t dma_handle,
-+                      size_t size, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_single_for_cpu)
-+              dma_ops->sync_single_for_cpu(hwdev, dma_handle, size,
-+                                           direction);
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_single_for_device(struct device *hwdev, dma_addr_t dma_handle,
-+                         size_t size, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_single_for_device)
-+              dma_ops->sync_single_for_device(hwdev, dma_handle, size,
-+                                              direction);
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_single_range_for_cpu(struct device *hwdev, dma_addr_t dma_handle,
-+                            unsigned long offset, size_t size, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_single_range_for_cpu) {
-+              dma_ops->sync_single_range_for_cpu(hwdev, dma_handle, offset, size, direction);
-+      }
-+
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_single_range_for_device(struct device *hwdev, dma_addr_t dma_handle,
-+                               unsigned long offset, size_t size, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_single_range_for_device)
-+              dma_ops->sync_single_range_for_device(hwdev, dma_handle,
-+                                                    offset, size, direction);
-+
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg,
-+                  int nelems, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_sg_for_cpu)
-+              dma_ops->sync_sg_for_cpu(hwdev, sg, nelems, direction);
-+      flush_write_buffers();
-+}
-+
-+static inline void
-+dma_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
-+                     int nelems, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      if (dma_ops->sync_sg_for_device) {
-+              dma_ops->sync_sg_for_device(hwdev, sg, nelems, direction);
-+      }
-+
-+      flush_write_buffers();
-+}
-+
-+static inline int
-+dma_map_sg(struct device *hwdev, struct scatterlist *sg, int nents, int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      return dma_ops->map_sg(hwdev, sg, nents, direction);
-+}
-+
-+static inline void
-+dma_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nents,
-+           int direction)
-+{
-+      BUG_ON(!valid_dma_direction(direction));
-+      dma_ops->unmap_sg(hwdev, sg, nents, direction);
-+}
-+
-+extern int dma_supported(struct device *hwdev, u64 mask);
-+
-+/* same for gart, swiotlb, and nommu */
-+static inline int dma_get_cache_alignment(void)
-+{
-+      return boot_cpu_data.x86_clflush_size;
-+}
-+
-+#define dma_is_consistent(h) 1
-+
-+extern int dma_set_mask(struct device *dev, u64 mask);
-+
-+static inline void
-+dma_cache_sync(void *vaddr, size_t size, enum dma_data_direction dir)
-+{
-+      flush_write_buffers();
-+}
-+
-+extern struct device fallback_dev;
-+extern int panic_on_overflow;
-+#endif
-+
-+#endif /* _X8664_DMA_MAPPING_H */
-+
-+#include <asm-i386/mach-xen/asm/dma-mapping.h>
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/fixmap_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/fixmap_64.h   2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,112 @@
-+/*
-+ * fixmap.h: compile-time virtual memory allocation
-+ *
-+ * This file is subject to the terms and conditions of the GNU General Public
-+ * License.  See the file "COPYING" in the main directory of this archive
-+ * for more details.
-+ *
-+ * Copyright (C) 1998 Ingo Molnar
-+ */
-+
-+#ifndef _ASM_FIXMAP_H
-+#define _ASM_FIXMAP_H
-+
-+#include <linux/kernel.h>
-+#include <asm/apicdef.h>
-+#include <asm/page.h>
-+#include <asm/vsyscall.h>
-+#include <asm/vsyscall32.h>
-+#include <asm/acpi.h>
-+
-+/*
-+ * Here we define all the compile-time 'special' virtual
-+ * addresses. The point is to have a constant address at
-+ * compile time, but to set the physical address only
-+ * in the boot process.
-+ *
-+ * these 'compile-time allocated' memory buffers are
-+ * fixed-size 4k pages. (or larger if used with an increment
-+ * highger than 1) use fixmap_set(idx,phys) to associate
-+ * physical memory with fixmap indices.
-+ *
-+ * TLB entries of such buffers will not be flushed across
-+ * task switches.
-+ */
-+
-+enum fixed_addresses {
-+      VSYSCALL_LAST_PAGE,
-+      VSYSCALL_FIRST_PAGE = VSYSCALL_LAST_PAGE + ((VSYSCALL_END-VSYSCALL_START) >> PAGE_SHIFT) - 1,
-+      VSYSCALL_HPET,
-+      FIX_HPET_BASE,
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
-+#endif
-+#ifdef CONFIG_X86_IO_APIC
-+      FIX_IO_APIC_BASE_0,
-+      FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
-+#endif
-+#ifdef CONFIG_ACPI
-+      FIX_ACPI_BEGIN,
-+      FIX_ACPI_END = FIX_ACPI_BEGIN + FIX_ACPI_PAGES - 1,
-+#endif
-+      FIX_SHARED_INFO,
-+#define NR_FIX_ISAMAPS        256
-+      FIX_ISAMAP_END,
-+      FIX_ISAMAP_BEGIN = FIX_ISAMAP_END + NR_FIX_ISAMAPS - 1,
-+      __end_of_permanent_fixed_addresses,
-+      /* temporary boot-time mappings, used before ioremap() is functional */
-+#define NR_FIX_BTMAPS 16
-+      FIX_BTMAP_END = __end_of_permanent_fixed_addresses,
-+      FIX_BTMAP_BEGIN = FIX_BTMAP_END + NR_FIX_BTMAPS - 1,
-+      __end_of_fixed_addresses
-+};
-+
-+extern void __set_fixmap (enum fixed_addresses idx,
-+                                      unsigned long phys, pgprot_t flags);
-+
-+#define set_fixmap(idx, phys) \
-+              __set_fixmap(idx, phys, PAGE_KERNEL)
-+/*
-+ * Some hardware wants to get fixmapped without caching.
-+ */
-+#define set_fixmap_nocache(idx, phys) \
-+              __set_fixmap(idx, phys, PAGE_KERNEL_NOCACHE)
-+
-+#define clear_fixmap(idx) \
-+                __set_fixmap(idx, 0, __pgprot(0))
-+
-+#define FIXADDR_TOP   (VSYSCALL_END-PAGE_SIZE)
-+#define FIXADDR_SIZE  (__end_of_fixed_addresses << PAGE_SHIFT)
-+#define FIXADDR_START (FIXADDR_TOP - FIXADDR_SIZE)
-+
-+/* Only covers 32bit vsyscalls currently. Need another set for 64bit. */
-+#define FIXADDR_USER_START    ((unsigned long)VSYSCALL32_VSYSCALL)
-+#define FIXADDR_USER_END      (FIXADDR_USER_START + PAGE_SIZE)
-+
-+#define __fix_to_virt(x)      (FIXADDR_TOP - ((x) << PAGE_SHIFT))
-+
-+extern void __this_fixmap_does_not_exist(void);
-+
-+/*
-+ * 'index to address' translation. If anyone tries to use the idx
-+ * directly without translation, we catch the bug with a NULL-deference
-+ * kernel oops. Illegal ranges of incoming indices are caught too.
-+ */
-+static __always_inline unsigned long fix_to_virt(const unsigned int idx)
-+{
-+      /*
-+       * this branch gets completely eliminated after inlining,
-+       * except when someone tries to use fixaddr indices in an
-+       * illegal way. (such as mixing up address types or using
-+       * out-of-range indices).
-+       *
-+       * If it doesn't get removed, the linker will complain
-+       * loudly with a reasonably clear error message..
-+       */
-+      if (idx >= __end_of_fixed_addresses)
-+              __this_fixmap_does_not_exist();
-+
-+        return __fix_to_virt(idx);
-+}
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/hypercall_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/hypercall_64.h        2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,408 @@
-+/******************************************************************************
-+ * hypercall.h
-+ * 
-+ * Linux-specific hypervisor handling.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser
-+ * 
-+ * 64-bit updates:
-+ *   Benjamin Liu <benjamin.liu@intel.com>
-+ *   Jun Nakajima <jun.nakajima@intel.com>
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __HYPERCALL_H__
-+#define __HYPERCALL_H__
-+
-+#include <linux/string.h> /* memcpy() */
-+#include <linux/stringify.h>
-+
-+#ifndef __HYPERVISOR_H__
-+# error "please don't include this file directly"
-+#endif
-+
-+#ifdef CONFIG_XEN
-+#define HYPERCALL_STR(name)                                   \
-+      "call hypercall_page + ("__stringify(__HYPERVISOR_##name)" * 32)"
-+#else
-+#define HYPERCALL_STR(name)                                   \
-+      "mov $("__stringify(__HYPERVISOR_##name)" * 32),%%eax; "\
-+      "add hypercall_stubs(%%rip),%%rax; "                    \
-+      "call *%%rax"
-+#endif
-+
-+#define _hypercall0(type, name)                       \
-+({                                            \
-+      type __res;                             \
-+      asm volatile (                          \
-+              HYPERCALL_STR(name)             \
-+              : "=a" (__res)                  \
-+              :                               \
-+              : "memory" );                   \
-+      __res;                                  \
-+})
-+
-+#define _hypercall1(type, name, a1)                           \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1;                                            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=D" (__ign1)                   \
-+              : "1" ((long)(a1))                              \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall2(type, name, a1, a2)                               \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2;                                    \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=D" (__ign1), "=S" (__ign2)    \
-+              : "1" ((long)(a1)), "2" ((long)(a2))            \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall3(type, name, a1, a2, a3)                   \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3;                            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-+              "=d" (__ign3)                                   \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+              "3" ((long)(a3))                                \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall4(type, name, a1, a2, a3, a4)                       \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3;                            \
-+      register long __arg4 asm("r10") = (long)(a4);           \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-+                "=d" (__ign3), "+r" (__arg4)                  \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+                "3" ((long)(a3))                              \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+#define _hypercall5(type, name, a1, a2, a3, a4, a5)           \
-+({                                                            \
-+      type __res;                                             \
-+      long __ign1, __ign2, __ign3;                            \
-+      register long __arg4 asm("r10") = (long)(a4);           \
-+      register long __arg5 asm("r8") = (long)(a5);            \
-+      asm volatile (                                          \
-+              HYPERCALL_STR(name)                             \
-+              : "=a" (__res), "=D" (__ign1), "=S" (__ign2),   \
-+                "=d" (__ign3), "+r" (__arg4), "+r" (__arg5)   \
-+              : "1" ((long)(a1)), "2" ((long)(a2)),           \
-+                "3" ((long)(a3))                              \
-+              : "memory" );                                   \
-+      __res;                                                  \
-+})
-+
-+static inline int __must_check
-+HYPERVISOR_set_trap_table(
-+      const trap_info_t *table)
-+{
-+      return _hypercall1(int, set_trap_table, table);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_mmu_update(
-+      mmu_update_t *req, unsigned int count, unsigned int *success_count,
-+      domid_t domid)
-+{
-+      return _hypercall4(int, mmu_update, req, count, success_count, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_mmuext_op(
-+      struct mmuext_op *op, unsigned int count, unsigned int *success_count,
-+      domid_t domid)
-+{
-+      return _hypercall4(int, mmuext_op, op, count, success_count, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_gdt(
-+      unsigned long *frame_list, unsigned int entries)
-+{
-+      return _hypercall2(int, set_gdt, frame_list, entries);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_stack_switch(
-+      unsigned long ss, unsigned long esp)
-+{
-+      return _hypercall2(int, stack_switch, ss, esp);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_callbacks(
-+      unsigned long event_address, unsigned long failsafe_address, 
-+      unsigned long syscall_address)
-+{
-+      return _hypercall3(int, set_callbacks,
-+                         event_address, failsafe_address, syscall_address);
-+}
-+
-+static inline int
-+HYPERVISOR_fpu_taskswitch(
-+      int set)
-+{
-+      return _hypercall1(int, fpu_taskswitch, set);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_sched_op_compat(
-+      int cmd, unsigned long arg)
-+{
-+      return _hypercall2(int, sched_op_compat, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_sched_op(
-+      int cmd, void *arg)
-+{
-+      return _hypercall2(int, sched_op, cmd, arg);
-+}
-+
-+static inline long __must_check
-+HYPERVISOR_set_timer_op(
-+      u64 timeout)
-+{
-+      return _hypercall1(long, set_timer_op, timeout);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_platform_op(
-+      struct xen_platform_op *platform_op)
-+{
-+      platform_op->interface_version = XENPF_INTERFACE_VERSION;
-+      return _hypercall1(int, platform_op, platform_op);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_debugreg(
-+      unsigned int reg, unsigned long value)
-+{
-+      return _hypercall2(int, set_debugreg, reg, value);
-+}
-+
-+static inline unsigned long __must_check
-+HYPERVISOR_get_debugreg(
-+      unsigned int reg)
-+{
-+      return _hypercall1(unsigned long, get_debugreg, reg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_descriptor(
-+      unsigned long ma, unsigned long word)
-+{
-+      return _hypercall2(int, update_descriptor, ma, word);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_memory_op(
-+      unsigned int cmd, void *arg)
-+{
-+      return _hypercall2(int, memory_op, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_multicall(
-+      multicall_entry_t *call_list, unsigned int nr_calls)
-+{
-+      return _hypercall2(int, multicall, call_list, nr_calls);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_va_mapping(
-+      unsigned long va, pte_t new_val, unsigned long flags)
-+{
-+      return _hypercall3(int, update_va_mapping, va, new_val.pte, flags);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_event_channel_op(
-+      int cmd, void *arg)
-+{
-+      int rc = _hypercall2(int, event_channel_op, cmd, arg);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              struct evtchn_op op;
-+              op.cmd = cmd;
-+              memcpy(&op.u, arg, sizeof(op.u));
-+              rc = _hypercall1(int, event_channel_op_compat, &op);
-+              memcpy(arg, &op.u, sizeof(op.u));
-+      }
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_xen_version(
-+      int cmd, void *arg)
-+{
-+      return _hypercall2(int, xen_version, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_console_io(
-+      int cmd, unsigned int count, char *str)
-+{
-+      return _hypercall3(int, console_io, cmd, count, str);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_physdev_op(
-+      int cmd, void *arg)
-+{
-+      int rc = _hypercall2(int, physdev_op, cmd, arg);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (unlikely(rc == -ENOSYS)) {
-+              struct physdev_op op;
-+              op.cmd = cmd;
-+              memcpy(&op.u, arg, sizeof(op.u));
-+              rc = _hypercall1(int, physdev_op_compat, &op);
-+              memcpy(arg, &op.u, sizeof(op.u));
-+      }
-+#endif
-+
-+      return rc;
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_grant_table_op(
-+      unsigned int cmd, void *uop, unsigned int count)
-+{
-+      return _hypercall3(int, grant_table_op, cmd, uop, count);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_update_va_mapping_otherdomain(
-+      unsigned long va, pte_t new_val, unsigned long flags, domid_t domid)
-+{
-+      return _hypercall4(int, update_va_mapping_otherdomain, va,
-+                         new_val.pte, flags, domid);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_vm_assist(
-+      unsigned int cmd, unsigned int type)
-+{
-+      return _hypercall2(int, vm_assist, cmd, type);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_vcpu_op(
-+      int cmd, unsigned int vcpuid, void *extra_args)
-+{
-+      return _hypercall3(int, vcpu_op, cmd, vcpuid, extra_args);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_set_segment_base(
-+      int reg, unsigned long value)
-+{
-+      return _hypercall2(int, set_segment_base, reg, value);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_suspend(
-+      unsigned long srec)
-+{
-+      struct sched_shutdown sched_shutdown = {
-+              .reason = SHUTDOWN_suspend
-+      };
-+
-+      int rc = _hypercall3(int, sched_op, SCHEDOP_shutdown,
-+                           &sched_shutdown, srec);
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (rc == -ENOSYS)
-+              rc = _hypercall3(int, sched_op_compat, SCHEDOP_shutdown,
-+                               SHUTDOWN_suspend, srec);
-+#endif
-+
-+      return rc;
-+}
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+static inline int
-+HYPERVISOR_nmi_op(
-+      unsigned long op, void *arg)
-+{
-+      return _hypercall2(int, nmi_op, op, arg);
-+}
-+#endif
-+
-+#ifndef CONFIG_XEN
-+static inline unsigned long __must_check
-+HYPERVISOR_hvm_op(
-+    int op, void *arg)
-+{
-+    return _hypercall2(unsigned long, hvm_op, op, arg);
-+}
-+#endif
-+
-+static inline int __must_check
-+HYPERVISOR_callback_op(
-+      int cmd, const void *arg)
-+{
-+      return _hypercall2(int, callback_op, cmd, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_xenoprof_op(
-+      int op, void *arg)
-+{
-+      return _hypercall2(int, xenoprof_op, op, arg);
-+}
-+
-+static inline int __must_check
-+HYPERVISOR_kexec_op(
-+      unsigned long op, void *args)
-+{
-+      return _hypercall2(int, kexec_op, op, args);
-+}
-+
-+#endif /* __HYPERCALL_H__ */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/irqflags_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/irqflags_64.h 2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,139 @@
-+/*
-+ * include/asm-x86_64/irqflags.h
-+ *
-+ * IRQ flags handling
-+ *
-+ * This file gets included from lowlevel asm headers too, to provide
-+ * wrapped versions of the local_irq_*() APIs, based on the
-+ * raw_local_irq_*() functions from the lowlevel headers.
-+ */
-+#ifndef _ASM_IRQFLAGS_H
-+#define _ASM_IRQFLAGS_H
-+
-+#ifndef __ASSEMBLY__
-+/*
-+ * Interrupt control:
-+ */
-+
-+/*
-+ * The use of 'barrier' in the following reflects their use as local-lock
-+ * operations. Reentrancy must be prevented (e.g., __cli()) /before/ following
-+ * critical operations are executed. All critical operations must complete
-+ * /before/ reentrancy is permitted (e.g., __sti()). Alpha architecture also
-+ * includes these barriers, for example.
-+ */
-+
-+#define __raw_local_save_flags() (current_vcpu_info()->evtchn_upcall_mask)
-+
-+#define raw_local_save_flags(flags) \
-+              do { (flags) = __raw_local_save_flags(); } while (0)
-+
-+#define raw_local_irq_restore(x)                                      \
-+do {                                                                  \
-+      vcpu_info_t *_vcpu;                                             \
-+      barrier();                                                      \
-+      _vcpu = current_vcpu_info();            \
-+      if ((_vcpu->evtchn_upcall_mask = (x)) == 0) {                   \
-+              barrier(); /* unmask then check (avoid races) */        \
-+              if ( unlikely(_vcpu->evtchn_upcall_pending) )           \
-+                      force_evtchn_callback();                        \
-+      }                                                               \
-+} while (0)
-+
-+#ifdef CONFIG_X86_VSMP
-+
-+/*
-+ * Interrupt control for the VSMP architecture:
-+ */
-+
-+static inline void raw_local_irq_disable(void)
-+{
-+      unsigned long flags = __raw_local_save_flags();
-+
-+      raw_local_irq_restore((flags & ~(1 << 9)) | (1 << 18));
-+}
-+
-+static inline void raw_local_irq_enable(void)
-+{
-+      unsigned long flags = __raw_local_save_flags();
-+
-+      raw_local_irq_restore((flags | (1 << 9)) & ~(1 << 18));
-+}
-+
-+static inline int raw_irqs_disabled_flags(unsigned long flags)
-+{
-+      return !(flags & (1<<9)) || (flags & (1 << 18));
-+}
-+
-+#else /* CONFIG_X86_VSMP */
-+
-+#define raw_local_irq_disable()                                               \
-+do {                                                                  \
-+      current_vcpu_info()->evtchn_upcall_mask = 1;                                    \
-+      barrier();                                                      \
-+} while (0)
-+
-+#define raw_local_irq_enable()                                                \
-+do {                                                                  \
-+      vcpu_info_t *_vcpu;                                             \
-+      barrier();                                                      \
-+      _vcpu = current_vcpu_info();            \
-+      _vcpu->evtchn_upcall_mask = 0;                                  \
-+      barrier(); /* unmask then check (avoid races) */                \
-+      if ( unlikely(_vcpu->evtchn_upcall_pending) )                   \
-+              force_evtchn_callback();                                \
-+} while (0)
-+
-+static inline int raw_irqs_disabled_flags(unsigned long flags)
-+{
-+      return (flags != 0);
-+}
-+
-+#endif
-+
-+/*
-+ * For spinlocks, etc.:
-+ */
-+
-+#define __raw_local_irq_save()                                                \
-+({                                                                    \
-+      unsigned long flags = __raw_local_save_flags();                 \
-+                                                                      \
-+      raw_local_irq_disable();                                        \
-+                                                                      \
-+      flags;                                                          \
-+})
-+
-+#define raw_local_irq_save(flags) \
-+              do { (flags) = __raw_local_irq_save(); } while (0)
-+
-+#define raw_irqs_disabled()                                           \
-+({                                                                    \
-+      unsigned long flags = __raw_local_save_flags();                 \
-+                                                                      \
-+      raw_irqs_disabled_flags(flags);                                 \
-+})
-+
-+/*
-+ * Used in the idle loop; sti takes one instruction cycle
-+ * to complete:
-+ */
-+void raw_safe_halt(void);
-+
-+/*
-+ * Used when interrupts are already enabled or to
-+ * shutdown the processor:
-+ */
-+void halt(void);
-+
-+#else /* __ASSEMBLY__: */
-+# ifdef CONFIG_TRACE_IRQFLAGS
-+#  define TRACE_IRQS_ON               call trace_hardirqs_on_thunk
-+#  define TRACE_IRQS_OFF      call trace_hardirqs_off_thunk
-+# else
-+#  define TRACE_IRQS_ON
-+#  define TRACE_IRQS_OFF
-+# endif
-+#endif
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/maddr_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/maddr_64.h    2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,161 @@
-+#ifndef _X86_64_MADDR_H
-+#define _X86_64_MADDR_H
-+
-+#include <xen/features.h>
-+#include <xen/interface/xen.h>
-+
-+/**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
-+#define INVALID_P2M_ENTRY     (~0UL)
-+#define FOREIGN_FRAME_BIT     (1UL<<63)
-+#define FOREIGN_FRAME(m)      ((m) | FOREIGN_FRAME_BIT)
-+
-+/* Definitions for machine and pseudophysical addresses. */
-+typedef unsigned long paddr_t;
-+typedef unsigned long maddr_t;
-+
-+#ifdef CONFIG_XEN
-+
-+extern unsigned long *phys_to_machine_mapping;
-+
-+#undef machine_to_phys_mapping
-+extern unsigned long *machine_to_phys_mapping;
-+extern unsigned int   machine_to_phys_order;
-+
-+static inline unsigned long pfn_to_mfn(unsigned long pfn)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return pfn;
-+      BUG_ON(end_pfn && pfn >= end_pfn);
-+      return phys_to_machine_mapping[pfn] & ~FOREIGN_FRAME_BIT;
-+}
-+
-+static inline int phys_to_machine_mapping_valid(unsigned long pfn)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return 1;
-+      BUG_ON(end_pfn && pfn >= end_pfn);
-+      return (phys_to_machine_mapping[pfn] != INVALID_P2M_ENTRY);
-+}
-+
-+static inline unsigned long mfn_to_pfn(unsigned long mfn)
-+{
-+      unsigned long pfn;
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return mfn;
-+
-+      if (unlikely((mfn >> machine_to_phys_order) != 0))
-+              return end_pfn;
-+
-+      /* The array access can fail (e.g., device space beyond end of RAM). */
-+      asm (
-+              "1:     movq %1,%0\n"
-+              "2:\n"
-+              ".section .fixup,\"ax\"\n"
-+              "3:     movq %2,%0\n"
-+              "       jmp  2b\n"
-+              ".previous\n"
-+              ".section __ex_table,\"a\"\n"
-+              "       .align 8\n"
-+              "       .quad 1b,3b\n"
-+              ".previous"
-+              : "=r" (pfn)
-+              : "m" (machine_to_phys_mapping[mfn]), "m" (end_pfn) );
-+
-+      return pfn;
-+}
-+
-+/*
-+ * We detect special mappings in one of two ways:
-+ *  1. If the MFN is an I/O page then Xen will set the m2p entry
-+ *     to be outside our maximum possible pseudophys range.
-+ *  2. If the MFN belongs to a different domain then we will certainly
-+ *     not have MFN in our p2m table. Conversely, if the page is ours,
-+ *     then we'll have p2m(m2p(MFN))==MFN.
-+ * If we detect a special mapping then it doesn't have a 'struct page'.
-+ * We force !pfn_valid() by returning an out-of-range pointer.
-+ *
-+ * NB. These checks require that, for any MFN that is not in our reservation,
-+ * there is no PFN such that p2m(PFN) == MFN. Otherwise we can get confused if
-+ * we are foreign-mapping the MFN, and the other domain as m2p(MFN) == PFN.
-+ * Yikes! Various places must poke in INVALID_P2M_ENTRY for safety.
-+ *
-+ * NB2. When deliberately mapping foreign pages into the p2m table, you *must*
-+ *      use FOREIGN_FRAME(). This will cause pte_pfn() to choke on it, as we
-+ *      require. In all the cases we care about, the FOREIGN_FRAME bit is
-+ *      masked (e.g., pfn_to_mfn()) so behaviour there is correct.
-+ */
-+static inline unsigned long mfn_to_local_pfn(unsigned long mfn)
-+{
-+      unsigned long pfn = mfn_to_pfn(mfn);
-+      if ((pfn < end_pfn)
-+          && !xen_feature(XENFEAT_auto_translated_physmap)
-+          && (phys_to_machine_mapping[pfn] != mfn))
-+              return end_pfn; /* force !pfn_valid() */
-+      return pfn;
-+}
-+
-+static inline void set_phys_to_machine(unsigned long pfn, unsigned long mfn)
-+{
-+      BUG_ON(end_pfn && pfn >= end_pfn);
-+      if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+              BUG_ON(pfn != mfn && mfn != INVALID_P2M_ENTRY);
-+              return;
-+      }
-+      phys_to_machine_mapping[pfn] = mfn;
-+}
-+
-+static inline maddr_t phys_to_machine(paddr_t phys)
-+{
-+      maddr_t machine = pfn_to_mfn(phys >> PAGE_SHIFT);
-+      machine = (machine << PAGE_SHIFT) | (phys & ~PAGE_MASK);
-+      return machine;
-+}
-+
-+static inline paddr_t machine_to_phys(maddr_t machine)
-+{
-+      paddr_t phys = mfn_to_pfn(machine >> PAGE_SHIFT);
-+      phys = (phys << PAGE_SHIFT) | (machine & ~PAGE_MASK);
-+      return phys;
-+}
-+
-+static inline paddr_t pte_phys_to_machine(paddr_t phys)
-+{
-+      maddr_t machine;
-+      machine = pfn_to_mfn((phys & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT);
-+      machine = (machine << PAGE_SHIFT) | (phys & ~PHYSICAL_PAGE_MASK);
-+      return machine;
-+}
-+
-+static inline paddr_t pte_machine_to_phys(maddr_t machine)
-+{
-+      paddr_t phys;
-+      phys = mfn_to_pfn((machine & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT);
-+      phys = (phys << PAGE_SHIFT) | (machine & ~PHYSICAL_PAGE_MASK);
-+      return phys;
-+}
-+
-+#define __pte_ma(x)     ((pte_t) { (x) } )
-+#define pfn_pte_ma(pfn, prot) __pte_ma((((pfn) << PAGE_SHIFT) | pgprot_val(prot)) & __supported_pte_mask)
-+
-+#else /* !CONFIG_XEN */
-+
-+#define pfn_to_mfn(pfn) (pfn)
-+#define mfn_to_pfn(mfn) (mfn)
-+#define mfn_to_local_pfn(mfn) (mfn)
-+#define set_phys_to_machine(pfn, mfn) ((void)0)
-+#define phys_to_machine_mapping_valid(pfn) (1)
-+#define phys_to_machine(phys) ((maddr_t)(phys))
-+#define machine_to_phys(mach) ((paddr_t)(mach))
-+#define pfn_pte_ma(pfn, prot) pfn_pte(pfn, prot)
-+#define __pte_ma(x) __pte(x)
-+
-+#endif /* !CONFIG_XEN */
-+
-+/* VIRT <-> MACHINE conversion */
-+#define virt_to_machine(v)    (phys_to_machine(__pa(v)))
-+#define virt_to_mfn(v)                (pfn_to_mfn(__pa(v) >> PAGE_SHIFT))
-+#define mfn_to_virt(m)                (__va(mfn_to_pfn(m) << PAGE_SHIFT))
-+
-+#endif /* _X86_64_MADDR_H */
-+
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/mmu_context_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/mmu_context_64.h      2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,136 @@
-+#ifndef __X86_64_MMU_CONTEXT_H
-+#define __X86_64_MMU_CONTEXT_H
-+
-+#include <asm/desc.h>
-+#include <asm/atomic.h>
-+#include <asm/pgalloc.h>
-+#include <asm/page.h>
-+#include <asm/pda.h>
-+#include <asm/pgtable.h>
-+#include <asm/tlbflush.h>
-+
-+/*
-+ * possibly do the LDT unload here?
-+ */
-+int init_new_context(struct task_struct *tsk, struct mm_struct *mm);
-+void destroy_context(struct mm_struct *mm);
-+
-+static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
-+{
-+#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-+      if (read_pda(mmu_state) == TLBSTATE_OK) 
-+              write_pda(mmu_state, TLBSTATE_LAZY);
-+#endif
-+}
-+
-+#define prepare_arch_switch(next)     __prepare_arch_switch()
-+
-+static inline void __prepare_arch_switch(void)
-+{
-+      /*
-+       * Save away %es, %ds, %fs and %gs. Must happen before reload
-+       * of cr3/ldt (i.e., not in __switch_to).
-+       */
-+      __asm__ __volatile__ (
-+              "mov %%es,%0 ; mov %%ds,%1 ; mov %%fs,%2 ; mov %%gs,%3"
-+              : "=m" (current->thread.es),
-+                "=m" (current->thread.ds),
-+                "=m" (current->thread.fsindex),
-+                "=m" (current->thread.gsindex) );
-+
-+      if (current->thread.ds)
-+              __asm__ __volatile__ ( "movl %0,%%ds" : : "r" (0) );
-+
-+      if (current->thread.es)
-+              __asm__ __volatile__ ( "movl %0,%%es" : : "r" (0) );
-+
-+      if (current->thread.fsindex) {
-+              __asm__ __volatile__ ( "movl %0,%%fs" : : "r" (0) );
-+              current->thread.fs = 0;
-+      }
-+
-+      if (current->thread.gsindex) {
-+              load_gs_index(0);
-+              current->thread.gs = 0;
-+      }
-+}
-+
-+extern void mm_pin(struct mm_struct *mm);
-+extern void mm_unpin(struct mm_struct *mm);
-+void mm_pin_all(void);
-+
-+static inline void load_cr3(pgd_t *pgd)
-+{
-+      asm volatile("movq %0,%%cr3" :: "r" (phys_to_machine(__pa(pgd))) :
-+                   "memory");
-+}
-+
-+static inline void switch_mm(struct mm_struct *prev, struct mm_struct *next, 
-+                           struct task_struct *tsk)
-+{
-+      unsigned cpu = smp_processor_id();
-+      struct mmuext_op _op[3], *op = _op;
-+
-+      if (likely(prev != next)) {
-+              BUG_ON(!xen_feature(XENFEAT_writable_page_tables) &&
-+                     !next->context.pinned);
-+
-+              /* stop flush ipis for the previous mm */
-+              cpu_clear(cpu, prev->cpu_vm_mask);
-+#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-+              write_pda(mmu_state, TLBSTATE_OK);
-+              write_pda(active_mm, next);
-+#endif
-+              cpu_set(cpu, next->cpu_vm_mask);
-+
-+              /* load_cr3(next->pgd) */
-+              op->cmd = MMUEXT_NEW_BASEPTR;
-+              op->arg1.mfn = pfn_to_mfn(__pa(next->pgd) >> PAGE_SHIFT);
-+              op++;
-+
-+              /* xen_new_user_pt(__pa(__user_pgd(next->pgd))) */
-+              op->cmd = MMUEXT_NEW_USER_BASEPTR;
-+              op->arg1.mfn = pfn_to_mfn(__pa(__user_pgd(next->pgd)) >> PAGE_SHIFT);
-+              op++;
-+              
-+              if (unlikely(next->context.ldt != prev->context.ldt)) {
-+                      /* load_LDT_nolock(&next->context, cpu) */
-+                      op->cmd = MMUEXT_SET_LDT;
-+                      op->arg1.linear_addr = (unsigned long)next->context.ldt;
-+                      op->arg2.nr_ents     = next->context.size;
-+                      op++;
-+              }
-+
-+              BUG_ON(HYPERVISOR_mmuext_op(_op, op-_op, NULL, DOMID_SELF));
-+      }
-+#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
-+      else {
-+              write_pda(mmu_state, TLBSTATE_OK);
-+              if (read_pda(active_mm) != next)
-+                      out_of_line_bug();
-+              if (!cpu_test_and_set(cpu, next->cpu_vm_mask)) {
-+                      /* We were in lazy tlb mode and leave_mm disabled 
-+                       * tlb flush IPI delivery. We must reload CR3
-+                       * to make sure to use no freed page tables.
-+                       */
-+                        load_cr3(next->pgd);
-+                        xen_new_user_pt(__pa(__user_pgd(next->pgd)));         
-+                      load_LDT_nolock(&next->context, cpu);
-+              }
-+      }
-+#endif
-+}
-+
-+#define deactivate_mm(tsk,mm) do { \
-+      load_gs_index(0); \
-+      asm volatile("movl %0,%%fs"::"r"(0));  \
-+} while(0)
-+
-+static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
-+{
-+      if (!next->context.pinned)
-+              mm_pin(next);
-+      switch_mm(prev, next, NULL);
-+}
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/page_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/page_64.h     2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,212 @@
-+#ifndef _X86_64_PAGE_H
-+#define _X86_64_PAGE_H
-+
-+/* #include <linux/string.h> */
-+#ifndef __ASSEMBLY__
-+#include <linux/kernel.h>
-+#include <linux/types.h>
-+#include <asm/bug.h>
-+#endif
-+#include <xen/interface/xen.h> 
-+
-+/*
-+ * Need to repeat this here in order to not include pgtable.h (which in turn
-+ * depends on definitions made here), but to be able to use the symbolic
-+ * below. The preprocessor will warn if the two definitions aren't identical.
-+ */
-+#define _PAGE_PRESENT 0x001
-+#define _PAGE_IO      0x200
-+
-+/* PAGE_SHIFT determines the page size */
-+#define PAGE_SHIFT    12
-+#ifdef __ASSEMBLY__
-+#define PAGE_SIZE     (0x1 << PAGE_SHIFT)
-+#else
-+#define PAGE_SIZE     (1UL << PAGE_SHIFT)
-+#endif
-+#define PAGE_MASK     (~(PAGE_SIZE-1))
-+
-+/* See Documentation/x86_64/mm.txt for a description of the memory map. */
-+#define __PHYSICAL_MASK_SHIFT 46
-+#define __PHYSICAL_MASK               ((1UL << __PHYSICAL_MASK_SHIFT) - 1)
-+#define __VIRTUAL_MASK_SHIFT  48
-+#define __VIRTUAL_MASK                ((1UL << __VIRTUAL_MASK_SHIFT) - 1)
-+
-+#define PHYSICAL_PAGE_MASK    (~(PAGE_SIZE-1) & __PHYSICAL_MASK)
-+
-+#define THREAD_ORDER 1 
-+#define THREAD_SIZE  (PAGE_SIZE << THREAD_ORDER)
-+#define CURRENT_MASK (~(THREAD_SIZE-1))
-+
-+#define EXCEPTION_STACK_ORDER 0
-+#define EXCEPTION_STKSZ (PAGE_SIZE << EXCEPTION_STACK_ORDER)
-+
-+#define DEBUG_STACK_ORDER (EXCEPTION_STACK_ORDER + 1)
-+#define DEBUG_STKSZ (PAGE_SIZE << DEBUG_STACK_ORDER)
-+
-+#define IRQSTACK_ORDER 2
-+#define IRQSTACKSIZE (PAGE_SIZE << IRQSTACK_ORDER)
-+
-+#define STACKFAULT_STACK 1
-+#define DOUBLEFAULT_STACK 2
-+#define NMI_STACK 3
-+#define DEBUG_STACK 4
-+#define MCE_STACK 5
-+#define N_EXCEPTION_STACKS 5  /* hw limit: 7 */
-+
-+#define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1))
-+#define LARGE_PAGE_SIZE (1UL << PMD_SHIFT)
-+
-+#define HPAGE_SHIFT PMD_SHIFT
-+#define HPAGE_SIZE    ((1UL) << HPAGE_SHIFT)
-+#define HPAGE_MASK    (~(HPAGE_SIZE - 1))
-+#define HUGETLB_PAGE_ORDER    (HPAGE_SHIFT - PAGE_SHIFT)
-+
-+#ifdef __KERNEL__
-+#ifndef __ASSEMBLY__
-+
-+extern unsigned long end_pfn;
-+
-+#include <asm/maddr.h>
-+
-+void clear_page(void *);
-+void copy_page(void *, void *);
-+
-+#define clear_user_page(page, vaddr, pg)      clear_page(page)
-+#define copy_user_page(to, from, vaddr, pg)   copy_page(to, from)
-+
-+#define alloc_zeroed_user_highpage(vma, vaddr) alloc_page_vma(GFP_HIGHUSER | __GFP_ZERO, vma, vaddr)
-+#define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
-+
-+/*
-+ * These are used to make use of C type-checking..
-+ */
-+typedef struct { unsigned long pte; } pte_t;
-+typedef struct { unsigned long pmd; } pmd_t;
-+typedef struct { unsigned long pud; } pud_t;
-+typedef struct { unsigned long pgd; } pgd_t;
-+#define PTE_MASK      PHYSICAL_PAGE_MASK
-+
-+typedef struct { unsigned long pgprot; } pgprot_t;
-+
-+#define __pte_val(x) ((x).pte)
-+#define pte_val(x) ((__pte_val(x) & (_PAGE_PRESENT|_PAGE_IO)) \
-+                  == _PAGE_PRESENT ?                          \
-+                  pte_machine_to_phys(__pte_val(x)) :         \
-+                  __pte_val(x))
-+
-+#define __pmd_val(x) ((x).pmd)
-+static inline unsigned long pmd_val(pmd_t x)
-+{
-+      unsigned long ret = __pmd_val(x);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (ret) ret = pte_machine_to_phys(ret) | _PAGE_PRESENT;
-+#else
-+      if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-+#endif
-+      return ret;
-+}
-+
-+#define __pud_val(x) ((x).pud)
-+static inline unsigned long pud_val(pud_t x)
-+{
-+      unsigned long ret = __pud_val(x);
-+      if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-+      return ret;
-+}
-+
-+#define __pgd_val(x) ((x).pgd)
-+static inline unsigned long pgd_val(pgd_t x)
-+{
-+      unsigned long ret = __pgd_val(x);
-+      if (ret & _PAGE_PRESENT) ret = pte_machine_to_phys(ret);
-+      return ret;
-+}
-+
-+#define pgprot_val(x) ((x).pgprot)
-+
-+static inline pte_t __pte(unsigned long x)
-+{
-+      if ((x & (_PAGE_PRESENT|_PAGE_IO)) == _PAGE_PRESENT)
-+              x = pte_phys_to_machine(x);
-+      return ((pte_t) { (x) });
-+}
-+
-+static inline pmd_t __pmd(unsigned long x)
-+{
-+      if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-+      return ((pmd_t) { (x) });
-+}
-+
-+static inline pud_t __pud(unsigned long x)
-+{
-+      if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-+      return ((pud_t) { (x) });
-+}
-+
-+static inline pgd_t __pgd(unsigned long x)
-+{
-+      if (x & _PAGE_PRESENT) x = pte_phys_to_machine(x);
-+      return ((pgd_t) { (x) });
-+}
-+
-+#define __pgprot(x)   ((pgprot_t) { (x) } )
-+
-+#define __PHYSICAL_START      ((unsigned long)CONFIG_PHYSICAL_START)
-+#define __START_KERNEL                (__START_KERNEL_map + __PHYSICAL_START)
-+#define __START_KERNEL_map    0xffffffff80000000UL
-+#define __PAGE_OFFSET           0xffff880000000000UL  
-+
-+#else
-+#define __PHYSICAL_START      CONFIG_PHYSICAL_START
-+#define __START_KERNEL                (__START_KERNEL_map + __PHYSICAL_START)
-+#define __START_KERNEL_map    0xffffffff80000000
-+#define __PAGE_OFFSET           0xffff880000000000
-+#endif /* !__ASSEMBLY__ */
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+#undef LOAD_OFFSET
-+#define LOAD_OFFSET           0
-+#endif
-+
-+/* to align the pointer to the (next) page boundary */
-+#define PAGE_ALIGN(addr)      (((addr)+PAGE_SIZE-1)&PAGE_MASK)
-+
-+#define KERNEL_TEXT_SIZE  (40UL*1024*1024)
-+#define KERNEL_TEXT_START 0xffffffff80000000UL 
-+
-+#define PAGE_OFFSET           ((unsigned long)__PAGE_OFFSET)
-+
-+/* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol.
-+   Otherwise you risk miscompilation. */ 
-+#define __pa(x)                       (((unsigned long)(x)>=__START_KERNEL_map)?(unsigned long)(x) - (unsigned long)__START_KERNEL_map:(unsigned long)(x) - PAGE_OFFSET)
-+/* __pa_symbol should be used for C visible symbols.
-+   This seems to be the official gcc blessed way to do such arithmetic. */ 
-+#define __pa_symbol(x)                \
-+      ({unsigned long v;  \
-+        asm("" : "=r" (v) : "0" (x)); \
-+        __pa(v); })
-+
-+#define __va(x)                       ((void *)((unsigned long)(x)+PAGE_OFFSET))
-+#define __boot_va(x)          __va(x)
-+#define __boot_pa(x)          __pa(x)
-+#ifdef CONFIG_FLATMEM
-+#define pfn_valid(pfn)                ((pfn) < end_pfn)
-+#endif
-+
-+#define virt_to_page(kaddr)   pfn_to_page(__pa(kaddr) >> PAGE_SHIFT)
-+#define virt_addr_valid(kaddr)        pfn_valid(__pa(kaddr) >> PAGE_SHIFT)
-+#define pfn_to_kaddr(pfn)      __va((pfn) << PAGE_SHIFT)
-+
-+#define VM_DATA_DEFAULT_FLAGS \
-+      (((current->personality & READ_IMPLIES_EXEC) ? VM_EXEC : 0 ) | \
-+       VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
-+
-+#define __HAVE_ARCH_GATE_AREA 1       
-+
-+#include <asm-generic/memory_model.h>
-+#include <asm-generic/page.h>
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* _X86_64_PAGE_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgalloc_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgalloc_64.h  2007-06-18 08:38:13.000000000 +0200
-@@ -0,0 +1,204 @@
-+#ifndef _X86_64_PGALLOC_H
-+#define _X86_64_PGALLOC_H
-+
-+#include <asm/fixmap.h>
-+#include <asm/pda.h>
-+#include <linux/threads.h>
-+#include <linux/mm.h>
-+#include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
-+
-+#include <xen/features.h>
-+void make_page_readonly(void *va, unsigned int feature);
-+void make_page_writable(void *va, unsigned int feature);
-+void make_pages_readonly(void *va, unsigned int nr, unsigned int feature);
-+void make_pages_writable(void *va, unsigned int nr, unsigned int feature);
-+
-+#define __user_pgd(pgd) ((pgd) + PTRS_PER_PGD)
-+
-+static inline void pmd_populate_kernel(struct mm_struct *mm, pmd_t *pmd, pte_t *pte)
-+{
-+      set_pmd(pmd, __pmd(_PAGE_TABLE | __pa(pte)));
-+}
-+
-+static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
-+{
-+      if (unlikely((mm)->context.pinned)) {
-+              BUG_ON(HYPERVISOR_update_va_mapping(
-+                             (unsigned long)__va(page_to_pfn(pte) << PAGE_SHIFT),
-+                             pfn_pte(page_to_pfn(pte), PAGE_KERNEL_RO), 0));
-+              set_pmd(pmd, __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT)));
-+      } else {
-+              *(pmd) = __pmd(_PAGE_TABLE | (page_to_pfn(pte) << PAGE_SHIFT));
-+      }
-+}
-+
-+static inline void pud_populate(struct mm_struct *mm, pud_t *pud, pmd_t *pmd)
-+{
-+      if (unlikely((mm)->context.pinned)) {
-+              BUG_ON(HYPERVISOR_update_va_mapping(
-+                             (unsigned long)pmd,
-+                             pfn_pte(virt_to_phys(pmd)>>PAGE_SHIFT, 
-+                                     PAGE_KERNEL_RO), 0));
-+              set_pud(pud, __pud(_PAGE_TABLE | __pa(pmd)));
-+      } else {
-+              *(pud) =  __pud(_PAGE_TABLE | __pa(pmd));
-+      }
-+}
-+
-+/*
-+ * We need to use the batch mode here, but pgd_pupulate() won't be
-+ * be called frequently.
-+ */
-+static inline void pgd_populate(struct mm_struct *mm, pgd_t *pgd, pud_t *pud)
-+{
-+      if (unlikely((mm)->context.pinned)) {
-+              BUG_ON(HYPERVISOR_update_va_mapping(
-+                             (unsigned long)pud,
-+                             pfn_pte(virt_to_phys(pud)>>PAGE_SHIFT, 
-+                                     PAGE_KERNEL_RO), 0));
-+              set_pgd(pgd, __pgd(_PAGE_TABLE | __pa(pud)));
-+              set_pgd(__user_pgd(pgd), __pgd(_PAGE_TABLE | __pa(pud)));
-+      } else {
-+              *(pgd) =  __pgd(_PAGE_TABLE | __pa(pud));
-+              *(__user_pgd(pgd)) = *(pgd);
-+      }
-+}
-+
-+extern struct page *pte_alloc_one(struct mm_struct *mm, unsigned long addr);
-+extern void pte_free(struct page *pte);
-+
-+static inline pmd_t *pmd_alloc_one(struct mm_struct *mm, unsigned long addr)
-+{
-+      struct page *pg;
-+
-+      pg = pte_alloc_one(mm, addr);
-+      return pg ? page_address(pg) : NULL;
-+}
-+
-+static inline void pmd_free(pmd_t *pmd)
-+{
-+      BUG_ON((unsigned long)pmd & (PAGE_SIZE-1));
-+      pte_free(virt_to_page(pmd));
-+}
-+
-+static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
-+{
-+      struct page *pg;
-+
-+      pg = pte_alloc_one(mm, addr);
-+      return pg ? page_address(pg) : NULL;
-+}
-+
-+static inline void pud_free(pud_t *pud)
-+{
-+      BUG_ON((unsigned long)pud & (PAGE_SIZE-1));
-+      pte_free(virt_to_page(pud));
-+}
-+
-+static inline void pgd_list_add(pgd_t *pgd)
-+{
-+      struct page *page = virt_to_page(pgd);
-+
-+      spin_lock(&pgd_lock);
-+      page->index = (pgoff_t)pgd_list;
-+      if (pgd_list)
-+              pgd_list->private = (unsigned long)&page->index;
-+      pgd_list = page;
-+      page->private = (unsigned long)&pgd_list;
-+      spin_unlock(&pgd_lock);
-+}
-+
-+static inline void pgd_list_del(pgd_t *pgd)
-+{
-+      struct page *next, **pprev, *page = virt_to_page(pgd);
-+
-+      spin_lock(&pgd_lock);
-+      next = (struct page *)page->index;
-+      pprev = (struct page **)page->private;
-+      *pprev = next;
-+      if (next)
-+              next->private = (unsigned long)pprev;
-+      spin_unlock(&pgd_lock);
-+}
-+
-+static inline pgd_t *pgd_alloc(struct mm_struct *mm)
-+{
-+      /*
-+       * We allocate two contiguous pages for kernel and user.
-+       */
-+      unsigned boundary;
-+      pgd_t *pgd = (pgd_t *)__get_free_pages(GFP_KERNEL|__GFP_REPEAT, 1);
-+      if (!pgd)
-+              return NULL;
-+      pgd_list_add(pgd);
-+      /*
-+       * Copy kernel pointers in from init.
-+       * Could keep a freelist or slab cache of those because the kernel
-+       * part never changes.
-+       */
-+      boundary = pgd_index(__PAGE_OFFSET);
-+      memset(pgd, 0, boundary * sizeof(pgd_t));
-+      memcpy(pgd + boundary,
-+             init_level4_pgt + boundary,
-+             (PTRS_PER_PGD - boundary) * sizeof(pgd_t));
-+
-+      memset(__user_pgd(pgd), 0, PAGE_SIZE); /* clean up user pgd */
-+      /*
-+       * Set level3_user_pgt for vsyscall area
-+       */
-+      __user_pgd(pgd)[pgd_index(VSYSCALL_START)] =
-+              __pgd(__pa_symbol(level3_user_pgt) | _PAGE_TABLE);
-+      return pgd;
-+}
-+
-+static inline void pgd_free(pgd_t *pgd)
-+{
-+      pte_t *ptep = virt_to_ptep(pgd);
-+
-+      if (!pte_write(*ptep)) {
-+              xen_pgd_unpin(__pa(pgd));
-+              BUG_ON(HYPERVISOR_update_va_mapping(
-+                             (unsigned long)pgd,
-+                             pfn_pte(virt_to_phys(pgd)>>PAGE_SHIFT, PAGE_KERNEL),
-+                             0));
-+      }
-+
-+      ptep = virt_to_ptep(__user_pgd(pgd));
-+
-+      if (!pte_write(*ptep)) {
-+              xen_pgd_unpin(__pa(__user_pgd(pgd)));
-+              BUG_ON(HYPERVISOR_update_va_mapping(
-+                             (unsigned long)__user_pgd(pgd),
-+                             pfn_pte(virt_to_phys(__user_pgd(pgd))>>PAGE_SHIFT, 
-+                                     PAGE_KERNEL),
-+                             0));
-+      }
-+
-+      pgd_list_del(pgd);
-+      free_pages((unsigned long)pgd, 1);
-+}
-+
-+static inline pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
-+{
-+      pte_t *pte = (pte_t *)get_zeroed_page(GFP_KERNEL|__GFP_REPEAT);
-+      if (pte)
-+              make_page_readonly(pte, XENFEAT_writable_page_tables);
-+
-+      return pte;
-+}
-+
-+/* Should really implement gc for free page table pages. This could be
-+   done with a reference count in struct page. */
-+
-+static inline void pte_free_kernel(pte_t *pte)
-+{
-+      BUG_ON((unsigned long)pte & (PAGE_SIZE-1));
-+      make_page_writable(pte, XENFEAT_writable_page_tables);
-+      free_page((unsigned long)pte); 
-+}
-+
-+#define __pte_free_tlb(tlb,pte) tlb_remove_page((tlb),(pte))
-+#define __pmd_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
-+#define __pud_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
-+
-+#endif /* _X86_64_PGALLOC_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/pgtable_64.h  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,583 @@
-+#ifndef _X86_64_PGTABLE_H
-+#define _X86_64_PGTABLE_H
-+
-+/*
-+ * This file contains the functions and defines necessary to modify and use
-+ * the x86-64 page table tree.
-+ */
-+#include <asm/processor.h>
-+#include <asm/fixmap.h>
-+#include <asm/bitops.h>
-+#include <linux/threads.h>
-+#include <linux/sched.h>
-+#include <asm/pda.h>
-+#ifdef CONFIG_XEN
-+#include <asm/hypervisor.h>
-+
-+extern pud_t level3_user_pgt[512];
-+
-+extern void xen_init_pt(void);
-+
-+extern pte_t *lookup_address(unsigned long address);
-+
-+#define virt_to_ptep(va)                                              \
-+({                                                                    \
-+      pte_t *__ptep = lookup_address((unsigned long)(va));            \
-+      BUG_ON(!__ptep || !pte_present(*__ptep));                       \
-+      __ptep;                                                         \
-+})
-+
-+#define arbitrary_virt_to_machine(va)                                 \
-+      (((maddr_t)pte_mfn(*virt_to_ptep(va)) << PAGE_SHIFT)            \
-+       | ((unsigned long)(va) & (PAGE_SIZE - 1)))
-+#endif
-+
-+extern pud_t level3_kernel_pgt[512];
-+extern pud_t level3_physmem_pgt[512];
-+extern pud_t level3_ident_pgt[512];
-+extern pmd_t level2_kernel_pgt[512];
-+extern pgd_t init_level4_pgt[];
-+extern pgd_t boot_level4_pgt[];
-+extern unsigned long __supported_pte_mask;
-+
-+#define swapper_pg_dir init_level4_pgt
-+
-+extern int nonx_setup(char *str);
-+extern void paging_init(void);
-+extern void clear_kernel_mapping(unsigned long addr, unsigned long size);
-+
-+extern unsigned long pgkern_mask;
-+
-+/*
-+ * ZERO_PAGE is a global shared page that is always zero: used
-+ * for zero-mapped memory areas etc..
-+ */
-+extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)];
-+#define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
-+
-+/*
-+ * PGDIR_SHIFT determines what a top-level page table entry can map
-+ */
-+#define PGDIR_SHIFT   39
-+#define PTRS_PER_PGD  512
-+
-+/*
-+ * 3rd level page
-+ */
-+#define PUD_SHIFT     30
-+#define PTRS_PER_PUD  512
-+
-+/*
-+ * PMD_SHIFT determines the size of the area a middle-level
-+ * page table can map
-+ */
-+#define PMD_SHIFT     21
-+#define PTRS_PER_PMD  512
-+
-+/*
-+ * entries per page directory level
-+ */
-+#define PTRS_PER_PTE  512
-+
-+#define pte_ERROR(e) \
-+      printk("%s:%d: bad pte %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-+             &(e), __pte_val(e), pte_pfn(e))
-+#define pmd_ERROR(e) \
-+      printk("%s:%d: bad pmd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-+             &(e), __pmd_val(e), pmd_pfn(e))
-+#define pud_ERROR(e) \
-+      printk("%s:%d: bad pud %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-+             &(e), __pud_val(e), (pud_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-+#define pgd_ERROR(e) \
-+      printk("%s:%d: bad pgd %p(%016lx pfn %010lx).\n", __FILE__, __LINE__, \
-+             &(e), __pgd_val(e), (pgd_val(e) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-+
-+#define pgd_none(x)   (!__pgd_val(x))
-+#define pud_none(x)   (!__pud_val(x))
-+
-+static inline void set_pte(pte_t *dst, pte_t val)
-+{
-+      *dst = val;
-+}
-+
-+#define set_pmd(pmdptr, pmdval) xen_l2_entry_update(pmdptr, (pmdval))
-+#define set_pud(pudptr, pudval) xen_l3_entry_update(pudptr, (pudval))
-+#define set_pgd(pgdptr, pgdval) xen_l4_entry_update(pgdptr, (pgdval))
-+
-+static inline void pud_clear (pud_t * pud)
-+{
-+      set_pud(pud, __pud(0));
-+}
-+
-+#define __user_pgd(pgd) ((pgd) + PTRS_PER_PGD)
-+
-+static inline void pgd_clear (pgd_t * pgd)
-+{
-+        set_pgd(pgd, __pgd(0));
-+        set_pgd(__user_pgd(pgd), __pgd(0));
-+}
-+
-+#define pud_page(pud) \
-+    ((unsigned long) __va(pud_val(pud) & PHYSICAL_PAGE_MASK))
-+
-+#define pte_same(a, b)                ((a).pte == (b).pte)
-+
-+#define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK))
-+
-+#define PMD_SIZE      (1UL << PMD_SHIFT)
-+#define PMD_MASK      (~(PMD_SIZE-1))
-+#define PUD_SIZE      (1UL << PUD_SHIFT)
-+#define PUD_MASK      (~(PUD_SIZE-1))
-+#define PGDIR_SIZE    (1UL << PGDIR_SHIFT)
-+#define PGDIR_MASK    (~(PGDIR_SIZE-1))
-+
-+#define USER_PTRS_PER_PGD     ((TASK_SIZE-1)/PGDIR_SIZE+1)
-+#define FIRST_USER_ADDRESS    0
-+
-+#ifndef __ASSEMBLY__
-+#define MAXMEM                 0x3fffffffffffUL
-+#define VMALLOC_START    0xffffc20000000000UL
-+#define VMALLOC_END      0xffffe1ffffffffffUL
-+#define MODULES_VADDR    0xffffffff88000000UL
-+#define MODULES_END      0xfffffffffff00000UL
-+#define MODULES_LEN   (MODULES_END - MODULES_VADDR)
-+
-+#define _PAGE_BIT_PRESENT     0
-+#define _PAGE_BIT_RW          1
-+#define _PAGE_BIT_USER                2
-+#define _PAGE_BIT_PWT         3
-+#define _PAGE_BIT_PCD         4
-+#define _PAGE_BIT_ACCESSED    5
-+#define _PAGE_BIT_DIRTY               6
-+#define _PAGE_BIT_PSE         7       /* 4 MB (or 2MB) page */
-+#define _PAGE_BIT_GLOBAL      8       /* Global TLB entry PPro+ */
-+#define _PAGE_BIT_NX           63       /* No execute: only valid after cpuid check */
-+
-+#define _PAGE_PRESENT 0x001
-+#define _PAGE_RW      0x002
-+#define _PAGE_USER    0x004
-+#define _PAGE_PWT     0x008
-+#define _PAGE_PCD     0x010
-+#define _PAGE_ACCESSED        0x020
-+#define _PAGE_DIRTY   0x040
-+#define _PAGE_PSE     0x080   /* 2MB page */
-+#define _PAGE_FILE    0x040   /* nonlinear file mapping, saved PTE; unset:swap */
-+#define _PAGE_GLOBAL  0x100   /* Global TLB entry */
-+
-+#define _PAGE_PROTNONE        0x080   /* If not present */
-+#define _PAGE_NX        (1UL<<_PAGE_BIT_NX)
-+
-+/* Mapped page is I/O or foreign and has no associated page struct. */
-+#define _PAGE_IO      0x200
-+
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+extern unsigned int __kernel_page_user;
-+#else
-+#define __kernel_page_user 0
-+#endif
-+
-+#define _PAGE_TABLE   (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY)
-+#define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY | __kernel_page_user)
-+
-+#define _PAGE_CHG_MASK        (PTE_MASK | _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_IO)
-+
-+#define PAGE_NONE     __pgprot(_PAGE_PROTNONE | _PAGE_ACCESSED)
-+#define PAGE_SHARED   __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-+#define PAGE_SHARED_EXEC __pgprot(_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_COPY_NOEXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-+#define PAGE_COPY PAGE_COPY_NOEXEC
-+#define PAGE_COPY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_NX)
-+#define PAGE_READONLY_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define __PAGE_KERNEL \
-+      (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-+#define __PAGE_KERNEL_EXEC \
-+      (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_ACCESSED | __kernel_page_user)
-+#define __PAGE_KERNEL_NOCACHE \
-+      (_PAGE_PRESENT | _PAGE_RW | _PAGE_DIRTY | _PAGE_PCD | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-+#define __PAGE_KERNEL_RO \
-+      (_PAGE_PRESENT | _PAGE_DIRTY | _PAGE_ACCESSED | _PAGE_NX | __kernel_page_user)
-+#define __PAGE_KERNEL_VSYSCALL \
-+      (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED)
-+#define __PAGE_KERNEL_VSYSCALL_NOCACHE \
-+      (_PAGE_PRESENT | _PAGE_USER | _PAGE_ACCESSED | _PAGE_PCD)
-+#define __PAGE_KERNEL_LARGE \
-+      (__PAGE_KERNEL | _PAGE_PSE)
-+#define __PAGE_KERNEL_LARGE_EXEC \
-+      (__PAGE_KERNEL_EXEC | _PAGE_PSE)
-+
-+/*
-+ * We don't support GLOBAL page in xenolinux64
-+ */
-+#define MAKE_GLOBAL(x) __pgprot((x))
-+
-+#define PAGE_KERNEL MAKE_GLOBAL(__PAGE_KERNEL)
-+#define PAGE_KERNEL_EXEC MAKE_GLOBAL(__PAGE_KERNEL_EXEC)
-+#define PAGE_KERNEL_RO MAKE_GLOBAL(__PAGE_KERNEL_RO)
-+#define PAGE_KERNEL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_NOCACHE)
-+#define PAGE_KERNEL_VSYSCALL32 __pgprot(__PAGE_KERNEL_VSYSCALL)
-+#define PAGE_KERNEL_VSYSCALL MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL)
-+#define PAGE_KERNEL_LARGE MAKE_GLOBAL(__PAGE_KERNEL_LARGE)
-+#define PAGE_KERNEL_VSYSCALL_NOCACHE MAKE_GLOBAL(__PAGE_KERNEL_VSYSCALL_NOCACHE)
-+
-+/*         xwr */
-+#define __P000        PAGE_NONE
-+#define __P001        PAGE_READONLY
-+#define __P010        PAGE_COPY
-+#define __P011        PAGE_COPY
-+#define __P100        PAGE_READONLY_EXEC
-+#define __P101        PAGE_READONLY_EXEC
-+#define __P110        PAGE_COPY_EXEC
-+#define __P111        PAGE_COPY_EXEC
-+
-+#define __S000        PAGE_NONE
-+#define __S001        PAGE_READONLY
-+#define __S010        PAGE_SHARED
-+#define __S011        PAGE_SHARED
-+#define __S100        PAGE_READONLY_EXEC
-+#define __S101        PAGE_READONLY_EXEC
-+#define __S110        PAGE_SHARED_EXEC
-+#define __S111        PAGE_SHARED_EXEC
-+
-+static inline unsigned long pgd_bad(pgd_t pgd)
-+{
-+       unsigned long val = __pgd_val(pgd);
-+       val &= ~PTE_MASK;
-+       val &= ~(_PAGE_USER | _PAGE_DIRTY);
-+       return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);
-+}
-+
-+static inline unsigned long pud_bad(pud_t pud) 
-+{ 
-+       unsigned long val = __pud_val(pud);
-+       val &= ~PTE_MASK; 
-+       val &= ~(_PAGE_USER | _PAGE_DIRTY); 
-+       return val & ~(_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED);      
-+} 
-+
-+#define set_pte_at(_mm,addr,ptep,pteval) do {                         \
-+      if (((_mm) != current->mm && (_mm) != &init_mm) ||              \
-+          HYPERVISOR_update_va_mapping((addr), (pteval), 0))          \
-+              set_pte((ptep), (pteval));                              \
-+} while (0)
-+
-+#define pte_none(x)   (!(x).pte)
-+#define pte_present(x)        ((x).pte & (_PAGE_PRESENT | _PAGE_PROTNONE))
-+#define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0)
-+
-+#define pages_to_mb(x) ((x) >> (20-PAGE_SHIFT))
-+
-+#define __pte_mfn(_pte) (((_pte).pte & PTE_MASK) >> PAGE_SHIFT)
-+#define pte_mfn(_pte) ((_pte).pte & _PAGE_PRESENT ? \
-+      __pte_mfn(_pte) : pfn_to_mfn(__pte_mfn(_pte)))
-+#define pte_pfn(_pte) ((_pte).pte & _PAGE_IO ? end_pfn :      \
-+                     (_pte).pte & _PAGE_PRESENT ?             \
-+                     mfn_to_local_pfn(__pte_mfn(_pte)) :      \
-+                     __pte_mfn(_pte))
-+
-+#define pte_page(x)   pfn_to_page(pte_pfn(x))
-+
-+static inline pte_t pfn_pte(unsigned long page_nr, pgprot_t pgprot)
-+{
-+      unsigned long pte = page_nr << PAGE_SHIFT;
-+      pte |= pgprot_val(pgprot);
-+      pte &= __supported_pte_mask;
-+      return __pte(pte);
-+}
-+
-+static inline pte_t ptep_get_and_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      pte_t pte = *ptep;
-+      if (!pte_none(pte)) {
-+              if ((mm != &init_mm) ||
-+                  HYPERVISOR_update_va_mapping(addr, __pte(0), 0))
-+                      pte = __pte_ma(xchg(&ptep->pte, 0));
-+      }
-+      return pte;
-+}
-+
-+static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long addr, pte_t *ptep, int full)
-+{
-+      if (full) {
-+              pte_t pte = *ptep;
-+              if (mm->context.pinned)
-+                      xen_l1_entry_update(ptep, __pte(0));
-+              else
-+                      *ptep = __pte(0);
-+              return pte;
-+      }
-+      return ptep_get_and_clear(mm, addr, ptep);
-+}
-+
-+#define ptep_clear_flush(vma, addr, ptep)                     \
-+({                                                            \
-+      pte_t *__ptep = (ptep);                                 \
-+      pte_t __res = *__ptep;                                  \
-+      if (!pte_none(__res) &&                                 \
-+          ((vma)->vm_mm != current->mm ||                     \
-+           HYPERVISOR_update_va_mapping(addr, __pte(0),       \
-+                      (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-+                              UVMF_INVLPG|UVMF_MULTI))) {     \
-+              __ptep->pte = 0;                                \
-+              flush_tlb_page(vma, addr);                      \
-+      }                                                       \
-+      __res;                                                  \
-+})
-+
-+/*
-+ * The following only work if pte_present() is true.
-+ * Undefined behaviour if not..
-+ */
-+#define __LARGE_PTE (_PAGE_PSE|_PAGE_PRESENT)
-+static inline int pte_user(pte_t pte)         { return __pte_val(pte) & _PAGE_USER; }
-+static inline int pte_read(pte_t pte)         { return __pte_val(pte) & _PAGE_USER; }
-+static inline int pte_exec(pte_t pte)         { return __pte_val(pte) & _PAGE_USER; }
-+static inline int pte_dirty(pte_t pte)                { return __pte_val(pte) & _PAGE_DIRTY; }
-+static inline int pte_young(pte_t pte)                { return __pte_val(pte) & _PAGE_ACCESSED; }
-+static inline int pte_write(pte_t pte)                { return __pte_val(pte) & _PAGE_RW; }
-+static inline int pte_file(pte_t pte)         { return __pte_val(pte) & _PAGE_FILE; }
-+static inline int pte_huge(pte_t pte)         { return __pte_val(pte) & _PAGE_PSE; }
-+
-+static inline pte_t pte_rdprotect(pte_t pte)  { __pte_val(pte) &= ~_PAGE_USER; return pte; }
-+static inline pte_t pte_exprotect(pte_t pte)  { __pte_val(pte) &= ~_PAGE_USER; return pte; }
-+static inline pte_t pte_mkclean(pte_t pte)    { __pte_val(pte) &= ~_PAGE_DIRTY; return pte; }
-+static inline pte_t pte_mkold(pte_t pte)      { __pte_val(pte) &= ~_PAGE_ACCESSED; return pte; }
-+static inline pte_t pte_wrprotect(pte_t pte)  { __pte_val(pte) &= ~_PAGE_RW; return pte; }
-+static inline pte_t pte_mkread(pte_t pte)     { __pte_val(pte) |= _PAGE_USER; return pte; }
-+static inline pte_t pte_mkexec(pte_t pte)     { __pte_val(pte) |= _PAGE_USER; return pte; }
-+static inline pte_t pte_mkdirty(pte_t pte)    { __pte_val(pte) |= _PAGE_DIRTY; return pte; }
-+static inline pte_t pte_mkyoung(pte_t pte)    { __pte_val(pte) |= _PAGE_ACCESSED; return pte; }
-+static inline pte_t pte_mkwrite(pte_t pte)    { __pte_val(pte) |= _PAGE_RW; return pte; }
-+static inline pte_t pte_mkhuge(pte_t pte)     { __pte_val(pte) |= _PAGE_PSE; return pte; }
-+
-+#define ptep_test_and_clear_dirty(vma, addr, ptep)                    \
-+({                                                                    \
-+      pte_t __pte = *(ptep);                                          \
-+      int __ret = pte_dirty(__pte);                                   \
-+      if (__ret)                                                      \
-+              set_pte_at((vma)->vm_mm, addr, ptep, pte_mkclean(__pte)); \
-+      __ret;                                                          \
-+})
-+
-+#define ptep_test_and_clear_young(vma, addr, ptep)                    \
-+({                                                                    \
-+      pte_t __pte = *(ptep);                                          \
-+      int __ret = pte_young(__pte);                                   \
-+      if (__ret)                                                      \
-+              set_pte_at((vma)->vm_mm, addr, ptep, pte_mkold(__pte)); \
-+      __ret;                                                          \
-+})
-+
-+static inline void ptep_set_wrprotect(struct mm_struct *mm, unsigned long addr, pte_t *ptep)
-+{
-+      pte_t pte = *ptep;
-+      if (pte_write(pte))
-+              set_pte_at(mm, addr, ptep, pte_wrprotect(pte));
-+}
-+
-+/*
-+ * Macro to mark a page protection value as "uncacheable".
-+ */
-+#define pgprot_noncached(prot)        (__pgprot(pgprot_val(prot) | _PAGE_PCD | _PAGE_PWT))
-+
-+static inline int pmd_large(pmd_t pte) { 
-+      return (__pmd_val(pte) & __LARGE_PTE) == __LARGE_PTE;
-+}     
-+
-+
-+/*
-+ * Conversion functions: convert a page and protection to a page entry,
-+ * and a page entry and page directory to the page they refer to.
-+ */
-+
-+/*
-+ * Level 4 access.
-+ * Never use these in the common code.
-+ */
-+#define pgd_page(pgd) ((unsigned long) __va(pgd_val(pgd) & PTE_MASK))
-+#define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
-+#define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
-+#define pgd_offset_k(address) (init_level4_pgt + pgd_index(address))
-+#define pgd_present(pgd) (__pgd_val(pgd) & _PAGE_PRESENT)
-+#define mk_kernel_pgd(address) __pgd((address) | _KERNPG_TABLE)
-+
-+/* PUD - Level3 access */
-+/* to find an entry in a page-table-directory. */
-+#define pud_index(address) (((address) >> PUD_SHIFT) & (PTRS_PER_PUD-1))
-+#define pud_offset(pgd, address) ((pud_t *) pgd_page(*(pgd)) + pud_index(address))
-+#define pud_present(pud) (__pud_val(pud) & _PAGE_PRESENT)
-+
-+/* PMD  - Level 2 access */
-+#define pmd_page_kernel(pmd) ((unsigned long) __va(pmd_val(pmd) & PTE_MASK))
-+#define pmd_page(pmd)         (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
-+
-+#define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
-+#define pmd_offset(dir, address) ((pmd_t *) pud_page(*(dir)) + \
-+                                  pmd_index(address))
-+#define pmd_none(x)   (!__pmd_val(x))
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+/* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
-+   can temporarily clear it. */
-+#define pmd_present(x)        (__pmd_val(x))
-+#else
-+#define pmd_present(x)        (__pmd_val(x) & _PAGE_PRESENT)
-+#endif
-+#define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0)
-+#define pmd_bad(x) ((__pmd_val(x) & ~(PTE_MASK | _PAGE_USER | _PAGE_PRESENT)) \
-+                  != (_KERNPG_TABLE & ~(_PAGE_USER | _PAGE_PRESENT)))
-+#define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
-+#define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
-+
-+#define pte_to_pgoff(pte) ((__pte_val(pte) & PHYSICAL_PAGE_MASK) >> PAGE_SHIFT)
-+#define pgoff_to_pte(off) ((pte_t) { ((off) << PAGE_SHIFT) | _PAGE_FILE })
-+#define PTE_FILE_MAX_BITS __PHYSICAL_MASK_SHIFT
-+
-+/* PTE - Level 1 access. */
-+
-+/* page, protection -> pte */
-+#define mk_pte(page, pgprot)  pfn_pte(page_to_pfn(page), (pgprot))
-+#define mk_pte_huge(entry) (__pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
-+ 
-+/* physical address -> PTE */
-+static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
-+{ 
-+      unsigned long pteval;
-+      pteval = physpage | pgprot_val(pgprot);
-+      return __pte(pteval);
-+}
-+ 
-+/* Change flags of a PTE */
-+static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
-+{ 
-+      /*
-+       * Since this might change the present bit (which controls whether
-+       * a pte_t object has undergone p2m translation), we must use
-+       * pte_val() on the input pte and __pte() for the return value.
-+       */
-+      unsigned long pteval = pte_val(pte);
-+
-+      pteval &= _PAGE_CHG_MASK;
-+      pteval |= pgprot_val(newprot);
-+      pteval &= __supported_pte_mask;
-+      return __pte(pteval);
-+}
-+
-+#define pte_index(address) \
-+              (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
-+#define pte_offset_kernel(dir, address) ((pte_t *) pmd_page_kernel(*(dir)) + \
-+                      pte_index(address))
-+
-+/* x86-64 always has all page tables mapped. */
-+#define pte_offset_map(dir,address) pte_offset_kernel(dir,address)
-+#define pte_offset_map_nested(dir,address) pte_offset_kernel(dir,address)
-+#define pte_unmap(pte) /* NOP */
-+#define pte_unmap_nested(pte) /* NOP */ 
-+
-+#define update_mmu_cache(vma,address,pte) do { } while (0)
-+
-+/*
-+ * Rules for using ptep_establish: the pte MUST be a user pte, and
-+ * must be a present->present transition.
-+ */
-+#define __HAVE_ARCH_PTEP_ESTABLISH
-+#define ptep_establish(vma, address, ptep, pteval)                    \
-+      do {                                                            \
-+              if ( likely((vma)->vm_mm == current->mm) ) {            \
-+                      BUG_ON(HYPERVISOR_update_va_mapping(address,    \
-+                              pteval,                                 \
-+                              (unsigned long)(vma)->vm_mm->cpu_vm_mask.bits| \
-+                                      UVMF_INVLPG|UVMF_MULTI));       \
-+              } else {                                                \
-+                      xen_l1_entry_update(ptep, pteval);              \
-+                      flush_tlb_page(vma, address);                   \
-+              }                                                       \
-+      } while (0)
-+
-+/* We only update the dirty/accessed state if we set
-+ * the dirty bit by hand in the kernel, since the hardware
-+ * will do the accessed bit for us, and we don't want to
-+ * race with other CPU's that might be updating the dirty
-+ * bit at the same time. */
-+#define  __HAVE_ARCH_PTEP_SET_ACCESS_FLAGS
-+#define ptep_set_access_flags(vma, address, ptep, entry, dirty)               \
-+      do {                                                            \
-+              if (dirty)                                              \
-+                      ptep_establish(vma, address, ptep, entry);      \
-+      } while (0)
-+
-+/* Encode and de-code a swap entry */
-+#define __swp_type(x)                 (((x).val >> 1) & 0x3f)
-+#define __swp_offset(x)                       ((x).val >> 8)
-+#define __swp_entry(type, offset)     ((swp_entry_t) { ((type) << 1) | ((offset) << 8) })
-+#define __pte_to_swp_entry(pte)               ((swp_entry_t) { __pte_val(pte) })
-+#define __swp_entry_to_pte(x)         ((pte_t) { (x).val })
-+
-+extern spinlock_t pgd_lock;
-+extern struct page *pgd_list;
-+void vmalloc_sync_all(void);
-+
-+#endif /* !__ASSEMBLY__ */
-+
-+extern int kern_addr_valid(unsigned long addr); 
-+
-+#define DOMID_LOCAL (0xFFFFU)
-+
-+struct vm_area_struct;
-+
-+int direct_remap_pfn_range(struct vm_area_struct *vma,
-+                            unsigned long address,
-+                            unsigned long mfn,
-+                            unsigned long size,
-+                            pgprot_t prot,
-+                            domid_t  domid);
-+
-+int direct_kernel_remap_pfn_range(unsigned long address, 
-+                                unsigned long mfn,
-+                                unsigned long size, 
-+                                pgprot_t prot,
-+                                domid_t  domid);
-+
-+int create_lookup_pte_addr(struct mm_struct *mm,
-+                           unsigned long address,
-+                           uint64_t *ptep);
-+
-+int touch_pte_range(struct mm_struct *mm,
-+                    unsigned long address,
-+                    unsigned long size);
-+
-+int xen_change_pte_range(struct mm_struct *mm, pmd_t *pmd,
-+              unsigned long addr, unsigned long end, pgprot_t newprot);
-+
-+#define arch_change_pte_range(mm, pmd, addr, end, newprot)    \
-+              xen_change_pte_range(mm, pmd, addr, end, newprot)
-+
-+#define io_remap_pfn_range(vma, vaddr, pfn, size, prot)               \
-+              direct_remap_pfn_range(vma,vaddr,pfn,size,prot,DOMID_IO)
-+
-+#define MK_IOSPACE_PFN(space, pfn)    (pfn)
-+#define GET_IOSPACE(pfn)              0
-+#define GET_PFN(pfn)                  (pfn)
-+
-+#define HAVE_ARCH_UNMAPPED_AREA
-+
-+#define pgtable_cache_init()   do { } while (0)
-+#define check_pgt_cache()      do { } while (0)
-+
-+#define PAGE_AGP    PAGE_KERNEL_NOCACHE
-+#define HAVE_PAGE_AGP 1
-+
-+/* fs/proc/kcore.c */
-+#define       kc_vaddr_to_offset(v) ((v) & __VIRTUAL_MASK)
-+#define       kc_offset_to_vaddr(o) \
-+   (((o) & (1UL << (__VIRTUAL_MASK_SHIFT-1))) ? ((o) | (~__VIRTUAL_MASK)) : (o))
-+
-+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_YOUNG
-+#define __HAVE_ARCH_PTEP_TEST_AND_CLEAR_DIRTY
-+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR
-+#define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
-+#define __HAVE_ARCH_PTEP_CLEAR_FLUSH
-+#define __HAVE_ARCH_PTEP_SET_WRPROTECT
-+#define __HAVE_ARCH_PTE_SAME
-+#include <asm-generic/pgtable.h>
-+
-+#endif /* _X86_64_PGTABLE_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/processor_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/processor_64.h        2008-03-06 08:54:32.000000000 +0100
-@@ -0,0 +1,502 @@
-+/*
-+ * include/asm-x86_64/processor.h
-+ *
-+ * Copyright (C) 1994 Linus Torvalds
-+ */
-+
-+#ifndef __ASM_X86_64_PROCESSOR_H
-+#define __ASM_X86_64_PROCESSOR_H
-+
-+#include <asm/segment.h>
-+#include <asm/page.h>
-+#include <asm/types.h>
-+#include <asm/sigcontext.h>
-+#include <asm/cpufeature.h>
-+#include <linux/threads.h>
-+#include <asm/msr.h>
-+#include <asm/current.h>
-+#include <asm/system.h>
-+#include <asm/mmsegment.h>
-+#include <asm/percpu.h>
-+#include <linux/personality.h>
-+#include <linux/cpumask.h>
-+
-+#define TF_MASK               0x00000100
-+#define IF_MASK               0x00000200
-+#define IOPL_MASK     0x00003000
-+#define NT_MASK               0x00004000
-+#define VM_MASK               0x00020000
-+#define AC_MASK               0x00040000
-+#define VIF_MASK      0x00080000      /* virtual interrupt flag */
-+#define VIP_MASK      0x00100000      /* virtual interrupt pending */
-+#define ID_MASK               0x00200000
-+
-+#define desc_empty(desc) \
-+               (!((desc)->a | (desc)->b))
-+
-+#define desc_equal(desc1, desc2) \
-+               (((desc1)->a == (desc2)->a) && ((desc1)->b == (desc2)->b))
-+
-+/*
-+ * Default implementation of macro that returns current
-+ * instruction pointer ("program counter").
-+ */
-+#define current_text_addr() ({ void *pc; asm volatile("leaq 1f(%%rip),%0\n1:":"=r"(pc)); pc; })
-+
-+/*
-+ *  CPU type and hardware bug flags. Kept separately for each CPU.
-+ */
-+
-+struct cpuinfo_x86 {
-+      __u8    x86;            /* CPU family */
-+      __u8    x86_vendor;     /* CPU vendor */
-+      __u8    x86_model;
-+      __u8    x86_mask;
-+      int     cpuid_level;    /* Maximum supported CPUID level, -1=no CPUID */
-+      __u32   x86_capability[NCAPINTS];
-+      char    x86_vendor_id[16];
-+      char    x86_model_id[64];
-+      int     x86_cache_size;  /* in KB */
-+      int     x86_clflush_size;
-+      int     x86_cache_alignment;
-+      int     x86_tlbsize;    /* number of 4K pages in DTLB/ITLB combined(in pages)*/
-+        __u8    x86_virt_bits, x86_phys_bits;
-+      __u8    x86_max_cores;  /* cpuid returned max cores value */
-+        __u32   x86_power;    
-+      __u32   extended_cpuid_level;   /* Max extended CPUID function supported */
-+      unsigned long loops_per_jiffy;
-+#ifdef CONFIG_SMP
-+      cpumask_t llc_shared_map;       /* cpus sharing the last level cache */
-+#endif
-+      __u8    apicid;
-+#ifdef CONFIG_SMP
-+      __u8    booted_cores;   /* number of cores as seen by OS */
-+      __u8    phys_proc_id;   /* Physical Processor id. */
-+      __u8    cpu_core_id;    /* Core id. */
-+#endif
-+} ____cacheline_aligned;
-+
-+#define X86_VENDOR_INTEL 0
-+#define X86_VENDOR_CYRIX 1
-+#define X86_VENDOR_AMD 2
-+#define X86_VENDOR_UMC 3
-+#define X86_VENDOR_NEXGEN 4
-+#define X86_VENDOR_CENTAUR 5
-+#define X86_VENDOR_RISE 6
-+#define X86_VENDOR_TRANSMETA 7
-+#define X86_VENDOR_NUM 8
-+#define X86_VENDOR_UNKNOWN 0xff
-+
-+#ifdef CONFIG_SMP
-+extern struct cpuinfo_x86 cpu_data[];
-+#define current_cpu_data cpu_data[smp_processor_id()]
-+#else
-+#define cpu_data (&boot_cpu_data)
-+#define current_cpu_data boot_cpu_data
-+#endif
-+
-+extern char ignore_irq13;
-+
-+extern void identify_cpu(struct cpuinfo_x86 *);
-+extern void print_cpu_info(struct cpuinfo_x86 *);
-+extern unsigned int init_intel_cacheinfo(struct cpuinfo_x86 *c);
-+extern unsigned short num_cache_leaves;
-+
-+/*
-+ * EFLAGS bits
-+ */
-+#define X86_EFLAGS_CF 0x00000001 /* Carry Flag */
-+#define X86_EFLAGS_PF 0x00000004 /* Parity Flag */
-+#define X86_EFLAGS_AF 0x00000010 /* Auxillary carry Flag */
-+#define X86_EFLAGS_ZF 0x00000040 /* Zero Flag */
-+#define X86_EFLAGS_SF 0x00000080 /* Sign Flag */
-+#define X86_EFLAGS_TF 0x00000100 /* Trap Flag */
-+#define X86_EFLAGS_IF 0x00000200 /* Interrupt Flag */
-+#define X86_EFLAGS_DF 0x00000400 /* Direction Flag */
-+#define X86_EFLAGS_OF 0x00000800 /* Overflow Flag */
-+#define X86_EFLAGS_IOPL       0x00003000 /* IOPL mask */
-+#define X86_EFLAGS_NT 0x00004000 /* Nested Task */
-+#define X86_EFLAGS_RF 0x00010000 /* Resume Flag */
-+#define X86_EFLAGS_VM 0x00020000 /* Virtual Mode */
-+#define X86_EFLAGS_AC 0x00040000 /* Alignment Check */
-+#define X86_EFLAGS_VIF        0x00080000 /* Virtual Interrupt Flag */
-+#define X86_EFLAGS_VIP        0x00100000 /* Virtual Interrupt Pending */
-+#define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */
-+
-+/*
-+ * Intel CPU features in CR4
-+ */
-+#define X86_CR4_VME           0x0001  /* enable vm86 extensions */
-+#define X86_CR4_PVI           0x0002  /* virtual interrupts flag enable */
-+#define X86_CR4_TSD           0x0004  /* disable time stamp at ipl 3 */
-+#define X86_CR4_DE            0x0008  /* enable debugging extensions */
-+#define X86_CR4_PSE           0x0010  /* enable page size extensions */
-+#define X86_CR4_PAE           0x0020  /* enable physical address extensions */
-+#define X86_CR4_MCE           0x0040  /* Machine check enable */
-+#define X86_CR4_PGE           0x0080  /* enable global pages */
-+#define X86_CR4_PCE           0x0100  /* enable performance counters at ipl 3 */
-+#define X86_CR4_OSFXSR                0x0200  /* enable fast FPU save and restore */
-+#define X86_CR4_OSXMMEXCPT    0x0400  /* enable unmasked SSE exceptions */
-+
-+/*
-+ * Save the cr4 feature set we're using (ie
-+ * Pentium 4MB enable and PPro Global page
-+ * enable), so that any CPU's that boot up
-+ * after us can get the correct flags.
-+ */
-+extern unsigned long mmu_cr4_features;
-+
-+static inline void set_in_cr4 (unsigned long mask)
-+{
-+      mmu_cr4_features |= mask;
-+      __asm__("movq %%cr4,%%rax\n\t"
-+              "orq %0,%%rax\n\t"
-+              "movq %%rax,%%cr4\n"
-+              : : "irg" (mask)
-+              :"ax");
-+}
-+
-+static inline void clear_in_cr4 (unsigned long mask)
-+{
-+      mmu_cr4_features &= ~mask;
-+      __asm__("movq %%cr4,%%rax\n\t"
-+              "andq %0,%%rax\n\t"
-+              "movq %%rax,%%cr4\n"
-+              : : "irg" (~mask)
-+              :"ax");
-+}
-+
-+
-+/*
-+ * User space process size. 47bits minus one guard page.
-+ */
-+#define TASK_SIZE64   (0x800000000000UL - 4096)
-+
-+/* This decides where the kernel will search for a free chunk of vm
-+ * space during mmap's.
-+ */
-+#define IA32_PAGE_OFFSET ((current->personality & ADDR_LIMIT_3GB) ? 0xc0000000 : 0xFFFFe000)
-+
-+#define TASK_SIZE             (test_thread_flag(TIF_IA32) ? IA32_PAGE_OFFSET : TASK_SIZE64)
-+#define TASK_SIZE_OF(child)   ((test_tsk_thread_flag(child, TIF_IA32)) ? IA32_PAGE_OFFSET : TASK_SIZE64)
-+
-+#define TASK_UNMAPPED_BASE    PAGE_ALIGN(TASK_SIZE/3)
-+
-+/*
-+ * Size of io_bitmap.
-+ */
-+#define IO_BITMAP_BITS  65536
-+#define IO_BITMAP_BYTES (IO_BITMAP_BITS/8)
-+#define IO_BITMAP_LONGS (IO_BITMAP_BYTES/sizeof(long))
-+#ifndef CONFIG_X86_NO_TSS
-+#define IO_BITMAP_OFFSET offsetof(struct tss_struct,io_bitmap)
-+#endif
-+#define INVALID_IO_BITMAP_OFFSET 0x8000
-+
-+struct i387_fxsave_struct {
-+      u16     cwd;
-+      u16     swd;
-+      u16     twd;
-+      u16     fop;
-+      u64     rip;
-+      u64     rdp; 
-+      u32     mxcsr;
-+      u32     mxcsr_mask;
-+      u32     st_space[32];   /* 8*16 bytes for each FP-reg = 128 bytes */
-+      u32     xmm_space[64];  /* 16*16 bytes for each XMM-reg = 128 bytes */
-+      u32     padding[24];
-+} __attribute__ ((aligned (16)));
-+
-+union i387_union {
-+      struct i387_fxsave_struct       fxsave;
-+};
-+
-+#ifndef CONFIG_X86_NO_TSS
-+struct tss_struct {
-+      u32 reserved1;
-+      u64 rsp0;       
-+      u64 rsp1;
-+      u64 rsp2;
-+      u64 reserved2;
-+      u64 ist[7];
-+      u32 reserved3;
-+      u32 reserved4;
-+      u16 reserved5;
-+      u16 io_bitmap_base;
-+      /*
-+       * The extra 1 is there because the CPU will access an
-+       * additional byte beyond the end of the IO permission
-+       * bitmap. The extra byte must be all 1 bits, and must
-+       * be within the limit. Thus we have:
-+       *
-+       * 128 bytes, the bitmap itself, for ports 0..0x3ff
-+       * 8 bytes, for an extra "long" of ~0UL
-+       */
-+      unsigned long io_bitmap[IO_BITMAP_LONGS + 1];
-+} __attribute__((packed)) ____cacheline_aligned;
-+
-+DECLARE_PER_CPU(struct tss_struct,init_tss);
-+#endif
-+
-+
-+extern struct cpuinfo_x86 boot_cpu_data;
-+#ifndef CONFIG_X86_NO_TSS
-+/* Save the original ist values for checking stack pointers during debugging */
-+struct orig_ist {
-+      unsigned long ist[7];
-+};
-+DECLARE_PER_CPU(struct orig_ist, orig_ist);
-+#endif
-+
-+#ifdef CONFIG_X86_VSMP
-+#define ARCH_MIN_TASKALIGN    (1 << INTERNODE_CACHE_SHIFT)
-+#define ARCH_MIN_MMSTRUCT_ALIGN       (1 << INTERNODE_CACHE_SHIFT)
-+#else
-+#define ARCH_MIN_TASKALIGN    16
-+#define ARCH_MIN_MMSTRUCT_ALIGN       0
-+#endif
-+
-+struct thread_struct {
-+      unsigned long   rsp0;
-+      unsigned long   rsp;
-+      unsigned long   userrsp;        /* Copy from PDA */ 
-+      unsigned long   fs;
-+      unsigned long   gs;
-+      unsigned short  es, ds, fsindex, gsindex;       
-+/* Hardware debugging registers */
-+      unsigned long   debugreg0;  
-+      unsigned long   debugreg1;  
-+      unsigned long   debugreg2;  
-+      unsigned long   debugreg3;  
-+      unsigned long   debugreg6;  
-+      unsigned long   debugreg7;  
-+/* fault info */
-+      unsigned long   cr2, trap_no, error_code;
-+/* floating point info */
-+      union i387_union        i387  __attribute__((aligned(16)));
-+/* IO permissions. the bitmap could be moved into the GDT, that would make
-+   switch faster for a limited number of ioperm using tasks. -AK */
-+      int             ioperm;
-+      unsigned long   *io_bitmap_ptr;
-+      unsigned io_bitmap_max;
-+/* cached TLS descriptors. */
-+      u64 tls_array[GDT_ENTRY_TLS_ENTRIES];
-+      unsigned int    iopl;
-+} __attribute__((aligned(16)));
-+
-+#define INIT_THREAD  { \
-+      .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
-+}
-+
-+#ifndef CONFIG_X86_NO_TSS
-+#define INIT_TSS  { \
-+      .rsp0 = (unsigned long)&init_stack + sizeof(init_stack) \
-+}
-+#endif
-+
-+#define INIT_MMAP \
-+{ &init_mm, 0, 0, NULL, PAGE_SHARED, VM_READ | VM_WRITE | VM_EXEC, 1, NULL, NULL }
-+
-+#define start_thread(regs,new_rip,new_rsp) do { \
-+      asm volatile("movl %0,%%fs; movl %0,%%es; movl %0,%%ds": :"r" (0));      \
-+      load_gs_index(0);                                                       \
-+      (regs)->rip = (new_rip);                                                 \
-+      (regs)->rsp = (new_rsp);                                                 \
-+      write_pda(oldrsp, (new_rsp));                                            \
-+      (regs)->cs = __USER_CS;                                                  \
-+      (regs)->ss = __USER_DS;                                                  \
-+      (regs)->eflags = 0x200;                                                  \
-+      set_fs(USER_DS);                                                         \
-+} while(0) 
-+
-+#define get_debugreg(var, register)                           \
-+      var = HYPERVISOR_get_debugreg(register)
-+#define set_debugreg(value, register) do {                    \
-+      if (HYPERVISOR_set_debugreg(register, value))           \
-+              BUG();                                          \
-+} while (0)
-+
-+struct task_struct;
-+struct mm_struct;
-+
-+/* Free all resources held by a thread. */
-+extern void release_thread(struct task_struct *);
-+
-+/* Prepare to copy thread state - unlazy all lazy status */
-+extern void prepare_to_copy(struct task_struct *tsk);
-+
-+/*
-+ * create a kernel thread without removing it from tasklists
-+ */
-+extern long kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
-+
-+/*
-+ * Return saved PC of a blocked thread.
-+ * What is this good for? it will be always the scheduler or ret_from_fork.
-+ */
-+#define thread_saved_pc(t) (*(unsigned long *)((t)->thread.rsp - 8))
-+
-+extern unsigned long get_wchan(struct task_struct *p);
-+#define task_pt_regs(tsk) ((struct pt_regs *)(tsk)->thread.rsp0 - 1)
-+#define KSTK_EIP(tsk) (task_pt_regs(tsk)->rip)
-+#define KSTK_ESP(tsk) -1 /* sorry. doesn't work for syscall. */
-+
-+
-+struct microcode_header {
-+      unsigned int hdrver;
-+      unsigned int rev;
-+      unsigned int date;
-+      unsigned int sig;
-+      unsigned int cksum;
-+      unsigned int ldrver;
-+      unsigned int pf;
-+      unsigned int datasize;
-+      unsigned int totalsize;
-+      unsigned int reserved[3];
-+};
-+
-+struct microcode {
-+      struct microcode_header hdr;
-+      unsigned int bits[0];
-+};
-+
-+typedef struct microcode microcode_t;
-+typedef struct microcode_header microcode_header_t;
-+
-+/* microcode format is extended from prescott processors */
-+struct extended_signature {
-+      unsigned int sig;
-+      unsigned int pf;
-+      unsigned int cksum;
-+};
-+
-+struct extended_sigtable {
-+      unsigned int count;
-+      unsigned int cksum;
-+      unsigned int reserved[3];
-+      struct extended_signature sigs[0];
-+};
-+
-+
-+#define ASM_NOP1 K8_NOP1
-+#define ASM_NOP2 K8_NOP2
-+#define ASM_NOP3 K8_NOP3
-+#define ASM_NOP4 K8_NOP4
-+#define ASM_NOP5 K8_NOP5
-+#define ASM_NOP6 K8_NOP6
-+#define ASM_NOP7 K8_NOP7
-+#define ASM_NOP8 K8_NOP8
-+
-+/* Opteron nops */
-+#define K8_NOP1 ".byte 0x90\n"
-+#define K8_NOP2       ".byte 0x66,0x90\n" 
-+#define K8_NOP3       ".byte 0x66,0x66,0x90\n" 
-+#define K8_NOP4       ".byte 0x66,0x66,0x66,0x90\n" 
-+#define K8_NOP5       K8_NOP3 K8_NOP2 
-+#define K8_NOP6       K8_NOP3 K8_NOP3
-+#define K8_NOP7       K8_NOP4 K8_NOP3
-+#define K8_NOP8       K8_NOP4 K8_NOP4
-+
-+#define ASM_NOP_MAX 8
-+
-+/* REP NOP (PAUSE) is a good thing to insert into busy-wait loops. */
-+static inline void rep_nop(void)
-+{
-+      __asm__ __volatile__("rep;nop": : :"memory");
-+}
-+
-+/* Stop speculative execution */
-+static inline void sync_core(void)
-+{ 
-+      int tmp;
-+      asm volatile("cpuid" : "=a" (tmp) : "0" (1) : "ebx","ecx","edx","memory");
-+} 
-+
-+#define cpu_has_fpu 1
-+
-+#define ARCH_HAS_PREFETCH
-+static inline void prefetch(void *x) 
-+{ 
-+      asm volatile("prefetcht0 %0" :: "m" (*(unsigned long *)x));
-+} 
-+
-+#define ARCH_HAS_PREFETCHW 1
-+static inline void prefetchw(void *x) 
-+{ 
-+      alternative_input("prefetcht0 (%1)",
-+                        "prefetchw (%1)",
-+                        X86_FEATURE_3DNOW,
-+                        "r" (x));
-+} 
-+
-+#define ARCH_HAS_SPINLOCK_PREFETCH 1
-+
-+#define spin_lock_prefetch(x)  prefetchw(x)
-+
-+#define cpu_relax()   rep_nop()
-+
-+/*
-+ *      NSC/Cyrix CPU configuration register indexes
-+ */
-+#define CX86_CCR0 0xc0
-+#define CX86_CCR1 0xc1
-+#define CX86_CCR2 0xc2
-+#define CX86_CCR3 0xc3
-+#define CX86_CCR4 0xe8
-+#define CX86_CCR5 0xe9
-+#define CX86_CCR6 0xea
-+#define CX86_CCR7 0xeb
-+#define CX86_DIR0 0xfe
-+#define CX86_DIR1 0xff
-+#define CX86_ARR_BASE 0xc4
-+#define CX86_RCR_BASE 0xdc
-+
-+/*
-+ *      NSC/Cyrix CPU indexed register access macros
-+ */
-+
-+#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-+
-+#define setCx86(reg, data) do { \
-+      outb((reg), 0x22); \
-+      outb((data), 0x23); \
-+} while (0)
-+
-+static inline void serialize_cpu(void)
-+{
-+      __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
-+}
-+
-+static inline void __monitor(const void *eax, unsigned long ecx,
-+              unsigned long edx)
-+{
-+      /* "monitor %eax,%ecx,%edx;" */
-+      asm volatile(
-+              ".byte 0x0f,0x01,0xc8;"
-+              : :"a" (eax), "c" (ecx), "d"(edx));
-+}
-+
-+static inline void __mwait(unsigned long eax, unsigned long ecx)
-+{
-+      /* "mwait %eax,%ecx;" */
-+      asm volatile(
-+              ".byte 0x0f,0x01,0xc9;"
-+              : :"a" (eax), "c" (ecx));
-+}
-+
-+#define stack_current() \
-+({                                                            \
-+      struct thread_info *ti;                                 \
-+      asm("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK));  \
-+      ti->task;                                       \
-+})
-+
-+#define cache_line_size() (boot_cpu_data.x86_cache_alignment)
-+
-+extern unsigned long boot_option_idle_override;
-+/* Boot loader type from the setup header */
-+extern int bootloader_type;
-+
-+#define HAVE_ARCH_PICK_MMAP_LAYOUT 1
-+
-+#endif /* __ASM_X86_64_PROCESSOR_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/smp_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/smp_64.h      2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,150 @@
-+#ifndef __ASM_SMP_H
-+#define __ASM_SMP_H
-+
-+/*
-+ * We need the APIC definitions automatically as part of 'smp.h'
-+ */
-+#ifndef __ASSEMBLY__
-+#include <linux/threads.h>
-+#include <linux/cpumask.h>
-+#include <linux/bitops.h>
-+extern int disable_apic;
-+#endif
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+#ifndef __ASSEMBLY__
-+#include <asm/fixmap.h>
-+#include <asm/mpspec.h>
-+#ifdef CONFIG_X86_IO_APIC
-+#include <asm/io_apic.h>
-+#endif
-+#include <asm/apic.h>
-+#include <asm/thread_info.h>
-+#endif
-+#endif
-+
-+#ifdef CONFIG_SMP
-+#ifndef ASSEMBLY
-+
-+#include <asm/pda.h>
-+
-+struct pt_regs;
-+
-+extern cpumask_t cpu_present_mask;
-+extern cpumask_t cpu_possible_map;
-+extern cpumask_t cpu_online_map;
-+extern cpumask_t cpu_initialized;
-+
-+/*
-+ * Private routines/data
-+ */
-+ 
-+extern void smp_alloc_memory(void);
-+extern volatile unsigned long smp_invalidate_needed;
-+extern int pic_mode;
-+extern void lock_ipi_call_lock(void);
-+extern void unlock_ipi_call_lock(void);
-+extern int smp_num_siblings;
-+extern void smp_send_reschedule(int cpu);
-+void smp_stop_cpu(void);
-+extern int smp_call_function_single(int cpuid, void (*func) (void *info),
-+                              void *info, int retry, int wait);
-+
-+extern cpumask_t cpu_sibling_map[NR_CPUS];
-+extern cpumask_t cpu_core_map[NR_CPUS];
-+extern u8 cpu_llc_id[NR_CPUS];
-+
-+#define SMP_TRAMPOLINE_BASE 0x6000
-+
-+/*
-+ * On x86 all CPUs are mapped 1:1 to the APIC space.
-+ * This simplifies scheduling and IPI sending and
-+ * compresses data structures.
-+ */
-+
-+static inline int num_booting_cpus(void)
-+{
-+      return cpus_weight(cpu_possible_map);
-+}
-+
-+#define raw_smp_processor_id() read_pda(cpunumber)
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+static inline int hard_smp_processor_id(void)
-+{
-+      /* we don't want to mark this access volatile - bad code generation */
-+      return GET_APIC_ID(*(unsigned int *)(APIC_BASE+APIC_ID));
-+}
-+#endif
-+
-+extern int safe_smp_processor_id(void);
-+extern int __cpu_disable(void);
-+extern void __cpu_die(unsigned int cpu);
-+extern void prefill_possible_map(void);
-+extern unsigned num_processors;
-+extern unsigned disabled_cpus;
-+
-+#endif /* !ASSEMBLY */
-+
-+#define NO_PROC_ID            0xFF            /* No processor magic marker */
-+
-+#endif
-+
-+#ifndef ASSEMBLY
-+/*
-+ * Some lowlevel functions might want to know about
-+ * the real APIC ID <-> CPU # mapping.
-+ */
-+extern u8 x86_cpu_to_apicid[NR_CPUS]; /* physical ID */
-+extern u8 x86_cpu_to_log_apicid[NR_CPUS];
-+extern u8 bios_cpu_apicid[];
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
-+{
-+      return cpus_addr(cpumask)[0];
-+}
-+
-+static inline int cpu_present_to_apicid(int mps_cpu)
-+{
-+      if (mps_cpu < NR_CPUS)
-+              return (int)bios_cpu_apicid[mps_cpu];
-+      else
-+              return BAD_APICID;
-+}
-+#endif
-+
-+#endif /* !ASSEMBLY */
-+
-+#ifndef CONFIG_SMP
-+#define stack_smp_processor_id() 0
-+#define safe_smp_processor_id() 0
-+#define cpu_logical_map(x) (x)
-+#else
-+#include <asm/thread_info.h>
-+#define stack_smp_processor_id() \
-+({                                                            \
-+      struct thread_info *ti;                                 \
-+      __asm__("andq %%rsp,%0; ":"=r" (ti) : "0" (CURRENT_MASK));      \
-+      ti->cpu;                                                \
-+})
-+#endif
-+
-+#ifndef __ASSEMBLY__
-+#ifdef CONFIG_X86_LOCAL_APIC
-+static __inline int logical_smp_processor_id(void)
-+{
-+      /* we don't want to mark this access volatile - bad code generation */
-+      return GET_APIC_LOGICAL_ID(*(unsigned long *)(APIC_BASE+APIC_LDR));
-+}
-+#endif
-+#endif
-+
-+#ifdef CONFIG_SMP
-+#define cpu_physical_id(cpu)          x86_cpu_to_apicid[cpu]
-+#else
-+#define cpu_physical_id(cpu)          boot_cpu_id
-+#endif
-+
-+#endif
-+
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/system_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/system_64.h   2007-11-26 16:59:25.000000000 +0100
-@@ -0,0 +1,256 @@
-+#ifndef __ASM_SYSTEM_H
-+#define __ASM_SYSTEM_H
-+
-+#include <linux/kernel.h>
-+#include <asm/segment.h>
-+#include <asm/alternative.h>
-+
-+#include <asm/synch_bitops.h>
-+#include <asm/hypervisor.h>
-+#include <xen/interface/arch-x86_64.h>
-+
-+#ifdef __KERNEL__
-+
-+#define __STR(x) #x
-+#define STR(x) __STR(x)
-+
-+#define __SAVE(reg,offset) "movq %%" #reg ",(14-" #offset ")*8(%%rsp)\n\t"
-+#define __RESTORE(reg,offset) "movq (14-" #offset ")*8(%%rsp),%%" #reg "\n\t"
-+
-+/* frame pointer must be last for get_wchan */
-+#define SAVE_CONTEXT    "pushf ; pushq %%rbp ; movq %%rsi,%%rbp\n\t"
-+#define RESTORE_CONTEXT "movq %%rbp,%%rsi ; popq %%rbp ; popf\n\t"
-+
-+#define __EXTRA_CLOBBER  \
-+      ,"rcx","rbx","rdx","r8","r9","r10","r11","r12","r13","r14","r15"
-+
-+#define switch_to(prev,next,last) \
-+      asm volatile(SAVE_CONTEXT                                                   \
-+                   "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */       \
-+                   "movq %P[threadrsp](%[next]),%%rsp\n\t" /* restore RSP */    \
-+                   "call __switch_to\n\t"                                       \
-+                   ".globl thread_return\n"                                   \
-+                   "thread_return:\n\t"                                           \
-+                   "movq %%gs:%P[pda_pcurrent],%%rsi\n\t"                       \
-+                   "movq %P[thread_info](%%rsi),%%r8\n\t"                       \
-+                   LOCK_PREFIX "btr  %[tif_fork],%P[ti_flags](%%r8)\n\t"        \
-+                   "movq %%rax,%%rdi\n\t"                                       \
-+                   "jc   ret_from_fork\n\t"                                     \
-+                   RESTORE_CONTEXT                                                \
-+                   : "=a" (last)                                                \
-+                   : [next] "S" (next), [prev] "D" (prev),                      \
-+                     [threadrsp] "i" (offsetof(struct task_struct, thread.rsp)), \
-+                     [ti_flags] "i" (offsetof(struct thread_info, flags)),\
-+                     [tif_fork] "i" (TIF_FORK),                         \
-+                     [thread_info] "i" (offsetof(struct task_struct, thread_info)), \
-+                     [pda_pcurrent] "i" (offsetof(struct x8664_pda, pcurrent))   \
-+                   : "memory", "cc" __EXTRA_CLOBBER)
-+    
-+extern void load_gs_index(unsigned); 
-+
-+/*
-+ * Load a segment. Fall back on loading the zero
-+ * segment if something goes wrong..
-+ */
-+#define loadsegment(seg,value)        \
-+      asm volatile("\n"                       \
-+              "1:\t"                          \
-+              "movl %k0,%%" #seg "\n"         \
-+              "2:\n"                          \
-+              ".section .fixup,\"ax\"\n"      \
-+              "3:\t"                          \
-+              "movl %1,%%" #seg "\n\t"        \
-+              "jmp 2b\n"                      \
-+              ".previous\n"                   \
-+              ".section __ex_table,\"a\"\n\t" \
-+              ".align 8\n\t"                  \
-+              ".quad 1b,3b\n"                 \
-+              ".previous"                     \
-+              : :"r" (value), "r" (0))
-+
-+/*
-+ * Clear and set 'TS' bit respectively
-+ */
-+#define clts() (HYPERVISOR_fpu_taskswitch(0))
-+
-+static inline unsigned long read_cr0(void)
-+{ 
-+      unsigned long cr0;
-+      asm volatile("movq %%cr0,%0" : "=r" (cr0));
-+      return cr0;
-+} 
-+
-+static inline void write_cr0(unsigned long val) 
-+{ 
-+      asm volatile("movq %0,%%cr0" :: "r" (val));
-+} 
-+
-+#define read_cr3() ({ \
-+      unsigned long __dummy; \
-+      asm("movq %%cr3,%0" : "=r" (__dummy)); \
-+      machine_to_phys(__dummy); \
-+})
-+
-+static inline unsigned long read_cr4(void)
-+{ 
-+      unsigned long cr4;
-+      asm("movq %%cr4,%0" : "=r" (cr4));
-+      return cr4;
-+} 
-+
-+static inline void write_cr4(unsigned long val)
-+{ 
-+      asm volatile("movq %0,%%cr4" :: "r" (val));
-+} 
-+
-+#define stts() (HYPERVISOR_fpu_taskswitch(1))
-+
-+#define wbinvd() \
-+      __asm__ __volatile__ ("wbinvd": : :"memory");
-+
-+/*
-+ * On SMP systems, when the scheduler does migration-cost autodetection,
-+ * it needs a way to flush as much of the CPU's caches as possible.
-+ */
-+static inline void sched_cacheflush(void)
-+{
-+      wbinvd();
-+}
-+
-+#endif        /* __KERNEL__ */
-+
-+#define nop() __asm__ __volatile__ ("nop")
-+
-+#define xchg(ptr,v) ((__typeof__(*(ptr)))__xchg((unsigned long)(v),(ptr),sizeof(*(ptr))))
-+
-+#define tas(ptr) (xchg((ptr),1))
-+
-+#define __xg(x) ((volatile long *)(x))
-+
-+static inline void set_64bit(volatile unsigned long *ptr, unsigned long val)
-+{
-+      *ptr = val;
-+}
-+
-+#define _set_64bit set_64bit
-+
-+/*
-+ * Note: no "lock" prefix even on SMP: xchg always implies lock anyway
-+ * Note 2: xchg has side effect, so that attribute volatile is necessary,
-+ *      but generally the primitive is invalid, *ptr is output argument. --ANK
-+ */
-+static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
-+{
-+      switch (size) {
-+              case 1:
-+                      __asm__ __volatile__("xchgb %b0,%1"
-+                              :"=q" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+              case 2:
-+                      __asm__ __volatile__("xchgw %w0,%1"
-+                              :"=r" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+              case 4:
-+                      __asm__ __volatile__("xchgl %k0,%1"
-+                              :"=r" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+              case 8:
-+                      __asm__ __volatile__("xchgq %0,%1"
-+                              :"=r" (x)
-+                              :"m" (*__xg(ptr)), "0" (x)
-+                              :"memory");
-+                      break;
-+      }
-+      return x;
-+}
-+
-+/*
-+ * Atomic compare and exchange.  Compare OLD with MEM, if identical,
-+ * store NEW in MEM.  Return the initial value in MEM.  Success is
-+ * indicated by comparing RETURN with OLD.
-+ */
-+
-+#define __HAVE_ARCH_CMPXCHG 1
-+
-+static inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old,
-+                                    unsigned long new, int size)
-+{
-+      unsigned long prev;
-+      switch (size) {
-+      case 1:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgb %b1,%2"
-+                                   : "=a"(prev)
-+                                   : "q"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 2:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgw %w1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 4:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgl %k1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      case 8:
-+              __asm__ __volatile__(LOCK_PREFIX "cmpxchgq %1,%2"
-+                                   : "=a"(prev)
-+                                   : "r"(new), "m"(*__xg(ptr)), "0"(old)
-+                                   : "memory");
-+              return prev;
-+      }
-+      return old;
-+}
-+
-+#define cmpxchg(ptr,o,n)\
-+      ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
-+                                      (unsigned long)(n),sizeof(*(ptr))))
-+
-+#ifdef CONFIG_SMP
-+#define smp_mb()      mb()
-+#define smp_rmb()     rmb()
-+#define smp_wmb()     wmb()
-+#define smp_read_barrier_depends()    do {} while(0)
-+#else
-+#define smp_mb()      barrier()
-+#define smp_rmb()     barrier()
-+#define smp_wmb()     barrier()
-+#define smp_read_barrier_depends()    do {} while(0)
-+#endif
-+
-+    
-+/*
-+ * Force strict CPU ordering.
-+ * And yes, this is required on UP too when we're talking
-+ * to devices.
-+ */
-+#define mb()  asm volatile("mfence":::"memory")
-+#define rmb() asm volatile("lfence":::"memory")
-+
-+#ifdef CONFIG_UNORDERED_IO
-+#define wmb() asm volatile("sfence" ::: "memory")
-+#else
-+#define wmb() asm volatile("" ::: "memory")
-+#endif
-+#define read_barrier_depends()        do {} while(0)
-+#define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
-+
-+#define warn_if_not_ulong(x) do { unsigned long foo; (void) (&(x) == &foo); } while (0)
-+
-+#include <linux/irqflags.h>
-+
-+void cpu_idle_wait(void);
-+
-+extern unsigned long arch_align_stack(unsigned long sp);
-+extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
-+
-+#endif
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/tlbflush_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/tlbflush_64.h 2007-11-26 16:59:25.000000000 +0100
-@@ -0,0 +1,103 @@
-+#ifndef _X8664_TLBFLUSH_H
-+#define _X8664_TLBFLUSH_H
-+
-+#include <linux/mm.h>
-+#include <asm/processor.h>
-+
-+#define __flush_tlb() xen_tlb_flush()
-+
-+/*
-+ * Global pages have to be flushed a bit differently. Not a real
-+ * performance problem because this does not happen often.
-+ */
-+#define __flush_tlb_global()  xen_tlb_flush()
-+
-+
-+extern unsigned long pgkern_mask;
-+
-+#define __flush_tlb_all() __flush_tlb_global()
-+
-+#define __flush_tlb_one(addr) xen_invlpg((unsigned long)addr)
-+
-+
-+/*
-+ * TLB flushing:
-+ *
-+ *  - flush_tlb() flushes the current mm struct TLBs
-+ *  - flush_tlb_all() flushes all processes TLBs
-+ *  - flush_tlb_mm(mm) flushes the specified mm context TLB's
-+ *  - flush_tlb_page(vma, vmaddr) flushes one page
-+ *  - flush_tlb_range(vma, start, end) flushes a range of pages
-+ *  - flush_tlb_kernel_range(start, end) flushes a range of kernel pages
-+ *  - flush_tlb_pgtables(mm, start, end) flushes a range of page tables
-+ *
-+ * x86-64 can only flush individual pages or full VMs. For a range flush
-+ * we always do the full VM. Might be worth trying if for a small
-+ * range a few INVLPGs in a row are a win.
-+ */
-+
-+#ifndef CONFIG_SMP
-+
-+#define flush_tlb() __flush_tlb()
-+#define flush_tlb_all() __flush_tlb_all()
-+#define local_flush_tlb() __flush_tlb()
-+
-+static inline void flush_tlb_mm(struct mm_struct *mm)
-+{
-+      if (mm == current->active_mm)
-+              __flush_tlb();
-+}
-+
-+static inline void flush_tlb_page(struct vm_area_struct *vma,
-+      unsigned long addr)
-+{
-+      if (vma->vm_mm == current->active_mm)
-+              __flush_tlb_one(addr);
-+}
-+
-+static inline void flush_tlb_range(struct vm_area_struct *vma,
-+      unsigned long start, unsigned long end)
-+{
-+      if (vma->vm_mm == current->active_mm)
-+              __flush_tlb();
-+}
-+
-+#else
-+
-+#include <asm/smp.h>
-+
-+#define local_flush_tlb() \
-+      __flush_tlb()
-+
-+#define flush_tlb_all xen_tlb_flush_all
-+#define flush_tlb_current_task() xen_tlb_flush_mask(&current->mm->cpu_vm_mask)
-+#define flush_tlb_mm(mm) xen_tlb_flush_mask(&(mm)->cpu_vm_mask)
-+#define flush_tlb_page(vma, va) xen_invlpg_mask(&(vma)->vm_mm->cpu_vm_mask, va)
-+
-+#define flush_tlb()   flush_tlb_current_task()
-+
-+static inline void flush_tlb_range(struct vm_area_struct * vma, unsigned long start, unsigned long end)
-+{
-+      flush_tlb_mm(vma->vm_mm);
-+}
-+
-+#define TLBSTATE_OK   1
-+#define TLBSTATE_LAZY 2
-+
-+/* Roughly an IPI every 20MB with 4k pages for freeing page table
-+   ranges. Cost is about 42k of memory for each CPU. */
-+#define ARCH_FREE_PTE_NR 5350 
-+
-+#endif
-+
-+#define flush_tlb_kernel_range(start, end) flush_tlb_all()
-+
-+static inline void flush_tlb_pgtables(struct mm_struct *mm,
-+                                    unsigned long start, unsigned long end)
-+{
-+      /* x86_64 does not keep any page table caches in a software TLB.
-+         The CPUs do in their hardware TLBs, but they are handled
-+         by the normal TLB flushing algorithms. */
-+}
-+
-+#endif /* _X8664_TLBFLUSH_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/asm/xor_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/asm/xor_64.h      2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,328 @@
-+/*
-+ * x86-64 changes / gcc fixes from Andi Kleen. 
-+ * Copyright 2002 Andi Kleen, SuSE Labs.
-+ *
-+ * This hasn't been optimized for the hammer yet, but there are likely
-+ * no advantages to be gotten from x86-64 here anyways.
-+ */
-+
-+typedef struct { unsigned long a,b; } __attribute__((aligned(16))) xmm_store_t;
-+
-+/* Doesn't use gcc to save the XMM registers, because there is no easy way to 
-+   tell it to do a clts before the register saving. */
-+#define XMMS_SAVE do {                                \
-+      preempt_disable();                      \
-+      if (!(current_thread_info()->status & TS_USEDFPU))      \
-+              clts();                         \
-+      __asm__ __volatile__ (                  \
-+              "movups %%xmm0,(%1)     ;\n\t"  \
-+              "movups %%xmm1,0x10(%1) ;\n\t"  \
-+              "movups %%xmm2,0x20(%1) ;\n\t"  \
-+              "movups %%xmm3,0x30(%1) ;\n\t"  \
-+              : "=&r" (cr0)                   \
-+              : "r" (xmm_save)                \
-+              : "memory");                    \
-+} while(0)
-+
-+#define XMMS_RESTORE do {                     \
-+      asm volatile (                          \
-+              "sfence                 ;\n\t"  \
-+              "movups (%1),%%xmm0     ;\n\t"  \
-+              "movups 0x10(%1),%%xmm1 ;\n\t"  \
-+              "movups 0x20(%1),%%xmm2 ;\n\t"  \
-+              "movups 0x30(%1),%%xmm3 ;\n\t"  \
-+              :                               \
-+              : "r" (cr0), "r" (xmm_save)     \
-+              : "memory");                    \
-+      if (!(current_thread_info()->status & TS_USEDFPU))      \
-+              stts();                         \
-+      preempt_enable();                       \
-+} while(0)
-+
-+#define OFFS(x)               "16*("#x")"
-+#define PF_OFFS(x)    "256+16*("#x")"
-+#define       PF0(x)          "       prefetchnta "PF_OFFS(x)"(%[p1])         ;\n"
-+#define LD(x,y)               "       movaps   "OFFS(x)"(%[p1]), %%xmm"#y"    ;\n"
-+#define ST(x,y)               "       movaps %%xmm"#y",   "OFFS(x)"(%[p1])    ;\n"
-+#define PF1(x)                "       prefetchnta "PF_OFFS(x)"(%[p2])         ;\n"
-+#define PF2(x)                "       prefetchnta "PF_OFFS(x)"(%[p3])         ;\n"
-+#define PF3(x)                "       prefetchnta "PF_OFFS(x)"(%[p4])         ;\n"
-+#define PF4(x)                "       prefetchnta "PF_OFFS(x)"(%[p5])         ;\n"
-+#define PF5(x)                "       prefetchnta "PF_OFFS(x)"(%[p6])         ;\n"
-+#define XO1(x,y)      "       xorps   "OFFS(x)"(%[p2]), %%xmm"#y"     ;\n"
-+#define XO2(x,y)      "       xorps   "OFFS(x)"(%[p3]), %%xmm"#y"     ;\n"
-+#define XO3(x,y)      "       xorps   "OFFS(x)"(%[p4]), %%xmm"#y"     ;\n"
-+#define XO4(x,y)      "       xorps   "OFFS(x)"(%[p5]), %%xmm"#y"     ;\n"
-+#define XO5(x,y)      "       xorps   "OFFS(x)"(%[p6]), %%xmm"#y"     ;\n"
-+
-+
-+static void
-+xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2)
-+{
-+        unsigned int lines = bytes >> 8;
-+      unsigned long cr0;
-+      xmm_store_t xmm_save[4];
-+
-+      XMMS_SAVE;
-+
-+        asm volatile (
-+#undef BLOCK
-+#define BLOCK(i) \
-+              LD(i,0)                                 \
-+                      LD(i+1,1)                       \
-+              PF1(i)                                  \
-+                              PF1(i+2)                \
-+                              LD(i+2,2)               \
-+                                      LD(i+3,3)       \
-+              PF0(i+4)                                \
-+                              PF0(i+6)                \
-+              XO1(i,0)                                \
-+                      XO1(i+1,1)                      \
-+                              XO1(i+2,2)              \
-+                                      XO1(i+3,3)      \
-+              ST(i,0)                                 \
-+                      ST(i+1,1)                       \
-+                              ST(i+2,2)               \
-+                                      ST(i+3,3)       \
-+
-+
-+              PF0(0)
-+                              PF0(2)
-+
-+      " .align 32                     ;\n"
-+        " 1:                            ;\n"
-+
-+              BLOCK(0)
-+              BLOCK(4)
-+              BLOCK(8)
-+              BLOCK(12)
-+
-+        "       addq %[inc], %[p1]           ;\n"
-+        "       addq %[inc], %[p2]           ;\n"
-+              "               decl %[cnt] ; jnz 1b"
-+      : [p1] "+r" (p1), [p2] "+r" (p2), [cnt] "+r" (lines)
-+      : [inc] "r" (256UL) 
-+        : "memory");
-+
-+      XMMS_RESTORE;
-+}
-+
-+static void
-+xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-+        unsigned long *p3)
-+{
-+      unsigned int lines = bytes >> 8;
-+      xmm_store_t xmm_save[4];
-+      unsigned long cr0;
-+
-+      XMMS_SAVE;
-+
-+        __asm__ __volatile__ (
-+#undef BLOCK
-+#define BLOCK(i) \
-+              PF1(i)                                  \
-+                              PF1(i+2)                \
-+              LD(i,0)                                 \
-+                      LD(i+1,1)                       \
-+                              LD(i+2,2)               \
-+                                      LD(i+3,3)       \
-+              PF2(i)                                  \
-+                              PF2(i+2)                \
-+              PF0(i+4)                                \
-+                              PF0(i+6)                \
-+              XO1(i,0)                                \
-+                      XO1(i+1,1)                      \
-+                              XO1(i+2,2)              \
-+                                      XO1(i+3,3)      \
-+              XO2(i,0)                                \
-+                      XO2(i+1,1)                      \
-+                              XO2(i+2,2)              \
-+                                      XO2(i+3,3)      \
-+              ST(i,0)                                 \
-+                      ST(i+1,1)                       \
-+                              ST(i+2,2)               \
-+                                      ST(i+3,3)       \
-+
-+
-+              PF0(0)
-+                              PF0(2)
-+
-+      " .align 32                     ;\n"
-+        " 1:                            ;\n"
-+
-+              BLOCK(0)
-+              BLOCK(4)
-+              BLOCK(8)
-+              BLOCK(12)
-+
-+        "       addq %[inc], %[p1]           ;\n"
-+        "       addq %[inc], %[p2]          ;\n"
-+        "       addq %[inc], %[p3]           ;\n"
-+              "               decl %[cnt] ; jnz 1b"
-+      : [cnt] "+r" (lines),
-+        [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3)
-+      : [inc] "r" (256UL)
-+      : "memory"); 
-+      XMMS_RESTORE;
-+}
-+
-+static void
-+xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-+        unsigned long *p3, unsigned long *p4)
-+{
-+      unsigned int lines = bytes >> 8;
-+      xmm_store_t xmm_save[4]; 
-+      unsigned long cr0;
-+
-+      XMMS_SAVE;
-+
-+        __asm__ __volatile__ (
-+#undef BLOCK
-+#define BLOCK(i) \
-+              PF1(i)                                  \
-+                              PF1(i+2)                \
-+              LD(i,0)                                 \
-+                      LD(i+1,1)                       \
-+                              LD(i+2,2)               \
-+                                      LD(i+3,3)       \
-+              PF2(i)                                  \
-+                              PF2(i+2)                \
-+              XO1(i,0)                                \
-+                      XO1(i+1,1)                      \
-+                              XO1(i+2,2)              \
-+                                      XO1(i+3,3)      \
-+              PF3(i)                                  \
-+                              PF3(i+2)                \
-+              PF0(i+4)                                \
-+                              PF0(i+6)                \
-+              XO2(i,0)                                \
-+                      XO2(i+1,1)                      \
-+                              XO2(i+2,2)              \
-+                                      XO2(i+3,3)      \
-+              XO3(i,0)                                \
-+                      XO3(i+1,1)                      \
-+                              XO3(i+2,2)              \
-+                                      XO3(i+3,3)      \
-+              ST(i,0)                                 \
-+                      ST(i+1,1)                       \
-+                              ST(i+2,2)               \
-+                                      ST(i+3,3)       \
-+
-+
-+              PF0(0)
-+                              PF0(2)
-+
-+      " .align 32                     ;\n"
-+        " 1:                            ;\n"
-+
-+              BLOCK(0)
-+              BLOCK(4)
-+              BLOCK(8)
-+              BLOCK(12)
-+
-+        "       addq %[inc], %[p1]           ;\n"
-+        "       addq %[inc], %[p2]           ;\n"
-+        "       addq %[inc], %[p3]           ;\n"
-+        "       addq %[inc], %[p4]           ;\n"
-+      "       decl %[cnt] ; jnz 1b"
-+      : [cnt] "+c" (lines),
-+        [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4)
-+      : [inc] "r" (256UL)
-+        : "memory" );
-+
-+      XMMS_RESTORE;
-+}
-+
-+static void
-+xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2,
-+        unsigned long *p3, unsigned long *p4, unsigned long *p5)
-+{
-+        unsigned int lines = bytes >> 8;
-+      xmm_store_t xmm_save[4];
-+      unsigned long cr0;
-+
-+      XMMS_SAVE;
-+
-+        __asm__ __volatile__ (
-+#undef BLOCK
-+#define BLOCK(i) \
-+              PF1(i)                                  \
-+                              PF1(i+2)                \
-+              LD(i,0)                                 \
-+                      LD(i+1,1)                       \
-+                              LD(i+2,2)               \
-+                                      LD(i+3,3)       \
-+              PF2(i)                                  \
-+                              PF2(i+2)                \
-+              XO1(i,0)                                \
-+                      XO1(i+1,1)                      \
-+                              XO1(i+2,2)              \
-+                                      XO1(i+3,3)      \
-+              PF3(i)                                  \
-+                              PF3(i+2)                \
-+              XO2(i,0)                                \
-+                      XO2(i+1,1)                      \
-+                              XO2(i+2,2)              \
-+                                      XO2(i+3,3)      \
-+              PF4(i)                                  \
-+                              PF4(i+2)                \
-+              PF0(i+4)                                \
-+                              PF0(i+6)                \
-+              XO3(i,0)                                \
-+                      XO3(i+1,1)                      \
-+                              XO3(i+2,2)              \
-+                                      XO3(i+3,3)      \
-+              XO4(i,0)                                \
-+                      XO4(i+1,1)                      \
-+                              XO4(i+2,2)              \
-+                                      XO4(i+3,3)      \
-+              ST(i,0)                                 \
-+                      ST(i+1,1)                       \
-+                              ST(i+2,2)               \
-+                                      ST(i+3,3)       \
-+
-+
-+              PF0(0)
-+                              PF0(2)
-+
-+      " .align 32                     ;\n"
-+        " 1:                            ;\n"
-+
-+              BLOCK(0)
-+              BLOCK(4)
-+              BLOCK(8)
-+              BLOCK(12)
-+
-+        "       addq %[inc], %[p1]           ;\n"
-+        "       addq %[inc], %[p2]           ;\n"
-+        "       addq %[inc], %[p3]           ;\n"
-+        "       addq %[inc], %[p4]           ;\n"
-+        "       addq %[inc], %[p5]           ;\n"
-+      "       decl %[cnt] ; jnz 1b"
-+      : [cnt] "+c" (lines),
-+        [p1] "+r" (p1), [p2] "+r" (p2), [p3] "+r" (p3), [p4] "+r" (p4), 
-+        [p5] "+r" (p5)
-+      : [inc] "r" (256UL)
-+      : "memory");
-+
-+      XMMS_RESTORE;
-+}
-+
-+static struct xor_block_template xor_block_sse = {
-+        .name = "generic_sse",
-+        .do_2 = xor_sse_2,
-+        .do_3 = xor_sse_3,
-+        .do_4 = xor_sse_4,
-+        .do_5 = xor_sse_5,
-+};
-+
-+#undef XOR_TRY_TEMPLATES
-+#define XOR_TRY_TEMPLATES                             \
-+      do {                                            \
-+              xor_speed(&xor_block_sse);      \
-+      } while (0)
-+
-+/* We force the use of the SSE xor block because it can write around L2.
-+   We may also be able to load into the L1 only depending on how the cpu
-+   deals with a load to a line that is being prefetched.  */
-+#define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse)
-Index: head-2008-11-25/include/asm-x86/mach-xen/mach_time.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/mach_time.h       2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,111 @@
-+/*
-+ *  include/asm-i386/mach-default/mach_time.h
-+ *
-+ *  Machine specific set RTC function for generic.
-+ *  Split out from time.c by Osamu Tomita <tomita@cinet.co.jp>
-+ */
-+#ifndef _MACH_TIME_H
-+#define _MACH_TIME_H
-+
-+#include <asm-i386/mc146818rtc.h>
-+
-+/* for check timing call set_rtc_mmss() 500ms     */
-+/* used in arch/i386/time.c::do_timer_interrupt() */
-+#define USEC_AFTER    500000
-+#define USEC_BEFORE   500000
-+
-+/*
-+ * In order to set the CMOS clock precisely, set_rtc_mmss has to be
-+ * called 500 ms after the second nowtime has started, because when
-+ * nowtime is written into the registers of the CMOS clock, it will
-+ * jump to the next second precisely 500 ms later. Check the Motorola
-+ * MC146818A or Dallas DS12887 data sheet for details.
-+ *
-+ * BUG: This routine does not handle hour overflow properly; it just
-+ *      sets the minutes. Usually you'll only notice that after reboot!
-+ */
-+static inline int mach_set_rtc_mmss(unsigned long nowtime)
-+{
-+      int retval = 0;
-+      int real_seconds, real_minutes, cmos_minutes;
-+      unsigned char save_control, save_freq_select;
-+
-+      save_control = CMOS_READ(RTC_CONTROL); /* tell the clock it's being set */
-+      CMOS_WRITE((save_control|RTC_SET), RTC_CONTROL);
-+
-+      save_freq_select = CMOS_READ(RTC_FREQ_SELECT); /* stop and reset prescaler */
-+      CMOS_WRITE((save_freq_select|RTC_DIV_RESET2), RTC_FREQ_SELECT);
-+
-+      cmos_minutes = CMOS_READ(RTC_MINUTES);
-+      if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD)
-+              BCD_TO_BIN(cmos_minutes);
-+
-+      /*
-+       * since we're only adjusting minutes and seconds,
-+       * don't interfere with hour overflow. This avoids
-+       * messing with unknown time zones but requires your
-+       * RTC not to be off by more than 15 minutes
-+       */
-+      real_seconds = nowtime % 60;
-+      real_minutes = nowtime / 60;
-+      if (((abs(real_minutes - cmos_minutes) + 15)/30) & 1)
-+              real_minutes += 30;             /* correct for half hour time zone */
-+      real_minutes %= 60;
-+
-+      if (abs(real_minutes - cmos_minutes) < 30) {
-+              if (!(save_control & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-+                      BIN_TO_BCD(real_seconds);
-+                      BIN_TO_BCD(real_minutes);
-+              }
-+              CMOS_WRITE(real_seconds,RTC_SECONDS);
-+              CMOS_WRITE(real_minutes,RTC_MINUTES);
-+      } else {
-+              printk(KERN_WARNING
-+                     "set_rtc_mmss: can't update from %d to %d\n",
-+                     cmos_minutes, real_minutes);
-+              retval = -1;
-+      }
-+
-+      /* The following flags have to be released exactly in this order,
-+       * otherwise the DS12887 (popular MC146818A clone with integrated
-+       * battery and quartz) will not reset the oscillator and will not
-+       * update precisely 500 ms later. You won't find this mentioned in
-+       * the Dallas Semiconductor data sheets, but who believes data
-+       * sheets anyway ...                           -- Markus Kuhn
-+       */
-+      CMOS_WRITE(save_control, RTC_CONTROL);
-+      CMOS_WRITE(save_freq_select, RTC_FREQ_SELECT);
-+
-+      return retval;
-+}
-+
-+static inline unsigned long mach_get_cmos_time(void)
-+{
-+      unsigned int year, mon, day, hour, min, sec;
-+
-+      do {
-+              sec = CMOS_READ(RTC_SECONDS);
-+              min = CMOS_READ(RTC_MINUTES);
-+              hour = CMOS_READ(RTC_HOURS);
-+              day = CMOS_READ(RTC_DAY_OF_MONTH);
-+              mon = CMOS_READ(RTC_MONTH);
-+              year = CMOS_READ(RTC_YEAR);
-+      } while (sec != CMOS_READ(RTC_SECONDS));
-+
-+      if (!(CMOS_READ(RTC_CONTROL) & RTC_DM_BINARY) || RTC_ALWAYS_BCD) {
-+              BCD_TO_BIN(sec);
-+              BCD_TO_BIN(min);
-+              BCD_TO_BIN(hour);
-+              BCD_TO_BIN(day);
-+              BCD_TO_BIN(mon);
-+              BCD_TO_BIN(year);
-+      }
-+
-+      year += 1900;
-+      if (year < 1970)
-+              year += 100;
-+
-+      return mktime(year, mon, day, hour, min, sec);
-+}
-+
-+#endif /* !_MACH_TIME_H */
-Index: head-2008-11-25/include/asm-x86/mach-xen/setup_arch_post.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/setup_arch_post.h 2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,63 @@
-+/**
-+ * machine_specific_* - Hooks for machine specific setup.
-+ *
-+ * Description:
-+ *    This is included late in kernel/setup.c so that it can make
-+ *    use of all of the static functions.
-+ **/
-+
-+#include <xen/interface/callback.h>
-+
-+extern void hypervisor_callback(void);
-+extern void failsafe_callback(void);
-+extern void nmi(void);
-+
-+static void __init machine_specific_arch_setup(void)
-+{
-+      int ret;
-+      static struct callback_register __initdata event = {
-+              .type = CALLBACKTYPE_event,
-+              .address = (unsigned long) hypervisor_callback,
-+      };
-+      static struct callback_register __initdata failsafe = {
-+              .type = CALLBACKTYPE_failsafe,
-+              .address = (unsigned long)failsafe_callback,
-+      };
-+      static struct callback_register __initdata syscall = {
-+              .type = CALLBACKTYPE_syscall,
-+              .address = (unsigned long)system_call,
-+      };
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      static struct callback_register __initdata nmi_cb = {
-+              .type = CALLBACKTYPE_nmi,
-+              .address = (unsigned long)nmi,
-+      };
-+#endif
-+
-+      ret = HYPERVISOR_callback_op(CALLBACKOP_register, &event);
-+      if (ret == 0)
-+              ret = HYPERVISOR_callback_op(CALLBACKOP_register, &failsafe);
-+      if (ret == 0)
-+              ret = HYPERVISOR_callback_op(CALLBACKOP_register, &syscall);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (ret == -ENOSYS)
-+              ret = HYPERVISOR_set_callbacks(
-+                      event.address,
-+                      failsafe.address,
-+                      syscall.address);
-+#endif
-+      BUG_ON(ret);
-+
-+#ifdef CONFIG_X86_LOCAL_APIC
-+      ret = HYPERVISOR_callback_op(CALLBACKOP_register, &nmi_cb);
-+#if CONFIG_XEN_COMPAT <= 0x030002
-+      if (ret == -ENOSYS) {
-+              static struct xennmi_callback __initdata cb = {
-+                      .handler_address = (unsigned long)nmi
-+              };
-+
-+              HYPERVISOR_nmi_op(XENNMI_register_callback, &cb);
-+      }
-+#endif
-+#endif
-+}
-Index: head-2008-11-25/include/asm-x86/mach-xen/setup_arch_pre.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/asm-x86/mach-xen/setup_arch_pre.h  2007-06-12 13:14:13.000000000 +0200
-@@ -0,0 +1,5 @@
-+/* Hook to call BIOS initialisation function */
-+
-+#define ARCH_SETUP machine_specific_arch_setup();
-+
-+static void __init machine_specific_arch_setup(void);
-Index: head-2008-11-25/include/xen/blkif.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/blkif.h        2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,123 @@
-+/* 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this software and associated documentation files (the "Software"), to
-+ * deal in the Software without restriction, including without limitation the
-+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
-+ * sell copies of the Software, and to permit persons to whom the Software is
-+ * furnished to do so, subject to the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-+ * DEALINGS IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_BLKIF_H__
-+#define __XEN_BLKIF_H__
-+
-+#include <xen/interface/io/ring.h>
-+#include <xen/interface/io/blkif.h>
-+#include <xen/interface/io/protocols.h>
-+
-+/* Not a real protocol.  Used to generate ring structs which contain
-+ * the elements common to all protocols only.  This way we get a
-+ * compiler-checkable way to use common struct elements, so we can
-+ * avoid using switch(protocol) in a number of places.  */
-+struct blkif_common_request {
-+      char dummy;
-+};
-+struct blkif_common_response {
-+      char dummy;
-+};
-+
-+/* i386 protocol version */
-+#pragma pack(push, 4)
-+struct blkif_x86_32_request {
-+      uint8_t        operation;    /* BLKIF_OP_???                         */
-+      uint8_t        nr_segments;  /* number of segments                   */
-+      blkif_vdev_t   handle;       /* only for read/write requests         */
-+      uint64_t       id;           /* private guest value, echoed in resp  */
-+      blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-+      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+};
-+struct blkif_x86_32_response {
-+      uint64_t        id;              /* copied from request */
-+      uint8_t         operation;       /* copied from request */
-+      int16_t         status;          /* BLKIF_RSP_???       */
-+};
-+typedef struct blkif_x86_32_request blkif_x86_32_request_t;
-+typedef struct blkif_x86_32_response blkif_x86_32_response_t;
-+#pragma pack(pop)
-+
-+/* x86_64 protocol version */
-+struct blkif_x86_64_request {
-+      uint8_t        operation;    /* BLKIF_OP_???                         */
-+      uint8_t        nr_segments;  /* number of segments                   */
-+      blkif_vdev_t   handle;       /* only for read/write requests         */
-+      uint64_t       __attribute__((__aligned__(8))) id;
-+      blkif_sector_t sector_number;/* start sector idx on disk (r/w only)  */
-+      struct blkif_request_segment seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+};
-+struct blkif_x86_64_response {
-+      uint64_t       __attribute__((__aligned__(8))) id;
-+      uint8_t         operation;       /* copied from request */
-+      int16_t         status;          /* BLKIF_RSP_???       */
-+};
-+typedef struct blkif_x86_64_request blkif_x86_64_request_t;
-+typedef struct blkif_x86_64_response blkif_x86_64_response_t;
-+
-+DEFINE_RING_TYPES(blkif_common, struct blkif_common_request, struct blkif_common_response);
-+DEFINE_RING_TYPES(blkif_x86_32, struct blkif_x86_32_request, struct blkif_x86_32_response);
-+DEFINE_RING_TYPES(blkif_x86_64, struct blkif_x86_64_request, struct blkif_x86_64_response);
-+
-+union blkif_back_rings {
-+      blkif_back_ring_t        native;
-+      blkif_common_back_ring_t common;
-+      blkif_x86_32_back_ring_t x86_32;
-+      blkif_x86_64_back_ring_t x86_64;
-+};
-+typedef union blkif_back_rings blkif_back_rings_t;
-+
-+enum blkif_protocol {
-+      BLKIF_PROTOCOL_NATIVE = 1,
-+      BLKIF_PROTOCOL_X86_32 = 2,
-+      BLKIF_PROTOCOL_X86_64 = 3,
-+};
-+
-+static void inline blkif_get_x86_32_req(blkif_request_t *dst, blkif_x86_32_request_t *src)
-+{
-+      int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
-+      dst->operation = src->operation;
-+      dst->nr_segments = src->nr_segments;
-+      dst->handle = src->handle;
-+      dst->id = src->id;
-+      dst->sector_number = src->sector_number;
-+      barrier();
-+      if (n > dst->nr_segments)
-+              n = dst->nr_segments;
-+      for (i = 0; i < n; i++)
-+              dst->seg[i] = src->seg[i];
-+}
-+
-+static void inline blkif_get_x86_64_req(blkif_request_t *dst, blkif_x86_64_request_t *src)
-+{
-+      int i, n = BLKIF_MAX_SEGMENTS_PER_REQUEST;
-+      dst->operation = src->operation;
-+      dst->nr_segments = src->nr_segments;
-+      dst->handle = src->handle;
-+      dst->id = src->id;
-+      dst->sector_number = src->sector_number;
-+      barrier();
-+      if (n > dst->nr_segments)
-+              n = dst->nr_segments;
-+      for (i = 0; i < n; i++)
-+              dst->seg[i] = src->seg[i];
-+}
-+
-+#endif /* __XEN_BLKIF_H__ */
-Index: head-2008-11-25/include/xen/compat_ioctl.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/compat_ioctl.h 2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1,45 @@
-+/*
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License as
-+ * published by the Free Software Foundation; either version 2 of the
-+ * License, or (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
-+ *
-+ * Copyright IBM Corp. 2007
-+ *
-+ * Authors: Jimi Xenidis <jimix@watson.ibm.com>
-+ *          Hollis Blanchard <hollisb@us.ibm.com>
-+ */
-+
-+#ifndef __LINUX_XEN_COMPAT_H__ 
-+#define __LINUX_XEN_COMPAT_H__ 
-+
-+#include <linux/compat.h>
-+
-+extern int privcmd_ioctl_32(int fd, unsigned int cmd, unsigned long arg);
-+struct privcmd_mmap_32 {
-+      int num;
-+      domid_t dom;
-+      compat_uptr_t entry;
-+};
-+
-+struct privcmd_mmapbatch_32 {
-+      int num;     /* number of pages to populate */
-+      domid_t dom; /* target domain */
-+      __u64 addr;  /* virtual address */
-+      compat_uptr_t arr; /* array of mfns - top nibble set on err */
-+};
-+#define IOCTL_PRIVCMD_MMAP_32                   \
-+      _IOC(_IOC_NONE, 'P', 2, sizeof(struct privcmd_mmap_32))
-+#define IOCTL_PRIVCMD_MMAPBATCH_32                  \
-+      _IOC(_IOC_NONE, 'P', 3, sizeof(struct privcmd_mmapbatch_32))
-+
-+#endif /* __LINUX_XEN_COMPAT_H__ */
-Index: head-2008-11-25/include/xen/cpu_hotplug.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/cpu_hotplug.h  2007-08-16 18:07:01.000000000 +0200
-@@ -0,0 +1,41 @@
-+#ifndef __XEN_CPU_HOTPLUG_H__
-+#define __XEN_CPU_HOTPLUG_H__
-+
-+#include <linux/kernel.h>
-+#include <linux/cpumask.h>
-+
-+#if defined(CONFIG_X86) && defined(CONFIG_SMP)
-+extern cpumask_t cpu_initialized_map;
-+#endif
-+
-+#if defined(CONFIG_HOTPLUG_CPU)
-+
-+int cpu_up_check(unsigned int cpu);
-+void init_xenbus_allowed_cpumask(void);
-+int smp_suspend(void);
-+void smp_resume(void);
-+
-+void cpu_bringup(void);
-+
-+#else /* !defined(CONFIG_HOTPLUG_CPU) */
-+
-+#define cpu_up_check(cpu)             (0)
-+#define init_xenbus_allowed_cpumask() ((void)0)
-+
-+static inline int smp_suspend(void)
-+{
-+      if (num_online_cpus() > 1) {
-+              printk(KERN_WARNING "Can't suspend SMP guests "
-+                     "without CONFIG_HOTPLUG_CPU\n");
-+              return -EOPNOTSUPP;
-+      }
-+      return 0;
-+}
-+
-+static inline void smp_resume(void)
-+{
-+}
-+
-+#endif /* !defined(CONFIG_HOTPLUG_CPU) */
-+
-+#endif /* __XEN_CPU_HOTPLUG_H__ */
-Index: head-2008-11-25/include/xen/driver_util.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/driver_util.h  2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,14 @@
-+
-+#ifndef __ASM_XEN_DRIVER_UTIL_H__
-+#define __ASM_XEN_DRIVER_UTIL_H__
-+
-+#include <linux/vmalloc.h>
-+#include <linux/device.h>
-+
-+/* Allocate/destroy a 'vmalloc' VM area. */
-+extern struct vm_struct *alloc_vm_area(unsigned long size);
-+extern void free_vm_area(struct vm_struct *area);
-+
-+extern struct class *get_xen_class(void);
-+
-+#endif /* __ASM_XEN_DRIVER_UTIL_H__ */
-Index: head-2008-11-25/include/xen/evtchn.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/evtchn.h       2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,160 @@
-+/******************************************************************************
-+ * evtchn.h
-+ * 
-+ * Communication via Xen event channels.
-+ * Also definitions for the device that demuxes notifications to userspace.
-+ * 
-+ * Copyright (c) 2004-2005, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __ASM_EVTCHN_H__
-+#define __ASM_EVTCHN_H__
-+
-+#include <linux/interrupt.h>
-+#include <asm/hypervisor.h>
-+#include <asm/ptrace.h>
-+#include <asm/synch_bitops.h>
-+#include <xen/interface/event_channel.h>
-+#include <linux/smp.h>
-+
-+/*
-+ * LOW-LEVEL DEFINITIONS
-+ */
-+
-+/*
-+ * Dynamically bind an event source to an IRQ-like callback handler.
-+ * On some platforms this may not be implemented via the Linux IRQ subsystem.
-+ * The IRQ argument passed to the callback handler is the same as returned
-+ * from the bind call. It may not correspond to a Linux IRQ number.
-+ * Returns IRQ or negative errno.
-+ */
-+int bind_caller_port_to_irqhandler(
-+      unsigned int caller_port,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id);
-+int bind_listening_port_to_irqhandler(
-+      unsigned int remote_domain,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id);
-+int bind_interdomain_evtchn_to_irqhandler(
-+      unsigned int remote_domain,
-+      unsigned int remote_port,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id);
-+int bind_virq_to_irqhandler(
-+      unsigned int virq,
-+      unsigned int cpu,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id);
-+int bind_ipi_to_irqhandler(
-+      unsigned int ipi,
-+      unsigned int cpu,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id);
-+
-+/*
-+ * Common unbind function for all event sources. Takes IRQ to unbind from.
-+ * Automatically closes the underlying event channel (except for bindings
-+ * made with bind_caller_port_to_irqhandler()).
-+ */
-+void unbind_from_irqhandler(unsigned int irq, void *dev_id);
-+
-+void irq_resume(void);
-+
-+/* Entry point for notifications into Linux subsystems. */
-+asmlinkage void evtchn_do_upcall(struct pt_regs *regs);
-+
-+/* Entry point for notifications into the userland character device. */
-+void evtchn_device_upcall(int port);
-+
-+/* Mark a PIRQ as unavailable for dynamic allocation. */
-+void evtchn_register_pirq(int irq);
-+/* Map a Xen-supplied PIRQ to a dynamically allocated one. */
-+int evtchn_map_pirq(int irq, int xen_pirq);
-+/* Look up a Xen-supplied PIRQ for a dynamically allocated one. */
-+int evtchn_get_xen_pirq(int irq);
-+
-+void mask_evtchn(int port);
-+void disable_all_local_evtchn(void);
-+void unmask_evtchn(int port);
-+
-+#ifdef CONFIG_SMP
-+void rebind_evtchn_to_cpu(int port, unsigned int cpu);
-+#else
-+#define rebind_evtchn_to_cpu(port, cpu)       ((void)0)
-+#endif
-+
-+static inline int test_and_set_evtchn_mask(int port)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      return synch_test_and_set_bit(port, s->evtchn_mask);
-+}
-+
-+static inline void clear_evtchn(int port)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      synch_clear_bit(port, s->evtchn_pending);
-+}
-+
-+static inline void notify_remote_via_evtchn(int port)
-+{
-+      struct evtchn_send send = { .port = port };
-+      VOID(HYPERVISOR_event_channel_op(EVTCHNOP_send, &send));
-+}
-+
-+/*
-+ * Use these to access the event channel underlying the IRQ handle returned
-+ * by bind_*_to_irqhandler().
-+ */
-+void notify_remote_via_irq(int irq);
-+int irq_to_evtchn_port(int irq);
-+
-+#define PIRQ_SET_MAPPING 0x0
-+#define PIRQ_CLEAR_MAPPING 0x1
-+#define PIRQ_GET_MAPPING 0x3
-+int pirq_mapstatus(int pirq, int action);
-+int set_pirq_hw_action(int pirq, int (*action)(int pirq, int action));
-+int clear_pirq_hw_action(int pirq);
-+
-+#define PIRQ_STARTUP 1
-+#define PIRQ_SHUTDOWN 2
-+#define PIRQ_ENABLE 3
-+#define PIRQ_DISABLE 4
-+#define PIRQ_END 5
-+#define PIRQ_ACK 6
-+
-+#endif /* __ASM_EVTCHN_H__ */
-Index: head-2008-11-25/include/xen/firmware.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/firmware.h     2007-07-02 08:16:19.000000000 +0200
-@@ -0,0 +1,10 @@
-+#ifndef __XEN_FIRMWARE_H__
-+#define __XEN_FIRMWARE_H__
-+
-+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-+void copy_edd(void);
-+#endif
-+
-+void copy_edid(void);
-+
-+#endif /* __XEN_FIRMWARE_H__ */
-Index: head-2008-11-25/include/xen/gnttab.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/gnttab.h       2008-11-04 11:13:10.000000000 +0100
-@@ -0,0 +1,164 @@
-+/******************************************************************************
-+ * gnttab.h
-+ * 
-+ * Two sets of functionality:
-+ * 1. Granting foreign access to our memory reservation.
-+ * 2. Accessing others' memory reservations via grant references.
-+ * (i.e., mechanisms for both sender and recipient of grant references)
-+ * 
-+ * Copyright (c) 2004-2005, K A Fraser
-+ * Copyright (c) 2005, Christopher Clark
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __ASM_GNTTAB_H__
-+#define __ASM_GNTTAB_H__
-+
-+#include <asm/hypervisor.h>
-+#include <asm/maddr.h> /* maddr_t */
-+#include <linux/mm.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/features.h>
-+
-+struct gnttab_free_callback {
-+      struct gnttab_free_callback *next;
-+      void (*fn)(void *);
-+      void *arg;
-+      u16 count;
-+      u8 queued;
-+};
-+
-+int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
-+                              int flags);
-+
-+/*
-+ * End access through the given grant reference, iff the grant entry is no
-+ * longer in use.  Return 1 if the grant entry was freed, 0 if it is still in
-+ * use.
-+ */
-+int gnttab_end_foreign_access_ref(grant_ref_t ref);
-+
-+/*
-+ * Eventually end access through the given grant reference, and once that
-+ * access has been ended, free the given page too.  Access will be ended
-+ * immediately iff the grant entry is not in use, otherwise it will happen
-+ * some time later.  page may be 0, in which case no freeing will occur.
-+ */
-+void gnttab_end_foreign_access(grant_ref_t ref, unsigned long page);
-+
-+int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn);
-+
-+unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref);
-+unsigned long gnttab_end_foreign_transfer(grant_ref_t ref);
-+
-+int gnttab_query_foreign_access(grant_ref_t ref);
-+
-+/*
-+ * operations on reserved batches of grant references
-+ */
-+int gnttab_alloc_grant_references(u16 count, grant_ref_t *pprivate_head);
-+
-+void gnttab_free_grant_reference(grant_ref_t ref);
-+
-+void gnttab_free_grant_references(grant_ref_t head);
-+
-+int gnttab_empty_grant_references(const grant_ref_t *pprivate_head);
-+
-+int gnttab_claim_grant_reference(grant_ref_t *pprivate_head);
-+
-+void gnttab_release_grant_reference(grant_ref_t *private_head,
-+                                  grant_ref_t release);
-+
-+void gnttab_request_free_callback(struct gnttab_free_callback *callback,
-+                                void (*fn)(void *), void *arg, u16 count);
-+void gnttab_cancel_free_callback(struct gnttab_free_callback *callback);
-+
-+void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
-+                                   unsigned long frame, int flags);
-+
-+void gnttab_grant_foreign_transfer_ref(grant_ref_t, domid_t domid,
-+                                     unsigned long pfn);
-+
-+int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep);
-+void __gnttab_dma_map_page(struct page *page);
-+static inline void __gnttab_dma_unmap_page(struct page *page)
-+{
-+}
-+
-+void gnttab_reset_grant_page(struct page *page);
-+
-+int gnttab_suspend(void);
-+int gnttab_resume(void);
-+
-+void *arch_gnttab_alloc_shared(unsigned long *frames);
-+
-+static inline void
-+gnttab_set_map_op(struct gnttab_map_grant_ref *map, maddr_t addr,
-+                uint32_t flags, grant_ref_t ref, domid_t domid)
-+{
-+      if (flags & GNTMAP_contains_pte)
-+              map->host_addr = addr;
-+      else if (xen_feature(XENFEAT_auto_translated_physmap))
-+              map->host_addr = __pa(addr);
-+      else
-+              map->host_addr = addr;
-+
-+      map->flags = flags;
-+      map->ref = ref;
-+      map->dom = domid;
-+}
-+
-+static inline void
-+gnttab_set_unmap_op(struct gnttab_unmap_grant_ref *unmap, maddr_t addr,
-+                  uint32_t flags, grant_handle_t handle)
-+{
-+      if (flags & GNTMAP_contains_pte)
-+              unmap->host_addr = addr;
-+      else if (xen_feature(XENFEAT_auto_translated_physmap))
-+              unmap->host_addr = __pa(addr);
-+      else
-+              unmap->host_addr = addr;
-+
-+      unmap->handle = handle;
-+      unmap->dev_bus_addr = 0;
-+}
-+
-+static inline void
-+gnttab_set_replace_op(struct gnttab_unmap_and_replace *unmap, maddr_t addr,
-+                    maddr_t new_addr, grant_handle_t handle)
-+{
-+      if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+              unmap->host_addr = __pa(addr);
-+              unmap->new_addr = __pa(new_addr);
-+      } else {
-+              unmap->host_addr = addr;
-+              unmap->new_addr = new_addr;
-+      }
-+
-+      unmap->handle = handle;
-+}
-+
-+#endif /* __ASM_GNTTAB_H__ */
-Index: head-2008-11-25/include/xen/hvm.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/hvm.h  2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,23 @@
-+/* Simple wrappers around HVM functions */
-+#ifndef XEN_HVM_H__
-+#define XEN_HVM_H__
-+
-+#include <xen/interface/hvm/params.h>
-+
-+static inline unsigned long hvm_get_parameter(int idx)
-+{
-+      struct xen_hvm_param xhv;
-+      int r;
-+
-+      xhv.domid = DOMID_SELF;
-+      xhv.index = idx;
-+      r = HYPERVISOR_hvm_op(HVMOP_get_param, &xhv);
-+      if (r < 0) {
-+              printk(KERN_ERR "cannot get hvm parameter %d: %d.\n",
-+                     idx, r);
-+              return 0;
-+      }
-+      return xhv.value;
-+}
-+
-+#endif /* XEN_HVM_H__ */
-Index: head-2008-11-25/include/xen/hypercall.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/hypercall.h    2008-01-28 12:24:19.000000000 +0100
-@@ -0,0 +1,30 @@
-+#ifndef __XEN_HYPERCALL_H__
-+#define __XEN_HYPERCALL_H__
-+
-+#include <asm/hypercall.h>
-+
-+static inline int __must_check
-+HYPERVISOR_multicall_check(
-+      multicall_entry_t *call_list, unsigned int nr_calls,
-+      const unsigned long *rc_list)
-+{
-+      int rc = HYPERVISOR_multicall(call_list, nr_calls);
-+
-+      if (unlikely(rc < 0))
-+              return rc;
-+      BUG_ON(rc);
-+      BUG_ON((int)nr_calls < 0);
-+
-+      for ( ; nr_calls > 0; --nr_calls, ++call_list)
-+              if (unlikely(call_list->result != (rc_list ? *rc_list++ : 0)))
-+                      return nr_calls;
-+
-+      return 0;
-+}
-+
-+/* A construct to ignore the return value of hypercall wrappers in a few
-+ * exceptional cases (simply casting the function result to void doesn't
-+ * avoid the compiler warning): */
-+#define VOID(expr) ((void)((expr)?:0))
-+
-+#endif /* __XEN_HYPERCALL_H__ */
-Index: head-2008-11-25/include/xen/hypervisor_sysfs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/hypervisor_sysfs.h     2007-06-22 09:08:06.000000000 +0200
-@@ -0,0 +1,30 @@
-+/*
-+ *  copyright (c) 2006 IBM Corporation
-+ *  Authored by: Mike D. Day <ncmike@us.ibm.com>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License version 2 as
-+ *  published by the Free Software Foundation.
-+ */
-+
-+#ifndef _HYP_SYSFS_H_
-+#define _HYP_SYSFS_H_
-+
-+#include <linux/kobject.h>
-+#include <linux/sysfs.h>
-+
-+#define HYPERVISOR_ATTR_RO(_name) \
-+static struct hyp_sysfs_attr  _name##_attr = __ATTR_RO(_name)
-+
-+#define HYPERVISOR_ATTR_RW(_name) \
-+static struct hyp_sysfs_attr _name##_attr = \
-+      __ATTR(_name, 0644, _name##_show, _name##_store)
-+
-+struct hyp_sysfs_attr {
-+      struct attribute attr;
-+      ssize_t (*show)(struct hyp_sysfs_attr *, char *);
-+      ssize_t (*store)(struct hyp_sysfs_attr *, const char *, size_t);
-+      void *hyp_attr_data;
-+};
-+
-+#endif /* _HYP_SYSFS_H_ */
-Index: head-2008-11-25/include/xen/pcifront.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/pcifront.h     2007-06-18 08:38:13.000000000 +0200
-@@ -0,0 +1,83 @@
-+/*
-+ * PCI Frontend - arch-dependendent declarations
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#ifndef __XEN_ASM_PCIFRONT_H__
-+#define __XEN_ASM_PCIFRONT_H__
-+
-+#include <linux/spinlock.h>
-+
-+#ifdef __KERNEL__
-+
-+#ifndef __ia64__
-+
-+struct pcifront_device;
-+struct pci_bus;
-+
-+struct pcifront_sd {
-+      int domain;
-+      struct pcifront_device *pdev;
-+};
-+
-+static inline struct pcifront_device *
-+pcifront_get_pdev(struct pcifront_sd *sd)
-+{
-+      return sd->pdev;
-+}
-+
-+static inline void pcifront_init_sd(struct pcifront_sd *sd,
-+                                  unsigned int domain, unsigned int bus,
-+                                  struct pcifront_device *pdev)
-+{
-+      sd->domain = domain;
-+      sd->pdev = pdev;
-+}
-+
-+#if defined(CONFIG_PCI_DOMAINS)
-+static inline int pci_domain_nr(struct pci_bus *bus)
-+{
-+      struct pcifront_sd *sd = bus->sysdata;
-+      return sd->domain;
-+}
-+static inline int pci_proc_domain(struct pci_bus *bus)
-+{
-+      return pci_domain_nr(bus);
-+}
-+#endif /* CONFIG_PCI_DOMAINS */
-+
-+static inline void pcifront_setup_root_resources(struct pci_bus *bus,
-+                                               struct pcifront_sd *sd)
-+{
-+}
-+
-+#else /* __ia64__ */
-+
-+#include <linux/acpi.h>
-+#include <asm/pci.h>
-+#define pcifront_sd pci_controller
-+
-+extern void xen_add_resource(struct pci_controller *, unsigned int,
-+                           unsigned int, struct acpi_resource *);
-+extern void xen_pcibios_setup_root_windows(struct pci_bus *,
-+                                         struct pci_controller *);
-+
-+static inline struct pcifront_device *
-+pcifront_get_pdev(struct pcifront_sd *sd)
-+{
-+      return (struct pcifront_device *)sd->platform_data;
-+}
-+
-+static inline void pcifront_setup_root_resources(struct pci_bus *bus,
-+                                               struct pcifront_sd *sd)
-+{
-+      xen_pcibios_setup_root_windows(bus, sd);
-+}
-+
-+#endif /* __ia64__ */
-+
-+extern struct rw_semaphore pci_bus_sem;
-+
-+#endif /* __KERNEL__ */
-+
-+#endif /* __XEN_ASM_PCIFRONT_H__ */
-Index: head-2008-11-25/include/xen/public/evtchn.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/public/evtchn.h        2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,88 @@
-+/******************************************************************************
-+ * evtchn.h
-+ * 
-+ * Interface to /dev/xen/evtchn.
-+ * 
-+ * Copyright (c) 2003-2005, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __LINUX_PUBLIC_EVTCHN_H__
-+#define __LINUX_PUBLIC_EVTCHN_H__
-+
-+/*
-+ * Bind a fresh port to VIRQ @virq.
-+ * Return allocated port.
-+ */
-+#define IOCTL_EVTCHN_BIND_VIRQ                                \
-+      _IOC(_IOC_NONE, 'E', 0, sizeof(struct ioctl_evtchn_bind_virq))
-+struct ioctl_evtchn_bind_virq {
-+      unsigned int virq;
-+};
-+
-+/*
-+ * Bind a fresh port to remote <@remote_domain, @remote_port>.
-+ * Return allocated port.
-+ */
-+#define IOCTL_EVTCHN_BIND_INTERDOMAIN                 \
-+      _IOC(_IOC_NONE, 'E', 1, sizeof(struct ioctl_evtchn_bind_interdomain))
-+struct ioctl_evtchn_bind_interdomain {
-+      unsigned int remote_domain, remote_port;
-+};
-+
-+/*
-+ * Allocate a fresh port for binding to @remote_domain.
-+ * Return allocated port.
-+ */
-+#define IOCTL_EVTCHN_BIND_UNBOUND_PORT                        \
-+      _IOC(_IOC_NONE, 'E', 2, sizeof(struct ioctl_evtchn_bind_unbound_port))
-+struct ioctl_evtchn_bind_unbound_port {
-+      unsigned int remote_domain;
-+};
-+
-+/*
-+ * Unbind previously allocated @port.
-+ */
-+#define IOCTL_EVTCHN_UNBIND                           \
-+      _IOC(_IOC_NONE, 'E', 3, sizeof(struct ioctl_evtchn_unbind))
-+struct ioctl_evtchn_unbind {
-+      unsigned int port;
-+};
-+
-+/*
-+ * Unbind previously allocated @port.
-+ */
-+#define IOCTL_EVTCHN_NOTIFY                           \
-+      _IOC(_IOC_NONE, 'E', 4, sizeof(struct ioctl_evtchn_notify))
-+struct ioctl_evtchn_notify {
-+      unsigned int port;
-+};
-+
-+/* Clear and reinitialise the event buffer. Clear error condition. */
-+#define IOCTL_EVTCHN_RESET                            \
-+      _IOC(_IOC_NONE, 'E', 5, 0)
-+
-+#endif /* __LINUX_PUBLIC_EVTCHN_H__ */
-Index: head-2008-11-25/include/xen/public/gntdev.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/public/gntdev.h        2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,119 @@
-+/******************************************************************************
-+ * gntdev.h
-+ * 
-+ * Interface to /dev/xen/gntdev.
-+ * 
-+ * Copyright (c) 2007, D G Murray
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __LINUX_PUBLIC_GNTDEV_H__
-+#define __LINUX_PUBLIC_GNTDEV_H__
-+
-+struct ioctl_gntdev_grant_ref {
-+      /* The domain ID of the grant to be mapped. */
-+      uint32_t domid;
-+      /* The grant reference of the grant to be mapped. */
-+      uint32_t ref;
-+};
-+
-+/*
-+ * Inserts the grant references into the mapping table of an instance
-+ * of gntdev. N.B. This does not perform the mapping, which is deferred
-+ * until mmap() is called with @index as the offset.
-+ */
-+#define IOCTL_GNTDEV_MAP_GRANT_REF \
-+_IOC(_IOC_NONE, 'G', 0, sizeof(struct ioctl_gntdev_map_grant_ref))
-+struct ioctl_gntdev_map_grant_ref {
-+      /* IN parameters */
-+      /* The number of grants to be mapped. */
-+      uint32_t count;
-+      uint32_t pad;
-+      /* OUT parameters */
-+      /* The offset to be used on a subsequent call to mmap(). */
-+      uint64_t index;
-+      /* Variable IN parameter. */
-+      /* Array of grant references, of size @count. */
-+      struct ioctl_gntdev_grant_ref refs[1];
-+};
-+
-+/*
-+ * Removes the grant references from the mapping table of an instance of
-+ * of gntdev. N.B. munmap() must be called on the relevant virtual address(es)
-+ * before this ioctl is called, or an error will result.
-+ */
-+#define IOCTL_GNTDEV_UNMAP_GRANT_REF \
-+_IOC(_IOC_NONE, 'G', 1, sizeof(struct ioctl_gntdev_unmap_grant_ref))       
-+struct ioctl_gntdev_unmap_grant_ref {
-+      /* IN parameters */
-+      /* The offset was returned by the corresponding map operation. */
-+      uint64_t index;
-+      /* The number of pages to be unmapped. */
-+      uint32_t count;
-+      uint32_t pad;
-+};
-+
-+/*
-+ * Returns the offset in the driver's address space that corresponds
-+ * to @vaddr. This can be used to perform a munmap(), followed by an
-+ * UNMAP_GRANT_REF ioctl, where no state about the offset is retained by
-+ * the caller. The number of pages that were allocated at the same time as
-+ * @vaddr is returned in @count.
-+ *
-+ * N.B. Where more than one page has been mapped into a contiguous range, the
-+ *      supplied @vaddr must correspond to the start of the range; otherwise
-+ *      an error will result. It is only possible to munmap() the entire
-+ *      contiguously-allocated range at once, and not any subrange thereof.
-+ */
-+#define IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR \
-+_IOC(_IOC_NONE, 'G', 2, sizeof(struct ioctl_gntdev_get_offset_for_vaddr))
-+struct ioctl_gntdev_get_offset_for_vaddr {
-+      /* IN parameters */
-+      /* The virtual address of the first mapped page in a range. */
-+      uint64_t vaddr;
-+      /* OUT parameters */
-+      /* The offset that was used in the initial mmap() operation. */
-+      uint64_t offset;
-+      /* The number of pages mapped in the VM area that begins at @vaddr. */
-+      uint32_t count;
-+      uint32_t pad;
-+};
-+
-+/*
-+ * Sets the maximum number of grants that may mapped at once by this gntdev
-+ * instance.
-+ *
-+ * N.B. This must be called before any other ioctl is performed on the device.
-+ */
-+#define IOCTL_GNTDEV_SET_MAX_GRANTS \
-+_IOC(_IOC_NONE, 'G', 3, sizeof(struct ioctl_gntdev_set_max_grants))
-+struct ioctl_gntdev_set_max_grants {
-+      /* IN parameter */
-+      /* The maximum number of grants that may be mapped at once. */
-+      uint32_t count;
-+};
-+
-+#endif /* __LINUX_PUBLIC_GNTDEV_H__ */
-Index: head-2008-11-25/include/xen/public/privcmd.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/public/privcmd.h       2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,79 @@
-+/******************************************************************************
-+ * privcmd.h
-+ * 
-+ * Interface to /proc/xen/privcmd.
-+ * 
-+ * Copyright (c) 2003-2005, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __LINUX_PUBLIC_PRIVCMD_H__
-+#define __LINUX_PUBLIC_PRIVCMD_H__
-+
-+#include <linux/types.h>
-+
-+#ifndef __user
-+#define __user
-+#endif
-+
-+typedef struct privcmd_hypercall
-+{
-+      __u64 op;
-+      __u64 arg[5];
-+} privcmd_hypercall_t;
-+
-+typedef struct privcmd_mmap_entry {
-+      __u64 va;
-+      __u64 mfn;
-+      __u64 npages;
-+} privcmd_mmap_entry_t; 
-+
-+typedef struct privcmd_mmap {
-+      int num;
-+      domid_t dom; /* target domain */
-+      privcmd_mmap_entry_t __user *entry;
-+} privcmd_mmap_t; 
-+
-+typedef struct privcmd_mmapbatch {
-+      int num;     /* number of pages to populate */
-+      domid_t dom; /* target domain */
-+      __u64 addr;  /* virtual address */
-+      xen_pfn_t __user *arr; /* array of mfns - top nibble set on err */
-+} privcmd_mmapbatch_t; 
-+
-+/*
-+ * @cmd: IOCTL_PRIVCMD_HYPERCALL
-+ * @arg: &privcmd_hypercall_t
-+ * Return: Value returned from execution of the specified hypercall.
-+ */
-+#define IOCTL_PRIVCMD_HYPERCALL                                       \
-+      _IOC(_IOC_NONE, 'P', 0, sizeof(privcmd_hypercall_t))
-+#define IOCTL_PRIVCMD_MMAP                                    \
-+      _IOC(_IOC_NONE, 'P', 2, sizeof(privcmd_mmap_t))
-+#define IOCTL_PRIVCMD_MMAPBATCH                                       \
-+      _IOC(_IOC_NONE, 'P', 3, sizeof(privcmd_mmapbatch_t))
-+
-+#endif /* __LINUX_PUBLIC_PRIVCMD_H__ */
-Index: head-2008-11-25/include/xen/xen_proc.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/xen_proc.h     2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,12 @@
-+
-+#ifndef __ASM_XEN_PROC_H__
-+#define __ASM_XEN_PROC_H__
-+
-+#include <linux/proc_fs.h>
-+
-+extern struct proc_dir_entry *create_xen_proc_entry(
-+      const char *name, mode_t mode);
-+extern void remove_xen_proc_entry(
-+      const char *name);
-+
-+#endif /* __ASM_XEN_PROC_H__ */
-Index: head-2008-11-25/include/xen/xencons.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/xencons.h      2007-10-15 09:39:38.000000000 +0200
-@@ -0,0 +1,17 @@
-+#ifndef __ASM_XENCONS_H__
-+#define __ASM_XENCONS_H__
-+
-+struct dom0_vga_console_info;
-+void dom0_init_screen_info(const struct dom0_vga_console_info *, size_t);
-+
-+void xencons_force_flush(void);
-+void xencons_resume(void);
-+
-+/* Interrupt work hooks. Receive data, or kick data out. */
-+void xencons_rx(char *buf, unsigned len, struct pt_regs *regs);
-+void xencons_tx(void);
-+
-+int xencons_ring_init(void);
-+int xencons_ring_send(const char *data, unsigned len);
-+
-+#endif /* __ASM_XENCONS_H__ */
-Index: head-2008-11-25/include/xen/xenoprof.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/include/xen/xenoprof.h     2007-06-12 13:14:19.000000000 +0200
-@@ -0,0 +1,42 @@
-+/******************************************************************************
-+ * xen/xenoprof.h
-+ *
-+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
-+ *                    VA Linux Systems Japan K.K.
-+ *
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ *
-+ */
-+
-+#ifndef __XEN_XENOPROF_H__
-+#define __XEN_XENOPROF_H__
-+#ifdef CONFIG_XEN
-+
-+#include <asm/xenoprof.h>
-+
-+struct oprofile_operations;
-+int xenoprofile_init(struct oprofile_operations * ops);
-+void xenoprofile_exit(void);
-+
-+struct xenoprof_shared_buffer {
-+      char                                    *buffer;
-+      struct xenoprof_arch_shared_buffer      arch;
-+};
-+#else
-+#define xenoprofile_init(ops) (-ENOSYS)
-+#define xenoprofile_exit()    do { } while (0)
-+
-+#endif /* CONFIG_XEN */
-+#endif /* __XEN_XENOPROF_H__ */
-Index: head-2008-11-25/lib/swiotlb-xen.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/lib/swiotlb-xen.c  2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,739 @@
-+/*
-+ * Dynamic DMA mapping support.
-+ *
-+ * This implementation is a fallback for platforms that do not support
-+ * I/O TLBs (aka DMA address translation hardware).
-+ * Copyright (C) 2000 Asit Mallick <Asit.K.Mallick@intel.com>
-+ * Copyright (C) 2000 Goutham Rao <goutham.rao@intel.com>
-+ * Copyright (C) 2000, 2003 Hewlett-Packard Co
-+ *    David Mosberger-Tang <davidm@hpl.hp.com>
-+ * Copyright (C) 2005 Keir Fraser <keir@xensource.com>
-+ */
-+
-+#include <linux/cache.h>
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include <linux/string.h>
-+#include <linux/types.h>
-+#include <linux/ctype.h>
-+#include <linux/init.h>
-+#include <linux/bootmem.h>
-+#include <linux/highmem.h>
-+#include <asm/io.h>
-+#include <asm/pci.h>
-+#include <asm/dma.h>
-+#include <asm/uaccess.h>
-+#include <xen/gnttab.h>
-+#include <xen/interface/memory.h>
-+#include <asm-i386/mach-xen/asm/gnttab_dma.h>
-+
-+int swiotlb;
-+EXPORT_SYMBOL(swiotlb);
-+
-+#define OFFSET(val,align) ((unsigned long)((val) & ( (align) - 1)))
-+
-+/*
-+ * Maximum allowable number of contiguous slabs to map,
-+ * must be a power of 2.  What is the appropriate value ?
-+ * The complexity of {map,unmap}_single is linearly dependent on this value.
-+ */
-+#define IO_TLB_SEGSIZE        128
-+
-+/*
-+ * log of the size of each IO TLB slab.  The number of slabs is command line
-+ * controllable.
-+ */
-+#define IO_TLB_SHIFT 11
-+
-+int swiotlb_force;
-+
-+static char *iotlb_virt_start;
-+static unsigned long iotlb_nslabs;
-+
-+/*
-+ * Used to do a quick range check in swiotlb_unmap_single and
-+ * swiotlb_sync_single_*, to see if the memory was in fact allocated by this
-+ * API.
-+ */
-+static unsigned long iotlb_pfn_start, iotlb_pfn_end;
-+
-+/* Does the given dma address reside within the swiotlb aperture? */
-+static inline int in_swiotlb_aperture(dma_addr_t dev_addr)
-+{
-+      unsigned long pfn = mfn_to_local_pfn(dev_addr >> PAGE_SHIFT);
-+      return (pfn_valid(pfn)
-+              && (pfn >= iotlb_pfn_start)
-+              && (pfn < iotlb_pfn_end));
-+}
-+
-+/*
-+ * When the IOMMU overflows we return a fallback buffer. This sets the size.
-+ */
-+static unsigned long io_tlb_overflow = 32*1024;
-+
-+void *io_tlb_overflow_buffer;
-+
-+/*
-+ * This is a free list describing the number of free entries available from
-+ * each index
-+ */
-+static unsigned int *io_tlb_list;
-+static unsigned int io_tlb_index;
-+
-+/*
-+ * We need to save away the original address corresponding to a mapped entry
-+ * for the sync operations.
-+ */
-+static struct phys_addr {
-+      struct page *page;
-+      unsigned int offset;
-+} *io_tlb_orig_addr;
-+
-+/*
-+ * Protect the above data structures in the map and unmap calls
-+ */
-+static DEFINE_SPINLOCK(io_tlb_lock);
-+
-+static unsigned int dma_bits;
-+static unsigned int __initdata max_dma_bits = 32;
-+static int __init
-+setup_dma_bits(char *str)
-+{
-+      max_dma_bits = simple_strtoul(str, NULL, 0);
-+      return 0;
-+}
-+__setup("dma_bits=", setup_dma_bits);
-+
-+static int __init
-+setup_io_tlb_npages(char *str)
-+{
-+      /* Unlike ia64, the size is aperture in megabytes, not 'slabs'! */
-+      if (isdigit(*str)) {
-+              iotlb_nslabs = simple_strtoul(str, &str, 0) <<
-+                      (20 - IO_TLB_SHIFT);
-+              iotlb_nslabs = ALIGN(iotlb_nslabs, IO_TLB_SEGSIZE);
-+      }
-+      if (*str == ',')
-+              ++str;
-+      /*
-+         * NB. 'force' enables the swiotlb, but doesn't force its use for
-+         * every DMA like it does on native Linux. 'off' forcibly disables
-+         * use of the swiotlb.
-+         */
-+      if (!strcmp(str, "force"))
-+              swiotlb_force = 1;
-+      else if (!strcmp(str, "off"))
-+              swiotlb_force = -1;
-+      return 1;
-+}
-+__setup("swiotlb=", setup_io_tlb_npages);
-+/* make io_tlb_overflow tunable too? */
-+
-+/*
-+ * Statically reserve bounce buffer space and initialize bounce buffer data
-+ * structures for the software IO TLB used to implement the PCI DMA API.
-+ */
-+void
-+swiotlb_init_with_default_size (size_t default_size)
-+{
-+      unsigned long i, bytes;
-+      int rc;
-+
-+      if (!iotlb_nslabs) {
-+              iotlb_nslabs = (default_size >> IO_TLB_SHIFT);
-+              iotlb_nslabs = ALIGN(iotlb_nslabs, IO_TLB_SEGSIZE);
-+      }
-+
-+      bytes = iotlb_nslabs * (1UL << IO_TLB_SHIFT);
-+
-+      /*
-+       * Get IO TLB memory from the low pages
-+       */
-+      iotlb_virt_start = alloc_bootmem_low_pages(bytes);
-+      if (!iotlb_virt_start)
-+              panic("Cannot allocate SWIOTLB buffer!\n");
-+
-+      dma_bits = get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT) + PAGE_SHIFT;
-+      for (i = 0; i < iotlb_nslabs; i += IO_TLB_SEGSIZE) {
-+              do {
-+                      rc = xen_create_contiguous_region(
-+                              (unsigned long)iotlb_virt_start + (i << IO_TLB_SHIFT),
-+                              get_order(IO_TLB_SEGSIZE << IO_TLB_SHIFT),
-+                              dma_bits);
-+              } while (rc && dma_bits++ < max_dma_bits);
-+              if (rc) {
-+                      if (i == 0)
-+                              panic("No suitable physical memory available for SWIOTLB buffer!\n"
-+                                    "Use dom0_mem Xen boot parameter to reserve\n"
-+                                    "some DMA memory (e.g., dom0_mem=-128M).\n");
-+                      iotlb_nslabs = i;
-+                      i <<= IO_TLB_SHIFT;
-+                      free_bootmem(__pa(iotlb_virt_start + i), bytes - i);
-+                      bytes = i;
-+                      for (dma_bits = 0; i > 0; i -= IO_TLB_SEGSIZE << IO_TLB_SHIFT) {
-+                              unsigned int bits = fls64(virt_to_bus(iotlb_virt_start + i - 1));
-+
-+                              if (bits > dma_bits)
-+                                      dma_bits = bits;
-+                      }
-+                      break;
-+              }
-+      }
-+
-+      /*
-+       * Allocate and initialize the free list array.  This array is used
-+       * to find contiguous free memory regions of size up to IO_TLB_SEGSIZE.
-+       */
-+      io_tlb_list = alloc_bootmem(iotlb_nslabs * sizeof(int));
-+      for (i = 0; i < iotlb_nslabs; i++)
-+              io_tlb_list[i] = IO_TLB_SEGSIZE - OFFSET(i, IO_TLB_SEGSIZE);
-+      io_tlb_index = 0;
-+      io_tlb_orig_addr = alloc_bootmem(
-+              iotlb_nslabs * sizeof(*io_tlb_orig_addr));
-+
-+      /*
-+       * Get the overflow emergency buffer
-+       */
-+      io_tlb_overflow_buffer = alloc_bootmem_low(io_tlb_overflow);
-+      if (!io_tlb_overflow_buffer)
-+              panic("Cannot allocate SWIOTLB overflow buffer!\n");
-+
-+      do {
-+              rc = xen_create_contiguous_region(
-+                      (unsigned long)io_tlb_overflow_buffer,
-+                      get_order(io_tlb_overflow),
-+                      dma_bits);
-+      } while (rc && dma_bits++ < max_dma_bits);
-+      if (rc)
-+              panic("No suitable physical memory available for SWIOTLB overflow buffer!\n");
-+
-+      iotlb_pfn_start = __pa(iotlb_virt_start) >> PAGE_SHIFT;
-+      iotlb_pfn_end   = iotlb_pfn_start + (bytes >> PAGE_SHIFT);
-+
-+      printk(KERN_INFO "Software IO TLB enabled: \n"
-+             " Aperture:     %lu megabytes\n"
-+             " Kernel range: %p - %p\n"
-+             " Address size: %u bits\n",
-+             bytes >> 20,
-+             iotlb_virt_start, iotlb_virt_start + bytes,
-+             dma_bits);
-+}
-+
-+void
-+swiotlb_init(void)
-+{
-+      long ram_end;
-+      size_t defsz = 64 * (1 << 20); /* 64MB default size */
-+
-+      if (swiotlb_force == 1) {
-+              swiotlb = 1;
-+      } else if ((swiotlb_force != -1) &&
-+                 is_running_on_xen() &&
-+                 is_initial_xendomain()) {
-+              /* Domain 0 always has a swiotlb. */
-+              ram_end = HYPERVISOR_memory_op(XENMEM_maximum_ram_page, NULL);
-+              if (ram_end <= 0x7ffff)
-+                      defsz = 2 * (1 << 20); /* 2MB on <2GB on systems. */
-+              swiotlb = 1;
-+      }
-+
-+      if (swiotlb)
-+              swiotlb_init_with_default_size(defsz);
-+      else
-+              printk(KERN_INFO "Software IO TLB disabled\n");
-+}
-+
-+/*
-+ * We use __copy_to_user_inatomic to transfer to the host buffer because the
-+ * buffer may be mapped read-only (e.g, in blkback driver) but lower-level
-+ * drivers map the buffer for DMA_BIDIRECTIONAL access. This causes an
-+ * unnecessary copy from the aperture to the host buffer, and a page fault.
-+ */
-+static void
-+__sync_single(struct phys_addr buffer, char *dma_addr, size_t size, int dir)
-+{
-+      if (PageHighMem(buffer.page)) {
-+              size_t len, bytes;
-+              char *dev, *host, *kmp;
-+              len = size;
-+              while (len != 0) {
-+                      unsigned long flags;
-+
-+                      if (((bytes = len) + buffer.offset) > PAGE_SIZE)
-+                              bytes = PAGE_SIZE - buffer.offset;
-+                      local_irq_save(flags); /* protects KM_BOUNCE_READ */
-+                      kmp  = kmap_atomic(buffer.page, KM_BOUNCE_READ);
-+                      dev  = dma_addr + size - len;
-+                      host = kmp + buffer.offset;
-+                      if (dir == DMA_FROM_DEVICE) {
-+                              if (__copy_to_user_inatomic(host, dev, bytes))
-+                                      /* inaccessible */;
-+                      } else
-+                              memcpy(dev, host, bytes);
-+                      kunmap_atomic(kmp, KM_BOUNCE_READ);
-+                      local_irq_restore(flags);
-+                      len -= bytes;
-+                      buffer.page++;
-+                      buffer.offset = 0;
-+              }
-+      } else {
-+              char *host = (char *)phys_to_virt(
-+                      page_to_pseudophys(buffer.page)) + buffer.offset;
-+              if (dir == DMA_FROM_DEVICE) {
-+                      if (__copy_to_user_inatomic(host, dma_addr, size))
-+                              /* inaccessible */;
-+              } else if (dir == DMA_TO_DEVICE)
-+                      memcpy(dma_addr, host, size);
-+      }
-+}
-+
-+/*
-+ * Allocates bounce buffer and returns its kernel virtual address.
-+ */
-+static void *
-+map_single(struct device *hwdev, struct phys_addr buffer, size_t size, int dir)
-+{
-+      unsigned long flags;
-+      char *dma_addr;
-+      unsigned int nslots, stride, index, wrap;
-+      struct phys_addr slot_buf;
-+      int i;
-+
-+      /*
-+       * For mappings greater than a page, we limit the stride (and
-+       * hence alignment) to a page size.
-+       */
-+      nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-+      if (size > PAGE_SIZE)
-+              stride = (1 << (PAGE_SHIFT - IO_TLB_SHIFT));
-+      else
-+              stride = 1;
-+
-+      BUG_ON(!nslots);
-+
-+      /*
-+       * Find suitable number of IO TLB entries size that will fit this
-+       * request and allocate a buffer from that IO TLB pool.
-+       */
-+      spin_lock_irqsave(&io_tlb_lock, flags);
-+      {
-+              wrap = index = ALIGN(io_tlb_index, stride);
-+
-+              if (index >= iotlb_nslabs)
-+                      wrap = index = 0;
-+
-+              do {
-+                      /*
-+                       * If we find a slot that indicates we have 'nslots'
-+                       * number of contiguous buffers, we allocate the
-+                       * buffers from that slot and mark the entries as '0'
-+                       * indicating unavailable.
-+                       */
-+                      if (io_tlb_list[index] >= nslots) {
-+                              int count = 0;
-+
-+                              for (i = index; i < (int)(index + nslots); i++)
-+                                      io_tlb_list[i] = 0;
-+                              for (i = index - 1;
-+                                   (OFFSET(i, IO_TLB_SEGSIZE) !=
-+                                    IO_TLB_SEGSIZE -1) && io_tlb_list[i];
-+                                   i--)
-+                                      io_tlb_list[i] = ++count;
-+                              dma_addr = iotlb_virt_start +
-+                                      (index << IO_TLB_SHIFT);
-+
-+                              /*
-+                               * Update the indices to avoid searching in
-+                               * the next round.
-+                               */
-+                              io_tlb_index = 
-+                                      ((index + nslots) < iotlb_nslabs
-+                                       ? (index + nslots) : 0);
-+
-+                              goto found;
-+                      }
-+                      index += stride;
-+                      if (index >= iotlb_nslabs)
-+                              index = 0;
-+              } while (index != wrap);
-+
-+              spin_unlock_irqrestore(&io_tlb_lock, flags);
-+              return NULL;
-+      }
-+  found:
-+      spin_unlock_irqrestore(&io_tlb_lock, flags);
-+
-+      /*
-+       * Save away the mapping from the original address to the DMA address.
-+       * This is needed when we sync the memory.  Then we sync the buffer if
-+       * needed.
-+       */
-+      slot_buf = buffer;
-+      for (i = 0; i < nslots; i++) {
-+              slot_buf.page += slot_buf.offset >> PAGE_SHIFT;
-+              slot_buf.offset &= PAGE_SIZE - 1;
-+              io_tlb_orig_addr[index+i] = slot_buf;
-+              slot_buf.offset += 1 << IO_TLB_SHIFT;
-+      }
-+      if ((dir == DMA_TO_DEVICE) || (dir == DMA_BIDIRECTIONAL))
-+              __sync_single(buffer, dma_addr, size, DMA_TO_DEVICE);
-+
-+      return dma_addr;
-+}
-+
-+static struct phys_addr dma_addr_to_phys_addr(char *dma_addr)
-+{
-+      int index = (dma_addr - iotlb_virt_start) >> IO_TLB_SHIFT;
-+      struct phys_addr buffer = io_tlb_orig_addr[index];
-+      buffer.offset += (long)dma_addr & ((1 << IO_TLB_SHIFT) - 1);
-+      buffer.page += buffer.offset >> PAGE_SHIFT;
-+      buffer.offset &= PAGE_SIZE - 1;
-+      return buffer;
-+}
-+
-+/*
-+ * dma_addr is the kernel virtual address of the bounce buffer to unmap.
-+ */
-+static void
-+unmap_single(struct device *hwdev, char *dma_addr, size_t size, int dir)
-+{
-+      unsigned long flags;
-+      int i, count, nslots = ALIGN(size, 1 << IO_TLB_SHIFT) >> IO_TLB_SHIFT;
-+      int index = (dma_addr - iotlb_virt_start) >> IO_TLB_SHIFT;
-+      struct phys_addr buffer = dma_addr_to_phys_addr(dma_addr);
-+
-+      /*
-+       * First, sync the memory before unmapping the entry
-+       */
-+      if ((dir == DMA_FROM_DEVICE) || (dir == DMA_BIDIRECTIONAL))
-+              __sync_single(buffer, dma_addr, size, DMA_FROM_DEVICE);
-+
-+      /*
-+       * Return the buffer to the free list by setting the corresponding
-+       * entries to indicate the number of contigous entries available.
-+       * While returning the entries to the free list, we merge the entries
-+       * with slots below and above the pool being returned.
-+       */
-+      spin_lock_irqsave(&io_tlb_lock, flags);
-+      {
-+              count = ((index + nslots) < ALIGN(index + 1, IO_TLB_SEGSIZE) ?
-+                       io_tlb_list[index + nslots] : 0);
-+              /*
-+               * Step 1: return the slots to the free list, merging the
-+               * slots with superceeding slots
-+               */
-+              for (i = index + nslots - 1; i >= index; i--)
-+                      io_tlb_list[i] = ++count;
-+              /*
-+               * Step 2: merge the returned slots with the preceding slots,
-+               * if available (non zero)
-+               */
-+              for (i = index - 1;
-+                   (OFFSET(i, IO_TLB_SEGSIZE) !=
-+                    IO_TLB_SEGSIZE -1) && io_tlb_list[i];
-+                   i--)
-+                      io_tlb_list[i] = ++count;
-+      }
-+      spin_unlock_irqrestore(&io_tlb_lock, flags);
-+}
-+
-+static void
-+sync_single(struct device *hwdev, char *dma_addr, size_t size, int dir)
-+{
-+      struct phys_addr buffer = dma_addr_to_phys_addr(dma_addr);
-+      BUG_ON((dir != DMA_FROM_DEVICE) && (dir != DMA_TO_DEVICE));
-+      __sync_single(buffer, dma_addr, size, dir);
-+}
-+
-+static void
-+swiotlb_full(struct device *dev, size_t size, int dir, int do_panic)
-+{
-+      /*
-+       * Ran out of IOMMU space for this operation. This is very bad.
-+       * Unfortunately the drivers cannot handle this operation properly.
-+       * unless they check for pci_dma_mapping_error (most don't)
-+       * When the mapping is small enough return a static buffer to limit
-+       * the damage, or panic when the transfer is too big.
-+       */
-+      printk(KERN_ERR "PCI-DMA: Out of SW-IOMMU space for %lu bytes at "
-+             "device %s\n", (unsigned long)size, dev ? dev->bus_id : "?");
-+
-+      if (size > io_tlb_overflow && do_panic) {
-+              if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)
-+                      panic("PCI-DMA: Memory would be corrupted\n");
-+              if (dir == PCI_DMA_TODEVICE || dir == PCI_DMA_BIDIRECTIONAL)
-+                      panic("PCI-DMA: Random memory would be DMAed\n");
-+      }
-+}
-+
-+/*
-+ * Map a single buffer of the indicated size for DMA in streaming mode.  The
-+ * PCI address to use is returned.
-+ *
-+ * Once the device is given the dma address, the device owns this memory until
-+ * either swiotlb_unmap_single or swiotlb_dma_sync_single is performed.
-+ */
-+dma_addr_t
-+swiotlb_map_single(struct device *hwdev, void *ptr, size_t size, int dir)
-+{
-+      dma_addr_t dev_addr = gnttab_dma_map_page(virt_to_page(ptr)) +
-+                            offset_in_page(ptr);
-+      void *map;
-+      struct phys_addr buffer;
-+
-+      BUG_ON(dir == DMA_NONE);
-+
-+      /*
-+       * If the pointer passed in happens to be in the device's DMA window,
-+       * we can safely return the device addr and not worry about bounce
-+       * buffering it.
-+       */
-+      if (!range_straddles_page_boundary(__pa(ptr), size) &&
-+          !address_needs_mapping(hwdev, dev_addr))
-+              return dev_addr;
-+
-+      /*
-+       * Oh well, have to allocate and map a bounce buffer.
-+       */
-+      gnttab_dma_unmap_page(dev_addr);
-+      buffer.page   = virt_to_page(ptr);
-+      buffer.offset = (unsigned long)ptr & ~PAGE_MASK;
-+      map = map_single(hwdev, buffer, size, dir);
-+      if (!map) {
-+              swiotlb_full(hwdev, size, dir, 1);
-+              map = io_tlb_overflow_buffer;
-+      }
-+
-+      dev_addr = virt_to_bus(map);
-+      return dev_addr;
-+}
-+
-+/*
-+ * Unmap a single streaming mode DMA translation.  The dma_addr and size must
-+ * match what was provided for in a previous swiotlb_map_single call.  All
-+ * other usages are undefined.
-+ *
-+ * After this call, reads by the cpu to the buffer are guaranteed to see
-+ * whatever the device wrote there.
-+ */
-+void
-+swiotlb_unmap_single(struct device *hwdev, dma_addr_t dev_addr, size_t size,
-+                   int dir)
-+{
-+      BUG_ON(dir == DMA_NONE);
-+      if (in_swiotlb_aperture(dev_addr))
-+              unmap_single(hwdev, bus_to_virt(dev_addr), size, dir);
-+      else
-+              gnttab_dma_unmap_page(dev_addr);
-+}
-+
-+/*
-+ * Make physical memory consistent for a single streaming mode DMA translation
-+ * after a transfer.
-+ *
-+ * If you perform a swiotlb_map_single() but wish to interrogate the buffer
-+ * using the cpu, yet do not wish to teardown the PCI dma mapping, you must
-+ * call this function before doing so.  At the next point you give the PCI dma
-+ * address back to the card, you must first perform a
-+ * swiotlb_dma_sync_for_device, and then the device again owns the buffer
-+ */
-+void
-+swiotlb_sync_single_for_cpu(struct device *hwdev, dma_addr_t dev_addr,
-+                          size_t size, int dir)
-+{
-+      BUG_ON(dir == DMA_NONE);
-+      if (in_swiotlb_aperture(dev_addr))
-+              sync_single(hwdev, bus_to_virt(dev_addr), size, dir);
-+}
-+
-+void
-+swiotlb_sync_single_for_device(struct device *hwdev, dma_addr_t dev_addr,
-+                             size_t size, int dir)
-+{
-+      BUG_ON(dir == DMA_NONE);
-+      if (in_swiotlb_aperture(dev_addr))
-+              sync_single(hwdev, bus_to_virt(dev_addr), size, dir);
-+}
-+
-+/*
-+ * Map a set of buffers described by scatterlist in streaming mode for DMA.
-+ * This is the scatter-gather version of the above swiotlb_map_single
-+ * interface.  Here the scatter gather list elements are each tagged with the
-+ * appropriate dma address and length.  They are obtained via
-+ * sg_dma_{address,length}(SG).
-+ *
-+ * NOTE: An implementation may be able to use a smaller number of
-+ *       DMA address/length pairs than there are SG table elements.
-+ *       (for example via virtual mapping capabilities)
-+ *       The routine returns the number of addr/length pairs actually
-+ *       used, at most nents.
-+ *
-+ * Device ownership issues as mentioned above for swiotlb_map_single are the
-+ * same here.
-+ */
-+int
-+swiotlb_map_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-+             int dir)
-+{
-+      struct phys_addr buffer;
-+      dma_addr_t dev_addr;
-+      char *map;
-+      int i;
-+
-+      BUG_ON(dir == DMA_NONE);
-+
-+      for (i = 0; i < nelems; i++, sg++) {
-+              dev_addr = gnttab_dma_map_page(sg->page) + sg->offset;
-+
-+              if (range_straddles_page_boundary(page_to_pseudophys(sg->page)
-+                                                + sg->offset, sg->length)
-+                  || address_needs_mapping(hwdev, dev_addr)) {
-+                      gnttab_dma_unmap_page(dev_addr);
-+                      buffer.page   = sg->page;
-+                      buffer.offset = sg->offset;
-+                      map = map_single(hwdev, buffer, sg->length, dir);
-+                      if (!map) {
-+                              /* Don't panic here, we expect map_sg users
-+                                 to do proper error handling. */
-+                              swiotlb_full(hwdev, sg->length, dir, 0);
-+                              swiotlb_unmap_sg(hwdev, sg - i, i, dir);
-+                              sg[0].dma_length = 0;
-+                              return 0;
-+                      }
-+                      sg->dma_address = (dma_addr_t)virt_to_bus(map);
-+              } else
-+                      sg->dma_address = dev_addr;
-+              sg->dma_length = sg->length;
-+      }
-+      return nelems;
-+}
-+
-+/*
-+ * Unmap a set of streaming mode DMA translations.  Again, cpu read rules
-+ * concerning calls here are the same as for swiotlb_unmap_single() above.
-+ */
-+void
-+swiotlb_unmap_sg(struct device *hwdev, struct scatterlist *sg, int nelems,
-+               int dir)
-+{
-+      int i;
-+
-+      BUG_ON(dir == DMA_NONE);
-+
-+      for (i = 0; i < nelems; i++, sg++)
-+              if (in_swiotlb_aperture(sg->dma_address))
-+                      unmap_single(hwdev, 
-+                                   (void *)bus_to_virt(sg->dma_address),
-+                                   sg->dma_length, dir);
-+              else
-+                      gnttab_dma_unmap_page(sg->dma_address);
-+}
-+
-+/*
-+ * Make physical memory consistent for a set of streaming mode DMA translations
-+ * after a transfer.
-+ *
-+ * The same as swiotlb_sync_single_* but for a scatter-gather list, same rules
-+ * and usage.
-+ */
-+void
-+swiotlb_sync_sg_for_cpu(struct device *hwdev, struct scatterlist *sg,
-+                      int nelems, int dir)
-+{
-+      int i;
-+
-+      BUG_ON(dir == DMA_NONE);
-+
-+      for (i = 0; i < nelems; i++, sg++)
-+              if (in_swiotlb_aperture(sg->dma_address))
-+                      sync_single(hwdev,
-+                                  (void *)bus_to_virt(sg->dma_address),
-+                                  sg->dma_length, dir);
-+}
-+
-+void
-+swiotlb_sync_sg_for_device(struct device *hwdev, struct scatterlist *sg,
-+                         int nelems, int dir)
-+{
-+      int i;
-+
-+      BUG_ON(dir == DMA_NONE);
-+
-+      for (i = 0; i < nelems; i++, sg++)
-+              if (in_swiotlb_aperture(sg->dma_address))
-+                      sync_single(hwdev,
-+                                  (void *)bus_to_virt(sg->dma_address),
-+                                  sg->dma_length, dir);
-+}
-+
-+#ifdef CONFIG_HIGHMEM
-+
-+dma_addr_t
-+swiotlb_map_page(struct device *hwdev, struct page *page,
-+               unsigned long offset, size_t size,
-+               enum dma_data_direction direction)
-+{
-+      struct phys_addr buffer;
-+      dma_addr_t dev_addr;
-+      char *map;
-+
-+      dev_addr = gnttab_dma_map_page(page) + offset;
-+      if (address_needs_mapping(hwdev, dev_addr)) {
-+              gnttab_dma_unmap_page(dev_addr);
-+              buffer.page   = page;
-+              buffer.offset = offset;
-+              map = map_single(hwdev, buffer, size, direction);
-+              if (!map) {
-+                      swiotlb_full(hwdev, size, direction, 1);
-+                      map = io_tlb_overflow_buffer;
-+              }
-+              dev_addr = (dma_addr_t)virt_to_bus(map);
-+      }
-+
-+      return dev_addr;
-+}
-+
-+void
-+swiotlb_unmap_page(struct device *hwdev, dma_addr_t dma_address,
-+                 size_t size, enum dma_data_direction direction)
-+{
-+      BUG_ON(direction == DMA_NONE);
-+      if (in_swiotlb_aperture(dma_address))
-+              unmap_single(hwdev, bus_to_virt(dma_address), size, direction);
-+      else
-+              gnttab_dma_unmap_page(dma_address);
-+}
-+
-+#endif
-+
-+int
-+swiotlb_dma_mapping_error(dma_addr_t dma_addr)
-+{
-+      return (dma_addr == virt_to_bus(io_tlb_overflow_buffer));
-+}
-+
-+/*
-+ * Return whether the given PCI device DMA address mask can be supported
-+ * properly.  For example, if your device can only drive the low 24-bits
-+ * during PCI bus mastering, then you would pass 0x00ffffff as the mask to
-+ * this function.
-+ */
-+int
-+swiotlb_dma_supported (struct device *hwdev, u64 mask)
-+{
-+      return (mask >= ((1UL << dma_bits) - 1));
-+}
-+
-+EXPORT_SYMBOL(swiotlb_init);
-+EXPORT_SYMBOL(swiotlb_map_single);
-+EXPORT_SYMBOL(swiotlb_unmap_single);
-+EXPORT_SYMBOL(swiotlb_map_sg);
-+EXPORT_SYMBOL(swiotlb_unmap_sg);
-+EXPORT_SYMBOL(swiotlb_sync_single_for_cpu);
-+EXPORT_SYMBOL(swiotlb_sync_single_for_device);
-+EXPORT_SYMBOL(swiotlb_sync_sg_for_cpu);
-+EXPORT_SYMBOL(swiotlb_sync_sg_for_device);
-+EXPORT_SYMBOL(swiotlb_dma_mapping_error);
-+EXPORT_SYMBOL(swiotlb_dma_supported);
-Index: head-2008-11-25/scripts/Makefile.xen.awk
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/scripts/Makefile.xen.awk   2007-08-06 15:10:49.000000000 +0200
-@@ -0,0 +1,34 @@
-+BEGIN {
-+      is_rule = 0
-+}
-+
-+/^[[:space:]]*#/ {
-+      next
-+}
-+
-+/^[[:space:]]*$/ {
-+      if (is_rule)
-+              print("")
-+      is_rule = 0
-+      next
-+}
-+
-+/:[[:space:]]*%\.[cS][[:space:]]/ {
-+      line = gensub(/%.([cS])/, "%-xen.\\1", "g", $0)
-+      line = gensub(/(single-used-m)/, "xen-\\1", "g", line)
-+      print line
-+      is_rule = 1
-+      next
-+}
-+
-+/^[^\t]$/ {
-+      if (is_rule)
-+              print("")
-+      is_rule = 0
-+      next
-+}
-+
-+is_rule {
-+      print $0
-+      next
-+}
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-drivers.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-drivers.diff
deleted file mode 100644 (file)
index 21a58c1..0000000
+++ /dev/null
@@ -1,52850 +0,0 @@
-Subject: xen3 xen-drivers
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
-Index: head-2008-11-25/drivers/xen/balloon/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/balloon/Makefile       2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,2 @@
-+
-+obj-y := balloon.o sysfs.o
-Index: head-2008-11-25/drivers/xen/balloon/balloon.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/balloon/balloon.c      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,724 @@
-+/******************************************************************************
-+ * balloon.c
-+ *
-+ * Xen balloon driver - enables returning/claiming memory to/from Xen.
-+ *
-+ * Copyright (c) 2003, B Dragovic
-+ * Copyright (c) 2003-2004, M Williamson, K Fraser
-+ * Copyright (c) 2005 Dan M. Smith, IBM Corporation
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/mman.h>
-+#include <linux/smp_lock.h>
-+#include <linux/pagemap.h>
-+#include <linux/bootmem.h>
-+#include <linux/highmem.h>
-+#include <linux/vmalloc.h>
-+#include <linux/mutex.h>
-+#include <xen/xen_proc.h>
-+#include <asm/hypervisor.h>
-+#include <xen/balloon.h>
-+#include <xen/interface/memory.h>
-+#include <asm/maddr.h>
-+#include <asm/page.h>
-+#include <asm/pgalloc.h>
-+#include <asm/pgtable.h>
-+#include <asm/uaccess.h>
-+#include <asm/tlb.h>
-+#include <linux/highmem.h>
-+#include <linux/list.h>
-+#include <xen/xenbus.h>
-+#include "common.h"
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+#ifdef CONFIG_PROC_FS
-+static struct proc_dir_entry *balloon_pde;
-+#endif
-+
-+static DEFINE_MUTEX(balloon_mutex);
-+
-+/*
-+ * Protects atomic reservation decrease/increase against concurrent increases.
-+ * Also protects non-atomic updates of current_pages and driver_pages, and
-+ * balloon lists.
-+ */
-+DEFINE_SPINLOCK(balloon_lock);
-+
-+struct balloon_stats balloon_stats;
-+
-+/* We increase/decrease in batches which fit in a page */
-+static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
-+
-+/* VM /proc information for memory */
-+extern unsigned long totalram_pages;
-+
-+#ifndef MODULE
-+extern unsigned long totalhigh_pages;
-+#define inc_totalhigh_pages() (totalhigh_pages++)
-+#define dec_totalhigh_pages() (totalhigh_pages--)
-+#else
-+#define inc_totalhigh_pages() ((void)0)
-+#define dec_totalhigh_pages() ((void)0)
-+#endif
-+
-+/* List of ballooned pages, threaded through the mem_map array. */
-+static LIST_HEAD(ballooned_pages);
-+
-+/* Main work function, always executed in process context. */
-+static void balloon_process(void *unused);
-+static DECLARE_WORK(balloon_worker, balloon_process, NULL);
-+static struct timer_list balloon_timer;
-+
-+/* When ballooning out (allocating memory to return to Xen) we don't really 
-+   want the kernel to try too hard since that can trigger the oom killer. */
-+#define GFP_BALLOON \
-+      (GFP_HIGHUSER|__GFP_NOWARN|__GFP_NORETRY|__GFP_NOMEMALLOC|__GFP_COLD)
-+
-+#define PAGE_TO_LIST(p) (&(p)->lru)
-+#define LIST_TO_PAGE(l) list_entry((l), struct page, lru)
-+#define UNLIST_PAGE(p)                                \
-+      do {                                    \
-+              list_del(PAGE_TO_LIST(p));      \
-+              PAGE_TO_LIST(p)->next = NULL;   \
-+              PAGE_TO_LIST(p)->prev = NULL;   \
-+      } while(0)
-+
-+#define IPRINTK(fmt, args...) \
-+      printk(KERN_INFO "xen_mem: " fmt, ##args)
-+#define WPRINTK(fmt, args...) \
-+      printk(KERN_WARNING "xen_mem: " fmt, ##args)
-+
-+/* balloon_append: add the given page to the balloon. */
-+static void balloon_append(struct page *page)
-+{
-+      /* Lowmem is re-populated first, so highmem pages go at list tail. */
-+      if (PageHighMem(page)) {
-+              list_add_tail(PAGE_TO_LIST(page), &ballooned_pages);
-+              bs.balloon_high++;
-+              dec_totalhigh_pages();
-+      } else {
-+              list_add(PAGE_TO_LIST(page), &ballooned_pages);
-+              bs.balloon_low++;
-+      }
-+}
-+
-+/* balloon_retrieve: rescue a page from the balloon, if it is not empty. */
-+static struct page *balloon_retrieve(void)
-+{
-+      struct page *page;
-+
-+      if (list_empty(&ballooned_pages))
-+              return NULL;
-+
-+      page = LIST_TO_PAGE(ballooned_pages.next);
-+      UNLIST_PAGE(page);
-+
-+      if (PageHighMem(page)) {
-+              bs.balloon_high--;
-+              inc_totalhigh_pages();
-+      }
-+      else
-+              bs.balloon_low--;
-+
-+      return page;
-+}
-+
-+static struct page *balloon_first_page(void)
-+{
-+      if (list_empty(&ballooned_pages))
-+              return NULL;
-+      return LIST_TO_PAGE(ballooned_pages.next);
-+}
-+
-+static struct page *balloon_next_page(struct page *page)
-+{
-+      struct list_head *next = PAGE_TO_LIST(page)->next;
-+      if (next == &ballooned_pages)
-+              return NULL;
-+      return LIST_TO_PAGE(next);
-+}
-+
-+static inline void balloon_free_page(struct page *page)
-+{
-+#ifndef MODULE
-+      if (put_page_testzero(page))
-+              free_cold_page(page);
-+#else
-+      /* free_cold_page() is not being exported. */
-+      __free_page(page);
-+#endif
-+}
-+
-+static void balloon_alarm(unsigned long unused)
-+{
-+      schedule_work(&balloon_worker);
-+}
-+
-+static unsigned long current_target(void)
-+{
-+      unsigned long target = min(bs.target_pages, bs.hard_limit);
-+      if (target > (bs.current_pages + bs.balloon_low + bs.balloon_high))
-+              target = bs.current_pages + bs.balloon_low + bs.balloon_high;
-+      return target;
-+}
-+
-+static unsigned long minimum_target(void)
-+{
-+#ifndef CONFIG_XEN
-+#define max_pfn num_physpages
-+#endif
-+      unsigned long min_pages, curr_pages = current_target();
-+
-+#define MB2PAGES(mb) ((mb) << (20 - PAGE_SHIFT))
-+      /* Simple continuous piecewiese linear function:
-+       *  max MiB -> min MiB  gradient
-+       *       0         0
-+       *      16        16
-+       *      32        24
-+       *     128        72    (1/2)
-+       *     512       168    (1/4)
-+       *    2048       360    (1/8)
-+       *    8192       552    (1/32)
-+       *   32768      1320
-+       *  131072      4392
-+       */
-+      if (max_pfn < MB2PAGES(128))
-+              min_pages = MB2PAGES(8) + (max_pfn >> 1);
-+      else if (max_pfn < MB2PAGES(512))
-+              min_pages = MB2PAGES(40) + (max_pfn >> 2);
-+      else if (max_pfn < MB2PAGES(2048))
-+              min_pages = MB2PAGES(104) + (max_pfn >> 3);
-+      else
-+              min_pages = MB2PAGES(296) + (max_pfn >> 5);
-+#undef MB2PAGES
-+
-+      /* Don't enforce growth */
-+      return min(min_pages, curr_pages);
-+#ifndef CONFIG_XEN
-+#undef max_pfn
-+#endif
-+}
-+
-+static int increase_reservation(unsigned long nr_pages)
-+{
-+      unsigned long  pfn, i, flags;
-+      struct page   *page;
-+      long           rc;
-+      struct xen_memory_reservation reservation = {
-+              .address_bits = 0,
-+              .extent_order = 0,
-+              .domid        = DOMID_SELF
-+      };
-+
-+      if (nr_pages > ARRAY_SIZE(frame_list))
-+              nr_pages = ARRAY_SIZE(frame_list);
-+
-+      balloon_lock(flags);
-+
-+      page = balloon_first_page();
-+      for (i = 0; i < nr_pages; i++) {
-+              BUG_ON(page == NULL);
-+              frame_list[i] = page_to_pfn(page);;
-+              page = balloon_next_page(page);
-+      }
-+
-+      set_xen_guest_handle(reservation.extent_start, frame_list);
-+      reservation.nr_extents   = nr_pages;
-+      rc = HYPERVISOR_memory_op(
-+              XENMEM_populate_physmap, &reservation);
-+      if (rc < nr_pages) {
-+              if (rc > 0) {
-+                      int ret;
-+
-+                      /* We hit the Xen hard limit: reprobe. */
-+                      reservation.nr_extents = rc;
-+                      ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                      &reservation);
-+                      BUG_ON(ret != rc);
-+              }
-+              if (rc >= 0)
-+                      bs.hard_limit = (bs.current_pages + rc -
-+                                       bs.driver_pages);
-+              goto out;
-+      }
-+
-+      for (i = 0; i < nr_pages; i++) {
-+              page = balloon_retrieve();
-+              BUG_ON(page == NULL);
-+
-+              pfn = page_to_pfn(page);
-+              BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap) &&
-+                     phys_to_machine_mapping_valid(pfn));
-+
-+              set_phys_to_machine(pfn, frame_list[i]);
-+
-+#ifdef CONFIG_XEN
-+              /* Link back into the page tables if not highmem. */
-+              if (pfn < max_low_pfn) {
-+                      int ret;
-+                      ret = HYPERVISOR_update_va_mapping(
-+                              (unsigned long)__va(pfn << PAGE_SHIFT),
-+                              pfn_pte_ma(frame_list[i], PAGE_KERNEL),
-+                              0);
-+                      BUG_ON(ret);
-+              }
-+#endif
-+
-+              /* Relinquish the page back to the allocator. */
-+              ClearPageReserved(page);
-+              init_page_count(page);
-+              balloon_free_page(page);
-+      }
-+
-+      bs.current_pages += nr_pages;
-+      totalram_pages = bs.current_pages;
-+
-+ out:
-+      balloon_unlock(flags);
-+
-+      return 0;
-+}
-+
-+static int decrease_reservation(unsigned long nr_pages)
-+{
-+      unsigned long  pfn, i, flags;
-+      struct page   *page;
-+      void          *v;
-+      int            need_sleep = 0;
-+      int ret;
-+      struct xen_memory_reservation reservation = {
-+              .address_bits = 0,
-+              .extent_order = 0,
-+              .domid        = DOMID_SELF
-+      };
-+
-+      if (nr_pages > ARRAY_SIZE(frame_list))
-+              nr_pages = ARRAY_SIZE(frame_list);
-+
-+      for (i = 0; i < nr_pages; i++) {
-+              if ((page = alloc_page(GFP_BALLOON)) == NULL) {
-+                      nr_pages = i;
-+                      need_sleep = 1;
-+                      break;
-+              }
-+
-+              pfn = page_to_pfn(page);
-+              frame_list[i] = pfn_to_mfn(pfn);
-+
-+              if (!PageHighMem(page)) {
-+                      v = phys_to_virt(pfn << PAGE_SHIFT);
-+                      scrub_pages(v, 1);
-+#ifdef CONFIG_XEN
-+                      ret = HYPERVISOR_update_va_mapping(
-+                              (unsigned long)v, __pte_ma(0), 0);
-+                      BUG_ON(ret);
-+#endif
-+              }
-+#ifdef CONFIG_XEN_SCRUB_PAGES
-+              else {
-+                      v = kmap(page);
-+                      scrub_pages(v, 1);
-+                      kunmap(page);
-+              }
-+#endif
-+      }
-+
-+#ifdef CONFIG_XEN
-+      /* Ensure that ballooned highmem pages don't have kmaps. */
-+      kmap_flush_unused();
-+      flush_tlb_all();
-+#endif
-+
-+      balloon_lock(flags);
-+
-+      /* No more mappings: invalidate P2M and add to balloon. */
-+      for (i = 0; i < nr_pages; i++) {
-+              pfn = mfn_to_pfn(frame_list[i]);
-+              set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
-+              balloon_append(pfn_to_page(pfn));
-+      }
-+
-+      set_xen_guest_handle(reservation.extent_start, frame_list);
-+      reservation.nr_extents   = nr_pages;
-+      ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
-+      BUG_ON(ret != nr_pages);
-+
-+      bs.current_pages -= nr_pages;
-+      totalram_pages = bs.current_pages;
-+
-+      balloon_unlock(flags);
-+
-+      return need_sleep;
-+}
-+
-+/*
-+ * We avoid multiple worker processes conflicting via the balloon mutex.
-+ * We may of course race updates of the target counts (which are protected
-+ * by the balloon lock), or with changes to the Xen hard limit, but we will
-+ * recover from these in time.
-+ */
-+static void balloon_process(void *unused)
-+{
-+      int need_sleep = 0;
-+      long credit;
-+
-+      mutex_lock(&balloon_mutex);
-+
-+      do {
-+              credit = current_target() - bs.current_pages;
-+              if (credit > 0)
-+                      need_sleep = (increase_reservation(credit) != 0);
-+              if (credit < 0)
-+                      need_sleep = (decrease_reservation(-credit) != 0);
-+
-+#ifndef CONFIG_PREEMPT
-+              if (need_resched())
-+                      schedule();
-+#endif
-+      } while ((credit != 0) && !need_sleep);
-+
-+      /* Schedule more work if there is some still to be done. */
-+      if (current_target() != bs.current_pages)
-+              mod_timer(&balloon_timer, jiffies + HZ);
-+
-+      mutex_unlock(&balloon_mutex);
-+}
-+
-+/* Resets the Xen limit, sets new target, and kicks off processing. */
-+void balloon_set_new_target(unsigned long target)
-+{
-+      /* No need for lock. Not read-modify-write updates. */
-+      bs.hard_limit   = ~0UL;
-+      bs.target_pages = max(target, minimum_target());
-+      schedule_work(&balloon_worker);
-+}
-+
-+static struct xenbus_watch target_watch =
-+{
-+      .node = "memory/target"
-+};
-+
-+/* React to a change in the target key */
-+static void watch_target(struct xenbus_watch *watch,
-+                       const char **vec, unsigned int len)
-+{
-+      unsigned long long new_target;
-+      int err;
-+
-+      err = xenbus_scanf(XBT_NIL, "memory", "target", "%llu", &new_target);
-+      if (err != 1) {
-+              /* This is ok (for domain0 at least) - so just return */
-+              return;
-+      }
-+
-+      /* The given memory/target value is in KiB, so it needs converting to
-+       * pages. PAGE_SHIFT converts bytes to pages, hence PAGE_SHIFT - 10.
-+       */
-+      balloon_set_new_target(new_target >> (PAGE_SHIFT - 10));
-+}
-+
-+static int balloon_init_watcher(struct notifier_block *notifier,
-+                              unsigned long event,
-+                              void *data)
-+{
-+      int err;
-+
-+      err = register_xenbus_watch(&target_watch);
-+      if (err)
-+              printk(KERN_ERR "Failed to set balloon watcher\n");
-+
-+      return NOTIFY_DONE;
-+}
-+
-+#ifdef CONFIG_PROC_FS
-+static int balloon_write(struct file *file, const char __user *buffer,
-+                       unsigned long count, void *data)
-+{
-+      char memstring[64], *endchar;
-+      unsigned long long target_bytes;
-+
-+      if (!capable(CAP_SYS_ADMIN))
-+              return -EPERM;
-+
-+      if (count <= 1)
-+              return -EBADMSG; /* runt */
-+      if (count > sizeof(memstring))
-+              return -EFBIG;   /* too long */
-+
-+      if (copy_from_user(memstring, buffer, count))
-+              return -EFAULT;
-+      memstring[sizeof(memstring)-1] = '\0';
-+
-+      target_bytes = memparse(memstring, &endchar);
-+      balloon_set_new_target(target_bytes >> PAGE_SHIFT);
-+
-+      return count;
-+}
-+
-+static int balloon_read(char *page, char **start, off_t off,
-+                      int count, int *eof, void *data)
-+{
-+      int len;
-+
-+      len = sprintf(
-+              page,
-+              "Current allocation: %8lu kB\n"
-+              "Requested target:   %8lu kB\n"
-+              "Low-mem balloon:    %8lu kB\n"
-+              "High-mem balloon:   %8lu kB\n"
-+              "Driver pages:       %8lu kB\n"
-+              "Xen hard limit:     ",
-+              PAGES2KB(bs.current_pages), PAGES2KB(bs.target_pages), 
-+              PAGES2KB(bs.balloon_low), PAGES2KB(bs.balloon_high),
-+              PAGES2KB(bs.driver_pages));
-+
-+      if (bs.hard_limit != ~0UL)
-+              len += sprintf(page + len, "%8lu kB\n",
-+                             PAGES2KB(bs.hard_limit));
-+      else
-+              len += sprintf(page + len, "     ??? kB\n");
-+
-+      *eof = 1;
-+      return len;
-+}
-+#endif
-+
-+static struct notifier_block xenstore_notifier;
-+
-+static int __init balloon_init(void)
-+{
-+#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
-+      unsigned long pfn;
-+      struct page *page;
-+#endif
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      IPRINTK("Initialising balloon driver.\n");
-+
-+#ifdef CONFIG_XEN
-+      bs.current_pages = min(xen_start_info->nr_pages, max_pfn);
-+      totalram_pages   = bs.current_pages;
-+#else 
-+      bs.current_pages = totalram_pages; 
-+#endif
-+      bs.target_pages  = bs.current_pages;
-+      bs.balloon_low   = 0;
-+      bs.balloon_high  = 0;
-+      bs.driver_pages  = 0UL;
-+      bs.hard_limit    = ~0UL;
-+
-+      init_timer(&balloon_timer);
-+      balloon_timer.data = 0;
-+      balloon_timer.function = balloon_alarm;
-+    
-+#ifdef CONFIG_PROC_FS
-+      if ((balloon_pde = create_xen_proc_entry("balloon", 0644)) == NULL) {
-+              WPRINTK("Unable to create /proc/xen/balloon.\n");
-+              return -1;
-+      }
-+
-+      balloon_pde->read_proc  = balloon_read;
-+      balloon_pde->write_proc = balloon_write;
-+#endif
-+      balloon_sysfs_init();
-+
-+#if defined(CONFIG_X86) && defined(CONFIG_XEN) 
-+      /* Initialise the balloon with excess memory space. */
-+      for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
-+              page = pfn_to_page(pfn);
-+              if (!PageReserved(page))
-+                      balloon_append(page);
-+      }
-+#endif
-+
-+      target_watch.callback = watch_target;
-+      xenstore_notifier.notifier_call = balloon_init_watcher;
-+
-+      register_xenstore_notifier(&xenstore_notifier);
-+    
-+      return 0;
-+}
-+
-+subsys_initcall(balloon_init);
-+
-+static void __exit balloon_exit(void)
-+{
-+    /* XXX - release balloon here */
-+    return; 
-+}
-+
-+module_exit(balloon_exit); 
-+
-+void balloon_update_driver_allowance(long delta)
-+{
-+      unsigned long flags;
-+
-+      balloon_lock(flags);
-+      bs.driver_pages += delta;
-+      balloon_unlock(flags);
-+}
-+
-+#ifdef CONFIG_XEN
-+static int dealloc_pte_fn(
-+      pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-+{
-+      unsigned long mfn = pte_mfn(*pte);
-+      int ret;
-+      struct xen_memory_reservation reservation = {
-+              .nr_extents   = 1,
-+              .extent_order = 0,
-+              .domid        = DOMID_SELF
-+      };
-+      set_xen_guest_handle(reservation.extent_start, &mfn);
-+      set_pte_at(&init_mm, addr, pte, __pte_ma(0));
-+      set_phys_to_machine(__pa(addr) >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-+      ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
-+      BUG_ON(ret != 1);
-+      return 0;
-+}
-+#endif
-+
-+struct page **alloc_empty_pages_and_pagevec(int nr_pages)
-+{
-+      unsigned long flags;
-+      void *v;
-+      struct page *page, **pagevec;
-+      int i, ret;
-+
-+      pagevec = kmalloc(sizeof(page) * nr_pages, GFP_KERNEL);
-+      if (pagevec == NULL)
-+              return NULL;
-+
-+      for (i = 0; i < nr_pages; i++) {
-+              page = pagevec[i] = alloc_page(GFP_KERNEL|__GFP_COLD);
-+              if (page == NULL)
-+                      goto err;
-+
-+              v = page_address(page);
-+              scrub_pages(v, 1);
-+
-+              balloon_lock(flags);
-+
-+              if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      unsigned long gmfn = page_to_pfn(page);
-+                      struct xen_memory_reservation reservation = {
-+                              .nr_extents   = 1,
-+                              .extent_order = 0,
-+                              .domid        = DOMID_SELF
-+                      };
-+                      set_xen_guest_handle(reservation.extent_start, &gmfn);
-+                      ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                                 &reservation);
-+                      if (ret == 1)
-+                              ret = 0; /* success */
-+              } else {
-+#ifdef CONFIG_XEN
-+                      ret = apply_to_page_range(&init_mm, (unsigned long)v,
-+                                                PAGE_SIZE, dealloc_pte_fn,
-+                                                NULL);
-+#else
-+                      /* Cannot handle non-auto translate mode. */
-+                      ret = 1;
-+#endif
-+              }
-+
-+              if (ret != 0) {
-+                      balloon_unlock(flags);
-+                      balloon_free_page(page);
-+                      goto err;
-+              }
-+
-+              totalram_pages = --bs.current_pages;
-+
-+              balloon_unlock(flags);
-+      }
-+
-+ out:
-+      schedule_work(&balloon_worker);
-+#ifdef CONFIG_XEN
-+      flush_tlb_all();
-+#endif
-+      return pagevec;
-+
-+ err:
-+      balloon_lock(flags);
-+      while (--i >= 0)
-+              balloon_append(pagevec[i]);
-+      balloon_unlock(flags);
-+      kfree(pagevec);
-+      pagevec = NULL;
-+      goto out;
-+}
-+
-+void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages)
-+{
-+      unsigned long flags;
-+      int i;
-+
-+      if (pagevec == NULL)
-+              return;
-+
-+      balloon_lock(flags);
-+      for (i = 0; i < nr_pages; i++) {
-+              BUG_ON(page_count(pagevec[i]) != 1);
-+              balloon_append(pagevec[i]);
-+      }
-+      balloon_unlock(flags);
-+
-+      kfree(pagevec);
-+
-+      schedule_work(&balloon_worker);
-+}
-+
-+void balloon_release_driver_page(struct page *page)
-+{
-+      unsigned long flags;
-+
-+      balloon_lock(flags);
-+      balloon_append(page);
-+      bs.driver_pages--;
-+      balloon_unlock(flags);
-+
-+      schedule_work(&balloon_worker);
-+}
-+
-+EXPORT_SYMBOL_GPL(balloon_update_driver_allowance);
-+EXPORT_SYMBOL_GPL(alloc_empty_pages_and_pagevec);
-+EXPORT_SYMBOL_GPL(free_empty_pages_and_pagevec);
-+EXPORT_SYMBOL_GPL(balloon_release_driver_page);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/balloon/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/balloon/common.h       2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,58 @@
-+/******************************************************************************
-+ * balloon/common.h
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_BALLOON_COMMON_H__
-+#define __XEN_BALLOON_COMMON_H__
-+
-+#define PAGES2KB(_p) ((_p)<<(PAGE_SHIFT-10))
-+
-+struct balloon_stats {
-+      /* We aim for 'current allocation' == 'target allocation'. */
-+      unsigned long current_pages;
-+      unsigned long target_pages;
-+      /* We may hit the hard limit in Xen. If we do then we remember it. */
-+      unsigned long hard_limit;
-+      /*
-+       * Drivers may alter the memory reservation independently, but they
-+       * must inform the balloon driver so we avoid hitting the hard limit.
-+       */
-+      unsigned long driver_pages;
-+      /* Number of pages in high- and low-memory balloons. */
-+      unsigned long balloon_low;
-+      unsigned long balloon_high;
-+};
-+
-+extern struct balloon_stats balloon_stats;
-+#define bs balloon_stats
-+
-+int balloon_sysfs_init(void);
-+void balloon_sysfs_exit(void);
-+
-+void balloon_set_new_target(unsigned long target);
-+
-+#endif /* __XEN_BALLOON_COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/balloon/sysfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/balloon/sysfs.c        2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,170 @@
-+/******************************************************************************
-+ * balloon/sysfs.c
-+ *
-+ * Xen balloon driver - sysfs interfaces.
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/capability.h>
-+#include <linux/errno.h>
-+#include <linux/stat.h>
-+#include <linux/string.h>
-+#include <linux/sysdev.h>
-+#include "common.h"
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+#define BALLOON_CLASS_NAME "xen_memory"
-+
-+#define BALLOON_SHOW(name, format, args...)                   \
-+      static ssize_t show_##name(struct sys_device *dev,      \
-+                                 char *buf)                   \
-+      {                                                       \
-+              return sprintf(buf, format, ##args);            \
-+      }                                                       \
-+      static SYSDEV_ATTR(name, S_IRUGO, show_##name, NULL)
-+
-+BALLOON_SHOW(current_kb, "%lu\n", PAGES2KB(bs.current_pages));
-+BALLOON_SHOW(low_kb, "%lu\n", PAGES2KB(bs.balloon_low));
-+BALLOON_SHOW(high_kb, "%lu\n", PAGES2KB(bs.balloon_high));
-+BALLOON_SHOW(hard_limit_kb,
-+           (bs.hard_limit!=~0UL) ? "%lu\n" : "???\n",
-+           (bs.hard_limit!=~0UL) ? PAGES2KB(bs.hard_limit) : 0);
-+BALLOON_SHOW(driver_kb, "%lu\n", PAGES2KB(bs.driver_pages));
-+
-+static ssize_t show_target_kb(struct sys_device *dev, char *buf)
-+{
-+      return sprintf(buf, "%lu\n", PAGES2KB(bs.target_pages));
-+}
-+
-+static ssize_t store_target_kb(struct sys_device *dev,
-+                             const char *buf,
-+                             size_t count)
-+{
-+      char memstring[64], *endchar;
-+      unsigned long long target_bytes;
-+
-+      if (!capable(CAP_SYS_ADMIN))
-+              return -EPERM;
-+      
-+      if (count <= 1)
-+              return -EBADMSG; /* runt */
-+      if (count > sizeof(memstring))
-+              return -EFBIG;   /* too long */
-+      strcpy(memstring, buf);
-+      
-+      target_bytes = memparse(memstring, &endchar);
-+      balloon_set_new_target(target_bytes >> PAGE_SHIFT);
-+      
-+      return count;
-+}
-+
-+static SYSDEV_ATTR(target_kb, S_IRUGO | S_IWUSR,
-+                 show_target_kb, store_target_kb);
-+
-+static struct sysdev_attribute *balloon_attrs[] = {
-+      &attr_target_kb,
-+};
-+
-+static struct attribute *balloon_info_attrs[] = {
-+      &attr_current_kb.attr,
-+      &attr_low_kb.attr,
-+      &attr_high_kb.attr,
-+      &attr_hard_limit_kb.attr,
-+      &attr_driver_kb.attr,
-+      NULL
-+};
-+
-+static struct attribute_group balloon_info_group = {
-+      .name = "info",
-+      .attrs = balloon_info_attrs,
-+};
-+
-+static struct sysdev_class balloon_sysdev_class = {
-+      set_kset_name(BALLOON_CLASS_NAME),
-+};
-+
-+static struct sys_device balloon_sysdev;
-+
-+static int register_balloon(struct sys_device *sysdev)
-+{
-+      int i, error;
-+
-+      error = sysdev_class_register(&balloon_sysdev_class);
-+      if (error)
-+              return error;
-+
-+      sysdev->id = 0;
-+      sysdev->cls = &balloon_sysdev_class;
-+
-+      error = sysdev_register(sysdev);
-+      if (error) {
-+              sysdev_class_unregister(&balloon_sysdev_class);
-+              return error;
-+      }
-+
-+      for (i = 0; i < ARRAY_SIZE(balloon_attrs); i++) {
-+              error = sysdev_create_file(sysdev, balloon_attrs[i]);
-+              if (error)
-+                      goto fail;
-+      }
-+
-+      error = sysfs_create_group(&sysdev->kobj, &balloon_info_group);
-+      if (error)
-+              goto fail;
-+      
-+      return 0;
-+
-+ fail:
-+      while (--i >= 0)
-+              sysdev_remove_file(sysdev, balloon_attrs[i]);
-+      sysdev_unregister(sysdev);
-+      sysdev_class_unregister(&balloon_sysdev_class);
-+      return error;
-+}
-+
-+static void unregister_balloon(struct sys_device *sysdev)
-+{
-+      int i;
-+
-+      sysfs_remove_group(&sysdev->kobj, &balloon_info_group);
-+      for (i = 0; i < ARRAY_SIZE(balloon_attrs); i++)
-+              sysdev_remove_file(sysdev, balloon_attrs[i]);
-+      sysdev_unregister(sysdev);
-+      sysdev_class_unregister(&balloon_sysdev_class);
-+}
-+
-+int balloon_sysfs_init(void)
-+{
-+      return register_balloon(&balloon_sysdev);
-+}
-+
-+void balloon_sysfs_exit(void)
-+{
-+      unregister_balloon(&balloon_sysdev);
-+}
-Index: head-2008-11-25/drivers/xen/blkback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/Makefile       2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,3 @@
-+obj-$(CONFIG_XEN_BLKDEV_BACKEND) := blkbk.o
-+
-+blkbk-y       := blkback.o xenbus.o interface.o vbd.o
-Index: head-2008-11-25/drivers/xen/blkback/blkback.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/blkback.c      2008-11-10 11:44:21.000000000 +0100
-@@ -0,0 +1,656 @@
-+/******************************************************************************
-+ * arch/xen/drivers/blkif/backend/main.c
-+ * 
-+ * Back-end of the driver for virtual block devices. This portion of the
-+ * driver exports a 'unified' block-device interface that can be accessed
-+ * by any operating system that implements a compatible front end. A 
-+ * reference front-end implementation can be found in:
-+ *  arch/xen/drivers/blkif/frontend
-+ * 
-+ * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
-+ * Copyright (c) 2005, Christopher Clark
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/spinlock.h>
-+#include <linux/kthread.h>
-+#include <linux/list.h>
-+#include <linux/delay.h>
-+#include <xen/balloon.h>
-+#include <asm/hypervisor.h>
-+#include "common.h"
-+
-+/*
-+ * These are rather arbitrary. They are fairly large because adjacent requests
-+ * pulled from a communication ring are quite likely to end up being part of
-+ * the same scatter/gather request at the disc.
-+ * 
-+ * ** TRY INCREASING 'blkif_reqs' IF WRITE SPEEDS SEEM TOO LOW **
-+ * 
-+ * This will increase the chances of being able to write whole tracks.
-+ * 64 should be enough to keep us competitive with Linux.
-+ */
-+static int blkif_reqs = 64;
-+module_param_named(reqs, blkif_reqs, int, 0);
-+MODULE_PARM_DESC(reqs, "Number of blkback requests to allocate");
-+
-+/* Run-time switchable: /sys/module/blkback/parameters/ */
-+static unsigned int log_stats = 0;
-+static unsigned int debug_lvl = 0;
-+module_param(log_stats, int, 0644);
-+module_param(debug_lvl, int, 0644);
-+
-+/*
-+ * Each outstanding request that we've passed to the lower device layers has a 
-+ * 'pending_req' allocated to it. Each buffer_head that completes decrements 
-+ * the pendcnt towards zero. When it hits zero, the specified domain has a 
-+ * response queued for it, with the saved 'id' passed back.
-+ */
-+typedef struct {
-+      blkif_t       *blkif;
-+      u64            id;
-+      int            nr_pages;
-+      atomic_t       pendcnt;
-+      unsigned short operation;
-+      int            status;
-+      struct list_head free_list;
-+} pending_req_t;
-+
-+static pending_req_t *pending_reqs;
-+static struct list_head pending_free;
-+static DEFINE_SPINLOCK(pending_free_lock);
-+static DECLARE_WAIT_QUEUE_HEAD(pending_free_wq);
-+
-+#define BLKBACK_INVALID_HANDLE (~0)
-+
-+static struct page **pending_pages;
-+static grant_handle_t *pending_grant_handles;
-+
-+static inline int vaddr_pagenr(pending_req_t *req, int seg)
-+{
-+      return (req - pending_reqs) * BLKIF_MAX_SEGMENTS_PER_REQUEST + seg;
-+}
-+
-+static inline unsigned long vaddr(pending_req_t *req, int seg)
-+{
-+      unsigned long pfn = page_to_pfn(pending_pages[vaddr_pagenr(req, seg)]);
-+      return (unsigned long)pfn_to_kaddr(pfn);
-+}
-+
-+#define pending_handle(_req, _seg) \
-+      (pending_grant_handles[vaddr_pagenr(_req, _seg)])
-+
-+
-+static int do_block_io_op(blkif_t *blkif);
-+static void dispatch_rw_block_io(blkif_t *blkif,
-+                               blkif_request_t *req,
-+                               pending_req_t *pending_req);
-+static void make_response(blkif_t *blkif, u64 id,
-+                        unsigned short op, int st);
-+
-+/******************************************************************
-+ * misc small helpers
-+ */
-+static pending_req_t* alloc_req(void)
-+{
-+      pending_req_t *req = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+      if (!list_empty(&pending_free)) {
-+              req = list_entry(pending_free.next, pending_req_t, free_list);
-+              list_del(&req->free_list);
-+      }
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+      return req;
-+}
-+
-+static void free_req(pending_req_t *req)
-+{
-+      unsigned long flags;
-+      int was_empty;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+      was_empty = list_empty(&pending_free);
-+      list_add(&req->free_list, &pending_free);
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+      if (was_empty)
-+              wake_up(&pending_free_wq);
-+}
-+
-+static void unplug_queue(blkif_t *blkif)
-+{
-+      if (blkif->plug == NULL)
-+              return;
-+      if (blkif->plug->unplug_fn)
-+              blkif->plug->unplug_fn(blkif->plug);
-+      blk_put_queue(blkif->plug);
-+      blkif->plug = NULL;
-+}
-+
-+static void plug_queue(blkif_t *blkif, struct block_device *bdev)
-+{
-+      request_queue_t *q = bdev_get_queue(bdev);
-+
-+      if (q == blkif->plug)
-+              return;
-+      unplug_queue(blkif);
-+      blk_get_queue(q);
-+      blkif->plug = q;
-+}
-+
-+static void fast_flush_area(pending_req_t *req)
-+{
-+      struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+      unsigned int i, invcount = 0;
-+      grant_handle_t handle;
-+      int ret;
-+
-+      for (i = 0; i < req->nr_pages; i++) {
-+              handle = pending_handle(req, i);
-+              if (handle == BLKBACK_INVALID_HANDLE)
-+                      continue;
-+              gnttab_set_unmap_op(&unmap[invcount], vaddr(req, i),
-+                                  GNTMAP_host_map, handle);
-+              pending_handle(req, i) = BLKBACK_INVALID_HANDLE;
-+              invcount++;
-+      }
-+
-+      ret = HYPERVISOR_grant_table_op(
-+              GNTTABOP_unmap_grant_ref, unmap, invcount);
-+      BUG_ON(ret);
-+}
-+
-+/******************************************************************
-+ * SCHEDULER FUNCTIONS
-+ */
-+
-+static void print_stats(blkif_t *blkif)
-+{
-+      printk(KERN_DEBUG "%s: oo %3d  |  rd %4d  |  wr %4d  |  br %4d\n",
-+             current->comm, blkif->st_oo_req,
-+             blkif->st_rd_req, blkif->st_wr_req, blkif->st_br_req);
-+      blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
-+      blkif->st_rd_req = 0;
-+      blkif->st_wr_req = 0;
-+      blkif->st_oo_req = 0;
-+}
-+
-+int blkif_schedule(void *arg)
-+{
-+      blkif_t *blkif = arg;
-+
-+      blkif_get(blkif);
-+
-+      if (debug_lvl)
-+              printk(KERN_DEBUG "%s: started\n", current->comm);
-+
-+      while (!kthread_should_stop()) {
-+              if (try_to_freeze())
-+                      continue;
-+
-+              wait_event_interruptible(
-+                      blkif->wq,
-+                      blkif->waiting_reqs || kthread_should_stop());
-+              wait_event_interruptible(
-+                      pending_free_wq,
-+                      !list_empty(&pending_free) || kthread_should_stop());
-+
-+              blkif->waiting_reqs = 0;
-+              smp_mb(); /* clear flag *before* checking for work */
-+
-+              if (do_block_io_op(blkif))
-+                      blkif->waiting_reqs = 1;
-+              unplug_queue(blkif);
-+
-+              if (log_stats && time_after(jiffies, blkif->st_print))
-+                      print_stats(blkif);
-+      }
-+
-+      if (log_stats)
-+              print_stats(blkif);
-+      if (debug_lvl)
-+              printk(KERN_DEBUG "%s: exiting\n", current->comm);
-+
-+      blkif->xenblkd = NULL;
-+      blkif_put(blkif);
-+
-+      return 0;
-+}
-+
-+/******************************************************************
-+ * COMPLETION CALLBACK -- Called as bh->b_end_io()
-+ */
-+
-+static void __end_block_io_op(pending_req_t *pending_req, int error)
-+{
-+      /* An error fails the entire request. */
-+      if ((pending_req->operation == BLKIF_OP_WRITE_BARRIER) &&
-+          (error == -EOPNOTSUPP)) {
-+              DPRINTK("blkback: write barrier op failed, not supported\n");
-+              blkback_barrier(XBT_NIL, pending_req->blkif->be, 0);
-+              pending_req->status = BLKIF_RSP_EOPNOTSUPP;
-+      } else if (error) {
-+              DPRINTK("Buffer not up-to-date at end of operation, "
-+                      "error=%d\n", error);
-+              pending_req->status = BLKIF_RSP_ERROR;
-+      }
-+
-+      if (atomic_dec_and_test(&pending_req->pendcnt)) {
-+              fast_flush_area(pending_req);
-+              make_response(pending_req->blkif, pending_req->id,
-+                            pending_req->operation, pending_req->status);
-+              blkif_put(pending_req->blkif);
-+              free_req(pending_req);
-+      }
-+}
-+
-+static int end_block_io_op(struct bio *bio, unsigned int done, int error)
-+{
-+      if (bio->bi_size != 0)
-+              return 1;
-+      __end_block_io_op(bio->bi_private, error);
-+      bio_put(bio);
-+      return error;
-+}
-+
-+
-+/******************************************************************************
-+ * NOTIFICATION FROM GUEST OS.
-+ */
-+
-+static void blkif_notify_work(blkif_t *blkif)
-+{
-+      blkif->waiting_reqs = 1;
-+      wake_up(&blkif->wq);
-+}
-+
-+irqreturn_t blkif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      blkif_notify_work(dev_id);
-+      return IRQ_HANDLED;
-+}
-+
-+
-+
-+/******************************************************************
-+ * DOWNWARD CALLS -- These interface with the block-device layer proper.
-+ */
-+
-+static int do_block_io_op(blkif_t *blkif)
-+{
-+      blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-+      blkif_request_t req;
-+      pending_req_t *pending_req;
-+      RING_IDX rc, rp;
-+      int more_to_do = 0;
-+
-+      rc = blk_rings->common.req_cons;
-+      rp = blk_rings->common.sring->req_prod;
-+      rmb(); /* Ensure we see queued requests up to 'rp'. */
-+
-+      while (rc != rp) {
-+
-+              if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc))
-+                      break;
-+
-+              pending_req = alloc_req();
-+              if (NULL == pending_req) {
-+                      blkif->st_oo_req++;
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              if (kthread_should_stop()) {
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              switch (blkif->blk_protocol) {
-+              case BLKIF_PROTOCOL_NATIVE:
-+                      memcpy(&req, RING_GET_REQUEST(&blk_rings->native, rc), sizeof(req));
-+                      break;
-+              case BLKIF_PROTOCOL_X86_32:
-+                      blkif_get_x86_32_req(&req, RING_GET_REQUEST(&blk_rings->x86_32, rc));
-+                      break;
-+              case BLKIF_PROTOCOL_X86_64:
-+                      blkif_get_x86_64_req(&req, RING_GET_REQUEST(&blk_rings->x86_64, rc));
-+                      break;
-+              default:
-+                      BUG();
-+              }
-+              blk_rings->common.req_cons = ++rc; /* before make_response() */
-+
-+              /* Apply all sanity checks to /private copy/ of request. */
-+              barrier();
-+
-+              switch (req.operation) {
-+              case BLKIF_OP_READ:
-+                      blkif->st_rd_req++;
-+                      dispatch_rw_block_io(blkif, &req, pending_req);
-+                      break;
-+              case BLKIF_OP_WRITE_BARRIER:
-+                      blkif->st_br_req++;
-+                      /* fall through */
-+              case BLKIF_OP_WRITE:
-+                      blkif->st_wr_req++;
-+                      dispatch_rw_block_io(blkif, &req, pending_req);
-+                      break;
-+              default:
-+                      /* A good sign something is wrong: sleep for a while to
-+                       * avoid excessive CPU consumption by a bad guest. */
-+                      msleep(1);
-+                      DPRINTK("error: unknown block io operation [%d]\n",
-+                              req.operation);
-+                      make_response(blkif, req.id, req.operation,
-+                                    BLKIF_RSP_ERROR);
-+                      free_req(pending_req);
-+                      break;
-+              }
-+
-+              /* Yield point for this unbounded loop. */
-+              cond_resched();
-+      }
-+
-+      return more_to_do;
-+}
-+
-+static void dispatch_rw_block_io(blkif_t *blkif,
-+                               blkif_request_t *req,
-+                               pending_req_t *pending_req)
-+{
-+      extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
-+      struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+      struct phys_req preq;
-+      struct { 
-+              unsigned long buf; unsigned int nsec;
-+      } seg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+      unsigned int nseg;
-+      struct bio *bio = NULL;
-+      int ret, i;
-+      int operation;
-+
-+      switch (req->operation) {
-+      case BLKIF_OP_READ:
-+              operation = READ;
-+              break;
-+      case BLKIF_OP_WRITE:
-+              operation = WRITE;
-+              break;
-+      case BLKIF_OP_WRITE_BARRIER:
-+              operation = WRITE_BARRIER;
-+              break;
-+      default:
-+              operation = 0; /* make gcc happy */
-+              BUG();
-+      }
-+
-+      /* Check that number of segments is sane. */
-+      nseg = req->nr_segments;
-+      if (unlikely(nseg == 0 && operation != WRITE_BARRIER) || 
-+          unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST)) {
-+              DPRINTK("Bad number of segments in request (%d)\n", nseg);
-+              goto fail_response;
-+      }
-+
-+      preq.dev           = req->handle;
-+      preq.sector_number = req->sector_number;
-+      preq.nr_sects      = 0;
-+
-+      pending_req->blkif     = blkif;
-+      pending_req->id        = req->id;
-+      pending_req->operation = req->operation;
-+      pending_req->status    = BLKIF_RSP_OKAY;
-+      pending_req->nr_pages  = nseg;
-+
-+      for (i = 0; i < nseg; i++) {
-+              uint32_t flags;
-+
-+              seg[i].nsec = req->seg[i].last_sect -
-+                      req->seg[i].first_sect + 1;
-+
-+              if ((req->seg[i].last_sect >= (PAGE_SIZE >> 9)) ||
-+                  (req->seg[i].last_sect < req->seg[i].first_sect))
-+                      goto fail_response;
-+              preq.nr_sects += seg[i].nsec;
-+
-+              flags = GNTMAP_host_map;
-+              if (operation != READ)
-+                      flags |= GNTMAP_readonly;
-+              gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags,
-+                                req->seg[i].gref, blkif->domid);
-+      }
-+
-+      ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nseg);
-+      BUG_ON(ret);
-+
-+      for (i = 0; i < nseg; i++) {
-+              if (unlikely(map[i].status != 0)) {
-+                      DPRINTK("invalid buffer -- could not remap it\n");
-+                      map[i].handle = BLKBACK_INVALID_HANDLE;
-+                      ret |= 1;
-+              }
-+
-+              pending_handle(pending_req, i) = map[i].handle;
-+
-+              if (ret)
-+                      continue;
-+
-+              set_phys_to_machine(__pa(vaddr(
-+                      pending_req, i)) >> PAGE_SHIFT,
-+                      FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT));
-+              seg[i].buf  = map[i].dev_bus_addr | 
-+                      (req->seg[i].first_sect << 9);
-+      }
-+
-+      if (ret)
-+              goto fail_flush;
-+
-+      if (vbd_translate(&preq, blkif, operation) != 0) {
-+              DPRINTK("access denied: %s of [%llu,%llu] on dev=%04x\n", 
-+                      operation == READ ? "read" : "write",
-+                      preq.sector_number,
-+                      preq.sector_number + preq.nr_sects, preq.dev);
-+              goto fail_flush;
-+      }
-+
-+      plug_queue(blkif, preq.bdev);
-+      atomic_set(&pending_req->pendcnt, 1);
-+      blkif_get(blkif);
-+
-+      for (i = 0; i < nseg; i++) {
-+              if (((int)preq.sector_number|(int)seg[i].nsec) &
-+                  ((bdev_hardsect_size(preq.bdev) >> 9) - 1)) {
-+                      DPRINTK("Misaligned I/O request from domain %d",
-+                              blkif->domid);
-+                      goto fail_put_bio;
-+              }
-+
-+              while ((bio == NULL) ||
-+                     (bio_add_page(bio,
-+                                   virt_to_page(vaddr(pending_req, i)),
-+                                   seg[i].nsec << 9,
-+                                   seg[i].buf & ~PAGE_MASK) == 0)) {
-+                      if (bio) {
-+                              atomic_inc(&pending_req->pendcnt);
-+                              submit_bio(operation, bio);
-+                      }
-+
-+                      bio = bio_alloc(GFP_KERNEL, nseg-i);
-+                      if (unlikely(bio == NULL))
-+                              goto fail_put_bio;
-+
-+                      bio->bi_bdev    = preq.bdev;
-+                      bio->bi_private = pending_req;
-+                      bio->bi_end_io  = end_block_io_op;
-+                      bio->bi_sector  = preq.sector_number;
-+              }
-+
-+              preq.sector_number += seg[i].nsec;
-+      }
-+
-+      if (!bio) {
-+              BUG_ON(operation != WRITE_BARRIER);
-+              bio = bio_alloc(GFP_KERNEL, 0);
-+              if (unlikely(bio == NULL))
-+                      goto fail_put_bio;
-+
-+              bio->bi_bdev    = preq.bdev;
-+              bio->bi_private = pending_req;
-+              bio->bi_end_io  = end_block_io_op;
-+              bio->bi_sector  = -1;
-+      }
-+
-+      submit_bio(operation, bio);
-+
-+      if (operation == READ)
-+              blkif->st_rd_sect += preq.nr_sects;
-+      else if (operation == WRITE || operation == WRITE_BARRIER)
-+              blkif->st_wr_sect += preq.nr_sects;
-+
-+      return;
-+
-+ fail_flush:
-+      fast_flush_area(pending_req);
-+ fail_response:
-+      make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
-+      free_req(pending_req);
-+      msleep(1); /* back off a bit */
-+      return;
-+
-+ fail_put_bio:
-+      __end_block_io_op(pending_req, -EINVAL);
-+      if (bio)
-+              bio_put(bio);
-+      unplug_queue(blkif);
-+      msleep(1); /* back off a bit */
-+      return;
-+}
-+
-+
-+
-+/******************************************************************
-+ * MISCELLANEOUS SETUP / TEARDOWN / DEBUGGING
-+ */
-+
-+
-+static void make_response(blkif_t *blkif, u64 id,
-+                        unsigned short op, int st)
-+{
-+      blkif_response_t  resp;
-+      unsigned long     flags;
-+      blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-+      int more_to_do = 0;
-+      int notify;
-+
-+      resp.id        = id;
-+      resp.operation = op;
-+      resp.status    = st;
-+
-+      spin_lock_irqsave(&blkif->blk_ring_lock, flags);
-+      /* Place on the response ring for the relevant domain. */
-+      switch (blkif->blk_protocol) {
-+      case BLKIF_PROTOCOL_NATIVE:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->native, blk_rings->native.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      case BLKIF_PROTOCOL_X86_32:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->x86_32, blk_rings->x86_32.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      case BLKIF_PROTOCOL_X86_64:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->x86_64, blk_rings->x86_64.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      default:
-+              BUG();
-+      }
-+      blk_rings->common.rsp_prod_pvt++;
-+      RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
-+      if (blk_rings->common.rsp_prod_pvt == blk_rings->common.req_cons) {
-+              /*
-+               * Tail check for pending requests. Allows frontend to avoid
-+               * notifications if requests are already in flight (lower
-+               * overheads and promotes batching).
-+               */
-+              RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
-+
-+      } else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
-+              more_to_do = 1;
-+      }
-+
-+      spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
-+
-+      if (more_to_do)
-+              blkif_notify_work(blkif);
-+      if (notify)
-+              notify_remote_via_irq(blkif->irq);
-+}
-+
-+static int __init blkif_init(void)
-+{
-+      int i, mmap_pages;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      mmap_pages = blkif_reqs * BLKIF_MAX_SEGMENTS_PER_REQUEST;
-+
-+      pending_reqs          = kmalloc(sizeof(pending_reqs[0]) *
-+                                      blkif_reqs, GFP_KERNEL);
-+      pending_grant_handles = kmalloc(sizeof(pending_grant_handles[0]) *
-+                                      mmap_pages, GFP_KERNEL);
-+      pending_pages         = alloc_empty_pages_and_pagevec(mmap_pages);
-+
-+      if (!pending_reqs || !pending_grant_handles || !pending_pages)
-+              goto out_of_memory;
-+
-+      for (i = 0; i < mmap_pages; i++)
-+              pending_grant_handles[i] = BLKBACK_INVALID_HANDLE;
-+
-+      blkif_interface_init();
-+
-+      memset(pending_reqs, 0, sizeof(pending_reqs));
-+      INIT_LIST_HEAD(&pending_free);
-+
-+      for (i = 0; i < blkif_reqs; i++)
-+              list_add_tail(&pending_reqs[i].free_list, &pending_free);
-+
-+      blkif_xenbus_init();
-+
-+      return 0;
-+
-+ out_of_memory:
-+      kfree(pending_reqs);
-+      kfree(pending_grant_handles);
-+      free_empty_pages_and_pagevec(pending_pages, mmap_pages);
-+      printk("%s: out of memory\n", __FUNCTION__);
-+      return -ENOMEM;
-+}
-+
-+module_init(blkif_init);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/blkback/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/common.h       2008-05-08 14:02:04.000000000 +0200
-@@ -0,0 +1,139 @@
-+/* 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __BLKIF__BACKEND__COMMON_H__
-+#define __BLKIF__BACKEND__COMMON_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <linux/wait.h>
-+#include <asm/io.h>
-+#include <asm/setup.h>
-+#include <asm/pgalloc.h>
-+#include <xen/evtchn.h>
-+#include <asm/hypervisor.h>
-+#include <xen/blkif.h>
-+#include <xen/gnttab.h>
-+#include <xen/driver_util.h>
-+#include <xen/xenbus.h>
-+
-+#define DPRINTK(_f, _a...)                    \
-+      pr_debug("(file=%s, line=%d) " _f,      \
-+               __FILE__ , __LINE__ , ## _a )
-+
-+struct vbd {
-+      blkif_vdev_t   handle;      /* what the domain refers to this vbd as */
-+      unsigned char  readonly;    /* Non-zero -> read-only */
-+      unsigned char  type;        /* VDISK_xxx */
-+      u32            pdevice;     /* phys device that this vbd maps to */
-+      struct block_device *bdev;
-+};
-+
-+struct backend_info;
-+
-+typedef struct blkif_st {
-+      /* Unique identifier for this interface. */
-+      domid_t           domid;
-+      unsigned int      handle;
-+      /* Physical parameters of the comms window. */
-+      unsigned int      irq;
-+      /* Comms information. */
-+      enum blkif_protocol blk_protocol;
-+      blkif_back_rings_t blk_rings;
-+      struct vm_struct *blk_ring_area;
-+      /* The VBD attached to this interface. */
-+      struct vbd        vbd;
-+      /* Back pointer to the backend_info. */
-+      struct backend_info *be;
-+      /* Private fields. */
-+      spinlock_t       blk_ring_lock;
-+      atomic_t         refcnt;
-+
-+      wait_queue_head_t   wq;
-+      struct task_struct  *xenblkd;
-+      unsigned int        waiting_reqs;
-+      request_queue_t     *plug;
-+
-+      /* statistics */
-+      unsigned long       st_print;
-+      int                 st_rd_req;
-+      int                 st_wr_req;
-+      int                 st_oo_req;
-+      int                 st_br_req;
-+      int                 st_rd_sect;
-+      int                 st_wr_sect;
-+
-+      wait_queue_head_t waiting_to_free;
-+
-+      grant_handle_t shmem_handle;
-+      grant_ref_t    shmem_ref;
-+} blkif_t;
-+
-+blkif_t *blkif_alloc(domid_t domid);
-+void blkif_disconnect(blkif_t *blkif);
-+void blkif_free(blkif_t *blkif);
-+int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn);
-+
-+#define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
-+#define blkif_put(_b)                                 \
-+      do {                                            \
-+              if (atomic_dec_and_test(&(_b)->refcnt)) \
-+                      wake_up(&(_b)->waiting_to_free);\
-+      } while (0)
-+
-+/* Create a vbd. */
-+int vbd_create(blkif_t *blkif, blkif_vdev_t vdevice, unsigned major,
-+             unsigned minor, int readonly, int cdrom);
-+void vbd_free(struct vbd *vbd);
-+
-+unsigned long long vbd_size(struct vbd *vbd);
-+unsigned int vbd_info(struct vbd *vbd);
-+unsigned long vbd_secsize(struct vbd *vbd);
-+
-+struct phys_req {
-+      unsigned short       dev;
-+      unsigned short       nr_sects;
-+      struct block_device *bdev;
-+      blkif_sector_t       sector_number;
-+};
-+
-+int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation);
-+
-+void blkif_interface_init(void);
-+
-+void blkif_xenbus_init(void);
-+
-+irqreturn_t blkif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-+int blkif_schedule(void *arg);
-+
-+int blkback_barrier(struct xenbus_transaction xbt,
-+                  struct backend_info *be, int state);
-+
-+#endif /* __BLKIF__BACKEND__COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/blkback/interface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/interface.c    2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,181 @@
-+/******************************************************************************
-+ * arch/xen/drivers/blkif/backend/interface.c
-+ * 
-+ * Block-device interface management.
-+ * 
-+ * Copyright (c) 2004, Keir Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include "common.h"
-+#include <xen/evtchn.h>
-+#include <linux/kthread.h>
-+
-+static kmem_cache_t *blkif_cachep;
-+
-+blkif_t *blkif_alloc(domid_t domid)
-+{
-+      blkif_t *blkif;
-+
-+      blkif = kmem_cache_alloc(blkif_cachep, GFP_KERNEL);
-+      if (!blkif)
-+              return ERR_PTR(-ENOMEM);
-+
-+      memset(blkif, 0, sizeof(*blkif));
-+      blkif->domid = domid;
-+      spin_lock_init(&blkif->blk_ring_lock);
-+      atomic_set(&blkif->refcnt, 1);
-+      init_waitqueue_head(&blkif->wq);
-+      blkif->st_print = jiffies;
-+      init_waitqueue_head(&blkif->waiting_to_free);
-+
-+      return blkif;
-+}
-+
-+static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
-+{
-+      struct gnttab_map_grant_ref op;
-+
-+      gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-+                        GNTMAP_host_map, shared_page, blkif->domid);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status) {
-+              DPRINTK(" Grant table operation failure !\n");
-+              return op.status;
-+      }
-+
-+      blkif->shmem_ref = shared_page;
-+      blkif->shmem_handle = op.handle;
-+
-+      return 0;
-+}
-+
-+static void unmap_frontend_page(blkif_t *blkif)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-+                          GNTMAP_host_map, blkif->shmem_handle);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+}
-+
-+int blkif_map(blkif_t *blkif, unsigned long shared_page, unsigned int evtchn)
-+{
-+      int err;
-+
-+      /* Already connected through? */
-+      if (blkif->irq)
-+              return 0;
-+
-+      if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
-+              return -ENOMEM;
-+
-+      err = map_frontend_page(blkif, shared_page);
-+      if (err) {
-+              free_vm_area(blkif->blk_ring_area);
-+              return err;
-+      }
-+
-+      switch (blkif->blk_protocol) {
-+      case BLKIF_PROTOCOL_NATIVE:
-+      {
-+              blkif_sring_t *sring;
-+              sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
-+              break;
-+      }
-+      case BLKIF_PROTOCOL_X86_32:
-+      {
-+              blkif_x86_32_sring_t *sring_x86_32;
-+              sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
-+              break;
-+      }
-+      case BLKIF_PROTOCOL_X86_64:
-+      {
-+              blkif_x86_64_sring_t *sring_x86_64;
-+              sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
-+              break;
-+      }
-+      default:
-+              BUG();
-+      }
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+              blkif->domid, evtchn, blkif_be_int, 0, "blkif-backend", blkif);
-+      if (err < 0)
-+      {
-+              unmap_frontend_page(blkif);
-+              free_vm_area(blkif->blk_ring_area);
-+              blkif->blk_rings.common.sring = NULL;
-+              return err;
-+      }
-+      blkif->irq = err;
-+
-+      return 0;
-+}
-+
-+void blkif_disconnect(blkif_t *blkif)
-+{
-+      if (blkif->xenblkd) {
-+              kthread_stop(blkif->xenblkd);
-+              blkif->xenblkd = NULL;
-+      }
-+
-+      atomic_dec(&blkif->refcnt);
-+      wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0);
-+      atomic_inc(&blkif->refcnt);
-+
-+      if (blkif->irq) {
-+              unbind_from_irqhandler(blkif->irq, blkif);
-+              blkif->irq = 0;
-+      }
-+
-+      if (blkif->blk_rings.common.sring) {
-+              unmap_frontend_page(blkif);
-+              free_vm_area(blkif->blk_ring_area);
-+              blkif->blk_rings.common.sring = NULL;
-+      }
-+}
-+
-+void blkif_free(blkif_t *blkif)
-+{
-+      if (!atomic_dec_and_test(&blkif->refcnt))
-+              BUG();
-+      kmem_cache_free(blkif_cachep, blkif);
-+}
-+
-+void __init blkif_interface_init(void)
-+{
-+      blkif_cachep = kmem_cache_create("blkif_cache", sizeof(blkif_t), 
-+                                       0, 0, NULL, NULL);
-+}
-Index: head-2008-11-25/drivers/xen/blkback/vbd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/vbd.c  2008-05-08 14:02:04.000000000 +0200
-@@ -0,0 +1,118 @@
-+/******************************************************************************
-+ * blkback/vbd.c
-+ * 
-+ * Routines for managing virtual block devices (VBDs).
-+ * 
-+ * Copyright (c) 2003-2005, Keir Fraser & Steve Hand
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include "common.h"
-+
-+#define vbd_sz(_v)   ((_v)->bdev->bd_part ?                           \
-+      (_v)->bdev->bd_part->nr_sects : (_v)->bdev->bd_disk->capacity)
-+
-+unsigned long long vbd_size(struct vbd *vbd)
-+{
-+      return vbd_sz(vbd);
-+}
-+
-+unsigned int vbd_info(struct vbd *vbd)
-+{
-+      return vbd->type | (vbd->readonly?VDISK_READONLY:0);
-+}
-+
-+unsigned long vbd_secsize(struct vbd *vbd)
-+{
-+      return bdev_hardsect_size(vbd->bdev);
-+}
-+
-+int vbd_create(blkif_t *blkif, blkif_vdev_t handle, unsigned major,
-+             unsigned minor, int readonly, int cdrom)
-+{
-+      struct vbd *vbd;
-+      struct block_device *bdev;
-+
-+      vbd = &blkif->vbd;
-+      vbd->handle   = handle; 
-+      vbd->readonly = readonly;
-+      vbd->type     = 0;
-+
-+      vbd->pdevice  = MKDEV(major, minor);
-+
-+      bdev = open_by_devnum(vbd->pdevice,
-+                            vbd->readonly ? FMODE_READ : FMODE_WRITE);
-+
-+      if (IS_ERR(bdev)) {
-+              DPRINTK("vbd_creat: device %08x could not be opened.\n",
-+                      vbd->pdevice);
-+              return -ENOENT;
-+      }
-+
-+      vbd->bdev = bdev;
-+
-+      if (vbd->bdev->bd_disk == NULL) {
-+              DPRINTK("vbd_creat: device %08x doesn't exist.\n",
-+                      vbd->pdevice);
-+              vbd_free(vbd);
-+              return -ENOENT;
-+      }
-+
-+      if (vbd->bdev->bd_disk->flags & GENHD_FL_CD || cdrom)
-+              vbd->type |= VDISK_CDROM;
-+      if (vbd->bdev->bd_disk->flags & GENHD_FL_REMOVABLE)
-+              vbd->type |= VDISK_REMOVABLE;
-+
-+      DPRINTK("Successful creation of handle=%04x (dom=%u)\n",
-+              handle, blkif->domid);
-+      return 0;
-+}
-+
-+void vbd_free(struct vbd *vbd)
-+{
-+      if (vbd->bdev)
-+              blkdev_put(vbd->bdev);
-+      vbd->bdev = NULL;
-+}
-+
-+int vbd_translate(struct phys_req *req, blkif_t *blkif, int operation)
-+{
-+      struct vbd *vbd = &blkif->vbd;
-+      int rc = -EACCES;
-+
-+      if ((operation != READ) && vbd->readonly)
-+              goto out;
-+
-+      if (unlikely((req->sector_number + req->nr_sects) > vbd_sz(vbd)))
-+              goto out;
-+
-+      req->dev  = vbd->pdevice;
-+      req->bdev = vbd->bdev;
-+      rc = 0;
-+
-+ out:
-+      return rc;
-+}
-Index: head-2008-11-25/drivers/xen/blkback/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkback/xenbus.c       2008-05-08 14:02:04.000000000 +0200
-@@ -0,0 +1,541 @@
-+/*  Xenbus code for blkif backend
-+    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-+    Copyright (C) 2005 XenSource Ltd
-+
-+    This program is free software; you can redistribute it and/or modify
-+    it under the terms of the GNU General Public License as published by
-+    the Free Software Foundation; either version 2 of the License, or
-+    (at your option) any later version.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+*/
-+
-+#include <stdarg.h>
-+#include <linux/module.h>
-+#include <linux/kthread.h>
-+#include "common.h"
-+
-+#undef DPRINTK
-+#define DPRINTK(fmt, args...)                         \
-+      pr_debug("blkback/xenbus (%s:%d) " fmt ".\n",   \
-+               __FUNCTION__, __LINE__, ##args)
-+
-+struct backend_info
-+{
-+      struct xenbus_device *dev;
-+      blkif_t *blkif;
-+      struct xenbus_watch backend_watch;
-+      unsigned major;
-+      unsigned minor;
-+      char *mode;
-+};
-+
-+static void connect(struct backend_info *);
-+static int connect_ring(struct backend_info *);
-+static void backend_changed(struct xenbus_watch *, const char **,
-+                          unsigned int);
-+
-+static int blkback_name(blkif_t *blkif, char *buf)
-+{
-+      char *devpath, *devname;
-+      struct xenbus_device *dev = blkif->be->dev;
-+
-+      devpath = xenbus_read(XBT_NIL, dev->nodename, "dev", NULL);
-+      if (IS_ERR(devpath)) 
-+              return PTR_ERR(devpath);
-+      
-+      if ((devname = strstr(devpath, "/dev/")) != NULL)
-+              devname += strlen("/dev/");
-+      else
-+              devname  = devpath;
-+
-+      snprintf(buf, TASK_COMM_LEN, "blkback.%d.%s", blkif->domid, devname);
-+      kfree(devpath);
-+      
-+      return 0;
-+}
-+
-+static void update_blkif_status(blkif_t *blkif)
-+{ 
-+      int err;
-+      char name[TASK_COMM_LEN];
-+
-+      /* Not ready to connect? */
-+      if (!blkif->irq || !blkif->vbd.bdev)
-+              return;
-+
-+      /* Already connected? */
-+      if (blkif->be->dev->state == XenbusStateConnected)
-+              return;
-+
-+      /* Attempt to connect: exit if we fail to. */
-+      connect(blkif->be);
-+      if (blkif->be->dev->state != XenbusStateConnected)
-+              return;
-+
-+      err = blkback_name(blkif, name);
-+      if (err) {
-+              xenbus_dev_error(blkif->be->dev, err, "get blkback dev name");
-+              return;
-+      }
-+
-+      blkif->xenblkd = kthread_run(blkif_schedule, blkif, name);
-+      if (IS_ERR(blkif->xenblkd)) {
-+              err = PTR_ERR(blkif->xenblkd);
-+              blkif->xenblkd = NULL;
-+              xenbus_dev_error(blkif->be->dev, err, "start xenblkd");
-+      }
-+}
-+
-+
-+/****************************************************************
-+ *  sysfs interface for VBD I/O requests
-+ */
-+
-+#define VBD_SHOW(name, format, args...)                                       \
-+      static ssize_t show_##name(struct device *_dev,                 \
-+                                 struct device_attribute *attr,       \
-+                                 char *buf)                           \
-+      {                                                               \
-+              struct xenbus_device *dev = to_xenbus_device(_dev);     \
-+              struct backend_info *be = dev->dev.driver_data;         \
-+                                                                      \
-+              return sprintf(buf, format, ##args);                    \
-+      }                                                               \
-+      static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
-+
-+VBD_SHOW(oo_req,  "%d\n", be->blkif->st_oo_req);
-+VBD_SHOW(rd_req,  "%d\n", be->blkif->st_rd_req);
-+VBD_SHOW(wr_req,  "%d\n", be->blkif->st_wr_req);
-+VBD_SHOW(br_req,  "%d\n", be->blkif->st_br_req);
-+VBD_SHOW(rd_sect, "%d\n", be->blkif->st_rd_sect);
-+VBD_SHOW(wr_sect, "%d\n", be->blkif->st_wr_sect);
-+
-+static struct attribute *vbdstat_attrs[] = {
-+      &dev_attr_oo_req.attr,
-+      &dev_attr_rd_req.attr,
-+      &dev_attr_wr_req.attr,
-+      &dev_attr_br_req.attr,
-+      &dev_attr_rd_sect.attr,
-+      &dev_attr_wr_sect.attr,
-+      NULL
-+};
-+
-+static struct attribute_group vbdstat_group = {
-+      .name = "statistics",
-+      .attrs = vbdstat_attrs,
-+};
-+
-+VBD_SHOW(physical_device, "%x:%x\n", be->major, be->minor);
-+VBD_SHOW(mode, "%s\n", be->mode);
-+
-+int xenvbd_sysfs_addif(struct xenbus_device *dev)
-+{
-+      int error;
-+      
-+      error = device_create_file(&dev->dev, &dev_attr_physical_device);
-+      if (error)
-+              goto fail1;
-+
-+      error = device_create_file(&dev->dev, &dev_attr_mode);
-+      if (error)
-+              goto fail2;
-+
-+      error = sysfs_create_group(&dev->dev.kobj, &vbdstat_group);
-+      if (error)
-+              goto fail3;
-+
-+      return 0;
-+
-+fail3:        sysfs_remove_group(&dev->dev.kobj, &vbdstat_group);
-+fail2:        device_remove_file(&dev->dev, &dev_attr_mode);
-+fail1:        device_remove_file(&dev->dev, &dev_attr_physical_device);
-+      return error;
-+}
-+
-+void xenvbd_sysfs_delif(struct xenbus_device *dev)
-+{
-+      sysfs_remove_group(&dev->dev.kobj, &vbdstat_group);
-+      device_remove_file(&dev->dev, &dev_attr_mode);
-+      device_remove_file(&dev->dev, &dev_attr_physical_device);
-+}
-+
-+static int blkback_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      DPRINTK("");
-+
-+      if (be->major || be->minor)
-+              xenvbd_sysfs_delif(dev);
-+
-+      if (be->backend_watch.node) {
-+              unregister_xenbus_watch(&be->backend_watch);
-+              kfree(be->backend_watch.node);
-+              be->backend_watch.node = NULL;
-+      }
-+
-+      if (be->blkif) {
-+              blkif_disconnect(be->blkif);
-+              vbd_free(&be->blkif->vbd);
-+              blkif_free(be->blkif);
-+              be->blkif = NULL;
-+      }
-+
-+      kfree(be);
-+      dev->dev.driver_data = NULL;
-+      return 0;
-+}
-+
-+int blkback_barrier(struct xenbus_transaction xbt,
-+                  struct backend_info *be, int state)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      int err;
-+
-+      err = xenbus_printf(xbt, dev->nodename, "feature-barrier",
-+                          "%d", state);
-+      if (err)
-+              xenbus_dev_fatal(dev, err, "writing feature-barrier");
-+
-+      return err;
-+}
-+
-+/**
-+ * Entry point to this code when a new device is created.  Allocate the basic
-+ * structures, and watch the store waiting for the hotplug scripts to tell us
-+ * the device's physical major and minor numbers.  Switch to InitWait.
-+ */
-+static int blkback_probe(struct xenbus_device *dev,
-+                       const struct xenbus_device_id *id)
-+{
-+      int err;
-+      struct backend_info *be = kzalloc(sizeof(struct backend_info),
-+                                        GFP_KERNEL);
-+      if (!be) {
-+              xenbus_dev_fatal(dev, -ENOMEM,
-+                               "allocating backend structure");
-+              return -ENOMEM;
-+      }
-+      be->dev = dev;
-+      dev->dev.driver_data = be;
-+
-+      be->blkif = blkif_alloc(dev->otherend_id);
-+      if (IS_ERR(be->blkif)) {
-+              err = PTR_ERR(be->blkif);
-+              be->blkif = NULL;
-+              xenbus_dev_fatal(dev, err, "creating block interface");
-+              goto fail;
-+      }
-+
-+      /* setup back pointer */
-+      be->blkif->be = be;
-+
-+      err = xenbus_watch_path2(dev, dev->nodename, "physical-device",
-+                               &be->backend_watch, backend_changed);
-+      if (err)
-+              goto fail;
-+
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err)
-+              goto fail;
-+
-+      return 0;
-+
-+fail:
-+      DPRINTK("failed");
-+      blkback_remove(dev);
-+      return err;
-+}
-+
-+
-+/**
-+ * Callback received when the hotplug scripts have placed the physical-device
-+ * node.  Read it and the mode node, and create a vbd.  If the frontend is
-+ * ready, connect.
-+ */
-+static void backend_changed(struct xenbus_watch *watch,
-+                          const char **vec, unsigned int len)
-+{
-+      int err;
-+      unsigned major;
-+      unsigned minor;
-+      struct backend_info *be
-+              = container_of(watch, struct backend_info, backend_watch);
-+      struct xenbus_device *dev = be->dev;
-+      int cdrom = 0;
-+      char *device_type;
-+
-+      DPRINTK("");
-+
-+      err = xenbus_scanf(XBT_NIL, dev->nodename, "physical-device", "%x:%x",
-+                         &major, &minor);
-+      if (XENBUS_EXIST_ERR(err)) {
-+              /* Since this watch will fire once immediately after it is
-+                 registered, we expect this.  Ignore it, and wait for the
-+                 hotplug scripts. */
-+              return;
-+      }
-+      if (err != 2) {
-+              xenbus_dev_fatal(dev, err, "reading physical-device");
-+              return;
-+      }
-+
-+      if ((be->major || be->minor) &&
-+          ((be->major != major) || (be->minor != minor))) {
-+              printk(KERN_WARNING
-+                     "blkback: changing physical device (from %x:%x to "
-+                     "%x:%x) not supported.\n", be->major, be->minor,
-+                     major, minor);
-+              return;
-+      }
-+
-+      be->mode = xenbus_read(XBT_NIL, dev->nodename, "mode", NULL);
-+      if (IS_ERR(be->mode)) {
-+              err = PTR_ERR(be->mode);
-+              be->mode = NULL;
-+              xenbus_dev_fatal(dev, err, "reading mode");
-+              return;
-+      }
-+
-+      device_type = xenbus_read(XBT_NIL, dev->otherend, "device-type", NULL);
-+      if (!IS_ERR(device_type)) {
-+              cdrom = strcmp(device_type, "cdrom") == 0;
-+              kfree(device_type);
-+      }
-+
-+      if (be->major == 0 && be->minor == 0) {
-+              /* Front end dir is a number, which is used as the handle. */
-+
-+              char *p = strrchr(dev->otherend, '/') + 1;
-+              long handle = simple_strtoul(p, NULL, 0);
-+
-+              be->major = major;
-+              be->minor = minor;
-+
-+              err = vbd_create(be->blkif, handle, major, minor,
-+                               (NULL == strchr(be->mode, 'w')), cdrom);
-+              if (err) {
-+                      be->major = be->minor = 0;
-+                      xenbus_dev_fatal(dev, err, "creating vbd structure");
-+                      return;
-+              }
-+
-+              err = xenvbd_sysfs_addif(dev);
-+              if (err) {
-+                      vbd_free(&be->blkif->vbd);
-+                      be->major = be->minor = 0;
-+                      xenbus_dev_fatal(dev, err, "creating sysfs entries");
-+                      return;
-+              }
-+
-+              /* We're potentially connected now */
-+              update_blkif_status(be->blkif);
-+      }
-+}
-+
-+
-+/**
-+ * Callback received when the frontend's state changes.
-+ */
-+static void frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+      int err;
-+
-+      DPRINTK("%s", xenbus_strstate(frontend_state));
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+              if (dev->state == XenbusStateClosed) {
-+                      printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-+                             __FUNCTION__, dev->nodename);
-+                      xenbus_switch_state(dev, XenbusStateInitWait);
-+              }
-+              break;
-+
-+      case XenbusStateInitialised:
-+      case XenbusStateConnected:
-+              /* Ensure we connect even when two watches fire in 
-+                 close successsion and we miss the intermediate value 
-+                 of frontend_state. */
-+              if (dev->state == XenbusStateConnected)
-+                      break;
-+
-+              err = connect_ring(be);
-+              if (err)
-+                      break;
-+              update_blkif_status(be->blkif);
-+              break;
-+
-+      case XenbusStateClosing:
-+              blkif_disconnect(be->blkif);
-+              xenbus_switch_state(dev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateClosed:
-+              xenbus_switch_state(dev, XenbusStateClosed);
-+              if (xenbus_dev_is_online(dev))
-+                      break;
-+              /* fall through if not online */
-+      case XenbusStateUnknown:
-+              device_unregister(&dev->dev);
-+              break;
-+
-+      default:
-+              xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-+                               frontend_state);
-+              break;
-+      }
-+}
-+
-+
-+/* ** Connection ** */
-+
-+
-+/**
-+ * Write the physical details regarding the block device to the store, and
-+ * switch to Connected state.
-+ */
-+static void connect(struct backend_info *be)
-+{
-+      struct xenbus_transaction xbt;
-+      int err;
-+      struct xenbus_device *dev = be->dev;
-+
-+      DPRINTK("%s", dev->otherend);
-+
-+      /* Supply the information about the device the frontend needs */
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "starting transaction");
-+              return;
-+      }
-+
-+      err = blkback_barrier(xbt, be, 1);
-+      if (err)
-+              goto abort;
-+
-+      err = xenbus_printf(xbt, dev->nodename, "sectors", "%llu",
-+                          vbd_size(&be->blkif->vbd));
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "writing %s/sectors",
-+                               dev->nodename);
-+              goto abort;
-+      }
-+
-+      /* FIXME: use a typename instead */
-+      err = xenbus_printf(xbt, dev->nodename, "info", "%u",
-+                          vbd_info(&be->blkif->vbd));
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "writing %s/info",
-+                               dev->nodename);
-+              goto abort;
-+      }
-+      err = xenbus_printf(xbt, dev->nodename, "sector-size", "%lu",
-+                          vbd_secsize(&be->blkif->vbd));
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "writing %s/sector-size",
-+                               dev->nodename);
-+              goto abort;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err == -EAGAIN)
-+              goto again;
-+      if (err)
-+              xenbus_dev_fatal(dev, err, "ending transaction");
-+
-+      err = xenbus_switch_state(dev, XenbusStateConnected);
-+      if (err)
-+              xenbus_dev_fatal(dev, err, "switching to Connected state",
-+                               dev->nodename);
-+
-+      return;
-+ abort:
-+      xenbus_transaction_end(xbt, 1);
-+}
-+
-+
-+static int connect_ring(struct backend_info *be)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long ring_ref;
-+      unsigned int evtchn;
-+      char protocol[64] = "";
-+      int err;
-+
-+      DPRINTK("%s", dev->otherend);
-+
-+      err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", &ring_ref,
-+                          "event-channel", "%u", &evtchn, NULL);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err,
-+                               "reading %s/ring-ref and event-channel",
-+                               dev->otherend);
-+              return err;
-+      }
-+
-+      be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-+      err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
-+                          "%63s", protocol, NULL);
-+      if (err)
-+              strcpy(protocol, "unspecified, assuming native");
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32;
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_64))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64;
-+      else {
-+              xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
-+              return -1;
-+      }
-+      printk(KERN_INFO
-+             "blkback: ring-ref %ld, event-channel %d, protocol %d (%s)\n",
-+             ring_ref, evtchn, be->blkif->blk_protocol, protocol);
-+
-+      /* Map the shared frame, irq etc. */
-+      err = blkif_map(be->blkif, ring_ref, evtchn);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u",
-+                               ring_ref, evtchn);
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/* ** Driver Registration ** */
-+
-+
-+static const struct xenbus_device_id blkback_ids[] = {
-+      { "vbd" },
-+      { "" }
-+};
-+
-+
-+static struct xenbus_driver blkback = {
-+      .name = "vbd",
-+      .owner = THIS_MODULE,
-+      .ids = blkback_ids,
-+      .probe = blkback_probe,
-+      .remove = blkback_remove,
-+      .otherend_changed = frontend_changed
-+};
-+
-+
-+void blkif_xenbus_init(void)
-+{
-+      xenbus_register_backend(&blkback);
-+}
-Index: head-2008-11-25/drivers/xen/blkfront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkfront/Makefile      2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,5 @@
-+
-+obj-$(CONFIG_XEN_BLKDEV_FRONTEND)     := xenblk.o
-+
-+xenblk-objs := blkfront.o vbd.o
-+
-Index: head-2008-11-25/drivers/xen/blkfront/blkfront.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkfront/blkfront.c    2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,936 @@
-+/******************************************************************************
-+ * blkfront.c
-+ * 
-+ * XenLinux virtual block-device driver.
-+ * 
-+ * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
-+ * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
-+ * Copyright (c) 2004, Christian Limpach
-+ * Copyright (c) 2004, Andrew Warfield
-+ * Copyright (c) 2005, Christopher Clark
-+ * Copyright (c) 2005, XenSource Ltd
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/version.h>
-+#include "block.h"
-+#include <linux/cdrom.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <scsi/scsi.h>
-+#include <xen/evtchn.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/interface/io/protocols.h>
-+#include <xen/gnttab.h>
-+#include <asm/hypervisor.h>
-+#include <asm/maddr.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+#define BLKIF_STATE_DISCONNECTED 0
-+#define BLKIF_STATE_CONNECTED    1
-+#define BLKIF_STATE_SUSPENDED    2
-+
-+#define MAXIMUM_OUTSTANDING_BLOCK_REQS \
-+    (BLKIF_MAX_SEGMENTS_PER_REQUEST * BLK_RING_SIZE)
-+#define GRANT_INVALID_REF     0
-+
-+static void connect(struct blkfront_info *);
-+static void blkfront_closing(struct xenbus_device *);
-+static int blkfront_remove(struct xenbus_device *);
-+static int talk_to_backend(struct xenbus_device *, struct blkfront_info *);
-+static int setup_blkring(struct xenbus_device *, struct blkfront_info *);
-+
-+static void kick_pending_request_queues(struct blkfront_info *);
-+
-+static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs);
-+static void blkif_restart_queue(void *arg);
-+static void blkif_recover(struct blkfront_info *);
-+static void blkif_completion(struct blk_shadow *);
-+static void blkif_free(struct blkfront_info *, int);
-+
-+
-+/**
-+ * Entry point to this code when a new device is created.  Allocate the basic
-+ * structures and the ring buffer for communication with the backend, and
-+ * inform the backend of the appropriate details for those.  Switch to
-+ * Initialised state.
-+ */
-+static int blkfront_probe(struct xenbus_device *dev,
-+                        const struct xenbus_device_id *id)
-+{
-+      int err, vdevice, i;
-+      struct blkfront_info *info;
-+
-+      /* FIXME: Use dynamic device id if this is not set. */
-+      err = xenbus_scanf(XBT_NIL, dev->nodename,
-+                         "virtual-device", "%i", &vdevice);
-+      if (err != 1) {
-+              /* go looking in the extended area instead */
-+              err = xenbus_scanf(XBT_NIL, dev->nodename, "virtual-device-ext",
-+                      "%i", &vdevice);
-+              if (err != 1) {
-+                      xenbus_dev_fatal(dev, err, "reading virtual-device");
-+                      return err;
-+              }
-+      }
-+
-+      info = kzalloc(sizeof(*info), GFP_KERNEL);
-+      if (!info) {
-+              xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-+              return -ENOMEM;
-+      }
-+
-+      info->xbdev = dev;
-+      info->vdevice = vdevice;
-+      info->connected = BLKIF_STATE_DISCONNECTED;
-+      INIT_WORK(&info->work, blkif_restart_queue, (void *)info);
-+
-+      for (i = 0; i < BLK_RING_SIZE; i++)
-+              info->shadow[i].req.id = i+1;
-+      info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff;
-+
-+      /* Front end dir is a number, which is used as the id. */
-+      info->handle = simple_strtoul(strrchr(dev->nodename,'/')+1, NULL, 0);
-+      dev->dev.driver_data = info;
-+
-+      err = talk_to_backend(dev, info);
-+      if (err) {
-+              kfree(info);
-+              dev->dev.driver_data = NULL;
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/**
-+ * We are reconnecting to the backend, due to a suspend/resume, or a backend
-+ * driver restart.  We tear down our blkif structure and recreate it, but
-+ * leave the device-layer structures intact so that this is transparent to the
-+ * rest of the kernel.
-+ */
-+static int blkfront_resume(struct xenbus_device *dev)
-+{
-+      struct blkfront_info *info = dev->dev.driver_data;
-+      int err;
-+
-+      DPRINTK("blkfront_resume: %s\n", dev->nodename);
-+
-+      blkif_free(info, info->connected == BLKIF_STATE_CONNECTED);
-+
-+      err = talk_to_backend(dev, info);
-+      if (info->connected == BLKIF_STATE_SUSPENDED && !err)
-+              blkif_recover(info);
-+
-+      return err;
-+}
-+
-+
-+/* Common code used when first setting up, and when resuming. */
-+static int talk_to_backend(struct xenbus_device *dev,
-+                         struct blkfront_info *info)
-+{
-+      const char *message = NULL;
-+      struct xenbus_transaction xbt;
-+      int err;
-+
-+      /* Create shared ring, alloc event channel. */
-+      err = setup_blkring(dev, info);
-+      if (err)
-+              goto out;
-+
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "starting transaction");
-+              goto destroy_blkring;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename,
-+                          "ring-ref","%u", info->ring_ref);
-+      if (err) {
-+              message = "writing ring-ref";
-+              goto abort_transaction;
-+      }
-+      err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-+                          irq_to_evtchn_port(info->irq));
-+      if (err) {
-+              message = "writing event-channel";
-+              goto abort_transaction;
-+      }
-+      err = xenbus_printf(xbt, dev->nodename, "protocol", "%s",
-+                          XEN_IO_PROTO_ABI_NATIVE);
-+      if (err) {
-+              message = "writing protocol";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err) {
-+              if (err == -EAGAIN)
-+                      goto again;
-+              xenbus_dev_fatal(dev, err, "completing transaction");
-+              goto destroy_blkring;
-+      }
-+
-+      xenbus_switch_state(dev, XenbusStateInitialised);
-+
-+      return 0;
-+
-+ abort_transaction:
-+      xenbus_transaction_end(xbt, 1);
-+      if (message)
-+              xenbus_dev_fatal(dev, err, "%s", message);
-+ destroy_blkring:
-+      blkif_free(info, 0);
-+ out:
-+      return err;
-+}
-+
-+
-+static int setup_blkring(struct xenbus_device *dev,
-+                       struct blkfront_info *info)
-+{
-+      blkif_sring_t *sring;
-+      int err;
-+
-+      info->ring_ref = GRANT_INVALID_REF;
-+
-+      sring = (blkif_sring_t *)__get_free_page(GFP_NOIO | __GFP_HIGH);
-+      if (!sring) {
-+              xenbus_dev_fatal(dev, -ENOMEM, "allocating shared ring");
-+              return -ENOMEM;
-+      }
-+      SHARED_RING_INIT(sring);
-+      FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
-+
-+      err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
-+      if (err < 0) {
-+              free_page((unsigned long)sring);
-+              info->ring.sring = NULL;
-+              goto fail;
-+      }
-+      info->ring_ref = err;
-+
-+      err = bind_listening_port_to_irqhandler(
-+              dev->otherend_id, blkif_int, SA_SAMPLE_RANDOM, "blkif", info);
-+      if (err <= 0) {
-+              xenbus_dev_fatal(dev, err,
-+                               "bind_listening_port_to_irqhandler");
-+              goto fail;
-+      }
-+      info->irq = err;
-+
-+      return 0;
-+fail:
-+      blkif_free(info, 0);
-+      return err;
-+}
-+
-+
-+/**
-+ * Callback received when the backend's state changes.
-+ */
-+static void backend_changed(struct xenbus_device *dev,
-+                          enum xenbus_state backend_state)
-+{
-+      struct blkfront_info *info = dev->dev.driver_data;
-+      struct block_device *bd;
-+
-+      DPRINTK("blkfront:backend_changed.\n");
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitWait:
-+      case XenbusStateInitialised:
-+      case XenbusStateReconfiguring:
-+      case XenbusStateReconfigured:
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateConnected:
-+              connect(info);
-+              break;
-+
-+      case XenbusStateClosing:
-+              bd = bdget(info->dev);
-+              if (bd == NULL)
-+                      xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-+              down(&bd->bd_sem);
-+#else
-+              mutex_lock(&bd->bd_mutex);
-+#endif
-+              if (info->users > 0)
-+                      xenbus_dev_error(dev, -EBUSY,
-+                                       "Device in use; refusing to close");
-+              else
-+                      blkfront_closing(dev);
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,17)
-+              up(&bd->bd_sem);
-+#else
-+              mutex_unlock(&bd->bd_mutex);
-+#endif
-+              bdput(bd);
-+              break;
-+      }
-+}
-+
-+
-+/* ** Connection ** */
-+
-+
-+/*
-+ * Invoked when the backend is finally 'ready' (and has told produced
-+ * the details about the physical device - #sectors, size, etc).
-+ */
-+static void connect(struct blkfront_info *info)
-+{
-+      unsigned long long sectors;
-+      unsigned long sector_size;
-+      unsigned int binfo;
-+      int err;
-+
-+      if ((info->connected == BLKIF_STATE_CONNECTED) ||
-+          (info->connected == BLKIF_STATE_SUSPENDED) )
-+              return;
-+
-+      DPRINTK("blkfront.c:connect:%s.\n", info->xbdev->otherend);
-+
-+      err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
-+                          "sectors", "%Lu", &sectors,
-+                          "info", "%u", &binfo,
-+                          "sector-size", "%lu", &sector_size,
-+                          NULL);
-+      if (err) {
-+              xenbus_dev_fatal(info->xbdev, err,
-+                               "reading backend fields at %s",
-+                               info->xbdev->otherend);
-+              return;
-+      }
-+
-+      err = xenbus_gather(XBT_NIL, info->xbdev->otherend,
-+                          "feature-barrier", "%lu", &info->feature_barrier,
-+                          NULL);
-+      if (err)
-+              info->feature_barrier = 0;
-+
-+      err = xlvbd_add(sectors, info->vdevice, binfo, sector_size, info);
-+      if (err) {
-+              xenbus_dev_fatal(info->xbdev, err, "xlvbd_add at %s",
-+                               info->xbdev->otherend);
-+              return;
-+      }
-+
-+      err = xlvbd_sysfs_addif(info);
-+      if (err) {
-+              xenbus_dev_fatal(info->xbdev, err, "xlvbd_sysfs_addif at %s",
-+                               info->xbdev->otherend);
-+              return;
-+      }
-+
-+      (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
-+
-+      /* Kick pending requests. */
-+      spin_lock_irq(&blkif_io_lock);
-+      info->connected = BLKIF_STATE_CONNECTED;
-+      kick_pending_request_queues(info);
-+      spin_unlock_irq(&blkif_io_lock);
-+
-+      add_disk(info->gd);
-+
-+      info->is_ready = 1;
-+}
-+
-+/**
-+ * Handle the change of state of the backend to Closing.  We must delete our
-+ * device-layer structures now, to ensure that writes are flushed through to
-+ * the backend.  Once is this done, we can switch to Closed in
-+ * acknowledgement.
-+ */
-+static void blkfront_closing(struct xenbus_device *dev)
-+{
-+      struct blkfront_info *info = dev->dev.driver_data;
-+      unsigned long flags;
-+
-+      DPRINTK("blkfront_closing: %s removed\n", dev->nodename);
-+
-+      if (info->rq == NULL)
-+              goto out;
-+
-+      spin_lock_irqsave(&blkif_io_lock, flags);
-+      /* No more blkif_request(). */
-+      blk_stop_queue(info->rq);
-+      /* No more gnttab callback work. */
-+      gnttab_cancel_free_callback(&info->callback);
-+      spin_unlock_irqrestore(&blkif_io_lock, flags);
-+
-+      /* Flush gnttab callback work. Must be done with no locks held. */
-+      flush_scheduled_work();
-+
-+      xlvbd_sysfs_delif(info);
-+
-+      xlvbd_del(info);
-+
-+ out:
-+      xenbus_frontend_closed(dev);
-+}
-+
-+
-+static int blkfront_remove(struct xenbus_device *dev)
-+{
-+      struct blkfront_info *info = dev->dev.driver_data;
-+
-+      DPRINTK("blkfront_remove: %s removed\n", dev->nodename);
-+
-+      blkif_free(info, 0);
-+
-+      kfree(info);
-+
-+      return 0;
-+}
-+
-+
-+static inline int GET_ID_FROM_FREELIST(
-+      struct blkfront_info *info)
-+{
-+      unsigned long free = info->shadow_free;
-+      BUG_ON(free > BLK_RING_SIZE);
-+      info->shadow_free = info->shadow[free].req.id;
-+      info->shadow[free].req.id = 0x0fffffee; /* debug */
-+      return free;
-+}
-+
-+static inline void ADD_ID_TO_FREELIST(
-+      struct blkfront_info *info, unsigned long id)
-+{
-+      info->shadow[id].req.id  = info->shadow_free;
-+      info->shadow[id].request = 0;
-+      info->shadow_free = id;
-+}
-+
-+static inline void flush_requests(struct blkfront_info *info)
-+{
-+      int notify;
-+
-+      RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&info->ring, notify);
-+
-+      if (notify)
-+              notify_remote_via_irq(info->irq);
-+}
-+
-+static void kick_pending_request_queues(struct blkfront_info *info)
-+{
-+      if (!RING_FULL(&info->ring)) {
-+              /* Re-enable calldowns. */
-+              blk_start_queue(info->rq);
-+              /* Kick things off immediately. */
-+              do_blkif_request(info->rq);
-+      }
-+}
-+
-+static void blkif_restart_queue(void *arg)
-+{
-+      struct blkfront_info *info = (struct blkfront_info *)arg;
-+      spin_lock_irq(&blkif_io_lock);
-+      if (info->connected == BLKIF_STATE_CONNECTED)
-+              kick_pending_request_queues(info);
-+      spin_unlock_irq(&blkif_io_lock);
-+}
-+
-+static void blkif_restart_queue_callback(void *arg)
-+{
-+      struct blkfront_info *info = (struct blkfront_info *)arg;
-+      schedule_work(&info->work);
-+}
-+
-+int blkif_open(struct inode *inode, struct file *filep)
-+{
-+      struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
-+      info->users++;
-+      return 0;
-+}
-+
-+
-+int blkif_release(struct inode *inode, struct file *filep)
-+{
-+      struct blkfront_info *info = inode->i_bdev->bd_disk->private_data;
-+      info->users--;
-+      if (info->users == 0) {
-+              /* Check whether we have been instructed to close.  We will
-+                 have ignored this request initially, as the device was
-+                 still mounted. */
-+              struct xenbus_device * dev = info->xbdev;
-+              enum xenbus_state state = xenbus_read_driver_state(dev->otherend);
-+
-+              if (state == XenbusStateClosing && info->is_ready)
-+                      blkfront_closing(dev);
-+      }
-+      return 0;
-+}
-+
-+
-+int blkif_ioctl(struct inode *inode, struct file *filep,
-+              unsigned command, unsigned long argument)
-+{
-+      int i;
-+
-+      DPRINTK_IOCTL("command: 0x%x, argument: 0x%lx, dev: 0x%04x\n",
-+                    command, (long)argument, inode->i_rdev);
-+
-+      switch (command) {
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16)
-+      case HDIO_GETGEO: {
-+              struct block_device *bd = inode->i_bdev;
-+              struct hd_geometry geo;
-+              int ret;
-+
-+                if (!argument)
-+                        return -EINVAL;
-+
-+              geo.start = get_start_sect(bd);
-+              ret = blkif_getgeo(bd, &geo);
-+              if (ret)
-+                      return ret;
-+
-+              if (copy_to_user((struct hd_geometry __user *)argument, &geo,
-+                               sizeof(geo)))
-+                        return -EFAULT;
-+
-+                return 0;
-+      }
-+#endif
-+      case CDROMMULTISESSION:
-+              DPRINTK("FIXME: support multisession CDs later\n");
-+              for (i = 0; i < sizeof(struct cdrom_multisession); i++)
-+                      if (put_user(0, (char __user *)(argument + i)))
-+                              return -EFAULT;
-+              return 0;
-+
-+      case CDROM_GET_CAPABILITY: {
-+              struct blkfront_info *info =
-+                      inode->i_bdev->bd_disk->private_data;
-+              struct gendisk *gd = info->gd;
-+              if (gd->flags & GENHD_FL_CD)
-+                      return 0;
-+              return -EINVAL;
-+      }
-+      default:
-+              /*printk(KERN_ALERT "ioctl %08x not supported by Xen blkdev\n",
-+                command);*/
-+              return -EINVAL; /* same return as native Linux */
-+      }
-+
-+      return 0;
-+}
-+
-+
-+int blkif_getgeo(struct block_device *bd, struct hd_geometry *hg)
-+{
-+      /* We don't have real geometry info, but let's at least return
-+         values consistent with the size of the device */
-+      sector_t nsect = get_capacity(bd->bd_disk);
-+      sector_t cylinders = nsect;
-+
-+      hg->heads = 0xff;
-+      hg->sectors = 0x3f;
-+      sector_div(cylinders, hg->heads * hg->sectors);
-+      hg->cylinders = cylinders;
-+      if ((sector_t)(hg->cylinders + 1) * hg->heads * hg->sectors < nsect)
-+              hg->cylinders = 0xffff;
-+      return 0;
-+}
-+
-+
-+/*
-+ * blkif_queue_request
-+ *
-+ * request block io
-+ *
-+ * id: for guest use only.
-+ * operation: BLKIF_OP_{READ,WRITE,PROBE}
-+ * buffer: buffer to read/write into. this should be a
-+ *   virtual address in the guest os.
-+ */
-+static int blkif_queue_request(struct request *req)
-+{
-+      struct blkfront_info *info = req->rq_disk->private_data;
-+      unsigned long buffer_mfn;
-+      blkif_request_t *ring_req;
-+      struct bio *bio;
-+      struct bio_vec *bvec;
-+      int idx;
-+      unsigned long id;
-+      unsigned int fsect, lsect;
-+      int ref;
-+      grant_ref_t gref_head;
-+
-+      if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
-+              return 1;
-+
-+      if (gnttab_alloc_grant_references(
-+              BLKIF_MAX_SEGMENTS_PER_REQUEST, &gref_head) < 0) {
-+              gnttab_request_free_callback(
-+                      &info->callback,
-+                      blkif_restart_queue_callback,
-+                      info,
-+                      BLKIF_MAX_SEGMENTS_PER_REQUEST);
-+              return 1;
-+      }
-+
-+      /* Fill out a communications ring structure. */
-+      ring_req = RING_GET_REQUEST(&info->ring, info->ring.req_prod_pvt);
-+      id = GET_ID_FROM_FREELIST(info);
-+      info->shadow[id].request = (unsigned long)req;
-+
-+      ring_req->id = id;
-+      ring_req->sector_number = (blkif_sector_t)req->sector;
-+      ring_req->handle = info->handle;
-+
-+      ring_req->operation = rq_data_dir(req) ?
-+              BLKIF_OP_WRITE : BLKIF_OP_READ;
-+      if (blk_barrier_rq(req))
-+              ring_req->operation = BLKIF_OP_WRITE_BARRIER;
-+
-+      ring_req->nr_segments = 0;
-+      rq_for_each_bio (bio, req) {
-+              bio_for_each_segment (bvec, bio, idx) {
-+                      BUG_ON(ring_req->nr_segments
-+                             == BLKIF_MAX_SEGMENTS_PER_REQUEST);
-+                      buffer_mfn = page_to_phys(bvec->bv_page) >> PAGE_SHIFT;
-+                      fsect = bvec->bv_offset >> 9;
-+                      lsect = fsect + (bvec->bv_len >> 9) - 1;
-+                      /* install a grant reference. */
-+                      ref = gnttab_claim_grant_reference(&gref_head);
-+                      BUG_ON(ref == -ENOSPC);
-+
-+                      gnttab_grant_foreign_access_ref(
-+                              ref,
-+                              info->xbdev->otherend_id,
-+                              buffer_mfn,
-+                              rq_data_dir(req) ? GTF_readonly : 0 );
-+
-+                      info->shadow[id].frame[ring_req->nr_segments] =
-+                              mfn_to_pfn(buffer_mfn);
-+
-+                      ring_req->seg[ring_req->nr_segments] =
-+                              (struct blkif_request_segment) {
-+                                      .gref       = ref,
-+                                      .first_sect = fsect,
-+                                      .last_sect  = lsect };
-+
-+                      ring_req->nr_segments++;
-+              }
-+      }
-+
-+      info->ring.req_prod_pvt++;
-+
-+      /* Keep a private copy so we can reissue requests when recovering. */
-+      info->shadow[id].req = *ring_req;
-+
-+      gnttab_free_grant_references(gref_head);
-+
-+      return 0;
-+}
-+
-+/*
-+ * do_blkif_request
-+ *  read a block; request is in a request queue
-+ */
-+void do_blkif_request(request_queue_t *rq)
-+{
-+      struct blkfront_info *info = NULL;
-+      struct request *req;
-+      int queued;
-+
-+      DPRINTK("Entered do_blkif_request\n");
-+
-+      queued = 0;
-+
-+      while ((req = elv_next_request(rq)) != NULL) {
-+              info = req->rq_disk->private_data;
-+              if (!blk_fs_request(req)) {
-+                      end_request(req, 0);
-+                      continue;
-+              }
-+
-+              if (RING_FULL(&info->ring))
-+                      goto wait;
-+
-+              DPRINTK("do_blk_req %p: cmd %p, sec %llx, "
-+                      "(%u/%li) buffer:%p [%s]\n",
-+                      req, req->cmd, (long long)req->sector,
-+                      req->current_nr_sectors,
-+                      req->nr_sectors, req->buffer,
-+                      rq_data_dir(req) ? "write" : "read");
-+
-+
-+              blkdev_dequeue_request(req);
-+              if (blkif_queue_request(req)) {
-+                      blk_requeue_request(rq, req);
-+              wait:
-+                      /* Avoid pointless unplugs. */
-+                      blk_stop_queue(rq);
-+                      break;
-+              }
-+
-+              queued++;
-+      }
-+
-+      if (queued != 0)
-+              flush_requests(info);
-+}
-+
-+
-+static irqreturn_t blkif_int(int irq, void *dev_id, struct pt_regs *ptregs)
-+{
-+      struct request *req;
-+      blkif_response_t *bret;
-+      RING_IDX i, rp;
-+      unsigned long flags;
-+      struct blkfront_info *info = (struct blkfront_info *)dev_id;
-+      int uptodate;
-+
-+      spin_lock_irqsave(&blkif_io_lock, flags);
-+
-+      if (unlikely(info->connected != BLKIF_STATE_CONNECTED)) {
-+              spin_unlock_irqrestore(&blkif_io_lock, flags);
-+              return IRQ_HANDLED;
-+      }
-+
-+ again:
-+      rp = info->ring.sring->rsp_prod;
-+      rmb(); /* Ensure we see queued responses up to 'rp'. */
-+
-+      for (i = info->ring.rsp_cons; i != rp; i++) {
-+              unsigned long id;
-+              int ret;
-+
-+              bret = RING_GET_RESPONSE(&info->ring, i);
-+              id   = bret->id;
-+              req  = (struct request *)info->shadow[id].request;
-+
-+              blkif_completion(&info->shadow[id]);
-+
-+              ADD_ID_TO_FREELIST(info, id);
-+
-+              uptodate = (bret->status == BLKIF_RSP_OKAY);
-+              switch (bret->operation) {
-+              case BLKIF_OP_WRITE_BARRIER:
-+                      if (unlikely(bret->status == BLKIF_RSP_EOPNOTSUPP)) {
-+                              printk("blkfront: %s: write barrier op failed\n",
-+                                     info->gd->disk_name);
-+                              uptodate = -EOPNOTSUPP;
-+                              info->feature_barrier = 0;
-+                              xlvbd_barrier(info);
-+                      }
-+                      /* fall through */
-+              case BLKIF_OP_READ:
-+              case BLKIF_OP_WRITE:
-+                      if (unlikely(bret->status != BLKIF_RSP_OKAY))
-+                              DPRINTK("Bad return from blkdev data "
-+                                      "request: %x\n", bret->status);
-+
-+                      ret = end_that_request_first(req, uptodate,
-+                              req->hard_nr_sectors);
-+                      BUG_ON(ret);
-+                      end_that_request_last(req, uptodate);
-+                      break;
-+              default:
-+                      BUG();
-+              }
-+      }
-+
-+      info->ring.rsp_cons = i;
-+
-+      if (i != info->ring.req_prod_pvt) {
-+              int more_to_do;
-+              RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, more_to_do);
-+              if (more_to_do)
-+                      goto again;
-+      } else
-+              info->ring.sring->rsp_event = i + 1;
-+
-+      kick_pending_request_queues(info);
-+
-+      spin_unlock_irqrestore(&blkif_io_lock, flags);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void blkif_free(struct blkfront_info *info, int suspend)
-+{
-+      /* Prevent new requests being issued until we fix things up. */
-+      spin_lock_irq(&blkif_io_lock);
-+      info->connected = suspend ?
-+              BLKIF_STATE_SUSPENDED : BLKIF_STATE_DISCONNECTED;
-+      /* No more blkif_request(). */
-+      if (info->rq)
-+              blk_stop_queue(info->rq);
-+      /* No more gnttab callback work. */
-+      gnttab_cancel_free_callback(&info->callback);
-+      spin_unlock_irq(&blkif_io_lock);
-+
-+      /* Flush gnttab callback work. Must be done with no locks held. */
-+      flush_scheduled_work();
-+
-+      /* Free resources associated with old device channel. */
-+      if (info->ring_ref != GRANT_INVALID_REF) {
-+              gnttab_end_foreign_access(info->ring_ref, 
-+                                        (unsigned long)info->ring.sring);
-+              info->ring_ref = GRANT_INVALID_REF;
-+              info->ring.sring = NULL;
-+      }
-+      if (info->irq)
-+              unbind_from_irqhandler(info->irq, info);
-+      info->irq = 0;
-+}
-+
-+static void blkif_completion(struct blk_shadow *s)
-+{
-+      int i;
-+      for (i = 0; i < s->req.nr_segments; i++)
-+              gnttab_end_foreign_access(s->req.seg[i].gref, 0UL);
-+}
-+
-+static void blkif_recover(struct blkfront_info *info)
-+{
-+      int i;
-+      blkif_request_t *req;
-+      struct blk_shadow *copy;
-+      int j;
-+
-+      /* Stage 1: Make a safe copy of the shadow state. */
-+      copy = kmalloc(sizeof(info->shadow), GFP_NOIO | __GFP_NOFAIL | __GFP_HIGH);
-+      memcpy(copy, info->shadow, sizeof(info->shadow));
-+
-+      /* Stage 2: Set up free list. */
-+      memset(&info->shadow, 0, sizeof(info->shadow));
-+      for (i = 0; i < BLK_RING_SIZE; i++)
-+              info->shadow[i].req.id = i+1;
-+      info->shadow_free = info->ring.req_prod_pvt;
-+      info->shadow[BLK_RING_SIZE-1].req.id = 0x0fffffff;
-+
-+      /* Stage 3: Find pending requests and requeue them. */
-+      for (i = 0; i < BLK_RING_SIZE; i++) {
-+              /* Not in use? */
-+              if (copy[i].request == 0)
-+                      continue;
-+
-+              /* Grab a request slot and copy shadow state into it. */
-+              req = RING_GET_REQUEST(
-+                      &info->ring, info->ring.req_prod_pvt);
-+              *req = copy[i].req;
-+
-+              /* We get a new request id, and must reset the shadow state. */
-+              req->id = GET_ID_FROM_FREELIST(info);
-+              memcpy(&info->shadow[req->id], &copy[i], sizeof(copy[i]));
-+
-+              /* Rewrite any grant references invalidated by susp/resume. */
-+              for (j = 0; j < req->nr_segments; j++)
-+                      gnttab_grant_foreign_access_ref(
-+                              req->seg[j].gref,
-+                              info->xbdev->otherend_id,
-+                              pfn_to_mfn(info->shadow[req->id].frame[j]),
-+                              rq_data_dir((struct request *)
-+                                          info->shadow[req->id].request) ?
-+                              GTF_readonly : 0);
-+              info->shadow[req->id].req = *req;
-+
-+              info->ring.req_prod_pvt++;
-+      }
-+
-+      kfree(copy);
-+
-+      (void)xenbus_switch_state(info->xbdev, XenbusStateConnected);
-+
-+      spin_lock_irq(&blkif_io_lock);
-+
-+      /* Now safe for us to use the shared ring */
-+      info->connected = BLKIF_STATE_CONNECTED;
-+
-+      /* Send off requeued requests */
-+      flush_requests(info);
-+
-+      /* Kick any other new requests queued since we resumed */
-+      kick_pending_request_queues(info);
-+
-+      spin_unlock_irq(&blkif_io_lock);
-+}
-+
-+int blkfront_is_ready(struct xenbus_device *dev)
-+{
-+      struct blkfront_info *info = dev->dev.driver_data;
-+
-+      return info->is_ready;
-+}
-+
-+
-+/* ** Driver Registration ** */
-+
-+
-+static const struct xenbus_device_id blkfront_ids[] = {
-+      { "vbd" },
-+      { "" }
-+};
-+MODULE_ALIAS("xen:vbd");
-+
-+static struct xenbus_driver blkfront = {
-+      .name = "vbd",
-+      .owner = THIS_MODULE,
-+      .ids = blkfront_ids,
-+      .probe = blkfront_probe,
-+      .remove = blkfront_remove,
-+      .resume = blkfront_resume,
-+      .otherend_changed = backend_changed,
-+      .is_ready = blkfront_is_ready,
-+};
-+
-+
-+static int __init xlblk_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      return xenbus_register_frontend(&blkfront);
-+}
-+module_init(xlblk_init);
-+
-+
-+static void __exit xlblk_exit(void)
-+{
-+      return xenbus_unregister_driver(&blkfront);
-+}
-+module_exit(xlblk_exit);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/blkfront/block.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkfront/block.h       2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,158 @@
-+/******************************************************************************
-+ * block.h
-+ * 
-+ * Shared definitions between all levels of XenLinux Virtual block devices.
-+ * 
-+ * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
-+ * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
-+ * Copyright (c) 2004-2005, Christian Limpach
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_DRIVERS_BLOCK_H__
-+#define __XEN_DRIVERS_BLOCK_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/hdreg.h>
-+#include <linux/blkdev.h>
-+#include <linux/major.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+#include <xen/gnttab.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/io/blkif.h>
-+#include <xen/interface/io/ring.h>
-+#include <asm/io.h>
-+#include <asm/atomic.h>
-+#include <asm/uaccess.h>
-+
-+#define DPRINTK(_f, _a...) pr_debug(_f, ## _a)
-+
-+#if 0
-+#define DPRINTK_IOCTL(_f, _a...) printk(KERN_ALERT _f, ## _a)
-+#else
-+#define DPRINTK_IOCTL(_f, _a...) ((void)0)
-+#endif
-+
-+struct xlbd_type_info
-+{
-+      int partn_shift;
-+      int disks_per_major;
-+      char *devname;
-+      char *diskname;
-+};
-+
-+struct xlbd_major_info
-+{
-+      int major;
-+      int index;
-+      int usage;
-+      struct xlbd_type_info *type;
-+};
-+
-+struct blk_shadow {
-+      blkif_request_t req;
-+      unsigned long request;
-+      unsigned long frame[BLKIF_MAX_SEGMENTS_PER_REQUEST];
-+};
-+
-+#define BLK_RING_SIZE __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
-+
-+/*
-+ * We have one of these per vbd, whether ide, scsi or 'other'.  They
-+ * hang in private_data off the gendisk structure. We may end up
-+ * putting all kinds of interesting stuff here :-)
-+ */
-+struct blkfront_info
-+{
-+      struct xenbus_device *xbdev;
-+      dev_t dev;
-+      struct gendisk *gd;
-+      int vdevice;
-+      blkif_vdev_t handle;
-+      int connected;
-+      int ring_ref;
-+      blkif_front_ring_t ring;
-+      unsigned int irq;
-+      struct xlbd_major_info *mi;
-+      request_queue_t *rq;
-+      struct work_struct work;
-+      struct gnttab_free_callback callback;
-+      struct blk_shadow shadow[BLK_RING_SIZE];
-+      unsigned long shadow_free;
-+      int feature_barrier;
-+      int is_ready;
-+
-+      /**
-+       * The number of people holding this device open.  We won't allow a
-+       * hot-unplug unless this is 0.
-+       */
-+      int users;
-+};
-+
-+extern spinlock_t blkif_io_lock;
-+
-+extern int blkif_open(struct inode *inode, struct file *filep);
-+extern int blkif_release(struct inode *inode, struct file *filep);
-+extern int blkif_ioctl(struct inode *inode, struct file *filep,
-+                     unsigned command, unsigned long argument);
-+extern int blkif_getgeo(struct block_device *, struct hd_geometry *);
-+extern int blkif_check(dev_t dev);
-+extern int blkif_revalidate(dev_t dev);
-+extern void do_blkif_request (request_queue_t *rq);
-+
-+/* Virtual block-device subsystem. */
-+/* Note that xlvbd_add doesn't call add_disk for you: you're expected
-+   to call add_disk on info->gd once the disk is properly connected
-+   up. */
-+int xlvbd_add(blkif_sector_t capacity, int device,
-+            u16 vdisk_info, u16 sector_size, struct blkfront_info *info);
-+void xlvbd_del(struct blkfront_info *info);
-+int xlvbd_barrier(struct blkfront_info *info);
-+
-+#ifdef CONFIG_SYSFS
-+int xlvbd_sysfs_addif(struct blkfront_info *info);
-+void xlvbd_sysfs_delif(struct blkfront_info *info);
-+#else
-+static inline int xlvbd_sysfs_addif(struct blkfront_info *info)
-+{
-+      return 0;
-+}
-+
-+static inline void xlvbd_sysfs_delif(struct blkfront_info *info)
-+{
-+      ;
-+}
-+#endif
-+
-+#endif /* __XEN_DRIVERS_BLOCK_H__ */
-Index: head-2008-11-25/drivers/xen/blkfront/vbd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blkfront/vbd.c 2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,460 @@
-+/******************************************************************************
-+ * vbd.c
-+ * 
-+ * XenLinux virtual block-device driver (xvd).
-+ * 
-+ * Copyright (c) 2003-2004, Keir Fraser & Steve Hand
-+ * Modifications by Mark A. Williamson are (c) Intel Research Cambridge
-+ * Copyright (c) 2004-2005, Christian Limpach
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include "block.h"
-+#include <linux/blkdev.h>
-+#include <linux/list.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+#define BLKIF_MAJOR(dev) ((dev)>>8)
-+#define BLKIF_MINOR(dev) ((dev) & 0xff)
-+
-+#define EXT_SHIFT 28
-+#define EXTENDED (1<<EXT_SHIFT)
-+#define VDEV_IS_EXTENDED(dev) ((dev)&(EXTENDED))
-+#define BLKIF_MINOR_EXT(dev) ((dev)&(~EXTENDED))
-+
-+/*
-+ * For convenience we distinguish between ide, scsi and 'other' (i.e.,
-+ * potentially combinations of the two) in the naming scheme and in a few other
-+ * places.
-+ */
-+
-+#define NUM_IDE_MAJORS 10
-+#define NUM_SCSI_MAJORS 17
-+#define NUM_VBD_MAJORS 2
-+
-+static struct xlbd_type_info xlbd_ide_type = {
-+      .partn_shift = 6,
-+      .disks_per_major = 2,
-+      .devname = "ide",
-+      .diskname = "hd",
-+};
-+
-+static struct xlbd_type_info xlbd_scsi_type = {
-+      .partn_shift = 4,
-+      .disks_per_major = 16,
-+      .devname = "sd",
-+      .diskname = "sd",
-+};
-+
-+static struct xlbd_type_info xlbd_vbd_type = {
-+      .partn_shift = 4,
-+      .disks_per_major = 16,
-+      .devname = "xvd",
-+      .diskname = "xvd",
-+};
-+
-+static struct xlbd_type_info xlbd_vbd_type_ext = {
-+      .partn_shift = 8,
-+      .disks_per_major = 256,
-+      .devname = "xvd",
-+      .diskname = "xvd",
-+};
-+
-+static struct xlbd_major_info *major_info[NUM_IDE_MAJORS + NUM_SCSI_MAJORS +
-+                                       NUM_VBD_MAJORS];
-+
-+#define XLBD_MAJOR_IDE_START  0
-+#define XLBD_MAJOR_SCSI_START (NUM_IDE_MAJORS)
-+#define XLBD_MAJOR_VBD_START  (NUM_IDE_MAJORS + NUM_SCSI_MAJORS)
-+
-+#define XLBD_MAJOR_IDE_RANGE  XLBD_MAJOR_IDE_START ... XLBD_MAJOR_SCSI_START - 1
-+#define XLBD_MAJOR_SCSI_RANGE XLBD_MAJOR_SCSI_START ... XLBD_MAJOR_VBD_START - 1
-+#define XLBD_MAJOR_VBD_RANGE  XLBD_MAJOR_VBD_START ... XLBD_MAJOR_VBD_START + NUM_VBD_MAJORS - 1
-+
-+static struct block_device_operations xlvbd_block_fops =
-+{
-+      .owner = THIS_MODULE,
-+      .open = blkif_open,
-+      .release = blkif_release,
-+      .ioctl  = blkif_ioctl,
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+      .getgeo = blkif_getgeo
-+#endif
-+};
-+
-+DEFINE_SPINLOCK(blkif_io_lock);
-+
-+static struct xlbd_major_info *
-+xlbd_alloc_major_info(int major, int minor, int index)
-+{
-+      struct xlbd_major_info *ptr;
-+      int do_register;
-+
-+      ptr = kzalloc(sizeof(struct xlbd_major_info), GFP_KERNEL);
-+      if (ptr == NULL)
-+              return NULL;
-+
-+      ptr->major = major;
-+      do_register = 1;
-+
-+      switch (index) {
-+      case XLBD_MAJOR_IDE_RANGE:
-+              ptr->type = &xlbd_ide_type;
-+              ptr->index = index - XLBD_MAJOR_IDE_START;
-+              break;
-+      case XLBD_MAJOR_SCSI_RANGE:
-+              ptr->type = &xlbd_scsi_type;
-+              ptr->index = index - XLBD_MAJOR_SCSI_START;
-+              break;
-+      case XLBD_MAJOR_VBD_RANGE:
-+              ptr->index = 0;
-+              if ((index - XLBD_MAJOR_VBD_START) == 0)
-+                      ptr->type = &xlbd_vbd_type;
-+              else
-+                      ptr->type = &xlbd_vbd_type_ext;
-+
-+              /* 
-+               * if someone already registered block major 202,
-+               * don't try to register it again
-+               */
-+              if (major_info[XLBD_MAJOR_VBD_START] != NULL)
-+                      do_register = 0;
-+              break;
-+      }
-+
-+      if (do_register) {
-+              if (register_blkdev(ptr->major, ptr->type->devname)) {
-+                      kfree(ptr);
-+                      return NULL;
-+              }
-+
-+              printk("xen-vbd: registered block device major %i\n", ptr->major);
-+      }
-+
-+      major_info[index] = ptr;
-+      return ptr;
-+}
-+
-+static struct xlbd_major_info *
-+xlbd_get_major_info(int major, int minor, int vdevice)
-+{
-+      struct xlbd_major_info *mi;
-+      int index;
-+
-+      switch (major) {
-+      case IDE0_MAJOR: index = 0; break;
-+      case IDE1_MAJOR: index = 1; break;
-+      case IDE2_MAJOR: index = 2; break;
-+      case IDE3_MAJOR: index = 3; break;
-+      case IDE4_MAJOR: index = 4; break;
-+      case IDE5_MAJOR: index = 5; break;
-+      case IDE6_MAJOR: index = 6; break;
-+      case IDE7_MAJOR: index = 7; break;
-+      case IDE8_MAJOR: index = 8; break;
-+      case IDE9_MAJOR: index = 9; break;
-+      case SCSI_DISK0_MAJOR: index = 10; break;
-+      case SCSI_DISK1_MAJOR ... SCSI_DISK7_MAJOR:
-+              index = 11 + major - SCSI_DISK1_MAJOR;
-+              break;
-+        case SCSI_DISK8_MAJOR ... SCSI_DISK15_MAJOR:
-+                index = 18 + major - SCSI_DISK8_MAJOR;
-+                break;
-+        case SCSI_CDROM_MAJOR: index = 26; break;
-+        default:
-+              if (!VDEV_IS_EXTENDED(vdevice))
-+                      index = 27;
-+              else
-+                      index = 28;
-+              break;
-+      }
-+
-+      mi = ((major_info[index] != NULL) ? major_info[index] :
-+            xlbd_alloc_major_info(major, minor, index));
-+      if (mi)
-+              mi->usage++;
-+      return mi;
-+}
-+
-+static void
-+xlbd_put_major_info(struct xlbd_major_info *mi)
-+{
-+      mi->usage--;
-+      /* XXX: release major if 0 */
-+}
-+
-+static int
-+xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
-+{
-+      request_queue_t *rq;
-+
-+      rq = blk_init_queue(do_blkif_request, &blkif_io_lock);
-+      if (rq == NULL)
-+              return -1;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,10)
-+      elevator_init(rq, "noop");
-+#else
-+      elevator_init(rq, &elevator_noop);
-+#endif
-+
-+      /* Hard sector size and max sectors impersonate the equiv. hardware. */
-+      blk_queue_hardsect_size(rq, sector_size);
-+      blk_queue_max_sectors(rq, 512);
-+
-+      /* Each segment in a request is up to an aligned page in size. */
-+      blk_queue_segment_boundary(rq, PAGE_SIZE - 1);
-+      blk_queue_max_segment_size(rq, PAGE_SIZE);
-+
-+      /* Ensure a merged request will fit in a single I/O ring slot. */
-+      blk_queue_max_phys_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
-+      blk_queue_max_hw_segments(rq, BLKIF_MAX_SEGMENTS_PER_REQUEST);
-+
-+      /* Make sure buffer addresses are sector-aligned. */
-+      blk_queue_dma_alignment(rq, 511);
-+
-+      /* Make sure we don't use bounce buffers. */
-+      blk_queue_bounce_limit(rq, BLK_BOUNCE_ANY);
-+
-+      gd->queue = rq;
-+
-+      return 0;
-+}
-+
-+static int
-+xlvbd_alloc_gendisk(int major, int minor, blkif_sector_t capacity, int vdevice,
-+                  u16 vdisk_info, u16 sector_size,
-+                  struct blkfront_info *info)
-+{
-+      struct gendisk *gd;
-+      struct xlbd_major_info *mi;
-+      int nr_minors = 1;
-+      int err = -ENODEV;
-+      unsigned int offset;
-+
-+      BUG_ON(info->gd != NULL);
-+      BUG_ON(info->mi != NULL);
-+      BUG_ON(info->rq != NULL);
-+
-+      mi = xlbd_get_major_info(major, minor, vdevice);
-+      if (mi == NULL)
-+              goto out;
-+      info->mi = mi;
-+
-+      if ((minor & ((1 << mi->type->partn_shift) - 1)) == 0)
-+              nr_minors = 1 << mi->type->partn_shift;
-+
-+      gd = alloc_disk(nr_minors);
-+      if (gd == NULL)
-+              goto out;
-+
-+      offset =  mi->index * mi->type->disks_per_major +
-+                      (minor >> mi->type->partn_shift);
-+      if (nr_minors > 1) {
-+              if (offset < 26) {
-+                      sprintf(gd->disk_name, "%s%c",
-+                               mi->type->diskname, 'a' + offset );
-+              }
-+              else {
-+                      sprintf(gd->disk_name, "%s%c%c",
-+                              mi->type->diskname,
-+                              'a' + ((offset/26)-1), 'a' + (offset%26) );
-+              }
-+      }
-+      else {
-+              if (offset < 26) {
-+                      sprintf(gd->disk_name, "%s%c%d",
-+                              mi->type->diskname,
-+                              'a' + offset,
-+                              minor & ((1 << mi->type->partn_shift) - 1));
-+              }
-+              else {
-+                      sprintf(gd->disk_name, "%s%c%c%d",
-+                              mi->type->diskname,
-+                              'a' + ((offset/26)-1), 'a' + (offset%26),
-+                              minor & ((1 << mi->type->partn_shift) - 1));
-+              }
-+      }
-+
-+      gd->major = mi->major;
-+      gd->first_minor = minor;
-+      gd->fops = &xlvbd_block_fops;
-+      gd->private_data = info;
-+      gd->driverfs_dev = &(info->xbdev->dev);
-+      set_capacity(gd, capacity);
-+
-+      if (xlvbd_init_blk_queue(gd, sector_size)) {
-+              del_gendisk(gd);
-+              goto out;
-+      }
-+
-+      info->rq = gd->queue;
-+      info->gd = gd;
-+
-+      if (info->feature_barrier)
-+              xlvbd_barrier(info);
-+
-+      if (vdisk_info & VDISK_READONLY)
-+              set_disk_ro(gd, 1);
-+
-+      if (vdisk_info & VDISK_REMOVABLE)
-+              gd->flags |= GENHD_FL_REMOVABLE;
-+
-+      if (vdisk_info & VDISK_CDROM)
-+              gd->flags |= GENHD_FL_CD;
-+
-+      return 0;
-+
-+ out:
-+      if (mi)
-+              xlbd_put_major_info(mi);
-+      info->mi = NULL;
-+      return err;
-+}
-+
-+int
-+xlvbd_add(blkif_sector_t capacity, int vdevice, u16 vdisk_info,
-+        u16 sector_size, struct blkfront_info *info)
-+{
-+      struct block_device *bd;
-+      int err = 0;
-+      int major, minor;
-+
-+      if ((vdevice>>EXT_SHIFT) > 1) {
-+              /* this is above the extended range; something is wrong */
-+              printk(KERN_WARNING "blkfront: vdevice 0x%x is above the extended range; ignoring\n", vdevice);
-+              return -ENODEV;
-+      }
-+
-+      if (!VDEV_IS_EXTENDED(vdevice)) {
-+              major = BLKIF_MAJOR(vdevice);
-+              minor = BLKIF_MINOR(vdevice);
-+      }
-+      else {
-+              major = 202;
-+              minor = BLKIF_MINOR_EXT(vdevice);
-+      }
-+
-+      info->dev = MKDEV(major, minor);
-+      bd = bdget(info->dev);
-+      if (bd == NULL)
-+              return -ENODEV;
-+
-+      err = xlvbd_alloc_gendisk(major, minor, capacity, vdevice, vdisk_info,
-+                                sector_size, info);
-+
-+      bdput(bd);
-+      return err;
-+}
-+
-+void
-+xlvbd_del(struct blkfront_info *info)
-+{
-+      if (info->mi == NULL)
-+              return;
-+
-+      BUG_ON(info->gd == NULL);
-+      del_gendisk(info->gd);
-+      put_disk(info->gd);
-+      info->gd = NULL;
-+
-+      xlbd_put_major_info(info->mi);
-+      info->mi = NULL;
-+
-+      BUG_ON(info->rq == NULL);
-+      blk_cleanup_queue(info->rq);
-+      info->rq = NULL;
-+}
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)
-+int
-+xlvbd_barrier(struct blkfront_info *info)
-+{
-+      int err;
-+
-+      err = blk_queue_ordered(info->rq,
-+              info->feature_barrier ? QUEUE_ORDERED_DRAIN : QUEUE_ORDERED_NONE, NULL);
-+      if (err)
-+              return err;
-+      printk(KERN_INFO "blkfront: %s: barriers %s\n",
-+             info->gd->disk_name, info->feature_barrier ? "enabled" : "disabled");
-+      return 0;
-+}
-+#else
-+int
-+xlvbd_barrier(struct blkfront_info *info)
-+{
-+      printk(KERN_INFO "blkfront: %s: barriers disabled\n", info->gd->disk_name);
-+      return -ENOSYS;
-+}
-+#endif
-+
-+#ifdef CONFIG_SYSFS
-+static ssize_t show_media(struct device *dev,
-+                                struct device_attribute *attr, char *buf)
-+{
-+      struct xenbus_device *xendev = to_xenbus_device(dev);
-+      struct blkfront_info *info = xendev->dev.driver_data;
-+
-+      if (info->gd->flags & GENHD_FL_CD)
-+              return sprintf(buf, "cdrom\n");
-+      return sprintf(buf, "disk\n");
-+}
-+
-+static struct device_attribute xlvbd_attrs[] = {
-+      __ATTR(media, S_IRUGO, show_media, NULL),
-+};
-+
-+int xlvbd_sysfs_addif(struct blkfront_info *info)
-+{
-+      int i;
-+      int error = 0;
-+
-+      for (i = 0; i < ARRAY_SIZE(xlvbd_attrs); i++) {
-+              error = device_create_file(info->gd->driverfs_dev,
-+                              &xlvbd_attrs[i]);
-+              if (error)
-+                      goto fail;
-+      }
-+      return 0;
-+
-+fail:
-+      while (--i >= 0)
-+              device_remove_file(info->gd->driverfs_dev, &xlvbd_attrs[i]);
-+      return error;
-+}
-+
-+void xlvbd_sysfs_delif(struct blkfront_info *info)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(xlvbd_attrs); i++)
-+              device_remove_file(info->gd->driverfs_dev, &xlvbd_attrs[i]);
-+}
-+
-+#endif /* CONFIG_SYSFS */
-Index: head-2008-11-25/drivers/xen/blktap/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blktap/Makefile        2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,5 @@
-+LINUXINCLUDE += -I../xen/include/public/io
-+
-+obj-$(CONFIG_XEN_BLKDEV_TAP) := xenblktap.o
-+
-+xenblktap-y := xenbus.o interface.o blktap.o 
-Index: head-2008-11-25/drivers/xen/blktap/blktap.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blktap/blktap.c        2008-11-10 11:44:21.000000000 +0100
-@@ -0,0 +1,1704 @@
-+/******************************************************************************
-+ * drivers/xen/blktap/blktap.c
-+ * 
-+ * Back-end driver for user level virtual block devices. This portion of the
-+ * driver exports a 'unified' block-device interface that can be accessed
-+ * by any operating system that implements a compatible front end. Requests
-+ * are remapped to a user-space memory region.
-+ *
-+ * Based on the blkback driver code.
-+ * 
-+ * Copyright (c) 2004-2005, Andrew Warfield and Julian Chesterfield
-+ *
-+ * Clean ups and fix ups:
-+ *    Copyright (c) 2006, Steven Rostedt - Red Hat, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/spinlock.h>
-+#include <linux/kthread.h>
-+#include <linux/list.h>
-+#include <asm/hypervisor.h>
-+#include "common.h"
-+#include <xen/balloon.h>
-+#include <xen/driver_util.h>
-+#include <linux/kernel.h>
-+#include <linux/fs.h>
-+#include <linux/mm.h>
-+#include <linux/errno.h>
-+#include <linux/major.h>
-+#include <linux/gfp.h>
-+#include <linux/poll.h>
-+#include <linux/delay.h>
-+#include <asm/tlbflush.h>
-+
-+#define MAX_TAP_DEV 256     /*the maximum number of tapdisk ring devices    */
-+#define MAX_DEV_NAME 100    /*the max tapdisk ring device name e.g. blktap0 */
-+
-+/*
-+ * The maximum number of requests that can be outstanding at any time
-+ * is determined by 
-+ *
-+ *   [mmap_alloc * MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST] 
-+ *
-+ * where mmap_alloc < MAX_DYNAMIC_MEM.
-+ *
-+ * TODO:
-+ * mmap_alloc is initialised to 2 and should be adjustable on the fly via
-+ * sysfs.
-+ */
-+#define BLK_RING_SIZE         __RING_SIZE((blkif_sring_t *)0, PAGE_SIZE)
-+#define MAX_DYNAMIC_MEM               BLK_RING_SIZE
-+#define MAX_PENDING_REQS      BLK_RING_SIZE
-+#define MMAP_PAGES (MAX_PENDING_REQS * BLKIF_MAX_SEGMENTS_PER_REQUEST)
-+#define MMAP_VADDR(_start, _req,_seg)                                   \
-+        (_start +                                                       \
-+         ((_req) * BLKIF_MAX_SEGMENTS_PER_REQUEST * PAGE_SIZE) +        \
-+         ((_seg) * PAGE_SIZE))
-+static int blkif_reqs = MAX_PENDING_REQS;
-+static int mmap_pages = MMAP_PAGES;
-+
-+#define RING_PAGES 1 /* BLKTAP - immediately before the mmap area, we
-+                    * have a bunch of pages reserved for shared
-+                    * memory rings.
-+                    */
-+
-+/*Data struct handed back to userspace for tapdisk device to VBD mapping*/
-+typedef struct domid_translate {
-+      unsigned short domid;
-+      unsigned short busid;
-+} domid_translate_t ;
-+
-+typedef struct domid_translate_ext {
-+      unsigned short domid;
-+      u32 busid;
-+} domid_translate_ext_t ;
-+
-+/*Data struct associated with each of the tapdisk devices*/
-+typedef struct tap_blkif {
-+      struct vm_area_struct *vma;   /*Shared memory area                   */
-+      unsigned long rings_vstart;   /*Kernel memory mapping                */
-+      unsigned long user_vstart;    /*User memory mapping                  */
-+      unsigned long dev_inuse;      /*One process opens device at a time.  */
-+      unsigned long dev_pending;    /*In process of being opened           */
-+      unsigned long ring_ok;        /*make this ring->state                */
-+      blkif_front_ring_t ufe_ring;  /*Rings up to user space.              */
-+      wait_queue_head_t wait;       /*for poll                             */
-+      unsigned long mode;           /*current switching mode               */
-+      int minor;                    /*Minor number for tapdisk device      */
-+      pid_t pid;                    /*tapdisk process id                   */
-+      enum { RUNNING, CLEANSHUTDOWN } status; /*Detect a clean userspace 
-+                                                shutdown                   */
-+      unsigned long *idx_map;       /*Record the user ring id to kern 
-+                                      [req id, idx] tuple                  */
-+      blkif_t *blkif;               /*Associate blkif with tapdev          */
-+      struct domid_translate_ext trans; /*Translation from domid to bus.   */
-+} tap_blkif_t;
-+
-+static struct tap_blkif *tapfds[MAX_TAP_DEV];
-+static int blktap_next_minor;
-+
-+module_param(blkif_reqs, int, 0);
-+/* Run-time switchable: /sys/module/blktap/parameters/ */
-+static unsigned int log_stats = 0;
-+static unsigned int debug_lvl = 0;
-+module_param(log_stats, int, 0644);
-+module_param(debug_lvl, int, 0644);
-+
-+/*
-+ * Each outstanding request that we've passed to the lower device layers has a 
-+ * 'pending_req' allocated to it. Each buffer_head that completes decrements 
-+ * the pendcnt towards zero. When it hits zero, the specified domain has a 
-+ * response queued for it, with the saved 'id' passed back.
-+ */
-+typedef struct {
-+      blkif_t       *blkif;
-+      u64            id;
-+      unsigned short mem_idx;
-+      int            nr_pages;
-+      atomic_t       pendcnt;
-+      unsigned short operation;
-+      int            status;
-+      struct list_head free_list;
-+      int            inuse;
-+} pending_req_t;
-+
-+static pending_req_t *pending_reqs[MAX_PENDING_REQS];
-+static struct list_head pending_free;
-+static DEFINE_SPINLOCK(pending_free_lock);
-+static DECLARE_WAIT_QUEUE_HEAD (pending_free_wq);
-+static int alloc_pending_reqs;
-+
-+typedef unsigned int PEND_RING_IDX;
-+
-+static inline int MASK_PEND_IDX(int i) { 
-+      return (i & (MAX_PENDING_REQS-1));
-+}
-+
-+static inline unsigned int RTN_PEND_IDX(pending_req_t *req, int idx) {
-+      return (req - pending_reqs[idx]);
-+}
-+
-+#define NR_PENDING_REQS (MAX_PENDING_REQS - pending_prod + pending_cons)
-+
-+#define BLKBACK_INVALID_HANDLE (~0)
-+
-+static struct page **foreign_pages[MAX_DYNAMIC_MEM];
-+static inline unsigned long idx_to_kaddr(
-+      unsigned int mmap_idx, unsigned int req_idx, unsigned int sg_idx)
-+{
-+      unsigned int arr_idx = req_idx*BLKIF_MAX_SEGMENTS_PER_REQUEST + sg_idx;
-+      unsigned long pfn = page_to_pfn(foreign_pages[mmap_idx][arr_idx]);
-+      return (unsigned long)pfn_to_kaddr(pfn);
-+}
-+
-+static unsigned short mmap_alloc = 0;
-+static unsigned short mmap_lock = 0;
-+static unsigned short mmap_inuse = 0;
-+
-+/******************************************************************
-+ * GRANT HANDLES
-+ */
-+
-+/* When using grant tables to map a frame for device access then the
-+ * handle returned must be used to unmap the frame. This is needed to
-+ * drop the ref count on the frame.
-+ */
-+struct grant_handle_pair
-+{
-+        grant_handle_t kernel;
-+        grant_handle_t user;
-+};
-+#define INVALID_GRANT_HANDLE  0xFFFF
-+
-+static struct grant_handle_pair 
-+    pending_grant_handles[MAX_DYNAMIC_MEM][MMAP_PAGES];
-+#define pending_handle(_id, _idx, _i) \
-+    (pending_grant_handles[_id][((_idx) * BLKIF_MAX_SEGMENTS_PER_REQUEST) \
-+    + (_i)])
-+
-+
-+static int blktap_read_ufe_ring(tap_blkif_t *info); /*local prototypes*/
-+
-+#define BLKTAP_MINOR 0  /*/dev/xen/blktap has a dynamic major */
-+#define BLKTAP_DEV_DIR  "/dev/xen"
-+
-+static int blktap_major;
-+
-+/* blktap IOCTLs: */
-+#define BLKTAP_IOCTL_KICK_FE         1
-+#define BLKTAP_IOCTL_KICK_BE         2 /* currently unused */
-+#define BLKTAP_IOCTL_SETMODE         3
-+#define BLKTAP_IOCTL_SENDPID       4
-+#define BLKTAP_IOCTL_NEWINTF       5
-+#define BLKTAP_IOCTL_MINOR         6
-+#define BLKTAP_IOCTL_MAJOR         7
-+#define BLKTAP_QUERY_ALLOC_REQS      8
-+#define BLKTAP_IOCTL_FREEINTF        9
-+#define BLKTAP_IOCTL_NEWINTF_EXT     50
-+#define BLKTAP_IOCTL_PRINT_IDXS      100  
-+
-+/* blktap switching modes: (Set with BLKTAP_IOCTL_SETMODE)             */
-+#define BLKTAP_MODE_PASSTHROUGH      0x00000000  /* default            */
-+#define BLKTAP_MODE_INTERCEPT_FE     0x00000001
-+#define BLKTAP_MODE_INTERCEPT_BE     0x00000002  /* unimp.             */
-+
-+#define BLKTAP_MODE_INTERPOSE \
-+           (BLKTAP_MODE_INTERCEPT_FE | BLKTAP_MODE_INTERCEPT_BE)
-+
-+
-+static inline int BLKTAP_MODE_VALID(unsigned long arg)
-+{
-+      return ((arg == BLKTAP_MODE_PASSTHROUGH ) ||
-+              (arg == BLKTAP_MODE_INTERCEPT_FE) ||
-+                (arg == BLKTAP_MODE_INTERPOSE   ));
-+}
-+
-+/* Requests passing through the tap to userspace are re-assigned an ID.
-+ * We must record a mapping between the BE [IDX,ID] tuple and the userspace
-+ * ring ID. 
-+ */
-+
-+static inline unsigned long MAKE_ID(domid_t fe_dom, PEND_RING_IDX idx)
-+{
-+        return ((fe_dom << 16) | MASK_PEND_IDX(idx));
-+}
-+
-+extern inline PEND_RING_IDX ID_TO_IDX(unsigned long id)
-+{
-+        return (PEND_RING_IDX)(id & 0x0000ffff);
-+}
-+
-+extern inline int ID_TO_MIDX(unsigned long id)
-+{
-+        return (int)(id >> 16);
-+}
-+
-+#define INVALID_REQ 0xdead0000
-+
-+/*TODO: Convert to a free list*/
-+static inline int GET_NEXT_REQ(unsigned long *idx_map)
-+{
-+      int i;
-+      for (i = 0; i < MAX_PENDING_REQS; i++)
-+              if (idx_map[i] == INVALID_REQ)
-+                      return i;
-+
-+      return INVALID_REQ;
-+}
-+
-+static inline int OFFSET_TO_USR_IDX(int offset)
-+{
-+      return offset / BLKIF_MAX_SEGMENTS_PER_REQUEST;
-+}
-+
-+static inline int OFFSET_TO_SEG(int offset)
-+{
-+      return offset % BLKIF_MAX_SEGMENTS_PER_REQUEST;
-+}
-+
-+
-+#define BLKTAP_INVALID_HANDLE(_g) \
-+    (((_g->kernel) == INVALID_GRANT_HANDLE) &&  \
-+     ((_g->user) == INVALID_GRANT_HANDLE))
-+
-+#define BLKTAP_INVALIDATE_HANDLE(_g) do {       \
-+    (_g)->kernel = INVALID_GRANT_HANDLE; (_g)->user = INVALID_GRANT_HANDLE; \
-+    } while(0)
-+
-+
-+/******************************************************************
-+ * BLKTAP VM OPS
-+ */
-+
-+static struct page *blktap_nopage(struct vm_area_struct *vma,
-+                                unsigned long address,
-+                                int *type)
-+{
-+      /*
-+       * if the page has not been mapped in by the driver then return
-+       * NOPAGE_SIGBUS to the domain.
-+       */
-+
-+      return NOPAGE_SIGBUS;
-+}
-+
-+static pte_t blktap_clear_pte(struct vm_area_struct *vma,
-+                            unsigned long uvaddr,
-+                            pte_t *ptep, int is_fullmm)
-+{
-+      pte_t copy;
-+      tap_blkif_t *info;
-+      int offset, seg, usr_idx, pending_idx, mmap_idx;
-+      unsigned long uvstart = vma->vm_start + (RING_PAGES << PAGE_SHIFT);
-+      unsigned long kvaddr;
-+      struct page **map;
-+      struct page *pg;
-+      struct grant_handle_pair *khandle;
-+      struct gnttab_unmap_grant_ref unmap[2];
-+      int count = 0;
-+
-+      /*
-+       * If the address is before the start of the grant mapped region or
-+       * if vm_file is NULL (meaning mmap failed and we have nothing to do)
-+       */
-+      if (uvaddr < uvstart || vma->vm_file == NULL)
-+              return ptep_get_and_clear_full(vma->vm_mm, uvaddr, 
-+                                             ptep, is_fullmm);
-+
-+      info = vma->vm_file->private_data;
-+      map = vma->vm_private_data;
-+
-+      /* TODO Should these be changed to if statements? */
-+      BUG_ON(!info);
-+      BUG_ON(!info->idx_map);
-+      BUG_ON(!map);
-+
-+      offset = (int) ((uvaddr - uvstart) >> PAGE_SHIFT);
-+      usr_idx = OFFSET_TO_USR_IDX(offset);
-+      seg = OFFSET_TO_SEG(offset);
-+
-+      pending_idx = MASK_PEND_IDX(ID_TO_IDX(info->idx_map[usr_idx]));
-+      mmap_idx = ID_TO_MIDX(info->idx_map[usr_idx]);
-+
-+      kvaddr = idx_to_kaddr(mmap_idx, pending_idx, seg);
-+      pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-+      ClearPageReserved(pg);
-+      map[offset + RING_PAGES] = NULL;
-+
-+      khandle = &pending_handle(mmap_idx, pending_idx, seg);
-+
-+      if (khandle->kernel != INVALID_GRANT_HANDLE) {
-+              gnttab_set_unmap_op(&unmap[count], kvaddr, 
-+                                  GNTMAP_host_map, khandle->kernel);
-+              count++;
-+
-+              set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT, 
-+                                  INVALID_P2M_ENTRY);
-+      }
-+
-+      if (khandle->user != INVALID_GRANT_HANDLE) {
-+              BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
-+
-+              copy = *ptep;
-+              gnttab_set_unmap_op(&unmap[count], virt_to_machine(ptep), 
-+                                  GNTMAP_host_map 
-+                                  | GNTMAP_application_map 
-+                                  | GNTMAP_contains_pte,
-+                                  khandle->user);
-+              count++;
-+      } else {
-+              BUG_ON(!xen_feature(XENFEAT_auto_translated_physmap));
-+
-+              /* USING SHADOW PAGE TABLES. */
-+              copy = ptep_get_and_clear_full(vma->vm_mm, uvaddr, ptep,
-+                                             is_fullmm);
-+      }
-+
-+      if (count) {
-+              BLKTAP_INVALIDATE_HANDLE(khandle);
-+              if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref,
-+                                            unmap, count))
-+                      BUG();
-+      }
-+
-+      return copy;
-+}
-+
-+struct vm_operations_struct blktap_vm_ops = {
-+      nopage:   blktap_nopage,
-+      zap_pte:  blktap_clear_pte,
-+};
-+
-+/******************************************************************
-+ * BLKTAP FILE OPS
-+ */
-+ 
-+/*Function Declarations*/
-+static tap_blkif_t *get_next_free_dev(void);
-+static int blktap_open(struct inode *inode, struct file *filp);
-+static int blktap_release(struct inode *inode, struct file *filp);
-+static int blktap_mmap(struct file *filp, struct vm_area_struct *vma);
-+static int blktap_ioctl(struct inode *inode, struct file *filp,
-+                        unsigned int cmd, unsigned long arg);
-+static unsigned int blktap_poll(struct file *file, poll_table *wait);
-+
-+static const struct file_operations blktap_fops = {
-+      .owner   = THIS_MODULE,
-+      .poll    = blktap_poll,
-+      .ioctl   = blktap_ioctl,
-+      .open    = blktap_open,
-+      .release = blktap_release,
-+      .mmap    = blktap_mmap,
-+};
-+
-+
-+static tap_blkif_t *get_next_free_dev(void)
-+{
-+      struct class *class;
-+      tap_blkif_t *info;
-+      int minor;
-+
-+      /*
-+       * This is called only from the ioctl, which
-+       * means we should always have interrupts enabled.
-+       */
-+      BUG_ON(irqs_disabled());
-+
-+      spin_lock_irq(&pending_free_lock);
-+
-+      /* tapfds[0] is always NULL */
-+
-+      for (minor = 1; minor < blktap_next_minor; minor++) {
-+              info = tapfds[minor];
-+              /* we could have failed a previous attempt. */
-+              if (!info ||
-+                  ((info->dev_inuse == 0) &&
-+                   (info->dev_pending == 0)) ) {
-+                      info->dev_pending = 1;
-+                      goto found;
-+              }
-+      }
-+      info = NULL;
-+      minor = -1;
-+
-+      /*
-+       * We didn't find free device. If we can still allocate
-+       * more, then we grab the next device minor that is
-+       * available.  This is done while we are still under
-+       * the protection of the pending_free_lock.
-+       */
-+      if (blktap_next_minor < MAX_TAP_DEV)
-+              minor = blktap_next_minor++;
-+found:
-+      spin_unlock_irq(&pending_free_lock);
-+
-+      if (!info && minor > 0) {
-+              info = kzalloc(sizeof(*info), GFP_KERNEL);
-+              if (unlikely(!info)) {
-+                      /*
-+                       * If we failed here, try to put back
-+                       * the next minor number. But if one
-+                       * was just taken, then we just lose this
-+                       * minor.  We can try to allocate this
-+                       * minor again later.
-+                       */
-+                      spin_lock_irq(&pending_free_lock);
-+                      if (blktap_next_minor == minor+1)
-+                              blktap_next_minor--;
-+                      spin_unlock_irq(&pending_free_lock);
-+                      goto out;
-+              }
-+
-+              info->minor = minor;
-+              /*
-+               * Make sure that we have a minor before others can
-+               * see us.
-+               */
-+              wmb();
-+              tapfds[minor] = info;
-+
-+              if ((class = get_xen_class()) != NULL)
-+                      class_device_create(class, NULL,
-+                                          MKDEV(blktap_major, minor), NULL,
-+                                          "blktap%d", minor);
-+      }
-+
-+out:
-+      return info;
-+}
-+
-+int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif) 
-+{
-+      tap_blkif_t *info;
-+      int i;
-+
-+      for (i = 1; i < blktap_next_minor; i++) {
-+              info = tapfds[i];
-+              if ( info &&
-+                   (info->trans.domid == domid) &&
-+                   (info->trans.busid == xenbus_id) ) {
-+                      info->blkif = blkif;
-+                      info->status = RUNNING;
-+                      return i;
-+              }
-+      }
-+      return -1;
-+}
-+
-+void signal_tapdisk(int idx) 
-+{
-+      tap_blkif_t *info;
-+      struct task_struct *ptask;
-+
-+      /*
-+       * if the userland tools set things up wrong, this could be negative;
-+       * just don't try to signal in this case
-+       */
-+      if (idx < 0)
-+              return;
-+
-+      info = tapfds[idx];
-+      if ((idx < 0) || (idx > MAX_TAP_DEV) || !info)
-+              return;
-+
-+      if (info->pid > 0) {
-+              ptask = find_task_by_pid(info->pid);
-+              if (ptask)
-+                      info->status = CLEANSHUTDOWN;
-+      }
-+      info->blkif = NULL;
-+
-+      return;
-+}
-+
-+static int blktap_open(struct inode *inode, struct file *filp)
-+{
-+      blkif_sring_t *sring;
-+      int idx = iminor(inode) - BLKTAP_MINOR;
-+      tap_blkif_t *info;
-+      int i;
-+      
-+      /* ctrl device, treat differently */
-+      if (!idx)
-+              return 0;
-+
-+      info = tapfds[idx];
-+
-+      if ((idx < 0) || (idx > MAX_TAP_DEV) || !info) {
-+              WPRINTK("Unable to open device /dev/xen/blktap%d\n",
-+                      idx);
-+              return -ENODEV;
-+      }
-+
-+      DPRINTK("Opening device /dev/xen/blktap%d\n",idx);
-+      
-+      /*Only one process can access device at a time*/
-+      if (test_and_set_bit(0, &info->dev_inuse))
-+              return -EBUSY;
-+
-+      info->dev_pending = 0;
-+          
-+      /* Allocate the fe ring. */
-+      sring = (blkif_sring_t *)get_zeroed_page(GFP_KERNEL);
-+      if (sring == NULL)
-+              goto fail_nomem;
-+
-+      SetPageReserved(virt_to_page(sring));
-+    
-+      SHARED_RING_INIT(sring);
-+      FRONT_RING_INIT(&info->ufe_ring, sring, PAGE_SIZE);
-+      
-+      filp->private_data = info;
-+      info->vma = NULL;
-+
-+      info->idx_map = kmalloc(sizeof(unsigned long) * MAX_PENDING_REQS, 
-+                              GFP_KERNEL);
-+      
-+      if (info->idx_map == NULL)
-+              goto fail_nomem;
-+
-+      if (idx > 0) {
-+              init_waitqueue_head(&info->wait);
-+              for (i = 0; i < MAX_PENDING_REQS; i++) 
-+                      info->idx_map[i] = INVALID_REQ;
-+      }
-+
-+      DPRINTK("Tap open: device /dev/xen/blktap%d\n",idx);
-+      return 0;
-+
-+ fail_nomem:
-+      return -ENOMEM;
-+}
-+
-+static int blktap_release(struct inode *inode, struct file *filp)
-+{
-+      tap_blkif_t *info = filp->private_data;
-+      
-+      /* check for control device */
-+      if (!info)
-+              return 0;
-+
-+      info->dev_inuse = 0;
-+      DPRINTK("Freeing device [/dev/xen/blktap%d]\n",info->minor);
-+
-+      /* Free the ring page. */
-+      ClearPageReserved(virt_to_page(info->ufe_ring.sring));
-+      free_page((unsigned long) info->ufe_ring.sring);
-+
-+      /* Clear any active mappings and free foreign map table */
-+      if (info->vma) {
-+              struct mm_struct *mm = info->vma->vm_mm;
-+
-+              down_write(&mm->mmap_sem);
-+              zap_page_range(
-+                      info->vma, info->vma->vm_start, 
-+                      info->vma->vm_end - info->vma->vm_start, NULL);
-+              up_write(&mm->mmap_sem);
-+
-+              kfree(info->vma->vm_private_data);
-+
-+              info->vma = NULL;
-+      }
-+
-+      if (info->idx_map) {
-+              kfree(info->idx_map);
-+              info->idx_map = NULL;
-+      }
-+
-+      if ( (info->status != CLEANSHUTDOWN) && (info->blkif != NULL) ) {
-+              if (info->blkif->xenblkd != NULL) {
-+                      kthread_stop(info->blkif->xenblkd);
-+                      info->blkif->xenblkd = NULL;
-+              }
-+              info->status = CLEANSHUTDOWN;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/* Note on mmap:
-+ * We need to map pages to user space in a way that will allow the block
-+ * subsystem set up direct IO to them.  This couldn't be done before, because
-+ * there isn't really a sane way to translate a user virtual address down to a 
-+ * physical address when the page belongs to another domain.
-+ *
-+ * My first approach was to map the page in to kernel memory, add an entry
-+ * for it in the physical frame list (using alloc_lomem_region as in blkback)
-+ * and then attempt to map that page up to user space.  This is disallowed
-+ * by xen though, which realizes that we don't really own the machine frame
-+ * underlying the physical page.
-+ *
-+ * The new approach is to provide explicit support for this in xen linux.
-+ * The VMA now has a flag, VM_FOREIGN, to indicate that it contains pages
-+ * mapped from other vms.  vma->vm_private_data is set up as a mapping 
-+ * from pages to actual page structs.  There is a new clause in get_user_pages
-+ * that does the right thing for this sort of mapping.
-+ */
-+static int blktap_mmap(struct file *filp, struct vm_area_struct *vma)
-+{
-+      int size;
-+      struct page **map;
-+      int i;
-+      tap_blkif_t *info = filp->private_data;
-+      int ret;
-+
-+      if (info == NULL) {
-+              WPRINTK("blktap: mmap, retrieving idx failed\n");
-+              return -ENOMEM;
-+      }
-+      
-+      vma->vm_flags |= VM_RESERVED;
-+      vma->vm_ops = &blktap_vm_ops;
-+
-+      size = vma->vm_end - vma->vm_start;
-+      if (size != ((mmap_pages + RING_PAGES) << PAGE_SHIFT)) {
-+              WPRINTK("you _must_ map exactly %d pages!\n",
-+                     mmap_pages + RING_PAGES);
-+              return -EAGAIN;
-+      }
-+
-+      size >>= PAGE_SHIFT;
-+      info->rings_vstart = vma->vm_start;
-+      info->user_vstart  = info->rings_vstart + (RING_PAGES << PAGE_SHIFT);
-+    
-+      /* Map the ring pages to the start of the region and reserve it. */
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              ret = vm_insert_page(vma, vma->vm_start,
-+                                   virt_to_page(info->ufe_ring.sring));
-+      else
-+              ret = remap_pfn_range(vma, vma->vm_start,
-+                                    __pa(info->ufe_ring.sring) >> PAGE_SHIFT,
-+                                    PAGE_SIZE, vma->vm_page_prot);
-+      if (ret) {
-+              WPRINTK("Mapping user ring failed!\n");
-+              goto fail;
-+      }
-+
-+      /* Mark this VM as containing foreign pages, and set up mappings. */
-+      map = kzalloc(((vma->vm_end - vma->vm_start) >> PAGE_SHIFT)
-+                    * sizeof(struct page *),
-+                    GFP_KERNEL);
-+      if (map == NULL) {
-+              WPRINTK("Couldn't alloc VM_FOREIGN map.\n");
-+              goto fail;
-+      }
-+
-+      for (i = 0; i < ((vma->vm_end - vma->vm_start) >> PAGE_SHIFT); i++)
-+              map[i] = NULL;
-+    
-+      vma->vm_private_data = map;
-+      vma->vm_flags |= VM_FOREIGN;
-+      vma->vm_flags |= VM_DONTCOPY;
-+
-+#ifdef CONFIG_X86
-+      vma->vm_mm->context.has_foreign_mappings = 1;
-+#endif
-+
-+      info->vma = vma;
-+      info->ring_ok = 1;
-+      return 0;
-+ fail:
-+      /* Clear any active mappings. */
-+      zap_page_range(vma, vma->vm_start, 
-+                     vma->vm_end - vma->vm_start, NULL);
-+
-+      return -ENOMEM;
-+}
-+
-+
-+static int blktap_ioctl(struct inode *inode, struct file *filp,
-+                        unsigned int cmd, unsigned long arg)
-+{
-+      tap_blkif_t *info = filp->private_data;
-+
-+      switch(cmd) {
-+      case BLKTAP_IOCTL_KICK_FE: 
-+      {
-+              /* There are fe messages to process. */
-+              return blktap_read_ufe_ring(info);
-+      }
-+      case BLKTAP_IOCTL_SETMODE:
-+      {
-+              if (info) {
-+                      if (BLKTAP_MODE_VALID(arg)) {
-+                              info->mode = arg;
-+                              /* XXX: may need to flush rings here. */
-+                              DPRINTK("blktap: set mode to %lx\n", 
-+                                     arg);
-+                              return 0;
-+                      }
-+              }
-+              return 0;
-+      }
-+      case BLKTAP_IOCTL_PRINT_IDXS:
-+        {
-+              if (info) {
-+                      printk("User Rings: \n-----------\n");
-+                      printk("UF: rsp_cons: %2d, req_prod_prv: %2d "
-+                              "| req_prod: %2d, rsp_prod: %2d\n",
-+                              info->ufe_ring.rsp_cons,
-+                              info->ufe_ring.req_prod_pvt,
-+                              info->ufe_ring.sring->req_prod,
-+                              info->ufe_ring.sring->rsp_prod);
-+              }
-+              return 0;
-+        }
-+      case BLKTAP_IOCTL_SENDPID:
-+      {
-+              if (info) {
-+                      info->pid = (pid_t)arg;
-+                      DPRINTK("blktap: pid received %d\n", 
-+                             info->pid);
-+              }
-+              return 0;
-+      }
-+      case BLKTAP_IOCTL_NEWINTF:
-+      {               
-+              uint64_t val = (uint64_t)arg;
-+              domid_translate_t *tr = (domid_translate_t *)&val;
-+
-+              DPRINTK("NEWINTF Req for domid %d and bus id %d\n", 
-+                     tr->domid, tr->busid);
-+              info = get_next_free_dev();
-+              if (!info) {
-+                      WPRINTK("Error initialising /dev/xen/blktap - "
-+                              "No more devices\n");
-+                      return -1;
-+              }
-+              info->trans.domid = tr->domid;
-+              info->trans.busid = tr->busid;
-+              return info->minor;
-+      }
-+      case BLKTAP_IOCTL_NEWINTF_EXT:
-+      {
-+              void __user *udata = (void __user *) arg;
-+              domid_translate_ext_t tr;
-+
-+              if (copy_from_user(&tr, udata, sizeof(domid_translate_ext_t)))
-+                      return -EFAULT;
-+
-+              DPRINTK("NEWINTF_EXT Req for domid %d and bus id %d\n", 
-+                     tr.domid, tr.busid);
-+              info = get_next_free_dev();
-+              if (!info) {
-+                      WPRINTK("Error initialising /dev/xen/blktap - "
-+                              "No more devices\n");
-+                      return -1;
-+              }
-+              info->trans.domid = tr.domid;
-+              info->trans.busid = tr.busid;
-+              return info->minor;
-+      }
-+      case BLKTAP_IOCTL_FREEINTF:
-+      {
-+              unsigned long dev = arg;
-+              unsigned long flags;
-+
-+              info = tapfds[dev];
-+
-+              if ((dev > MAX_TAP_DEV) || !info)
-+                      return 0; /* should this be an error? */
-+
-+              spin_lock_irqsave(&pending_free_lock, flags);
-+              if (info->dev_pending)
-+                      info->dev_pending = 0;
-+              spin_unlock_irqrestore(&pending_free_lock, flags);
-+
-+              return 0;
-+      }
-+      case BLKTAP_IOCTL_MINOR:
-+      {
-+              unsigned long dev = arg;
-+
-+              info = tapfds[dev];
-+
-+              if ((dev > MAX_TAP_DEV) || !info)
-+                      return -EINVAL;
-+
-+              return info->minor;
-+      }
-+      case BLKTAP_IOCTL_MAJOR:
-+              return blktap_major;
-+
-+      case BLKTAP_QUERY_ALLOC_REQS:
-+      {
-+              WPRINTK("BLKTAP_QUERY_ALLOC_REQS ioctl: %d/%d\n",
-+                     alloc_pending_reqs, blkif_reqs);
-+              return (alloc_pending_reqs/blkif_reqs) * 100;
-+      }
-+      }
-+      return -ENOIOCTLCMD;
-+}
-+
-+static unsigned int blktap_poll(struct file *filp, poll_table *wait)
-+{
-+      tap_blkif_t *info = filp->private_data;
-+      
-+      /* do not work on the control device */
-+      if (!info)
-+              return 0;
-+
-+      poll_wait(filp, &info->wait, wait);
-+      if (info->ufe_ring.req_prod_pvt != info->ufe_ring.sring->req_prod) {
-+              RING_PUSH_REQUESTS(&info->ufe_ring);
-+              return POLLIN | POLLRDNORM;
-+      }
-+      return 0;
-+}
-+
-+void blktap_kick_user(int idx)
-+{
-+      tap_blkif_t *info;
-+
-+      info = tapfds[idx];
-+
-+      if ((idx < 0) || (idx > MAX_TAP_DEV) || !info)
-+              return;
-+
-+      wake_up_interruptible(&info->wait);
-+
-+      return;
-+}
-+
-+static int do_block_io_op(blkif_t *blkif);
-+static void dispatch_rw_block_io(blkif_t *blkif,
-+                               blkif_request_t *req,
-+                               pending_req_t *pending_req);
-+static void make_response(blkif_t *blkif, u64 id,
-+                          unsigned short op, int st);
-+
-+/******************************************************************
-+ * misc small helpers
-+ */
-+static int req_increase(void)
-+{
-+      int i, j;
-+
-+      if (mmap_alloc >= MAX_PENDING_REQS || mmap_lock) 
-+              return -EINVAL;
-+
-+      pending_reqs[mmap_alloc]  = kzalloc(sizeof(pending_req_t)
-+                                          * blkif_reqs, GFP_KERNEL);
-+      foreign_pages[mmap_alloc] = alloc_empty_pages_and_pagevec(mmap_pages);
-+
-+      if (!pending_reqs[mmap_alloc] || !foreign_pages[mmap_alloc])
-+              goto out_of_memory;
-+
-+      DPRINTK("%s: reqs=%d, pages=%d\n",
-+              __FUNCTION__, blkif_reqs, mmap_pages);
-+
-+      for (i = 0; i < MAX_PENDING_REQS; i++) {
-+              list_add_tail(&pending_reqs[mmap_alloc][i].free_list, 
-+                            &pending_free);
-+              pending_reqs[mmap_alloc][i].mem_idx = mmap_alloc;
-+              for (j = 0; j < BLKIF_MAX_SEGMENTS_PER_REQUEST; j++)
-+                      BLKTAP_INVALIDATE_HANDLE(&pending_handle(mmap_alloc, 
-+                                                               i, j));
-+      }
-+
-+      mmap_alloc++;
-+      DPRINTK("# MMAPs increased to %d\n",mmap_alloc);
-+      return 0;
-+
-+ out_of_memory:
-+      free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
-+      kfree(pending_reqs[mmap_alloc]);
-+      WPRINTK("%s: out of memory\n", __FUNCTION__);
-+      return -ENOMEM;
-+}
-+
-+static void mmap_req_del(int mmap)
-+{
-+      BUG_ON(!spin_is_locked(&pending_free_lock));
-+
-+      kfree(pending_reqs[mmap]);
-+      pending_reqs[mmap] = NULL;
-+
-+      free_empty_pages_and_pagevec(foreign_pages[mmap_alloc], mmap_pages);
-+      foreign_pages[mmap] = NULL;
-+
-+      mmap_lock = 0;
-+      DPRINTK("# MMAPs decreased to %d\n",mmap_alloc);
-+      mmap_alloc--;
-+}
-+
-+static pending_req_t* alloc_req(void)
-+{
-+      pending_req_t *req = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+
-+      if (!list_empty(&pending_free)) {
-+              req = list_entry(pending_free.next, pending_req_t, free_list);
-+              list_del(&req->free_list);
-+      }
-+
-+      if (req) {
-+              req->inuse = 1;
-+              alloc_pending_reqs++;
-+      }
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+
-+      return req;
-+}
-+
-+static void free_req(pending_req_t *req)
-+{
-+      unsigned long flags;
-+      int was_empty;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+
-+      alloc_pending_reqs--;
-+      req->inuse = 0;
-+      if (mmap_lock && (req->mem_idx == mmap_alloc-1)) {
-+              mmap_inuse--;
-+              if (mmap_inuse == 0) mmap_req_del(mmap_alloc-1);
-+              spin_unlock_irqrestore(&pending_free_lock, flags);
-+              return;
-+      }
-+      was_empty = list_empty(&pending_free);
-+      list_add(&req->free_list, &pending_free);
-+
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+
-+      if (was_empty)
-+              wake_up(&pending_free_wq);
-+}
-+
-+static void fast_flush_area(pending_req_t *req, int k_idx, int u_idx,
-+                          int tapidx)
-+{
-+      struct gnttab_unmap_grant_ref unmap[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
-+      unsigned int i, invcount = 0, locked = 0;
-+      struct grant_handle_pair *khandle;
-+      uint64_t ptep;
-+      int ret, mmap_idx;
-+      unsigned long kvaddr, uvaddr;
-+      tap_blkif_t *info;
-+      struct mm_struct *mm;
-+      
-+
-+      info = tapfds[tapidx];
-+
-+      if ((tapidx < 0) || (tapidx > MAX_TAP_DEV) || !info) {
-+              WPRINTK("fast_flush: Couldn't get info!\n");
-+              return;
-+      }
-+
-+      mm = info->vma ? info->vma->vm_mm : NULL;
-+
-+      if (info->vma != NULL &&
-+          xen_feature(XENFEAT_auto_translated_physmap)) {
-+              down_write(&mm->mmap_sem);
-+              zap_page_range(info->vma, 
-+                             MMAP_VADDR(info->user_vstart, u_idx, 0), 
-+                             req->nr_pages << PAGE_SHIFT, NULL);
-+              up_write(&mm->mmap_sem);
-+              return;
-+      }
-+
-+      mmap_idx = req->mem_idx;
-+
-+      for (i = 0; i < req->nr_pages; i++) {
-+              kvaddr = idx_to_kaddr(mmap_idx, k_idx, i);
-+              uvaddr = MMAP_VADDR(info->user_vstart, u_idx, i);
-+
-+              khandle = &pending_handle(mmap_idx, k_idx, i);
-+
-+              if (khandle->kernel != INVALID_GRANT_HANDLE) {
-+                      gnttab_set_unmap_op(&unmap[invcount],
-+                                          idx_to_kaddr(mmap_idx, k_idx, i),
-+                                          GNTMAP_host_map, khandle->kernel);
-+                      invcount++;
-+
-+                      set_phys_to_machine(
-+                              __pa(idx_to_kaddr(mmap_idx, k_idx, i))
-+                              >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-+              }
-+
-+              if (khandle->user != INVALID_GRANT_HANDLE) {
-+                      BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
-+                      if (!locked++)
-+                              down_write(&mm->mmap_sem);
-+                      if (create_lookup_pte_addr(
-+                              mm,
-+                              MMAP_VADDR(info->user_vstart, u_idx, i),
-+                              &ptep) !=0) {
-+                              up_write(&mm->mmap_sem);
-+                              WPRINTK("Couldn't get a pte addr!\n");
-+                              return;
-+                      }
-+
-+                      gnttab_set_unmap_op(&unmap[invcount], ptep,
-+                                          GNTMAP_host_map
-+                                          | GNTMAP_application_map
-+                                          | GNTMAP_contains_pte,
-+                                          khandle->user);
-+                      invcount++;
-+              }
-+
-+              BLKTAP_INVALIDATE_HANDLE(khandle);
-+      }
-+      ret = HYPERVISOR_grant_table_op(
-+              GNTTABOP_unmap_grant_ref, unmap, invcount);
-+      BUG_ON(ret);
-+      
-+      if (info->vma != NULL &&
-+          !xen_feature(XENFEAT_auto_translated_physmap)) {
-+              if (!locked++)
-+                      down_write(&mm->mmap_sem);
-+              zap_page_range(info->vma, 
-+                             MMAP_VADDR(info->user_vstart, u_idx, 0), 
-+                             req->nr_pages << PAGE_SHIFT, NULL);
-+      }
-+
-+      if (locked)
-+              up_write(&mm->mmap_sem);
-+}
-+
-+/******************************************************************
-+ * SCHEDULER FUNCTIONS
-+ */
-+
-+static void print_stats(blkif_t *blkif)
-+{
-+      printk(KERN_DEBUG "%s: oo %3d  |  rd %4d  |  wr %4d\n",
-+             current->comm, blkif->st_oo_req,
-+             blkif->st_rd_req, blkif->st_wr_req);
-+      blkif->st_print = jiffies + msecs_to_jiffies(10 * 1000);
-+      blkif->st_rd_req = 0;
-+      blkif->st_wr_req = 0;
-+      blkif->st_oo_req = 0;
-+}
-+
-+int tap_blkif_schedule(void *arg)
-+{
-+      blkif_t *blkif = arg;
-+
-+      blkif_get(blkif);
-+
-+      if (debug_lvl)
-+              printk(KERN_DEBUG "%s: started\n", current->comm);
-+
-+      while (!kthread_should_stop()) {
-+              if (try_to_freeze())
-+                      continue;
-+
-+              wait_event_interruptible(
-+                      blkif->wq,
-+                      blkif->waiting_reqs || kthread_should_stop());
-+              wait_event_interruptible(
-+                      pending_free_wq,
-+                      !list_empty(&pending_free) || kthread_should_stop());
-+
-+              blkif->waiting_reqs = 0;
-+              smp_mb(); /* clear flag *before* checking for work */
-+
-+              if (do_block_io_op(blkif))
-+                      blkif->waiting_reqs = 1;
-+
-+              if (log_stats && time_after(jiffies, blkif->st_print))
-+                      print_stats(blkif);
-+      }
-+
-+      if (log_stats)
-+              print_stats(blkif);
-+      if (debug_lvl)
-+              printk(KERN_DEBUG "%s: exiting\n", current->comm);
-+
-+      blkif->xenblkd = NULL;
-+      blkif_put(blkif);
-+
-+      return 0;
-+}
-+
-+/******************************************************************
-+ * COMPLETION CALLBACK -- Called by user level ioctl()
-+ */
-+
-+static int blktap_read_ufe_ring(tap_blkif_t *info)
-+{
-+      /* This is called to read responses from the UFE ring. */
-+      RING_IDX i, j, rp;
-+      blkif_response_t *resp;
-+      blkif_t *blkif=NULL;
-+      int pending_idx, usr_idx, mmap_idx;
-+      pending_req_t *pending_req;
-+      
-+      if (!info)
-+              return 0;
-+
-+      /* We currently only forward packets in INTERCEPT_FE mode. */
-+      if (!(info->mode & BLKTAP_MODE_INTERCEPT_FE))
-+              return 0;
-+
-+      /* for each outstanding message on the UFEring  */
-+      rp = info->ufe_ring.sring->rsp_prod;
-+      rmb();
-+        
-+      for (i = info->ufe_ring.rsp_cons; i != rp; i++) {
-+              blkif_response_t res;
-+              resp = RING_GET_RESPONSE(&info->ufe_ring, i);
-+              memcpy(&res, resp, sizeof(res));
-+              mb(); /* rsp_cons read by RING_FULL() in do_block_io_op(). */
-+              ++info->ufe_ring.rsp_cons;
-+
-+              /*retrieve [usr_idx] to [mmap_idx,pending_idx] mapping*/
-+              usr_idx = (int)res.id;
-+              pending_idx = MASK_PEND_IDX(ID_TO_IDX(info->idx_map[usr_idx]));
-+              mmap_idx = ID_TO_MIDX(info->idx_map[usr_idx]);
-+
-+              if ( (mmap_idx >= mmap_alloc) || 
-+                 (ID_TO_IDX(info->idx_map[usr_idx]) >= MAX_PENDING_REQS) )
-+                      WPRINTK("Incorrect req map"
-+                             "[%d], internal map [%d,%d (%d)]\n", 
-+                             usr_idx, mmap_idx, 
-+                             ID_TO_IDX(info->idx_map[usr_idx]),
-+                             MASK_PEND_IDX(
-+                                     ID_TO_IDX(info->idx_map[usr_idx])));
-+
-+              pending_req = &pending_reqs[mmap_idx][pending_idx];
-+              blkif = pending_req->blkif;
-+
-+              for (j = 0; j < pending_req->nr_pages; j++) {
-+
-+                      unsigned long kvaddr, uvaddr;
-+                      struct page **map = info->vma->vm_private_data;
-+                      struct page *pg;
-+                      int offset;
-+
-+                      uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, j);
-+                      kvaddr = idx_to_kaddr(mmap_idx, pending_idx, j);
-+
-+                      pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-+                      ClearPageReserved(pg);
-+                      offset = (uvaddr - info->vma->vm_start) 
-+                              >> PAGE_SHIFT;
-+                      map[offset] = NULL;
-+              }
-+              fast_flush_area(pending_req, pending_idx, usr_idx, info->minor);
-+              info->idx_map[usr_idx] = INVALID_REQ;
-+              make_response(blkif, pending_req->id, res.operation,
-+                            res.status);
-+              blkif_put(pending_req->blkif);
-+              free_req(pending_req);
-+      }
-+              
-+      return 0;
-+}
-+
-+
-+/******************************************************************************
-+ * NOTIFICATION FROM GUEST OS.
-+ */
-+
-+static void blkif_notify_work(blkif_t *blkif)
-+{
-+      blkif->waiting_reqs = 1;
-+      wake_up(&blkif->wq);
-+}
-+
-+irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      blkif_notify_work(dev_id);
-+      return IRQ_HANDLED;
-+}
-+
-+
-+
-+/******************************************************************
-+ * DOWNWARD CALLS -- These interface with the block-device layer proper.
-+ */
-+static int print_dbug = 1;
-+static int do_block_io_op(blkif_t *blkif)
-+{
-+      blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-+      blkif_request_t req;
-+      pending_req_t *pending_req;
-+      RING_IDX rc, rp;
-+      int more_to_do = 0;
-+      tap_blkif_t *info;
-+
-+      rc = blk_rings->common.req_cons;
-+      rp = blk_rings->common.sring->req_prod;
-+      rmb(); /* Ensure we see queued requests up to 'rp'. */
-+
-+      /*Check blkif has corresponding UE ring*/
-+      if (blkif->dev_num < 0) {
-+              /*oops*/
-+              if (print_dbug) {
-+                      WPRINTK("Corresponding UE " 
-+                             "ring does not exist!\n");
-+                      print_dbug = 0; /*We only print this message once*/
-+              }
-+              return 0;
-+      }
-+
-+      info = tapfds[blkif->dev_num];
-+
-+      if (blkif->dev_num > MAX_TAP_DEV || !info || !info->dev_inuse) {
-+              if (print_dbug) {
-+                      WPRINTK("Can't get UE info!\n");
-+                      print_dbug = 0;
-+              }
-+              return 0;
-+      }
-+
-+      while (rc != rp) {
-+              
-+              if (RING_FULL(&info->ufe_ring)) {
-+                      WPRINTK("RING_FULL! More to do\n");
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              if (RING_REQUEST_CONS_OVERFLOW(&blk_rings->common, rc)) {
-+                      WPRINTK("RING_REQUEST_CONS_OVERFLOW!"
-+                             " More to do\n");
-+                      more_to_do = 1;
-+                      break;          
-+              }
-+
-+              pending_req = alloc_req();
-+              if (NULL == pending_req) {
-+                      blkif->st_oo_req++;
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              if (kthread_should_stop()) {
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              switch (blkif->blk_protocol) {
-+              case BLKIF_PROTOCOL_NATIVE:
-+                      memcpy(&req, RING_GET_REQUEST(&blk_rings->native, rc),
-+                             sizeof(req));
-+                      break;
-+              case BLKIF_PROTOCOL_X86_32:
-+                      blkif_get_x86_32_req(&req, RING_GET_REQUEST(&blk_rings->x86_32, rc));
-+                      break;
-+              case BLKIF_PROTOCOL_X86_64:
-+                      blkif_get_x86_64_req(&req, RING_GET_REQUEST(&blk_rings->x86_64, rc));
-+                      break;
-+              default:
-+                      BUG();
-+              }
-+              blk_rings->common.req_cons = ++rc; /* before make_response() */
-+
-+              /* Apply all sanity checks to /private copy/ of request. */
-+              barrier();
-+
-+              switch (req.operation) {
-+              case BLKIF_OP_READ:
-+                      blkif->st_rd_req++;
-+                      dispatch_rw_block_io(blkif, &req, pending_req);
-+                      break;
-+
-+              case BLKIF_OP_WRITE:
-+                      blkif->st_wr_req++;
-+                      dispatch_rw_block_io(blkif, &req, pending_req);
-+                      break;
-+
-+              default:
-+                      /* A good sign something is wrong: sleep for a while to
-+                       * avoid excessive CPU consumption by a bad guest. */
-+                      msleep(1);
-+                      WPRINTK("unknown operation [%d]\n",
-+                              req.operation);
-+                      make_response(blkif, req.id, req.operation,
-+                                    BLKIF_RSP_ERROR);
-+                      free_req(pending_req);
-+                      break;
-+              }
-+
-+              /* Yield point for this unbounded loop. */
-+              cond_resched();
-+      }
-+              
-+      blktap_kick_user(blkif->dev_num);
-+
-+      return more_to_do;
-+}
-+
-+static void dispatch_rw_block_io(blkif_t *blkif,
-+                               blkif_request_t *req,
-+                               pending_req_t *pending_req)
-+{
-+      extern void ll_rw_block(int rw, int nr, struct buffer_head * bhs[]);
-+      int op, operation = (req->operation == BLKIF_OP_WRITE) ? WRITE : READ;
-+      struct gnttab_map_grant_ref map[BLKIF_MAX_SEGMENTS_PER_REQUEST*2];
-+      unsigned int nseg;
-+      int ret, i, nr_sects = 0;
-+      tap_blkif_t *info;
-+      blkif_request_t *target;
-+      int pending_idx = RTN_PEND_IDX(pending_req,pending_req->mem_idx);
-+      int usr_idx;
-+      uint16_t mmap_idx = pending_req->mem_idx;
-+      struct mm_struct *mm;
-+
-+      if (blkif->dev_num < 0 || blkif->dev_num > MAX_TAP_DEV)
-+              goto fail_response;
-+
-+      info = tapfds[blkif->dev_num];
-+      if (info == NULL)
-+              goto fail_response;
-+
-+      /* Check we have space on user ring - should never fail. */
-+      usr_idx = GET_NEXT_REQ(info->idx_map);
-+      if (usr_idx == INVALID_REQ) {
-+              BUG();
-+              goto fail_response;
-+      }
-+
-+      /* Check that number of segments is sane. */
-+      nseg = req->nr_segments;
-+      if ( unlikely(nseg == 0) || 
-+          unlikely(nseg > BLKIF_MAX_SEGMENTS_PER_REQUEST) ) {
-+              WPRINTK("Bad number of segments in request (%d)\n", nseg);
-+              goto fail_response;
-+      }
-+      
-+      /* Make sure userspace is ready. */
-+      if (!info->ring_ok) {
-+              WPRINTK("blktap: ring not ready for requests!\n");
-+              goto fail_response;
-+      }
-+
-+      if (RING_FULL(&info->ufe_ring)) {
-+              WPRINTK("blktap: fe_ring is full, can't add "
-+                      "IO Request will be dropped. %d %d\n",
-+                      RING_SIZE(&info->ufe_ring),
-+                      RING_SIZE(&blkif->blk_rings.common));
-+              goto fail_response;
-+      }
-+
-+      pending_req->blkif     = blkif;
-+      pending_req->id        = req->id;
-+      pending_req->operation = operation;
-+      pending_req->status    = BLKIF_RSP_OKAY;
-+      pending_req->nr_pages  = nseg;
-+      op = 0;
-+      mm = info->vma->vm_mm;
-+      if (!xen_feature(XENFEAT_auto_translated_physmap))
-+              down_write(&mm->mmap_sem);
-+      for (i = 0; i < nseg; i++) {
-+              unsigned long uvaddr;
-+              unsigned long kvaddr;
-+              uint64_t ptep;
-+              uint32_t flags;
-+
-+              uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i);
-+              kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-+
-+              flags = GNTMAP_host_map;
-+              if (operation == WRITE)
-+                      flags |= GNTMAP_readonly;
-+              gnttab_set_map_op(&map[op], kvaddr, flags,
-+                                req->seg[i].gref, blkif->domid);
-+              op++;
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* Now map it to user. */
-+                      ret = create_lookup_pte_addr(mm, uvaddr, &ptep);
-+                      if (ret) {
-+                              up_write(&mm->mmap_sem);
-+                              WPRINTK("Couldn't get a pte addr!\n");
-+                              goto fail_flush;
-+                      }
-+
-+                      flags = GNTMAP_host_map | GNTMAP_application_map
-+                              | GNTMAP_contains_pte;
-+                      if (operation == WRITE)
-+                              flags |= GNTMAP_readonly;
-+                      gnttab_set_map_op(&map[op], ptep, flags,
-+                                        req->seg[i].gref, blkif->domid);
-+                      op++;
-+              }
-+
-+              nr_sects += (req->seg[i].last_sect - 
-+                           req->seg[i].first_sect + 1);
-+      }
-+
-+      ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, op);
-+      BUG_ON(ret);
-+
-+      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+              up_write(&mm->mmap_sem);
-+
-+              for (i = 0; i < (nseg*2); i+=2) {
-+                      unsigned long uvaddr;
-+                      unsigned long kvaddr;
-+                      unsigned long offset;
-+                      struct page *pg;
-+
-+                      uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i/2);
-+                      kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i/2);
-+
-+                      if (unlikely(map[i].status != 0)) {
-+                              WPRINTK("invalid kernel buffer -- "
-+                                      "could not remap it\n");
-+                              ret |= 1;
-+                              map[i].handle = INVALID_GRANT_HANDLE;
-+                      }
-+
-+                      if (unlikely(map[i+1].status != 0)) {
-+                              WPRINTK("invalid user buffer -- "
-+                                      "could not remap it\n");
-+                              ret |= 1;
-+                              map[i+1].handle = INVALID_GRANT_HANDLE;
-+                      }
-+
-+                      pending_handle(mmap_idx, pending_idx, i/2).kernel 
-+                              = map[i].handle;
-+                      pending_handle(mmap_idx, pending_idx, i/2).user   
-+                              = map[i+1].handle;
-+
-+                      if (ret)
-+                              continue;
-+
-+                      set_phys_to_machine(__pa(kvaddr) >> PAGE_SHIFT,
-+                                          FOREIGN_FRAME(map[i].dev_bus_addr
-+                                                        >> PAGE_SHIFT));
-+                      offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT;
-+                      pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-+                      ((struct page **)info->vma->vm_private_data)[offset] =
-+                              pg;
-+              }
-+      } else {
-+              for (i = 0; i < nseg; i++) {
-+                      unsigned long uvaddr;
-+                      unsigned long kvaddr;
-+                      unsigned long offset;
-+                      struct page *pg;
-+
-+                      uvaddr = MMAP_VADDR(info->user_vstart, usr_idx, i);
-+                      kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-+
-+                      if (unlikely(map[i].status != 0)) {
-+                              WPRINTK("invalid kernel buffer -- "
-+                                      "could not remap it\n");
-+                              ret |= 1;
-+                              map[i].handle = INVALID_GRANT_HANDLE;
-+                      }
-+
-+                      pending_handle(mmap_idx, pending_idx, i).kernel 
-+                              = map[i].handle;
-+
-+                      if (ret)
-+                              continue;
-+
-+                      offset = (uvaddr - info->vma->vm_start) >> PAGE_SHIFT;
-+                      pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-+                      ((struct page **)info->vma->vm_private_data)[offset] =
-+                              pg;
-+              }
-+      }
-+
-+      if (ret)
-+              goto fail_flush;
-+
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              down_write(&mm->mmap_sem);
-+      /* Mark mapped pages as reserved: */
-+      for (i = 0; i < req->nr_segments; i++) {
-+              unsigned long kvaddr;
-+              struct page *pg;
-+
-+              kvaddr = idx_to_kaddr(mmap_idx, pending_idx, i);
-+              pg = pfn_to_page(__pa(kvaddr) >> PAGE_SHIFT);
-+              SetPageReserved(pg);
-+              if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      ret = vm_insert_page(info->vma,
-+                                           MMAP_VADDR(info->user_vstart,
-+                                                      usr_idx, i), pg);
-+                      if (ret) {
-+                              up_write(&mm->mmap_sem);
-+                              goto fail_flush;
-+                      }
-+              }
-+      }
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              up_write(&mm->mmap_sem);
-+      
-+      /*record [mmap_idx,pending_idx] to [usr_idx] mapping*/
-+      info->idx_map[usr_idx] = MAKE_ID(mmap_idx, pending_idx);
-+
-+      blkif_get(blkif);
-+      /* Finally, write the request message to the user ring. */
-+      target = RING_GET_REQUEST(&info->ufe_ring,
-+                                info->ufe_ring.req_prod_pvt);
-+      memcpy(target, req, sizeof(*req));
-+      target->id = usr_idx;
-+      wmb(); /* blktap_poll() reads req_prod_pvt asynchronously */
-+      info->ufe_ring.req_prod_pvt++;
-+
-+      if (operation == READ)
-+              blkif->st_rd_sect += nr_sects;
-+      else if (operation == WRITE)
-+              blkif->st_wr_sect += nr_sects;
-+
-+      return;
-+
-+ fail_flush:
-+      WPRINTK("Reached Fail_flush\n");
-+      fast_flush_area(pending_req, pending_idx, usr_idx, blkif->dev_num);
-+ fail_response:
-+      make_response(blkif, req->id, req->operation, BLKIF_RSP_ERROR);
-+      free_req(pending_req);
-+      msleep(1); /* back off a bit */
-+}
-+
-+
-+
-+/******************************************************************
-+ * MISCELLANEOUS SETUP / TEARDOWN / DEBUGGING
-+ */
-+
-+
-+static void make_response(blkif_t *blkif, u64 id,
-+                          unsigned short op, int st)
-+{
-+      blkif_response_t  resp;
-+      unsigned long     flags;
-+      blkif_back_rings_t *blk_rings = &blkif->blk_rings;
-+      int more_to_do = 0;
-+      int notify;
-+
-+      resp.id        = id;
-+      resp.operation = op;
-+      resp.status    = st;
-+
-+      spin_lock_irqsave(&blkif->blk_ring_lock, flags);
-+      /* Place on the response ring for the relevant domain. */
-+      switch (blkif->blk_protocol) {
-+      case BLKIF_PROTOCOL_NATIVE:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->native,
-+                                       blk_rings->native.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      case BLKIF_PROTOCOL_X86_32:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->x86_32,
-+                                       blk_rings->x86_32.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      case BLKIF_PROTOCOL_X86_64:
-+              memcpy(RING_GET_RESPONSE(&blk_rings->x86_64,
-+                                       blk_rings->x86_64.rsp_prod_pvt),
-+                     &resp, sizeof(resp));
-+              break;
-+      default:
-+              BUG();
-+      }
-+      blk_rings->common.rsp_prod_pvt++;
-+      RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&blk_rings->common, notify);
-+
-+      if (blk_rings->common.rsp_prod_pvt == blk_rings->common.req_cons) {
-+              /*
-+               * Tail check for pending requests. Allows frontend to avoid
-+               * notifications if requests are already in flight (lower
-+               * overheads and promotes batching).
-+               */
-+              RING_FINAL_CHECK_FOR_REQUESTS(&blk_rings->common, more_to_do);
-+      } else if (RING_HAS_UNCONSUMED_REQUESTS(&blk_rings->common)) {
-+              more_to_do = 1;
-+      }
-+
-+      spin_unlock_irqrestore(&blkif->blk_ring_lock, flags);
-+      if (more_to_do)
-+              blkif_notify_work(blkif);
-+      if (notify)
-+              notify_remote_via_irq(blkif->irq);
-+}
-+
-+static int __init blkif_init(void)
-+{
-+      int i, ret;
-+      struct class *class;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      INIT_LIST_HEAD(&pending_free);
-+        for(i = 0; i < 2; i++) {
-+              ret = req_increase();
-+              if (ret)
-+                      break;
-+      }
-+      if (i == 0)
-+              return ret;
-+
-+      tap_blkif_interface_init();
-+
-+      alloc_pending_reqs = 0;
-+
-+      tap_blkif_xenbus_init();
-+
-+      /* Dynamically allocate a major for this device */
-+      ret = register_chrdev(0, "blktap", &blktap_fops);
-+
-+      if (ret < 0) {
-+              WPRINTK("Couldn't register /dev/xen/blktap\n");
-+              return -ENOMEM;
-+      }       
-+      
-+      blktap_major = ret;
-+
-+      /* tapfds[0] is always NULL */
-+      blktap_next_minor++;
-+
-+      DPRINTK("Created misc_dev [/dev/xen/blktap%d]\n",i);
-+
-+      /* Make sure the xen class exists */
-+      if ((class = get_xen_class()) != NULL) {
-+              /*
-+               * This will allow udev to create the blktap ctrl device.
-+               * We only want to create blktap0 first.  We don't want
-+               * to flood the sysfs system with needless blktap devices.
-+               * We only create the device when a request of a new device is
-+               * made.
-+               */
-+              class_device_create(class, NULL,
-+                                  MKDEV(blktap_major, 0), NULL,
-+                                  "blktap0");
-+      } else {
-+              /* this is bad, but not fatal */
-+              WPRINTK("blktap: sysfs xen_class not created\n");
-+      }
-+
-+      DPRINTK("Blktap device successfully created\n");
-+
-+      return 0;
-+}
-+
-+module_init(blkif_init);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/blktap/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blktap/common.h        2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,122 @@
-+/* 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __BLKIF__BACKEND__COMMON_H__
-+#define __BLKIF__BACKEND__COMMON_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+#include <linux/blkdev.h>
-+#include <linux/vmalloc.h>
-+#include <asm/io.h>
-+#include <asm/setup.h>
-+#include <asm/pgalloc.h>
-+#include <xen/evtchn.h>
-+#include <asm/hypervisor.h>
-+#include <xen/blkif.h>
-+#include <xen/gnttab.h>
-+#include <xen/driver_util.h>
-+
-+#define DPRINTK(_f, _a...) pr_debug("(file=%s, line=%d) " _f, \
-+                                    __FILE__ , __LINE__ , ## _a )
-+
-+#define WPRINTK(fmt, args...) printk(KERN_WARNING "blk_tap: " fmt, ##args)
-+
-+struct backend_info;
-+
-+typedef struct blkif_st {
-+      /* Unique identifier for this interface. */
-+      domid_t           domid;
-+      unsigned int      handle;
-+      /* Physical parameters of the comms window. */
-+      unsigned int      irq;
-+      /* Comms information. */
-+      enum blkif_protocol blk_protocol;
-+      blkif_back_rings_t blk_rings;
-+      struct vm_struct *blk_ring_area;
-+      /* Back pointer to the backend_info. */
-+      struct backend_info *be;
-+      /* Private fields. */
-+      spinlock_t       blk_ring_lock;
-+      atomic_t         refcnt;
-+
-+      wait_queue_head_t   wq;
-+      struct task_struct  *xenblkd;
-+      unsigned int        waiting_reqs;
-+      request_queue_t     *plug;
-+
-+      /* statistics */
-+      unsigned long       st_print;
-+      int                 st_rd_req;
-+      int                 st_wr_req;
-+      int                 st_oo_req;
-+      int                 st_rd_sect;
-+      int                 st_wr_sect;
-+
-+      wait_queue_head_t waiting_to_free;
-+
-+      grant_handle_t shmem_handle;
-+      grant_ref_t    shmem_ref;
-+      
-+      int             dev_num;
-+      uint64_t        sectors;
-+} blkif_t;
-+
-+blkif_t *tap_alloc_blkif(domid_t domid);
-+void tap_blkif_free(blkif_t *blkif);
-+void tap_blkif_kmem_cache_free(blkif_t *blkif);
-+int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, 
-+                unsigned int evtchn);
-+void tap_blkif_unmap(blkif_t *blkif);
-+
-+#define blkif_get(_b) (atomic_inc(&(_b)->refcnt))
-+#define blkif_put(_b)                                 \
-+      do {                                            \
-+              if (atomic_dec_and_test(&(_b)->refcnt)) \
-+                      wake_up(&(_b)->waiting_to_free);\
-+      } while (0)
-+
-+
-+struct phys_req {
-+      unsigned short       dev;
-+      unsigned short       nr_sects;
-+      struct block_device *bdev;
-+      blkif_sector_t       sector_number;
-+};
-+
-+void tap_blkif_interface_init(void);
-+
-+void tap_blkif_xenbus_init(void);
-+
-+irqreturn_t tap_blkif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-+int tap_blkif_schedule(void *arg);
-+
-+int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif);
-+void signal_tapdisk(int idx);
-+
-+#endif /* __BLKIF__BACKEND__COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/blktap/interface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blktap/interface.c     2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,181 @@
-+/******************************************************************************
-+ * drivers/xen/blktap/interface.c
-+ * 
-+ * Block-device interface management.
-+ * 
-+ * Copyright (c) 2004, Keir Fraser
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+
-+ */
-+
-+#include "common.h"
-+#include <xen/evtchn.h>
-+
-+static kmem_cache_t *blkif_cachep;
-+
-+blkif_t *tap_alloc_blkif(domid_t domid)
-+{
-+      blkif_t *blkif;
-+
-+      blkif = kmem_cache_alloc(blkif_cachep, GFP_KERNEL);
-+      if (!blkif)
-+              return ERR_PTR(-ENOMEM);
-+
-+      memset(blkif, 0, sizeof(*blkif));
-+      blkif->domid = domid;
-+      spin_lock_init(&blkif->blk_ring_lock);
-+      atomic_set(&blkif->refcnt, 1);
-+      init_waitqueue_head(&blkif->wq);
-+      blkif->st_print = jiffies;
-+      init_waitqueue_head(&blkif->waiting_to_free);
-+
-+      return blkif;
-+}
-+
-+static int map_frontend_page(blkif_t *blkif, unsigned long shared_page)
-+{
-+      struct gnttab_map_grant_ref op;
-+
-+      gnttab_set_map_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-+                        GNTMAP_host_map, shared_page, blkif->domid);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status) {
-+              DPRINTK(" Grant table operation failure !\n");
-+              return op.status;
-+      }
-+
-+      blkif->shmem_ref = shared_page;
-+      blkif->shmem_handle = op.handle;
-+
-+      return 0;
-+}
-+
-+static void unmap_frontend_page(blkif_t *blkif)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)blkif->blk_ring_area->addr,
-+                          GNTMAP_host_map, blkif->shmem_handle);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+}
-+
-+int tap_blkif_map(blkif_t *blkif, unsigned long shared_page, 
-+                unsigned int evtchn)
-+{
-+      int err;
-+
-+      /* Already connected through? */
-+      if (blkif->irq)
-+              return 0;
-+
-+      if ( (blkif->blk_ring_area = alloc_vm_area(PAGE_SIZE)) == NULL )
-+              return -ENOMEM;
-+
-+      err = map_frontend_page(blkif, shared_page);
-+      if (err) {
-+              free_vm_area(blkif->blk_ring_area);
-+              return err;
-+      }
-+
-+      switch (blkif->blk_protocol) {
-+      case BLKIF_PROTOCOL_NATIVE:
-+      {
-+              blkif_sring_t *sring;
-+              sring = (blkif_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.native, sring, PAGE_SIZE);
-+              break;
-+      }
-+      case BLKIF_PROTOCOL_X86_32:
-+      {
-+              blkif_x86_32_sring_t *sring_x86_32;
-+              sring_x86_32 = (blkif_x86_32_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.x86_32, sring_x86_32, PAGE_SIZE);
-+              break;
-+      }
-+      case BLKIF_PROTOCOL_X86_64:
-+      {
-+              blkif_x86_64_sring_t *sring_x86_64;
-+              sring_x86_64 = (blkif_x86_64_sring_t *)blkif->blk_ring_area->addr;
-+              BACK_RING_INIT(&blkif->blk_rings.x86_64, sring_x86_64, PAGE_SIZE);
-+              break;
-+      }
-+      default:
-+              BUG();
-+      }
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+              blkif->domid, evtchn, tap_blkif_be_int,
-+              0, "blkif-backend", blkif);
-+      if (err < 0) {
-+              unmap_frontend_page(blkif);
-+              free_vm_area(blkif->blk_ring_area);
-+              blkif->blk_rings.common.sring = NULL;
-+              return err;
-+      }
-+      blkif->irq = err;
-+
-+      return 0;
-+}
-+
-+void tap_blkif_unmap(blkif_t *blkif)
-+{
-+      if (blkif->irq) {
-+              unbind_from_irqhandler(blkif->irq, blkif);
-+              blkif->irq = 0;
-+      }
-+      if (blkif->blk_rings.common.sring) {
-+              unmap_frontend_page(blkif);
-+              free_vm_area(blkif->blk_ring_area);
-+              blkif->blk_rings.common.sring = NULL;
-+      }
-+}
-+
-+void tap_blkif_free(blkif_t *blkif)
-+{
-+      atomic_dec(&blkif->refcnt);
-+      wait_event(blkif->waiting_to_free, atomic_read(&blkif->refcnt) == 0);
-+      atomic_inc(&blkif->refcnt);
-+
-+      tap_blkif_unmap(blkif);
-+}
-+
-+void tap_blkif_kmem_cache_free(blkif_t *blkif)
-+{
-+      if (!atomic_dec_and_test(&blkif->refcnt))
-+              BUG();
-+      kmem_cache_free(blkif_cachep, blkif);
-+}
-+
-+void __init tap_blkif_interface_init(void)
-+{
-+      blkif_cachep = kmem_cache_create("blktapif_cache", sizeof(blkif_t), 
-+                                       0, 0, NULL, NULL);
-+}
-Index: head-2008-11-25/drivers/xen/blktap/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/blktap/xenbus.c        2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,479 @@
-+/* drivers/xen/blktap/xenbus.c
-+ *
-+ * Xenbus code for blktap
-+ *
-+ * Copyright (c) 2004-2005, Andrew Warfield and Julian Chesterfield
-+ *
-+ * Based on the blkback xenbus code:
-+ *
-+ * Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-+ * Copyright (C) 2005 XenSource Ltd
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <stdarg.h>
-+#include <linux/module.h>
-+#include <linux/kthread.h>
-+#include <xen/xenbus.h>
-+#include "common.h"
-+
-+
-+struct backend_info
-+{
-+      struct xenbus_device *dev;
-+      blkif_t *blkif;
-+      struct xenbus_watch backend_watch;
-+      int xenbus_id;
-+      int group_added;
-+};
-+
-+
-+static void connect(struct backend_info *);
-+static int connect_ring(struct backend_info *);
-+static int blktap_remove(struct xenbus_device *dev);
-+static int blktap_probe(struct xenbus_device *dev,
-+                       const struct xenbus_device_id *id);
-+static void tap_backend_changed(struct xenbus_watch *, const char **,
-+                          unsigned int);
-+static void tap_frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state);
-+
-+static int strsep_len(const char *str, char c, unsigned int len)
-+{
-+        unsigned int i;
-+
-+        for (i = 0; str[i]; i++)
-+                if (str[i] == c) {
-+                        if (len == 0)
-+                                return i;
-+                        len--;
-+                }
-+        return (len == 0) ? i : -ERANGE;
-+}
-+
-+static long get_id(const char *str)
-+{
-+        int len,end;
-+        const char *ptr;
-+        char *tptr, num[10];
-+      
-+        len = strsep_len(str, '/', 2);
-+        end = strlen(str);
-+        if ( (len < 0) || (end < 0) ) return -1;
-+      
-+        ptr = str + len + 1;
-+        strncpy(num,ptr,end - len);
-+        tptr = num + (end - (len + 1));
-+        *tptr = '\0';
-+      DPRINTK("Get_id called for %s (%s)\n",str,num);
-+      
-+        return simple_strtol(num, NULL, 10);
-+}                             
-+
-+static int blktap_name(blkif_t *blkif, char *buf)
-+{
-+      char *devpath, *devname;
-+      struct xenbus_device *dev = blkif->be->dev;
-+
-+      devpath = xenbus_read(XBT_NIL, dev->nodename, "dev", NULL);
-+      if (IS_ERR(devpath)) 
-+              return PTR_ERR(devpath);
-+      
-+      if ((devname = strstr(devpath, "/dev/")) != NULL)
-+              devname += strlen("/dev/");
-+      else
-+              devname  = devpath;
-+
-+      snprintf(buf, TASK_COMM_LEN, "blktap.%d.%s", blkif->domid, devname);
-+      kfree(devpath);
-+      
-+      return 0;
-+}
-+
-+/****************************************************************
-+ *  sysfs interface for I/O requests of blktap device
-+ */
-+
-+#define VBD_SHOW(name, format, args...)                                       \
-+      static ssize_t show_##name(struct device *_dev,                 \
-+                                 struct device_attribute *attr,       \
-+                                 char *buf)                           \
-+      {                                                               \
-+              struct xenbus_device *dev = to_xenbus_device(_dev);     \
-+              struct backend_info *be = dev->dev.driver_data;         \
-+                                                                      \
-+              return sprintf(buf, format, ##args);                    \
-+      }                                                               \
-+      static DEVICE_ATTR(name, S_IRUGO, show_##name, NULL)
-+
-+VBD_SHOW(oo_req,  "%d\n", be->blkif->st_oo_req);
-+VBD_SHOW(rd_req,  "%d\n", be->blkif->st_rd_req);
-+VBD_SHOW(wr_req,  "%d\n", be->blkif->st_wr_req);
-+VBD_SHOW(rd_sect, "%d\n", be->blkif->st_rd_sect);
-+VBD_SHOW(wr_sect, "%d\n", be->blkif->st_wr_sect);
-+
-+static struct attribute *tapstat_attrs[] = {
-+      &dev_attr_oo_req.attr,
-+      &dev_attr_rd_req.attr,
-+      &dev_attr_wr_req.attr,
-+      &dev_attr_rd_sect.attr,
-+      &dev_attr_wr_sect.attr,
-+      NULL
-+};
-+
-+static struct attribute_group tapstat_group = {
-+      .name = "statistics",
-+      .attrs = tapstat_attrs,
-+};
-+
-+int xentap_sysfs_addif(struct xenbus_device *dev)
-+{
-+      int err;
-+      struct backend_info *be = dev->dev.driver_data;
-+      err = sysfs_create_group(&dev->dev.kobj, &tapstat_group);
-+      if (!err)
-+              be->group_added = 1;
-+      return err;
-+}
-+
-+void xentap_sysfs_delif(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+      sysfs_remove_group(&dev->dev.kobj, &tapstat_group);
-+      be->group_added = 0;
-+}
-+
-+static int blktap_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      if (be->group_added)
-+              xentap_sysfs_delif(be->dev);
-+      if (be->backend_watch.node) {
-+              unregister_xenbus_watch(&be->backend_watch);
-+              kfree(be->backend_watch.node);
-+              be->backend_watch.node = NULL;
-+      }
-+      if (be->blkif) {
-+              if (be->blkif->xenblkd)
-+                      kthread_stop(be->blkif->xenblkd);
-+              signal_tapdisk(be->blkif->dev_num);
-+              tap_blkif_free(be->blkif);
-+              tap_blkif_kmem_cache_free(be->blkif);
-+              be->blkif = NULL;
-+      }
-+      kfree(be);
-+      dev->dev.driver_data = NULL;
-+      return 0;
-+}
-+
-+static void tap_update_blkif_status(blkif_t *blkif)
-+{ 
-+      int err;
-+      char name[TASK_COMM_LEN];
-+
-+      /* Not ready to connect? */
-+      if(!blkif->irq || !blkif->sectors) {
-+              return;
-+      } 
-+
-+      /* Already connected? */
-+      if (blkif->be->dev->state == XenbusStateConnected)
-+              return;
-+
-+      /* Attempt to connect: exit if we fail to. */
-+      connect(blkif->be);
-+      if (blkif->be->dev->state != XenbusStateConnected)
-+              return;
-+
-+      err = blktap_name(blkif, name);
-+      if (err) {
-+              xenbus_dev_error(blkif->be->dev, err, "get blktap dev name");
-+              return;
-+      }
-+
-+      if (!blkif->be->group_added) {
-+              err = xentap_sysfs_addif(blkif->be->dev);
-+              if (err) {
-+                      xenbus_dev_fatal(blkif->be->dev, err, 
-+                                       "creating sysfs entries");
-+                      return;
-+              }
-+      }
-+
-+      blkif->xenblkd = kthread_run(tap_blkif_schedule, blkif, name);
-+      if (IS_ERR(blkif->xenblkd)) {
-+              err = PTR_ERR(blkif->xenblkd);
-+              blkif->xenblkd = NULL;
-+              xenbus_dev_fatal(blkif->be->dev, err, "start xenblkd");
-+              WPRINTK("Error starting thread\n");
-+      }
-+}
-+
-+/**
-+ * Entry point to this code when a new device is created.  Allocate
-+ * the basic structures, and watch the store waiting for the
-+ * user-space program to tell us the physical device info.  Switch to
-+ * InitWait.
-+ */
-+static int blktap_probe(struct xenbus_device *dev,
-+                       const struct xenbus_device_id *id)
-+{
-+      int err;
-+      struct backend_info *be = kzalloc(sizeof(struct backend_info),
-+                                        GFP_KERNEL);
-+      if (!be) {
-+              xenbus_dev_fatal(dev, -ENOMEM,
-+                               "allocating backend structure");
-+              return -ENOMEM;
-+      }
-+
-+      be->dev = dev;
-+      dev->dev.driver_data = be;
-+      be->xenbus_id = get_id(dev->nodename);
-+
-+      be->blkif = tap_alloc_blkif(dev->otherend_id);
-+      if (IS_ERR(be->blkif)) {
-+              err = PTR_ERR(be->blkif);
-+              be->blkif = NULL;
-+              xenbus_dev_fatal(dev, err, "creating block interface");
-+              goto fail;
-+      }
-+
-+      /* setup back pointer */
-+      be->blkif->be = be;
-+      be->blkif->sectors = 0;
-+
-+      /* set a watch on disk info, waiting for userspace to update details*/
-+      err = xenbus_watch_path2(dev, dev->nodename, "info",
-+                               &be->backend_watch, tap_backend_changed);
-+      if (err)
-+              goto fail;
-+      
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err)
-+              goto fail;
-+      return 0;
-+
-+fail:
-+      DPRINTK("blktap probe failed\n");
-+      blktap_remove(dev);
-+      return err;
-+}
-+
-+
-+/**
-+ * Callback received when the user space code has placed the device
-+ * information in xenstore. 
-+ */
-+static void tap_backend_changed(struct xenbus_watch *watch,
-+                          const char **vec, unsigned int len)
-+{
-+      int err;
-+      unsigned long info;
-+      struct backend_info *be
-+              = container_of(watch, struct backend_info, backend_watch);
-+      struct xenbus_device *dev = be->dev;
-+      
-+      /** 
-+       * Check to see whether userspace code has opened the image 
-+       * and written sector
-+       * and disk info to xenstore
-+       */
-+      err = xenbus_gather(XBT_NIL, dev->nodename, "info", "%lu", &info, 
-+                          NULL);
-+      if (XENBUS_EXIST_ERR(err))
-+              return;
-+      if (err) {
-+              xenbus_dev_error(dev, err, "getting info");
-+              return;
-+      }
-+
-+      DPRINTK("Userspace update on disk info, %lu\n",info);
-+
-+      err = xenbus_gather(XBT_NIL, dev->nodename, "sectors", "%llu", 
-+                          &be->blkif->sectors, NULL);
-+
-+      /* Associate tap dev with domid*/
-+      be->blkif->dev_num = dom_to_devid(be->blkif->domid, be->xenbus_id, 
-+                                        be->blkif);
-+      DPRINTK("Thread started for domid [%d], connecting disk\n", 
-+              be->blkif->dev_num);
-+
-+      tap_update_blkif_status(be->blkif);
-+}
-+
-+/**
-+ * Callback received when the frontend's state changes.
-+ */
-+static void tap_frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+      int err;
-+
-+      DPRINTK("\n");
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+              if (dev->state == XenbusStateClosed) {
-+                      printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-+                             __FUNCTION__, dev->nodename);
-+                      xenbus_switch_state(dev, XenbusStateInitWait);
-+              }
-+              break;
-+
-+      case XenbusStateInitialised:
-+      case XenbusStateConnected:
-+              /* Ensure we connect even when two watches fire in 
-+                 close successsion and we miss the intermediate value 
-+                 of frontend_state. */
-+              if (dev->state == XenbusStateConnected)
-+                      break;
-+
-+              err = connect_ring(be);
-+              if (err)
-+                      break;
-+              tap_update_blkif_status(be->blkif);
-+              break;
-+
-+      case XenbusStateClosing:
-+              if (be->blkif->xenblkd) {
-+                      kthread_stop(be->blkif->xenblkd);
-+                      be->blkif->xenblkd = NULL;
-+              }
-+              tap_blkif_free(be->blkif);
-+              xenbus_switch_state(dev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateClosed:
-+              xenbus_switch_state(dev, XenbusStateClosed);
-+              if (xenbus_dev_is_online(dev))
-+                      break;
-+              /* fall through if not online */
-+      case XenbusStateUnknown:
-+              device_unregister(&dev->dev);
-+              break;
-+
-+      default:
-+              xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-+                               frontend_state);
-+              break;
-+      }
-+}
-+
-+
-+/**
-+ * Switch to Connected state.
-+ */
-+static void connect(struct backend_info *be)
-+{
-+      int err;
-+
-+      struct xenbus_device *dev = be->dev;
-+
-+      err = xenbus_switch_state(dev, XenbusStateConnected);
-+      if (err)
-+              xenbus_dev_fatal(dev, err, "switching to Connected state",
-+                               dev->nodename);
-+
-+      return;
-+}
-+
-+
-+static int connect_ring(struct backend_info *be)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long ring_ref;
-+      unsigned int evtchn;
-+      char protocol[64];
-+      int err;
-+
-+      DPRINTK("%s\n", dev->otherend);
-+
-+      err = xenbus_gather(XBT_NIL, dev->otherend, "ring-ref", "%lu", 
-+                          &ring_ref, "event-channel", "%u", &evtchn, NULL);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err,
-+                               "reading %s/ring-ref and event-channel",
-+                               dev->otherend);
-+              return err;
-+      }
-+
-+      be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-+      err = xenbus_gather(XBT_NIL, dev->otherend, "protocol",
-+                          "%63s", protocol, NULL);
-+      if (err)
-+              strcpy(protocol, "unspecified, assuming native");
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_NATIVE))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_NATIVE;
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_32))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_32;
-+      else if (0 == strcmp(protocol, XEN_IO_PROTO_ABI_X86_64))
-+              be->blkif->blk_protocol = BLKIF_PROTOCOL_X86_64;
-+      else {
-+              xenbus_dev_fatal(dev, err, "unknown fe protocol %s", protocol);
-+              return -1;
-+      }
-+      printk(KERN_INFO
-+             "blktap: ring-ref %ld, event-channel %d, protocol %d (%s)\n",
-+             ring_ref, evtchn, be->blkif->blk_protocol, protocol);
-+
-+      /* Map the shared frame, irq etc. */
-+      err = tap_blkif_map(be->blkif, ring_ref, evtchn);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "mapping ring-ref %lu port %u",
-+                               ring_ref, evtchn);
-+              return err;
-+      } 
-+
-+      return 0;
-+}
-+
-+
-+/* ** Driver Registration ** */
-+
-+
-+static const struct xenbus_device_id blktap_ids[] = {
-+      { "tap" },
-+      { "" }
-+};
-+
-+
-+static struct xenbus_driver blktap = {
-+      .name = "tap",
-+      .owner = THIS_MODULE,
-+      .ids = blktap_ids,
-+      .probe = blktap_probe,
-+      .remove = blktap_remove,
-+      .otherend_changed = tap_frontend_changed
-+};
-+
-+
-+void tap_blkif_xenbus_init(void)
-+{
-+      xenbus_register_backend(&blktap);
-+}
-Index: head-2008-11-25/drivers/xen/char/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/char/Makefile  2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1 @@
-+obj-$(CONFIG_XEN_DEVMEM)      := mem.o
-Index: head-2008-11-25/drivers/xen/char/mem.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/char/mem.c     2007-08-06 15:10:49.000000000 +0200
-@@ -0,0 +1,190 @@
-+/*
-+ *  Originally from linux/drivers/char/mem.c
-+ *
-+ *  Copyright (C) 1991, 1992  Linus Torvalds
-+ *
-+ *  Added devfs support. 
-+ *    Jan-11-1998, C. Scott Ananian <cananian@alumni.princeton.edu>
-+ *  Shared /dev/zero mmaping support, Feb 2000, Kanoj Sarcar <kanoj@sgi.com>
-+ */
-+
-+#include <linux/mm.h>
-+#include <linux/miscdevice.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/mman.h>
-+#include <linux/random.h>
-+#include <linux/init.h>
-+#include <linux/raw.h>
-+#include <linux/tty.h>
-+#include <linux/capability.h>
-+#include <linux/smp_lock.h>
-+#include <linux/ptrace.h>
-+#include <linux/device.h>
-+#include <asm/pgalloc.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <asm/hypervisor.h>
-+
-+static inline int uncached_access(struct file *file)
-+{
-+      if (file->f_flags & O_SYNC)
-+              return 1;
-+      /* Xen sets correct MTRR type on non-RAM for us. */
-+      return 0;
-+}
-+
-+/*
-+ * This funcion reads the *physical* memory. The f_pos points directly to the 
-+ * memory location. 
-+ */
-+static ssize_t read_mem(struct file * file, char __user * buf,
-+                      size_t count, loff_t *ppos)
-+{
-+      unsigned long p = *ppos, ignored;
-+      ssize_t read = 0, sz;
-+      void __iomem *v;
-+
-+      while (count > 0) {
-+              /*
-+               * Handle first page in case it's not aligned
-+               */
-+              if (-p & (PAGE_SIZE - 1))
-+                      sz = -p & (PAGE_SIZE - 1);
-+              else
-+                      sz = PAGE_SIZE;
-+
-+              sz = min_t(unsigned long, sz, count);
-+
-+              v = ioremap(p, sz);
-+              if (IS_ERR(v) || v == NULL) {
-+                      /*
-+                       * Some programs (e.g., dmidecode) groove off into
-+                       * weird RAM areas where no tables can possibly exist
-+                       * (because Xen will have stomped on them!). These
-+                       * programs get rather upset if we let them know that
-+                       * Xen failed their access, so we fake out a read of
-+                       * all zeroes.
-+                       */
-+                      if (clear_user(buf, count))
-+                              return -EFAULT;
-+                      read += count;
-+                      break;
-+              }
-+
-+              ignored = copy_to_user(buf, v, sz);
-+              iounmap(v);
-+              if (ignored)
-+                      return -EFAULT;
-+              buf += sz;
-+              p += sz;
-+              count -= sz;
-+              read += sz;
-+      }
-+
-+      *ppos += read;
-+      return read;
-+}
-+
-+static ssize_t write_mem(struct file * file, const char __user * buf, 
-+                       size_t count, loff_t *ppos)
-+{
-+      unsigned long p = *ppos, ignored;
-+      ssize_t written = 0, sz;
-+      void __iomem *v;
-+
-+      while (count > 0) {
-+              /*
-+               * Handle first page in case it's not aligned
-+               */
-+              if (-p & (PAGE_SIZE - 1))
-+                      sz = -p & (PAGE_SIZE - 1);
-+              else
-+                      sz = PAGE_SIZE;
-+
-+              sz = min_t(unsigned long, sz, count);
-+
-+              v = ioremap(p, sz);
-+              if (v == NULL)
-+                      break;
-+              if (IS_ERR(v)) {
-+                      if (written == 0)
-+                              return PTR_ERR(v);
-+                      break;
-+              }
-+
-+              ignored = copy_from_user(v, buf, sz);
-+              iounmap(v);
-+              if (ignored) {
-+                      written += sz - ignored;
-+                      if (written)
-+                              break;
-+                      return -EFAULT;
-+              }
-+              buf += sz;
-+              p += sz;
-+              count -= sz;
-+              written += sz;
-+      }
-+
-+      *ppos += written;
-+      return written;
-+}
-+
-+#ifndef ARCH_HAS_DEV_MEM_MMAP_MEM
-+static int xen_mmap_mem(struct file * file, struct vm_area_struct * vma)
-+{
-+      size_t size = vma->vm_end - vma->vm_start;
-+
-+      if (uncached_access(file))
-+              vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
-+
-+      /* We want to return the real error code, not EAGAIN. */
-+      return direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
-+                                    size, vma->vm_page_prot, DOMID_IO);
-+}
-+#endif
-+
-+/*
-+ * The memory devices use the full 32/64 bits of the offset, and so we cannot
-+ * check against negative addresses: they are ok. The return value is weird,
-+ * though, in that case (0).
-+ *
-+ * also note that seeking relative to the "end of file" isn't supported:
-+ * it has no meaning, so it returns -EINVAL.
-+ */
-+static loff_t memory_lseek(struct file * file, loff_t offset, int orig)
-+{
-+      loff_t ret;
-+
-+      mutex_lock(&file->f_dentry->d_inode->i_mutex);
-+      switch (orig) {
-+              case 0:
-+                      file->f_pos = offset;
-+                      ret = file->f_pos;
-+                      force_successful_syscall_return();
-+                      break;
-+              case 1:
-+                      file->f_pos += offset;
-+                      ret = file->f_pos;
-+                      force_successful_syscall_return();
-+                      break;
-+              default:
-+                      ret = -EINVAL;
-+      }
-+      mutex_unlock(&file->f_dentry->d_inode->i_mutex);
-+      return ret;
-+}
-+
-+static int open_mem(struct inode * inode, struct file * filp)
-+{
-+      return capable(CAP_SYS_RAWIO) ? 0 : -EPERM;
-+}
-+
-+const struct file_operations mem_fops = {
-+      .llseek         = memory_lseek,
-+      .read           = read_mem,
-+      .write          = write_mem,
-+      .mmap           = xen_mmap_mem,
-+      .open           = open_mem,
-+};
-Index: head-2008-11-25/drivers/xen/console/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/console/Makefile       2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,2 @@
-+
-+obj-y := console.o xencons_ring.o
-Index: head-2008-11-25/drivers/xen/console/console.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/console/console.c      2007-10-15 09:39:38.000000000 +0200
-@@ -0,0 +1,731 @@
-+/******************************************************************************
-+ * console.c
-+ * 
-+ * Virtual console driver.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser.
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/tty.h>
-+#include <linux/tty_flip.h>
-+#include <linux/serial.h>
-+#include <linux/major.h>
-+#include <linux/ptrace.h>
-+#include <linux/ioport.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+#include <linux/init.h>
-+#include <linux/console.h>
-+#include <linux/bootmem.h>
-+#include <linux/sysrq.h>
-+#include <linux/screen_info.h>
-+#include <linux/vt.h>
-+#include <asm/io.h>
-+#include <asm/irq.h>
-+#include <asm/uaccess.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/event_channel.h>
-+#include <asm/hypervisor.h>
-+#include <xen/evtchn.h>
-+#include <xen/xenbus.h>
-+#include <xen/xencons.h>
-+
-+/*
-+ * Modes:
-+ *  'xencons=off'  [XC_OFF]:     Console is disabled.
-+ *  'xencons=tty'  [XC_TTY]:     Console attached to '/dev/tty[0-9]+'.
-+ *  'xencons=ttyS' [XC_SERIAL]:  Console attached to '/dev/ttyS[0-9]+'.
-+ *  'xencons=xvc'  [XC_XVC]:     Console attached to '/dev/xvc0'.
-+ *  default:                     XC_XVC
-+ * 
-+ * NB. In mode XC_TTY, we create dummy consoles for tty2-63. This suppresses
-+ * warnings from standard distro startup scripts.
-+ */
-+static enum {
-+      XC_OFF, XC_TTY, XC_SERIAL, XC_XVC
-+} xc_mode = XC_XVC;
-+static int xc_num = -1;
-+
-+/* /dev/xvc0 device number allocated by lanana.org. */
-+#define XEN_XVC_MAJOR 204
-+#define XEN_XVC_MINOR 191
-+
-+#ifdef CONFIG_MAGIC_SYSRQ
-+static unsigned long sysrq_requested;
-+extern int sysrq_enabled;
-+#endif
-+
-+static int __init xencons_setup(char *str)
-+{
-+      char *q;
-+      int n;
-+      extern int console_use_vt;
-+
-+      console_use_vt = 1;
-+      if (!strncmp(str, "ttyS", 4)) {
-+              xc_mode = XC_SERIAL;
-+              str += 4;
-+      } else if (!strncmp(str, "tty", 3)) {
-+              xc_mode = XC_TTY;
-+              str += 3;
-+              console_use_vt = 0;
-+      } else if (!strncmp(str, "xvc", 3)) {
-+              xc_mode = XC_XVC;
-+              str += 3;
-+      } else if (!strncmp(str, "off", 3)) {
-+              xc_mode = XC_OFF;
-+              str += 3;
-+      }
-+
-+      n = simple_strtol(str, &q, 10);
-+      if (q != str)
-+              xc_num = n;
-+
-+      return 1;
-+}
-+__setup("xencons=", xencons_setup);
-+
-+/* The kernel and user-land drivers share a common transmit buffer. */
-+static unsigned int wbuf_size = 4096;
-+#define WBUF_MASK(_i) ((_i)&(wbuf_size-1))
-+static char *wbuf;
-+static unsigned int wc, wp; /* write_cons, write_prod */
-+
-+static int __init xencons_bufsz_setup(char *str)
-+{
-+      unsigned int goal;
-+      goal = simple_strtoul(str, NULL, 0);
-+      if (goal) {
-+              goal = roundup_pow_of_two(goal);
-+              if (wbuf_size < goal)
-+                      wbuf_size = goal;
-+      }
-+      return 1;
-+}
-+__setup("xencons_bufsz=", xencons_bufsz_setup);
-+
-+/* This lock protects accesses to the common transmit buffer. */
-+static DEFINE_SPINLOCK(xencons_lock);
-+
-+/* Common transmit-kick routine. */
-+static void __xencons_tx_flush(void);
-+
-+static struct tty_driver *xencons_driver;
-+
-+/******************** Kernel console driver ********************************/
-+
-+static void kcons_write(struct console *c, const char *s, unsigned int count)
-+{
-+      int           i = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+
-+      while (i < count) {
-+              for (; i < count; i++) {
-+                      if ((wp - wc) >= (wbuf_size - 1))
-+                              break;
-+                      if ((wbuf[WBUF_MASK(wp++)] = s[i]) == '\n')
-+                              wbuf[WBUF_MASK(wp++)] = '\r';
-+              }
-+
-+              __xencons_tx_flush();
-+      }
-+
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static void kcons_write_dom0(struct console *c, const char *s, unsigned int count)
-+{
-+
-+      while (count > 0) {
-+              int rc;
-+              rc = HYPERVISOR_console_io( CONSOLEIO_write, count, (char *)s);
-+              if (rc <= 0)
-+                      break;
-+              count -= rc;
-+              s += rc;
-+      }
-+}
-+
-+static struct tty_driver *kcons_device(struct console *c, int *index)
-+{
-+      *index = 0;
-+      return xencons_driver;
-+}
-+
-+static struct console kcons_info = {
-+      .device = kcons_device,
-+      .flags  = CON_PRINTBUFFER | CON_ENABLED,
-+      .index  = -1,
-+};
-+
-+static int __init xen_console_init(void)
-+{
-+      if (!is_running_on_xen())
-+              goto out;
-+
-+      if (is_initial_xendomain()) {
-+              kcons_info.write = kcons_write_dom0;
-+      } else {
-+              if (!xen_start_info->console.domU.evtchn)
-+                      goto out;
-+              kcons_info.write = kcons_write;
-+      }
-+
-+      switch (xc_mode) {
-+      case XC_XVC:
-+              strcpy(kcons_info.name, "xvc");
-+              if (xc_num == -1)
-+                      xc_num = 0;
-+              break;
-+
-+      case XC_SERIAL:
-+              strcpy(kcons_info.name, "ttyS");
-+              if (xc_num == -1)
-+                      xc_num = 0;
-+              break;
-+
-+      case XC_TTY:
-+              strcpy(kcons_info.name, "tty");
-+              if (xc_num == -1)
-+                      xc_num = 1;
-+              break;
-+
-+      default:
-+              goto out;
-+      }
-+
-+      wbuf = alloc_bootmem(wbuf_size);
-+
-+      register_console(&kcons_info);
-+
-+ out:
-+      return 0;
-+}
-+console_initcall(xen_console_init);
-+
-+/*** Useful function for console debugging -- goes straight to Xen. ***/
-+asmlinkage int xprintk(const char *fmt, ...)
-+{
-+      va_list args;
-+      int printk_len;
-+      static char printk_buf[1024];
-+
-+      /* Emit the output into the temporary buffer */
-+      va_start(args, fmt);
-+      printk_len = vsnprintf(printk_buf, sizeof(printk_buf), fmt, args);
-+      va_end(args);
-+
-+      /* Send the processed output directly to Xen. */
-+      kcons_write_dom0(NULL, printk_buf, printk_len);
-+
-+      return 0;
-+}
-+
-+/*** Forcibly flush console data before dying. ***/
-+void xencons_force_flush(void)
-+{
-+      int sz;
-+
-+      /* Emergency console is synchronous, so there's nothing to flush. */
-+      if (!is_running_on_xen() ||
-+          is_initial_xendomain() ||
-+          !xen_start_info->console.domU.evtchn)
-+              return;
-+
-+      /* Spin until console data is flushed through to the daemon. */
-+      while (wc != wp) {
-+              int sent = 0;
-+              if ((sz = wp - wc) == 0)
-+                      continue;
-+              sent = xencons_ring_send(&wbuf[WBUF_MASK(wc)], sz);
-+              if (sent > 0)
-+                      wc += sent;
-+      }
-+}
-+
-+
-+void __init dom0_init_screen_info(const struct dom0_vga_console_info *info, size_t size)
-+{
-+      /* This is drawn from a dump from vgacon:startup in
-+       * standard Linux. */
-+      screen_info.orig_video_mode = 3;
-+      screen_info.orig_video_isVGA = 1;
-+      screen_info.orig_video_lines = 25;
-+      screen_info.orig_video_cols = 80;
-+      screen_info.orig_video_ega_bx = 3;
-+      screen_info.orig_video_points = 16;
-+      screen_info.orig_y = screen_info.orig_video_lines - 1;
-+
-+      switch (info->video_type) {
-+      case XEN_VGATYPE_TEXT_MODE_3:
-+              if (size < offsetof(struct dom0_vga_console_info, u.text_mode_3)
-+                         + sizeof(info->u.text_mode_3))
-+                      break;
-+              screen_info.orig_video_lines = info->u.text_mode_3.rows;
-+              screen_info.orig_video_cols = info->u.text_mode_3.columns;
-+              screen_info.orig_x = info->u.text_mode_3.cursor_x;
-+              screen_info.orig_y = info->u.text_mode_3.cursor_y;
-+              screen_info.orig_video_points =
-+                      info->u.text_mode_3.font_height;
-+              break;
-+
-+      case XEN_VGATYPE_VESA_LFB:
-+              if (size < offsetof(struct dom0_vga_console_info,
-+                                  u.vesa_lfb.gbl_caps))
-+                      break;
-+              screen_info.orig_video_isVGA = VIDEO_TYPE_VLFB;
-+              screen_info.lfb_width = info->u.vesa_lfb.width;
-+              screen_info.lfb_height = info->u.vesa_lfb.height;
-+              screen_info.lfb_depth = info->u.vesa_lfb.bits_per_pixel;
-+              screen_info.lfb_base = info->u.vesa_lfb.lfb_base;
-+              screen_info.lfb_size = info->u.vesa_lfb.lfb_size;
-+              screen_info.lfb_linelength = info->u.vesa_lfb.bytes_per_line;
-+              screen_info.red_size = info->u.vesa_lfb.red_size;
-+              screen_info.red_pos = info->u.vesa_lfb.red_pos;
-+              screen_info.green_size = info->u.vesa_lfb.green_size;
-+              screen_info.green_pos = info->u.vesa_lfb.green_pos;
-+              screen_info.blue_size = info->u.vesa_lfb.blue_size;
-+              screen_info.blue_pos = info->u.vesa_lfb.blue_pos;
-+              screen_info.rsvd_size = info->u.vesa_lfb.rsvd_size;
-+              screen_info.rsvd_pos = info->u.vesa_lfb.rsvd_pos;
-+              if (size >= offsetof(struct dom0_vga_console_info,
-+                                   u.vesa_lfb.gbl_caps)
-+                          + sizeof(info->u.vesa_lfb.gbl_caps))
-+                      screen_info.capabilities = info->u.vesa_lfb.gbl_caps;
-+              if (size >= offsetof(struct dom0_vga_console_info,
-+                                   u.vesa_lfb.mode_attrs)
-+                          + sizeof(info->u.vesa_lfb.mode_attrs))
-+                      screen_info.vesa_attributes = info->u.vesa_lfb.mode_attrs;
-+              break;
-+      }
-+}
-+
-+
-+/******************** User-space console driver (/dev/console) ************/
-+
-+#define DRV(_d)         (_d)
-+#define DUMMY_TTY(_tty) ((xc_mode == XC_TTY) &&               \
-+                       ((_tty)->index != (xc_num - 1)))
-+
-+static struct termios *xencons_termios[MAX_NR_CONSOLES];
-+static struct termios *xencons_termios_locked[MAX_NR_CONSOLES];
-+static struct tty_struct *xencons_tty;
-+static int xencons_priv_irq;
-+static char x_char;
-+
-+void xencons_rx(char *buf, unsigned len, struct pt_regs *regs)
-+{
-+      int           i;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      if (xencons_tty == NULL)
-+              goto out;
-+
-+      for (i = 0; i < len; i++) {
-+#ifdef CONFIG_MAGIC_SYSRQ
-+              if (sysrq_enabled) {
-+                      if (buf[i] == '\x0f') { /* ^O */
-+                              if (!sysrq_requested) {
-+                                      sysrq_requested = jiffies;
-+                                      continue; /* don't print sysrq key */
-+                              }
-+                              sysrq_requested = 0;
-+                      } else if (sysrq_requested) {
-+                              unsigned long sysrq_timeout =
-+                                      sysrq_requested + HZ*2;
-+                              sysrq_requested = 0;
-+                              if (time_before(jiffies, sysrq_timeout)) {
-+                                      spin_unlock_irqrestore(
-+                                              &xencons_lock, flags);
-+                                      handle_sysrq(
-+                                              buf[i], regs, xencons_tty);
-+                                      spin_lock_irqsave(
-+                                              &xencons_lock, flags);
-+                                      continue;
-+                              }
-+                      }
-+              }
-+#endif
-+              tty_insert_flip_char(xencons_tty, buf[i], 0);
-+      }
-+      tty_flip_buffer_push(xencons_tty);
-+
-+ out:
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static void __xencons_tx_flush(void)
-+{
-+      int sent, sz, work_done = 0;
-+
-+      if (x_char) {
-+              if (is_initial_xendomain())
-+                      kcons_write_dom0(NULL, &x_char, 1);
-+              else
-+                      while (x_char)
-+                              if (xencons_ring_send(&x_char, 1) == 1)
-+                                      break;
-+              x_char = 0;
-+              work_done = 1;
-+      }
-+
-+      while (wc != wp) {
-+              sz = wp - wc;
-+              if (sz > (wbuf_size - WBUF_MASK(wc)))
-+                      sz = wbuf_size - WBUF_MASK(wc);
-+              if (is_initial_xendomain()) {
-+                      kcons_write_dom0(NULL, &wbuf[WBUF_MASK(wc)], sz);
-+                      wc += sz;
-+              } else {
-+                      sent = xencons_ring_send(&wbuf[WBUF_MASK(wc)], sz);
-+                      if (sent == 0)
-+                              break;
-+                      wc += sent;
-+              }
-+              work_done = 1;
-+      }
-+
-+      if (work_done && (xencons_tty != NULL)) {
-+              wake_up_interruptible(&xencons_tty->write_wait);
-+              if ((xencons_tty->flags & (1 << TTY_DO_WRITE_WAKEUP)) &&
-+                  (xencons_tty->ldisc.write_wakeup != NULL))
-+                      (xencons_tty->ldisc.write_wakeup)(xencons_tty);
-+      }
-+}
-+
-+void xencons_tx(void)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      __xencons_tx_flush();
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+/* Privileged receive callback and transmit kicker. */
-+static irqreturn_t xencons_priv_interrupt(int irq, void *dev_id,
-+                                        struct pt_regs *regs)
-+{
-+      static char rbuf[16];
-+      int         l;
-+
-+      while ((l = HYPERVISOR_console_io(CONSOLEIO_read, 16, rbuf)) > 0)
-+              xencons_rx(rbuf, l, regs);
-+
-+      xencons_tx();
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static int xencons_write_room(struct tty_struct *tty)
-+{
-+      return wbuf_size - (wp - wc);
-+}
-+
-+static int xencons_chars_in_buffer(struct tty_struct *tty)
-+{
-+      return wp - wc;
-+}
-+
-+static void xencons_send_xchar(struct tty_struct *tty, char ch)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      x_char = ch;
-+      __xencons_tx_flush();
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static void xencons_throttle(struct tty_struct *tty)
-+{
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      if (I_IXOFF(tty))
-+              xencons_send_xchar(tty, STOP_CHAR(tty));
-+}
-+
-+static void xencons_unthrottle(struct tty_struct *tty)
-+{
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      if (I_IXOFF(tty)) {
-+              if (x_char != 0)
-+                      x_char = 0;
-+              else
-+                      xencons_send_xchar(tty, START_CHAR(tty));
-+      }
-+}
-+
-+static void xencons_flush_buffer(struct tty_struct *tty)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      wc = wp = 0;
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static inline int __xencons_put_char(int ch)
-+{
-+      char _ch = (char)ch;
-+      if ((wp - wc) == wbuf_size)
-+              return 0;
-+      wbuf[WBUF_MASK(wp++)] = _ch;
-+      return 1;
-+}
-+
-+static int xencons_write(
-+      struct tty_struct *tty,
-+      const unsigned char *buf,
-+      int count)
-+{
-+      int i;
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return count;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+
-+      for (i = 0; i < count; i++)
-+              if (!__xencons_put_char(buf[i]))
-+                      break;
-+
-+      if (i != 0)
-+              __xencons_tx_flush();
-+
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+
-+      return i;
-+}
-+
-+static void xencons_put_char(struct tty_struct *tty, u_char ch)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      (void)__xencons_put_char(ch);
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static void xencons_flush_chars(struct tty_struct *tty)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      __xencons_tx_flush();
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static void xencons_wait_until_sent(struct tty_struct *tty, int timeout)
-+{
-+      unsigned long orig_jiffies = jiffies;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      while (DRV(tty->driver)->chars_in_buffer(tty)) {
-+              set_current_state(TASK_INTERRUPTIBLE);
-+              schedule_timeout(1);
-+              if (signal_pending(current))
-+                      break;
-+              if (timeout && time_after(jiffies, orig_jiffies + timeout))
-+                      break;
-+      }
-+
-+      set_current_state(TASK_RUNNING);
-+}
-+
-+static int xencons_open(struct tty_struct *tty, struct file *filp)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return 0;
-+
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      tty->driver_data = NULL;
-+      if (xencons_tty == NULL)
-+              xencons_tty = tty;
-+      __xencons_tx_flush();
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+
-+      return 0;
-+}
-+
-+static void xencons_close(struct tty_struct *tty, struct file *filp)
-+{
-+      unsigned long flags;
-+
-+      if (DUMMY_TTY(tty))
-+              return;
-+
-+      mutex_lock(&tty_mutex);
-+
-+      if (tty->count != 1) {
-+              mutex_unlock(&tty_mutex);
-+              return;
-+      }
-+
-+      /* Prevent other threads from re-opening this tty. */
-+      set_bit(TTY_CLOSING, &tty->flags);
-+      mutex_unlock(&tty_mutex);
-+
-+      tty->closing = 1;
-+      tty_wait_until_sent(tty, 0);
-+      if (DRV(tty->driver)->flush_buffer != NULL)
-+              DRV(tty->driver)->flush_buffer(tty);
-+      if (tty->ldisc.flush_buffer != NULL)
-+              tty->ldisc.flush_buffer(tty);
-+      tty->closing = 0;
-+      spin_lock_irqsave(&xencons_lock, flags);
-+      xencons_tty = NULL;
-+      spin_unlock_irqrestore(&xencons_lock, flags);
-+}
-+
-+static struct tty_operations xencons_ops = {
-+      .open = xencons_open,
-+      .close = xencons_close,
-+      .write = xencons_write,
-+      .write_room = xencons_write_room,
-+      .put_char = xencons_put_char,
-+      .flush_chars = xencons_flush_chars,
-+      .chars_in_buffer = xencons_chars_in_buffer,
-+      .send_xchar = xencons_send_xchar,
-+      .flush_buffer = xencons_flush_buffer,
-+      .throttle = xencons_throttle,
-+      .unthrottle = xencons_unthrottle,
-+      .wait_until_sent = xencons_wait_until_sent,
-+};
-+
-+static int __init xencons_init(void)
-+{
-+      int rc;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      if (xc_mode == XC_OFF)
-+              return 0;
-+
-+      if (!is_initial_xendomain()) {
-+              rc = xencons_ring_init();
-+              if (rc)
-+                      return rc;
-+      }
-+
-+      xencons_driver = alloc_tty_driver((xc_mode == XC_TTY) ?
-+                                        MAX_NR_CONSOLES : 1);
-+      if (xencons_driver == NULL)
-+              return -ENOMEM;
-+
-+      DRV(xencons_driver)->name            = "xencons";
-+      DRV(xencons_driver)->major           = TTY_MAJOR;
-+      DRV(xencons_driver)->type            = TTY_DRIVER_TYPE_SERIAL;
-+      DRV(xencons_driver)->subtype         = SERIAL_TYPE_NORMAL;
-+      DRV(xencons_driver)->init_termios    = tty_std_termios;
-+      DRV(xencons_driver)->flags           =
-+              TTY_DRIVER_REAL_RAW |
-+              TTY_DRIVER_RESET_TERMIOS;
-+      DRV(xencons_driver)->termios         = xencons_termios;
-+      DRV(xencons_driver)->termios_locked  = xencons_termios_locked;
-+
-+      switch (xc_mode) {
-+      case XC_XVC:
-+              DRV(xencons_driver)->name        = "xvc";
-+              DRV(xencons_driver)->major       = XEN_XVC_MAJOR;
-+              DRV(xencons_driver)->minor_start = XEN_XVC_MINOR;
-+              DRV(xencons_driver)->name_base   = xc_num;
-+              break;
-+      case XC_SERIAL:
-+              DRV(xencons_driver)->name        = "ttyS";
-+              DRV(xencons_driver)->minor_start = 64 + xc_num;
-+              DRV(xencons_driver)->name_base   = xc_num;
-+              break;
-+      default:
-+              DRV(xencons_driver)->name        = "tty";
-+              DRV(xencons_driver)->minor_start = 1;
-+              DRV(xencons_driver)->name_base   = 1;
-+              break;
-+      }
-+
-+      tty_set_operations(xencons_driver, &xencons_ops);
-+
-+      if ((rc = tty_register_driver(DRV(xencons_driver))) != 0) {
-+              printk("WARNING: Failed to register Xen virtual "
-+                     "console driver as '%s%d'\n",
-+                     DRV(xencons_driver)->name,
-+                     DRV(xencons_driver)->name_base);
-+              put_tty_driver(xencons_driver);
-+              xencons_driver = NULL;
-+              return rc;
-+      }
-+
-+      if (is_initial_xendomain()) {
-+              xencons_priv_irq = bind_virq_to_irqhandler(
-+                      VIRQ_CONSOLE,
-+                      0,
-+                      xencons_priv_interrupt,
-+                      0,
-+                      "console",
-+                      NULL);
-+              BUG_ON(xencons_priv_irq < 0);
-+      }
-+
-+      printk("Xen virtual console successfully installed as %s%d\n",
-+             DRV(xencons_driver)->name, xc_num);
-+
-+      return 0;
-+}
-+
-+module_init(xencons_init);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/console/xencons_ring.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/console/xencons_ring.c 2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,143 @@
-+/* 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/errno.h>
-+#include <linux/signal.h>
-+#include <linux/sched.h>
-+#include <linux/interrupt.h>
-+#include <linux/tty.h>
-+#include <linux/tty_flip.h>
-+#include <linux/serial.h>
-+#include <linux/major.h>
-+#include <linux/ptrace.h>
-+#include <linux/ioport.h>
-+#include <linux/mm.h>
-+#include <linux/slab.h>
-+
-+#include <asm/hypervisor.h>
-+#include <xen/evtchn.h>
-+#include <xen/xencons.h>
-+#include <linux/wait.h>
-+#include <linux/interrupt.h>
-+#include <linux/sched.h>
-+#include <linux/err.h>
-+#include <xen/interface/io/console.h>
-+
-+static int xencons_irq;
-+
-+static inline struct xencons_interface *xencons_interface(void)
-+{
-+      return mfn_to_virt(xen_start_info->console.domU.mfn);
-+}
-+
-+static inline void notify_daemon(void)
-+{
-+      /* Use evtchn: this is called early, before irq is set up. */
-+      notify_remote_via_evtchn(xen_start_info->console.domU.evtchn);
-+}
-+
-+int xencons_ring_send(const char *data, unsigned len)
-+{
-+      int sent = 0;
-+      struct xencons_interface *intf = xencons_interface();
-+      XENCONS_RING_IDX cons, prod;
-+
-+      cons = intf->out_cons;
-+      prod = intf->out_prod;
-+      mb();
-+      BUG_ON((prod - cons) > sizeof(intf->out));
-+
-+      while ((sent < len) && ((prod - cons) < sizeof(intf->out)))
-+              intf->out[MASK_XENCONS_IDX(prod++, intf->out)] = data[sent++];
-+
-+      wmb();
-+      intf->out_prod = prod;
-+
-+      notify_daemon();
-+
-+      return sent;
-+}
-+
-+static irqreturn_t handle_input(int irq, void *unused, struct pt_regs *regs)
-+{
-+      struct xencons_interface *intf = xencons_interface();
-+      XENCONS_RING_IDX cons, prod;
-+
-+      cons = intf->in_cons;
-+      prod = intf->in_prod;
-+      mb();
-+      BUG_ON((prod - cons) > sizeof(intf->in));
-+
-+      while (cons != prod) {
-+              xencons_rx(intf->in+MASK_XENCONS_IDX(cons,intf->in), 1, regs);
-+              cons++;
-+      }
-+
-+      mb();
-+      intf->in_cons = cons;
-+
-+      notify_daemon();
-+
-+      xencons_tx();
-+
-+      return IRQ_HANDLED;
-+}
-+
-+int xencons_ring_init(void)
-+{
-+      int irq;
-+
-+      if (xencons_irq)
-+              unbind_from_irqhandler(xencons_irq, NULL);
-+      xencons_irq = 0;
-+
-+      if (!is_running_on_xen() ||
-+          is_initial_xendomain() ||
-+          !xen_start_info->console.domU.evtchn)
-+              return -ENODEV;
-+
-+      irq = bind_caller_port_to_irqhandler(
-+              xen_start_info->console.domU.evtchn,
-+              handle_input, 0, "xencons", NULL);
-+      if (irq < 0) {
-+              printk(KERN_ERR "XEN console request irq failed %i\n", irq);
-+              return irq;
-+      }
-+
-+      xencons_irq = irq;
-+
-+      /* In case we have in-flight data after save/restore... */
-+      notify_daemon();
-+
-+      return 0;
-+}
-+
-+void xencons_resume(void)
-+{
-+      (void)xencons_ring_init();
-+}
-Index: head-2008-11-25/drivers/xen/core/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/Makefile  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,14 @@
-+#
-+# Makefile for the linux kernel.
-+#
-+
-+obj-y := evtchn.o gnttab.o features.o reboot.o machine_reboot.o firmware.o
-+
-+obj-$(CONFIG_PCI)             += pci.o
-+obj-$(CONFIG_PROC_FS)         += xen_proc.o
-+obj-$(CONFIG_SYS_HYPERVISOR)  += hypervisor_sysfs.o
-+obj-$(CONFIG_HOTPLUG_CPU)     += cpu_hotplug.o
-+obj-$(CONFIG_XEN_SYSFS)               += xen_sysfs.o
-+obj-$(CONFIG_XEN_SMPBOOT)     += smpboot.o
-+obj-$(CONFIG_KEXEC)           += machine_kexec.o
-+obj-$(CONFIG_XEN_XENCOMM)     += xencomm.o
-Index: head-2008-11-25/drivers/xen/core/cpu_hotplug.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/cpu_hotplug.c     2008-01-21 11:15:26.000000000 +0100
-@@ -0,0 +1,173 @@
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/notifier.h>
-+#include <linux/cpu.h>
-+#include <xen/cpu_hotplug.h>
-+#include <xen/xenbus.h>
-+
-+/*
-+ * Set of CPUs that remote admin software will allow us to bring online.
-+ * Notified to us via xenbus.
-+ */
-+static cpumask_t xenbus_allowed_cpumask;
-+
-+/* Set of CPUs that local admin will allow us to bring online. */
-+static cpumask_t local_allowed_cpumask = CPU_MASK_ALL;
-+
-+static int local_cpu_hotplug_request(void)
-+{
-+      /*
-+       * We assume a CPU hotplug request comes from local admin if it is made
-+       * via a userspace process (i.e., one with a real mm_struct).
-+       */
-+      return (current->mm != NULL);
-+}
-+
-+static void vcpu_hotplug(unsigned int cpu)
-+{
-+      int err;
-+      char dir[32], state[32];
-+
-+      if ((cpu >= NR_CPUS) || !cpu_possible(cpu))
-+              return;
-+
-+      sprintf(dir, "cpu/%u", cpu);
-+      err = xenbus_scanf(XBT_NIL, dir, "availability", "%s", state);
-+      if (err != 1) {
-+              printk(KERN_ERR "XENBUS: Unable to read cpu state\n");
-+              return;
-+      }
-+
-+      if (strcmp(state, "online") == 0) {
-+              cpu_set(cpu, xenbus_allowed_cpumask);
-+              (void)cpu_up(cpu);
-+      } else if (strcmp(state, "offline") == 0) {
-+              cpu_clear(cpu, xenbus_allowed_cpumask);
-+              (void)cpu_down(cpu);
-+      } else {
-+              printk(KERN_ERR "XENBUS: unknown state(%s) on CPU%d\n",
-+                     state, cpu);
-+      }
-+}
-+
-+static void handle_vcpu_hotplug_event(
-+      struct xenbus_watch *watch, const char **vec, unsigned int len)
-+{
-+      unsigned int cpu;
-+      char *cpustr;
-+      const char *node = vec[XS_WATCH_PATH];
-+
-+      if ((cpustr = strstr(node, "cpu/")) != NULL) {
-+              sscanf(cpustr, "cpu/%u", &cpu);
-+              vcpu_hotplug(cpu);
-+      }
-+}
-+
-+static int smpboot_cpu_notify(struct notifier_block *notifier,
-+                            unsigned long action, void *hcpu)
-+{
-+      unsigned int cpu = (long)hcpu;
-+
-+      /*
-+       * We do this in a callback notifier rather than __cpu_disable()
-+       * because local_cpu_hotplug_request() does not work in the latter
-+       * as it's always executed from within a stopmachine kthread.
-+       */
-+      if ((action == CPU_DOWN_PREPARE) && local_cpu_hotplug_request())
-+              cpu_clear(cpu, local_allowed_cpumask);
-+
-+      return NOTIFY_OK;
-+}
-+
-+static int setup_cpu_watcher(struct notifier_block *notifier,
-+                            unsigned long event, void *data)
-+{
-+      unsigned int i;
-+
-+      static struct xenbus_watch cpu_watch = {
-+              .node = "cpu",
-+              .callback = handle_vcpu_hotplug_event,
-+              .flags = XBWF_new_thread };
-+      (void)register_xenbus_watch(&cpu_watch);
-+
-+      if (!is_initial_xendomain()) {
-+              for_each_possible_cpu(i)
-+                      vcpu_hotplug(i);
-+              printk(KERN_INFO "Brought up %ld CPUs\n",
-+                     (long)num_online_cpus());
-+      }
-+
-+      return NOTIFY_DONE;
-+}
-+
-+static int __init setup_vcpu_hotplug_event(void)
-+{
-+      static struct notifier_block hotplug_cpu = {
-+              .notifier_call = smpboot_cpu_notify };
-+      static struct notifier_block xsn_cpu = {
-+              .notifier_call = setup_cpu_watcher };
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      register_cpu_notifier(&hotplug_cpu);
-+      register_xenstore_notifier(&xsn_cpu);
-+
-+      return 0;
-+}
-+
-+arch_initcall(setup_vcpu_hotplug_event);
-+
-+int smp_suspend(void)
-+{
-+      unsigned int cpu;
-+      int err;
-+
-+      for_each_online_cpu(cpu) {
-+              if (cpu == 0)
-+                      continue;
-+              err = cpu_down(cpu);
-+              if (err) {
-+                      printk(KERN_CRIT "Failed to take all CPUs "
-+                             "down: %d.\n", err);
-+                      for_each_possible_cpu(cpu)
-+                              vcpu_hotplug(cpu);
-+                      return err;
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+void smp_resume(void)
-+{
-+      unsigned int cpu;
-+
-+      for_each_possible_cpu(cpu)
-+              vcpu_hotplug(cpu);
-+}
-+
-+int cpu_up_check(unsigned int cpu)
-+{
-+      int rc = 0;
-+
-+      if (local_cpu_hotplug_request()) {
-+              cpu_set(cpu, local_allowed_cpumask);
-+              if (!cpu_isset(cpu, xenbus_allowed_cpumask)) {
-+                      printk("%s: attempt to bring up CPU %u disallowed by "
-+                             "remote admin.\n", __FUNCTION__, cpu);
-+                      rc = -EBUSY;
-+              }
-+      } else if (!cpu_isset(cpu, local_allowed_cpumask) ||
-+                 !cpu_isset(cpu, xenbus_allowed_cpumask)) {
-+              rc = -EBUSY;
-+      }
-+
-+      return rc;
-+}
-+
-+void init_xenbus_allowed_cpumask(void)
-+{
-+      xenbus_allowed_cpumask = cpu_present_map;
-+}
-Index: head-2008-11-25/drivers/xen/core/evtchn.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/evtchn.c  2008-11-10 11:44:21.000000000 +0100
-@@ -0,0 +1,1140 @@
-+/******************************************************************************
-+ * evtchn.c
-+ * 
-+ * Communication via Xen event channels.
-+ * 
-+ * Copyright (c) 2002-2005, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/irq.h>
-+#include <linux/interrupt.h>
-+#include <linux/sched.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/version.h>
-+#include <asm/atomic.h>
-+#include <asm/system.h>
-+#include <asm/ptrace.h>
-+#include <asm/synch_bitops.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/event_channel.h>
-+#include <xen/interface/physdev.h>
-+#include <asm/hypervisor.h>
-+#include <linux/mc146818rtc.h> /* RTC_IRQ */
-+
-+/*
-+ * This lock protects updates to the following mapping and reference-count
-+ * arrays. The lock does not need to be acquired to read the mapping tables.
-+ */
-+static DEFINE_SPINLOCK(irq_mapping_update_lock);
-+
-+/* IRQ <-> event-channel mappings. */
-+static int evtchn_to_irq[NR_EVENT_CHANNELS] = {
-+      [0 ...  NR_EVENT_CHANNELS-1] = -1 };
-+
-+/* Packed IRQ information: binding type, sub-type index, and event channel. */
-+static u32 irq_info[NR_IRQS];
-+
-+/* Binding types. */
-+enum {
-+      IRQT_UNBOUND,
-+      IRQT_PIRQ,
-+      IRQT_VIRQ,
-+      IRQT_IPI,
-+      IRQT_LOCAL_PORT,
-+      IRQT_CALLER_PORT,
-+      _IRQT_COUNT
-+};
-+
-+#define _IRQT_BITS 4
-+#define _EVTCHN_BITS 12
-+#define _INDEX_BITS (32 - _IRQT_BITS - _EVTCHN_BITS)
-+
-+/* Constructor for packed IRQ information. */
-+static inline u32 mk_irq_info(u32 type, u32 index, u32 evtchn)
-+{
-+      BUILD_BUG_ON(_IRQT_COUNT > (1U << _IRQT_BITS));
-+
-+      BUILD_BUG_ON(NR_PIRQS > (1U << _INDEX_BITS));
-+      BUILD_BUG_ON(NR_VIRQS > (1U << _INDEX_BITS));
-+      BUILD_BUG_ON(NR_IPIS > (1U << _INDEX_BITS));
-+      BUG_ON(index >> _INDEX_BITS);
-+
-+      BUILD_BUG_ON(NR_EVENT_CHANNELS > (1U << _EVTCHN_BITS));
-+
-+      return ((type << (32 - _IRQT_BITS)) | (index << _EVTCHN_BITS) | evtchn);
-+}
-+
-+/* Convenient shorthand for packed representation of an unbound IRQ. */
-+#define IRQ_UNBOUND   mk_irq_info(IRQT_UNBOUND, 0, 0)
-+
-+/*
-+ * Accessors for packed IRQ information.
-+ */
-+
-+static inline unsigned int evtchn_from_irq(int irq)
-+{
-+      return irq_info[irq] & ((1U << _EVTCHN_BITS) - 1);
-+}
-+
-+static inline unsigned int index_from_irq(int irq)
-+{
-+      return (irq_info[irq] >> _EVTCHN_BITS) & ((1U << _INDEX_BITS) - 1);
-+}
-+
-+static inline unsigned int type_from_irq(int irq)
-+{
-+      return irq_info[irq] >> (32 - _IRQT_BITS);
-+}
-+
-+/* IRQ <-> VIRQ mapping. */
-+DEFINE_PER_CPU(int, virq_to_irq[NR_VIRQS]) = {[0 ... NR_VIRQS-1] = -1};
-+
-+/* IRQ <-> IPI mapping. */
-+#ifndef NR_IPIS
-+#define NR_IPIS 1
-+#endif
-+DEFINE_PER_CPU(int, ipi_to_irq[NR_IPIS]) = {[0 ... NR_IPIS-1] = -1};
-+
-+/* Reference counts for bindings to IRQs. */
-+static int irq_bindcount[NR_IRQS];
-+
-+/* Bitmap indicating which PIRQs require Xen to be notified on unmask. */
-+static DECLARE_BITMAP(pirq_needs_eoi, NR_PIRQS);
-+
-+#ifdef CONFIG_SMP
-+
-+static u8 cpu_evtchn[NR_EVENT_CHANNELS];
-+static unsigned long cpu_evtchn_mask[NR_CPUS][NR_EVENT_CHANNELS/BITS_PER_LONG];
-+
-+static inline unsigned long active_evtchns(unsigned int cpu, shared_info_t *sh,
-+                                         unsigned int idx)
-+{
-+      return (sh->evtchn_pending[idx] &
-+              cpu_evtchn_mask[cpu][idx] &
-+              ~sh->evtchn_mask[idx]);
-+}
-+
-+static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      int irq = evtchn_to_irq[chn];
-+
-+      BUG_ON(!test_bit(chn, s->evtchn_mask));
-+
-+      if (irq != -1)
-+              set_native_irq_info(irq, cpumask_of_cpu(cpu));
-+
-+      clear_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu_evtchn[chn]]);
-+      set_bit(chn, (unsigned long *)cpu_evtchn_mask[cpu]);
-+      cpu_evtchn[chn] = cpu;
-+}
-+
-+static void init_evtchn_cpu_bindings(void)
-+{
-+      int i;
-+
-+      /* By default all event channels notify CPU#0. */
-+      for (i = 0; i < NR_IRQS; i++)
-+              set_native_irq_info(i, cpumask_of_cpu(0));
-+
-+      memset(cpu_evtchn, 0, sizeof(cpu_evtchn));
-+      memset(cpu_evtchn_mask[0], ~0, sizeof(cpu_evtchn_mask[0]));
-+}
-+
-+static inline unsigned int cpu_from_evtchn(unsigned int evtchn)
-+{
-+      return cpu_evtchn[evtchn];
-+}
-+
-+#else
-+
-+static inline unsigned long active_evtchns(unsigned int cpu, shared_info_t *sh,
-+                                         unsigned int idx)
-+{
-+      return (sh->evtchn_pending[idx] & ~sh->evtchn_mask[idx]);
-+}
-+
-+static void bind_evtchn_to_cpu(unsigned int chn, unsigned int cpu)
-+{
-+}
-+
-+static void init_evtchn_cpu_bindings(void)
-+{
-+}
-+
-+static inline unsigned int cpu_from_evtchn(unsigned int evtchn)
-+{
-+      return 0;
-+}
-+
-+#endif
-+
-+/* Upcall to generic IRQ layer. */
-+#ifdef CONFIG_X86
-+extern fastcall unsigned int do_IRQ(struct pt_regs *regs);
-+void __init xen_init_IRQ(void);
-+void __init init_IRQ(void)
-+{
-+      irq_ctx_init(0);
-+      xen_init_IRQ();
-+}
-+#if defined (__i386__)
-+static inline void exit_idle(void) {}
-+#define IRQ_REG orig_eax
-+#elif defined (__x86_64__)
-+#include <asm/idle.h>
-+#define IRQ_REG orig_rax
-+#endif
-+#define do_IRQ(irq, regs) do {                \
-+      (regs)->IRQ_REG = ~(irq);       \
-+      do_IRQ((regs));                 \
-+} while (0)
-+#endif
-+
-+/* Xen will never allocate port zero for any purpose. */
-+#define VALID_EVTCHN(chn)     ((chn) != 0)
-+
-+/*
-+ * Force a proper event-channel callback from Xen after clearing the
-+ * callback mask. We do this in a very simple manner, by making a call
-+ * down into Xen. The pending flag will be checked by Xen on return.
-+ */
-+void force_evtchn_callback(void)
-+{
-+      VOID(HYPERVISOR_xen_version(0, NULL));
-+}
-+/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
-+EXPORT_SYMBOL(force_evtchn_callback);
-+
-+static DEFINE_PER_CPU(unsigned int, upcall_count) = { 0 };
-+static DEFINE_PER_CPU(unsigned int, last_processed_l1i) = { BITS_PER_LONG - 1 };
-+static DEFINE_PER_CPU(unsigned int, last_processed_l2i) = { BITS_PER_LONG - 1 };
-+
-+/* NB. Interrupts are disabled on entry. */
-+asmlinkage void evtchn_do_upcall(struct pt_regs *regs)
-+{
-+      unsigned long       l1, l2;
-+      unsigned long       masked_l1, masked_l2;
-+      unsigned int        l1i, l2i, port, count;
-+      int                 irq;
-+      unsigned int        cpu = smp_processor_id();
-+      shared_info_t      *s = HYPERVISOR_shared_info;
-+      vcpu_info_t        *vcpu_info = &s->vcpu_info[cpu];
-+
-+      exit_idle();
-+      irq_enter();
-+
-+      do {
-+              /* Avoid a callback storm when we reenable delivery. */
-+              vcpu_info->evtchn_upcall_pending = 0;
-+
-+              /* Nested invocations bail immediately. */
-+              if (unlikely(per_cpu(upcall_count, cpu)++))
-+                      break;
-+
-+#ifndef CONFIG_X86 /* No need for a barrier -- XCHG is a barrier on x86. */
-+              /* Clear master flag /before/ clearing selector flag. */
-+              wmb();
-+#endif
-+              l1 = xchg(&vcpu_info->evtchn_pending_sel, 0);
-+
-+              l1i = per_cpu(last_processed_l1i, cpu);
-+              l2i = per_cpu(last_processed_l2i, cpu);
-+
-+              while (l1 != 0) {
-+
-+                      l1i = (l1i + 1) % BITS_PER_LONG;
-+                      masked_l1 = l1 & ((~0UL) << l1i);
-+
-+                      if (masked_l1 == 0) { /* if we masked out all events, wrap around to the beginning */
-+                              l1i = BITS_PER_LONG - 1;
-+                              l2i = BITS_PER_LONG - 1;
-+                              continue;
-+                      }
-+                      l1i = __ffs(masked_l1);
-+
-+                      do {
-+                              l2 = active_evtchns(cpu, s, l1i);
-+
-+                              l2i = (l2i + 1) % BITS_PER_LONG;
-+                              masked_l2 = l2 & ((~0UL) << l2i);
-+
-+                              if (masked_l2 == 0) { /* if we masked out all events, move on */
-+                                      l2i = BITS_PER_LONG - 1;
-+                                      break;
-+                              }
-+
-+                              l2i = __ffs(masked_l2);
-+
-+                              /* process port */
-+                              port = (l1i * BITS_PER_LONG) + l2i;
-+                              if ((irq = evtchn_to_irq[port]) != -1)
-+                                      do_IRQ(irq, regs);
-+                              else
-+                                      evtchn_device_upcall(port);
-+
-+                              /* if this is the final port processed, we'll pick up here+1 next time */
-+                              per_cpu(last_processed_l1i, cpu) = l1i;
-+                              per_cpu(last_processed_l2i, cpu) = l2i;
-+
-+                      } while (l2i != BITS_PER_LONG - 1);
-+
-+                      l2 = active_evtchns(cpu, s, l1i);
-+                      if (l2 == 0) /* we handled all ports, so we can clear the selector bit */
-+                              l1 &= ~(1UL << l1i);
-+
-+              }
-+
-+              /* If there were nested callbacks then we have more to do. */
-+              count = per_cpu(upcall_count, cpu);
-+              per_cpu(upcall_count, cpu) = 0;
-+      } while (unlikely(count != 1));
-+
-+      irq_exit();
-+}
-+
-+static int find_unbound_irq(void)
-+{
-+      static int warned;
-+      int irq;
-+
-+      for (irq = DYNIRQ_BASE; irq < (DYNIRQ_BASE + NR_DYNIRQS); irq++)
-+              if (irq_bindcount[irq] == 0)
-+                      return irq;
-+
-+      if (!warned) {
-+              warned = 1;
-+              printk(KERN_WARNING "No available IRQ to bind to: "
-+                     "increase NR_DYNIRQS.\n");
-+      }
-+
-+      return -ENOSPC;
-+}
-+
-+static int bind_caller_port_to_irq(unsigned int caller_port)
-+{
-+      int irq;
-+
-+      spin_lock(&irq_mapping_update_lock);
-+
-+      if ((irq = evtchn_to_irq[caller_port]) == -1) {
-+              if ((irq = find_unbound_irq()) < 0)
-+                      goto out;
-+
-+              evtchn_to_irq[caller_port] = irq;
-+              irq_info[irq] = mk_irq_info(IRQT_CALLER_PORT, 0, caller_port);
-+      }
-+
-+      irq_bindcount[irq]++;
-+
-+ out:
-+      spin_unlock(&irq_mapping_update_lock);
-+      return irq;
-+}
-+
-+static int bind_local_port_to_irq(unsigned int local_port)
-+{
-+      int irq;
-+
-+      spin_lock(&irq_mapping_update_lock);
-+
-+      BUG_ON(evtchn_to_irq[local_port] != -1);
-+
-+      if ((irq = find_unbound_irq()) < 0) {
-+              struct evtchn_close close = { .port = local_port };
-+              if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
-+                      BUG();
-+              goto out;
-+      }
-+
-+      evtchn_to_irq[local_port] = irq;
-+      irq_info[irq] = mk_irq_info(IRQT_LOCAL_PORT, 0, local_port);
-+      irq_bindcount[irq]++;
-+
-+ out:
-+      spin_unlock(&irq_mapping_update_lock);
-+      return irq;
-+}
-+
-+static int bind_listening_port_to_irq(unsigned int remote_domain)
-+{
-+      struct evtchn_alloc_unbound alloc_unbound;
-+      int err;
-+
-+      alloc_unbound.dom        = DOMID_SELF;
-+      alloc_unbound.remote_dom = remote_domain;
-+
-+      err = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-+                                        &alloc_unbound);
-+
-+      return err ? : bind_local_port_to_irq(alloc_unbound.port);
-+}
-+
-+static int bind_interdomain_evtchn_to_irq(unsigned int remote_domain,
-+                                        unsigned int remote_port)
-+{
-+      struct evtchn_bind_interdomain bind_interdomain;
-+      int err;
-+
-+      bind_interdomain.remote_dom  = remote_domain;
-+      bind_interdomain.remote_port = remote_port;
-+
-+      err = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-+                                        &bind_interdomain);
-+
-+      return err ? : bind_local_port_to_irq(bind_interdomain.local_port);
-+}
-+
-+static int bind_virq_to_irq(unsigned int virq, unsigned int cpu)
-+{
-+      struct evtchn_bind_virq bind_virq;
-+      int evtchn, irq;
-+
-+      spin_lock(&irq_mapping_update_lock);
-+
-+      if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1) {
-+              if ((irq = find_unbound_irq()) < 0)
-+                      goto out;
-+
-+              bind_virq.virq = virq;
-+              bind_virq.vcpu = cpu;
-+              if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-+                                              &bind_virq) != 0)
-+                      BUG();
-+              evtchn = bind_virq.port;
-+
-+              evtchn_to_irq[evtchn] = irq;
-+              irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn);
-+
-+              per_cpu(virq_to_irq, cpu)[virq] = irq;
-+
-+              bind_evtchn_to_cpu(evtchn, cpu);
-+      }
-+
-+      irq_bindcount[irq]++;
-+
-+ out:
-+      spin_unlock(&irq_mapping_update_lock);
-+      return irq;
-+}
-+
-+static int bind_ipi_to_irq(unsigned int ipi, unsigned int cpu)
-+{
-+      struct evtchn_bind_ipi bind_ipi;
-+      int evtchn, irq;
-+
-+      spin_lock(&irq_mapping_update_lock);
-+
-+      if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1) {
-+              if ((irq = find_unbound_irq()) < 0)
-+                      goto out;
-+
-+              bind_ipi.vcpu = cpu;
-+              if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
-+                                              &bind_ipi) != 0)
-+                      BUG();
-+              evtchn = bind_ipi.port;
-+
-+              evtchn_to_irq[evtchn] = irq;
-+              irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn);
-+
-+              per_cpu(ipi_to_irq, cpu)[ipi] = irq;
-+
-+              bind_evtchn_to_cpu(evtchn, cpu);
-+      }
-+
-+      irq_bindcount[irq]++;
-+
-+ out:
-+      spin_unlock(&irq_mapping_update_lock);
-+      return irq;
-+}
-+
-+static void unbind_from_irq(unsigned int irq)
-+{
-+      struct evtchn_close close;
-+      unsigned int cpu;
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      spin_lock(&irq_mapping_update_lock);
-+
-+      if ((--irq_bindcount[irq] == 0) && VALID_EVTCHN(evtchn)) {
-+              close.port = evtchn;
-+              if ((type_from_irq(irq) != IRQT_CALLER_PORT) &&
-+                  HYPERVISOR_event_channel_op(EVTCHNOP_close, &close))
-+                      BUG();
-+
-+              switch (type_from_irq(irq)) {
-+              case IRQT_VIRQ:
-+                      per_cpu(virq_to_irq, cpu_from_evtchn(evtchn))
-+                              [index_from_irq(irq)] = -1;
-+                      break;
-+              case IRQT_IPI:
-+                      per_cpu(ipi_to_irq, cpu_from_evtchn(evtchn))
-+                              [index_from_irq(irq)] = -1;
-+                      break;
-+              default:
-+                      break;
-+              }
-+
-+              /* Closed ports are implicitly re-bound to VCPU0. */
-+              bind_evtchn_to_cpu(evtchn, 0);
-+
-+              evtchn_to_irq[evtchn] = -1;
-+              irq_info[irq] = IRQ_UNBOUND;
-+
-+              /* Zap stats across IRQ changes of use. */
-+              for_each_possible_cpu(cpu)
-+                      kstat_cpu(cpu).irqs[irq] = 0;
-+      }
-+
-+      spin_unlock(&irq_mapping_update_lock);
-+}
-+
-+int bind_caller_port_to_irqhandler(
-+      unsigned int caller_port,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id)
-+{
-+      int irq, retval;
-+
-+      irq = bind_caller_port_to_irq(caller_port);
-+      if (irq < 0)
-+              return irq;
-+
-+      retval = request_irq(irq, handler, irqflags, devname, dev_id);
-+      if (retval != 0) {
-+              unbind_from_irq(irq);
-+              return retval;
-+      }
-+
-+      return irq;
-+}
-+EXPORT_SYMBOL_GPL(bind_caller_port_to_irqhandler);
-+
-+int bind_listening_port_to_irqhandler(
-+      unsigned int remote_domain,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id)
-+{
-+      int irq, retval;
-+
-+      irq = bind_listening_port_to_irq(remote_domain);
-+      if (irq < 0)
-+              return irq;
-+
-+      retval = request_irq(irq, handler, irqflags, devname, dev_id);
-+      if (retval != 0) {
-+              unbind_from_irq(irq);
-+              return retval;
-+      }
-+
-+      return irq;
-+}
-+EXPORT_SYMBOL_GPL(bind_listening_port_to_irqhandler);
-+
-+int bind_interdomain_evtchn_to_irqhandler(
-+      unsigned int remote_domain,
-+      unsigned int remote_port,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id)
-+{
-+      int irq, retval;
-+
-+      irq = bind_interdomain_evtchn_to_irq(remote_domain, remote_port);
-+      if (irq < 0)
-+              return irq;
-+
-+      retval = request_irq(irq, handler, irqflags, devname, dev_id);
-+      if (retval != 0) {
-+              unbind_from_irq(irq);
-+              return retval;
-+      }
-+
-+      return irq;
-+}
-+EXPORT_SYMBOL_GPL(bind_interdomain_evtchn_to_irqhandler);
-+
-+int bind_virq_to_irqhandler(
-+      unsigned int virq,
-+      unsigned int cpu,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id)
-+{
-+      int irq, retval;
-+
-+      irq = bind_virq_to_irq(virq, cpu);
-+      if (irq < 0)
-+              return irq;
-+
-+      retval = request_irq(irq, handler, irqflags, devname, dev_id);
-+      if (retval != 0) {
-+              unbind_from_irq(irq);
-+              return retval;
-+      }
-+
-+      return irq;
-+}
-+EXPORT_SYMBOL_GPL(bind_virq_to_irqhandler);
-+
-+int bind_ipi_to_irqhandler(
-+      unsigned int ipi,
-+      unsigned int cpu,
-+      irqreturn_t (*handler)(int, void *, struct pt_regs *),
-+      unsigned long irqflags,
-+      const char *devname,
-+      void *dev_id)
-+{
-+      int irq, retval;
-+
-+      irq = bind_ipi_to_irq(ipi, cpu);
-+      if (irq < 0)
-+              return irq;
-+
-+      retval = request_irq(irq, handler, irqflags, devname, dev_id);
-+      if (retval != 0) {
-+              unbind_from_irq(irq);
-+              return retval;
-+      }
-+
-+      return irq;
-+}
-+EXPORT_SYMBOL_GPL(bind_ipi_to_irqhandler);
-+
-+void unbind_from_irqhandler(unsigned int irq, void *dev_id)
-+{
-+      free_irq(irq, dev_id);
-+      unbind_from_irq(irq);
-+}
-+EXPORT_SYMBOL_GPL(unbind_from_irqhandler);
-+
-+#ifdef CONFIG_SMP
-+void rebind_evtchn_to_cpu(int port, unsigned int cpu)
-+{
-+      struct evtchn_bind_vcpu ebv = { .port = port, .vcpu = cpu };
-+      int masked;
-+
-+      masked = test_and_set_evtchn_mask(port);
-+      if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_vcpu, &ebv) == 0)
-+              bind_evtchn_to_cpu(port, cpu);
-+      if (!masked)
-+              unmask_evtchn(port);
-+}
-+
-+static void rebind_irq_to_cpu(unsigned int irq, unsigned int tcpu)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              rebind_evtchn_to_cpu(evtchn, tcpu);
-+}
-+
-+static void set_affinity_irq(unsigned int irq, cpumask_t dest)
-+{
-+      unsigned tcpu = first_cpu(dest);
-+      rebind_irq_to_cpu(irq, tcpu);
-+}
-+#endif
-+
-+int resend_irq_on_evtchn(unsigned int irq)
-+{
-+      int masked, evtchn = evtchn_from_irq(irq);
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+
-+      if (!VALID_EVTCHN(evtchn))
-+              return 1;
-+
-+      masked = test_and_set_evtchn_mask(evtchn);
-+      synch_set_bit(evtchn, s->evtchn_pending);
-+      if (!masked)
-+              unmask_evtchn(evtchn);
-+
-+      return 1;
-+}
-+
-+/*
-+ * Interface to generic handling in irq.c
-+ */
-+
-+static unsigned int startup_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              unmask_evtchn(evtchn);
-+      return 0;
-+}
-+
-+static void shutdown_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              mask_evtchn(evtchn);
-+}
-+
-+static void enable_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              unmask_evtchn(evtchn);
-+}
-+
-+static void disable_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              mask_evtchn(evtchn);
-+}
-+
-+static void ack_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      move_native_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn)) {
-+              mask_evtchn(evtchn);
-+              clear_evtchn(evtchn);
-+      }
-+}
-+
-+static void end_dynirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn) && !(irq_desc[irq].status & IRQ_DISABLED))
-+              unmask_evtchn(evtchn);
-+}
-+
-+static struct hw_interrupt_type dynirq_type = {
-+      .typename = "Dynamic-irq",
-+      .startup  = startup_dynirq,
-+      .shutdown = shutdown_dynirq,
-+      .enable   = enable_dynirq,
-+      .disable  = disable_dynirq,
-+      .ack      = ack_dynirq,
-+      .end      = end_dynirq,
-+#ifdef CONFIG_SMP
-+      .set_affinity = set_affinity_irq,
-+#endif
-+      .retrigger = resend_irq_on_evtchn,
-+};
-+
-+static inline void pirq_unmask_notify(int irq)
-+{
-+      struct physdev_eoi eoi = { .irq = evtchn_get_xen_pirq(irq) };
-+      if (unlikely(test_bit(irq - PIRQ_BASE, pirq_needs_eoi)))
-+              VOID(HYPERVISOR_physdev_op(PHYSDEVOP_eoi, &eoi));
-+}
-+
-+static inline void pirq_query_unmask(int irq)
-+{
-+      struct physdev_irq_status_query irq_status;
-+      irq_status.irq = evtchn_get_xen_pirq(irq);
-+      if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
-+              irq_status.flags = 0;
-+      clear_bit(irq - PIRQ_BASE, pirq_needs_eoi);
-+      if (irq_status.flags & XENIRQSTAT_needs_eoi)
-+              set_bit(irq - PIRQ_BASE, pirq_needs_eoi);
-+}
-+
-+/*
-+ * On startup, if there is no action associated with the IRQ then we are
-+ * probing. In this case we should not share with others as it will confuse us.
-+ */
-+#define probing_irq(_irq) (irq_desc[(_irq)].action == NULL)
-+
-+static unsigned int startup_pirq(unsigned int irq)
-+{
-+      struct evtchn_bind_pirq bind_pirq;
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              goto out;
-+
-+      bind_pirq.pirq = evtchn_get_xen_pirq(irq);
-+      /* NB. We are happy to share unless we are probing. */
-+      bind_pirq.flags = probing_irq(irq) ? 0 : BIND_PIRQ__WILL_SHARE;
-+      if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_pirq, &bind_pirq) != 0) {
-+              if (!probing_irq(irq))
-+                      printk(KERN_INFO "Failed to obtain physical IRQ %d\n",
-+                             irq);
-+              return 0;
-+      }
-+      evtchn = bind_pirq.port;
-+
-+      pirq_query_unmask(irq);
-+
-+      evtchn_to_irq[evtchn] = irq;
-+      bind_evtchn_to_cpu(evtchn, 0);
-+      irq_info[irq] = mk_irq_info(IRQT_PIRQ, bind_pirq.pirq, evtchn);
-+
-+ out:
-+      unmask_evtchn(evtchn);
-+      pirq_unmask_notify(irq);
-+
-+      return 0;
-+}
-+
-+static void shutdown_pirq(unsigned int irq)
-+{
-+      struct evtchn_close close;
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (!VALID_EVTCHN(evtchn))
-+              return;
-+
-+      mask_evtchn(evtchn);
-+
-+      close.port = evtchn;
-+      if (HYPERVISOR_event_channel_op(EVTCHNOP_close, &close) != 0)
-+              BUG();
-+
-+      bind_evtchn_to_cpu(evtchn, 0);
-+      evtchn_to_irq[evtchn] = -1;
-+      irq_info[irq] = mk_irq_info(IRQT_PIRQ, index_from_irq(irq), 0);
-+}
-+
-+static void enable_pirq(unsigned int irq)
-+{
-+      startup_pirq(irq);
-+}
-+
-+static void disable_pirq(unsigned int irq)
-+{
-+}
-+
-+static void ack_pirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      move_native_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn)) {
-+              mask_evtchn(evtchn);
-+              clear_evtchn(evtchn);
-+      }
-+}
-+
-+static void end_pirq(unsigned int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if ((irq_desc[irq].status & (IRQ_DISABLED|IRQ_PENDING)) ==
-+          (IRQ_DISABLED|IRQ_PENDING)) {
-+              shutdown_pirq(irq);
-+      } else if (VALID_EVTCHN(evtchn)) {
-+              unmask_evtchn(evtchn);
-+              pirq_unmask_notify(irq);
-+      }
-+}
-+
-+static struct hw_interrupt_type pirq_type = {
-+      .typename = "Phys-irq",
-+      .startup  = startup_pirq,
-+      .shutdown = shutdown_pirq,
-+      .enable   = enable_pirq,
-+      .disable  = disable_pirq,
-+      .ack      = ack_pirq,
-+      .end      = end_pirq,
-+#ifdef CONFIG_SMP
-+      .set_affinity = set_affinity_irq,
-+#endif
-+      .retrigger = resend_irq_on_evtchn,
-+};
-+
-+int irq_ignore_unhandled(unsigned int irq)
-+{
-+      struct physdev_irq_status_query irq_status = { .irq = irq };
-+
-+      if (!is_running_on_xen())
-+              return 0;
-+
-+      if (HYPERVISOR_physdev_op(PHYSDEVOP_irq_status_query, &irq_status))
-+              return 0;
-+      return !!(irq_status.flags & XENIRQSTAT_shared);
-+}
-+
-+void notify_remote_via_irq(int irq)
-+{
-+      int evtchn = evtchn_from_irq(irq);
-+
-+      if (VALID_EVTCHN(evtchn))
-+              notify_remote_via_evtchn(evtchn);
-+}
-+EXPORT_SYMBOL_GPL(notify_remote_via_irq);
-+
-+int irq_to_evtchn_port(int irq)
-+{
-+      return evtchn_from_irq(irq);
-+}
-+EXPORT_SYMBOL_GPL(irq_to_evtchn_port);
-+
-+void mask_evtchn(int port)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      synch_set_bit(port, s->evtchn_mask);
-+}
-+EXPORT_SYMBOL_GPL(mask_evtchn);
-+
-+void unmask_evtchn(int port)
-+{
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+      unsigned int cpu = smp_processor_id();
-+      vcpu_info_t *vcpu_info = &s->vcpu_info[cpu];
-+
-+      BUG_ON(!irqs_disabled());
-+
-+      /* Slow path (hypercall) if this is a non-local port. */
-+      if (unlikely(cpu != cpu_from_evtchn(port))) {
-+              struct evtchn_unmask unmask = { .port = port };
-+              VOID(HYPERVISOR_event_channel_op(EVTCHNOP_unmask, &unmask));
-+              return;
-+      }
-+
-+      synch_clear_bit(port, s->evtchn_mask);
-+
-+      /* Did we miss an interrupt 'edge'? Re-fire if so. */
-+      if (synch_test_bit(port, s->evtchn_pending) &&
-+          !synch_test_and_set_bit(port / BITS_PER_LONG,
-+                                  &vcpu_info->evtchn_pending_sel))
-+              vcpu_info->evtchn_upcall_pending = 1;
-+}
-+EXPORT_SYMBOL_GPL(unmask_evtchn);
-+
-+void disable_all_local_evtchn(void)
-+{
-+      unsigned i, cpu = smp_processor_id();
-+      shared_info_t *s = HYPERVISOR_shared_info;
-+
-+      for (i = 0; i < NR_EVENT_CHANNELS; ++i)
-+              if (cpu_from_evtchn(i) == cpu)
-+                      synch_set_bit(i, &s->evtchn_mask[0]);
-+}
-+
-+static void restore_cpu_virqs(unsigned int cpu)
-+{
-+      struct evtchn_bind_virq bind_virq;
-+      int virq, irq, evtchn;
-+
-+      for (virq = 0; virq < NR_VIRQS; virq++) {
-+              if ((irq = per_cpu(virq_to_irq, cpu)[virq]) == -1)
-+                      continue;
-+
-+              BUG_ON(irq_info[irq] != mk_irq_info(IRQT_VIRQ, virq, 0));
-+
-+              /* Get a new binding from Xen. */
-+              bind_virq.virq = virq;
-+              bind_virq.vcpu = cpu;
-+              if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-+                                              &bind_virq) != 0)
-+                      BUG();
-+              evtchn = bind_virq.port;
-+
-+              /* Record the new mapping. */
-+              evtchn_to_irq[evtchn] = irq;
-+              irq_info[irq] = mk_irq_info(IRQT_VIRQ, virq, evtchn);
-+              bind_evtchn_to_cpu(evtchn, cpu);
-+
-+              /* Ready for use. */
-+              unmask_evtchn(evtchn);
-+      }
-+}
-+
-+static void restore_cpu_ipis(unsigned int cpu)
-+{
-+      struct evtchn_bind_ipi bind_ipi;
-+      int ipi, irq, evtchn;
-+
-+      for (ipi = 0; ipi < NR_IPIS; ipi++) {
-+              if ((irq = per_cpu(ipi_to_irq, cpu)[ipi]) == -1)
-+                      continue;
-+
-+              BUG_ON(irq_info[irq] != mk_irq_info(IRQT_IPI, ipi, 0));
-+
-+              /* Get a new binding from Xen. */
-+              bind_ipi.vcpu = cpu;
-+              if (HYPERVISOR_event_channel_op(EVTCHNOP_bind_ipi,
-+                                              &bind_ipi) != 0)
-+                      BUG();
-+              evtchn = bind_ipi.port;
-+
-+              /* Record the new mapping. */
-+              evtchn_to_irq[evtchn] = irq;
-+              irq_info[irq] = mk_irq_info(IRQT_IPI, ipi, evtchn);
-+              bind_evtchn_to_cpu(evtchn, cpu);
-+
-+              /* Ready for use. */
-+              unmask_evtchn(evtchn);
-+
-+      }
-+}
-+
-+void irq_resume(void)
-+{
-+      unsigned int cpu, irq, evtchn;
-+
-+      init_evtchn_cpu_bindings();
-+
-+      /* New event-channel space is not 'live' yet. */
-+      for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
-+              mask_evtchn(evtchn);
-+
-+      /* Check that no PIRQs are still bound. */
-+      for (irq = PIRQ_BASE; irq < (PIRQ_BASE + NR_PIRQS); irq++)
-+              BUG_ON(irq_info[irq] != IRQ_UNBOUND);
-+
-+      /* No IRQ <-> event-channel mappings. */
-+      for (irq = 0; irq < NR_IRQS; irq++)
-+              irq_info[irq] &= ~((1U << _EVTCHN_BITS) - 1);
-+      for (evtchn = 0; evtchn < NR_EVENT_CHANNELS; evtchn++)
-+              evtchn_to_irq[evtchn] = -1;
-+
-+      for_each_possible_cpu(cpu) {
-+              restore_cpu_virqs(cpu);
-+              restore_cpu_ipis(cpu);
-+      }
-+
-+}
-+
-+#if defined(CONFIG_X86_IO_APIC)
-+#define identity_mapped_irq(irq) (!IO_APIC_IRQ((irq) - PIRQ_BASE))
-+#elif defined(CONFIG_X86)
-+#define identity_mapped_irq(irq) (((irq) - PIRQ_BASE) < 16)
-+#else
-+#define identity_mapped_irq(irq) (1)
-+#endif
-+
-+void evtchn_register_pirq(int irq)
-+{
-+      BUG_ON(irq < PIRQ_BASE || irq - PIRQ_BASE > NR_PIRQS);
-+      if (identity_mapped_irq(irq))
-+              return;
-+      irq_info[irq] = mk_irq_info(IRQT_PIRQ, irq, 0);
-+      irq_desc[irq].chip = &pirq_type;
-+}
-+
-+int evtchn_map_pirq(int irq, int xen_pirq)
-+{
-+      if (irq < 0) {
-+              static DEFINE_SPINLOCK(irq_alloc_lock);
-+
-+              irq = PIRQ_BASE + NR_PIRQS - 1;
-+              spin_lock(&irq_alloc_lock);
-+              do {
-+                      if (identity_mapped_irq(irq))
-+                              continue;
-+                      if (!index_from_irq(irq)) {
-+                              BUG_ON(type_from_irq(irq) != IRQT_UNBOUND);
-+                              irq_info[irq] = mk_irq_info(IRQT_PIRQ,
-+                                                          xen_pirq, 0);
-+                              break;
-+                      }
-+              } while (--irq >= PIRQ_BASE);
-+              spin_unlock(&irq_alloc_lock);
-+              if (irq < PIRQ_BASE)
-+                      return -ENOSPC;
-+              irq_desc[irq].chip = &pirq_type;
-+      } else if (!xen_pirq) {
-+              if (unlikely(type_from_irq(irq) != IRQT_PIRQ))
-+                      return -EINVAL;
-+              irq_desc[irq].chip = &no_irq_type;
-+              irq_info[irq] = IRQ_UNBOUND;
-+              return 0;
-+      } else if (type_from_irq(irq) != IRQT_PIRQ
-+                 || index_from_irq(irq) != xen_pirq) {
-+              printk(KERN_ERR "IRQ#%d is already mapped to %d:%u - "
-+                              "cannot map to PIRQ#%u\n",
-+                     irq, type_from_irq(irq), index_from_irq(irq), xen_pirq);
-+              return -EINVAL;
-+      }
-+      return index_from_irq(irq) ? irq : -EINVAL;
-+}
-+
-+int evtchn_get_xen_pirq(int irq)
-+{
-+      if (identity_mapped_irq(irq))
-+              return irq;
-+      BUG_ON(type_from_irq(irq) != IRQT_PIRQ);
-+      return index_from_irq(irq);
-+}
-+
-+void __init xen_init_IRQ(void)
-+{
-+      unsigned int i;
-+
-+      init_evtchn_cpu_bindings();
-+
-+      /* No event channels are 'live' right now. */
-+      for (i = 0; i < NR_EVENT_CHANNELS; i++)
-+              mask_evtchn(i);
-+
-+      /* No IRQ -> event-channel mappings. */
-+      for (i = 0; i < NR_IRQS; i++)
-+              irq_info[i] = IRQ_UNBOUND;
-+
-+      /* Dynamic IRQ space is currently unbound. Zero the refcnts. */
-+      for (i = DYNIRQ_BASE; i < (DYNIRQ_BASE + NR_DYNIRQS); i++) {
-+              irq_bindcount[i] = 0;
-+
-+              irq_desc[i].status = IRQ_DISABLED|IRQ_NOPROBE;
-+              irq_desc[i].action = NULL;
-+              irq_desc[i].depth = 1;
-+              irq_desc[i].chip = &dynirq_type;
-+      }
-+
-+      /* Phys IRQ space is statically bound (1:1 mapping). Nail refcnts. */
-+      for (i = PIRQ_BASE; i < (PIRQ_BASE + NR_PIRQS); i++) {
-+              irq_bindcount[i] = 1;
-+
-+              if (!identity_mapped_irq(i))
-+                      continue;
-+
-+#ifdef RTC_IRQ
-+              /* If not domain 0, force our RTC driver to fail its probe. */
-+              if (i - PIRQ_BASE == RTC_IRQ && !is_initial_xendomain())
-+                      continue;
-+#endif
-+
-+              irq_desc[i].status = IRQ_DISABLED;
-+              irq_desc[i].action = NULL;
-+              irq_desc[i].depth = 1;
-+              irq_desc[i].chip = &pirq_type;
-+      }
-+}
-Index: head-2008-11-25/drivers/xen/core/features.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/features.c        2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,34 @@
-+/******************************************************************************
-+ * features.c
-+ *
-+ * Xen feature flags.
-+ *
-+ * Copyright (c) 2006, Ian Campbell, XenSource Inc.
-+ */
-+#include <linux/types.h>
-+#include <linux/cache.h>
-+#include <linux/module.h>
-+#include <asm/hypervisor.h>
-+#include <xen/features.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+u8 xen_features[XENFEAT_NR_SUBMAPS * 32] __read_mostly;
-+/* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
-+EXPORT_SYMBOL(xen_features);
-+
-+void setup_xen_features(void)
-+{
-+      xen_feature_info_t fi;
-+      int i, j;
-+
-+      for (i = 0; i < XENFEAT_NR_SUBMAPS; i++) {
-+              fi.submap_idx = i;
-+              if (HYPERVISOR_xen_version(XENVER_get_features, &fi) < 0)
-+                      break;
-+              for (j=0; j<32; j++)
-+                      xen_features[i*32+j] = !!(fi.submap & 1<<j);
-+      }
-+}
-Index: head-2008-11-25/drivers/xen/core/firmware.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/firmware.c        2007-06-22 09:08:06.000000000 +0200
-@@ -0,0 +1,74 @@
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/init.h>
-+#include <linux/edd.h>
-+#include <video/edid.h>
-+#include <xen/interface/platform.h>
-+#include <asm/hypervisor.h>
-+
-+#if defined(CONFIG_EDD) || defined(CONFIG_EDD_MODULE)
-+void __init copy_edd(void)
-+{
-+      int ret;
-+      struct xen_platform_op op;
-+
-+      if (!is_initial_xendomain())
-+              return;
-+
-+      op.cmd = XENPF_firmware_info;
-+
-+      op.u.firmware_info.type = XEN_FW_DISK_INFO;
-+      for (op.u.firmware_info.index = 0;
-+           edd.edd_info_nr < EDDMAXNR;
-+           op.u.firmware_info.index++) {
-+              struct edd_info *info = edd.edd_info + edd.edd_info_nr;
-+
-+              info->params.length = sizeof(info->params);
-+              set_xen_guest_handle(op.u.firmware_info.u.disk_info.edd_params,
-+                                   &info->params);
-+              ret = HYPERVISOR_platform_op(&op);
-+              if (ret)
-+                      break;
-+
-+#define C(x) info->x = op.u.firmware_info.u.disk_info.x
-+              C(device);
-+              C(version);
-+              C(interface_support);
-+              C(legacy_max_cylinder);
-+              C(legacy_max_head);
-+              C(legacy_sectors_per_track);
-+#undef C
-+
-+              edd.edd_info_nr++;
-+      }
-+
-+      op.u.firmware_info.type = XEN_FW_DISK_MBR_SIGNATURE;
-+      for (op.u.firmware_info.index = 0;
-+           edd.mbr_signature_nr < EDD_MBR_SIG_MAX;
-+           op.u.firmware_info.index++) {
-+              ret = HYPERVISOR_platform_op(&op);
-+              if (ret)
-+                      break;
-+              edd.mbr_signature[edd.mbr_signature_nr++] =
-+                      op.u.firmware_info.u.disk_mbr_signature.mbr_signature;
-+      }
-+}
-+#endif
-+
-+void __init copy_edid(void)
-+{
-+#if defined(CONFIG_FIRMWARE_EDID) && defined(CONFIG_X86)
-+      struct xen_platform_op op;
-+
-+      if (!is_initial_xendomain())
-+              return;
-+
-+      op.cmd = XENPF_firmware_info;
-+      op.u.firmware_info.index = 0;
-+      op.u.firmware_info.type = XEN_FW_VBEDDC_INFO;
-+      set_xen_guest_handle(op.u.firmware_info.u.vbeddc_info.edid,
-+                           edid_info.dummy);
-+      if (HYPERVISOR_platform_op(&op) != 0)
-+              memset(edid_info.dummy, 0x13, sizeof(edid_info.dummy));
-+#endif
-+}
-Index: head-2008-11-25/drivers/xen/core/gnttab.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/gnttab.c  2008-11-04 11:13:10.000000000 +0100
-@@ -0,0 +1,772 @@
-+/******************************************************************************
-+ * gnttab.c
-+ *
-+ * Granting foreign access to our memory reservation.
-+ *
-+ * Copyright (c) 2005-2006, Christopher Clark
-+ * Copyright (c) 2004-2005, K A Fraser
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/sched.h>
-+#include <linux/mm.h>
-+#include <linux/seqlock.h>
-+#include <xen/interface/xen.h>
-+#include <xen/gnttab.h>
-+#include <asm/pgtable.h>
-+#include <asm/uaccess.h>
-+#include <asm/synch_bitops.h>
-+#include <asm/io.h>
-+#include <xen/interface/memory.h>
-+#include <xen/driver_util.h>
-+#include <asm/gnttab_dma.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+/* External tools reserve first few grant table entries. */
-+#define NR_RESERVED_ENTRIES 8
-+#define GNTTAB_LIST_END 0xffffffff
-+#define ENTRIES_PER_GRANT_FRAME (PAGE_SIZE / sizeof(grant_entry_t))
-+
-+static grant_ref_t **gnttab_list;
-+static unsigned int nr_grant_frames;
-+static unsigned int boot_max_nr_grant_frames;
-+static int gnttab_free_count;
-+static grant_ref_t gnttab_free_head;
-+static DEFINE_SPINLOCK(gnttab_list_lock);
-+
-+static struct grant_entry *shared;
-+
-+static struct gnttab_free_callback *gnttab_free_callback_list;
-+
-+static int gnttab_expand(unsigned int req_entries);
-+
-+#define RPP (PAGE_SIZE / sizeof(grant_ref_t))
-+#define gnttab_entry(entry) (gnttab_list[(entry) / RPP][(entry) % RPP])
-+
-+#define nr_freelist_frames(grant_frames)                              \
-+      (((grant_frames) * ENTRIES_PER_GRANT_FRAME + RPP - 1) / RPP)
-+
-+static int get_free_entries(int count)
-+{
-+      unsigned long flags;
-+      int ref, rc;
-+      grant_ref_t head;
-+
-+      spin_lock_irqsave(&gnttab_list_lock, flags);
-+
-+      if ((gnttab_free_count < count) &&
-+          ((rc = gnttab_expand(count - gnttab_free_count)) < 0)) {
-+              spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+              return rc;
-+      }
-+
-+      ref = head = gnttab_free_head;
-+      gnttab_free_count -= count;
-+      while (count-- > 1)
-+              head = gnttab_entry(head);
-+      gnttab_free_head = gnttab_entry(head);
-+      gnttab_entry(head) = GNTTAB_LIST_END;
-+
-+      spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+
-+      return ref;
-+}
-+
-+#define get_free_entry() get_free_entries(1)
-+
-+static void do_free_callbacks(void)
-+{
-+      struct gnttab_free_callback *callback, *next;
-+
-+      callback = gnttab_free_callback_list;
-+      gnttab_free_callback_list = NULL;
-+
-+      while (callback != NULL) {
-+              next = callback->next;
-+              if (gnttab_free_count >= callback->count) {
-+                      callback->next = NULL;
-+                      callback->queued = 0;
-+                      callback->fn(callback->arg);
-+              } else {
-+                      callback->next = gnttab_free_callback_list;
-+                      gnttab_free_callback_list = callback;
-+              }
-+              callback = next;
-+      }
-+}
-+
-+static inline void check_free_callbacks(void)
-+{
-+      if (unlikely(gnttab_free_callback_list))
-+              do_free_callbacks();
-+}
-+
-+static void put_free_entry(grant_ref_t ref)
-+{
-+      unsigned long flags;
-+      spin_lock_irqsave(&gnttab_list_lock, flags);
-+      gnttab_entry(ref) = gnttab_free_head;
-+      gnttab_free_head = ref;
-+      gnttab_free_count++;
-+      check_free_callbacks();
-+      spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+}
-+
-+/*
-+ * Public grant-issuing interface functions
-+ */
-+
-+int gnttab_grant_foreign_access(domid_t domid, unsigned long frame,
-+                              int flags)
-+{
-+      int ref;
-+
-+      if (unlikely((ref = get_free_entry()) < 0))
-+              return -ENOSPC;
-+
-+      shared[ref].frame = frame;
-+      shared[ref].domid = domid;
-+      wmb();
-+      BUG_ON(flags & (GTF_accept_transfer | GTF_reading | GTF_writing));
-+      shared[ref].flags = GTF_permit_access | flags;
-+
-+      return ref;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access);
-+
-+void gnttab_grant_foreign_access_ref(grant_ref_t ref, domid_t domid,
-+                                   unsigned long frame, int flags)
-+{
-+      shared[ref].frame = frame;
-+      shared[ref].domid = domid;
-+      wmb();
-+      BUG_ON(flags & (GTF_accept_transfer | GTF_reading | GTF_writing));
-+      shared[ref].flags = GTF_permit_access | flags;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_grant_foreign_access_ref);
-+
-+
-+int gnttab_query_foreign_access(grant_ref_t ref)
-+{
-+      u16 nflags;
-+
-+      nflags = shared[ref].flags;
-+
-+      return (nflags & (GTF_reading|GTF_writing));
-+}
-+EXPORT_SYMBOL_GPL(gnttab_query_foreign_access);
-+
-+int gnttab_end_foreign_access_ref(grant_ref_t ref)
-+{
-+      u16 flags, nflags;
-+
-+      nflags = shared[ref].flags;
-+      do {
-+              if ((flags = nflags) & (GTF_reading|GTF_writing)) {
-+                      printk(KERN_DEBUG "WARNING: g.e. still in use!\n");
-+                      return 0;
-+              }
-+      } while ((nflags = synch_cmpxchg_subword(&shared[ref].flags, flags, 0)) !=
-+               flags);
-+
-+      return 1;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_end_foreign_access_ref);
-+
-+void gnttab_end_foreign_access(grant_ref_t ref, unsigned long page)
-+{
-+      if (gnttab_end_foreign_access_ref(ref)) {
-+              put_free_entry(ref);
-+              if (page != 0)
-+                      free_page(page);
-+      } else {
-+              /* XXX This needs to be fixed so that the ref and page are
-+                 placed on a list to be freed up later. */
-+              printk(KERN_DEBUG
-+                     "WARNING: leaking g.e. and page still in use!\n");
-+      }
-+}
-+EXPORT_SYMBOL_GPL(gnttab_end_foreign_access);
-+
-+int gnttab_grant_foreign_transfer(domid_t domid, unsigned long pfn)
-+{
-+      int ref;
-+
-+      if (unlikely((ref = get_free_entry()) < 0))
-+              return -ENOSPC;
-+      gnttab_grant_foreign_transfer_ref(ref, domid, pfn);
-+
-+      return ref;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer);
-+
-+void gnttab_grant_foreign_transfer_ref(grant_ref_t ref, domid_t domid,
-+                                     unsigned long pfn)
-+{
-+      shared[ref].frame = pfn;
-+      shared[ref].domid = domid;
-+      wmb();
-+      shared[ref].flags = GTF_accept_transfer;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_grant_foreign_transfer_ref);
-+
-+unsigned long gnttab_end_foreign_transfer_ref(grant_ref_t ref)
-+{
-+      unsigned long frame;
-+      u16           flags;
-+
-+      /*
-+       * If a transfer is not even yet started, try to reclaim the grant
-+       * reference and return failure (== 0).
-+       */
-+      while (!((flags = shared[ref].flags) & GTF_transfer_committed)) {
-+              if (synch_cmpxchg_subword(&shared[ref].flags, flags, 0) == flags)
-+                      return 0;
-+              cpu_relax();
-+      }
-+
-+      /* If a transfer is in progress then wait until it is completed. */
-+      while (!(flags & GTF_transfer_completed)) {
-+              flags = shared[ref].flags;
-+              cpu_relax();
-+      }
-+
-+      /* Read the frame number /after/ reading completion status. */
-+      rmb();
-+      frame = shared[ref].frame;
-+      BUG_ON(frame == 0);
-+
-+      return frame;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer_ref);
-+
-+unsigned long gnttab_end_foreign_transfer(grant_ref_t ref)
-+{
-+      unsigned long frame = gnttab_end_foreign_transfer_ref(ref);
-+      put_free_entry(ref);
-+      return frame;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_end_foreign_transfer);
-+
-+void gnttab_free_grant_reference(grant_ref_t ref)
-+{
-+      put_free_entry(ref);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_free_grant_reference);
-+
-+void gnttab_free_grant_references(grant_ref_t head)
-+{
-+      grant_ref_t ref;
-+      unsigned long flags;
-+      int count = 1;
-+      if (head == GNTTAB_LIST_END)
-+              return;
-+      spin_lock_irqsave(&gnttab_list_lock, flags);
-+      ref = head;
-+      while (gnttab_entry(ref) != GNTTAB_LIST_END) {
-+              ref = gnttab_entry(ref);
-+              count++;
-+      }
-+      gnttab_entry(ref) = gnttab_free_head;
-+      gnttab_free_head = head;
-+      gnttab_free_count += count;
-+      check_free_callbacks();
-+      spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_free_grant_references);
-+
-+int gnttab_alloc_grant_references(u16 count, grant_ref_t *head)
-+{
-+      int h = get_free_entries(count);
-+
-+      if (h < 0)
-+              return -ENOSPC;
-+
-+      *head = h;
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_alloc_grant_references);
-+
-+int gnttab_empty_grant_references(const grant_ref_t *private_head)
-+{
-+      return (*private_head == GNTTAB_LIST_END);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_empty_grant_references);
-+
-+int gnttab_claim_grant_reference(grant_ref_t *private_head)
-+{
-+      grant_ref_t g = *private_head;
-+      if (unlikely(g == GNTTAB_LIST_END))
-+              return -ENOSPC;
-+      *private_head = gnttab_entry(g);
-+      return g;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_claim_grant_reference);
-+
-+void gnttab_release_grant_reference(grant_ref_t *private_head,
-+                                  grant_ref_t release)
-+{
-+      gnttab_entry(release) = *private_head;
-+      *private_head = release;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_release_grant_reference);
-+
-+void gnttab_request_free_callback(struct gnttab_free_callback *callback,
-+                                void (*fn)(void *), void *arg, u16 count)
-+{
-+      unsigned long flags;
-+      spin_lock_irqsave(&gnttab_list_lock, flags);
-+      if (callback->queued)
-+              goto out;
-+      callback->fn = fn;
-+      callback->arg = arg;
-+      callback->count = count;
-+      callback->queued = 1;
-+      callback->next = gnttab_free_callback_list;
-+      gnttab_free_callback_list = callback;
-+      check_free_callbacks();
-+out:
-+      spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_request_free_callback);
-+
-+void gnttab_cancel_free_callback(struct gnttab_free_callback *callback)
-+{
-+      struct gnttab_free_callback **pcb;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&gnttab_list_lock, flags);
-+      for (pcb = &gnttab_free_callback_list; *pcb; pcb = &(*pcb)->next) {
-+              if (*pcb == callback) {
-+                      *pcb = callback->next;
-+                      callback->queued = 0;
-+                      break;
-+              }
-+      }
-+      spin_unlock_irqrestore(&gnttab_list_lock, flags);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_cancel_free_callback);
-+
-+static int grow_gnttab_list(unsigned int more_frames)
-+{
-+      unsigned int new_nr_grant_frames, extra_entries, i;
-+      unsigned int nr_glist_frames, new_nr_glist_frames;
-+
-+      new_nr_grant_frames = nr_grant_frames + more_frames;
-+      extra_entries       = more_frames * ENTRIES_PER_GRANT_FRAME;
-+
-+      nr_glist_frames = nr_freelist_frames(nr_grant_frames);
-+      new_nr_glist_frames = nr_freelist_frames(new_nr_grant_frames);
-+      for (i = nr_glist_frames; i < new_nr_glist_frames; i++) {
-+              gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_ATOMIC);
-+              if (!gnttab_list[i])
-+                      goto grow_nomem;
-+      }
-+
-+      for (i = ENTRIES_PER_GRANT_FRAME * nr_grant_frames;
-+           i < ENTRIES_PER_GRANT_FRAME * new_nr_grant_frames - 1; i++)
-+              gnttab_entry(i) = i + 1;
-+
-+      gnttab_entry(i) = gnttab_free_head;
-+      gnttab_free_head = ENTRIES_PER_GRANT_FRAME * nr_grant_frames;
-+      gnttab_free_count += extra_entries;
-+
-+      nr_grant_frames = new_nr_grant_frames;
-+
-+      check_free_callbacks();
-+
-+      return 0;
-+      
-+grow_nomem:
-+      for ( ; i >= nr_glist_frames; i--)
-+              free_page((unsigned long) gnttab_list[i]);
-+      return -ENOMEM;
-+}
-+
-+static unsigned int __max_nr_grant_frames(void)
-+{
-+      struct gnttab_query_size query;
-+      int rc;
-+
-+      query.dom = DOMID_SELF;
-+
-+      rc = HYPERVISOR_grant_table_op(GNTTABOP_query_size, &query, 1);
-+      if ((rc < 0) || (query.status != GNTST_okay))
-+              return 4; /* Legacy max supported number of frames */
-+
-+      return query.max_nr_frames;
-+}
-+
-+static inline unsigned int max_nr_grant_frames(void)
-+{
-+      unsigned int xen_max = __max_nr_grant_frames();
-+
-+      if (xen_max > boot_max_nr_grant_frames)
-+              return boot_max_nr_grant_frames;
-+      return xen_max;
-+}
-+
-+#ifdef CONFIG_XEN
-+
-+static DEFINE_SEQLOCK(gnttab_dma_lock);
-+
-+#ifdef CONFIG_X86
-+static int map_pte_fn(pte_t *pte, struct page *pmd_page,
-+                    unsigned long addr, void *data)
-+{
-+      unsigned long **frames = (unsigned long **)data;
-+
-+      set_pte_at(&init_mm, addr, pte, pfn_pte_ma((*frames)[0], PAGE_KERNEL));
-+      (*frames)++;
-+      return 0;
-+}
-+
-+static int unmap_pte_fn(pte_t *pte, struct page *pmd_page,
-+                      unsigned long addr, void *data)
-+{
-+
-+      set_pte_at(&init_mm, addr, pte, __pte(0));
-+      return 0;
-+}
-+
-+void *arch_gnttab_alloc_shared(unsigned long *frames)
-+{
-+      struct vm_struct *area;
-+      area = alloc_vm_area(PAGE_SIZE * max_nr_grant_frames());
-+      BUG_ON(area == NULL);
-+      return area->addr;
-+}
-+#endif /* CONFIG_X86 */
-+
-+static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
-+{
-+      struct gnttab_setup_table setup;
-+      unsigned long *frames;
-+      unsigned int nr_gframes = end_idx + 1;
-+      int rc;
-+
-+      frames = kmalloc(nr_gframes * sizeof(unsigned long), GFP_ATOMIC);
-+      if (!frames)
-+              return -ENOMEM;
-+
-+      setup.dom        = DOMID_SELF;
-+      setup.nr_frames  = nr_gframes;
-+      set_xen_guest_handle(setup.frame_list, frames);
-+
-+      rc = HYPERVISOR_grant_table_op(GNTTABOP_setup_table, &setup, 1);
-+      if (rc == -ENOSYS) {
-+              kfree(frames);
-+              return -ENOSYS;
-+      }
-+
-+      BUG_ON(rc || setup.status);
-+
-+      if (shared == NULL)
-+              shared = arch_gnttab_alloc_shared(frames);
-+
-+#ifdef CONFIG_X86
-+      rc = apply_to_page_range(&init_mm, (unsigned long)shared,
-+                               PAGE_SIZE * nr_gframes,
-+                               map_pte_fn, &frames);
-+      BUG_ON(rc);
-+      frames -= nr_gframes; /* adjust after map_pte_fn() */
-+#endif /* CONFIG_X86 */
-+
-+      kfree(frames);
-+
-+      return 0;
-+}
-+
-+static void gnttab_page_free(struct page *page)
-+{
-+      ClearPageForeign(page);
-+      gnttab_reset_grant_page(page);
-+      put_page(page);
-+}
-+
-+/*
-+ * Must not be called with IRQs off.  This should only be used on the
-+ * slow path.
-+ *
-+ * Copy a foreign granted page to local memory.
-+ */
-+int gnttab_copy_grant_page(grant_ref_t ref, struct page **pagep)
-+{
-+      struct gnttab_unmap_and_replace unmap;
-+      mmu_update_t mmu;
-+      struct page *page;
-+      struct page *new_page;
-+      void *new_addr;
-+      void *addr;
-+      paddr_t pfn;
-+      maddr_t mfn;
-+      maddr_t new_mfn;
-+      int err;
-+
-+      page = *pagep;
-+      if (!get_page_unless_zero(page))
-+              return -ENOENT;
-+
-+      err = -ENOMEM;
-+      new_page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-+      if (!new_page)
-+              goto out;
-+
-+      new_addr = page_address(new_page);
-+      addr = page_address(page);
-+      memcpy(new_addr, addr, PAGE_SIZE);
-+
-+      pfn = page_to_pfn(page);
-+      mfn = pfn_to_mfn(pfn);
-+      new_mfn = virt_to_mfn(new_addr);
-+
-+      write_seqlock(&gnttab_dma_lock);
-+
-+      /* Make seq visible before checking page_mapped. */
-+      smp_mb();
-+
-+      /* Has the page been DMA-mapped? */
-+      if (unlikely(page_mapped(page))) {
-+              write_sequnlock(&gnttab_dma_lock);
-+              put_page(new_page);
-+              err = -EBUSY;
-+              goto out;
-+      }
-+
-+      if (!xen_feature(XENFEAT_auto_translated_physmap))
-+              set_phys_to_machine(pfn, new_mfn);
-+
-+      gnttab_set_replace_op(&unmap, (unsigned long)addr,
-+                            (unsigned long)new_addr, ref);
-+
-+      err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_and_replace,
-+                                      &unmap, 1);
-+      BUG_ON(err);
-+      BUG_ON(unmap.status);
-+
-+      write_sequnlock(&gnttab_dma_lock);
-+
-+      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+              set_phys_to_machine(page_to_pfn(new_page), INVALID_P2M_ENTRY);
-+
-+              mmu.ptr = (new_mfn << PAGE_SHIFT) | MMU_MACHPHYS_UPDATE;
-+              mmu.val = pfn;
-+              err = HYPERVISOR_mmu_update(&mmu, 1, NULL, DOMID_SELF);
-+              BUG_ON(err);
-+      }
-+
-+      new_page->mapping = page->mapping;
-+      new_page->index = page->index;
-+      set_bit(PG_foreign, &new_page->flags);
-+      *pagep = new_page;
-+
-+      SetPageForeign(page, gnttab_page_free);
-+      page->mapping = NULL;
-+
-+out:
-+      put_page(page);
-+      return err;
-+}
-+EXPORT_SYMBOL_GPL(gnttab_copy_grant_page);
-+
-+void gnttab_reset_grant_page(struct page *page)
-+{
-+      init_page_count(page);
-+      reset_page_mapcount(page);
-+}
-+EXPORT_SYMBOL_GPL(gnttab_reset_grant_page);
-+
-+/*
-+ * Keep track of foreign pages marked as PageForeign so that we don't
-+ * return them to the remote domain prematurely.
-+ *
-+ * PageForeign pages are pinned down by increasing their mapcount.
-+ *
-+ * All other pages are simply returned as is.
-+ */
-+void __gnttab_dma_map_page(struct page *page)
-+{
-+      unsigned int seq;
-+
-+      if (!is_running_on_xen() || !PageForeign(page))
-+              return;
-+
-+      do {
-+              seq = read_seqbegin(&gnttab_dma_lock);
-+
-+              if (gnttab_dma_local_pfn(page))
-+                      break;
-+
-+              atomic_set(&page->_mapcount, 0);
-+
-+              /* Make _mapcount visible before read_seqretry. */
-+              smp_mb();
-+      } while (unlikely(read_seqretry(&gnttab_dma_lock, seq)));
-+}
-+
-+int gnttab_resume(void)
-+{
-+      if (max_nr_grant_frames() < nr_grant_frames)
-+              return -ENOSYS;
-+      return gnttab_map(0, nr_grant_frames - 1);
-+}
-+
-+int gnttab_suspend(void)
-+{
-+#ifdef CONFIG_X86
-+      apply_to_page_range(&init_mm, (unsigned long)shared,
-+                          PAGE_SIZE * nr_grant_frames,
-+                          unmap_pte_fn, NULL);
-+#endif
-+      return 0;
-+}
-+
-+#else /* !CONFIG_XEN */
-+
-+#include <platform-pci.h>
-+
-+static unsigned long resume_frames;
-+
-+static int gnttab_map(unsigned int start_idx, unsigned int end_idx)
-+{
-+      struct xen_add_to_physmap xatp;
-+      unsigned int i = end_idx;
-+
-+      /* Loop backwards, so that the first hypercall has the largest index,
-+       * ensuring that the table will grow only once.
-+       */
-+      do {
-+              xatp.domid = DOMID_SELF;
-+              xatp.idx = i;
-+              xatp.space = XENMAPSPACE_grant_table;
-+              xatp.gpfn = (resume_frames >> PAGE_SHIFT) + i;
-+              if (HYPERVISOR_memory_op(XENMEM_add_to_physmap, &xatp))
-+                      BUG();
-+      } while (i-- > start_idx);
-+
-+      return 0;
-+}
-+
-+int gnttab_resume(void)
-+{
-+      unsigned int max_nr_gframes, nr_gframes;
-+
-+      nr_gframes = nr_grant_frames;
-+      max_nr_gframes = max_nr_grant_frames();
-+      if (max_nr_gframes < nr_gframes)
-+              return -ENOSYS;
-+
-+      if (!resume_frames) {
-+              resume_frames = alloc_xen_mmio(PAGE_SIZE * max_nr_gframes);
-+              shared = ioremap(resume_frames, PAGE_SIZE * max_nr_gframes);
-+              if (shared == NULL) {
-+                      printk("error to ioremap gnttab share frames\n");
-+                      return -1;
-+              }
-+      }
-+
-+      gnttab_map(0, nr_gframes - 1);
-+
-+      return 0;
-+}
-+
-+#endif /* !CONFIG_XEN */
-+
-+static int gnttab_expand(unsigned int req_entries)
-+{
-+      int rc;
-+      unsigned int cur, extra;
-+
-+      cur = nr_grant_frames;
-+      extra = ((req_entries + (ENTRIES_PER_GRANT_FRAME-1)) /
-+               ENTRIES_PER_GRANT_FRAME);
-+      if (cur + extra > max_nr_grant_frames())
-+              return -ENOSPC;
-+
-+      if ((rc = gnttab_map(cur, cur + extra - 1)) == 0)
-+              rc = grow_gnttab_list(extra);
-+
-+      return rc;
-+}
-+
-+int __devinit gnttab_init(void)
-+{
-+      int i;
-+      unsigned int max_nr_glist_frames, nr_glist_frames;
-+      unsigned int nr_init_grefs;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      nr_grant_frames = 1;
-+      boot_max_nr_grant_frames = __max_nr_grant_frames();
-+
-+      /* Determine the maximum number of frames required for the
-+       * grant reference free list on the current hypervisor.
-+       */
-+      max_nr_glist_frames = nr_freelist_frames(boot_max_nr_grant_frames);
-+
-+      gnttab_list = kmalloc(max_nr_glist_frames * sizeof(grant_ref_t *),
-+                            GFP_KERNEL);
-+      if (gnttab_list == NULL)
-+              return -ENOMEM;
-+
-+      nr_glist_frames = nr_freelist_frames(nr_grant_frames);
-+      for (i = 0; i < nr_glist_frames; i++) {
-+              gnttab_list[i] = (grant_ref_t *)__get_free_page(GFP_KERNEL);
-+              if (gnttab_list[i] == NULL)
-+                      goto ini_nomem;
-+      }
-+
-+      if (gnttab_resume() < 0)
-+              return -ENODEV;
-+
-+      nr_init_grefs = nr_grant_frames * ENTRIES_PER_GRANT_FRAME;
-+
-+      for (i = NR_RESERVED_ENTRIES; i < nr_init_grefs - 1; i++)
-+              gnttab_entry(i) = i + 1;
-+
-+      gnttab_entry(nr_init_grefs - 1) = GNTTAB_LIST_END;
-+      gnttab_free_count = nr_init_grefs - NR_RESERVED_ENTRIES;
-+      gnttab_free_head  = NR_RESERVED_ENTRIES;
-+
-+      return 0;
-+
-+ ini_nomem:
-+      for (i--; i >= 0; i--)
-+              free_page((unsigned long)gnttab_list[i]);
-+      kfree(gnttab_list);
-+      return -ENOMEM;
-+}
-+
-+#ifdef CONFIG_XEN
-+core_initcall(gnttab_init);
-+#endif
-Index: head-2008-11-25/drivers/xen/core/hypervisor_sysfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/hypervisor_sysfs.c        2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1,57 @@
-+/*
-+ *  copyright (c) 2006 IBM Corporation
-+ *  Authored by: Mike D. Day <ncmike@us.ibm.com>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License version 2 as
-+ *  published by the Free Software Foundation.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/kobject.h>
-+#include <xen/hypervisor_sysfs.h>
-+#include <asm/hypervisor.h>
-+
-+static ssize_t hyp_sysfs_show(struct kobject *kobj,
-+                            struct attribute *attr,
-+                            char *buffer)
-+{
-+      struct hyp_sysfs_attr *hyp_attr;
-+      hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
-+      if (hyp_attr->show)
-+              return hyp_attr->show(hyp_attr, buffer);
-+      return 0;
-+}
-+
-+static ssize_t hyp_sysfs_store(struct kobject *kobj,
-+                             struct attribute *attr,
-+                             const char *buffer,
-+                             size_t len)
-+{
-+      struct hyp_sysfs_attr *hyp_attr;
-+      hyp_attr = container_of(attr, struct hyp_sysfs_attr, attr);
-+      if (hyp_attr->store)
-+              return hyp_attr->store(hyp_attr, buffer, len);
-+      return 0;
-+}
-+
-+static struct sysfs_ops hyp_sysfs_ops = {
-+      .show = hyp_sysfs_show,
-+      .store = hyp_sysfs_store,
-+};
-+
-+static struct kobj_type hyp_sysfs_kobj_type = {
-+      .sysfs_ops = &hyp_sysfs_ops,
-+};
-+
-+static int __init hypervisor_subsys_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      hypervisor_subsys.kset.kobj.ktype = &hyp_sysfs_kobj_type;
-+      return 0;
-+}
-+
-+device_initcall(hypervisor_subsys_init);
-Index: head-2008-11-25/drivers/xen/core/machine_kexec.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/machine_kexec.c   2008-10-13 13:43:45.000000000 +0200
-@@ -0,0 +1,222 @@
-+/*
-+ * drivers/xen/core/machine_kexec.c 
-+ * handle transition of Linux booting another kernel
-+ */
-+
-+#include <linux/kexec.h>
-+#include <xen/interface/kexec.h>
-+#include <linux/mm.h>
-+#include <linux/bootmem.h>
-+
-+extern void machine_kexec_setup_load_arg(xen_kexec_image_t *xki, 
-+                                       struct kimage *image);
-+extern int machine_kexec_setup_resources(struct resource *hypervisor,
-+                                       struct resource *phys_cpus,
-+                                       int nr_phys_cpus);
-+extern void machine_kexec_register_resources(struct resource *res);
-+
-+static int __initdata xen_max_nr_phys_cpus;
-+static struct resource xen_hypervisor_res;
-+static struct resource *xen_phys_cpus;
-+
-+size_t vmcoreinfo_size_xen;
-+unsigned long paddr_vmcoreinfo_xen;
-+
-+void __init xen_machine_kexec_setup_resources(void)
-+{
-+      xen_kexec_range_t range;
-+      struct resource *res;
-+      int k = 0;
-+      int rc;
-+
-+      if (!is_initial_xendomain())
-+              return;
-+
-+      /* determine maximum number of physical cpus */
-+
-+      while (1) {
-+              memset(&range, 0, sizeof(range));
-+              range.range = KEXEC_RANGE_MA_CPU;
-+              range.nr = k;
-+
-+              if(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-+                      break;
-+
-+              k++;
-+      }
-+
-+      if (k == 0)
-+              return;
-+
-+      xen_max_nr_phys_cpus = k;
-+
-+      /* allocate xen_phys_cpus */
-+
-+      xen_phys_cpus = alloc_bootmem_low(k * sizeof(struct resource));
-+      BUG_ON(xen_phys_cpus == NULL);
-+
-+      /* fill in xen_phys_cpus with per-cpu crash note information */
-+
-+      for (k = 0; k < xen_max_nr_phys_cpus; k++) {
-+              memset(&range, 0, sizeof(range));
-+              range.range = KEXEC_RANGE_MA_CPU;
-+              range.nr = k;
-+
-+              if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-+                      goto err;
-+
-+              res = xen_phys_cpus + k;
-+
-+              memset(res, 0, sizeof(*res));
-+              res->name = "Crash note";
-+              res->start = range.start;
-+              res->end = range.start + range.size - 1;
-+              res->flags = IORESOURCE_BUSY | IORESOURCE_MEM;
-+      }
-+
-+      /* fill in xen_hypervisor_res with hypervisor machine address range */
-+
-+      memset(&range, 0, sizeof(range));
-+      range.range = KEXEC_RANGE_MA_XEN;
-+
-+      if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-+              goto err;
-+
-+      xen_hypervisor_res.name = "Hypervisor code and data";
-+      xen_hypervisor_res.start = range.start;
-+      xen_hypervisor_res.end = range.start + range.size - 1;
-+      xen_hypervisor_res.flags = IORESOURCE_BUSY | IORESOURCE_MEM;
-+
-+      /* fill in crashk_res if range is reserved by hypervisor */
-+
-+      memset(&range, 0, sizeof(range));
-+      range.range = KEXEC_RANGE_MA_CRASH;
-+
-+      if (HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range))
-+              goto err;
-+
-+      if (range.size) {
-+              crashk_res.start = range.start;
-+              crashk_res.end = range.start + range.size - 1;
-+      }
-+
-+      /* get physical address of vmcoreinfo */
-+      memset(&range, 0, sizeof(range));
-+      range.range = KEXEC_RANGE_MA_VMCOREINFO;
-+
-+      rc = HYPERVISOR_kexec_op(KEXEC_CMD_kexec_get_range, &range);
-+
-+      if (rc == 0) {
-+              /* Hypercall succeeded */
-+              vmcoreinfo_size_xen = range.size;
-+              paddr_vmcoreinfo_xen = range.start;
-+
-+      } else {
-+              /* Hypercall failed.
-+               * Indicate not to create sysfs file by resetting globals
-+               */
-+              vmcoreinfo_size_xen = 0;
-+              paddr_vmcoreinfo_xen = 0;
-+              
-+              /* The KEXEC_CMD_kexec_get_range hypercall did not implement
-+               * KEXEC_RANGE_MA_VMCOREINFO until Xen 3.3.
-+               * Do not bail out if it fails for this reason.
-+               */
-+              if (rc != -EINVAL)
-+                      return;
-+      }
-+
-+      if (machine_kexec_setup_resources(&xen_hypervisor_res, xen_phys_cpus,
-+                                        xen_max_nr_phys_cpus))
-+              goto err;
-+
-+      return;
-+
-+ err:
-+      /*
-+       * It isn't possible to free xen_phys_cpus this early in the
-+       * boot. Failure at this stage is unexpected and the amount of
-+       * memory is small therefore we tolerate the potential leak.
-+         */
-+      xen_max_nr_phys_cpus = 0;
-+      return;
-+}
-+
-+void __init xen_machine_kexec_register_resources(struct resource *res)
-+{
-+      request_resource(res, &xen_hypervisor_res);
-+      machine_kexec_register_resources(res);
-+}
-+
-+static void setup_load_arg(xen_kexec_image_t *xki, struct kimage *image)
-+{
-+      machine_kexec_setup_load_arg(xki, image);
-+
-+      xki->indirection_page = image->head;
-+      xki->start_address = image->start;
-+}
-+
-+/*
-+ * Load the image into xen so xen can kdump itself
-+ * This might have been done in prepare, but prepare
-+ * is currently called too early. It might make sense
-+ * to move prepare, but for now, just add an extra hook.
-+ */
-+int xen_machine_kexec_load(struct kimage *image)
-+{
-+      xen_kexec_load_t xkl;
-+
-+      memset(&xkl, 0, sizeof(xkl));
-+      xkl.type = image->type;
-+      setup_load_arg(&xkl.image, image);
-+      return HYPERVISOR_kexec_op(KEXEC_CMD_kexec_load, &xkl);
-+}
-+
-+/*
-+ * Unload the image that was stored by machine_kexec_load()
-+ * This might have been done in machine_kexec_cleanup() but it
-+ * is called too late, and its possible xen could try and kdump
-+ * using resources that have been freed.
-+ */
-+void xen_machine_kexec_unload(struct kimage *image)
-+{
-+      xen_kexec_load_t xkl;
-+
-+      memset(&xkl, 0, sizeof(xkl));
-+      xkl.type = image->type;
-+      WARN_ON(HYPERVISOR_kexec_op(KEXEC_CMD_kexec_unload, &xkl));
-+}
-+
-+/*
-+ * Do not allocate memory (or fail in any way) in machine_kexec().
-+ * We are past the point of no return, committed to rebooting now.
-+ *
-+ * This has the hypervisor move to the prefered reboot CPU, 
-+ * stop all CPUs and kexec. That is it combines machine_shutdown()
-+ * and machine_kexec() in Linux kexec terms.
-+ */
-+NORET_TYPE void machine_kexec(struct kimage *image)
-+{
-+      xen_kexec_exec_t xke;
-+
-+      memset(&xke, 0, sizeof(xke));
-+      xke.type = image->type;
-+      VOID(HYPERVISOR_kexec_op(KEXEC_CMD_kexec, &xke));
-+      panic("KEXEC_CMD_kexec hypercall should not return\n");
-+}
-+
-+void machine_shutdown(void)
-+{
-+      /* do nothing */
-+}
-+
-+
-+/*
-+ * Local variables:
-+ *  c-file-style: "linux"
-+ *  indent-tabs-mode: t
-+ *  c-indent-level: 8
-+ *  c-basic-offset: 8
-+ *  tab-width: 8
-+ * End:
-+ */
-Index: head-2008-11-25/drivers/xen/core/machine_reboot.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/machine_reboot.c  2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,247 @@
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/unistd.h>
-+#include <linux/module.h>
-+#include <linux/reboot.h>
-+#include <linux/sysrq.h>
-+#include <linux/stringify.h>
-+#include <linux/stop_machine.h>
-+#include <asm/irq.h>
-+#include <asm/mmu_context.h>
-+#include <xen/evtchn.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+#include <linux/cpu.h>
-+#include <xen/gnttab.h>
-+#include <xen/xencons.h>
-+#include <xen/cpu_hotplug.h>
-+#include <xen/interface/vcpu.h>
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+
-+/*
-+ * Power off function, if any
-+ */
-+void (*pm_power_off)(void);
-+EXPORT_SYMBOL(pm_power_off);
-+
-+void machine_emergency_restart(void)
-+{
-+      /* We really want to get pending console data out before we die. */
-+      xencons_force_flush();
-+      HYPERVISOR_shutdown(SHUTDOWN_reboot);
-+}
-+
-+void machine_restart(char * __unused)
-+{
-+      machine_emergency_restart();
-+}
-+
-+void machine_halt(void)
-+{
-+      machine_power_off();
-+}
-+
-+void machine_power_off(void)
-+{
-+      /* We really want to get pending console data out before we die. */
-+      xencons_force_flush();
-+      if (pm_power_off)
-+              pm_power_off();
-+      HYPERVISOR_shutdown(SHUTDOWN_poweroff);
-+}
-+
-+int reboot_thru_bios = 0;     /* for dmi_scan.c */
-+EXPORT_SYMBOL(machine_restart);
-+EXPORT_SYMBOL(machine_halt);
-+EXPORT_SYMBOL(machine_power_off);
-+
-+static void pre_suspend(void)
-+{
-+      HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
-+      WARN_ON(HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-+                                           __pte_ma(0), 0));
-+
-+      xen_start_info->store_mfn = mfn_to_pfn(xen_start_info->store_mfn);
-+      xen_start_info->console.domU.mfn =
-+              mfn_to_pfn(xen_start_info->console.domU.mfn);
-+}
-+
-+static void post_suspend(int suspend_cancelled)
-+{
-+      int i, j, k, fpp;
-+      unsigned long shinfo_mfn;
-+      extern unsigned long max_pfn;
-+      extern unsigned long *pfn_to_mfn_frame_list_list;
-+      extern unsigned long *pfn_to_mfn_frame_list[];
-+
-+      if (suspend_cancelled) {
-+              xen_start_info->store_mfn =
-+                      pfn_to_mfn(xen_start_info->store_mfn);
-+              xen_start_info->console.domU.mfn =
-+                      pfn_to_mfn(xen_start_info->console.domU.mfn);
-+      } else {
-+#ifdef CONFIG_SMP
-+              cpu_initialized_map = cpu_online_map;
-+#endif
-+      }
-+
-+      shinfo_mfn = xen_start_info->shared_info >> PAGE_SHIFT;
-+      if (HYPERVISOR_update_va_mapping(fix_to_virt(FIX_SHARED_INFO),
-+                                       pfn_pte_ma(shinfo_mfn, PAGE_KERNEL),
-+                                       0))
-+              BUG();
-+      HYPERVISOR_shared_info = (shared_info_t *)fix_to_virt(FIX_SHARED_INFO);
-+
-+      memset(empty_zero_page, 0, PAGE_SIZE);
-+
-+      fpp = PAGE_SIZE/sizeof(unsigned long);
-+      for (i = 0, j = 0, k = -1; i < max_pfn; i += fpp, j++) {
-+              if ((j % fpp) == 0) {
-+                      k++;
-+                      pfn_to_mfn_frame_list_list[k] =
-+                              virt_to_mfn(pfn_to_mfn_frame_list[k]);
-+                      j = 0;
-+              }
-+              pfn_to_mfn_frame_list[k][j] =
-+                      virt_to_mfn(&phys_to_machine_mapping[i]);
-+      }
-+      HYPERVISOR_shared_info->arch.max_pfn = max_pfn;
-+      HYPERVISOR_shared_info->arch.pfn_to_mfn_frame_list_list =
-+              virt_to_mfn(pfn_to_mfn_frame_list_list);
-+}
-+
-+#else /* !(defined(__i386__) || defined(__x86_64__)) */
-+
-+#ifndef HAVE_XEN_PRE_SUSPEND
-+#define xen_pre_suspend()     ((void)0)
-+#endif
-+
-+#ifndef HAVE_XEN_POST_SUSPEND
-+#define xen_post_suspend(x)   ((void)0)
-+#endif
-+
-+#define switch_idle_mm()      ((void)0)
-+#define mm_pin_all()          ((void)0)
-+#define pre_suspend()         xen_pre_suspend()
-+#define post_suspend(x)               xen_post_suspend(x)
-+
-+#endif
-+
-+struct suspend {
-+      int fast_suspend;
-+      void (*resume_notifier)(int);
-+};
-+
-+static int take_machine_down(void *_suspend)
-+{
-+      struct suspend *suspend = _suspend;
-+      int suspend_cancelled, err;
-+      extern void time_resume(void);
-+
-+      if (suspend->fast_suspend) {
-+              BUG_ON(!irqs_disabled());
-+      } else {
-+              BUG_ON(irqs_disabled());
-+
-+              for (;;) {
-+                      err = smp_suspend();
-+                      if (err)
-+                              return err;
-+
-+                      xenbus_suspend();
-+                      preempt_disable();
-+
-+                      if (num_online_cpus() == 1)
-+                              break;
-+
-+                      preempt_enable();
-+                      xenbus_suspend_cancel();
-+              }
-+
-+              local_irq_disable();
-+      }
-+
-+      mm_pin_all();
-+      gnttab_suspend();
-+      pre_suspend();
-+
-+      /*
-+       * This hypercall returns 1 if suspend was cancelled or the domain was
-+       * merely checkpointed, and 0 if it is resuming in a new domain.
-+       */
-+      suspend_cancelled = HYPERVISOR_suspend(virt_to_mfn(xen_start_info));
-+
-+      suspend->resume_notifier(suspend_cancelled);
-+      post_suspend(suspend_cancelled);
-+      gnttab_resume();
-+      if (!suspend_cancelled) {
-+              irq_resume();
-+#ifdef __x86_64__
-+              /*
-+               * Older versions of Xen do not save/restore the user %cr3.
-+               * We do it here just in case, but there's no need if we are
-+               * in fast-suspend mode as that implies a new enough Xen.
-+               */
-+              if (!suspend->fast_suspend)
-+                      xen_new_user_pt(__pa(__user_pgd(
-+                              current->active_mm->pgd)));
-+#endif
-+      }
-+      time_resume();
-+
-+      if (!suspend->fast_suspend)
-+              local_irq_enable();
-+
-+      return suspend_cancelled;
-+}
-+
-+int __xen_suspend(int fast_suspend, void (*resume_notifier)(int))
-+{
-+      int err, suspend_cancelled;
-+      struct suspend suspend;
-+
-+      BUG_ON(smp_processor_id() != 0);
-+      BUG_ON(in_interrupt());
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+      if (xen_feature(XENFEAT_auto_translated_physmap)) {
-+              printk(KERN_WARNING "Cannot suspend in "
-+                     "auto_translated_physmap mode.\n");
-+              return -EOPNOTSUPP;
-+      }
-+#endif
-+
-+      /* If we are definitely UP then 'slow mode' is actually faster. */
-+      if (num_possible_cpus() == 1)
-+              fast_suspend = 0;
-+
-+      suspend.fast_suspend = fast_suspend;
-+      suspend.resume_notifier = resume_notifier;
-+
-+      if (fast_suspend) {
-+              xenbus_suspend();
-+              err = stop_machine_run(take_machine_down, &suspend, 0);
-+              if (err < 0)
-+                      xenbus_suspend_cancel();
-+      } else {
-+              err = take_machine_down(&suspend);
-+      }
-+
-+      if (err < 0)
-+              return err;
-+
-+      suspend_cancelled = err;
-+      if (!suspend_cancelled) {
-+              xencons_resume();
-+              xenbus_resume();
-+      } else {
-+              xenbus_suspend_cancel();
-+      }
-+
-+      if (!fast_suspend)
-+              smp_resume();
-+
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/core/pci.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/pci.c     2008-11-10 11:44:21.000000000 +0100
-@@ -0,0 +1,59 @@
-+/*
-+ * vim:shiftwidth=8:noexpandtab
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+#include <xen/interface/physdev.h>
-+
-+static int (*pci_bus_probe)(struct device *dev);
-+static int (*pci_bus_remove)(struct device *dev);
-+
-+static int pci_bus_probe_wrapper(struct device *dev)
-+{
-+      int r;
-+      struct pci_dev *pci_dev = to_pci_dev(dev);
-+      struct physdev_manage_pci manage_pci;
-+      manage_pci.bus = pci_dev->bus->number;
-+      manage_pci.devfn = pci_dev->devfn;
-+
-+      r = HYPERVISOR_physdev_op(PHYSDEVOP_manage_pci_add, &manage_pci);
-+      if (r && r != -ENOSYS)
-+              return r;
-+
-+      r = pci_bus_probe(dev);
-+      return r;
-+}
-+
-+static int pci_bus_remove_wrapper(struct device *dev)
-+{
-+      int r;
-+      struct pci_dev *pci_dev = to_pci_dev(dev);
-+      struct physdev_manage_pci manage_pci;
-+      manage_pci.bus = pci_dev->bus->number;
-+      manage_pci.devfn = pci_dev->devfn;
-+
-+      r = pci_bus_remove(dev);
-+      /* dev and pci_dev are no longer valid!! */
-+
-+      WARN_ON(HYPERVISOR_physdev_op(PHYSDEVOP_manage_pci_remove,
-+              &manage_pci));
-+      return r;
-+}
-+
-+static int __init hook_pci_bus(void)
-+{
-+      if (!is_running_on_xen() || !is_initial_xendomain())
-+              return 0;
-+
-+      pci_bus_probe = pci_bus_type.probe;
-+      pci_bus_type.probe = pci_bus_probe_wrapper;
-+
-+      pci_bus_remove = pci_bus_type.remove;
-+      pci_bus_type.remove = pci_bus_remove_wrapper;
-+
-+      return 0;
-+}
-+
-+core_initcall(hook_pci_bus);
-Index: head-2008-11-25/drivers/xen/core/reboot.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/reboot.c  2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,335 @@
-+#define __KERNEL_SYSCALLS__
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/unistd.h>
-+#include <linux/module.h>
-+#include <linux/reboot.h>
-+#include <linux/sysrq.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+#include <xen/evtchn.h>
-+#include <linux/kmod.h>
-+#include <linux/slab.h>
-+#include <linux/workqueue.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-+
-+#define SHUTDOWN_INVALID  -1
-+#define SHUTDOWN_POWEROFF  0
-+#define SHUTDOWN_SUSPEND   2
-+#define SHUTDOWN_RESUMING  3
-+#define SHUTDOWN_HALT      4
-+
-+/* Ignore multiple shutdown requests. */
-+static int shutting_down = SHUTDOWN_INVALID;
-+
-+/* Was last suspend request cancelled? */
-+static int suspend_cancelled;
-+
-+/* Can we leave APs online when we suspend? */
-+static int fast_suspend;
-+
-+static void __shutdown_handler(void *unused);
-+static DECLARE_WORK(shutdown_work, __shutdown_handler, NULL);
-+
-+static int setup_suspend_evtchn(void);
-+
-+int __xen_suspend(int fast_suspend, void (*resume_notifier)(int));
-+
-+static int shutdown_process(void *__unused)
-+{
-+      static char *envp[] = { "HOME=/", "TERM=linux",
-+                              "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL };
-+      static char *poweroff_argv[] = { "/sbin/poweroff", NULL };
-+
-+      extern asmlinkage long sys_reboot(int magic1, int magic2,
-+                                        unsigned int cmd, void *arg);
-+
-+      if ((shutting_down == SHUTDOWN_POWEROFF) ||
-+          (shutting_down == SHUTDOWN_HALT)) {
-+              if (call_usermodehelper("/sbin/poweroff", poweroff_argv,
-+                                      envp, 0) < 0) {
-+#ifdef CONFIG_XEN
-+                      sys_reboot(LINUX_REBOOT_MAGIC1,
-+                                 LINUX_REBOOT_MAGIC2,
-+                                 LINUX_REBOOT_CMD_POWER_OFF,
-+                                 NULL);
-+#endif /* CONFIG_XEN */
-+              }
-+      }
-+
-+      shutting_down = SHUTDOWN_INVALID; /* could try again */
-+
-+      return 0;
-+}
-+
-+static void xen_resume_notifier(int _suspend_cancelled)
-+{
-+      int old_state = xchg(&shutting_down, SHUTDOWN_RESUMING);
-+      BUG_ON(old_state != SHUTDOWN_SUSPEND);
-+      suspend_cancelled = _suspend_cancelled;
-+}
-+
-+static int xen_suspend(void *__unused)
-+{
-+      int err, old_state;
-+
-+      daemonize("suspend");
-+      err = set_cpus_allowed(current, cpumask_of_cpu(0));
-+      if (err) {
-+              printk(KERN_ERR "Xen suspend can't run on CPU0 (%d)\n", err);
-+              goto fail;
-+      }
-+
-+      do {
-+              err = __xen_suspend(fast_suspend, xen_resume_notifier);
-+              if (err) {
-+                      printk(KERN_ERR "Xen suspend failed (%d)\n", err);
-+                      goto fail;
-+              }
-+              if (!suspend_cancelled)
-+                      setup_suspend_evtchn();
-+              old_state = cmpxchg(
-+                      &shutting_down, SHUTDOWN_RESUMING, SHUTDOWN_INVALID);
-+      } while (old_state == SHUTDOWN_SUSPEND);
-+
-+      switch (old_state) {
-+      case SHUTDOWN_INVALID:
-+      case SHUTDOWN_SUSPEND:
-+              BUG();
-+      case SHUTDOWN_RESUMING:
-+              break;
-+      default:
-+              schedule_work(&shutdown_work);
-+              break;
-+      }
-+
-+      return 0;
-+
-+ fail:
-+      old_state = xchg(&shutting_down, SHUTDOWN_INVALID);
-+      BUG_ON(old_state != SHUTDOWN_SUSPEND);
-+      return 0;
-+}
-+
-+static void switch_shutdown_state(int new_state)
-+{
-+      int prev_state, old_state = SHUTDOWN_INVALID;
-+
-+      /* We only drive shutdown_state into an active state. */
-+      if (new_state == SHUTDOWN_INVALID)
-+              return;
-+
-+      do {
-+              /* We drop this transition if already in an active state. */
-+              if ((old_state != SHUTDOWN_INVALID) &&
-+                  (old_state != SHUTDOWN_RESUMING))
-+                      return;
-+              /* Attempt to transition. */
-+              prev_state = old_state;
-+              old_state = cmpxchg(&shutting_down, old_state, new_state);
-+      } while (old_state != prev_state);
-+
-+      /* Either we kick off the work, or we leave it to xen_suspend(). */
-+      if (old_state == SHUTDOWN_INVALID)
-+              schedule_work(&shutdown_work);
-+      else
-+              BUG_ON(old_state != SHUTDOWN_RESUMING);
-+}
-+
-+static void __shutdown_handler(void *unused)
-+{
-+      int err;
-+
-+      err = kernel_thread((shutting_down == SHUTDOWN_SUSPEND) ?
-+                          xen_suspend : shutdown_process,
-+                          NULL, CLONE_FS | CLONE_FILES);
-+
-+      if (err < 0) {
-+              printk(KERN_WARNING "Error creating shutdown process (%d): "
-+                     "retrying...\n", -err);
-+              schedule_delayed_work(&shutdown_work, HZ/2);
-+      }
-+}
-+
-+static void shutdown_handler(struct xenbus_watch *watch,
-+                           const char **vec, unsigned int len)
-+{
-+      extern void ctrl_alt_del(void);
-+      char *str;
-+      struct xenbus_transaction xbt;
-+      int err, new_state = SHUTDOWN_INVALID;
-+
-+      if ((shutting_down != SHUTDOWN_INVALID) &&
-+          (shutting_down != SHUTDOWN_RESUMING))
-+              return;
-+
-+ again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err)
-+              return;
-+
-+      str = (char *)xenbus_read(xbt, "control", "shutdown", NULL);
-+      /* Ignore read errors and empty reads. */
-+      if (XENBUS_IS_ERR_READ(str)) {
-+              xenbus_transaction_end(xbt, 1);
-+              return;
-+      }
-+
-+      xenbus_write(xbt, "control", "shutdown", "");
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err == -EAGAIN) {
-+              kfree(str);
-+              goto again;
-+      }
-+
-+      if (strcmp(str, "poweroff") == 0)
-+              new_state = SHUTDOWN_POWEROFF;
-+      else if (strcmp(str, "reboot") == 0)
-+              ctrl_alt_del();
-+      else if (strcmp(str, "suspend") == 0)
-+              new_state = SHUTDOWN_SUSPEND;
-+      else if (strcmp(str, "halt") == 0)
-+              new_state = SHUTDOWN_HALT;
-+      else
-+              printk("Ignoring shutdown request: %s\n", str);
-+
-+      switch_shutdown_state(new_state);
-+
-+      kfree(str);
-+}
-+
-+static void sysrq_handler(struct xenbus_watch *watch, const char **vec,
-+                        unsigned int len)
-+{
-+      char sysrq_key = '\0';
-+      struct xenbus_transaction xbt;
-+      int err;
-+
-+ again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err)
-+              return;
-+      if (!xenbus_scanf(xbt, "control", "sysrq", "%c", &sysrq_key)) {
-+              printk(KERN_ERR "Unable to read sysrq code in "
-+                     "control/sysrq\n");
-+              xenbus_transaction_end(xbt, 1);
-+              return;
-+      }
-+
-+      if (sysrq_key != '\0')
-+              xenbus_printf(xbt, "control", "sysrq", "%c", '\0');
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err == -EAGAIN)
-+              goto again;
-+
-+#ifdef CONFIG_MAGIC_SYSRQ
-+      if (sysrq_key != '\0')
-+              handle_sysrq(sysrq_key, NULL, NULL);
-+#endif
-+}
-+
-+static struct xenbus_watch shutdown_watch = {
-+      .node = "control/shutdown",
-+      .callback = shutdown_handler
-+};
-+
-+static struct xenbus_watch sysrq_watch = {
-+      .node = "control/sysrq",
-+      .callback = sysrq_handler
-+};
-+
-+static irqreturn_t suspend_int(int irq, void* dev_id, struct pt_regs *ptregs)
-+{
-+      switch_shutdown_state(SHUTDOWN_SUSPEND);
-+      return IRQ_HANDLED;
-+}
-+
-+static int setup_suspend_evtchn(void)
-+{
-+      static int irq;
-+      int port;
-+      char portstr[16];
-+
-+      if (irq > 0)
-+              unbind_from_irqhandler(irq, NULL);
-+
-+      irq = bind_listening_port_to_irqhandler(0, suspend_int, 0, "suspend",
-+                                              NULL);
-+      if (irq <= 0)
-+              return -1;
-+
-+      port = irq_to_evtchn_port(irq);
-+      printk(KERN_INFO "suspend: event channel %d\n", port);
-+      sprintf(portstr, "%d", port);
-+      xenbus_write(XBT_NIL, "device/suspend", "event-channel", portstr);
-+
-+      return 0;
-+}
-+
-+static int setup_shutdown_watcher(void)
-+{
-+      int err;
-+
-+      xenbus_scanf(XBT_NIL, "control",
-+                   "platform-feature-multiprocessor-suspend",
-+                   "%d", &fast_suspend);
-+
-+      err = register_xenbus_watch(&shutdown_watch);
-+      if (err) {
-+              printk(KERN_ERR "Failed to set shutdown watcher\n");
-+              return err;
-+      }
-+
-+      err = register_xenbus_watch(&sysrq_watch);
-+      if (err) {
-+              printk(KERN_ERR "Failed to set sysrq watcher\n");
-+              return err;
-+      }
-+
-+      /* suspend event channel */
-+      err = setup_suspend_evtchn();
-+      if (err) {
-+              printk(KERN_ERR "Failed to register suspend event channel\n");
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+#ifdef CONFIG_XEN
-+
-+static int shutdown_event(struct notifier_block *notifier,
-+                        unsigned long event,
-+                        void *data)
-+{
-+      setup_shutdown_watcher();
-+      return NOTIFY_DONE;
-+}
-+
-+static int __init setup_shutdown_event(void)
-+{
-+      static struct notifier_block xenstore_notifier = {
-+              .notifier_call = shutdown_event
-+      };
-+      register_xenstore_notifier(&xenstore_notifier);
-+
-+      return 0;
-+}
-+
-+subsys_initcall(setup_shutdown_event);
-+
-+#else /* !defined(CONFIG_XEN) */
-+
-+int xen_reboot_init(void)
-+{
-+      return setup_shutdown_watcher();
-+}
-+
-+#endif /* !defined(CONFIG_XEN) */
-Index: head-2008-11-25/drivers/xen/core/smpboot.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/smpboot.c 2008-03-06 08:54:32.000000000 +0100
-@@ -0,0 +1,464 @@
-+/*
-+ *    Xen SMP booting functions
-+ *
-+ *    See arch/i386/kernel/smpboot.c for copyright and credits for derived
-+ *    portions of this file.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/kernel.h>
-+#include <linux/mm.h>
-+#include <linux/sched.h>
-+#include <linux/kernel_stat.h>
-+#include <linux/smp_lock.h>
-+#include <linux/irq.h>
-+#include <linux/bootmem.h>
-+#include <linux/notifier.h>
-+#include <linux/cpu.h>
-+#include <linux/percpu.h>
-+#include <asm/desc.h>
-+#include <asm/arch_hooks.h>
-+#include <asm/pgalloc.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/vcpu.h>
-+#include <xen/cpu_hotplug.h>
-+#include <xen/xenbus.h>
-+
-+extern irqreturn_t smp_reschedule_interrupt(int, void *, struct pt_regs *);
-+extern irqreturn_t smp_call_function_interrupt(int, void *, struct pt_regs *);
-+
-+extern int local_setup_timer(unsigned int cpu);
-+extern void local_teardown_timer(unsigned int cpu);
-+
-+extern void hypervisor_callback(void);
-+extern void failsafe_callback(void);
-+extern void system_call(void);
-+extern void smp_trap_init(trap_info_t *);
-+
-+/* Number of siblings per CPU package */
-+int smp_num_siblings = 1;
-+
-+cpumask_t cpu_online_map;
-+EXPORT_SYMBOL(cpu_online_map);
-+cpumask_t cpu_possible_map;
-+EXPORT_SYMBOL(cpu_possible_map);
-+cpumask_t cpu_initialized_map;
-+
-+struct cpuinfo_x86 cpu_data[NR_CPUS] __cacheline_aligned;
-+EXPORT_SYMBOL(cpu_data);
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+DEFINE_PER_CPU(int, cpu_state) = { 0 };
-+#endif
-+
-+static DEFINE_PER_CPU(int, resched_irq);
-+static DEFINE_PER_CPU(int, callfunc_irq);
-+static char resched_name[NR_CPUS][15];
-+static char callfunc_name[NR_CPUS][15];
-+
-+u8 cpu_2_logical_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = BAD_APICID };
-+
-+cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
-+cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
-+EXPORT_SYMBOL(cpu_core_map);
-+
-+#if defined(__i386__)
-+u8 x86_cpu_to_apicid[NR_CPUS] = { [0 ... NR_CPUS-1] = 0xff };
-+EXPORT_SYMBOL(x86_cpu_to_apicid);
-+#elif !defined(CONFIG_X86_IO_APIC)
-+unsigned int maxcpus = NR_CPUS;
-+#endif
-+
-+void __init prefill_possible_map(void)
-+{
-+      int i, rc;
-+
-+      for_each_possible_cpu(i)
-+          if (i != smp_processor_id())
-+              return;
-+
-+      for (i = 0; i < NR_CPUS; i++) {
-+              rc = HYPERVISOR_vcpu_op(VCPUOP_is_up, i, NULL);
-+              if (rc >= 0)
-+                      cpu_set(i, cpu_possible_map);
-+      }
-+}
-+
-+void __init smp_alloc_memory(void)
-+{
-+}
-+
-+static inline void
-+set_cpu_sibling_map(unsigned int cpu)
-+{
-+      cpu_data[cpu].phys_proc_id = cpu;
-+      cpu_data[cpu].cpu_core_id  = 0;
-+
-+      cpu_sibling_map[cpu] = cpumask_of_cpu(cpu);
-+      cpu_core_map[cpu]    = cpumask_of_cpu(cpu);
-+
-+      cpu_data[cpu].booted_cores = 1;
-+}
-+
-+static void
-+remove_siblinginfo(unsigned int cpu)
-+{
-+      cpu_data[cpu].phys_proc_id = BAD_APICID;
-+      cpu_data[cpu].cpu_core_id  = BAD_APICID;
-+
-+      cpus_clear(cpu_sibling_map[cpu]);
-+      cpus_clear(cpu_core_map[cpu]);
-+
-+      cpu_data[cpu].booted_cores = 0;
-+}
-+
-+static int __cpuinit xen_smp_intr_init(unsigned int cpu)
-+{
-+      int rc;
-+
-+      per_cpu(resched_irq, cpu) = per_cpu(callfunc_irq, cpu) = -1;
-+
-+      sprintf(resched_name[cpu], "resched%u", cpu);
-+      rc = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR,
-+                                  cpu,
-+                                  smp_reschedule_interrupt,
-+                                  SA_INTERRUPT,
-+                                  resched_name[cpu],
-+                                  NULL);
-+      if (rc < 0)
-+              goto fail;
-+      per_cpu(resched_irq, cpu) = rc;
-+
-+      sprintf(callfunc_name[cpu], "callfunc%u", cpu);
-+      rc = bind_ipi_to_irqhandler(CALL_FUNCTION_VECTOR,
-+                                  cpu,
-+                                  smp_call_function_interrupt,
-+                                  SA_INTERRUPT,
-+                                  callfunc_name[cpu],
-+                                  NULL);
-+      if (rc < 0)
-+              goto fail;
-+      per_cpu(callfunc_irq, cpu) = rc;
-+
-+      if ((cpu != 0) && ((rc = local_setup_timer(cpu)) != 0))
-+              goto fail;
-+
-+      return 0;
-+
-+ fail:
-+      if (per_cpu(resched_irq, cpu) >= 0)
-+              unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
-+      if (per_cpu(callfunc_irq, cpu) >= 0)
-+              unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
-+      return rc;
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+static void xen_smp_intr_exit(unsigned int cpu)
-+{
-+      if (cpu != 0)
-+              local_teardown_timer(cpu);
-+
-+      unbind_from_irqhandler(per_cpu(resched_irq, cpu), NULL);
-+      unbind_from_irqhandler(per_cpu(callfunc_irq, cpu), NULL);
-+}
-+#endif
-+
-+void __cpuinit cpu_bringup(void)
-+{
-+      cpu_init();
-+      identify_cpu(cpu_data + smp_processor_id());
-+      touch_softlockup_watchdog();
-+      preempt_disable();
-+      local_irq_enable();
-+}
-+
-+static void __cpuinit cpu_bringup_and_idle(void)
-+{
-+      cpu_bringup();
-+      cpu_idle();
-+}
-+
-+static void __cpuinit cpu_initialize_context(unsigned int cpu)
-+{
-+      /* vcpu_guest_context_t is too large to allocate on the stack.
-+       * Hence we allocate statically and protect it with a lock */
-+      static vcpu_guest_context_t ctxt;
-+      static DEFINE_SPINLOCK(ctxt_lock);
-+
-+      struct task_struct *idle = idle_task(cpu);
-+#ifdef __x86_64__
-+      struct desc_ptr *gdt_descr = &cpu_gdt_descr[cpu];
-+#else
-+      struct Xgt_desc_struct *gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-+#endif
-+
-+      if (cpu_test_and_set(cpu, cpu_initialized_map))
-+              return;
-+
-+      spin_lock(&ctxt_lock);
-+
-+      memset(&ctxt, 0, sizeof(ctxt));
-+
-+      ctxt.flags = VGCF_IN_KERNEL;
-+      ctxt.user_regs.ds = __USER_DS;
-+      ctxt.user_regs.es = __USER_DS;
-+      ctxt.user_regs.fs = 0;
-+      ctxt.user_regs.gs = 0;
-+      ctxt.user_regs.ss = __KERNEL_DS;
-+      ctxt.user_regs.eip = (unsigned long)cpu_bringup_and_idle;
-+      ctxt.user_regs.eflags = X86_EFLAGS_IF | 0x1000; /* IOPL_RING1 */
-+
-+      memset(&ctxt.fpu_ctxt, 0, sizeof(ctxt.fpu_ctxt));
-+
-+      smp_trap_init(ctxt.trap_ctxt);
-+
-+      ctxt.ldt_ents = 0;
-+
-+      ctxt.gdt_frames[0] = virt_to_mfn(gdt_descr->address);
-+      ctxt.gdt_ents      = gdt_descr->size / 8;
-+
-+#ifdef __i386__
-+      ctxt.user_regs.cs = __KERNEL_CS;
-+      ctxt.user_regs.esp = idle->thread.esp0 - sizeof(struct pt_regs);
-+
-+      ctxt.kernel_ss = __KERNEL_DS;
-+      ctxt.kernel_sp = idle->thread.esp0;
-+
-+      ctxt.event_callback_cs     = __KERNEL_CS;
-+      ctxt.event_callback_eip    = (unsigned long)hypervisor_callback;
-+      ctxt.failsafe_callback_cs  = __KERNEL_CS;
-+      ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
-+
-+      ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(swapper_pg_dir));
-+#else /* __x86_64__ */
-+      ctxt.user_regs.cs = __KERNEL_CS;
-+      ctxt.user_regs.esp = idle->thread.rsp0 - sizeof(struct pt_regs);
-+
-+      ctxt.kernel_ss = __KERNEL_DS;
-+      ctxt.kernel_sp = idle->thread.rsp0;
-+
-+      ctxt.event_callback_eip    = (unsigned long)hypervisor_callback;
-+      ctxt.failsafe_callback_eip = (unsigned long)failsafe_callback;
-+      ctxt.syscall_callback_eip  = (unsigned long)system_call;
-+
-+      ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(init_level4_pgt));
-+
-+      ctxt.gs_base_kernel = (unsigned long)(cpu_pda(cpu));
-+#endif
-+
-+      if (HYPERVISOR_vcpu_op(VCPUOP_initialise, cpu, &ctxt))
-+              BUG();
-+
-+      spin_unlock(&ctxt_lock);
-+}
-+
-+void __init smp_prepare_cpus(unsigned int max_cpus)
-+{
-+      unsigned int cpu;
-+      struct task_struct *idle;
-+      int apicid, acpiid;
-+      struct vcpu_get_physid cpu_id;
-+#ifdef __x86_64__
-+      struct desc_ptr *gdt_descr;
-+#else
-+      struct Xgt_desc_struct *gdt_descr;
-+#endif
-+
-+      apicid = 0;
-+      if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, 0, &cpu_id) == 0) {
-+              apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id);
-+              acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id);
-+#ifdef CONFIG_ACPI
-+              if (acpiid != 0xff)
-+                      x86_acpiid_to_apicid[acpiid] = apicid;
-+#endif
-+      }
-+      boot_cpu_data.apicid = apicid;
-+      cpu_data[0] = boot_cpu_data;
-+
-+      cpu_2_logical_apicid[0] = apicid;
-+      x86_cpu_to_apicid[0] = apicid;
-+
-+      current_thread_info()->cpu = 0;
-+
-+      for (cpu = 0; cpu < NR_CPUS; cpu++) {
-+              cpus_clear(cpu_sibling_map[cpu]);
-+              cpus_clear(cpu_core_map[cpu]);
-+      }
-+
-+      set_cpu_sibling_map(0);
-+
-+      if (xen_smp_intr_init(0))
-+              BUG();
-+
-+      cpu_initialized_map = cpumask_of_cpu(0);
-+
-+      /* Restrict the possible_map according to max_cpus. */
-+      while ((num_possible_cpus() > 1) && (num_possible_cpus() > max_cpus)) {
-+              for (cpu = NR_CPUS-1; !cpu_isset(cpu, cpu_possible_map); cpu--)
-+                      continue;
-+              cpu_clear(cpu, cpu_possible_map);
-+      }
-+
-+      for_each_possible_cpu (cpu) {
-+              if (cpu == 0)
-+                      continue;
-+
-+#ifdef __x86_64__
-+              gdt_descr = &cpu_gdt_descr[cpu];
-+#else
-+              gdt_descr = &per_cpu(cpu_gdt_descr, cpu);
-+#endif
-+              gdt_descr->address = get_zeroed_page(GFP_KERNEL);
-+              if (unlikely(!gdt_descr->address)) {
-+                      printk(KERN_CRIT "CPU%d failed to allocate GDT\n",
-+                             cpu);
-+                      continue;
-+              }
-+              gdt_descr->size = GDT_SIZE;
-+              memcpy((void *)gdt_descr->address, cpu_gdt_table, GDT_SIZE);
-+              make_page_readonly(
-+                      (void *)gdt_descr->address,
-+                      XENFEAT_writable_descriptor_tables);
-+
-+              apicid = cpu;
-+              if (HYPERVISOR_vcpu_op(VCPUOP_get_physid, cpu, &cpu_id) == 0) {
-+                      apicid = xen_vcpu_physid_to_x86_apicid(cpu_id.phys_id);
-+                      acpiid = xen_vcpu_physid_to_x86_acpiid(cpu_id.phys_id);
-+#ifdef CONFIG_ACPI
-+                      if (acpiid != 0xff)
-+                              x86_acpiid_to_apicid[acpiid] = apicid;
-+#endif
-+              }
-+              cpu_data[cpu] = boot_cpu_data;
-+              cpu_data[cpu].apicid = apicid;
-+
-+              cpu_2_logical_apicid[cpu] = apicid;
-+              x86_cpu_to_apicid[cpu] = apicid;
-+
-+              idle = fork_idle(cpu);
-+              if (IS_ERR(idle))
-+                      panic("failed fork for CPU %d", cpu);
-+
-+#ifdef __x86_64__
-+              cpu_pda(cpu)->pcurrent = idle;
-+              cpu_pda(cpu)->cpunumber = cpu;
-+              clear_ti_thread_flag(idle->thread_info, TIF_FORK);
-+#endif
-+
-+              irq_ctx_init(cpu);
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+              if (is_initial_xendomain())
-+                      cpu_set(cpu, cpu_present_map);
-+#else
-+              cpu_set(cpu, cpu_present_map);
-+#endif
-+      }
-+
-+      init_xenbus_allowed_cpumask();
-+
-+#ifdef CONFIG_X86_IO_APIC
-+      /*
-+       * Here we can be sure that there is an IO-APIC in the system. Let's
-+       * go and set it up:
-+       */
-+      if (!skip_ioapic_setup && nr_ioapics)
-+              setup_IO_APIC();
-+#endif
-+}
-+
-+void __devinit smp_prepare_boot_cpu(void)
-+{
-+      prefill_possible_map();
-+}
-+
-+#ifdef CONFIG_HOTPLUG_CPU
-+
-+/*
-+ * Initialize cpu_present_map late to skip SMP boot code in init/main.c.
-+ * But do it early enough to catch critical for_each_present_cpu() loops
-+ * in i386-specific code.
-+ */
-+static int __init initialize_cpu_present_map(void)
-+{
-+      cpu_present_map = cpu_possible_map;
-+      return 0;
-+}
-+core_initcall(initialize_cpu_present_map);
-+
-+int __cpu_disable(void)
-+{
-+      cpumask_t map = cpu_online_map;
-+      unsigned int cpu = smp_processor_id();
-+
-+      if (cpu == 0)
-+              return -EBUSY;
-+
-+      remove_siblinginfo(cpu);
-+
-+      cpu_clear(cpu, map);
-+      fixup_irqs(map);
-+      cpu_clear(cpu, cpu_online_map);
-+
-+      return 0;
-+}
-+
-+void __cpu_die(unsigned int cpu)
-+{
-+      while (HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) {
-+              current->state = TASK_UNINTERRUPTIBLE;
-+              schedule_timeout(HZ/10);
-+      }
-+
-+      xen_smp_intr_exit(cpu);
-+
-+      if (num_online_cpus() == 1)
-+              alternatives_smp_switch(0);
-+}
-+
-+#endif /* CONFIG_HOTPLUG_CPU */
-+
-+int __cpuinit __cpu_up(unsigned int cpu)
-+{
-+      int rc;
-+
-+      rc = cpu_up_check(cpu);
-+      if (rc)
-+              return rc;
-+
-+      cpu_initialize_context(cpu);
-+
-+      if (num_online_cpus() == 1)
-+              alternatives_smp_switch(1);
-+
-+      /* This must be done before setting cpu_online_map */
-+      set_cpu_sibling_map(cpu);
-+      wmb();
-+
-+      rc = xen_smp_intr_init(cpu);
-+      if (rc) {
-+              remove_siblinginfo(cpu);
-+              return rc;
-+      }
-+
-+      cpu_set(cpu, cpu_online_map);
-+
-+      rc = HYPERVISOR_vcpu_op(VCPUOP_up, cpu, NULL);
-+      BUG_ON(rc);
-+
-+      return 0;
-+}
-+
-+void __init smp_cpus_done(unsigned int max_cpus)
-+{
-+}
-+
-+#ifndef CONFIG_X86_LOCAL_APIC
-+int setup_profiling_timer(unsigned int multiplier)
-+{
-+      return -EINVAL;
-+}
-+#endif
-Index: head-2008-11-25/drivers/xen/core/xen_proc.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/xen_proc.c        2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,23 @@
-+
-+#include <linux/module.h>
-+#include <linux/proc_fs.h>
-+#include <xen/xen_proc.h>
-+
-+static struct proc_dir_entry *xen_base;
-+
-+struct proc_dir_entry *create_xen_proc_entry(const char *name, mode_t mode)
-+{
-+      if ( xen_base == NULL )
-+              if ( (xen_base = proc_mkdir("xen", &proc_root)) == NULL )
-+                      panic("Couldn't create /proc/xen");
-+      return create_proc_entry(name, mode, xen_base);
-+}
-+
-+EXPORT_SYMBOL_GPL(create_xen_proc_entry); 
-+
-+void remove_xen_proc_entry(const char *name)
-+{
-+      remove_proc_entry(name, xen_base);
-+}
-+
-+EXPORT_SYMBOL_GPL(remove_xen_proc_entry); 
-Index: head-2008-11-25/drivers/xen/core/xen_sysfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/xen_sysfs.c       2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,427 @@
-+/*
-+ *  copyright (c) 2006 IBM Corporation
-+ *  Authored by: Mike D. Day <ncmike@us.ibm.com>
-+ *
-+ *  This program is free software; you can redistribute it and/or modify
-+ *  it under the terms of the GNU General Public License version 2 as
-+ *  published by the Free Software Foundation.
-+ */
-+
-+#include <linux/err.h>
-+#include <linux/kernel.h>
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <asm/hypervisor.h>
-+#include <xen/features.h>
-+#include <xen/hypervisor_sysfs.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/kexec.h>
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR("Mike D. Day <ncmike@us.ibm.com>");
-+
-+static ssize_t type_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      return sprintf(buffer, "xen\n");
-+}
-+
-+HYPERVISOR_ATTR_RO(type);
-+
-+static int __init xen_sysfs_type_init(void)
-+{
-+      return sysfs_create_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
-+}
-+
-+static void xen_sysfs_type_destroy(void)
-+{
-+      sysfs_remove_file(&hypervisor_subsys.kset.kobj, &type_attr.attr);
-+}
-+
-+/* xen version attributes */
-+static ssize_t major_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int version = HYPERVISOR_xen_version(XENVER_version, NULL);
-+      if (version)
-+              return sprintf(buffer, "%d\n", version >> 16);
-+      return -ENODEV;
-+}
-+
-+HYPERVISOR_ATTR_RO(major);
-+
-+static ssize_t minor_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int version = HYPERVISOR_xen_version(XENVER_version, NULL);
-+      if (version)
-+              return sprintf(buffer, "%d\n", version & 0xff);
-+      return -ENODEV;
-+}
-+
-+HYPERVISOR_ATTR_RO(minor);
-+
-+static ssize_t extra_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      char *extra;
-+
-+      extra = kmalloc(XEN_EXTRAVERSION_LEN, GFP_KERNEL);
-+      if (extra) {
-+              ret = HYPERVISOR_xen_version(XENVER_extraversion, extra);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", extra);
-+              kfree(extra);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(extra);
-+
-+static struct attribute *version_attrs[] = {
-+      &major_attr.attr,
-+      &minor_attr.attr,
-+      &extra_attr.attr,
-+      NULL
-+};
-+
-+static struct attribute_group version_group = {
-+      .name = "version",
-+      .attrs = version_attrs,
-+};
-+
-+static int __init xen_sysfs_version_init(void)
-+{
-+      return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-+                                &version_group);
-+}
-+
-+static void xen_sysfs_version_destroy(void)
-+{
-+      sysfs_remove_group(&hypervisor_subsys.kset.kobj, &version_group);
-+}
-+
-+/* UUID */
-+
-+static ssize_t uuid_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      char *vm, *val;
-+      int ret;
-+      extern int xenstored_ready;
-+
-+      if (!xenstored_ready)
-+              return -EBUSY;
-+
-+      vm = xenbus_read(XBT_NIL, "vm", "", NULL);
-+      if (IS_ERR(vm))
-+              return PTR_ERR(vm);
-+      val = xenbus_read(XBT_NIL, vm, "uuid", NULL);
-+      kfree(vm);
-+      if (IS_ERR(val))
-+              return PTR_ERR(val);
-+      ret = sprintf(buffer, "%s\n", val);
-+      kfree(val);
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(uuid);
-+
-+static int __init xen_sysfs_uuid_init(void)
-+{
-+      return sysfs_create_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
-+}
-+
-+static void xen_sysfs_uuid_destroy(void)
-+{
-+      sysfs_remove_file(&hypervisor_subsys.kset.kobj, &uuid_attr.attr);
-+}
-+
-+/* xen compilation attributes */
-+
-+static ssize_t compiler_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      struct xen_compile_info *info;
-+
-+      info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-+      if (info) {
-+              ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", info->compiler);
-+              kfree(info);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(compiler);
-+
-+static ssize_t compiled_by_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      struct xen_compile_info *info;
-+
-+      info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-+      if (info) {
-+              ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", info->compile_by);
-+              kfree(info);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(compiled_by);
-+
-+static ssize_t compile_date_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      struct xen_compile_info *info;
-+
-+      info = kmalloc(sizeof(struct xen_compile_info), GFP_KERNEL);
-+      if (info) {
-+              ret = HYPERVISOR_xen_version(XENVER_compile_info, info);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", info->compile_date);
-+              kfree(info);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(compile_date);
-+
-+static struct attribute *xen_compile_attrs[] = {
-+      &compiler_attr.attr,
-+      &compiled_by_attr.attr,
-+      &compile_date_attr.attr,
-+      NULL
-+};
-+
-+static struct attribute_group xen_compilation_group = {
-+      .name = "compilation",
-+      .attrs = xen_compile_attrs,
-+};
-+
-+int __init static xen_compilation_init(void)
-+{
-+      return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-+                                &xen_compilation_group);
-+}
-+
-+static void xen_compilation_destroy(void)
-+{
-+      sysfs_remove_group(&hypervisor_subsys.kset.kobj,
-+                         &xen_compilation_group);
-+}
-+
-+/* xen properties info */
-+
-+static ssize_t capabilities_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      char *caps;
-+
-+      caps = kmalloc(XEN_CAPABILITIES_INFO_LEN, GFP_KERNEL);
-+      if (caps) {
-+              ret = HYPERVISOR_xen_version(XENVER_capabilities, caps);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", caps);
-+              kfree(caps);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(capabilities);
-+
-+static ssize_t changeset_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      char *cset;
-+
-+      cset = kmalloc(XEN_CHANGESET_INFO_LEN, GFP_KERNEL);
-+      if (cset) {
-+              ret = HYPERVISOR_xen_version(XENVER_changeset, cset);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%s\n", cset);
-+              kfree(cset);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(changeset);
-+
-+static ssize_t virtual_start_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      struct xen_platform_parameters *parms;
-+
-+      parms = kmalloc(sizeof(struct xen_platform_parameters), GFP_KERNEL);
-+      if (parms) {
-+              ret = HYPERVISOR_xen_version(XENVER_platform_parameters,
-+                                           parms);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%lx\n", parms->virt_start);
-+              kfree(parms);
-+      }
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(virtual_start);
-+
-+static ssize_t pagesize_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      int ret;
-+
-+      ret = HYPERVISOR_xen_version(XENVER_pagesize, NULL);
-+      if (ret > 0)
-+              ret = sprintf(buffer, "%x\n", ret);
-+
-+      return ret;
-+}
-+
-+HYPERVISOR_ATTR_RO(pagesize);
-+
-+/* eventually there will be several more features to export */
-+static ssize_t xen_feature_show(int index, char *buffer)
-+{
-+      int ret = -ENOMEM;
-+      struct xen_feature_info *info;
-+
-+      info = kmalloc(sizeof(struct xen_feature_info), GFP_KERNEL);
-+      if (info) {
-+              info->submap_idx = index;
-+              ret = HYPERVISOR_xen_version(XENVER_get_features, info);
-+              if (!ret)
-+                      ret = sprintf(buffer, "%d\n", info->submap);
-+              kfree(info);
-+      }
-+
-+      return ret;
-+}
-+
-+static ssize_t writable_pt_show(struct hyp_sysfs_attr *attr, char *buffer)
-+{
-+      return xen_feature_show(XENFEAT_writable_page_tables, buffer);
-+}
-+
-+HYPERVISOR_ATTR_RO(writable_pt);
-+
-+static struct attribute *xen_properties_attrs[] = {
-+      &capabilities_attr.attr,
-+      &changeset_attr.attr,
-+      &virtual_start_attr.attr,
-+      &pagesize_attr.attr,
-+      &writable_pt_attr.attr,
-+      NULL
-+};
-+
-+static struct attribute_group xen_properties_group = {
-+      .name = "properties",
-+      .attrs = xen_properties_attrs,
-+};
-+
-+static int __init xen_properties_init(void)
-+{
-+      return sysfs_create_group(&hypervisor_subsys.kset.kobj,
-+                                &xen_properties_group);
-+}
-+
-+static void xen_properties_destroy(void)
-+{
-+      sysfs_remove_group(&hypervisor_subsys.kset.kobj,
-+                         &xen_properties_group);
-+}
-+
-+#ifdef CONFIG_KEXEC
-+
-+extern size_t vmcoreinfo_size_xen;
-+extern unsigned long paddr_vmcoreinfo_xen;
-+
-+static ssize_t vmcoreinfo_show(struct hyp_sysfs_attr *attr, char *page)
-+{
-+      return sprintf(page, "%lx %zx\n",
-+              paddr_vmcoreinfo_xen, vmcoreinfo_size_xen);
-+}
-+
-+HYPERVISOR_ATTR_RO(vmcoreinfo);
-+
-+static int __init xen_sysfs_vmcoreinfo_init(void)
-+{
-+      return sysfs_create_file(&hypervisor_subsys.kset.kobj,
-+                               &vmcoreinfo_attr.attr);
-+}
-+
-+static void xen_sysfs_vmcoreinfo_destroy(void)
-+{
-+      sysfs_remove_file(&hypervisor_subsys.kset.kobj, &vmcoreinfo_attr.attr);
-+}
-+
-+#endif
-+
-+static int __init hyper_sysfs_init(void)
-+{
-+      int ret;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      ret = xen_sysfs_type_init();
-+      if (ret)
-+              goto out;
-+      ret = xen_sysfs_version_init();
-+      if (ret)
-+              goto version_out;
-+      ret = xen_compilation_init();
-+      if (ret)
-+              goto comp_out;
-+      ret = xen_sysfs_uuid_init();
-+      if (ret)
-+              goto uuid_out;
-+      ret = xen_properties_init();
-+      if (ret)
-+              goto prop_out;
-+#ifdef CONFIG_KEXEC
-+      if (vmcoreinfo_size_xen != 0) {
-+              ret = xen_sysfs_vmcoreinfo_init();
-+              if (ret)
-+                      goto vmcoreinfo_out;
-+      }
-+#endif
-+
-+      goto out;
-+
-+#ifdef CONFIG_KEXEC
-+vmcoreinfo_out:
-+#endif
-+      xen_properties_destroy();
-+prop_out:
-+      xen_sysfs_uuid_destroy();
-+uuid_out:
-+      xen_compilation_destroy();
-+comp_out:
-+      xen_sysfs_version_destroy();
-+version_out:
-+      xen_sysfs_type_destroy();
-+out:
-+      return ret;
-+}
-+
-+static void __exit hyper_sysfs_exit(void)
-+{
-+#ifdef CONFIG_KEXEC
-+      if (vmcoreinfo_size_xen != 0)
-+              xen_sysfs_vmcoreinfo_destroy();
-+#endif
-+      xen_properties_destroy();
-+      xen_compilation_destroy();
-+      xen_sysfs_uuid_destroy();
-+      xen_sysfs_version_destroy();
-+      xen_sysfs_type_destroy();
-+
-+}
-+
-+module_init(hyper_sysfs_init);
-+module_exit(hyper_sysfs_exit);
-Index: head-2008-11-25/drivers/xen/core/xencomm.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/core/xencomm.c 2007-11-12 08:41:05.000000000 +0100
-@@ -0,0 +1,229 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ * 
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ * 
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ * Copyright (C) IBM Corp. 2006
-+ *
-+ * Authors: Hollis Blanchard <hollisb@us.ibm.com>
-+ */
-+
-+#include <linux/gfp.h>
-+#include <linux/mm.h>
-+#include <asm/page.h>
-+#include <xen/xencomm.h>
-+#include <xen/interface/xen.h>
-+#ifdef __ia64__
-+#include <asm/xen/xencomm.h>  /* for is_kern_addr() */
-+#endif
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+static int xencomm_init(struct xencomm_desc *desc,
-+                      void *buffer, unsigned long bytes)
-+{
-+      unsigned long recorded = 0;
-+      int i = 0;
-+
-+      while ((recorded < bytes) && (i < desc->nr_addrs)) {
-+              unsigned long vaddr = (unsigned long)buffer + recorded;
-+              unsigned long paddr;
-+              int offset;
-+              int chunksz;
-+
-+              offset = vaddr % PAGE_SIZE; /* handle partial pages */
-+              chunksz = min(PAGE_SIZE - offset, bytes - recorded);
-+
-+              paddr = xencomm_vtop(vaddr);
-+              if (paddr == ~0UL) {
-+                      printk("%s: couldn't translate vaddr %lx\n",
-+                             __func__, vaddr);
-+                      return -EINVAL;
-+              }
-+
-+              desc->address[i++] = paddr;
-+              recorded += chunksz;
-+      }
-+
-+      if (recorded < bytes) {
-+              printk("%s: could only translate %ld of %ld bytes\n",
-+                     __func__, recorded, bytes);
-+              return -ENOSPC;
-+      }
-+
-+      /* mark remaining addresses invalid (just for safety) */
-+      while (i < desc->nr_addrs)
-+              desc->address[i++] = XENCOMM_INVALID;
-+
-+      desc->magic = XENCOMM_MAGIC;
-+
-+      return 0;
-+}
-+
-+static struct xencomm_desc *xencomm_alloc(gfp_t gfp_mask,
-+                                        void *buffer, unsigned long bytes)
-+{
-+      struct xencomm_desc *desc;
-+      unsigned long buffer_ulong = (unsigned long)buffer;
-+      unsigned long start = buffer_ulong & PAGE_MASK;
-+      unsigned long end = (buffer_ulong + bytes) | ~PAGE_MASK;
-+      unsigned long nr_addrs = (end - start + 1) >> PAGE_SHIFT;
-+      unsigned long size = sizeof(*desc) +
-+              sizeof(desc->address[0]) * nr_addrs;
-+
-+      /*
-+       * slab allocator returns at least sizeof(void*) aligned pointer.
-+       * When sizeof(*desc) > sizeof(void*), struct xencomm_desc might
-+       * cross page boundary.
-+       */
-+      if (sizeof(*desc) > sizeof(void*)) {
-+              unsigned long order = get_order(size);
-+              desc = (struct xencomm_desc *)__get_free_pages(gfp_mask,
-+                                                             order);
-+              if (desc == NULL)
-+                      return NULL;
-+
-+              desc->nr_addrs =
-+                      ((PAGE_SIZE << order) - sizeof(struct xencomm_desc)) /
-+                      sizeof(*desc->address);
-+      } else {
-+              desc = kmalloc(size, gfp_mask);
-+              if (desc == NULL)
-+                      return NULL;
-+
-+              desc->nr_addrs = nr_addrs;
-+      }
-+      return desc;
-+}
-+
-+void xencomm_free(struct xencomm_handle *desc)
-+{
-+      if (desc && !((ulong)desc & XENCOMM_INLINE_FLAG)) {
-+              struct xencomm_desc *desc__ = (struct xencomm_desc*)desc;
-+              if (sizeof(*desc__) > sizeof(void*)) {
-+                      unsigned long size = sizeof(*desc__) +
-+                              sizeof(desc__->address[0]) * desc__->nr_addrs;
-+                      unsigned long order = get_order(size);
-+                      free_pages((unsigned long)__va(desc), order);
-+              } else
-+                      kfree(__va(desc));
-+      }
-+}
-+
-+static int xencomm_create(void *buffer, unsigned long bytes, struct xencomm_desc **ret, gfp_t gfp_mask)
-+{
-+      struct xencomm_desc *desc;
-+      int rc;
-+
-+      pr_debug("%s: %p[%ld]\n", __func__, buffer, bytes);
-+
-+      if (bytes == 0) {
-+              /* don't create a descriptor; Xen recognizes NULL. */
-+              BUG_ON(buffer != NULL);
-+              *ret = NULL;
-+              return 0;
-+      }
-+
-+      BUG_ON(buffer == NULL); /* 'bytes' is non-zero */
-+
-+      desc = xencomm_alloc(gfp_mask, buffer, bytes);
-+      if (!desc) {
-+              printk("%s failure\n", "xencomm_alloc");
-+              return -ENOMEM;
-+      }
-+
-+      rc = xencomm_init(desc, buffer, bytes);
-+      if (rc) {
-+              printk("%s failure: %d\n", "xencomm_init", rc);
-+              xencomm_free((struct xencomm_handle *)__pa(desc));
-+              return rc;
-+      }
-+
-+      *ret = desc;
-+      return 0;
-+}
-+
-+/* check if memory address is within VMALLOC region  */
-+static int is_phys_contiguous(unsigned long addr)
-+{
-+      if (!is_kernel_addr(addr))
-+              return 0;
-+
-+      return (addr < VMALLOC_START) || (addr >= VMALLOC_END);
-+}
-+
-+static struct xencomm_handle *xencomm_create_inline(void *ptr)
-+{
-+      unsigned long paddr;
-+
-+      BUG_ON(!is_phys_contiguous((unsigned long)ptr));
-+
-+      paddr = (unsigned long)xencomm_pa(ptr);
-+      BUG_ON(paddr & XENCOMM_INLINE_FLAG);
-+      return (struct xencomm_handle *)(paddr | XENCOMM_INLINE_FLAG);
-+}
-+
-+/* "mini" routine, for stack-based communications: */
-+static int xencomm_create_mini(void *buffer,
-+      unsigned long bytes, struct xencomm_mini *xc_desc,
-+      struct xencomm_desc **ret)
-+{
-+      int rc = 0;
-+      struct xencomm_desc *desc;
-+      BUG_ON(((unsigned long)xc_desc) % sizeof(*xc_desc) != 0);
-+
-+      desc = (void *)xc_desc; 
-+
-+      desc->nr_addrs = XENCOMM_MINI_ADDRS;
-+
-+      if (!(rc = xencomm_init(desc, buffer, bytes)))
-+              *ret = desc;
-+
-+      return rc;
-+}
-+
-+struct xencomm_handle *xencomm_map(void *ptr, unsigned long bytes)
-+{
-+      int rc;
-+      struct xencomm_desc *desc;
-+
-+      if (is_phys_contiguous((unsigned long)ptr))
-+              return xencomm_create_inline(ptr);
-+
-+      rc = xencomm_create(ptr, bytes, &desc, GFP_KERNEL);
-+
-+      if (rc || desc == NULL)
-+              return NULL;
-+
-+      return xencomm_pa(desc);
-+}
-+
-+struct xencomm_handle *__xencomm_map_no_alloc(void *ptr, unsigned long bytes, 
-+                      struct xencomm_mini *xc_desc)
-+{
-+      int rc;
-+      struct xencomm_desc *desc = NULL;
-+
-+      if (is_phys_contiguous((unsigned long)ptr))
-+              return xencomm_create_inline(ptr);
-+
-+      rc = xencomm_create_mini(ptr, bytes, xc_desc,
-+                              &desc);
-+
-+      if (rc)
-+              return NULL;
-+ 
-+      return xencomm_pa(desc);
-+}
-Index: head-2008-11-25/drivers/xen/evtchn/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/evtchn/Makefile        2007-06-12 13:13:44.000000000 +0200
-@@ -0,0 +1,2 @@
-+
-+obj-y := evtchn.o
-Index: head-2008-11-25/drivers/xen/evtchn/evtchn.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/evtchn/evtchn.c        2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,560 @@
-+/******************************************************************************
-+ * evtchn.c
-+ * 
-+ * Driver for receiving and demuxing event-channel signals.
-+ * 
-+ * Copyright (c) 2004-2005, K A Fraser
-+ * Multi-process extensions Copyright (c) 2004, Steven Smith
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/fs.h>
-+#include <linux/errno.h>
-+#include <linux/miscdevice.h>
-+#include <linux/major.h>
-+#include <linux/proc_fs.h>
-+#include <linux/stat.h>
-+#include <linux/poll.h>
-+#include <linux/irq.h>
-+#include <linux/init.h>
-+#include <linux/gfp.h>
-+#include <linux/mutex.h>
-+#include <linux/cpu.h>
-+#include <xen/evtchn.h>
-+#include <xen/public/evtchn.h>
-+
-+struct per_user_data {
-+      /* Notification ring, accessed via /dev/xen/evtchn. */
-+#define EVTCHN_RING_SIZE     (PAGE_SIZE / sizeof(evtchn_port_t))
-+#define EVTCHN_RING_MASK(_i) ((_i)&(EVTCHN_RING_SIZE-1))
-+      evtchn_port_t *ring;
-+      unsigned int ring_cons, ring_prod, ring_overflow;
-+      struct mutex ring_cons_mutex; /* protect against concurrent readers */
-+
-+      /* Processes wait on this queue when ring is empty. */
-+      wait_queue_head_t evtchn_wait;
-+      struct fasync_struct *evtchn_async_queue;
-+
-+      int bind_cpu;
-+      int nr_event_wrong_delivery;
-+};
-+
-+/* Who's bound to each port? */
-+static struct per_user_data *port_user[NR_EVENT_CHANNELS];
-+static spinlock_t port_user_lock;
-+
-+void evtchn_device_upcall(int port)
-+{
-+      struct per_user_data *u;
-+
-+      spin_lock(&port_user_lock);
-+
-+      mask_evtchn(port);
-+      clear_evtchn(port);
-+
-+      if ((u = port_user[port]) != NULL) {
-+              if ((u->ring_prod - u->ring_cons) < EVTCHN_RING_SIZE) {
-+                      u->ring[EVTCHN_RING_MASK(u->ring_prod)] = port;
-+                      wmb(); /* Ensure ring contents visible */
-+                      if (u->ring_cons == u->ring_prod++) {
-+                              wake_up_interruptible(&u->evtchn_wait);
-+                              kill_fasync(&u->evtchn_async_queue,
-+                                          SIGIO, POLL_IN);
-+                      }
-+              } else {
-+                      u->ring_overflow = 1;
-+              }
-+      }
-+
-+      spin_unlock(&port_user_lock);
-+}
-+
-+static void evtchn_check_wrong_delivery(struct per_user_data *u)
-+{
-+      evtchn_port_t port;
-+      unsigned int current_cpu = smp_processor_id();
-+
-+      /* Delivered to correct CPU? All is good. */
-+      if (u->bind_cpu == current_cpu) {
-+              u->nr_event_wrong_delivery = 0;
-+              return;
-+      }
-+
-+      /* Tolerate up to 100 consecutive misdeliveries. */
-+      if (++u->nr_event_wrong_delivery < 100)
-+              return;
-+
-+      spin_lock_irq(&port_user_lock);
-+
-+      for (port = 0; port < NR_EVENT_CHANNELS; port++)
-+              if (port_user[port] == u)
-+                      rebind_evtchn_to_cpu(port, current_cpu);
-+
-+      u->bind_cpu = current_cpu;
-+      u->nr_event_wrong_delivery = 0;
-+
-+      spin_unlock_irq(&port_user_lock);
-+}
-+
-+static ssize_t evtchn_read(struct file *file, char __user *buf,
-+                         size_t count, loff_t *ppos)
-+{
-+      int rc;
-+      unsigned int c, p, bytes1 = 0, bytes2 = 0;
-+      struct per_user_data *u = file->private_data;
-+
-+      /* Whole number of ports. */
-+      count &= ~(sizeof(evtchn_port_t)-1);
-+
-+      if (count == 0)
-+              return 0;
-+
-+      if (count > PAGE_SIZE)
-+              count = PAGE_SIZE;
-+
-+      for (;;) {
-+              mutex_lock(&u->ring_cons_mutex);
-+
-+              rc = -EFBIG;
-+              if (u->ring_overflow)
-+                      goto unlock_out;
-+
-+              if ((c = u->ring_cons) != (p = u->ring_prod))
-+                      break;
-+
-+              mutex_unlock(&u->ring_cons_mutex);
-+
-+              if (file->f_flags & O_NONBLOCK)
-+                      return -EAGAIN;
-+
-+              rc = wait_event_interruptible(
-+                      u->evtchn_wait, u->ring_cons != u->ring_prod);
-+              if (rc)
-+                      return rc;
-+      }
-+
-+      /* Byte lengths of two chunks. Chunk split (if any) is at ring wrap. */
-+      if (((c ^ p) & EVTCHN_RING_SIZE) != 0) {
-+              bytes1 = (EVTCHN_RING_SIZE - EVTCHN_RING_MASK(c)) *
-+                      sizeof(evtchn_port_t);
-+              bytes2 = EVTCHN_RING_MASK(p) * sizeof(evtchn_port_t);
-+      } else {
-+              bytes1 = (p - c) * sizeof(evtchn_port_t);
-+              bytes2 = 0;
-+      }
-+
-+      /* Truncate chunks according to caller's maximum byte count. */
-+      if (bytes1 > count) {
-+              bytes1 = count;
-+              bytes2 = 0;
-+      } else if ((bytes1 + bytes2) > count) {
-+              bytes2 = count - bytes1;
-+      }
-+
-+      rc = -EFAULT;
-+      rmb(); /* Ensure that we see the port before we copy it. */
-+      if (copy_to_user(buf, &u->ring[EVTCHN_RING_MASK(c)], bytes1) ||
-+          ((bytes2 != 0) &&
-+           copy_to_user(&buf[bytes1], &u->ring[0], bytes2)))
-+              goto unlock_out;
-+      
-+      evtchn_check_wrong_delivery(u);
-+
-+      u->ring_cons += (bytes1 + bytes2) / sizeof(evtchn_port_t);
-+      rc = bytes1 + bytes2;
-+
-+ unlock_out:
-+      mutex_unlock(&u->ring_cons_mutex);
-+      return rc;
-+}
-+
-+static ssize_t evtchn_write(struct file *file, const char __user *buf,
-+                          size_t count, loff_t *ppos)
-+{
-+      int rc, i;
-+      evtchn_port_t *kbuf = (evtchn_port_t *)__get_free_page(GFP_KERNEL);
-+      struct per_user_data *u = file->private_data;
-+
-+      if (kbuf == NULL)
-+              return -ENOMEM;
-+
-+      /* Whole number of ports. */
-+      count &= ~(sizeof(evtchn_port_t)-1);
-+
-+      rc = 0;
-+      if (count == 0)
-+              goto out;
-+
-+      if (count > PAGE_SIZE)
-+              count = PAGE_SIZE;
-+
-+      rc = -EFAULT;
-+      if (copy_from_user(kbuf, buf, count) != 0)
-+              goto out;
-+
-+      spin_lock_irq(&port_user_lock);
-+      for (i = 0; i < (count/sizeof(evtchn_port_t)); i++)
-+              if ((kbuf[i] < NR_EVENT_CHANNELS) && (port_user[kbuf[i]] == u))
-+                      unmask_evtchn(kbuf[i]);
-+      spin_unlock_irq(&port_user_lock);
-+
-+      rc = count;
-+
-+ out:
-+      free_page((unsigned long)kbuf);
-+      return rc;
-+}
-+
-+static unsigned int next_bind_cpu(cpumask_t map)
-+{
-+      static unsigned int bind_cpu;
-+      bind_cpu = next_cpu(bind_cpu, map);
-+      if (bind_cpu >= NR_CPUS)
-+              bind_cpu = first_cpu(map);
-+      return bind_cpu;
-+}
-+
-+static void evtchn_bind_to_user(struct per_user_data *u, int port)
-+{
-+      spin_lock_irq(&port_user_lock);
-+
-+      BUG_ON(port_user[port] != NULL);
-+      port_user[port] = u;
-+
-+      if (u->bind_cpu == -1)
-+              u->bind_cpu = next_bind_cpu(cpu_online_map);
-+
-+      rebind_evtchn_to_cpu(port, u->bind_cpu);
-+
-+      unmask_evtchn(port);
-+
-+      spin_unlock_irq(&port_user_lock);
-+}
-+
-+static long evtchn_ioctl(struct file *file,
-+                       unsigned int cmd, unsigned long arg)
-+{
-+      int rc;
-+      struct per_user_data *u = file->private_data;
-+      void __user *uarg = (void __user *) arg;
-+
-+      switch (cmd) {
-+      case IOCTL_EVTCHN_BIND_VIRQ: {
-+              struct ioctl_evtchn_bind_virq bind;
-+              struct evtchn_bind_virq bind_virq;
-+
-+              rc = -EFAULT;
-+              if (copy_from_user(&bind, uarg, sizeof(bind)))
-+                      break;
-+
-+              bind_virq.virq = bind.virq;
-+              bind_virq.vcpu = 0;
-+              rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_virq,
-+                                               &bind_virq);
-+              if (rc != 0)
-+                      break;
-+
-+              rc = bind_virq.port;
-+              evtchn_bind_to_user(u, rc);
-+              break;
-+      }
-+
-+      case IOCTL_EVTCHN_BIND_INTERDOMAIN: {
-+              struct ioctl_evtchn_bind_interdomain bind;
-+              struct evtchn_bind_interdomain bind_interdomain;
-+
-+              rc = -EFAULT;
-+              if (copy_from_user(&bind, uarg, sizeof(bind)))
-+                      break;
-+
-+              bind_interdomain.remote_dom  = bind.remote_domain;
-+              bind_interdomain.remote_port = bind.remote_port;
-+              rc = HYPERVISOR_event_channel_op(EVTCHNOP_bind_interdomain,
-+                                               &bind_interdomain);
-+              if (rc != 0)
-+                      break;
-+
-+              rc = bind_interdomain.local_port;
-+              evtchn_bind_to_user(u, rc);
-+              break;
-+      }
-+
-+      case IOCTL_EVTCHN_BIND_UNBOUND_PORT: {
-+              struct ioctl_evtchn_bind_unbound_port bind;
-+              struct evtchn_alloc_unbound alloc_unbound;
-+
-+              rc = -EFAULT;
-+              if (copy_from_user(&bind, uarg, sizeof(bind)))
-+                      break;
-+
-+              alloc_unbound.dom        = DOMID_SELF;
-+              alloc_unbound.remote_dom = bind.remote_domain;
-+              rc = HYPERVISOR_event_channel_op(EVTCHNOP_alloc_unbound,
-+                                               &alloc_unbound);
-+              if (rc != 0)
-+                      break;
-+
-+              rc = alloc_unbound.port;
-+              evtchn_bind_to_user(u, rc);
-+              break;
-+      }
-+
-+      case IOCTL_EVTCHN_UNBIND: {
-+              struct ioctl_evtchn_unbind unbind;
-+              struct evtchn_close close;
-+              int ret;
-+
-+              rc = -EFAULT;
-+              if (copy_from_user(&unbind, uarg, sizeof(unbind)))
-+                      break;
-+
-+              rc = -EINVAL;
-+              if (unbind.port >= NR_EVENT_CHANNELS)
-+                      break;
-+
-+              spin_lock_irq(&port_user_lock);
-+    
-+              rc = -ENOTCONN;
-+              if (port_user[unbind.port] != u) {
-+                      spin_unlock_irq(&port_user_lock);
-+                      break;
-+              }
-+
-+              port_user[unbind.port] = NULL;
-+              mask_evtchn(unbind.port);
-+              rebind_evtchn_to_cpu(unbind.port, 0);
-+
-+              spin_unlock_irq(&port_user_lock);
-+
-+              close.port = unbind.port;
-+              ret = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
-+              BUG_ON(ret);
-+
-+              rc = 0;
-+              break;
-+      }
-+
-+      case IOCTL_EVTCHN_NOTIFY: {
-+              struct ioctl_evtchn_notify notify;
-+
-+              rc = -EFAULT;
-+              if (copy_from_user(&notify, uarg, sizeof(notify)))
-+                      break;
-+
-+              if (notify.port >= NR_EVENT_CHANNELS) {
-+                      rc = -EINVAL;
-+              } else if (port_user[notify.port] != u) {
-+                      rc = -ENOTCONN;
-+              } else {
-+                      notify_remote_via_evtchn(notify.port);
-+                      rc = 0;
-+              }
-+              break;
-+      }
-+
-+      case IOCTL_EVTCHN_RESET: {
-+              /* Initialise the ring to empty. Clear errors. */
-+              mutex_lock(&u->ring_cons_mutex);
-+              spin_lock_irq(&port_user_lock);
-+              u->ring_cons = u->ring_prod = u->ring_overflow = 0;
-+              spin_unlock_irq(&port_user_lock);
-+              mutex_unlock(&u->ring_cons_mutex);
-+              rc = 0;
-+              break;
-+      }
-+
-+      default:
-+              rc = -ENOSYS;
-+              break;
-+      }
-+
-+      return rc;
-+}
-+
-+static unsigned int evtchn_poll(struct file *file, poll_table *wait)
-+{
-+      unsigned int mask = POLLOUT | POLLWRNORM;
-+      struct per_user_data *u = file->private_data;
-+
-+      poll_wait(file, &u->evtchn_wait, wait);
-+      if (u->ring_cons != u->ring_prod)
-+              mask |= POLLIN | POLLRDNORM;
-+      if (u->ring_overflow)
-+              mask = POLLERR;
-+      return mask;
-+}
-+
-+static int evtchn_fasync(int fd, struct file *filp, int on)
-+{
-+      struct per_user_data *u = filp->private_data;
-+      return fasync_helper(fd, filp, on, &u->evtchn_async_queue);
-+}
-+
-+static int evtchn_open(struct inode *inode, struct file *filp)
-+{
-+      struct per_user_data *u;
-+
-+      if ((u = kmalloc(sizeof(*u), GFP_KERNEL)) == NULL)
-+              return -ENOMEM;
-+
-+      memset(u, 0, sizeof(*u));
-+      init_waitqueue_head(&u->evtchn_wait);
-+
-+      u->ring = (evtchn_port_t *)__get_free_page(GFP_KERNEL);
-+      if (u->ring == NULL) {
-+              kfree(u);
-+              return -ENOMEM;
-+      }
-+
-+      mutex_init(&u->ring_cons_mutex);
-+
-+      filp->private_data = u;
-+
-+      u->bind_cpu = -1;
-+
-+      return 0;
-+}
-+
-+static int evtchn_release(struct inode *inode, struct file *filp)
-+{
-+      int i;
-+      struct per_user_data *u = filp->private_data;
-+      struct evtchn_close close;
-+
-+      spin_lock_irq(&port_user_lock);
-+
-+      free_page((unsigned long)u->ring);
-+
-+      for (i = 0; i < NR_EVENT_CHANNELS; i++) {
-+              int ret;
-+              if (port_user[i] != u)
-+                      continue;
-+
-+              port_user[i] = NULL;
-+              mask_evtchn(i);
-+              rebind_evtchn_to_cpu(i, 0);
-+
-+              close.port = i;
-+              ret = HYPERVISOR_event_channel_op(EVTCHNOP_close, &close);
-+              BUG_ON(ret);
-+      }
-+
-+      spin_unlock_irq(&port_user_lock);
-+
-+      kfree(u);
-+
-+      return 0;
-+}
-+
-+static const struct file_operations evtchn_fops = {
-+      .owner   = THIS_MODULE,
-+      .read    = evtchn_read,
-+      .write   = evtchn_write,
-+      .unlocked_ioctl = evtchn_ioctl,
-+      .poll    = evtchn_poll,
-+      .fasync  = evtchn_fasync,
-+      .open    = evtchn_open,
-+      .release = evtchn_release,
-+};
-+
-+static struct miscdevice evtchn_miscdev = {
-+      .minor        = MISC_DYNAMIC_MINOR,
-+      .name         = "evtchn",
-+      .fops         = &evtchn_fops,
-+};
-+
-+static int __cpuinit evtchn_cpu_notify(struct notifier_block *nfb,
-+                      unsigned long action, void *hcpu)
-+{
-+      int hotcpu = (unsigned long)hcpu;
-+      cpumask_t map = cpu_online_map;
-+      int port, newcpu;
-+      struct per_user_data *u;
-+
-+      switch (action) {
-+      case CPU_DOWN_PREPARE:
-+              cpu_clear(hotcpu, map);
-+              spin_lock_irq(&port_user_lock);
-+              for (port = 0; port < NR_EVENT_CHANNELS; port++) {
-+                      if ((u = port_user[port]) != NULL && 
-+                          u->bind_cpu == hotcpu &&
-+                          (newcpu = next_bind_cpu(map)) < NR_CPUS) {
-+                              rebind_evtchn_to_cpu(port, newcpu);
-+                              u->bind_cpu = newcpu;
-+                      }
-+              }
-+              spin_unlock_irq(&port_user_lock);
-+              break;
-+      default:
-+              return NOTIFY_DONE;
-+      }
-+      return NOTIFY_OK;
-+}
-+
-+static struct notifier_block __cpuinitdata evtchn_cpu_nfb = {
-+      .notifier_call = evtchn_cpu_notify
-+};
-+
-+static int __init evtchn_init(void)
-+{
-+      int err;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      spin_lock_init(&port_user_lock);
-+      memset(port_user, 0, sizeof(port_user));
-+
-+      /* Create '/dev/misc/evtchn'. */
-+      err = misc_register(&evtchn_miscdev);
-+      if (err != 0) {
-+              printk(KERN_ALERT "Could not register /dev/misc/evtchn\n");
-+              return err;
-+      }
-+
-+      register_cpu_notifier(&evtchn_cpu_nfb);
-+
-+      printk("Event-channel device installed.\n");
-+
-+      return 0;
-+}
-+
-+static void __exit evtchn_cleanup(void)
-+{
-+      misc_deregister(&evtchn_miscdev);
-+      unregister_cpu_notifier(&evtchn_cpu_nfb);
-+}
-+
-+module_init(evtchn_init);
-+module_exit(evtchn_cleanup);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/fbfront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/fbfront/Makefile       2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,2 @@
-+obj-$(CONFIG_XEN_FRAMEBUFFER) := xenfb.o
-+obj-$(CONFIG_XEN_KEYBOARD)    += xenkbd.o
-Index: head-2008-11-25/drivers/xen/fbfront/xenfb.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/fbfront/xenfb.c        2008-11-25 12:22:34.000000000 +0100
-@@ -0,0 +1,887 @@
-+/*
-+ * linux/drivers/video/xenfb.c -- Xen para-virtual frame buffer device
-+ *
-+ * Copyright (C) 2005-2006 Anthony Liguori <aliguori@us.ibm.com>
-+ * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
-+ *
-+ *  Based on linux/drivers/video/q40fb.c
-+ *
-+ *  This file is subject to the terms and conditions of the GNU General Public
-+ *  License. See the file COPYING in the main directory of this archive for
-+ *  more details.
-+ */
-+
-+/*
-+ * TODO:
-+ *
-+ * Switch to grant tables when they become capable of dealing with the
-+ * frame buffer.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/fb.h>
-+#include <linux/module.h>
-+#include <linux/vmalloc.h>
-+#include <linux/mm.h>
-+#include <linux/mutex.h>
-+#include <asm/hypervisor.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/io/fbif.h>
-+#include <xen/interface/io/protocols.h>
-+#include <xen/xenbus.h>
-+#include <linux/kthread.h>
-+
-+struct xenfb_mapping
-+{
-+      struct list_head        link;
-+      struct vm_area_struct   *vma;
-+      atomic_t                map_refs;
-+      int                     faults;
-+      struct xenfb_info       *info;
-+};
-+
-+struct xenfb_info
-+{
-+      struct task_struct      *kthread;
-+      wait_queue_head_t       wq;
-+
-+      unsigned char           *fb;
-+      struct fb_info          *fb_info;
-+      struct timer_list       refresh;
-+      int                     dirty;
-+      int                     x1, y1, x2, y2; /* dirty rectangle,
-+                                                 protected by dirty_lock */
-+      spinlock_t              dirty_lock;
-+      struct mutex            mm_lock;
-+      int                     nr_pages;
-+      struct page             **pages;
-+      struct list_head        mappings; /* protected by mm_lock */
-+
-+      int                     irq;
-+      struct xenfb_page       *page;
-+      unsigned long           *mfns;
-+      int                     update_wanted; /* XENFB_TYPE_UPDATE wanted */
-+      int                     feature_resize; /* Backend has resize feature */
-+      struct xenfb_resize     resize;
-+      int                     resize_dpy;
-+      spinlock_t              resize_lock;
-+
-+      struct xenbus_device    *xbdev;
-+};
-+
-+/*
-+ * There are three locks:
-+ *    spinlock resize_lock protecting resize_dpy and resize
-+ *    spinlock dirty_lock protecting the dirty rectangle
-+ *    mutex mm_lock protecting mappings.
-+ *
-+ * How the dirty and mapping locks work together
-+ *
-+ * The problem is that dirty rectangle and mappings aren't
-+ * independent: the dirty rectangle must cover all faulted pages in
-+ * mappings.  We need to prove that our locking maintains this
-+ * invariant.
-+ *
-+ * There are several kinds of critical regions:
-+ *
-+ * 1. Holding only dirty_lock: xenfb_refresh().  May run in
-+ *    interrupts.  Extends the dirty rectangle.  Trivially preserves
-+ *    invariant.
-+ *
-+ * 2. Holding only mm_lock: xenfb_mmap() and xenfb_vm_close().  Touch
-+ *    only mappings.  The former creates unfaulted pages.  Preserves
-+ *    invariant.  The latter removes pages.  Preserves invariant.
-+ *
-+ * 3. Holding both locks: xenfb_vm_nopage().  Extends the dirty
-+ *    rectangle and updates mappings consistently.  Preserves
-+ *    invariant.
-+ *
-+ * 4. The ugliest one: xenfb_update_screen().  Clear the dirty
-+ *    rectangle and update mappings consistently.
-+ *
-+ *    We can't simply hold both locks, because zap_page_range() cannot
-+ *    be called with a spinlock held.
-+ *
-+ *    Therefore, we first clear the dirty rectangle with both locks
-+ *    held.  Then we unlock dirty_lock and update the mappings.
-+ *    Critical regions that hold only dirty_lock may interfere with
-+ *    that.  This can only be region 1: xenfb_refresh().  But that
-+ *    just extends the dirty rectangle, which can't harm the
-+ *    invariant.
-+ *
-+ * But FIXME: the invariant is too weak.  It misses that the fault
-+ * record in mappings must be consistent with the mapping of pages in
-+ * the associated address space!  do_no_page() updates the PTE after
-+ * xenfb_vm_nopage() returns, i.e. outside the critical region.  This
-+ * allows the following race:
-+ *
-+ * X writes to some address in the Xen frame buffer
-+ * Fault - call do_no_page()
-+ *     call xenfb_vm_nopage()
-+ *         grab mm_lock
-+ *         map->faults++;
-+ *         release mm_lock
-+ *     return back to do_no_page()
-+ * (preempted, or SMP)
-+ * Xen worker thread runs.
-+ *      grab mm_lock
-+ *      look at mappings
-+ *          find this mapping, zaps its pages (but page not in pte yet)
-+ *          clear map->faults
-+ *      releases mm_lock
-+ * (back to X process)
-+ *     put page in X's pte
-+ *
-+ * Oh well, we wont be updating the writes to this page anytime soon.
-+ */
-+#define MB_ (1024*1024)
-+#define XENFB_DEFAULT_FB_LEN (XENFB_WIDTH * XENFB_HEIGHT * XENFB_DEPTH / 8)
-+
-+enum {KPARAM_MEM, KPARAM_WIDTH, KPARAM_HEIGHT, KPARAM_CNT};
-+static int video[KPARAM_CNT] = {2, XENFB_WIDTH, XENFB_HEIGHT};
-+module_param_array(video, int, NULL, 0);
-+MODULE_PARM_DESC(video,
-+              "Size of video memory in MB and width,height in pixels, default = (2,800,600)");
-+
-+static int xenfb_fps = 20;
-+
-+static int xenfb_remove(struct xenbus_device *);
-+static void xenfb_init_shared_page(struct xenfb_info *, struct fb_info *);
-+static int xenfb_connect_backend(struct xenbus_device *, struct xenfb_info *);
-+static void xenfb_disconnect_backend(struct xenfb_info *);
-+
-+static void xenfb_send_event(struct xenfb_info *info,
-+              union xenfb_out_event *event)
-+{
-+      __u32 prod;
-+
-+      prod = info->page->out_prod;
-+      /* caller ensures !xenfb_queue_full() */
-+      mb();                   /* ensure ring space available */
-+      XENFB_OUT_RING_REF(info->page, prod) = *event;
-+      wmb();                  /* ensure ring contents visible */
-+      info->page->out_prod = prod + 1;
-+
-+      notify_remote_via_irq(info->irq);
-+}
-+
-+static void xenfb_do_update(struct xenfb_info *info,
-+                          int x, int y, int w, int h)
-+{
-+      union xenfb_out_event event;
-+
-+      memset(&event, 0, sizeof(event));
-+      event.type = XENFB_TYPE_UPDATE;
-+      event.update.x = x;
-+      event.update.y = y;
-+      event.update.width = w;
-+      event.update.height = h;
-+
-+      /* caller ensures !xenfb_queue_full() */
-+      xenfb_send_event(info, &event);
-+}
-+
-+static void xenfb_do_resize(struct xenfb_info *info)
-+{
-+      union xenfb_out_event event;
-+
-+      memset(&event, 0, sizeof(event));
-+      event.resize = info->resize;
-+
-+      /* caller ensures !xenfb_queue_full() */
-+      xenfb_send_event(info, &event);
-+}
-+
-+static int xenfb_queue_full(struct xenfb_info *info)
-+{
-+      __u32 cons, prod;
-+
-+      prod = info->page->out_prod;
-+      cons = info->page->out_cons;
-+      return prod - cons == XENFB_OUT_RING_LEN;
-+}
-+
-+static void xenfb_update_screen(struct xenfb_info *info)
-+{
-+      unsigned long flags;
-+      int y1, y2, x1, x2;
-+      struct xenfb_mapping *map;
-+
-+      if (!info->update_wanted)
-+              return;
-+      if (xenfb_queue_full(info))
-+              return;
-+
-+      mutex_lock(&info->mm_lock);
-+
-+      spin_lock_irqsave(&info->dirty_lock, flags);
-+      y1 = info->y1;
-+      y2 = info->y2;
-+      x1 = info->x1;
-+      x2 = info->x2;
-+      info->x1 = info->y1 = INT_MAX;
-+      info->x2 = info->y2 = 0;
-+      spin_unlock_irqrestore(&info->dirty_lock, flags);
-+
-+      list_for_each_entry(map, &info->mappings, link) {
-+              if (!map->faults)
-+                      continue;
-+              zap_page_range(map->vma, map->vma->vm_start,
-+                             map->vma->vm_end - map->vma->vm_start, NULL);
-+              map->faults = 0;
-+      }
-+
-+      mutex_unlock(&info->mm_lock);
-+
-+      if (x2 < x1 || y2 < y1) {
-+              printk("xenfb_update_screen bogus rect %d %d %d %d\n",
-+                     x1, x2, y1, y2);
-+              WARN_ON(1);
-+      }
-+      xenfb_do_update(info, x1, y1, x2 - x1, y2 - y1);
-+}
-+
-+static void xenfb_handle_resize_dpy(struct xenfb_info *info)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->resize_lock, flags);
-+      if (info->resize_dpy) {
-+              if (!xenfb_queue_full(info)) {
-+                      info->resize_dpy = 0;
-+                      xenfb_do_resize(info);
-+              }
-+      }
-+      spin_unlock_irqrestore(&info->resize_lock, flags);
-+}
-+
-+static int xenfb_thread(void *data)
-+{
-+      struct xenfb_info *info = data;
-+
-+      while (!kthread_should_stop()) {
-+              xenfb_handle_resize_dpy(info);
-+              if (info->dirty) {
-+                      info->dirty = 0;
-+                      xenfb_update_screen(info);
-+              }
-+              wait_event_interruptible(info->wq,
-+                      kthread_should_stop() || info->dirty);
-+              try_to_freeze();
-+      }
-+      return 0;
-+}
-+
-+static int xenfb_setcolreg(unsigned regno, unsigned red, unsigned green,
-+                         unsigned blue, unsigned transp,
-+                         struct fb_info *info)
-+{
-+      u32 v;
-+
-+      if (regno > info->cmap.len)
-+              return 1;
-+
-+      red   >>= (16 - info->var.red.length);
-+      green >>= (16 - info->var.green.length);
-+      blue  >>= (16 - info->var.blue.length);
-+
-+      v = (red << info->var.red.offset) |
-+          (green << info->var.green.offset) |
-+          (blue << info->var.blue.offset);
-+
-+      /* FIXME is this sane?  check against xxxfb_setcolreg()!  */
-+      switch (info->var.bits_per_pixel) {
-+      case 16:
-+      case 24:
-+      case 32:
-+              ((u32 *)info->pseudo_palette)[regno] = v;
-+              break;
-+      }
-+      
-+      return 0;
-+}
-+
-+static void xenfb_timer(unsigned long data)
-+{
-+      struct xenfb_info *info = (struct xenfb_info *)data;
-+      wake_up(&info->wq);
-+}
-+
-+static void __xenfb_refresh(struct xenfb_info *info,
-+                          int x1, int y1, int w, int h)
-+{
-+      int y2, x2;
-+
-+      y2 = y1 + h;
-+      x2 = x1 + w;
-+
-+      if (info->y1 > y1)
-+              info->y1 = y1;
-+      if (info->y2 < y2)
-+              info->y2 = y2;
-+      if (info->x1 > x1)
-+              info->x1 = x1;
-+      if (info->x2 < x2)
-+              info->x2 = x2;
-+      info->dirty = 1;
-+
-+      if (timer_pending(&info->refresh))
-+              return;
-+
-+      mod_timer(&info->refresh, jiffies + HZ/xenfb_fps);
-+}
-+
-+static void xenfb_refresh(struct xenfb_info *info,
-+                        int x1, int y1, int w, int h)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->dirty_lock, flags);
-+      __xenfb_refresh(info, x1, y1, w, h);
-+      spin_unlock_irqrestore(&info->dirty_lock, flags);
-+}
-+
-+static void xenfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect)
-+{
-+      struct xenfb_info *info = p->par;
-+
-+      cfb_fillrect(p, rect);
-+      xenfb_refresh(info, rect->dx, rect->dy, rect->width, rect->height);
-+}
-+
-+static void xenfb_imageblit(struct fb_info *p, const struct fb_image *image)
-+{
-+      struct xenfb_info *info = p->par;
-+
-+      cfb_imageblit(p, image);
-+      xenfb_refresh(info, image->dx, image->dy, image->width, image->height);
-+}
-+
-+static void xenfb_copyarea(struct fb_info *p, const struct fb_copyarea *area)
-+{
-+      struct xenfb_info *info = p->par;
-+
-+      cfb_copyarea(p, area);
-+      xenfb_refresh(info, area->dx, area->dy, area->width, area->height);
-+}
-+
-+static void xenfb_vm_open(struct vm_area_struct *vma)
-+{
-+      struct xenfb_mapping *map = vma->vm_private_data;
-+      atomic_inc(&map->map_refs);
-+}
-+
-+static void xenfb_vm_close(struct vm_area_struct *vma)
-+{
-+      struct xenfb_mapping *map = vma->vm_private_data;
-+      struct xenfb_info *info = map->info;
-+
-+      mutex_lock(&info->mm_lock);
-+      if (atomic_dec_and_test(&map->map_refs)) {
-+              list_del(&map->link);
-+              kfree(map);
-+      }
-+      mutex_unlock(&info->mm_lock);
-+}
-+
-+static struct page *xenfb_vm_nopage(struct vm_area_struct *vma,
-+                                  unsigned long vaddr, int *type)
-+{
-+      struct xenfb_mapping *map = vma->vm_private_data;
-+      struct xenfb_info *info = map->info;
-+      int pgnr = (vaddr - vma->vm_start) >> PAGE_SHIFT;
-+      unsigned long flags;
-+      struct page *page;
-+      int y1, y2;
-+
-+      if (pgnr >= info->nr_pages)
-+              return NOPAGE_SIGBUS;
-+
-+      mutex_lock(&info->mm_lock);
-+      spin_lock_irqsave(&info->dirty_lock, flags);
-+      page = info->pages[pgnr];
-+      get_page(page);
-+      map->faults++;
-+
-+      y1 = pgnr * PAGE_SIZE / info->fb_info->fix.line_length;
-+      y2 = (pgnr * PAGE_SIZE + PAGE_SIZE - 1) / info->fb_info->fix.line_length;
-+      if (y2 > info->fb_info->var.yres)
-+              y2 = info->fb_info->var.yres;
-+      __xenfb_refresh(info, 0, y1, info->fb_info->var.xres, y2 - y1);
-+      spin_unlock_irqrestore(&info->dirty_lock, flags);
-+      mutex_unlock(&info->mm_lock);
-+
-+      if (type)
-+              *type = VM_FAULT_MINOR;
-+
-+      return page;
-+}
-+
-+static struct vm_operations_struct xenfb_vm_ops = {
-+      .open   = xenfb_vm_open,
-+      .close  = xenfb_vm_close,
-+      .nopage = xenfb_vm_nopage,
-+};
-+
-+static int xenfb_mmap(struct fb_info *fb_info, struct vm_area_struct *vma)
-+{
-+      struct xenfb_info *info = fb_info->par;
-+      struct xenfb_mapping *map;
-+      int map_pages;
-+
-+      if (!(vma->vm_flags & VM_WRITE))
-+              return -EINVAL;
-+      if (!(vma->vm_flags & VM_SHARED))
-+              return -EINVAL;
-+      if (vma->vm_pgoff != 0)
-+              return -EINVAL;
-+
-+      map_pages = (vma->vm_end - vma->vm_start + PAGE_SIZE-1) >> PAGE_SHIFT;
-+      if (map_pages > info->nr_pages)
-+              return -EINVAL;
-+
-+      map = kzalloc(sizeof(*map), GFP_KERNEL);
-+      if (map == NULL)
-+              return -ENOMEM;
-+
-+      map->vma = vma;
-+      map->faults = 0;
-+      map->info = info;
-+      atomic_set(&map->map_refs, 1);
-+
-+      mutex_lock(&info->mm_lock);
-+      list_add(&map->link, &info->mappings);
-+      mutex_unlock(&info->mm_lock);
-+
-+      vma->vm_ops = &xenfb_vm_ops;
-+      vma->vm_flags |= (VM_DONTEXPAND | VM_RESERVED);
-+      vma->vm_private_data = map;
-+
-+      return 0;
-+}
-+
-+static int
-+xenfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
-+{
-+      struct xenfb_info *xenfb_info;
-+      int required_mem_len;
-+
-+      xenfb_info = info->par;
-+
-+      if (!xenfb_info->feature_resize) {
-+              if (var->xres == video[KPARAM_WIDTH] &&
-+                      var->yres == video[KPARAM_HEIGHT] &&
-+                      var->bits_per_pixel == xenfb_info->page->depth) {
-+                      return 0;
-+              }
-+              return -EINVAL;
-+      }
-+
-+      /* Can't resize past initial width and height */
-+      if (var->xres > video[KPARAM_WIDTH] || var->yres > video[KPARAM_HEIGHT])
-+              return -EINVAL;
-+
-+      required_mem_len = var->xres * var->yres * (xenfb_info->page->depth / 8);
-+      if (var->bits_per_pixel == xenfb_info->page->depth &&
-+              var->xres <= info->fix.line_length / (XENFB_DEPTH / 8) &&
-+              required_mem_len <= info->fix.smem_len) {
-+              var->xres_virtual = var->xres;
-+              var->yres_virtual = var->yres;
-+              return 0;
-+      }
-+      return -EINVAL;
-+}
-+
-+static int xenfb_set_par(struct fb_info *info)
-+{
-+      struct xenfb_info *xenfb_info;
-+      unsigned long flags;
-+
-+      xenfb_info = info->par;
-+
-+      spin_lock_irqsave(&xenfb_info->resize_lock, flags);
-+      xenfb_info->resize.type = XENFB_TYPE_RESIZE;
-+      xenfb_info->resize.width = info->var.xres;
-+      xenfb_info->resize.height = info->var.yres;
-+      xenfb_info->resize.stride = info->fix.line_length;
-+      xenfb_info->resize.depth = info->var.bits_per_pixel;
-+      xenfb_info->resize.offset = 0;
-+      xenfb_info->resize_dpy = 1;
-+      spin_unlock_irqrestore(&xenfb_info->resize_lock, flags);
-+      return 0;
-+}
-+
-+static struct fb_ops xenfb_fb_ops = {
-+      .owner          = THIS_MODULE,
-+      .fb_setcolreg   = xenfb_setcolreg,
-+      .fb_fillrect    = xenfb_fillrect,
-+      .fb_copyarea    = xenfb_copyarea,
-+      .fb_imageblit   = xenfb_imageblit,
-+      .fb_mmap        = xenfb_mmap,
-+      .fb_check_var   = xenfb_check_var,
-+      .fb_set_par     = xenfb_set_par,
-+};
-+
-+static irqreturn_t xenfb_event_handler(int rq, void *dev_id,
-+                                     struct pt_regs *regs)
-+{
-+      /*
-+       * No in events recognized, simply ignore them all.
-+       * If you need to recognize some, see xenbkd's input_handler()
-+       * for how to do that.
-+       */
-+      struct xenfb_info *info = dev_id;
-+      struct xenfb_page *page = info->page;
-+
-+      if (page->in_cons != page->in_prod) {
-+              info->page->in_cons = info->page->in_prod;
-+              notify_remote_via_irq(info->irq);
-+      }
-+      return IRQ_HANDLED;
-+}
-+
-+static unsigned long vmalloc_to_mfn(void *address)
-+{
-+      return pfn_to_mfn(vmalloc_to_pfn(address));
-+}
-+
-+static int __devinit xenfb_probe(struct xenbus_device *dev,
-+                               const struct xenbus_device_id *id)
-+{
-+      struct xenfb_info *info;
-+      struct fb_info *fb_info;
-+      int fb_size;
-+      int val;
-+      int ret;
-+
-+      info = kzalloc(sizeof(*info), GFP_KERNEL);
-+      if (info == NULL) {
-+              xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-+              return -ENOMEM;
-+      }
-+
-+      /* Limit kernel param videoram amount to what is in xenstore */
-+      if (xenbus_scanf(XBT_NIL, dev->otherend, "videoram", "%d", &val) == 1) {
-+              if (val < video[KPARAM_MEM])
-+                      video[KPARAM_MEM] = val;
-+      }
-+
-+      /* If requested res does not fit in available memory, use default */
-+      fb_size = video[KPARAM_MEM] * MB_;
-+      if (video[KPARAM_WIDTH] * video[KPARAM_HEIGHT] * XENFB_DEPTH/8 > fb_size) {
-+              video[KPARAM_WIDTH] = XENFB_WIDTH;
-+              video[KPARAM_HEIGHT] = XENFB_HEIGHT;
-+              fb_size = XENFB_DEFAULT_FB_LEN;
-+      }
-+
-+      dev->dev.driver_data = info;
-+      info->xbdev = dev;
-+      info->irq = -1;
-+      info->x1 = info->y1 = INT_MAX;
-+      spin_lock_init(&info->dirty_lock);
-+      spin_lock_init(&info->resize_lock);
-+      mutex_init(&info->mm_lock);
-+      init_waitqueue_head(&info->wq);
-+      init_timer(&info->refresh);
-+      info->refresh.function = xenfb_timer;
-+      info->refresh.data = (unsigned long)info;
-+      INIT_LIST_HEAD(&info->mappings);
-+
-+      info->fb = vmalloc(fb_size);
-+      if (info->fb == NULL)
-+              goto error_nomem;
-+      memset(info->fb, 0, fb_size);
-+
-+      info->nr_pages = (fb_size + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+
-+      info->pages = kmalloc(sizeof(struct page *) * info->nr_pages,
-+                            GFP_KERNEL);
-+      if (info->pages == NULL)
-+              goto error_nomem;
-+
-+      info->mfns = vmalloc(sizeof(unsigned long) * info->nr_pages);
-+      if (!info->mfns)
-+              goto error_nomem;
-+
-+      /* set up shared page */
-+      info->page = (void *)__get_free_page(GFP_KERNEL | __GFP_ZERO);
-+      if (!info->page)
-+              goto error_nomem;
-+
-+      fb_info = framebuffer_alloc(sizeof(u32) * 256, NULL);
-+                              /* see fishy hackery below */
-+      if (fb_info == NULL)
-+              goto error_nomem;
-+
-+      /* FIXME fishy hackery */
-+      fb_info->pseudo_palette = fb_info->par;
-+      fb_info->par = info;
-+      /* /FIXME */
-+      fb_info->screen_base = info->fb;
-+
-+      fb_info->fbops = &xenfb_fb_ops;
-+      fb_info->var.xres_virtual = fb_info->var.xres = video[KPARAM_WIDTH];
-+      fb_info->var.yres_virtual = fb_info->var.yres = video[KPARAM_HEIGHT];
-+      fb_info->var.bits_per_pixel = XENFB_DEPTH;
-+
-+      fb_info->var.red = (struct fb_bitfield){16, 8, 0};
-+      fb_info->var.green = (struct fb_bitfield){8, 8, 0};
-+      fb_info->var.blue = (struct fb_bitfield){0, 8, 0};
-+
-+      fb_info->var.activate = FB_ACTIVATE_NOW;
-+      fb_info->var.height = -1;
-+      fb_info->var.width = -1;
-+      fb_info->var.vmode = FB_VMODE_NONINTERLACED;
-+
-+      fb_info->fix.visual = FB_VISUAL_TRUECOLOR;
-+      fb_info->fix.line_length = fb_info->var.xres * (XENFB_DEPTH / 8);
-+      fb_info->fix.smem_start = 0;
-+      fb_info->fix.smem_len = fb_size;
-+      strcpy(fb_info->fix.id, "xen");
-+      fb_info->fix.type = FB_TYPE_PACKED_PIXELS;
-+      fb_info->fix.accel = FB_ACCEL_NONE;
-+
-+      fb_info->flags = FBINFO_FLAG_DEFAULT;
-+
-+      ret = fb_alloc_cmap(&fb_info->cmap, 256, 0);
-+      if (ret < 0) {
-+              framebuffer_release(fb_info);
-+              xenbus_dev_fatal(dev, ret, "fb_alloc_cmap");
-+              goto error;
-+      }
-+
-+      xenfb_init_shared_page(info, fb_info);
-+
-+      ret = register_framebuffer(fb_info);
-+      if (ret) {
-+              fb_dealloc_cmap(&info->fb_info->cmap);
-+              framebuffer_release(fb_info);
-+              xenbus_dev_fatal(dev, ret, "register_framebuffer");
-+              goto error;
-+      }
-+      info->fb_info = fb_info;
-+
-+      ret = xenfb_connect_backend(dev, info);
-+      if (ret < 0)
-+              goto error;
-+
-+      /* FIXME should this be delayed until backend XenbusStateConnected? */
-+      info->kthread = kthread_run(xenfb_thread, info, "xenfb thread");
-+      if (IS_ERR(info->kthread)) {
-+              ret = PTR_ERR(info->kthread);
-+              info->kthread = NULL;
-+              xenbus_dev_fatal(dev, ret, "register_framebuffer");
-+              goto error;
-+      }
-+
-+      return 0;
-+
-+ error_nomem:
-+      ret = -ENOMEM;
-+      xenbus_dev_fatal(dev, ret, "allocating device memory");
-+ error:
-+      xenfb_remove(dev);
-+      return ret;
-+}
-+
-+static int xenfb_resume(struct xenbus_device *dev)
-+{
-+      struct xenfb_info *info = dev->dev.driver_data;
-+
-+      xenfb_disconnect_backend(info);
-+      xenfb_init_shared_page(info, info->fb_info);
-+      return xenfb_connect_backend(dev, info);
-+}
-+
-+static int xenfb_remove(struct xenbus_device *dev)
-+{
-+      struct xenfb_info *info = dev->dev.driver_data;
-+
-+      del_timer(&info->refresh);
-+      if (info->kthread)
-+              kthread_stop(info->kthread);
-+      xenfb_disconnect_backend(info);
-+      if (info->fb_info) {
-+              unregister_framebuffer(info->fb_info);
-+              fb_dealloc_cmap(&info->fb_info->cmap);
-+              framebuffer_release(info->fb_info);
-+      }
-+      free_page((unsigned long)info->page);
-+      vfree(info->mfns);
-+      kfree(info->pages);
-+      vfree(info->fb);
-+      kfree(info);
-+
-+      return 0;
-+}
-+
-+static void xenfb_init_shared_page(struct xenfb_info *info,
-+                                   struct fb_info * fb_info)
-+{
-+      int i;
-+      int epd = PAGE_SIZE / sizeof(info->mfns[0]);
-+
-+      for (i = 0; i < info->nr_pages; i++)
-+              info->pages[i] = vmalloc_to_page(info->fb + i * PAGE_SIZE);
-+
-+      for (i = 0; i < info->nr_pages; i++)
-+              info->mfns[i] = vmalloc_to_mfn(info->fb + i * PAGE_SIZE);
-+
-+      for (i = 0; i * epd < info->nr_pages; i++)
-+              info->page->pd[i] = vmalloc_to_mfn(&info->mfns[i * epd]);
-+
-+      info->page->width = fb_info->var.xres;
-+      info->page->height = fb_info->var.yres;
-+      info->page->depth = fb_info->var.bits_per_pixel;
-+      info->page->line_length = fb_info->fix.line_length;
-+      info->page->mem_length = fb_info->fix.smem_len;
-+      info->page->in_cons = info->page->in_prod = 0;
-+      info->page->out_cons = info->page->out_prod = 0;
-+}
-+
-+static int xenfb_connect_backend(struct xenbus_device *dev,
-+                               struct xenfb_info *info)
-+{
-+      int ret;
-+      struct xenbus_transaction xbt;
-+
-+      ret = bind_listening_port_to_irqhandler(
-+              dev->otherend_id, xenfb_event_handler, 0, "xenfb", info);
-+      if (ret < 0) {
-+              xenbus_dev_fatal(dev, ret,
-+                               "bind_listening_port_to_irqhandler");
-+              return ret;
-+      }
-+      info->irq = ret;
-+
-+ again:
-+      ret = xenbus_transaction_start(&xbt);
-+      if (ret) {
-+              xenbus_dev_fatal(dev, ret, "starting transaction");
-+              return ret;
-+      }
-+      ret = xenbus_printf(xbt, dev->nodename, "page-ref", "%lu",
-+                          virt_to_mfn(info->page));
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-+                          irq_to_evtchn_port(info->irq));
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_printf(xbt, dev->nodename, "protocol", "%s",
-+                          XEN_IO_PROTO_ABI_NATIVE);
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_printf(xbt, dev->nodename, "feature-update", "1");
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_transaction_end(xbt, 0);
-+      if (ret) {
-+              if (ret == -EAGAIN)
-+                      goto again;
-+              xenbus_dev_fatal(dev, ret, "completing transaction");
-+              return ret;
-+      }
-+
-+      xenbus_switch_state(dev, XenbusStateInitialised);
-+      return 0;
-+
-+ error_xenbus:
-+      xenbus_transaction_end(xbt, 1);
-+      xenbus_dev_fatal(dev, ret, "writing xenstore");
-+      return ret;
-+}
-+
-+static void xenfb_disconnect_backend(struct xenfb_info *info)
-+{
-+      if (info->irq >= 0)
-+              unbind_from_irqhandler(info->irq, info);
-+      info->irq = -1;
-+}
-+
-+static void xenfb_backend_changed(struct xenbus_device *dev,
-+                                enum xenbus_state backend_state)
-+{
-+      struct xenfb_info *info = dev->dev.driver_data;
-+      int val;
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitialised:
-+      case XenbusStateReconfiguring:
-+      case XenbusStateReconfigured:
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateInitWait:
-+      InitWait:
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+              break;
-+
-+      case XenbusStateConnected:
-+              /*
-+               * Work around xenbus race condition: If backend goes
-+               * through InitWait to Connected fast enough, we can
-+               * get Connected twice here.
-+               */
-+              if (dev->state != XenbusStateConnected)
-+                      goto InitWait; /* no InitWait seen yet, fudge it */
-+
-+              if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-+                               "request-update", "%d", &val) < 0)
-+                      val = 0;
-+              if (val)
-+                      info->update_wanted = 1;
-+
-+              if (xenbus_scanf(XBT_NIL, dev->otherend,
-+                                      "feature-resize", "%d", &val) < 0)
-+                      val = 0;
-+              info->feature_resize = val;
-+              break;
-+
-+      case XenbusStateClosing:
-+              // FIXME is this safe in any dev->state?
-+              xenbus_frontend_closed(dev);
-+              break;
-+      }
-+}
-+
-+static const struct xenbus_device_id xenfb_ids[] = {
-+      { "vfb" },
-+      { "" }
-+};
-+MODULE_ALIAS("xen:vfb");
-+
-+static struct xenbus_driver xenfb_driver = {
-+      .name = "vfb",
-+      .owner = THIS_MODULE,
-+      .ids = xenfb_ids,
-+      .probe = xenfb_probe,
-+      .remove = xenfb_remove,
-+      .resume = xenfb_resume,
-+      .otherend_changed = xenfb_backend_changed,
-+};
-+
-+static int __init xenfb_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      /* Nothing to do if running in dom0. */
-+      if (is_initial_xendomain())
-+              return -ENODEV;
-+
-+      return xenbus_register_frontend(&xenfb_driver);
-+}
-+
-+static void __exit xenfb_cleanup(void)
-+{
-+      return xenbus_unregister_driver(&xenfb_driver);
-+}
-+
-+module_init(xenfb_init);
-+module_exit(xenfb_cleanup);
-+
-+MODULE_LICENSE("GPL");
-Index: head-2008-11-25/drivers/xen/fbfront/xenkbd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/fbfront/xenkbd.c       2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,354 @@
-+/*
-+ * linux/drivers/input/keyboard/xenkbd.c -- Xen para-virtual input device
-+ *
-+ * Copyright (C) 2005 Anthony Liguori <aliguori@us.ibm.com>
-+ * Copyright (C) 2006 Red Hat, Inc., Markus Armbruster <armbru@redhat.com>
-+ *
-+ *  Based on linux/drivers/input/mouse/sermouse.c
-+ *
-+ *  This file is subject to the terms and conditions of the GNU General Public
-+ *  License. See the file COPYING in the main directory of this archive for
-+ *  more details.
-+ */
-+
-+/*
-+ * TODO:
-+ *
-+ * Switch to grant tables together with xenfb.c.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/module.h>
-+#include <linux/input.h>
-+#include <asm/hypervisor.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/io/fbif.h>
-+#include <xen/interface/io/kbdif.h>
-+#include <xen/xenbus.h>
-+
-+struct xenkbd_info
-+{
-+      struct input_dev *kbd;
-+      struct input_dev *ptr;
-+      struct xenkbd_page *page;
-+      int irq;
-+      struct xenbus_device *xbdev;
-+      char phys[32];
-+};
-+
-+static int xenkbd_remove(struct xenbus_device *);
-+static int xenkbd_connect_backend(struct xenbus_device *, struct xenkbd_info *);
-+static void xenkbd_disconnect_backend(struct xenkbd_info *);
-+
-+/*
-+ * Note: if you need to send out events, see xenfb_do_update() for how
-+ * to do that.
-+ */
-+
-+static irqreturn_t input_handler(int rq, void *dev_id, struct pt_regs *regs)
-+{
-+      struct xenkbd_info *info = dev_id;
-+      struct xenkbd_page *page = info->page;
-+      __u32 cons, prod;
-+
-+      prod = page->in_prod;
-+      if (prod == page->in_cons)
-+              return IRQ_HANDLED;
-+      rmb();                  /* ensure we see ring contents up to prod */
-+      for (cons = page->in_cons; cons != prod; cons++) {
-+              union xenkbd_in_event *event;
-+              struct input_dev *dev;
-+              event = &XENKBD_IN_RING_REF(page, cons);
-+
-+              dev = info->ptr;
-+              switch (event->type) {
-+              case XENKBD_TYPE_MOTION:
-+                      if (event->motion.rel_z)
-+                              input_report_rel(dev, REL_WHEEL,
-+                                               -event->motion.rel_z);
-+                      input_report_rel(dev, REL_X, event->motion.rel_x);
-+                      input_report_rel(dev, REL_Y, event->motion.rel_y);
-+                      break;
-+              case XENKBD_TYPE_KEY:
-+                      dev = NULL;
-+                      if (test_bit(event->key.keycode, info->kbd->keybit))
-+                              dev = info->kbd;
-+                      if (test_bit(event->key.keycode, info->ptr->keybit))
-+                              dev = info->ptr;
-+                      if (dev)
-+                              input_report_key(dev, event->key.keycode,
-+                                               event->key.pressed);
-+                      else
-+                              printk("xenkbd: unhandled keycode 0x%x\n",
-+                                     event->key.keycode);
-+                      break;
-+              case XENKBD_TYPE_POS:
-+                      if (event->pos.rel_z)
-+                              input_report_rel(dev, REL_WHEEL,
-+                                               -event->pos.rel_z);
-+                      input_report_abs(dev, ABS_X, event->pos.abs_x);
-+                      input_report_abs(dev, ABS_Y, event->pos.abs_y);
-+                      break;
-+              }
-+              if (dev)
-+                      input_sync(dev);
-+      }
-+      mb();                   /* ensure we got ring contents */
-+      page->in_cons = cons;
-+      notify_remote_via_irq(info->irq);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+int __devinit xenkbd_probe(struct xenbus_device *dev,
-+                         const struct xenbus_device_id *id)
-+{
-+      int ret, i;
-+      struct xenkbd_info *info;
-+      struct input_dev *kbd, *ptr;
-+
-+      info = kzalloc(sizeof(*info), GFP_KERNEL);
-+      if (!info) {
-+              xenbus_dev_fatal(dev, -ENOMEM, "allocating info structure");
-+              return -ENOMEM;
-+      }
-+      dev->dev.driver_data = info;
-+      info->xbdev = dev;
-+      snprintf(info->phys, sizeof(info->phys), "xenbus/%s", dev->nodename);
-+
-+      info->page = (void *)__get_free_page(GFP_KERNEL);
-+      if (!info->page)
-+              goto error_nomem;
-+      info->page->in_cons = info->page->in_prod = 0;
-+      info->page->out_cons = info->page->out_prod = 0;
-+
-+      /* keyboard */
-+      kbd = input_allocate_device();
-+      if (!kbd)
-+              goto error_nomem;
-+      kbd->name = "Xen Virtual Keyboard";
-+      kbd->phys = info->phys;
-+      kbd->id.bustype = BUS_PCI;
-+      kbd->id.vendor = 0x5853;
-+      kbd->id.product = 0xffff;
-+      kbd->evbit[0] = BIT(EV_KEY);
-+      for (i = KEY_ESC; i < KEY_UNKNOWN; i++)
-+              set_bit(i, kbd->keybit);
-+      for (i = KEY_OK; i < KEY_MAX; i++)
-+              set_bit(i, kbd->keybit);
-+
-+      ret = input_register_device(kbd);
-+      if (ret) {
-+              input_free_device(kbd);
-+              xenbus_dev_fatal(dev, ret, "input_register_device(kbd)");
-+              goto error;
-+      }
-+      info->kbd = kbd;
-+
-+      /* pointing device */
-+      ptr = input_allocate_device();
-+      if (!ptr)
-+              goto error_nomem;
-+      ptr->name = "Xen Virtual Pointer";
-+      ptr->phys = info->phys;
-+      ptr->id.bustype = BUS_PCI;
-+      ptr->id.vendor = 0x5853;
-+      ptr->id.product = 0xfffe;
-+      ptr->evbit[0] = BIT(EV_KEY) | BIT(EV_REL) | BIT(EV_ABS);
-+      for (i = BTN_LEFT; i <= BTN_TASK; i++)
-+              set_bit(i, ptr->keybit);
-+      ptr->relbit[0] = BIT(REL_X) | BIT(REL_Y) | BIT(REL_WHEEL);
-+      input_set_abs_params(ptr, ABS_X, 0, XENFB_WIDTH, 0, 0);
-+      input_set_abs_params(ptr, ABS_Y, 0, XENFB_HEIGHT, 0, 0);
-+
-+      ret = input_register_device(ptr);
-+      if (ret) {
-+              input_free_device(ptr);
-+              xenbus_dev_fatal(dev, ret, "input_register_device(ptr)");
-+              goto error;
-+      }
-+      info->ptr = ptr;
-+
-+      ret = xenkbd_connect_backend(dev, info);
-+      if (ret < 0)
-+              goto error;
-+
-+      return 0;
-+
-+ error_nomem:
-+      ret = -ENOMEM;
-+      xenbus_dev_fatal(dev, ret, "allocating device memory");
-+ error:
-+      xenkbd_remove(dev);
-+      return ret;
-+}
-+
-+static int xenkbd_resume(struct xenbus_device *dev)
-+{
-+      struct xenkbd_info *info = dev->dev.driver_data;
-+
-+      xenkbd_disconnect_backend(info);
-+      info->page->in_cons = info->page->in_prod = 0;
-+      info->page->out_cons = info->page->out_prod = 0;
-+      return xenkbd_connect_backend(dev, info);
-+}
-+
-+static int xenkbd_remove(struct xenbus_device *dev)
-+{
-+      struct xenkbd_info *info = dev->dev.driver_data;
-+
-+      xenkbd_disconnect_backend(info);
-+      input_unregister_device(info->kbd);
-+      input_unregister_device(info->ptr);
-+      free_page((unsigned long)info->page);
-+      kfree(info);
-+      return 0;
-+}
-+
-+static int xenkbd_connect_backend(struct xenbus_device *dev,
-+                                struct xenkbd_info *info)
-+{
-+      int ret;
-+      struct xenbus_transaction xbt;
-+
-+      ret = bind_listening_port_to_irqhandler(
-+              dev->otherend_id, input_handler, 0, "xenkbd", info);
-+      if (ret < 0) {
-+              xenbus_dev_fatal(dev, ret,
-+                               "bind_listening_port_to_irqhandler");
-+              return ret;
-+      }
-+      info->irq = ret;
-+
-+ again:
-+      ret = xenbus_transaction_start(&xbt);
-+      if (ret) {
-+              xenbus_dev_fatal(dev, ret, "starting transaction");
-+              return ret;
-+      }
-+      ret = xenbus_printf(xbt, dev->nodename, "page-ref", "%lu",
-+                          virt_to_mfn(info->page));
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-+                          irq_to_evtchn_port(info->irq));
-+      if (ret)
-+              goto error_xenbus;
-+      ret = xenbus_transaction_end(xbt, 0);
-+      if (ret) {
-+              if (ret == -EAGAIN)
-+                      goto again;
-+              xenbus_dev_fatal(dev, ret, "completing transaction");
-+              return ret;
-+      }
-+
-+      xenbus_switch_state(dev, XenbusStateInitialised);
-+      return 0;
-+
-+ error_xenbus:
-+      xenbus_transaction_end(xbt, 1);
-+      xenbus_dev_fatal(dev, ret, "writing xenstore");
-+      return ret;
-+}
-+
-+static void xenkbd_disconnect_backend(struct xenkbd_info *info)
-+{
-+      if (info->irq >= 0)
-+              unbind_from_irqhandler(info->irq, info);
-+      info->irq = -1;
-+}
-+
-+static void xenkbd_backend_changed(struct xenbus_device *dev,
-+                                 enum xenbus_state backend_state)
-+{
-+      struct xenkbd_info *info = dev->dev.driver_data;
-+      int ret, val;
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitialised:
-+      case XenbusStateReconfiguring:
-+      case XenbusStateReconfigured:
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateInitWait:
-+      InitWait:
-+              ret = xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-+                                 "feature-abs-pointer", "%d", &val);
-+              if (ret < 0)
-+                      val = 0;
-+              if (val) {
-+                      ret = xenbus_printf(XBT_NIL, info->xbdev->nodename,
-+                                          "request-abs-pointer", "1");
-+                      if (ret)
-+                              ; /* FIXME */
-+              }
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+              break;
-+
-+      case XenbusStateConnected:
-+              /*
-+               * Work around xenbus race condition: If backend goes
-+               * through InitWait to Connected fast enough, we can
-+               * get Connected twice here.
-+               */
-+              if (dev->state != XenbusStateConnected)
-+                      goto InitWait; /* no InitWait seen yet, fudge it */
-+
-+              /* Set input abs params to match backend screen res */
-+              if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-+                                 "width", "%d", &val) > 0 )
-+                      input_set_abs_params(info->ptr, ABS_X, 0, val, 0, 0);
-+
-+              if (xenbus_scanf(XBT_NIL, info->xbdev->otherend,
-+                                 "height", "%d", &val) > 0 )
-+                      input_set_abs_params(info->ptr, ABS_Y, 0, val, 0, 0);
-+
-+              break;
-+
-+      case XenbusStateClosing:
-+              xenbus_frontend_closed(dev);
-+              break;
-+      }
-+}
-+
-+static const struct xenbus_device_id xenkbd_ids[] = {
-+      { "vkbd" },
-+      { "" }
-+};
-+MODULE_ALIAS("xen:vkbd");
-+
-+static struct xenbus_driver xenkbd_driver = {
-+      .name = "vkbd",
-+      .owner = THIS_MODULE,
-+      .ids = xenkbd_ids,
-+      .probe = xenkbd_probe,
-+      .remove = xenkbd_remove,
-+      .resume = xenkbd_resume,
-+      .otherend_changed = xenkbd_backend_changed,
-+};
-+
-+static int __init xenkbd_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      /* Nothing to do if running in dom0. */
-+      if (is_initial_xendomain())
-+              return -ENODEV;
-+
-+      return xenbus_register_frontend(&xenkbd_driver);
-+}
-+
-+static void __exit xenkbd_cleanup(void)
-+{
-+      return xenbus_unregister_driver(&xenkbd_driver);
-+}
-+
-+module_init(xenkbd_init);
-+module_exit(xenkbd_cleanup);
-+
-+MODULE_LICENSE("GPL");
-Index: head-2008-11-25/drivers/xen/gntdev/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/gntdev/Makefile        2008-01-07 13:19:18.000000000 +0100
-@@ -0,0 +1 @@
-+obj-$(CONFIG_XEN_GRANT_DEV) := gntdev.o
-Index: head-2008-11-25/drivers/xen/gntdev/gntdev.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/gntdev/gntdev.c        2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,1074 @@
-+/******************************************************************************
-+ * gntdev.c
-+ * 
-+ * Device for accessing (in user-space) pages that have been granted by other
-+ * domains.
-+ *
-+ * Copyright (c) 2006-2007, D G Murray.
-+ * 
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ * 
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+ */
-+
-+#include <asm/atomic.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/init.h>
-+#include <linux/fs.h>
-+#include <linux/device.h>
-+#include <linux/mm.h>
-+#include <linux/mman.h>
-+#include <asm/uaccess.h>
-+#include <asm/io.h>
-+#include <xen/gnttab.h>
-+#include <asm/hypervisor.h>
-+#include <xen/balloon.h>
-+#include <xen/evtchn.h>
-+#include <xen/driver_util.h>
-+
-+#include <linux/types.h>
-+#include <xen/public/gntdev.h>
-+
-+
-+#define DRIVER_AUTHOR "Derek G. Murray <Derek.Murray@cl.cam.ac.uk>"
-+#define DRIVER_DESC   "User-space granted page access driver"
-+
-+MODULE_LICENSE("GPL");
-+MODULE_AUTHOR(DRIVER_AUTHOR);
-+MODULE_DESCRIPTION(DRIVER_DESC);
-+
-+#define MAX_GRANTS_LIMIT   1024
-+#define DEFAULT_MAX_GRANTS 128
-+
-+/* A slot can be in one of three states:
-+ *
-+ * 0. GNTDEV_SLOT_INVALID:
-+ *    This slot is not associated with a grant reference, and is therefore free
-+ *    to be overwritten by a new grant reference.
-+ *
-+ * 1. GNTDEV_SLOT_NOT_YET_MAPPED:
-+ *    This slot is associated with a grant reference (via the 
-+ *    IOCTL_GNTDEV_MAP_GRANT_REF ioctl), but it has not yet been mmap()-ed.
-+ *
-+ * 2. GNTDEV_SLOT_MAPPED:
-+ *    This slot is associated with a grant reference, and has been mmap()-ed.
-+ */
-+typedef enum gntdev_slot_state {
-+      GNTDEV_SLOT_INVALID = 0,
-+      GNTDEV_SLOT_NOT_YET_MAPPED,
-+      GNTDEV_SLOT_MAPPED
-+} gntdev_slot_state_t;
-+
-+#define GNTDEV_INVALID_HANDLE    -1
-+#define GNTDEV_FREE_LIST_INVALID -1
-+/* Each opened instance of gntdev is associated with a list of grants,
-+ * represented by an array of elements of the following type,
-+ * gntdev_grant_info_t.
-+ */
-+typedef struct gntdev_grant_info {
-+      gntdev_slot_state_t state;
-+      union {
-+              uint32_t free_list_index;
-+              struct {
-+                      domid_t domid;
-+                      grant_ref_t ref;
-+                      grant_handle_t kernel_handle;
-+                      grant_handle_t user_handle;
-+                      uint64_t dev_bus_addr;
-+              } valid;
-+      } u;
-+} gntdev_grant_info_t;
-+
-+/* Private data structure, which is stored in the file pointer for files
-+ * associated with this device.
-+ */
-+typedef struct gntdev_file_private_data {
-+  
-+      /* Array of grant information. */
-+      gntdev_grant_info_t *grants;
-+      uint32_t grants_size;
-+
-+      /* Read/write semaphore used to protect the grants array. */
-+      struct rw_semaphore grants_sem;
-+
-+      /* An array of indices of free slots in the grants array.
-+       * N.B. An entry in this list may temporarily have the value
-+       * GNTDEV_FREE_LIST_INVALID if the corresponding slot has been removed
-+       * from the list by the contiguous allocator, but the list has not yet
-+       * been compressed. However, this is not visible across invocations of
-+       * the device.
-+       */
-+      int32_t *free_list;
-+      
-+      /* The number of free slots in the grants array. */
-+      uint32_t free_list_size;
-+
-+      /* Read/write semaphore used to protect the free list. */
-+      struct rw_semaphore free_list_sem;
-+      
-+      /* Index of the next slot after the most recent contiguous allocation, 
-+       * for use in a next-fit allocator.
-+       */
-+      uint32_t next_fit_index;
-+
-+      /* Used to map grants into the kernel, before mapping them into user
-+       * space.
-+       */
-+      struct page **foreign_pages;
-+
-+} gntdev_file_private_data_t;
-+
-+/* Module lifecycle operations. */
-+static int __init gntdev_init(void);
-+static void __exit gntdev_exit(void);
-+
-+module_init(gntdev_init);
-+module_exit(gntdev_exit);
-+
-+/* File operations. */
-+static int gntdev_open(struct inode *inode, struct file *flip);
-+static int gntdev_release(struct inode *inode, struct file *flip);
-+static int gntdev_mmap(struct file *flip, struct vm_area_struct *vma);
-+static long gntdev_ioctl(struct file *flip,
-+                       unsigned int cmd, unsigned long arg);
-+
-+static const struct file_operations gntdev_fops = {
-+      .owner = THIS_MODULE,
-+      .open = gntdev_open,
-+      .release = gntdev_release,
-+      .mmap = gntdev_mmap,
-+      .unlocked_ioctl = gntdev_ioctl
-+};
-+
-+/* VM operations. */
-+static void gntdev_vma_close(struct vm_area_struct *vma);
-+static pte_t gntdev_clear_pte(struct vm_area_struct *vma, unsigned long addr,
-+                            pte_t *ptep, int is_fullmm);
-+
-+static struct vm_operations_struct gntdev_vmops = {
-+      .close = gntdev_vma_close,
-+      .zap_pte = gntdev_clear_pte
-+};
-+
-+/* Global variables. */
-+
-+/* The driver major number, for use when unregistering the driver. */
-+static int gntdev_major;
-+
-+#define GNTDEV_NAME "gntdev"
-+
-+/* Memory mapping functions
-+ * ------------------------
-+ *
-+ * Every granted page is mapped into both kernel and user space, and the two
-+ * following functions return the respective virtual addresses of these pages.
-+ *
-+ * When shadow paging is disabled, the granted page is mapped directly into
-+ * user space; when it is enabled, it is mapped into the kernel and remapped
-+ * into user space using vm_insert_page() (see gntdev_mmap(), below).
-+ */
-+
-+/* Returns the virtual address (in user space) of the @page_index'th page
-+ * in the given VM area.
-+ */
-+static inline unsigned long get_user_vaddr (struct vm_area_struct *vma,
-+                                          int page_index)
-+{
-+      return (unsigned long) vma->vm_start + (page_index << PAGE_SHIFT);
-+}
-+
-+/* Returns the virtual address (in kernel space) of the @slot_index'th page
-+ * mapped by the gntdev instance that owns the given private data struct.
-+ */
-+static inline unsigned long get_kernel_vaddr (gntdev_file_private_data_t *priv,
-+                                            int slot_index)
-+{
-+      unsigned long pfn;
-+      void *kaddr;
-+      pfn = page_to_pfn(priv->foreign_pages[slot_index]);
-+      kaddr = pfn_to_kaddr(pfn);
-+      return (unsigned long) kaddr;
-+}
-+
-+/* Helper functions. */
-+
-+/* Adds information about a grant reference to the list of grants in the file's
-+ * private data structure. Returns non-zero on failure. On success, sets the
-+ * value of *offset to the offset that should be mmap()-ed in order to map the
-+ * grant reference.
-+ */
-+static int add_grant_reference(struct file *flip,
-+                             struct ioctl_gntdev_grant_ref *op,
-+                             uint64_t *offset)
-+{
-+      gntdev_file_private_data_t *private_data 
-+              = (gntdev_file_private_data_t *) flip->private_data;
-+
-+      uint32_t slot_index;
-+
-+      if (unlikely(private_data->free_list_size == 0)) {
-+              return -ENOMEM;
-+      }
-+
-+      slot_index = private_data->free_list[--private_data->free_list_size];
-+      private_data->free_list[private_data->free_list_size]
-+              = GNTDEV_FREE_LIST_INVALID;
-+
-+      /* Copy the grant information into file's private data. */
-+      private_data->grants[slot_index].state = GNTDEV_SLOT_NOT_YET_MAPPED;
-+      private_data->grants[slot_index].u.valid.domid = op->domid;
-+      private_data->grants[slot_index].u.valid.ref = op->ref;
-+
-+      /* The offset is calculated as the index of the chosen entry in the
-+       * file's private data's array of grant information. This is then
-+       * shifted to give an offset into the virtual "file address space".
-+       */
-+      *offset = slot_index << PAGE_SHIFT;
-+
-+      return 0;
-+}
-+
-+/* Adds the @count grant references to the contiguous range in the slot array
-+ * beginning at @first_slot. It is assumed that @first_slot was returned by a
-+ * previous invocation of find_contiguous_free_range(), during the same
-+ * invocation of the driver.
-+ */
-+static int add_grant_references(struct file *flip,
-+                              int count,
-+                              struct ioctl_gntdev_grant_ref *ops,
-+                              uint32_t first_slot)
-+{
-+      gntdev_file_private_data_t *private_data 
-+              = (gntdev_file_private_data_t *) flip->private_data;
-+      int i;
-+      
-+      for (i = 0; i < count; ++i) {
-+
-+              /* First, mark the slot's entry in the free list as invalid. */
-+              int free_list_index = 
-+                      private_data->grants[first_slot+i].u.free_list_index;
-+              private_data->free_list[free_list_index] = 
-+                      GNTDEV_FREE_LIST_INVALID;
-+
-+              /* Now, update the slot. */
-+              private_data->grants[first_slot+i].state = 
-+                      GNTDEV_SLOT_NOT_YET_MAPPED;
-+              private_data->grants[first_slot+i].u.valid.domid =
-+                      ops[i].domid;
-+              private_data->grants[first_slot+i].u.valid.ref = ops[i].ref;
-+      }
-+
-+      return 0;       
-+}
-+
-+/* Scans through the free list for @flip, removing entries that are marked as
-+ * GNTDEV_SLOT_INVALID. This will reduce the recorded size of the free list to
-+ * the number of valid entries.
-+ */
-+static void compress_free_list(struct file *flip) 
-+{
-+      gntdev_file_private_data_t *private_data 
-+              = (gntdev_file_private_data_t *) flip->private_data;
-+      int i, j = 0, old_size, slot_index;
-+      
-+      old_size = private_data->free_list_size;
-+      for (i = 0; i < old_size; ++i) {
-+              if (private_data->free_list[i] != GNTDEV_FREE_LIST_INVALID) {
-+                      if (i > j) {
-+                              slot_index = private_data->free_list[i];
-+                              private_data->free_list[j] = slot_index;
-+                              private_data->grants[slot_index].u
-+                                      .free_list_index = j;
-+                              private_data->free_list[i] 
-+                                      = GNTDEV_FREE_LIST_INVALID;
-+                      }
-+                      ++j;
-+              } else {
-+                      --private_data->free_list_size;
-+              }
-+      }
-+}
-+
-+/* Searches the grant array in the private data of @flip for a range of
-+ * @num_slots contiguous slots in the GNTDEV_SLOT_INVALID state.
-+ *
-+ * Returns the index of the first slot if a range is found, otherwise -ENOMEM.
-+ */
-+static int find_contiguous_free_range(struct file *flip,
-+                                    uint32_t num_slots) 
-+{
-+      gntdev_file_private_data_t *private_data 
-+              = (gntdev_file_private_data_t *) flip->private_data;
-+      
-+      int i;
-+      int start_index = private_data->next_fit_index;
-+      int range_start = 0, range_length;
-+
-+      if (private_data->free_list_size < num_slots) {
-+              return -ENOMEM;
-+      }
-+
-+      /* First search from the start_index to the end of the array. */
-+      range_length = 0;
-+      for (i = start_index; i < private_data->grants_size; ++i) {
-+              if (private_data->grants[i].state == GNTDEV_SLOT_INVALID) {
-+                      if (range_length == 0) {
-+                              range_start = i;
-+                      }
-+                      ++range_length;
-+                      if (range_length == num_slots) {
-+                              return range_start;
-+                      }
-+              }
-+      }
-+      
-+      /* Now search from the start of the array to the start_index. */
-+      range_length = 0;
-+      for (i = 0; i < start_index; ++i) {
-+              if (private_data->grants[i].state == GNTDEV_SLOT_INVALID) {
-+                      if (range_length == 0) {
-+                              range_start = i;
-+                      }
-+                      ++range_length;
-+                      if (range_length == num_slots) {
-+                              return range_start;
-+                      }
-+              }
-+      }
-+      
-+      return -ENOMEM;
-+}
-+
-+static int init_private_data(gntdev_file_private_data_t *priv,
-+                           uint32_t max_grants)
-+{
-+      int i;
-+
-+      /* Allocate space for the kernel-mapping of granted pages. */
-+      priv->foreign_pages = 
-+              alloc_empty_pages_and_pagevec(max_grants);
-+      if (!priv->foreign_pages)
-+              goto nomem_out;
-+
-+      /* Allocate the grant list and free-list. */
-+      priv->grants = kmalloc(max_grants * sizeof(gntdev_grant_info_t),
-+                             GFP_KERNEL);
-+      if (!priv->grants)
-+              goto nomem_out2;
-+      priv->free_list = kmalloc(max_grants * sizeof(int32_t), GFP_KERNEL);
-+      if (!priv->free_list)
-+              goto nomem_out3;
-+
-+      /* Initialise the free-list, which contains all slots at first. */
-+      for (i = 0; i < max_grants; ++i) {
-+              priv->free_list[max_grants - i - 1] = i;
-+              priv->grants[i].state = GNTDEV_SLOT_INVALID;
-+              priv->grants[i].u.free_list_index = max_grants - i - 1;
-+      }
-+      priv->grants_size = max_grants;
-+      priv->free_list_size = max_grants;
-+      priv->next_fit_index = 0;
-+
-+      return 0;
-+
-+nomem_out3:
-+      kfree(priv->grants);
-+nomem_out2:
-+      free_empty_pages_and_pagevec(priv->foreign_pages, max_grants);
-+nomem_out:
-+      return -ENOMEM;
-+
-+}
-+
-+/* Interface functions. */
-+
-+/* Initialises the driver. Called when the module is loaded. */
-+static int __init gntdev_init(void)
-+{
-+      struct class *class;
-+      struct class_device *device;
-+
-+      if (!is_running_on_xen()) {
-+              printk(KERN_ERR "You must be running Xen to use gntdev\n");
-+              return -ENODEV;
-+      }
-+
-+      gntdev_major = register_chrdev(0, GNTDEV_NAME, &gntdev_fops);
-+      if (gntdev_major < 0)
-+      {
-+              printk(KERN_ERR "Could not register gntdev device\n");
-+              return -ENOMEM;
-+      }
-+
-+      /* Note that if the sysfs code fails, we will still initialise the
-+       * device, and output the major number so that the device can be
-+       * created manually using mknod.
-+       */
-+      if ((class = get_xen_class()) == NULL) {
-+              printk(KERN_ERR "Error setting up xen_class\n");
-+              printk(KERN_ERR "gntdev created with major number = %d\n", 
-+                     gntdev_major);
-+              return 0;
-+      }
-+
-+      device = class_device_create(class, NULL, MKDEV(gntdev_major, 0),
-+                                   NULL, GNTDEV_NAME);
-+      if (IS_ERR(device)) {
-+              printk(KERN_ERR "Error creating gntdev device in xen_class\n");
-+              printk(KERN_ERR "gntdev created with major number = %d\n",
-+                     gntdev_major);
-+              return 0;
-+      }
-+
-+      return 0;
-+}
-+
-+/* Cleans up and unregisters the driver. Called when the driver is unloaded.
-+ */
-+static void __exit gntdev_exit(void)
-+{
-+      struct class *class;
-+      if ((class = get_xen_class()) != NULL)
-+              class_device_destroy(class, MKDEV(gntdev_major, 0));
-+      unregister_chrdev(gntdev_major, GNTDEV_NAME);
-+}
-+
-+/* Called when the device is opened. */
-+static int gntdev_open(struct inode *inode, struct file *flip)
-+{
-+      gntdev_file_private_data_t *private_data;
-+
-+      try_module_get(THIS_MODULE);
-+
-+      /* Allocate space for the per-instance private data. */
-+      private_data = kmalloc(sizeof(*private_data), GFP_KERNEL);
-+      if (!private_data)
-+              goto nomem_out;
-+
-+      /* These will be lazily initialised by init_private_data. */
-+      private_data->grants = NULL;
-+      private_data->free_list = NULL;
-+      private_data->foreign_pages = NULL;
-+
-+      init_rwsem(&private_data->grants_sem);
-+      init_rwsem(&private_data->free_list_sem);
-+
-+      flip->private_data = private_data;
-+
-+      return 0;
-+
-+nomem_out:
-+      return -ENOMEM;
-+}
-+
-+/* Called when the device is closed.
-+ */
-+static int gntdev_release(struct inode *inode, struct file *flip)
-+{
-+      if (flip->private_data) {
-+              gntdev_file_private_data_t *private_data = 
-+                      (gntdev_file_private_data_t *) flip->private_data;
-+              if (private_data->foreign_pages)
-+                      free_empty_pages_and_pagevec
-+                              (private_data->foreign_pages,
-+                               private_data->grants_size);
-+              if (private_data->grants) 
-+                      kfree(private_data->grants);
-+              if (private_data->free_list)
-+                      kfree(private_data->free_list);
-+              kfree(private_data);
-+      }
-+      module_put(THIS_MODULE);
-+      return 0;
-+}
-+
-+/* Called when an attempt is made to mmap() the device. The private data from
-+ * @flip contains the list of grant references that can be mapped. The vm_pgoff
-+ * field of @vma contains the index into that list that refers to the grant
-+ * reference that will be mapped. Only mappings that are a multiple of
-+ * PAGE_SIZE are handled.
-+ */
-+static int gntdev_mmap (struct file *flip, struct vm_area_struct *vma) 
-+{
-+      struct gnttab_map_grant_ref op;
-+      unsigned long slot_index = vma->vm_pgoff;
-+      unsigned long kernel_vaddr, user_vaddr;
-+      uint32_t size = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-+      uint64_t ptep;
-+      int ret;
-+      int flags;
-+      int i;
-+      struct page *page;
-+      gntdev_file_private_data_t *private_data = flip->private_data;
-+
-+      if (unlikely(!private_data)) {
-+              printk(KERN_ERR "File's private data is NULL.\n");
-+              return -EINVAL;
-+      }
-+
-+      /* Test to make sure that the grants array has been initialised. */
-+      down_read(&private_data->grants_sem);
-+      if (unlikely(!private_data->grants)) {
-+              up_read(&private_data->grants_sem);
-+              printk(KERN_ERR "Attempted to mmap before ioctl.\n");
-+              return -EINVAL;
-+      }
-+      up_read(&private_data->grants_sem);
-+
-+      if (unlikely((size <= 0) || 
-+                   (size + slot_index) > private_data->grants_size)) {
-+              printk(KERN_ERR "Invalid number of pages or offset"
-+                     "(num_pages = %d, first_slot = %ld).\n",
-+                     size, slot_index);
-+              return -ENXIO;
-+      }
-+
-+      if ((vma->vm_flags & VM_WRITE) && !(vma->vm_flags & VM_SHARED)) {
-+              printk(KERN_ERR "Writable mappings must be shared.\n");
-+              return -EINVAL;
-+      }
-+
-+      /* Slots must be in the NOT_YET_MAPPED state. */
-+      down_write(&private_data->grants_sem);
-+      for (i = 0; i < size; ++i) {
-+              if (private_data->grants[slot_index + i].state != 
-+                  GNTDEV_SLOT_NOT_YET_MAPPED) {
-+                      printk(KERN_ERR "Slot (index = %ld) is in the wrong "
-+                             "state (%d).\n", slot_index + i, 
-+                             private_data->grants[slot_index + i].state);
-+                      up_write(&private_data->grants_sem);
-+                      return -EINVAL;
-+              }
-+      }
-+
-+      /* Install the hook for unmapping. */
-+      vma->vm_ops = &gntdev_vmops;
-+    
-+      /* The VM area contains pages from another VM. */
-+      vma->vm_flags |= VM_FOREIGN;
-+      vma->vm_private_data = kzalloc(size * sizeof(struct page *),
-+                                     GFP_KERNEL);
-+      if (vma->vm_private_data == NULL) {
-+              printk(KERN_ERR "Couldn't allocate mapping structure for VM "
-+                     "area.\n");
-+              return -ENOMEM;
-+      }
-+
-+      /* This flag prevents Bad PTE errors when the memory is unmapped. */
-+      vma->vm_flags |= VM_RESERVED;
-+
-+      /* This flag prevents this VM area being copied on a fork(). A better
-+       * behaviour might be to explicitly carry out the appropriate mappings
-+       * on fork(), but I don't know if there's a hook for this.
-+       */
-+      vma->vm_flags |= VM_DONTCOPY;
-+
-+#ifdef CONFIG_X86
-+      /* This flag ensures that the page tables are not unpinned before the
-+       * VM area is unmapped. Therefore Xen still recognises the PTE as
-+       * belonging to an L1 pagetable, and the grant unmap operation will
-+       * succeed, even if the process does not exit cleanly.
-+       */
-+      vma->vm_mm->context.has_foreign_mappings = 1;
-+#endif
-+
-+      for (i = 0; i < size; ++i) {
-+
-+              flags = GNTMAP_host_map;
-+              if (!(vma->vm_flags & VM_WRITE))
-+                      flags |= GNTMAP_readonly;
-+
-+              kernel_vaddr = get_kernel_vaddr(private_data, slot_index + i);
-+              user_vaddr = get_user_vaddr(vma, i);
-+              page = pfn_to_page(__pa(kernel_vaddr) >> PAGE_SHIFT);
-+
-+              gnttab_set_map_op(&op, kernel_vaddr, flags,   
-+                                private_data->grants[slot_index+i]
-+                                .u.valid.ref, 
-+                                private_data->grants[slot_index+i]
-+                                .u.valid.domid);
-+
-+              /* Carry out the mapping of the grant reference. */
-+              ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, 
-+                                              &op, 1);
-+              BUG_ON(ret);
-+              if (op.status) {
-+                      printk(KERN_ERR "Error mapping the grant reference "
-+                             "into the kernel (%d). domid = %d; ref = %d\n",
-+                             op.status,
-+                             private_data->grants[slot_index+i]
-+                             .u.valid.domid,
-+                             private_data->grants[slot_index+i]
-+                             .u.valid.ref);
-+                      goto undo_map_out;
-+              }
-+
-+              /* Store a reference to the page that will be mapped into user
-+               * space.
-+               */
-+              ((struct page **) vma->vm_private_data)[i] = page;
-+
-+              /* Mark mapped page as reserved. */
-+              SetPageReserved(page);
-+
-+              /* Record the grant handle, for use in the unmap operation. */
-+              private_data->grants[slot_index+i].u.valid.kernel_handle = 
-+                      op.handle;
-+              private_data->grants[slot_index+i].u.valid.dev_bus_addr = 
-+                      op.dev_bus_addr;
-+              
-+              private_data->grants[slot_index+i].state = GNTDEV_SLOT_MAPPED;
-+              private_data->grants[slot_index+i].u.valid.user_handle =
-+                      GNTDEV_INVALID_HANDLE;
-+
-+              /* Now perform the mapping to user space. */
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+
-+                      /* NOT USING SHADOW PAGE TABLES. */
-+                      /* In this case, we map the grant(s) straight into user
-+                       * space.
-+                       */
-+
-+                      /* Get the machine address of the PTE for the user 
-+                       *  page.
-+                       */
-+                      if ((ret = create_lookup_pte_addr(vma->vm_mm, 
-+                                                        vma->vm_start 
-+                                                        + (i << PAGE_SHIFT), 
-+                                                        &ptep)))
-+                      {
-+                              printk(KERN_ERR "Error obtaining PTE pointer "
-+                                     "(%d).\n", ret);
-+                              goto undo_map_out;
-+                      }
-+                      
-+                      /* Configure the map operation. */
-+              
-+                      /* The reference is to be used by host CPUs. */
-+                      flags = GNTMAP_host_map;
-+                      
-+                      /* Specifies a user space mapping. */
-+                      flags |= GNTMAP_application_map;
-+                      
-+                      /* The map request contains the machine address of the
-+                       * PTE to update.
-+                       */
-+                      flags |= GNTMAP_contains_pte;
-+                      
-+                      if (!(vma->vm_flags & VM_WRITE))
-+                              flags |= GNTMAP_readonly;
-+
-+                      gnttab_set_map_op(&op, ptep, flags, 
-+                                        private_data->grants[slot_index+i]
-+                                        .u.valid.ref, 
-+                                        private_data->grants[slot_index+i]
-+                                        .u.valid.domid);
-+
-+                      /* Carry out the mapping of the grant reference. */
-+                      ret = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-+                                                      &op, 1);
-+                      BUG_ON(ret);
-+                      if (op.status) {
-+                              printk(KERN_ERR "Error mapping the grant "
-+                                     "reference into user space (%d). domid "
-+                                     "= %d; ref = %d\n", op.status,
-+                                     private_data->grants[slot_index+i].u
-+                                     .valid.domid,
-+                                     private_data->grants[slot_index+i].u
-+                                     .valid.ref);
-+                              goto undo_map_out;
-+                      }
-+                      
-+                      /* Record the grant handle, for use in the unmap 
-+                       * operation. 
-+                       */
-+                      private_data->grants[slot_index+i].u.
-+                              valid.user_handle = op.handle;
-+
-+                      /* Update p2m structure with the new mapping. */
-+                      set_phys_to_machine(__pa(kernel_vaddr) >> PAGE_SHIFT,
-+                                          FOREIGN_FRAME(private_data->
-+                                                        grants[slot_index+i]
-+                                                        .u.valid.dev_bus_addr
-+                                                        >> PAGE_SHIFT));
-+              } else {
-+                      /* USING SHADOW PAGE TABLES. */
-+                      /* In this case, we simply insert the page into the VM
-+                       * area. */
-+                      ret = vm_insert_page(vma, user_vaddr, page);
-+              }
-+
-+      }
-+
-+      up_write(&private_data->grants_sem);
-+      return 0;
-+
-+undo_map_out:
-+      /* If we have a mapping failure, the unmapping will be taken care of
-+       * by do_mmap_pgoff(), which will eventually call gntdev_clear_pte().
-+       * All we need to do here is free the vma_private_data.
-+       */
-+      kfree(vma->vm_private_data);
-+
-+      /* THIS IS VERY UNPLEASANT: do_mmap_pgoff() will set the vma->vm_file
-+       * to NULL on failure. However, we need this in gntdev_clear_pte() to
-+       * unmap the grants. Therefore, we smuggle a reference to the file's
-+       * private data in the VM area's private data pointer.
-+       */
-+      vma->vm_private_data = private_data;
-+      
-+      up_write(&private_data->grants_sem);
-+
-+      return -ENOMEM;
-+}
-+
-+static pte_t gntdev_clear_pte(struct vm_area_struct *vma, unsigned long addr,
-+                            pte_t *ptep, int is_fullmm)
-+{
-+      int slot_index, ret;
-+      pte_t copy;
-+      struct gnttab_unmap_grant_ref op;
-+      gntdev_file_private_data_t *private_data;
-+
-+      /* THIS IS VERY UNPLEASANT: do_mmap_pgoff() will set the vma->vm_file
-+       * to NULL on failure. However, we need this in gntdev_clear_pte() to
-+       * unmap the grants. Therefore, we smuggle a reference to the file's
-+       * private data in the VM area's private data pointer.
-+       */
-+      if (vma->vm_file) {
-+              private_data = (gntdev_file_private_data_t *)
-+                      vma->vm_file->private_data;
-+      } else if (vma->vm_private_data) {
-+              private_data = (gntdev_file_private_data_t *)
-+                      vma->vm_private_data;
-+      } else {
-+              private_data = NULL; /* gcc warning */
-+              BUG();
-+      }
-+
-+      /* Copy the existing value of the PTE for returning. */
-+      copy = *ptep;
-+
-+      /* Calculate the grant relating to this PTE. */
-+      slot_index = vma->vm_pgoff + ((addr - vma->vm_start) >> PAGE_SHIFT);
-+
-+      /* Only unmap grants if the slot has been mapped. This could be being
-+       * called from a failing mmap().
-+       */
-+      if (private_data->grants[slot_index].state == GNTDEV_SLOT_MAPPED) {
-+
-+              /* First, we clear the user space mapping, if it has been made.
-+               */
-+              if (private_data->grants[slot_index].u.valid.user_handle !=
-+                  GNTDEV_INVALID_HANDLE && 
-+                  !xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* NOT USING SHADOW PAGE TABLES. */
-+                      gnttab_set_unmap_op(&op, virt_to_machine(ptep), 
-+                                          GNTMAP_contains_pte,
-+                                          private_data->grants[slot_index]
-+                                          .u.valid.user_handle);
-+                      ret = HYPERVISOR_grant_table_op(
-+                              GNTTABOP_unmap_grant_ref, &op, 1);
-+                      BUG_ON(ret);
-+                      if (op.status)
-+                              printk("User unmap grant status = %d\n", 
-+                                     op.status);
-+              } else {
-+                      /* USING SHADOW PAGE TABLES. */
-+                      pte_clear_full(vma->vm_mm, addr, ptep, is_fullmm);
-+              }
-+
-+              /* Finally, we unmap the grant from kernel space. */
-+              gnttab_set_unmap_op(&op, 
-+                                  get_kernel_vaddr(private_data, slot_index),
-+                                  GNTMAP_host_map, 
-+                                  private_data->grants[slot_index].u.valid
-+                                  .kernel_handle);
-+              ret = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, 
-+                                              &op, 1);
-+              BUG_ON(ret);
-+              if (op.status)
-+                      printk("Kernel unmap grant status = %d\n", op.status);
-+
-+
-+              /* Return slot to the not-yet-mapped state, so that it may be
-+               * mapped again, or removed by a subsequent ioctl.
-+               */
-+              private_data->grants[slot_index].state = 
-+                      GNTDEV_SLOT_NOT_YET_MAPPED;
-+
-+              /* Invalidate the physical to machine mapping for this page. */
-+              set_phys_to_machine(__pa(get_kernel_vaddr(private_data, 
-+                                                        slot_index)) 
-+                                  >> PAGE_SHIFT, INVALID_P2M_ENTRY);
-+
-+      } else {
-+              pte_clear_full(vma->vm_mm, addr, ptep, is_fullmm);
-+      }
-+
-+      return copy;
-+}
-+
-+/* "Destructor" for a VM area.
-+ */
-+static void gntdev_vma_close(struct vm_area_struct *vma) {
-+      if (vma->vm_private_data) {
-+              kfree(vma->vm_private_data);
-+      }
-+}
-+
-+/* Called when an ioctl is made on the device.
-+ */
-+static long gntdev_ioctl(struct file *flip,
-+                       unsigned int cmd, unsigned long arg)
-+{
-+      int rc = 0;
-+      gntdev_file_private_data_t *private_data = 
-+              (gntdev_file_private_data_t *) flip->private_data;
-+
-+      /* On the first invocation, we will lazily initialise the grant array
-+       * and free-list.
-+       */
-+      if (unlikely(!private_data->grants) 
-+          && likely(cmd != IOCTL_GNTDEV_SET_MAX_GRANTS)) {
-+              down_write(&private_data->grants_sem);
-+              
-+              if (unlikely(private_data->grants)) {
-+                      up_write(&private_data->grants_sem);
-+                      goto private_data_initialised;
-+              }
-+              
-+              /* Just use the default. Setting to a non-default is handled
-+               * in the ioctl switch.
-+               */
-+              rc = init_private_data(private_data, DEFAULT_MAX_GRANTS);
-+              
-+              up_write(&private_data->grants_sem);
-+
-+              if (rc) {
-+                      printk (KERN_ERR "Initialising gntdev private data "
-+                              "failed.\n");
-+                      return rc;
-+              }
-+      }
-+          
-+private_data_initialised:
-+      switch (cmd) {
-+      case IOCTL_GNTDEV_MAP_GRANT_REF:
-+      {
-+              struct ioctl_gntdev_map_grant_ref op;
-+              down_write(&private_data->grants_sem);
-+              down_write(&private_data->free_list_sem);
-+
-+              if ((rc = copy_from_user(&op, (void __user *) arg, 
-+                                       sizeof(op)))) {
-+                      rc = -EFAULT;
-+                      goto map_out;
-+              }
-+              if (unlikely(op.count <= 0)) {
-+                      rc = -EINVAL;
-+                      goto map_out;
-+              }
-+
-+              if (op.count == 1) {
-+                      if ((rc = add_grant_reference(flip, &op.refs[0],
-+                                                    &op.index)) < 0) {
-+                              printk(KERN_ERR "Adding grant reference "
-+                                     "failed (%d).\n", rc);
-+                              goto map_out;
-+                      }
-+              } else {
-+                      struct ioctl_gntdev_grant_ref *refs, *u;
-+                      refs = kmalloc(op.count * sizeof(*refs), GFP_KERNEL);
-+                      if (!refs) {
-+                              rc = -ENOMEM;
-+                              goto map_out;
-+                      }
-+                      u = ((struct ioctl_gntdev_map_grant_ref *)arg)->refs;
-+                      if ((rc = copy_from_user(refs,
-+                                               (void __user *)u,
-+                                               sizeof(*refs) * op.count))) {
-+                              printk(KERN_ERR "Copying refs from user failed"
-+                                     " (%d).\n", rc);
-+                              rc = -EINVAL;
-+                              goto map_out;
-+                      }
-+                      if ((rc = find_contiguous_free_range(flip, op.count))
-+                          < 0) {
-+                              printk(KERN_ERR "Finding contiguous range "
-+                                     "failed (%d).\n", rc);
-+                              kfree(refs);
-+                              goto map_out;
-+                      }
-+                      op.index = rc << PAGE_SHIFT;
-+                      if ((rc = add_grant_references(flip, op.count,
-+                                                     refs, rc))) {
-+                              printk(KERN_ERR "Adding grant references "
-+                                     "failed (%d).\n", rc);
-+                              kfree(refs);
-+                              goto map_out;
-+                      }
-+                      compress_free_list(flip);
-+                      kfree(refs);
-+              }
-+              if ((rc = copy_to_user((void __user *) arg, 
-+                                     &op, 
-+                                     sizeof(op)))) {
-+                      printk(KERN_ERR "Copying result back to user failed "
-+                             "(%d)\n", rc);
-+                      rc = -EFAULT;
-+                      goto map_out;
-+              }
-+      map_out:
-+              up_write(&private_data->grants_sem);
-+              up_write(&private_data->free_list_sem);
-+              return rc;
-+      }
-+      case IOCTL_GNTDEV_UNMAP_GRANT_REF:
-+      {
-+              struct ioctl_gntdev_unmap_grant_ref op;
-+              int i, start_index;
-+
-+              down_write(&private_data->grants_sem);
-+              down_write(&private_data->free_list_sem);
-+
-+              if ((rc = copy_from_user(&op, 
-+                                       (void __user *) arg, 
-+                                       sizeof(op)))) {
-+                      rc = -EFAULT;
-+                      goto unmap_out;
-+              }
-+
-+              start_index = op.index >> PAGE_SHIFT;
-+
-+              /* First, check that all pages are in the NOT_YET_MAPPED
-+               * state.
-+               */
-+              for (i = 0; i < op.count; ++i) {
-+                      if (unlikely
-+                          (private_data->grants[start_index + i].state
-+                           != GNTDEV_SLOT_NOT_YET_MAPPED)) {
-+                              if (private_data->grants[start_index + i].state
-+                                  == GNTDEV_SLOT_INVALID) {
-+                                      printk(KERN_ERR
-+                                             "Tried to remove an invalid "
-+                                             "grant at offset 0x%x.",
-+                                             (start_index + i) 
-+                                             << PAGE_SHIFT);
-+                                      rc = -EINVAL;
-+                              } else {
-+                                      printk(KERN_ERR
-+                                             "Tried to remove a grant which "
-+                                             "is currently mmap()-ed at "
-+                                             "offset 0x%x.",
-+                                             (start_index + i) 
-+                                             << PAGE_SHIFT);
-+                                      rc = -EBUSY;
-+                              }
-+                              goto unmap_out;
-+                      }
-+              }
-+
-+              /* Unmap pages and add them to the free list.
-+               */
-+              for (i = 0; i < op.count; ++i) {
-+                      private_data->grants[start_index+i].state = 
-+                              GNTDEV_SLOT_INVALID;
-+                      private_data->grants[start_index+i].u.free_list_index =
-+                              private_data->free_list_size;
-+                      private_data->free_list[private_data->free_list_size] =
-+                              start_index + i;
-+                      ++private_data->free_list_size;
-+              }
-+
-+      unmap_out:
-+              up_write(&private_data->grants_sem);
-+              up_write(&private_data->free_list_sem);
-+              return rc;
-+      }
-+      case IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR:
-+      {
-+              struct ioctl_gntdev_get_offset_for_vaddr op;
-+              struct vm_area_struct *vma;
-+              unsigned long vaddr;
-+
-+              if ((rc = copy_from_user(&op, 
-+                                       (void __user *) arg, 
-+                                       sizeof(op)))) {
-+                      rc = -EFAULT;
-+                      goto get_offset_out;
-+              }
-+              vaddr = (unsigned long)op.vaddr;
-+
-+              down_read(&current->mm->mmap_sem);              
-+              vma = find_vma(current->mm, vaddr);
-+              if (vma == NULL) {
-+                      rc = -EFAULT;
-+                      goto get_offset_unlock_out;
-+              }
-+              if ((!vma->vm_ops) || (vma->vm_ops != &gntdev_vmops)) {
-+                      printk(KERN_ERR "The vaddr specified does not belong "
-+                             "to a gntdev instance: %#lx\n", vaddr);
-+                      rc = -EFAULT;
-+                      goto get_offset_unlock_out;
-+              }
-+              if (vma->vm_start != vaddr) {
-+                      printk(KERN_ERR "The vaddr specified in an "
-+                             "IOCTL_GNTDEV_GET_OFFSET_FOR_VADDR must be at "
-+                             "the start of the VM area. vma->vm_start = "
-+                             "%#lx; vaddr = %#lx\n",
-+                             vma->vm_start, vaddr);
-+                      rc = -EFAULT;
-+                      goto get_offset_unlock_out;
-+              }
-+              op.offset = vma->vm_pgoff << PAGE_SHIFT;
-+              op.count = (vma->vm_end - vma->vm_start) >> PAGE_SHIFT;
-+              up_read(&current->mm->mmap_sem);
-+              if ((rc = copy_to_user((void __user *) arg, 
-+                                     &op, 
-+                                     sizeof(op)))) {
-+                      rc = -EFAULT;
-+                      goto get_offset_out;
-+              }
-+              goto get_offset_out;
-+      get_offset_unlock_out:
-+              up_read(&current->mm->mmap_sem);
-+      get_offset_out:
-+              return rc;
-+      }
-+      case IOCTL_GNTDEV_SET_MAX_GRANTS:
-+      {
-+              struct ioctl_gntdev_set_max_grants op;
-+              if ((rc = copy_from_user(&op, 
-+                                       (void __user *) arg, 
-+                                       sizeof(op)))) {
-+                      rc = -EFAULT;
-+                      goto set_max_out;
-+              }
-+              down_write(&private_data->grants_sem);
-+              if (private_data->grants) {
-+                      rc = -EBUSY;
-+                      goto set_max_unlock_out;
-+              }
-+              if (op.count > MAX_GRANTS_LIMIT) {
-+                      rc = -EINVAL;
-+                      goto set_max_unlock_out;
-+              }                                                
-+              rc = init_private_data(private_data, op.count);
-+      set_max_unlock_out:
-+              up_write(&private_data->grants_sem);
-+      set_max_out:
-+              return rc;
-+      }
-+      default:
-+              return -ENOIOCTLCMD;
-+      }
-+
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/netback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/Makefile       2007-07-12 08:54:23.000000000 +0200
-@@ -0,0 +1,5 @@
-+obj-$(CONFIG_XEN_NETDEV_BACKEND) := netbk.o
-+obj-$(CONFIG_XEN_NETDEV_LOOPBACK) += netloop.o
-+
-+netbk-y   := netback.o xenbus.o interface.o accel.o
-+netloop-y := loopback.o
-Index: head-2008-11-25/drivers/xen/netback/accel.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/accel.c        2008-01-07 13:19:18.000000000 +0100
-@@ -0,0 +1,269 @@
-+/******************************************************************************
-+ * drivers/xen/netback/accel.c
-+ *
-+ * Interface between backend virtual network device and accelerated plugin. 
-+ * 
-+ * Copyright (C) 2007 Solarflare Communications, Inc
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/list.h>
-+#include <asm/atomic.h>
-+#include <xen/xenbus.h>
-+#include <linux/mutex.h>
-+
-+#include "common.h"
-+
-+#if 0
-+#undef DPRINTK
-+#define DPRINTK(fmt, args...)                                         \
-+      printk("netback/accel (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
-+#endif
-+
-+/* 
-+ * A list of available netback accelerator plugin modules (each list
-+ * entry is of type struct netback_accelerator) 
-+ */ 
-+static struct list_head accelerators_list;
-+/* Lock used to protect access to accelerators_list */
-+DEFINE_MUTEX(accelerators_mutex);
-+
-+/* 
-+ * Compare a backend to an accelerator, and decide if they are
-+ * compatible (i.e. if the accelerator should be used by the
-+ * backend) 
-+ */
-+static int match_accelerator(struct xenbus_device *xendev,
-+                           struct backend_info *be, 
-+                           struct netback_accelerator *accelerator)
-+{
-+      int rc = 0;
-+      char *eth_name = xenbus_read(XBT_NIL, xendev->nodename, "accel", NULL);
-+      
-+      if (IS_ERR(eth_name)) {
-+              /* Probably means not present */
-+              DPRINTK("%s: no match due to xenbus_read accel error %d\n", 
-+                      __FUNCTION__, PTR_ERR(eth_name));
-+              return 0;
-+      } else {
-+              if (!strcmp(eth_name, accelerator->eth_name))
-+                      rc = 1;
-+              kfree(eth_name);
-+              return rc;
-+      }
-+}
-+
-+
-+static void do_probe(struct backend_info *be, 
-+                   struct netback_accelerator *accelerator,
-+                   struct xenbus_device *xendev) 
-+{
-+      be->accelerator = accelerator;
-+      atomic_inc(&be->accelerator->use_count);
-+      if (be->accelerator->hooks->probe(xendev) != 0) {
-+              atomic_dec(&be->accelerator->use_count);
-+              module_put(be->accelerator->hooks->owner);
-+              be->accelerator = NULL;
-+      }
-+}
-+
-+
-+/*
-+ * Notify suitable backends that a new accelerator is available and
-+ * connected.  This will also notify the accelerator plugin module
-+ * that it is being used for a device through the probe hook.
-+ */
-+static int netback_accelerator_probe_backend(struct device *dev, void *arg)
-+{
-+      struct netback_accelerator *accelerator = 
-+              (struct netback_accelerator *)arg;
-+      struct xenbus_device *xendev = to_xenbus_device(dev);
-+
-+      if (!strcmp("vif", xendev->devicetype)) {
-+              struct backend_info *be = xendev->dev.driver_data;
-+
-+              if (match_accelerator(xendev, be, accelerator) &&
-+                  try_module_get(accelerator->hooks->owner)) {
-+                      do_probe(be, accelerator, xendev);
-+              }
-+      }
-+      return 0;
-+}
-+
-+
-+/*
-+ * Notify suitable backends that an accelerator is unavailable.
-+ */
-+static int netback_accelerator_remove_backend(struct device *dev, void *arg)
-+{
-+      struct xenbus_device *xendev = to_xenbus_device(dev);
-+      struct netback_accelerator *accelerator = 
-+              (struct netback_accelerator *)arg;
-+      
-+      if (!strcmp("vif", xendev->devicetype)) {
-+              struct backend_info *be = xendev->dev.driver_data;
-+
-+              if (be->accelerator == accelerator) {
-+                      be->accelerator->hooks->remove(xendev);
-+                      atomic_dec(&be->accelerator->use_count);
-+                      module_put(be->accelerator->hooks->owner);
-+                      be->accelerator = NULL;
-+              }
-+      }
-+      return 0;
-+}
-+
-+
-+
-+/*
-+ * Entry point for an netback accelerator plugin module.  Called to
-+ * advertise its presence, and connect to any suitable backends.
-+ */
-+int netback_connect_accelerator(unsigned version, int id, const char *eth_name, 
-+                              struct netback_accel_hooks *hooks)
-+{
-+      struct netback_accelerator *new_accelerator;
-+      unsigned eth_name_len;
-+
-+      if (version != NETBACK_ACCEL_VERSION) {
-+              if (version > NETBACK_ACCEL_VERSION) {
-+                      /* Caller has higher version number, leave it
-+                         up to them to decide whether to continue.
-+                         They can recall with a lower number if
-+                         they're happy to be compatible with us */
-+                      return NETBACK_ACCEL_VERSION;
-+              } else {
-+                      /* We have a more recent version than caller.
-+                         Currently reject, but may in future be able
-+                         to be backwardly compatible */
-+                      return -EPROTO;
-+              }
-+      }
-+
-+      new_accelerator = 
-+              kmalloc(sizeof(struct netback_accelerator), GFP_KERNEL);
-+      if (!new_accelerator) {
-+              DPRINTK("%s: failed to allocate memory for accelerator\n",
-+                      __FUNCTION__);
-+              return -ENOMEM;
-+      }
-+
-+      new_accelerator->id = id;
-+      
-+      eth_name_len = strlen(eth_name)+1;
-+      new_accelerator->eth_name = kmalloc(eth_name_len, GFP_KERNEL);
-+      if (!new_accelerator->eth_name) {
-+              DPRINTK("%s: failed to allocate memory for eth_name string\n",
-+                      __FUNCTION__);
-+              kfree(new_accelerator);
-+              return -ENOMEM;
-+      }
-+      strlcpy(new_accelerator->eth_name, eth_name, eth_name_len);
-+      
-+      new_accelerator->hooks = hooks;
-+
-+      atomic_set(&new_accelerator->use_count, 0);
-+      
-+      mutex_lock(&accelerators_mutex);
-+      list_add(&new_accelerator->link, &accelerators_list);
-+      
-+      /* tell existing backends about new plugin */
-+      xenbus_for_each_backend(new_accelerator, 
-+                              netback_accelerator_probe_backend);
-+
-+      mutex_unlock(&accelerators_mutex);
-+
-+      return 0;
-+
-+}
-+EXPORT_SYMBOL_GPL(netback_connect_accelerator);
-+
-+
-+/* 
-+ * Disconnect an accelerator plugin module that has previously been
-+ * connected.
-+ */
-+void netback_disconnect_accelerator(int id, const char *eth_name)
-+{
-+      struct netback_accelerator *accelerator, *next;
-+
-+      mutex_lock(&accelerators_mutex);
-+      list_for_each_entry_safe(accelerator, next, &accelerators_list, link) {
-+              if (!strcmp(eth_name, accelerator->eth_name)) {
-+                      xenbus_for_each_backend
-+                              (accelerator, netback_accelerator_remove_backend);
-+                      BUG_ON(atomic_read(&accelerator->use_count) != 0);
-+                      list_del(&accelerator->link);                           
-+                      kfree(accelerator->eth_name);
-+                      kfree(accelerator);
-+                      break;
-+              }
-+      }
-+      mutex_unlock(&accelerators_mutex);
-+}
-+EXPORT_SYMBOL_GPL(netback_disconnect_accelerator);
-+
-+
-+void netback_probe_accelerators(struct backend_info *be,
-+                              struct xenbus_device *dev)
-+{
-+      struct netback_accelerator *accelerator;
-+
-+      /* 
-+       * Check list of accelerators to see if any is suitable, and
-+       * use it if it is.
-+       */
-+      mutex_lock(&accelerators_mutex);
-+      list_for_each_entry(accelerator, &accelerators_list, link) { 
-+              if (match_accelerator(dev, be, accelerator) &&
-+                  try_module_get(accelerator->hooks->owner)) {
-+                      do_probe(be, accelerator, dev);
-+                      break;
-+              }
-+      }
-+      mutex_unlock(&accelerators_mutex);
-+}
-+
-+
-+void netback_remove_accelerators(struct backend_info *be,
-+                               struct xenbus_device *dev)
-+{
-+      mutex_lock(&accelerators_mutex);
-+      /* Notify the accelerator (if any) of this device's removal */
-+      if (be->accelerator != NULL) {
-+              be->accelerator->hooks->remove(dev);
-+              atomic_dec(&be->accelerator->use_count);
-+              module_put(be->accelerator->hooks->owner);
-+              be->accelerator = NULL;
-+      }
-+      mutex_unlock(&accelerators_mutex);
-+}
-+
-+
-+void netif_accel_init(void)
-+{
-+      INIT_LIST_HEAD(&accelerators_list);
-+}
-Index: head-2008-11-25/drivers/xen/netback/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/common.h       2008-01-07 13:19:18.000000000 +0100
-@@ -0,0 +1,217 @@
-+/******************************************************************************
-+ * arch/xen/drivers/netif/backend/common.h
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __NETIF__BACKEND__COMMON_H__
-+#define __NETIF__BACKEND__COMMON_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+#include <linux/ip.h>
-+#include <linux/in.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/wait.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/io/netif.h>
-+#include <asm/io.h>
-+#include <asm/pgalloc.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/gnttab.h>
-+#include <xen/driver_util.h>
-+#include <xen/xenbus.h>
-+
-+#define DPRINTK(_f, _a...)                    \
-+      pr_debug("(file=%s, line=%d) " _f,      \
-+               __FILE__ , __LINE__ , ## _a )
-+#define IPRINTK(fmt, args...)                         \
-+      printk(KERN_INFO "xen_net: " fmt, ##args)
-+#define WPRINTK(fmt, args...)                         \
-+      printk(KERN_WARNING "xen_net: " fmt, ##args)
-+
-+typedef struct netif_st {
-+      /* Unique identifier for this interface. */
-+      domid_t          domid;
-+      unsigned int     handle;
-+
-+      u8               fe_dev_addr[6];
-+
-+      /* Physical parameters of the comms window. */
-+      grant_handle_t   tx_shmem_handle;
-+      grant_ref_t      tx_shmem_ref;
-+      grant_handle_t   rx_shmem_handle;
-+      grant_ref_t      rx_shmem_ref;
-+      unsigned int     irq;
-+
-+      /* The shared rings and indexes. */
-+      netif_tx_back_ring_t tx;
-+      netif_rx_back_ring_t rx;
-+      struct vm_struct *tx_comms_area;
-+      struct vm_struct *rx_comms_area;
-+
-+      /* Set of features that can be turned on in dev->features. */
-+      int features;
-+
-+      /* Internal feature information. */
-+      u8 can_queue:1; /* can queue packets for receiver? */
-+      u8 copying_receiver:1;  /* copy packets to receiver?       */
-+
-+      /* Allow netif_be_start_xmit() to peek ahead in the rx request ring. */
-+      RING_IDX rx_req_cons_peek;
-+
-+      /* Transmit shaping: allow 'credit_bytes' every 'credit_usec'. */
-+      unsigned long   credit_bytes;
-+      unsigned long   credit_usec;
-+      unsigned long   remaining_credit;
-+      struct timer_list credit_timeout;
-+
-+      /* Enforce draining of the transmit queue. */
-+      struct timer_list tx_queue_timeout;
-+
-+      /* Miscellaneous private stuff. */
-+      struct list_head list;  /* scheduling list */
-+      atomic_t         refcnt;
-+      struct net_device *dev;
-+      struct net_device_stats stats;
-+
-+      unsigned int carrier;
-+
-+      wait_queue_head_t waiting_to_free;
-+} netif_t;
-+
-+/*
-+ * Implement our own carrier flag: the network stack's version causes delays
-+ * when the carrier is re-enabled (in particular, dev_activate() may not
-+ * immediately be called, which can cause packet loss; also the etherbridge
-+ * can be rather lazy in activating its port).
-+ */
-+#define netback_carrier_on(netif)     ((netif)->carrier = 1)
-+#define netback_carrier_off(netif)    ((netif)->carrier = 0)
-+#define netback_carrier_ok(netif)     ((netif)->carrier)
-+
-+enum {
-+      NETBK_DONT_COPY_SKB,
-+      NETBK_DELAYED_COPY_SKB,
-+      NETBK_ALWAYS_COPY_SKB,
-+};
-+
-+extern int netbk_copy_skb_mode;
-+
-+/* Function pointers into netback accelerator plugin modules */
-+struct netback_accel_hooks {
-+      struct module *owner;
-+      int  (*probe)(struct xenbus_device *dev);
-+      int (*remove)(struct xenbus_device *dev);
-+};
-+
-+/* Structure to track the state of a netback accelerator plugin */
-+struct netback_accelerator {
-+      struct list_head link;
-+      int id;
-+      char *eth_name;
-+      atomic_t use_count;
-+      struct netback_accel_hooks *hooks;
-+};
-+
-+struct backend_info {
-+      struct xenbus_device *dev;
-+      netif_t *netif;
-+      enum xenbus_state frontend_state;
-+
-+      /* State relating to the netback accelerator */
-+      void *netback_accel_priv;
-+      /* The accelerator that this backend is currently using */
-+      struct netback_accelerator *accelerator;
-+};
-+
-+#define NETBACK_ACCEL_VERSION 0x00010001
-+
-+/* 
-+ * Connect an accelerator plugin module to netback.  Returns zero on
-+ * success, < 0 on error, > 0 (with highest version number supported)
-+ * if version mismatch.
-+ */
-+extern int netback_connect_accelerator(unsigned version,
-+                                     int id, const char *eth_name, 
-+                                     struct netback_accel_hooks *hooks);
-+/* Disconnect a previously connected accelerator plugin module */
-+extern void netback_disconnect_accelerator(int id, const char *eth_name);
-+
-+
-+extern
-+void netback_probe_accelerators(struct backend_info *be,
-+                              struct xenbus_device *dev);
-+extern
-+void netback_remove_accelerators(struct backend_info *be,
-+                               struct xenbus_device *dev);
-+extern
-+void netif_accel_init(void);
-+
-+
-+#define NET_TX_RING_SIZE __RING_SIZE((netif_tx_sring_t *)0, PAGE_SIZE)
-+#define NET_RX_RING_SIZE __RING_SIZE((netif_rx_sring_t *)0, PAGE_SIZE)
-+
-+void netif_disconnect(netif_t *netif);
-+
-+netif_t *netif_alloc(domid_t domid, unsigned int handle);
-+int netif_map(netif_t *netif, unsigned long tx_ring_ref,
-+            unsigned long rx_ring_ref, unsigned int evtchn);
-+
-+#define netif_get(_b) (atomic_inc(&(_b)->refcnt))
-+#define netif_put(_b)                                         \
-+      do {                                                    \
-+              if ( atomic_dec_and_test(&(_b)->refcnt) )       \
-+                      wake_up(&(_b)->waiting_to_free);        \
-+      } while (0)
-+
-+void netif_xenbus_init(void);
-+
-+#define netif_schedulable(netif)                              \
-+      (netif_running((netif)->dev) && netback_carrier_ok(netif))
-+
-+void netif_schedule_work(netif_t *netif);
-+void netif_deschedule_work(netif_t *netif);
-+
-+int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev);
-+struct net_device_stats *netif_be_get_stats(struct net_device *dev);
-+irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-+
-+static inline int netbk_can_queue(struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+      return netif->can_queue;
-+}
-+
-+static inline int netbk_can_sg(struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+      return netif->features & NETIF_F_SG;
-+}
-+
-+#endif /* __NETIF__BACKEND__COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/netback/interface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/interface.c    2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,336 @@
-+/******************************************************************************
-+ * arch/xen/drivers/netif/backend/interface.c
-+ * 
-+ * Network-device interface management.
-+ * 
-+ * Copyright (c) 2004-2005, Keir Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include "common.h"
-+#include <linux/ethtool.h>
-+#include <linux/rtnetlink.h>
-+
-+/*
-+ * Module parameter 'queue_length':
-+ * 
-+ * Enables queuing in the network stack when a client has run out of receive
-+ * descriptors. Although this feature can improve receive bandwidth by avoiding
-+ * packet loss, it can also result in packets sitting in the 'tx_queue' for
-+ * unbounded time. This is bad if those packets hold onto foreign resources.
-+ * For example, consider a packet that holds onto resources belonging to the
-+ * guest for which it is queued (e.g., packet received on vif1.0, destined for
-+ * vif1.1 which is not activated in the guest): in this situation the guest
-+ * will never be destroyed, unless vif1.1 is taken down. To avoid this, we
-+ * run a timer (tx_queue_timeout) to drain the queue when the interface is
-+ * blocked.
-+ */
-+static unsigned long netbk_queue_length = 32;
-+module_param_named(queue_length, netbk_queue_length, ulong, 0);
-+
-+static void __netif_up(netif_t *netif)
-+{
-+      enable_irq(netif->irq);
-+      netif_schedule_work(netif);
-+}
-+
-+static void __netif_down(netif_t *netif)
-+{
-+      disable_irq(netif->irq);
-+      netif_deschedule_work(netif);
-+}
-+
-+static int net_open(struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+      if (netback_carrier_ok(netif)) {
-+              __netif_up(netif);
-+              netif_start_queue(dev);
-+      }
-+      return 0;
-+}
-+
-+static int net_close(struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+      if (netback_carrier_ok(netif))
-+              __netif_down(netif);
-+      netif_stop_queue(dev);
-+      return 0;
-+}
-+
-+static int netbk_change_mtu(struct net_device *dev, int mtu)
-+{
-+      int max = netbk_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
-+
-+      if (mtu > max)
-+              return -EINVAL;
-+      dev->mtu = mtu;
-+      return 0;
-+}
-+
-+static int netbk_set_sg(struct net_device *dev, u32 data)
-+{
-+      if (data) {
-+              netif_t *netif = netdev_priv(dev);
-+
-+              if (!(netif->features & NETIF_F_SG))
-+                      return -ENOSYS;
-+      }
-+
-+      return ethtool_op_set_sg(dev, data);
-+}
-+
-+static int netbk_set_tso(struct net_device *dev, u32 data)
-+{
-+      if (data) {
-+              netif_t *netif = netdev_priv(dev);
-+
-+              if (!(netif->features & NETIF_F_TSO))
-+                      return -ENOSYS;
-+      }
-+
-+      return ethtool_op_set_tso(dev, data);
-+}
-+
-+static struct ethtool_ops network_ethtool_ops =
-+{
-+      .get_tx_csum = ethtool_op_get_tx_csum,
-+      .set_tx_csum = ethtool_op_set_tx_csum,
-+      .get_sg = ethtool_op_get_sg,
-+      .set_sg = netbk_set_sg,
-+      .get_tso = ethtool_op_get_tso,
-+      .set_tso = netbk_set_tso,
-+      .get_link = ethtool_op_get_link,
-+};
-+
-+netif_t *netif_alloc(domid_t domid, unsigned int handle)
-+{
-+      int err = 0;
-+      struct net_device *dev;
-+      netif_t *netif;
-+      char name[IFNAMSIZ] = {};
-+
-+      snprintf(name, IFNAMSIZ - 1, "vif%u.%u", domid, handle);
-+      dev = alloc_netdev(sizeof(netif_t), name, ether_setup);
-+      if (dev == NULL) {
-+              DPRINTK("Could not create netif: out of memory\n");
-+              return ERR_PTR(-ENOMEM);
-+      }
-+
-+      netif = netdev_priv(dev);
-+      memset(netif, 0, sizeof(*netif));
-+      netif->domid  = domid;
-+      netif->handle = handle;
-+      atomic_set(&netif->refcnt, 1);
-+      init_waitqueue_head(&netif->waiting_to_free);
-+      netif->dev = dev;
-+
-+      netback_carrier_off(netif);
-+
-+      netif->credit_bytes = netif->remaining_credit = ~0UL;
-+      netif->credit_usec  = 0UL;
-+      init_timer(&netif->credit_timeout);
-+      /* Initialize 'expires' now: it's used to track the credit window. */
-+      netif->credit_timeout.expires = jiffies;
-+
-+      init_timer(&netif->tx_queue_timeout);
-+
-+      dev->hard_start_xmit = netif_be_start_xmit;
-+      dev->get_stats       = netif_be_get_stats;
-+      dev->open            = net_open;
-+      dev->stop            = net_close;
-+      dev->change_mtu      = netbk_change_mtu;
-+      dev->features        = NETIF_F_IP_CSUM;
-+
-+      SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
-+
-+      dev->tx_queue_len = netbk_queue_length;
-+
-+      /*
-+       * Initialise a dummy MAC address. We choose the numerically
-+       * largest non-broadcast address to prevent the address getting
-+       * stolen by an Ethernet bridge for STP purposes.
-+       * (FE:FF:FF:FF:FF:FF)
-+       */ 
-+      memset(dev->dev_addr, 0xFF, ETH_ALEN);
-+      dev->dev_addr[0] &= ~0x01;
-+
-+      rtnl_lock();
-+      err = register_netdevice(dev);
-+      rtnl_unlock();
-+      if (err) {
-+              DPRINTK("Could not register new net device %s: err=%d\n",
-+                      dev->name, err);
-+              free_netdev(dev);
-+              return ERR_PTR(err);
-+      }
-+
-+      DPRINTK("Successfully created netif\n");
-+      return netif;
-+}
-+
-+static int map_frontend_pages(
-+      netif_t *netif, grant_ref_t tx_ring_ref, grant_ref_t rx_ring_ref)
-+{
-+      struct gnttab_map_grant_ref op;
-+
-+      gnttab_set_map_op(&op, (unsigned long)netif->tx_comms_area->addr,
-+                        GNTMAP_host_map, tx_ring_ref, netif->domid);
-+    
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status) { 
-+              DPRINTK(" Gnttab failure mapping tx_ring_ref!\n");
-+              return op.status;
-+      }
-+
-+      netif->tx_shmem_ref    = tx_ring_ref;
-+      netif->tx_shmem_handle = op.handle;
-+
-+      gnttab_set_map_op(&op, (unsigned long)netif->rx_comms_area->addr,
-+                        GNTMAP_host_map, rx_ring_ref, netif->domid);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status) {
-+              DPRINTK(" Gnttab failure mapping rx_ring_ref!\n");
-+              return op.status;
-+      }
-+
-+      netif->rx_shmem_ref    = rx_ring_ref;
-+      netif->rx_shmem_handle = op.handle;
-+
-+      return 0;
-+}
-+
-+static void unmap_frontend_pages(netif_t *netif)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)netif->tx_comms_area->addr,
-+                          GNTMAP_host_map, netif->tx_shmem_handle);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)netif->rx_comms_area->addr,
-+                          GNTMAP_host_map, netif->rx_shmem_handle);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+}
-+
-+int netif_map(netif_t *netif, unsigned long tx_ring_ref,
-+            unsigned long rx_ring_ref, unsigned int evtchn)
-+{
-+      int err = -ENOMEM;
-+      netif_tx_sring_t *txs;
-+      netif_rx_sring_t *rxs;
-+
-+      /* Already connected through? */
-+      if (netif->irq)
-+              return 0;
-+
-+      netif->tx_comms_area = alloc_vm_area(PAGE_SIZE);
-+      if (netif->tx_comms_area == NULL)
-+              return -ENOMEM;
-+      netif->rx_comms_area = alloc_vm_area(PAGE_SIZE);
-+      if (netif->rx_comms_area == NULL)
-+              goto err_rx;
-+
-+      err = map_frontend_pages(netif, tx_ring_ref, rx_ring_ref);
-+      if (err)
-+              goto err_map;
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+              netif->domid, evtchn, netif_be_int, 0,
-+              netif->dev->name, netif);
-+      if (err < 0)
-+              goto err_hypervisor;
-+      netif->irq = err;
-+      disable_irq(netif->irq);
-+
-+      txs = (netif_tx_sring_t *)netif->tx_comms_area->addr;
-+      BACK_RING_INIT(&netif->tx, txs, PAGE_SIZE);
-+
-+      rxs = (netif_rx_sring_t *)
-+              ((char *)netif->rx_comms_area->addr);
-+      BACK_RING_INIT(&netif->rx, rxs, PAGE_SIZE);
-+
-+      netif->rx_req_cons_peek = 0;
-+
-+      netif_get(netif);
-+
-+      rtnl_lock();
-+      netback_carrier_on(netif);
-+      if (netif_running(netif->dev))
-+              __netif_up(netif);
-+      rtnl_unlock();
-+
-+      return 0;
-+err_hypervisor:
-+      unmap_frontend_pages(netif);
-+err_map:
-+      free_vm_area(netif->rx_comms_area);
-+err_rx:
-+      free_vm_area(netif->tx_comms_area);
-+      return err;
-+}
-+
-+void netif_disconnect(netif_t *netif)
-+{
-+      if (netback_carrier_ok(netif)) {
-+              rtnl_lock();
-+              netback_carrier_off(netif);
-+              netif_carrier_off(netif->dev); /* discard queued packets */
-+              if (netif_running(netif->dev))
-+                      __netif_down(netif);
-+              rtnl_unlock();
-+              netif_put(netif);
-+      }
-+
-+      atomic_dec(&netif->refcnt);
-+      wait_event(netif->waiting_to_free, atomic_read(&netif->refcnt) == 0);
-+
-+      del_timer_sync(&netif->credit_timeout);
-+      del_timer_sync(&netif->tx_queue_timeout);
-+
-+      if (netif->irq)
-+              unbind_from_irqhandler(netif->irq, netif);
-+      
-+      unregister_netdev(netif->dev);
-+
-+      if (netif->tx.sring) {
-+              unmap_frontend_pages(netif);
-+              free_vm_area(netif->tx_comms_area);
-+              free_vm_area(netif->rx_comms_area);
-+      }
-+
-+      free_netdev(netif->dev);
-+}
-Index: head-2008-11-25/drivers/xen/netback/loopback.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/loopback.c     2007-08-06 15:10:49.000000000 +0200
-@@ -0,0 +1,324 @@
-+/******************************************************************************
-+ * netback/loopback.c
-+ * 
-+ * A two-interface loopback device to emulate a local netfront-netback
-+ * connection. This ensures that local packet delivery looks identical
-+ * to inter-domain delivery. Most importantly, packets delivered locally
-+ * originating from other domains will get *copied* when they traverse this
-+ * driver. This prevents unbounded delays in socket-buffer queues from
-+ * causing the netback driver to "seize up".
-+ * 
-+ * This driver creates a symmetric pair of loopback interfaces with names
-+ * vif0.0 and veth0. The intention is that 'vif0.0' is bound to an Ethernet
-+ * bridge, just like a proper netback interface, while a local IP interface
-+ * is configured on 'veth0'.
-+ * 
-+ * As with a real netback interface, vif0.0 is configured with a suitable
-+ * dummy MAC address. No default is provided for veth0: a reasonable strategy
-+ * is to transfer eth0's MAC address to veth0, and give eth0 a dummy address
-+ * (to avoid confusing the Etherbridge).
-+ * 
-+ * Copyright (c) 2005 K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/netdevice.h>
-+#include <linux/inetdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/ethtool.h>
-+#include <net/dst.h>
-+#include <net/xfrm.h>         /* secpath_reset() */
-+#include <asm/hypervisor.h>   /* is_initial_xendomain() */
-+
-+static int nloopbacks = -1;
-+module_param(nloopbacks, int, 0);
-+MODULE_PARM_DESC(nloopbacks, "Number of netback-loopback devices to create");
-+
-+struct net_private {
-+      struct net_device *loopback_dev;
-+      struct net_device_stats stats;
-+};
-+
-+static int loopback_open(struct net_device *dev)
-+{
-+      struct net_private *np = netdev_priv(dev);
-+      memset(&np->stats, 0, sizeof(np->stats));
-+      netif_start_queue(dev);
-+      return 0;
-+}
-+
-+static int loopback_close(struct net_device *dev)
-+{
-+      netif_stop_queue(dev);
-+      return 0;
-+}
-+
-+#ifdef CONFIG_X86
-+static int is_foreign(unsigned long pfn)
-+{
-+      /* NB. Play it safe for auto-translation mode. */
-+      return (xen_feature(XENFEAT_auto_translated_physmap) ||
-+              (phys_to_machine_mapping[pfn] & FOREIGN_FRAME_BIT));
-+}
-+#else
-+/* How to detect a foreign mapping? Play it safe. */
-+#define is_foreign(pfn)       (1)
-+#endif
-+
-+static int skb_remove_foreign_references(struct sk_buff *skb)
-+{
-+      struct page *page;
-+      unsigned long pfn;
-+      int i, off;
-+      char *vaddr;
-+
-+      BUG_ON(skb_shinfo(skb)->frag_list);
-+
-+      if (skb_cloned(skb) &&
-+          unlikely(pskb_expand_head(skb, 0, 0, GFP_ATOMIC)))
-+              return 0;
-+
-+      for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
-+              pfn = page_to_pfn(skb_shinfo(skb)->frags[i].page);
-+              if (!is_foreign(pfn))
-+                      continue;
-+              
-+              page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-+              if (unlikely(!page))
-+                      return 0;
-+
-+              vaddr = kmap_skb_frag(&skb_shinfo(skb)->frags[i]);
-+              off = skb_shinfo(skb)->frags[i].page_offset;
-+              memcpy(page_address(page) + off,
-+                     vaddr + off,
-+                     skb_shinfo(skb)->frags[i].size);
-+              kunmap_skb_frag(vaddr);
-+
-+              put_page(skb_shinfo(skb)->frags[i].page);
-+              skb_shinfo(skb)->frags[i].page = page;
-+      }
-+
-+      return 1;
-+}
-+
-+static int loopback_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+      struct net_private *np = netdev_priv(dev);
-+
-+      if (!skb_remove_foreign_references(skb)) {
-+              np->stats.tx_dropped++;
-+              dev_kfree_skb(skb);
-+              return 0;
-+      }
-+
-+      dst_release(skb->dst);
-+      skb->dst = NULL;
-+
-+      skb_orphan(skb);
-+
-+      np->stats.tx_bytes += skb->len;
-+      np->stats.tx_packets++;
-+
-+      /* Switch to loopback context. */
-+      dev = np->loopback_dev;
-+      np  = netdev_priv(dev);
-+
-+      np->stats.rx_bytes += skb->len;
-+      np->stats.rx_packets++;
-+
-+      if (skb->ip_summed == CHECKSUM_HW) {
-+              /* Defer checksum calculation. */
-+              skb->proto_csum_blank = 1;
-+              /* Must be a local packet: assert its integrity. */
-+              skb->proto_data_valid = 1;
-+      }
-+
-+      skb->ip_summed = skb->proto_data_valid ?
-+              CHECKSUM_UNNECESSARY : CHECKSUM_NONE;
-+
-+      skb->pkt_type = PACKET_HOST; /* overridden by eth_type_trans() */
-+      skb->protocol = eth_type_trans(skb, dev);
-+      skb->dev      = dev;
-+      dev->last_rx  = jiffies;
-+
-+      /* Flush netfilter context: rx'ed skbuffs not expected to have any. */
-+      nf_reset(skb);
-+      secpath_reset(skb);
-+
-+      netif_rx(skb);
-+
-+      return 0;
-+}
-+
-+static struct net_device_stats *loopback_get_stats(struct net_device *dev)
-+{
-+      struct net_private *np = netdev_priv(dev);
-+      return &np->stats;
-+}
-+
-+static struct ethtool_ops network_ethtool_ops =
-+{
-+      .get_tx_csum = ethtool_op_get_tx_csum,
-+      .set_tx_csum = ethtool_op_set_tx_csum,
-+      .get_sg = ethtool_op_get_sg,
-+      .set_sg = ethtool_op_set_sg,
-+      .get_tso = ethtool_op_get_tso,
-+      .set_tso = ethtool_op_set_tso,
-+      .get_link = ethtool_op_get_link,
-+};
-+
-+/*
-+ * Nothing to do here. Virtual interface is point-to-point and the
-+ * physical interface is probably promiscuous anyway.
-+ */
-+static void loopback_set_multicast_list(struct net_device *dev)
-+{
-+}
-+
-+static void loopback_construct(struct net_device *dev, struct net_device *lo)
-+{
-+      struct net_private *np = netdev_priv(dev);
-+
-+      np->loopback_dev     = lo;
-+
-+      dev->open            = loopback_open;
-+      dev->stop            = loopback_close;
-+      dev->hard_start_xmit = loopback_start_xmit;
-+      dev->get_stats       = loopback_get_stats;
-+      dev->set_multicast_list = loopback_set_multicast_list;
-+      dev->change_mtu      = NULL; /* allow arbitrary mtu */
-+
-+      dev->tx_queue_len    = 0;
-+
-+      dev->features        = (NETIF_F_HIGHDMA |
-+                              NETIF_F_LLTX |
-+                              NETIF_F_TSO |
-+                              NETIF_F_SG |
-+                              NETIF_F_IP_CSUM);
-+
-+      SET_ETHTOOL_OPS(dev, &network_ethtool_ops);
-+
-+      /*
-+       * We do not set a jumbo MTU on the interface. Otherwise the network
-+       * stack will try to send large packets that will get dropped by the
-+       * Ethernet bridge (unless the physical Ethernet interface is
-+       * configured to transfer jumbo packets). If a larger MTU is desired
-+       * then the system administrator can specify it using the 'ifconfig'
-+       * command.
-+       */
-+      /*dev->mtu             = 16*1024;*/
-+}
-+
-+static int __init make_loopback(int i)
-+{
-+      struct net_device *dev1, *dev2;
-+      char dev_name[IFNAMSIZ];
-+      int err = -ENOMEM;
-+
-+      sprintf(dev_name, "vif0.%d", i);
-+      dev1 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
-+      if (!dev1)
-+              return err;
-+
-+      sprintf(dev_name, "veth%d", i);
-+      dev2 = alloc_netdev(sizeof(struct net_private), dev_name, ether_setup);
-+      if (!dev2)
-+              goto fail_netdev2;
-+
-+      loopback_construct(dev1, dev2);
-+      loopback_construct(dev2, dev1);
-+
-+      /*
-+       * Initialise a dummy MAC address for the 'dummy backend' interface. We
-+       * choose the numerically largest non-broadcast address to prevent the
-+       * address getting stolen by an Ethernet bridge for STP purposes.
-+       */
-+      memset(dev1->dev_addr, 0xFF, ETH_ALEN);
-+      dev1->dev_addr[0] &= ~0x01;
-+
-+      if ((err = register_netdev(dev1)) != 0)
-+              goto fail;
-+
-+      if ((err = register_netdev(dev2)) != 0) {
-+              unregister_netdev(dev1);
-+              goto fail;
-+      }
-+
-+      return 0;
-+
-+ fail:
-+      free_netdev(dev2);
-+ fail_netdev2:
-+      free_netdev(dev1);
-+      return err;
-+}
-+
-+static void __exit clean_loopback(int i)
-+{
-+      struct net_device *dev1, *dev2;
-+      char dev_name[IFNAMSIZ];
-+
-+      sprintf(dev_name, "vif0.%d", i);
-+      dev1 = dev_get_by_name(dev_name);
-+      sprintf(dev_name, "veth%d", i);
-+      dev2 = dev_get_by_name(dev_name);
-+      if (dev1 && dev2) {
-+              unregister_netdev(dev2);
-+              unregister_netdev(dev1);
-+              free_netdev(dev2);
-+              free_netdev(dev1);
-+      }
-+}
-+
-+static int __init loopback_init(void)
-+{
-+      int i, err = 0;
-+
-+      if (nloopbacks == -1)
-+              nloopbacks = is_initial_xendomain() ? 4 : 0;
-+
-+      for (i = 0; i < nloopbacks; i++)
-+              if ((err = make_loopback(i)) != 0)
-+                      break;
-+
-+      return err;
-+}
-+
-+module_init(loopback_init);
-+
-+static void __exit loopback_exit(void)
-+{
-+      int i;
-+
-+      for (i = nloopbacks; i-- > 0; )
-+              clean_loopback(i);
-+}
-+
-+module_exit(loopback_exit);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/netback/netback.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/netback.c      2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,1614 @@
-+/******************************************************************************
-+ * drivers/xen/netback/netback.c
-+ * 
-+ * Back-end of the driver for virtual network devices. This portion of the
-+ * driver exports a 'unified' network-device interface that can be accessed
-+ * by any operating system that implements a compatible front end. A 
-+ * reference front-end implementation can be found in:
-+ *  drivers/xen/netfront/netfront.c
-+ * 
-+ * Copyright (c) 2002-2005, K A Fraser
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include "common.h"
-+#include <xen/balloon.h>
-+#include <xen/interface/memory.h>
-+
-+/*define NETBE_DEBUG_INTERRUPT*/
-+
-+/* extra field used in struct page */
-+#define netif_page_index(pg) (*(long *)&(pg)->mapping)
-+
-+struct netbk_rx_meta {
-+      skb_frag_t frag;
-+      int id;
-+      u8 copy:1;
-+};
-+
-+struct netbk_tx_pending_inuse {
-+      struct list_head list;
-+      unsigned long alloc_time;
-+};
-+
-+static void netif_idx_release(u16 pending_idx);
-+static void netif_page_release(struct page *page);
-+static void make_tx_response(netif_t *netif, 
-+                           netif_tx_request_t *txp,
-+                           s8       st);
-+static netif_rx_response_t *make_rx_response(netif_t *netif, 
-+                                           u16      id, 
-+                                           s8       st,
-+                                           u16      offset,
-+                                           u16      size,
-+                                           u16      flags);
-+
-+static void net_tx_action(unsigned long unused);
-+static DECLARE_TASKLET(net_tx_tasklet, net_tx_action, 0);
-+
-+static void net_rx_action(unsigned long unused);
-+static DECLARE_TASKLET(net_rx_tasklet, net_rx_action, 0);
-+
-+static struct timer_list net_timer;
-+static struct timer_list netbk_tx_pending_timer;
-+
-+#define MAX_PENDING_REQS 256
-+
-+static struct sk_buff_head rx_queue;
-+
-+static struct page **mmap_pages;
-+static inline unsigned long idx_to_pfn(unsigned int idx)
-+{
-+      return page_to_pfn(mmap_pages[idx]);
-+}
-+
-+static inline unsigned long idx_to_kaddr(unsigned int idx)
-+{
-+      return (unsigned long)pfn_to_kaddr(idx_to_pfn(idx));
-+}
-+
-+#define PKT_PROT_LEN 64
-+
-+static struct pending_tx_info {
-+      netif_tx_request_t req;
-+      netif_t *netif;
-+} pending_tx_info[MAX_PENDING_REQS];
-+static u16 pending_ring[MAX_PENDING_REQS];
-+typedef unsigned int PEND_RING_IDX;
-+#define MASK_PEND_IDX(_i) ((_i)&(MAX_PENDING_REQS-1))
-+static PEND_RING_IDX pending_prod, pending_cons;
-+#define NR_PENDING_REQS (MAX_PENDING_REQS - pending_prod + pending_cons)
-+
-+/* Freed TX SKBs get batched on this ring before return to pending_ring. */
-+static u16 dealloc_ring[MAX_PENDING_REQS];
-+static PEND_RING_IDX dealloc_prod, dealloc_cons;
-+
-+/* Doubly-linked list of in-use pending entries. */
-+static struct netbk_tx_pending_inuse pending_inuse[MAX_PENDING_REQS];
-+static LIST_HEAD(pending_inuse_head);
-+
-+static struct sk_buff_head tx_queue;
-+
-+static grant_handle_t grant_tx_handle[MAX_PENDING_REQS];
-+static gnttab_unmap_grant_ref_t tx_unmap_ops[MAX_PENDING_REQS];
-+static gnttab_map_grant_ref_t tx_map_ops[MAX_PENDING_REQS];
-+
-+static struct list_head net_schedule_list;
-+static spinlock_t net_schedule_list_lock;
-+
-+#define MAX_MFN_ALLOC 64
-+static unsigned long mfn_list[MAX_MFN_ALLOC];
-+static unsigned int alloc_index = 0;
-+
-+/* Setting this allows the safe use of this driver without netloop. */
-+static int MODPARM_copy_skb = 1;
-+module_param_named(copy_skb, MODPARM_copy_skb, bool, 0);
-+MODULE_PARM_DESC(copy_skb, "Copy data received from netfront without netloop");
-+
-+int netbk_copy_skb_mode;
-+
-+static inline unsigned long alloc_mfn(void)
-+{
-+      BUG_ON(alloc_index == 0);
-+      return mfn_list[--alloc_index];
-+}
-+
-+static int check_mfn(int nr)
-+{
-+      struct xen_memory_reservation reservation = {
-+              .extent_order = 0,
-+              .domid        = DOMID_SELF
-+      };
-+      int rc;
-+
-+      if (likely(alloc_index >= nr))
-+              return 0;
-+
-+      set_xen_guest_handle(reservation.extent_start, mfn_list + alloc_index);
-+      reservation.nr_extents = MAX_MFN_ALLOC - alloc_index;
-+      rc = HYPERVISOR_memory_op(XENMEM_increase_reservation, &reservation);
-+      if (likely(rc > 0))
-+              alloc_index += rc;
-+
-+      return alloc_index >= nr ? 0 : -ENOMEM;
-+}
-+
-+static inline void maybe_schedule_tx_action(void)
-+{
-+      smp_mb();
-+      if ((NR_PENDING_REQS < (MAX_PENDING_REQS/2)) &&
-+          !list_empty(&net_schedule_list))
-+              tasklet_schedule(&net_tx_tasklet);
-+}
-+
-+static struct sk_buff *netbk_copy_skb(struct sk_buff *skb)
-+{
-+      struct skb_shared_info *ninfo;
-+      struct sk_buff *nskb;
-+      unsigned long offset;
-+      int ret;
-+      int len;
-+      int headlen;
-+
-+      BUG_ON(skb_shinfo(skb)->frag_list != NULL);
-+
-+      nskb = alloc_skb(SKB_MAX_HEAD(0), GFP_ATOMIC | __GFP_NOWARN);
-+      if (unlikely(!nskb))
-+              goto err;
-+
-+      skb_reserve(nskb, 16 + NET_IP_ALIGN);
-+      headlen = nskb->end - nskb->data;
-+      if (headlen > skb_headlen(skb))
-+              headlen = skb_headlen(skb);
-+      ret = skb_copy_bits(skb, 0, __skb_put(nskb, headlen), headlen);
-+      BUG_ON(ret);
-+
-+      ninfo = skb_shinfo(nskb);
-+      ninfo->gso_size = skb_shinfo(skb)->gso_size;
-+      ninfo->gso_type = skb_shinfo(skb)->gso_type;
-+
-+      offset = headlen;
-+      len = skb->len - headlen;
-+
-+      nskb->len = skb->len;
-+      nskb->data_len = len;
-+      nskb->truesize += len;
-+
-+      while (len) {
-+              struct page *page;
-+              int copy;
-+              int zero;
-+
-+              if (unlikely(ninfo->nr_frags >= MAX_SKB_FRAGS)) {
-+                      dump_stack();
-+                      goto err_free;
-+              }
-+
-+              copy = len >= PAGE_SIZE ? PAGE_SIZE : len;
-+              zero = len >= PAGE_SIZE ? 0 : __GFP_ZERO;
-+
-+              page = alloc_page(GFP_ATOMIC | __GFP_NOWARN | zero);
-+              if (unlikely(!page))
-+                      goto err_free;
-+
-+              ret = skb_copy_bits(skb, offset, page_address(page), copy);
-+              BUG_ON(ret);
-+
-+              ninfo->frags[ninfo->nr_frags].page = page;
-+              ninfo->frags[ninfo->nr_frags].page_offset = 0;
-+              ninfo->frags[ninfo->nr_frags].size = copy;
-+              ninfo->nr_frags++;
-+
-+              offset += copy;
-+              len -= copy;
-+      }
-+
-+      offset = nskb->data - skb->data;
-+
-+      nskb->h.raw = skb->h.raw + offset;
-+      nskb->nh.raw = skb->nh.raw + offset;
-+      nskb->mac.raw = skb->mac.raw + offset;
-+
-+      return nskb;
-+
-+ err_free:
-+      kfree_skb(nskb);
-+ err:
-+      return NULL;
-+}
-+
-+static inline int netbk_max_required_rx_slots(netif_t *netif)
-+{
-+      if (netif->features & (NETIF_F_SG|NETIF_F_TSO))
-+              return MAX_SKB_FRAGS + 2; /* header + extra_info + frags */
-+      return 1; /* all in one */
-+}
-+
-+static inline int netbk_queue_full(netif_t *netif)
-+{
-+      RING_IDX peek   = netif->rx_req_cons_peek;
-+      RING_IDX needed = netbk_max_required_rx_slots(netif);
-+
-+      return ((netif->rx.sring->req_prod - peek) < needed) ||
-+             ((netif->rx.rsp_prod_pvt + NET_RX_RING_SIZE - peek) < needed);
-+}
-+
-+static void tx_queue_callback(unsigned long data)
-+{
-+      netif_t *netif = (netif_t *)data;
-+      if (netif_schedulable(netif))
-+              netif_wake_queue(netif->dev);
-+}
-+
-+int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+
-+      BUG_ON(skb->dev != dev);
-+
-+      /* Drop the packet if the target domain has no receive buffers. */
-+      if (unlikely(!netif_schedulable(netif) || netbk_queue_full(netif)))
-+              goto drop;
-+
-+      /*
-+       * Copy the packet here if it's destined for a flipping interface
-+       * but isn't flippable (e.g. extra references to data).
-+       * XXX For now we also copy skbuffs whose head crosses a page
-+       * boundary, because netbk_gop_skb can't handle them.
-+       */
-+      if (!netif->copying_receiver ||
-+          ((skb_headlen(skb) + offset_in_page(skb->data)) >= PAGE_SIZE)) {
-+              struct sk_buff *nskb = netbk_copy_skb(skb);
-+              if ( unlikely(nskb == NULL) )
-+                      goto drop;
-+              /* Copy only the header fields we use in this driver. */
-+              nskb->dev = skb->dev;
-+              nskb->ip_summed = skb->ip_summed;
-+              nskb->proto_data_valid = skb->proto_data_valid;
-+              dev_kfree_skb(skb);
-+              skb = nskb;
-+      }
-+
-+      netif->rx_req_cons_peek += skb_shinfo(skb)->nr_frags + 1 +
-+                                 !!skb_shinfo(skb)->gso_size;
-+      netif_get(netif);
-+
-+      if (netbk_can_queue(dev) && netbk_queue_full(netif)) {
-+              netif->rx.sring->req_event = netif->rx_req_cons_peek +
-+                      netbk_max_required_rx_slots(netif);
-+              mb(); /* request notification /then/ check & stop the queue */
-+              if (netbk_queue_full(netif)) {
-+                      netif_stop_queue(dev);
-+                      /*
-+                       * Schedule 500ms timeout to restart the queue, thus
-+                       * ensuring that an inactive queue will be drained.
-+                       * Packets will be immediately be dropped until more
-+                       * receive buffers become available (see
-+                       * netbk_queue_full() check above).
-+                       */
-+                      netif->tx_queue_timeout.data = (unsigned long)netif;
-+                      netif->tx_queue_timeout.function = tx_queue_callback;
-+                      __mod_timer(&netif->tx_queue_timeout, jiffies + HZ/2);
-+              }
-+      }
-+
-+      skb_queue_tail(&rx_queue, skb);
-+      tasklet_schedule(&net_rx_tasklet);
-+
-+      return 0;
-+
-+ drop:
-+      netif->stats.tx_dropped++;
-+      dev_kfree_skb(skb);
-+      return 0;
-+}
-+
-+#if 0
-+static void xen_network_done_notify(void)
-+{
-+      static struct net_device *eth0_dev = NULL;
-+      if (unlikely(eth0_dev == NULL))
-+              eth0_dev = __dev_get_by_name("eth0");
-+      netif_rx_schedule(eth0_dev);
-+}
-+/* 
-+ * Add following to poll() function in NAPI driver (Tigon3 is example):
-+ *  if ( xen_network_done() )
-+ *      tg3_enable_ints(tp);
-+ */
-+int xen_network_done(void)
-+{
-+      return skb_queue_empty(&rx_queue);
-+}
-+#endif
-+
-+struct netrx_pending_operations {
-+      unsigned trans_prod, trans_cons;
-+      unsigned mmu_prod, mmu_mcl;
-+      unsigned mcl_prod, mcl_cons;
-+      unsigned copy_prod, copy_cons;
-+      unsigned meta_prod, meta_cons;
-+      mmu_update_t *mmu;
-+      gnttab_transfer_t *trans;
-+      gnttab_copy_t *copy;
-+      multicall_entry_t *mcl;
-+      struct netbk_rx_meta *meta;
-+};
-+
-+/* Set up the grant operations for this fragment.  If it's a flipping
-+   interface, we also set up the unmap request from here. */
-+static u16 netbk_gop_frag(netif_t *netif, struct netbk_rx_meta *meta,
-+                        int i, struct netrx_pending_operations *npo,
-+                        struct page *page, unsigned long size,
-+                        unsigned long offset)
-+{
-+      mmu_update_t *mmu;
-+      gnttab_transfer_t *gop;
-+      gnttab_copy_t *copy_gop;
-+      multicall_entry_t *mcl;
-+      netif_rx_request_t *req;
-+      unsigned long old_mfn, new_mfn;
-+
-+      old_mfn = virt_to_mfn(page_address(page));
-+
-+      req = RING_GET_REQUEST(&netif->rx, netif->rx.req_cons + i);
-+      if (netif->copying_receiver) {
-+              /* The fragment needs to be copied rather than
-+                 flipped. */
-+              meta->copy = 1;
-+              copy_gop = npo->copy + npo->copy_prod++;
-+              copy_gop->flags = GNTCOPY_dest_gref;
-+              if (PageForeign(page)) {
-+                      struct pending_tx_info *src_pend =
-+                              &pending_tx_info[netif_page_index(page)];
-+                      copy_gop->source.domid = src_pend->netif->domid;
-+                      copy_gop->source.u.ref = src_pend->req.gref;
-+                      copy_gop->flags |= GNTCOPY_source_gref;
-+              } else {
-+                      copy_gop->source.domid = DOMID_SELF;
-+                      copy_gop->source.u.gmfn = old_mfn;
-+              }
-+              copy_gop->source.offset = offset;
-+              copy_gop->dest.domid = netif->domid;
-+              copy_gop->dest.offset = 0;
-+              copy_gop->dest.u.ref = req->gref;
-+              copy_gop->len = size;
-+      } else {
-+              meta->copy = 0;
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      new_mfn = alloc_mfn();
-+
-+                      /*
-+                       * Set the new P2M table entry before
-+                       * reassigning the old data page. Heed the
-+                       * comment in pgtable-2level.h:pte_page(). :-)
-+                       */
-+                      set_phys_to_machine(page_to_pfn(page), new_mfn);
-+
-+                      mcl = npo->mcl + npo->mcl_prod++;
-+                      MULTI_update_va_mapping(mcl,
-+                                           (unsigned long)page_address(page),
-+                                           pfn_pte_ma(new_mfn, PAGE_KERNEL),
-+                                           0);
-+
-+                      mmu = npo->mmu + npo->mmu_prod++;
-+                      mmu->ptr = ((maddr_t)new_mfn << PAGE_SHIFT) |
-+                              MMU_MACHPHYS_UPDATE;
-+                      mmu->val = page_to_pfn(page);
-+              }
-+
-+              gop = npo->trans + npo->trans_prod++;
-+              gop->mfn = old_mfn;
-+              gop->domid = netif->domid;
-+              gop->ref = req->gref;
-+      }
-+      return req->id;
-+}
-+
-+static void netbk_gop_skb(struct sk_buff *skb,
-+                        struct netrx_pending_operations *npo)
-+{
-+      netif_t *netif = netdev_priv(skb->dev);
-+      int nr_frags = skb_shinfo(skb)->nr_frags;
-+      int i;
-+      int extra;
-+      struct netbk_rx_meta *head_meta, *meta;
-+
-+      head_meta = npo->meta + npo->meta_prod++;
-+      head_meta->frag.page_offset = skb_shinfo(skb)->gso_type;
-+      head_meta->frag.size = skb_shinfo(skb)->gso_size;
-+      extra = !!head_meta->frag.size + 1;
-+
-+      for (i = 0; i < nr_frags; i++) {
-+              meta = npo->meta + npo->meta_prod++;
-+              meta->frag = skb_shinfo(skb)->frags[i];
-+              meta->id = netbk_gop_frag(netif, meta, i + extra, npo,
-+                                        meta->frag.page,
-+                                        meta->frag.size,
-+                                        meta->frag.page_offset);
-+      }
-+
-+      /*
-+       * This must occur at the end to ensure that we don't trash skb_shinfo
-+       * until we're done. We know that the head doesn't cross a page
-+       * boundary because such packets get copied in netif_be_start_xmit.
-+       */
-+      head_meta->id = netbk_gop_frag(netif, head_meta, 0, npo,
-+                                     virt_to_page(skb->data),
-+                                     skb_headlen(skb),
-+                                     offset_in_page(skb->data));
-+
-+      netif->rx.req_cons += nr_frags + extra;
-+}
-+
-+static inline void netbk_free_pages(int nr_frags, struct netbk_rx_meta *meta)
-+{
-+      int i;
-+
-+      for (i = 0; i < nr_frags; i++)
-+              put_page(meta[i].frag.page);
-+}
-+
-+/* This is a twin to netbk_gop_skb.  Assume that netbk_gop_skb was
-+   used to set up the operations on the top of
-+   netrx_pending_operations, which have since been done.  Check that
-+   they didn't give any errors and advance over them. */
-+static int netbk_check_gop(int nr_frags, domid_t domid,
-+                         struct netrx_pending_operations *npo)
-+{
-+      multicall_entry_t *mcl;
-+      gnttab_transfer_t *gop;
-+      gnttab_copy_t     *copy_op;
-+      int status = NETIF_RSP_OKAY;
-+      int i;
-+
-+      for (i = 0; i <= nr_frags; i++) {
-+              if (npo->meta[npo->meta_cons + i].copy) {
-+                      copy_op = npo->copy + npo->copy_cons++;
-+                      if (copy_op->status != GNTST_okay) {
-+                              DPRINTK("Bad status %d from copy to DOM%d.\n",
-+                                      copy_op->status, domid);
-+                              status = NETIF_RSP_ERROR;
-+                      }
-+              } else {
-+                      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                              mcl = npo->mcl + npo->mcl_cons++;
-+                              /* The update_va_mapping() must not fail. */
-+                              BUG_ON(mcl->result != 0);
-+                      }
-+
-+                      gop = npo->trans + npo->trans_cons++;
-+                      /* Check the reassignment error code. */
-+                      if (gop->status != 0) {
-+                              DPRINTK("Bad status %d from grant transfer to DOM%u\n",
-+                                      gop->status, domid);
-+                              /*
-+                               * Page no longer belongs to us unless
-+                               * GNTST_bad_page, but that should be
-+                               * a fatal error anyway.
-+                               */
-+                              BUG_ON(gop->status == GNTST_bad_page);
-+                              status = NETIF_RSP_ERROR;
-+                      }
-+              }
-+      }
-+
-+      return status;
-+}
-+
-+static void netbk_add_frag_responses(netif_t *netif, int status,
-+                                   struct netbk_rx_meta *meta, int nr_frags)
-+{
-+      int i;
-+      unsigned long offset;
-+
-+      for (i = 0; i < nr_frags; i++) {
-+              int id = meta[i].id;
-+              int flags = (i == nr_frags - 1) ? 0 : NETRXF_more_data;
-+
-+              if (meta[i].copy)
-+                      offset = 0;
-+              else
-+                      offset = meta[i].frag.page_offset;
-+              make_rx_response(netif, id, status, offset,
-+                               meta[i].frag.size, flags);
-+      }
-+}
-+
-+static void net_rx_action(unsigned long unused)
-+{
-+      netif_t *netif = NULL;
-+      s8 status;
-+      u16 id, irq, flags;
-+      netif_rx_response_t *resp;
-+      multicall_entry_t *mcl;
-+      struct sk_buff_head rxq;
-+      struct sk_buff *skb;
-+      int notify_nr = 0;
-+      int ret;
-+      int nr_frags;
-+      int count;
-+      unsigned long offset;
-+
-+      /*
-+       * Putting hundreds of bytes on the stack is considered rude.
-+       * Static works because a tasklet can only be on one CPU at any time.
-+       */
-+      static multicall_entry_t rx_mcl[NET_RX_RING_SIZE+3];
-+      static mmu_update_t rx_mmu[NET_RX_RING_SIZE];
-+      static gnttab_transfer_t grant_trans_op[NET_RX_RING_SIZE];
-+      static gnttab_copy_t grant_copy_op[NET_RX_RING_SIZE];
-+      static unsigned char rx_notify[NR_IRQS];
-+      static u16 notify_list[NET_RX_RING_SIZE];
-+      static struct netbk_rx_meta meta[NET_RX_RING_SIZE];
-+
-+      struct netrx_pending_operations npo = {
-+              mmu: rx_mmu,
-+              trans: grant_trans_op,
-+              copy: grant_copy_op,
-+              mcl: rx_mcl,
-+              meta: meta};
-+
-+      skb_queue_head_init(&rxq);
-+
-+      count = 0;
-+
-+      while ((skb = skb_dequeue(&rx_queue)) != NULL) {
-+              nr_frags = skb_shinfo(skb)->nr_frags;
-+              *(int *)skb->cb = nr_frags;
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap) &&
-+                  !((netif_t *)netdev_priv(skb->dev))->copying_receiver &&
-+                  check_mfn(nr_frags + 1)) {
-+                      /* Memory squeeze? Back off for an arbitrary while. */
-+                      if ( net_ratelimit() )
-+                              WPRINTK("Memory squeeze in netback "
-+                                      "driver.\n");
-+                      mod_timer(&net_timer, jiffies + HZ);
-+                      skb_queue_head(&rx_queue, skb);
-+                      break;
-+              }
-+
-+              netbk_gop_skb(skb, &npo);
-+
-+              count += nr_frags + 1;
-+
-+              __skb_queue_tail(&rxq, skb);
-+
-+              /* Filled the batch queue? */
-+              if (count + MAX_SKB_FRAGS >= NET_RX_RING_SIZE)
-+                      break;
-+      }
-+
-+      BUG_ON(npo.meta_prod > ARRAY_SIZE(meta));
-+
-+      npo.mmu_mcl = npo.mcl_prod;
-+      if (npo.mcl_prod) {
-+              BUG_ON(xen_feature(XENFEAT_auto_translated_physmap));
-+              BUG_ON(npo.mmu_prod > ARRAY_SIZE(rx_mmu));
-+              mcl = npo.mcl + npo.mcl_prod++;
-+
-+              BUG_ON(mcl[-1].op != __HYPERVISOR_update_va_mapping);
-+              mcl[-1].args[MULTI_UVMFLAGS_INDEX] = UVMF_TLB_FLUSH|UVMF_ALL;
-+
-+              mcl->op = __HYPERVISOR_mmu_update;
-+              mcl->args[0] = (unsigned long)rx_mmu;
-+              mcl->args[1] = npo.mmu_prod;
-+              mcl->args[2] = 0;
-+              mcl->args[3] = DOMID_SELF;
-+      }
-+
-+      if (npo.trans_prod) {
-+              BUG_ON(npo.trans_prod > ARRAY_SIZE(grant_trans_op));
-+              mcl = npo.mcl + npo.mcl_prod++;
-+              mcl->op = __HYPERVISOR_grant_table_op;
-+              mcl->args[0] = GNTTABOP_transfer;
-+              mcl->args[1] = (unsigned long)grant_trans_op;
-+              mcl->args[2] = npo.trans_prod;
-+      }
-+
-+      if (npo.copy_prod) {
-+              BUG_ON(npo.copy_prod > ARRAY_SIZE(grant_copy_op));
-+              mcl = npo.mcl + npo.mcl_prod++;
-+              mcl->op = __HYPERVISOR_grant_table_op;
-+              mcl->args[0] = GNTTABOP_copy;
-+              mcl->args[1] = (unsigned long)grant_copy_op;
-+              mcl->args[2] = npo.copy_prod;
-+      }
-+
-+      /* Nothing to do? */
-+      if (!npo.mcl_prod)
-+              return;
-+
-+      BUG_ON(npo.mcl_prod > ARRAY_SIZE(rx_mcl));
-+
-+      ret = HYPERVISOR_multicall(npo.mcl, npo.mcl_prod);
-+      BUG_ON(ret != 0);
-+      /* The mmu_machphys_update() must not fail. */
-+      BUG_ON(npo.mmu_mcl && npo.mcl[npo.mmu_mcl].result != 0);
-+
-+      while ((skb = __skb_dequeue(&rxq)) != NULL) {
-+              nr_frags = *(int *)skb->cb;
-+
-+              netif = netdev_priv(skb->dev);
-+              /* We can't rely on skb_release_data to release the
-+                 pages used by fragments for us, since it tries to
-+                 touch the pages in the fraglist.  If we're in
-+                 flipping mode, that doesn't work.  In copying mode,
-+                 we still have access to all of the pages, and so
-+                 it's safe to let release_data deal with it. */
-+              /* (Freeing the fragments is safe since we copy
-+                 non-linear skbs destined for flipping interfaces) */
-+              if (!netif->copying_receiver) {
-+                      atomic_set(&(skb_shinfo(skb)->dataref), 1);
-+                      skb_shinfo(skb)->frag_list = NULL;
-+                      skb_shinfo(skb)->nr_frags = 0;
-+                      netbk_free_pages(nr_frags, meta + npo.meta_cons + 1);
-+              }
-+
-+              netif->stats.tx_bytes += skb->len;
-+              netif->stats.tx_packets++;
-+
-+              status = netbk_check_gop(nr_frags, netif->domid, &npo);
-+
-+              id = meta[npo.meta_cons].id;
-+              flags = nr_frags ? NETRXF_more_data : 0;
-+
-+              if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
-+                      flags |= NETRXF_csum_blank | NETRXF_data_validated;
-+              else if (skb->proto_data_valid) /* remote but checksummed? */
-+                      flags |= NETRXF_data_validated;
-+
-+              if (meta[npo.meta_cons].copy)
-+                      offset = 0;
-+              else
-+                      offset = offset_in_page(skb->data);
-+              resp = make_rx_response(netif, id, status, offset,
-+                                      skb_headlen(skb), flags);
-+
-+              if (meta[npo.meta_cons].frag.size) {
-+                      struct netif_extra_info *gso =
-+                              (struct netif_extra_info *)
-+                              RING_GET_RESPONSE(&netif->rx,
-+                                                netif->rx.rsp_prod_pvt++);
-+
-+                      resp->flags |= NETRXF_extra_info;
-+
-+                      gso->u.gso.size = meta[npo.meta_cons].frag.size;
-+                      gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
-+                      gso->u.gso.pad = 0;
-+                      gso->u.gso.features = 0;
-+
-+                      gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
-+                      gso->flags = 0;
-+              }
-+
-+              netbk_add_frag_responses(netif, status,
-+                                       meta + npo.meta_cons + 1,
-+                                       nr_frags);
-+
-+              RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->rx, ret);
-+              irq = netif->irq;
-+              if (ret && !rx_notify[irq]) {
-+                      rx_notify[irq] = 1;
-+                      notify_list[notify_nr++] = irq;
-+              }
-+
-+              if (netif_queue_stopped(netif->dev) &&
-+                  netif_schedulable(netif) &&
-+                  !netbk_queue_full(netif))
-+                      netif_wake_queue(netif->dev);
-+
-+              netif_put(netif);
-+              dev_kfree_skb(skb);
-+              npo.meta_cons += nr_frags + 1;
-+      }
-+
-+      while (notify_nr != 0) {
-+              irq = notify_list[--notify_nr];
-+              rx_notify[irq] = 0;
-+              notify_remote_via_irq(irq);
-+      }
-+
-+      /* More work to do? */
-+      if (!skb_queue_empty(&rx_queue) && !timer_pending(&net_timer))
-+              tasklet_schedule(&net_rx_tasklet);
-+#if 0
-+      else
-+              xen_network_done_notify();
-+#endif
-+}
-+
-+static void net_alarm(unsigned long unused)
-+{
-+      tasklet_schedule(&net_rx_tasklet);
-+}
-+
-+static void netbk_tx_pending_timeout(unsigned long unused)
-+{
-+      tasklet_schedule(&net_tx_tasklet);
-+}
-+
-+struct net_device_stats *netif_be_get_stats(struct net_device *dev)
-+{
-+      netif_t *netif = netdev_priv(dev);
-+      return &netif->stats;
-+}
-+
-+static int __on_net_schedule_list(netif_t *netif)
-+{
-+      return netif->list.next != NULL;
-+}
-+
-+static void remove_from_net_schedule_list(netif_t *netif)
-+{
-+      spin_lock_irq(&net_schedule_list_lock);
-+      if (likely(__on_net_schedule_list(netif))) {
-+              list_del(&netif->list);
-+              netif->list.next = NULL;
-+              netif_put(netif);
-+      }
-+      spin_unlock_irq(&net_schedule_list_lock);
-+}
-+
-+static void add_to_net_schedule_list_tail(netif_t *netif)
-+{
-+      if (__on_net_schedule_list(netif))
-+              return;
-+
-+      spin_lock_irq(&net_schedule_list_lock);
-+      if (!__on_net_schedule_list(netif) &&
-+          likely(netif_schedulable(netif))) {
-+              list_add_tail(&netif->list, &net_schedule_list);
-+              netif_get(netif);
-+      }
-+      spin_unlock_irq(&net_schedule_list_lock);
-+}
-+
-+/*
-+ * Note on CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER:
-+ * If this driver is pipelining transmit requests then we can be very
-+ * aggressive in avoiding new-packet notifications -- frontend only needs to
-+ * send a notification if there are no outstanding unreceived responses.
-+ * If we may be buffer transmit buffers for any reason then we must be rather
-+ * more conservative and treat this as the final check for pending work.
-+ */
-+void netif_schedule_work(netif_t *netif)
-+{
-+      int more_to_do;
-+
-+#ifdef CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER
-+      more_to_do = RING_HAS_UNCONSUMED_REQUESTS(&netif->tx);
-+#else
-+      RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, more_to_do);
-+#endif
-+
-+      if (more_to_do) {
-+              add_to_net_schedule_list_tail(netif);
-+              maybe_schedule_tx_action();
-+      }
-+}
-+
-+void netif_deschedule_work(netif_t *netif)
-+{
-+      remove_from_net_schedule_list(netif);
-+}
-+
-+
-+static void tx_add_credit(netif_t *netif)
-+{
-+      unsigned long max_burst, max_credit;
-+
-+      /*
-+       * Allow a burst big enough to transmit a jumbo packet of up to 128kB.
-+       * Otherwise the interface can seize up due to insufficient credit.
-+       */
-+      max_burst = RING_GET_REQUEST(&netif->tx, netif->tx.req_cons)->size;
-+      max_burst = min(max_burst, 131072UL);
-+      max_burst = max(max_burst, netif->credit_bytes);
-+
-+      /* Take care that adding a new chunk of credit doesn't wrap to zero. */
-+      max_credit = netif->remaining_credit + netif->credit_bytes;
-+      if (max_credit < netif->remaining_credit)
-+              max_credit = ULONG_MAX; /* wrapped: clamp to ULONG_MAX */
-+
-+      netif->remaining_credit = min(max_credit, max_burst);
-+}
-+
-+static void tx_credit_callback(unsigned long data)
-+{
-+      netif_t *netif = (netif_t *)data;
-+      tx_add_credit(netif);
-+      netif_schedule_work(netif);
-+}
-+
-+static inline int copy_pending_req(PEND_RING_IDX pending_idx)
-+{
-+      return gnttab_copy_grant_page(grant_tx_handle[pending_idx],
-+                                    &mmap_pages[pending_idx]);
-+}
-+
-+inline static void net_tx_action_dealloc(void)
-+{
-+      struct netbk_tx_pending_inuse *inuse, *n;
-+      gnttab_unmap_grant_ref_t *gop;
-+      u16 pending_idx;
-+      PEND_RING_IDX dc, dp;
-+      netif_t *netif;
-+      int ret;
-+      LIST_HEAD(list);
-+
-+      dc = dealloc_cons;
-+      gop = tx_unmap_ops;
-+
-+      /*
-+       * Free up any grants we have finished using
-+       */
-+      do {
-+              dp = dealloc_prod;
-+
-+              /* Ensure we see all indices enqueued by netif_idx_release(). */
-+              smp_rmb();
-+
-+              while (dc != dp) {
-+                      unsigned long pfn;
-+
-+                      pending_idx = dealloc_ring[MASK_PEND_IDX(dc++)];
-+                      list_move_tail(&pending_inuse[pending_idx].list, &list);
-+
-+                      pfn = idx_to_pfn(pending_idx);
-+                      /* Already unmapped? */
-+                      if (!phys_to_machine_mapping_valid(pfn))
-+                              continue;
-+
-+                      gnttab_set_unmap_op(gop, idx_to_kaddr(pending_idx),
-+                                          GNTMAP_host_map,
-+                                          grant_tx_handle[pending_idx]);
-+                      gop++;
-+              }
-+
-+              if (netbk_copy_skb_mode != NETBK_DELAYED_COPY_SKB ||
-+                  list_empty(&pending_inuse_head))
-+                      break;
-+
-+              /* Copy any entries that have been pending for too long. */
-+              list_for_each_entry_safe(inuse, n, &pending_inuse_head, list) {
-+                      if (time_after(inuse->alloc_time + HZ / 2, jiffies))
-+                              break;
-+
-+                      switch (copy_pending_req(inuse - pending_inuse)) {
-+                      case 0:
-+                              list_move_tail(&inuse->list, &list);
-+                              continue;
-+                      case -EBUSY:
-+                              list_del_init(&inuse->list);
-+                              continue;
-+                      case -ENOENT:
-+                              continue;
-+                      }
-+
-+                      break;
-+              }
-+      } while (dp != dealloc_prod);
-+
-+      dealloc_cons = dc;
-+
-+      ret = HYPERVISOR_grant_table_op(
-+              GNTTABOP_unmap_grant_ref, tx_unmap_ops, gop - tx_unmap_ops);
-+      BUG_ON(ret);
-+
-+      list_for_each_entry_safe(inuse, n, &list, list) {
-+              pending_idx = inuse - pending_inuse;
-+
-+              netif = pending_tx_info[pending_idx].netif;
-+
-+              make_tx_response(netif, &pending_tx_info[pending_idx].req, 
-+                               NETIF_RSP_OKAY);
-+
-+              /* Ready for next use. */
-+              gnttab_reset_grant_page(mmap_pages[pending_idx]);
-+
-+              pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-+
-+              netif_put(netif);
-+
-+              list_del_init(&inuse->list);
-+      }
-+}
-+
-+static void netbk_tx_err(netif_t *netif, netif_tx_request_t *txp, RING_IDX end)
-+{
-+      RING_IDX cons = netif->tx.req_cons;
-+
-+      do {
-+              make_tx_response(netif, txp, NETIF_RSP_ERROR);
-+              if (cons >= end)
-+                      break;
-+              txp = RING_GET_REQUEST(&netif->tx, cons++);
-+      } while (1);
-+      netif->tx.req_cons = cons;
-+      netif_schedule_work(netif);
-+      netif_put(netif);
-+}
-+
-+static int netbk_count_requests(netif_t *netif, netif_tx_request_t *first,
-+                              netif_tx_request_t *txp, int work_to_do)
-+{
-+      RING_IDX cons = netif->tx.req_cons;
-+      int frags = 0;
-+
-+      if (!(first->flags & NETTXF_more_data))
-+              return 0;
-+
-+      do {
-+              if (frags >= work_to_do) {
-+                      DPRINTK("Need more frags\n");
-+                      return -frags;
-+              }
-+
-+              if (unlikely(frags >= MAX_SKB_FRAGS)) {
-+                      DPRINTK("Too many frags\n");
-+                      return -frags;
-+              }
-+
-+              memcpy(txp, RING_GET_REQUEST(&netif->tx, cons + frags),
-+                     sizeof(*txp));
-+              if (txp->size > first->size) {
-+                      DPRINTK("Frags galore\n");
-+                      return -frags;
-+              }
-+
-+              first->size -= txp->size;
-+              frags++;
-+
-+              if (unlikely((txp->offset + txp->size) > PAGE_SIZE)) {
-+                      DPRINTK("txp->offset: %x, size: %u\n",
-+                              txp->offset, txp->size);
-+                      return -frags;
-+              }
-+      } while ((txp++)->flags & NETTXF_more_data);
-+
-+      return frags;
-+}
-+
-+static gnttab_map_grant_ref_t *netbk_get_requests(netif_t *netif,
-+                                                struct sk_buff *skb,
-+                                                netif_tx_request_t *txp,
-+                                                gnttab_map_grant_ref_t *mop)
-+{
-+      struct skb_shared_info *shinfo = skb_shinfo(skb);
-+      skb_frag_t *frags = shinfo->frags;
-+      unsigned long pending_idx = *((u16 *)skb->data);
-+      int i, start;
-+
-+      /* Skip first skb fragment if it is on same page as header fragment. */
-+      start = ((unsigned long)shinfo->frags[0].page == pending_idx);
-+
-+      for (i = start; i < shinfo->nr_frags; i++, txp++) {
-+              pending_idx = pending_ring[MASK_PEND_IDX(pending_cons++)];
-+
-+              gnttab_set_map_op(mop++, idx_to_kaddr(pending_idx),
-+                                GNTMAP_host_map | GNTMAP_readonly,
-+                                txp->gref, netif->domid);
-+
-+              memcpy(&pending_tx_info[pending_idx].req, txp, sizeof(*txp));
-+              netif_get(netif);
-+              pending_tx_info[pending_idx].netif = netif;
-+              frags[i].page = (void *)pending_idx;
-+      }
-+
-+      return mop;
-+}
-+
-+static int netbk_tx_check_mop(struct sk_buff *skb,
-+                             gnttab_map_grant_ref_t **mopp)
-+{
-+      gnttab_map_grant_ref_t *mop = *mopp;
-+      int pending_idx = *((u16 *)skb->data);
-+      netif_t *netif = pending_tx_info[pending_idx].netif;
-+      netif_tx_request_t *txp;
-+      struct skb_shared_info *shinfo = skb_shinfo(skb);
-+      int nr_frags = shinfo->nr_frags;
-+      int i, err, start;
-+
-+      /* Check status of header. */
-+      err = mop->status;
-+      if (unlikely(err)) {
-+              txp = &pending_tx_info[pending_idx].req;
-+              make_tx_response(netif, txp, NETIF_RSP_ERROR);
-+              pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-+              netif_put(netif);
-+      } else {
-+              set_phys_to_machine(
-+                      __pa(idx_to_kaddr(pending_idx)) >> PAGE_SHIFT,
-+                      FOREIGN_FRAME(mop->dev_bus_addr >> PAGE_SHIFT));
-+              grant_tx_handle[pending_idx] = mop->handle;
-+      }
-+
-+      /* Skip first skb fragment if it is on same page as header fragment. */
-+      start = ((unsigned long)shinfo->frags[0].page == pending_idx);
-+
-+      for (i = start; i < nr_frags; i++) {
-+              int j, newerr;
-+
-+              pending_idx = (unsigned long)shinfo->frags[i].page;
-+
-+              /* Check error status: if okay then remember grant handle. */
-+              newerr = (++mop)->status;
-+              if (likely(!newerr)) {
-+                      set_phys_to_machine(
-+                              __pa(idx_to_kaddr(pending_idx))>>PAGE_SHIFT,
-+                              FOREIGN_FRAME(mop->dev_bus_addr>>PAGE_SHIFT));
-+                      grant_tx_handle[pending_idx] = mop->handle;
-+                      /* Had a previous error? Invalidate this fragment. */
-+                      if (unlikely(err))
-+                              netif_idx_release(pending_idx);
-+                      continue;
-+              }
-+
-+              /* Error on this fragment: respond to client with an error. */
-+              txp = &pending_tx_info[pending_idx].req;
-+              make_tx_response(netif, txp, NETIF_RSP_ERROR);
-+              pending_ring[MASK_PEND_IDX(pending_prod++)] = pending_idx;
-+              netif_put(netif);
-+
-+              /* Not the first error? Preceding frags already invalidated. */
-+              if (err)
-+                      continue;
-+
-+              /* First error: invalidate header and preceding fragments. */
-+              pending_idx = *((u16 *)skb->data);
-+              netif_idx_release(pending_idx);
-+              for (j = start; j < i; j++) {
-+                      pending_idx = (unsigned long)shinfo->frags[i].page;
-+                      netif_idx_release(pending_idx);
-+              }
-+
-+              /* Remember the error: invalidate all subsequent fragments. */
-+              err = newerr;
-+      }
-+
-+      *mopp = mop + 1;
-+      return err;
-+}
-+
-+static void netbk_fill_frags(struct sk_buff *skb)
-+{
-+      struct skb_shared_info *shinfo = skb_shinfo(skb);
-+      int nr_frags = shinfo->nr_frags;
-+      int i;
-+
-+      for (i = 0; i < nr_frags; i++) {
-+              skb_frag_t *frag = shinfo->frags + i;
-+              netif_tx_request_t *txp;
-+              unsigned long pending_idx;
-+
-+              pending_idx = (unsigned long)frag->page;
-+
-+              pending_inuse[pending_idx].alloc_time = jiffies;
-+              list_add_tail(&pending_inuse[pending_idx].list,
-+                            &pending_inuse_head);
-+
-+              txp = &pending_tx_info[pending_idx].req;
-+              frag->page = virt_to_page(idx_to_kaddr(pending_idx));
-+              frag->size = txp->size;
-+              frag->page_offset = txp->offset;
-+
-+              skb->len += txp->size;
-+              skb->data_len += txp->size;
-+              skb->truesize += txp->size;
-+      }
-+}
-+
-+int netbk_get_extras(netif_t *netif, struct netif_extra_info *extras,
-+                   int work_to_do)
-+{
-+      struct netif_extra_info extra;
-+      RING_IDX cons = netif->tx.req_cons;
-+
-+      do {
-+              if (unlikely(work_to_do-- <= 0)) {
-+                      DPRINTK("Missing extra info\n");
-+                      return -EBADR;
-+              }
-+
-+              memcpy(&extra, RING_GET_REQUEST(&netif->tx, cons),
-+                     sizeof(extra));
-+              if (unlikely(!extra.type ||
-+                           extra.type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
-+                      netif->tx.req_cons = ++cons;
-+                      DPRINTK("Invalid extra type: %d\n", extra.type);
-+                      return -EINVAL;
-+              }
-+
-+              memcpy(&extras[extra.type - 1], &extra, sizeof(extra));
-+              netif->tx.req_cons = ++cons;
-+      } while (extra.flags & XEN_NETIF_EXTRA_FLAG_MORE);
-+
-+      return work_to_do;
-+}
-+
-+static int netbk_set_skb_gso(struct sk_buff *skb, struct netif_extra_info *gso)
-+{
-+      if (!gso->u.gso.size) {
-+              DPRINTK("GSO size must not be zero.\n");
-+              return -EINVAL;
-+      }
-+
-+      /* Currently only TCPv4 S.O. is supported. */
-+      if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
-+              DPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
-+              return -EINVAL;
-+      }
-+
-+      skb_shinfo(skb)->gso_size = gso->u.gso.size;
-+      skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
-+
-+      /* Header must be checked, and gso_segs computed. */
-+      skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
-+      skb_shinfo(skb)->gso_segs = 0;
-+
-+      return 0;
-+}
-+
-+/* Called after netfront has transmitted */
-+static void net_tx_action(unsigned long unused)
-+{
-+      struct list_head *ent;
-+      struct sk_buff *skb;
-+      netif_t *netif;
-+      netif_tx_request_t txreq;
-+      netif_tx_request_t txfrags[MAX_SKB_FRAGS];
-+      struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
-+      u16 pending_idx;
-+      RING_IDX i;
-+      gnttab_map_grant_ref_t *mop;
-+      unsigned int data_len;
-+      int ret, work_to_do;
-+
-+      if (dealloc_cons != dealloc_prod)
-+              net_tx_action_dealloc();
-+
-+      mop = tx_map_ops;
-+      while (((NR_PENDING_REQS + MAX_SKB_FRAGS) < MAX_PENDING_REQS) &&
-+              !list_empty(&net_schedule_list)) {
-+              /* Get a netif from the list with work to do. */
-+              ent = net_schedule_list.next;
-+              netif = list_entry(ent, netif_t, list);
-+              netif_get(netif);
-+              remove_from_net_schedule_list(netif);
-+
-+              RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, work_to_do);
-+              if (!work_to_do) {
-+                      netif_put(netif);
-+                      continue;
-+              }
-+
-+              i = netif->tx.req_cons;
-+              rmb(); /* Ensure that we see the request before we copy it. */
-+              memcpy(&txreq, RING_GET_REQUEST(&netif->tx, i), sizeof(txreq));
-+
-+              /* Credit-based scheduling. */
-+              if (txreq.size > netif->remaining_credit) {
-+                      unsigned long now = jiffies;
-+                      unsigned long next_credit = 
-+                              netif->credit_timeout.expires +
-+                              msecs_to_jiffies(netif->credit_usec / 1000);
-+
-+                      /* Timer could already be pending in rare cases. */
-+                      if (timer_pending(&netif->credit_timeout)) {
-+                              netif_put(netif);
-+                              continue;
-+                      }
-+
-+                      /* Passed the point where we can replenish credit? */
-+                      if (time_after_eq(now, next_credit)) {
-+                              netif->credit_timeout.expires = now;
-+                              tx_add_credit(netif);
-+                      }
-+
-+                      /* Still too big to send right now? Set a callback. */
-+                      if (txreq.size > netif->remaining_credit) {
-+                              netif->credit_timeout.data     =
-+                                      (unsigned long)netif;
-+                              netif->credit_timeout.function =
-+                                      tx_credit_callback;
-+                              __mod_timer(&netif->credit_timeout,
-+                                          next_credit);
-+                              netif_put(netif);
-+                              continue;
-+                      }
-+              }
-+              netif->remaining_credit -= txreq.size;
-+
-+              work_to_do--;
-+              netif->tx.req_cons = ++i;
-+
-+              memset(extras, 0, sizeof(extras));
-+              if (txreq.flags & NETTXF_extra_info) {
-+                      work_to_do = netbk_get_extras(netif, extras,
-+                                                    work_to_do);
-+                      i = netif->tx.req_cons;
-+                      if (unlikely(work_to_do < 0)) {
-+                              netbk_tx_err(netif, &txreq, i);
-+                              continue;
-+                      }
-+              }
-+
-+              ret = netbk_count_requests(netif, &txreq, txfrags, work_to_do);
-+              if (unlikely(ret < 0)) {
-+                      netbk_tx_err(netif, &txreq, i - ret);
-+                      continue;
-+              }
-+              i += ret;
-+
-+              if (unlikely(txreq.size < ETH_HLEN)) {
-+                      DPRINTK("Bad packet size: %d\n", txreq.size);
-+                      netbk_tx_err(netif, &txreq, i);
-+                      continue;
-+              }
-+
-+              /* No crossing a page as the payload mustn't fragment. */
-+              if (unlikely((txreq.offset + txreq.size) > PAGE_SIZE)) {
-+                      DPRINTK("txreq.offset: %x, size: %u, end: %lu\n", 
-+                              txreq.offset, txreq.size, 
-+                              (txreq.offset &~PAGE_MASK) + txreq.size);
-+                      netbk_tx_err(netif, &txreq, i);
-+                      continue;
-+              }
-+
-+              pending_idx = pending_ring[MASK_PEND_IDX(pending_cons)];
-+
-+              data_len = (txreq.size > PKT_PROT_LEN &&
-+                          ret < MAX_SKB_FRAGS) ?
-+                      PKT_PROT_LEN : txreq.size;
-+
-+              skb = alloc_skb(data_len + 16 + NET_IP_ALIGN,
-+                              GFP_ATOMIC | __GFP_NOWARN);
-+              if (unlikely(skb == NULL)) {
-+                      DPRINTK("Can't allocate a skb in start_xmit.\n");
-+                      netbk_tx_err(netif, &txreq, i);
-+                      break;
-+              }
-+
-+              /* Packets passed to netif_rx() must have some headroom. */
-+              skb_reserve(skb, 16 + NET_IP_ALIGN);
-+
-+              if (extras[XEN_NETIF_EXTRA_TYPE_GSO - 1].type) {
-+                      struct netif_extra_info *gso;
-+                      gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
-+
-+                      if (netbk_set_skb_gso(skb, gso)) {
-+                              kfree_skb(skb);
-+                              netbk_tx_err(netif, &txreq, i);
-+                              continue;
-+                      }
-+              }
-+
-+              gnttab_set_map_op(mop, idx_to_kaddr(pending_idx),
-+                                GNTMAP_host_map | GNTMAP_readonly,
-+                                txreq.gref, netif->domid);
-+              mop++;
-+
-+              memcpy(&pending_tx_info[pending_idx].req,
-+                     &txreq, sizeof(txreq));
-+              pending_tx_info[pending_idx].netif = netif;
-+              *((u16 *)skb->data) = pending_idx;
-+
-+              __skb_put(skb, data_len);
-+
-+              skb_shinfo(skb)->nr_frags = ret;
-+              if (data_len < txreq.size) {
-+                      skb_shinfo(skb)->nr_frags++;
-+                      skb_shinfo(skb)->frags[0].page =
-+                              (void *)(unsigned long)pending_idx;
-+              } else {
-+                      /* Discriminate from any valid pending_idx value. */
-+                      skb_shinfo(skb)->frags[0].page = (void *)~0UL;
-+              }
-+
-+              __skb_queue_tail(&tx_queue, skb);
-+
-+              pending_cons++;
-+
-+              mop = netbk_get_requests(netif, skb, txfrags, mop);
-+
-+              netif->tx.req_cons = i;
-+              netif_schedule_work(netif);
-+
-+              if ((mop - tx_map_ops) >= ARRAY_SIZE(tx_map_ops))
-+                      break;
-+      }
-+
-+      if (mop == tx_map_ops)
-+              return;
-+
-+      ret = HYPERVISOR_grant_table_op(
-+              GNTTABOP_map_grant_ref, tx_map_ops, mop - tx_map_ops);
-+      BUG_ON(ret);
-+
-+      mop = tx_map_ops;
-+      while ((skb = __skb_dequeue(&tx_queue)) != NULL) {
-+              netif_tx_request_t *txp;
-+
-+              pending_idx = *((u16 *)skb->data);
-+              netif       = pending_tx_info[pending_idx].netif;
-+              txp         = &pending_tx_info[pending_idx].req;
-+
-+              /* Check the remap error code. */
-+              if (unlikely(netbk_tx_check_mop(skb, &mop))) {
-+                      DPRINTK("netback grant failed.\n");
-+                      skb_shinfo(skb)->nr_frags = 0;
-+                      kfree_skb(skb);
-+                      continue;
-+              }
-+
-+              data_len = skb->len;
-+              memcpy(skb->data,
-+                     (void *)(idx_to_kaddr(pending_idx)|txp->offset),
-+                     data_len);
-+              if (data_len < txp->size) {
-+                      /* Append the packet payload as a fragment. */
-+                      txp->offset += data_len;
-+                      txp->size -= data_len;
-+              } else {
-+                      /* Schedule a response immediately. */
-+                      netif_idx_release(pending_idx);
-+              }
-+
-+              /*
-+               * Old frontends do not assert data_validated but we
-+               * can infer it from csum_blank so test both flags.
-+               */
-+              if (txp->flags & (NETTXF_data_validated|NETTXF_csum_blank)) {
-+                      skb->ip_summed = CHECKSUM_UNNECESSARY;
-+                      skb->proto_data_valid = 1;
-+              } else {
-+                      skb->ip_summed = CHECKSUM_NONE;
-+                      skb->proto_data_valid = 0;
-+              }
-+              skb->proto_csum_blank = !!(txp->flags & NETTXF_csum_blank);
-+
-+              netbk_fill_frags(skb);
-+
-+              skb->dev      = netif->dev;
-+              skb->protocol = eth_type_trans(skb, skb->dev);
-+
-+              netif->stats.rx_bytes += skb->len;
-+              netif->stats.rx_packets++;
-+
-+              if (unlikely(netbk_copy_skb_mode == NETBK_ALWAYS_COPY_SKB) &&
-+                  unlikely(skb_linearize(skb))) {
-+                      DPRINTK("Can't linearize skb in net_tx_action.\n");
-+                      kfree_skb(skb);
-+                      continue;
-+              }
-+
-+              netif_rx(skb);
-+              netif->dev->last_rx = jiffies;
-+      }
-+
-+      if (netbk_copy_skb_mode == NETBK_DELAYED_COPY_SKB &&
-+          !list_empty(&pending_inuse_head)) {
-+              struct netbk_tx_pending_inuse *oldest;
-+
-+              oldest = list_entry(pending_inuse_head.next,
-+                                  struct netbk_tx_pending_inuse, list);
-+              mod_timer(&netbk_tx_pending_timer, oldest->alloc_time + HZ);
-+      }
-+}
-+
-+static void netif_idx_release(u16 pending_idx)
-+{
-+      static DEFINE_SPINLOCK(_lock);
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&_lock, flags);
-+      dealloc_ring[MASK_PEND_IDX(dealloc_prod)] = pending_idx;
-+      /* Sync with net_tx_action_dealloc: insert idx /then/ incr producer. */
-+      smp_wmb();
-+      dealloc_prod++;
-+      spin_unlock_irqrestore(&_lock, flags);
-+
-+      tasklet_schedule(&net_tx_tasklet);
-+}
-+
-+static void netif_page_release(struct page *page)
-+{
-+      netif_idx_release(netif_page_index(page));
-+}
-+
-+irqreturn_t netif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      netif_t *netif = dev_id;
-+
-+      add_to_net_schedule_list_tail(netif);
-+      maybe_schedule_tx_action();
-+
-+      if (netif_schedulable(netif) && !netbk_queue_full(netif))
-+              netif_wake_queue(netif->dev);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void make_tx_response(netif_t *netif, 
-+                           netif_tx_request_t *txp,
-+                           s8       st)
-+{
-+      RING_IDX i = netif->tx.rsp_prod_pvt;
-+      netif_tx_response_t *resp;
-+      int notify;
-+
-+      resp = RING_GET_RESPONSE(&netif->tx, i);
-+      resp->id     = txp->id;
-+      resp->status = st;
-+
-+      if (txp->flags & NETTXF_extra_info)
-+              RING_GET_RESPONSE(&netif->tx, ++i)->status = NETIF_RSP_NULL;
-+
-+      netif->tx.rsp_prod_pvt = ++i;
-+      RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&netif->tx, notify);
-+      if (notify)
-+              notify_remote_via_irq(netif->irq);
-+
-+#ifdef CONFIG_XEN_NETDEV_PIPELINED_TRANSMITTER
-+      if (i == netif->tx.req_cons) {
-+              int more_to_do;
-+              RING_FINAL_CHECK_FOR_REQUESTS(&netif->tx, more_to_do);
-+              if (more_to_do)
-+                      add_to_net_schedule_list_tail(netif);
-+      }
-+#endif
-+}
-+
-+static netif_rx_response_t *make_rx_response(netif_t *netif, 
-+                                           u16      id, 
-+                                           s8       st,
-+                                           u16      offset,
-+                                           u16      size,
-+                                           u16      flags)
-+{
-+      RING_IDX i = netif->rx.rsp_prod_pvt;
-+      netif_rx_response_t *resp;
-+
-+      resp = RING_GET_RESPONSE(&netif->rx, i);
-+      resp->offset     = offset;
-+      resp->flags      = flags;
-+      resp->id         = id;
-+      resp->status     = (s16)size;
-+      if (st < 0)
-+              resp->status = (s16)st;
-+
-+      netif->rx.rsp_prod_pvt = ++i;
-+
-+      return resp;
-+}
-+
-+#ifdef NETBE_DEBUG_INTERRUPT
-+static irqreturn_t netif_be_dbg(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      struct list_head *ent;
-+      netif_t *netif;
-+      int i = 0;
-+
-+      printk(KERN_ALERT "netif_schedule_list:\n");
-+      spin_lock_irq(&net_schedule_list_lock);
-+
-+      list_for_each (ent, &net_schedule_list) {
-+              netif = list_entry(ent, netif_t, list);
-+              printk(KERN_ALERT " %d: private(rx_req_cons=%08x "
-+                     "rx_resp_prod=%08x\n",
-+                     i, netif->rx.req_cons, netif->rx.rsp_prod_pvt);
-+              printk(KERN_ALERT "   tx_req_cons=%08x tx_resp_prod=%08x)\n",
-+                     netif->tx.req_cons, netif->tx.rsp_prod_pvt);
-+              printk(KERN_ALERT "   shared(rx_req_prod=%08x "
-+                     "rx_resp_prod=%08x\n",
-+                     netif->rx.sring->req_prod, netif->rx.sring->rsp_prod);
-+              printk(KERN_ALERT "   rx_event=%08x tx_req_prod=%08x\n",
-+                     netif->rx.sring->rsp_event, netif->tx.sring->req_prod);
-+              printk(KERN_ALERT "   tx_resp_prod=%08x, tx_event=%08x)\n",
-+                     netif->tx.sring->rsp_prod, netif->tx.sring->rsp_event);
-+              i++;
-+      }
-+
-+      spin_unlock_irq(&net_schedule_list_lock);
-+      printk(KERN_ALERT " ** End of netif_schedule_list **\n");
-+
-+      return IRQ_HANDLED;
-+}
-+#endif
-+
-+static int __init netback_init(void)
-+{
-+      int i;
-+      struct page *page;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      /* We can increase reservation by this much in net_rx_action(). */
-+      balloon_update_driver_allowance(NET_RX_RING_SIZE);
-+
-+      skb_queue_head_init(&rx_queue);
-+      skb_queue_head_init(&tx_queue);
-+
-+      init_timer(&net_timer);
-+      net_timer.data = 0;
-+      net_timer.function = net_alarm;
-+
-+      init_timer(&netbk_tx_pending_timer);
-+      netbk_tx_pending_timer.data = 0;
-+      netbk_tx_pending_timer.function = netbk_tx_pending_timeout;
-+
-+      mmap_pages = alloc_empty_pages_and_pagevec(MAX_PENDING_REQS);
-+      if (mmap_pages == NULL) {
-+              printk("%s: out of memory\n", __FUNCTION__);
-+              return -ENOMEM;
-+      }
-+
-+      for (i = 0; i < MAX_PENDING_REQS; i++) {
-+              page = mmap_pages[i];
-+              SetPageForeign(page, netif_page_release);
-+              netif_page_index(page) = i;
-+              INIT_LIST_HEAD(&pending_inuse[i].list);
-+      }
-+
-+      pending_cons = 0;
-+      pending_prod = MAX_PENDING_REQS;
-+      for (i = 0; i < MAX_PENDING_REQS; i++)
-+              pending_ring[i] = i;
-+
-+      spin_lock_init(&net_schedule_list_lock);
-+      INIT_LIST_HEAD(&net_schedule_list);
-+
-+      netbk_copy_skb_mode = NETBK_DONT_COPY_SKB;
-+      if (MODPARM_copy_skb) {
-+              if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_and_replace,
-+                                            NULL, 0))
-+                      netbk_copy_skb_mode = NETBK_ALWAYS_COPY_SKB;
-+              else
-+                      netbk_copy_skb_mode = NETBK_DELAYED_COPY_SKB;
-+      }
-+
-+      netif_accel_init();
-+
-+      netif_xenbus_init();
-+
-+#ifdef NETBE_DEBUG_INTERRUPT
-+      (void)bind_virq_to_irqhandler(VIRQ_DEBUG,
-+                                    0,
-+                                    netif_be_dbg,
-+                                    SA_SHIRQ, 
-+                                    "net-be-dbg",
-+                                    &netif_be_dbg);
-+#endif
-+
-+      return 0;
-+}
-+
-+module_init(netback_init);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/netback/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netback/xenbus.c       2008-09-01 12:07:31.000000000 +0200
-@@ -0,0 +1,454 @@
-+/*  Xenbus code for netif backend
-+    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-+    Copyright (C) 2005 XenSource Ltd
-+
-+    This program is free software; you can redistribute it and/or modify
-+    it under the terms of the GNU General Public License as published by
-+    the Free Software Foundation; either version 2 of the License, or
-+    (at your option) any later version.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+*/
-+
-+#include <stdarg.h>
-+#include <linux/module.h>
-+#include <xen/xenbus.h>
-+#include "common.h"
-+
-+#if 0
-+#undef DPRINTK
-+#define DPRINTK(fmt, args...) \
-+    printk("netback/xenbus (%s:%d) " fmt ".\n", __FUNCTION__, __LINE__, ##args)
-+#endif
-+
-+
-+static int connect_rings(struct backend_info *);
-+static void connect(struct backend_info *);
-+static void backend_create_netif(struct backend_info *be);
-+
-+static int netback_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      netback_remove_accelerators(be, dev);
-+
-+      if (be->netif) {
-+              kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
-+              netif_disconnect(be->netif);
-+              be->netif = NULL;
-+      }
-+      kfree(be);
-+      dev->dev.driver_data = NULL;
-+      return 0;
-+}
-+
-+
-+/**
-+ * Entry point to this code when a new device is created.  Allocate the basic
-+ * structures and switch to InitWait.
-+ */
-+static int netback_probe(struct xenbus_device *dev,
-+                       const struct xenbus_device_id *id)
-+{
-+      const char *message;
-+      struct xenbus_transaction xbt;
-+      int err;
-+      int sg;
-+      struct backend_info *be = kzalloc(sizeof(struct backend_info),
-+                                        GFP_KERNEL);
-+      if (!be) {
-+              xenbus_dev_fatal(dev, -ENOMEM,
-+                               "allocating backend structure");
-+              return -ENOMEM;
-+      }
-+
-+      be->dev = dev;
-+      dev->dev.driver_data = be;
-+
-+      sg = 1;
-+      if (netbk_copy_skb_mode == NETBK_ALWAYS_COPY_SKB)
-+              sg = 0;
-+
-+      do {
-+              err = xenbus_transaction_start(&xbt);
-+              if (err) {
-+                      xenbus_dev_fatal(dev, err, "starting transaction");
-+                      goto fail;
-+              }
-+
-+              err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", sg);
-+              if (err) {
-+                      message = "writing feature-sg";
-+                      goto abort_transaction;
-+              }
-+
-+              err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4",
-+                                  "%d", sg);
-+              if (err) {
-+                      message = "writing feature-gso-tcpv4";
-+                      goto abort_transaction;
-+              }
-+
-+              /* We support rx-copy path. */
-+              err = xenbus_printf(xbt, dev->nodename,
-+                                  "feature-rx-copy", "%d", 1);
-+              if (err) {
-+                      message = "writing feature-rx-copy";
-+                      goto abort_transaction;
-+              }
-+
-+              /*
-+               * We don't support rx-flip path (except old guests who don't
-+               * grok this feature flag).
-+               */
-+              err = xenbus_printf(xbt, dev->nodename,
-+                                  "feature-rx-flip", "%d", 0);
-+              if (err) {
-+                      message = "writing feature-rx-flip";
-+                      goto abort_transaction;
-+              }
-+
-+              err = xenbus_transaction_end(xbt, 0);
-+      } while (err == -EAGAIN);
-+
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "completing transaction");
-+              goto fail;
-+      }
-+
-+      netback_probe_accelerators(be, dev);
-+
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err)
-+              goto fail;
-+
-+      /* This kicks hotplug scripts, so do it immediately. */
-+      backend_create_netif(be);
-+
-+      return 0;
-+
-+abort_transaction:
-+      xenbus_transaction_end(xbt, 1);
-+      xenbus_dev_fatal(dev, err, "%s", message);
-+fail:
-+      DPRINTK("failed");
-+      netback_remove(dev);
-+      return err;
-+}
-+
-+
-+/**
-+ * Handle the creation of the hotplug script environment.  We add the script
-+ * and vif variables to the environment, for the benefit of the vif-* hotplug
-+ * scripts.
-+ */
-+static int netback_uevent(struct xenbus_device *xdev, char **envp,
-+                        int num_envp, char *buffer, int buffer_size)
-+{
-+      struct backend_info *be = xdev->dev.driver_data;
-+      netif_t *netif = be->netif;
-+      int i = 0, length = 0;
-+      char *val;
-+
-+      DPRINTK("netback_uevent");
-+
-+      val = xenbus_read(XBT_NIL, xdev->nodename, "script", NULL);
-+      if (IS_ERR(val)) {
-+              int err = PTR_ERR(val);
-+              xenbus_dev_fatal(xdev, err, "reading script");
-+              return err;
-+      }
-+      else {
-+              add_uevent_var(envp, num_envp, &i, buffer, buffer_size,
-+                             &length, "script=%s", val);
-+              kfree(val);
-+      }
-+
-+      add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-+                     "vif=%s", netif->dev->name);
-+
-+      envp[i] = NULL;
-+
-+      return 0;
-+}
-+
-+
-+static void backend_create_netif(struct backend_info *be)
-+{
-+      int err;
-+      long handle;
-+      struct xenbus_device *dev = be->dev;
-+
-+      if (be->netif != NULL)
-+              return;
-+
-+      err = xenbus_scanf(XBT_NIL, dev->nodename, "handle", "%li", &handle);
-+      if (err != 1) {
-+              xenbus_dev_fatal(dev, err, "reading handle");
-+              return;
-+      }
-+
-+      be->netif = netif_alloc(dev->otherend_id, handle);
-+      if (IS_ERR(be->netif)) {
-+              err = PTR_ERR(be->netif);
-+              be->netif = NULL;
-+              xenbus_dev_fatal(dev, err, "creating interface");
-+              return;
-+      }
-+
-+      kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
-+}
-+
-+
-+/**
-+ * Callback received when the frontend's state changes.
-+ */
-+static void frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      DPRINTK("%s", xenbus_strstate(frontend_state));
-+
-+      be->frontend_state = frontend_state;
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+              if (dev->state == XenbusStateClosed) {
-+                      printk(KERN_INFO "%s: %s: prepare for reconnect\n",
-+                             __FUNCTION__, dev->nodename);
-+                      xenbus_switch_state(dev, XenbusStateInitWait);
-+              }
-+              break;
-+
-+      case XenbusStateInitialised:
-+              break;
-+
-+      case XenbusStateConnected:
-+              if (dev->state == XenbusStateConnected)
-+                      break;
-+              backend_create_netif(be);
-+              if (be->netif)
-+                      connect(be);
-+              break;
-+
-+      case XenbusStateClosing:
-+              if (be->netif) {
-+                      kobject_uevent(&dev->dev.kobj, KOBJ_OFFLINE);
-+                      netif_disconnect(be->netif);
-+                      be->netif = NULL;
-+              }
-+              xenbus_switch_state(dev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateClosed:
-+              xenbus_switch_state(dev, XenbusStateClosed);
-+              if (xenbus_dev_is_online(dev))
-+                      break;
-+              /* fall through if not online */
-+      case XenbusStateUnknown:
-+              device_unregister(&dev->dev);
-+              break;
-+
-+      default:
-+              xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-+                               frontend_state);
-+              break;
-+      }
-+}
-+
-+
-+static void xen_net_read_rate(struct xenbus_device *dev,
-+                            unsigned long *bytes, unsigned long *usec)
-+{
-+      char *s, *e;
-+      unsigned long b, u;
-+      char *ratestr;
-+
-+      /* Default to unlimited bandwidth. */
-+      *bytes = ~0UL;
-+      *usec = 0;
-+
-+      ratestr = xenbus_read(XBT_NIL, dev->nodename, "rate", NULL);
-+      if (IS_ERR(ratestr))
-+              return;
-+
-+      s = ratestr;
-+      b = simple_strtoul(s, &e, 10);
-+      if ((s == e) || (*e != ','))
-+              goto fail;
-+
-+      s = e + 1;
-+      u = simple_strtoul(s, &e, 10);
-+      if ((s == e) || (*e != '\0'))
-+              goto fail;
-+
-+      *bytes = b;
-+      *usec = u;
-+
-+      kfree(ratestr);
-+      return;
-+
-+ fail:
-+      WPRINTK("Failed to parse network rate limit. Traffic unlimited.\n");
-+      kfree(ratestr);
-+}
-+
-+static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
-+{
-+      char *s, *e, *macstr;
-+      int i;
-+
-+      macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
-+      if (IS_ERR(macstr))
-+              return PTR_ERR(macstr);
-+
-+      for (i = 0; i < ETH_ALEN; i++) {
-+              mac[i] = simple_strtoul(s, &e, 16);
-+              if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
-+                      kfree(macstr);
-+                      return -ENOENT;
-+              }
-+              s = e+1;
-+      }
-+
-+      kfree(macstr);
-+      return 0;
-+}
-+
-+static void connect(struct backend_info *be)
-+{
-+      int err;
-+      struct xenbus_device *dev = be->dev;
-+
-+      err = connect_rings(be);
-+      if (err)
-+              return;
-+
-+      err = xen_net_read_mac(dev, be->netif->fe_dev_addr);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "parsing %s/mac", dev->nodename);
-+              return;
-+      }
-+
-+      xen_net_read_rate(dev, &be->netif->credit_bytes,
-+                        &be->netif->credit_usec);
-+      be->netif->remaining_credit = be->netif->credit_bytes;
-+
-+      xenbus_switch_state(dev, XenbusStateConnected);
-+
-+      netif_wake_queue(be->netif->dev);
-+}
-+
-+
-+static int connect_rings(struct backend_info *be)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long tx_ring_ref, rx_ring_ref;
-+      unsigned int evtchn, rx_copy;
-+      int err;
-+      int val;
-+
-+      DPRINTK("");
-+
-+      err = xenbus_gather(XBT_NIL, dev->otherend,
-+                          "tx-ring-ref", "%lu", &tx_ring_ref,
-+                          "rx-ring-ref", "%lu", &rx_ring_ref,
-+                          "event-channel", "%u", &evtchn, NULL);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err,
-+                               "reading %s/ring-ref and event-channel",
-+                               dev->otherend);
-+              return err;
-+      }
-+
-+      err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",
-+                         &rx_copy);
-+      if (err == -ENOENT) {
-+              err = 0;
-+              rx_copy = 0;
-+      }
-+      if (err < 0) {
-+              xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",
-+                               dev->otherend);
-+              return err;
-+      }
-+      be->netif->copying_receiver = !!rx_copy;
-+
-+      if (be->netif->dev->tx_queue_len != 0) {
-+              if (xenbus_scanf(XBT_NIL, dev->otherend,
-+                               "feature-rx-notify", "%d", &val) < 0)
-+                      val = 0;
-+              if (val)
-+                      be->netif->can_queue = 1;
-+              else
-+                      /* Must be non-zero for pfifo_fast to work. */
-+                      be->netif->dev->tx_queue_len = 1;
-+      }
-+
-+      if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg", "%d", &val) < 0)
-+              val = 0;
-+      if (val) {
-+              be->netif->features |= NETIF_F_SG;
-+              be->netif->dev->features |= NETIF_F_SG;
-+      }
-+
-+      if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4", "%d",
-+                       &val) < 0)
-+              val = 0;
-+      if (val) {
-+              be->netif->features |= NETIF_F_TSO;
-+              be->netif->dev->features |= NETIF_F_TSO;
-+      }
-+
-+      if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
-+                       "%d", &val) < 0)
-+              val = 0;
-+      if (val) {
-+              be->netif->features &= ~NETIF_F_IP_CSUM;
-+              be->netif->dev->features &= ~NETIF_F_IP_CSUM;
-+      }
-+
-+      /* Map the shared frame, irq etc. */
-+      err = netif_map(be->netif, tx_ring_ref, rx_ring_ref, evtchn);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err,
-+                               "mapping shared-frames %lu/%lu port %u",
-+                               tx_ring_ref, rx_ring_ref, evtchn);
-+              return err;
-+      }
-+      return 0;
-+}
-+
-+
-+/* ** Driver Registration ** */
-+
-+
-+static const struct xenbus_device_id netback_ids[] = {
-+      { "vif" },
-+      { "" }
-+};
-+
-+
-+static struct xenbus_driver netback = {
-+      .name = "vif",
-+      .owner = THIS_MODULE,
-+      .ids = netback_ids,
-+      .probe = netback_probe,
-+      .remove = netback_remove,
-+      .uevent = netback_uevent,
-+      .otherend_changed = frontend_changed,
-+};
-+
-+
-+void netif_xenbus_init(void)
-+{
-+      xenbus_register_backend(&netback);
-+}
-Index: head-2008-11-25/drivers/xen/netfront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netfront/Makefile      2007-07-12 08:54:23.000000000 +0200
-@@ -0,0 +1,4 @@
-+
-+obj-$(CONFIG_XEN_NETDEV_FRONTEND)     := xennet.o
-+
-+xennet-objs := netfront.o accel.o
-Index: head-2008-11-25/drivers/xen/netfront/accel.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netfront/accel.c       2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,824 @@
-+/******************************************************************************
-+ * Virtual network driver for conversing with remote driver backends.
-+ *
-+ * Copyright (C) 2007 Solarflare Communications, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/netdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+
-+#include "netfront.h"
-+
-+#define DPRINTK(fmt, args...)                         \
-+      pr_debug("netfront/accel (%s:%d) " fmt,         \
-+             __FUNCTION__, __LINE__, ##args)
-+#define IPRINTK(fmt, args...)                         \
-+      printk(KERN_INFO "netfront/accel: " fmt, ##args)
-+#define WPRINTK(fmt, args...)                         \
-+      printk(KERN_WARNING "netfront/accel: " fmt, ##args)
-+
-+static int netfront_remove_accelerator(struct netfront_info *np,
-+                                     struct xenbus_device *dev);
-+static int netfront_load_accelerator(struct netfront_info *np, 
-+                                   struct xenbus_device *dev, 
-+                                   const char *frontend);
-+
-+/*
-+ * List of all netfront accelerator plugin modules available.  Each
-+ * list entry is of type struct netfront_accelerator.
-+ */ 
-+static struct list_head accelerators_list;
-+
-+/* Lock to protect access to accelerators_list */
-+static spinlock_t accelerators_lock;
-+
-+/* Workqueue to process acceleration configuration changes */
-+struct workqueue_struct *accel_watch_workqueue;
-+
-+/* Mutex to prevent concurrent loads and suspends, etc. */
-+DEFINE_MUTEX(accelerator_mutex);
-+
-+void netif_init_accel(void)
-+{
-+      INIT_LIST_HEAD(&accelerators_list);
-+      spin_lock_init(&accelerators_lock);
-+
-+      accel_watch_workqueue = create_workqueue("net_accel");
-+}
-+
-+void netif_exit_accel(void)
-+{
-+      struct netfront_accelerator *accelerator, *tmp;
-+      unsigned long flags;
-+
-+      flush_workqueue(accel_watch_workqueue);
-+      destroy_workqueue(accel_watch_workqueue);
-+
-+      spin_lock_irqsave(&accelerators_lock, flags);
-+
-+      list_for_each_entry_safe(accelerator, tmp, &accelerators_list, link) {
-+              BUG_ON(!list_empty(&accelerator->vif_states));
-+
-+              list_del(&accelerator->link);
-+              kfree(accelerator->frontend);
-+              kfree(accelerator);
-+      }
-+
-+      spin_unlock_irqrestore(&accelerators_lock, flags);
-+}
-+
-+
-+/* 
-+ * Watch the configured accelerator and change plugin if it's modified 
-+ */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+static void accel_watch_work(struct work_struct *context)
-+#else
-+static void accel_watch_work(void *context)
-+#endif
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      struct netfront_accel_vif_state *vif_state = 
-+              container_of(context, struct netfront_accel_vif_state, 
-+                           accel_work);
-+#else
-+        struct netfront_accel_vif_state *vif_state = 
-+              (struct netfront_accel_vif_state *)context;
-+#endif
-+      struct netfront_info *np = vif_state->np;
-+      char *accel_frontend;
-+      int accel_len, rc = -1;
-+
-+      mutex_lock(&accelerator_mutex);
-+
-+      accel_frontend = xenbus_read(XBT_NIL, np->xbdev->otherend, 
-+                                   "accel-frontend", &accel_len);
-+      if (IS_ERR(accel_frontend)) {
-+              accel_frontend = NULL;
-+              netfront_remove_accelerator(np, np->xbdev);
-+      } else {
-+              /* If this is the first time, request the accelerator,
-+                 otherwise only request one if it has changed */
-+              if (vif_state->accel_frontend == NULL) {
-+                      rc = netfront_load_accelerator(np, np->xbdev, 
-+                                                     accel_frontend);
-+              } else {
-+                      if (strncmp(vif_state->accel_frontend, accel_frontend,
-+                                  accel_len)) {
-+                              netfront_remove_accelerator(np, np->xbdev);
-+                              rc = netfront_load_accelerator(np, np->xbdev, 
-+                                                             accel_frontend);
-+                      }
-+              }
-+      }
-+
-+      /* Get rid of previous state and replace with the new name */
-+      if (vif_state->accel_frontend != NULL)
-+              kfree(vif_state->accel_frontend);
-+      vif_state->accel_frontend = accel_frontend;
-+
-+      mutex_unlock(&accelerator_mutex);
-+
-+      if (rc == 0) {
-+              DPRINTK("requesting module %s\n", accel_frontend);
-+              request_module("%s", accel_frontend);
-+              /*
-+               * Module should now call netfront_accelerator_loaded() once
-+               * it's up and running, and we can continue from there 
-+               */
-+      }
-+}
-+
-+
-+static void accel_watch_changed(struct xenbus_watch *watch,
-+                              const char **vec, unsigned int len)
-+{
-+      struct netfront_accel_vif_state *vif_state = 
-+              container_of(watch, struct netfront_accel_vif_state,
-+                           accel_watch);
-+      queue_work(accel_watch_workqueue, &vif_state->accel_work);
-+}
-+
-+
-+void netfront_accelerator_add_watch(struct netfront_info *np)
-+{
-+      int err;
-+      
-+      /* Check we're not trying to overwrite an existing watch */
-+      BUG_ON(np->accel_vif_state.accel_watch.node != NULL);
-+
-+      /* Get a watch on the accelerator plugin */
-+      err = xenbus_watch_path2(np->xbdev, np->xbdev->otherend, 
-+                               "accel-frontend", 
-+                               &np->accel_vif_state.accel_watch,
-+                               accel_watch_changed);
-+      if (err) {
-+              DPRINTK("%s: Failed to register accel watch: %d\n",
-+                        __FUNCTION__, err);
-+              np->accel_vif_state.accel_watch.node = NULL;
-+        }
-+}
-+
-+
-+static
-+void netfront_accelerator_remove_watch(struct netfront_info *np)
-+{
-+      struct netfront_accel_vif_state *vif_state = &np->accel_vif_state;
-+
-+      /* Get rid of watch on accelerator plugin */
-+      if (vif_state->accel_watch.node != NULL) {
-+              unregister_xenbus_watch(&vif_state->accel_watch);
-+              kfree(vif_state->accel_watch.node);
-+              vif_state->accel_watch.node = NULL;
-+
-+              flush_workqueue(accel_watch_workqueue);
-+
-+              /* Clean up any state left from watch */
-+              if (vif_state->accel_frontend != NULL) {
-+                      kfree(vif_state->accel_frontend);
-+                      vif_state->accel_frontend = NULL;
-+              }
-+      }       
-+}
-+
-+
-+/* 
-+ * Initialise the accel_vif_state field in the netfront state
-+ */ 
-+void init_accelerator_vif(struct netfront_info *np,
-+                        struct xenbus_device *dev)
-+{
-+      np->accelerator = NULL;
-+
-+      /* It's assumed that these things don't change */
-+      np->accel_vif_state.np = np;
-+      np->accel_vif_state.dev = dev;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      INIT_WORK(&np->accel_vif_state.accel_work, accel_watch_work);
-+#else
-+      INIT_WORK(&np->accel_vif_state.accel_work, accel_watch_work, 
-+                &np->accel_vif_state);
-+#endif
-+}
-+
-+
-+/*
-+ * Compare a frontend description string against an accelerator to see
-+ * if they match.  Would ultimately be nice to replace the string with
-+ * a unique numeric identifier for each accelerator.
-+ */
-+static int match_accelerator(const char *frontend, 
-+                           struct netfront_accelerator *accelerator)
-+{
-+      return strcmp(frontend, accelerator->frontend) == 0;
-+}
-+
-+
-+/* 
-+ * Add a frontend vif to the list of vifs that is using a netfront
-+ * accelerator plugin module.
-+ */
-+static void add_accelerator_vif(struct netfront_accelerator *accelerator,
-+                              struct netfront_info *np)
-+{
-+      unsigned long flags;
-+
-+      /* Need lock to write list */
-+      spin_lock_irqsave(&accelerator->vif_states_lock, flags);
-+
-+      if (np->accelerator == NULL) {
-+              np->accelerator = accelerator;
-+              
-+              list_add(&np->accel_vif_state.link, &accelerator->vif_states);
-+      } else {
-+              /* 
-+               * May get here legitimately if suspend_cancel is
-+               * called, but in that case configuration should not
-+               * have changed
-+               */
-+              BUG_ON(np->accelerator != accelerator);
-+      }
-+
-+      spin_unlock_irqrestore(&accelerator->vif_states_lock, flags);
-+}
-+
-+
-+/*
-+ * Initialise the state to track an accelerator plugin module.
-+ */ 
-+static int init_accelerator(const char *frontend, 
-+                          struct netfront_accelerator **result,
-+                          struct netfront_accel_hooks *hooks)
-+{
-+      struct netfront_accelerator *accelerator = 
-+              kmalloc(sizeof(struct netfront_accelerator), GFP_KERNEL);
-+      unsigned long flags;
-+      int frontend_len;
-+
-+      if (!accelerator) {
-+              DPRINTK("no memory for accelerator\n");
-+              return -ENOMEM;
-+      }
-+
-+      frontend_len = strlen(frontend) + 1;
-+      accelerator->frontend = kmalloc(frontend_len, GFP_KERNEL);
-+      if (!accelerator->frontend) {
-+              DPRINTK("no memory for accelerator\n");
-+              kfree(accelerator);
-+              return -ENOMEM;
-+      }
-+      strlcpy(accelerator->frontend, frontend, frontend_len);
-+      
-+      INIT_LIST_HEAD(&accelerator->vif_states);
-+      spin_lock_init(&accelerator->vif_states_lock);
-+
-+      accelerator->hooks = hooks;
-+
-+      spin_lock_irqsave(&accelerators_lock, flags);
-+      list_add(&accelerator->link, &accelerators_list);
-+      spin_unlock_irqrestore(&accelerators_lock, flags);
-+
-+      *result = accelerator;
-+
-+      return 0;
-+}                                     
-+
-+
-+/* 
-+ * Modify the hooks stored in the per-vif state to match that in the
-+ * netfront accelerator's state.
-+ */
-+static void 
-+accelerator_set_vif_state_hooks(struct netfront_accel_vif_state *vif_state)
-+{
-+      /* This function must be called with the vif_states_lock held */
-+
-+      DPRINTK("%p\n",vif_state);
-+
-+      /* Make sure there are no data path operations going on */
-+      netif_poll_disable(vif_state->np->netdev);
-+      netif_tx_lock_bh(vif_state->np->netdev);
-+
-+      vif_state->hooks = vif_state->np->accelerator->hooks;
-+
-+      netif_tx_unlock_bh(vif_state->np->netdev);
-+      netif_poll_enable(vif_state->np->netdev);
-+}
-+
-+
-+static void accelerator_probe_new_vif(struct netfront_info *np,
-+                                    struct xenbus_device *dev, 
-+                                    struct netfront_accelerator *accelerator)
-+{
-+      struct netfront_accel_hooks *hooks;
-+      unsigned long flags;
-+
-+      DPRINTK("\n");
-+
-+      /* Include this frontend device on the accelerator's list */
-+      add_accelerator_vif(accelerator, np);
-+      
-+      hooks = accelerator->hooks;
-+      
-+      if (hooks) {
-+              if (hooks->new_device(np->netdev, dev) == 0) {
-+                      spin_lock_irqsave
-+                              (&accelerator->vif_states_lock, flags);
-+
-+                      accelerator_set_vif_state_hooks(&np->accel_vif_state);
-+
-+                      spin_unlock_irqrestore
-+                              (&accelerator->vif_states_lock, flags);
-+              }
-+      }
-+
-+      return;
-+}
-+
-+
-+/*  
-+ * Request that a particular netfront accelerator plugin is loaded.
-+ * Usually called as a result of the vif configuration specifying
-+ * which one to use. Must be called with accelerator_mutex held 
-+ */
-+static int netfront_load_accelerator(struct netfront_info *np, 
-+                                   struct xenbus_device *dev, 
-+                                   const char *frontend)
-+{
-+      struct netfront_accelerator *accelerator;
-+      int rc = 0;
-+
-+      DPRINTK(" %s\n", frontend);
-+
-+      /* 
-+       * Look at list of loaded accelerators to see if the requested
-+       * one is already there 
-+       */
-+      list_for_each_entry(accelerator, &accelerators_list, link) {
-+              if (match_accelerator(frontend, accelerator)) {
-+                      accelerator_probe_new_vif(np, dev, accelerator);
-+                      return 0;
-+              }
-+      }
-+
-+      /* Couldn't find it, so create a new one and load the module */
-+      if ((rc = init_accelerator(frontend, &accelerator, NULL)) < 0) {
-+              return rc;
-+      }
-+
-+      /* Include this frontend device on the accelerator's list */
-+      add_accelerator_vif(accelerator, np);
-+
-+      return rc;
-+}
-+
-+
-+/*
-+ * Go through all the netfront vifs and see if they have requested
-+ * this accelerator.  Notify the accelerator plugin of the relevant
-+ * device if so.  Called when an accelerator plugin module is first
-+ * loaded and connects to netfront.
-+ */
-+static void 
-+accelerator_probe_vifs(struct netfront_accelerator *accelerator,
-+                     struct netfront_accel_hooks *hooks)
-+{
-+      struct netfront_accel_vif_state *vif_state, *tmp;
-+      unsigned long flags;
-+
-+      DPRINTK("%p\n", accelerator);
-+
-+      /* 
-+       * Store the hooks for future calls to probe a new device, and
-+       * to wire into the vif_state once the accelerator plugin is
-+       * ready to accelerate each vif
-+       */
-+      BUG_ON(hooks == NULL);
-+      accelerator->hooks = hooks;
-+
-+      /* 
-+       *  currently hold accelerator_mutex, so don't need
-+       *  vif_states_lock to read the list
-+       */
-+      list_for_each_entry_safe(vif_state, tmp, &accelerator->vif_states,
-+                               link) {
-+              struct netfront_info *np = vif_state->np;
-+              
-+              if (hooks->new_device(np->netdev, vif_state->dev) == 0) {
-+                      spin_lock_irqsave
-+                              (&accelerator->vif_states_lock, flags);
-+
-+                      accelerator_set_vif_state_hooks(vif_state);
-+
-+                      spin_unlock_irqrestore
-+                              (&accelerator->vif_states_lock, flags);
-+              }
-+      }
-+}
-+
-+
-+/* 
-+ * Called by the netfront accelerator plugin module when it has loaded 
-+ */
-+int netfront_accelerator_loaded(int version, const char *frontend, 
-+                              struct netfront_accel_hooks *hooks)
-+{
-+      struct netfront_accelerator *accelerator;
-+
-+      if (is_initial_xendomain())
-+              return -EINVAL;
-+
-+      if (version != NETFRONT_ACCEL_VERSION) {
-+              if (version > NETFRONT_ACCEL_VERSION) {
-+                      /* Caller has higher version number, leave it
-+                         up to them to decide whether to continue.
-+                         They can re-call with a lower number if
-+                         they're happy to be compatible with us */
-+                      return NETFRONT_ACCEL_VERSION;
-+              } else {
-+                      /* We have a more recent version than caller.
-+                         Currently reject, but may in future be able
-+                         to be backwardly compatible */
-+                      return -EPROTO;
-+              }
-+      }
-+
-+      mutex_lock(&accelerator_mutex);
-+
-+      /* 
-+       * Look through list of accelerators to see if it has already
-+       * been requested
-+       */
-+      list_for_each_entry(accelerator, &accelerators_list, link) {
-+              if (match_accelerator(frontend, accelerator)) {
-+                      accelerator_probe_vifs(accelerator, hooks);
-+                      goto out;
-+              }
-+      }
-+
-+      /*
-+       * If it wasn't in the list, add it now so that when it is
-+       * requested the caller will find it
-+       */
-+      DPRINTK("Couldn't find matching accelerator (%s)\n",
-+              frontend);
-+
-+      init_accelerator(frontend, &accelerator, hooks);
-+
-+ out:
-+      mutex_unlock(&accelerator_mutex);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(netfront_accelerator_loaded);
-+
-+
-+/* 
-+ * Remove the hooks from a single vif state.
-+ */
-+static void 
-+accelerator_remove_single_hook(struct netfront_accelerator *accelerator,
-+                             struct netfront_accel_vif_state *vif_state)
-+{
-+      /* Make sure there are no data path operations going on */
-+      netif_poll_disable(vif_state->np->netdev);
-+      netif_tx_lock_bh(vif_state->np->netdev);
-+
-+      /* 
-+       * Remove the hooks, but leave the vif_state on the
-+       * accelerator's list as that signifies this vif is
-+       * interested in using that accelerator if it becomes
-+       * available again
-+       */
-+      vif_state->hooks = NULL;
-+      
-+      netif_tx_unlock_bh(vif_state->np->netdev);
-+      netif_poll_enable(vif_state->np->netdev);                      
-+}
-+
-+
-+/* 
-+ * Safely remove the accelerator function hooks from a netfront state.
-+ */
-+static void accelerator_remove_hooks(struct netfront_accelerator *accelerator)
-+{
-+      struct netfront_accel_hooks *hooks;
-+      struct netfront_accel_vif_state *vif_state, *tmp;
-+      unsigned long flags;
-+
-+      /* Mutex is held so don't need vif_states_lock to iterate list */
-+      list_for_each_entry_safe(vif_state, tmp,
-+                               &accelerator->vif_states,
-+                               link) {
-+              spin_lock_irqsave(&accelerator->vif_states_lock, flags);
-+
-+              if(vif_state->hooks) {
-+                      hooks = vif_state->hooks;
-+                      
-+                      /* Last chance to get statistics from the accelerator */
-+                      hooks->get_stats(vif_state->np->netdev,
-+                                       &vif_state->np->stats);
-+
-+                      spin_unlock_irqrestore(&accelerator->vif_states_lock,
-+                                             flags);
-+
-+                      accelerator_remove_single_hook(accelerator, vif_state);
-+
-+                      accelerator->hooks->remove(vif_state->dev);
-+              } else {
-+                      spin_unlock_irqrestore(&accelerator->vif_states_lock,
-+                                             flags);
-+              }
-+      }
-+      
-+      accelerator->hooks = NULL;
-+}
-+
-+
-+/* 
-+ * Called by a netfront accelerator when it is unloaded.  This safely
-+ * removes the hooks into the plugin and blocks until all devices have
-+ * finished using it, so on return it is safe to unload.
-+ */
-+void netfront_accelerator_stop(const char *frontend)
-+{
-+      struct netfront_accelerator *accelerator;
-+      unsigned long flags;
-+
-+      mutex_lock(&accelerator_mutex);
-+      spin_lock_irqsave(&accelerators_lock, flags);
-+
-+      list_for_each_entry(accelerator, &accelerators_list, link) {
-+              if (match_accelerator(frontend, accelerator)) {
-+                      spin_unlock_irqrestore(&accelerators_lock, flags);
-+
-+                      accelerator_remove_hooks(accelerator);
-+
-+                      goto out;
-+              }
-+      }
-+      spin_unlock_irqrestore(&accelerators_lock, flags);
-+ out:
-+      mutex_unlock(&accelerator_mutex);
-+}
-+EXPORT_SYMBOL_GPL(netfront_accelerator_stop);
-+
-+
-+/* Helper for call_remove and do_suspend */
-+static int do_remove(struct netfront_info *np, struct xenbus_device *dev,
-+                   unsigned long *lock_flags)
-+{
-+      struct netfront_accelerator *accelerator = np->accelerator;
-+      struct netfront_accel_hooks *hooks;
-+      int rc = 0;
-+ 
-+      if (np->accel_vif_state.hooks) {
-+              hooks = np->accel_vif_state.hooks;
-+
-+              /* Last chance to get statistics from the accelerator */
-+              hooks->get_stats(np->netdev, &np->stats);
-+
-+              spin_unlock_irqrestore(&accelerator->vif_states_lock, 
-+                                     *lock_flags);
-+
-+              /* 
-+               * Try and do the opposite of accelerator_probe_new_vif
-+               * to ensure there's no state pointing back at the 
-+               * netdev 
-+               */
-+              accelerator_remove_single_hook(accelerator, 
-+                                             &np->accel_vif_state);
-+
-+              rc = accelerator->hooks->remove(dev);
-+
-+              spin_lock_irqsave(&accelerator->vif_states_lock, *lock_flags);
-+      }
-+ 
-+      return rc;
-+}
-+
-+
-+static int netfront_remove_accelerator(struct netfront_info *np,
-+                                     struct xenbus_device *dev)
-+{
-+      struct netfront_accelerator *accelerator;
-+      struct netfront_accel_vif_state *tmp_vif_state;
-+      unsigned long flags;
-+      int rc = 0; 
-+
-+      /* Check that we've got a device that was accelerated */
-+      if (np->accelerator == NULL)
-+              return rc;
-+
-+      accelerator = np->accelerator;
-+
-+      spin_lock_irqsave(&accelerator->vif_states_lock, flags); 
-+
-+      list_for_each_entry(tmp_vif_state, &accelerator->vif_states,
-+                          link) {
-+              if (tmp_vif_state == &np->accel_vif_state) {
-+                      list_del(&np->accel_vif_state.link);
-+                      break;
-+              }
-+      }
-+
-+      rc = do_remove(np, dev, &flags);
-+
-+      np->accelerator = NULL;
-+
-+      spin_unlock_irqrestore(&accelerator->vif_states_lock, flags); 
-+
-+      return rc;
-+}
-+
-+
-+int netfront_accelerator_call_remove(struct netfront_info *np,
-+                                   struct xenbus_device *dev)
-+{
-+      int rc;
-+      netfront_accelerator_remove_watch(np);
-+      mutex_lock(&accelerator_mutex);
-+      rc = netfront_remove_accelerator(np, dev);
-+      mutex_unlock(&accelerator_mutex);
-+      return rc;
-+}
-+
-+  
-+int netfront_accelerator_suspend(struct netfront_info *np,
-+                               struct xenbus_device *dev)
-+{
-+      unsigned long flags;
-+      int rc = 0;
-+      
-+      netfront_accelerator_remove_watch(np);
-+
-+      mutex_lock(&accelerator_mutex);
-+
-+      /* Check that we've got a device that was accelerated */
-+      if (np->accelerator == NULL)
-+              goto out;
-+
-+      /* 
-+       * Call the remove accelerator hook, but leave the vif_state
-+       * on the accelerator's list in case there is a suspend_cancel.
-+       */
-+      spin_lock_irqsave(&np->accelerator->vif_states_lock, flags); 
-+      
-+      rc = do_remove(np, dev, &flags);
-+
-+      spin_unlock_irqrestore(&np->accelerator->vif_states_lock, flags); 
-+ out:
-+      mutex_unlock(&accelerator_mutex);
-+      return rc;
-+}
-+  
-+  
-+int netfront_accelerator_suspend_cancel(struct netfront_info *np,
-+                                      struct xenbus_device *dev)
-+{
-+      /* 
-+       * Setting the watch will cause it to fire and probe the
-+       * accelerator, so no need to call accelerator_probe_new_vif()
-+       * directly here
-+       */
-+      if (dev->state == XenbusStateConnected)
-+              netfront_accelerator_add_watch(np);
-+      return 0;
-+}
-+ 
-+ 
-+void netfront_accelerator_resume(struct netfront_info *np,
-+                               struct xenbus_device *dev)
-+{
-+      struct netfront_accel_vif_state *accel_vif_state = NULL;
-+      spinlock_t *vif_states_lock;
-+      unsigned long flags;
-+ 
-+      mutex_lock(&accelerator_mutex);
-+
-+      /* Check that we've got a device that was accelerated */
-+      if(np->accelerator == NULL)
-+              goto out;
-+
-+      /* Find the vif_state from the accelerator's list */
-+      list_for_each_entry(accel_vif_state, &np->accelerator->vif_states, 
-+                          link) {
-+              if (accel_vif_state->dev == dev) {
-+                      BUG_ON(accel_vif_state != &np->accel_vif_state);
-+ 
-+                      vif_states_lock = &np->accelerator->vif_states_lock;
-+                      spin_lock_irqsave(vif_states_lock, flags); 
-+ 
-+                      /* 
-+                       * Remove it from the accelerator's list so
-+                       * state is consistent for probing new vifs
-+                       * when they get connected
-+                       */
-+                      list_del(&accel_vif_state->link);
-+                      np->accelerator = NULL;
-+ 
-+                      spin_unlock_irqrestore(vif_states_lock, flags); 
-+                      
-+                      break;
-+              }
-+      }
-+
-+ out:
-+      mutex_unlock(&accelerator_mutex);
-+      return;
-+}
-+
-+
-+int netfront_check_accelerator_queue_ready(struct net_device *dev,
-+                                         struct netfront_info *np)
-+{
-+      struct netfront_accelerator *accelerator;
-+      struct netfront_accel_hooks *hooks;
-+      int rc = 1;
-+      unsigned long flags;
-+
-+      accelerator = np->accelerator;
-+
-+      /* Call the check_ready accelerator hook. */ 
-+      if (np->accel_vif_state.hooks && accelerator) {
-+              spin_lock_irqsave(&accelerator->vif_states_lock, flags); 
-+              hooks = np->accel_vif_state.hooks;
-+              if (hooks && np->accelerator == accelerator)
-+                      rc = np->accel_vif_state.hooks->check_ready(dev);
-+              spin_unlock_irqrestore(&accelerator->vif_states_lock, flags);
-+      }
-+
-+      return rc;
-+}
-+
-+
-+void netfront_accelerator_call_stop_napi_irq(struct netfront_info *np,
-+                                           struct net_device *dev)
-+{
-+      struct netfront_accelerator *accelerator;
-+      struct netfront_accel_hooks *hooks;
-+      unsigned long flags;
-+
-+      accelerator = np->accelerator;
-+
-+      /* Call the stop_napi_interrupts accelerator hook. */
-+      if (np->accel_vif_state.hooks && accelerator != NULL) {
-+              spin_lock_irqsave(&accelerator->vif_states_lock, flags); 
-+              hooks = np->accel_vif_state.hooks;
-+              if (hooks && np->accelerator == accelerator)
-+                      np->accel_vif_state.hooks->stop_napi_irq(dev);
-+              spin_unlock_irqrestore(&accelerator->vif_states_lock, flags);
-+      }
-+}
-+
-+
-+int netfront_accelerator_call_get_stats(struct netfront_info *np,
-+                                      struct net_device *dev)
-+{
-+      struct netfront_accelerator *accelerator;
-+      struct netfront_accel_hooks *hooks;
-+      unsigned long flags;
-+      int rc = 0;
-+
-+      accelerator = np->accelerator;
-+
-+      /* Call the get_stats accelerator hook. */
-+      if (np->accel_vif_state.hooks && accelerator != NULL) {
-+              spin_lock_irqsave(&accelerator->vif_states_lock, flags); 
-+              hooks = np->accel_vif_state.hooks;
-+              if (hooks && np->accelerator == accelerator)
-+                      rc = np->accel_vif_state.hooks->get_stats(dev,
-+                                                                &np->stats);
-+              spin_unlock_irqrestore(&accelerator->vif_states_lock, flags);
-+      }
-+      return rc;
-+}
-+
-Index: head-2008-11-25/drivers/xen/netfront/netfront.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netfront/netfront.c    2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,2240 @@
-+/******************************************************************************
-+ * Virtual network driver for conversing with remote driver backends.
-+ *
-+ * Copyright (c) 2002-2005, K A Fraser
-+ * Copyright (c) 2005, XenSource Ltd
-+ * Copyright (C) 2007 Solarflare Communications, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/netdevice.h>
-+#include <linux/inetdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/init.h>
-+#include <linux/bitops.h>
-+#include <linux/ethtool.h>
-+#include <linux/in.h>
-+#include <linux/if_ether.h>
-+#include <linux/io.h>
-+#include <linux/moduleparam.h>
-+#include <net/sock.h>
-+#include <net/pkt_sched.h>
-+#include <net/arp.h>
-+#include <net/route.h>
-+#include <asm/uaccess.h>
-+#include <xen/evtchn.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/io/netif.h>
-+#include <xen/interface/memory.h>
-+#include <xen/balloon.h>
-+#include <asm/page.h>
-+#include <asm/maddr.h>
-+#include <asm/uaccess.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/gnttab.h>
-+
-+struct netfront_cb {
-+      struct page *page;
-+      unsigned offset;
-+};
-+
-+#define NETFRONT_SKB_CB(skb)  ((struct netfront_cb *)((skb)->cb))
-+
-+#include "netfront.h"
-+
-+/*
-+ * Mutually-exclusive module options to select receive data path:
-+ *  rx_copy : Packets are copied by network backend into local memory
-+ *  rx_flip : Page containing packet data is transferred to our ownership
-+ * For fully-virtualised guests there is no option - copying must be used.
-+ * For paravirtualised guests, flipping is the default.
-+ */
-+#ifdef CONFIG_XEN
-+static int MODPARM_rx_copy = 0;
-+module_param_named(rx_copy, MODPARM_rx_copy, bool, 0);
-+MODULE_PARM_DESC(rx_copy, "Copy packets from network card (rather than flip)");
-+static int MODPARM_rx_flip = 0;
-+module_param_named(rx_flip, MODPARM_rx_flip, bool, 0);
-+MODULE_PARM_DESC(rx_flip, "Flip packets from network card (rather than copy)");
-+#else
-+static const int MODPARM_rx_copy = 1;
-+static const int MODPARM_rx_flip = 0;
-+#endif
-+
-+#define RX_COPY_THRESHOLD 256
-+
-+/* If we don't have GSO, fake things up so that we never try to use it. */
-+#if defined(NETIF_F_GSO)
-+#define HAVE_GSO                      1
-+#define HAVE_TSO                      1 /* TSO is a subset of GSO */
-+#define HAVE_CSUM_OFFLOAD             1
-+static inline void dev_disable_gso_features(struct net_device *dev)
-+{
-+      /* Turn off all GSO bits except ROBUST. */
-+      dev->features &= (1 << NETIF_F_GSO_SHIFT) - 1;
-+      dev->features |= NETIF_F_GSO_ROBUST;
-+}
-+#elif defined(NETIF_F_TSO)
-+#define HAVE_GSO                     0
-+#define HAVE_TSO                       1
-+
-+/* Some older kernels cannot cope with incorrect checksums,
-+ * particularly in netfilter. I'm not sure there is 100% correlation
-+ * with the presence of NETIF_F_TSO but it appears to be a good first
-+ * approximiation.
-+ */
-+#define HAVE_CSUM_OFFLOAD              0
-+
-+#define gso_size tso_size
-+#define gso_segs tso_segs
-+static inline void dev_disable_gso_features(struct net_device *dev)
-+{
-+       /* Turn off all TSO bits. */
-+       dev->features &= ~NETIF_F_TSO;
-+}
-+static inline int skb_is_gso(const struct sk_buff *skb)
-+{
-+        return skb_shinfo(skb)->tso_size;
-+}
-+static inline int skb_gso_ok(struct sk_buff *skb, int features)
-+{
-+        return (features & NETIF_F_TSO);
-+}
-+
-+static inline int netif_needs_gso(struct net_device *dev, struct sk_buff *skb)
-+{
-+        return skb_is_gso(skb) &&
-+               (!skb_gso_ok(skb, dev->features) ||
-+                unlikely(skb->ip_summed != CHECKSUM_HW));
-+}
-+#else
-+#define HAVE_GSO                      0
-+#define HAVE_TSO                      0
-+#define HAVE_CSUM_OFFLOAD             0
-+#define netif_needs_gso(dev, skb)     0
-+#define dev_disable_gso_features(dev) ((void)0)
-+#define ethtool_op_set_tso(dev, data) (-ENOSYS)
-+#endif
-+
-+#define GRANT_INVALID_REF     0
-+
-+struct netfront_rx_info {
-+      struct netif_rx_response rx;
-+      struct netif_extra_info extras[XEN_NETIF_EXTRA_TYPE_MAX - 1];
-+};
-+
-+/*
-+ * Implement our own carrier flag: the network stack's version causes delays
-+ * when the carrier is re-enabled (in particular, dev_activate() may not
-+ * immediately be called, which can cause packet loss).
-+ */
-+#define netfront_carrier_on(netif)    ((netif)->carrier = 1)
-+#define netfront_carrier_off(netif)   ((netif)->carrier = 0)
-+#define netfront_carrier_ok(netif)    ((netif)->carrier)
-+
-+/*
-+ * Access macros for acquiring freeing slots in tx_skbs[].
-+ */
-+
-+static inline void add_id_to_freelist(struct sk_buff **list, unsigned short id)
-+{
-+      list[id] = list[0];
-+      list[0]  = (void *)(unsigned long)id;
-+}
-+
-+static inline unsigned short get_id_from_freelist(struct sk_buff **list)
-+{
-+      unsigned int id = (unsigned int)(unsigned long)list[0];
-+      list[0] = list[id];
-+      return id;
-+}
-+
-+static inline int xennet_rxidx(RING_IDX idx)
-+{
-+      return idx & (NET_RX_RING_SIZE - 1);
-+}
-+
-+static inline struct sk_buff *xennet_get_rx_skb(struct netfront_info *np,
-+                                              RING_IDX ri)
-+{
-+      int i = xennet_rxidx(ri);
-+      struct sk_buff *skb = np->rx_skbs[i];
-+      np->rx_skbs[i] = NULL;
-+      return skb;
-+}
-+
-+static inline grant_ref_t xennet_get_rx_ref(struct netfront_info *np,
-+                                          RING_IDX ri)
-+{
-+      int i = xennet_rxidx(ri);
-+      grant_ref_t ref = np->grant_rx_ref[i];
-+      np->grant_rx_ref[i] = GRANT_INVALID_REF;
-+      return ref;
-+}
-+
-+#define DPRINTK(fmt, args...)                         \
-+      pr_debug("netfront (%s:%d) " fmt,               \
-+               __FUNCTION__, __LINE__, ##args)
-+#define IPRINTK(fmt, args...)                         \
-+      printk(KERN_INFO "netfront: " fmt, ##args)
-+#define WPRINTK(fmt, args...)                         \
-+      printk(KERN_WARNING "netfront: " fmt, ##args)
-+
-+static int setup_device(struct xenbus_device *, struct netfront_info *);
-+static struct net_device *create_netdev(struct xenbus_device *);
-+
-+static void end_access(int, void *);
-+static void netif_disconnect_backend(struct netfront_info *);
-+
-+static int network_connect(struct net_device *);
-+static void network_tx_buf_gc(struct net_device *);
-+static void network_alloc_rx_buffers(struct net_device *);
-+static void send_fake_arp(struct net_device *);
-+
-+static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs);
-+
-+#ifdef CONFIG_SYSFS
-+static int xennet_sysfs_addif(struct net_device *netdev);
-+static void xennet_sysfs_delif(struct net_device *netdev);
-+#else /* !CONFIG_SYSFS */
-+#define xennet_sysfs_addif(dev) (0)
-+#define xennet_sysfs_delif(dev) do { } while(0)
-+#endif
-+
-+static inline int xennet_can_sg(struct net_device *dev)
-+{
-+      return dev->features & NETIF_F_SG;
-+}
-+
-+/**
-+ * Entry point to this code when a new device is created.  Allocate the basic
-+ * structures and the ring buffers for communication with the backend, and
-+ * inform the backend of the appropriate details for those.
-+ */
-+static int __devinit netfront_probe(struct xenbus_device *dev,
-+                                  const struct xenbus_device_id *id)
-+{
-+      int err;
-+      struct net_device *netdev;
-+      struct netfront_info *info;
-+
-+      netdev = create_netdev(dev);
-+      if (IS_ERR(netdev)) {
-+              err = PTR_ERR(netdev);
-+              xenbus_dev_fatal(dev, err, "creating netdev");
-+              return err;
-+      }
-+
-+      info = netdev_priv(netdev);
-+      dev->dev.driver_data = info;
-+
-+      err = register_netdev(info->netdev);
-+      if (err) {
-+              printk(KERN_WARNING "%s: register_netdev err=%d\n",
-+                     __FUNCTION__, err);
-+              goto fail;
-+      }
-+
-+      err = xennet_sysfs_addif(info->netdev);
-+      if (err) {
-+              unregister_netdev(info->netdev);
-+              printk(KERN_WARNING "%s: add sysfs failed err=%d\n",
-+                     __FUNCTION__, err);
-+              goto fail;
-+      }
-+
-+      return 0;
-+
-+ fail:
-+      free_netdev(netdev);
-+      dev->dev.driver_data = NULL;
-+      return err;
-+}
-+
-+static int __devexit netfront_remove(struct xenbus_device *dev)
-+{
-+      struct netfront_info *info = dev->dev.driver_data;
-+
-+      DPRINTK("%s\n", dev->nodename);
-+
-+      netfront_accelerator_call_remove(info, dev);
-+
-+      netif_disconnect_backend(info);
-+
-+      del_timer_sync(&info->rx_refill_timer);
-+
-+      xennet_sysfs_delif(info->netdev);
-+
-+      unregister_netdev(info->netdev);
-+
-+      free_netdev(info->netdev);
-+
-+      return 0;
-+}
-+
-+
-+static int netfront_suspend(struct xenbus_device *dev)
-+{
-+      struct netfront_info *info = dev->dev.driver_data;
-+      return netfront_accelerator_suspend(info, dev);
-+}
-+
-+
-+static int netfront_suspend_cancel(struct xenbus_device *dev)
-+{
-+      struct netfront_info *info = dev->dev.driver_data;
-+      return netfront_accelerator_suspend_cancel(info, dev);
-+}
-+
-+
-+/**
-+ * We are reconnecting to the backend, due to a suspend/resume, or a backend
-+ * driver restart.  We tear down our netif structure and recreate it, but
-+ * leave the device-layer structures intact so that this is transparent to the
-+ * rest of the kernel.
-+ */
-+static int netfront_resume(struct xenbus_device *dev)
-+{
-+      struct netfront_info *info = dev->dev.driver_data;
-+
-+      DPRINTK("%s\n", dev->nodename);
-+
-+      netfront_accelerator_resume(info, dev);
-+
-+      netif_disconnect_backend(info);
-+      return 0;
-+}
-+
-+static int xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
-+{
-+      char *s, *e, *macstr;
-+      int i;
-+
-+      macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
-+      if (IS_ERR(macstr))
-+              return PTR_ERR(macstr);
-+
-+      for (i = 0; i < ETH_ALEN; i++) {
-+              mac[i] = simple_strtoul(s, &e, 16);
-+              if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
-+                      kfree(macstr);
-+                      return -ENOENT;
-+              }
-+              s = e+1;
-+      }
-+
-+      kfree(macstr);
-+      return 0;
-+}
-+
-+/* Common code used when first setting up, and when resuming. */
-+static int talk_to_backend(struct xenbus_device *dev,
-+                         struct netfront_info *info)
-+{
-+      const char *message;
-+      struct xenbus_transaction xbt;
-+      int err;
-+
-+      /* Read mac only in the first setup. */
-+      if (!is_valid_ether_addr(info->mac)) {
-+              err = xen_net_read_mac(dev, info->mac);
-+              if (err) {
-+                      xenbus_dev_fatal(dev, err, "parsing %s/mac",
-+                                       dev->nodename);
-+                      goto out;
-+              }
-+      }
-+
-+      /* Create shared ring, alloc event channel. */
-+      err = setup_device(dev, info);
-+      if (err)
-+              goto out;
-+
-+      /* This will load an accelerator if one is configured when the
-+       * watch fires */
-+      netfront_accelerator_add_watch(info);
-+
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "starting transaction");
-+              goto destroy_ring;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "tx-ring-ref","%u",
-+                          info->tx_ring_ref);
-+      if (err) {
-+              message = "writing tx ring-ref";
-+              goto abort_transaction;
-+      }
-+      err = xenbus_printf(xbt, dev->nodename, "rx-ring-ref","%u",
-+                          info->rx_ring_ref);
-+      if (err) {
-+              message = "writing rx ring-ref";
-+              goto abort_transaction;
-+      }
-+      err = xenbus_printf(xbt, dev->nodename,
-+                          "event-channel", "%u",
-+                          irq_to_evtchn_port(info->irq));
-+      if (err) {
-+              message = "writing event-channel";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "request-rx-copy", "%u",
-+                          info->copying_receiver);
-+      if (err) {
-+              message = "writing request-rx-copy";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "feature-rx-notify", "%d", 1);
-+      if (err) {
-+              message = "writing feature-rx-notify";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "feature-no-csum-offload",
-+                          "%d", !HAVE_CSUM_OFFLOAD);
-+      if (err) {
-+              message = "writing feature-no-csum-offload";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "feature-sg", "%d", 1);
-+      if (err) {
-+              message = "writing feature-sg";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "feature-gso-tcpv4", "%d",
-+                          HAVE_TSO);
-+      if (err) {
-+              message = "writing feature-gso-tcpv4";
-+              goto abort_transaction;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err) {
-+              if (err == -EAGAIN)
-+                      goto again;
-+              xenbus_dev_fatal(dev, err, "completing transaction");
-+              goto destroy_ring;
-+      }
-+
-+      return 0;
-+
-+ abort_transaction:
-+      xenbus_transaction_end(xbt, 1);
-+      xenbus_dev_fatal(dev, err, "%s", message);
-+ destroy_ring:
-+      netfront_accelerator_call_remove(info, dev);
-+      netif_disconnect_backend(info);
-+ out:
-+      return err;
-+}
-+
-+static int setup_device(struct xenbus_device *dev, struct netfront_info *info)
-+{
-+      struct netif_tx_sring *txs;
-+      struct netif_rx_sring *rxs;
-+      int err;
-+      struct net_device *netdev = info->netdev;
-+
-+      info->tx_ring_ref = GRANT_INVALID_REF;
-+      info->rx_ring_ref = GRANT_INVALID_REF;
-+      info->rx.sring = NULL;
-+      info->tx.sring = NULL;
-+      info->irq = 0;
-+
-+      txs = (struct netif_tx_sring *)get_zeroed_page(GFP_NOIO | __GFP_HIGH);
-+      if (!txs) {
-+              err = -ENOMEM;
-+              xenbus_dev_fatal(dev, err, "allocating tx ring page");
-+              goto fail;
-+      }
-+      SHARED_RING_INIT(txs);
-+      FRONT_RING_INIT(&info->tx, txs, PAGE_SIZE);
-+
-+      err = xenbus_grant_ring(dev, virt_to_mfn(txs));
-+      if (err < 0) {
-+              free_page((unsigned long)txs);
-+              goto fail;
-+      }
-+      info->tx_ring_ref = err;
-+
-+      rxs = (struct netif_rx_sring *)get_zeroed_page(GFP_NOIO | __GFP_HIGH);
-+      if (!rxs) {
-+              err = -ENOMEM;
-+              xenbus_dev_fatal(dev, err, "allocating rx ring page");
-+              goto fail;
-+      }
-+      SHARED_RING_INIT(rxs);
-+      FRONT_RING_INIT(&info->rx, rxs, PAGE_SIZE);
-+
-+      err = xenbus_grant_ring(dev, virt_to_mfn(rxs));
-+      if (err < 0) {
-+              free_page((unsigned long)rxs);
-+              goto fail;
-+      }
-+      info->rx_ring_ref = err;
-+
-+      memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
-+
-+      err = bind_listening_port_to_irqhandler(
-+              dev->otherend_id, netif_int, SA_SAMPLE_RANDOM, netdev->name,
-+              netdev);
-+      if (err < 0)
-+              goto fail;
-+      info->irq = err;
-+
-+      return 0;
-+
-+ fail:
-+      return err;
-+}
-+
-+/**
-+ * Callback received when the backend's state changes.
-+ */
-+static void backend_changed(struct xenbus_device *dev,
-+                          enum xenbus_state backend_state)
-+{
-+      struct netfront_info *np = dev->dev.driver_data;
-+      struct net_device *netdev = np->netdev;
-+
-+      DPRINTK("%s\n", xenbus_strstate(backend_state));
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitialised:
-+      case XenbusStateConnected:
-+      case XenbusStateReconfiguring:
-+      case XenbusStateReconfigured:
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateInitWait:
-+              if (dev->state != XenbusStateInitialising)
-+                      break;
-+              if (network_connect(netdev) != 0)
-+                      break;
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+              send_fake_arp(netdev);
-+              break;
-+
-+      case XenbusStateClosing:
-+              xenbus_frontend_closed(dev);
-+              break;
-+      }
-+}
-+
-+/** Send a packet on a net device to encourage switches to learn the
-+ * MAC. We send a fake ARP request.
-+ *
-+ * @param dev device
-+ * @return 0 on success, error code otherwise
-+ */
-+static void send_fake_arp(struct net_device *dev)
-+{
-+#ifdef CONFIG_INET
-+      struct sk_buff *skb;
-+      u32             src_ip, dst_ip;
-+
-+      dst_ip = INADDR_BROADCAST;
-+      src_ip = inet_select_addr(dev, dst_ip, RT_SCOPE_LINK);
-+
-+      /* No IP? Then nothing to do. */
-+      if (src_ip == 0)
-+              return;
-+
-+      skb = arp_create(ARPOP_REPLY, ETH_P_ARP,
-+                       dst_ip, dev, src_ip,
-+                       /*dst_hw*/ NULL, /*src_hw*/ NULL,
-+                       /*target_hw*/ dev->dev_addr);
-+      if (skb == NULL)
-+              return;
-+
-+      dev_queue_xmit(skb);
-+#endif
-+}
-+
-+static inline int netfront_tx_slot_available(struct netfront_info *np)
-+{
-+      return ((np->tx.req_prod_pvt - np->tx.rsp_cons) <
-+              (TX_MAX_TARGET - MAX_SKB_FRAGS - 2));
-+}
-+
-+
-+static inline void network_maybe_wake_tx(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+
-+      if (unlikely(netif_queue_stopped(dev)) &&
-+          netfront_tx_slot_available(np) &&
-+          likely(netif_running(dev)) &&
-+          netfront_check_accelerator_queue_ready(dev, np))
-+              netif_wake_queue(dev);
-+}
-+
-+
-+int netfront_check_queue_ready(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+
-+      return unlikely(netif_queue_stopped(dev)) &&
-+              netfront_tx_slot_available(np) &&
-+              likely(netif_running(dev));
-+}
-+EXPORT_SYMBOL(netfront_check_queue_ready);
-+
-+
-+static int network_open(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+
-+      memset(&np->stats, 0, sizeof(np->stats));
-+
-+      spin_lock_bh(&np->rx_lock);
-+      if (netfront_carrier_ok(np)) {
-+              network_alloc_rx_buffers(dev);
-+              np->rx.sring->rsp_event = np->rx.rsp_cons + 1;
-+              if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx)){
-+                      netfront_accelerator_call_stop_napi_irq(np, dev);
-+
-+                      netif_rx_schedule(dev);
-+              }
-+      }
-+      spin_unlock_bh(&np->rx_lock);
-+
-+      network_maybe_wake_tx(dev);
-+
-+      return 0;
-+}
-+
-+static void network_tx_buf_gc(struct net_device *dev)
-+{
-+      RING_IDX cons, prod;
-+      unsigned short id;
-+      struct netfront_info *np = netdev_priv(dev);
-+      struct sk_buff *skb;
-+
-+      BUG_ON(!netfront_carrier_ok(np));
-+
-+      do {
-+              prod = np->tx.sring->rsp_prod;
-+              rmb(); /* Ensure we see responses up to 'rp'. */
-+
-+              for (cons = np->tx.rsp_cons; cons != prod; cons++) {
-+                      struct netif_tx_response *txrsp;
-+
-+                      txrsp = RING_GET_RESPONSE(&np->tx, cons);
-+                      if (txrsp->status == NETIF_RSP_NULL)
-+                              continue;
-+
-+                      id  = txrsp->id;
-+                      skb = np->tx_skbs[id];
-+                      if (unlikely(gnttab_query_foreign_access(
-+                              np->grant_tx_ref[id]) != 0)) {
-+                              printk(KERN_ALERT "network_tx_buf_gc: warning "
-+                                     "-- grant still in use by backend "
-+                                     "domain.\n");
-+                              BUG();
-+                      }
-+                      gnttab_end_foreign_access_ref(np->grant_tx_ref[id]);
-+                      gnttab_release_grant_reference(
-+                              &np->gref_tx_head, np->grant_tx_ref[id]);
-+                      np->grant_tx_ref[id] = GRANT_INVALID_REF;
-+                      add_id_to_freelist(np->tx_skbs, id);
-+                      dev_kfree_skb_irq(skb);
-+              }
-+
-+              np->tx.rsp_cons = prod;
-+
-+              /*
-+               * Set a new event, then check for race with update of tx_cons.
-+               * Note that it is essential to schedule a callback, no matter
-+               * how few buffers are pending. Even if there is space in the
-+               * transmit ring, higher layers may be blocked because too much
-+               * data is outstanding: in such cases notification from Xen is
-+               * likely to be the only kick that we'll get.
-+               */
-+              np->tx.sring->rsp_event =
-+                      prod + ((np->tx.sring->req_prod - prod) >> 1) + 1;
-+              mb();
-+      } while ((cons == prod) && (prod != np->tx.sring->rsp_prod));
-+
-+      network_maybe_wake_tx(dev);
-+}
-+
-+static void rx_refill_timeout(unsigned long data)
-+{
-+      struct net_device *dev = (struct net_device *)data;
-+      struct netfront_info *np = netdev_priv(dev);
-+
-+      netfront_accelerator_call_stop_napi_irq(np, dev);
-+
-+      netif_rx_schedule(dev);
-+}
-+
-+static void network_alloc_rx_buffers(struct net_device *dev)
-+{
-+      unsigned short id;
-+      struct netfront_info *np = netdev_priv(dev);
-+      struct sk_buff *skb;
-+      struct page *page;
-+      int i, batch_target, notify;
-+      RING_IDX req_prod = np->rx.req_prod_pvt;
-+      struct xen_memory_reservation reservation;
-+      grant_ref_t ref;
-+      unsigned long pfn;
-+      void *vaddr;
-+      int nr_flips;
-+      netif_rx_request_t *req;
-+
-+      if (unlikely(!netfront_carrier_ok(np)))
-+              return;
-+
-+      /*
-+       * Allocate skbuffs greedily, even though we batch updates to the
-+       * receive ring. This creates a less bursty demand on the memory
-+       * allocator, so should reduce the chance of failed allocation requests
-+       * both for ourself and for other kernel subsystems.
-+       */
-+      batch_target = np->rx_target - (req_prod - np->rx.rsp_cons);
-+      for (i = skb_queue_len(&np->rx_batch); i < batch_target; i++) {
-+              /*
-+               * Allocate an skb and a page. Do not use __dev_alloc_skb as
-+               * that will allocate page-sized buffers which is not
-+               * necessary here.
-+               * 16 bytes added as necessary headroom for netif_receive_skb.
-+               */
-+              skb = alloc_skb(RX_COPY_THRESHOLD + 16 + NET_IP_ALIGN,
-+                              GFP_ATOMIC | __GFP_NOWARN);
-+              if (unlikely(!skb))
-+                      goto no_skb;
-+
-+              page = alloc_page(GFP_ATOMIC | __GFP_NOWARN);
-+              if (!page) {
-+                      kfree_skb(skb);
-+no_skb:
-+                      /* Any skbuffs queued for refill? Force them out. */
-+                      if (i != 0)
-+                              goto refill;
-+                      /* Could not allocate any skbuffs. Try again later. */
-+                      mod_timer(&np->rx_refill_timer,
-+                                jiffies + (HZ/10));
-+                      break;
-+              }
-+
-+              skb_reserve(skb, 16 + NET_IP_ALIGN); /* mimic dev_alloc_skb() */
-+              skb_shinfo(skb)->frags[0].page = page;
-+              skb_shinfo(skb)->nr_frags = 1;
-+              __skb_queue_tail(&np->rx_batch, skb);
-+      }
-+
-+      /* Is the batch large enough to be worthwhile? */
-+      if (i < (np->rx_target/2)) {
-+              if (req_prod > np->rx.sring->req_prod)
-+                      goto push;
-+              return;
-+      }
-+
-+      /* Adjust our fill target if we risked running out of buffers. */
-+      if (((req_prod - np->rx.sring->rsp_prod) < (np->rx_target / 4)) &&
-+          ((np->rx_target *= 2) > np->rx_max_target))
-+              np->rx_target = np->rx_max_target;
-+
-+ refill:
-+      for (nr_flips = i = 0; ; i++) {
-+              if ((skb = __skb_dequeue(&np->rx_batch)) == NULL)
-+                      break;
-+
-+              skb->dev = dev;
-+
-+              id = xennet_rxidx(req_prod + i);
-+
-+              BUG_ON(np->rx_skbs[id]);
-+              np->rx_skbs[id] = skb;
-+
-+              ref = gnttab_claim_grant_reference(&np->gref_rx_head);
-+              BUG_ON((signed short)ref < 0);
-+              np->grant_rx_ref[id] = ref;
-+
-+              pfn = page_to_pfn(skb_shinfo(skb)->frags[0].page);
-+              vaddr = page_address(skb_shinfo(skb)->frags[0].page);
-+
-+              req = RING_GET_REQUEST(&np->rx, req_prod + i);
-+              if (!np->copying_receiver) {
-+                      gnttab_grant_foreign_transfer_ref(ref,
-+                                                        np->xbdev->otherend_id,
-+                                                        pfn);
-+                      np->rx_pfn_array[nr_flips] = pfn_to_mfn(pfn);
-+                      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                              /* Remove this page before passing
-+                               * back to Xen. */
-+                              set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
-+                              MULTI_update_va_mapping(np->rx_mcl+i,
-+                                                      (unsigned long)vaddr,
-+                                                      __pte(0), 0);
-+                      }
-+                      nr_flips++;
-+              } else {
-+                      gnttab_grant_foreign_access_ref(ref,
-+                                                      np->xbdev->otherend_id,
-+                                                      pfn_to_mfn(pfn),
-+                                                      0);
-+              }
-+
-+              req->id = id;
-+              req->gref = ref;
-+      }
-+
-+      if ( nr_flips != 0 ) {
-+              /* Tell the ballon driver what is going on. */
-+              balloon_update_driver_allowance(i);
-+
-+              set_xen_guest_handle(reservation.extent_start,
-+                                   np->rx_pfn_array);
-+              reservation.nr_extents   = nr_flips;
-+              reservation.extent_order = 0;
-+              reservation.address_bits = 0;
-+              reservation.domid        = DOMID_SELF;
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* After all PTEs have been zapped, flush the TLB. */
-+                      np->rx_mcl[i-1].args[MULTI_UVMFLAGS_INDEX] =
-+                              UVMF_TLB_FLUSH|UVMF_ALL;
-+
-+                      /* Give away a batch of pages. */
-+                      np->rx_mcl[i].op = __HYPERVISOR_memory_op;
-+                      np->rx_mcl[i].args[0] = XENMEM_decrease_reservation;
-+                      np->rx_mcl[i].args[1] = (unsigned long)&reservation;
-+
-+                      /* Zap PTEs and give away pages in one big
-+                       * multicall. */
-+                      if (unlikely(HYPERVISOR_multicall(np->rx_mcl, i+1)))
-+                              BUG();
-+
-+                      /* Check return status of HYPERVISOR_memory_op(). */
-+                      if (unlikely(np->rx_mcl[i].result != i))
-+                              panic("Unable to reduce memory reservation\n");
-+                      while (nr_flips--)
-+                              BUG_ON(np->rx_mcl[nr_flips].result);
-+              } else {
-+                      if (HYPERVISOR_memory_op(XENMEM_decrease_reservation,
-+                                               &reservation) != i)
-+                              panic("Unable to reduce memory reservation\n");
-+              }
-+      } else {
-+              wmb();
-+      }
-+
-+      /* Above is a suitable barrier to ensure backend will see requests. */
-+      np->rx.req_prod_pvt = req_prod + i;
-+ push:
-+      RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->rx, notify);
-+      if (notify)
-+              notify_remote_via_irq(np->irq);
-+}
-+
-+static void xennet_make_frags(struct sk_buff *skb, struct net_device *dev,
-+                            struct netif_tx_request *tx)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      char *data = skb->data;
-+      unsigned long mfn;
-+      RING_IDX prod = np->tx.req_prod_pvt;
-+      int frags = skb_shinfo(skb)->nr_frags;
-+      unsigned int offset = offset_in_page(data);
-+      unsigned int len = skb_headlen(skb);
-+      unsigned int id;
-+      grant_ref_t ref;
-+      int i;
-+
-+      while (len > PAGE_SIZE - offset) {
-+              tx->size = PAGE_SIZE - offset;
-+              tx->flags |= NETTXF_more_data;
-+              len -= tx->size;
-+              data += tx->size;
-+              offset = 0;
-+
-+              id = get_id_from_freelist(np->tx_skbs);
-+              np->tx_skbs[id] = skb_get(skb);
-+              tx = RING_GET_REQUEST(&np->tx, prod++);
-+              tx->id = id;
-+              ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-+              BUG_ON((signed short)ref < 0);
-+
-+              mfn = virt_to_mfn(data);
-+              gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
-+                                              mfn, GTF_readonly);
-+
-+              tx->gref = np->grant_tx_ref[id] = ref;
-+              tx->offset = offset;
-+              tx->size = len;
-+              tx->flags = 0;
-+      }
-+
-+      for (i = 0; i < frags; i++) {
-+              skb_frag_t *frag = skb_shinfo(skb)->frags + i;
-+
-+              tx->flags |= NETTXF_more_data;
-+
-+              id = get_id_from_freelist(np->tx_skbs);
-+              np->tx_skbs[id] = skb_get(skb);
-+              tx = RING_GET_REQUEST(&np->tx, prod++);
-+              tx->id = id;
-+              ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-+              BUG_ON((signed short)ref < 0);
-+
-+              mfn = pfn_to_mfn(page_to_pfn(frag->page));
-+              gnttab_grant_foreign_access_ref(ref, np->xbdev->otherend_id,
-+                                              mfn, GTF_readonly);
-+
-+              tx->gref = np->grant_tx_ref[id] = ref;
-+              tx->offset = frag->page_offset;
-+              tx->size = frag->size;
-+              tx->flags = 0;
-+      }
-+
-+      np->tx.req_prod_pvt = prod;
-+}
-+
-+static int network_start_xmit(struct sk_buff *skb, struct net_device *dev)
-+{
-+      unsigned short id;
-+      struct netfront_info *np = netdev_priv(dev);
-+      struct netif_tx_request *tx;
-+      struct netif_extra_info *extra;
-+      char *data = skb->data;
-+      RING_IDX i;
-+      grant_ref_t ref;
-+      unsigned long mfn;
-+      int notify;
-+      int frags = skb_shinfo(skb)->nr_frags;
-+      unsigned int offset = offset_in_page(data);
-+      unsigned int len = skb_headlen(skb);
-+
-+      /* Check the fast path, if hooks are available */
-+      if (np->accel_vif_state.hooks && 
-+          np->accel_vif_state.hooks->start_xmit(skb, dev)) { 
-+              /* Fast path has sent this packet */ 
-+              return 0; 
-+      } 
-+
-+      frags += (offset + len + PAGE_SIZE - 1) / PAGE_SIZE;
-+      if (unlikely(frags > MAX_SKB_FRAGS + 1)) {
-+              printk(KERN_ALERT "xennet: skb rides the rocket: %d frags\n",
-+                     frags);
-+              dump_stack();
-+              goto drop;
-+      }
-+
-+      spin_lock_irq(&np->tx_lock);
-+
-+      if (unlikely(!netfront_carrier_ok(np) ||
-+                   (frags > 1 && !xennet_can_sg(dev)) ||
-+                   netif_needs_gso(dev, skb))) {
-+              spin_unlock_irq(&np->tx_lock);
-+              goto drop;
-+      }
-+
-+      i = np->tx.req_prod_pvt;
-+
-+      id = get_id_from_freelist(np->tx_skbs);
-+      np->tx_skbs[id] = skb;
-+
-+      tx = RING_GET_REQUEST(&np->tx, i);
-+
-+      tx->id   = id;
-+      ref = gnttab_claim_grant_reference(&np->gref_tx_head);
-+      BUG_ON((signed short)ref < 0);
-+      mfn = virt_to_mfn(data);
-+      gnttab_grant_foreign_access_ref(
-+              ref, np->xbdev->otherend_id, mfn, GTF_readonly);
-+      tx->gref = np->grant_tx_ref[id] = ref;
-+      tx->offset = offset;
-+      tx->size = len;
-+
-+      tx->flags = 0;
-+      extra = NULL;
-+
-+      if (skb->ip_summed == CHECKSUM_HW) /* local packet? */
-+              tx->flags |= NETTXF_csum_blank | NETTXF_data_validated;
-+#ifdef CONFIG_XEN
-+      if (skb->proto_data_valid) /* remote but checksummed? */
-+              tx->flags |= NETTXF_data_validated;
-+#endif
-+
-+#if HAVE_TSO
-+      if (skb_shinfo(skb)->gso_size) {
-+              struct netif_extra_info *gso = (struct netif_extra_info *)
-+                      RING_GET_REQUEST(&np->tx, ++i);
-+
-+              if (extra)
-+                      extra->flags |= XEN_NETIF_EXTRA_FLAG_MORE;
-+              else
-+                      tx->flags |= NETTXF_extra_info;
-+
-+              gso->u.gso.size = skb_shinfo(skb)->gso_size;
-+              gso->u.gso.type = XEN_NETIF_GSO_TYPE_TCPV4;
-+              gso->u.gso.pad = 0;
-+              gso->u.gso.features = 0;
-+
-+              gso->type = XEN_NETIF_EXTRA_TYPE_GSO;
-+              gso->flags = 0;
-+              extra = gso;
-+      }
-+#endif
-+
-+      np->tx.req_prod_pvt = i + 1;
-+
-+      xennet_make_frags(skb, dev, tx);
-+      tx->size = skb->len;
-+
-+      RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(&np->tx, notify);
-+      if (notify)
-+              notify_remote_via_irq(np->irq);
-+
-+      np->stats.tx_bytes += skb->len;
-+      np->stats.tx_packets++;
-+      dev->trans_start = jiffies;
-+
-+      /* Note: It is not safe to access skb after network_tx_buf_gc()! */
-+      network_tx_buf_gc(dev);
-+
-+      if (!netfront_tx_slot_available(np))
-+              netif_stop_queue(dev);
-+
-+      spin_unlock_irq(&np->tx_lock);
-+
-+      return 0;
-+
-+ drop:
-+      np->stats.tx_dropped++;
-+      dev_kfree_skb(skb);
-+      return 0;
-+}
-+
-+static irqreturn_t netif_int(int irq, void *dev_id, struct pt_regs *ptregs)
-+{
-+      struct net_device *dev = dev_id;
-+      struct netfront_info *np = netdev_priv(dev);
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&np->tx_lock, flags);
-+
-+      if (likely(netfront_carrier_ok(np))) {
-+              network_tx_buf_gc(dev);
-+              /* Under tx_lock: protects access to rx shared-ring indexes. */
-+              if (RING_HAS_UNCONSUMED_RESPONSES(&np->rx)) {
-+                      netfront_accelerator_call_stop_napi_irq(np, dev);
-+
-+                      netif_rx_schedule(dev);
-+                      dev->last_rx = jiffies;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&np->tx_lock, flags);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+static void xennet_move_rx_slot(struct netfront_info *np, struct sk_buff *skb,
-+                              grant_ref_t ref)
-+{
-+      int new = xennet_rxidx(np->rx.req_prod_pvt);
-+
-+      BUG_ON(np->rx_skbs[new]);
-+      np->rx_skbs[new] = skb;
-+      np->grant_rx_ref[new] = ref;
-+      RING_GET_REQUEST(&np->rx, np->rx.req_prod_pvt)->id = new;
-+      RING_GET_REQUEST(&np->rx, np->rx.req_prod_pvt)->gref = ref;
-+      np->rx.req_prod_pvt++;
-+}
-+
-+int xennet_get_extras(struct netfront_info *np,
-+                    struct netif_extra_info *extras, RING_IDX rp)
-+
-+{
-+      struct netif_extra_info *extra;
-+      RING_IDX cons = np->rx.rsp_cons;
-+      int err = 0;
-+
-+      do {
-+              struct sk_buff *skb;
-+              grant_ref_t ref;
-+
-+              if (unlikely(cons + 1 == rp)) {
-+                      if (net_ratelimit())
-+                              WPRINTK("Missing extra info\n");
-+                      err = -EBADR;
-+                      break;
-+              }
-+
-+              extra = (struct netif_extra_info *)
-+                      RING_GET_RESPONSE(&np->rx, ++cons);
-+
-+              if (unlikely(!extra->type ||
-+                           extra->type >= XEN_NETIF_EXTRA_TYPE_MAX)) {
-+                      if (net_ratelimit())
-+                              WPRINTK("Invalid extra type: %d\n",
-+                                      extra->type);
-+                      err = -EINVAL;
-+              } else {
-+                      memcpy(&extras[extra->type - 1], extra,
-+                             sizeof(*extra));
-+              }
-+
-+              skb = xennet_get_rx_skb(np, cons);
-+              ref = xennet_get_rx_ref(np, cons);
-+              xennet_move_rx_slot(np, skb, ref);
-+      } while (extra->flags & XEN_NETIF_EXTRA_FLAG_MORE);
-+
-+      np->rx.rsp_cons = cons;
-+      return err;
-+}
-+
-+static int xennet_get_responses(struct netfront_info *np,
-+                              struct netfront_rx_info *rinfo, RING_IDX rp,
-+                              struct sk_buff_head *list,
-+                              int *pages_flipped_p)
-+{
-+      int pages_flipped = *pages_flipped_p;
-+      struct mmu_update *mmu;
-+      struct multicall_entry *mcl;
-+      struct netif_rx_response *rx = &rinfo->rx;
-+      struct netif_extra_info *extras = rinfo->extras;
-+      RING_IDX cons = np->rx.rsp_cons;
-+      struct sk_buff *skb = xennet_get_rx_skb(np, cons);
-+      grant_ref_t ref = xennet_get_rx_ref(np, cons);
-+      int max = MAX_SKB_FRAGS + (rx->status <= RX_COPY_THRESHOLD);
-+      int frags = 1;
-+      int err = 0;
-+      unsigned long ret;
-+
-+      if (rx->flags & NETRXF_extra_info) {
-+              err = xennet_get_extras(np, extras, rp);
-+              cons = np->rx.rsp_cons;
-+      }
-+
-+      for (;;) {
-+              unsigned long mfn;
-+
-+              if (unlikely(rx->status < 0 ||
-+                           rx->offset + rx->status > PAGE_SIZE)) {
-+                      if (net_ratelimit())
-+                              WPRINTK("rx->offset: %x, size: %u\n",
-+                                      rx->offset, rx->status);
-+                      xennet_move_rx_slot(np, skb, ref);
-+                      err = -EINVAL;
-+                      goto next;
-+              }
-+
-+              /*
-+               * This definitely indicates a bug, either in this driver or in
-+               * the backend driver. In future this should flag the bad
-+               * situation to the system controller to reboot the backed.
-+               */
-+              if (ref == GRANT_INVALID_REF) {
-+                      if (net_ratelimit())
-+                              WPRINTK("Bad rx response id %d.\n", rx->id);
-+                      err = -EINVAL;
-+                      goto next;
-+              }
-+
-+              if (!np->copying_receiver) {
-+                      /* Memory pressure, insufficient buffer
-+                       * headroom, ... */
-+                      if (!(mfn = gnttab_end_foreign_transfer_ref(ref))) {
-+                              if (net_ratelimit())
-+                                      WPRINTK("Unfulfilled rx req "
-+                                              "(id=%d, st=%d).\n",
-+                                              rx->id, rx->status);
-+                              xennet_move_rx_slot(np, skb, ref);
-+                              err = -ENOMEM;
-+                              goto next;
-+                      }
-+
-+                      if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                              /* Remap the page. */
-+                              struct page *page =
-+                                      skb_shinfo(skb)->frags[0].page;
-+                              unsigned long pfn = page_to_pfn(page);
-+                              void *vaddr = page_address(page);
-+
-+                              mcl = np->rx_mcl + pages_flipped;
-+                              mmu = np->rx_mmu + pages_flipped;
-+
-+                              MULTI_update_va_mapping(mcl,
-+                                                      (unsigned long)vaddr,
-+                                                      pfn_pte_ma(mfn,
-+                                                                 PAGE_KERNEL),
-+                                                      0);
-+                              mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
-+                                      | MMU_MACHPHYS_UPDATE;
-+                              mmu->val = pfn;
-+
-+                              set_phys_to_machine(pfn, mfn);
-+                      }
-+                      pages_flipped++;
-+              } else {
-+                      ret = gnttab_end_foreign_access_ref(ref);
-+                      BUG_ON(!ret);
-+              }
-+
-+              gnttab_release_grant_reference(&np->gref_rx_head, ref);
-+
-+              __skb_queue_tail(list, skb);
-+
-+next:
-+              if (!(rx->flags & NETRXF_more_data))
-+                      break;
-+
-+              if (cons + frags == rp) {
-+                      if (net_ratelimit())
-+                              WPRINTK("Need more frags\n");
-+                      err = -ENOENT;
-+                      break;
-+              }
-+
-+              rx = RING_GET_RESPONSE(&np->rx, cons + frags);
-+              skb = xennet_get_rx_skb(np, cons + frags);
-+              ref = xennet_get_rx_ref(np, cons + frags);
-+              frags++;
-+      }
-+
-+      if (unlikely(frags > max)) {
-+              if (net_ratelimit())
-+                      WPRINTK("Too many frags\n");
-+              err = -E2BIG;
-+      }
-+
-+      if (unlikely(err))
-+              np->rx.rsp_cons = cons + frags;
-+
-+      *pages_flipped_p = pages_flipped;
-+
-+      return err;
-+}
-+
-+static RING_IDX xennet_fill_frags(struct netfront_info *np,
-+                                struct sk_buff *skb,
-+                                struct sk_buff_head *list)
-+{
-+      struct skb_shared_info *shinfo = skb_shinfo(skb);
-+      int nr_frags = shinfo->nr_frags;
-+      RING_IDX cons = np->rx.rsp_cons;
-+      skb_frag_t *frag = shinfo->frags + nr_frags;
-+      struct sk_buff *nskb;
-+
-+      while ((nskb = __skb_dequeue(list))) {
-+              struct netif_rx_response *rx =
-+                      RING_GET_RESPONSE(&np->rx, ++cons);
-+
-+              frag->page = skb_shinfo(nskb)->frags[0].page;
-+              frag->page_offset = rx->offset;
-+              frag->size = rx->status;
-+
-+              skb->data_len += rx->status;
-+
-+              skb_shinfo(nskb)->nr_frags = 0;
-+              kfree_skb(nskb);
-+
-+              frag++;
-+              nr_frags++;
-+      }
-+
-+      shinfo->nr_frags = nr_frags;
-+      return cons;
-+}
-+
-+static int xennet_set_skb_gso(struct sk_buff *skb,
-+                            struct netif_extra_info *gso)
-+{
-+      if (!gso->u.gso.size) {
-+              if (net_ratelimit())
-+                      WPRINTK("GSO size must not be zero.\n");
-+              return -EINVAL;
-+      }
-+
-+      /* Currently only TCPv4 S.O. is supported. */
-+      if (gso->u.gso.type != XEN_NETIF_GSO_TYPE_TCPV4) {
-+              if (net_ratelimit())
-+                      WPRINTK("Bad GSO type %d.\n", gso->u.gso.type);
-+              return -EINVAL;
-+      }
-+
-+#if HAVE_TSO
-+      skb_shinfo(skb)->gso_size = gso->u.gso.size;
-+#if HAVE_GSO
-+      skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
-+
-+      /* Header must be checked, and gso_segs computed. */
-+      skb_shinfo(skb)->gso_type |= SKB_GSO_DODGY;
-+#endif
-+      skb_shinfo(skb)->gso_segs = 0;
-+
-+      return 0;
-+#else
-+      if (net_ratelimit())
-+              WPRINTK("GSO unsupported by this kernel.\n");
-+      return -EINVAL;
-+#endif
-+}
-+
-+static int netif_poll(struct net_device *dev, int *pbudget)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      struct sk_buff *skb;
-+      struct netfront_rx_info rinfo;
-+      struct netif_rx_response *rx = &rinfo.rx;
-+      struct netif_extra_info *extras = rinfo.extras;
-+      RING_IDX i, rp;
-+      struct multicall_entry *mcl;
-+      int work_done, budget, more_to_do = 1, accel_more_to_do = 1;
-+      struct sk_buff_head rxq;
-+      struct sk_buff_head errq;
-+      struct sk_buff_head tmpq;
-+      unsigned long flags;
-+      unsigned int len;
-+      int pages_flipped = 0;
-+      int err;
-+
-+      spin_lock(&np->rx_lock); /* no need for spin_lock_bh() in ->poll() */
-+
-+      if (unlikely(!netfront_carrier_ok(np))) {
-+              spin_unlock(&np->rx_lock);
-+              return 0;
-+      }
-+
-+      skb_queue_head_init(&rxq);
-+      skb_queue_head_init(&errq);
-+      skb_queue_head_init(&tmpq);
-+
-+      if ((budget = *pbudget) > dev->quota)
-+              budget = dev->quota;
-+      rp = np->rx.sring->rsp_prod;
-+      rmb(); /* Ensure we see queued responses up to 'rp'. */
-+
-+      i = np->rx.rsp_cons;
-+      work_done = 0;
-+      while ((i != rp) && (work_done < budget)) {
-+              memcpy(rx, RING_GET_RESPONSE(&np->rx, i), sizeof(*rx));
-+              memset(extras, 0, sizeof(rinfo.extras));
-+
-+              err = xennet_get_responses(np, &rinfo, rp, &tmpq,
-+                                         &pages_flipped);
-+
-+              if (unlikely(err)) {
-+err:  
-+                      while ((skb = __skb_dequeue(&tmpq)))
-+                              __skb_queue_tail(&errq, skb);
-+                      np->stats.rx_errors++;
-+                      i = np->rx.rsp_cons;
-+                      continue;
-+              }
-+
-+              skb = __skb_dequeue(&tmpq);
-+
-+              if (extras[XEN_NETIF_EXTRA_TYPE_GSO - 1].type) {
-+                      struct netif_extra_info *gso;
-+                      gso = &extras[XEN_NETIF_EXTRA_TYPE_GSO - 1];
-+
-+                      if (unlikely(xennet_set_skb_gso(skb, gso))) {
-+                              __skb_queue_head(&tmpq, skb);
-+                              np->rx.rsp_cons += skb_queue_len(&tmpq);
-+                              goto err;
-+                      }
-+              }
-+
-+              NETFRONT_SKB_CB(skb)->page = skb_shinfo(skb)->frags[0].page;
-+              NETFRONT_SKB_CB(skb)->offset = rx->offset;
-+
-+              len = rx->status;
-+              if (len > RX_COPY_THRESHOLD)
-+                      len = RX_COPY_THRESHOLD;
-+              skb_put(skb, len);
-+
-+              if (rx->status > len) {
-+                      skb_shinfo(skb)->frags[0].page_offset =
-+                              rx->offset + len;
-+                      skb_shinfo(skb)->frags[0].size = rx->status - len;
-+                      skb->data_len = rx->status - len;
-+              } else {
-+                      skb_shinfo(skb)->frags[0].page = NULL;
-+                      skb_shinfo(skb)->nr_frags = 0;
-+              }
-+
-+              i = xennet_fill_frags(np, skb, &tmpq);
-+
-+              /*
-+               * Truesize must approximates the size of true data plus
-+               * any supervisor overheads. Adding hypervisor overheads
-+               * has been shown to significantly reduce achievable
-+               * bandwidth with the default receive buffer size. It is
-+               * therefore not wise to account for it here.
-+               *
-+               * After alloc_skb(RX_COPY_THRESHOLD), truesize is set to
-+               * RX_COPY_THRESHOLD + the supervisor overheads. Here, we
-+               * add the size of the data pulled in xennet_fill_frags().
-+               *
-+               * We also adjust for any unused space in the main data
-+               * area by subtracting (RX_COPY_THRESHOLD - len). This is
-+               * especially important with drivers which split incoming
-+               * packets into header and data, using only 66 bytes of
-+               * the main data area (see the e1000 driver for example.)
-+               * On such systems, without this last adjustement, our
-+               * achievable receive throughout using the standard receive
-+               * buffer size was cut by 25%(!!!).
-+               */
-+              skb->truesize += skb->data_len - (RX_COPY_THRESHOLD - len);
-+              skb->len += skb->data_len;
-+
-+              /*
-+               * Old backends do not assert data_validated but we
-+               * can infer it from csum_blank so test both flags.
-+               */
-+              if (rx->flags & (NETRXF_data_validated|NETRXF_csum_blank))
-+                      skb->ip_summed = CHECKSUM_UNNECESSARY;
-+              else
-+                      skb->ip_summed = CHECKSUM_NONE;
-+#ifdef CONFIG_XEN
-+              skb->proto_data_valid = (skb->ip_summed != CHECKSUM_NONE);
-+              skb->proto_csum_blank = !!(rx->flags & NETRXF_csum_blank);
-+#endif
-+              np->stats.rx_packets++;
-+              np->stats.rx_bytes += skb->len;
-+
-+              __skb_queue_tail(&rxq, skb);
-+
-+              np->rx.rsp_cons = ++i;
-+              work_done++;
-+      }
-+
-+      if (pages_flipped) {
-+              /* Some pages are no longer absent... */
-+              balloon_update_driver_allowance(-pages_flipped);
-+
-+              /* Do all the remapping work and M2P updates. */
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      mcl = np->rx_mcl + pages_flipped;
-+                      mcl->op = __HYPERVISOR_mmu_update;
-+                      mcl->args[0] = (unsigned long)np->rx_mmu;
-+                      mcl->args[1] = pages_flipped;
-+                      mcl->args[2] = 0;
-+                      mcl->args[3] = DOMID_SELF;
-+                      err = HYPERVISOR_multicall_check(np->rx_mcl,
-+                                                       pages_flipped + 1,
-+                                                       NULL);
-+                      BUG_ON(err);
-+              }
-+      }
-+
-+      while ((skb = __skb_dequeue(&errq)))
-+              kfree_skb(skb);
-+
-+      while ((skb = __skb_dequeue(&rxq)) != NULL) {
-+              struct page *page = NETFRONT_SKB_CB(skb)->page;
-+              void *vaddr = page_address(page);
-+              unsigned offset = NETFRONT_SKB_CB(skb)->offset;
-+
-+              memcpy(skb->data, vaddr + offset, skb_headlen(skb));
-+
-+              if (page != skb_shinfo(skb)->frags[0].page)
-+                      __free_page(page);
-+
-+              /* Ethernet work: Delayed to here as it peeks the header. */
-+              skb->protocol = eth_type_trans(skb, dev);
-+
-+              /* Pass it up. */
-+              netif_receive_skb(skb);
-+              dev->last_rx = jiffies;
-+      }
-+
-+      /* If we get a callback with very few responses, reduce fill target. */
-+      /* NB. Note exponential increase, linear decrease. */
-+      if (((np->rx.req_prod_pvt - np->rx.sring->rsp_prod) >
-+           ((3*np->rx_target) / 4)) &&
-+          (--np->rx_target < np->rx_min_target))
-+              np->rx_target = np->rx_min_target;
-+
-+      network_alloc_rx_buffers(dev);
-+
-+      if (work_done < budget) {
-+              /* there's some spare capacity, try the accelerated path */
-+              int accel_budget = budget - work_done;
-+              int accel_budget_start = accel_budget;
-+
-+              if (np->accel_vif_state.hooks) { 
-+                      accel_more_to_do =  
-+                              np->accel_vif_state.hooks->netdev_poll 
-+                              (dev, &accel_budget); 
-+                      work_done += (accel_budget_start - accel_budget); 
-+              } else
-+                      accel_more_to_do = 0;
-+      }
-+
-+      *pbudget   -= work_done;
-+      dev->quota -= work_done;
-+
-+      if (work_done < budget) {
-+              local_irq_save(flags);
-+
-+              RING_FINAL_CHECK_FOR_RESPONSES(&np->rx, more_to_do);
-+
-+              if (!more_to_do && !accel_more_to_do && 
-+                  np->accel_vif_state.hooks) {
-+                      /* 
-+                       *  Slow path has nothing more to do, see if
-+                       *  fast path is likewise
-+                       */
-+                      accel_more_to_do = 
-+                              np->accel_vif_state.hooks->start_napi_irq(dev);
-+              }
-+
-+              if (!more_to_do && !accel_more_to_do)
-+                      __netif_rx_complete(dev);
-+
-+              local_irq_restore(flags);
-+      }
-+
-+      spin_unlock(&np->rx_lock);
-+      
-+      return more_to_do | accel_more_to_do;
-+}
-+
-+static void netif_release_tx_bufs(struct netfront_info *np)
-+{
-+      struct sk_buff *skb;
-+      int i;
-+
-+      for (i = 1; i <= NET_TX_RING_SIZE; i++) {
-+              if ((unsigned long)np->tx_skbs[i] < PAGE_OFFSET)
-+                      continue;
-+
-+              skb = np->tx_skbs[i];
-+              gnttab_end_foreign_access_ref(np->grant_tx_ref[i]);
-+              gnttab_release_grant_reference(
-+                      &np->gref_tx_head, np->grant_tx_ref[i]);
-+              np->grant_tx_ref[i] = GRANT_INVALID_REF;
-+              add_id_to_freelist(np->tx_skbs, i);
-+              dev_kfree_skb_irq(skb);
-+      }
-+}
-+
-+static void netif_release_rx_bufs_flip(struct netfront_info *np)
-+{
-+      struct mmu_update      *mmu = np->rx_mmu;
-+      struct multicall_entry *mcl = np->rx_mcl;
-+      struct sk_buff_head free_list;
-+      struct sk_buff *skb;
-+      unsigned long mfn;
-+      int xfer = 0, noxfer = 0, unused = 0;
-+      int id, ref, rc;
-+
-+      skb_queue_head_init(&free_list);
-+
-+      spin_lock_bh(&np->rx_lock);
-+
-+      for (id = 0; id < NET_RX_RING_SIZE; id++) {
-+              if ((ref = np->grant_rx_ref[id]) == GRANT_INVALID_REF) {
-+                      unused++;
-+                      continue;
-+              }
-+
-+              skb = np->rx_skbs[id];
-+              mfn = gnttab_end_foreign_transfer_ref(ref);
-+              gnttab_release_grant_reference(&np->gref_rx_head, ref);
-+              np->grant_rx_ref[id] = GRANT_INVALID_REF;
-+              add_id_to_freelist(np->rx_skbs, id);
-+
-+              if (0 == mfn) {
-+                      struct page *page = skb_shinfo(skb)->frags[0].page;
-+                      balloon_release_driver_page(page);
-+                      skb_shinfo(skb)->nr_frags = 0;
-+                      dev_kfree_skb(skb);
-+                      noxfer++;
-+                      continue;
-+              }
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* Remap the page. */
-+                      struct page *page = skb_shinfo(skb)->frags[0].page;
-+                      unsigned long pfn = page_to_pfn(page);
-+                      void *vaddr = page_address(page);
-+
-+                      MULTI_update_va_mapping(mcl, (unsigned long)vaddr,
-+                                              pfn_pte_ma(mfn, PAGE_KERNEL),
-+                                              0);
-+                      mcl++;
-+                      mmu->ptr = ((maddr_t)mfn << PAGE_SHIFT)
-+                              | MMU_MACHPHYS_UPDATE;
-+                      mmu->val = pfn;
-+                      mmu++;
-+
-+                      set_phys_to_machine(pfn, mfn);
-+              }
-+              __skb_queue_tail(&free_list, skb);
-+              xfer++;
-+      }
-+
-+      DPRINTK("%s: %d xfer, %d noxfer, %d unused\n",
-+              __FUNCTION__, xfer, noxfer, unused);
-+
-+      if (xfer) {
-+              /* Some pages are no longer absent... */
-+              balloon_update_driver_allowance(-xfer);
-+
-+              if (!xen_feature(XENFEAT_auto_translated_physmap)) {
-+                      /* Do all the remapping work and M2P updates. */
-+                      mcl->op = __HYPERVISOR_mmu_update;
-+                      mcl->args[0] = (unsigned long)np->rx_mmu;
-+                      mcl->args[1] = mmu - np->rx_mmu;
-+                      mcl->args[2] = 0;
-+                      mcl->args[3] = DOMID_SELF;
-+                      mcl++;
-+                      rc = HYPERVISOR_multicall_check(
-+                              np->rx_mcl, mcl - np->rx_mcl, NULL);
-+                      BUG_ON(rc);
-+              }
-+      }
-+
-+      while ((skb = __skb_dequeue(&free_list)) != NULL)
-+              dev_kfree_skb(skb);
-+
-+      spin_unlock_bh(&np->rx_lock);
-+}
-+
-+static void netif_release_rx_bufs_copy(struct netfront_info *np)
-+{
-+      struct sk_buff *skb;
-+      int i, ref;
-+      int busy = 0, inuse = 0;
-+
-+      spin_lock_bh(&np->rx_lock);
-+
-+      for (i = 0; i < NET_RX_RING_SIZE; i++) {
-+              ref = np->grant_rx_ref[i];
-+
-+              if (ref == GRANT_INVALID_REF)
-+                      continue;
-+
-+              inuse++;
-+
-+              skb = np->rx_skbs[i];
-+
-+              if (!gnttab_end_foreign_access_ref(ref))
-+              {
-+                      busy++;
-+                      continue;
-+              }
-+
-+              gnttab_release_grant_reference(&np->gref_rx_head, ref);
-+              np->grant_rx_ref[i] = GRANT_INVALID_REF;
-+              add_id_to_freelist(np->rx_skbs, i);
-+
-+              dev_kfree_skb(skb);
-+      }
-+
-+      if (busy)
-+              DPRINTK("%s: Unable to release %d of %d inuse grant references out of %ld total.\n",
-+                      __FUNCTION__, busy, inuse, NET_RX_RING_SIZE);
-+
-+      spin_unlock_bh(&np->rx_lock);
-+}
-+
-+static int network_close(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      netif_stop_queue(np->netdev);
-+      return 0;
-+}
-+
-+
-+static struct net_device_stats *network_get_stats(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+
-+      netfront_accelerator_call_get_stats(np, dev);
-+      return &np->stats;
-+}
-+
-+static int xennet_set_mac_address(struct net_device *dev, void *p)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      struct sockaddr *addr = p;
-+
-+      if (netif_running(dev))
-+              return -EBUSY;
-+
-+      if (!is_valid_ether_addr(addr->sa_data))
-+              return -EADDRNOTAVAIL;
-+
-+      memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
-+      memcpy(np->mac, addr->sa_data, ETH_ALEN);
-+
-+      return 0;
-+}
-+
-+static int xennet_change_mtu(struct net_device *dev, int mtu)
-+{
-+      int max = xennet_can_sg(dev) ? 65535 - ETH_HLEN : ETH_DATA_LEN;
-+
-+      if (mtu > max)
-+              return -EINVAL;
-+      dev->mtu = mtu;
-+      return 0;
-+}
-+
-+static int xennet_set_sg(struct net_device *dev, u32 data)
-+{
-+      if (data) {
-+              struct netfront_info *np = netdev_priv(dev);
-+              int val;
-+
-+              if (xenbus_scanf(XBT_NIL, np->xbdev->otherend, "feature-sg",
-+                               "%d", &val) < 0)
-+                      val = 0;
-+              if (!val)
-+                      return -ENOSYS;
-+      } else if (dev->mtu > ETH_DATA_LEN)
-+              dev->mtu = ETH_DATA_LEN;
-+
-+      return ethtool_op_set_sg(dev, data);
-+}
-+
-+static int xennet_set_tso(struct net_device *dev, u32 data)
-+{
-+      if (data) {
-+              struct netfront_info *np = netdev_priv(dev);
-+              int val;
-+
-+              if (xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-+                               "feature-gso-tcpv4", "%d", &val) < 0)
-+                      val = 0;
-+              if (!val)
-+                      return -ENOSYS;
-+      }
-+
-+      return ethtool_op_set_tso(dev, data);
-+}
-+
-+static void xennet_set_features(struct net_device *dev)
-+{
-+      dev_disable_gso_features(dev);
-+      xennet_set_sg(dev, 0);
-+
-+      /* We need checksum offload to enable scatter/gather and TSO. */
-+      if (!(dev->features & NETIF_F_IP_CSUM))
-+              return;
-+
-+      if (xennet_set_sg(dev, 1))
-+              return;
-+
-+      /* Before 2.6.9 TSO seems to be unreliable so do not enable it
-+       * on older kernels.
-+       */
-+      if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9))
-+              xennet_set_tso(dev, 1);
-+}
-+
-+static int network_connect(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      int i, requeue_idx, err;
-+      struct sk_buff *skb;
-+      grant_ref_t ref;
-+      netif_rx_request_t *req;
-+      unsigned int feature_rx_copy, feature_rx_flip;
-+
-+      err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-+                         "feature-rx-copy", "%u", &feature_rx_copy);
-+      if (err != 1)
-+              feature_rx_copy = 0;
-+      err = xenbus_scanf(XBT_NIL, np->xbdev->otherend,
-+                         "feature-rx-flip", "%u", &feature_rx_flip);
-+      if (err != 1)
-+              feature_rx_flip = 1;
-+
-+      /*
-+       * Copy packets on receive path if:
-+       *  (a) This was requested by user, and the backend supports it; or
-+       *  (b) Flipping was requested, but this is unsupported by the backend.
-+       */
-+      np->copying_receiver = ((MODPARM_rx_copy && feature_rx_copy) ||
-+                              (MODPARM_rx_flip && !feature_rx_flip));
-+
-+      err = talk_to_backend(np->xbdev, np);
-+      if (err)
-+              return err;
-+
-+      xennet_set_features(dev);
-+
-+      DPRINTK("device %s has %sing receive path.\n",
-+              dev->name, np->copying_receiver ? "copy" : "flipp");
-+
-+      spin_lock_bh(&np->rx_lock);
-+      spin_lock_irq(&np->tx_lock);
-+
-+      /*
-+       * Recovery procedure:
-+       *  NB. Freelist index entries are always going to be less than
-+       *  PAGE_OFFSET, whereas pointers to skbs will always be equal or
-+       *  greater than PAGE_OFFSET: we use this property to distinguish
-+       *  them.
-+       */
-+
-+      /* Step 1: Discard all pending TX packet fragments. */
-+      netif_release_tx_bufs(np);
-+
-+      /* Step 2: Rebuild the RX buffer freelist and the RX ring itself. */
-+      for (requeue_idx = 0, i = 0; i < NET_RX_RING_SIZE; i++) {
-+              if (!np->rx_skbs[i])
-+                      continue;
-+
-+              skb = np->rx_skbs[requeue_idx] = xennet_get_rx_skb(np, i);
-+              ref = np->grant_rx_ref[requeue_idx] = xennet_get_rx_ref(np, i);
-+              req = RING_GET_REQUEST(&np->rx, requeue_idx);
-+
-+              if (!np->copying_receiver) {
-+                      gnttab_grant_foreign_transfer_ref(
-+                              ref, np->xbdev->otherend_id,
-+                              page_to_pfn(skb_shinfo(skb)->frags->page));
-+              } else {
-+                      gnttab_grant_foreign_access_ref(
-+                              ref, np->xbdev->otherend_id,
-+                              pfn_to_mfn(page_to_pfn(skb_shinfo(skb)->
-+                                                     frags->page)),
-+                              0);
-+              }
-+              req->gref = ref;
-+              req->id   = requeue_idx;
-+
-+              requeue_idx++;
-+      }
-+
-+      np->rx.req_prod_pvt = requeue_idx;
-+
-+      /*
-+       * Step 3: All public and private state should now be sane.  Get
-+       * ready to start sending and receiving packets and give the driver
-+       * domain a kick because we've probably just requeued some
-+       * packets.
-+       */
-+      netfront_carrier_on(np);
-+      notify_remote_via_irq(np->irq);
-+      network_tx_buf_gc(dev);
-+      network_alloc_rx_buffers(dev);
-+
-+      spin_unlock_irq(&np->tx_lock);
-+      spin_unlock_bh(&np->rx_lock);
-+
-+      return 0;
-+}
-+
-+static void netif_uninit(struct net_device *dev)
-+{
-+      struct netfront_info *np = netdev_priv(dev);
-+      netif_release_tx_bufs(np);
-+      if (np->copying_receiver)
-+              netif_release_rx_bufs_copy(np);
-+      else
-+              netif_release_rx_bufs_flip(np);
-+      gnttab_free_grant_references(np->gref_tx_head);
-+      gnttab_free_grant_references(np->gref_rx_head);
-+}
-+
-+static struct ethtool_ops network_ethtool_ops =
-+{
-+      .get_tx_csum = ethtool_op_get_tx_csum,
-+      .set_tx_csum = ethtool_op_set_tx_csum,
-+      .get_sg = ethtool_op_get_sg,
-+      .set_sg = xennet_set_sg,
-+#if HAVE_TSO
-+      .get_tso = ethtool_op_get_tso,
-+      .set_tso = xennet_set_tso,
-+#endif
-+      .get_link = ethtool_op_get_link,
-+};
-+
-+#ifdef CONFIG_SYSFS
-+static ssize_t show_rxbuf_min(struct class_device *cd, char *buf)
-+{
-+      struct net_device *netdev = container_of(cd, struct net_device,
-+                                               class_dev);
-+      struct netfront_info *info = netdev_priv(netdev);
-+
-+      return sprintf(buf, "%u\n", info->rx_min_target);
-+}
-+
-+static ssize_t store_rxbuf_min(struct class_device *cd,
-+                             const char *buf, size_t len)
-+{
-+      struct net_device *netdev = container_of(cd, struct net_device,
-+                                               class_dev);
-+      struct netfront_info *np = netdev_priv(netdev);
-+      char *endp;
-+      unsigned long target;
-+
-+      if (!capable(CAP_NET_ADMIN))
-+              return -EPERM;
-+
-+      target = simple_strtoul(buf, &endp, 0);
-+      if (endp == buf)
-+              return -EBADMSG;
-+
-+      if (target < RX_MIN_TARGET)
-+              target = RX_MIN_TARGET;
-+      if (target > RX_MAX_TARGET)
-+              target = RX_MAX_TARGET;
-+
-+      spin_lock_bh(&np->rx_lock);
-+      if (target > np->rx_max_target)
-+              np->rx_max_target = target;
-+      np->rx_min_target = target;
-+      if (target > np->rx_target)
-+              np->rx_target = target;
-+
-+      network_alloc_rx_buffers(netdev);
-+
-+      spin_unlock_bh(&np->rx_lock);
-+      return len;
-+}
-+
-+static ssize_t show_rxbuf_max(struct class_device *cd, char *buf)
-+{
-+      struct net_device *netdev = container_of(cd, struct net_device,
-+                                               class_dev);
-+      struct netfront_info *info = netdev_priv(netdev);
-+
-+      return sprintf(buf, "%u\n", info->rx_max_target);
-+}
-+
-+static ssize_t store_rxbuf_max(struct class_device *cd,
-+                             const char *buf, size_t len)
-+{
-+      struct net_device *netdev = container_of(cd, struct net_device,
-+                                               class_dev);
-+      struct netfront_info *np = netdev_priv(netdev);
-+      char *endp;
-+      unsigned long target;
-+
-+      if (!capable(CAP_NET_ADMIN))
-+              return -EPERM;
-+
-+      target = simple_strtoul(buf, &endp, 0);
-+      if (endp == buf)
-+              return -EBADMSG;
-+
-+      if (target < RX_MIN_TARGET)
-+              target = RX_MIN_TARGET;
-+      if (target > RX_MAX_TARGET)
-+              target = RX_MAX_TARGET;
-+
-+      spin_lock_bh(&np->rx_lock);
-+      if (target < np->rx_min_target)
-+              np->rx_min_target = target;
-+      np->rx_max_target = target;
-+      if (target < np->rx_target)
-+              np->rx_target = target;
-+
-+      network_alloc_rx_buffers(netdev);
-+
-+      spin_unlock_bh(&np->rx_lock);
-+      return len;
-+}
-+
-+static ssize_t show_rxbuf_cur(struct class_device *cd, char *buf)
-+{
-+      struct net_device *netdev = container_of(cd, struct net_device,
-+                                               class_dev);
-+      struct netfront_info *info = netdev_priv(netdev);
-+
-+      return sprintf(buf, "%u\n", info->rx_target);
-+}
-+
-+static const struct class_device_attribute xennet_attrs[] = {
-+      __ATTR(rxbuf_min, S_IRUGO|S_IWUSR, show_rxbuf_min, store_rxbuf_min),
-+      __ATTR(rxbuf_max, S_IRUGO|S_IWUSR, show_rxbuf_max, store_rxbuf_max),
-+      __ATTR(rxbuf_cur, S_IRUGO, show_rxbuf_cur, NULL),
-+};
-+
-+static int xennet_sysfs_addif(struct net_device *netdev)
-+{
-+      int i;
-+      int error = 0;
-+
-+      for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
-+              error = class_device_create_file(&netdev->class_dev, 
-+                                               &xennet_attrs[i]);
-+              if (error)
-+                      goto fail;
-+      }
-+      return 0;
-+
-+ fail:
-+      while (--i >= 0)
-+              class_device_remove_file(&netdev->class_dev,
-+                                       &xennet_attrs[i]);
-+      return error;
-+}
-+
-+static void xennet_sysfs_delif(struct net_device *netdev)
-+{
-+      int i;
-+
-+      for (i = 0; i < ARRAY_SIZE(xennet_attrs); i++) {
-+              class_device_remove_file(&netdev->class_dev,
-+                                       &xennet_attrs[i]);
-+      }
-+}
-+
-+#endif /* CONFIG_SYSFS */
-+
-+
-+/*
-+ * Nothing to do here. Virtual interface is point-to-point and the
-+ * physical interface is probably promiscuous anyway.
-+ */
-+static void network_set_multicast_list(struct net_device *dev)
-+{
-+}
-+
-+static struct net_device * __devinit create_netdev(struct xenbus_device *dev)
-+{
-+      int i, err = 0;
-+      struct net_device *netdev = NULL;
-+      struct netfront_info *np = NULL;
-+
-+      netdev = alloc_etherdev(sizeof(struct netfront_info));
-+      if (!netdev) {
-+              printk(KERN_WARNING "%s> alloc_etherdev failed.\n",
-+                     __FUNCTION__);
-+              return ERR_PTR(-ENOMEM);
-+      }
-+
-+      np                   = netdev_priv(netdev);
-+      np->xbdev            = dev;
-+
-+      spin_lock_init(&np->tx_lock);
-+      spin_lock_init(&np->rx_lock);
-+
-+      init_accelerator_vif(np, dev);
-+
-+      skb_queue_head_init(&np->rx_batch);
-+      np->rx_target     = RX_DFL_MIN_TARGET;
-+      np->rx_min_target = RX_DFL_MIN_TARGET;
-+      np->rx_max_target = RX_MAX_TARGET;
-+
-+      init_timer(&np->rx_refill_timer);
-+      np->rx_refill_timer.data = (unsigned long)netdev;
-+      np->rx_refill_timer.function = rx_refill_timeout;
-+
-+      /* Initialise {tx,rx}_skbs as a free chain containing every entry. */
-+      for (i = 0; i <= NET_TX_RING_SIZE; i++) {
-+              np->tx_skbs[i] = (void *)((unsigned long) i+1);
-+              np->grant_tx_ref[i] = GRANT_INVALID_REF;
-+      }
-+
-+      for (i = 0; i < NET_RX_RING_SIZE; i++) {
-+              np->rx_skbs[i] = NULL;
-+              np->grant_rx_ref[i] = GRANT_INVALID_REF;
-+      }
-+
-+      /* A grant for every tx ring slot */
-+      if (gnttab_alloc_grant_references(TX_MAX_TARGET,
-+                                        &np->gref_tx_head) < 0) {
-+              printk(KERN_ALERT "#### netfront can't alloc tx grant refs\n");
-+              err = -ENOMEM;
-+              goto exit;
-+      }
-+      /* A grant for every rx ring slot */
-+      if (gnttab_alloc_grant_references(RX_MAX_TARGET,
-+                                        &np->gref_rx_head) < 0) {
-+              printk(KERN_ALERT "#### netfront can't alloc rx grant refs\n");
-+              err = -ENOMEM;
-+              goto exit_free_tx;
-+      }
-+
-+      netdev->open            = network_open;
-+      netdev->hard_start_xmit = network_start_xmit;
-+      netdev->stop            = network_close;
-+      netdev->get_stats       = network_get_stats;
-+      netdev->poll            = netif_poll;
-+      netdev->set_multicast_list = network_set_multicast_list;
-+      netdev->uninit          = netif_uninit;
-+      netdev->set_mac_address = xennet_set_mac_address;
-+      netdev->change_mtu      = xennet_change_mtu;
-+      netdev->weight          = 64;
-+      netdev->features        = NETIF_F_IP_CSUM;
-+
-+      SET_ETHTOOL_OPS(netdev, &network_ethtool_ops);
-+      SET_MODULE_OWNER(netdev);
-+      SET_NETDEV_DEV(netdev, &dev->dev);
-+
-+      np->netdev = netdev;
-+
-+      netfront_carrier_off(np);
-+
-+      return netdev;
-+
-+ exit_free_tx:
-+      gnttab_free_grant_references(np->gref_tx_head);
-+ exit:
-+      free_netdev(netdev);
-+      return ERR_PTR(err);
-+}
-+
-+#ifdef CONFIG_INET
-+/*
-+ * We use this notifier to send out a fake ARP reply to reset switches and
-+ * router ARP caches when an IP interface is brought up on a VIF.
-+ */
-+static int
-+inetdev_notify(struct notifier_block *this, unsigned long event, void *ptr)
-+{
-+      struct in_ifaddr  *ifa = (struct in_ifaddr *)ptr;
-+      struct net_device *dev = ifa->ifa_dev->dev;
-+
-+      /* UP event and is it one of our devices? */
-+      if (event == NETDEV_UP && dev->open == network_open)
-+              send_fake_arp(dev);
-+
-+      return NOTIFY_DONE;
-+}
-+
-+static struct notifier_block notifier_inetdev = {
-+      .notifier_call  = inetdev_notify,
-+      .next           = NULL,
-+      .priority       = 0
-+};
-+#endif
-+
-+
-+static void netif_disconnect_backend(struct netfront_info *info)
-+{
-+      /* Stop old i/f to prevent errors whilst we rebuild the state. */
-+      spin_lock_bh(&info->rx_lock);
-+      spin_lock_irq(&info->tx_lock);
-+      netfront_carrier_off(info);
-+      spin_unlock_irq(&info->tx_lock);
-+      spin_unlock_bh(&info->rx_lock);
-+
-+      if (info->irq)
-+              unbind_from_irqhandler(info->irq, info->netdev);
-+      info->irq = 0;
-+
-+      end_access(info->tx_ring_ref, info->tx.sring);
-+      end_access(info->rx_ring_ref, info->rx.sring);
-+      info->tx_ring_ref = GRANT_INVALID_REF;
-+      info->rx_ring_ref = GRANT_INVALID_REF;
-+      info->tx.sring = NULL;
-+      info->rx.sring = NULL;
-+}
-+
-+
-+static void end_access(int ref, void *page)
-+{
-+      if (ref != GRANT_INVALID_REF)
-+              gnttab_end_foreign_access(ref, (unsigned long)page);
-+}
-+
-+
-+/* ** Driver registration ** */
-+
-+
-+static const struct xenbus_device_id netfront_ids[] = {
-+      { "vif" },
-+      { "" }
-+};
-+MODULE_ALIAS("xen:vif");
-+
-+
-+static struct xenbus_driver netfront_driver = {
-+      .name = "vif",
-+      .owner = THIS_MODULE,
-+      .ids = netfront_ids,
-+      .probe = netfront_probe,
-+      .remove = __devexit_p(netfront_remove),
-+      .suspend = netfront_suspend,
-+      .suspend_cancel = netfront_suspend_cancel,
-+      .resume = netfront_resume,
-+      .otherend_changed = backend_changed,
-+};
-+
-+
-+static int __init netif_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+#ifdef CONFIG_XEN
-+      if (MODPARM_rx_flip && MODPARM_rx_copy) {
-+              WPRINTK("Cannot specify both rx_copy and rx_flip.\n");
-+              return -EINVAL;
-+      }
-+
-+      if (!MODPARM_rx_flip && !MODPARM_rx_copy)
-+              MODPARM_rx_flip = 1; /* Default is to flip. */
-+#endif
-+
-+      netif_init_accel();
-+
-+      IPRINTK("Initialising virtual ethernet driver.\n");
-+
-+#ifdef CONFIG_INET
-+      (void)register_inetaddr_notifier(&notifier_inetdev);
-+#endif
-+
-+      return xenbus_register_frontend(&netfront_driver);
-+}
-+module_init(netif_init);
-+
-+
-+static void __exit netif_exit(void)
-+{
-+#ifdef CONFIG_INET
-+      unregister_inetaddr_notifier(&notifier_inetdev);
-+#endif
-+
-+      netif_exit_accel();
-+
-+      return xenbus_unregister_driver(&netfront_driver);
-+}
-+module_exit(netif_exit);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/netfront/netfront.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/netfront/netfront.h    2008-01-07 13:19:18.000000000 +0100
-@@ -0,0 +1,274 @@
-+/******************************************************************************
-+ * Virtual network driver for conversing with remote driver backends.
-+ *
-+ * Copyright (c) 2002-2005, K A Fraser
-+ * Copyright (c) 2005, XenSource Ltd
-+ * Copyright (C) 2007 Solarflare Communications, Inc.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ *
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ *
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ *
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef NETFRONT_H
-+#define NETFRONT_H
-+
-+#include <xen/interface/io/netif.h>
-+#include <linux/netdevice.h>
-+#include <linux/skbuff.h>
-+#include <linux/list.h>
-+
-+#define NET_TX_RING_SIZE __RING_SIZE((struct netif_tx_sring *)0, PAGE_SIZE)
-+#define NET_RX_RING_SIZE __RING_SIZE((struct netif_rx_sring *)0, PAGE_SIZE)
-+
-+#include <xen/xenbus.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+/* 
-+ * Function pointer table for hooks into a network acceleration
-+ * plugin.  These are called at appropriate points from the netfront
-+ * driver 
-+ */
-+struct netfront_accel_hooks {
-+      /* 
-+       * new_device: Accelerator hook to ask the plugin to support a
-+       * new network interface
-+       */
-+      int (*new_device)(struct net_device *net_dev, struct xenbus_device *dev);
-+      /*
-+       * remove: Opposite of new_device
-+       */
-+      int (*remove)(struct xenbus_device *dev);
-+      /*
-+       * The net_device is being polled, check the accelerated
-+       * hardware for any pending packets
-+       */
-+      int (*netdev_poll)(struct net_device *dev, int *pbudget);
-+      /*
-+       * start_xmit: Used to give the accelerated plugin the option
-+       * of sending a packet.  Returns non-zero if has done so, or
-+       * zero to decline and force the packet onto normal send
-+       * path
-+       */
-+      int (*start_xmit)(struct sk_buff *skb, struct net_device *dev);
-+      /* 
-+       * start/stop_napi_interrupts Used by netfront to indicate
-+       * when napi interrupts should be enabled or disabled 
-+       */
-+      int (*start_napi_irq)(struct net_device *dev);
-+      void (*stop_napi_irq)(struct net_device *dev);
-+      /* 
-+       * Called before re-enabling the TX queue to check the fast
-+       * path has slots too
-+       */
-+      int (*check_ready)(struct net_device *dev);
-+      /*
-+       * Get the fastpath network statistics
-+       */
-+      int (*get_stats)(struct net_device *dev,
-+                       struct net_device_stats *stats);
-+};
-+
-+
-+/* Version of API/protocol for communication between netfront and
-+   acceleration plugin supported */
-+#define NETFRONT_ACCEL_VERSION 0x00010003
-+
-+/* 
-+ * Per-netfront device state for the accelerator.  This is used to
-+ * allow efficient per-netfront device access to the accelerator
-+ * hooks 
-+ */
-+struct netfront_accel_vif_state {
-+      struct list_head link;
-+
-+      struct xenbus_device *dev;
-+      struct netfront_info *np;
-+      struct netfront_accel_hooks *hooks;
-+
-+      /* Watch on the accelerator configuration value */
-+      struct xenbus_watch accel_watch;
-+      /* Work item to process change in accelerator */
-+      struct work_struct accel_work;
-+      /* The string from xenbus last time accel_watch fired */
-+      char *accel_frontend;
-+}; 
-+
-+/* 
-+ * Per-accelerator state stored in netfront.  These form a list that
-+ * is used to track which devices are accelerated by which plugins,
-+ * and what plugins are available/have been requested 
-+ */
-+struct netfront_accelerator {
-+      /* Used to make a list */
-+      struct list_head link;
-+      /* ID of the accelerator */
-+      int id;
-+      /*
-+       * String describing the accelerator.  Currently this is the
-+       * name of the accelerator module.  This is provided by the
-+       * backend accelerator through xenstore 
-+       */
-+      char *frontend;
-+      /* The hooks into the accelerator plugin module */
-+      struct netfront_accel_hooks *hooks;
-+
-+      /* 
-+       * List of per-netfront device state (struct
-+       * netfront_accel_vif_state) for each netfront device that is
-+       * using this accelerator
-+       */
-+      struct list_head vif_states;
-+      spinlock_t vif_states_lock;
-+};
-+
-+struct netfront_info {
-+      struct list_head list;
-+      struct net_device *netdev;
-+
-+      struct net_device_stats stats;
-+
-+      struct netif_tx_front_ring tx;
-+      struct netif_rx_front_ring rx;
-+
-+      spinlock_t   tx_lock;
-+      spinlock_t   rx_lock;
-+
-+      unsigned int irq;
-+      unsigned int copying_receiver;
-+      unsigned int carrier;
-+
-+      /* Receive-ring batched refills. */
-+#define RX_MIN_TARGET 8
-+#define RX_DFL_MIN_TARGET 64
-+#define RX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
-+      unsigned rx_min_target, rx_max_target, rx_target;
-+      struct sk_buff_head rx_batch;
-+
-+      struct timer_list rx_refill_timer;
-+
-+      /*
-+       * {tx,rx}_skbs store outstanding skbuffs. The first entry in tx_skbs
-+       * is an index into a chain of free entries.
-+       */
-+      struct sk_buff *tx_skbs[NET_TX_RING_SIZE+1];
-+      struct sk_buff *rx_skbs[NET_RX_RING_SIZE];
-+
-+#define TX_MAX_TARGET min_t(int, NET_RX_RING_SIZE, 256)
-+      grant_ref_t gref_tx_head;
-+      grant_ref_t grant_tx_ref[NET_TX_RING_SIZE + 1];
-+      grant_ref_t gref_rx_head;
-+      grant_ref_t grant_rx_ref[NET_RX_RING_SIZE];
-+
-+      struct xenbus_device *xbdev;
-+      int tx_ring_ref;
-+      int rx_ring_ref;
-+      u8 mac[ETH_ALEN];
-+
-+      unsigned long rx_pfn_array[NET_RX_RING_SIZE];
-+      struct multicall_entry rx_mcl[NET_RX_RING_SIZE+1];
-+      struct mmu_update rx_mmu[NET_RX_RING_SIZE];
-+
-+      /* Private pointer to state internal to accelerator module */
-+      void *accel_priv;
-+      /* The accelerator used by this netfront device */
-+      struct netfront_accelerator *accelerator;
-+      /* The accelerator state for this netfront device */
-+      struct netfront_accel_vif_state accel_vif_state;
-+};
-+
-+
-+/* Exported Functions */
-+
-+/*
-+ * Called by an accelerator plugin module when it has loaded.
-+ *
-+ * frontend: the string describing the accelerator, currently the module name 
-+ * hooks: the hooks for netfront to use to call into the accelerator
-+ * version: the version of API between frontend and plugin requested
-+ * 
-+ * return: 0 on success, <0 on error, >0 (with version supported) on
-+ * version mismatch
-+ */
-+extern int netfront_accelerator_loaded(int version, const char *frontend, 
-+                                     struct netfront_accel_hooks *hooks);
-+
-+/* 
-+ * Called by an accelerator plugin module when it is about to unload.
-+ *
-+ * frontend: the string describing the accelerator.  Must match the
-+ * one passed to netfront_accelerator_loaded()
-+ */ 
-+extern void netfront_accelerator_stop(const char *frontend);
-+
-+/* 
-+ * Called by an accelerator before waking the net device's TX queue to
-+ * ensure the slow path has available slots.  Returns true if OK to
-+ * wake, false if still busy 
-+ */
-+extern int netfront_check_queue_ready(struct net_device *net_dev);
-+
-+
-+/* Internal-to-netfront Functions */
-+
-+/* 
-+ * Call into accelerator and check to see if it has tx space before we
-+ * wake the net device's TX queue.  Returns true if OK to wake, false
-+ * if still busy
-+ */ 
-+extern 
-+int netfront_check_accelerator_queue_ready(struct net_device *dev,
-+                                         struct netfront_info *np);
-+extern
-+int netfront_accelerator_call_remove(struct netfront_info *np,
-+                                   struct xenbus_device *dev);
-+extern
-+int netfront_accelerator_suspend(struct netfront_info *np,
-+                               struct xenbus_device *dev);
-+extern
-+int netfront_accelerator_suspend_cancel(struct netfront_info *np,
-+                                      struct xenbus_device *dev);
-+extern
-+void netfront_accelerator_resume(struct netfront_info *np,
-+                               struct xenbus_device *dev);
-+extern
-+void netfront_accelerator_call_stop_napi_irq(struct netfront_info *np,
-+                                           struct net_device *dev);
-+extern
-+int netfront_accelerator_call_get_stats(struct netfront_info *np,
-+                                      struct net_device *dev);
-+extern
-+void netfront_accelerator_add_watch(struct netfront_info *np);
-+
-+extern
-+void netif_init_accel(void);
-+extern
-+void netif_exit_accel(void);
-+
-+extern
-+void init_accelerator_vif(struct netfront_info *np,
-+                        struct xenbus_device *dev);
-+#endif /* NETFRONT_H */
-Index: head-2008-11-25/drivers/xen/pciback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/Makefile       2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,17 @@
-+obj-$(CONFIG_XEN_PCIDEV_BACKEND) += pciback.o
-+
-+pciback-y := pci_stub.o pciback_ops.o xenbus.o
-+pciback-y += conf_space.o conf_space_header.o \
-+           conf_space_capability.o \
-+           conf_space_capability_vpd.o \
-+           conf_space_capability_pm.o \
-+             conf_space_quirks.o
-+pciback-$(CONFIG_PCI_MSI) += conf_space_capability_msi.o
-+pciback-$(CONFIG_XEN_PCIDEV_BACKEND_VPCI) += vpci.o
-+pciback-$(CONFIG_XEN_PCIDEV_BACKEND_SLOT) += slot.o
-+pciback-$(CONFIG_XEN_PCIDEV_BACKEND_PASS) += passthrough.o
-+pciback-$(CONFIG_XEN_PCIDEV_BACKEND_CONTROLLER) += controller.o
-+
-+ifeq ($(CONFIG_XEN_PCIDEV_BE_DEBUG),y)
-+EXTRA_CFLAGS += -DDEBUG
-+endif
-Index: head-2008-11-25/drivers/xen/pciback/conf_space.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space.c   2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,426 @@
-+/*
-+ * PCI Backend - Functions for creating a virtual configuration space for
-+ *               exported PCI Devices.
-+ *               It's dangerous to allow PCI Driver Domains to change their
-+ *               device's resources (memory, i/o ports, interrupts). We need to
-+ *               restrict changes to certain PCI Configuration registers:
-+ *               BARs, INTERRUPT_PIN, most registers in the header...
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include "pciback.h"
-+#include "conf_space.h"
-+#include "conf_space_quirks.h"
-+
-+#define DEFINE_PCI_CONFIG(op,size,type)                       \
-+int pciback_##op##_config_##size                              \
-+(struct pci_dev *dev, int offset, type value, void *data)     \
-+{                                                             \
-+      return pci_##op##_config_##size (dev, offset, value);   \
-+}
-+
-+DEFINE_PCI_CONFIG(read, byte, u8 *)
-+DEFINE_PCI_CONFIG(read, word, u16 *)
-+DEFINE_PCI_CONFIG(read, dword, u32 *)
-+
-+DEFINE_PCI_CONFIG(write, byte, u8)
-+DEFINE_PCI_CONFIG(write, word, u16)
-+DEFINE_PCI_CONFIG(write, dword, u32)
-+
-+static int conf_space_read(struct pci_dev *dev,
-+                         const struct config_field_entry *entry,
-+                         int offset, u32 *value)
-+{
-+      int ret = 0;
-+      const struct config_field *field = entry->field;
-+
-+      *value = 0;
-+
-+      switch (field->size) {
-+      case 1:
-+              if (field->u.b.read)
-+                      ret = field->u.b.read(dev, offset, (u8 *) value,
-+                                            entry->data);
-+              break;
-+      case 2:
-+              if (field->u.w.read)
-+                      ret = field->u.w.read(dev, offset, (u16 *) value,
-+                                            entry->data);
-+              break;
-+      case 4:
-+              if (field->u.dw.read)
-+                      ret = field->u.dw.read(dev, offset, value, entry->data);
-+              break;
-+      }
-+      return ret;
-+}
-+
-+static int conf_space_write(struct pci_dev *dev,
-+                          const struct config_field_entry *entry,
-+                          int offset, u32 value)
-+{
-+      int ret = 0;
-+      const struct config_field *field = entry->field;
-+
-+      switch (field->size) {
-+      case 1:
-+              if (field->u.b.write)
-+                      ret = field->u.b.write(dev, offset, (u8) value,
-+                                             entry->data);
-+              break;
-+      case 2:
-+              if (field->u.w.write)
-+                      ret = field->u.w.write(dev, offset, (u16) value,
-+                                             entry->data);
-+              break;
-+      case 4:
-+              if (field->u.dw.write)
-+                      ret = field->u.dw.write(dev, offset, value,
-+                                              entry->data);
-+              break;
-+      }
-+      return ret;
-+}
-+
-+static inline u32 get_mask(int size)
-+{
-+      if (size == 1)
-+              return 0xff;
-+      else if (size == 2)
-+              return 0xffff;
-+      else
-+              return 0xffffffff;
-+}
-+
-+static inline int valid_request(int offset, int size)
-+{
-+      /* Validate request (no un-aligned requests) */
-+      if ((size == 1 || size == 2 || size == 4) && (offset % size) == 0)
-+              return 1;
-+      return 0;
-+}
-+
-+static inline u32 merge_value(u32 val, u32 new_val, u32 new_val_mask,
-+                            int offset)
-+{
-+      if (offset >= 0) {
-+              new_val_mask <<= (offset * 8);
-+              new_val <<= (offset * 8);
-+      } else {
-+              new_val_mask >>= (offset * -8);
-+              new_val >>= (offset * -8);
-+      }
-+      val = (val & ~new_val_mask) | (new_val & new_val_mask);
-+
-+      return val;
-+}
-+
-+static int pcibios_err_to_errno(int err)
-+{
-+      switch (err) {
-+      case PCIBIOS_SUCCESSFUL:
-+              return XEN_PCI_ERR_success;
-+      case PCIBIOS_DEVICE_NOT_FOUND:
-+              return XEN_PCI_ERR_dev_not_found;
-+      case PCIBIOS_BAD_REGISTER_NUMBER:
-+              return XEN_PCI_ERR_invalid_offset;
-+      case PCIBIOS_FUNC_NOT_SUPPORTED:
-+              return XEN_PCI_ERR_not_implemented;
-+      case PCIBIOS_SET_FAILED:
-+              return XEN_PCI_ERR_access_denied;
-+      }
-+      return err;
-+}
-+
-+int pciback_config_read(struct pci_dev *dev, int offset, int size,
-+                      u32 * ret_val)
-+{
-+      int err = 0;
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      const struct config_field_entry *cfg_entry;
-+      const struct config_field *field;
-+      int req_start, req_end, field_start, field_end;
-+      /* if read fails for any reason, return 0 (as if device didn't respond) */
-+      u32 value = 0, tmp_val;
-+
-+      if (unlikely(verbose_request))
-+              printk(KERN_DEBUG "pciback: %s: read %d bytes at 0x%x\n",
-+                     pci_name(dev), size, offset);
-+
-+      if (!valid_request(offset, size)) {
-+              err = XEN_PCI_ERR_invalid_offset;
-+              goto out;
-+      }
-+
-+      /* Get the real value first, then modify as appropriate */
-+      switch (size) {
-+      case 1:
-+              err = pci_read_config_byte(dev, offset, (u8 *) & value);
-+              break;
-+      case 2:
-+              err = pci_read_config_word(dev, offset, (u16 *) & value);
-+              break;
-+      case 4:
-+              err = pci_read_config_dword(dev, offset, &value);
-+              break;
-+      }
-+
-+      list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-+              field = cfg_entry->field;
-+
-+              req_start = offset;
-+              req_end = offset + size;
-+              field_start = OFFSET(cfg_entry);
-+              field_end = OFFSET(cfg_entry) + field->size;
-+
-+              if ((req_start >= field_start && req_start < field_end)
-+                  || (req_end > field_start && req_end <= field_end)) {
-+                      err = conf_space_read(dev, cfg_entry, field_start,
-+                                            &tmp_val);
-+                      if (err)
-+                              goto out;
-+
-+                      value = merge_value(value, tmp_val,
-+                                          get_mask(field->size),
-+                                          field_start - req_start);
-+              }
-+      }
-+
-+      out:
-+      if (unlikely(verbose_request))
-+              printk(KERN_DEBUG "pciback: %s: read %d bytes at 0x%x = %x\n",
-+                     pci_name(dev), size, offset, value);
-+
-+      *ret_val = value;
-+      return pcibios_err_to_errno(err);
-+}
-+
-+int pciback_config_write(struct pci_dev *dev, int offset, int size, u32 value)
-+{
-+      int err = 0, handled = 0;
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      const struct config_field_entry *cfg_entry;
-+      const struct config_field *field;
-+      u32 tmp_val;
-+      int req_start, req_end, field_start, field_end;
-+
-+      if (unlikely(verbose_request))
-+              printk(KERN_DEBUG
-+                     "pciback: %s: write request %d bytes at 0x%x = %x\n",
-+                     pci_name(dev), size, offset, value);
-+
-+      if (!valid_request(offset, size))
-+              return XEN_PCI_ERR_invalid_offset;
-+
-+      list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-+              field = cfg_entry->field;
-+
-+              req_start = offset;
-+              req_end = offset + size;
-+              field_start = OFFSET(cfg_entry);
-+              field_end = OFFSET(cfg_entry) + field->size;
-+
-+              if ((req_start >= field_start && req_start < field_end)
-+                  || (req_end > field_start && req_end <= field_end)) {
-+                      tmp_val = 0;
-+
-+                      err = pciback_config_read(dev, field_start,
-+                                                field->size, &tmp_val);
-+                      if (err)
-+                              break;
-+
-+                      tmp_val = merge_value(tmp_val, value, get_mask(size),
-+                                            req_start - field_start);
-+
-+                      err = conf_space_write(dev, cfg_entry, field_start,
-+                                             tmp_val);
-+
-+                      /* handled is set true here, but not every byte
-+                       * may have been written! Properly detecting if
-+                       * every byte is handled is unnecessary as the
-+                       * flag is used to detect devices that need
-+                       * special helpers to work correctly.
-+                       */
-+                      handled = 1;
-+              }
-+      }
-+
-+      if (!handled && !err) {
-+              /* By default, anything not specificially handled above is
-+               * read-only. The permissive flag changes this behavior so
-+               * that anything not specifically handled above is writable.
-+               * This means that some fields may still be read-only because
-+               * they have entries in the config_field list that intercept
-+               * the write and do nothing. */
-+              if (dev_data->permissive) {
-+                      switch (size) {
-+                      case 1:
-+                              err = pci_write_config_byte(dev, offset,
-+                                                          (u8) value);
-+                              break;
-+                      case 2:
-+                              err = pci_write_config_word(dev, offset,
-+                                                          (u16) value);
-+                              break;
-+                      case 4:
-+                              err = pci_write_config_dword(dev, offset,
-+                                                           (u32) value);
-+                              break;
-+                      }
-+              } else if (!dev_data->warned_on_write) {
-+                      dev_data->warned_on_write = 1;
-+                      dev_warn(&dev->dev, "Driver tried to write to a "
-+                               "read-only configuration space field at offset "
-+                               "0x%x, size %d. This may be harmless, but if "
-+                               "you have problems with your device:\n"
-+                               "1) see permissive attribute in sysfs\n"
-+                               "2) report problems to the xen-devel "
-+                               "mailing list along with details of your "
-+                               "device obtained from lspci.\n", offset, size);
-+              }
-+      }
-+
-+      return pcibios_err_to_errno(err);
-+}
-+
-+void pciback_config_free_dyn_fields(struct pci_dev *dev)
-+{
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      struct config_field_entry *cfg_entry, *t;
-+      const struct config_field *field;
-+
-+      dev_dbg(&dev->dev,
-+              "free-ing dynamically allocated virtual configuration space fields\n");
-+
-+      list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
-+              field = cfg_entry->field;
-+
-+              if (field->clean) {
-+                      field->clean((struct config_field *)field);
-+
-+                      if (cfg_entry->data)
-+                              kfree(cfg_entry->data);
-+
-+                      list_del(&cfg_entry->list);
-+                      kfree(cfg_entry);
-+              }
-+
-+      }
-+}
-+
-+void pciback_config_reset_dev(struct pci_dev *dev)
-+{
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      const struct config_field_entry *cfg_entry;
-+      const struct config_field *field;
-+
-+      dev_dbg(&dev->dev, "resetting virtual configuration space\n");
-+
-+      list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-+              field = cfg_entry->field;
-+
-+              if (field->reset)
-+                      field->reset(dev, OFFSET(cfg_entry), cfg_entry->data);
-+      }
-+}
-+
-+void pciback_config_free_dev(struct pci_dev *dev)
-+{
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      struct config_field_entry *cfg_entry, *t;
-+      const struct config_field *field;
-+
-+      dev_dbg(&dev->dev, "free-ing virtual configuration space fields\n");
-+
-+      list_for_each_entry_safe(cfg_entry, t, &dev_data->config_fields, list) {
-+              list_del(&cfg_entry->list);
-+
-+              field = cfg_entry->field;
-+
-+              if (field->release)
-+                      field->release(dev, OFFSET(cfg_entry), cfg_entry->data);
-+
-+              kfree(cfg_entry);
-+      }
-+}
-+
-+int pciback_config_add_field_offset(struct pci_dev *dev,
-+                                  const struct config_field *field,
-+                                  unsigned int base_offset)
-+{
-+      int err = 0;
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      struct config_field_entry *cfg_entry;
-+      void *tmp;
-+
-+      cfg_entry = kmalloc(sizeof(*cfg_entry), GFP_KERNEL);
-+      if (!cfg_entry) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      cfg_entry->data = NULL;
-+      cfg_entry->field = field;
-+      cfg_entry->base_offset = base_offset;
-+
-+      /* silently ignore duplicate fields */
-+      err = pciback_field_is_dup(dev,OFFSET(cfg_entry));
-+      if (err)
-+              goto out;
-+
-+      if (field->init) {
-+              tmp = field->init(dev, OFFSET(cfg_entry));
-+
-+              if (IS_ERR(tmp)) {
-+                      err = PTR_ERR(tmp);
-+                      goto out;
-+              }
-+
-+              cfg_entry->data = tmp;
-+      }
-+
-+      dev_dbg(&dev->dev, "added config field at offset 0x%02x\n",
-+              OFFSET(cfg_entry));
-+      list_add_tail(&cfg_entry->list, &dev_data->config_fields);
-+
-+      out:
-+      if (err)
-+              kfree(cfg_entry);
-+
-+      return err;
-+}
-+
-+/* This sets up the device's virtual configuration space to keep track of 
-+ * certain registers (like the base address registers (BARs) so that we can
-+ * keep the client from manipulating them directly.
-+ */
-+int pciback_config_init_dev(struct pci_dev *dev)
-+{
-+      int err = 0;
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+
-+      dev_dbg(&dev->dev, "initializing virtual configuration space\n");
-+
-+      INIT_LIST_HEAD(&dev_data->config_fields);
-+
-+      err = pciback_config_header_add_fields(dev);
-+      if (err)
-+              goto out;
-+
-+      err = pciback_config_capability_add_fields(dev);
-+      if (err)
-+              goto out;
-+
-+      err = pciback_config_quirks_init(dev);
-+
-+      out:
-+      return err;
-+}
-+
-+int pciback_config_init(void)
-+{
-+      return pciback_config_capability_init();
-+}
-Index: head-2008-11-25/drivers/xen/pciback/conf_space.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space.h   2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,126 @@
-+/*
-+ * PCI Backend - Common data structures for overriding the configuration space
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#ifndef __XEN_PCIBACK_CONF_SPACE_H__
-+#define __XEN_PCIBACK_CONF_SPACE_H__
-+
-+#include <linux/list.h>
-+#include <linux/err.h>
-+
-+/* conf_field_init can return an errno in a ptr with ERR_PTR() */
-+typedef void *(*conf_field_init) (struct pci_dev * dev, int offset);
-+typedef void (*conf_field_reset) (struct pci_dev * dev, int offset, void *data);
-+typedef void (*conf_field_free) (struct pci_dev * dev, int offset, void *data);
-+
-+typedef int (*conf_dword_write) (struct pci_dev * dev, int offset, u32 value,
-+                               void *data);
-+typedef int (*conf_word_write) (struct pci_dev * dev, int offset, u16 value,
-+                              void *data);
-+typedef int (*conf_byte_write) (struct pci_dev * dev, int offset, u8 value,
-+                              void *data);
-+typedef int (*conf_dword_read) (struct pci_dev * dev, int offset, u32 * value,
-+                              void *data);
-+typedef int (*conf_word_read) (struct pci_dev * dev, int offset, u16 * value,
-+                             void *data);
-+typedef int (*conf_byte_read) (struct pci_dev * dev, int offset, u8 * value,
-+                             void *data);
-+
-+/* These are the fields within the configuration space which we
-+ * are interested in intercepting reads/writes to and changing their
-+ * values.
-+ */
-+struct config_field {
-+      unsigned int offset;
-+      unsigned int size;
-+      unsigned int mask;
-+      conf_field_init init;
-+      conf_field_reset reset;
-+      conf_field_free release;
-+      void (*clean) (struct config_field * field);
-+      union {
-+              struct {
-+                      conf_dword_write write;
-+                      conf_dword_read read;
-+              } dw;
-+              struct {
-+                      conf_word_write write;
-+                      conf_word_read read;
-+              } w;
-+              struct {
-+                      conf_byte_write write;
-+                      conf_byte_read read;
-+              } b;
-+      } u;
-+      struct list_head list;
-+};
-+
-+struct config_field_entry {
-+      struct list_head list;
-+      const struct config_field *field;
-+      unsigned int base_offset;
-+      void *data;
-+};
-+
-+#define OFFSET(cfg_entry) ((cfg_entry)->base_offset+(cfg_entry)->field->offset)
-+
-+/* Add fields to a device - the add_fields macro expects to get a pointer to
-+ * the first entry in an array (of which the ending is marked by size==0)
-+ */
-+int pciback_config_add_field_offset(struct pci_dev *dev,
-+                                  const struct config_field *field,
-+                                  unsigned int offset);
-+
-+static inline int pciback_config_add_field(struct pci_dev *dev,
-+                                         const struct config_field *field)
-+{
-+      return pciback_config_add_field_offset(dev, field, 0);
-+}
-+
-+static inline int pciback_config_add_fields(struct pci_dev *dev,
-+                                          const struct config_field *field)
-+{
-+      int i, err = 0;
-+      for (i = 0; field[i].size != 0; i++) {
-+              err = pciback_config_add_field(dev, &field[i]);
-+              if (err)
-+                      break;
-+      }
-+      return err;
-+}
-+
-+static inline int pciback_config_add_fields_offset(struct pci_dev *dev,
-+                                                 const struct config_field *field,
-+                                                 unsigned int offset)
-+{
-+      int i, err = 0;
-+      for (i = 0; field[i].size != 0; i++) {
-+              err = pciback_config_add_field_offset(dev, &field[i], offset);
-+              if (err)
-+                      break;
-+      }
-+      return err;
-+}
-+
-+/* Read/Write the real configuration space */
-+int pciback_read_config_byte(struct pci_dev *dev, int offset, u8 * value,
-+                           void *data);
-+int pciback_read_config_word(struct pci_dev *dev, int offset, u16 * value,
-+                           void *data);
-+int pciback_read_config_dword(struct pci_dev *dev, int offset, u32 * value,
-+                            void *data);
-+int pciback_write_config_byte(struct pci_dev *dev, int offset, u8 value,
-+                            void *data);
-+int pciback_write_config_word(struct pci_dev *dev, int offset, u16 value,
-+                            void *data);
-+int pciback_write_config_dword(struct pci_dev *dev, int offset, u32 value,
-+                             void *data);
-+
-+int pciback_config_capability_init(void);
-+
-+int pciback_config_header_add_fields(struct pci_dev *dev);
-+int pciback_config_capability_add_fields(struct pci_dev *dev);
-+
-+#endif                                /* __XEN_PCIBACK_CONF_SPACE_H__ */
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_capability.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_capability.c        2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,69 @@
-+/*
-+ * PCI Backend - Handles the virtual fields found on the capability lists
-+ *               in the configuration space.
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include "pciback.h"
-+#include "conf_space.h"
-+#include "conf_space_capability.h"
-+
-+static LIST_HEAD(capabilities);
-+
-+static const struct config_field caplist_header[] = {
-+      {
-+       .offset    = PCI_CAP_LIST_ID,
-+       .size      = 2, /* encompass PCI_CAP_LIST_ID & PCI_CAP_LIST_NEXT */
-+       .u.w.read  = pciback_read_config_word,
-+       .u.w.write = NULL,
-+      },
-+      {}
-+};
-+
-+static inline void register_capability(struct pciback_config_capability *cap)
-+{
-+      list_add_tail(&cap->cap_list, &capabilities);
-+}
-+
-+int pciback_config_capability_add_fields(struct pci_dev *dev)
-+{
-+      int err = 0;
-+      struct pciback_config_capability *cap;
-+      int cap_offset;
-+
-+      list_for_each_entry(cap, &capabilities, cap_list) {
-+              cap_offset = pci_find_capability(dev, cap->capability);
-+              if (cap_offset) {
-+                      dev_dbg(&dev->dev, "Found capability 0x%x at 0x%x\n",
-+                              cap->capability, cap_offset);
-+
-+                      err = pciback_config_add_fields_offset(dev,
-+                                                             caplist_header,
-+                                                             cap_offset);
-+                      if (err)
-+                              goto out;
-+                      err = pciback_config_add_fields_offset(dev,
-+                                                             cap->fields,
-+                                                             cap_offset);
-+                      if (err)
-+                              goto out;
-+              }
-+      }
-+
-+      out:
-+      return err;
-+}
-+
-+extern struct pciback_config_capability pciback_config_capability_vpd;
-+extern struct pciback_config_capability pciback_config_capability_pm;
-+
-+int pciback_config_capability_init(void)
-+{
-+      register_capability(&pciback_config_capability_vpd);
-+      register_capability(&pciback_config_capability_pm);
-+
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_capability.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_capability.h        2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,23 @@
-+/*
-+ * PCI Backend - Data structures for special overlays for structures on
-+ *               the capability list.
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#ifndef __PCIBACK_CONFIG_CAPABILITY_H__
-+#define __PCIBACK_CONFIG_CAPABILITY_H__
-+
-+#include <linux/pci.h>
-+#include <linux/list.h>
-+
-+struct pciback_config_capability {
-+      struct list_head cap_list;
-+
-+      int capability;
-+
-+      /* If the device has the capability found above, add these fields */
-+      const struct config_field *fields;
-+};
-+
-+#endif
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_capability_msi.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_capability_msi.c    2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,79 @@
-+/*
-+ * PCI Backend -- Configuration overlay for MSI capability
-+ */
-+#include <linux/pci.h>
-+#include <linux/slab.h>
-+#include "conf_space.h"
-+#include "conf_space_capability.h"
-+#include <xen/interface/io/pciif.h>
-+#include "pciback.h"
-+
-+int pciback_enable_msi(struct pciback_device *pdev,
-+              struct pci_dev *dev, struct xen_pci_op *op)
-+{
-+      int otherend = pdev->xdev->otherend_id;
-+      int status;
-+
-+      status = pci_enable_msi(dev);
-+
-+      if (status) {
-+              printk("error enable msi for guest %x status %x\n", otherend, status);
-+              op->value = 0;
-+              return XEN_PCI_ERR_op_failed;
-+      }
-+
-+      op->value = dev->irq;
-+      return 0;
-+}
-+
-+int pciback_disable_msi(struct pciback_device *pdev,
-+              struct pci_dev *dev, struct xen_pci_op *op)
-+{
-+      pci_disable_msi(dev);
-+
-+      op->value = dev->irq;
-+      return 0;
-+}
-+
-+int pciback_enable_msix(struct pciback_device *pdev,
-+              struct pci_dev *dev, struct xen_pci_op *op)
-+{
-+      int i, result;
-+      struct msix_entry *entries;
-+
-+      if (op->value > SH_INFO_MAX_VEC)
-+              return -EINVAL;
-+
-+      entries = kmalloc(op->value * sizeof(*entries), GFP_KERNEL);
-+      if (entries == NULL)
-+              return -ENOMEM;
-+
-+      for (i = 0; i < op->value; i++) {
-+              entries[i].entry = op->msix_entries[i].entry;
-+              entries[i].vector = op->msix_entries[i].vector;
-+      }
-+
-+      result = pci_enable_msix(dev, entries, op->value);
-+
-+      for (i = 0; i < op->value; i++) {
-+              op->msix_entries[i].entry = entries[i].entry;
-+              op->msix_entries[i].vector = entries[i].vector;
-+      }
-+
-+      kfree(entries);
-+
-+      op->value = result;
-+
-+      return result;
-+}
-+
-+int pciback_disable_msix(struct pciback_device *pdev,
-+              struct pci_dev *dev, struct xen_pci_op *op)
-+{
-+
-+      pci_disable_msix(dev);
-+
-+      op->value = dev->irq;
-+      return 0;
-+}
-+
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_capability_pm.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_capability_pm.c     2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,126 @@
-+/*
-+ * PCI Backend - Configuration space overlay for power management
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/pci.h>
-+#include "conf_space.h"
-+#include "conf_space_capability.h"
-+
-+static int pm_caps_read(struct pci_dev *dev, int offset, u16 *value,
-+                      void *data)
-+{
-+      int err;
-+      u16 real_value;
-+
-+      err = pci_read_config_word(dev, offset, &real_value);
-+      if (err)
-+              goto out;
-+
-+      *value = real_value & ~PCI_PM_CAP_PME_MASK;
-+
-+      out:
-+      return err;
-+}
-+
-+/* PM_OK_BITS specifies the bits that the driver domain is allowed to change.
-+ * Can't allow driver domain to enable PMEs - they're shared */
-+#define PM_OK_BITS (PCI_PM_CTRL_PME_STATUS|PCI_PM_CTRL_DATA_SEL_MASK)
-+
-+static int pm_ctrl_write(struct pci_dev *dev, int offset, u16 new_value,
-+                       void *data)
-+{
-+      int err;
-+      u16 old_value;
-+      pci_power_t new_state, old_state;
-+
-+      err = pci_read_config_word(dev, offset, &old_value);
-+      if (err)
-+              goto out;
-+
-+      old_state = (pci_power_t)(old_value & PCI_PM_CTRL_STATE_MASK);
-+      new_state = (pci_power_t)(new_value & PCI_PM_CTRL_STATE_MASK);
-+
-+      new_value &= PM_OK_BITS;
-+      if ((old_value & PM_OK_BITS) != new_value) {
-+              new_value = (old_value & ~PM_OK_BITS) | new_value;
-+              err = pci_write_config_word(dev, offset, new_value);
-+              if (err)
-+                      goto out;
-+      }
-+
-+      /* Let pci core handle the power management change */
-+      dev_dbg(&dev->dev, "set power state to %x\n", new_state);
-+      err = pci_set_power_state(dev, new_state);
-+      if (err) {
-+              err = PCIBIOS_SET_FAILED;
-+              goto out;
-+      }
-+
-+      /*
-+       * Device may lose PCI config info on D3->D0 transition. This
-+       * is a problem for some guests which will not reset BARs. Even
-+       * those that have a go will be foiled by our BAR-write handler
-+       * which will discard the write! Since Linux won't re-init
-+       * the config space automatically in all cases, we do it here.
-+       * Future: Should we re-initialise all first 64 bytes of config space?
-+       */
-+      if (new_state == PCI_D0 &&
-+          (old_state == PCI_D3hot || old_state == PCI_D3cold) &&
-+          !(old_value & PCI_PM_CTRL_NO_SOFT_RESET))
-+              pci_restore_bars(dev);
-+
-+ out:
-+      return err;
-+}
-+
-+/* Ensure PMEs are disabled */
-+static void *pm_ctrl_init(struct pci_dev *dev, int offset)
-+{
-+      int err;
-+      u16 value;
-+
-+      err = pci_read_config_word(dev, offset, &value);
-+      if (err)
-+              goto out;
-+
-+      if (value & PCI_PM_CTRL_PME_ENABLE) {
-+              value &= ~PCI_PM_CTRL_PME_ENABLE;
-+              err = pci_write_config_word(dev, offset, value);
-+      }
-+
-+      out:
-+      return ERR_PTR(err);
-+}
-+
-+static const struct config_field caplist_pm[] = {
-+      {
-+              .offset     = PCI_PM_PMC,
-+              .size       = 2,
-+              .u.w.read   = pm_caps_read,
-+      },
-+      {
-+              .offset     = PCI_PM_CTRL,
-+              .size       = 2,
-+              .init       = pm_ctrl_init,
-+              .u.w.read   = pciback_read_config_word,
-+              .u.w.write  = pm_ctrl_write,
-+      },
-+      {
-+              .offset     = PCI_PM_PPB_EXTENSIONS,
-+              .size       = 1,
-+              .u.b.read   = pciback_read_config_byte,
-+      },
-+      {
-+              .offset     = PCI_PM_DATA_REGISTER,
-+              .size       = 1,
-+              .u.b.read   = pciback_read_config_byte,
-+      },
-+      {}
-+};
-+
-+struct pciback_config_capability pciback_config_capability_pm = {
-+      .capability = PCI_CAP_ID_PM,
-+      .fields = caplist_pm,
-+};
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_capability_vpd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_capability_vpd.c    2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,40 @@
-+/*
-+ * PCI Backend - Configuration space overlay for Vital Product Data
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/pci.h>
-+#include "conf_space.h"
-+#include "conf_space_capability.h"
-+
-+static int vpd_address_write(struct pci_dev *dev, int offset, u16 value,
-+                           void *data)
-+{
-+      /* Disallow writes to the vital product data */
-+      if (value & PCI_VPD_ADDR_F)
-+              return PCIBIOS_SET_FAILED;
-+      else
-+              return pci_write_config_word(dev, offset, value);
-+}
-+
-+static const struct config_field caplist_vpd[] = {
-+      {
-+       .offset    = PCI_VPD_ADDR,
-+       .size      = 2,
-+       .u.w.read  = pciback_read_config_word,
-+       .u.w.write = vpd_address_write,
-+       },
-+      {
-+       .offset     = PCI_VPD_DATA,
-+       .size       = 4,
-+       .u.dw.read  = pciback_read_config_dword,
-+       .u.dw.write = NULL,
-+       },
-+      {}
-+};
-+ 
-+struct pciback_config_capability pciback_config_capability_vpd = {
-+      .capability = PCI_CAP_ID_VPD,
-+      .fields = caplist_vpd,
-+};
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_header.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_header.c    2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,317 @@
-+/*
-+ * PCI Backend - Handles the virtual fields in the configuration space headers.
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include "pciback.h"
-+#include "conf_space.h"
-+
-+struct pci_bar_info {
-+      u32 val;
-+      u32 len_val;
-+      int which;
-+};
-+
-+#define is_enable_cmd(value) ((value)&(PCI_COMMAND_MEMORY|PCI_COMMAND_IO))
-+#define is_master_cmd(value) ((value)&PCI_COMMAND_MASTER)
-+
-+static int command_write(struct pci_dev *dev, int offset, u16 value, void *data)
-+{
-+      int err;
-+
-+      if (!dev->is_enabled && is_enable_cmd(value)) {
-+              if (unlikely(verbose_request))
-+                      printk(KERN_DEBUG "pciback: %s: enable\n",
-+                             pci_name(dev));
-+              err = pci_enable_device(dev);
-+              if (err)
-+                      return err;
-+      } else if (dev->is_enabled && !is_enable_cmd(value)) {
-+              if (unlikely(verbose_request))
-+                      printk(KERN_DEBUG "pciback: %s: disable\n",
-+                             pci_name(dev));
-+              pci_disable_device(dev);
-+      }
-+
-+      if (!dev->is_busmaster && is_master_cmd(value)) {
-+              if (unlikely(verbose_request))
-+                      printk(KERN_DEBUG "pciback: %s: set bus master\n",
-+                             pci_name(dev));
-+              pci_set_master(dev);
-+      }
-+
-+      if (value & PCI_COMMAND_INVALIDATE) {
-+              if (unlikely(verbose_request))
-+                      printk(KERN_DEBUG
-+                             "pciback: %s: enable memory-write-invalidate\n",
-+                             pci_name(dev));
-+              err = pci_set_mwi(dev);
-+              if (err) {
-+                      printk(KERN_WARNING
-+                             "pciback: %s: cannot enable memory-write-invalidate (%d)\n",
-+                             pci_name(dev), err);
-+                      value &= ~PCI_COMMAND_INVALIDATE;
-+              }
-+      }
-+
-+      return pci_write_config_word(dev, offset, value);
-+}
-+
-+static int rom_write(struct pci_dev *dev, int offset, u32 value, void *data)
-+{
-+      struct pci_bar_info *bar = data;
-+
-+      if (unlikely(!bar)) {
-+              printk(KERN_WARNING "pciback: driver data not found for %s\n",
-+                     pci_name(dev));
-+              return XEN_PCI_ERR_op_failed;
-+      }
-+
-+      /* A write to obtain the length must happen as a 32-bit write.
-+       * This does not (yet) support writing individual bytes
-+       */
-+      if (value == ~PCI_ROM_ADDRESS_ENABLE)
-+              bar->which = 1;
-+      else {
-+              u32 tmpval;
-+              pci_read_config_dword(dev, offset, &tmpval);
-+              if (tmpval != bar->val && value == bar->val) {
-+                      /* Allow restoration of bar value. */
-+                      pci_write_config_dword(dev, offset, bar->val);
-+              }
-+              bar->which = 0;
-+      }
-+
-+      /* Do we need to support enabling/disabling the rom address here? */
-+
-+      return 0;
-+}
-+
-+/* For the BARs, only allow writes which write ~0 or
-+ * the correct resource information
-+ * (Needed for when the driver probes the resource usage)
-+ */
-+static int bar_write(struct pci_dev *dev, int offset, u32 value, void *data)
-+{
-+      struct pci_bar_info *bar = data;
-+
-+      if (unlikely(!bar)) {
-+              printk(KERN_WARNING "pciback: driver data not found for %s\n",
-+                     pci_name(dev));
-+              return XEN_PCI_ERR_op_failed;
-+      }
-+
-+      /* A write to obtain the length must happen as a 32-bit write.
-+       * This does not (yet) support writing individual bytes
-+       */
-+      if (value == ~0)
-+              bar->which = 1;
-+      else {
-+              u32 tmpval;
-+              pci_read_config_dword(dev, offset, &tmpval);
-+              if (tmpval != bar->val && value == bar->val) {
-+                      /* Allow restoration of bar value. */
-+                      pci_write_config_dword(dev, offset, bar->val);
-+              }
-+              bar->which = 0;
-+      }
-+
-+      return 0;
-+}
-+
-+static int bar_read(struct pci_dev *dev, int offset, u32 * value, void *data)
-+{
-+      struct pci_bar_info *bar = data;
-+
-+      if (unlikely(!bar)) {
-+              printk(KERN_WARNING "pciback: driver data not found for %s\n",
-+                     pci_name(dev));
-+              return XEN_PCI_ERR_op_failed;
-+      }
-+
-+      *value = bar->which ? bar->len_val : bar->val;
-+
-+      return 0;
-+}
-+
-+static inline void read_dev_bar(struct pci_dev *dev,
-+                              struct pci_bar_info *bar_info, int offset,
-+                              u32 len_mask)
-+{
-+      pci_read_config_dword(dev, offset, &bar_info->val);
-+      pci_write_config_dword(dev, offset, len_mask);
-+      pci_read_config_dword(dev, offset, &bar_info->len_val);
-+      pci_write_config_dword(dev, offset, bar_info->val);
-+}
-+
-+static void *bar_init(struct pci_dev *dev, int offset)
-+{
-+      struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL);
-+
-+      if (!bar)
-+              return ERR_PTR(-ENOMEM);
-+
-+      read_dev_bar(dev, bar, offset, ~0);
-+      bar->which = 0;
-+
-+      return bar;
-+}
-+
-+static void *rom_init(struct pci_dev *dev, int offset)
-+{
-+      struct pci_bar_info *bar = kmalloc(sizeof(*bar), GFP_KERNEL);
-+
-+      if (!bar)
-+              return ERR_PTR(-ENOMEM);
-+
-+      read_dev_bar(dev, bar, offset, ~PCI_ROM_ADDRESS_ENABLE);
-+      bar->which = 0;
-+
-+      return bar;
-+}
-+
-+static void bar_reset(struct pci_dev *dev, int offset, void *data)
-+{
-+      struct pci_bar_info *bar = data;
-+
-+      bar->which = 0;
-+}
-+
-+static void bar_release(struct pci_dev *dev, int offset, void *data)
-+{
-+      kfree(data);
-+}
-+
-+static int interrupt_read(struct pci_dev *dev, int offset, u8 * value,
-+                        void *data)
-+{
-+      *value = (u8) dev->irq;
-+
-+      return 0;
-+}
-+
-+static int bist_write(struct pci_dev *dev, int offset, u8 value, void *data)
-+{
-+      u8 cur_value;
-+      int err;
-+
-+      err = pci_read_config_byte(dev, offset, &cur_value);
-+      if (err)
-+              goto out;
-+
-+      if ((cur_value & ~PCI_BIST_START) == (value & ~PCI_BIST_START)
-+          || value == PCI_BIST_START)
-+              err = pci_write_config_byte(dev, offset, value);
-+
-+      out:
-+      return err;
-+}
-+
-+static const struct config_field header_common[] = {
-+      {
-+       .offset    = PCI_COMMAND,
-+       .size      = 2,
-+       .u.w.read  = pciback_read_config_word,
-+       .u.w.write = command_write,
-+      },
-+      {
-+       .offset    = PCI_INTERRUPT_LINE,
-+       .size      = 1,
-+       .u.b.read  = interrupt_read,
-+      },
-+      {
-+       .offset    = PCI_INTERRUPT_PIN,
-+       .size      = 1,
-+       .u.b.read  = pciback_read_config_byte,
-+      },
-+      {
-+       /* Any side effects of letting driver domain control cache line? */
-+       .offset    = PCI_CACHE_LINE_SIZE,
-+       .size      = 1,
-+       .u.b.read  = pciback_read_config_byte,
-+       .u.b.write = pciback_write_config_byte,
-+      },
-+      {
-+       .offset    = PCI_LATENCY_TIMER,
-+       .size      = 1,
-+       .u.b.read  = pciback_read_config_byte,
-+      },
-+      {
-+       .offset    = PCI_BIST,
-+       .size      = 1,
-+       .u.b.read  = pciback_read_config_byte,
-+       .u.b.write = bist_write,
-+      },
-+      {}
-+};
-+
-+#define CFG_FIELD_BAR(reg_offset)                     \
-+      {                                               \
-+       .offset     = reg_offset,                      \
-+       .size       = 4,                               \
-+       .init       = bar_init,                        \
-+       .reset      = bar_reset,                       \
-+       .release    = bar_release,                     \
-+       .u.dw.read  = bar_read,                        \
-+       .u.dw.write = bar_write,                       \
-+       }
-+
-+#define CFG_FIELD_ROM(reg_offset)                     \
-+      {                                               \
-+       .offset     = reg_offset,                      \
-+       .size       = 4,                               \
-+       .init       = rom_init,                        \
-+       .reset      = bar_reset,                       \
-+       .release    = bar_release,                     \
-+       .u.dw.read  = bar_read,                        \
-+       .u.dw.write = rom_write,                       \
-+       }
-+
-+static const struct config_field header_0[] = {
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_2),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_3),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_4),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_5),
-+      CFG_FIELD_ROM(PCI_ROM_ADDRESS),
-+      {}
-+};
-+
-+static const struct config_field header_1[] = {
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_0),
-+      CFG_FIELD_BAR(PCI_BASE_ADDRESS_1),
-+      CFG_FIELD_ROM(PCI_ROM_ADDRESS1),
-+      {}
-+};
-+
-+int pciback_config_header_add_fields(struct pci_dev *dev)
-+{
-+      int err;
-+
-+      err = pciback_config_add_fields(dev, header_common);
-+      if (err)
-+              goto out;
-+
-+      switch (dev->hdr_type) {
-+      case PCI_HEADER_TYPE_NORMAL:
-+              err = pciback_config_add_fields(dev, header_0);
-+              break;
-+
-+      case PCI_HEADER_TYPE_BRIDGE:
-+              err = pciback_config_add_fields(dev, header_1);
-+              break;
-+
-+      default:
-+              err = -EINVAL;
-+              printk(KERN_ERR "pciback: %s: Unsupported header type %d!\n",
-+                     pci_name(dev), dev->hdr_type);
-+              break;
-+      }
-+
-+      out:
-+      return err;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_quirks.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_quirks.c    2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,126 @@
-+/*
-+ * PCI Backend - Handle special overlays for broken devices.
-+ *
-+ * Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ * Author: Chris Bookholt <hap10@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/pci.h>
-+#include "pciback.h"
-+#include "conf_space.h"
-+#include "conf_space_quirks.h"
-+
-+LIST_HEAD(pciback_quirks);
-+
-+struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev)
-+{
-+      struct pciback_config_quirk *tmp_quirk;
-+
-+      list_for_each_entry(tmp_quirk, &pciback_quirks, quirks_list)
-+          if (pci_match_id(&tmp_quirk->devid, dev))
-+              goto out;
-+      tmp_quirk = NULL;
-+      printk(KERN_DEBUG
-+             "quirk didn't match any device pciback knows about\n");
-+      out:
-+      return tmp_quirk;
-+}
-+
-+static inline void register_quirk(struct pciback_config_quirk *quirk)
-+{
-+      list_add_tail(&quirk->quirks_list, &pciback_quirks);
-+}
-+
-+int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg)
-+{
-+      int ret = 0;
-+      struct pciback_dev_data *dev_data = pci_get_drvdata(dev);
-+      struct config_field_entry *cfg_entry;
-+
-+      list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-+              if ( OFFSET(cfg_entry) == reg) {
-+                      ret = 1;
-+                      break;
-+              }
-+      }
-+      return ret;
-+}
-+
-+int pciback_config_quirks_add_field(struct pci_dev *dev, struct config_field
-+                                  *field)
-+{
-+      int err = 0;
-+
-+      switch (field->size) {
-+      case 1:
-+              field->u.b.read = pciback_read_config_byte;
-+              field->u.b.write = pciback_write_config_byte;
-+              break;
-+      case 2:
-+              field->u.w.read = pciback_read_config_word;
-+              field->u.w.write = pciback_write_config_word;
-+              break;
-+      case 4:
-+              field->u.dw.read = pciback_read_config_dword;
-+              field->u.dw.write = pciback_write_config_dword;
-+              break;
-+      default:
-+              err = -EINVAL;
-+              goto out;
-+      }
-+
-+      pciback_config_add_field(dev, field);
-+
-+      out:
-+      return err;
-+}
-+
-+int pciback_config_quirks_init(struct pci_dev *dev)
-+{
-+      struct pciback_config_quirk *quirk;
-+      int ret = 0;
-+
-+      quirk = kzalloc(sizeof(*quirk), GFP_ATOMIC);
-+      if (!quirk) {
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      quirk->devid.vendor = dev->vendor;
-+      quirk->devid.device = dev->device;
-+      quirk->devid.subvendor = dev->subsystem_vendor;
-+      quirk->devid.subdevice = dev->subsystem_device;
-+      quirk->devid.class = 0;
-+      quirk->devid.class_mask = 0;
-+      quirk->devid.driver_data = 0UL;
-+
-+      quirk->pdev = dev;
-+
-+      register_quirk(quirk);
-+      out:
-+      return ret;
-+}
-+
-+void pciback_config_field_free(struct config_field *field)
-+{
-+      kfree(field);
-+}
-+
-+int pciback_config_quirk_release(struct pci_dev *dev)
-+{
-+      struct pciback_config_quirk *quirk;
-+      int ret = 0;
-+
-+      quirk = pciback_find_quirk(dev);
-+      if (!quirk) {
-+              ret = -ENXIO;
-+              goto out;
-+      }
-+
-+      list_del(&quirk->quirks_list);
-+      kfree(quirk);
-+
-+      out:
-+      return ret;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/conf_space_quirks.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/conf_space_quirks.h    2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,35 @@
-+/*
-+ * PCI Backend - Data structures for special overlays for broken devices.
-+ *
-+ * Ryan Wilson <hap9@epoch.ncsc.mil>
-+ * Chris Bookholt <hap10@epoch.ncsc.mil>
-+ */
-+
-+#ifndef __XEN_PCIBACK_CONF_SPACE_QUIRKS_H__
-+#define __XEN_PCIBACK_CONF_SPACE_QUIRKS_H__
-+
-+#include <linux/pci.h>
-+#include <linux/list.h>
-+
-+struct pciback_config_quirk {
-+      struct list_head quirks_list;
-+      struct pci_device_id devid;
-+      struct pci_dev *pdev;
-+};
-+
-+struct pciback_config_quirk *pciback_find_quirk(struct pci_dev *dev);
-+
-+int pciback_config_quirks_add_field(struct pci_dev *dev, struct config_field
-+                                  *field);
-+
-+int pciback_config_quirks_remove_field(struct pci_dev *dev, int reg);
-+
-+int pciback_config_quirks_init(struct pci_dev *dev);
-+
-+void pciback_config_field_free(struct config_field *field);
-+
-+int pciback_config_quirk_release(struct pci_dev *dev);
-+
-+int pciback_field_is_dup(struct pci_dev *dev, unsigned int reg);
-+
-+#endif
-Index: head-2008-11-25/drivers/xen/pciback/controller.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/controller.c   2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,408 @@
-+/*
-+ * Copyright (C) 2007 Hewlett-Packard Development Company, L.P.
-+ *      Alex Williamson <alex.williamson@hp.com>
-+ *
-+ * PCI "Controller" Backend - virtualize PCI bus topology based on PCI
-+ * controllers.  Devices under the same PCI controller are exposed on the
-+ * same virtual domain:bus.  Within a bus, device slots are virtualized
-+ * to compact the bus.
-+ *
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-+ * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-+ */
-+
-+#include <linux/acpi.h>
-+#include <linux/list.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include "pciback.h"
-+
-+#define PCI_MAX_BUSSES        255
-+#define PCI_MAX_SLOTS 32
-+
-+struct controller_dev_entry {
-+      struct list_head list;
-+      struct pci_dev *dev;
-+      unsigned int devfn;
-+};
-+
-+struct controller_list_entry {
-+      struct list_head list;
-+      struct pci_controller *controller;
-+      unsigned int domain;
-+      unsigned int bus;
-+      unsigned int next_devfn;
-+      struct list_head dev_list;
-+};
-+
-+struct controller_dev_data {
-+      struct list_head list;
-+      unsigned int next_domain;
-+      unsigned int next_bus;
-+      spinlock_t lock;
-+};
-+
-+struct walk_info {
-+      struct pciback_device *pdev;
-+      int resource_count;
-+      int root_num;
-+};
-+
-+struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus,
-+                                  unsigned int devfn)
-+{
-+      struct controller_dev_data *dev_data = pdev->pci_dev_data;
-+      struct controller_dev_entry *dev_entry;
-+      struct controller_list_entry *cntrl_entry;
-+      struct pci_dev *dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+
-+      list_for_each_entry(cntrl_entry, &dev_data->list, list) {
-+              if (cntrl_entry->domain != domain ||
-+                  cntrl_entry->bus != bus)
-+                      continue;
-+
-+              list_for_each_entry(dev_entry, &cntrl_entry->dev_list, list) {
-+                      if (devfn == dev_entry->devfn) {
-+                              dev = dev_entry->dev;
-+                              goto found;
-+                      }
-+              }
-+      }
-+found:
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+
-+      return dev;
-+}
-+
-+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
-+                      int devid, publish_pci_dev_cb publish_cb)
-+{
-+      struct controller_dev_data *dev_data = pdev->pci_dev_data;
-+      struct controller_dev_entry *dev_entry;
-+      struct controller_list_entry *cntrl_entry;
-+      struct pci_controller *dev_controller = PCI_CONTROLLER(dev);
-+      unsigned long flags;
-+      int ret = 0, found = 0;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+
-+      /* Look to see if we already have a domain:bus for this controller */
-+      list_for_each_entry(cntrl_entry, &dev_data->list, list) {
-+              if (cntrl_entry->controller == dev_controller) {
-+                      found = 1;
-+                      break;
-+              }
-+      }
-+
-+      if (!found) {
-+              cntrl_entry = kmalloc(sizeof(*cntrl_entry), GFP_ATOMIC);
-+              if (!cntrl_entry) {
-+                      ret =  -ENOMEM;
-+                      goto out;
-+              }
-+
-+              cntrl_entry->controller = dev_controller;
-+              cntrl_entry->next_devfn = PCI_DEVFN(0, 0);
-+
-+              cntrl_entry->domain = dev_data->next_domain;
-+              cntrl_entry->bus = dev_data->next_bus++;
-+              if (dev_data->next_bus > PCI_MAX_BUSSES) {
-+                      dev_data->next_domain++;
-+                      dev_data->next_bus = 0;
-+              }
-+
-+              INIT_LIST_HEAD(&cntrl_entry->dev_list);
-+
-+              list_add_tail(&cntrl_entry->list, &dev_data->list);
-+      }
-+
-+      if (PCI_SLOT(cntrl_entry->next_devfn) > PCI_MAX_SLOTS) {
-+              /*
-+               * While it seems unlikely, this can actually happen if
-+               * a controller has P2P bridges under it.
-+               */
-+              xenbus_dev_fatal(pdev->xdev, -ENOSPC, "Virtual bus %04x:%02x "
-+                               "is full, no room to export %04x:%02x:%02x.%x",
-+                               cntrl_entry->domain, cntrl_entry->bus,
-+                               pci_domain_nr(dev->bus), dev->bus->number,
-+                               PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-+              ret = -ENOSPC;
-+              goto out;
-+      }
-+
-+      dev_entry = kmalloc(sizeof(*dev_entry), GFP_ATOMIC);
-+      if (!dev_entry) {
-+              if (list_empty(&cntrl_entry->dev_list)) {
-+                      list_del(&cntrl_entry->list);
-+                      kfree(cntrl_entry);
-+              }
-+              ret = -ENOMEM;
-+              goto out;
-+      }
-+
-+      dev_entry->dev = dev;
-+      dev_entry->devfn = cntrl_entry->next_devfn;
-+
-+      list_add_tail(&dev_entry->list, &cntrl_entry->dev_list);
-+
-+      cntrl_entry->next_devfn += PCI_DEVFN(1, 0);
-+
-+out:
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+
-+      /* TODO: Publish virtual domain:bus:slot.func here. */
-+
-+      return ret;
-+}
-+
-+void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-+{
-+      struct controller_dev_data *dev_data = pdev->pci_dev_data;
-+      struct controller_list_entry *cntrl_entry;
-+      struct controller_dev_entry *dev_entry = NULL;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+
-+      list_for_each_entry(cntrl_entry, &dev_data->list, list) {
-+              if (cntrl_entry->controller != PCI_CONTROLLER(dev))
-+                      continue;
-+
-+              list_for_each_entry(dev_entry, &cntrl_entry->dev_list, list) {
-+                      if (dev_entry->dev == dev) {
-+                              found_dev = dev_entry->dev;
-+                              break;
-+                      }
-+              }
-+      }
-+
-+      if (!found_dev) {
-+              spin_unlock_irqrestore(&dev_data->lock, flags);
-+              return;
-+      }
-+
-+      list_del(&dev_entry->list);
-+      kfree(dev_entry);
-+
-+      if (list_empty(&cntrl_entry->dev_list)) {
-+              list_del(&cntrl_entry->list);
-+              kfree(cntrl_entry);
-+      }
-+
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+      pcistub_put_pci_dev(found_dev);
-+}
-+
-+int pciback_init_devices(struct pciback_device *pdev)
-+{
-+      struct controller_dev_data *dev_data;
-+
-+      dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL);
-+      if (!dev_data)
-+              return -ENOMEM;
-+
-+      spin_lock_init(&dev_data->lock);
-+
-+      INIT_LIST_HEAD(&dev_data->list);
-+
-+      /* Starting domain:bus numbers */
-+      dev_data->next_domain = 0;
-+      dev_data->next_bus = 0;
-+
-+      pdev->pci_dev_data = dev_data;
-+
-+      return 0;
-+}
-+
-+static acpi_status write_xenbus_resource(struct acpi_resource *res, void *data)
-+{
-+      struct walk_info *info = data;
-+      struct acpi_resource_address64 addr;
-+      acpi_status status;
-+      int i, len, err;
-+      char str[32], tmp[3];
-+      unsigned char *ptr, *buf;
-+
-+      status = acpi_resource_to_address64(res, &addr);
-+
-+      /* Do we care about this range?  Let's check. */
-+      if (!ACPI_SUCCESS(status) ||
-+          !(addr.resource_type == ACPI_MEMORY_RANGE ||
-+            addr.resource_type == ACPI_IO_RANGE) ||
-+          !addr.address_length || addr.producer_consumer != ACPI_PRODUCER)
-+              return AE_OK;
-+
-+      /*
-+       * Furthermore, we really only care to tell the guest about
-+       * address ranges that require address translation of some sort.
-+       */
-+      if (!(addr.resource_type == ACPI_MEMORY_RANGE &&
-+            addr.info.mem.translation) &&
-+          !(addr.resource_type == ACPI_IO_RANGE &&
-+            addr.info.io.translation))
-+              return AE_OK;
-+         
-+      /* Store the resource in xenbus for the guest */
-+      len = snprintf(str, sizeof(str), "root-%d-resource-%d",
-+                     info->root_num, info->resource_count);
-+      if (unlikely(len >= (sizeof(str) - 1)))
-+              return AE_OK;
-+
-+      buf = kzalloc((sizeof(*res) * 2) + 1, GFP_KERNEL);
-+      if (!buf)
-+              return AE_OK;
-+
-+      /* Clean out resource_source */
-+      res->data.address64.resource_source.index = 0xFF;
-+      res->data.address64.resource_source.string_length = 0;
-+      res->data.address64.resource_source.string_ptr = NULL;
-+
-+      ptr = (unsigned char *)res;
-+
-+      /* Turn the acpi_resource into an ASCII byte stream */
-+      for (i = 0; i < sizeof(*res); i++) {
-+              snprintf(tmp, sizeof(tmp), "%02x", ptr[i]);
-+              strncat(buf, tmp, 2);
-+      }
-+
-+      err = xenbus_printf(XBT_NIL, info->pdev->xdev->nodename,
-+                          str, "%s", buf);
-+
-+      if (!err)
-+              info->resource_count++;
-+
-+      kfree(buf);
-+
-+      return AE_OK;
-+}
-+
-+int pciback_publish_pci_roots(struct pciback_device *pdev,
-+                            publish_pci_root_cb publish_root_cb)
-+{
-+      struct controller_dev_data *dev_data = pdev->pci_dev_data;
-+      struct controller_list_entry *cntrl_entry;
-+      int i, root_num, len, err = 0;
-+      unsigned int domain, bus;
-+      char str[64];
-+      struct walk_info info;
-+
-+      spin_lock(&dev_data->lock);
-+
-+      list_for_each_entry(cntrl_entry, &dev_data->list, list) {
-+              /* First publish all the domain:bus info */
-+              err = publish_root_cb(pdev, cntrl_entry->domain,
-+                                    cntrl_entry->bus);
-+              if (err)
-+                      goto out;
-+
-+              /*
-+               * Now figure out which root-%d this belongs to
-+               * so we can associate resources with it.
-+               */
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                                 "root_num", "%d", &root_num);
-+
-+              if (err != 1)
-+                      goto out;
-+
-+              for (i = 0; i < root_num; i++) {
-+                      len = snprintf(str, sizeof(str), "root-%d", i);
-+                      if (unlikely(len >= (sizeof(str) - 1))) {
-+                              err = -ENOMEM;
-+                              goto out;
-+                      }
-+
-+                      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                                         str, "%x:%x", &domain, &bus);
-+                      if (err != 2)
-+                              goto out;
-+
-+                      /* Is this the one we just published? */
-+                      if (domain == cntrl_entry->domain &&
-+                          bus == cntrl_entry->bus)
-+                              break;
-+              }
-+
-+              if (i == root_num)
-+                      goto out;
-+
-+              info.pdev = pdev;
-+              info.resource_count = 0;
-+              info.root_num = i;
-+
-+              /* Let ACPI do the heavy lifting on decoding resources */
-+              acpi_walk_resources(cntrl_entry->controller->acpi_handle,
-+                                  METHOD_NAME__CRS, write_xenbus_resource,
-+                                  &info);
-+
-+              /* No resouces.  OK.  On to the next one */
-+              if (!info.resource_count)
-+                      continue;
-+
-+              /* Store the number of resources we wrote for this root-%d */
-+              len = snprintf(str, sizeof(str), "root-%d-resources", i);
-+              if (unlikely(len >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
-+                                  "%d", info.resource_count);
-+              if (err)
-+                      goto out;
-+      }
-+
-+      /* Finally, write some magic to synchronize with the guest. */
-+      len = snprintf(str, sizeof(str), "root-resource-magic");
-+      if (unlikely(len >= (sizeof(str) - 1))) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
-+                          "%lx", (sizeof(struct acpi_resource) * 2) + 1);
-+
-+out:
-+      spin_unlock(&dev_data->lock);
-+
-+      return err;
-+}
-+
-+void pciback_release_devices(struct pciback_device *pdev)
-+{
-+      struct controller_dev_data *dev_data = pdev->pci_dev_data;
-+      struct controller_list_entry *cntrl_entry, *c;
-+      struct controller_dev_entry *dev_entry, *d;
-+
-+      list_for_each_entry_safe(cntrl_entry, c, &dev_data->list, list) {
-+              list_for_each_entry_safe(dev_entry, d,
-+                                       &cntrl_entry->dev_list, list) {
-+                      list_del(&dev_entry->list);
-+                      pcistub_put_pci_dev(dev_entry->dev);
-+                      kfree(dev_entry);
-+              }
-+              list_del(&cntrl_entry->list);
-+              kfree(cntrl_entry);
-+      }
-+
-+      kfree(dev_data);
-+      pdev->pci_dev_data = NULL;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/passthrough.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/passthrough.c  2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,166 @@
-+/*
-+ * PCI Backend - Provides restricted access to the real PCI bus topology
-+ *               to the frontend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/list.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include "pciback.h"
-+
-+struct passthrough_dev_data {
-+      /* Access to dev_list must be protected by lock */
-+      struct list_head dev_list;
-+      spinlock_t lock;
-+};
-+
-+struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus,
-+                                  unsigned int devfn)
-+{
-+      struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-+      struct pci_dev_entry *dev_entry;
-+      struct pci_dev *dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+
-+      list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
-+              if (domain == (unsigned int)pci_domain_nr(dev_entry->dev->bus)
-+                  && bus == (unsigned int)dev_entry->dev->bus->number
-+                  && devfn == dev_entry->dev->devfn) {
-+                      dev = dev_entry->dev;
-+                      break;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+
-+      return dev;
-+}
-+
-+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
-+                      int devid, publish_pci_dev_cb publish_cb)
-+{
-+      struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-+      struct pci_dev_entry *dev_entry;
-+      unsigned long flags;
-+      unsigned int domain, bus, devfn;
-+      int err;
-+
-+      dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL);
-+      if (!dev_entry)
-+              return -ENOMEM;
-+      dev_entry->dev = dev;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+      list_add_tail(&dev_entry->list, &dev_data->dev_list);
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+
-+      /* Publish this device. */
-+      domain = (unsigned int)pci_domain_nr(dev->bus);
-+      bus = (unsigned int)dev->bus->number;
-+      devfn = dev->devfn;
-+      err = publish_cb(pdev, domain, bus, devfn, devid);
-+
-+      return err;
-+}
-+
-+void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-+{
-+      struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-+      struct pci_dev_entry *dev_entry, *t;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&dev_data->lock, flags);
-+
-+      list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
-+              if (dev_entry->dev == dev) {
-+                      list_del(&dev_entry->list);
-+                      found_dev = dev_entry->dev;
-+                      kfree(dev_entry);
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&dev_data->lock, flags);
-+
-+      if (found_dev)
-+              pcistub_put_pci_dev(found_dev);
-+}
-+
-+int pciback_init_devices(struct pciback_device *pdev)
-+{
-+      struct passthrough_dev_data *dev_data;
-+
-+      dev_data = kmalloc(sizeof(*dev_data), GFP_KERNEL);
-+      if (!dev_data)
-+              return -ENOMEM;
-+
-+      spin_lock_init(&dev_data->lock);
-+
-+      INIT_LIST_HEAD(&dev_data->dev_list);
-+
-+      pdev->pci_dev_data = dev_data;
-+
-+      return 0;
-+}
-+
-+int pciback_publish_pci_roots(struct pciback_device *pdev,
-+                            publish_pci_root_cb publish_root_cb)
-+{
-+      int err = 0;
-+      struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-+      struct pci_dev_entry *dev_entry, *e;
-+      struct pci_dev *dev;
-+      int found;
-+      unsigned int domain, bus;
-+
-+      spin_lock(&dev_data->lock);
-+
-+      list_for_each_entry(dev_entry, &dev_data->dev_list, list) {
-+              /* Only publish this device as a root if none of its
-+               * parent bridges are exported
-+               */
-+              found = 0;
-+              dev = dev_entry->dev->bus->self;
-+              for (; !found && dev != NULL; dev = dev->bus->self) {
-+                      list_for_each_entry(e, &dev_data->dev_list, list) {
-+                              if (dev == e->dev) {
-+                                      found = 1;
-+                                      break;
-+                              }
-+                      }
-+              }
-+
-+              domain = (unsigned int)pci_domain_nr(dev_entry->dev->bus);
-+              bus = (unsigned int)dev_entry->dev->bus->number;
-+
-+              if (!found) {
-+                      err = publish_root_cb(pdev, domain, bus);
-+                      if (err)
-+                              break;
-+              }
-+      }
-+
-+      spin_unlock(&dev_data->lock);
-+
-+      return err;
-+}
-+
-+void pciback_release_devices(struct pciback_device *pdev)
-+{
-+      struct passthrough_dev_data *dev_data = pdev->pci_dev_data;
-+      struct pci_dev_entry *dev_entry, *t;
-+
-+      list_for_each_entry_safe(dev_entry, t, &dev_data->dev_list, list) {
-+              list_del(&dev_entry->list);
-+              pcistub_put_pci_dev(dev_entry->dev);
-+              kfree(dev_entry);
-+      }
-+
-+      kfree(dev_data);
-+      pdev->pci_dev_data = NULL;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/pci_stub.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/pci_stub.c     2008-10-29 09:55:56.000000000 +0100
-@@ -0,0 +1,948 @@
-+/*
-+ * PCI Stub Driver - Grabs devices in backend to be exported later
-+ *
-+ * Ryan Wilson <hap9@epoch.ncsc.mil>
-+ * Chris Bookholt <hap10@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/list.h>
-+#include <linux/spinlock.h>
-+#include <linux/kref.h>
-+#include <asm/atomic.h>
-+#include "pciback.h"
-+#include "conf_space.h"
-+#include "conf_space_quirks.h"
-+
-+static char *pci_devs_to_hide = NULL;
-+module_param_named(hide, pci_devs_to_hide, charp, 0444);
-+
-+struct pcistub_device_id {
-+      struct list_head slot_list;
-+      int domain;
-+      unsigned char bus;
-+      unsigned int devfn;
-+};
-+static LIST_HEAD(pcistub_device_ids);
-+static DEFINE_SPINLOCK(device_ids_lock);
-+
-+struct pcistub_device {
-+      struct kref kref;
-+      struct list_head dev_list;
-+      spinlock_t lock;
-+
-+      struct pci_dev *dev;
-+      struct pciback_device *pdev;    /* non-NULL if struct pci_dev is in use */
-+};
-+
-+/* Access to pcistub_devices & seized_devices lists and the initialize_devices
-+ * flag must be locked with pcistub_devices_lock
-+ */
-+static DEFINE_SPINLOCK(pcistub_devices_lock);
-+static LIST_HEAD(pcistub_devices);
-+
-+/* wait for device_initcall before initializing our devices
-+ * (see pcistub_init_devices_late)
-+ */
-+static int initialize_devices = 0;
-+static LIST_HEAD(seized_devices);
-+
-+static struct pcistub_device *pcistub_device_alloc(struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev;
-+
-+      dev_dbg(&dev->dev, "pcistub_device_alloc\n");
-+
-+      psdev = kzalloc(sizeof(*psdev), GFP_ATOMIC);
-+      if (!psdev)
-+              return NULL;
-+
-+      psdev->dev = pci_dev_get(dev);
-+      if (!psdev->dev) {
-+              kfree(psdev);
-+              return NULL;
-+      }
-+
-+      kref_init(&psdev->kref);
-+      spin_lock_init(&psdev->lock);
-+
-+      return psdev;
-+}
-+
-+/* Don't call this directly as it's called by pcistub_device_put */
-+static void pcistub_device_release(struct kref *kref)
-+{
-+      struct pcistub_device *psdev;
-+
-+      psdev = container_of(kref, struct pcistub_device, kref);
-+
-+      dev_dbg(&psdev->dev->dev, "pcistub_device_release\n");
-+
-+      /* Clean-up the device */
-+      pciback_reset_device(psdev->dev);
-+      pciback_config_free_dyn_fields(psdev->dev);
-+      pciback_config_free_dev(psdev->dev);
-+      kfree(pci_get_drvdata(psdev->dev));
-+      pci_set_drvdata(psdev->dev, NULL);
-+
-+      pci_dev_put(psdev->dev);
-+
-+      kfree(psdev);
-+}
-+
-+static inline void pcistub_device_get(struct pcistub_device *psdev)
-+{
-+      kref_get(&psdev->kref);
-+}
-+
-+static inline void pcistub_device_put(struct pcistub_device *psdev)
-+{
-+      kref_put(&psdev->kref, pcistub_device_release);
-+}
-+
-+static struct pcistub_device *pcistub_device_find(int domain, int bus,
-+                                                int slot, int func)
-+{
-+      struct pcistub_device *psdev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (psdev->dev != NULL
-+                  && domain == pci_domain_nr(psdev->dev->bus)
-+                  && bus == psdev->dev->bus->number
-+                  && PCI_DEVFN(slot, func) == psdev->dev->devfn) {
-+                      pcistub_device_get(psdev);
-+                      goto out;
-+              }
-+      }
-+
-+      /* didn't find it */
-+      psdev = NULL;
-+
-+      out:
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+      return psdev;
-+}
-+
-+static struct pci_dev *pcistub_device_get_pci_dev(struct pciback_device *pdev,
-+                                                struct pcistub_device *psdev)
-+{
-+      struct pci_dev *pci_dev = NULL;
-+      unsigned long flags;
-+
-+      pcistub_device_get(psdev);
-+
-+      spin_lock_irqsave(&psdev->lock, flags);
-+      if (!psdev->pdev) {
-+              psdev->pdev = pdev;
-+              pci_dev = psdev->dev;
-+      }
-+      spin_unlock_irqrestore(&psdev->lock, flags);
-+
-+      if (!pci_dev)
-+              pcistub_device_put(psdev);
-+
-+      return pci_dev;
-+}
-+
-+struct pci_dev *pcistub_get_pci_dev_by_slot(struct pciback_device *pdev,
-+                                          int domain, int bus,
-+                                          int slot, int func)
-+{
-+      struct pcistub_device *psdev;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (psdev->dev != NULL
-+                  && domain == pci_domain_nr(psdev->dev->bus)
-+                  && bus == psdev->dev->bus->number
-+                  && PCI_DEVFN(slot, func) == psdev->dev->devfn) {
-+                      found_dev = pcistub_device_get_pci_dev(pdev, psdev);
-+                      break;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+      return found_dev;
-+}
-+
-+struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev,
-+                                  struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (psdev->dev == dev) {
-+                      found_dev = pcistub_device_get_pci_dev(pdev, psdev);
-+                      break;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+      return found_dev;
-+}
-+
-+void pcistub_put_pci_dev(struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev, *found_psdev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (psdev->dev == dev) {
-+                      found_psdev = psdev;
-+                      break;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+      /* Cleanup our device
-+       * (so it's ready for the next domain)
-+       */
-+      pciback_reset_device(found_psdev->dev);
-+      pciback_config_free_dyn_fields(found_psdev->dev);
-+      pciback_config_reset_dev(found_psdev->dev);
-+
-+      spin_lock_irqsave(&found_psdev->lock, flags);
-+      found_psdev->pdev = NULL;
-+      spin_unlock_irqrestore(&found_psdev->lock, flags);
-+
-+      pcistub_device_put(found_psdev);
-+}
-+
-+static int __devinit pcistub_match_one(struct pci_dev *dev,
-+                                     struct pcistub_device_id *pdev_id)
-+{
-+      /* Match the specified device by domain, bus, slot, func and also if
-+       * any of the device's parent bridges match.
-+       */
-+      for (; dev != NULL; dev = dev->bus->self) {
-+              if (pci_domain_nr(dev->bus) == pdev_id->domain
-+                  && dev->bus->number == pdev_id->bus
-+                  && dev->devfn == pdev_id->devfn)
-+                      return 1;
-+
-+              /* Sometimes topmost bridge links to itself. */
-+              if (dev == dev->bus->self)
-+                      break;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __devinit pcistub_match(struct pci_dev *dev)
-+{
-+      struct pcistub_device_id *pdev_id;
-+      unsigned long flags;
-+      int found = 0;
-+
-+      spin_lock_irqsave(&device_ids_lock, flags);
-+      list_for_each_entry(pdev_id, &pcistub_device_ids, slot_list) {
-+              if (pcistub_match_one(dev, pdev_id)) {
-+                      found = 1;
-+                      break;
-+              }
-+      }
-+      spin_unlock_irqrestore(&device_ids_lock, flags);
-+
-+      return found;
-+}
-+
-+static int __devinit pcistub_init_device(struct pci_dev *dev)
-+{
-+      struct pciback_dev_data *dev_data;
-+      int err = 0;
-+
-+      dev_dbg(&dev->dev, "initializing...\n");
-+
-+      /* The PCI backend is not intended to be a module (or to work with
-+       * removable PCI devices (yet). If it were, pciback_config_free()
-+       * would need to be called somewhere to free the memory allocated
-+       * here and then to call kfree(pci_get_drvdata(psdev->dev)).
-+       */
-+      dev_data = kzalloc(sizeof(*dev_data), GFP_ATOMIC);
-+      if (!dev_data) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+      pci_set_drvdata(dev, dev_data);
-+
-+      dev_dbg(&dev->dev, "initializing config\n");
-+      err = pciback_config_init_dev(dev);
-+      if (err)
-+              goto out;
-+
-+      /* HACK: Force device (& ACPI) to determine what IRQ it's on - we
-+       * must do this here because pcibios_enable_device may specify
-+       * the pci device's true irq (and possibly its other resources)
-+       * if they differ from what's in the configuration space.
-+       * This makes the assumption that the device's resources won't
-+       * change after this point (otherwise this code may break!)
-+       */
-+      dev_dbg(&dev->dev, "enabling device\n");
-+      err = pci_enable_device(dev);
-+      if (err)
-+              goto config_release;
-+
-+      /* Now disable the device (this also ensures some private device
-+       * data is setup before we export)
-+       */
-+      dev_dbg(&dev->dev, "reset device\n");
-+      pciback_reset_device(dev);
-+
-+      return 0;
-+
-+      config_release:
-+      pciback_config_free_dev(dev);
-+
-+      out:
-+      pci_set_drvdata(dev, NULL);
-+      kfree(dev_data);
-+      return err;
-+}
-+
-+/*
-+ * Because some initialization still happens on
-+ * devices during fs_initcall, we need to defer
-+ * full initialization of our devices until
-+ * device_initcall.
-+ */
-+static int __init pcistub_init_devices_late(void)
-+{
-+      struct pcistub_device *psdev;
-+      unsigned long flags;
-+      int err = 0;
-+
-+      pr_debug("pciback: pcistub_init_devices_late\n");
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      while (!list_empty(&seized_devices)) {
-+              psdev = container_of(seized_devices.next,
-+                                   struct pcistub_device, dev_list);
-+              list_del(&psdev->dev_list);
-+
-+              spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+              err = pcistub_init_device(psdev->dev);
-+              if (err) {
-+                      dev_err(&psdev->dev->dev,
-+                              "error %d initializing device\n", err);
-+                      kfree(psdev);
-+                      psdev = NULL;
-+              }
-+
-+              spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+              if (psdev)
-+                      list_add_tail(&psdev->dev_list, &pcistub_devices);
-+      }
-+
-+      initialize_devices = 1;
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+      return 0;
-+}
-+
-+static int __devinit pcistub_seize(struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev;
-+      unsigned long flags;
-+      int err = 0;
-+
-+      psdev = pcistub_device_alloc(dev);
-+      if (!psdev)
-+              return -ENOMEM;
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      if (initialize_devices) {
-+              spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+              /* don't want irqs disabled when calling pcistub_init_device */
-+              err = pcistub_init_device(psdev->dev);
-+
-+              spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+              if (!err)
-+                      list_add(&psdev->dev_list, &pcistub_devices);
-+      } else {
-+              dev_dbg(&dev->dev, "deferring initialization\n");
-+              list_add(&psdev->dev_list, &seized_devices);
-+      }
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+      if (err)
-+              pcistub_device_put(psdev);
-+
-+      return err;
-+}
-+
-+static int __devinit pcistub_probe(struct pci_dev *dev,
-+                                 const struct pci_device_id *id)
-+{
-+      int err = 0;
-+
-+      dev_dbg(&dev->dev, "probing...\n");
-+
-+      if (pcistub_match(dev)) {
-+
-+              if (dev->hdr_type != PCI_HEADER_TYPE_NORMAL
-+                  && dev->hdr_type != PCI_HEADER_TYPE_BRIDGE) {
-+                      dev_err(&dev->dev, "can't export pci devices that "
-+                              "don't have a normal (0) or bridge (1) "
-+                              "header type!\n");
-+                      err = -ENODEV;
-+                      goto out;
-+              }
-+
-+              dev_info(&dev->dev, "seizing device\n");
-+              err = pcistub_seize(dev);
-+      } else
-+              /* Didn't find the device */
-+              err = -ENODEV;
-+
-+      out:
-+      return err;
-+}
-+
-+static void pcistub_remove(struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev, *found_psdev = NULL;
-+      unsigned long flags;
-+
-+      dev_dbg(&dev->dev, "removing\n");
-+
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+
-+      pciback_config_quirk_release(dev);
-+
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (psdev->dev == dev) {
-+                      found_psdev = psdev;
-+                      break;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+      if (found_psdev) {
-+              dev_dbg(&dev->dev, "found device to remove - in use? %p\n",
-+                      found_psdev->pdev);
-+
-+              if (found_psdev->pdev) {
-+                      printk(KERN_WARNING "pciback: ****** removing device "
-+                             "%s while still in-use! ******\n",
-+                             pci_name(found_psdev->dev));
-+                      printk(KERN_WARNING "pciback: ****** driver domain may "
-+                             "still access this device's i/o resources!\n");
-+                      printk(KERN_WARNING "pciback: ****** shutdown driver "
-+                             "domain before binding device\n");
-+                      printk(KERN_WARNING "pciback: ****** to other drivers "
-+                             "or domains\n");
-+
-+                      pciback_release_pci_dev(found_psdev->pdev,
-+                                              found_psdev->dev);
-+              }
-+
-+              spin_lock_irqsave(&pcistub_devices_lock, flags);
-+              list_del(&found_psdev->dev_list);
-+              spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+
-+              /* the final put for releasing from the list */
-+              pcistub_device_put(found_psdev);
-+      }
-+}
-+
-+static const struct pci_device_id pcistub_ids[] = {
-+      {
-+       .vendor = PCI_ANY_ID,
-+       .device = PCI_ANY_ID,
-+       .subvendor = PCI_ANY_ID,
-+       .subdevice = PCI_ANY_ID,
-+       },
-+      {0,},
-+};
-+
-+/*
-+ * Note: There is no MODULE_DEVICE_TABLE entry here because this isn't
-+ * for a normal device. I don't want it to be loaded automatically.
-+ */
-+
-+static struct pci_driver pciback_pci_driver = {
-+      .name = "pciback",
-+      .id_table = pcistub_ids,
-+      .probe = pcistub_probe,
-+      .remove = pcistub_remove,
-+};
-+
-+static inline int str_to_slot(const char *buf, int *domain, int *bus,
-+                            int *slot, int *func)
-+{
-+      int err;
-+
-+      err = sscanf(buf, " %x:%x:%x.%x", domain, bus, slot, func);
-+      if (err == 4)
-+              return 0;
-+      else if (err < 0)
-+              return -EINVAL;
-+
-+      /* try again without domain */
-+      *domain = 0;
-+      err = sscanf(buf, " %x:%x.%x", bus, slot, func);
-+      if (err == 3)
-+              return 0;
-+
-+      return -EINVAL;
-+}
-+
-+static inline int str_to_quirk(const char *buf, int *domain, int *bus, int
-+                             *slot, int *func, int *reg, int *size, int *mask)
-+{
-+      int err;
-+
-+      err =
-+          sscanf(buf, " %04x:%02x:%02x.%1x-%08x:%1x:%08x", domain, bus, slot,
-+                 func, reg, size, mask);
-+      if (err == 7)
-+              return 0;
-+      return -EINVAL;
-+}
-+
-+static int pcistub_device_id_add(int domain, int bus, int slot, int func)
-+{
-+      struct pcistub_device_id *pci_dev_id;
-+      unsigned long flags;
-+
-+      pci_dev_id = kmalloc(sizeof(*pci_dev_id), GFP_KERNEL);
-+      if (!pci_dev_id)
-+              return -ENOMEM;
-+
-+      pci_dev_id->domain = domain;
-+      pci_dev_id->bus = bus;
-+      pci_dev_id->devfn = PCI_DEVFN(slot, func);
-+
-+      pr_debug("pciback: wants to seize %04x:%02x:%02x.%01x\n",
-+               domain, bus, slot, func);
-+
-+      spin_lock_irqsave(&device_ids_lock, flags);
-+      list_add_tail(&pci_dev_id->slot_list, &pcistub_device_ids);
-+      spin_unlock_irqrestore(&device_ids_lock, flags);
-+
-+      return 0;
-+}
-+
-+static int pcistub_device_id_remove(int domain, int bus, int slot, int func)
-+{
-+      struct pcistub_device_id *pci_dev_id, *t;
-+      int devfn = PCI_DEVFN(slot, func);
-+      int err = -ENOENT;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&device_ids_lock, flags);
-+      list_for_each_entry_safe(pci_dev_id, t, &pcistub_device_ids, slot_list) {
-+
-+              if (pci_dev_id->domain == domain
-+                  && pci_dev_id->bus == bus && pci_dev_id->devfn == devfn) {
-+                      /* Don't break; here because it's possible the same
-+                       * slot could be in the list more than once
-+                       */
-+                      list_del(&pci_dev_id->slot_list);
-+                      kfree(pci_dev_id);
-+
-+                      err = 0;
-+
-+                      pr_debug("pciback: removed %04x:%02x:%02x.%01x from "
-+                               "seize list\n", domain, bus, slot, func);
-+              }
-+      }
-+      spin_unlock_irqrestore(&device_ids_lock, flags);
-+
-+      return err;
-+}
-+
-+static int pcistub_reg_add(int domain, int bus, int slot, int func, int reg,
-+                         int size, int mask)
-+{
-+      int err = 0;
-+      struct pcistub_device *psdev;
-+      struct pci_dev *dev;
-+      struct config_field *field;
-+
-+      psdev = pcistub_device_find(domain, bus, slot, func);
-+      if (!psdev || !psdev->dev) {
-+              err = -ENODEV;
-+              goto out;
-+      }
-+      dev = psdev->dev;
-+
-+      field = kzalloc(sizeof(*field), GFP_ATOMIC);
-+      if (!field) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      field->offset = reg;
-+      field->size = size;
-+      field->mask = mask;
-+      field->init = NULL;
-+      field->reset = NULL;
-+      field->release = NULL;
-+      field->clean = pciback_config_field_free;
-+
-+      err = pciback_config_quirks_add_field(dev, field);
-+      if (err)
-+              kfree(field);
-+      out:
-+      return err;
-+}
-+
-+static ssize_t pcistub_slot_add(struct device_driver *drv, const char *buf,
-+                              size_t count)
-+{
-+      int domain, bus, slot, func;
-+      int err;
-+
-+      err = str_to_slot(buf, &domain, &bus, &slot, &func);
-+      if (err)
-+              goto out;
-+
-+      err = pcistub_device_id_add(domain, bus, slot, func);
-+
-+      out:
-+      if (!err)
-+              err = count;
-+      return err;
-+}
-+
-+DRIVER_ATTR(new_slot, S_IWUSR, NULL, pcistub_slot_add);
-+
-+static ssize_t pcistub_slot_remove(struct device_driver *drv, const char *buf,
-+                                 size_t count)
-+{
-+      int domain, bus, slot, func;
-+      int err;
-+
-+      err = str_to_slot(buf, &domain, &bus, &slot, &func);
-+      if (err)
-+              goto out;
-+
-+      err = pcistub_device_id_remove(domain, bus, slot, func);
-+
-+      out:
-+      if (!err)
-+              err = count;
-+      return err;
-+}
-+
-+DRIVER_ATTR(remove_slot, S_IWUSR, NULL, pcistub_slot_remove);
-+
-+static ssize_t pcistub_slot_show(struct device_driver *drv, char *buf)
-+{
-+      struct pcistub_device_id *pci_dev_id;
-+      size_t count = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&device_ids_lock, flags);
-+      list_for_each_entry(pci_dev_id, &pcistub_device_ids, slot_list) {
-+              if (count >= PAGE_SIZE)
-+                      break;
-+
-+              count += scnprintf(buf + count, PAGE_SIZE - count,
-+                                 "%04x:%02x:%02x.%01x\n",
-+                                 pci_dev_id->domain, pci_dev_id->bus,
-+                                 PCI_SLOT(pci_dev_id->devfn),
-+                                 PCI_FUNC(pci_dev_id->devfn));
-+      }
-+      spin_unlock_irqrestore(&device_ids_lock, flags);
-+
-+      return count;
-+}
-+
-+DRIVER_ATTR(slots, S_IRUSR, pcistub_slot_show, NULL);
-+
-+static ssize_t pcistub_quirk_add(struct device_driver *drv, const char *buf,
-+                               size_t count)
-+{
-+      int domain, bus, slot, func, reg, size, mask;
-+      int err;
-+
-+      err = str_to_quirk(buf, &domain, &bus, &slot, &func, &reg, &size,
-+                         &mask);
-+      if (err)
-+              goto out;
-+
-+      err = pcistub_reg_add(domain, bus, slot, func, reg, size, mask);
-+
-+      out:
-+      if (!err)
-+              err = count;
-+      return err;
-+}
-+
-+static ssize_t pcistub_quirk_show(struct device_driver *drv, char *buf)
-+{
-+      int count = 0;
-+      unsigned long flags;
-+      extern struct list_head pciback_quirks;
-+      struct pciback_config_quirk *quirk;
-+      struct pciback_dev_data *dev_data;
-+      const struct config_field *field;
-+      const struct config_field_entry *cfg_entry;
-+
-+      spin_lock_irqsave(&device_ids_lock, flags);
-+      list_for_each_entry(quirk, &pciback_quirks, quirks_list) {
-+              if (count >= PAGE_SIZE)
-+                      goto out;
-+
-+              count += scnprintf(buf + count, PAGE_SIZE - count,
-+                                 "%02x:%02x.%01x\n\t%04x:%04x:%04x:%04x\n",
-+                                 quirk->pdev->bus->number,
-+                                 PCI_SLOT(quirk->pdev->devfn),
-+                                 PCI_FUNC(quirk->pdev->devfn),
-+                                 quirk->devid.vendor, quirk->devid.device,
-+                                 quirk->devid.subvendor,
-+                                 quirk->devid.subdevice);
-+
-+              dev_data = pci_get_drvdata(quirk->pdev);
-+
-+              list_for_each_entry(cfg_entry, &dev_data->config_fields, list) {
-+                      field = cfg_entry->field;
-+                      if (count >= PAGE_SIZE)
-+                              goto out;
-+
-+                      count += scnprintf(buf + count, PAGE_SIZE - count,
-+                                         "\t\t%08x:%01x:%08x\n",
-+                                         cfg_entry->base_offset + field->offset, 
-+                                         field->size, field->mask);
-+              }
-+      }
-+
-+      out:
-+      spin_unlock_irqrestore(&device_ids_lock, flags);
-+
-+      return count;
-+}
-+
-+DRIVER_ATTR(quirks, S_IRUSR | S_IWUSR, pcistub_quirk_show, pcistub_quirk_add);
-+
-+static ssize_t permissive_add(struct device_driver *drv, const char *buf,
-+                            size_t count)
-+{
-+      int domain, bus, slot, func;
-+      int err;
-+      struct pcistub_device *psdev;
-+      struct pciback_dev_data *dev_data;
-+      err = str_to_slot(buf, &domain, &bus, &slot, &func);
-+      if (err)
-+              goto out;
-+      psdev = pcistub_device_find(domain, bus, slot, func);
-+      if (!psdev) {
-+              err = -ENODEV;
-+              goto out;
-+      }
-+      if (!psdev->dev) {
-+              err = -ENODEV;
-+              goto release;
-+      }
-+      dev_data = pci_get_drvdata(psdev->dev);
-+      /* the driver data for a device should never be null at this point */
-+      if (!dev_data) {
-+              err = -ENXIO;
-+              goto release;
-+      }
-+      if (!dev_data->permissive) {
-+              dev_data->permissive = 1;
-+              /* Let user know that what they're doing could be unsafe */
-+              dev_warn(&psdev->dev->dev,
-+                       "enabling permissive mode configuration space accesses!\n");
-+              dev_warn(&psdev->dev->dev,
-+                       "permissive mode is potentially unsafe!\n");
-+      }
-+      release:
-+      pcistub_device_put(psdev);
-+      out:
-+      if (!err)
-+              err = count;
-+      return err;
-+}
-+
-+static ssize_t permissive_show(struct device_driver *drv, char *buf)
-+{
-+      struct pcistub_device *psdev;
-+      struct pciback_dev_data *dev_data;
-+      size_t count = 0;
-+      unsigned long flags;
-+      spin_lock_irqsave(&pcistub_devices_lock, flags);
-+      list_for_each_entry(psdev, &pcistub_devices, dev_list) {
-+              if (count >= PAGE_SIZE)
-+                      break;
-+              if (!psdev->dev)
-+                      continue;
-+              dev_data = pci_get_drvdata(psdev->dev);
-+              if (!dev_data || !dev_data->permissive)
-+                      continue;
-+              count +=
-+                  scnprintf(buf + count, PAGE_SIZE - count, "%s\n",
-+                            pci_name(psdev->dev));
-+      }
-+      spin_unlock_irqrestore(&pcistub_devices_lock, flags);
-+      return count;
-+}
-+
-+DRIVER_ATTR(permissive, S_IRUSR | S_IWUSR, permissive_show, permissive_add);
-+
-+#ifdef CONFIG_PCI_MSI
-+
-+int pciback_get_owner(struct pci_dev *dev)
-+{
-+      struct pcistub_device *psdev;
-+
-+      psdev = pcistub_device_find(pci_domain_nr(dev->bus), dev->bus->number,
-+                      PCI_SLOT(dev->devfn), PCI_FUNC(dev->devfn));
-+
-+      if (!psdev || !psdev->pdev)
-+              return -1;
-+
-+      return psdev->pdev->xdev->otherend_id;
-+}
-+#endif
-+
-+static void pcistub_exit(void)
-+{
-+      driver_remove_file(&pciback_pci_driver.driver, &driver_attr_new_slot);
-+      driver_remove_file(&pciback_pci_driver.driver,
-+                         &driver_attr_remove_slot);
-+      driver_remove_file(&pciback_pci_driver.driver, &driver_attr_slots);
-+      driver_remove_file(&pciback_pci_driver.driver, &driver_attr_quirks);
-+      driver_remove_file(&pciback_pci_driver.driver, &driver_attr_permissive);
-+
-+      pci_unregister_driver(&pciback_pci_driver);
-+      WARN_ON(unregister_msi_get_owner(pciback_get_owner));
-+}
-+
-+static int __init pcistub_init(void)
-+{
-+      int pos = 0;
-+      int err = 0;
-+      int domain, bus, slot, func;
-+      int parsed;
-+
-+      if (pci_devs_to_hide && *pci_devs_to_hide) {
-+              do {
-+                      parsed = 0;
-+
-+                      err = sscanf(pci_devs_to_hide + pos,
-+                                   " (%x:%x:%x.%x) %n",
-+                                   &domain, &bus, &slot, &func, &parsed);
-+                      if (err != 4) {
-+                              domain = 0;
-+                              err = sscanf(pci_devs_to_hide + pos,
-+                                           " (%x:%x.%x) %n",
-+                                           &bus, &slot, &func, &parsed);
-+                              if (err != 3)
-+                                      goto parse_error;
-+                      }
-+
-+                      err = pcistub_device_id_add(domain, bus, slot, func);
-+                      if (err)
-+                              goto out;
-+
-+                      /* if parsed<=0, we've reached the end of the string */
-+                      pos += parsed;
-+              } while (parsed > 0 && pci_devs_to_hide[pos]);
-+      }
-+
-+      /* If we're the first PCI Device Driver to register, we're the
-+       * first one to get offered PCI devices as they become
-+       * available (and thus we can be the first to grab them)
-+       */
-+      err = pci_register_driver(&pciback_pci_driver);
-+      if (err < 0)
-+              goto out;
-+
-+      err = driver_create_file(&pciback_pci_driver.driver,
-+                               &driver_attr_new_slot);
-+      if (!err)
-+              err = driver_create_file(&pciback_pci_driver.driver,
-+                                       &driver_attr_remove_slot);
-+      if (!err)
-+              err = driver_create_file(&pciback_pci_driver.driver,
-+                                       &driver_attr_slots);
-+      if (!err)
-+              err = driver_create_file(&pciback_pci_driver.driver,
-+                                       &driver_attr_quirks);
-+      if (!err)
-+              err = driver_create_file(&pciback_pci_driver.driver,
-+                                       &driver_attr_permissive);
-+
-+      if (!err)
-+              err = register_msi_get_owner(pciback_get_owner);
-+      if (err)
-+              pcistub_exit();
-+
-+      out:
-+      return err;
-+
-+      parse_error:
-+      printk(KERN_ERR "pciback: Error parsing pci_devs_to_hide at \"%s\"\n",
-+             pci_devs_to_hide + pos);
-+      return -EINVAL;
-+}
-+
-+#ifndef MODULE
-+/*
-+ * fs_initcall happens before device_initcall
-+ * so pciback *should* get called first (b/c we 
-+ * want to suck up any device before other drivers
-+ * get a chance by being the first pci device
-+ * driver to register)
-+ */
-+fs_initcall(pcistub_init);
-+#endif
-+
-+static int __init pciback_init(void)
-+{
-+      int err;
-+
-+      err = pciback_config_init();
-+      if (err)
-+              return err;
-+
-+#ifdef MODULE
-+      err = pcistub_init();
-+      if (err < 0)
-+              return err;
-+#endif
-+
-+      pcistub_init_devices_late();
-+      err = pciback_xenbus_register();
-+      if (err)
-+              pcistub_exit();
-+
-+      return err;
-+}
-+
-+static void __exit pciback_cleanup(void)
-+{
-+      pciback_xenbus_unregister();
-+      pcistub_exit();
-+}
-+
-+module_init(pciback_init);
-+module_exit(pciback_cleanup);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/pciback/pciback.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/pciback.h      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,111 @@
-+/*
-+ * PCI Backend Common Data Structures & Function Declarations
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#ifndef __XEN_PCIBACK_H__
-+#define __XEN_PCIBACK_H__
-+
-+#include <linux/pci.h>
-+#include <linux/interrupt.h>
-+#include <xen/xenbus.h>
-+#include <linux/list.h>
-+#include <linux/spinlock.h>
-+#include <linux/workqueue.h>
-+#include <asm/atomic.h>
-+#include <xen/interface/io/pciif.h>
-+
-+struct pci_dev_entry {
-+      struct list_head list;
-+      struct pci_dev *dev;
-+};
-+
-+#define _PDEVF_op_active      (0)
-+#define PDEVF_op_active       (1<<(_PDEVF_op_active))
-+
-+struct pciback_device {
-+      void *pci_dev_data;
-+      spinlock_t dev_lock;
-+
-+      struct xenbus_device *xdev;
-+
-+      struct xenbus_watch be_watch;
-+      u8 be_watching;
-+
-+      int evtchn_irq;
-+
-+      struct vm_struct *sh_area;
-+      struct xen_pci_sharedinfo *sh_info;
-+
-+      unsigned long flags;
-+
-+      struct work_struct op_work;
-+};
-+
-+struct pciback_dev_data {
-+      struct list_head config_fields;
-+      int permissive;
-+      int warned_on_write;
-+};
-+
-+/* Get/Put PCI Devices that are hidden from the PCI Backend Domain */
-+struct pci_dev *pcistub_get_pci_dev_by_slot(struct pciback_device *pdev,
-+                                          int domain, int bus,
-+                                          int slot, int func);
-+struct pci_dev *pcistub_get_pci_dev(struct pciback_device *pdev,
-+                                  struct pci_dev *dev);
-+void pcistub_put_pci_dev(struct pci_dev *dev);
-+
-+/* Ensure a device is turned off or reset */
-+void pciback_reset_device(struct pci_dev *pdev);
-+
-+/* Access a virtual configuration space for a PCI device */
-+int pciback_config_init(void);
-+int pciback_config_init_dev(struct pci_dev *dev);
-+void pciback_config_free_dyn_fields(struct pci_dev *dev);
-+void pciback_config_reset_dev(struct pci_dev *dev);
-+void pciback_config_free_dev(struct pci_dev *dev);
-+int pciback_config_read(struct pci_dev *dev, int offset, int size,
-+                      u32 * ret_val);
-+int pciback_config_write(struct pci_dev *dev, int offset, int size, u32 value);
-+
-+/* Handle requests for specific devices from the frontend */
-+typedef int (*publish_pci_dev_cb) (struct pciback_device *pdev,
-+                                 unsigned int domain, unsigned int bus,
-+                                 unsigned int devfn, unsigned int devid);
-+typedef int (*publish_pci_root_cb) (struct pciback_device * pdev,
-+                                  unsigned int domain, unsigned int bus);
-+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
-+                      int devid, publish_pci_dev_cb publish_cb);
-+void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev);
-+struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus,
-+                                  unsigned int devfn);
-+int pciback_init_devices(struct pciback_device *pdev);
-+int pciback_publish_pci_roots(struct pciback_device *pdev,
-+                            publish_pci_root_cb cb);
-+void pciback_release_devices(struct pciback_device *pdev);
-+
-+/* Handles events from front-end */
-+irqreturn_t pciback_handle_event(int irq, void *dev_id, struct pt_regs *regs);
-+void pciback_do_op(void *data);
-+
-+int pciback_xenbus_register(void);
-+void pciback_xenbus_unregister(void);
-+
-+#ifdef CONFIG_PCI_MSI
-+int pciback_enable_msi(struct pciback_device *pdev,
-+                       struct pci_dev *dev, struct xen_pci_op *op);
-+
-+int pciback_disable_msi(struct pciback_device *pdev,
-+                         struct pci_dev *dev, struct xen_pci_op *op);
-+
-+
-+int pciback_enable_msix(struct pciback_device *pdev,
-+                        struct pci_dev *dev, struct xen_pci_op *op);
-+
-+int pciback_disable_msix(struct pciback_device *pdev,
-+                        struct pci_dev *dev, struct xen_pci_op *op);
-+#endif
-+extern int verbose_request;
-+#endif
-Index: head-2008-11-25/drivers/xen/pciback/pciback_ops.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/pciback_ops.c  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,117 @@
-+/*
-+ * PCI Backend Operations - respond to PCI requests from Frontend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <asm/bitops.h>
-+#include <xen/evtchn.h>
-+#include "pciback.h"
-+
-+int verbose_request = 0;
-+module_param(verbose_request, int, 0644);
-+
-+/* Ensure a device is "turned off" and ready to be exported.
-+ * (Also see pciback_config_reset to ensure virtual configuration space is
-+ * ready to be re-exported)
-+ */
-+void pciback_reset_device(struct pci_dev *dev)
-+{
-+      u16 cmd;
-+
-+      /* Disable devices (but not bridges) */
-+      if (dev->hdr_type == PCI_HEADER_TYPE_NORMAL) {
-+              pci_disable_device(dev);
-+
-+              pci_write_config_word(dev, PCI_COMMAND, 0);
-+
-+              dev->is_enabled = 0;
-+              dev->is_busmaster = 0;
-+      } else {
-+              pci_read_config_word(dev, PCI_COMMAND, &cmd);
-+              if (cmd & (PCI_COMMAND_INVALIDATE)) {
-+                      cmd &= ~(PCI_COMMAND_INVALIDATE);
-+                      pci_write_config_word(dev, PCI_COMMAND, cmd);
-+
-+                      dev->is_busmaster = 0;
-+              }
-+      }
-+}
-+
-+static inline void test_and_schedule_op(struct pciback_device *pdev)
-+{
-+      /* Check that frontend is requesting an operation and that we are not
-+       * already processing a request */
-+      if (test_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags)
-+          && !test_and_set_bit(_PDEVF_op_active, &pdev->flags))
-+              schedule_work(&pdev->op_work);
-+}
-+
-+/* Performing the configuration space reads/writes must not be done in atomic
-+ * context because some of the pci_* functions can sleep (mostly due to ACPI
-+ * use of semaphores). This function is intended to be called from a work
-+ * queue in process context taking a struct pciback_device as a parameter */
-+void pciback_do_op(void *data)
-+{
-+      struct pciback_device *pdev = data;
-+      struct pci_dev *dev;
-+      struct xen_pci_op *op = &pdev->sh_info->op;
-+
-+      dev = pciback_get_pci_dev(pdev, op->domain, op->bus, op->devfn);
-+
-+      if (dev == NULL)
-+              op->err = XEN_PCI_ERR_dev_not_found;
-+      else
-+      {
-+              switch (op->cmd)
-+              {
-+                      case XEN_PCI_OP_conf_read:
-+                              op->err = pciback_config_read(dev,
-+                                        op->offset, op->size, &op->value);
-+                              break;
-+                      case XEN_PCI_OP_conf_write:
-+                              op->err = pciback_config_write(dev,
-+                                        op->offset, op->size, op->value);
-+                              break;
-+#ifdef CONFIG_PCI_MSI
-+                      case XEN_PCI_OP_enable_msi:
-+                              op->err = pciback_enable_msi(pdev, dev, op);
-+                              break;
-+                      case XEN_PCI_OP_disable_msi:
-+                              op->err = pciback_disable_msi(pdev, dev, op);
-+                              break;
-+                      case XEN_PCI_OP_enable_msix:
-+                              op->err = pciback_enable_msix(pdev, dev, op);
-+                              break;
-+                      case XEN_PCI_OP_disable_msix:
-+                              op->err = pciback_disable_msix(pdev, dev, op);
-+                              break;
-+#endif
-+                      default:
-+                              op->err = XEN_PCI_ERR_not_implemented;
-+                              break;
-+              }
-+      }
-+      /* Tell the driver domain that we're done. */ 
-+      wmb();
-+      clear_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
-+      notify_remote_via_irq(pdev->evtchn_irq);
-+
-+      /* Mark that we're done. */
-+      smp_mb__before_clear_bit(); /* /after/ clearing PCIF_active */
-+      clear_bit(_PDEVF_op_active, &pdev->flags);
-+      smp_mb__after_clear_bit(); /* /before/ final check for work */
-+
-+      /* Check to see if the driver domain tried to start another request in
-+       * between clearing _XEN_PCIF_active and clearing _PDEVF_op_active. */
-+      test_and_schedule_op(pdev);
-+}
-+
-+irqreturn_t pciback_handle_event(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      struct pciback_device *pdev = dev_id;
-+
-+      test_and_schedule_op(pdev);
-+
-+      return IRQ_HANDLED;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/slot.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/slot.c 2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,157 @@
-+/*
-+ * PCI Backend - Provides a Virtual PCI bus (with real devices)
-+ *               to the frontend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil> (vpci.c)
-+ *   Author: Tristan Gingold <tristan.gingold@bull.net>, from vpci.c
-+ */
-+
-+#include <linux/list.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include "pciback.h"
-+
-+/* There are at most 32 slots in a pci bus.  */
-+#define PCI_SLOT_MAX 32
-+
-+#define PCI_BUS_NBR 2
-+
-+struct slot_dev_data {
-+      /* Access to dev_list must be protected by lock */
-+      struct pci_dev *slots[PCI_BUS_NBR][PCI_SLOT_MAX];
-+      spinlock_t lock;
-+};
-+
-+struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus,
-+                                  unsigned int devfn)
-+{
-+      struct pci_dev *dev = NULL;
-+      struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-+      unsigned long flags;
-+
-+      if (domain != 0 || PCI_FUNC(devfn) != 0)
-+              return NULL;
-+
-+      if (PCI_SLOT(devfn) >= PCI_SLOT_MAX || bus >= PCI_BUS_NBR)
-+              return NULL;
-+
-+      spin_lock_irqsave(&slot_dev->lock, flags);
-+      dev = slot_dev->slots[bus][PCI_SLOT(devfn)];
-+      spin_unlock_irqrestore(&slot_dev->lock, flags);
-+
-+      return dev;
-+}
-+
-+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
-+                      int devid, publish_pci_dev_cb publish_cb)
-+{
-+      int err = 0, slot, bus;
-+      struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-+      unsigned long flags;
-+
-+      if ((dev->class >> 24) == PCI_BASE_CLASS_BRIDGE) {
-+              err = -EFAULT;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Can't export bridges on the virtual PCI bus");
-+              goto out;
-+      }
-+
-+      spin_lock_irqsave(&slot_dev->lock, flags);
-+
-+      /* Assign to a new slot on the virtual PCI bus */
-+      for (bus = 0; bus < PCI_BUS_NBR; bus++)
-+              for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+                      if (slot_dev->slots[bus][slot] == NULL) {
-+                              printk(KERN_INFO
-+                                     "pciback: slot: %s: assign to virtual slot %d, bus %d\n",
-+                                     pci_name(dev), slot, bus);
-+                              slot_dev->slots[bus][slot] = dev;
-+                              goto unlock;
-+                      }
-+              }
-+
-+      err = -ENOMEM;
-+      xenbus_dev_fatal(pdev->xdev, err,
-+                       "No more space on root virtual PCI bus");
-+
-+      unlock:
-+      spin_unlock_irqrestore(&slot_dev->lock, flags);
-+
-+      /* Publish this device. */
-+      if(!err)
-+              err = publish_cb(pdev, 0, 0, PCI_DEVFN(slot, 0), devid);
-+
-+      out:
-+      return err;
-+}
-+
-+void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-+{
-+      int slot, bus;
-+      struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&slot_dev->lock, flags);
-+
-+      for (bus = 0; bus < PCI_BUS_NBR; bus++)
-+              for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+                      if (slot_dev->slots[bus][slot] == dev) {
-+                              slot_dev->slots[bus][slot] = NULL;
-+                              found_dev = dev;
-+                              goto out;
-+                      }
-+              }
-+
-+      out:
-+      spin_unlock_irqrestore(&slot_dev->lock, flags);
-+
-+      if (found_dev)
-+              pcistub_put_pci_dev(found_dev);
-+}
-+
-+int pciback_init_devices(struct pciback_device *pdev)
-+{
-+      int slot, bus;
-+      struct slot_dev_data *slot_dev;
-+
-+      slot_dev = kmalloc(sizeof(*slot_dev), GFP_KERNEL);
-+      if (!slot_dev)
-+              return -ENOMEM;
-+
-+      spin_lock_init(&slot_dev->lock);
-+
-+      for (bus = 0; bus < PCI_BUS_NBR; bus++)
-+              for (slot = 0; slot < PCI_SLOT_MAX; slot++)
-+                      slot_dev->slots[bus][slot] = NULL;
-+
-+      pdev->pci_dev_data = slot_dev;
-+
-+      return 0;
-+}
-+
-+int pciback_publish_pci_roots(struct pciback_device *pdev,
-+                            publish_pci_root_cb publish_cb)
-+{
-+      /* The Virtual PCI bus has only one root */
-+      return publish_cb(pdev, 0, 0);
-+}
-+
-+void pciback_release_devices(struct pciback_device *pdev)
-+{
-+      int slot, bus;
-+      struct slot_dev_data *slot_dev = pdev->pci_dev_data;
-+      struct pci_dev *dev;
-+
-+      for (bus = 0; bus < PCI_BUS_NBR; bus++)
-+              for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+                      dev = slot_dev->slots[bus][slot];
-+                      if (dev != NULL)
-+                              pcistub_put_pci_dev(dev);
-+              }
-+
-+      kfree(slot_dev);
-+      pdev->pci_dev_data = NULL;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/vpci.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/vpci.c 2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,212 @@
-+/*
-+ * PCI Backend - Provides a Virtual PCI bus (with real devices)
-+ *               to the frontend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+
-+#include <linux/list.h>
-+#include <linux/slab.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include "pciback.h"
-+
-+#define PCI_SLOT_MAX 32
-+
-+struct vpci_dev_data {
-+      /* Access to dev_list must be protected by lock */
-+      struct list_head dev_list[PCI_SLOT_MAX];
-+      spinlock_t lock;
-+};
-+
-+static inline struct list_head *list_first(struct list_head *head)
-+{
-+      return head->next;
-+}
-+
-+struct pci_dev *pciback_get_pci_dev(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus,
-+                                  unsigned int devfn)
-+{
-+      struct pci_dev_entry *entry;
-+      struct pci_dev *dev = NULL;
-+      struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-+      unsigned long flags;
-+
-+      if (domain != 0 || bus != 0)
-+              return NULL;
-+
-+      if (PCI_SLOT(devfn) < PCI_SLOT_MAX) {
-+              spin_lock_irqsave(&vpci_dev->lock, flags);
-+
-+              list_for_each_entry(entry,
-+                                  &vpci_dev->dev_list[PCI_SLOT(devfn)],
-+                                  list) {
-+                      if (PCI_FUNC(entry->dev->devfn) == PCI_FUNC(devfn)) {
-+                              dev = entry->dev;
-+                              break;
-+                      }
-+              }
-+
-+              spin_unlock_irqrestore(&vpci_dev->lock, flags);
-+      }
-+      return dev;
-+}
-+
-+static inline int match_slot(struct pci_dev *l, struct pci_dev *r)
-+{
-+      if (pci_domain_nr(l->bus) == pci_domain_nr(r->bus)
-+          && l->bus == r->bus && PCI_SLOT(l->devfn) == PCI_SLOT(r->devfn))
-+              return 1;
-+
-+      return 0;
-+}
-+
-+int pciback_add_pci_dev(struct pciback_device *pdev, struct pci_dev *dev,
-+                      int devid, publish_pci_dev_cb publish_cb)
-+{
-+      int err = 0, slot, func;
-+      struct pci_dev_entry *t, *dev_entry;
-+      struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-+      unsigned long flags;
-+
-+      if ((dev->class >> 24) == PCI_BASE_CLASS_BRIDGE) {
-+              err = -EFAULT;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Can't export bridges on the virtual PCI bus");
-+              goto out;
-+      }
-+
-+      dev_entry = kmalloc(sizeof(*dev_entry), GFP_KERNEL);
-+      if (!dev_entry) {
-+              err = -ENOMEM;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error adding entry to virtual PCI bus");
-+              goto out;
-+      }
-+
-+      dev_entry->dev = dev;
-+
-+      spin_lock_irqsave(&vpci_dev->lock, flags);
-+
-+      /* Keep multi-function devices together on the virtual PCI bus */
-+      for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+              if (!list_empty(&vpci_dev->dev_list[slot])) {
-+                      t = list_entry(list_first(&vpci_dev->dev_list[slot]),
-+                                     struct pci_dev_entry, list);
-+
-+                      if (match_slot(dev, t->dev)) {
-+                              pr_info("pciback: vpci: %s: "
-+                                      "assign to virtual slot %d func %d\n",
-+                                      pci_name(dev), slot,
-+                                      PCI_FUNC(dev->devfn));
-+                              list_add_tail(&dev_entry->list,
-+                                            &vpci_dev->dev_list[slot]);
-+                              func = PCI_FUNC(dev->devfn);
-+                              goto unlock;
-+                      }
-+              }
-+      }
-+
-+      /* Assign to a new slot on the virtual PCI bus */
-+      for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+              if (list_empty(&vpci_dev->dev_list[slot])) {
-+                      printk(KERN_INFO
-+                             "pciback: vpci: %s: assign to virtual slot %d\n",
-+                             pci_name(dev), slot);
-+                      list_add_tail(&dev_entry->list,
-+                                    &vpci_dev->dev_list[slot]);
-+                      func = PCI_FUNC(dev->devfn);
-+                      goto unlock;
-+              }
-+      }
-+
-+      err = -ENOMEM;
-+      xenbus_dev_fatal(pdev->xdev, err,
-+                       "No more space on root virtual PCI bus");
-+
-+      unlock:
-+      spin_unlock_irqrestore(&vpci_dev->lock, flags);
-+
-+      /* Publish this device. */
-+      if(!err)
-+              err = publish_cb(pdev, 0, 0, PCI_DEVFN(slot, func), devid);
-+
-+      out:
-+      return err;
-+}
-+
-+void pciback_release_pci_dev(struct pciback_device *pdev, struct pci_dev *dev)
-+{
-+      int slot;
-+      struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-+      struct pci_dev *found_dev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&vpci_dev->lock, flags);
-+
-+      for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+              struct pci_dev_entry *e, *tmp;
-+              list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot],
-+                                       list) {
-+                      if (e->dev == dev) {
-+                              list_del(&e->list);
-+                              found_dev = e->dev;
-+                              kfree(e);
-+                              goto out;
-+                      }
-+              }
-+      }
-+
-+      out:
-+      spin_unlock_irqrestore(&vpci_dev->lock, flags);
-+
-+      if (found_dev)
-+              pcistub_put_pci_dev(found_dev);
-+}
-+
-+int pciback_init_devices(struct pciback_device *pdev)
-+{
-+      int slot;
-+      struct vpci_dev_data *vpci_dev;
-+
-+      vpci_dev = kmalloc(sizeof(*vpci_dev), GFP_KERNEL);
-+      if (!vpci_dev)
-+              return -ENOMEM;
-+
-+      spin_lock_init(&vpci_dev->lock);
-+
-+      for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+              INIT_LIST_HEAD(&vpci_dev->dev_list[slot]);
-+      }
-+
-+      pdev->pci_dev_data = vpci_dev;
-+
-+      return 0;
-+}
-+
-+int pciback_publish_pci_roots(struct pciback_device *pdev,
-+                            publish_pci_root_cb publish_cb)
-+{
-+      /* The Virtual PCI bus has only one root */
-+      return publish_cb(pdev, 0, 0);
-+}
-+
-+void pciback_release_devices(struct pciback_device *pdev)
-+{
-+      int slot;
-+      struct vpci_dev_data *vpci_dev = pdev->pci_dev_data;
-+
-+      for (slot = 0; slot < PCI_SLOT_MAX; slot++) {
-+              struct pci_dev_entry *e, *tmp;
-+              list_for_each_entry_safe(e, tmp, &vpci_dev->dev_list[slot],
-+                                       list) {
-+                      list_del(&e->list);
-+                      pcistub_put_pci_dev(e->dev);
-+                      kfree(e);
-+              }
-+      }
-+
-+      kfree(vpci_dev);
-+      pdev->pci_dev_data = NULL;
-+}
-Index: head-2008-11-25/drivers/xen/pciback/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pciback/xenbus.c       2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,704 @@
-+/*
-+ * PCI Backend Xenbus Setup - handles setup with frontend and xend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/list.h>
-+#include <linux/vmalloc.h>
-+#include <xen/xenbus.h>
-+#include <xen/evtchn.h>
-+#include "pciback.h"
-+
-+#define INVALID_EVTCHN_IRQ  (-1)
-+
-+static struct pciback_device *alloc_pdev(struct xenbus_device *xdev)
-+{
-+      struct pciback_device *pdev;
-+
-+      pdev = kzalloc(sizeof(struct pciback_device), GFP_KERNEL);
-+      if (pdev == NULL)
-+              goto out;
-+      dev_dbg(&xdev->dev, "allocated pdev @ 0x%p\n", pdev);
-+
-+      pdev->xdev = xdev;
-+      xdev->dev.driver_data = pdev;
-+
-+      spin_lock_init(&pdev->dev_lock);
-+
-+      pdev->sh_area = NULL;
-+      pdev->sh_info = NULL;
-+      pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
-+      pdev->be_watching = 0;
-+
-+      INIT_WORK(&pdev->op_work, pciback_do_op, pdev);
-+
-+      if (pciback_init_devices(pdev)) {
-+              kfree(pdev);
-+              pdev = NULL;
-+      }
-+      out:
-+      return pdev;
-+}
-+
-+static void pciback_disconnect(struct pciback_device *pdev)
-+{
-+      spin_lock(&pdev->dev_lock);
-+
-+      /* Ensure the guest can't trigger our handler before removing devices */
-+      if (pdev->evtchn_irq != INVALID_EVTCHN_IRQ) {
-+              unbind_from_irqhandler(pdev->evtchn_irq, pdev);
-+              pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
-+      }
-+
-+      /* If the driver domain started an op, make sure we complete it or
-+       * delete it before releasing the shared memory */
-+      cancel_delayed_work(&pdev->op_work);
-+      flush_scheduled_work();
-+
-+      if (pdev->sh_info != NULL) {
-+              xenbus_unmap_ring_vfree(pdev->xdev, pdev->sh_area);
-+              pdev->sh_info = NULL;
-+      }
-+
-+      spin_unlock(&pdev->dev_lock);
-+}
-+
-+static void free_pdev(struct pciback_device *pdev)
-+{
-+      if (pdev->be_watching)
-+              unregister_xenbus_watch(&pdev->be_watch);
-+
-+      pciback_disconnect(pdev);
-+
-+      pciback_release_devices(pdev);
-+
-+      pdev->xdev->dev.driver_data = NULL;
-+      pdev->xdev = NULL;
-+
-+      kfree(pdev);
-+}
-+
-+static int pciback_do_attach(struct pciback_device *pdev, int gnt_ref,
-+                           int remote_evtchn)
-+{
-+      int err = 0;
-+      struct vm_struct *area;
-+
-+      dev_dbg(&pdev->xdev->dev,
-+              "Attaching to frontend resources - gnt_ref=%d evtchn=%d\n",
-+              gnt_ref, remote_evtchn);
-+
-+      area = xenbus_map_ring_valloc(pdev->xdev, gnt_ref);
-+      if (IS_ERR(area)) {
-+              err = PTR_ERR(area);
-+              goto out;
-+      }
-+      pdev->sh_area = area;
-+      pdev->sh_info = area->addr;
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+              pdev->xdev->otherend_id, remote_evtchn, pciback_handle_event,
-+              SA_SAMPLE_RANDOM, "pciback", pdev);
-+      if (err < 0) {
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error binding event channel to IRQ");
-+              goto out;
-+      }
-+      pdev->evtchn_irq = err;
-+      err = 0;
-+
-+      dev_dbg(&pdev->xdev->dev, "Attached!\n");
-+      out:
-+      return err;
-+}
-+
-+static int pciback_attach(struct pciback_device *pdev)
-+{
-+      int err = 0;
-+      int gnt_ref, remote_evtchn;
-+      char *magic = NULL;
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      /* Make sure we only do this setup once */
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateInitialised)
-+              goto out;
-+
-+      /* Wait for frontend to state that it has published the configuration */
-+      if (xenbus_read_driver_state(pdev->xdev->otherend) !=
-+          XenbusStateInitialised)
-+              goto out;
-+
-+      dev_dbg(&pdev->xdev->dev, "Reading frontend config\n");
-+
-+      err = xenbus_gather(XBT_NIL, pdev->xdev->otherend,
-+                          "pci-op-ref", "%u", &gnt_ref,
-+                          "event-channel", "%u", &remote_evtchn,
-+                          "magic", NULL, &magic, NULL);
-+      if (err) {
-+              /* If configuration didn't get read correctly, wait longer */
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading configuration from frontend");
-+              goto out;
-+      }
-+
-+      if (magic == NULL || strcmp(magic, XEN_PCI_MAGIC) != 0) {
-+              xenbus_dev_fatal(pdev->xdev, -EFAULT,
-+                               "version mismatch (%s/%s) with pcifront - "
-+                               "halting pciback",
-+                               magic, XEN_PCI_MAGIC);
-+              goto out;
-+      }
-+
-+      err = pciback_do_attach(pdev, gnt_ref, remote_evtchn);
-+      if (err)
-+              goto out;
-+
-+      dev_dbg(&pdev->xdev->dev, "Connecting...\n");
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
-+      if (err)
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error switching to connected state!");
-+
-+      dev_dbg(&pdev->xdev->dev, "Connected? %d\n", err);
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+
-+      if (magic)
-+              kfree(magic);
-+
-+      return err;
-+}
-+
-+static int pciback_publish_pci_dev(struct pciback_device *pdev,
-+                                 unsigned int domain, unsigned int bus,
-+                                 unsigned int devfn, unsigned int devid)
-+{
-+      int err;
-+      int len;
-+      char str[64];
-+
-+      len = snprintf(str, sizeof(str), "vdev-%d", devid);
-+      if (unlikely(len >= (sizeof(str) - 1))) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
-+                          "%04x:%02x:%02x.%02x", domain, bus,
-+                          PCI_SLOT(devfn), PCI_FUNC(devfn));
-+
-+      out:
-+      return err;
-+}
-+
-+static int pciback_export_device(struct pciback_device *pdev,
-+                               int domain, int bus, int slot, int func,
-+                               int devid)
-+{
-+      struct pci_dev *dev;
-+      int err = 0;
-+
-+      dev_dbg(&pdev->xdev->dev, "exporting dom %x bus %x slot %x func %x\n",
-+              domain, bus, slot, func);
-+
-+      dev = pcistub_get_pci_dev_by_slot(pdev, domain, bus, slot, func);
-+      if (!dev) {
-+              err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Couldn't locate PCI device "
-+                               "(%04x:%02x:%02x.%01x)! "
-+                               "perhaps already in-use?",
-+                               domain, bus, slot, func);
-+              goto out;
-+      }
-+
-+      err = pciback_add_pci_dev(pdev, dev, devid, pciback_publish_pci_dev);
-+      if (err)
-+              goto out;
-+
-+      /* TODO: It'd be nice to export a bridge and have all of its children
-+       * get exported with it. This may be best done in xend (which will
-+       * have to calculate resource usage anyway) but we probably want to
-+       * put something in here to ensure that if a bridge gets given to a
-+       * driver domain, that all devices under that bridge are not given
-+       * to other driver domains (as he who controls the bridge can disable
-+       * it and stop the other devices from working).
-+       */
-+      out:
-+      return err;
-+}
-+
-+static int pciback_remove_device(struct pciback_device *pdev,
-+                               int domain, int bus, int slot, int func)
-+{
-+      int err = 0;
-+      struct pci_dev *dev;
-+
-+      dev_dbg(&pdev->xdev->dev, "removing dom %x bus %x slot %x func %x\n",
-+              domain, bus, slot, func);
-+
-+      dev = pciback_get_pci_dev(pdev, domain, bus, PCI_DEVFN(slot, func));
-+      if (!dev) {
-+              err = -EINVAL;
-+              dev_dbg(&pdev->xdev->dev, "Couldn't locate PCI device "
-+                      "(%04x:%02x:%02x.%01x)! not owned by this domain\n",
-+                      domain, bus, slot, func);
-+              goto out;
-+      }
-+
-+      pciback_release_pci_dev(pdev, dev);
-+      
-+      out:
-+      return err;
-+}
-+
-+static int pciback_publish_pci_root(struct pciback_device *pdev,
-+                                  unsigned int domain, unsigned int bus)
-+{
-+      unsigned int d, b;
-+      int i, root_num, len, err;
-+      char str[64];
-+
-+      dev_dbg(&pdev->xdev->dev, "Publishing pci roots\n");
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                         "root_num", "%d", &root_num);
-+      if (err == 0 || err == -ENOENT)
-+              root_num = 0;
-+      else if (err < 0)
-+              goto out;
-+
-+      /* Verify that we haven't already published this pci root */
-+      for (i = 0; i < root_num; i++) {
-+              len = snprintf(str, sizeof(str), "root-%d", i);
-+              if (unlikely(len >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                                 str, "%x:%x", &d, &b);
-+              if (err < 0)
-+                      goto out;
-+              if (err != 2) {
-+                      err = -EINVAL;
-+                      goto out;
-+              }
-+
-+              if (d == domain && b == bus) {
-+                      err = 0;
-+                      goto out;
-+              }
-+      }
-+
-+      len = snprintf(str, sizeof(str), "root-%d", root_num);
-+      if (unlikely(len >= (sizeof(str) - 1))) {
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+
-+      dev_dbg(&pdev->xdev->dev, "writing root %d at %04x:%02x\n",
-+              root_num, domain, bus);
-+
-+      err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, str,
-+                          "%04x:%02x", domain, bus);
-+      if (err)
-+              goto out;
-+
-+      err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
-+                          "root_num", "%d", (root_num + 1));
-+
-+      out:
-+      return err;
-+}
-+
-+static int pciback_reconfigure(struct pciback_device *pdev)
-+{
-+      int err = 0;
-+      int num_devs;
-+      int domain, bus, slot, func;
-+      int substate;
-+      int i, len;
-+      char state_str[64];
-+      char dev_str[64];
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      dev_dbg(&pdev->xdev->dev, "Reconfiguring device ...\n");
-+
-+      /* Make sure we only reconfigure once */
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateReconfiguring)
-+              goto out;
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
-+                         &num_devs);
-+      if (err != 1) {
-+              if (err >= 0)
-+                      err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading number of devices");
-+              goto out;
-+      }
-+
-+      for (i = 0; i < num_devs; i++) {
-+              len = snprintf(state_str, sizeof(state_str), "state-%d", i);
-+              if (unlikely(len >= (sizeof(state_str) - 1))) {
-+                      err = -ENOMEM;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "String overflow while reading "
-+                                       "configuration");
-+                      goto out;
-+              }
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, state_str,
-+                                 "%d", &substate);
-+              if (err != 1) 
-+                      substate = XenbusStateUnknown;
-+
-+              switch (substate) {
-+              case XenbusStateInitialising:
-+                      dev_dbg(&pdev->xdev->dev, "Attaching dev-%d ...\n", i);
-+
-+                      len = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
-+                      if (unlikely(len >= (sizeof(dev_str) - 1))) {
-+                              err = -ENOMEM;
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "String overflow while "
-+                                               "reading configuration");
-+                              goto out;
-+                      }
-+                      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                                         dev_str, "%x:%x:%x.%x",
-+                                         &domain, &bus, &slot, &func);
-+                      if (err < 0) {
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error reading device "
-+                                               "configuration");
-+                              goto out;
-+                      }
-+                      if (err != 4) {
-+                              err = -EINVAL;
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error parsing pci device "
-+                                               "configuration");
-+                              goto out;
-+                      }
-+      
-+                      err = pciback_export_device(pdev, domain, bus, slot,
-+                                                  func, i);
-+                      if (err)
-+                              goto out;
-+
-+                      /* Publish pci roots. */
-+                      err = pciback_publish_pci_roots(pdev, pciback_publish_pci_root);
-+                      if (err) {
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error while publish PCI root"
-+                                               "buses for frontend");
-+                              goto out;
-+                      }
-+
-+                      err = xenbus_printf(XBT_NIL, pdev->xdev->nodename,
-+                                          state_str, "%d",
-+                                          XenbusStateInitialised);
-+                      if (err) {
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error switching substate of "
-+                                               "dev-%d\n", i);
-+                              goto out;
-+                      }       
-+                      break;
-+
-+              case XenbusStateClosing:
-+                      dev_dbg(&pdev->xdev->dev, "Detaching dev-%d ...\n", i);
-+
-+                      len = snprintf(dev_str, sizeof(dev_str), "vdev-%d", i);
-+                      if (unlikely(len >= (sizeof(dev_str) - 1))) {
-+                              err = -ENOMEM;
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "String overflow while "
-+                                               "reading configuration");
-+                              goto out;
-+                      }
-+                      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename,
-+                                         dev_str, "%x:%x:%x.%x",
-+                                         &domain, &bus, &slot, &func);
-+                      if (err < 0) {
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error reading device "
-+                                               "configuration");
-+                              goto out;
-+                      }
-+                      if (err != 4) {
-+                              err = -EINVAL;
-+                              xenbus_dev_fatal(pdev->xdev, err,
-+                                               "Error parsing pci device "
-+                                               "configuration");
-+                              goto out;
-+                      }
-+
-+                      err = pciback_remove_device(pdev, domain, bus, slot,
-+                                                  func);
-+                      if(err)
-+                              goto out;
-+
-+                      /* TODO: If at some point we implement support for pci
-+                       * root hot-remove on pcifront side, we'll need to
-+                       * remove unnecessary xenstore nodes of pci roots here.
-+                       */
-+
-+                      break;
-+
-+              default:
-+                      break;
-+              }
-+      }
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateReconfigured);
-+      if (err) {
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error switching to reconfigured state!");
-+              goto out;
-+      }
-+      
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+
-+      return 0;
-+}
-+
-+static void pciback_frontend_changed(struct xenbus_device *xdev,
-+                                   enum xenbus_state fe_state)
-+{
-+      struct pciback_device *pdev = xdev->dev.driver_data;
-+
-+      dev_dbg(&xdev->dev, "fe state changed %d\n", fe_state);
-+
-+      switch (fe_state) {
-+      case XenbusStateInitialised:
-+              pciback_attach(pdev);
-+              break;
-+
-+      case XenbusStateReconfiguring:
-+              pciback_reconfigure(pdev);
-+              break;
-+
-+      case XenbusStateConnected:
-+              /* pcifront switched its state from reconfiguring to connected.
-+               * Then switch to connected state.
-+               */
-+              xenbus_switch_state(xdev, XenbusStateConnected);
-+              break;
-+
-+      case XenbusStateClosing:
-+              pciback_disconnect(pdev);
-+              xenbus_switch_state(xdev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateClosed:
-+              pciback_disconnect(pdev);
-+              xenbus_switch_state(xdev, XenbusStateClosed);
-+              if (xenbus_dev_is_online(xdev))
-+                      break;
-+              /* fall through if not online */
-+      case XenbusStateUnknown:
-+              dev_dbg(&xdev->dev, "frontend is gone! unregister device\n");
-+              device_unregister(&xdev->dev);
-+              break;
-+
-+      default:
-+              break;
-+      }
-+}
-+
-+static int pciback_setup_backend(struct pciback_device *pdev)
-+{
-+      /* Get configuration from xend (if available now) */
-+      int domain, bus, slot, func;
-+      int err = 0;
-+      int i, num_devs;
-+      char dev_str[64];
-+      char state_str[64];
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      /* It's possible we could get the call to setup twice, so make sure
-+       * we're not already connected.
-+       */
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateInitWait)
-+              goto out;
-+
-+      dev_dbg(&pdev->xdev->dev, "getting be setup\n");
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, "num_devs", "%d",
-+                         &num_devs);
-+      if (err != 1) {
-+              if (err >= 0)
-+                      err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading number of devices");
-+              goto out;
-+      }
-+
-+      for (i = 0; i < num_devs; i++) {
-+              int l = snprintf(dev_str, sizeof(dev_str), "dev-%d", i);
-+              if (unlikely(l >= (sizeof(dev_str) - 1))) {
-+                      err = -ENOMEM;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "String overflow while reading "
-+                                       "configuration");
-+                      goto out;
-+              }
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->nodename, dev_str,
-+                                 "%x:%x:%x.%x", &domain, &bus, &slot, &func);
-+              if (err < 0) {
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error reading device configuration");
-+                      goto out;
-+              }
-+              if (err != 4) {
-+                      err = -EINVAL;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error parsing pci device "
-+                                       "configuration");
-+                      goto out;
-+              }
-+
-+              err = pciback_export_device(pdev, domain, bus, slot, func, i);
-+              if (err)
-+                      goto out;
-+
-+              /* Switch substate of this device. */
-+              l = snprintf(state_str, sizeof(state_str), "state-%d", i);
-+              if (unlikely(l >= (sizeof(state_str) - 1))) {
-+                      err = -ENOMEM;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "String overflow while reading "
-+                                       "configuration");
-+                      goto out;
-+              }
-+              err = xenbus_printf(XBT_NIL, pdev->xdev->nodename, state_str,
-+                                  "%d", XenbusStateInitialised);
-+              if (err) {
-+                      xenbus_dev_fatal(pdev->xdev, err, "Error switching "
-+                                       "substate of dev-%d\n", i);
-+                      goto out;
-+              }       
-+      }
-+
-+      err = pciback_publish_pci_roots(pdev, pciback_publish_pci_root);
-+      if (err) {
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error while publish PCI root buses "
-+                               "for frontend");
-+              goto out;
-+      }
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
-+      if (err)
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error switching to initialised state!");
-+
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+
-+      if (!err)
-+              /* see if pcifront is already configured (if not, we'll wait) */
-+              pciback_attach(pdev);
-+
-+      return err;
-+}
-+
-+static void pciback_be_watch(struct xenbus_watch *watch,
-+                           const char **vec, unsigned int len)
-+{
-+      struct pciback_device *pdev =
-+          container_of(watch, struct pciback_device, be_watch);
-+
-+      switch (xenbus_read_driver_state(pdev->xdev->nodename)) {
-+      case XenbusStateInitWait:
-+              pciback_setup_backend(pdev);
-+              break;
-+
-+      default:
-+              break;
-+      }
-+}
-+
-+static int pciback_xenbus_probe(struct xenbus_device *dev,
-+                              const struct xenbus_device_id *id)
-+{
-+      int err = 0;
-+      struct pciback_device *pdev = alloc_pdev(dev);
-+
-+      if (pdev == NULL) {
-+              err = -ENOMEM;
-+              xenbus_dev_fatal(dev, err,
-+                               "Error allocating pciback_device struct");
-+              goto out;
-+      }
-+
-+      /* wait for xend to configure us */
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err)
-+              goto out;
-+
-+      /* watch the backend node for backend configuration information */
-+      err = xenbus_watch_path(dev, dev->nodename, &pdev->be_watch,
-+                              pciback_be_watch);
-+      if (err)
-+              goto out;
-+      pdev->be_watching = 1;
-+
-+      /* We need to force a call to our callback here in case
-+       * xend already configured us!
-+       */
-+      pciback_be_watch(&pdev->be_watch, NULL, 0);
-+
-+      out:
-+      return err;
-+}
-+
-+static int pciback_xenbus_remove(struct xenbus_device *dev)
-+{
-+      struct pciback_device *pdev = dev->dev.driver_data;
-+
-+      if (pdev != NULL)
-+              free_pdev(pdev);
-+
-+      return 0;
-+}
-+
-+static const struct xenbus_device_id xenpci_ids[] = {
-+      {"pci"},
-+      {{0}},
-+};
-+
-+static struct xenbus_driver xenbus_pciback_driver = {
-+      .name                   = "pciback",
-+      .owner                  = THIS_MODULE,
-+      .ids                    = xenpci_ids,
-+      .probe                  = pciback_xenbus_probe,
-+      .remove                 = pciback_xenbus_remove,
-+      .otherend_changed       = pciback_frontend_changed,
-+};
-+
-+int __init pciback_xenbus_register(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      return xenbus_register_backend(&xenbus_pciback_driver);
-+}
-+
-+void __exit pciback_xenbus_unregister(void)
-+{
-+      xenbus_unregister_driver(&xenbus_pciback_driver);
-+}
-Index: head-2008-11-25/drivers/xen/pcifront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pcifront/Makefile      2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,7 @@
-+obj-y += pcifront.o
-+
-+pcifront-y := pci_op.o xenbus.o pci.o
-+
-+ifeq ($(CONFIG_XEN_PCIDEV_FE_DEBUG),y)
-+EXTRA_CFLAGS += -DDEBUG
-+endif
-Index: head-2008-11-25/drivers/xen/pcifront/pci.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pcifront/pci.c 2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,46 @@
-+/*
-+ * PCI Frontend Operations - ensure only one PCI frontend runs at a time
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include "pcifront.h"
-+
-+DEFINE_SPINLOCK(pcifront_dev_lock);
-+static struct pcifront_device *pcifront_dev = NULL;
-+
-+int pcifront_connect(struct pcifront_device *pdev)
-+{
-+      int err = 0;
-+
-+      spin_lock(&pcifront_dev_lock);
-+
-+      if (!pcifront_dev) {
-+              dev_info(&pdev->xdev->dev, "Installing PCI frontend\n");
-+              pcifront_dev = pdev;
-+      }
-+      else {
-+              dev_err(&pdev->xdev->dev, "PCI frontend already installed!\n");
-+              err = -EEXIST;
-+      }
-+
-+      spin_unlock(&pcifront_dev_lock);
-+
-+      return err;
-+}
-+
-+void pcifront_disconnect(struct pcifront_device *pdev)
-+{
-+      spin_lock(&pcifront_dev_lock);
-+
-+      if (pdev == pcifront_dev) {
-+              dev_info(&pdev->xdev->dev,
-+                       "Disconnecting PCI Frontend Buses\n");
-+              pcifront_dev = NULL;
-+      }
-+
-+      spin_unlock(&pcifront_dev_lock);
-+}
-Index: head-2008-11-25/drivers/xen/pcifront/pci_op.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pcifront/pci_op.c      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,551 @@
-+/*
-+ * PCI Frontend Operations - Communicates with frontend
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/version.h>
-+#include <linux/init.h>
-+#include <linux/pci.h>
-+#include <linux/spinlock.h>
-+#include <linux/time.h>
-+#include <xen/evtchn.h>
-+#include "pcifront.h"
-+
-+static int verbose_request = 0;
-+module_param(verbose_request, int, 0644);
-+
-+#ifdef __ia64__
-+static void pcifront_init_sd(struct pcifront_sd *sd,
-+                           unsigned int domain, unsigned int bus,
-+                           struct pcifront_device *pdev)
-+{
-+      int err, i, j, k, len, root_num, res_count;
-+      struct acpi_resource res;
-+      unsigned int d, b, byte;
-+      unsigned long magic;
-+      char str[64], tmp[3];
-+      unsigned char *buf, *bufp;
-+      u8 *ptr;
-+
-+      memset(sd, 0, sizeof(*sd));
-+
-+      sd->segment = domain;
-+      sd->node = -1;  /* Revisit for NUMA */
-+      sd->platform_data = pdev;
-+
-+      /* Look for resources for this controller in xenbus. */
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, "root_num",
-+                         "%d", &root_num);
-+      if (err != 1)
-+              return;
-+
-+      for (i = 0; i < root_num; i++) {
-+              len = snprintf(str, sizeof(str), "root-%d", i);
-+              if (unlikely(len >= (sizeof(str) - 1)))
-+                      return;
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-+                                 str, "%x:%x", &d, &b);
-+              if (err != 2)
-+                      return;
-+
-+              if (d == domain && b == bus)
-+                      break;
-+      }
-+
-+      if (i == root_num)
-+              return;
-+
-+      len = snprintf(str, sizeof(str), "root-resource-magic");
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-+                         str, "%lx", &magic);
-+
-+      if (err != 1)
-+              return; /* No resources, nothing to do */
-+
-+      if (magic != (sizeof(res) * 2) + 1) {
-+              printk(KERN_WARNING "pcifront: resource magic mismatch\n");
-+              return;
-+      }
-+
-+      len = snprintf(str, sizeof(str), "root-%d-resources", i);
-+      if (unlikely(len >= (sizeof(str) - 1)))
-+              return;
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-+                         str, "%d", &res_count);
-+
-+      if (err != 1)
-+              return; /* No resources, nothing to do */
-+
-+      sd->window = kzalloc(sizeof(*sd->window) * res_count, GFP_KERNEL);
-+      if (!sd->window)
-+              return;
-+
-+      /* magic is also the size of the byte stream in xenbus */
-+      buf = kmalloc(magic, GFP_KERNEL);
-+      if (!buf) {
-+              kfree(sd->window);
-+              sd->window = NULL;
-+              return;
-+      }
-+
-+      /* Read the resources out of xenbus */
-+      for (j = 0; j < res_count; j++) {
-+              memset(&res, 0, sizeof(res));
-+              memset(buf, 0, magic);
-+
-+              len = snprintf(str, sizeof(str), "root-%d-resource-%d", i, j);
-+              if (unlikely(len >= (sizeof(str) - 1)))
-+                      return;
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
-+                                 "%s", buf);
-+              if (err != 1) {
-+                      printk(KERN_WARNING "pcifront: error reading "
-+                             "resource %d on bus %04x:%02x\n",
-+                             j, domain, bus);
-+                      continue;
-+              }
-+
-+              bufp = buf;
-+              ptr = (u8 *)&res;
-+              memset(tmp, 0, sizeof(tmp));
-+
-+              /* Copy ASCII byte stream into structure */
-+              for (k = 0; k < magic - 1; k += 2) {
-+                      memcpy(tmp, bufp, 2);
-+                      bufp += 2;
-+
-+                      sscanf(tmp, "%02x", &byte);
-+                      *ptr = byte;
-+                      ptr++;
-+              }
-+
-+              xen_add_resource(sd, domain, bus, &res);
-+              sd->windows++;
-+      }
-+      kfree(buf);
-+}
-+#endif
-+
-+static int errno_to_pcibios_err(int errno)
-+{
-+      switch (errno) {
-+      case XEN_PCI_ERR_success:
-+              return PCIBIOS_SUCCESSFUL;
-+
-+      case XEN_PCI_ERR_dev_not_found:
-+              return PCIBIOS_DEVICE_NOT_FOUND;
-+
-+      case XEN_PCI_ERR_invalid_offset:
-+      case XEN_PCI_ERR_op_failed:
-+              return PCIBIOS_BAD_REGISTER_NUMBER;
-+
-+      case XEN_PCI_ERR_not_implemented:
-+              return PCIBIOS_FUNC_NOT_SUPPORTED;
-+
-+      case XEN_PCI_ERR_access_denied:
-+              return PCIBIOS_SET_FAILED;
-+      }
-+      return errno;
-+}
-+
-+static int do_pci_op(struct pcifront_device *pdev, struct xen_pci_op *op)
-+{
-+      int err = 0;
-+      struct xen_pci_op *active_op = &pdev->sh_info->op;
-+      unsigned long irq_flags;
-+      evtchn_port_t port = pdev->evtchn;
-+      s64 ns, ns_timeout;
-+      struct timeval tv;
-+
-+      spin_lock_irqsave(&pdev->sh_info_lock, irq_flags);
-+
-+      memcpy(active_op, op, sizeof(struct xen_pci_op));
-+
-+      /* Go */
-+      wmb();
-+      set_bit(_XEN_PCIF_active, (unsigned long *)&pdev->sh_info->flags);
-+      notify_remote_via_evtchn(port);
-+
-+      /*
-+       * We set a poll timeout of 3 seconds but give up on return after
-+       * 2 seconds. It is better to time out too late rather than too early
-+       * (in the latter case we end up continually re-executing poll() with a
-+       * timeout in the past). 1s difference gives plenty of slack for error.
-+       */
-+      do_gettimeofday(&tv);
-+      ns_timeout = timeval_to_ns(&tv) + 2 * (s64)NSEC_PER_SEC;
-+
-+      clear_evtchn(port);
-+
-+      while (test_bit(_XEN_PCIF_active,
-+                      (unsigned long *)&pdev->sh_info->flags)) {
-+              if (HYPERVISOR_poll(&port, 1, jiffies + 3*HZ))
-+                      BUG();
-+              clear_evtchn(port);
-+              do_gettimeofday(&tv);
-+              ns = timeval_to_ns(&tv);
-+              if (ns > ns_timeout) {
-+                      dev_err(&pdev->xdev->dev,
-+                              "pciback not responding!!!\n");
-+                      clear_bit(_XEN_PCIF_active,
-+                                (unsigned long *)&pdev->sh_info->flags);
-+                      err = XEN_PCI_ERR_dev_not_found;
-+                      goto out;
-+              }
-+      }
-+
-+      memcpy(op, active_op, sizeof(struct xen_pci_op));
-+
-+      err = op->err;
-+      out:
-+      spin_unlock_irqrestore(&pdev->sh_info_lock, irq_flags);
-+      return err;
-+}
-+
-+/* Access to this function is spinlocked in drivers/pci/access.c */
-+static int pcifront_bus_read(struct pci_bus *bus, unsigned int devfn,
-+                           int where, int size, u32 * val)
-+{
-+      int err = 0;
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_conf_read,
-+              .domain = pci_domain_nr(bus),
-+              .bus    = bus->number,
-+              .devfn  = devfn,
-+              .offset = where,
-+              .size   = size,
-+      };
-+      struct pcifront_sd *sd = bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      if (verbose_request)
-+              dev_info(&pdev->xdev->dev,
-+                       "read dev=%04x:%02x:%02x.%01x - offset %x size %d\n",
-+                       pci_domain_nr(bus), bus->number, PCI_SLOT(devfn),
-+                       PCI_FUNC(devfn), where, size);
-+
-+      err = do_pci_op(pdev, &op);
-+
-+      if (likely(!err)) {
-+              if (verbose_request)
-+                      dev_info(&pdev->xdev->dev, "read got back value %x\n",
-+                               op.value);
-+
-+              *val = op.value;
-+      } else if (err == -ENODEV) {
-+              /* No device here, pretend that it just returned 0 */
-+              err = 0;
-+              *val = 0;
-+      }
-+
-+      return errno_to_pcibios_err(err);
-+}
-+
-+/* Access to this function is spinlocked in drivers/pci/access.c */
-+static int pcifront_bus_write(struct pci_bus *bus, unsigned int devfn,
-+                            int where, int size, u32 val)
-+{
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_conf_write,
-+              .domain = pci_domain_nr(bus),
-+              .bus    = bus->number,
-+              .devfn  = devfn,
-+              .offset = where,
-+              .size   = size,
-+              .value  = val,
-+      };
-+      struct pcifront_sd *sd = bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      if (verbose_request)
-+              dev_info(&pdev->xdev->dev,
-+                       "write dev=%04x:%02x:%02x.%01x - "
-+                       "offset %x size %d val %x\n",
-+                       pci_domain_nr(bus), bus->number,
-+                       PCI_SLOT(devfn), PCI_FUNC(devfn), where, size, val);
-+
-+      return errno_to_pcibios_err(do_pci_op(pdev, &op));
-+}
-+
-+struct pci_ops pcifront_bus_ops = {
-+      .read = pcifront_bus_read,
-+      .write = pcifront_bus_write,
-+};
-+
-+#ifdef CONFIG_PCI_MSI
-+int pci_frontend_enable_msix(struct pci_dev *dev,
-+              struct msix_entry *entries,
-+              int nvec)
-+{
-+      int err;
-+      int i;
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_enable_msix,
-+              .domain = pci_domain_nr(dev->bus),
-+              .bus = dev->bus->number,
-+              .devfn = dev->devfn,
-+              .value = nvec,
-+      };
-+      struct pcifront_sd *sd = dev->bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      if (nvec > SH_INFO_MAX_VEC) {
-+              printk("too much vector for pci frontend%x\n", nvec);
-+              return -EINVAL;
-+      }
-+
-+      for (i = 0; i < nvec; i++) {
-+              op.msix_entries[i].entry = entries[i].entry;
-+              op.msix_entries[i].vector = entries[i].vector;
-+      }
-+
-+      err = do_pci_op(pdev, &op);
-+
-+      if (!err) {
-+              if (!op.value) {
-+                      /* we get the result */
-+                      for ( i = 0; i < nvec; i++)
-+                              entries[i].vector = op.msix_entries[i].vector;
-+                      return 0;
-+              }
-+              else {
-+            printk("enable msix get value %x\n", op.value);
-+                      return op.value;
-+              }
-+      }
-+      else {
-+        printk("enable msix get err %x\n", err);
-+              return err;
-+      }
-+}
-+
-+void pci_frontend_disable_msix(struct pci_dev* dev)
-+{
-+      int err;
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_disable_msix,
-+              .domain = pci_domain_nr(dev->bus),
-+              .bus = dev->bus->number,
-+              .devfn = dev->devfn,
-+      };
-+      struct pcifront_sd *sd = dev->bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      err = do_pci_op(pdev, &op);
-+
-+      /* What should do for error ? */
-+      if (err)
-+              printk("pci_disable_msix get err %x\n", err);
-+}
-+
-+int pci_frontend_enable_msi(struct pci_dev *dev)
-+{
-+      int err;
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_enable_msi,
-+              .domain = pci_domain_nr(dev->bus),
-+              .bus = dev->bus->number,
-+              .devfn = dev->devfn,
-+      };
-+      struct pcifront_sd *sd = dev->bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      err = do_pci_op(pdev, &op);
-+      if (likely(!err)) {
-+              dev->irq = op.value;
-+      }
-+      else {
-+              printk("pci frontend enable msi failed for dev %x:%x \n",
-+                              op.bus, op.devfn);
-+              err = -EINVAL;
-+      }
-+      return err;
-+}
-+
-+void pci_frontend_disable_msi(struct pci_dev* dev)
-+{
-+      int err;
-+      struct xen_pci_op op = {
-+              .cmd    = XEN_PCI_OP_disable_msi,
-+              .domain = pci_domain_nr(dev->bus),
-+              .bus = dev->bus->number,
-+              .devfn = dev->devfn,
-+      };
-+      struct pcifront_sd *sd = dev->bus->sysdata;
-+      struct pcifront_device *pdev = pcifront_get_pdev(sd);
-+
-+      err = do_pci_op(pdev, &op);
-+      if (err == XEN_PCI_ERR_dev_not_found) {
-+              /* XXX No response from backend, what shall we do? */
-+              printk("get no response from backend for disable MSI\n");
-+              return;
-+      }
-+      if (likely(!err))
-+              dev->irq = op.value;
-+      else
-+              /* how can pciback notify us fail? */
-+              printk("get fake response frombackend \n");
-+}
-+#endif /* CONFIG_PCI_MSI */
-+
-+/* Claim resources for the PCI frontend as-is, backend won't allow changes */
-+static void pcifront_claim_resource(struct pci_dev *dev, void *data)
-+{
-+      struct pcifront_device *pdev = data;
-+      int i;
-+      struct resource *r;
-+
-+      for (i = 0; i < PCI_NUM_RESOURCES; i++) {
-+              r = &dev->resource[i];
-+
-+              if (!r->parent && r->start && r->flags) {
-+                      dev_dbg(&pdev->xdev->dev, "claiming resource %s/%d\n",
-+                              pci_name(dev), i);
-+                      pci_claim_resource(dev, i);
-+              }
-+      }
-+}
-+
-+int __devinit pcifront_scan_root(struct pcifront_device *pdev,
-+                               unsigned int domain, unsigned int bus)
-+{
-+      struct pci_bus *b;
-+      struct pcifront_sd *sd = NULL;
-+      struct pci_bus_entry *bus_entry = NULL;
-+      int err = 0;
-+
-+#ifndef CONFIG_PCI_DOMAINS
-+      if (domain != 0) {
-+              dev_err(&pdev->xdev->dev,
-+                      "PCI Root in non-zero PCI Domain! domain=%d\n", domain);
-+              dev_err(&pdev->xdev->dev,
-+                      "Please compile with CONFIG_PCI_DOMAINS\n");
-+              err = -EINVAL;
-+              goto err_out;
-+      }
-+#endif
-+
-+      dev_info(&pdev->xdev->dev, "Creating PCI Frontend Bus %04x:%02x\n",
-+               domain, bus);
-+
-+      bus_entry = kmalloc(sizeof(*bus_entry), GFP_KERNEL);
-+      sd = kmalloc(sizeof(*sd), GFP_KERNEL);
-+      if (!bus_entry || !sd) {
-+              err = -ENOMEM;
-+              goto err_out;
-+      }
-+      pcifront_init_sd(sd, domain, bus, pdev);
-+
-+      b = pci_scan_bus_parented(&pdev->xdev->dev, bus,
-+                                &pcifront_bus_ops, sd);
-+      if (!b) {
-+              dev_err(&pdev->xdev->dev,
-+                      "Error creating PCI Frontend Bus!\n");
-+              err = -ENOMEM;
-+              goto err_out;
-+      }
-+
-+      pcifront_setup_root_resources(b, sd);
-+      bus_entry->bus = b;
-+
-+      list_add(&bus_entry->list, &pdev->root_buses);
-+
-+      /* Claim resources before going "live" with our devices */
-+      pci_walk_bus(b, pcifront_claim_resource, pdev);
-+
-+      pci_bus_add_devices(b);
-+
-+      return 0;
-+
-+      err_out:
-+      kfree(bus_entry);
-+      kfree(sd);
-+
-+      return err;
-+}
-+
-+int __devinit pcifront_rescan_root(struct pcifront_device *pdev,
-+                                 unsigned int domain, unsigned int bus)
-+{
-+      struct pci_bus *b;
-+      struct pci_dev *d;
-+      unsigned int devfn;
-+
-+#ifndef CONFIG_PCI_DOMAINS
-+      if (domain != 0) {
-+              dev_err(&pdev->xdev->dev,
-+                      "PCI Root in non-zero PCI Domain! domain=%d\n", domain);
-+              dev_err(&pdev->xdev->dev,
-+                      "Please compile with CONFIG_PCI_DOMAINS\n");
-+              return -EINVAL;
-+      }
-+#endif
-+
-+      dev_info(&pdev->xdev->dev, "Rescanning PCI Frontend Bus %04x:%02x\n",
-+               domain, bus);
-+
-+      b = pci_find_bus(domain, bus);
-+      if(!b)
-+              /* If the bus is unknown, create it. */
-+              return pcifront_scan_root(pdev, domain, bus);
-+
-+      /* Rescan the bus for newly attached functions and add.
-+       * We omit handling of PCI bridge attachment because pciback prevents
-+       * bridges from being exported.
-+       */ 
-+      for (devfn = 0; devfn < 0x100; devfn++) {
-+              d = pci_get_slot(b, devfn);
-+              if(d) {
-+                      /* Device is already known. */
-+                      pci_dev_put(d);
-+                      continue;
-+              }
-+
-+              d = pci_scan_single_device(b, devfn);
-+              if (d) {
-+                      dev_info(&pdev->xdev->dev, "New device on "
-+                               "%04x:%02x:%02x.%02x found.\n", domain, bus,
-+                               PCI_SLOT(devfn), PCI_FUNC(devfn));
-+                      pci_bus_add_device(d);
-+              }
-+      }
-+
-+      return 0;
-+}
-+
-+static void free_root_bus_devs(struct pci_bus *bus)
-+{
-+      struct pci_dev *dev;
-+
-+      while (!list_empty(&bus->devices)) {
-+              dev = container_of(bus->devices.next, struct pci_dev,
-+                                 bus_list);
-+              dev_dbg(&dev->dev, "removing device\n");
-+              pci_remove_bus_device(dev);
-+      }
-+}
-+
-+void pcifront_free_roots(struct pcifront_device *pdev)
-+{
-+      struct pci_bus_entry *bus_entry, *t;
-+
-+      dev_dbg(&pdev->xdev->dev, "cleaning up root buses\n");
-+
-+      list_for_each_entry_safe(bus_entry, t, &pdev->root_buses, list) {
-+              list_del(&bus_entry->list);
-+
-+              free_root_bus_devs(bus_entry->bus);
-+
-+              kfree(bus_entry->bus->sysdata);
-+
-+              device_unregister(bus_entry->bus->bridge);
-+              pci_remove_bus(bus_entry->bus);
-+
-+              kfree(bus_entry);
-+      }
-+}
-Index: head-2008-11-25/drivers/xen/pcifront/pcifront.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pcifront/pcifront.h    2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,42 @@
-+/*
-+ * PCI Frontend - Common data structures & function declarations
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#ifndef __XEN_PCIFRONT_H__
-+#define __XEN_PCIFRONT_H__
-+
-+#include <linux/spinlock.h>
-+#include <linux/pci.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/io/pciif.h>
-+#include <xen/pcifront.h>
-+
-+struct pci_bus_entry {
-+      struct list_head list;
-+      struct pci_bus *bus;
-+};
-+
-+struct pcifront_device {
-+      struct xenbus_device *xdev;
-+      struct list_head root_buses;
-+      spinlock_t dev_lock;
-+
-+      int evtchn;
-+      int gnt_ref;
-+
-+      /* Lock this when doing any operations in sh_info */
-+      spinlock_t sh_info_lock;
-+      struct xen_pci_sharedinfo *sh_info;
-+};
-+
-+int pcifront_connect(struct pcifront_device *pdev);
-+void pcifront_disconnect(struct pcifront_device *pdev);
-+
-+int pcifront_scan_root(struct pcifront_device *pdev,
-+                     unsigned int domain, unsigned int bus);
-+int pcifront_rescan_root(struct pcifront_device *pdev,
-+                       unsigned int domain, unsigned int bus);
-+void pcifront_free_roots(struct pcifront_device *pdev);
-+
-+#endif        /* __XEN_PCIFRONT_H__ */
-Index: head-2008-11-25/drivers/xen/pcifront/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/pcifront/xenbus.c      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,455 @@
-+/*
-+ * PCI Frontend Xenbus Setup - handles setup with backend (imports page/evtchn)
-+ *
-+ *   Author: Ryan Wilson <hap9@epoch.ncsc.mil>
-+ */
-+#include <linux/module.h>
-+#include <linux/init.h>
-+#include <linux/mm.h>
-+#include <xen/xenbus.h>
-+#include <xen/gnttab.h>
-+#include "pcifront.h"
-+
-+#ifndef __init_refok
-+#define __init_refok
-+#endif
-+
-+#define INVALID_GRANT_REF (0)
-+#define INVALID_EVTCHN    (-1)
-+
-+static struct pcifront_device *alloc_pdev(struct xenbus_device *xdev)
-+{
-+      struct pcifront_device *pdev;
-+
-+      pdev = kzalloc(sizeof(struct pcifront_device), GFP_KERNEL);
-+      if (pdev == NULL)
-+              goto out;
-+
-+      pdev->sh_info =
-+          (struct xen_pci_sharedinfo *)__get_free_page(GFP_KERNEL);
-+      if (pdev->sh_info == NULL) {
-+              kfree(pdev);
-+              pdev = NULL;
-+              goto out;
-+      }
-+      pdev->sh_info->flags = 0;
-+
-+      xdev->dev.driver_data = pdev;
-+      pdev->xdev = xdev;
-+
-+      INIT_LIST_HEAD(&pdev->root_buses);
-+
-+      spin_lock_init(&pdev->dev_lock);
-+      spin_lock_init(&pdev->sh_info_lock);
-+
-+      pdev->evtchn = INVALID_EVTCHN;
-+      pdev->gnt_ref = INVALID_GRANT_REF;
-+
-+      dev_dbg(&xdev->dev, "Allocated pdev @ 0x%p pdev->sh_info @ 0x%p\n",
-+              pdev, pdev->sh_info);
-+      out:
-+      return pdev;
-+}
-+
-+static void free_pdev(struct pcifront_device *pdev)
-+{
-+      dev_dbg(&pdev->xdev->dev, "freeing pdev @ 0x%p\n", pdev);
-+
-+      pcifront_free_roots(pdev);
-+
-+      if (pdev->evtchn != INVALID_EVTCHN)
-+              xenbus_free_evtchn(pdev->xdev, pdev->evtchn);
-+
-+      if (pdev->gnt_ref != INVALID_GRANT_REF)
-+              gnttab_end_foreign_access(pdev->gnt_ref,
-+                                        (unsigned long)pdev->sh_info);
-+
-+      pdev->xdev->dev.driver_data = NULL;
-+
-+      kfree(pdev);
-+}
-+
-+static int pcifront_publish_info(struct pcifront_device *pdev)
-+{
-+      int err = 0;
-+      struct xenbus_transaction trans;
-+
-+      err = xenbus_grant_ring(pdev->xdev, virt_to_mfn(pdev->sh_info));
-+      if (err < 0)
-+              goto out;
-+
-+      pdev->gnt_ref = err;
-+
-+      err = xenbus_alloc_evtchn(pdev->xdev, &pdev->evtchn);
-+      if (err)
-+              goto out;
-+
-+      do_publish:
-+      err = xenbus_transaction_start(&trans);
-+      if (err) {
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error writing configuration for backend "
-+                               "(start transaction)");
-+              goto out;
-+      }
-+
-+      err = xenbus_printf(trans, pdev->xdev->nodename,
-+                          "pci-op-ref", "%u", pdev->gnt_ref);
-+      if (!err)
-+              err = xenbus_printf(trans, pdev->xdev->nodename,
-+                                  "event-channel", "%u", pdev->evtchn);
-+      if (!err)
-+              err = xenbus_printf(trans, pdev->xdev->nodename,
-+                                  "magic", XEN_PCI_MAGIC);
-+
-+      if (err) {
-+              xenbus_transaction_end(trans, 1);
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error writing configuration for backend");
-+              goto out;
-+      } else {
-+              err = xenbus_transaction_end(trans, 0);
-+              if (err == -EAGAIN)
-+                      goto do_publish;
-+              else if (err) {
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error completing transaction "
-+                                       "for backend");
-+                      goto out;
-+              }
-+      }
-+
-+      xenbus_switch_state(pdev->xdev, XenbusStateInitialised);
-+
-+      dev_dbg(&pdev->xdev->dev, "publishing successful!\n");
-+
-+      out:
-+      return err;
-+}
-+
-+static int __devinit pcifront_try_connect(struct pcifront_device *pdev)
-+{
-+      int err = -EFAULT;
-+      int i, num_roots, len;
-+      char str[64];
-+      unsigned int domain, bus;
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      /* Only connect once */
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateInitialised)
-+              goto out;
-+
-+      err = pcifront_connect(pdev);
-+      if (err) {
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error connecting PCI Frontend");
-+              goto out;
-+      }
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-+                         "root_num", "%d", &num_roots);
-+      if (err == -ENOENT) {
-+              xenbus_dev_error(pdev->xdev, err,
-+                               "No PCI Roots found, trying 0000:00");
-+              err = pcifront_scan_root(pdev, 0, 0);
-+              num_roots = 0;
-+      } else if (err != 1) {
-+              if (err == 0)
-+                      err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading number of PCI roots");
-+              goto out;
-+      }
-+
-+      for (i = 0; i < num_roots; i++) {
-+              len = snprintf(str, sizeof(str), "root-%d", i);
-+              if (unlikely(len >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
-+                                 "%x:%x", &domain, &bus);
-+              if (err != 2) {
-+                      if (err >= 0)
-+                              err = -EINVAL;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error reading PCI root %d", i);
-+                      goto out;
-+              }
-+
-+              err = pcifront_scan_root(pdev, domain, bus);
-+              if (err) {
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error scanning PCI root %04x:%02x",
-+                                       domain, bus);
-+                      goto out;
-+              }
-+      }
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateConnected);
-+      if (err)
-+              goto out;
-+
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+      return err;
-+}
-+
-+static int pcifront_try_disconnect(struct pcifront_device *pdev)
-+{
-+      int err = 0;
-+      enum xenbus_state prev_state;
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      prev_state = xenbus_read_driver_state(pdev->xdev->nodename);
-+
-+      if (prev_state >= XenbusStateClosing)
-+              goto out;
-+
-+      if(prev_state == XenbusStateConnected) {
-+              pcifront_free_roots(pdev);
-+              pcifront_disconnect(pdev);
-+      }
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateClosed);
-+
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+
-+      return err;
-+}
-+
-+static int __devinit pcifront_attach_devices(struct pcifront_device *pdev)
-+{
-+      int err = -EFAULT;
-+      int i, num_roots, len;
-+      unsigned int domain, bus;
-+      char str[64];
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateReconfiguring)
-+              goto out;
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend,
-+                         "root_num", "%d", &num_roots);
-+      if (err == -ENOENT) {
-+              xenbus_dev_error(pdev->xdev, err,
-+                               "No PCI Roots found, trying 0000:00");
-+              err = pcifront_rescan_root(pdev, 0, 0);
-+              num_roots = 0;
-+      } else if (err != 1) {
-+              if (err == 0)
-+                      err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading number of PCI roots");
-+              goto out;
-+      }
-+
-+      for (i = 0; i < num_roots; i++) {
-+              len = snprintf(str, sizeof(str), "root-%d", i);
-+              if (unlikely(len >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
-+                                 "%x:%x", &domain, &bus);
-+              if (err != 2) {
-+                      if (err >= 0)
-+                              err = -EINVAL;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error reading PCI root %d", i);
-+                      goto out;
-+              }
-+
-+              err = pcifront_rescan_root(pdev, domain, bus);
-+              if (err) {
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error scanning PCI root %04x:%02x",
-+                                       domain, bus);
-+                      goto out;
-+              }
-+      }
-+
-+      xenbus_switch_state(pdev->xdev, XenbusStateConnected);
-+
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+      return err;
-+}
-+
-+static int pcifront_detach_devices(struct pcifront_device *pdev)
-+{
-+      int err = 0;
-+      int i, num_devs;
-+      unsigned int domain, bus, slot, func;
-+      struct pci_bus *pci_bus;
-+      struct pci_dev *pci_dev;
-+      char str[64];
-+
-+      spin_lock(&pdev->dev_lock);
-+
-+      if (xenbus_read_driver_state(pdev->xdev->nodename) !=
-+          XenbusStateConnected)
-+              goto out;
-+
-+      err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, "num_devs", "%d",
-+                         &num_devs);
-+      if (err != 1) {
-+              if (err >= 0)
-+                      err = -EINVAL;
-+              xenbus_dev_fatal(pdev->xdev, err,
-+                               "Error reading number of PCI devices");
-+              goto out;
-+      }
-+
-+      /* Find devices being detached and remove them. */
-+      for (i = 0; i < num_devs; i++) {
-+              int l, state;
-+              l = snprintf(str, sizeof(str), "state-%d", i);
-+              if (unlikely(l >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str, "%d",
-+                                 &state);
-+              if (err != 1)
-+                      state = XenbusStateUnknown;
-+
-+              if (state != XenbusStateClosing)
-+                      continue;
-+
-+              /* Remove device. */
-+              l = snprintf(str, sizeof(str), "vdev-%d", i);
-+              if (unlikely(l >= (sizeof(str) - 1))) {
-+                      err = -ENOMEM;
-+                      goto out;
-+              }
-+              err = xenbus_scanf(XBT_NIL, pdev->xdev->otherend, str,
-+                                 "%x:%x:%x.%x", &domain, &bus, &slot, &func);
-+              if (err != 4) {
-+                      if (err >= 0)
-+                              err = -EINVAL;
-+                      xenbus_dev_fatal(pdev->xdev, err,
-+                                       "Error reading PCI device %d", i);
-+                      goto out;
-+              }
-+
-+              pci_bus = pci_find_bus(domain, bus);
-+              if(!pci_bus) {
-+                      dev_dbg(&pdev->xdev->dev, "Cannot get bus %04x:%02x\n",
-+                              domain, bus);
-+                      continue;
-+              }
-+              pci_dev = pci_get_slot(pci_bus, PCI_DEVFN(slot, func));
-+              if(!pci_dev) {
-+                      dev_dbg(&pdev->xdev->dev,
-+                              "Cannot get PCI device %04x:%02x:%02x.%02x\n",
-+                              domain, bus, slot, func);
-+                      continue;
-+              }
-+              pci_remove_bus_device(pci_dev);
-+              pci_dev_put(pci_dev);
-+
-+              dev_dbg(&pdev->xdev->dev,
-+                      "PCI device %04x:%02x:%02x.%02x removed.\n",
-+                      domain, bus, slot, func);
-+      }
-+
-+      err = xenbus_switch_state(pdev->xdev, XenbusStateReconfiguring);
-+
-+      out:
-+      spin_unlock(&pdev->dev_lock);
-+      return err;
-+}
-+
-+static void __init_refok pcifront_backend_changed(struct xenbus_device *xdev,
-+                                                enum xenbus_state be_state)
-+{
-+      struct pcifront_device *pdev = xdev->dev.driver_data;
-+
-+      switch (be_state) {
-+      case XenbusStateUnknown:
-+      case XenbusStateInitialising:
-+      case XenbusStateInitWait:
-+      case XenbusStateInitialised:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateConnected:
-+              pcifront_try_connect(pdev);
-+              break;
-+
-+      case XenbusStateClosing:
-+              dev_warn(&xdev->dev, "backend going away!\n");
-+              pcifront_try_disconnect(pdev);
-+              break;
-+
-+      case XenbusStateReconfiguring:
-+              pcifront_detach_devices(pdev);
-+              break;
-+
-+      case XenbusStateReconfigured:
-+              pcifront_attach_devices(pdev);
-+              break;
-+      }
-+}
-+
-+static int pcifront_xenbus_probe(struct xenbus_device *xdev,
-+                               const struct xenbus_device_id *id)
-+{
-+      int err = 0;
-+      struct pcifront_device *pdev = alloc_pdev(xdev);
-+
-+      if (pdev == NULL) {
-+              err = -ENOMEM;
-+              xenbus_dev_fatal(xdev, err,
-+                               "Error allocating pcifront_device struct");
-+              goto out;
-+      }
-+
-+      err = pcifront_publish_info(pdev);
-+
-+      out:
-+      return err;
-+}
-+
-+static int pcifront_xenbus_remove(struct xenbus_device *xdev)
-+{
-+      if (xdev->dev.driver_data)
-+              free_pdev(xdev->dev.driver_data);
-+
-+      return 0;
-+}
-+
-+static const struct xenbus_device_id xenpci_ids[] = {
-+      {"pci"},
-+      {{0}},
-+};
-+MODULE_ALIAS("xen:pci");
-+
-+static struct xenbus_driver xenbus_pcifront_driver = {
-+      .name                   = "pcifront",
-+      .owner                  = THIS_MODULE,
-+      .ids                    = xenpci_ids,
-+      .probe                  = pcifront_xenbus_probe,
-+      .remove                 = pcifront_xenbus_remove,
-+      .otherend_changed       = pcifront_backend_changed,
-+};
-+
-+static int __init pcifront_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      return xenbus_register_frontend(&xenbus_pcifront_driver);
-+}
-+
-+/* Initialize after the Xen PCI Frontend Stub is initialized */
-+subsys_initcall(pcifront_init);
-Index: head-2008-11-25/drivers/xen/privcmd/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/privcmd/Makefile       2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1,3 @@
-+
-+obj-y += privcmd.o
-+obj-$(CONFIG_COMPAT)  += compat_privcmd.o
-Index: head-2008-11-25/drivers/xen/privcmd/compat_privcmd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/privcmd/compat_privcmd.c       2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1,73 @@
-+/*
-+ * This program is free software; you can redistribute it and/or modify
-+ * it under the terms of the GNU General Public License as published by
-+ * the Free Software Foundation; either version 2 of the License, or
-+ * (at your option) any later version.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
-+ *
-+ * Copyright (C) IBM Corp. 2006
-+ *
-+ * Authors: Jimi Xenidis <jimix@watson.ibm.com>
-+ */
-+
-+#include <linux/config.h>
-+#include <linux/compat.h>
-+#include <linux/ioctl.h>
-+#include <linux/syscalls.h>
-+#include <asm/hypervisor.h>
-+#include <asm/uaccess.h>
-+#include <xen/public/privcmd.h>
-+#include <xen/compat_ioctl.h>
-+
-+int privcmd_ioctl_32(int fd, unsigned int cmd, unsigned long arg)
-+{
-+      int ret;
-+
-+      switch (cmd) {
-+      case IOCTL_PRIVCMD_MMAP_32: {
-+              struct privcmd_mmap *p;
-+              struct privcmd_mmap_32 *p32;
-+              struct privcmd_mmap_32 n32;
-+
-+              p32 = compat_ptr(arg);
-+              p = compat_alloc_user_space(sizeof(*p));
-+              if (copy_from_user(&n32, p32, sizeof(n32)) ||
-+                  put_user(n32.num, &p->num) ||
-+                  put_user(n32.dom, &p->dom) ||
-+                  put_user(compat_ptr(n32.entry), &p->entry))
-+                      return -EFAULT;
-+              
-+              ret = sys_ioctl(fd, IOCTL_PRIVCMD_MMAP, (unsigned long)p);
-+      }
-+              break;
-+      case IOCTL_PRIVCMD_MMAPBATCH_32: {
-+              struct privcmd_mmapbatch *p;
-+              struct privcmd_mmapbatch_32 *p32;
-+              struct privcmd_mmapbatch_32 n32;
-+
-+              p32 = compat_ptr(arg);
-+              p = compat_alloc_user_space(sizeof(*p));
-+              if (copy_from_user(&n32, p32, sizeof(n32)) ||
-+                  put_user(n32.num, &p->num) ||
-+                  put_user(n32.dom, &p->dom) ||
-+                  put_user(n32.addr, &p->addr) ||
-+                  put_user(compat_ptr(n32.arr), &p->arr))
-+                      return -EFAULT;
-+              
-+              ret = sys_ioctl(fd, IOCTL_PRIVCMD_MMAPBATCH, (unsigned long)p);
-+      }
-+              break;
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+      return ret;
-+}
-Index: head-2008-11-25/drivers/xen/privcmd/privcmd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/privcmd/privcmd.c      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,356 @@
-+/******************************************************************************
-+ * privcmd.c
-+ * 
-+ * Interface to privileged domain-0 commands.
-+ * 
-+ * Copyright (c) 2002-2004, K A Fraser, B Dragovic
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/sched.h>
-+#include <linux/slab.h>
-+#include <linux/string.h>
-+#include <linux/errno.h>
-+#include <linux/mm.h>
-+#include <linux/mman.h>
-+#include <linux/swap.h>
-+#include <linux/smp_lock.h>
-+#include <linux/highmem.h>
-+#include <linux/pagemap.h>
-+#include <linux/seq_file.h>
-+#include <asm/hypervisor.h>
-+
-+#include <asm/pgalloc.h>
-+#include <asm/pgtable.h>
-+#include <asm/uaccess.h>
-+#include <asm/tlb.h>
-+#include <asm/hypervisor.h>
-+#include <xen/public/privcmd.h>
-+#include <xen/interface/xen.h>
-+#include <xen/xen_proc.h>
-+#include <xen/features.h>
-+
-+static struct proc_dir_entry *privcmd_intf;
-+static struct proc_dir_entry *capabilities_intf;
-+
-+#ifndef HAVE_ARCH_PRIVCMD_MMAP
-+static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma);
-+#endif
-+
-+static long privcmd_ioctl(struct file *file,
-+                        unsigned int cmd, unsigned long data)
-+{
-+      int ret = -ENOSYS;
-+      void __user *udata = (void __user *) data;
-+
-+      switch (cmd) {
-+      case IOCTL_PRIVCMD_HYPERCALL: {
-+              privcmd_hypercall_t hypercall;
-+  
-+              if (copy_from_user(&hypercall, udata, sizeof(hypercall)))
-+                      return -EFAULT;
-+
-+#if defined(__i386__)
-+              if (hypercall.op >= (PAGE_SIZE >> 5))
-+                      break;
-+              __asm__ __volatile__ (
-+                      "pushl %%ebx; pushl %%ecx; pushl %%edx; "
-+                      "pushl %%esi; pushl %%edi; "
-+                      "movl  8(%%eax),%%ebx ;"
-+                      "movl 16(%%eax),%%ecx ;"
-+                      "movl 24(%%eax),%%edx ;"
-+                      "movl 32(%%eax),%%esi ;"
-+                      "movl 40(%%eax),%%edi ;"
-+                      "movl   (%%eax),%%eax ;"
-+                      "shll $5,%%eax ;"
-+                      "addl $hypercall_page,%%eax ;"
-+                      "call *%%eax ;"
-+                      "popl %%edi; popl %%esi; popl %%edx; "
-+                      "popl %%ecx; popl %%ebx"
-+                      : "=a" (ret) : "0" (&hypercall) : "memory" );
-+#elif defined (__x86_64__)
-+              if (hypercall.op < (PAGE_SIZE >> 5)) {
-+                      long ign1, ign2, ign3;
-+                      __asm__ __volatile__ (
-+                              "movq %8,%%r10; movq %9,%%r8;"
-+                              "shll $5,%%eax ;"
-+                              "addq $hypercall_page,%%rax ;"
-+                              "call *%%rax"
-+                              : "=a" (ret), "=D" (ign1),
-+                                "=S" (ign2), "=d" (ign3)
-+                              : "0" ((unsigned int)hypercall.op),
-+                              "1" (hypercall.arg[0]),
-+                              "2" (hypercall.arg[1]),
-+                              "3" (hypercall.arg[2]),
-+                              "g" (hypercall.arg[3]),
-+                              "g" (hypercall.arg[4])
-+                              : "r8", "r10", "memory" );
-+              }
-+#else
-+              ret = privcmd_hypercall(&hypercall);
-+#endif
-+      }
-+      break;
-+
-+      case IOCTL_PRIVCMD_MMAP: {
-+#define MMAP_NR_PER_PAGE (int)((PAGE_SIZE-sizeof(struct list_head))/sizeof(privcmd_mmap_entry_t))
-+              privcmd_mmap_t mmapcmd;
-+              privcmd_mmap_entry_t *msg;
-+              privcmd_mmap_entry_t __user *p;
-+              struct mm_struct *mm = current->mm;
-+              struct vm_area_struct *vma;
-+              unsigned long va;
-+              int i, rc;
-+              LIST_HEAD(pagelist);
-+              struct list_head *l,*l2;
-+
-+              if (!is_initial_xendomain())
-+                      return -EPERM;
-+
-+              if (copy_from_user(&mmapcmd, udata, sizeof(mmapcmd)))
-+                      return -EFAULT;
-+
-+              p = mmapcmd.entry;
-+              for (i = 0; i < mmapcmd.num;) {
-+                      int nr = min(mmapcmd.num - i, MMAP_NR_PER_PAGE);
-+
-+                      rc = -ENOMEM;
-+                      l = (struct list_head *) __get_free_page(GFP_KERNEL);
-+                      if (l == NULL)
-+                              goto mmap_out;
-+
-+                      INIT_LIST_HEAD(l);
-+                      list_add_tail(l, &pagelist);
-+                      msg = (privcmd_mmap_entry_t*)(l + 1);
-+
-+                      rc = -EFAULT;
-+                      if (copy_from_user(msg, p, nr*sizeof(*msg)))
-+                              goto mmap_out;
-+                      i += nr;
-+                      p += nr;
-+              }
-+
-+              l = pagelist.next;
-+              msg = (privcmd_mmap_entry_t*)(l + 1);
-+
-+              down_write(&mm->mmap_sem);
-+
-+              vma = find_vma(mm, msg->va);
-+              rc = -EINVAL;
-+              if (!vma || (msg->va != vma->vm_start) ||
-+                  !privcmd_enforce_singleshot_mapping(vma))
-+                      goto mmap_out;
-+
-+              va = vma->vm_start;
-+
-+              i = 0;
-+              list_for_each(l, &pagelist) {
-+                      int nr = i + min(mmapcmd.num - i, MMAP_NR_PER_PAGE);
-+
-+                      msg = (privcmd_mmap_entry_t*)(l + 1);
-+                      while (i<nr) {
-+
-+                              /* Do not allow range to wrap the address space. */
-+                              rc = -EINVAL;
-+                              if ((msg->npages > (LONG_MAX >> PAGE_SHIFT)) ||
-+                                  ((unsigned long)(msg->npages << PAGE_SHIFT) >= -va))
-+                                      goto mmap_out;
-+
-+                              /* Range chunks must be contiguous in va space. */
-+                              if ((msg->va != va) ||
-+                                  ((msg->va+(msg->npages<<PAGE_SHIFT)) > vma->vm_end))
-+                                      goto mmap_out;
-+
-+                              if ((rc = direct_remap_pfn_range(
-+                                           vma,
-+                                           msg->va & PAGE_MASK,
-+                                           msg->mfn,
-+                                           msg->npages << PAGE_SHIFT,
-+                                           vma->vm_page_prot,
-+                                           mmapcmd.dom)) < 0)
-+                                      goto mmap_out;
-+
-+                              va += msg->npages << PAGE_SHIFT;
-+                              msg++;
-+                              i++;
-+                      }
-+              }
-+
-+              rc = 0;
-+
-+      mmap_out:
-+              up_write(&mm->mmap_sem);
-+              list_for_each_safe(l,l2,&pagelist)
-+                      free_page((unsigned long)l);
-+              ret = rc;
-+      }
-+#undef MMAP_NR_PER_PAGE
-+      break;
-+
-+      case IOCTL_PRIVCMD_MMAPBATCH: {
-+#define MMAPBATCH_NR_PER_PAGE (unsigned long)((PAGE_SIZE-sizeof(struct list_head))/sizeof(unsigned long))
-+              privcmd_mmapbatch_t m;
-+              struct mm_struct *mm = current->mm;
-+              struct vm_area_struct *vma;
-+              xen_pfn_t __user *p;
-+              unsigned long addr, *mfn, nr_pages;
-+              int i;
-+              LIST_HEAD(pagelist);
-+              struct list_head *l, *l2;
-+
-+              if (!is_initial_xendomain())
-+                      return -EPERM;
-+
-+              if (copy_from_user(&m, udata, sizeof(m)))
-+                      return -EFAULT;
-+
-+              nr_pages = m.num;
-+              if ((m.num <= 0) || (nr_pages > (LONG_MAX >> PAGE_SHIFT)))
-+                      return -EINVAL;
-+
-+              p = m.arr;
-+              for (i=0; i<nr_pages; ) {
-+                      int nr = min(nr_pages - i, MMAPBATCH_NR_PER_PAGE);
-+
-+                      ret = -ENOMEM;
-+                      l = (struct list_head *)__get_free_page(GFP_KERNEL);
-+                      if (l == NULL)
-+                              goto mmapbatch_out;
-+
-+                      INIT_LIST_HEAD(l);
-+                      list_add_tail(l, &pagelist);
-+
-+                      mfn = (unsigned long*)(l + 1);
-+                      ret = -EFAULT;
-+                      if (copy_from_user(mfn, p, nr*sizeof(*mfn)))
-+                              goto mmapbatch_out;
-+
-+                      i += nr; p+= nr;
-+              }
-+
-+              down_write(&mm->mmap_sem);
-+
-+              vma = find_vma(mm, m.addr);
-+              ret = -EINVAL;
-+              if (!vma ||
-+                  (m.addr != vma->vm_start) ||
-+                  ((m.addr + (nr_pages << PAGE_SHIFT)) != vma->vm_end) ||
-+                  !privcmd_enforce_singleshot_mapping(vma)) {
-+                      up_write(&mm->mmap_sem);
-+                      goto mmapbatch_out;
-+              }
-+
-+              p = m.arr;
-+              addr = m.addr;
-+              i = 0;
-+              ret = 0;
-+              list_for_each(l, &pagelist) {
-+                      int nr = i + min(nr_pages - i, MMAPBATCH_NR_PER_PAGE);
-+                      mfn = (unsigned long *)(l + 1);
-+
-+                      while (i<nr) {
-+                              if(direct_remap_pfn_range(vma, addr & PAGE_MASK,
-+                                                        *mfn, PAGE_SIZE,
-+                                                        vma->vm_page_prot, m.dom) < 0) {
-+                                      *mfn |= 0xf0000000U;
-+                                      ret++;
-+                              }
-+                              mfn++; i++; addr += PAGE_SIZE;
-+                      }
-+              }
-+
-+              up_write(&mm->mmap_sem);
-+              if (ret > 0) {
-+                      p = m.arr;
-+                      i = 0;
-+                      ret = 0;
-+                      list_for_each(l, &pagelist) {
-+                              int nr = min(nr_pages - i, MMAPBATCH_NR_PER_PAGE);
-+                              mfn = (unsigned long *)(l + 1);
-+                              if (copy_to_user(p, mfn, nr*sizeof(*mfn)))
-+                                      ret = -EFAULT;
-+                              i += nr; p += nr;
-+                      }
-+              }
-+      mmapbatch_out:
-+              list_for_each_safe(l,l2,&pagelist)
-+                      free_page((unsigned long)l);
-+#undef MMAPBATCH_NR_PER_PAGE
-+      }
-+      break;
-+
-+      default:
-+              ret = -EINVAL;
-+              break;
-+      }
-+
-+      return ret;
-+}
-+
-+#ifndef HAVE_ARCH_PRIVCMD_MMAP
-+static struct page *privcmd_nopage(struct vm_area_struct *vma,
-+                                 unsigned long address,
-+                                 int *type)
-+{
-+      return NOPAGE_SIGBUS;
-+}
-+
-+static struct vm_operations_struct privcmd_vm_ops = {
-+      .nopage = privcmd_nopage
-+};
-+
-+static int privcmd_mmap(struct file * file, struct vm_area_struct * vma)
-+{
-+      /* Unsupported for auto-translate guests. */
-+      if (xen_feature(XENFEAT_auto_translated_physmap))
-+              return -ENOSYS;
-+
-+      /* DONTCOPY is essential for Xen as copy_page_range is broken. */
-+      vma->vm_flags |= VM_RESERVED | VM_IO | VM_DONTCOPY;
-+      vma->vm_ops = &privcmd_vm_ops;
-+      vma->vm_private_data = NULL;
-+
-+      return 0;
-+}
-+
-+static int privcmd_enforce_singleshot_mapping(struct vm_area_struct *vma)
-+{
-+      return (xchg(&vma->vm_private_data, (void *)1) == NULL);
-+}
-+#endif
-+
-+static const struct file_operations privcmd_file_ops = {
-+      .unlocked_ioctl = privcmd_ioctl,
-+      .mmap = privcmd_mmap,
-+};
-+
-+static int capabilities_read(char *page, char **start, off_t off,
-+                           int count, int *eof, void *data)
-+{
-+      int len = 0;
-+      *page = 0;
-+
-+      if (is_initial_xendomain())
-+              len = sprintf( page, "control_d\n" );
-+
-+      *eof = 1;
-+      return len;
-+}
-+
-+static int __init privcmd_init(void)
-+{
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      privcmd_intf = create_xen_proc_entry("privcmd", 0400);
-+      if (privcmd_intf != NULL)
-+              privcmd_intf->proc_fops = &privcmd_file_ops;
-+
-+      capabilities_intf = create_xen_proc_entry("capabilities", 0400 );
-+      if (capabilities_intf != NULL)
-+              capabilities_intf->read_proc = capabilities_read;
-+
-+      return 0;
-+}
-+
-+__initcall(privcmd_init);
-Index: head-2008-11-25/drivers/xen/scsiback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/Makefile      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,4 @@
-+obj-$(CONFIG_XEN_SCSI_BACKEND) := xen-scsibk.o
-+
-+xen-scsibk-y  := interface.o scsiback.o xenbus.o translate.o emulate.o
-+
-Index: head-2008-11-25/drivers/xen/scsiback/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/common.h      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,181 @@
-+/*
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * Based on the blkback driver code.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __SCSIIF__BACKEND__COMMON_H__
-+#define __SCSIIF__BACKEND__COMMON_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <linux/wait.h>
-+#include <linux/sched.h>
-+#include <linux/kthread.h>
-+#include <linux/blkdev.h>
-+#include <linux/list.h>
-+#include <linux/kthread.h>
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_cmnd.h>
-+#include <scsi/scsi_host.h>
-+#include <scsi/scsi_device.h>
-+#include <scsi/scsi_dbg.h>
-+#include <scsi/scsi_eh.h>
-+#include <asm/io.h>
-+#include <asm/setup.h>
-+#include <asm/pgalloc.h>
-+#include <asm/delay.h>
-+#include <xen/evtchn.h>
-+#include <asm/hypervisor.h>
-+#include <xen/gnttab.h>
-+#include <xen/driver_util.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/io/ring.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/interface/io/vscsiif.h>
-+
-+
-+#define DPRINTK(_f, _a...)                    \
-+      pr_debug("(file=%s, line=%d) " _f,      \
-+               __FILE__ , __LINE__ , ## _a )
-+
-+struct ids_tuple {
-+      unsigned int hst;               /* host    */
-+      unsigned int chn;               /* channel */
-+      unsigned int tgt;               /* target  */
-+      unsigned int lun;               /* LUN     */
-+};
-+
-+struct v2p_entry {
-+      struct ids_tuple v;             /* translate from */
-+      struct scsi_device *sdev;       /* translate to   */
-+      struct list_head l;
-+};
-+
-+struct vscsibk_info {
-+      struct xenbus_device *dev;
-+
-+      domid_t domid;
-+      unsigned int evtchn;
-+      unsigned int irq;
-+
-+      struct vscsiif_back_ring  ring;
-+      struct vm_struct *ring_area;
-+      grant_handle_t shmem_handle;
-+      grant_ref_t shmem_ref;
-+
-+      spinlock_t ring_lock;
-+      atomic_t nr_unreplied_reqs;
-+
-+      spinlock_t v2p_lock;
-+      struct list_head v2p_entry_lists;
-+
-+      struct task_struct *kthread;
-+      wait_queue_head_t waiting_to_free;
-+      wait_queue_head_t wq;
-+      unsigned int waiting_reqs;
-+      struct page **mmap_pages;
-+
-+};
-+
-+typedef struct {
-+      unsigned char act;
-+      struct vscsibk_info *info;
-+      struct scsi_device *sdev;
-+
-+      uint16_t rqid;
-+      
-+      uint8_t nr_segments;
-+      uint8_t cmnd[VSCSIIF_MAX_COMMAND_SIZE];
-+      uint8_t cmd_len;
-+
-+      uint8_t sc_data_direction;
-+      uint16_t timeout_per_command;
-+      
-+      uint32_t request_bufflen;
-+      struct scatterlist *sgl;
-+      grant_ref_t gref[VSCSIIF_SG_TABLESIZE];
-+
-+      int32_t rslt;
-+      uint32_t resid;
-+      uint8_t sense_buffer[VSCSIIF_SENSE_BUFFERSIZE];
-+
-+      struct list_head free_list;
-+} pending_req_t;
-+
-+
-+
-+#define scsiback_get(_b) (atomic_inc(&(_b)->nr_unreplied_reqs))
-+#define scsiback_put(_b)                              \
-+      do {                                            \
-+              if (atomic_dec_and_test(&(_b)->nr_unreplied_reqs))      \
-+                      wake_up(&(_b)->waiting_to_free);\
-+      } while (0)
-+
-+#define VSCSIIF_TIMEOUT               (900*HZ)
-+
-+
-+irqreturn_t scsiback_intr(int, void *, struct pt_regs *);
-+int scsiback_init_sring(struct vscsibk_info *info,
-+              unsigned long ring_ref, unsigned int evtchn);
-+int scsiback_schedule(void *data);
-+
-+
-+struct vscsibk_info *vscsibk_info_alloc(domid_t domid);
-+void scsiback_free(struct vscsibk_info *info);
-+void scsiback_disconnect(struct vscsibk_info *info);
-+int __init scsiback_interface_init(void);
-+void scsiback_interface_exit(void);
-+int scsiback_xenbus_init(void);
-+void scsiback_xenbus_unregister(void);
-+
-+void scsiback_init_translation_table(struct vscsibk_info *info);
-+
-+int scsiback_add_translation_entry(struct vscsibk_info *info,
-+                      struct scsi_device *sdev, struct ids_tuple *v);
-+
-+int scsiback_del_translation_entry(struct vscsibk_info *info,
-+                              struct ids_tuple *v);
-+struct scsi_device *scsiback_do_translation(struct vscsibk_info *info,
-+                      struct ids_tuple *v);
-+void scsiback_release_translation_entry(struct vscsibk_info *info);
-+
-+
-+void scsiback_cmd_exec(pending_req_t *pending_req);
-+void scsiback_do_resp_with_sense(char *sense_buffer, int32_t result,
-+                      uint32_t resid, pending_req_t *pending_req);
-+void scsiback_fast_flush_area(pending_req_t *req);
-+
-+void scsiback_rsp_emulation(pending_req_t *pending_req);
-+void scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req);
-+void scsiback_emulation_init(void);
-+
-+
-+#endif /* __SCSIIF__BACKEND__COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/scsiback/emulate.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/emulate.c     2008-08-07 12:44:36.000000000 +0200
-@@ -0,0 +1,454 @@
-+/*
-+ * Xen SCSI backend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_cmnd.h>
-+#include <scsi/scsi_device.h>
-+#include "common.h"
-+
-+/* Following SCSI commands are not defined in scsi/scsi.h */
-+#define EXTENDED_COPY         0x83    /* EXTENDED COPY command        */
-+#define REPORT_ALIASES                0xa3    /* REPORT ALIASES command       */
-+#define CHANGE_ALIASES                0xa4    /* CHANGE ALIASES command       */
-+#define SET_PRIORITY          0xa4    /* SET PRIORITY command         */
-+
-+
-+/*
-+  The bitmap in order to control emulation.
-+  (Bit 3 to 7 are reserved for future use.)
-+*/
-+#define VSCSIIF_NEED_CMD_EXEC         0x01    /* If this bit is set, cmd exec */
-+                                              /* is required.                 */
-+#define VSCSIIF_NEED_EMULATE_REQBUF   0x02    /* If this bit is set, need     */
-+                                              /* emulation reqest buff before */
-+                                              /* cmd exec.                    */
-+#define VSCSIIF_NEED_EMULATE_RSPBUF   0x04    /* If this bit is set, need     */
-+                                              /* emulation resp buff after    */
-+                                              /* cmd exec.                    */
-+
-+/* Additional Sense Code (ASC) used */
-+#define NO_ADDITIONAL_SENSE           0x0
-+#define LOGICAL_UNIT_NOT_READY                0x4
-+#define UNRECOVERED_READ_ERR          0x11
-+#define PARAMETER_LIST_LENGTH_ERR     0x1a
-+#define INVALID_OPCODE                        0x20
-+#define ADDR_OUT_OF_RANGE             0x21
-+#define INVALID_FIELD_IN_CDB          0x24
-+#define INVALID_FIELD_IN_PARAM_LIST   0x26
-+#define POWERON_RESET                 0x29
-+#define SAVING_PARAMS_UNSUP           0x39
-+#define THRESHOLD_EXCEEDED            0x5d
-+#define LOW_POWER_COND_ON             0x5e
-+
-+
-+
-+/* Number os SCSI op_code     */
-+#define VSCSI_MAX_SCSI_OP_CODE                256
-+static unsigned char bitmap[VSCSI_MAX_SCSI_OP_CODE];
-+
-+
-+
-+/*
-+  Emulation routines for each SCSI op_code.
-+*/
-+static void (*pre_function[VSCSI_MAX_SCSI_OP_CODE])(pending_req_t *, void *);
-+static void (*post_function[VSCSI_MAX_SCSI_OP_CODE])(pending_req_t *, void *);
-+
-+
-+static const int check_condition_result =
-+              (DRIVER_SENSE << 24) | SAM_STAT_CHECK_CONDITION;
-+
-+static void scsiback_mk_sense_buffer(uint8_t *data, uint8_t key,
-+                      uint8_t asc, uint8_t asq)
-+{
-+      data[0] = 0x70;  /* fixed, current */
-+      data[2] = key;
-+      data[7] = 0xa;    /* implies 18 byte sense buffer */
-+      data[12] = asc;
-+      data[13] = asq;
-+}
-+
-+static void resp_not_supported_cmd(pending_req_t *pending_req, void *data)
-+{
-+      scsiback_mk_sense_buffer(pending_req->sense_buffer, ILLEGAL_REQUEST,
-+              INVALID_OPCODE, 0);
-+      pending_req->resid = 0;
-+      pending_req->rslt  = check_condition_result;
-+}
-+
-+
-+static int __copy_to_sg(struct scatterlist *sg, unsigned int nr_sg,
-+             void *buf, unsigned int buflen)
-+{
-+      void *from = buf;
-+      void *to;
-+      unsigned int from_rest = buflen;
-+      unsigned int to_capa;
-+      unsigned int copy_size = 0;
-+      unsigned int i;
-+      unsigned long pfn;
-+
-+      for (i = 0; i < nr_sg; i++) {
-+              if (sg->page == NULL) {
-+                      printk(KERN_WARNING "%s: inconsistent length field in "
-+                             "scatterlist\n", __FUNCTION__);
-+                      return -ENOMEM;
-+              }
-+
-+              to_capa  = sg->length;
-+              copy_size = min_t(unsigned int, to_capa, from_rest);
-+
-+              pfn = page_to_pfn(sg->page);
-+              to = pfn_to_kaddr(pfn) + (sg->offset);
-+              memcpy(to, from, copy_size);
-+
-+              from_rest  -= copy_size;
-+              if (from_rest == 0) {
-+                      return 0;
-+              }
-+              
-+              sg++;
-+              from += copy_size;
-+      }
-+
-+      printk(KERN_WARNING "%s: no space in scatterlist\n",
-+             __FUNCTION__);
-+      return -ENOMEM;
-+}
-+
-+static int __copy_from_sg(struct scatterlist *sg, unsigned int nr_sg,
-+               void *buf, unsigned int buflen)
-+{
-+      void *from;
-+      void *to = buf;
-+      unsigned int from_rest;
-+      unsigned int to_capa = buflen;
-+      unsigned int copy_size;
-+      unsigned int i;
-+      unsigned long pfn;
-+
-+      for (i = 0; i < nr_sg; i++) {
-+              if (sg->page == NULL) {
-+                      printk(KERN_WARNING "%s: inconsistent length field in "
-+                             "scatterlist\n", __FUNCTION__);
-+                      return -ENOMEM;
-+              }
-+
-+              from_rest = sg->length;
-+              if ((from_rest > 0) && (to_capa < from_rest)) {
-+                      printk(KERN_WARNING
-+                             "%s: no space in destination buffer\n",
-+                             __FUNCTION__);
-+                      return -ENOMEM;
-+              }
-+              copy_size = from_rest;
-+
-+              pfn = page_to_pfn(sg->page);
-+              from = pfn_to_kaddr(pfn) + (sg->offset);
-+              memcpy(to, from, copy_size);
-+
-+              to_capa  -= copy_size;
-+              
-+              sg++;
-+              to += copy_size;
-+      }
-+
-+      return 0;
-+}
-+
-+static int __nr_luns_under_host(struct vscsibk_info *info)
-+{
-+      struct v2p_entry *entry;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      unsigned long flags;
-+      int lun_cnt = 0;
-+
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+      list_for_each_entry(entry, head, l) {
-+                      lun_cnt++;
-+      }
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+
-+      return (lun_cnt);
-+}
-+
-+
-+/* REPORT LUNS Define*/
-+#define VSCSI_REPORT_LUNS_HEADER      8
-+#define VSCSI_REPORT_LUNS_RETRY               3
-+
-+/* quoted scsi_debug.c/resp_report_luns() */
-+static void __report_luns(pending_req_t *pending_req, void *data)
-+{
-+      struct vscsibk_info *info   = pending_req->info;
-+      unsigned int        channel = pending_req->sdev->channel;
-+      unsigned int        target  = pending_req->sdev->id;
-+      unsigned int        nr_seg  = pending_req->nr_segments;
-+      unsigned char *cmd = (unsigned char *)pending_req->cmnd;
-+      
-+      unsigned char *buff = NULL;
-+      unsigned char alloc_len;
-+      unsigned int alloc_luns = 0;
-+      unsigned int req_bufflen = 0;
-+      unsigned int actual_len = 0;
-+      unsigned int retry_cnt = 0;
-+      int select_report = (int)cmd[2];
-+      int i, lun_cnt = 0, lun, upper, err = 0;
-+      
-+      struct v2p_entry *entry;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      unsigned long flags;
-+      
-+      struct scsi_lun *one_lun;
-+
-+      req_bufflen = cmd[9] + (cmd[8] << 8) + (cmd[7] << 16) + (cmd[6] << 24);
-+      if ((req_bufflen < 4) || (select_report != 0))
-+              goto fail;
-+
-+      alloc_luns = __nr_luns_under_host(info);
-+      alloc_len  = sizeof(struct scsi_lun) * alloc_luns
-+                              + VSCSI_REPORT_LUNS_HEADER;
-+retry:
-+      if ((buff = kmalloc(alloc_len, GFP_KERNEL)) == NULL) {
-+              printk(KERN_ERR "scsiback:%s kmalloc err\n", __FUNCTION__);
-+              goto fail;
-+      }
-+
-+      memset(buff, 0, alloc_len);
-+
-+      one_lun = (struct scsi_lun *) &buff[8];
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+      list_for_each_entry(entry, head, l) {
-+              if ((entry->v.chn == channel) &&
-+                  (entry->v.tgt == target)) {
-+                      
-+                      /* check overflow */
-+                      if (lun_cnt >= alloc_luns) {
-+                              spin_unlock_irqrestore(&info->v2p_lock,
-+                                                      flags);
-+
-+                              if (retry_cnt < VSCSI_REPORT_LUNS_RETRY) {
-+                                      retry_cnt++;
-+                                      if (buff)
-+                                              kfree(buff);
-+                                      goto retry;
-+                              }
-+
-+                              goto fail;
-+                      }
-+
-+                      lun = entry->v.lun;
-+                      upper = (lun >> 8) & 0x3f;
-+                      if (upper)
-+                              one_lun[lun_cnt].scsi_lun[0] = upper;
-+                      one_lun[lun_cnt].scsi_lun[1] = lun & 0xff;
-+                      lun_cnt++;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+
-+      buff[2] = ((sizeof(struct scsi_lun) * lun_cnt) >> 8) & 0xff;
-+      buff[3] = (sizeof(struct scsi_lun) * lun_cnt) & 0xff;
-+
-+      actual_len = lun_cnt * sizeof(struct scsi_lun) 
-+                              + VSCSI_REPORT_LUNS_HEADER;
-+      req_bufflen = 0;
-+      for (i = 0; i < nr_seg; i++)
-+              req_bufflen += pending_req->sgl[i].length;
-+
-+      err = __copy_to_sg(pending_req->sgl, nr_seg, buff, 
-+                              min(req_bufflen, actual_len));
-+      if (err)
-+              goto fail;
-+
-+      memset(pending_req->sense_buffer, 0, VSCSIIF_SENSE_BUFFERSIZE);
-+      pending_req->rslt = 0x00;
-+      pending_req->resid = req_bufflen - min(req_bufflen, actual_len);
-+
-+      kfree(buff);
-+      return;
-+
-+fail:
-+      scsiback_mk_sense_buffer(pending_req->sense_buffer, ILLEGAL_REQUEST,
-+              INVALID_FIELD_IN_CDB, 0);
-+      pending_req->rslt  = check_condition_result;
-+      pending_req->resid = 0;
-+      if (buff)
-+              kfree(buff);
-+      return;
-+}
-+
-+
-+
-+int __pre_do_emulation(pending_req_t *pending_req, void *data)
-+{
-+      uint8_t op_code = pending_req->cmnd[0];
-+
-+      if ((bitmap[op_code] & VSCSIIF_NEED_EMULATE_REQBUF) &&
-+          pre_function[op_code] != NULL) {
-+              pre_function[op_code](pending_req, data);
-+      }
-+
-+      /*
-+          0: no need for native driver call, so should return immediately.
-+          1: non emulation or should call native driver 
-+             after modifing the request buffer.
-+      */
-+      return !!(bitmap[op_code] & VSCSIIF_NEED_CMD_EXEC);
-+}
-+
-+void scsiback_rsp_emulation(pending_req_t *pending_req)
-+{
-+      uint8_t op_code = pending_req->cmnd[0];
-+
-+      if ((bitmap[op_code] & VSCSIIF_NEED_EMULATE_RSPBUF) &&
-+          post_function[op_code] != NULL) {
-+              post_function[op_code](pending_req, NULL);
-+      }
-+
-+      return;
-+}
-+
-+
-+void scsiback_req_emulation_or_cmdexec(pending_req_t *pending_req)
-+{
-+      if (__pre_do_emulation(pending_req, NULL)) {
-+              scsiback_cmd_exec(pending_req);
-+      }
-+      else {
-+              scsiback_fast_flush_area(pending_req);
-+              scsiback_do_resp_with_sense(pending_req->sense_buffer,
-+                pending_req->rslt, pending_req->resid, pending_req);
-+      }
-+}
-+
-+
-+/*
-+  Following are not customizable functions.
-+*/
-+void scsiback_emulation_init(void)
-+{
-+      int i;
-+
-+      /* Initialize to default state */
-+      for (i = 0; i < VSCSI_MAX_SCSI_OP_CODE; i++) {
-+              bitmap[i]        = (VSCSIIF_NEED_EMULATE_REQBUF | 
-+                                      VSCSIIF_NEED_EMULATE_RSPBUF);
-+              pre_function[i]  = resp_not_supported_cmd;
-+              post_function[i] = NULL;
-+              /* means,
-+                 - no need for pre-emulation
-+                 - no need for post-emulation
-+                 - call native driver
-+              */
-+      }
-+
-+      /*
-+        Register appropriate functions below as you need.
-+        (See scsi/scsi.h for definition of SCSI op_code.)
-+      */
-+
-+      /*
-+        This command is Non emulation.
-+      */
-+      bitmap[TEST_UNIT_READY] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[TEST_UNIT_READY] = NULL;
-+      post_function[TEST_UNIT_READY] = NULL;
-+
-+      bitmap[REZERO_UNIT] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[REZERO_UNIT] = NULL;
-+      post_function[REZERO_UNIT] = NULL;
-+
-+      bitmap[REQUEST_SENSE] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[REQUEST_SENSE] = NULL;
-+      post_function[REQUEST_SENSE] = NULL;
-+
-+      bitmap[FORMAT_UNIT] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[FORMAT_UNIT] = NULL;
-+      post_function[FORMAT_UNIT] = NULL;
-+
-+      bitmap[READ_BLOCK_LIMITS] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[READ_BLOCK_LIMITS] = NULL;
-+      post_function[READ_BLOCK_LIMITS] = NULL;
-+
-+      bitmap[READ_6] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[READ_6] = NULL;
-+      post_function[READ_6] = NULL;
-+
-+      bitmap[WRITE_6] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[WRITE_6] = NULL;
-+      post_function[WRITE_6] = NULL;
-+
-+      bitmap[WRITE_FILEMARKS] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[WRITE_FILEMARKS] = NULL;
-+      post_function[WRITE_FILEMARKS] = NULL;
-+
-+      bitmap[SPACE] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[SPACE] = NULL;
-+      post_function[SPACE] = NULL;
-+
-+      bitmap[INQUIRY] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[INQUIRY] = NULL;
-+      post_function[INQUIRY] = NULL;
-+
-+      bitmap[ERASE] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[ERASE] = NULL;
-+      post_function[ERASE] = NULL;
-+
-+      bitmap[MODE_SENSE] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[MODE_SENSE] = NULL;
-+      post_function[MODE_SENSE] = NULL;
-+
-+      bitmap[SEND_DIAGNOSTIC] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[SEND_DIAGNOSTIC] = NULL;
-+      post_function[SEND_DIAGNOSTIC] = NULL;
-+
-+      bitmap[READ_CAPACITY] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[READ_CAPACITY] = NULL;
-+      post_function[READ_CAPACITY] = NULL;
-+
-+      bitmap[READ_10] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[READ_10] = NULL;
-+      post_function[READ_10] = NULL;
-+
-+      bitmap[WRITE_10] = VSCSIIF_NEED_CMD_EXEC;
-+      pre_function[WRITE_10] = NULL;
-+      post_function[WRITE_10] = NULL;
-+
-+      /*
-+        This command is Full emulation.
-+      */
-+      pre_function[REPORT_LUNS] = __report_luns;
-+      bitmap[REPORT_LUNS] = (VSCSIIF_NEED_EMULATE_REQBUF | 
-+                                      VSCSIIF_NEED_EMULATE_RSPBUF);
-+
-+      return;
-+}
-Index: head-2008-11-25/drivers/xen/scsiback/interface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/interface.c   2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,182 @@
-+/*
-+ * interface management.
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * Based on the blkback driver code.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_host.h>
-+#include <scsi/scsi_device.h>
-+#include "common.h"
-+
-+#include <xen/evtchn.h>
-+#include <linux/kthread.h>
-+
-+
-+static kmem_cache_t *scsiback_cachep;
-+
-+struct vscsibk_info *vscsibk_info_alloc(domid_t domid)
-+{
-+      struct vscsibk_info *info;
-+
-+      info = kmem_cache_alloc(scsiback_cachep, GFP_KERNEL);
-+      if (!info)
-+              return ERR_PTR(-ENOMEM);
-+
-+      memset(info, 0, sizeof(*info));
-+      info->domid = domid;
-+      spin_lock_init(&info->ring_lock);
-+      atomic_set(&info->nr_unreplied_reqs, 0);
-+      init_waitqueue_head(&info->wq);
-+      init_waitqueue_head(&info->waiting_to_free);
-+
-+      return info;
-+}
-+
-+static int map_frontend_page( struct vscsibk_info *info,
-+                              unsigned long ring_ref)
-+{
-+      struct gnttab_map_grant_ref op;
-+      int err;
-+
-+      gnttab_set_map_op(&op, (unsigned long)info->ring_area->addr,
-+                              GNTMAP_host_map, ring_ref,
-+                              info->domid);
-+
-+      err = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1);
-+      BUG_ON(err);
-+
-+      if (op.status) {
-+              printk(KERN_ERR "scsiback: Grant table operation failure !\n");
-+              return op.status;
-+      }
-+
-+      info->shmem_ref    = ring_ref;
-+      info->shmem_handle = op.handle;
-+
-+      return (GNTST_okay);
-+}
-+
-+static void unmap_frontend_page(struct vscsibk_info *info)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+      int err;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)info->ring_area->addr,
-+                              GNTMAP_host_map, info->shmem_handle);
-+
-+      err = HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1);
-+      BUG_ON(err);
-+
-+}
-+
-+int scsiback_init_sring(struct vscsibk_info *info,
-+              unsigned long ring_ref, unsigned int evtchn)
-+{
-+      struct vscsiif_sring *sring;
-+      int err;
-+
-+      if (info->irq) {
-+              printk(KERN_ERR "scsiback: Already connected through?\n");
-+              return -1;
-+      }
-+
-+      info->ring_area = alloc_vm_area(PAGE_SIZE);
-+      if (!info)
-+              return -ENOMEM;
-+
-+      err = map_frontend_page(info, ring_ref);
-+      if (err)
-+              goto free_vm;
-+
-+      sring = (struct vscsiif_sring *) info->ring_area->addr;
-+      BACK_RING_INIT(&info->ring, sring, PAGE_SIZE);
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+                      info->domid, evtchn,
-+                      scsiback_intr, 0, "vscsiif-backend", info);
-+
-+      if (err < 0)
-+              goto unmap_page;
-+              
-+      info->irq = err;
-+
-+      return 0;
-+
-+unmap_page:
-+      unmap_frontend_page(info);
-+free_vm:
-+      free_vm_area(info->ring_area);
-+
-+      return err;
-+}
-+
-+void scsiback_disconnect(struct vscsibk_info *info)
-+{
-+      if (info->kthread) {
-+              kthread_stop(info->kthread);
-+              info->kthread = NULL;
-+      }
-+
-+      wait_event(info->waiting_to_free, 
-+              atomic_read(&info->nr_unreplied_reqs) == 0);
-+
-+      if (info->irq) {
-+              unbind_from_irqhandler(info->irq, info);
-+              info->irq = 0;
-+      }
-+
-+      if (info->ring.sring) {
-+              unmap_frontend_page(info);
-+              free_vm_area(info->ring_area);
-+              info->ring.sring = NULL;
-+      }
-+}
-+
-+void scsiback_free(struct vscsibk_info *info)
-+{
-+      kmem_cache_free(scsiback_cachep, info);
-+}
-+
-+int __init scsiback_interface_init(void)
-+{
-+      scsiback_cachep = kmem_cache_create("vscsiif_cache",
-+              sizeof(struct vscsibk_info), 0, 0, NULL, NULL);
-+      if (!scsiback_cachep) {
-+              printk(KERN_ERR "scsiback: can't init scsi cache\n");
-+              return -ENOMEM;
-+      }
-+      
-+      return 0;
-+}
-+
-+void scsiback_interface_exit(void)
-+{
-+      kmem_cache_destroy(scsiback_cachep);
-+}
-Index: head-2008-11-25/drivers/xen/scsiback/scsiback.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/scsiback.c    2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,717 @@
-+/*
-+ * Xen SCSI backend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * Based on the blkback driver code.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/spinlock.h>
-+#include <linux/kthread.h>
-+#include <linux/list.h>
-+#include <linux/delay.h>
-+#include <xen/balloon.h>
-+#include <asm/hypervisor.h>
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_cmnd.h>
-+#include <scsi/scsi_host.h>
-+#include <scsi/scsi_device.h>
-+#include <scsi/scsi_dbg.h>
-+#include <scsi/scsi_eh.h>
-+
-+#include "common.h"
-+
-+
-+struct list_head pending_free;
-+DEFINE_SPINLOCK(pending_free_lock);
-+DECLARE_WAIT_QUEUE_HEAD(pending_free_wq);
-+
-+int vscsiif_reqs = VSCSIIF_BACK_MAX_PENDING_REQS;
-+module_param_named(reqs, vscsiif_reqs, int, 0);
-+MODULE_PARM_DESC(reqs, "Number of scsiback requests to allocate");
-+
-+static unsigned int log_print_stat = 0;
-+module_param(log_print_stat, int, 0644);
-+
-+#define SCSIBACK_INVALID_HANDLE (~0)
-+
-+static pending_req_t *pending_reqs;
-+static struct page **pending_pages;
-+static grant_handle_t *pending_grant_handles;
-+
-+static int vaddr_pagenr(pending_req_t *req, int seg)
-+{
-+      return (req - pending_reqs) * VSCSIIF_SG_TABLESIZE + seg;
-+}
-+
-+static unsigned long vaddr(pending_req_t *req, int seg)
-+{
-+      unsigned long pfn = page_to_pfn(pending_pages[vaddr_pagenr(req, seg)]);
-+      return (unsigned long)pfn_to_kaddr(pfn);
-+}
-+
-+#define pending_handle(_req, _seg) \
-+      (pending_grant_handles[vaddr_pagenr(_req, _seg)])
-+
-+
-+void scsiback_fast_flush_area(pending_req_t *req)
-+{
-+      struct gnttab_unmap_grant_ref unmap[VSCSIIF_SG_TABLESIZE];
-+      unsigned int i, invcount = 0;
-+      grant_handle_t handle;
-+      int err;
-+
-+      if (req->nr_segments) {
-+              for (i = 0; i < req->nr_segments; i++) {
-+                      handle = pending_handle(req, i);
-+                      if (handle == SCSIBACK_INVALID_HANDLE)
-+                              continue;
-+                      gnttab_set_unmap_op(&unmap[i], vaddr(req, i),
-+                                              GNTMAP_host_map, handle);
-+                      pending_handle(req, i) = SCSIBACK_INVALID_HANDLE;
-+                      invcount++;
-+              }
-+
-+              err = HYPERVISOR_grant_table_op(
-+                      GNTTABOP_unmap_grant_ref, unmap, invcount);
-+              BUG_ON(err);
-+              kfree(req->sgl);
-+      }
-+
-+      return;
-+}
-+
-+
-+static pending_req_t * alloc_req(struct vscsibk_info *info)
-+{
-+      pending_req_t *req = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+      if (!list_empty(&pending_free)) {
-+              req = list_entry(pending_free.next, pending_req_t, free_list);
-+              list_del(&req->free_list);
-+      }
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+      return req;
-+}
-+
-+
-+static void free_req(pending_req_t *req)
-+{
-+      unsigned long flags;
-+      int was_empty;
-+
-+      spin_lock_irqsave(&pending_free_lock, flags);
-+      was_empty = list_empty(&pending_free);
-+      list_add(&req->free_list, &pending_free);
-+      spin_unlock_irqrestore(&pending_free_lock, flags);
-+      if (was_empty)
-+              wake_up(&pending_free_wq);
-+}
-+
-+
-+static void scsiback_notify_work(struct vscsibk_info *info)
-+{
-+      info->waiting_reqs = 1;
-+      wake_up(&info->wq);
-+}
-+
-+void scsiback_do_resp_with_sense(char *sense_buffer, int32_t result,
-+                      uint32_t resid, pending_req_t *pending_req)
-+{
-+      vscsiif_response_t *ring_res;
-+      struct vscsibk_info *info = pending_req->info;
-+      int notify;
-+      int more_to_do = 1;
-+      unsigned long flags;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      spin_lock_irqsave(&info->ring_lock, flags);
-+
-+      ring_res = RING_GET_RESPONSE(&info->ring, info->ring.rsp_prod_pvt);
-+      info->ring.rsp_prod_pvt++;
-+
-+      ring_res->rslt   = result;
-+      ring_res->rqid   = pending_req->rqid;
-+
-+      if (sense_buffer != NULL) {
-+              memcpy(ring_res->sense_buffer, sense_buffer,
-+                              VSCSIIF_SENSE_BUFFERSIZE);
-+              ring_res->sense_len = VSCSIIF_SENSE_BUFFERSIZE;
-+      } else {
-+              ring_res->sense_len = 0;
-+      }
-+
-+      ring_res->residual_len = resid;
-+
-+      RING_PUSH_RESPONSES_AND_CHECK_NOTIFY(&info->ring, notify);
-+      if (info->ring.rsp_prod_pvt == info->ring.req_cons) {
-+              RING_FINAL_CHECK_FOR_REQUESTS(&info->ring, more_to_do);
-+      } else if (RING_HAS_UNCONSUMED_REQUESTS(&info->ring)) {
-+              more_to_do = 1;
-+      }
-+      
-+      spin_unlock_irqrestore(&info->ring_lock, flags);
-+
-+      if (more_to_do)
-+              scsiback_notify_work(info);
-+
-+      if (notify)
-+              notify_remote_via_irq(info->irq);
-+
-+      free_req(pending_req);
-+}
-+
-+static void scsiback_print_status(char *sense_buffer, int errors,
-+                                      pending_req_t *pending_req)
-+{
-+      struct scsi_device *sdev = pending_req->sdev;
-+      
-+      printk(KERN_ERR "scsiback: %d:%d:%d:%d ",sdev->host->host_no,
-+                      sdev->channel, sdev->id, sdev->lun);
-+      printk(KERN_ERR "status = 0x%02x, message = 0x%02x, host = 0x%02x, driver = 0x%02x\n",
-+                      status_byte(errors), msg_byte(errors),
-+                      host_byte(errors), driver_byte(errors));
-+
-+      printk(KERN_ERR "scsiback: cmnd[0]=0x%02X\n",
-+                      pending_req->cmnd[0]);
-+
-+      if (CHECK_CONDITION & status_byte(errors))
-+              __scsi_print_sense("scsiback", sense_buffer, SCSI_SENSE_BUFFERSIZE);
-+}
-+
-+
-+static void scsiback_cmd_done(struct request *req, int errors)
-+{
-+      pending_req_t *pending_req = req->end_io_data;
-+      unsigned char *sense_buffer;
-+      unsigned int resid;
-+
-+      sense_buffer = req->sense;
-+      resid        = req->data_len;
-+
-+      if (errors != 0) {
-+              if (log_print_stat)
-+                      scsiback_print_status(sense_buffer, errors, pending_req);
-+      }
-+
-+      scsiback_rsp_emulation(pending_req);
-+
-+      scsiback_fast_flush_area(pending_req);
-+      scsiback_do_resp_with_sense(sense_buffer, errors, resid, pending_req);
-+      scsiback_put(pending_req->info);
-+
-+      __blk_put_request(req->q, req);
-+}
-+
-+
-+static int scsiback_gnttab_data_map(vscsiif_request_t *ring_req,
-+                                      pending_req_t *pending_req)
-+{
-+      u32 flags;
-+      int write;
-+      int i, err = 0;
-+      unsigned int data_len = 0;
-+      struct gnttab_map_grant_ref map[VSCSIIF_SG_TABLESIZE];
-+      struct vscsibk_info *info   = pending_req->info;
-+
-+      int data_dir = (int)pending_req->sc_data_direction;
-+      unsigned int nr_segments = (unsigned int)pending_req->nr_segments;
-+
-+      write = (data_dir == DMA_TO_DEVICE);
-+
-+      if (nr_segments) {
-+              /* free of (sgl) in fast_flush_area()*/
-+              pending_req->sgl = kmalloc(sizeof(struct scatterlist) * nr_segments,
-+                                              GFP_KERNEL);
-+              if (!pending_req->sgl) {
-+                      printk(KERN_ERR "scsiback: %s: kmalloc() error.\n", __FUNCTION__);
-+                      return -ENOMEM;
-+              }
-+
-+              for (i = 0; i < nr_segments; i++) {
-+                      flags = GNTMAP_host_map;
-+                      if (write)
-+                              flags |= GNTMAP_readonly;
-+                      gnttab_set_map_op(&map[i], vaddr(pending_req, i), flags,
-+                                              ring_req->seg[i].gref,
-+                                              info->domid);
-+              }
-+
-+              err = HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, map, nr_segments);
-+              BUG_ON(err);
-+
-+              for (i = 0; i < nr_segments; i++) {
-+                      if (unlikely(map[i].status != 0)) {
-+                              printk(KERN_ERR "scsiback: invalid buffer -- could not remap it\n");
-+                              map[i].handle = SCSIBACK_INVALID_HANDLE;
-+                              err |= 1;
-+                      }
-+
-+                      pending_handle(pending_req, i) = map[i].handle;
-+
-+                      if (err)
-+                              continue;
-+
-+                      set_phys_to_machine(__pa(vaddr(
-+                              pending_req, i)) >> PAGE_SHIFT,
-+                              FOREIGN_FRAME(map[i].dev_bus_addr >> PAGE_SHIFT));
-+
-+                      pending_req->sgl[i].page   = virt_to_page(vaddr(pending_req, i));
-+                      pending_req->sgl[i].offset = ring_req->seg[i].offset;
-+                      pending_req->sgl[i].length = ring_req->seg[i].length;
-+                      data_len += pending_req->sgl[i].length;
-+
-+                      barrier();
-+                      if (pending_req->sgl[i].offset >= PAGE_SIZE ||
-+                          pending_req->sgl[i].length > PAGE_SIZE ||
-+                          pending_req->sgl[i].offset + pending_req->sgl[i].length > PAGE_SIZE)
-+                              err |= 1;
-+
-+              }
-+
-+              if (err)
-+                      goto fail_flush;
-+      }
-+      
-+      pending_req->request_bufflen = data_len;
-+      
-+      return 0;
-+      
-+fail_flush:
-+      scsiback_fast_flush_area(pending_req);
-+      return -ENOMEM;
-+}
-+
-+/* quoted scsi_lib.c/scsi_merge_bio */
-+static int scsiback_merge_bio(struct request *rq, struct bio *bio)
-+{
-+      struct request_queue *q = rq->q;
-+
-+      bio->bi_flags &= ~(1 << BIO_SEG_VALID);
-+      if (rq_data_dir(rq) == WRITE)
-+              bio->bi_rw |= (1 << BIO_RW);
-+
-+      blk_queue_bounce(q, &bio);
-+
-+      if (!rq->bio)
-+              blk_rq_bio_prep(q, rq, bio);
-+      else if (!q->back_merge_fn(q, rq, bio))
-+              return -EINVAL;
-+      else {
-+              rq->biotail->bi_next = bio;
-+              rq->biotail          = bio;
-+              rq->hard_nr_sectors += bio_sectors(bio);
-+              rq->nr_sectors       = rq->hard_nr_sectors;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/* quoted scsi_lib.c/scsi_bi_endio */
-+static int scsiback_bi_endio(struct bio *bio, unsigned int bytes_done, int error)
-+{
-+      if (bio->bi_size)
-+              return 1;
-+
-+      bio_put(bio);
-+      return 0;
-+}
-+
-+
-+
-+/* quoted scsi_lib.c/scsi_req_map_sg . */
-+static int request_map_sg(struct request *rq, pending_req_t *pending_req, unsigned int count)
-+{
-+      struct request_queue *q = rq->q;
-+      int nr_pages;
-+      unsigned int nsegs = count;
-+
-+      unsigned int data_len = 0, len, bytes, off;
-+      struct page *page;
-+      struct bio *bio = NULL;
-+      int i, err, nr_vecs = 0;
-+
-+      for (i = 0; i < nsegs; i++) {
-+              page = pending_req->sgl[i].page;
-+              off = (unsigned int)pending_req->sgl[i].offset;
-+              len = (unsigned int)pending_req->sgl[i].length;
-+              data_len += len;
-+
-+              nr_pages = (len + off + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+              while (len > 0) {
-+                      bytes = min_t(unsigned int, len, PAGE_SIZE - off);
-+
-+                      if (!bio) {
-+                              nr_vecs = min_t(int, BIO_MAX_PAGES, nr_pages);
-+                              nr_pages -= nr_vecs;
-+                              bio = bio_alloc(GFP_KERNEL, nr_vecs);
-+                              if (!bio) {
-+                                      err = -ENOMEM;
-+                                      goto free_bios;
-+                              }
-+                              bio->bi_end_io = scsiback_bi_endio;
-+                      }
-+
-+                      if (bio_add_pc_page(q, bio, page, bytes, off) !=
-+                                              bytes) {
-+                              bio_put(bio);
-+                              err = -EINVAL;
-+                              goto free_bios;
-+                      }
-+
-+                      if (bio->bi_vcnt >= nr_vecs) {
-+                              err = scsiback_merge_bio(rq, bio);
-+                              if (err) {
-+                                      bio_endio(bio, bio->bi_size, 0);
-+                                      goto free_bios;
-+                              }
-+                              bio = NULL;
-+                      }
-+
-+                      page++;
-+                      len -= bytes;
-+                      off = 0;
-+              }
-+      }
-+
-+      rq->buffer   = rq->data = NULL;
-+      rq->data_len = data_len;
-+
-+      return 0;
-+
-+free_bios:
-+      while ((bio = rq->bio) != NULL) {
-+              rq->bio = bio->bi_next;
-+              /*
-+               * call endio instead of bio_put incase it was bounced
-+               */
-+              bio_endio(bio, bio->bi_size, 0);
-+      }
-+
-+      return err;
-+}
-+
-+
-+void scsiback_cmd_exec(pending_req_t *pending_req)
-+{
-+      int cmd_len  = (int)pending_req->cmd_len;
-+      int data_dir = (int)pending_req->sc_data_direction;
-+      unsigned int nr_segments = (unsigned int)pending_req->nr_segments;
-+      unsigned int timeout;
-+      struct request *rq;
-+      int write;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      /* because it doesn't timeout backend earlier than frontend.*/
-+      if (pending_req->timeout_per_command)
-+              timeout = pending_req->timeout_per_command * HZ;
-+      else
-+              timeout = VSCSIIF_TIMEOUT;
-+
-+      write = (data_dir == DMA_TO_DEVICE);
-+      rq = blk_get_request(pending_req->sdev->request_queue, write, GFP_KERNEL);
-+
-+      rq->flags  |= REQ_BLOCK_PC;
-+      rq->cmd_len = cmd_len;
-+      memcpy(rq->cmd, pending_req->cmnd, cmd_len);
-+
-+      memset(pending_req->sense_buffer, 0, VSCSIIF_SENSE_BUFFERSIZE);
-+      rq->sense       = pending_req->sense_buffer;
-+      rq->sense_len = 0;
-+
-+      /* not allowed to retry in backend.                   */
-+      rq->retries   = 0;
-+      rq->timeout   = timeout;
-+      rq->end_io_data = pending_req;
-+
-+      if (nr_segments) {
-+
-+              if (request_map_sg(rq, pending_req, nr_segments)) {
-+                      printk(KERN_ERR "scsiback: SG Request Map Error\n");
-+                      return;
-+              }
-+      }
-+
-+      scsiback_get(pending_req->info);
-+      blk_execute_rq_nowait(rq->q, NULL, rq, 1, scsiback_cmd_done);
-+
-+      return ;
-+}
-+
-+
-+static void scsiback_device_reset_exec(pending_req_t *pending_req)
-+{
-+      struct vscsibk_info *info = pending_req->info;
-+      int err;
-+      struct scsi_device *sdev = pending_req->sdev;
-+
-+      scsiback_get(info);
-+      err = scsi_reset_provider(sdev, SCSI_TRY_RESET_DEVICE);
-+
-+      scsiback_do_resp_with_sense(NULL, err, 0, pending_req);
-+      scsiback_put(info);
-+
-+      return;
-+}
-+
-+
-+irqreturn_t scsiback_intr(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      scsiback_notify_work((struct vscsibk_info *)dev_id);
-+      return IRQ_HANDLED;
-+}
-+
-+static int prepare_pending_reqs(struct vscsibk_info *info,
-+              vscsiif_request_t *ring_req, pending_req_t *pending_req)
-+{
-+      struct scsi_device *sdev;
-+      struct ids_tuple vir;
-+      int err = -EINVAL;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      pending_req->rqid       = ring_req->rqid;
-+      pending_req->act        = ring_req->act;
-+
-+      pending_req->info       = info;
-+
-+      vir.chn = ring_req->channel;
-+      vir.tgt = ring_req->id;
-+      vir.lun = ring_req->lun;
-+
-+      rmb();
-+      sdev = scsiback_do_translation(info, &vir);
-+      if (!sdev) {
-+              pending_req->sdev = NULL;
-+              DPRINTK("scsiback: doesn't exist.\n");
-+              err = -ENODEV;
-+              goto invalid_value;
-+      }
-+      pending_req->sdev = sdev;
-+
-+      /* request range check from frontend */
-+      pending_req->sc_data_direction = ring_req->sc_data_direction;
-+      barrier();
-+      if ((pending_req->sc_data_direction != DMA_BIDIRECTIONAL) &&
-+              (pending_req->sc_data_direction != DMA_TO_DEVICE) &&
-+              (pending_req->sc_data_direction != DMA_FROM_DEVICE) &&
-+              (pending_req->sc_data_direction != DMA_NONE)) {
-+              DPRINTK("scsiback: invalid parameter data_dir = %d\n",
-+                      pending_req->sc_data_direction);
-+              err = -EINVAL;
-+              goto invalid_value;
-+      }
-+
-+      pending_req->nr_segments = ring_req->nr_segments;
-+      barrier();
-+      if (pending_req->nr_segments > VSCSIIF_SG_TABLESIZE) {
-+              DPRINTK("scsiback: invalid parameter nr_seg = %d\n",
-+                      pending_req->nr_segments);
-+              err = -EINVAL;
-+              goto invalid_value;
-+      }
-+
-+      pending_req->cmd_len = ring_req->cmd_len;
-+      barrier();
-+      if (pending_req->cmd_len > VSCSIIF_MAX_COMMAND_SIZE) {
-+              DPRINTK("scsiback: invalid parameter cmd_len = %d\n",
-+                      pending_req->cmd_len);
-+              err = -EINVAL;
-+              goto invalid_value;
-+      }
-+      memcpy(pending_req->cmnd, ring_req->cmnd, pending_req->cmd_len);
-+      
-+      pending_req->timeout_per_command = ring_req->timeout_per_command;
-+
-+      if(scsiback_gnttab_data_map(ring_req, pending_req)) {
-+              DPRINTK("scsiback: invalid buffer\n");
-+              err = -EINVAL;
-+              goto invalid_value;
-+      }
-+
-+      return 0;
-+
-+invalid_value:
-+      return err;
-+}
-+
-+
-+static int scsiback_do_cmd_fn(struct vscsibk_info *info)
-+{
-+      struct vscsiif_back_ring *ring = &info->ring;
-+      vscsiif_request_t  *ring_req;
-+
-+      pending_req_t *pending_req;
-+      RING_IDX rc, rp;
-+      int err, more_to_do = 0;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      rc = ring->req_cons;
-+      rp = ring->sring->req_prod;
-+      rmb();
-+
-+      while ((rc != rp)) {
-+              if (RING_REQUEST_CONS_OVERFLOW(ring, rc))
-+                      break;
-+              pending_req = alloc_req(info);
-+              if (NULL == pending_req) {
-+                      more_to_do = 1;
-+                      break;
-+              }
-+
-+              ring_req = RING_GET_REQUEST(ring, rc);
-+              ring->req_cons = ++rc;
-+
-+              err = prepare_pending_reqs(info, ring_req,
-+                                              pending_req);
-+              if (err == -EINVAL) {
-+                      scsiback_do_resp_with_sense(NULL, (DRIVER_ERROR << 24),
-+                              0, pending_req);
-+                      continue;
-+              } else if (err == -ENODEV) {
-+                      scsiback_do_resp_with_sense(NULL, (DID_NO_CONNECT << 16),
-+                              0, pending_req);
-+                      continue;
-+              }
-+
-+              if (pending_req->act == VSCSIIF_ACT_SCSI_CDB) {
-+                      scsiback_req_emulation_or_cmdexec(pending_req);
-+              } else if (pending_req->act == VSCSIIF_ACT_SCSI_RESET) {
-+                      scsiback_device_reset_exec(pending_req);
-+              } else {
-+                      printk(KERN_ERR "scsiback: invalid parameter for request\n");
-+                      scsiback_do_resp_with_sense(NULL, (DRIVER_ERROR << 24),
-+                              0, pending_req);
-+                      continue;
-+              }
-+      }
-+
-+      if (RING_HAS_UNCONSUMED_REQUESTS(ring))
-+              more_to_do = 1;
-+
-+      /* Yield point for this unbounded loop. */
-+      cond_resched();
-+
-+      return more_to_do;
-+}
-+
-+
-+int scsiback_schedule(void *data)
-+{
-+      struct vscsibk_info *info = (struct vscsibk_info *)data;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      while (!kthread_should_stop()) {
-+              wait_event_interruptible(
-+                      info->wq,
-+                      info->waiting_reqs || kthread_should_stop());
-+              wait_event_interruptible(
-+                      pending_free_wq,
-+                      !list_empty(&pending_free) || kthread_should_stop());
-+
-+              info->waiting_reqs = 0;
-+              smp_mb();
-+
-+              if (scsiback_do_cmd_fn(info))
-+                      info->waiting_reqs = 1;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+static int __init scsiback_init(void)
-+{
-+      int i, mmap_pages;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      mmap_pages = vscsiif_reqs * VSCSIIF_SG_TABLESIZE;
-+
-+      pending_reqs          = kmalloc(sizeof(pending_reqs[0]) *
-+                                      vscsiif_reqs, GFP_KERNEL);
-+      pending_grant_handles = kmalloc(sizeof(pending_grant_handles[0]) *
-+                                      mmap_pages, GFP_KERNEL);
-+      pending_pages         = alloc_empty_pages_and_pagevec(mmap_pages);
-+
-+      if (!pending_reqs || !pending_grant_handles || !pending_pages)
-+              goto out_of_memory;
-+
-+      for (i = 0; i < mmap_pages; i++)
-+              pending_grant_handles[i] = SCSIBACK_INVALID_HANDLE;
-+
-+      if (scsiback_interface_init() < 0)
-+              goto out_of_kmem;
-+
-+      memset(pending_reqs, 0, sizeof(pending_reqs));
-+      INIT_LIST_HEAD(&pending_free);
-+
-+      for (i = 0; i < vscsiif_reqs; i++)
-+              list_add_tail(&pending_reqs[i].free_list, &pending_free);
-+
-+      if (scsiback_xenbus_init())
-+              goto out_of_xenbus;
-+
-+      scsiback_emulation_init();
-+
-+      return 0;
-+
-+out_of_xenbus:
-+      scsiback_xenbus_unregister();
-+out_of_kmem:
-+      scsiback_interface_exit();
-+out_of_memory:
-+      kfree(pending_reqs);
-+      kfree(pending_grant_handles);
-+      free_empty_pages_and_pagevec(pending_pages, mmap_pages);
-+      printk(KERN_ERR "scsiback: %s: out of memory\n", __FUNCTION__);
-+      return -ENOMEM;
-+}
-+
-+static void __exit scsiback_exit(void)
-+{
-+      scsiback_xenbus_unregister();
-+      scsiback_interface_exit();
-+      kfree(pending_reqs);
-+      kfree(pending_grant_handles);
-+      free_empty_pages_and_pagevec(pending_pages, (vscsiif_reqs * VSCSIIF_SG_TABLESIZE));
-+
-+}
-+
-+module_init(scsiback_init);
-+module_exit(scsiback_exit);
-+
-+MODULE_DESCRIPTION("Xen SCSI backend driver");
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/scsiback/translate.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/translate.c   2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,168 @@
-+/*
-+ * Xen SCSI backend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/list.h>
-+#include <linux/gfp.h>
-+
-+#include "common.h"
-+
-+/*
-+  Initialize the translation entry list
-+*/
-+void scsiback_init_translation_table(struct vscsibk_info *info)
-+{
-+      INIT_LIST_HEAD(&info->v2p_entry_lists);
-+      spin_lock_init(&info->v2p_lock);
-+}
-+
-+
-+/*
-+  Add a new translation entry
-+*/
-+int scsiback_add_translation_entry(struct vscsibk_info *info,
-+                      struct scsi_device *sdev, struct ids_tuple *v)
-+{
-+      int err = 0;
-+      struct v2p_entry *entry;
-+      struct v2p_entry *new;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      unsigned long flags;
-+      
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+
-+      /* Check double assignment to identical virtual ID */
-+      list_for_each_entry(entry, head, l) {
-+              if ((entry->v.chn == v->chn) &&
-+                  (entry->v.tgt == v->tgt) &&
-+                  (entry->v.lun == v->lun)) {
-+                      printk(KERN_WARNING "scsiback: Virtual ID is already used. "
-+                             "Assignment was not performed.\n");
-+                      err = -EEXIST;
-+                      goto out;
-+              }
-+
-+      }
-+
-+      /* Create a new translation entry and add to the list */
-+      if ((new = kmalloc(sizeof(struct v2p_entry), GFP_ATOMIC)) == NULL) {
-+              printk(KERN_ERR "scsiback: %s: kmalloc() error.\n", __FUNCTION__);
-+              err = -ENOMEM;
-+              goto out;
-+      }
-+      new->v = *v;
-+      new->sdev = sdev;
-+      list_add_tail(&new->l, head);
-+
-+out:  
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+      return err;
-+}
-+
-+
-+/*
-+  Delete the translation entry specfied
-+*/
-+int scsiback_del_translation_entry(struct vscsibk_info *info,
-+                              struct ids_tuple *v)
-+{
-+      struct v2p_entry *entry;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+      /* Find out the translation entry specified */
-+      list_for_each_entry(entry, head, l) {
-+              if ((entry->v.chn == v->chn) &&
-+                  (entry->v.tgt == v->tgt) &&
-+                  (entry->v.lun == v->lun)) {
-+                      goto found;
-+              }
-+      }
-+
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+      return 1;
-+
-+found:
-+      /* Delete the translation entry specfied */
-+      scsi_device_put(entry->sdev);
-+      list_del(&entry->l);
-+      kfree(entry);
-+
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+      return 0;
-+}
-+
-+
-+/*
-+  Perform virtual to physical translation
-+*/
-+struct scsi_device *scsiback_do_translation(struct vscsibk_info *info,
-+                      struct ids_tuple *v)
-+{
-+      struct v2p_entry *entry;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      struct scsi_device *sdev = NULL;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+      list_for_each_entry(entry, head, l) {
-+              if ((entry->v.chn == v->chn) &&
-+                  (entry->v.tgt == v->tgt) &&
-+                  (entry->v.lun == v->lun)) {
-+                      sdev = entry->sdev;
-+                      goto out;
-+              }
-+      }
-+out:
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+      return sdev;
-+}
-+
-+
-+/*
-+  Release the translation entry specfied
-+*/
-+void scsiback_release_translation_entry(struct vscsibk_info *info)
-+{
-+      struct v2p_entry *entry, *tmp;
-+      struct list_head *head = &(info->v2p_entry_lists);
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->v2p_lock, flags);
-+      list_for_each_entry_safe(entry, tmp, head, l) {
-+              scsi_device_put(entry->sdev);
-+              list_del(&entry->l);
-+              kfree(entry);
-+      }
-+
-+      spin_unlock_irqrestore(&info->v2p_lock, flags);
-+      return;
-+
-+}
-Index: head-2008-11-25/drivers/xen/scsiback/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsiback/xenbus.c      2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,368 @@
-+/*
-+ * Xen SCSI backend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * Based on the blkback driver code.
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <stdarg.h>
-+#include <linux/module.h>
-+#include <linux/kthread.h>
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_host.h>
-+#include <scsi/scsi_device.h>
-+
-+#include "common.h"
-+
-+struct backend_info
-+{
-+      struct xenbus_device *dev;
-+      struct vscsibk_info *info;
-+};
-+
-+
-+static int __vscsiif_name(struct backend_info *be, char *buf)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned int domid, id;
-+
-+      sscanf(dev->nodename, "backend/vscsi/%u/%u", &domid, &id);
-+      snprintf(buf, TASK_COMM_LEN, "vscsi.%u.%u", be->info->domid, id);
-+
-+      return 0;
-+}
-+
-+static int scsiback_map(struct backend_info *be)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long ring_ref;
-+      unsigned int evtchn;
-+      int err;
-+      char name[TASK_COMM_LEN];
-+
-+      err = xenbus_gather(XBT_NIL, dev->otherend,
-+                      "ring-ref", "%lu", &ring_ref,
-+                      "event-channel", "%u", &evtchn, NULL);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "reading %s ring", dev->otherend);
-+              return err;
-+      }
-+
-+      err = scsiback_init_sring(be->info, ring_ref, evtchn);
-+      if (err)
-+              return err;
-+
-+      err = __vscsiif_name(be, name);
-+      if (err) {
-+              xenbus_dev_error(dev, err, "get scsiback dev name");
-+              return err;
-+      }
-+
-+      be->info->kthread = kthread_run(scsiback_schedule, be->info, name);
-+      if (IS_ERR(be->info->kthread)) {
-+              err = PTR_ERR(be->info->kthread);
-+              be->info->kthread = NULL;
-+              xenbus_dev_error(be->dev, err, "start vscsiif");
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+struct scsi_device *scsiback_get_scsi_device(struct ids_tuple *phy)
-+{
-+      struct Scsi_Host *shost;
-+      struct scsi_device *sdev = NULL;
-+
-+      shost = scsi_host_lookup(phy->hst);
-+      if (IS_ERR(shost)) {
-+              printk(KERN_ERR "scsiback: host%d doesn't exist.\n",
-+                      phy->hst);
-+              return NULL;
-+      }
-+      sdev   = scsi_device_lookup(shost, phy->chn, phy->tgt, phy->lun);
-+      if (!sdev) {
-+              printk(KERN_ERR "scsiback: %d:%d:%d:%d doesn't exist.\n",
-+                      phy->hst, phy->chn, phy->tgt, phy->lun);
-+              scsi_host_put(shost);
-+              return NULL;
-+      }
-+
-+      scsi_host_put(shost);
-+      return (sdev);
-+}
-+
-+#define VSCSIBACK_OP_ADD_OR_DEL_LUN   1
-+#define VSCSIBACK_OP_UPDATEDEV_STATE  2
-+
-+
-+static void scsiback_do_lun_hotplug(struct backend_info *be, int op)
-+{
-+      int i, err = 0;
-+      struct ids_tuple phy, vir;
-+      int device_state;
-+      char str[64], state_str[64];
-+      char **dir;
-+      unsigned int dir_n = 0;
-+      struct xenbus_device *dev = be->dev;
-+      struct scsi_device *sdev;
-+
-+      dir = xenbus_directory(XBT_NIL, dev->nodename, "vscsi-devs", &dir_n);
-+      if (IS_ERR(dir))
-+              return;
-+
-+      for (i = 0; i < dir_n; i++) {
-+              
-+              /* read status */
-+              snprintf(state_str, sizeof(state_str), "vscsi-devs/%s/state", dir[i]);
-+              err = xenbus_scanf(XBT_NIL, dev->nodename, state_str, "%u",
-+                      &device_state);
-+              if (XENBUS_EXIST_ERR(err))
-+                      continue;
-+
-+              /* physical SCSI device */
-+              snprintf(str, sizeof(str), "vscsi-devs/%s/p-dev", dir[i]);
-+              err = xenbus_scanf(XBT_NIL, dev->nodename, str,
-+                      "%u:%u:%u:%u", &phy.hst, &phy.chn, &phy.tgt, &phy.lun);
-+              if (XENBUS_EXIST_ERR(err)) {
-+                      xenbus_printf(XBT_NIL, dev->nodename, state_str,
-+                                      "%d", XenbusStateClosed);
-+                      continue;
-+              }
-+
-+              /* virtual SCSI device */
-+              snprintf(str, sizeof(str), "vscsi-devs/%s/v-dev", dir[i]);
-+              err = xenbus_scanf(XBT_NIL, dev->nodename, str,
-+                      "%u:%u:%u:%u", &vir.hst, &vir.chn, &vir.tgt, &vir.lun);
-+              if (XENBUS_EXIST_ERR(err)) {
-+                      xenbus_printf(XBT_NIL, dev->nodename, state_str,
-+                                      "%d", XenbusStateClosed);
-+                      continue;
-+              }
-+
-+              switch (op) {
-+              case VSCSIBACK_OP_ADD_OR_DEL_LUN:
-+                      if (device_state == XenbusStateInitialising) {
-+                              sdev = scsiback_get_scsi_device(&phy);
-+                              if (!sdev)
-+                                      xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                          "%d", XenbusStateClosed);
-+                              else {
-+                                      err = scsiback_add_translation_entry(be->info, sdev, &vir);
-+                                      if (!err) {
-+                                              if (xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                                  "%d", XenbusStateInitialised)) {
-+                                                      printk(KERN_ERR "scsiback: xenbus_printf error %s\n", state_str);
-+                                                      scsiback_del_translation_entry(be->info, &vir);
-+                                              }
-+                                      } else {
-+                                              scsi_device_put(sdev);
-+                                              xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                                  "%d", XenbusStateClosed);
-+                                      }
-+                              }
-+                      }
-+
-+                      if (device_state == XenbusStateClosing) {
-+                              if (!scsiback_del_translation_entry(be->info, &vir)) {
-+                                      if (xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                          "%d", XenbusStateClosed))
-+                                              printk(KERN_ERR "scsiback: xenbus_printf error %s\n", state_str);
-+                              }
-+                      }
-+                      break;
-+
-+              case VSCSIBACK_OP_UPDATEDEV_STATE:
-+                      if (device_state == XenbusStateInitialised) {
-+                              /* modify vscsi-devs/dev-x/state */
-+                              if (xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                  "%d", XenbusStateConnected)) {
-+                                      printk(KERN_ERR "scsiback: xenbus_printf error %s\n", state_str);
-+                                      scsiback_del_translation_entry(be->info, &vir);
-+                                      xenbus_printf(XBT_NIL, dev->nodename, state_str, 
-+                                                          "%d", XenbusStateClosed);
-+                              }
-+                      }
-+                      break;
-+              /*When it is necessary, processing is added here.*/
-+              default:
-+                      break;
-+              }
-+      }
-+
-+      kfree(dir);
-+      return ;
-+}
-+
-+
-+static void scsiback_frontend_changed(struct xenbus_device *dev,
-+                                      enum xenbus_state frontend_state)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+      int err;
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+              break;
-+      case XenbusStateInitialised:
-+              err = scsiback_map(be);
-+              if (err)
-+                      break;
-+
-+              scsiback_do_lun_hotplug(be, VSCSIBACK_OP_ADD_OR_DEL_LUN);
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+
-+              break;
-+      case XenbusStateConnected:
-+
-+              scsiback_do_lun_hotplug(be, VSCSIBACK_OP_UPDATEDEV_STATE);
-+
-+              if (dev->state == XenbusStateConnected)
-+                      break;
-+
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+
-+              break;
-+
-+      case XenbusStateClosing:
-+              scsiback_disconnect(be->info);
-+              xenbus_switch_state(dev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateClosed:
-+              xenbus_switch_state(dev, XenbusStateClosed);
-+              if (xenbus_dev_is_online(dev))
-+                      break;
-+              /* fall through if not online */
-+      case XenbusStateUnknown:
-+              device_unregister(&dev->dev);
-+              break;
-+
-+      case XenbusStateReconfiguring:
-+              scsiback_do_lun_hotplug(be, VSCSIBACK_OP_ADD_OR_DEL_LUN);
-+
-+              xenbus_switch_state(dev, XenbusStateReconfigured);
-+
-+              break;
-+
-+      default:
-+              xenbus_dev_fatal(dev, -EINVAL, "saw state %d at frontend",
-+                                      frontend_state);
-+              break;
-+      }
-+}
-+
-+
-+static int scsiback_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      if (be->info) {
-+              scsiback_disconnect(be->info);
-+              scsiback_release_translation_entry(be->info);
-+              scsiback_free(be->info);
-+              be->info = NULL;
-+      }
-+
-+      kfree(be);
-+      dev->dev.driver_data = NULL;
-+
-+      return 0;
-+}
-+
-+
-+static int scsiback_probe(struct xenbus_device *dev,
-+                         const struct xenbus_device_id *id)
-+{
-+      int err;
-+
-+      struct backend_info *be = kzalloc(sizeof(struct backend_info),
-+                                        GFP_KERNEL);
-+
-+      DPRINTK("%p %d\n", dev, dev->otherend_id);
-+
-+      if (!be) {
-+              xenbus_dev_fatal(dev, -ENOMEM,
-+                               "allocating backend structure");
-+              return -ENOMEM;
-+      }
-+      be->dev = dev;
-+      dev->dev.driver_data = be;
-+
-+      be->info = vscsibk_info_alloc(dev->otherend_id);
-+      if (IS_ERR(be->info)) {
-+              err = PTR_ERR(be->info);
-+              be->info = NULL;
-+              xenbus_dev_fatal(dev, err, "creating scsihost interface");
-+              goto fail;
-+      }
-+
-+      be->info->dev = dev;
-+      be->info->irq = 0;
-+
-+      scsiback_init_translation_table(be->info);
-+
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err)
-+              goto fail;
-+
-+      return 0;
-+
-+
-+fail:
-+      printk(KERN_WARNING "scsiback: %s failed\n",__FUNCTION__);
-+      scsiback_remove(dev);
-+
-+      return err;
-+}
-+
-+
-+static struct xenbus_device_id scsiback_ids[] = {
-+      { "vscsi" },
-+      { "" }
-+};
-+
-+static struct xenbus_driver scsiback = {
-+      .name                   = "vscsi",
-+      .owner                  = THIS_MODULE,
-+      .ids                    = scsiback_ids,
-+      .probe                  = scsiback_probe,
-+      .remove                 = scsiback_remove,
-+      .otherend_changed       = scsiback_frontend_changed
-+};
-+
-+int scsiback_xenbus_init(void)
-+{
-+      return xenbus_register_backend(&scsiback);
-+}
-+
-+void scsiback_xenbus_unregister(void)
-+{
-+      xenbus_unregister_driver(&scsiback);
-+}
-Index: head-2008-11-25/drivers/xen/scsifront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsifront/Makefile     2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,3 @@
-+
-+obj-$(CONFIG_XEN_SCSI_FRONTEND)       := xenscsi.o
-+xenscsi-objs := scsifront.o xenbus.o
-Index: head-2008-11-25/drivers/xen/scsifront/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsifront/common.h     2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,129 @@
-+/*
-+ * Xen SCSI frontend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#ifndef __XEN_DRIVERS_SCSIFRONT_H__
-+#define __XEN_DRIVERS_SCSIFRONT_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/kernel.h>
-+#include <linux/device.h>
-+#include <linux/kthread.h>
-+#include <linux/wait.h>
-+#include <linux/interrupt.h>
-+#include <linux/spinlock.h>
-+#include <linux/sched.h>
-+#include <linux/blkdev.h>
-+#include <scsi/scsi_cmnd.h>
-+#include <scsi/scsi_device.h>
-+#include <scsi/scsi.h>
-+#include <scsi/scsi_host.h>
-+#include <xen/xenbus.h>
-+#include <xen/gnttab.h>
-+#include <xen/evtchn.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/io/ring.h>
-+#include <xen/interface/io/vscsiif.h>
-+#include <asm/delay.h>
-+
-+
-+#define GRANT_INVALID_REF     0
-+#define VSCSI_IN_ABORT                1
-+#define VSCSI_IN_RESET                2
-+
-+/* tuning point*/
-+#define VSCSIIF_DEFAULT_CMD_PER_LUN 10
-+#define VSCSIIF_MAX_TARGET          64
-+#define VSCSIIF_MAX_LUN             255
-+
-+#define VSCSIIF_RING_SIZE     \
-+    __RING_SIZE((struct vscsiif_sring *)0, PAGE_SIZE)
-+#define VSCSIIF_MAX_REQS      VSCSIIF_RING_SIZE
-+
-+struct vscsifrnt_shadow {
-+      uint16_t next_free;
-+      
-+      /* command between backend and frontend
-+       * VSCSIIF_ACT_SCSI_CDB or VSCSIIF_ACT_SCSI_RESET */
-+      unsigned char act;
-+      
-+      /* do reset function */
-+      wait_queue_head_t wq_reset;     /* reset work queue           */
-+      int wait_reset;                 /* reset work queue condition */
-+      int32_t rslt_reset;             /* reset response status      */
-+                                      /* (SUCESS or FAILED)         */
-+
-+      /* for DMA_TO_DEVICE(1), DMA_FROM_DEVICE(2), DMA_NONE(3) 
-+         requests */
-+      unsigned int sc_data_direction;
-+      
-+      /* Number of pieces of scatter-gather */
-+      unsigned int nr_segments;
-+
-+      /* requested struct scsi_cmnd is stored from kernel */
-+      unsigned long req_scsi_cmnd;
-+      int gref[VSCSIIF_SG_TABLESIZE];
-+};
-+
-+struct vscsifrnt_info {
-+      struct xenbus_device *dev;
-+
-+      struct Scsi_Host *host;
-+
-+      spinlock_t io_lock;
-+      spinlock_t shadow_lock;
-+      unsigned int evtchn;
-+      unsigned int irq;
-+
-+      grant_ref_t ring_ref;
-+      struct vscsiif_front_ring ring;
-+      struct vscsiif_response ring_res;
-+
-+      struct vscsifrnt_shadow shadow[VSCSIIF_MAX_REQS];
-+      uint32_t shadow_free;
-+
-+      struct task_struct *kthread;
-+      wait_queue_head_t wq;
-+      unsigned int waiting_resp;
-+
-+};
-+
-+#define DPRINTK(_f, _a...)                            \
-+      pr_debug("(file=%s, line=%d) " _f,      \
-+               __FILE__ , __LINE__ , ## _a )
-+
-+int scsifront_xenbus_init(void);
-+void scsifront_xenbus_unregister(void);
-+int scsifront_schedule(void *data);
-+irqreturn_t scsifront_intr(int irq, void *dev_id, struct pt_regs *ptregs);
-+int scsifront_cmd_done(struct vscsifrnt_info *info);
-+
-+
-+#endif /* __XEN_DRIVERS_SCSIFRONT_H__  */
-Index: head-2008-11-25/drivers/xen/scsifront/scsifront.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsifront/scsifront.c  2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,511 @@
-+/*
-+ * Xen SCSI frontend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+ 
-+
-+#include <linux/version.h>
-+#include "common.h"
-+
-+static int get_id_from_freelist(struct vscsifrnt_info *info)
-+{
-+      unsigned long flags;
-+      uint32_t free;
-+
-+      spin_lock_irqsave(&info->shadow_lock, flags);
-+
-+      free = info->shadow_free;
-+      BUG_ON(free > VSCSIIF_MAX_REQS);
-+      info->shadow_free = info->shadow[free].next_free;
-+      info->shadow[free].next_free = 0x0fff;
-+
-+      info->shadow[free].wait_reset = 0;
-+
-+      spin_unlock_irqrestore(&info->shadow_lock, flags);
-+
-+      return free;
-+}
-+
-+static void add_id_to_freelist(struct vscsifrnt_info *info, uint32_t id)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->shadow_lock, flags);
-+
-+      info->shadow[id].next_free  = info->shadow_free;
-+      info->shadow[id].req_scsi_cmnd = 0;
-+      info->shadow_free = id;
-+
-+      spin_unlock_irqrestore(&info->shadow_lock, flags);
-+}
-+
-+
-+struct vscsiif_request * scsifront_pre_request(struct vscsifrnt_info *info)
-+{
-+      struct vscsiif_front_ring *ring = &(info->ring);
-+      vscsiif_request_t *ring_req;
-+      uint32_t id;
-+
-+      ring_req = RING_GET_REQUEST(&(info->ring), ring->req_prod_pvt);
-+
-+      ring->req_prod_pvt++;
-+      
-+      id = get_id_from_freelist(info);        /* use id by response */
-+      ring_req->rqid = (uint16_t)id;
-+
-+      return ring_req;
-+}
-+
-+
-+static void scsifront_notify_work(struct vscsifrnt_info *info)
-+{
-+      info->waiting_resp = 1;
-+      wake_up(&info->wq);
-+}
-+
-+
-+static void scsifront_do_request(struct vscsifrnt_info *info)
-+{
-+      struct vscsiif_front_ring *ring = &(info->ring);
-+      unsigned int irq = info->irq;
-+      int notify;
-+
-+      RING_PUSH_REQUESTS_AND_CHECK_NOTIFY(ring, notify);
-+      if (notify)
-+              notify_remote_via_irq(irq);
-+}
-+
-+irqreturn_t scsifront_intr(int irq, void *dev_id, struct pt_regs *ptregs)
-+{
-+      scsifront_notify_work((struct vscsifrnt_info *)dev_id);
-+      return IRQ_HANDLED;
-+}
-+
-+
-+static void scsifront_gnttab_done(struct vscsifrnt_shadow *s, uint32_t id)
-+{
-+      int i;
-+
-+      if (s->sc_data_direction == DMA_NONE)
-+              return;
-+
-+      if (s->nr_segments) {
-+              for (i = 0; i < s->nr_segments; i++) {
-+                      if (unlikely(gnttab_query_foreign_access(
-+                              s->gref[i]) != 0)) {
-+                              printk(KERN_ALERT "scsifront: "
-+                                      "grant still in use by backend.\n");
-+                              BUG();
-+                      }
-+                      gnttab_end_foreign_access(s->gref[i], 0UL);
-+              }
-+      }
-+
-+      return;
-+}
-+
-+
-+static void scsifront_cdb_cmd_done(struct vscsifrnt_info *info,
-+                     vscsiif_response_t *ring_res)
-+{
-+      struct scsi_cmnd *sc;
-+      uint32_t id;
-+      uint8_t sense_len;
-+
-+      id = ring_res->rqid;
-+      sc = (struct scsi_cmnd *)info->shadow[id].req_scsi_cmnd;
-+
-+      if (sc == NULL)
-+              BUG();
-+
-+      scsifront_gnttab_done(&info->shadow[id], id);
-+      add_id_to_freelist(info, id);
-+
-+      sc->result = ring_res->rslt;
-+      sc->resid  = ring_res->residual_len;
-+
-+      if (ring_res->sense_len > VSCSIIF_SENSE_BUFFERSIZE)
-+              sense_len = VSCSIIF_SENSE_BUFFERSIZE;
-+      else
-+              sense_len = ring_res->sense_len;
-+
-+      if (sense_len)
-+              memcpy(sc->sense_buffer, ring_res->sense_buffer, sense_len);
-+
-+      sc->scsi_done(sc);
-+
-+      return;
-+}
-+
-+
-+static void scsifront_sync_cmd_done(struct vscsifrnt_info *info,
-+                              vscsiif_response_t *ring_res)
-+{
-+      uint16_t id = ring_res->rqid;
-+      unsigned long flags;
-+      
-+      spin_lock_irqsave(&info->shadow_lock, flags);
-+      info->shadow[id].wait_reset = 1;
-+      info->shadow[id].rslt_reset = ring_res->rslt;
-+      spin_unlock_irqrestore(&info->shadow_lock, flags);
-+
-+      wake_up(&(info->shadow[id].wq_reset));
-+}
-+
-+
-+int scsifront_cmd_done(struct vscsifrnt_info *info)
-+{
-+      vscsiif_response_t *ring_res;
-+
-+      RING_IDX i, rp;
-+      int more_to_do = 0;
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&info->io_lock, flags);
-+
-+      rp = info->ring.sring->rsp_prod;
-+      rmb();
-+      for (i = info->ring.rsp_cons; i != rp; i++) {
-+              
-+              ring_res = RING_GET_RESPONSE(&info->ring, i);
-+
-+              if (info->shadow[ring_res->rqid].act == VSCSIIF_ACT_SCSI_CDB)
-+                      scsifront_cdb_cmd_done(info, ring_res);
-+              else
-+                      scsifront_sync_cmd_done(info, ring_res);
-+      }
-+
-+      info->ring.rsp_cons = i;
-+
-+      if (i != info->ring.req_prod_pvt) {
-+              RING_FINAL_CHECK_FOR_RESPONSES(&info->ring, more_to_do);
-+      } else {
-+              info->ring.sring->rsp_event = i + 1;
-+      }
-+
-+      spin_unlock_irqrestore(&info->io_lock, flags);
-+
-+
-+      /* Yield point for this unbounded loop. */
-+      cond_resched();
-+
-+      return more_to_do;
-+}
-+
-+
-+
-+
-+int scsifront_schedule(void *data)
-+{
-+      struct vscsifrnt_info *info = (struct vscsifrnt_info *)data;
-+
-+      while (!kthread_should_stop()) {
-+              wait_event_interruptible(
-+                      info->wq,
-+                      info->waiting_resp || kthread_should_stop());
-+
-+              info->waiting_resp = 0;
-+              smp_mb();
-+
-+              if (scsifront_cmd_done(info))
-+                      info->waiting_resp = 1;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+
-+static int map_data_for_request(struct vscsifrnt_info *info,
-+              struct scsi_cmnd *sc, vscsiif_request_t *ring_req, uint32_t id)
-+{
-+      grant_ref_t gref_head;
-+      struct page *page;
-+      int err, i, ref, ref_cnt = 0;
-+      int write = (sc->sc_data_direction == DMA_TO_DEVICE);
-+      int nr_pages, off, len, bytes;
-+      unsigned long buffer_pfn;
-+      unsigned int data_len = 0;
-+
-+      if (sc->sc_data_direction == DMA_NONE)
-+              return 0;
-+
-+      err = gnttab_alloc_grant_references(VSCSIIF_SG_TABLESIZE, &gref_head);
-+      if (err) {
-+              printk(KERN_ERR "scsifront: gnttab_alloc_grant_references() error\n");
-+              return -ENOMEM;
-+      }
-+
-+      if (sc->use_sg) {
-+              /* quoted scsi_lib.c/scsi_req_map_sg . */
-+              struct scatterlist *sg = (struct scatterlist *)sc->request_buffer;
-+              nr_pages = (sc->request_bufflen + sg[0].offset + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+
-+              if (nr_pages > VSCSIIF_SG_TABLESIZE) {
-+                      printk(KERN_ERR "scsifront: Unable to map request_buffer for command!\n");
-+                      ref_cnt = (-E2BIG);
-+                      goto big_to_sg;
-+              }
-+
-+              for (i = 0; i < sc->use_sg; i++) {
-+                      page = sg[i].page;
-+                      off = sg[i].offset;
-+                      len = sg[i].length;
-+                      data_len += len;
-+
-+                      buffer_pfn = page_to_phys(page) >> PAGE_SHIFT;
-+
-+                      while (len > 0) {
-+                              bytes = min_t(unsigned int, len, PAGE_SIZE - off);
-+                              
-+                              ref = gnttab_claim_grant_reference(&gref_head);
-+                              BUG_ON(ref == -ENOSPC);
-+
-+                              gnttab_grant_foreign_access_ref(ref, info->dev->otherend_id,
-+                                      buffer_pfn, write);
-+
-+                              info->shadow[id].gref[ref_cnt]  = ref;
-+                              ring_req->seg[ref_cnt].gref     = ref;
-+                              ring_req->seg[ref_cnt].offset   = (uint16_t)off;
-+                              ring_req->seg[ref_cnt].length   = (uint16_t)bytes;
-+
-+                              buffer_pfn++;
-+                              len -= bytes;
-+                              off = 0;
-+                              ref_cnt++;
-+                      }
-+              }
-+      } else if (sc->request_bufflen) {
-+              unsigned long end   = ((unsigned long)sc->request_buffer
-+                                      + sc->request_bufflen + PAGE_SIZE - 1) >> PAGE_SHIFT;
-+              unsigned long start = (unsigned long)sc->request_buffer >> PAGE_SHIFT;
-+
-+              page = virt_to_page(sc->request_buffer);
-+              nr_pages = end - start;
-+              len = sc->request_bufflen;
-+
-+              if (nr_pages > VSCSIIF_SG_TABLESIZE) {
-+                      ref_cnt = (-E2BIG);
-+                      goto big_to_sg;
-+              }
-+
-+              buffer_pfn = page_to_phys(page) >> PAGE_SHIFT;
-+
-+              off = offset_in_page((unsigned long)sc->request_buffer);
-+              for (i = 0; i < nr_pages; i++) {
-+                      bytes = PAGE_SIZE - off;
-+
-+                      if (bytes > len)
-+                              bytes = len;
-+
-+                      ref = gnttab_claim_grant_reference(&gref_head);
-+                      BUG_ON(ref == -ENOSPC);
-+
-+                      gnttab_grant_foreign_access_ref(ref, info->dev->otherend_id,
-+                              buffer_pfn, write);
-+
-+                      info->shadow[id].gref[i] = ref;
-+                      ring_req->seg[i].gref     = ref;
-+                      ring_req->seg[i].offset   = (uint16_t)off;
-+                      ring_req->seg[i].length   = (uint16_t)bytes;
-+
-+                      buffer_pfn++;
-+                      len -= bytes;
-+                      off = 0;
-+                      ref_cnt++;
-+              }
-+      }
-+
-+big_to_sg:
-+
-+      gnttab_free_grant_references(gref_head);
-+
-+      return ref_cnt;
-+}
-+
-+static int scsifront_queuecommand(struct scsi_cmnd *sc,
-+                                void (*done)(struct scsi_cmnd *))
-+{
-+      struct vscsifrnt_info *info =
-+              (struct vscsifrnt_info *) sc->device->host->hostdata;
-+      vscsiif_request_t *ring_req;
-+      int ref_cnt;
-+      uint16_t rqid;
-+
-+      if (RING_FULL(&info->ring)) {
-+              goto out_host_busy;
-+      }
-+
-+      sc->scsi_done = done;
-+      sc->result    = 0;
-+
-+      ring_req          = scsifront_pre_request(info);
-+      rqid              = ring_req->rqid;
-+      ring_req->act     = VSCSIIF_ACT_SCSI_CDB;
-+
-+      ring_req->id      = sc->device->id;
-+      ring_req->lun     = sc->device->lun;
-+      ring_req->channel = sc->device->channel;
-+      ring_req->cmd_len = sc->cmd_len;
-+
-+      BUG_ON(sc->cmd_len > VSCSIIF_MAX_COMMAND_SIZE);
-+
-+      if ( sc->cmd_len )
-+              memcpy(ring_req->cmnd, sc->cmnd, sc->cmd_len);
-+      else
-+              memset(ring_req->cmnd, 0, VSCSIIF_MAX_COMMAND_SIZE);
-+
-+      ring_req->sc_data_direction   = (uint8_t)sc->sc_data_direction;
-+      ring_req->timeout_per_command = (sc->timeout_per_command / HZ);
-+
-+      info->shadow[rqid].req_scsi_cmnd     = (unsigned long)sc;
-+      info->shadow[rqid].sc_data_direction = sc->sc_data_direction;
-+      info->shadow[rqid].act               = ring_req->act;
-+
-+      ref_cnt = map_data_for_request(info, sc, ring_req, rqid);
-+      if (ref_cnt < 0) {
-+              add_id_to_freelist(info, rqid);
-+              if (ref_cnt == (-ENOMEM))
-+                      goto out_host_busy;
-+              else {
-+                      sc->result = (DID_ERROR << 16);
-+                      goto out_fail_command;
-+              }
-+      }
-+
-+      ring_req->nr_segments          = (uint8_t)ref_cnt;
-+      info->shadow[rqid].nr_segments = ref_cnt;
-+
-+      scsifront_do_request(info);
-+
-+      return 0;
-+
-+out_host_busy:
-+      return SCSI_MLQUEUE_HOST_BUSY;
-+
-+out_fail_command:
-+      done(sc);
-+      return 0;
-+}
-+
-+
-+static int scsifront_eh_abort_handler(struct scsi_cmnd *sc)
-+{
-+      return (FAILED);
-+}
-+
-+/* vscsi supports only device_reset, because it is each of LUNs */
-+static int scsifront_dev_reset_handler(struct scsi_cmnd *sc)
-+{
-+      struct Scsi_Host *host = sc->device->host;
-+      struct vscsifrnt_info *info =
-+              (struct vscsifrnt_info *) sc->device->host->hostdata;
-+
-+      vscsiif_request_t *ring_req;
-+      uint16_t rqid;
-+      int err;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-+      spin_lock_irq(host->host_lock);
-+#endif
-+
-+      ring_req      = scsifront_pre_request(info);
-+      ring_req->act = VSCSIIF_ACT_SCSI_RESET;
-+
-+      rqid          = ring_req->rqid;
-+      info->shadow[rqid].act = VSCSIIF_ACT_SCSI_RESET;
-+
-+      ring_req->channel = sc->device->channel;
-+      ring_req->id      = sc->device->id;
-+      ring_req->lun     = sc->device->lun;
-+      ring_req->cmd_len = sc->cmd_len;
-+
-+      if ( sc->cmd_len )
-+              memcpy(ring_req->cmnd, sc->cmnd, sc->cmd_len);
-+      else
-+              memset(ring_req->cmnd, 0, VSCSIIF_MAX_COMMAND_SIZE);
-+
-+      ring_req->sc_data_direction   = (uint8_t)sc->sc_data_direction;
-+      ring_req->timeout_per_command = (sc->timeout_per_command / HZ);
-+      ring_req->nr_segments         = 0;
-+
-+      scsifront_do_request(info);     
-+
-+      spin_unlock_irq(host->host_lock);
-+      wait_event_interruptible(info->shadow[rqid].wq_reset,
-+                       info->shadow[rqid].wait_reset);
-+      spin_lock_irq(host->host_lock);
-+
-+      err = info->shadow[rqid].rslt_reset;
-+
-+      add_id_to_freelist(info, rqid);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,12)
-+      spin_unlock_irq(host->host_lock);
-+#endif
-+      return (err);
-+}
-+
-+
-+struct scsi_host_template scsifront_sht = {
-+      .module                 = THIS_MODULE,
-+      .name                   = "Xen SCSI frontend driver",
-+      .queuecommand           = scsifront_queuecommand,
-+      .eh_abort_handler       = scsifront_eh_abort_handler,
-+      .eh_device_reset_handler= scsifront_dev_reset_handler,
-+      .cmd_per_lun            = VSCSIIF_DEFAULT_CMD_PER_LUN,
-+      .can_queue              = VSCSIIF_MAX_REQS,
-+      .this_id                = -1,
-+      .sg_tablesize           = VSCSIIF_SG_TABLESIZE,
-+      .use_clustering         = DISABLE_CLUSTERING,
-+      .proc_name              = "scsifront",
-+};
-+
-+
-+static int __init scsifront_init(void)
-+{
-+      int err;
-+
-+      if (!is_running_on_xen())
-+              return -ENODEV;
-+
-+      err = scsifront_xenbus_init();
-+
-+      return err;
-+}
-+
-+static void __exit scsifront_exit(void)
-+{
-+      scsifront_xenbus_unregister();
-+}
-+
-+module_init(scsifront_init);
-+module_exit(scsifront_exit);
-+
-+MODULE_DESCRIPTION("Xen SCSI frontend driver");
-+MODULE_LICENSE("GPL");
-Index: head-2008-11-25/drivers/xen/scsifront/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/scsifront/xenbus.c     2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,421 @@
-+/*
-+ * Xen SCSI frontend driver
-+ *
-+ * Copyright (c) 2008, FUJITSU Limited
-+ *
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+ 
-+
-+#include <linux/version.h>
-+#include "common.h"
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,11)
-+  #define DEFAULT_TASK_COMM_LEN       16
-+#else
-+  #define DEFAULT_TASK_COMM_LEN       TASK_COMM_LEN
-+#endif
-+
-+extern struct scsi_host_template scsifront_sht;
-+
-+static void scsifront_free(struct vscsifrnt_info *info)
-+{
-+      struct Scsi_Host *host = info->host;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,14)
-+      if (host->shost_state != SHOST_DEL) {
-+#else
-+      if (!test_bit(SHOST_DEL, &host->shost_state)) {
-+#endif
-+              scsi_remove_host(info->host);
-+      }
-+
-+      if (info->ring_ref != GRANT_INVALID_REF) {
-+              gnttab_end_foreign_access(info->ring_ref,
-+                                      (unsigned long)info->ring.sring);
-+              info->ring_ref = GRANT_INVALID_REF;
-+              info->ring.sring = NULL;
-+      }
-+
-+      if (info->irq)
-+              unbind_from_irqhandler(info->irq, info);
-+      info->irq = 0;
-+
-+      scsi_host_put(info->host);
-+}
-+
-+
-+static int scsifront_alloc_ring(struct vscsifrnt_info *info)
-+{
-+      struct xenbus_device *dev = info->dev;
-+      struct vscsiif_sring *sring;
-+      int err = -ENOMEM;
-+
-+
-+      info->ring_ref = GRANT_INVALID_REF;
-+
-+      /***** Frontend to Backend ring start *****/
-+      sring = (struct vscsiif_sring *) __get_free_page(GFP_KERNEL);
-+      if (!sring) {
-+              xenbus_dev_fatal(dev, err, "fail to allocate shared ring (Front to Back)");
-+              return err;
-+      }
-+      SHARED_RING_INIT(sring);
-+      FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
-+
-+      err = xenbus_grant_ring(dev, virt_to_mfn(sring));
-+      if (err < 0) {
-+              free_page((unsigned long) sring);
-+              info->ring.sring = NULL;
-+              xenbus_dev_fatal(dev, err, "fail to grant shared ring (Front to Back)");
-+              goto free_sring;
-+      }
-+      info->ring_ref = err;
-+
-+      err = bind_listening_port_to_irqhandler(
-+                      dev->otherend_id, scsifront_intr,
-+                      SA_SAMPLE_RANDOM, "scsifront", info);
-+
-+      if (err <= 0) {
-+              xenbus_dev_fatal(dev, err, "bind_listening_port_to_irqhandler");
-+              goto free_sring;
-+      }
-+      info->irq = err;
-+
-+      return 0;
-+
-+/* free resource */
-+free_sring:
-+      scsifront_free(info);
-+
-+      return err;
-+}
-+
-+
-+static int scsifront_init_ring(struct vscsifrnt_info *info)
-+{
-+      struct xenbus_device *dev = info->dev;
-+      struct xenbus_transaction xbt;
-+      int err;
-+
-+      DPRINTK("%s\n",__FUNCTION__);
-+
-+      err = scsifront_alloc_ring(info);
-+      if (err)
-+              return err;
-+      DPRINTK("%u %u\n", info->ring_ref, info->evtchn);
-+
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "starting transaction");
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "ring-ref", "%u",
-+                              info->ring_ref);
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "%s", "writing ring-ref");
-+              goto fail;
-+      }
-+
-+      err = xenbus_printf(xbt, dev->nodename, "event-channel", "%u",
-+                              irq_to_evtchn_port(info->irq));
-+
-+      if (err) {
-+              xenbus_dev_fatal(dev, err, "%s", "writing event-channel");
-+              goto fail;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err) {
-+              if (err == -EAGAIN)
-+                      goto again;
-+              xenbus_dev_fatal(dev, err, "completing transaction");
-+              goto free_sring;
-+      }
-+
-+      return 0;
-+
-+fail:
-+      xenbus_transaction_end(xbt, 1);
-+free_sring:
-+      /* free resource */
-+      scsifront_free(info);
-+      
-+      return err;
-+}
-+
-+
-+static int scsifront_probe(struct xenbus_device *dev,
-+                              const struct xenbus_device_id *id)
-+{
-+      struct vscsifrnt_info *info;
-+      struct Scsi_Host *host;
-+      int i, err = -ENOMEM;
-+      char name[DEFAULT_TASK_COMM_LEN];
-+
-+      host = scsi_host_alloc(&scsifront_sht, sizeof(*info));
-+      if (!host) {
-+              xenbus_dev_fatal(dev, err, "fail to allocate scsi host");
-+              return err;
-+      }
-+      info = (struct vscsifrnt_info *) host->hostdata;
-+      info->host = host;
-+
-+
-+      dev->dev.driver_data = info;
-+      info->dev  = dev;
-+
-+      for (i = 0; i < VSCSIIF_MAX_REQS; i++) {
-+              info->shadow[i].next_free = i + 1;
-+              init_waitqueue_head(&(info->shadow[i].wq_reset));
-+              info->shadow[i].wait_reset = 0;
-+      }
-+      info->shadow[VSCSIIF_MAX_REQS - 1].next_free = 0x0fff;
-+
-+      err = scsifront_init_ring(info);
-+      if (err) {
-+              scsi_host_put(host);
-+              return err;
-+      }
-+
-+      init_waitqueue_head(&info->wq);
-+      spin_lock_init(&info->io_lock);
-+      spin_lock_init(&info->shadow_lock);
-+
-+      snprintf(name, DEFAULT_TASK_COMM_LEN, "vscsiif.%d", info->host->host_no);
-+
-+      info->kthread = kthread_run(scsifront_schedule, info, name);
-+      if (IS_ERR(info->kthread)) {
-+              err = PTR_ERR(info->kthread);
-+              info->kthread = NULL;
-+              printk(KERN_ERR "scsifront: kthread start err %d\n", err);
-+              goto free_sring;
-+      }
-+
-+      host->max_id      = VSCSIIF_MAX_TARGET;
-+      host->max_channel = 0;
-+      host->max_lun     = VSCSIIF_MAX_LUN;
-+      host->max_sectors = (VSCSIIF_SG_TABLESIZE - 1) * PAGE_SIZE / 512;
-+
-+      err = scsi_add_host(host, &dev->dev);
-+      if (err) {
-+              printk(KERN_ERR "scsifront: fail to add scsi host %d\n", err);
-+              goto free_sring;
-+      }
-+
-+      xenbus_switch_state(dev, XenbusStateInitialised);
-+
-+      return 0;
-+
-+free_sring:
-+      /* free resource */
-+      scsifront_free(info);
-+      return err;
-+}
-+
-+static int scsifront_remove(struct xenbus_device *dev)
-+{
-+      struct vscsifrnt_info *info = dev->dev.driver_data;
-+
-+      DPRINTK("%s: %s removed\n",__FUNCTION__ ,dev->nodename);
-+
-+      if (info->kthread) {
-+              kthread_stop(info->kthread);
-+              info->kthread = NULL;
-+      }
-+
-+      scsifront_free(info);
-+      
-+      return 0;
-+}
-+
-+
-+static int scsifront_disconnect(struct vscsifrnt_info *info)
-+{
-+      struct xenbus_device *dev = info->dev;
-+      struct Scsi_Host *host = info->host;
-+
-+      DPRINTK("%s: %s disconnect\n",__FUNCTION__ ,dev->nodename);
-+
-+      /* 
-+        When this function is executed,  all devices of 
-+        Frontend have been deleted. 
-+        Therefore, it need not block I/O before remove_host.
-+      */
-+
-+      scsi_remove_host(host);
-+      xenbus_frontend_closed(dev);
-+
-+      return 0;
-+}
-+
-+#define VSCSIFRONT_OP_ADD_LUN 1
-+#define VSCSIFRONT_OP_DEL_LUN 2
-+
-+static void scsifront_do_lun_hotplug(struct vscsifrnt_info *info, int op)
-+{
-+      struct xenbus_device *dev = info->dev;
-+      int i, err = 0;
-+      char str[64], state_str[64];
-+      char **dir;
-+      unsigned int dir_n = 0;
-+      unsigned int device_state;
-+      unsigned int hst, chn, tgt, lun;
-+      struct scsi_device *sdev;
-+
-+      dir = xenbus_directory(XBT_NIL, dev->otherend, "vscsi-devs", &dir_n);
-+      if (IS_ERR(dir))
-+              return;
-+
-+      for (i = 0; i < dir_n; i++) {
-+              /* read status */
-+              snprintf(str, sizeof(str), "vscsi-devs/%s/state", dir[i]);
-+              err = xenbus_scanf(XBT_NIL, dev->otherend, str, "%u",
-+                      &device_state);
-+              if (XENBUS_EXIST_ERR(err))
-+                      continue;
-+              
-+              /* virtual SCSI device */
-+              snprintf(str, sizeof(str), "vscsi-devs/%s/v-dev", dir[i]);
-+              err = xenbus_scanf(XBT_NIL, dev->otherend, str,
-+                      "%u:%u:%u:%u", &hst, &chn, &tgt, &lun);
-+              if (XENBUS_EXIST_ERR(err))
-+                      continue;
-+
-+              /* front device state path */
-+              snprintf(state_str, sizeof(state_str), "vscsi-devs/%s/state", dir[i]);
-+
-+              switch (op) {
-+              case VSCSIFRONT_OP_ADD_LUN:
-+                      if (device_state == XenbusStateInitialised) {
-+                              sdev = scsi_device_lookup(info->host, chn, tgt, lun);
-+                              if (sdev) {
-+                                      printk(KERN_ERR "scsifront: Device already in use.\n");
-+                                      scsi_device_put(sdev);
-+                                      xenbus_printf(XBT_NIL, dev->nodename,
-+                                              state_str, "%d", XenbusStateClosed);
-+                              } else {
-+                                      scsi_add_device(info->host, chn, tgt, lun);
-+                                      xenbus_printf(XBT_NIL, dev->nodename,
-+                                              state_str, "%d", XenbusStateConnected);
-+                              }
-+                      }
-+                      break;
-+              case VSCSIFRONT_OP_DEL_LUN:
-+                      if (device_state == XenbusStateClosing) {
-+                              sdev = scsi_device_lookup(info->host, chn, tgt, lun);
-+                              if (sdev) {
-+                                      scsi_remove_device(sdev);
-+                                      scsi_device_put(sdev);
-+                                      xenbus_printf(XBT_NIL, dev->nodename,
-+                                              state_str, "%d", XenbusStateClosed);
-+                              }
-+                      }
-+                      break;
-+              default:
-+                      break;
-+              }
-+      }
-+      
-+      kfree(dir);
-+      return;
-+}
-+
-+
-+
-+
-+static void scsifront_backend_changed(struct xenbus_device *dev,
-+                              enum xenbus_state backend_state)
-+{
-+      struct vscsifrnt_info *info = dev->dev.driver_data;
-+
-+      DPRINTK("%p %u %u\n", dev, dev->state, backend_state);
-+
-+      switch (backend_state) {
-+      case XenbusStateUnknown:
-+      case XenbusStateInitialising:
-+      case XenbusStateInitWait:
-+      case XenbusStateClosed:
-+              break;
-+
-+      case XenbusStateInitialised:
-+              break;
-+
-+      case XenbusStateConnected:
-+              if (xenbus_read_driver_state(dev->nodename) ==
-+                      XenbusStateInitialised) {
-+                      scsifront_do_lun_hotplug(info, VSCSIFRONT_OP_ADD_LUN);
-+              }
-+              
-+              if (dev->state == XenbusStateConnected)
-+                      break;
-+                      
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+              break;
-+
-+      case XenbusStateClosing:
-+              scsifront_disconnect(info);
-+              break;
-+
-+      case XenbusStateReconfiguring:
-+              scsifront_do_lun_hotplug(info, VSCSIFRONT_OP_DEL_LUN);
-+              xenbus_switch_state(dev, XenbusStateReconfiguring);
-+              break;
-+
-+      case XenbusStateReconfigured:
-+              scsifront_do_lun_hotplug(info, VSCSIFRONT_OP_ADD_LUN);
-+              xenbus_switch_state(dev, XenbusStateConnected);
-+              break;
-+      }
-+}
-+
-+
-+static struct xenbus_device_id scsifront_ids[] = {
-+      { "vscsi" },
-+      { "" }
-+};
-+
-+
-+static struct xenbus_driver scsifront_driver = {
-+      .name                   = "vscsi",
-+      .owner                  = THIS_MODULE,
-+      .ids                    = scsifront_ids,
-+      .probe                  = scsifront_probe,
-+      .remove                 = scsifront_remove,
-+/*    .resume                 = scsifront_resume, */
-+      .otherend_changed       = scsifront_backend_changed,
-+};
-+
-+int scsifront_xenbus_init(void)
-+{
-+      return xenbus_register_frontend(&scsifront_driver);
-+}
-+
-+void scsifront_xenbus_unregister(void)
-+{
-+      xenbus_unregister_driver(&scsifront_driver);
-+}
-+
-Index: head-2008-11-25/drivers/xen/sfc_netback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/Makefile   2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,12 @@
-+EXTRA_CFLAGS += -Idrivers/xen/sfc_netback -Idrivers/xen/sfc_netutil -Idrivers/xen/netback -Idrivers/net/sfc
-+EXTRA_CFLAGS += -D__ci_driver__ 
-+EXTRA_CFLAGS += -DEFX_USE_KCOMPAT
-+EXTRA_CFLAGS += -Werror
-+
-+ifdef GCOV
-+EXTRA_CFLAGS += -fprofile-arcs -ftest-coverage -DEFX_GCOV
-+endif
-+
-+obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_BACKEND) := sfc_netback.o
-+
-+sfc_netback-objs   := accel.o accel_fwd.o accel_msg.o accel_solarflare.o accel_xenbus.o accel_debugfs.o
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel.c    2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,129 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include "accel.h"
-+#include "accel_msg_iface.h"
-+#include "accel_solarflare.h"
-+
-+#include <linux/notifier.h>
-+
-+#ifdef EFX_GCOV
-+#include "gcov.h"
-+#endif
-+
-+static int netback_accel_netdev_event(struct notifier_block *nb,
-+                                    unsigned long event, void *ptr)
-+{
-+      struct net_device *net_dev = (struct net_device *)ptr;
-+      struct netback_accel *bend;
-+
-+      if ((event == NETDEV_UP) || (event == NETDEV_DOWN)) {
-+              mutex_lock(&bend_list_mutex);
-+              bend = bend_list;
-+              while (bend != NULL) {
-+                      mutex_lock(&bend->bend_mutex);
-+                      /*
-+                       * This happens when the shared pages have
-+                       * been unmapped, but the bend not yet removed
-+                       * from list
-+                       */
-+                      if (bend->shared_page == NULL)
-+                              goto next;
-+
-+                      if (bend->net_dev->ifindex == net_dev->ifindex)
-+                              netback_accel_set_interface_state
-+                                      (bend, event == NETDEV_UP);
-+
-+              next:
-+                      mutex_unlock(&bend->bend_mutex);
-+                      bend = bend->next_bend;
-+              }
-+              mutex_unlock(&bend_list_mutex);
-+      }
-+
-+      return NOTIFY_DONE;
-+}
-+
-+
-+static struct notifier_block netback_accel_netdev_notifier = {
-+      .notifier_call = netback_accel_netdev_event,
-+};
-+
-+
-+unsigned sfc_netback_max_pages = NETBACK_ACCEL_DEFAULT_MAX_BUF_PAGES;
-+module_param_named(max_pages, sfc_netback_max_pages, uint, 0644);
-+MODULE_PARM_DESC(max_pages, 
-+               "The number of buffer pages to enforce on each guest");
-+
-+/* Initialise subsystems need for the accelerated fast path */
-+static int __init netback_accel_init(void)
-+{
-+      int rc = 0;
-+
-+#ifdef EFX_GCOV
-+      gcov_provider_init(THIS_MODULE);
-+#endif
-+
-+      rc = netback_accel_init_fwd();
-+
-+      if (rc == 0)
-+              netback_accel_debugfs_init();
-+
-+      if (rc == 0)
-+              rc = netback_accel_sf_init();
-+
-+      if (rc == 0)
-+              rc = register_netdevice_notifier
-+                      (&netback_accel_netdev_notifier);
-+
-+      /*
-+       * What if no device was found, shouldn't we clean up stuff
-+       * we've allocated for acceleration subsystem?
-+       */
-+
-+      return rc;
-+}
-+
-+module_init(netback_accel_init);
-+
-+static void __exit netback_accel_exit(void)
-+{
-+      unregister_netdevice_notifier(&netback_accel_netdev_notifier);
-+
-+      netback_accel_sf_shutdown();
-+
-+      netback_accel_shutdown_bends();
-+
-+      netback_accel_debugfs_fini();
-+
-+      netback_accel_shutdown_fwd();
-+
-+#ifdef EFX_GCOV
-+      gcov_provider_fini(THIS_MODULE);
-+#endif
-+}
-+
-+module_exit(netback_accel_exit);
-+
-+MODULE_LICENSE("GPL");
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel.h    2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,393 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETBACK_ACCEL_H
-+#define NETBACK_ACCEL_H
-+
-+#include <linux/slab.h>
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/udp.h>
-+#include <linux/in.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+#include <linux/mutex.h>
-+#include <linux/wait.h>
-+
-+#include <xen/xenbus.h>
-+
-+#include "accel_shared_fifo.h"
-+#include "accel_msg_iface.h"
-+#include "accel_util.h"
-+
-+/**************************************************************************
-+ * Datatypes
-+ **************************************************************************/
-+
-+#define NETBACK_ACCEL_DEFAULT_MAX_FILTERS (8)
-+#define NETBACK_ACCEL_DEFAULT_MAX_MCASTS (8)
-+#define NETBACK_ACCEL_DEFAULT_MAX_BUF_PAGES (384)
-+/* Variable to store module parameter for max_buf_pages */
-+extern unsigned sfc_netback_max_pages;
-+
-+#define NETBACK_ACCEL_STATS 1
-+
-+#if NETBACK_ACCEL_STATS
-+#define NETBACK_ACCEL_STATS_OP(x) x
-+#else
-+#define NETBACK_ACCEL_STATS_OP(x)
-+#endif
-+
-+/*! Statistics for a given backend */
-+struct netback_accel_stats {
-+      /*! Number of eventq wakeup events */
-+      u64 evq_wakeups;
-+      /*! Number of eventq timeout events */
-+      u64 evq_timeouts;
-+      /*! Number of filters used */
-+      u32 num_filters;
-+      /*! Number of buffer pages registered */
-+      u32 num_buffer_pages;
-+};
-+
-+
-+/* Debug fs nodes for each of the above stats */
-+struct netback_accel_dbfs {
-+      struct dentry *evq_wakeups;
-+      struct dentry *evq_timeouts;
-+      struct dentry *num_filters;
-+      struct dentry *num_buffer_pages;
-+};
-+
-+
-+/*! Resource limits for a given NIC */
-+struct netback_accel_limits {
-+      int max_filters;            /*!< Max. number of filters to use. */
-+      int max_mcasts;      /*!< Max. number  of mcast subscriptions */
-+      int max_buf_pages;        /*!< Max. number of pages of NIC buffers */
-+};
-+
-+
-+/*! The state for an instance of the back end driver. */
-+struct netback_accel {
-+      /*! mutex to protect this state */
-+      struct mutex bend_mutex;
-+
-+      /*! Watches on xenstore */
-+      struct xenbus_watch domu_accel_watch;
-+      struct xenbus_watch config_accel_watch;
-+
-+      /*! Pointer to whatever device cookie ties us in to the hypervisor */
-+      void *hdev_data;
-+
-+      /*! FIFO indices. Next page is msg FIFOs */
-+      struct net_accel_shared_page *shared_page;
-+
-+      /*! Defer control message processing */
-+      struct work_struct handle_msg;
-+
-+      /*! Identifies other end VM and interface.*/
-+      int far_end;
-+      int vif_num;
-+
-+      /*!< To unmap the shared pages */
-+      void *sh_pages_unmap;
-+
-+      /* Resource tracking */
-+      /*! Limits on H/W & Dom0 resources */
-+      struct netback_accel_limits quotas;
-+
-+      /* Hardware resources */
-+      /*! The H/W type of associated NIC */
-+      enum net_accel_hw_type hw_type;
-+      /*! State of allocation */             
-+      int hw_state;
-+      /*! Index into ci_driver.nics[] for this interface */
-+      int nic_index;
-+      /*! How to set up the acceleration for this hardware */
-+      int (*accel_setup)(struct netback_accel *); 
-+      /*! And how to stop it. */
-+      void (*accel_shutdown)(struct netback_accel *);
-+
-+      /*! The physical/real net_dev for this interface */
-+      struct net_device *net_dev;
-+
-+      /*! Magic pointer to locate state in fowarding table */
-+      void *fwd_priv;
-+
-+      /*! Message FIFO */
-+      sh_msg_fifo2 to_domU;
-+      /*! Message FIFO */
-+      sh_msg_fifo2 from_domU;
-+
-+      /*! General notification channel id */
-+      int msg_channel;
-+      /*! General notification channel irq */
-+      int msg_channel_irq;
-+
-+      /*! Event channel id dedicated to network packet interrupts. */
-+      int net_channel; 
-+      /*! Event channel irq dedicated to network packets interrupts */
-+      int net_channel_irq; 
-+
-+      /*! The MAC address the frontend goes by. */
-+      u8 mac[ETH_ALEN];
-+      /*! Driver name of associated NIC */
-+      char *nicname;    
-+
-+      /*! Array of pointers to buffer pages mapped */
-+      grant_handle_t *buffer_maps; 
-+      u64 *buffer_addrs;
-+      /*! Index into buffer_maps */
-+      int buffer_maps_index; 
-+      /*! Max number of pages that domU is allowed/will request to map */
-+      int max_pages; 
-+
-+      /*! Pointer to hardware specific private area */
-+      void *accel_hw_priv; 
-+
-+      /*! Wait queue for changes in accelstate. */
-+      wait_queue_head_t state_wait_queue;
-+
-+      /*! Current state of the frontend according to the xenbus
-+       *  watch. */
-+      XenbusState frontend_state;
-+
-+      /*! Current state of this backend. */
-+      XenbusState backend_state;
-+
-+      /*! Non-zero if the backend is being removed. */
-+      int removing;
-+
-+      /*! Non-zero if the setup_vnic has been called. */
-+      int vnic_is_setup;
-+
-+#if NETBACK_ACCEL_STATS
-+      struct netback_accel_stats stats;
-+#endif        
-+#if defined(CONFIG_DEBUG_FS)
-+      char *dbfs_dir_name;
-+      struct dentry *dbfs_dir;
-+      struct netback_accel_dbfs dbfs;
-+#endif
-+
-+      /*! List */
-+      struct netback_accel *next_bend;
-+};
-+
-+
-+/*
-+ * Values for netback_accel.hw_state.  States of resource allocation
-+ * we can go through
-+ */
-+/*! No hardware has yet been allocated. */
-+#define NETBACK_ACCEL_RES_NONE  (0)
-+/*! Hardware has been allocated. */
-+#define NETBACK_ACCEL_RES_ALLOC (1)
-+#define NETBACK_ACCEL_RES_FILTER (2)
-+#define NETBACK_ACCEL_RES_HWINFO (3)
-+
-+/*! Filtering specification. This assumes that for VNIC support we
-+ *  will always want wildcard entries, so only specifies the
-+ *  destination IP/port
-+ */
-+struct netback_accel_filter_spec {
-+      /*! Internal, used to access efx_vi API */
-+      void *filter_handle; 
-+
-+      /*! Destination IP in network order */
-+      u32 destip_be;
-+      /*! Destination port in network order */
-+      u16 destport_be;
-+      /*! Mac address */
-+      u8  mac[ETH_ALEN];
-+      /*! TCP or UDP */
-+      u8  proto;      
-+};
-+
-+
-+/**************************************************************************
-+ * From accel.c
-+ **************************************************************************/
-+
-+/*! \brief Start up all the acceleration plugins 
-+ *
-+ * \return 0 on success, an errno on failure
-+ */
-+extern int netback_accel_init_accel(void);
-+
-+/*! \brief Shut down all the acceleration plugins 
-+ */
-+extern void netback_accel_shutdown_accel(void);
-+
-+
-+/**************************************************************************
-+ * From accel_fwd.c
-+ **************************************************************************/
-+
-+/*! \brief Init the forwarding infrastructure
-+ * \return 0 on success, or -ENOMEM if it couldn't get memory for the
-+ * forward table 
-+ */
-+extern int netback_accel_init_fwd(void);
-+
-+/*! \brief Shut down the forwarding and free memory. */
-+extern void netback_accel_shutdown_fwd(void);
-+
-+/*! Initialise each nic port's fowarding table */
-+extern void *netback_accel_init_fwd_port(void);
-+extern void netback_accel_shutdown_fwd_port(void *fwd_priv);
-+
-+/*! \brief Add an entry to the forwarding table. 
-+ * \param mac : MAC address, used as hash key
-+ * \param ctxt : value to associate with key (can be NULL, see
-+ * netback_accel_fwd_set_context)
-+ * \return 0 on success, -ENOMEM if table was full and could no grow it
-+ */
-+extern int netback_accel_fwd_add(const __u8 *mac, void *context,
-+                               void *fwd_priv);
-+
-+/*! \brief Remove an entry from the forwarding table. 
-+ * \param mac : the MAC address to remove
-+ * \return nothing: it is not an error if the mac was not in the table
-+ */
-+extern void netback_accel_fwd_remove(const __u8 *mac, void *fwd_priv);
-+
-+/*! \brief Set the context pointer for an existing fwd table entry.
-+ * \param mac : key that is already present in the table
-+ * \param context : new value to associate with key
-+ * \return 0 on success, -ENOENT if mac not present in table.
-+ */
-+extern int netback_accel_fwd_set_context(const __u8 *mac, void *context,
-+                                       void *fwd_priv);
-+
-+/**************************************************************************
-+ * From accel_msg.c
-+ **************************************************************************/
-+
-+
-+/*! \brief Send the start-of-day message that handshakes with the VNIC
-+ *  and tells it its MAC address.
-+ *
-+ * \param bend The back end driver data structure
-+ * \param version The version of communication to use, e.g. NET_ACCEL_MSG_VERSION
-+ */
-+extern void netback_accel_msg_tx_hello(struct netback_accel *bend,
-+                                     unsigned version);
-+
-+/*! \brief Send a "there's a new local mac address" message 
-+ *
-+ * \param bend The back end driver data structure for the vnic to send
-+ * the message to 
-+ * \param mac Pointer to the new mac address
-+ */
-+extern void netback_accel_msg_tx_new_localmac(struct netback_accel *bend,
-+                                            const void *mac);
-+
-+/*! \brief Send a "a mac address that was local has gone away" message 
-+ *
-+ * \param bend The back end driver data structure for the vnic to send
-+ * the message to 
-+ * \param mac Pointer to the old mac address
-+ */
-+extern void netback_accel_msg_tx_old_localmac(struct netback_accel *bend,
-+                                            const void *mac);
-+
-+extern void netback_accel_set_interface_state(struct netback_accel *bend,
-+                                            int up);
-+
-+/*! \brief Process the message queue for a bend that has just
-+ * interrupted.
-+ * 
-+ * Demultiplexs an interrupt from the front end driver, taking
-+ * messages from the fifo and taking appropriate action.
-+ * 
-+ * \param bend The back end driver data structure
-+ */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+extern void netback_accel_msg_rx_handler(struct work_struct *arg);
-+#else
-+extern void netback_accel_msg_rx_handler(void *bend_void);
-+#endif
-+
-+/**************************************************************************
-+ * From accel_xenbus.c
-+ **************************************************************************/
-+/*! List of all the bends currently in existence. */
-+extern struct netback_accel *bend_list;
-+extern struct mutex bend_list_mutex;
-+
-+/*! \brief Probe a new network interface. */
-+extern int netback_accel_probe(struct xenbus_device *dev);
-+
-+/*! \brief Remove a network interface. */
-+extern int netback_accel_remove(struct xenbus_device *dev);
-+
-+/*! \brief Shutdown all accelerator backends */
-+extern void netback_accel_shutdown_bends(void);
-+
-+/*! \brief Initiate the xenbus state teardown handshake */
-+extern void netback_accel_set_closing(struct netback_accel *bend);
-+
-+/**************************************************************************
-+ * From accel_debugfs.c
-+ **************************************************************************/
-+/*! Global statistics */
-+struct netback_accel_global_stats {
-+      /*! Number of TX packets seen through driverlink */
-+      u64 dl_tx_packets;
-+      /*! Number of TX packets seen through driverlink we didn't like */
-+      u64 dl_tx_bad_packets;
-+      /*! Number of RX packets seen through driverlink */
-+      u64 dl_rx_packets;
-+      /*! Number of mac addresses we are forwarding to */
-+      u32 num_fwds;
-+};
-+
-+/*! Debug fs entries for each of the above stats */
-+struct netback_accel_global_dbfs {
-+      struct dentry *dl_tx_packets;
-+      struct dentry *dl_tx_bad_packets;
-+      struct dentry *dl_rx_packets;
-+      struct dentry *num_fwds;
-+};
-+
-+#if NETBACK_ACCEL_STATS
-+extern struct netback_accel_global_stats global_stats;
-+#endif
-+
-+/*! \brief Initialise the debugfs root and populate with global stats */
-+extern void netback_accel_debugfs_init(void);
-+
-+/*! \brief Remove our debugfs root directory */
-+extern void netback_accel_debugfs_fini(void);
-+
-+/*! \brief Add per-bend statistics to debug fs */
-+extern int netback_accel_debugfs_create(struct netback_accel *bend);
-+/*! \brief Remove per-bend statistics from debug fs */
-+extern int netback_accel_debugfs_remove(struct netback_accel *bend);
-+
-+#endif /* NETBACK_ACCEL_H */
-+
-+
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_debugfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_debugfs.c    2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,148 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/fs.h>
-+#include <linux/debugfs.h>
-+
-+#include "accel.h"
-+
-+#if defined(CONFIG_DEBUG_FS)
-+static struct dentry *sfc_debugfs_root = NULL;
-+#endif
-+
-+#if NETBACK_ACCEL_STATS
-+struct netback_accel_global_stats global_stats;
-+#if defined(CONFIG_DEBUG_FS)
-+static struct netback_accel_global_dbfs  global_dbfs;
-+#endif
-+#endif
-+
-+void netback_accel_debugfs_init(void) 
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      sfc_debugfs_root = debugfs_create_dir("sfc_netback", NULL);
-+      if (sfc_debugfs_root == NULL)
-+              return;
-+
-+      global_dbfs.num_fwds = debugfs_create_u32
-+              ("num_fwds", S_IRUSR | S_IRGRP | S_IROTH,
-+               sfc_debugfs_root, &global_stats.num_fwds);
-+      global_dbfs.dl_tx_packets = debugfs_create_u64
-+              ("dl_tx_packets", S_IRUSR | S_IRGRP | S_IROTH,
-+               sfc_debugfs_root, &global_stats.dl_tx_packets);
-+      global_dbfs.dl_rx_packets = debugfs_create_u64
-+              ("dl_rx_packets", S_IRUSR | S_IRGRP | S_IROTH,
-+               sfc_debugfs_root, &global_stats.dl_rx_packets);
-+      global_dbfs.dl_tx_bad_packets = debugfs_create_u64
-+              ("dl_tx_bad_packets", S_IRUSR | S_IRGRP | S_IROTH,
-+               sfc_debugfs_root, &global_stats.dl_tx_bad_packets);
-+#endif
-+}
-+
-+
-+void netback_accel_debugfs_fini(void)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      debugfs_remove(global_dbfs.num_fwds);
-+      debugfs_remove(global_dbfs.dl_tx_packets);
-+      debugfs_remove(global_dbfs.dl_rx_packets);
-+      debugfs_remove(global_dbfs.dl_tx_bad_packets);
-+
-+      debugfs_remove(sfc_debugfs_root);
-+#endif
-+}
-+
-+
-+int netback_accel_debugfs_create(struct netback_accel *bend)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      /* Smallest length is 7 (vif0.0\n) */
-+      int length = 7, temp;
-+
-+      if (sfc_debugfs_root == NULL)
-+              return -ENOENT;
-+
-+      /* Work out length of string representation of far_end and vif_num */
-+      temp = bend->far_end;
-+      while (temp > 9) {
-+              length++;
-+              temp = temp / 10;
-+      }
-+      temp = bend->vif_num;
-+      while (temp > 9) {
-+              length++;
-+              temp = temp / 10;
-+      }
-+
-+      bend->dbfs_dir_name = kmalloc(length, GFP_KERNEL);
-+      if (bend->dbfs_dir_name == NULL)
-+              return -ENOMEM;
-+      sprintf(bend->dbfs_dir_name, "vif%d.%d", bend->far_end, bend->vif_num);
-+
-+      bend->dbfs_dir = debugfs_create_dir(bend->dbfs_dir_name, 
-+                                          sfc_debugfs_root);
-+      if (bend->dbfs_dir == NULL) {
-+              kfree(bend->dbfs_dir_name);
-+              return -ENOMEM;
-+      }
-+
-+#if NETBACK_ACCEL_STATS
-+      bend->dbfs.evq_wakeups = debugfs_create_u64
-+              ("evq_wakeups", S_IRUSR | S_IRGRP | S_IROTH,
-+               bend->dbfs_dir, &bend->stats.evq_wakeups);
-+      bend->dbfs.evq_timeouts = debugfs_create_u64
-+              ("evq_timeouts", S_IRUSR | S_IRGRP | S_IROTH,
-+               bend->dbfs_dir, &bend->stats.evq_timeouts);
-+      bend->dbfs.num_filters = debugfs_create_u32
-+              ("num_filters", S_IRUSR | S_IRGRP | S_IROTH,
-+               bend->dbfs_dir, &bend->stats.num_filters);
-+      bend->dbfs.num_buffer_pages = debugfs_create_u32
-+              ("num_buffer_pages", S_IRUSR | S_IRGRP | S_IROTH,
-+               bend->dbfs_dir, &bend->stats.num_buffer_pages);
-+#endif
-+#endif
-+        return 0;
-+}
-+
-+
-+int netback_accel_debugfs_remove(struct netback_accel *bend)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      if (bend->dbfs_dir != NULL) {
-+#if NETBACK_ACCEL_STATS
-+              debugfs_remove(bend->dbfs.evq_wakeups);
-+              debugfs_remove(bend->dbfs.evq_timeouts);
-+              debugfs_remove(bend->dbfs.num_filters);
-+              debugfs_remove(bend->dbfs.num_buffer_pages);
-+#endif
-+              debugfs_remove(bend->dbfs_dir);
-+      }
-+
-+      if (bend->dbfs_dir_name)
-+              kfree(bend->dbfs_dir_name);
-+#endif
-+        return 0;
-+}
-+
-+
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_fwd.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_fwd.c        2008-04-02 12:34:02.000000000 +0200
-@@ -0,0 +1,420 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include "accel.h"
-+#include "accel_cuckoo_hash.h"
-+#include "accel_util.h"
-+#include "accel_solarflare.h"
-+
-+#include "driverlink_api.h"
-+
-+#include <linux/if_arp.h>
-+#include <linux/skbuff.h>
-+#include <linux/list.h>
-+
-+/* State stored in the forward table */
-+struct fwd_struct {
-+      struct list_head link; /* Forms list */
-+      void * context;
-+      __u8 valid;
-+      __u8 mac[ETH_ALEN];
-+};
-+
-+/* Max value we support */
-+#define NUM_FWDS_BITS 8
-+#define NUM_FWDS (1 << NUM_FWDS_BITS)
-+#define FWD_MASK (NUM_FWDS - 1)
-+
-+struct port_fwd {
-+      /* Make a list */
-+      struct list_head link;
-+      /* Hash table to store the fwd_structs */
-+      cuckoo_hash_table fwd_hash_table;
-+      /* The array of fwd_structs */
-+      struct fwd_struct *fwd_array;
-+      /* Linked list of entries in use. */
-+      struct list_head fwd_list;
-+      /* Could do something clever with a reader/writer lock. */
-+      spinlock_t fwd_lock;
-+      /* Make find_free_entry() a bit faster by caching this */
-+      int last_free_index;
-+};
-+
-+/*
-+ * This is unlocked as it's only called from dl probe and remove,
-+ * which are themselves synchronised.  Could get rid of it entirely as
-+ * it's never iterated, but useful for debug
-+ */
-+static struct list_head port_fwds;
-+
-+
-+/* Search the fwd_array for an unused entry */
-+static int fwd_find_free_entry(struct port_fwd *fwd_set)
-+{
-+      int index = fwd_set->last_free_index;
-+
-+      do {
-+              if (!fwd_set->fwd_array[index].valid) {
-+                      fwd_set->last_free_index = index;
-+                      return index;
-+              }
-+              index++;
-+              if (index >= NUM_FWDS)
-+                      index = 0;
-+      } while (index != fwd_set->last_free_index);
-+
-+      return -ENOMEM;
-+}
-+
-+
-+/* Look up a MAC in the hash table. Caller should hold table lock. */
-+static inline struct fwd_struct *fwd_find_entry(const __u8 *mac,
-+                                              struct port_fwd *fwd_set)
-+{
-+      cuckoo_hash_value value;
-+      cuckoo_hash_mac_key key = cuckoo_mac_to_key(mac);
-+
-+      if (cuckoo_hash_lookup(&fwd_set->fwd_hash_table,
-+                             (cuckoo_hash_key *)(&key),
-+                             &value)) {
-+              struct fwd_struct *fwd = &fwd_set->fwd_array[value];
-+              DPRINTK_ON(memcmp(fwd->mac, mac, ETH_ALEN) != 0);
-+              return fwd;
-+      }
-+
-+      return NULL;
-+}
-+
-+
-+/* Initialise each nic port's fowarding table */
-+void *netback_accel_init_fwd_port(void) 
-+{     
-+      struct port_fwd *fwd_set;
-+
-+      fwd_set = kzalloc(sizeof(struct port_fwd), GFP_KERNEL);
-+      if (fwd_set == NULL) {
-+              return NULL;
-+      }
-+
-+      spin_lock_init(&fwd_set->fwd_lock);
-+      
-+      fwd_set->fwd_array = kzalloc(sizeof (struct fwd_struct) * NUM_FWDS,
-+                                   GFP_KERNEL);
-+      if (fwd_set->fwd_array == NULL) {
-+              kfree(fwd_set);
-+              return NULL;
-+      }
-+      
-+      if (cuckoo_hash_init(&fwd_set->fwd_hash_table, NUM_FWDS_BITS, 8) != 0) {
-+              kfree(fwd_set->fwd_array);
-+              kfree(fwd_set);
-+              return NULL;
-+      }
-+      
-+      INIT_LIST_HEAD(&fwd_set->fwd_list);
-+      
-+      list_add(&fwd_set->link, &port_fwds);
-+
-+      return fwd_set;
-+}
-+
-+
-+void netback_accel_shutdown_fwd_port(void *fwd_priv)
-+{
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+
-+      BUG_ON(fwd_priv == NULL);
-+      
-+      BUG_ON(list_empty(&port_fwds));
-+      list_del(&fwd_set->link);
-+
-+      BUG_ON(!list_empty(&fwd_set->fwd_list));
-+
-+      cuckoo_hash_destroy(&fwd_set->fwd_hash_table);
-+      kfree(fwd_set->fwd_array);
-+      kfree(fwd_set);
-+}
-+
-+
-+int netback_accel_init_fwd()
-+{
-+      INIT_LIST_HEAD(&port_fwds);
-+      return 0;
-+}
-+
-+
-+void netback_accel_shutdown_fwd()
-+{
-+      BUG_ON(!list_empty(&port_fwds));
-+}
-+
-+
-+/*
-+ * Add an entry to the forwarding table.  Returns -ENOMEM if no
-+ * space.
-+ */
-+int netback_accel_fwd_add(const __u8 *mac, void *context, void *fwd_priv)
-+{
-+      struct fwd_struct *fwd;
-+      int rc = 0, index;
-+      unsigned long flags;
-+      cuckoo_hash_mac_key key = cuckoo_mac_to_key(mac);
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+
-+      BUG_ON(fwd_priv == NULL);
-+
-+      DPRINTK("Adding mac " MAC_FMT "\n", MAC_ARG(mac));
-+       
-+      spin_lock_irqsave(&fwd_set->fwd_lock, flags);
-+      
-+      if ((rc = fwd_find_free_entry(fwd_set)) < 0 ) {
-+              spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+              return rc;
-+      }
-+
-+      index = rc;
-+
-+      /* Shouldn't already be in the table */
-+      if (cuckoo_hash_lookup(&fwd_set->fwd_hash_table,
-+                             (cuckoo_hash_key *)(&key), &rc) != 0) {
-+              spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+              EPRINTK("MAC address " MAC_FMT " already accelerated.\n",
-+                      MAC_ARG(mac));
-+              return -EEXIST;
-+      }
-+
-+      if ((rc = cuckoo_hash_add(&fwd_set->fwd_hash_table,
-+                                (cuckoo_hash_key *)(&key), index, 1)) == 0) {
-+              fwd = &fwd_set->fwd_array[index];
-+              fwd->valid = 1;
-+              fwd->context = context;
-+              memcpy(fwd->mac, mac, ETH_ALEN);
-+              list_add(&fwd->link, &fwd_set->fwd_list);
-+              NETBACK_ACCEL_STATS_OP(global_stats.num_fwds++);
-+      }
-+
-+      spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+
-+      /*
-+       * No need to tell frontend that this mac address is local -
-+       * it should auto-discover through packets on fastpath what is
-+       * local and what is not, and just being on same server
-+       * doesn't make it local (it could be on a different
-+       * bridge)
-+       */
-+
-+      return rc;
-+}
-+
-+
-+/* remove an entry from the forwarding tables. */
-+void netback_accel_fwd_remove(const __u8 *mac, void *fwd_priv)
-+{
-+      struct fwd_struct *fwd;
-+      unsigned long flags;
-+      cuckoo_hash_mac_key key = cuckoo_mac_to_key(mac);
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+
-+      DPRINTK("Removing mac " MAC_FMT "\n", MAC_ARG(mac));
-+
-+      BUG_ON(fwd_priv == NULL);
-+
-+      spin_lock_irqsave(&fwd_set->fwd_lock, flags);
-+
-+      fwd = fwd_find_entry(mac, fwd_set);
-+      if (fwd != NULL) {
-+              BUG_ON(list_empty(&fwd_set->fwd_list));
-+              list_del(&fwd->link);
-+
-+              fwd->valid = 0;
-+              cuckoo_hash_remove(&fwd_set->fwd_hash_table, 
-+                                 (cuckoo_hash_key *)(&key));
-+              NETBACK_ACCEL_STATS_OP(global_stats.num_fwds--);
-+      }
-+      spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+
-+      /*
-+       * No need to tell frontend that this is no longer present -
-+       * the frontend is currently only interested in remote
-+       * addresses and it works these out (mostly) by itself
-+       */
-+}
-+
-+
-+/* Set the context pointer for a hash table entry. */
-+int netback_accel_fwd_set_context(const __u8 *mac, void *context, 
-+                                void *fwd_priv)
-+{
-+      struct fwd_struct *fwd;
-+      unsigned long flags;
-+      int rc = -ENOENT;
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+
-+      BUG_ON(fwd_priv == NULL);
-+
-+      spin_lock_irqsave(&fwd_set->fwd_lock, flags);
-+      fwd = fwd_find_entry(mac, fwd_set);
-+      if (fwd != NULL) {
-+              fwd->context = context;
-+              rc = 0;
-+      }
-+      spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+      return rc;
-+}
-+
-+
-+/**************************************************************************
-+ * Process a received packet
-+ **************************************************************************/
-+
-+/*
-+ * Returns whether or not we have a match in our forward table for the
-+ * this skb. Must be called with appropriate fwd_lock already held
-+ */
-+static struct netback_accel *for_a_vnic(struct netback_pkt_buf *skb, 
-+                                      struct port_fwd *fwd_set)
-+{
-+      struct fwd_struct *fwd;
-+      struct netback_accel *retval = NULL;
-+
-+      fwd = fwd_find_entry(skb->mac.raw, fwd_set);
-+      if (fwd != NULL)
-+              retval = fwd->context;
-+      return retval;
-+}
-+
-+
-+static inline int packet_is_arp_reply(struct sk_buff *skb)
-+{
-+      return skb->protocol == ntohs(ETH_P_ARP) 
-+              && skb->nh.arph->ar_op == ntohs(ARPOP_REPLY);
-+}
-+
-+
-+static inline void hdr_to_filt(struct ethhdr *ethhdr, struct iphdr *ip,
-+                             struct netback_accel_filter_spec *spec)
-+{
-+      spec->proto = ip->protocol;
-+      spec->destip_be = ip->daddr;
-+      memcpy(spec->mac, ethhdr->h_source, ETH_ALEN);
-+
-+      if (ip->protocol == IPPROTO_TCP) {
-+              struct tcphdr *tcp = (struct tcphdr *)((char *)ip + 4 * ip->ihl);
-+              spec->destport_be = tcp->dest;
-+      } else {
-+              struct udphdr *udp = (struct udphdr *)((char *)ip + 4 * ip->ihl);
-+              EPRINTK_ON(ip->protocol != IPPROTO_UDP);
-+              spec->destport_be = udp->dest;
-+      }
-+}
-+
-+
-+static inline int netback_accel_can_filter(struct netback_pkt_buf *skb) 
-+{
-+      return (skb->protocol == htons(ETH_P_IP) && 
-+              ((skb->nh.iph->protocol == IPPROTO_TCP) ||
-+               (skb->nh.iph->protocol == IPPROTO_UDP)));
-+}
-+
-+
-+static inline void netback_accel_filter_packet(struct netback_accel *bend,
-+                                             struct netback_pkt_buf *skb)
-+{
-+      struct netback_accel_filter_spec fs;
-+      struct ethhdr *eh = (struct ethhdr *)(skb->mac.raw);
-+
-+      hdr_to_filt(eh, skb->nh.iph, &fs);
-+      
-+      netback_accel_filter_check_add(bend, &fs);
-+}
-+
-+
-+/*
-+ * Receive a packet and do something appropriate with it. Return true
-+ * to take exclusive ownership of the packet.  This is verging on
-+ * solarflare specific
-+ */
-+void netback_accel_rx_packet(struct netback_pkt_buf *skb, void *fwd_priv)
-+{
-+      struct netback_accel *bend;
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+      unsigned long flags;
-+
-+      BUG_ON(fwd_priv == NULL);
-+
-+      /* Checking for bcast is cheaper so do that first */
-+      if (is_broadcast_ether_addr(skb->mac.raw)) {
-+              /* pass through the slow path by not claiming ownership */
-+              return;
-+      } else if (is_multicast_ether_addr(skb->mac.raw)) {
-+              /* pass through the slow path by not claiming ownership */
-+              return;
-+      } else {
-+              /* It is unicast */
-+              spin_lock_irqsave(&fwd_set->fwd_lock, flags);
-+              /* We insert filter to pass it off to a VNIC */
-+              if ((bend = for_a_vnic(skb, fwd_set)) != NULL)
-+                      if (netback_accel_can_filter(skb))
-+                              netback_accel_filter_packet(bend, skb);
-+              spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+      }
-+      return;
-+}
-+
-+
-+void netback_accel_tx_packet(struct sk_buff *skb, void *fwd_priv) 
-+{
-+      __u8 *mac;
-+      unsigned long flags;
-+      struct port_fwd *fwd_set = (struct port_fwd *)fwd_priv;
-+      struct fwd_struct *fwd;
-+
-+      BUG_ON(fwd_priv == NULL);
-+
-+      if (is_broadcast_ether_addr(skb->mac.raw) && packet_is_arp_reply(skb)) {
-+              /*
-+               * update our fast path forwarding to reflect this
-+               * gratuitous ARP
-+               */ 
-+              mac = skb->mac.raw+ETH_ALEN;
-+
-+              DPRINTK("%s: found gratuitous ARP for " MAC_FMT "\n",
-+                      __FUNCTION__, MAC_ARG(mac));
-+
-+              spin_lock_irqsave(&fwd_set->fwd_lock, flags);
-+              /*
-+               * Might not be local, but let's tell them all it is,
-+               * and they can restore the fastpath if they continue
-+               * to get packets that way
-+               */
-+              list_for_each_entry(fwd, &fwd_set->fwd_list, link) {
-+                      struct netback_accel *bend = fwd->context;
-+                      if (bend != NULL)
-+                              netback_accel_msg_tx_new_localmac(bend, mac);
-+              }
-+
-+              spin_unlock_irqrestore(&fwd_set->fwd_lock, flags);
-+      }
-+      return;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_msg.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_msg.c        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,392 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <xen/evtchn.h>
-+
-+#include "accel.h"
-+#include "accel_msg_iface.h"
-+#include "accel_util.h"
-+#include "accel_solarflare.h"
-+
-+/* Send a HELLO to front end to start things off */
-+void netback_accel_msg_tx_hello(struct netback_accel *bend, unsigned version)
-+{
-+      unsigned long lock_state;
-+      struct net_accel_msg *msg = 
-+              net_accel_msg_start_send(bend->shared_page,
-+                                       &bend->to_domU, &lock_state);
-+      /* The queue _cannot_ be full, we're the first users. */
-+      EPRINTK_ON(msg == NULL);
-+
-+      if (msg != NULL) {
-+              net_accel_msg_init(msg, NET_ACCEL_MSG_HELLO);
-+              msg->u.hello.version = version;
-+              msg->u.hello.max_pages = bend->quotas.max_buf_pages; 
-+              VPRINTK("Sending hello to channel %d\n", bend->msg_channel);
-+              net_accel_msg_complete_send_notify(bend->shared_page, 
-+                                                 &bend->to_domU,
-+                                                 &lock_state, 
-+                                                 bend->msg_channel_irq);
-+      }
-+}
-+
-+/* Send a local mac message to vnic */
-+static void netback_accel_msg_tx_localmac(struct netback_accel *bend, 
-+                                        int type, const void *mac)
-+{
-+      unsigned long lock_state;
-+      struct net_accel_msg *msg;
-+
-+      BUG_ON(bend == NULL || mac == NULL);
-+
-+      VPRINTK("Sending local mac message: " MAC_FMT "\n", 
-+              MAC_ARG((const char *)mac));  
-+      
-+      msg = net_accel_msg_start_send(bend->shared_page, &bend->to_domU,
-+                                     &lock_state);
-+      
-+      if (msg != NULL) {
-+              net_accel_msg_init(msg, NET_ACCEL_MSG_LOCALMAC);
-+              msg->u.localmac.flags = type;
-+              memcpy(msg->u.localmac.mac, mac, ETH_ALEN);
-+              net_accel_msg_complete_send_notify(bend->shared_page, 
-+                                                 &bend->to_domU,
-+                                                 &lock_state, 
-+                                                 bend->msg_channel_irq);
-+      } else {
-+              /*
-+               * TODO if this happens we may leave a domU
-+               * fastpathing packets when they should be delivered
-+               * locally.  Solution is get domU to timeout entries
-+               * in its fastpath lookup table when it receives no RX
-+               * traffic
-+               */
-+              EPRINTK("%s: saw full queue, may need ARP timer to recover\n",
-+                      __FUNCTION__);
-+      }
-+}
-+
-+/* Send an add local mac message to vnic */
-+void netback_accel_msg_tx_new_localmac(struct netback_accel *bend,
-+                                     const void *mac)
-+{
-+      netback_accel_msg_tx_localmac(bend, NET_ACCEL_MSG_ADD, mac);
-+}
-+
-+
-+static int netback_accel_msg_rx_buffer_map(struct netback_accel *bend, 
-+                                         struct net_accel_msg *msg)
-+{
-+      int log2_pages, rc;
-+
-+      /* Can only allocate in power of two */
-+      log2_pages = log2_ge(msg->u.mapbufs.pages, 0);
-+      if (msg->u.mapbufs.pages != pow2(log2_pages)) {
-+              EPRINTK("%s: Can only alloc bufs in power of 2 sizes (%d)\n",
-+                      __FUNCTION__, msg->u.mapbufs.pages);
-+              rc = -EINVAL;
-+              goto err_out;
-+      }
-+  
-+      /*
-+       * Sanity.  Assumes NET_ACCEL_MSG_MAX_PAGE_REQ is same for
-+       * both directions/domains
-+       */
-+      if (msg->u.mapbufs.pages > NET_ACCEL_MSG_MAX_PAGE_REQ) {
-+              EPRINTK("%s: too many pages in a single message: %d %d\n", 
-+                      __FUNCTION__, msg->u.mapbufs.pages,
-+                      NET_ACCEL_MSG_MAX_PAGE_REQ);
-+              rc = -EINVAL;
-+              goto err_out;
-+      }
-+  
-+      if ((rc = netback_accel_add_buffers(bend, msg->u.mapbufs.pages, 
-+                                          log2_pages, msg->u.mapbufs.grants, 
-+                                          &msg->u.mapbufs.buf)) < 0) {
-+              goto err_out;
-+      }
-+
-+      msg->id |= NET_ACCEL_MSG_REPLY;
-+  
-+      return 0;
-+
-+ err_out:
-+      EPRINTK("%s: err_out\n", __FUNCTION__);
-+      msg->id |= NET_ACCEL_MSG_ERROR | NET_ACCEL_MSG_REPLY;
-+      return rc;
-+}
-+
-+
-+/* Hint from frontend that one of our filters is out of date */
-+static int netback_accel_process_fastpath(struct netback_accel *bend, 
-+                                        struct net_accel_msg *msg)
-+{
-+      struct netback_accel_filter_spec spec;
-+
-+      if (msg->u.fastpath.flags & NET_ACCEL_MSG_REMOVE) {
-+              /* 
-+               * Would be nice to BUG() this but would leave us
-+               * vulnerable to naughty frontend
-+               */
-+              EPRINTK_ON(msg->u.fastpath.flags & NET_ACCEL_MSG_ADD);
-+              
-+              memcpy(spec.mac, msg->u.fastpath.mac, ETH_ALEN);
-+              spec.destport_be = msg->u.fastpath.port;
-+              spec.destip_be = msg->u.fastpath.ip;
-+              spec.proto = msg->u.fastpath.proto;
-+
-+              netback_accel_filter_remove_spec(bend, &spec);
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/* Flow control for message queues */
-+inline void set_queue_not_full(struct netback_accel *bend)
-+{
-+      if (!test_and_set_bit(NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL_B, 
-+                            (unsigned long *)&bend->shared_page->aflags))
-+              notify_remote_via_irq(bend->msg_channel_irq);
-+      else
-+              VPRINTK("queue not full bit already set, not signalling\n");
-+}
-+
-+
-+/* Flow control for message queues */
-+inline void set_queue_full(struct netback_accel *bend)
-+{
-+      if (!test_and_set_bit(NET_ACCEL_MSG_AFLAGS_QUEUE0FULL_B,
-+                            (unsigned long *)&bend->shared_page->aflags))
-+              notify_remote_via_irq(bend->msg_channel_irq);
-+      else
-+              VPRINTK("queue full bit already set, not signalling\n");
-+}
-+
-+
-+void netback_accel_set_interface_state(struct netback_accel *bend, int up)
-+{
-+      bend->shared_page->net_dev_up = up;
-+      if (!test_and_set_bit(NET_ACCEL_MSG_AFLAGS_NETUPDOWN_B, 
-+                           (unsigned long *)&bend->shared_page->aflags))
-+              notify_remote_via_irq(bend->msg_channel_irq);
-+      else
-+              VPRINTK("interface up/down bit already set, not signalling\n");
-+}
-+
-+
-+static int check_rx_hello_version(unsigned version) 
-+{
-+      /* Should only happen if there's been a version mismatch */
-+      BUG_ON(version == NET_ACCEL_MSG_VERSION);
-+
-+      if (version > NET_ACCEL_MSG_VERSION) {
-+              /* Newer protocol, we must refuse */
-+              return -EPROTO;
-+      }
-+
-+      if (version < NET_ACCEL_MSG_VERSION) {
-+              /*
-+               * We are newer, so have discretion to accept if we
-+               * wish.  For now however, just reject
-+               */
-+              return -EPROTO;
-+      }
-+
-+      return -EINVAL;
-+}
-+
-+
-+static int process_rx_msg(struct netback_accel *bend,
-+                        struct net_accel_msg *msg)
-+{
-+      int err = 0;
-+                    
-+      switch (msg->id) {
-+      case NET_ACCEL_MSG_REPLY | NET_ACCEL_MSG_HELLO:
-+              /* Reply to a HELLO; mark ourselves as connected */
-+              DPRINTK("got Hello reply, version %.8x\n",
-+                      msg->u.hello.version);
-+              
-+              /*
-+               * Check that we've not successfully done this
-+               * already.  NB no check at the moment that this reply
-+               * comes after we've actually sent a HELLO as that's
-+               * not possible with the current code structure
-+               */
-+              if (bend->hw_state != NETBACK_ACCEL_RES_NONE)
-+                      return -EPROTO;
-+
-+              /* Store max_pages for accel_setup */
-+              if (msg->u.hello.max_pages > bend->quotas.max_buf_pages) {
-+                      EPRINTK("More pages than quota allows (%d > %d)\n",
-+                              msg->u.hello.max_pages, 
-+                              bend->quotas.max_buf_pages);
-+                      /* Force it down to the quota */
-+                      msg->u.hello.max_pages = bend->quotas.max_buf_pages;
-+              }
-+              bend->max_pages = msg->u.hello.max_pages;
-+              
-+              /* Set up the hardware visible to the other end */
-+              err = bend->accel_setup(bend);
-+              if (err) {
-+                      /* This is fatal */
-+                      DPRINTK("Hello gave accel_setup error %d\n", err);
-+                      netback_accel_set_closing(bend);
-+              } else {
-+                      /*
-+                       * Now add the context so that packet
-+                       * forwarding will commence
-+                       */
-+                      netback_accel_fwd_set_context(bend->mac, bend, 
-+                                                    bend->fwd_priv);
-+              }
-+              break;
-+      case NET_ACCEL_MSG_REPLY | NET_ACCEL_MSG_HELLO | NET_ACCEL_MSG_ERROR:
-+              EPRINTK("got Hello error, versions us:%.8x them:%.8x\n",
-+                      NET_ACCEL_MSG_VERSION, msg->u.hello.version);
-+
-+              if (bend->hw_state != NETBACK_ACCEL_RES_NONE)
-+                      return -EPROTO;
-+
-+              if (msg->u.hello.version != NET_ACCEL_MSG_VERSION) {
-+                      /* Error is due to version mismatch */
-+                      err = check_rx_hello_version(msg->u.hello.version);
-+                      if (err == 0) {
-+                              /*
-+                               * It's OK to be compatible, send
-+                               * another hello with compatible version
-+                               */
-+                              netback_accel_msg_tx_hello
-+                                      (bend, msg->u.hello.version);
-+                      } else {
-+                              /*
-+                               * Tell frontend that we're not going to
-+                               * send another HELLO by going to Closing.
-+                               */
-+                              netback_accel_set_closing(bend);
-+                      }
-+              } 
-+              break;
-+      case NET_ACCEL_MSG_MAPBUF:
-+              VPRINTK("Got mapped buffers request %d\n",
-+                      msg->u.mapbufs.reqid);
-+
-+              if (bend->hw_state == NETBACK_ACCEL_RES_NONE)
-+                      return -EPROTO;
-+
-+              /*
-+               * Frontend wants a buffer table entry for the
-+               * supplied pages
-+               */
-+              err = netback_accel_msg_rx_buffer_map(bend, msg);
-+              if (net_accel_msg_reply_notify(bend->shared_page,
-+                                             bend->msg_channel_irq, 
-+                                             &bend->to_domU, msg)) {
-+                      /*
-+                       * This is fatal as we can't tell the frontend
-+                       * about the problem through the message
-+                       * queue, and so would otherwise stalemate
-+                       */
-+                      netback_accel_set_closing(bend);
-+              }
-+              break;
-+      case NET_ACCEL_MSG_FASTPATH:
-+              DPRINTK("Got fastpath request\n");
-+
-+              if (bend->hw_state == NETBACK_ACCEL_RES_NONE)
-+                      return -EPROTO;
-+
-+              err = netback_accel_process_fastpath(bend, msg);
-+              break;
-+      default:
-+              EPRINTK("Huh? Message code is %x\n", msg->id);
-+              err = -EPROTO;
-+              break;
-+      }
-+      return err;
-+}
-+
-+
-+/*  Demultiplex an IRQ from the frontend driver.  */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void netback_accel_msg_rx_handler(struct work_struct *arg)
-+#else
-+void netback_accel_msg_rx_handler(void *bend_void)
-+#endif
-+{
-+      struct net_accel_msg msg;
-+      int err, queue_was_full = 0;
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      struct netback_accel *bend = 
-+              container_of(arg, struct netback_accel, handle_msg);
-+#else
-+      struct netback_accel *bend = (struct netback_accel *)bend_void;
-+#endif
-+
-+      mutex_lock(&bend->bend_mutex);
-+
-+      /*
-+       * This happens when the shared pages have been unmapped, but
-+       * the workqueue not flushed yet
-+       */
-+      if (bend->shared_page == NULL)
-+              goto done;
-+
-+      if ((bend->shared_page->aflags &
-+           NET_ACCEL_MSG_AFLAGS_TO_DOM0_MASK) != 0) {
-+              if (bend->shared_page->aflags &
-+                  NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL) {
-+                      /* We've been told there may now be space. */
-+                      clear_bit(NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL_B, 
-+                                (unsigned long *)&bend->shared_page->aflags);
-+              }
-+
-+              if (bend->shared_page->aflags &
-+                  NET_ACCEL_MSG_AFLAGS_QUEUEUFULL) {
-+                      clear_bit(NET_ACCEL_MSG_AFLAGS_QUEUEUFULL_B, 
-+                                (unsigned long *)&bend->shared_page->aflags);
-+                      queue_was_full = 1;
-+              }
-+      }
-+
-+      while ((err = net_accel_msg_recv(bend->shared_page, &bend->from_domU,
-+                                       &msg)) == 0) {
-+              err = process_rx_msg(bend, &msg);
-+              
-+              if (err != 0) {
-+                      EPRINTK("%s: Error %d\n", __FUNCTION__, err);
-+                      goto err;
-+              }
-+      }
-+
-+ err:
-+      /* There will be space now if we can make any. */
-+      if (queue_was_full) 
-+              set_queue_not_full(bend);
-+ done:
-+      mutex_unlock(&bend->bend_mutex);
-+
-+      return;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_solarflare.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_solarflare.c 2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,1253 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include "common.h"
-+
-+#include "accel.h"
-+#include "accel_solarflare.h"
-+#include "accel_msg_iface.h"
-+#include "accel_util.h"
-+
-+#include "accel_cuckoo_hash.h"
-+
-+#include "ci/driver/resource/efx_vi.h"
-+
-+#include "ci/efrm/nic_table.h" 
-+#include "ci/efhw/public.h"
-+
-+#include <xen/evtchn.h>
-+#include <xen/driver_util.h>
-+#include <linux/list.h>
-+#include <linux/mutex.h>
-+
-+#include "driverlink_api.h"
-+
-+#define SF_XEN_RX_USR_BUF_SIZE 2048
-+
-+struct falcon_bend_accel_priv {
-+      struct efx_vi_state *efx_vih;
-+
-+      /*! Array of pointers to dma_map state, used so VNIC can
-+       *  request their removal in a single message
-+       */
-+      struct efx_vi_dma_map_state **dma_maps;
-+      /*! Index into dma_maps */
-+      int dma_maps_index; 
-+
-+      /*! Serialises access to filters */
-+      spinlock_t filter_lock;      
-+      /*! Bitmap of which filters are free */
-+      unsigned long free_filters;      
-+      /*! Used for index normalisation */
-+      u32 filter_idx_mask;            
-+      struct netback_accel_filter_spec *fspecs; 
-+      cuckoo_hash_table filter_hash_table;
-+
-+      u32 txdmaq_gnt;
-+      u32 rxdmaq_gnt;
-+      u32 doorbell_gnt;
-+      u32 evq_rptr_gnt;
-+      u32 evq_mem_gnts[EF_HW_FALCON_EVQ_PAGES];
-+      u32 evq_npages;
-+};
-+
-+/* Forward declaration */
-+static int netback_accel_filter_init(struct netback_accel *);
-+static void netback_accel_filter_shutdown(struct netback_accel *);
-+
-+/**************************************************************************
-+ * 
-+ * Driverlink stuff
-+ *
-+ **************************************************************************/
-+
-+struct driverlink_port {
-+      struct list_head link;
-+      enum net_accel_hw_type type;
-+      struct net_device *net_dev;
-+      struct efx_dl_device *efx_dl_dev;
-+      int nic_index;
-+      void *fwd_priv;
-+};
-+
-+static struct list_head dl_ports;
-+
-+/* This mutex protects global state, such as the dl_ports list */
-+DEFINE_MUTEX(accel_mutex);
-+
-+static int init_done = 0;
-+
-+/* The DL callbacks */
-+
-+
-+#if defined(EFX_USE_FASTCALL)
-+static enum efx_veto fastcall
-+#else
-+static enum efx_veto
-+#endif
-+bend_dl_tx_packet(struct efx_dl_device *efx_dl_dev,
-+                struct sk_buff *skb)
-+{
-+      struct driverlink_port *port = efx_dl_dev->priv;
-+
-+      BUG_ON(port == NULL);
-+
-+      NETBACK_ACCEL_STATS_OP(global_stats.dl_tx_packets++);
-+      if (skb->mac.raw != NULL)
-+              netback_accel_tx_packet(skb, port->fwd_priv);
-+      else {
-+              DPRINTK("Ignoring packet with missing mac address\n");
-+              NETBACK_ACCEL_STATS_OP(global_stats.dl_tx_bad_packets++);
-+      }
-+      return EFX_ALLOW_PACKET;
-+}
-+
-+/* EFX_USE_FASTCALL */
-+#if defined(EFX_USE_FASTCALL)
-+static enum efx_veto fastcall
-+#else
-+static enum efx_veto
-+#endif
-+bend_dl_rx_packet(struct efx_dl_device *efx_dl_dev,
-+                const char *pkt_buf, int pkt_len)
-+{
-+      struct driverlink_port *port = efx_dl_dev->priv;
-+      struct netback_pkt_buf pkt;
-+      struct ethhdr *eh;
-+
-+      BUG_ON(port == NULL);
-+
-+      pkt.mac.raw = (char *)pkt_buf;
-+      pkt.nh.raw = (char *)pkt_buf + ETH_HLEN;
-+      eh = (struct ethhdr *)pkt_buf;
-+      pkt.protocol = eh->h_proto;
-+
-+      NETBACK_ACCEL_STATS_OP(global_stats.dl_rx_packets++);
-+      netback_accel_rx_packet(&pkt, port->fwd_priv);
-+      return EFX_ALLOW_PACKET;
-+}
-+
-+
-+/* Callbacks we'd like to get from the netdriver through driverlink */
-+struct efx_dl_callbacks bend_dl_callbacks =
-+      {
-+              .tx_packet = bend_dl_tx_packet,
-+              .rx_packet = bend_dl_rx_packet,
-+      };
-+
-+
-+static struct netback_accel_hooks accel_hooks = {
-+      THIS_MODULE,
-+      &netback_accel_probe,
-+      &netback_accel_remove
-+};
-+
-+
-+/*
-+ * Handy helper which given an efx_dl_device works out which
-+ * efab_nic_t index into efrm_nic_table.nics[] it corresponds to 
-+ */
-+static int efx_device_to_efab_nic_index(struct efx_dl_device *efx_dl_dev) 
-+{
-+      int i;
-+
-+      for (i = 0; i < EFHW_MAX_NR_DEVS; i++) {
-+              struct efhw_nic *nic = efrm_nic_table.nic[i];
-+
-+              /*
-+               * It's possible for the nic structure to have not
-+               * been initialised if the resource driver failed its
-+               * driverlink probe
-+               */ 
-+              if (nic == NULL || nic->net_driver_dev == NULL)
-+                      continue;
-+
-+              /* Work out if these are talking about the same NIC */
-+              if (nic->net_driver_dev->pci_dev == efx_dl_dev->pci_dev)
-+                      return i;
-+      }
-+
-+      return -1;
-+}
-+
-+
-+/* Driver link probe - register our callbacks */
-+static int bend_dl_probe(struct efx_dl_device *efx_dl_dev,
-+                       const struct net_device *net_dev,
-+                       const struct efx_dl_device_info *dev_info,
-+                       const char* silicon_rev)
-+{
-+      int rc;
-+      enum net_accel_hw_type type;
-+      struct driverlink_port *port;
-+
-+      DPRINTK("%s: %s\n", __FUNCTION__, silicon_rev);
-+
-+      if (strcmp(silicon_rev, "falcon/a1") == 0)
-+              type = NET_ACCEL_MSG_HWTYPE_FALCON_A;
-+      else if (strcmp(silicon_rev, "falcon/b0") == 0)
-+              type = NET_ACCEL_MSG_HWTYPE_FALCON_B;
-+      else {
-+              EPRINTK("%s: unsupported silicon %s\n", __FUNCTION__,
-+                      silicon_rev);
-+              rc = -EINVAL;
-+              goto fail1;
-+      }
-+      
-+      port = kmalloc(sizeof(struct driverlink_port), GFP_KERNEL);
-+      if (port == NULL) {
-+              EPRINTK("%s: no memory for dl probe\n", __FUNCTION__);
-+              rc = -ENOMEM;
-+              goto fail1;
-+      }
-+
-+      port->efx_dl_dev = efx_dl_dev;
-+      efx_dl_dev->priv = port;
-+
-+      port->nic_index = efx_device_to_efab_nic_index(efx_dl_dev);
-+      if (port->nic_index < 0) {
-+              /*
-+               * This can happen in theory if the resource driver
-+               * failed to initialise properly
-+               */
-+              EPRINTK("%s: nic structure not found\n", __FUNCTION__);
-+              rc = -EINVAL;
-+              goto fail2;
-+      }
-+
-+      port->fwd_priv = netback_accel_init_fwd_port();
-+      if (port->fwd_priv == NULL) {
-+              EPRINTK("%s: failed to set up forwarding for port\n",
-+                      __FUNCTION__);
-+              rc = -ENOMEM;
-+              goto fail2;
-+      }
-+
-+      rc = efx_dl_register_callbacks(efx_dl_dev, &bend_dl_callbacks);
-+      if (rc != 0) {
-+              EPRINTK("%s: register_callbacks failed\n", __FUNCTION__);
-+              goto fail3;
-+      }
-+
-+      port->type = type;
-+      port->net_dev = (struct net_device *)net_dev;
-+
-+      mutex_lock(&accel_mutex);
-+      list_add(&port->link, &dl_ports);
-+      mutex_unlock(&accel_mutex);
-+
-+      rc = netback_connect_accelerator(NETBACK_ACCEL_VERSION, 0,
-+                                       port->net_dev->name, &accel_hooks);
-+
-+      if (rc < 0) {
-+              EPRINTK("Xen netback accelerator version mismatch\n");
-+              goto fail4;
-+      } else if (rc > 0) {
-+              /*
-+               * In future may want to add backwards compatibility
-+               * and accept certain subsets of previous versions
-+               */
-+              EPRINTK("Xen netback accelerator version mismatch\n");
-+              goto fail4;
-+      } 
-+
-+      return 0;
-+
-+ fail4:
-+      mutex_lock(&accel_mutex);
-+      list_del(&port->link);
-+      mutex_unlock(&accel_mutex);
-+
-+      efx_dl_unregister_callbacks(efx_dl_dev, &bend_dl_callbacks);
-+ fail3: 
-+      netback_accel_shutdown_fwd_port(port->fwd_priv);
-+ fail2:
-+      efx_dl_dev->priv = NULL;
-+      kfree(port);
-+ fail1:
-+      return rc;
-+}
-+
-+
-+static void bend_dl_remove(struct efx_dl_device *efx_dl_dev)
-+{
-+      struct driverlink_port *port;
-+
-+      DPRINTK("Unregistering driverlink callbacks.\n");
-+
-+      mutex_lock(&accel_mutex);
-+
-+      port = (struct driverlink_port *)efx_dl_dev->priv;
-+
-+      BUG_ON(list_empty(&dl_ports));
-+      BUG_ON(port == NULL);
-+      BUG_ON(port->efx_dl_dev != efx_dl_dev);
-+
-+      netback_disconnect_accelerator(0, port->net_dev->name);
-+
-+      list_del(&port->link);
-+
-+      mutex_unlock(&accel_mutex);
-+
-+      efx_dl_unregister_callbacks(efx_dl_dev, &bend_dl_callbacks);
-+      netback_accel_shutdown_fwd_port(port->fwd_priv);
-+
-+      efx_dl_dev->priv = NULL;
-+      kfree(port);
-+
-+      return;
-+}
-+
-+
-+static struct efx_dl_driver bend_dl_driver = 
-+      {
-+              .name = "SFC Xen backend",
-+              .probe = bend_dl_probe,
-+              .remove = bend_dl_remove,
-+      };
-+
-+
-+int netback_accel_sf_init(void)
-+{
-+      int rc, nic_i;
-+      struct efhw_nic *nic;
-+
-+      INIT_LIST_HEAD(&dl_ports);
-+
-+      rc = efx_dl_register_driver(&bend_dl_driver);
-+      /* If we couldn't find the NET driver, give up */
-+      if (rc == -ENOENT)
-+              return rc;
-+      
-+      if (rc == 0) {
-+              EFRM_FOR_EACH_NIC(nic_i, nic)
-+                      falcon_nic_set_rx_usr_buf_size(nic, 
-+                                                     SF_XEN_RX_USR_BUF_SIZE);
-+      }
-+
-+      init_done = (rc == 0);
-+      return rc;
-+}
-+
-+
-+void netback_accel_sf_shutdown(void)
-+{
-+      if (!init_done)
-+              return;
-+      DPRINTK("Unregistering driverlink driver\n");
-+
-+      /*
-+       * This will trigger removal callbacks for all the devices, which
-+       * will unregister their callbacks, disconnect from netfront, etc.
-+       */
-+      efx_dl_unregister_driver(&bend_dl_driver);
-+}
-+
-+
-+int netback_accel_sf_hwtype(struct netback_accel *bend)
-+{
-+      struct driverlink_port *port;
-+
-+      mutex_lock(&accel_mutex);
-+
-+      list_for_each_entry(port, &dl_ports, link) {
-+              if (strcmp(bend->nicname, port->net_dev->name) == 0) {
-+                      bend->hw_type = port->type;
-+                      bend->accel_setup = netback_accel_setup_vnic_hw;
-+                      bend->accel_shutdown = netback_accel_shutdown_vnic_hw;
-+                      bend->fwd_priv = port->fwd_priv;
-+                      /* This is just needed to pass to efx_vi_alloc */
-+                      bend->nic_index = port->nic_index;
-+                      bend->net_dev = port->net_dev;
-+                      mutex_unlock(&accel_mutex);
-+                      return 0;
-+              }
-+      }
-+
-+      mutex_unlock(&accel_mutex);
-+
-+      EPRINTK("Failed to identify backend device '%s' with a NIC\n",
-+              bend->nicname);
-+
-+      return -ENOENT;
-+}
-+
-+
-+/****************************************************************************
-+ * Resource management code
-+ ***************************************************************************/
-+
-+static int alloc_page_state(struct netback_accel *bend, int max_pages)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv;
-+
-+      if (max_pages < 0 || max_pages > bend->quotas.max_buf_pages) {
-+              EPRINTK("%s: invalid max_pages: %d\n", __FUNCTION__, max_pages);
-+              return -EINVAL;
-+      }
-+
-+      accel_hw_priv = kzalloc(sizeof(struct falcon_bend_accel_priv),
-+                              GFP_KERNEL);
-+      if (accel_hw_priv == NULL) {
-+              EPRINTK("%s: no memory for accel_hw_priv\n", __FUNCTION__);
-+              return -ENOMEM;
-+      }
-+
-+      accel_hw_priv->dma_maps = kzalloc
-+              (sizeof(struct efx_vi_dma_map_state **) * 
-+               (max_pages / NET_ACCEL_MSG_MAX_PAGE_REQ), GFP_KERNEL);
-+      if (accel_hw_priv->dma_maps == NULL) {
-+              EPRINTK("%s: no memory for dma_maps\n", __FUNCTION__);
-+              kfree(accel_hw_priv);
-+              return -ENOMEM;
-+      }
-+
-+      bend->buffer_maps = kzalloc(sizeof(struct vm_struct *) * max_pages, 
-+                                  GFP_KERNEL);
-+      if (bend->buffer_maps == NULL) {
-+              EPRINTK("%s: no memory for buffer_maps\n", __FUNCTION__);
-+              kfree(accel_hw_priv->dma_maps);
-+              kfree(accel_hw_priv);
-+              return -ENOMEM;
-+      }
-+
-+      bend->buffer_addrs = kzalloc(sizeof(u64) * max_pages, GFP_KERNEL);
-+      if (bend->buffer_addrs == NULL) {
-+              kfree(bend->buffer_maps);
-+              kfree(accel_hw_priv->dma_maps);
-+              kfree(accel_hw_priv);
-+              return -ENOMEM;
-+      }
-+
-+      bend->accel_hw_priv = accel_hw_priv;
-+
-+      return 0;
-+}
-+
-+
-+static int free_page_state(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv;
-+
-+      DPRINTK("%s: %p\n", __FUNCTION__, bend);
-+
-+      accel_hw_priv = bend->accel_hw_priv;
-+
-+      if (accel_hw_priv) {
-+              kfree(accel_hw_priv->dma_maps);
-+              kfree(bend->buffer_maps);
-+              kfree(bend->buffer_addrs);
-+              kfree(accel_hw_priv);
-+              bend->accel_hw_priv = NULL;
-+              bend->max_pages = 0;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+/* The timeout event callback for the event q */
-+static void bend_evq_timeout(void *context, int is_timeout)
-+{
-+      struct netback_accel *bend = (struct netback_accel *)context;
-+      if (is_timeout) {
-+              /* Pass event to vnic front end driver */
-+              VPRINTK("timeout event to %d\n", bend->net_channel);
-+              NETBACK_ACCEL_STATS_OP(bend->stats.evq_timeouts++);
-+              notify_remote_via_irq(bend->net_channel_irq);
-+      } else {
-+              /* It's a wakeup event, used by Falcon */
-+              VPRINTK("wakeup to %d\n", bend->net_channel);
-+              NETBACK_ACCEL_STATS_OP(bend->stats.evq_wakeups++);
-+              notify_remote_via_irq(bend->net_channel_irq);
-+      }
-+}
-+
-+
-+/*
-+ * Create the eventq and associated gubbins for communication with the
-+ * front end vnic driver
-+ */
-+static int ef_get_vnic(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv;
-+      int rc = 0;
-+
-+      BUG_ON(bend->hw_state != NETBACK_ACCEL_RES_NONE);
-+
-+      /* Allocate page related state and accel_hw_priv */
-+      rc = alloc_page_state(bend, bend->max_pages);
-+      if (rc != 0) {
-+              EPRINTK("Failed to allocate page state: %d\n", rc);
-+              return rc;
-+      }
-+
-+      accel_hw_priv = bend->accel_hw_priv;
-+
-+      rc = efx_vi_alloc(&accel_hw_priv->efx_vih, bend->nic_index);
-+      if (rc != 0) {
-+              EPRINTK("%s: efx_vi_alloc failed %d\n", __FUNCTION__, rc);
-+              free_page_state(bend);
-+              return rc;
-+      }
-+
-+      rc = efx_vi_eventq_register_callback(accel_hw_priv->efx_vih,
-+                                           bend_evq_timeout,
-+                                           bend);
-+      if (rc != 0) {
-+              EPRINTK("%s: register_callback failed %d\n", __FUNCTION__, rc);
-+              efx_vi_free(accel_hw_priv->efx_vih);
-+              free_page_state(bend);
-+              return rc;
-+      }
-+
-+      bend->hw_state = NETBACK_ACCEL_RES_ALLOC;
-+      
-+      return 0;
-+}
-+
-+
-+static void ef_free_vnic(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+
-+      BUG_ON(bend->hw_state != NETBACK_ACCEL_RES_ALLOC);
-+
-+      efx_vi_eventq_kill_callback(accel_hw_priv->efx_vih);
-+
-+      DPRINTK("Hardware is freeable. Will proceed.\n");
-+
-+      efx_vi_free(accel_hw_priv->efx_vih);
-+      accel_hw_priv->efx_vih = NULL;
-+
-+      VPRINTK("Free page state...\n");
-+      free_page_state(bend);
-+
-+      bend->hw_state = NETBACK_ACCEL_RES_NONE;
-+}
-+
-+
-+static inline void ungrant_or_crash(grant_ref_t gntref, int domain) {
-+      if (net_accel_ungrant_page(gntref) == -EBUSY)
-+              net_accel_shutdown_remote(domain);
-+}
-+
-+
-+static void netback_accel_release_hwinfo(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      int i;
-+
-+      DPRINTK("Remove dma q grants %d %d\n", accel_hw_priv->txdmaq_gnt,
-+              accel_hw_priv->rxdmaq_gnt);
-+      ungrant_or_crash(accel_hw_priv->txdmaq_gnt, bend->far_end);
-+      ungrant_or_crash(accel_hw_priv->rxdmaq_gnt, bend->far_end);
-+
-+      DPRINTK("Remove doorbell grant %d\n", accel_hw_priv->doorbell_gnt);
-+      ungrant_or_crash(accel_hw_priv->doorbell_gnt, bend->far_end);
-+
-+      if (bend->hw_type == NET_ACCEL_MSG_HWTYPE_FALCON_A) {
-+              DPRINTK("Remove rptr grant %d\n", accel_hw_priv->evq_rptr_gnt);
-+              ungrant_or_crash(accel_hw_priv->evq_rptr_gnt, bend->far_end);
-+      }
-+
-+      for (i = 0; i < accel_hw_priv->evq_npages; i++) {
-+              DPRINTK("Remove evq grant %d\n", accel_hw_priv->evq_mem_gnts[i]);
-+              ungrant_or_crash(accel_hw_priv->evq_mem_gnts[i], bend->far_end);
-+      }
-+
-+      bend->hw_state = NETBACK_ACCEL_RES_FILTER;
-+
-+      return;
-+}
-+
-+
-+static int ef_bend_hwinfo_falcon_common(struct netback_accel *bend, 
-+                                      struct net_accel_hw_falcon_b *hwinfo)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      struct efx_vi_hw_resource_metadata res_mdata;
-+      struct efx_vi_hw_resource res_array[EFX_VI_HW_RESOURCE_MAXSIZE];
-+      int rc, len = EFX_VI_HW_RESOURCE_MAXSIZE, i, pfn = 0;
-+      unsigned long txdmaq_pfn = 0, rxdmaq_pfn = 0;
-+
-+      rc = efx_vi_hw_resource_get_phys(accel_hw_priv->efx_vih, &res_mdata,
-+                                       res_array, &len);
-+      if (rc != 0) {
-+              DPRINTK("%s: resource_get_phys returned %d\n",
-+                      __FUNCTION__, rc);
-+              return rc;
-+      }
-+
-+      if (res_mdata.version != 0)
-+              return -EPROTO;
-+
-+      hwinfo->nic_arch = res_mdata.nic_arch;
-+      hwinfo->nic_variant = res_mdata.nic_variant;
-+      hwinfo->nic_revision = res_mdata.nic_revision;
-+
-+      hwinfo->evq_order = res_mdata.evq_order;
-+      hwinfo->evq_offs = res_mdata.evq_offs;
-+      hwinfo->evq_capacity = res_mdata.evq_capacity;
-+      hwinfo->instance = res_mdata.instance;
-+      hwinfo->rx_capacity = res_mdata.rx_capacity;
-+      hwinfo->tx_capacity = res_mdata.tx_capacity;
-+
-+      VPRINTK("evq_order %d evq_offs %d evq_cap %d inst %d rx_cap %d tx_cap %d\n",
-+              hwinfo->evq_order, hwinfo->evq_offs, hwinfo->evq_capacity,
-+              hwinfo->instance, hwinfo->rx_capacity, hwinfo->tx_capacity);
-+
-+      for (i = 0; i < len; i++) {
-+              struct efx_vi_hw_resource *res = &(res_array[i]);
-+              switch (res->type) {
-+              case EFX_VI_HW_RESOURCE_TXDMAQ:
-+                      txdmaq_pfn = page_to_pfn(virt_to_page(res->address));
-+                      break;
-+              case EFX_VI_HW_RESOURCE_RXDMAQ: 
-+                      rxdmaq_pfn = page_to_pfn(virt_to_page(res->address));
-+                      break;
-+              case EFX_VI_HW_RESOURCE_EVQTIMER:
-+                      break;
-+              case EFX_VI_HW_RESOURCE_EVQRPTR:
-+              case EFX_VI_HW_RESOURCE_EVQRPTR_OFFSET:
-+                      hwinfo->evq_rptr = res->address;
-+                      break;
-+              case EFX_VI_HW_RESOURCE_EVQMEMKVA: 
-+                      accel_hw_priv->evq_npages =  1 << res_mdata.evq_order;
-+                      pfn = page_to_pfn(virt_to_page(res->address));
-+                      break;
-+              case EFX_VI_HW_RESOURCE_BELLPAGE:
-+                      hwinfo->doorbell_mfn  = res->address;
-+                      break;
-+              default:
-+                      EPRINTK("%s: Unknown hardware resource type %d\n",
-+                              __FUNCTION__, res->type);
-+                      break;
-+              }
-+      }
-+
-+      VPRINTK("Passing txdmaq page pfn %lx\n", txdmaq_pfn);
-+      accel_hw_priv->txdmaq_gnt = hwinfo->txdmaq_gnt = 
-+              net_accel_grant_page(bend->hdev_data, pfn_to_mfn(txdmaq_pfn), 
-+                                   0);
-+
-+      VPRINTK("Passing rxdmaq page pfn %lx\n", rxdmaq_pfn);
-+      accel_hw_priv->rxdmaq_gnt = hwinfo->rxdmaq_gnt = 
-+              net_accel_grant_page(bend->hdev_data, pfn_to_mfn(rxdmaq_pfn), 
-+                                   0);
-+
-+      VPRINTK("Passing doorbell page mfn %x\n", hwinfo->doorbell_mfn);
-+      /* Make the relevant H/W pages mappable by the far end */
-+      accel_hw_priv->doorbell_gnt = hwinfo->doorbell_gnt = 
-+              net_accel_grant_page(bend->hdev_data, hwinfo->doorbell_mfn, 1);
-+      
-+      /* Now do the same for the memory pages */
-+      /* Convert the page + length we got back for the evq to grants. */
-+      for (i = 0; i < accel_hw_priv->evq_npages; i++) {
-+              accel_hw_priv->evq_mem_gnts[i] = hwinfo->evq_mem_gnts[i] =
-+                      net_accel_grant_page(bend->hdev_data, pfn_to_mfn(pfn), 0);
-+              VPRINTK("Got grant %u for evq pfn %x\n", hwinfo->evq_mem_gnts[i], 
-+                      pfn);
-+              pfn++;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+static int ef_bend_hwinfo_falcon_a(struct netback_accel *bend, 
-+                                 struct net_accel_hw_falcon_a *hwinfo)
-+{
-+      int rc;
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+
-+      if ((rc = ef_bend_hwinfo_falcon_common(bend, &hwinfo->common)) != 0)
-+              return rc;
-+
-+      /*
-+       * Note that unlike the above, where the message field is the
-+       * page number, here evq_rptr is the entire address because
-+       * it is currently a pointer into the densely mapped timer page.
-+       */
-+      VPRINTK("Passing evq_rptr pfn %x for rptr %x\n", 
-+              hwinfo->common.evq_rptr >> PAGE_SHIFT,
-+              hwinfo->common.evq_rptr);
-+      rc = net_accel_grant_page(bend->hdev_data, 
-+                                hwinfo->common.evq_rptr >> PAGE_SHIFT, 0);
-+      if (rc < 0)
-+              return rc;
-+
-+      accel_hw_priv->evq_rptr_gnt = hwinfo->evq_rptr_gnt = rc;
-+      VPRINTK("evq_rptr_gnt got %d\n", hwinfo->evq_rptr_gnt);
-+      
-+      return 0;
-+}
-+
-+
-+static int ef_bend_hwinfo_falcon_b(struct netback_accel *bend, 
-+                                 struct net_accel_hw_falcon_b *hwinfo)
-+{
-+      return ef_bend_hwinfo_falcon_common(bend, hwinfo);
-+}
-+
-+
-+/*
-+ * Fill in the message with a description of the hardware resources, based on
-+ * the H/W type
-+ */
-+static int netback_accel_hwinfo(struct netback_accel *bend, 
-+                              struct net_accel_msg_hw *msgvi)
-+{
-+      int rc = 0;
-+      
-+      BUG_ON(bend->hw_state != NETBACK_ACCEL_RES_FILTER);
-+
-+      msgvi->type = bend->hw_type;
-+      switch (bend->hw_type) {
-+      case NET_ACCEL_MSG_HWTYPE_FALCON_A:
-+              rc = ef_bend_hwinfo_falcon_a(bend, &msgvi->resources.falcon_a);
-+              break;
-+      case NET_ACCEL_MSG_HWTYPE_FALCON_B:
-+              rc = ef_bend_hwinfo_falcon_b(bend, &msgvi->resources.falcon_b);
-+              break;
-+      case NET_ACCEL_MSG_HWTYPE_NONE:
-+              /* Nothing to do. The slow path should just work. */
-+              break;
-+      }
-+
-+      if (rc == 0)
-+              bend->hw_state = NETBACK_ACCEL_RES_HWINFO;
-+              
-+      return rc;
-+}
-+
-+
-+/* Allocate hardware resources and make them available to the client domain */
-+int netback_accel_setup_vnic_hw(struct netback_accel *bend)
-+{
-+      struct net_accel_msg msg;
-+      int err;
-+
-+      /* Allocate the event queue, VI and so on. */
-+      err = ef_get_vnic(bend);
-+      if (err) {
-+              EPRINTK("Failed to allocate hardware resource for bend:"
-+                      "error %d\n", err);
-+              return err;
-+      }
-+
-+      /* Set up the filter management */
-+      err = netback_accel_filter_init(bend);
-+      if (err) {
-+              EPRINTK("Filter setup failed, error %d", err);
-+              ef_free_vnic(bend);
-+              return err;
-+      }
-+
-+      net_accel_msg_init(&msg, NET_ACCEL_MSG_SETHW);
-+
-+      /*
-+       * Extract the low-level hardware info we will actually pass to the
-+       * other end, and set up the grants/ioremap permissions needed
-+       */
-+      err = netback_accel_hwinfo(bend, &msg.u.hw);
-+
-+      if (err != 0) {
-+              netback_accel_filter_shutdown(bend);
-+              ef_free_vnic(bend);
-+              return err;
-+      }
-+
-+      /* Send the message, this is a reply to a hello-reply */
-+      err = net_accel_msg_reply_notify(bend->shared_page, 
-+                                       bend->msg_channel_irq, 
-+                                       &bend->to_domU, &msg);
-+
-+      /*
-+       * The message should succeed as it's logically a reply and we
-+       * guarantee space for replies, but a misbehaving frontend
-+       * could result in that behaviour, so be tolerant
-+       */
-+      if (err != 0) {
-+              netback_accel_release_hwinfo(bend);
-+              netback_accel_filter_shutdown(bend);
-+              ef_free_vnic(bend);
-+      }
-+
-+      return err;
-+}
-+
-+
-+/* Free hardware resources  */
-+void netback_accel_shutdown_vnic_hw(struct netback_accel *bend)
-+{
-+      /*
-+       * Only try and release resources if accel_hw_priv was setup,
-+       * otherwise there is nothing to do as we're on "null-op"
-+       * acceleration
-+       */
-+      switch (bend->hw_state) {
-+      case NETBACK_ACCEL_RES_HWINFO:
-+              VPRINTK("Release hardware resources\n");
-+              netback_accel_release_hwinfo(bend);
-+              /* deliberate drop through */
-+      case NETBACK_ACCEL_RES_FILTER:          
-+              VPRINTK("Free filters...\n");
-+              netback_accel_filter_shutdown(bend);
-+              /* deliberate drop through */
-+      case NETBACK_ACCEL_RES_ALLOC:
-+              VPRINTK("Free vnic...\n");
-+              ef_free_vnic(bend);
-+              /* deliberate drop through */
-+      case NETBACK_ACCEL_RES_NONE:
-+              break;
-+      default:
-+              BUG();
-+      }
-+}
-+
-+/**************************************************************************
-+ * 
-+ * Buffer table stuff
-+ *
-+ **************************************************************************/
-+
-+/*
-+ * Undo any allocation that netback_accel_msg_rx_buffer_map() has made
-+ * if it fails half way through
-+ */
-+static inline void buffer_map_cleanup(struct netback_accel *bend, int i)
-+{
-+      while (i > 0) {
-+              i--;
-+              bend->buffer_maps_index--;
-+              net_accel_unmap_device_page(bend->hdev_data, 
-+                                          bend->buffer_maps[bend->buffer_maps_index],
-+                                          bend->buffer_addrs[bend->buffer_maps_index]);
-+      }
-+}
-+
-+
-+int netback_accel_add_buffers(struct netback_accel *bend, int pages, int log2_pages,
-+                            u32 *grants, u32 *buf_addr_out)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      unsigned long long addr_array[NET_ACCEL_MSG_MAX_PAGE_REQ];
-+      int rc, i, index;
-+      u64 dev_bus_addr;
-+
-+      /* Make sure we can't overflow the dma_maps array */
-+      if (accel_hw_priv->dma_maps_index >= 
-+          bend->max_pages / NET_ACCEL_MSG_MAX_PAGE_REQ) {
-+              EPRINTK("%s: too many buffer table allocations: %d %d\n",
-+                      __FUNCTION__, accel_hw_priv->dma_maps_index, 
-+                      bend->max_pages / NET_ACCEL_MSG_MAX_PAGE_REQ);
-+              return -EINVAL;
-+      }
-+
-+      /* Make sure we can't overflow the buffer_maps array */
-+      if (bend->buffer_maps_index + pages > bend->max_pages) {
-+              EPRINTK("%s: too many pages mapped: %d + %d > %d\n", 
-+                      __FUNCTION__, bend->buffer_maps_index,
-+                      pages, bend->max_pages);
-+              return -EINVAL;
-+      }
-+
-+      for (i = 0; i < pages; i++) {
-+              VPRINTK("%s: mapping page %d\n", __FUNCTION__, i);
-+              rc = net_accel_map_device_page
-+                      (bend->hdev_data, grants[i],
-+                       &bend->buffer_maps[bend->buffer_maps_index],
-+                       &dev_bus_addr);
-+    
-+              if (rc != 0) {
-+                      EPRINTK("error in net_accel_map_device_page\n");
-+                      buffer_map_cleanup(bend, i);
-+                      return rc;
-+              }
-+              
-+              bend->buffer_addrs[bend->buffer_maps_index] = dev_bus_addr;
-+
-+              bend->buffer_maps_index++;
-+
-+              addr_array[i] = dev_bus_addr;
-+      }
-+
-+      VPRINTK("%s: mapping dma addresses to vih %p\n", __FUNCTION__, 
-+              accel_hw_priv->efx_vih);
-+
-+      index = accel_hw_priv->dma_maps_index;
-+      if ((rc = efx_vi_dma_map_addrs(accel_hw_priv->efx_vih, addr_array, pages,
-+                                     &(accel_hw_priv->dma_maps[index]))) < 0) {
-+              EPRINTK("error in dma_map_pages\n");
-+              buffer_map_cleanup(bend, i);
-+              return rc;
-+      }
-+
-+      accel_hw_priv->dma_maps_index++;
-+      NETBACK_ACCEL_STATS_OP(bend->stats.num_buffer_pages += pages);
-+
-+      //DPRINTK("%s: getting map address\n", __FUNCTION__);
-+
-+      *buf_addr_out = efx_vi_dma_get_map_addr(accel_hw_priv->efx_vih, 
-+                                              accel_hw_priv->dma_maps[index]);
-+
-+      //DPRINTK("%s: done\n", __FUNCTION__);
-+
-+      return 0;
-+}
-+
-+
-+int netback_accel_remove_buffers(struct netback_accel *bend)
-+{
-+      /* Only try to free buffers if accel_hw_priv was setup */
-+      if (bend->hw_state != NETBACK_ACCEL_RES_NONE) {
-+              struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+              int i;
-+
-+              efx_vi_reset(accel_hw_priv->efx_vih);
-+
-+              while (accel_hw_priv->dma_maps_index > 0) {
-+                      accel_hw_priv->dma_maps_index--;
-+                      i = accel_hw_priv->dma_maps_index;
-+                      efx_vi_dma_unmap_addrs(accel_hw_priv->efx_vih, 
-+                                             accel_hw_priv->dma_maps[i]);
-+              }
-+              
-+              while (bend->buffer_maps_index > 0) {
-+                      VPRINTK("Unmapping granted buffer %d\n", 
-+                              bend->buffer_maps_index);
-+                      bend->buffer_maps_index--;
-+                      i = bend->buffer_maps_index;
-+                      net_accel_unmap_device_page(bend->hdev_data, 
-+                                                  bend->buffer_maps[i],
-+                                                  bend->buffer_addrs[i]);
-+              }
-+
-+              NETBACK_ACCEL_STATS_OP(bend->stats.num_buffer_pages = 0);
-+      }
-+
-+      return 0;
-+}
-+
-+/**************************************************************************
-+ * 
-+ * Filter stuff
-+ *
-+ **************************************************************************/
-+
-+static int netback_accel_filter_init(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      int i, rc;
-+
-+      BUG_ON(bend->hw_state != NETBACK_ACCEL_RES_ALLOC);
-+
-+      spin_lock_init(&accel_hw_priv->filter_lock);
-+
-+      if ((rc = cuckoo_hash_init(&accel_hw_priv->filter_hash_table, 
-+                                 5 /* space for 32 filters */, 8)) != 0) {
-+              EPRINTK("Failed to initialise filter hash table\n");
-+              return rc;
-+      }
-+
-+      accel_hw_priv->fspecs = kzalloc(sizeof(struct netback_accel_filter_spec) *
-+                                      bend->quotas.max_filters,
-+                                      GFP_KERNEL);
-+
-+      if (accel_hw_priv->fspecs == NULL) {
-+              EPRINTK("No memory for filter specs.\n");
-+              cuckoo_hash_destroy(&accel_hw_priv->filter_hash_table);
-+              return -ENOMEM;
-+      }
-+
-+      for (i = 0; i < bend->quotas.max_filters; i++) {
-+              accel_hw_priv->free_filters |= (1 << i);
-+      }
-+
-+      /* Base mask on highest set bit in max_filters  */
-+      accel_hw_priv->filter_idx_mask = (1 << fls(bend->quotas.max_filters)) - 1;
-+      VPRINTK("filter setup: max is %x mask is %x\n",
-+              bend->quotas.max_filters, accel_hw_priv->filter_idx_mask);
-+
-+      bend->hw_state = NETBACK_ACCEL_RES_FILTER;
-+
-+      return 0;
-+}
-+
-+
-+static inline void make_filter_key(cuckoo_hash_ip_key *key,  
-+                                 struct netback_accel_filter_spec *filt)
-+
-+{
-+      key->local_ip = filt->destip_be;
-+      key->local_port = filt->destport_be;
-+      key->proto = filt->proto;
-+}
-+
-+
-+static inline 
-+void netback_accel_free_filter(struct falcon_bend_accel_priv *accel_hw_priv,
-+                             int filter)
-+{
-+      cuckoo_hash_ip_key filter_key;
-+
-+      if (!(accel_hw_priv->free_filters & (1 << filter))) {
-+              efx_vi_filter_stop(accel_hw_priv->efx_vih, 
-+                                 accel_hw_priv->fspecs[filter].filter_handle);
-+              make_filter_key(&filter_key, &(accel_hw_priv->fspecs[filter]));
-+              if (cuckoo_hash_remove(&accel_hw_priv->filter_hash_table,
-+                                     (cuckoo_hash_key *)&filter_key)) {
-+                      EPRINTK("%s: Couldn't find filter to remove from table\n",
-+                              __FUNCTION__);
-+                      BUG();
-+              }
-+      }
-+}
-+
-+
-+static void netback_accel_filter_shutdown(struct netback_accel *bend)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      int i;
-+      unsigned long flags;
-+
-+      BUG_ON(bend->hw_state != NETBACK_ACCEL_RES_FILTER);
-+
-+      spin_lock_irqsave(&accel_hw_priv->filter_lock, flags);
-+
-+      BUG_ON(accel_hw_priv->fspecs == NULL);
-+
-+      for (i = 0; i < bend->quotas.max_filters; i++) {
-+              netback_accel_free_filter(accel_hw_priv, i);
-+      }
-+      
-+      kfree(accel_hw_priv->fspecs);
-+      accel_hw_priv->fspecs = NULL;
-+      accel_hw_priv->free_filters = 0;
-+      
-+      cuckoo_hash_destroy(&accel_hw_priv->filter_hash_table);
-+
-+      spin_unlock_irqrestore(&accel_hw_priv->filter_lock, flags);
-+
-+      bend->hw_state = NETBACK_ACCEL_RES_ALLOC;
-+}
-+
-+
-+/*! Suggest a filter to replace when we want to insert a new one and have
-+ *  none free.
-+ */
-+static unsigned get_victim_filter(struct netback_accel *bend)
-+{
-+      /*
-+       * We could attempt to get really clever, and may do at some
-+       * point, but random replacement is v. cheap and low on
-+       * pathological worst cases.
-+       */
-+      unsigned index, cycles;
-+
-+      rdtscl(cycles);
-+
-+      /*
-+       * Some doubt about the quality of the bottom few bits, so
-+       * throw 'em * away
-+       */
-+      index = (cycles >> 4) & ((struct falcon_bend_accel_priv *)
-+                               bend->accel_hw_priv)->filter_idx_mask;
-+      /*
-+       * We don't enforce that the number of filters is a power of
-+       * two, but the masking gets us to within one subtraction of a
-+       * valid index
-+       */
-+      if (index >= bend->quotas.max_filters)
-+              index -= bend->quotas.max_filters;
-+      DPRINTK("backend %s->%d has no free filters. Filter %d will be evicted\n",
-+              bend->nicname, bend->far_end, index);
-+      return index;
-+}
-+
-+
-+/* Add a filter for the specified IP/port to the backend */
-+int 
-+netback_accel_filter_check_add(struct netback_accel *bend, 
-+                             struct netback_accel_filter_spec *filt)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      struct netback_accel_filter_spec *fs;
-+      unsigned filter_index;
-+      unsigned long flags;
-+      int rc, recycling = 0;
-+      cuckoo_hash_ip_key filter_key, evict_key;
-+
-+      BUG_ON(filt->proto != IPPROTO_TCP && filt->proto != IPPROTO_UDP);
-+
-+      DPRINTK("Will add %s filter for dst ip %08x and dst port %d\n", 
-+              (filt->proto == IPPROTO_TCP) ? "TCP" : "UDP",
-+              be32_to_cpu(filt->destip_be), be16_to_cpu(filt->destport_be));
-+
-+      spin_lock_irqsave(&accel_hw_priv->filter_lock, flags);
-+      /*
-+       * Check to see if we're already filtering this IP address and
-+       * port. Happens if you insert a filter mid-stream as there
-+       * are many packets backed up to be delivered to dom0 already
-+       */
-+      make_filter_key(&filter_key, filt);
-+      if (cuckoo_hash_lookup(&accel_hw_priv->filter_hash_table, 
-+                             (cuckoo_hash_key *)(&filter_key), 
-+                             &filter_index)) {
-+              DPRINTK("Found matching filter %d already in table\n", 
-+                      filter_index);
-+              rc = -1;
-+              goto out;
-+      }
-+
-+      if (accel_hw_priv->free_filters == 0) {
-+              filter_index = get_victim_filter(bend);
-+              recycling = 1;
-+      } else {
-+              filter_index = __ffs(accel_hw_priv->free_filters);
-+              clear_bit(filter_index, &accel_hw_priv->free_filters);
-+      }
-+
-+      fs = &accel_hw_priv->fspecs[filter_index];
-+
-+      if (recycling) {
-+              DPRINTK("Removing filter index %d handle %p\n", filter_index,
-+                      fs->filter_handle);
-+
-+              if ((rc = efx_vi_filter_stop(accel_hw_priv->efx_vih, 
-+                                           fs->filter_handle)) != 0) {
-+                      EPRINTK("Couldn't clear NIC filter table entry %d\n", rc);
-+              }
-+
-+              make_filter_key(&evict_key, fs);
-+              if (cuckoo_hash_remove(&accel_hw_priv->filter_hash_table,
-+                                     (cuckoo_hash_key *)&evict_key)) {
-+                      EPRINTK("Couldn't find filter to remove from table\n");
-+                      BUG();
-+              }
-+              NETBACK_ACCEL_STATS_OP(bend->stats.num_filters--);
-+      }
-+
-+      /* Update the filter spec with new details */
-+      *fs = *filt;
-+
-+      if ((rc = cuckoo_hash_add(&accel_hw_priv->filter_hash_table, 
-+                                (cuckoo_hash_key *)&filter_key, filter_index,
-+                                1)) != 0) {
-+              EPRINTK("Error (%d) adding filter to table\n", rc);
-+              accel_hw_priv->free_filters |= (1 << filter_index);
-+              goto out;
-+      }
-+
-+      rc = efx_vi_filter(accel_hw_priv->efx_vih, filt->proto, filt->destip_be,
-+                         filt->destport_be, 
-+                         (struct filter_resource_t **)&fs->filter_handle);
-+
-+      if (rc != 0) {
-+              EPRINTK("Hardware filter insertion failed. Error %d\n", rc);
-+              accel_hw_priv->free_filters |= (1 << filter_index);
-+              cuckoo_hash_remove(&accel_hw_priv->filter_hash_table, 
-+                                 (cuckoo_hash_key *)&filter_key);
-+              rc = -1;
-+              goto out;
-+      }
-+
-+      NETBACK_ACCEL_STATS_OP(bend->stats.num_filters++);
-+
-+      VPRINTK("%s: success index %d handle %p\n", __FUNCTION__, filter_index, 
-+              fs->filter_handle);
-+
-+      rc = filter_index;
-+ out:
-+      spin_unlock_irqrestore(&accel_hw_priv->filter_lock, flags);
-+      return rc;
-+}
-+
-+
-+/* Remove a filter entry for the specific device and IP/port */
-+static void netback_accel_filter_remove(struct netback_accel *bend, 
-+                                      int filter_index)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+
-+      BUG_ON(accel_hw_priv->free_filters & (1 << filter_index));
-+      netback_accel_free_filter(accel_hw_priv, filter_index);
-+      accel_hw_priv->free_filters |= (1 << filter_index);
-+}
-+
-+
-+/* Remove a filter entry for the specific device and IP/port */
-+void netback_accel_filter_remove_spec(struct netback_accel *bend, 
-+                                    struct netback_accel_filter_spec *filt)
-+{
-+      struct falcon_bend_accel_priv *accel_hw_priv = bend->accel_hw_priv;
-+      unsigned filter_found;
-+      unsigned long flags;
-+      cuckoo_hash_ip_key filter_key;
-+      struct netback_accel_filter_spec *fs;
-+
-+      if (filt->proto == IPPROTO_TCP) {
-+              DPRINTK("Remove TCP filter for dst ip %08x and dst port %d\n",
-+                      be32_to_cpu(filt->destip_be),
-+                      be16_to_cpu(filt->destport_be));
-+      } else if (filt->proto == IPPROTO_UDP) {
-+              DPRINTK("Remove UDP filter for dst ip %08x and dst port %d\n",
-+                      be32_to_cpu(filt->destip_be),
-+                      be16_to_cpu(filt->destport_be));
-+      } else {
-+              /*
-+               * This could be provoked by an evil frontend, so can't
-+               * BUG(), but harmless as it should fail tests below 
-+               */
-+              DPRINTK("Non-TCP/UDP filter dst ip %08x and dst port %d\n",
-+                      be32_to_cpu(filt->destip_be),
-+                      be16_to_cpu(filt->destport_be));
-+      }
-+
-+      spin_lock_irqsave(&accel_hw_priv->filter_lock, flags);
-+
-+      make_filter_key(&filter_key, filt);
-+      if (!cuckoo_hash_lookup(&accel_hw_priv->filter_hash_table, 
-+                             (cuckoo_hash_key *)(&filter_key), 
-+                             &filter_found)) {
-+              EPRINTK("Couldn't find matching filter already in table\n");
-+              goto out;
-+      }
-+      
-+      /* Do a full check to make sure we've not had a hash collision */
-+      fs = &accel_hw_priv->fspecs[filter_found];
-+      if (fs->destip_be == filt->destip_be &&
-+          fs->destport_be == filt->destport_be &&
-+          fs->proto == filt->proto &&
-+          !memcmp(fs->mac, filt->mac, ETH_ALEN)) {
-+              netback_accel_filter_remove(bend, filter_found);
-+      } else {
-+              EPRINTK("Entry in hash table does not match filter spec\n");
-+              goto out;
-+      }
-+
-+ out:
-+      spin_unlock_irqrestore(&accel_hw_priv->filter_lock, flags);
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_solarflare.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_solarflare.h 2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,88 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETBACK_ACCEL_SOLARFLARE_H
-+#define NETBACK_ACCEL_SOLARFLARE_H
-+
-+#include "accel.h"
-+#include "accel_msg_iface.h"
-+
-+#include "driverlink_api.h"
-+
-+#define MAX_NICS 5
-+#define MAX_PORTS 2
-+
-+
-+extern int netback_accel_sf_init(void);
-+extern void netback_accel_sf_shutdown(void);
-+extern int netback_accel_sf_hwtype(struct netback_accel *bend);
-+
-+extern int netback_accel_sf_char_init(void);
-+extern void netback_accel_sf_char_shutdown(void);
-+
-+extern int netback_accel_setup_vnic_hw(struct netback_accel *bend);
-+extern void netback_accel_shutdown_vnic_hw(struct netback_accel *bend);
-+
-+extern int netback_accel_add_buffers(struct netback_accel *bend, int pages, 
-+                                   int log2_pages, u32 *grants,
-+                                   u32 *buf_addr_out);
-+extern int netback_accel_remove_buffers(struct netback_accel *bend);
-+
-+
-+/* Add a filter for the specified IP/port to the backend */
-+extern int
-+netback_accel_filter_check_add(struct netback_accel *bend, 
-+                             struct netback_accel_filter_spec *filt);
-+/* Remove a filter entry for the specific device and IP/port */
-+extern
-+void netback_accel_filter_remove_index(struct netback_accel *bend, 
-+                                     int filter_index);
-+extern
-+void netback_accel_filter_remove_spec(struct netback_accel *bend, 
-+                                    struct netback_accel_filter_spec *filt);
-+
-+/* This is designed to look a bit like a skb */
-+struct netback_pkt_buf {
-+      union {
-+              unsigned char *raw;
-+      } mac;
-+      union {
-+              struct iphdr  *iph;
-+              struct arphdr *arph;
-+              unsigned char *raw;
-+      } nh;
-+      int protocol;
-+};
-+
-+/*! \brief Handle a received packet: insert fast path filters as necessary
-+ * \param skb The packet buffer
-+ */
-+extern void netback_accel_rx_packet(struct netback_pkt_buf *skb, void *fwd_priv);
-+
-+/*! \brief Handle a transmitted packet: update fast path filters as necessary
-+ * \param skb The packet buffer
-+ */
-+extern void netback_accel_tx_packet(struct sk_buff *skb, void *fwd_priv);
-+
-+#endif /* NETBACK_ACCEL_SOLARFLARE_H */
-Index: head-2008-11-25/drivers/xen/sfc_netback/accel_xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/accel_xenbus.c     2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,831 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <xen/evtchn.h>
-+#include <linux/mutex.h>
-+
-+/* drivers/xen/netback/common.h */
-+#include "common.h"
-+
-+#include "accel.h"
-+#include "accel_solarflare.h"
-+#include "accel_util.h"
-+
-+#define NODENAME_PATH_FMT "backend/vif/%d/%d"
-+
-+#define NETBACK_ACCEL_FROM_XENBUS_DEVICE(_dev) (struct netback_accel *) \
-+      ((struct backend_info *)(_dev)->dev.driver_data)->netback_accel_priv
-+
-+/* List of all the bends currently in existence. */
-+struct netback_accel *bend_list = NULL;
-+DEFINE_MUTEX(bend_list_mutex);
-+
-+/* Put in bend_list.  Must hold bend_list_mutex */
-+static void link_bend(struct netback_accel *bend)
-+{
-+      bend->next_bend = bend_list;
-+      bend_list = bend;
-+}
-+
-+/* Remove from bend_list,  Must hold bend_list_mutex */
-+static void unlink_bend(struct netback_accel *bend)
-+{
-+      struct netback_accel *tmp = bend_list;
-+      struct netback_accel *prev = NULL;
-+      while (tmp != NULL) {
-+              if (tmp == bend) {
-+                      if (prev != NULL)
-+                              prev->next_bend = bend->next_bend;
-+                      else
-+                              bend_list = bend->next_bend;
-+                      return;
-+              }
-+              prev = tmp;
-+              tmp = tmp->next_bend;
-+      }
-+}
-+
-+
-+/* Demultiplex a message IRQ from the frontend driver.  */
-+static irqreturn_t msgirq_from_frontend(int irq, void *context, 
-+                                   struct pt_regs *unused)
-+{
-+      struct xenbus_device *dev = context;
-+      struct netback_accel *bend = NETBACK_ACCEL_FROM_XENBUS_DEVICE(dev);
-+      VPRINTK("irq %d from device %s\n", irq, dev->nodename);
-+      schedule_work(&bend->handle_msg);
-+      return IRQ_HANDLED;
-+}
-+
-+
-+/*
-+ * Demultiplex an IRQ from the frontend driver.  This is never used
-+ * functionally, but we need it to pass to the bind function, and may
-+ * get called spuriously
-+ */
-+static irqreturn_t netirq_from_frontend(int irq, void *context, 
-+                                      struct pt_regs *unused)
-+{
-+      VPRINTK("netirq %d from device %s\n", irq,
-+              ((struct xenbus_device *)context)->nodename);
-+      
-+      return IRQ_HANDLED;
-+}
-+
-+
-+/* Read the limits values of the xenbus structure. */
-+static 
-+void cfg_hw_quotas(struct xenbus_device *dev, struct netback_accel *bend)
-+{
-+      int err = xenbus_gather
-+              (XBT_NIL, dev->nodename,
-+               "limits/max-filters", "%d", &bend->quotas.max_filters,
-+               "limits/max-buf-pages", "%d", &bend->quotas.max_buf_pages,
-+               "limits/max-mcasts", "%d", &bend->quotas.max_mcasts,
-+               NULL);
-+      if (err) {
-+              /*
-+               * TODO what if they have previously been set by the
-+               * user?  This will overwrite with defaults.  Maybe
-+               * not what we want to do, but useful in startup
-+               * case 
-+               */
-+              DPRINTK("Failed to read quotas from xenbus, using defaults\n");
-+              bend->quotas.max_filters = NETBACK_ACCEL_DEFAULT_MAX_FILTERS;
-+              bend->quotas.max_buf_pages = sfc_netback_max_pages;
-+              bend->quotas.max_mcasts = NETBACK_ACCEL_DEFAULT_MAX_MCASTS;
-+      }
-+
-+      return;
-+}
-+
-+
-+static void bend_config_accel_change(struct xenbus_watch *watch,
-+                                   const char **vec, unsigned int len)
-+{
-+      struct netback_accel *bend;
-+
-+      bend = container_of(watch, struct netback_accel, config_accel_watch);
-+
-+      mutex_lock(&bend->bend_mutex);
-+      if (bend->config_accel_watch.node != NULL) {
-+              struct xenbus_device *dev = 
-+                      (struct xenbus_device *)bend->hdev_data;
-+              DPRINTK("Watch matched, got dev %p otherend %p\n",
-+                      dev, dev->otherend);
-+              if(!xenbus_exists(XBT_NIL, watch->node, "")) {
-+                      DPRINTK("Ignoring watch as otherend seems invalid\n");
-+                      goto out;
-+              }
-+              
-+              cfg_hw_quotas(dev, bend);
-+      }
-+ out:
-+      mutex_unlock(&bend->bend_mutex);
-+      return;
-+}
-+
-+
-+/*
-+ * Setup watch on "limits" in the backend vif info to know when
-+ * configuration has been set
-+ */
-+static int setup_config_accel_watch(struct xenbus_device *dev,
-+                                  struct netback_accel *bend)
-+{
-+      int err;
-+
-+      VPRINTK("Setting watch on %s/%s\n", dev->nodename, "limits");
-+
-+      err = xenbus_watch_path2(dev, dev->nodename, "limits", 
-+                               &bend->config_accel_watch, 
-+                               bend_config_accel_change);
-+
-+      if (err) {
-+              EPRINTK("%s: Failed to register xenbus watch: %d\n",
-+                      __FUNCTION__, err);
-+              bend->config_accel_watch.node = NULL;
-+              return err;
-+      }
-+      return 0;
-+}
-+
-+
-+static int 
-+cfg_frontend_info(struct xenbus_device *dev, struct netback_accel *bend,
-+                int *grants)
-+{
-+      /* Get some info from xenbus on the event channel and shmem grant */
-+      int err = xenbus_gather(XBT_NIL, dev->otherend, 
-+                              "accel-msg-channel", "%u", &bend->msg_channel, 
-+                              "accel-ctrl-page", "%d", &(grants[0]),
-+                              "accel-msg-page", "%d", &(grants[1]),
-+                              "accel-net-channel", "%u", &bend->net_channel,
-+                              NULL);
-+      if (err)
-+              EPRINTK("failed to read event channels or shmem grant: %d\n",
-+                      err);
-+      else
-+              DPRINTK("got event chan %d and net chan %d from frontend\n",
-+                      bend->msg_channel, bend->net_channel);
-+      return err;
-+}
-+
-+
-+/* Setup all the comms needed to chat with the front end driver */
-+static int setup_vnic(struct xenbus_device *dev)
-+{
-+      struct netback_accel *bend;
-+      int grants[2], err, msgs_per_queue;
-+
-+      bend = NETBACK_ACCEL_FROM_XENBUS_DEVICE(dev);
-+
-+      err = cfg_frontend_info(dev, bend, grants);
-+      if (err)
-+              goto fail1;
-+
-+      /*
-+       * If we get here, both frontend Connected and configuration
-+       * options available.  All is well.
-+       */
-+
-+      /* Get the hardware quotas for the VNIC in question.  */
-+      cfg_hw_quotas(dev, bend);
-+
-+      /* Set up the deferred work handlers */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      INIT_WORK(&bend->handle_msg, 
-+                netback_accel_msg_rx_handler);
-+#else
-+      INIT_WORK(&bend->handle_msg, 
-+                netback_accel_msg_rx_handler,
-+                (void*)bend);
-+#endif
-+
-+      /* Request the frontend mac */
-+      err = net_accel_xen_net_read_mac(dev, bend->mac);
-+      if (err)
-+              goto fail2;
-+
-+      /* Set up the shared page. */
-+      bend->shared_page = net_accel_map_grants_contig(dev, grants, 2, 
-+                                                      &bend->sh_pages_unmap);
-+
-+      if (bend->shared_page == NULL) {
-+              EPRINTK("failed to map shared page for %s\n", dev->otherend);
-+              err = -ENOMEM;
-+              goto fail2;
-+      }
-+
-+      /* Initialise the shared page(s) used for comms */
-+      net_accel_msg_init_page(bend->shared_page, PAGE_SIZE, 
-+                              bend->net_dev->flags & IFF_UP);
-+
-+      msgs_per_queue = (PAGE_SIZE/2) / sizeof(struct net_accel_msg);
-+
-+      net_accel_msg_init_queue
-+              (&bend->to_domU, &bend->shared_page->queue0,
-+               (struct net_accel_msg *)((__u8*)bend->shared_page + PAGE_SIZE),
-+               msgs_per_queue);
-+
-+      net_accel_msg_init_queue
-+              (&bend->from_domU, &bend->shared_page->queue1, 
-+               (struct net_accel_msg *)((__u8*)bend->shared_page + 
-+                                        (3 * PAGE_SIZE / 2)),
-+               msgs_per_queue);
-+
-+      /* Bind the message event channel to a handler
-+       *
-+       * Note that we will probably get a spurious interrupt when we
-+       * do this, so it must not be done until we have set up
-+       * everything we need to handle it.
-+       */
-+      err = bind_interdomain_evtchn_to_irqhandler(dev->otherend_id,
-+                                                  bend->msg_channel,
-+                                                  msgirq_from_frontend,
-+                                                  0,
-+                                                  "netback_accel",
-+                                                  dev);
-+      if (err < 0) {
-+              EPRINTK("failed to bind event channel: %d\n", err);
-+              goto fail3;
-+      }
-+      else
-+              bend->msg_channel_irq = err;
-+
-+      /* TODO: No need to bind this evtchn to an irq. */
-+      err = bind_interdomain_evtchn_to_irqhandler(dev->otherend_id,
-+                                                  bend->net_channel,
-+                                                  netirq_from_frontend,
-+                                                  0,
-+                                                  "netback_accel",
-+                                                  dev);
-+      if (err < 0) {
-+              EPRINTK("failed to bind net channel: %d\n", err);
-+              goto fail4;
-+      }  
-+      else
-+              bend->net_channel_irq = err;
-+
-+      /*
-+       * Grab ourselves an entry in the forwarding hash table. We do
-+       * this now so we don't have the embarassmesnt of sorting out
-+       * an allocation failure while at IRQ. Because we pass NULL as
-+       * the context, the actual hash lookup will succeed for this
-+       * NIC, but the check for somewhere to forward to will
-+       * fail. This is necessary to prevent forwarding before
-+       * hardware resources are set up
-+       */
-+      err = netback_accel_fwd_add(bend->mac, NULL, bend->fwd_priv);
-+      if (err) {
-+              EPRINTK("failed to add to fwd hash table\n");
-+              goto fail5;
-+      }
-+
-+      /*
-+       * Say hello to frontend.  Important to do this straight after
-+       * obtaining the message queue as otherwise we are vulnerable
-+       * to an evil frontend sending a HELLO-REPLY before we've sent
-+       * the HELLO and confusing us
-+       */
-+      netback_accel_msg_tx_hello(bend, NET_ACCEL_MSG_VERSION);
-+      return 0;
-+
-+ fail5:
-+      unbind_from_irqhandler(bend->net_channel_irq, dev);
-+ fail4:
-+      unbind_from_irqhandler(bend->msg_channel_irq, dev);
-+ fail3:
-+      net_accel_unmap_grants_contig(dev, bend->sh_pages_unmap);
-+      bend->shared_page = NULL;
-+      bend->sh_pages_unmap = NULL;
-+ fail2:
-+ fail1:
-+      return err;
-+}
-+
-+
-+static int read_nicname(struct xenbus_device *dev, struct netback_accel *bend)
-+{
-+      int len;
-+
-+      /* nic name used to select interface used for acceleration */
-+      bend->nicname = xenbus_read(XBT_NIL, dev->nodename, "accel", &len);
-+      if (IS_ERR(bend->nicname))
-+              return PTR_ERR(bend->nicname);
-+
-+      return 0;
-+}
-+
-+static const char *frontend_name = "sfc_netfront";
-+
-+static int publish_frontend_name(struct xenbus_device *dev)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+      
-+      /* Publish the name of the frontend driver */
-+      do {
-+              err = xenbus_transaction_start(&tr);
-+              if (err != 0) { 
-+                      EPRINTK("%s: transaction start failed\n", __FUNCTION__);
-+                      return err;
-+              }
-+              err = xenbus_printf(tr, dev->nodename, "accel-frontend", 
-+                                  "%s", frontend_name);
-+              if (err != 0) {
-+                      EPRINTK("%s: xenbus_printf failed\n", __FUNCTION__);
-+                      xenbus_transaction_end(tr, 1);
-+                      return err;
-+              }
-+              err = xenbus_transaction_end(tr, 0);
-+      } while (err == -EAGAIN);
-+      
-+      if (err != 0) {
-+              EPRINTK("failed to end frontend name transaction\n");
-+              return err;
-+      }
-+      return 0;
-+}
-+
-+
-+static int unpublish_frontend_name(struct xenbus_device *dev)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+
-+      do {
-+              err = xenbus_transaction_start(&tr);
-+              if (err != 0)
-+                      break;
-+              err = xenbus_rm(tr, dev->nodename, "accel-frontend");
-+              if (err != 0) {
-+                      xenbus_transaction_end(tr, 1);
-+                      break;
-+              }
-+              err = xenbus_transaction_end(tr, 0);
-+      } while (err == -EAGAIN);
-+
-+      return err;
-+}
-+
-+
-+static void cleanup_vnic(struct netback_accel *bend)
-+{
-+      struct xenbus_device *dev;
-+
-+      dev = (struct xenbus_device *)bend->hdev_data;
-+
-+      DPRINTK("%s: bend %p dev %p\n", __FUNCTION__, bend, dev);
-+
-+      DPRINTK("%s: Remove %p's mac from fwd table...\n", 
-+              __FUNCTION__, bend);
-+      netback_accel_fwd_remove(bend->mac, bend->fwd_priv);
-+
-+      /* Free buffer table allocations */
-+      netback_accel_remove_buffers(bend);
-+
-+      DPRINTK("%s: Release hardware resources...\n", __FUNCTION__);
-+      if (bend->accel_shutdown)
-+              bend->accel_shutdown(bend);
-+
-+      if (bend->net_channel_irq) {
-+              unbind_from_irqhandler(bend->net_channel_irq, dev);
-+              bend->net_channel_irq = 0;
-+      }
-+
-+      if (bend->msg_channel_irq) {
-+              unbind_from_irqhandler(bend->msg_channel_irq, dev);
-+              bend->msg_channel_irq = 0;
-+      }
-+
-+      if (bend->sh_pages_unmap) {
-+              DPRINTK("%s: Unmap grants %p\n", __FUNCTION__, 
-+                      bend->sh_pages_unmap);
-+              net_accel_unmap_grants_contig(dev, bend->sh_pages_unmap);
-+              bend->sh_pages_unmap = NULL;
-+              bend->shared_page = NULL;
-+      }
-+}
-+
-+
-+/*************************************************************************/
-+
-+/*
-+ * The following code handles accelstate changes between the frontend
-+ * and the backend.  It calls setup_vnic and cleanup_vnic in matching
-+ * pairs in response to transitions.
-+ *
-+ * Valid state transitions for Dom0 are as follows:
-+ *
-+ * Closed->Init       on probe or in response to Init from domU
-+ * Closed->Closing    on error/remove
-+ *
-+ * Init->Connected    in response to Connected from domU
-+ * Init->Closing      on error/remove or in response to Closing from domU
-+ *
-+ * Connected->Closing on error/remove or in response to Closing from domU
-+ *
-+ * Closing->Closed    in response to Closed from domU
-+ *
-+ */
-+
-+
-+static void netback_accel_frontend_changed(struct xenbus_device *dev,
-+                                         XenbusState frontend_state)
-+{
-+      struct netback_accel *bend = NETBACK_ACCEL_FROM_XENBUS_DEVICE(dev);
-+      XenbusState backend_state;
-+
-+      DPRINTK("%s: changing from %s to %s. nodename %s, otherend %s\n",
-+              __FUNCTION__, xenbus_strstate(bend->frontend_state),
-+              xenbus_strstate(frontend_state),dev->nodename, dev->otherend);
-+
-+      /*
-+       * Ignore duplicate state changes.  This can happen if the
-+       * frontend changes state twice in quick succession and the
-+       * first watch fires in the backend after the second
-+       * transition has completed.
-+       */
-+      if (bend->frontend_state == frontend_state)
-+              return;
-+
-+      bend->frontend_state = frontend_state;
-+      backend_state = bend->backend_state;
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+              if (backend_state == XenbusStateClosed &&
-+                  !bend->removing)
-+                      backend_state = XenbusStateInitialising;
-+              break;
-+
-+      case XenbusStateConnected:
-+              if (backend_state == XenbusStateInitialising) {
-+                      if (!bend->vnic_is_setup &&
-+                          setup_vnic(dev) == 0) {
-+                              bend->vnic_is_setup = 1;
-+                              backend_state = XenbusStateConnected;
-+                      } else {
-+                              backend_state = XenbusStateClosing;
-+                      }
-+              }
-+              break;
-+
-+      case XenbusStateInitWait:
-+      case XenbusStateInitialised:
-+      default:
-+              DPRINTK("Unknown state %s (%d) from frontend.\n",
-+                      xenbus_strstate(frontend_state), frontend_state);
-+              /* Unknown state.  Fall through. */
-+      case XenbusStateClosing:
-+              if (backend_state != XenbusStateClosed)
-+                      backend_state = XenbusStateClosing;
-+
-+              /*
-+               * The bend will now persist (with watches active) in
-+               * case the frontend comes back again, eg. after
-+               * frontend module reload or suspend/resume
-+               */
-+
-+              break;
-+
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              if (bend->vnic_is_setup) {
-+                      bend->vnic_is_setup = 0;
-+                      cleanup_vnic(bend);
-+              }
-+
-+              if (backend_state == XenbusStateClosing)
-+                      backend_state = XenbusStateClosed;
-+              break;
-+      }
-+
-+      if (backend_state != bend->backend_state) {
-+              DPRINTK("Switching from state %s (%d) to %s (%d)\n",
-+                      xenbus_strstate(bend->backend_state),
-+                      bend->backend_state,
-+                      xenbus_strstate(backend_state), backend_state);
-+              bend->backend_state = backend_state;
-+              net_accel_update_state(dev, backend_state);
-+      }
-+
-+      wake_up(&bend->state_wait_queue);
-+}
-+
-+
-+/* accelstate on the frontend's xenbus node has changed */
-+static void bend_domu_accel_change(struct xenbus_watch *watch,
-+                                 const char **vec, unsigned int len)
-+{
-+      int state;
-+      struct netback_accel *bend;
-+
-+      bend = container_of(watch, struct netback_accel, domu_accel_watch);
-+      if (bend->domu_accel_watch.node != NULL) {
-+              struct xenbus_device *dev = 
-+                      (struct xenbus_device *)bend->hdev_data;
-+              VPRINTK("Watch matched, got dev %p otherend %p\n",
-+                      dev, dev->otherend);
-+              /*
-+               * dev->otherend != NULL check to protect against
-+               * watch firing when domain goes away and we haven't
-+               * yet cleaned up
-+               */
-+              if (!dev->otherend ||
-+                  !xenbus_exists(XBT_NIL, watch->node, "") ||
-+                  strncmp(dev->otherend, vec[XS_WATCH_PATH],
-+                          strlen(dev->otherend))) {
-+                      DPRINTK("Ignoring watch as otherend seems invalid\n");
-+                      return;
-+              }
-+
-+              mutex_lock(&bend->bend_mutex);
-+
-+              xenbus_scanf(XBT_NIL, dev->otherend, "accelstate", "%d", 
-+                           &state);
-+              netback_accel_frontend_changed(dev, state);
-+
-+              mutex_unlock(&bend->bend_mutex);
-+      }
-+}
-+
-+/* Setup watch on frontend's accelstate */
-+static int setup_domu_accel_watch(struct xenbus_device *dev,
-+                                struct netback_accel *bend)
-+{
-+      int err;
-+
-+      VPRINTK("Setting watch on %s/%s\n", dev->otherend, "accelstate");
-+
-+      err = xenbus_watch_path2(dev, dev->otherend, "accelstate", 
-+                               &bend->domu_accel_watch, 
-+                               bend_domu_accel_change);
-+      if (err) {
-+              EPRINTK("%s: Failed to register xenbus watch: %d\n",
-+                      __FUNCTION__, err);
-+              goto fail;
-+      }
-+      return 0;
-+ fail:
-+      bend->domu_accel_watch.node = NULL;
-+      return err;
-+}
-+
-+
-+int netback_accel_probe(struct xenbus_device *dev)
-+{
-+      struct netback_accel *bend;
-+      struct backend_info *binfo;
-+      int err;
-+
-+      DPRINTK("%s: passed device %s\n", __FUNCTION__, dev->nodename);
-+
-+      /* Allocate structure to store all our state... */
-+      bend = kzalloc(sizeof(struct netback_accel), GFP_KERNEL);
-+      if (bend == NULL) {
-+              DPRINTK("%s: no memory for bend\n", __FUNCTION__);
-+              return -ENOMEM;
-+      }
-+      
-+      mutex_init(&bend->bend_mutex);
-+
-+      mutex_lock(&bend->bend_mutex);
-+
-+      /* ...and store it where we can get at it */
-+      binfo = (struct backend_info *) dev->dev.driver_data;
-+      binfo->netback_accel_priv = bend;
-+      /* And vice-versa */
-+      bend->hdev_data = dev;
-+
-+      DPRINTK("%s: Adding bend %p to list\n", __FUNCTION__, bend);
-+      
-+      init_waitqueue_head(&bend->state_wait_queue);
-+      bend->vnic_is_setup = 0;
-+      bend->frontend_state = XenbusStateUnknown;
-+      bend->backend_state = XenbusStateClosed;
-+      bend->removing = 0;
-+
-+      sscanf(dev->nodename, NODENAME_PATH_FMT, &bend->far_end, 
-+             &bend->vif_num);
-+
-+      err = read_nicname(dev, bend);
-+      if (err) {
-+              /*
-+               * Technically not an error, just means we're not 
-+               * supposed to accelerate this
-+               */
-+              DPRINTK("failed to get device name\n");
-+              goto fail_nicname;
-+      }
-+
-+      /*
-+       * Look up the device name in the list of NICs provided by
-+       * driverlink to get the hardware type.
-+       */
-+      err = netback_accel_sf_hwtype(bend);
-+      if (err) {
-+              /*
-+               * Technically not an error, just means we're not
-+               * supposed to accelerate this, probably belongs to
-+               * some other backend
-+               */
-+              DPRINTK("failed to match device name\n");
-+              goto fail_init_type;
-+      }
-+
-+      err = publish_frontend_name(dev);
-+      if (err)
-+              goto fail_publish;
-+
-+      err = netback_accel_debugfs_create(bend);
-+      if (err)
-+              goto fail_debugfs;
-+      
-+      mutex_unlock(&bend->bend_mutex);
-+
-+      err = setup_config_accel_watch(dev, bend);
-+      if (err)
-+              goto fail_config_watch;
-+
-+      err = setup_domu_accel_watch(dev, bend);
-+      if (err)
-+              goto fail_domu_watch;
-+
-+      /*
-+       * Indicate to the other end that we're ready to start unless
-+       * the watch has already fired.
-+       */
-+      mutex_lock(&bend->bend_mutex);
-+      if (bend->backend_state == XenbusStateClosed) {
-+              bend->backend_state = XenbusStateInitialising;
-+              net_accel_update_state(dev, XenbusStateInitialising);
-+      }
-+      mutex_unlock(&bend->bend_mutex);
-+
-+      mutex_lock(&bend_list_mutex);
-+      link_bend(bend);
-+      mutex_unlock(&bend_list_mutex);
-+
-+      return 0;
-+
-+fail_domu_watch:
-+
-+      unregister_xenbus_watch(&bend->config_accel_watch);
-+      kfree(bend->config_accel_watch.node);
-+fail_config_watch:
-+
-+      /*
-+       * Flush the scheduled work queue before freeing bend to get
-+       * rid of any pending netback_accel_msg_rx_handler()
-+       */
-+      flush_scheduled_work();
-+
-+      mutex_lock(&bend->bend_mutex);
-+      net_accel_update_state(dev, XenbusStateUnknown);
-+      netback_accel_debugfs_remove(bend);
-+fail_debugfs:
-+
-+      unpublish_frontend_name(dev);
-+fail_publish:
-+
-+      /* No need to reverse netback_accel_sf_hwtype. */
-+fail_init_type:
-+
-+      kfree(bend->nicname);
-+fail_nicname:
-+      binfo->netback_accel_priv = NULL;
-+      mutex_unlock(&bend->bend_mutex);
-+      kfree(bend);
-+      return err;
-+}
-+
-+
-+int netback_accel_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *binfo;
-+      struct netback_accel *bend; 
-+      int frontend_state;
-+
-+      binfo = (struct backend_info *) dev->dev.driver_data;
-+      bend = (struct netback_accel *) binfo->netback_accel_priv;
-+
-+      DPRINTK("%s: dev %p bend %p\n", __FUNCTION__, dev, bend);
-+      
-+      BUG_ON(bend == NULL);
-+      
-+      mutex_lock(&bend_list_mutex);
-+      unlink_bend(bend);
-+      mutex_unlock(&bend_list_mutex);
-+
-+      mutex_lock(&bend->bend_mutex);
-+
-+      /* Reject any requests to connect. */
-+      bend->removing = 1;
-+
-+      /*
-+       * Switch to closing to tell the other end that we're going
-+       * away.
-+       */
-+      if (bend->backend_state != XenbusStateClosing) {
-+              bend->backend_state = XenbusStateClosing;
-+              net_accel_update_state(dev, XenbusStateClosing);
-+      }
-+
-+      frontend_state = (int)XenbusStateUnknown;
-+      xenbus_scanf(XBT_NIL, dev->otherend, "accelstate", "%d",
-+                   &frontend_state);
-+
-+      mutex_unlock(&bend->bend_mutex);
-+
-+      /*
-+       * Wait until this end goes to the closed state.  This happens
-+       * in response to the other end going to the closed state.
-+       * Don't bother doing this if the other end is already closed
-+       * because if it is then there is nothing to do.
-+       */
-+      if (frontend_state != (int)XenbusStateClosed &&
-+          frontend_state != (int)XenbusStateUnknown)
-+              wait_event(bend->state_wait_queue,
-+                         bend->backend_state == XenbusStateClosed);
-+
-+      unregister_xenbus_watch(&bend->domu_accel_watch);
-+      kfree(bend->domu_accel_watch.node);
-+
-+      unregister_xenbus_watch(&bend->config_accel_watch);
-+      kfree(bend->config_accel_watch.node);
-+
-+      /*
-+       * Flush the scheduled work queue before freeing bend to get
-+       * rid of any pending netback_accel_msg_rx_handler()
-+       */
-+      flush_scheduled_work();
-+
-+      mutex_lock(&bend->bend_mutex);
-+
-+      /* Tear down the vnic if it was set up. */
-+      if (bend->vnic_is_setup) {
-+              bend->vnic_is_setup = 0;
-+              cleanup_vnic(bend);
-+      }
-+
-+      bend->backend_state = XenbusStateUnknown;
-+      net_accel_update_state(dev, XenbusStateUnknown);
-+
-+      netback_accel_debugfs_remove(bend);
-+
-+      unpublish_frontend_name(dev);
-+
-+      kfree(bend->nicname);
-+
-+      binfo->netback_accel_priv = NULL;
-+
-+      mutex_unlock(&bend->bend_mutex);
-+
-+      kfree(bend);
-+
-+      return 0;
-+}
-+
-+
-+void netback_accel_shutdown_bends(void)
-+{
-+      mutex_lock(&bend_list_mutex);
-+      /*
-+       * I think we should have had a remove callback for all
-+       * interfaces before being allowed to unload the module
-+       */
-+      BUG_ON(bend_list != NULL);
-+      mutex_unlock(&bend_list_mutex);
-+}
-+
-+
-+void netback_accel_set_closing(struct netback_accel *bend) 
-+{
-+
-+      bend->backend_state = XenbusStateClosing;
-+      net_accel_update_state((struct xenbus_device *)bend->hdev_data,
-+                             XenbusStateClosing);
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,53 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Compatability layer.  Provides definitions of fundamental
-+ *          types and definitions that are used throughout CI source
-+ *          code.  It does not introduce any link time dependencies,
-+ *          or include any unnecessary system headers.
-+ */
-+/*! \cidoxg_include_ci */
-+
-+#ifndef __CI_COMPAT_H__
-+#define __CI_COMPAT_H__
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include <ci/compat/primitive.h>
-+#include <ci/compat/sysdep.h>
-+#include <ci/compat/utils.h>
-+
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif  /* __CI_COMPAT_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/gcc.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/gcc.h    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,158 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_GCC_H__
-+#define __CI_COMPAT_GCC_H__
-+
-+
-+#define CI_HAVE_INT64
-+
-+
-+#if defined(__linux__) && defined(__KERNEL__)
-+
-+# include <linux/types.h>
-+
-+typedef __u64                 ci_uint64;
-+typedef __s64                 ci_int64;
-+# if BITS_PER_LONG == 32
-+typedef __s32                 ci_ptr_arith_t;
-+typedef __u32                 ci_uintptr_t;
-+# else
-+typedef __s64                 ci_ptr_arith_t;
-+typedef __u64                 ci_uintptr_t;
-+# endif
-+
-+
-+/* it's not obvious to me why the below is wrong for x64_64, but
-+ * gcc seems to complain on this platform
-+ */
-+# if defined(__ia64__)
-+#  define CI_PRId64            "ld"
-+#  define CI_PRIi64            "li"
-+#  define CI_PRIo64            "lo"
-+#  define CI_PRIu64            "lu"
-+#  define CI_PRIx64            "lx"
-+#  define CI_PRIX64            "lX"
-+# else
-+#  define CI_PRId64            "lld"
-+#  define CI_PRIi64            "lli"
-+#  define CI_PRIo64            "llo"
-+#  define CI_PRIu64            "llu"
-+#  define CI_PRIx64            "llx"
-+#  define CI_PRIX64            "llX"
-+# endif
-+
-+# define CI_PRId32            "d"
-+# define CI_PRIi32            "i"
-+# define CI_PRIo32            "o"
-+# define CI_PRIu32            "u"
-+# define CI_PRIx32            "x"
-+# define CI_PRIX32            "X"
-+
-+#else
-+
-+# include <stdint.h>
-+# include <inttypes.h>
-+
-+typedef uint64_t              ci_uint64;
-+typedef int64_t               ci_int64;
-+typedef intptr_t              ci_ptr_arith_t;
-+typedef uintptr_t             ci_uintptr_t;
-+
-+# define CI_PRId64            PRId64
-+# define CI_PRIi64            PRIi64
-+# define CI_PRIo64            PRIo64
-+# define CI_PRIu64            PRIu64
-+# define CI_PRIx64            PRIx64
-+# define CI_PRIX64            PRIX64
-+
-+# define CI_PRId32            PRId32
-+# define CI_PRIi32            PRIi32
-+# define CI_PRIo32            PRIo32
-+# define CI_PRIu32            PRIu32
-+# define CI_PRIx32            PRIx32
-+# define CI_PRIX32            PRIX32
-+
-+#endif
-+
-+
-+typedef ci_uint64                       ci_fixed_descriptor_t;
-+
-+#define from_fixed_descriptor(desc) ((ci_uintptr_t)(desc))
-+#define to_fixed_descriptor(desc) ((ci_fixed_descriptor_t)(ci_uintptr_t)(desc))
-+
-+
-+#if __GNUC__ >= 3 && !defined(__cplusplus)
-+/*
-+** Checks that [p_mbr] has the same type as [&c_type::mbr_name].
-+*/
-+# define CI_CONTAINER(c_type, mbr_name, p_mbr)                                \
-+   __builtin_choose_expr(                                             \
-+     __builtin_types_compatible_p(__typeof__(&((c_type*)0)->mbr_name),        \
-+                               __typeof__(p_mbr)),                    \
-+     __CI_CONTAINER(c_type, mbr_name, p_mbr), (void)0)
-+
-+# define ci_restrict  __restrict__
-+#endif
-+
-+
-+#if !defined(__KERNEL__) || defined(__unix__)
-+#define CI_HAVE_NPRINTF  1
-+#endif
-+
-+
-+/* At what version was this introduced? */
-+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ > 91)
-+# define CI_LIKELY(t)    __builtin_expect((t), 1)
-+# define CI_UNLIKELY(t)  __builtin_expect((t), 0)
-+#endif
-+
-+/**********************************************************************
-+ * Attributes
-+ */
-+#if __GNUC__ >= 3 && defined(NDEBUG)
-+# define CI_HF __attribute__((visibility("hidden")))
-+# define CI_HV __attribute__((visibility("hidden")))
-+#else
-+# define CI_HF
-+# define CI_HV
-+#endif
-+
-+#if __GNUC__ >= 4 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
-+# define ci_noinline  static __attribute__((__noinline__))
-+/* (Linux 2.6 defines its own "noinline", so we use the "__noinline__" form) */
-+#else
-+# define ci_noinline  static
-+#endif
-+
-+#define CI_ALIGN(x) __attribute__ ((aligned (x)))
-+
-+#define CI_PRINTF_LIKE(a,b) __attribute__((format(printf,a,b)))
-+
-+#endif  /* __CI_COMPAT_GCC_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/gcc_x86.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/gcc_x86.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,115 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_GCC_X86_H__
-+#define __CI_COMPAT_GCC_X86_H__
-+
-+/*
-+** The facts:
-+**
-+**   SSE   sfence
-+**   SSE2  lfence, mfence, pause
-+*/
-+
-+/* 
-+   Barriers to enforce ordering with respect to:
-+
-+   normal memory use: ci_wmb, ci_rmb, ci_wmb
-+   IO bus access use: ci_wiob, ci_riob, ci_iob
-+*/
-+#if defined(__x86_64__)
-+# define ci_x86_mb() __asm__ __volatile__ ("lock; addl $0,0(%%rsp)":::"memory")
-+#else
-+# define ci_x86_mb() __asm__ __volatile__ ("lock; addl $0,0(%%esp)":::"memory")
-+#endif
-+
-+/* ?? measure the impact of latency of sfence on a modern processor before we
-+   take a decision on how to integrate with respect to writecombining */
-+
-+/* DJR: I don't think we need to add "memory" here.  It means the asm does
-+** something to memory that GCC doesn't understand.  But all this does is
-+** commit changes that GCC thinks have already happened.  NB. GCC will not
-+** reorder across a __volatile__ __asm__ anyway.
-+*/
-+#define ci_gcc_fence()    __asm__ __volatile__ ("")
-+
-+#if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-+# define ci_x86_sfence()  __asm__ __volatile__ ("sfence")
-+# define ci_x86_lfence()  __asm__ __volatile__ ("lfence")
-+# define ci_x86_mfence()  __asm__ __volatile__ ("mfence")
-+#else
-+# define ci_x86_sfence()  __asm__ __volatile__ (".byte 0x0F, 0xAE, 0xF8")
-+# define ci_x86_lfence()  __asm__ __volatile__ (".byte 0x0F, 0xAE, 0xE8")
-+# define ci_x86_mfence()  __asm__ __volatile__ (".byte 0x0F, 0xAE, 0xF0")
-+#endif
-+
-+
-+/* x86 processors to P4 Xeon store in-order unless executing streaming
-+   extensions or when using writecombining 
-+
-+   Hence we do not define ci_wmb to use sfence by default. Requirement is that
-+   we do not use writecombining to memory and any code which uses SSE
-+   extensions must call sfence directly 
-+
-+   We need to track non intel clones which may support out of order store.
-+
-+*/
-+
-+#if CI_CPU_OOS
-+# if CI_CPU_HAS_SSE
-+#  define ci_wmb()    ci_x86_sfence()
-+# else
-+#  define ci_wmb()    ci_x86_mb()
-+# endif
-+#else
-+# define ci_wmb()       ci_gcc_fence()
-+#endif
-+
-+#if CI_CPU_HAS_SSE2
-+# define ci_rmb()     ci_x86_lfence()
-+# define ci_mb()      ci_x86_mfence()
-+# define ci_riob()    ci_x86_lfence()
-+# define ci_wiob()    ci_x86_sfence()
-+# define ci_iob()     ci_x86_mfence()
-+#else
-+# if CI_CPU_HAS_SSE
-+#  define ci_wiob()   ci_x86_sfence()
-+# else
-+#  define ci_wiob()   ci_x86_mb()
-+# endif
-+# define ci_rmb()     ci_x86_mb()
-+# define ci_mb()      ci_x86_mb()
-+# define ci_riob()    ci_x86_mb()
-+# define ci_iob()     ci_x86_mb()
-+#endif
-+
-+typedef unsigned long   ci_phys_addr_t;
-+#define ci_phys_addr_fmt  "%lx"
-+
-+#endif  /* __CI_COMPAT_GCC_X86_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/primitive.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/primitive.h      2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,77 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_PRIMITIVE_H__
-+#define __CI_COMPAT_PRIMITIVE_H__
-+
-+
-+/**********************************************************************
-+ * Primitive types.
-+ */
-+
-+typedef unsigned char                   ci_uint8;
-+typedef char                            ci_int8;
-+
-+typedef unsigned short                  ci_uint16;
-+typedef short                           ci_int16;
-+
-+typedef unsigned int                    ci_uint32;
-+typedef int                             ci_int32;
-+
-+/* 64-bit support is platform dependent. */
-+
-+
-+/**********************************************************************
-+ * Other fancy types.
-+ */
-+
-+typedef ci_uint8                        ci_octet;
-+
-+typedef enum {
-+  CI_FALSE = 0,
-+  CI_TRUE
-+} ci_boolean_t;
-+
-+
-+/**********************************************************************
-+ * Some nice types you'd always assumed were standards.
-+ * (Really, they are SYSV "standards".)
-+ */
-+
-+#ifdef _WIN32
-+typedef unsigned long                   ulong;              
-+typedef unsigned int                    uint;
-+typedef char*                           caddr_t;
-+#elif defined(__linux__) && defined(__KERNEL__)
-+#include <linux/types.h>
-+#elif defined(__linux__)
-+#include <sys/types.h>
-+#endif
-+
-+
-+#endif  /* __CI_COMPAT_PRIMITIVE_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/sysdep.h 2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,166 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_SYSDEP_H__
-+#define __CI_COMPAT_SYSDEP_H__
-+
-+
-+/**********************************************************************
-+ * Platform definition fixups.
-+ */
-+
-+#if defined(__ci_ul_driver__) && !defined(__ci_driver__)
-+# define __ci_driver__
-+#endif
-+
-+#if defined(__ci_driver__) && !defined(__ci_ul_driver__) && \
-+   !defined(__KERNEL__)
-+# define __KERNEL__
-+#endif
-+
-+
-+/**********************************************************************
-+ * Sanity checks (no cheating!)
-+ */
-+
-+#if defined(__KERNEL__) && !defined(__ci_driver__)
-+# error Insane.
-+#endif
-+
-+#if defined(__KERNEL__) && defined(__ci_ul_driver__)
-+# error Madness.
-+#endif
-+
-+#if defined(__unix__) && defined(_WIN32)
-+# error Strange.
-+#endif
-+
-+#if defined(__GNUC__) && defined(_MSC_VER)
-+# error Crazy.
-+#endif
-+
-+
-+/**********************************************************************
-+ * Compiler and processor dependencies.
-+ */
-+
-+#if defined(__GNUC__)
-+
-+# include <ci/compat/gcc.h>
-+
-+# if defined(__i386__)
-+#  include <ci/compat/x86.h>
-+#  include <ci/compat/gcc_x86.h>
-+# elif defined(__x86_64__)
-+#  include <ci/compat/x86_64.h>
-+#  include <ci/compat/gcc_x86.h>
-+# elif defined(__PPC__)
-+#  include <ci/compat/ppc.h>
-+#  include <ci/compat/gcc_ppc.h>
-+# elif defined(__ia64__)
-+#  include <ci/compat/ia64.h>
-+#  include <ci/compat/gcc_ia64.h>
-+# else
-+#  error Unknown processor - GNU C
-+# endif
-+
-+#elif defined(_MSC_VER)
-+
-+# include <ci/compat/msvc.h>
-+
-+# if defined(__i386__)
-+#  include <ci/compat/x86.h>
-+#  include <ci/compat/msvc_x86.h>
-+# elif defined(__x86_64__)
-+#  include <ci/compat/x86_64.h>
-+#  include <ci/compat/msvc_x86_64.h>
-+# else
-+#  error Unknown processor MSC
-+# endif
-+
-+#elif defined(__PGI)
-+
-+# include <ci/compat/x86.h>
-+# include <ci/compat/pg_x86.h>
-+
-+#elif defined(__INTEL_COMPILER)
-+
-+/* Intel compilers v7 claim to be very gcc compatible. */
-+# if __INTEL_COMPILER >= 700
-+#  include <ci/compat/gcc.h>
-+#  include <ci/compat/x86.h>
-+#  include <ci/compat/gcc_x86.h>
-+# else
-+#  error Old Intel compiler not supported.  Yet.
-+# endif
-+
-+#else
-+# error Unknown compiler.
-+#endif
-+
-+
-+/**********************************************************************
-+ * Misc stuff (that probably shouldn't be here).
-+ */
-+
-+#ifdef __sun
-+# ifdef __KERNEL__
-+#  define _KERNEL
-+#  define _SYSCALL32
-+#  ifdef _LP64
-+#   define _SYSCALL32_IMPL
-+#  endif
-+# else
-+#  define _REENTRANT
-+# endif
-+#endif
-+
-+
-+/**********************************************************************
-+ * Defaults for anything left undefined.
-+ */
-+
-+#ifndef  CI_LIKELY
-+# define CI_LIKELY(t)    (t)
-+# define CI_UNLIKELY(t)  (t)
-+#endif
-+
-+#ifndef  ci_restrict
-+# define ci_restrict
-+#endif
-+
-+#ifndef  ci_inline
-+# define ci_inline  static inline
-+#endif
-+
-+#ifndef  ci_noinline
-+# define ci_noinline  static
-+#endif
-+
-+#endif  /* __CI_COMPAT_SYSDEP_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/utils.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/utils.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,269 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Handy utility macros.
-+ *   \date  2003/01/17
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_UTILS_H__
-+#define __CI_COMPAT_UTILS_H__
-+
-+
-+/**********************************************************************
-+ * Alignment -- [align] must be a power of 2.
-+ **********************************************************************/
-+
-+  /*! Align forward onto next boundary. */
-+
-+#define CI_ALIGN_FWD(p, align)               (((p)+(align)-1u) & ~((align)-1u))
-+
-+
-+  /*! Align back onto prev boundary. */
-+
-+#define CI_ALIGN_BACK(p, align)              ((p) & ~((align)-1u))
-+
-+
-+  /*! How far to next boundary? */
-+
-+#define CI_ALIGN_NEEDED(p, align, signed_t)  (-(signed_t)(p) & ((align)-1u))
-+
-+
-+  /*! How far beyond prev boundary? */
-+
-+#define CI_OFFSET(p, align)                  ((p) & ((align)-1u))
-+
-+
-+  /*! Does object fit in gap before next boundary? */
-+
-+#define CI_FITS(p, size, align, signed_t)                     \
-+  (CI_ALIGN_NEEDED((p) + 1, (align), signed_t) + 1 >= (size))
-+
-+
-+  /*! Align forward onto next boundary. */
-+
-+#define CI_PTR_ALIGN_FWD(p, align)                                       \
-+  ((char*) CI_ALIGN_FWD(((ci_ptr_arith_t)(p)), ((ci_ptr_arith_t)(align))))
-+
-+  /*! Align back onto prev boundary. */
-+
-+#define CI_PTR_ALIGN_BACK(p, align)                                       \
-+  ((char*) CI_ALIGN_BACK(((ci_ptr_arith_t)(p)), ((ci_ptr_arith_t)(align))))
-+
-+  /*! How far to next boundary? */
-+
-+#define CI_PTR_ALIGN_NEEDED(p, align)                                 \
-+  CI_ALIGN_NEEDED(((ci_ptr_arith_t)(p)), ((ci_ptr_arith_t)(align)),   \
-+                ci_ptr_arith_t)
-+
-+  /*! How far to next boundary? NZ = not zero i.e. give align if on boundary  */
-+
-+#define CI_PTR_ALIGN_NEEDED_NZ(p, align)                                      \
-+  ((align) - (((char*)p) -                                                      \
-+  ((char*) CI_ALIGN_BACK(((ci_ptr_arith_t)(p)), ((ci_ptr_arith_t)(align))))))
-+
-+  /*! How far beyond prev boundary? */
-+
-+#define CI_PTR_OFFSET(p, align)                                       \
-+  CI_OFFSET(((ci_ptr_arith_t)(p)), ((ci_ptr_arith_t)(align)))
-+
-+
-+  /* Same as CI_ALIGN_FWD and CI_ALIGN_BACK. */
-+
-+#define CI_ROUND_UP(i, align)      (((i)+(align)-1u) & ~((align)-1u))
-+
-+#define CI_ROUND_DOWN(i, align)    ((i) & ~((align)-1u))
-+
-+
-+/**********************************************************************
-+ * Byte-order
-+ **********************************************************************/
-+
-+/* These are not flags.  They are enumeration values for use with
-+ * CI_MY_BYTE_ORDER. */
-+#define CI_BIG_ENDIAN          1
-+#define CI_LITTLE_ENDIAN       0
-+
-+/*
-+** Note that these byte-swapping primitives may leave junk in bits above
-+** the range they operate on.
-+**
-+** The CI_BSWAP_nn() routines require that bits above [nn] are zero.  Use
-+** CI_BSWAPM_nn(x) if this cannot be guaranteed.
-+*/
-+
-+/* ?? May be able to improve on some of these with inline assembler on some
-+** platforms.
-+*/
-+
-+#define CI_BSWAP_16(v)    ((((v) & 0xff) << 8) | ((v) >> 8))
-+#define CI_BSWAPM_16(v)   ((((v) & 0xff) << 8) | (((v) & 0xff00) >> 8))
-+
-+#define CI_BSWAP_32(v)    (((v) >> 24)               |        \
-+                         (((v) & 0x00ff0000) >> 8) |  \
-+                         (((v) & 0x0000ff00) << 8) |  \
-+                         ((v) << 24))
-+#define CI_BSWAPM_32(v)   ((((v) & 0xff000000) >> 24) |       \
-+                         (((v) & 0x00ff0000) >> 8)  | \
-+                         (((v) & 0x0000ff00) << 8)  | \
-+                         ((v) << 24))
-+
-+#define CI_BSWAP_64(v)    (((v) >> 56)                        |       \
-+                         (((v) & 0x00ff000000000000) >> 40) | \
-+                         (((v) & 0x0000ff0000000000) >> 24) | \
-+                         (((v) & 0x000000ff00000000) >> 8)  | \
-+                         (((v) & 0x00000000ff000000) << 8)  | \
-+                         (((v) & 0x0000000000ff0000) << 24) | \
-+                         (((v) & 0x000000000000ff00) << 40) | \
-+                         ((v) << 56))
-+
-+# define CI_BSWAPPED_16_IF(c,v)  ((c) ? CI_BSWAP_16(v) : (v))
-+# define CI_BSWAPPED_32_IF(c,v)  ((c) ? CI_BSWAP_32(v) : (v))
-+# define CI_BSWAPPED_64_IF(c,v)  ((c) ? CI_BSWAP_64(v) : (v))
-+# define CI_BSWAP_16_IF(c,v)     do{ if((c)) (v) = CI_BSWAP_16(v); }while(0)
-+# define CI_BSWAP_32_IF(c,v)     do{ if((c)) (v) = CI_BSWAP_32(v); }while(0)
-+# define CI_BSWAP_64_IF(c,v)     do{ if((c)) (v) = CI_BSWAP_64(v); }while(0)
-+
-+#if (CI_MY_BYTE_ORDER == CI_LITTLE_ENDIAN)
-+# define CI_BSWAP_LE16(v)    (v)
-+# define CI_BSWAP_LE32(v)    (v)
-+# define CI_BSWAP_LE64(v)    (v)
-+# define CI_BSWAP_BE16(v)    CI_BSWAP_16(v)
-+# define CI_BSWAP_BE32(v)    CI_BSWAP_32(v)
-+# define CI_BSWAP_BE64(v)    CI_BSWAP_64(v)
-+# define CI_BSWAPM_LE16(v)   (v)
-+# define CI_BSWAPM_LE32(v)   (v)
-+# define CI_BSWAPM_LE64(v)   (v)
-+# define CI_BSWAPM_BE16(v)   CI_BSWAPM_16(v)
-+# define CI_BSWAPM_BE32(v)   CI_BSWAPM_32(v)
-+#elif (CI_MY_BYTE_ORDER == CI_BIG_ENDIAN)
-+# define CI_BSWAP_BE16(v)    (v)
-+# define CI_BSWAP_BE32(v)    (v)
-+# define CI_BSWAP_BE64(v)    (v)
-+# define CI_BSWAP_LE16(v)    CI_BSWAP_16(v)
-+# define CI_BSWAP_LE32(v)    CI_BSWAP_32(v)
-+# define CI_BSWAP_LE64(v)    CI_BSWAP_64(v)
-+# define CI_BSWAPM_BE16(v)   (v)
-+# define CI_BSWAPM_BE32(v)   (v)
-+# define CI_BSWAPM_BE64(v)   (v)
-+# define CI_BSWAPM_LE16(v)   CI_BSWAPM_16(v)
-+# define CI_BSWAPM_LE32(v)   CI_BSWAPM_32(v)
-+#else
-+# error Bad endian.
-+#endif
-+
-+
-+/**********************************************************************
-+ * Get pointer to struct from pointer to member
-+ **********************************************************************/
-+
-+#define CI_MEMBER_OFFSET(c_type, mbr_name)  \
-+  ((ci_uint32) (ci_uintptr_t)(&((c_type*)0)->mbr_name))
-+
-+#define CI_MEMBER_SIZE(c_type, mbr_name)        \
-+  sizeof(((c_type*)0)->mbr_name)
-+
-+#define __CI_CONTAINER(c_type, mbr_name, p_mbr)  \
-+  ( (c_type*) ((char*)(p_mbr) - CI_MEMBER_OFFSET(c_type, mbr_name)) )
-+
-+#ifndef CI_CONTAINER
-+# define CI_CONTAINER(t,m,p)  __CI_CONTAINER(t,m,p)
-+#endif
-+
-+
-+/**********************************************************************
-+ * Structure member initialiser.
-+ **********************************************************************/
-+
-+#ifndef CI_STRUCT_MBR
-+# define CI_STRUCT_MBR(name, val)     .name = val
-+#endif
-+
-+
-+/**********************************************************************
-+ * min / max
-+ **********************************************************************/ 
-+
-+#define CI_MIN(x,y) (((x) < (y)) ? (x) : (y))
-+#define CI_MAX(x,y) (((x) > (y)) ? (x) : (y))
-+
-+/**********************************************************************
-+ * abs
-+ **********************************************************************/ 
-+
-+#define CI_ABS(x) (((x) < 0) ? -(x) : (x))
-+
-+/**********************************************************************
-+ * Conditional debugging
-+ **********************************************************************/ 
-+
-+#ifdef NDEBUG
-+# define CI_DEBUG(x)
-+# define CI_NDEBUG(x)      x
-+# define CI_IF_DEBUG(y,n)  (n)
-+# define CI_DEBUG_ARG(x)
-+#else
-+# define CI_DEBUG(x)       x
-+# define CI_NDEBUG(x)
-+# define CI_IF_DEBUG(y,n)  (y)
-+# define CI_DEBUG_ARG(x)   ,x
-+#endif
-+
-+#ifdef __KERNEL__
-+#define CI_KERNEL_ARG(x)   ,x
-+#else
-+#define CI_KERNEL_ARG(x)
-+#endif
-+
-+#ifdef _WIN32
-+# define CI_KERNEL_ARG_WIN(x) CI_KERNEL_ARG(x)
-+# define CI_ARG_WIN(x) ,x
-+#else
-+# define CI_KERNEL_ARG_WIN(x)
-+# define CI_ARG_WIN(x) 
-+#endif
-+
-+#ifdef __unix__
-+# define CI_KERNEL_ARG_UNIX(x) CI_KERNEL_ARG(x)
-+# define CI_ARG_UNIX(x) ,x
-+#else
-+# define CI_KERNEL_ARG_UNIX(x)
-+# define CI_ARG_UNIX(x) 
-+#endif
-+
-+#ifdef __linux__
-+# define CI_KERNEL_ARG_LINUX(x) CI_KERNEL_ARG(x)
-+# define CI_ARG_LINUX(x) ,x
-+#else
-+# define CI_KERNEL_ARG_LINUX(x)
-+# define CI_ARG_LINUX(x) 
-+#endif
-+
-+
-+#endif  /* __CI_COMPAT_UTILS_H__ */
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/x86.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/x86.h    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,48 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+
-+#ifndef __CI_COMPAT_X86_H__
-+#define __CI_COMPAT_X86_H__
-+
-+
-+#define CI_MY_BYTE_ORDER   CI_LITTLE_ENDIAN
-+
-+#define CI_WORD_SIZE       4
-+#define CI_PTR_SIZE        4
-+
-+#define CI_PAGE_SIZE       4096
-+#define CI_PAGE_SHIFT      12
-+#define CI_PAGE_MASK       (~(CI_PAGE_SIZE - 1))
-+
-+#define CI_CPU_HAS_SSE           1    /* SSE extensions supported */
-+#define CI_CPU_HAS_SSE2          0    /* SSE2 extensions supported */
-+#define CI_CPU_OOS       0    /* CPU does out of order stores */
-+
-+
-+#endif  /* __CI_COMPAT_X86_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/compat/x86_64.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/compat/x86_64.h 2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,54 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Arch stuff for AMD x86_64.
-+ *   \date  2004/08/17
-+ */
-+
-+/*! \cidoxg_include_ci_compat  */
-+#ifndef __CI_COMPAT_X86_64_H__
-+#define __CI_COMPAT_X86_64_H__
-+
-+
-+#define CI_MY_BYTE_ORDER      CI_LITTLE_ENDIAN
-+
-+#define CI_WORD_SIZE          8
-+#define CI_PTR_SIZE           8
-+
-+#define CI_PAGE_SIZE          4096
-+#define CI_PAGE_SHIFT         12
-+#define CI_PAGE_MASK          (~(CI_PAGE_SIZE - 1))
-+
-+#define CI_CPU_HAS_SSE                1       /* SSE extensions supported */
-+
-+/* SSE2 disabled while investigating BUG1060 */
-+#define CI_CPU_HAS_SSE2               0       /* SSE2 extensions supported */
-+#define CI_CPU_OOS            0       /* CPU does out of order stores */
-+
-+
-+#endif  /* __CI_COMPAT_X86_64_H__ */
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/driver/resource/efx_vi.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,276 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file contains public EFX VI API to Solarflare resource manager.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_DRIVER_RESOURCE_EFX_VI_H__
-+#define __CI_DRIVER_RESOURCE_EFX_VI_H__
-+
-+/* Default size of event queue in the efx_vi resource.  Copied from
-+ * CI_CFG_NETIF_EVENTQ_SIZE */
-+#define EFX_VI_EVENTQ_SIZE_DEFAULT 1024
-+
-+extern int efx_vi_eventq_size;
-+
-+/**************************************************************************
-+ * efx_vi_state types, allocation and free
-+ **************************************************************************/
-+
-+/*! Handle for refering to a efx_vi */
-+struct efx_vi_state;
-+
-+/*!
-+ * Allocate an efx_vi, including event queue and pt_endpoint
-+ *
-+ * \param vih_out Pointer to a handle that is set on success
-+ * \param nic_index Index of NIC to apply this resource to
-+ * \return Zero on success (and vih_out set), non-zero on failure.
-+ */
-+extern int
-+efx_vi_alloc(struct efx_vi_state **vih_out, int nic_index);
-+
-+/*!
-+ * Free a previously allocated efx_vi
-+ *
-+ * \param vih The handle of the efx_vi to free
-+ */
-+extern void
-+efx_vi_free(struct efx_vi_state *vih);
-+
-+/*!
-+ * Reset a previously allocated efx_vi
-+ *
-+ * \param vih The handle of the efx_vi to reset
-+ */
-+extern void
-+efx_vi_reset(struct efx_vi_state *vih);
-+
-+/**************************************************************************
-+ * efx_vi_eventq types and functions
-+ **************************************************************************/
-+
-+/*!
-+ * Register a function to receive callbacks when event queue timeouts
-+ * or wakeups occur.  Only one function per efx_vi can be registered
-+ * at once.
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param callback The function to callback
-+ * \param context An argument to pass to the callback function
-+ * \return Zero on success, non-zero on failure.
-+ */
-+extern int
-+efx_vi_eventq_register_callback(struct efx_vi_state *vih,
-+                              void (*callback)(void *context, int is_timeout),
-+                              void *context);
-+
-+/*!
-+ * Remove the current eventq timeout or wakeup callback function
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \return Zero on success, non-zero on failure
-+ */
-+extern int
-+efx_vi_eventq_kill_callback(struct efx_vi_state *vih);
-+
-+/**************************************************************************
-+ * efx_vi_dma_map types and functions
-+ **************************************************************************/
-+
-+/*!
-+ * Handle for refering to a efx_vi
-+ */
-+struct efx_vi_dma_map_state;
-+
-+/*!
-+ * Map a list of buffer pages so they are registered with the hardware
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param addrs An array of page pointers to map
-+ * \param n_addrs Length of the page pointer array.  Must be a power of two.
-+ * \param dmh_out Set on success to a handle used to refer to this mapping
-+ * \return Zero on success, non-zero on failure.
-+ */
-+extern int
-+efx_vi_dma_map_pages(struct efx_vi_state *vih, struct page **pages,
-+                       int n_pages, struct efx_vi_dma_map_state **dmh_out);
-+extern int
-+efx_vi_dma_map_addrs(struct efx_vi_state *vih,
-+                   unsigned long long *dev_bus_addrs, int n_pages,
-+                   struct efx_vi_dma_map_state **dmh_out);
-+
-+/*!
-+ * Unmap a previously mapped set of pages so they are no longer registered
-+ * with the hardware.
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param dmh The handle to identify the dma mapping
-+ */
-+extern void
-+efx_vi_dma_unmap_pages(struct efx_vi_state *vih,
-+                     struct efx_vi_dma_map_state *dmh);
-+extern void
-+efx_vi_dma_unmap_addrs(struct efx_vi_state *vih,
-+                     struct efx_vi_dma_map_state *dmh);
-+
-+/*!
-+ * Retrieve the buffer address of the mapping
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param dmh The handle to identify the buffer mapping
-+ * \return The buffer address on success, or zero on failure
-+ */
-+extern unsigned
-+efx_vi_dma_get_map_addr(struct efx_vi_state *vih,
-+                      struct efx_vi_dma_map_state *dmh);
-+
-+/**************************************************************************
-+ * efx_vi filter functions
-+ **************************************************************************/
-+
-+#define EFX_VI_STATIC_FILTERS 32
-+
-+/*! Handle to refer to a filter instance */
-+struct filter_resource_t;
-+
-+/*!
-+ * Allocate and add a filter
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param protocol The protocol of the new filter: UDP or TCP
-+ * \param ip_addr_be32 The local ip address of the filter
-+ * \param port_le16 The local port of the filter
-+ * \param fh_out Set on success to be a handle to refer to this filter
-+ * \return Zero on success, non-zero on failure.
-+ */
-+extern int
-+efx_vi_filter(struct efx_vi_state *vih, int protocol, unsigned ip_addr_be32,
-+            int port_le16, struct filter_resource_t **fh_out);
-+
-+/*!
-+ * Remove a filter and free resources associated with it
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param fh The handle to identify the filter
-+ * \return Zero on success, non-zero on failure
-+ */
-+extern int
-+efx_vi_filter_stop(struct efx_vi_state *vih, struct filter_resource_t *fh);
-+
-+/**************************************************************************
-+ * efx_vi hw resources types and functions
-+ **************************************************************************/
-+
-+/*! Constants for the type field in efx_vi_hw_resource */
-+#define EFX_VI_HW_RESOURCE_TXDMAQ    0x0      /* PFN of TX DMA Q */
-+#define EFX_VI_HW_RESOURCE_RXDMAQ    0x1      /* PFN of RX DMA Q */
-+#define EFX_VI_HW_RESOURCE_TXBELL    0x2      /* PFN of TX Doorbell (EF1) */
-+#define EFX_VI_HW_RESOURCE_RXBELL    0x3      /* PFN of RX Doorbell (EF1) */
-+#define EFX_VI_HW_RESOURCE_EVQTIMER  0x4      /* Address of event q timer */
-+
-+/* Address of event q pointer (EF1) */
-+#define EFX_VI_HW_RESOURCE_EVQPTR    0x5
-+/* Address of register pointer (Falcon A) */
-+#define EFX_VI_HW_RESOURCE_EVQRPTR   0x6
-+/* Offset of register pointer (Falcon B) */
-+#define EFX_VI_HW_RESOURCE_EVQRPTR_OFFSET 0x7
-+/* Address of mem KVA */
-+#define EFX_VI_HW_RESOURCE_EVQMEMKVA 0x8
-+/* PFN of doorbell page (Falcon) */
-+#define EFX_VI_HW_RESOURCE_BELLPAGE  0x9
-+
-+/*! How large an array to allocate for the get_() functions - smaller
-+  than the total number of constants as some are mutually exclusive */
-+#define EFX_VI_HW_RESOURCE_MAXSIZE   0x7
-+
-+/*! Constants for the mem_type field in efx_vi_hw_resource */
-+#define EFX_VI_HW_RESOURCE_IOBUFFER   0       /* Host memory */
-+#define EFX_VI_HW_RESOURCE_PERIPHERAL 1       /* Card memory/registers */
-+
-+/*!
-+ * Data structure providing information on a hardware resource mapping
-+ */
-+struct efx_vi_hw_resource {
-+      u8 type;                /*!< What this resource represents */
-+      u8 mem_type;            /*!< What type of memory is it in, eg,
-+                               * host or iomem */
-+      u8 more_to_follow;      /*!< Is this part of a multi-region resource */
-+      u32 length;             /*!< Length of the resource in bytes */
-+      unsigned long address;  /*!< Address of this resource */
-+};
-+
-+/*!
-+ * Metadata concerning the list of hardware resource mappings
-+ */
-+struct efx_vi_hw_resource_metadata {
-+      int version;
-+      int evq_order;
-+      int evq_offs;
-+      int evq_capacity;
-+      int instance;
-+      unsigned rx_capacity;
-+      unsigned tx_capacity;
-+      int nic_arch;
-+      int nic_revision;
-+      char nic_variant;
-+};
-+
-+/*!
-+ * Obtain a list of hardware resource mappings, using virtual addresses
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param mdata Pointer to a structure to receive the metadata
-+ * \param hw_res_array An array to receive the list of hardware resources
-+ * \param length The length of hw_res_array.  Updated on success to contain
-+ * the number of entries in the supplied array that were used.
-+ * \return Zero on success, non-zero on failure
-+ */
-+extern int
-+efx_vi_hw_resource_get_virt(struct efx_vi_state *vih,
-+                          struct efx_vi_hw_resource_metadata *mdata,
-+                          struct efx_vi_hw_resource *hw_res_array,
-+                          int *length);
-+
-+/*!
-+ * Obtain a list of hardware resource mappings, using physical addresses
-+ *
-+ * \param vih The handle to identify the efx_vi
-+ * \param mdata Pointer to a structure to receive the metadata
-+ * \param hw_res_array An array to receive the list of hardware resources
-+ * \param length The length of hw_res_array.  Updated on success to contain
-+ * the number of entries in the supplied array that were used.
-+ * \return Zero on success, non-zero on failure
-+ */
-+extern int
-+efx_vi_hw_resource_get_phys(struct efx_vi_state *vih,
-+                          struct efx_vi_hw_resource_metadata *mdata,
-+                          struct efx_vi_hw_resource *hw_res_array,
-+                          int *length);
-+
-+#endif /* __CI_DRIVER_RESOURCE_EFX_VI_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/common.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,102 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides API of the efhw library which may be used both from
-+ * the kernel and from the user-space code.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_COMMON_H__
-+#define __CI_EFHW_COMMON_H__
-+
-+#include <ci/efhw/common_sysdep.h>
-+
-+enum efhw_arch {
-+      EFHW_ARCH_FALCON,
-+      EFHW_ARCH_SIENA,
-+};
-+
-+typedef uint32_t efhw_buffer_addr_t;
-+#define EFHW_BUFFER_ADDR_FMT  "[ba:%"PRIx32"]"
-+
-+/*! Comment? */
-+typedef union {
-+      uint64_t u64;
-+      struct {
-+              uint32_t a;
-+              uint32_t b;
-+      } opaque;
-+      struct {
-+              uint32_t code;
-+              uint32_t status;
-+      } ev1002;
-+} efhw_event_t;
-+
-+/* Flags for TX/RX queues */
-+#define EFHW_VI_JUMBO_EN           0x01  /*! scatter RX over multiple desc */
-+#define EFHW_VI_ISCSI_RX_HDIG_EN   0x02  /*! iscsi rx header digest */
-+#define EFHW_VI_ISCSI_TX_HDIG_EN   0x04  /*! iscsi tx header digest */
-+#define EFHW_VI_ISCSI_RX_DDIG_EN   0x08  /*! iscsi rx data digest */
-+#define EFHW_VI_ISCSI_TX_DDIG_EN   0x10  /*! iscsi tx data digest */
-+#define EFHW_VI_TX_PHYS_ADDR_EN    0x20  /*! TX physical address mode */
-+#define EFHW_VI_RX_PHYS_ADDR_EN    0x40  /*! RX physical address mode */
-+#define EFHW_VI_RM_WITH_INTERRUPT  0x80  /*! VI with an interrupt */
-+#define EFHW_VI_TX_IP_CSUM_DIS     0x100 /*! enable ip checksum generation */
-+#define EFHW_VI_TX_TCPUDP_CSUM_DIS 0x200 /*! enable tcp/udp checksum
-+                                         generation */
-+#define EFHW_VI_TX_TCPUDP_ONLY     0x400 /*! drop non-tcp/udp packets */
-+
-+/* Types of hardware filter */
-+/* Each of these values implicitly selects scatter filters on B0 - or in
-+   EFHW_IP_FILTER_TYPE_NOSCAT_B0_MASK if a non-scatter filter is required */
-+#define EFHW_IP_FILTER_TYPE_UDP_WILDCARD  (0) /* dest host only */
-+#define EFHW_IP_FILTER_TYPE_UDP_FULL      (1) /* dest host and port */
-+#define EFHW_IP_FILTER_TYPE_TCP_WILDCARD  (2) /* dest based filter */
-+#define EFHW_IP_FILTER_TYPE_TCP_FULL      (3) /* src  filter */
-+/* Same again, but with RSS (for B0 only) */
-+#define EFHW_IP_FILTER_TYPE_UDP_WILDCARD_RSS_B0  (4)
-+#define EFHW_IP_FILTER_TYPE_UDP_FULL_RSS_B0      (5)
-+#define EFHW_IP_FILTER_TYPE_TCP_WILDCARD_RSS_B0  (6)
-+#define EFHW_IP_FILTER_TYPE_TCP_FULL_RSS_B0      (7)
-+
-+#define EFHW_IP_FILTER_TYPE_FULL_MASK      (0x1) /* Mask for full / wildcard */
-+#define EFHW_IP_FILTER_TYPE_TCP_MASK       (0x2) /* Mask for TCP type */
-+#define EFHW_IP_FILTER_TYPE_RSS_B0_MASK    (0x4) /* Mask for B0 RSS enable */
-+#define EFHW_IP_FILTER_TYPE_NOSCAT_B0_MASK (0x8) /* Mask for B0 SCATTER dsbl */
-+
-+#define EFHW_IP_FILTER_TYPE_MASK      (0xffff) /* Mask of types above */
-+
-+#define EFHW_IP_FILTER_BROADCAST      (0x10000) /* driverlink filter
-+                                                   support */
-+
-+#endif /* __CI_EFHW_COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/common_sysdep.h    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,67 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides version-independent Linux kernel API for
-+ * userland-to-kernel interfaces.
-+ * Only kernels >=2.6.9 are supported.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_COMMON_LINUX_H__
-+#define __CI_EFHW_COMMON_LINUX_H__
-+
-+#include <linux/types.h>
-+#include <linux/version.h>
-+
-+/* Dirty hack, but Linux kernel does not provide DMA_ADDR_T_FMT */
-+#if BITS_PER_LONG == 64 || defined(CONFIG_HIGHMEM64G)
-+#define DMA_ADDR_T_FMT "%llx"
-+#else
-+#define DMA_ADDR_T_FMT "%x"
-+#endif
-+
-+/* Linux kernel also does not provide PRIx32... Sigh. */
-+#define PRIx32 "x"
-+#define PRIx64 "llx"
-+
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
-+enum {
-+      false = 0,
-+      true = 1
-+};
-+
-+typedef _Bool bool;
-+#endif /* LINUX_VERSION_CODE < 2.6.19 */
-+
-+#endif /* __CI_EFHW_COMMON_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/debug.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/debug.h    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,84 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides debug-related API for efhw library using Linux kernel
-+ * primitives.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_DEBUG_LINUX_H__
-+#define __CI_EFHW_DEBUG_LINUX_H__
-+
-+#define EFHW_PRINTK_PREFIX "[sfc efhw] "
-+
-+#define EFHW_PRINTK(level, fmt, ...) \
-+      printk(level EFHW_PRINTK_PREFIX fmt "\n", __VA_ARGS__)
-+
-+/* Following macros should be used with non-zero format parameters
-+ * due to __VA_ARGS__ limitations.  Use "%s" with __FUNCTION__ if you can't
-+ * find better parameters. */
-+#define EFHW_ERR(fmt, ...)     EFHW_PRINTK(KERN_ERR, fmt, __VA_ARGS__)
-+#define EFHW_WARN(fmt, ...)    EFHW_PRINTK(KERN_WARNING, fmt, __VA_ARGS__)
-+#define EFHW_NOTICE(fmt, ...)  EFHW_PRINTK(KERN_NOTICE, fmt, __VA_ARGS__)
-+#if 0 && !defined(NDEBUG)
-+#define EFHW_TRACE(fmt, ...) EFHW_PRINTK(KERN_DEBUG, fmt, __VA_ARGS__)
-+#else
-+#define EFHW_TRACE(fmt, ...)
-+#endif
-+
-+#ifndef NDEBUG
-+#define EFHW_ASSERT(cond)  BUG_ON((cond) == 0)
-+#define EFHW_DO_DEBUG(expr) expr
-+#else
-+#define EFHW_ASSERT(cond)
-+#define EFHW_DO_DEBUG(expr)
-+#endif
-+
-+#define EFHW_TEST(expr)                       \
-+      do {                            \
-+              if (unlikely(!(expr)))  \
-+              BUG();                  \
-+      } while (0)
-+
-+/* Build time asserts. We paste the line number into the type name
-+ * so that the macro can be used more than once per file even if the
-+ * compiler objects to multiple identical typedefs. Collisions
-+ * between use in different header files is still possible. */
-+#ifndef EFHW_BUILD_ASSERT
-+#define __EFHW_BUILD_ASSERT_NAME(_x) __EFHW_BUILD_ASSERT_ILOATHECPP(_x)
-+#define __EFHW_BUILD_ASSERT_ILOATHECPP(_x)  __EFHW_BUILD_ASSERT__ ##_x
-+#define EFHW_BUILD_ASSERT(e) \
-+      typedef char __EFHW_BUILD_ASSERT_NAME(__LINE__)[(e) ? 1 : -1]
-+#endif
-+
-+#endif /* __CI_EFHW_DEBUG_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/efhw_config.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/efhw_config.h      2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,43 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides some limits used in both kernel and userland code.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_EFAB_CONFIG_H__
-+#define __CI_EFHW_EFAB_CONFIG_H__
-+
-+#define EFHW_MAX_NR_DEVS 5    /* max number of efhw devices supported */
-+
-+#endif /* __CI_EFHW_EFAB_CONFIG_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/efhw_types.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/efhw_types.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,342 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides struct efhw_nic and some related types.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_EFAB_TYPES_H__
-+#define __CI_EFHW_EFAB_TYPES_H__
-+
-+#include <ci/efhw/efhw_config.h>
-+#include <ci/efhw/hardware_sysdep.h>
-+#include <ci/efhw/iopage_types.h>
-+#include <ci/efhw/sysdep.h>
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * hardware limits used in the types
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+#define EFHW_KEVENTQ_MAX    8
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * forward type declarations
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+struct efhw_nic;
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * Managed interface
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+struct efhw_buffer_table_allocation{
-+      unsigned base;
-+      unsigned order;
-+};
-+
-+struct eventq_resource_hardware {
-+      /*!iobuffer allocated for eventq - can be larger than eventq */
-+      efhw_iopages_t iobuff;
-+      unsigned iobuff_off;
-+      struct efhw_buffer_table_allocation buf_tbl_alloc;
-+      int capacity;           /*!< capacity of event queue */
-+};
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * event queues and event driven callbacks
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+struct efhw_keventq {
-+      volatile int lock;
-+      caddr_t evq_base;
-+      int32_t evq_ptr;
-+      uint32_t evq_mask;
-+      unsigned instance;
-+      struct eventq_resource_hardware hw;
-+      struct efhw_ev_handler *ev_handlers;
-+};
-+
-+/**********************************************************************
-+ * Portable HW interface. ***************************************
-+ **********************************************************************/
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * EtherFabric Functional units - configuration and control
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+struct efhw_func_ops {
-+
-+  /*-------------- Initialisation ------------ */
-+
-+      /*! close down all hardware functional units - leaves NIC in a safe
-+         state for driver unload */
-+      void (*close_hardware) (struct efhw_nic *nic);
-+
-+      /*! initialise all hardware functional units */
-+      int (*init_hardware) (struct efhw_nic *nic,
-+                            struct efhw_ev_handler *,
-+                            const uint8_t *mac_addr);
-+
-+  /*-------------- Interrupt support  ------------ */
-+
-+      /*! Main interrupt routine
-+       **        This function returns,
-+       **  - zero,       if the IRQ was not generated by EF1
-+       **  - non-zero,   if EF1 was the source of the IRQ
-+       **
-+       **
-+       ** opaque is an OS provided pointer for use by the OS callbacks
-+       ** e.g in Windows used to indicate DPC scheduled
-+       */
-+      int (*interrupt) (struct efhw_nic *nic);
-+
-+      /*! Enable given interrupt mask for the given IRQ unit */
-+      void (*interrupt_enable) (struct efhw_nic *nic, uint idx);
-+
-+      /*! Disable given interrupt mask for the given IRQ unit */
-+      void (*interrupt_disable) (struct efhw_nic *nic, uint idx);
-+
-+      /*! Set interrupt moderation strategy for the given IRQ unit
-+       ** val is in usec
-+       */
-+      void (*set_interrupt_moderation)(struct efhw_nic *nic,
-+                                       uint idx, uint val);
-+
-+  /*-------------- Event support  ------------ */
-+
-+      /*! Enable the given event queue
-+         depending on the underlying implementation (EF1 or Falcon) then
-+         either a q_base_addr in host memory, or a buffer base id should
-+         be proivded
-+       */
-+      void (*event_queue_enable) (struct efhw_nic *nic,
-+                                  uint evq,   /* evnt queue index */
-+                                  uint evq_size,      /* units of #entries */
-+                                  dma_addr_t q_base_addr, uint buf_base_id);
-+
-+      /*! Disable the given event queue (and any associated timer) */
-+      void (*event_queue_disable) (struct efhw_nic *nic, uint evq,
-+                                   int timer_only);
-+
-+      /*! request wakeup from the NIC on a given event Q */
-+      void (*wakeup_request) (struct efhw_nic *nic, dma_addr_t q_base_addr,
-+                              int next_i, int evq);
-+
-+      /*! Push a SW event on a given eventQ */
-+      void (*sw_event) (struct efhw_nic *nic, int data, int evq);
-+
-+  /*-------------- Filter support  ------------ */
-+
-+      /*! Setup a given filter - The software can request a filter_i,
-+       * but some EtherFabric implementations will override with
-+       * a more suitable index
-+       */
-+      int (*ipfilter_set) (struct efhw_nic *nic, int type,
-+                           int *filter_i, int dmaq,
-+                           unsigned saddr_be32, unsigned sport_be16,
-+                           unsigned daddr_be32, unsigned dport_be16);
-+
-+      /*! Attach a given filter to a DMAQ */
-+      void (*ipfilter_attach) (struct efhw_nic *nic, int filter_idx,
-+                               int dmaq_idx);
-+
-+      /*! Detach a filter from its DMAQ */
-+      void (*ipfilter_detach) (struct efhw_nic *nic, int filter_idx);
-+
-+      /*! Clear down a given filter */
-+      void (*ipfilter_clear) (struct efhw_nic *nic, int filter_idx);
-+
-+  /*-------------- DMA support  ------------ */
-+
-+      /*! Initialise NIC state for a given TX DMAQ */
-+      void (*dmaq_tx_q_init) (struct efhw_nic *nic,
-+                              uint dmaq, uint evq, uint owner, uint tag,
-+                              uint dmaq_size, uint buf_idx, uint flags);
-+
-+      /*! Initialise NIC state for a given RX DMAQ */
-+      void (*dmaq_rx_q_init) (struct efhw_nic *nic,
-+                              uint dmaq, uint evq, uint owner, uint tag,
-+                              uint dmaq_size, uint buf_idx, uint flags);
-+
-+      /*! Disable a given TX DMAQ */
-+      void (*dmaq_tx_q_disable) (struct efhw_nic *nic, uint dmaq);
-+
-+      /*! Disable a given RX DMAQ */
-+      void (*dmaq_rx_q_disable) (struct efhw_nic *nic, uint dmaq);
-+
-+      /*! Flush a given TX DMA channel */
-+      int (*flush_tx_dma_channel) (struct efhw_nic *nic, uint dmaq);
-+
-+      /*! Flush a given RX DMA channel */
-+      int (*flush_rx_dma_channel) (struct efhw_nic *nic, uint dmaq);
-+
-+  /*-------------- Buffer table Support ------------ */
-+
-+      /*! Initialise a buffer table page */
-+      void (*buffer_table_set) (struct efhw_nic *nic,
-+                                dma_addr_t dma_addr,
-+                                uint bufsz, uint region,
-+                                int own_id, int buffer_id);
-+
-+      /*! Initialise a block of buffer table pages */
-+      void (*buffer_table_set_n) (struct efhw_nic *nic, int buffer_id,
-+                                  dma_addr_t dma_addr,
-+                                  uint bufsz, uint region,
-+                                  int n_pages, int own_id);
-+
-+      /*! Clear a block of buffer table pages */
-+      void (*buffer_table_clear) (struct efhw_nic *nic, int buffer_id,
-+                                  int num);
-+
-+      /*! Commit a buffer table update  */
-+      void (*buffer_table_commit) (struct efhw_nic *nic);
-+
-+};
-+
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * NIC type
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+struct efhw_device_type {
-+      int  arch;            /* enum efhw_arch */
-+      char variant;         /* 'A', 'B', ... */
-+      int  revision;        /* 0, 1, ... */
-+};
-+
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * EtherFabric NIC instance - nic.c for HW independent functions
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+/*! */
-+struct efhw_nic {
-+      /*! zero base index in efrm_nic_table.nic array */
-+      volatile int index;
-+      int ifindex;            /*!< OS level nic index */
-+#ifdef HAS_NET_NAMESPACE
-+      struct net *nd_net;
-+#endif
-+
-+      struct efhw_device_type devtype;
-+
-+      /*! Options that can be set by user. */
-+      unsigned options;
-+# define NIC_OPT_EFTEST             0x1       /* owner is an eftest app */
-+
-+# define NIC_OPT_DEFAULT            0
-+
-+      /*! Internal flags that indicate hardware properties at runtime. */
-+      unsigned flags;
-+# define NIC_FLAG_NO_INTERRUPT          0x01 /* to be set at init time only */
-+# define NIC_FLAG_TRY_MSI               0x02
-+# define NIC_FLAG_MSI                   0x04
-+# define NIC_FLAG_OS_IRQ_EN             0x08
-+# define NIC_FLAG_10G                   0x10
-+
-+      unsigned mtu;           /*!< MAC MTU (includes MAC hdr) */
-+
-+      /* hardware resources */
-+
-+      /*! I/O address of the start of the bar */
-+      efhw_ioaddr_t bar_ioaddr;
-+
-+      /*! Bar number of control aperture. */
-+      unsigned ctr_ap_bar;
-+      /*! Length of control aperture in bytes. */
-+      unsigned ctr_ap_bytes;
-+
-+      uint8_t mac_addr[ETH_ALEN];     /*!< mac address  */
-+
-+      /*! EtherFabric Functional Units -- functions */
-+      const struct efhw_func_ops *efhw_func;
-+
-+      /* Value read from FPGA version register.  Zero for asic. */
-+      unsigned fpga_version;
-+
-+      /*! This lock protects a number of misc NIC resources.  It should
-+       * only be used for things that can be at the bottom of the lock
-+       * order.  ie. You mustn't attempt to grab any other lock while
-+       * holding this one.
-+       */
-+      spinlock_t *reg_lock;
-+      spinlock_t the_reg_lock;
-+
-+      int buf_commit_outstanding;     /*!< outstanding buffer commits */
-+
-+      /*! interrupt callbacks (hard-irq) */
-+      void (*irq_handler) (struct efhw_nic *, int unit);
-+
-+      /*! event queues per driver */
-+      struct efhw_keventq evq[EFHW_KEVENTQ_MAX];
-+
-+/* for marking when we are not using an IRQ unit
-+      - 0 is a valid offset to an IRQ unit on EF1! */
-+#define EFHW_IRQ_UNIT_UNUSED  0xffff
-+      /*! interrupt unit in use  */
-+      unsigned int irq_unit[EFHW_KEVENTQ_MAX];
-+      efhw_iopage_t irq_iobuff;       /*!<  Falcon SYSERR interrupt */
-+
-+      /* The new driverlink infrastructure. */
-+      struct efx_dl_device *net_driver_dev;
-+      struct efx_dlfilt_cb_s *dlfilter_cb;
-+
-+      /*! Bit masks of the sizes of event queues and dma queues supported
-+       * by the nic. */
-+      unsigned evq_sizes;
-+      unsigned rxq_sizes;
-+      unsigned txq_sizes;
-+
-+      /* Size of filter table (including odd and even banks). */
-+      unsigned filter_tbl_size;
-+};
-+
-+
-+#define EFHW_KVA(nic)       ((nic)->bar_ioaddr)
-+
-+
-+#endif /* __CI_EFHW_EFHW_TYPES_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/hardware_sysdep.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,84 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides version-independent Linux kernel API for header files
-+ * with hardware-related definitions (in ci/driver/efab/hardware*).
-+ * Only kernels >=2.6.9 are supported.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_HARDWARE_LINUX_H__
-+#define __CI_EFHW_HARDWARE_LINUX_H__
-+
-+#include <asm/io.h>
-+
-+#ifdef __LITTLE_ENDIAN
-+#define EFHW_IS_LITTLE_ENDIAN
-+#elif __BIG_ENDIAN
-+#define EFHW_IS_BIG_ENDIAN
-+#else
-+#error Unknown endianness
-+#endif
-+
-+#ifndef mmiowb
-+      #if defined(__i386__) || defined(__x86_64__)
-+              #define mmiowb()
-+      #elif defined(__ia64__)
-+              #ifndef ia64_mfa
-+                      #define ia64_mfa() asm volatile ("mf.a" ::: "memory")
-+              #endif
-+      #define mmiowb ia64_mfa
-+      #else
-+      #error "Need definition for mmiowb()"
-+      #endif
-+#endif
-+
-+typedef char *efhw_ioaddr_t;
-+
-+#ifndef readq
-+static inline uint64_t __readq(void __iomem *addr)
-+{
-+      return *(volatile uint64_t *)addr;
-+}
-+#define readq(x) __readq(x)
-+#endif
-+
-+#ifndef writeq
-+static inline void __writeq(uint64_t v, void __iomem *addr)
-+{
-+      *(volatile uint64_t *)addr = v;
-+}
-+#define writeq(val, addr) __writeq((val), (addr))
-+#endif
-+
-+#endif /* __CI_EFHW_HARDWARE_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/iopage_types.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/iopage_types.h     2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,188 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides efhw_page_t and efhw_iopage_t for Linux kernel.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_IOPAGE_LINUX_H__
-+#define __CI_EFHW_IOPAGE_LINUX_H__
-+
-+#include <linux/gfp.h>
-+#include <linux/hardirq.h>
-+#include <ci/efhw/debug.h>
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * efhw_page_t: A single page of memory.  Directly mapped in the driver,
-+ * and can be mapped to userlevel.
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+typedef struct {
-+      unsigned long kva;
-+} efhw_page_t;
-+
-+static inline int efhw_page_alloc(efhw_page_t *p)
-+{
-+      p->kva = __get_free_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL);
-+      return p->kva ? 0 : -ENOMEM;
-+}
-+
-+static inline int efhw_page_alloc_zeroed(efhw_page_t *p)
-+{
-+      p->kva = get_zeroed_page(in_interrupt()? GFP_ATOMIC : GFP_KERNEL);
-+      return p->kva ? 0 : -ENOMEM;
-+}
-+
-+static inline void efhw_page_free(efhw_page_t *p)
-+{
-+      free_page(p->kva);
-+      EFHW_DO_DEBUG(memset(p, 0, sizeof(*p)));
-+}
-+
-+static inline char *efhw_page_ptr(efhw_page_t *p)
-+{
-+      return (char *)p->kva;
-+}
-+
-+static inline unsigned efhw_page_pfn(efhw_page_t *p)
-+{
-+      return (unsigned)(__pa(p->kva) >> PAGE_SHIFT);
-+}
-+
-+static inline void efhw_page_mark_invalid(efhw_page_t *p)
-+{
-+      p->kva = 0;
-+}
-+
-+static inline int efhw_page_is_valid(efhw_page_t *p)
-+{
-+      return p->kva != 0;
-+}
-+
-+static inline void efhw_page_init_from_va(efhw_page_t *p, void *va)
-+{
-+      p->kva = (unsigned long)va;
-+}
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * efhw_iopage_t: A single page of memory.  Directly mapped in the driver,
-+ * and can be mapped to userlevel.  Can also be accessed by the NIC.
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+typedef struct {
-+      efhw_page_t p;
-+      dma_addr_t dma_addr;
-+} efhw_iopage_t;
-+
-+static inline dma_addr_t efhw_iopage_dma_addr(efhw_iopage_t *p)
-+{
-+      return p->dma_addr;
-+}
-+
-+#define efhw_iopage_ptr(iop)          efhw_page_ptr(&(iop)->p)
-+#define efhw_iopage_pfn(iop)          efhw_page_pfn(&(iop)->p)
-+#define efhw_iopage_mark_invalid(iop) efhw_page_mark_invalid(&(iop)->p)
-+#define efhw_iopage_is_valid(iop)     efhw_page_is_valid(&(iop)->p)
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * efhw_iopages_t: A set of pages that are contiguous in physical memory.
-+ * Directly mapped in the driver, and can be mapped to userlevel.  Can also
-+ * be accessed by the NIC.
-+ *
-+ * NB. The O/S may be unwilling to allocate many, or even any of these.  So
-+ * only use this type where the NIC really needs a physically contiguous
-+ * buffer.
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+typedef struct {
-+      caddr_t kva;
-+      unsigned order;
-+      dma_addr_t dma_addr;
-+} efhw_iopages_t;
-+
-+static inline caddr_t efhw_iopages_ptr(efhw_iopages_t *p)
-+{
-+      return p->kva;
-+}
-+
-+static inline unsigned efhw_iopages_pfn(efhw_iopages_t *p)
-+{
-+      return (unsigned)(__pa(p->kva) >> PAGE_SHIFT);
-+}
-+
-+static inline dma_addr_t efhw_iopages_dma_addr(efhw_iopages_t *p)
-+{
-+      return p->dma_addr;
-+}
-+
-+static inline unsigned efhw_iopages_size(efhw_iopages_t *p)
-+{
-+      return 1u << (p->order + PAGE_SHIFT);
-+}
-+
-+/* efhw_iopage_t <-> efhw_iopages_t conversions for handling physically
-+ * contiguous allocations in iobufsets for iSCSI.  This allows the
-+ * essential information about contiguous allocations from
-+ * efhw_iopages_alloc() to be saved away in the efhw_iopage_t array in an
-+ * iobufset.  (Changing the iobufset resource to use a union type would
-+ * involve a lot of code changes, and make the iobufset's metadata larger
-+ * which could be bad as it's supposed to fit into a single page on some
-+ * platforms.)
-+ */
-+static inline void
-+efhw_iopage_init_from_iopages(efhw_iopage_t *iopage,
-+                          efhw_iopages_t *iopages, unsigned pageno)
-+{
-+      iopage->p.kva = ((unsigned long)efhw_iopages_ptr(iopages))
-+          + (pageno * PAGE_SIZE);
-+      iopage->dma_addr = efhw_iopages_dma_addr(iopages) +
-+          (pageno * PAGE_SIZE);
-+}
-+
-+static inline void
-+efhw_iopages_init_from_iopage(efhw_iopages_t *iopages,
-+                          efhw_iopage_t *iopage, unsigned order)
-+{
-+      iopages->kva = (caddr_t) efhw_iopage_ptr(iopage);
-+      EFHW_ASSERT(iopages->kva);
-+      iopages->order = order;
-+      iopages->dma_addr = efhw_iopage_dma_addr(iopage);
-+}
-+
-+#endif /* __CI_EFHW_IOPAGE_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/public.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/public.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,83 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides public API of efhw library exported from the SFC
-+ * resource driver.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_PUBLIC_H__
-+#define __CI_EFHW_PUBLIC_H__
-+
-+#include <ci/efhw/common.h>
-+#include <ci/efhw/efhw_types.h>
-+
-+/*! Returns true if we have some EtherFabric functional units -
-+  whether configured or not */
-+static inline int efhw_nic_have_functional_units(struct efhw_nic *nic)
-+{
-+      return nic->efhw_func != 0;
-+}
-+
-+/*! Returns true if the EtherFabric functional units have been configured  */
-+static inline int efhw_nic_have_hw(struct efhw_nic *nic)
-+{
-+      return efhw_nic_have_functional_units(nic) && (EFHW_KVA(nic) != 0);
-+}
-+
-+/*! Helper function to allocate the iobuffer needed by an eventq
-+ *   - it ensures the eventq has the correct alignment for the NIC
-+ *
-+ * \param rm        Event-queue resource manager
-+ * \param instance  Event-queue instance (index)
-+ * \param buf_bytes Requested size of eventq
-+ * \return          < 0 if iobuffer allocation fails
-+ */
-+int efhw_nic_event_queue_alloc_iobuffer(struct efhw_nic *nic,
-+                                      struct eventq_resource_hardware *h,
-+                                      int evq_instance, unsigned buf_bytes);
-+
-+extern void falcon_nic_set_rx_usr_buf_size(struct efhw_nic *,
-+                                         int rx_usr_buf_size);
-+
-+extern void
-+falcon_nic_rx_filter_ctl_set(struct efhw_nic *nic, uint32_t tcp_full,
-+                           uint32_t tcp_wild,
-+                           uint32_t udp_full, uint32_t udp_wild);
-+
-+extern void
-+falcon_nic_rx_filter_ctl_get(struct efhw_nic *nic, uint32_t *tcp_full,
-+                           uint32_t *tcp_wild,
-+                           uint32_t *udp_full, uint32_t *udp_wild);
-+
-+#endif /* __CI_EFHW_PUBLIC_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efhw/sysdep.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,72 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides version-independent Linux kernel API for efhw library.
-+ * Only kernels >=2.6.9 are supported.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFHW_SYSDEP_LINUX_H__
-+#define __CI_EFHW_SYSDEP_LINUX_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/spinlock.h>
-+#include <linux/delay.h>
-+#include <linux/if_ether.h>
-+
-+#include <linux/netdevice.h> /* necessary for etherdevice.h on some kernels */
-+#include <linux/etherdevice.h>
-+
-+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,21)
-+static inline int is_local_ether_addr(const u8 *addr)
-+{
-+      return (0x02 & addr[0]);
-+}
-+#endif
-+
-+typedef unsigned long irq_flags_t;
-+
-+#define spin_lock_destroy(l_)  do {} while (0)
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,24)
-+#define HAS_NET_NAMESPACE
-+#endif
-+
-+/* Funny, but linux has round_up for x86 only, defined in
-+ * x86-specific header */
-+#ifndef round_up
-+#define round_up(x, y) (((x) + (y) - 1) & ~((y)-1))
-+#endif
-+
-+#endif /* __CI_EFHW_SYSDEP_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/nic_table.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/nic_table.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,98 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides public API for NIC table.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFRM_NIC_TABLE_H__
-+#define __CI_EFRM_NIC_TABLE_H__
-+
-+#include <ci/efhw/efhw_types.h>
-+#include <ci/efrm/sysdep.h>
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * struct efrm_nic_table - top level driver object keeping all NICs -
-+ * implemented in driver_object.c
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+/*! Comment? */
-+struct efrm_nic_table {
-+      /*! nics attached to this driver */
-+      struct efhw_nic *nic[EFHW_MAX_NR_DEVS];
-+      /*! pointer to an arbitrary struct efhw_nic if one exists;
-+       * for code which does not care which NIC it wants but
-+       * still needs one. Note you cannot assume nic[0] exists. */
-+      struct efhw_nic *a_nic;
-+      uint32_t nic_count;     /*!< number of nics attached to this driver */
-+      spinlock_t lock;        /*!< lock for table modifications */
-+      atomic_t ref_count;     /*!< refcount for users of nic table */
-+};
-+
-+/* Resource driver structures used by other drivers as well */
-+extern struct efrm_nic_table efrm_nic_table;
-+
-+static inline void efrm_nic_table_hold(void)
-+{
-+      atomic_inc(&efrm_nic_table.ref_count);
-+}
-+
-+static inline void efrm_nic_table_rele(void)
-+{
-+      atomic_dec(&efrm_nic_table.ref_count);
-+}
-+
-+static inline int efrm_nic_table_held(void)
-+{
-+      return (atomic_read(&efrm_nic_table.ref_count) != 0);
-+}
-+
-+/* Run code block _x multiple times with variable nic set to each
-+ * registered NIC in turn.
-+ * DO NOT "break" out of this loop early. */
-+#define EFRM_FOR_EACH_NIC(_nic_i, _nic)                                       \
-+      for ((_nic_i) = (efrm_nic_table_hold(), 0);                     \
-+           (_nic_i) < EFHW_MAX_NR_DEVS || (efrm_nic_table_rele(), 0); \
-+           (_nic_i)++)                                                \
-+              if (((_nic) = efrm_nic_table.nic[_nic_i]))
-+
-+#define EFRM_FOR_EACH_NIC_IN_SET(_set, _i, _nic)                      \
-+      for ((_i) = (efrm_nic_table_hold(), 0);                         \
-+           (_i) < EFHW_MAX_NR_DEVS || (efrm_nic_table_rele(), 0);     \
-+           ++(_i))                                                    \
-+              if (((_nic) = efrm_nic_table.nic[_i]) &&                \
-+                  efrm_nic_set_read((_set), (_i)))
-+
-+#endif /* __CI_EFRM_NIC_TABLE_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/sysdep.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,54 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides Linux-like system-independent API for efrm library.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFRM_SYSDEP_H__
-+#define __CI_EFRM_SYSDEP_H__
-+
-+/* Spinlocks are defined in efhw/sysdep.h */
-+#include <ci/efhw/sysdep.h>
-+
-+#if defined(__linux__) && defined(__KERNEL__)
-+
-+# include <ci/efrm/sysdep_linux.h>
-+
-+#else
-+
-+# include <ci/efrm/sysdep_ci2linux.h>
-+
-+#endif
-+
-+#endif /* __CI_EFRM_SYSDEP_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/efrm/sysdep_linux.h     2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,248 @@
-+/****************************************************************************
-+ * Driver for Solarflare network controllers -
-+ *          resource management for Xen backend, OpenOnload, etc
-+ *           (including support for SFE4001 10GBT NIC)
-+ *
-+ * This file provides version-independent Linux kernel API for efrm library.
-+ * Only kernels >=2.6.9 are supported.
-+ *
-+ * Copyright 2005-2007: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Kfifo API is partially stolen from linux-2.6.22/include/linux/list.h
-+ * Copyright (C) 2004 Stelian Pop <stelian@popies.net>
-+ *
-+ * Developed and maintained by Solarflare Communications:
-+ *                      <linux-xen-drivers@solarflare.com>
-+ *                      <onload-dev@solarflare.com>
-+ *
-+ * Certain parts of the driver were implemented by
-+ *          Alexandra Kossovsky <Alexandra.Kossovsky@oktetlabs.ru>
-+ *          OKTET Labs Ltd, Russia,
-+ *          http://oktetlabs.ru, <info@oktetlabs.ru>
-+ *          by request of Solarflare Communications
-+ *
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef __CI_EFRM_SYSDEP_LINUX_H__
-+#define __CI_EFRM_SYSDEP_LINUX_H__
-+
-+#include <linux/version.h>
-+#include <linux/list.h>
-+#include <linux/vmalloc.h>
-+#include <linux/errno.h>
-+#include <linux/string.h>
-+#include <linux/workqueue.h>
-+#include <linux/gfp.h>
-+#include <linux/slab.h>
-+#include <linux/hardirq.h>
-+#include <linux/kernel.h>
-+#include <linux/if_ether.h>
-+#include <linux/completion.h>
-+#include <linux/in.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+/* get roundup_pow_of_two(), which was in kernel.h in early kernel versions */
-+#include <linux/log2.h>
-+#endif
-+
-+/********************************************************************
-+ *
-+ * List API
-+ *
-+ ********************************************************************/
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
-+static inline void
-+list_replace_init(struct list_head *old, struct list_head *new)
-+{
-+      new->next = old->next;
-+      new->next->prev = new;
-+      new->prev = old->prev;
-+      new->prev->next = new;
-+      INIT_LIST_HEAD(old);
-+}
-+#endif
-+
-+static inline struct list_head *list_pop(struct list_head *list)
-+{
-+      struct list_head *link = list->next;
-+      list_del(link);
-+      return link;
-+}
-+
-+static inline struct list_head *list_pop_tail(struct list_head *list)
-+{
-+      struct list_head *link = list->prev;
-+      list_del(link);
-+      return link;
-+}
-+
-+/********************************************************************
-+ *
-+ * Workqueue API
-+ *
-+ ********************************************************************/
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
-+#define NEED_OLD_WORK_API
-+
-+/**
-+ * The old and new work function prototypes just change
-+ * the type of the pointer in the only argument, so it's
-+ * safe to cast one function type to the other
-+ */
-+typedef void (*efrm_old_work_func_t) (void *p);
-+
-+#undef INIT_WORK
-+#define INIT_WORK(_work, _func)                                       \
-+      do {                                                    \
-+              INIT_LIST_HEAD(&(_work)->entry);                \
-+              (_work)->pending = 0;                           \
-+              PREPARE_WORK((_work),                           \
-+                           (efrm_old_work_func_t) (_func),    \
-+                           (_work));                          \
-+      } while (0)
-+
-+#endif
-+
-+/********************************************************************
-+ *
-+ * Kfifo API
-+ *
-+ ********************************************************************/
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10)
-+
-+#if !defined(RHEL_RELEASE_CODE) || (RHEL_RELEASE_CODE < 1029)
-+typedef unsigned gfp_t;
-+#endif
-+
-+#define HAS_NO_KFIFO
-+
-+struct kfifo {
-+      unsigned char *buffer;  /* the buffer holding the data */
-+      unsigned int size;      /* the size of the allocated buffer */
-+      unsigned int in;        /* data is added at offset (in % size) */
-+      unsigned int out;       /* data is extracted from off. (out % size) */
-+      spinlock_t *lock;       /* protects concurrent modifications */
-+};
-+
-+extern struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,
-+                              gfp_t gfp_mask, spinlock_t *lock);
-+extern struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,
-+                               spinlock_t *lock);
-+extern void kfifo_free(struct kfifo *fifo);
-+extern unsigned int __kfifo_put(struct kfifo *fifo,
-+                              unsigned char *buffer, unsigned int len);
-+extern unsigned int __kfifo_get(struct kfifo *fifo,
-+                              unsigned char *buffer, unsigned int len);
-+
-+/**
-+ * kfifo_put - puts some data into the FIFO
-+ * @fifo: the fifo to be used.
-+ * @buffer: the data to be added.
-+ * @len: the length of the data to be added.
-+ *
-+ * This function copies at most @len bytes from the @buffer into
-+ * the FIFO depending on the free space, and returns the number of
-+ * bytes copied.
-+ */
-+static inline unsigned int
-+kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
-+{
-+      unsigned long flags;
-+      unsigned int ret;
-+
-+      spin_lock_irqsave(fifo->lock, flags);
-+
-+      ret = __kfifo_put(fifo, buffer, len);
-+
-+      spin_unlock_irqrestore(fifo->lock, flags);
-+
-+      return ret;
-+}
-+
-+/**
-+ * kfifo_get - gets some data from the FIFO
-+ * @fifo: the fifo to be used.
-+ * @buffer: where the data must be copied.
-+ * @len: the size of the destination buffer.
-+ *
-+ * This function copies at most @len bytes from the FIFO into the
-+ * @buffer and returns the number of copied bytes.
-+ */
-+static inline unsigned int
-+kfifo_get(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
-+{
-+      unsigned long flags;
-+      unsigned int ret;
-+
-+      spin_lock_irqsave(fifo->lock, flags);
-+
-+      ret = __kfifo_get(fifo, buffer, len);
-+
-+      /*
-+       * optimization: if the FIFO is empty, set the indices to 0
-+       * so we don't wrap the next time
-+       */
-+      if (fifo->in == fifo->out)
-+              fifo->in = fifo->out = 0;
-+
-+      spin_unlock_irqrestore(fifo->lock, flags);
-+
-+      return ret;
-+}
-+
-+/**
-+ * __kfifo_len - returns the number of bytes available in the FIFO, no locking version
-+ * @fifo: the fifo to be used.
-+ */
-+static inline unsigned int __kfifo_len(struct kfifo *fifo)
-+{
-+      return fifo->in - fifo->out;
-+}
-+
-+/**
-+ * kfifo_len - returns the number of bytes available in the FIFO
-+ * @fifo: the fifo to be used.
-+ */
-+static inline unsigned int kfifo_len(struct kfifo *fifo)
-+{
-+      unsigned long flags;
-+      unsigned int ret;
-+
-+      spin_lock_irqsave(fifo->lock, flags);
-+
-+      ret = __kfifo_len(fifo);
-+
-+      spin_unlock_irqrestore(fifo->lock, flags);
-+
-+      return ret;
-+}
-+
-+#else
-+#include <linux/kfifo.h>
-+#endif
-+
-+static inline void kfifo_vfree(struct kfifo *fifo)
-+{
-+      vfree(fifo->buffer);
-+      kfree(fifo);
-+}
-+
-+#endif /* __CI_EFRM_SYSDEP_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/config.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/config.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,49 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_tools */
-+
-+#ifndef __CI_TOOLS_CONFIG_H__
-+#define __CI_TOOLS_CONFIG_H__
-+
-+
-+/**********************************************************************
-+ * Debugging.
-+ */
-+
-+#define CI_INCLUDE_ASSERT_VALID           0
-+
-+/* Set non-zero to allow info about who has allocated what to appear in
-+ * /proc/drivers/level5/mem.
-+ * However - Note that doing so can lead to segfault when you unload the
-+ * driver, and other weirdness.  i.e. I don't think the code for is quite
-+ * right (written by Oktet, hacked by gel), but it does work well enough to be
-+ * useful.
-+ */
-+#define CI_MEMLEAK_DEBUG_ALLOC_TABLE    0
-+
-+
-+#endif  /* __CI_TOOLS_CONFIG_H__ */
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/debug.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/debug.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,336 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_tools */
-+
-+#ifndef __CI_TOOLS_DEBUG_H__
-+#define __CI_TOOLS_DEBUG_H__
-+
-+#define CI_LOG_E(x)       x              /* errors      */
-+#define CI_LOG_W(x)       x              /* warnings    */
-+#define CI_LOG_I(x)       x              /* information */
-+#define CI_LOG_V(x)       x              /* verbose     */
-+
-+/* Build time asserts. We paste the line number into the type name
-+ * so that the macro can be used more than once per file even if the
-+ * compiler objects to multiple identical typedefs. Collisions
-+ * between use in different header files is still possible. */
-+#ifndef CI_BUILD_ASSERT
-+#define __CI_BUILD_ASSERT_NAME(_x) __CI_BUILD_ASSERT_ILOATHECPP(_x)
-+#define __CI_BUILD_ASSERT_ILOATHECPP(_x)  __CI_BUILD_ASSERT__ ##_x
-+#define CI_BUILD_ASSERT(e)\
-+ typedef char  __CI_BUILD_ASSERT_NAME(__LINE__)[(e)?1:-1]
-+#endif
-+
-+
-+#ifdef NDEBUG
-+
-+# define _ci_check(exp, file, line)
-+# define _ci_assert2(e, x, y, file, line)
-+# define _ci_assert(exp, file, line)
-+# define _ci_assert_equal(exp1, exp2, file, line)
-+# define _ci_assert_equiv(exp1, exp2, file, line)
-+# define _ci_assert_nequal(exp1, exp2, file, line)
-+# define _ci_assert_le(exp1, exp2, file, line)
-+# define _ci_assert_lt(exp1, exp2, file, line)
-+# define _ci_assert_ge(exp1, exp2, file, line)
-+# define _ci_assert_gt(exp1, exp2, file, line)
-+# define _ci_assert_impl(exp1, exp2, file, line)
-+
-+# define _ci_verify(exp, file, line) \
-+  do { \
-+    (void)(exp); \
-+  } while (0)
-+
-+# define CI_DEBUG_TRY(exp) \
-+  do { \
-+    (void)(exp); \
-+  } while (0)
-+
-+#define CI_TRACE(exp,fmt)
-+#define CI_TRACE_INT(integer)
-+#define CI_TRACE_INT32(integer)
-+#define CI_TRACE_INT64(integer)
-+#define CI_TRACE_UINT(integer)
-+#define CI_TRACE_UINT32(integer)
-+#define CI_TRACE_UINT64(integer)
-+#define CI_TRACE_HEX(integer)
-+#define CI_TRACE_HEX32(integer)
-+#define CI_TRACE_HEX64(integer)
-+#define CI_TRACE_PTR(pointer)
-+#define CI_TRACE_STRING(string)
-+#define CI_TRACE_MAC(mac)
-+#define CI_TRACE_IP(ip_be32)
-+#define CI_TRACE_ARP(arp_pkt)
-+
-+#else
-+
-+# define _CI_ASSERT_FMT   "\nfrom %s:%d"
-+
-+# define _ci_check(exp, file, line)                             \
-+  do {                                                          \
-+    if (CI_UNLIKELY(!(exp)))                                    \
-+      ci_warn(("ci_check(%s)"_CI_ASSERT_FMT, #exp,              \
-+               (file), (line)));                                \
-+  } while (0)
-+
-+/*
-+ * NOTE: ci_fail() emits the file and line where the assert is actually
-+ *       coded.
-+ */
-+
-+# define _ci_assert(exp, file, line)                            \
-+  do {                                                          \
-+    if (CI_UNLIKELY(!(exp)))                                    \
-+      ci_fail(("ci_assert(%s)"_CI_ASSERT_FMT, #exp,           \
-+               (file), (line)));                                \
-+  } while (0)
-+
-+# define _ci_assert2(e, x, y, file, line)  do {                 \
-+    if(CI_UNLIKELY( ! (e) ))                                    \
-+      ci_fail(("ci_assert(%s)\nwhere [%s=%"CI_PRIx64"] "        \
-+               "[%s=%"CI_PRIx64"]\nat %s:%d\nfrom %s:%d", #e    \
-+               , #x, (ci_uint64)(ci_uintptr_t)(x)               \
-+               , #y, (ci_uint64)(ci_uintptr_t)(y),              \
-+               __FILE__, __LINE__, (file), (line)));            \
-+  } while (0)
-+
-+# define _ci_verify(exp, file, line)                            \
-+  do {                                                          \
-+    if (CI_UNLIKELY(!(exp)))                                    \
-+      ci_fail(("ci_verify(%s)"_CI_ASSERT_FMT, #exp,             \
-+               (file), (line)));                                \
-+  } while (0)
-+
-+# define _ci_assert_equal(x, y, f, l)  _ci_assert2((x)==(y), x, y, (f), (l))
-+# define _ci_assert_nequal(x, y, f, l) _ci_assert2((x)!=(y), x, y, (f), (l))
-+# define _ci_assert_le(x, y, f, l)     _ci_assert2((x)<=(y), x, y, (f), (l))
-+# define _ci_assert_lt(x, y, f, l)     _ci_assert2((x)< (y), x, y, (f), (l))
-+# define _ci_assert_ge(x, y, f, l)     _ci_assert2((x)>=(y), x, y, (f), (l))
-+# define _ci_assert_gt(x, y, f, l)     _ci_assert2((x)> (y), x, y, (f), (l))
-+# define _ci_assert_or(x, y, f, l)     _ci_assert2((x)||(y), x, y, (f), (l))
-+# define _ci_assert_impl(x, y, f, l)   _ci_assert2(!(x) || (y), x, y, (f), (l))
-+# define _ci_assert_equiv(x, y, f, l)  _ci_assert2(!(x)== !(y), x, y, (f), (l))
-+
-+#define _ci_assert_equal_msg(exp1, exp2, msg, file, line)       \
-+  do {                                                          \
-+    if (CI_UNLIKELY((exp1)!=(exp2)))                            \
-+      ci_fail(("ci_assert_equal_msg(%s == %s) were "            \
-+               "(%"CI_PRIx64":%"CI_PRIx64") with msg[%c%c%c%c]" \
-+               _CI_ASSERT_FMT, #exp1, #exp2,                    \
-+               (ci_uint64)(ci_uintptr_t)(exp1),                 \
-+               (ci_uint64)(ci_uintptr_t)(exp2),                 \
-+               (((ci_uint32)msg) >> 24) && 0xff,                \
-+               (((ci_uint32)msg) >> 16) && 0xff,                \
-+               (((ci_uint32)msg) >> 8 ) && 0xff,                \
-+               (((ci_uint32)msg)      ) && 0xff,                \
-+               (file), (line)));                                \
-+  } while (0)
-+
-+# define CI_DEBUG_TRY(exp)  CI_TRY(exp)
-+
-+#define CI_TRACE(exp,fmt)                                             \
-+  ci_log("%s:%d:%s] " #exp "=" fmt,                                     \
-+         __FILE__, __LINE__, __FUNCTION__, (exp))
-+
-+
-+#define CI_TRACE_INT(integer)                                         \
-+  ci_log("%s:%d:%s] " #integer "=%d",                                   \
-+         __FILE__, __LINE__, __FUNCTION__, (integer))
-+
-+
-+#define CI_TRACE_INT32(integer)                                               \
-+  ci_log("%s:%d:%s] " #integer "=%d",                                   \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_int32)integer))
-+
-+
-+#define CI_TRACE_INT64(integer)                                               \
-+  ci_log("%s:%d:%s] " #integer "=%lld",                                 \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_int64)integer))
-+
-+
-+#define CI_TRACE_UINT(integer)                                                \
-+  ci_log("%s:%d:%s] " #integer "=%ud",                                  \
-+         __FILE__, __LINE__, __FUNCTION__, (integer))
-+
-+
-+#define CI_TRACE_UINT32(integer)                                      \
-+  ci_log("%s:%d:%s] " #integer "=%ud",                                  \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_uint32)integer))
-+
-+
-+#define CI_TRACE_UINT64(integer)                                      \
-+  ci_log("%s:%d:%s] " #integer "=%ulld",                                \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_uint64)integer))
-+
-+
-+#define CI_TRACE_HEX(integer)                                         \
-+  ci_log("%s:%d:%s] " #integer "=0x%x",                                 \
-+         __FILE__, __LINE__, __FUNCTION__, (integer))
-+
-+
-+#define CI_TRACE_HEX32(integer)                                               \
-+  ci_log("%s:%d:%s] " #integer "=0x%x",                                 \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_uint32)integer))
-+
-+
-+#define CI_TRACE_HEX64(integer)                                               \
-+  ci_log("%s:%d:%s] " #integer "=0x%llx",                               \
-+         __FILE__, __LINE__, __FUNCTION__, ((ci_uint64)integer))
-+
-+
-+#define CI_TRACE_PTR(pointer)                                         \
-+  ci_log("%s:%d:%s] " #pointer "=0x%p",                                 \
-+         __FILE__, __LINE__, __FUNCTION__, (pointer))
-+
-+
-+#define CI_TRACE_STRING(string)                                               \
-+  ci_log("%s:%d:%s] " #string "=%s",                                    \
-+         __FILE__, __LINE__, __FUNCTION__, (string))
-+
-+
-+#define CI_TRACE_MAC(mac)                                             \
-+  ci_log("%s:%d:%s] " #mac "=" CI_MAC_PRINTF_FORMAT,                    \
-+         __FILE__, __LINE__, __FUNCTION__, CI_MAC_PRINTF_ARGS(mac))
-+
-+
-+#define CI_TRACE_IP(ip_be32)                                          \
-+  ci_log("%s:%d:%s] " #ip_be32 "=" CI_IP_PRINTF_FORMAT, __FILE__,       \
-+         __LINE__, __FUNCTION__, CI_IP_PRINTF_ARGS(&(ip_be32)))
-+
-+
-+#define CI_TRACE_ARP(arp_pkt)                                           \
-+  ci_log("%s:%d:%s]\n"CI_ARP_PRINTF_FORMAT,                             \
-+         __FILE__, __LINE__, __FUNCTION__, CI_ARP_PRINTF_ARGS(arp_pkt))
-+
-+#endif  /* NDEBUG */
-+
-+#define ci_check(exp) \
-+        _ci_check(exp, __FILE__, __LINE__)
-+
-+#define ci_assert(exp) \
-+        _ci_assert(exp, __FILE__, __LINE__)
-+
-+#define ci_verify(exp) \
-+        _ci_verify(exp, __FILE__, __LINE__)
-+
-+#define ci_assert_equal(exp1, exp2) \
-+        _ci_assert_equal(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_equal_msg(exp1, exp2, msg) \
-+        _ci_assert_equal_msg(exp1, exp2, msg, __FILE__, __LINE__)
-+
-+#define ci_assert_nequal(exp1, exp2) \
-+        _ci_assert_nequal(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_le(exp1, exp2) \
-+        _ci_assert_le(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_lt(exp1, exp2) \
-+        _ci_assert_lt(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_ge(exp1, exp2) \
-+        _ci_assert_ge(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_gt(exp1, exp2) \
-+        _ci_assert_gt(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_impl(exp1, exp2) \
-+        _ci_assert_impl(exp1, exp2, __FILE__, __LINE__)
-+
-+#define ci_assert_equiv(exp1, exp2) \
-+        _ci_assert_equiv(exp1, exp2, __FILE__, __LINE__)
-+
-+
-+#define CI_TEST(exp)                            \
-+  do{                                           \
-+    if( CI_UNLIKELY(!(exp)) )                   \
-+      ci_fail(("CI_TEST(%s)", #exp));           \
-+  }while(0)
-+
-+
-+#define CI_TRY(exp)                           \
-+  do{                                         \
-+    int _trc;                                 \
-+    _trc=(exp);                                       \
-+    if( CI_UNLIKELY(_trc < 0) )                       \
-+      ci_sys_fail(#exp, _trc);                        \
-+  }while(0)
-+
-+
-+#define CI_TRY_RET(exp)                                                        \
-+  do{                                                                  \
-+    int _trc;                                                          \
-+    _trc=(exp);                                                                \
-+    if( CI_UNLIKELY(_trc < 0) ) {                                      \
-+      ci_log("%s returned %d at %s:%d", #exp, _trc, __FILE__, __LINE__); \
-+      return _trc;                                                     \
-+    }                                                                  \
-+  }while(0)
-+
-+#define CI_LOGLEVEL_TRY_RET(logfn, exp)                                    \
-+  do{                                                                  \
-+    int _trc;                                                          \
-+    _trc=(exp);                                                                \
-+    if( CI_UNLIKELY(_trc < 0) ) {                                      \
-+      logfn (ci_log("%s returned %d at %s:%d", #exp, _trc, __FILE__, __LINE__)); \
-+      return _trc;                                                     \
-+    }                                                                  \
-+  }while(0)
-+
-+
-+#define CI_SOCK_TRY(exp)                      \
-+  do{                                         \
-+    ci_sock_err_t _trc;                               \
-+    _trc=(exp);                                       \
-+    if( CI_UNLIKELY(!ci_sock_errok(_trc)) )   \
-+      ci_sys_fail(#exp, _trc.val);            \
-+  }while(0)
-+
-+
-+#define CI_SOCK_TRY_RET(exp)                                               \
-+  do{                                                                      \
-+    ci_sock_err_t _trc;                                                            \
-+    _trc=(exp);                                                                    \
-+    if( CI_UNLIKELY(!ci_sock_errok(_trc)) ) {                              \
-+      ci_log("%s returned %d at %s:%d", #exp, _trc.val, __FILE__, __LINE__); \
-+      return ci_sock_errcode(_trc);                                        \
-+    }                                                                      \
-+  }while(0)
-+
-+
-+#define CI_SOCK_TRY_SOCK_RET(exp)                                          \
-+  do{                                                                      \
-+    ci_sock_err_t _trc;                                                            \
-+    _trc=(exp);                                                                    \
-+    if( CI_UNLIKELY(!ci_sock_errok(_trc)) ) {                              \
-+      ci_log("%s returned %d at %s:%d", #exp, _trc.val, __FILE__, __LINE__); \
-+      return _trc;                                                         \
-+    }                                                                      \
-+  }while(0)
-+
-+#endif  /* __CI_TOOLS_DEBUG_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/log.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/log.h     2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,262 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Functions for logging and pretty-printing.
-+ *   \date  2002/08/07
-+ */
-+
-+/*! \cidoxg_include_ci_tools */
-+
-+#ifndef __CI_TOOLS_LOG_H__
-+#define __CI_TOOLS_LOG_H__
-+
-+#include <stdarg.h>
-+
-+
-+/**********************************************************************
-+ * Logging.
-+ */
-+
-+/* size of internal log buffer */ 
-+#define  CI_LOG_MAX_LINE        512
-+/* uses of ci_log must ensure that all trace messages are shorter than this */ 
-+#define  CI_LOG_MAX_MSG_LENGTH        (CI_LOG_MAX_LINE-50)
-+
-+extern void ci_vlog(const char* fmt, va_list args)  CI_HF;
-+extern void ci_log(const char* fmt, ...) CI_PRINTF_LIKE(1,2) CI_HF;
-+
-+  /*! Set the prefix for log messages.
-+  **
-+  ** Uses the storage pointed to by \em prefix.  Therefore \em prefix must
-+  ** be allocated on the heap, or statically.
-+  */
-+extern void ci_set_log_prefix(const char* prefix)  CI_HF;
-+
-+typedef void (*ci_log_fn_t)(const char* msg);
-+extern ci_log_fn_t  ci_log_fn  CI_HV;
-+
-+/* Log functions. */
-+extern void ci_log_null(const char* msg) CI_HF;
-+extern void ci_log_stderr(const char* msg) CI_HF;
-+extern void ci_log_stdout(const char* msg) CI_HF;
-+extern void ci_log_syslog(const char* msg) CI_HF;
-+
-+/*! Call the following to install special logging behaviours. */
-+extern void ci_log_buffer_till_fail(void) CI_HF;
-+extern void ci_log_buffer_till_exit(void) CI_HF;
-+
-+extern void __ci_log_unique(const char* msg) CI_HF;
-+extern ci_log_fn_t __ci_log_unique_fn CI_HV;
-+ci_inline void ci_log_uniquify(void) {
-+  if( ci_log_fn != __ci_log_unique ) {
-+    __ci_log_unique_fn = ci_log_fn;
-+    ci_log_fn = __ci_log_unique;
-+  }
-+}
-+
-+extern void ci_log_file(const char* msg) CI_HF;
-+extern int  ci_log_file_fd CI_HV;
-+
-+extern void __ci_log_nth(const char* msg) CI_HF;
-+extern ci_log_fn_t __ci_log_nth_fn CI_HV;
-+extern int  ci_log_nth_n CI_HV;  /* default 100 */
-+ci_inline void ci_log_nth(void) {
-+  if( ci_log_fn != __ci_log_nth ) {
-+    __ci_log_nth_fn = ci_log_fn;
-+    ci_log_fn = __ci_log_nth;
-+  }
-+}
-+
-+extern int  ci_log_level  CI_HV;
-+
-+extern int  ci_log_options  CI_HV;
-+#define CI_LOG_PID            0x1
-+#define CI_LOG_TID            0x2
-+#define CI_LOG_TIME           0x4
-+#define CI_LOG_DELTA          0x8
-+
-+/**********************************************************************
-+ * Used to define which mode we are in
-+ */
-+#if (defined(_WIN32) && !defined(__KERNEL__))
-+typedef enum {
-+  ci_log_md_NULL=0,
-+    ci_log_md_ioctl,
-+    ci_log_md_stderr,
-+    ci_log_md_stdout,
-+    ci_log_md_file,
-+    ci_log_md_serial,
-+    ci_log_md_syslog,
-+    ci_log_md_pidfile
-+} ci_log_mode_t;
-+extern ci_log_mode_t ci_log_mode;
-+#endif
-+
-+/**********************************************************************
-+ * Pretty-printing.
-+ */
-+
-+extern char ci_printable_char(char c) CI_HF;
-+
-+extern void (*ci_hex_dump_formatter)(char* buf, const ci_octet* s,
-+                                   int i, int off, int len) CI_HV;
-+extern void ci_hex_dump_format_octets(char*,const ci_octet*,int,int,int) CI_HF;
-+extern void ci_hex_dump_format_dwords(char*,const ci_octet*,int,int,int) CI_HF;
-+
-+extern void ci_hex_dump_row(char* buf, volatile const void* s, int len,
-+                          ci_ptr_arith_t address) CI_HF;
-+  /*!< A row contains up to 16 bytes.  Row starts at [address & 15u], so
-+  ** therefore [len + (address & 15u)] must be <= 16.
-+  */
-+
-+extern void ci_hex_dump(ci_log_fn_t, volatile const void*,
-+                      int len, ci_ptr_arith_t address) CI_HF;
-+
-+extern int  ci_hex_dump_to_raw(const char* src_hex, void* buf,
-+                             unsigned* addr_out_opt, int* skip)  CI_HF;
-+  /*!< Recovers raw data from a single line of a hex dump.  [buf] must be at
-+  ** least 16 bytes long.  Returns the number of bytes written to [buf] (in
-+  ** range 1 -> 16), or -1 if [src_hex] doesn't contain hex data.  Does not
-+  ** cope with missing bytes at the start of a line.
-+  */
-+
-+extern int ci_format_eth_addr(char* buf, const void* eth_mac_addr,
-+                            char sep)  CI_HF;
-+  /*!< This will write 18 characters to <buf> including terminating null.
-+  ** Returns number of bytes written excluding null.  If [sep] is zero, ':'
-+  ** is used.
-+  */
-+
-+extern int ci_parse_eth_addr(void* eth_mac_addr,
-+                           const char* str, char sep) CI_HF;
-+  /*!< If [sep] is zero, absolutely any separator is accepted (even
-+  ** inconsistent separators).  Returns 0 on success, -1 on error.
-+  */
-+
-+extern int ci_format_ip4_addr(char* buf, unsigned addr_be32) CI_HF;
-+  /*!< Formats the IP address (in network endian) in dotted-quad.  Returns
-+  ** the number of bytes written (up to 15), excluding the null.  [buf]
-+  ** must be at least 16 bytes long.
-+  */
-+
-+
-+/**********************************************************************
-+ * Error checking.
-+ */
-+
-+extern void (*ci_fail_stop_fn)(void) CI_HV;
-+
-+extern void ci_fail_stop(void) CI_HF;
-+extern void ci_fail_hang(void) CI_HF;
-+extern void ci_fail_bomb(void) CI_HF;
-+extern void ci_backtrace(void) CI_HF;
-+
-+#if defined __linux__ && !defined __KERNEL__
-+extern void ci_fail_abort (void) CI_HF;
-+#endif
-+
-+#ifdef __GNUC__
-+extern void
-+__ci_fail(const char*, ...) CI_PRINTF_LIKE(1,2) CI_HF;
-+#else
-+# if _PREFAST_
-+  extern void _declspec(noreturn) __ci_fail(const char* fmt, ...);
-+# else 
-+  extern void __ci_fail(const char* fmt, ...);
-+# endif
-+
-+#endif
-+
-+#define ci_warn(x)                                                       \
-+  do{ ci_log("WARN at %s:%d", __FILE__, __LINE__); }while(0)
-+
-+#define ci_fail(x)                                                       \
-+  do{ ci_log("FAIL at %s:%d", __FILE__, __LINE__);  __ci_fail x; }while(0)
-+
-+extern void __ci_sys_fail(const char* fn, int rc,
-+                        const char* file, int line) CI_HF;
-+#define ci_sys_fail(fn, rc)  __ci_sys_fail(fn, rc, __FILE__, __LINE__)
-+
-+/**********************************************************************
-+ * Logging to buffer (src/citools/log_buffer.c)
-+ */
-+
-+/*! Divert ci_log() messages to the log buffer
-+ *  normally they go to the  system console */
-+extern void ci_log_buffer_till_fail(void) CI_HF;
-+
-+/*! Dump the contents of the log buffer to the system console */
-+extern void ci_log_buffer_dump(void) CI_HF;
-+
-+
-+/**********************************************************************
-+ * Some useful pretty-printing.
-+ */
-+
-+#ifdef  __linux__
-+# define CI_SOCKCALL_FLAGS_FMT        "%s%s%s%s%s%s%s%s%s%s%s"
-+
-+# define CI_SOCKCALL_FLAGS_PRI_ARG(x)         \
-+  (((x) & MSG_OOB         ) ? "OOB "         :""),    \
-+  (((x) & MSG_PEEK        ) ? "PEEK "        :""),    \
-+  (((x) & MSG_DONTROUTE   ) ? "DONTROUTE "   :""),    \
-+  (((x) & MSG_EOR         ) ? "EOR "         :""),    \
-+  (((x) & MSG_CTRUNC      ) ? "CTRUNC "      :""),    \
-+  (((x) & MSG_TRUNC       ) ? "TRUNC "       :""),    \
-+  (((x) & MSG_WAITALL     ) ? "WAITALL "     :""),    \
-+  (((x) & MSG_DONTWAIT    ) ? "DONTWAIT "    :""),    \
-+  (((x) & MSG_NOSIGNAL    ) ? "NOSIGNAL "    :""),    \
-+  (((x) & MSG_ERRQUEUE    ) ? "ERRQUEUE "    :""),    \
-+  (((x) & MSG_CONFIRM     ) ? "CONFIRM "     :"")
-+#endif
-+
-+#ifdef  _WIN32
-+# define CI_SOCKCALL_FLAGS_FMT        "%s%s%s"
-+
-+# define CI_SOCKCALL_FLAGS_PRI_ARG(x)         \
-+  (((x) & MSG_OOB         ) ? "OOB "         :""),    \
-+  (((x) & MSG_PEEK        ) ? "PEEK "        :""),    \
-+  (((x) & MSG_DONTROUTE   ) ? "DONTROUTE "   :"")
-+#endif
-+
-+#ifdef  __sun__
-+# define CI_SOCKCALL_FLAGS_FMT        "%s%s%s%s%s%s%s%s%s"
-+
-+# define CI_SOCKCALL_FLAGS_PRI_ARG(x)         \
-+  (((x) & MSG_OOB         ) ? "OOB "         :""),    \
-+  (((x) & MSG_PEEK        ) ? "PEEK "        :""),    \
-+  (((x) & MSG_DONTROUTE   ) ? "DONTROUTE "   :""),    \
-+  (((x) & MSG_EOR         ) ? "EOR "         :""),    \
-+  (((x) & MSG_CTRUNC      ) ? "CTRUNC "      :""),    \
-+  (((x) & MSG_TRUNC       ) ? "TRUNC "       :""),    \
-+  (((x) & MSG_WAITALL     ) ? "WAITALL "     :""),    \
-+  (((x) & MSG_DONTWAIT    ) ? "DONTWAIT "    :""),    \
-+  (((x) & MSG_NOTIFICATION) ? "NOTIFICATION" :"")
-+#endif
-+
-+#endif  /* __CI_TOOLS_LOG_H__ */
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/platform/gcc_x86.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/platform/gcc_x86.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,361 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_tools_platform  */
-+
-+#ifndef __CI_TOOLS_GCC_X86_H__
-+#define __CI_TOOLS_GCC_X86_H__
-+
-+
-+/**********************************************************************
-+ * Free-running cycle counters.
-+ */
-+
-+#define CI_HAVE_FRC64
-+#define CI_HAVE_FRC32
-+
-+#define ci_frc32(pval)  __asm__ __volatile__("rdtsc" : "=a" (*pval) : : "edx")
-+
-+#if defined(__x86_64__)
-+ci_inline void ci_frc64(ci_uint64* pval) {
-+  /* temp fix until we figure how to get this out in one bite */         
-+  ci_uint64 low, high;
-+  __asm__ __volatile__("rdtsc" : "=a" (low) , "=d" (high));           
-+  *pval = (high << 32) | low;
-+}
-+
-+#else
-+#define ci_frc64(pval)  __asm__ __volatile__("rdtsc" : "=A" (*pval))
-+#endif
-+
-+#define ci_frc_flush()  /* ?? Need a pipeline barrier. */
-+
-+
-+/**********************************************************************
-+ * Atomic integer.
-+ */
-+
-+/*
-+** int  ci_atomic_read(a)         { return a->n;        }
-+** void ci_atomic_set(a, v)       { a->n = v;           }
-+** void ci_atomic_inc(a)          { ++a->n;             }
-+** void ci_atomic_dec(a)          { --a->n;             }
-+** int  ci_atomic_inc_and_test(a) { return ++a->n == 0; }
-+** int  ci_atomic_dec_and_test(a) { return --a->n == 0; }
-+** void ci_atomic_and(a, v)       { a->n &= v;          }
-+** void ci_atomic_or(a, v)        { a->n |= v;          }
-+*/
-+
-+typedef struct { volatile ci_int32 n; } ci_atomic_t;
-+
-+#define CI_ATOMIC_INITIALISER(i)  {(i)}
-+
-+static inline ci_int32  ci_atomic_read(const ci_atomic_t* a) { return a->n; }
-+static inline void ci_atomic_set(ci_atomic_t* a, int v) { a->n = v; ci_wmb();   }
-+
-+static inline void ci_atomic_inc(ci_atomic_t* a)
-+{ __asm__ __volatile__("lock; incl %0" : "+m" (a->n)); }
-+
-+ 
-+static inline void ci_atomic_dec(ci_atomic_t* a)
-+{ __asm__ __volatile__("lock; decl %0" : "+m" (a->n)); }
-+
-+static inline int ci_atomic_inc_and_test(ci_atomic_t* a) {
-+  char r;
-+  __asm__ __volatile__("lock; incl %0; sete %1"
-+                     : "+m" (a->n), "=qm" (r));
-+  return r;
-+}
-+
-+static inline int ci_atomic_dec_and_test(ci_atomic_t* a) {
-+  char r;
-+  __asm__ __volatile__("lock; decl %0; sete %1"
-+                     : "+m" (a->n), "=qm" (r));
-+  return r;
-+}
-+
-+ci_inline int
-+ci_atomic_xadd (ci_atomic_t *a, int v) {
-+   __asm__ ("lock xadd %0, %1" : "=r" (v), "+m" (a->n) : "0" (v));
-+  return v;
-+}
-+ci_inline int
-+ci_atomic_xchg (ci_atomic_t *a, int v) {
-+   __asm__ ("lock xchg %0, %1" : "=r" (v), "+m" (a->n) : "0" (v));
-+  return v;
-+}
-+
-+ci_inline void ci_atomic32_or(volatile ci_uint32* p, ci_uint32 mask)
-+{ __asm__ __volatile__("lock; orl %1, %0" : "+m" (*p) : "ir" (mask)); }
-+
-+ci_inline void ci_atomic32_and(volatile ci_uint32* p, ci_uint32 mask)
-+{ __asm__ __volatile__("lock; andl %1, %0" : "+m" (*p) : "ir" (mask)); }
-+
-+ci_inline void ci_atomic32_add(volatile ci_uint32* p, ci_uint32 v)
-+{ __asm__ __volatile__("lock; addl %1, %0" : "+m" (*p) : "ir" (v)); }
-+
-+#define ci_atomic_or(a, v)   ci_atomic32_or ((ci_uint32*) &(a)->n, (v))
-+#define ci_atomic_and(a, v)  ci_atomic32_and((ci_uint32*) &(a)->n, (v))
-+#define ci_atomic_add(a, v)  ci_atomic32_add((ci_uint32*) &(a)->n, (v))
-+
-+extern int ci_glibc_uses_nptl (void) CI_HF;
-+extern int ci_glibc_nptl_broken(void) CI_HF;
-+extern int ci_glibc_gs_get_is_multihreaded_offset (void) CI_HF;
-+extern int ci_glibc_gs_is_multihreaded_offset CI_HV;
-+
-+#if !defined(__x86_64__)
-+#ifdef __GLIBC__
-+/* Returns non-zero if the calling process might be mulithreaded, returns 0 if
-+ * it definitely isn't (i.e. if reimplementing this function for other
-+ * architectures and platforms, you can safely just return 1).
-+ */
-+static inline int ci_is_multithreaded (void) {
-+
-+  while (1) {
-+    if (ci_glibc_gs_is_multihreaded_offset >= 0) {
-+      /* NPTL keeps a variable that tells us this hanging off gs (i.e. in thread-
-+       * local storage); just return this
-+       */
-+      int r;
-+      __asm__ __volatile__ ("movl %%gs:(%1), %0"
-+                            : "=r" (r)
-+                            : "r" (ci_glibc_gs_is_multihreaded_offset));
-+      return r;
-+    }
-+
-+    if (ci_glibc_gs_is_multihreaded_offset == -2) {
-+      /* This means we've already determined that the libc version is NOT good
-+       * for our funky "is multithreaded" hack
-+       */
-+      return 1;
-+    }
-+
-+    /* If we get here, it means this is the first time the function has been
-+     * called -- detect the libc version and go around again.
-+     */
-+    ci_glibc_gs_is_multihreaded_offset = ci_glibc_gs_get_is_multihreaded_offset ();
-+
-+    /* Go around again.  We do the test here rather than at the top so that we go
-+     * quicker in the common the case
-+     */
-+  }
-+}
-+
-+#else    /* def __GLIBC__ */
-+
-+#define ci_is_multithreaded() 1 /* ?? Is the the POSIX way of finding out */
-+                                /*    whether the appication is single */
-+                                /*    threaded? */
-+
-+#endif   /* def __GLIBC__ */
-+
-+#else    /* defined __x86_64__ */
-+
-+static inline int ci_is_multithreaded (void) {
-+  /* Now easy way to tell on x86_64; so assume we're multithreaded */
-+  return 1;
-+}
-+
-+#endif    /* defined __x86_64__ */
-+
-+
-+/**********************************************************************
-+ * Compare and swap.
-+ */
-+
-+#define CI_HAVE_COMPARE_AND_SWAP
-+
-+ci_inline int ci_cas32_succeed(volatile ci_int32* p, ci_int32 oldval,
-+                               ci_int32 newval) {
-+  char ret;
-+  ci_int32 prevval;
-+  __asm__ __volatile__("lock; cmpxchgl %3, %1; sete %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+ci_inline int ci_cas32_fail(volatile ci_int32* p, ci_int32 oldval,
-+                            ci_int32 newval) {
-+  char ret;
-+  ci_int32 prevval;
-+  __asm__ __volatile__("lock; cmpxchgl %3, %1; setne %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+#ifdef __x86_64__
-+ci_inline int ci_cas64_succeed(volatile ci_int64* p, ci_int64 oldval,
-+                             ci_int64 newval) {
-+  char ret;
-+  ci_int64 prevval;
-+  __asm__ __volatile__("lock; cmpxchgq %3, %1; sete %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+ci_inline int ci_cas64_fail(volatile ci_int64* p, ci_int64 oldval,
-+                          ci_int64 newval) {
-+  char ret;
-+  ci_int64 prevval;
-+  __asm__ __volatile__("lock; cmpxchgq %3, %1; setne %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+#endif
-+
-+ci_inline int ci_cas32u_succeed(volatile ci_uint32* p, ci_uint32 oldval, ci_uint32 newval) {
-+  char ret;
-+  ci_uint32 prevval;
-+  __asm__ __volatile__("lock; cmpxchgl %3, %1; sete %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+ci_inline int ci_cas32u_fail(volatile ci_uint32* p, ci_uint32 oldval, ci_uint32 newval) {
-+  char ret;
-+  ci_uint32 prevval;
-+  __asm__ __volatile__("lock; cmpxchgl %3, %1; setne %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+ci_inline int ci_cas64u_succeed(volatile ci_uint64* p, ci_uint64 oldval,
-+                             ci_uint64 newval) {
-+  char ret;
-+  ci_uint64 prevval;
-+  __asm__ __volatile__("lock; cmpxchgq %3, %1; sete %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+ci_inline int ci_cas64u_fail(volatile ci_uint64* p, ci_uint64 oldval,
-+                          ci_uint64 newval) {
-+  char ret;
-+  ci_uint64 prevval;
-+  __asm__ __volatile__("lock; cmpxchgq %3, %1; setne %0"
-+                     : "=q"(ret), "+m"(*p), "=a"(prevval)
-+                     : "r"(newval), "a"(oldval));
-+  return ret;
-+}
-+
-+#ifdef __x86_64__
-+
-+# define ci_cas_uintptr_succeed(p,o,n)                                \
-+    ci_cas64u_succeed((volatile ci_uint64*) (p), (o), (n))
-+# define ci_cas_uintptr_fail(p,o,n)                           \
-+    ci_cas64u_fail((volatile ci_uint64*) (p), (o), (n))
-+
-+#else
-+
-+# define ci_cas_uintptr_succeed(p,o,n)                                \
-+    ci_cas32u_succeed((volatile ci_uint32*) (p), (o), (n))
-+# define ci_cas_uintptr_fail(p,o,n)                           \
-+    ci_cas32u_fail((volatile ci_uint32*) (p), (o), (n))
-+
-+#endif
-+
-+
-+/**********************************************************************
-+ * Atomic bit field.
-+ */
-+
-+typedef ci_uint32  ci_bits;
-+#define CI_BITS_N                     32u
-+
-+#define CI_BITS_DECLARE(name, n)                      \
-+  ci_bits name[((n) + CI_BITS_N - 1u) / CI_BITS_N]
-+
-+ci_inline void ci_bits_clear_all(volatile ci_bits* b, int n_bits)
-+{ memset((void*) b, 0, (n_bits+CI_BITS_N-1u) / CI_BITS_N * sizeof(ci_bits)); }
-+
-+ci_inline void ci_bit_set(volatile ci_bits* b, int i) {
-+  __asm__ __volatile__("lock; btsl %1, %0"
-+                     : "=m" (*b)
-+                     : "Ir" (i));
-+}
-+
-+ci_inline void ci_bit_clear(volatile ci_bits* b, int i) {
-+  __asm__ __volatile__("lock; btrl %1, %0"
-+                     : "=m" (*b)
-+                     : "Ir" (i));
-+}
-+
-+ci_inline int  ci_bit_test(volatile ci_bits* b, int i) {
-+  char rc;
-+  __asm__("btl %2, %1; setc %0"
-+        : "=r" (rc)
-+        : "m" (*b), "Ir" (i));
-+  return rc;
-+}
-+
-+ci_inline int ci_bit_test_and_set(volatile ci_bits* b, int i) {
-+  char rc;
-+  __asm__ __volatile__("lock; btsl %2, %1; setc %0"
-+                     : "=r" (rc), "+m" (*b)
-+                     : "Ir" (i));
-+  return rc;
-+}
-+
-+ci_inline int ci_bit_test_and_clear(volatile ci_bits* b, int i) {
-+  char rc;
-+  __asm__ __volatile__("lock; btrl %2, %1; setc %0"
-+                     : "=r" (rc), "+m" (*b)
-+                     : "Ir" (i));
-+  return rc;
-+}
-+
-+/* These mask ops only work within a single ci_bits word. */
-+#define ci_bit_mask_set(b,m)  ci_atomic32_or((b), (m))
-+#define ci_bit_mask_clear(b,m)        ci_atomic32_and((b), ~(m))
-+
-+
-+/**********************************************************************
-+ * Misc.
-+ */
-+
-+#if __GNUC__ >= 3
-+# define ci_spinloop_pause()  __asm__("pause") 
-+#else
-+# define ci_spinloop_pause()  __asm__(".byte 0xf3, 0x90")
-+#endif
-+
-+
-+#define CI_HAVE_ADDC32
-+#define ci_add_carry32(sum, v)  __asm__("addl %1, %0 ;"                         \
-+                                      "adcl $0, %0 ;"                   \
-+                                      : "=r" (sum)                      \
-+                                      : "g" ((ci_uint32) v), "0" (sum))
-+
-+
-+#endif  /* __CI_TOOLS_GCC_X86_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/platform/linux_kernel.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/platform/linux_kernel.h   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,362 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+
-+/*! \cidoxg_include_ci_tools_platform  */
-+
-+#ifndef __CI_TOOLS_LINUX_KERNEL_H__
-+#define __CI_TOOLS_LINUX_KERNEL_H__
-+
-+/**********************************************************************
-+ * Need to know the kernel version.
-+ */
-+
-+#ifndef LINUX_VERSION_CODE
-+# include <linux/version.h>
-+# ifndef UTS_RELEASE
-+   /* 2.6.18 onwards defines UTS_RELEASE in a separate header */
-+#  include <linux/utsrelease.h>
-+# endif
-+#endif
-+
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,0) || \
-+    LINUX_VERSION_CODE >= KERNEL_VERSION(2,7,0)
-+# error "Linux 2.6 required"
-+#endif
-+
-+
-+#include <linux/slab.h>     /* kmalloc / kfree */
-+#include <linux/vmalloc.h>  /* vmalloc / vfree */
-+#include <linux/interrupt.h>/* in_interrupt()  */
-+#include <linux/in.h>
-+#include <linux/in6.h>
-+#include <linux/spinlock.h>
-+#include <linux/highmem.h>
-+#include <linux/smp_lock.h>
-+#include <linux/ctype.h>
-+#include <linux/uio.h>
-+#include <asm/current.h>
-+#include <asm/errno.h>
-+#include <asm/kmap_types.h>
-+#include <asm/semaphore.h>
-+
-+#include <ci/tools/config.h>
-+
-+#define ci_in_irq        in_irq
-+#define ci_in_interrupt  in_interrupt
-+#define ci_in_atomic     in_atomic
-+
-+
-+/**********************************************************************
-+ * Misc stuff.
-+ */
-+
-+#ifdef BUG
-+# define  CI_BOMB     BUG
-+#endif
-+
-+ci_inline void* __ci_alloc(size_t n)
-+{ return kmalloc(n, (in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)); }
-+
-+ci_inline void* __ci_atomic_alloc(size_t n)
-+{ return kmalloc(n, GFP_ATOMIC ); }
-+
-+ci_inline void  __ci_free(void* p)     { return kfree(p);   }
-+ci_inline void* __ci_vmalloc(size_t n) { return vmalloc(n); }
-+ci_inline void  __ci_vfree(void* p)    { return vfree(p);   }
-+
-+
-+#if CI_MEMLEAK_DEBUG_ALLOC_TABLE
-+  #define ci_alloc(s)     ci_alloc_memleak_debug (s, __FILE__, __LINE__)
-+  #define ci_atomic_alloc(s)  ci_atomic_alloc_memleak_debug(s, __FILE__, __LINE__)
-+  #define ci_free         ci_free_memleak_debug
-+  #define ci_vmalloc(s)   ci_vmalloc_memleak_debug (s, __FILE__,__LINE__)
-+  #define ci_vfree        ci_vfree_memleak_debug
-+  #define ci_alloc_fn     ci_alloc_fn_memleak_debug
-+  #define ci_vmalloc_fn   ci_vmalloc_fn_memleak_debug
-+#else /* !CI_MEMLEAK_DEBUG_ALLOC_TABLE */
-+  #define ci_alloc_fn     __ci_alloc
-+  #define ci_vmalloc_fn   __ci_vmalloc
-+#endif 
-+
-+#ifndef ci_alloc
-+  #define ci_atomic_alloc __ci_atomic_alloc
-+  #define ci_alloc        __ci_alloc
-+  #define ci_free         __ci_free
-+  #define ci_vmalloc      __ci_vmalloc
-+  #define ci_vmalloc_fn   __ci_vmalloc
-+  #define ci_vfree        __ci_vfree
-+#endif
-+
-+#define ci_sprintf        sprintf
-+#define ci_vsprintf       vsprintf
-+#define ci_snprintf       snprintf
-+#define ci_vsnprintf      vsnprintf
-+#define ci_sscanf         sscanf
-+
-+
-+#define CI_LOG_FN_DEFAULT  ci_log_syslog
-+
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * irqs_disabled - needed for kmap helpers on some kernels 
-+ *
-+ *--------------------------------------------------------------------*/
-+#ifdef irqs_disabled
-+# define ci_irqs_disabled irqs_disabled
-+#else
-+# if defined(__i386__) | defined(__x86_64__)
-+#   define ci_irqs_disabled(x)                  \
-+  ({                                            \
-+    unsigned long flags;                        \
-+    local_save_flags(flags);                    \
-+    !(flags & (1<<9));                          \
-+  })
-+# else
-+#  error "Need to implement irqs_disabled() for your architecture"
-+# endif
-+#endif
-+
-+
-+/**********************************************************************
-+ * kmap helpers. 
-+ *
-+ * Use ci_k(un)map for code paths which are not in an atomic context.
-+ * For atomic code you need to use ci_k(un)map_in_atomic. This will grab
-+ * one of the per-CPU kmap slots.
-+ *
-+ * NB in_interrupt != in_irq. If you don't know the difference then
-+ * don't use kmap_in_atomic
-+ *
-+ * 2.4 allocates kmap slots by function. We are going to re-use the
-+ * skb module's slot - we also use the same interlock
-+ * 
-+ * 2.6 allocates kmap slots by type as well as by function. We are
-+ * going to use the currently (2.6.10) unsused SOFTIRQ slot 
-+ *
-+ */
-+
-+ci_inline void* ci_kmap(struct page *page) {
-+  CI_DEBUG(if( ci_in_atomic() | ci_in_interrupt() | ci_in_irq() )  BUG());
-+  return kmap(page);
-+}
-+
-+ci_inline void ci_kunmap(struct page *page) {
-+  kunmap(page);
-+}
-+
-+#define CI_KM_SLOT KM_SOFTIRQ0
-+
-+
-+typedef struct semaphore ci_semaphore_t;
-+
-+ci_inline void
-+ci_sem_init (ci_semaphore_t *sem, int val) {
-+  sema_init (sem, val);
-+}
-+
-+ci_inline void
-+ci_sem_down (ci_semaphore_t *sem) {
-+  down (sem);
-+}
-+
-+ci_inline int
-+ci_sem_trydown (ci_semaphore_t *sem) {
-+  return down_trylock (sem);
-+}
-+
-+ci_inline void
-+ci_sem_up (ci_semaphore_t *sem) {
-+  up (sem);
-+}
-+
-+ci_inline int
-+ci_sem_get_count(ci_semaphore_t *sem) {
-+  return sem->count.counter;
-+}
-+
-+ci_inline void* ci_kmap_in_atomic(struct page *page) 
-+{
-+  CI_DEBUG(if( ci_in_irq() )  BUG());
-+
-+  /* iSCSI can call without in_interrupt() but with irqs_disabled()
-+     and in a context that can't sleep, so we need to check that
-+     too */
-+  if(ci_in_interrupt() || ci_irqs_disabled())
-+    return kmap_atomic(page, CI_KM_SLOT);
-+  else
-+    return kmap(page);
-+}
-+
-+ci_inline void ci_kunmap_in_atomic(struct page *page, void* kaddr) 
-+{
-+  CI_DEBUG(if( ci_in_irq() )  BUG());
-+
-+  /* iSCSI can call without in_interrupt() but with irqs_disabled()
-+     and in a context that can't sleep, so we need to check that
-+     too */
-+  if(ci_in_interrupt() || ci_irqs_disabled())
-+    kunmap_atomic(kaddr, CI_KM_SLOT);
-+  else
-+    kunmap(page);
-+}
-+
-+/**********************************************************************
-+ * spinlock implementation: used by <ci/tools/spinlock.h>
-+ */
-+
-+#define CI_HAVE_SPINLOCKS
-+
-+typedef ci_uintptr_t                          ci_lock_holder_t;
-+#define ci_lock_thisthread            (ci_lock_holder_t)current                       
-+#define ci_lock_no_holder     (ci_lock_holder_t)NULL
-+
-+typedef spinlock_t                    ci_lock_i;
-+typedef spinlock_t                    ci_irqlock_i;
-+typedef unsigned long                 ci_irqlock_state_t;
-+
-+#define IRQLOCK_CYCLES  500000
-+
-+#define ci_lock_ctor_i(l)             spin_lock_init(l)
-+#define ci_lock_dtor_i(l)             do{}while(0)
-+#define ci_lock_lock_i(l)             spin_lock(l)
-+#define ci_lock_trylock_i(l)          spin_trylock(l)
-+#define ci_lock_unlock_i(l)           spin_unlock(l)
-+
-+#define ci_irqlock_ctor_i(l)          spin_lock_init(l)
-+#define ci_irqlock_dtor_i(l)          do{}while(0)
-+#define ci_irqlock_lock_i(l,s)                spin_lock_irqsave(l,*(s))
-+#define ci_irqlock_unlock_i(l,s)      spin_unlock_irqrestore(l, *(s))
-+
-+
-+/**********************************************************************
-+ * register access
-+ */
-+
-+#include <asm/io.h>
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,9)
-+typedef volatile void __iomem*        ioaddr_t;
-+#else
-+typedef unsigned long ioaddr_t;
-+#endif
-+
-+
-+
-+/**********************************************************************
-+ * thread implementation -- kernel dependancies probably should be
-+ * moved to driver/linux_kernel.h
-+ */
-+
-+#define ci_linux_daemonize(name) daemonize(name)
-+
-+#include <linux/workqueue.h>
-+
-+
-+typedef struct {
-+  void*                       (*fn)(void* arg);
-+  void*                       arg;
-+  const char*         name;
-+  int                 thrd_id;
-+  struct completion   exit_event;
-+  struct work_struct  keventd_witem;
-+} ci_kernel_thread_t;
-+
-+
-+typedef ci_kernel_thread_t* cithread_t;
-+
-+
-+extern int cithread_create(cithread_t* tid, void* (*fn)(void*), void* arg,
-+                         const char* name);
-+extern int cithread_detach(cithread_t kt);
-+extern int cithread_join(cithread_t kt);
-+
-+
-+/* Kernel sysctl variables. */
-+extern int sysctl_tcp_wmem[3];
-+extern int sysctl_tcp_rmem[3];
-+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-+#define LINUX_HAS_SYSCTL_MEM_MAX
-+extern ci_uint32 sysctl_wmem_max;
-+extern ci_uint32 sysctl_rmem_max;
-+#endif
-+
-+
-+/*--------------------------------------------------------------------
-+ *
-+ * ci_bigbuf_t: An abstraction of a large buffer.  Needed because in the
-+ * Linux kernel, large buffers need to be allocated with vmalloc(), whereas
-+ * smaller buffers should use kmalloc().  This abstraction chooses the
-+ * appropriate mechansim.
-+ *
-+ *--------------------------------------------------------------------*/
-+
-+typedef struct {
-+  char*               p;
-+  int         is_vmalloc;
-+} ci_bigbuf_t;
-+
-+
-+ci_inline int ci_bigbuf_alloc(ci_bigbuf_t* bb, size_t bytes) {
-+  if( bytes >= CI_PAGE_SIZE && ! ci_in_atomic() ) {
-+    bb->is_vmalloc = 1;
-+    if( (bb->p = vmalloc(bytes)) )  return 0;
-+  }
-+  bb->is_vmalloc = 0;
-+  bb->p = kmalloc(bytes, ci_in_interrupt() ? GFP_ATOMIC : GFP_KERNEL);
-+  return bb->p ? 0 : -ENOMEM;
-+}
-+
-+ci_inline void ci_bigbuf_free(ci_bigbuf_t* bb) {
-+  if( bb->is_vmalloc )  vfree(bb->p);
-+  else                  kfree(bb->p);
-+}
-+
-+ci_inline char* ci_bigbuf_ptr(ci_bigbuf_t* bb)
-+{ return bb->p; }
-+
-+/**********************************************************************
-+ * struct iovec abstraction (for Windows port)
-+ */
-+
-+typedef struct iovec ci_iovec;
-+
-+/* Accessors for buffer/length */
-+#define CI_IOVEC_BASE(i) ((i)->iov_base)
-+#define CI_IOVEC_LEN(i)  ((i)->iov_len)
-+
-+/**********************************************************************
-+ * Signals
-+ */
-+
-+ci_inline void
-+ci_send_sig(int signum)
-+{
-+  send_sig(signum, current, 0);
-+}
-+
-+#endif  /* __CI_TOOLS_LINUX_KERNEL_H__ */
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netback/ci/tools/sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netback/ci/tools/sysdep.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,132 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*! \cidoxg_include_ci_tools */
-+
-+#ifndef __CI_TOOLS_SYSDEP_H__
-+#define __CI_TOOLS_SYSDEP_H__
-+
-+/* Make this header self-sufficient */
-+#include <ci/compat.h>
-+#include <ci/tools/log.h>
-+#include <ci/tools/debug.h>
-+
-+
-+/**********************************************************************
-+ * Platform dependencies.
-+ */
-+
-+#if defined(__KERNEL__)
-+
-+# if defined(__linux__)
-+#  include <ci/tools/platform/linux_kernel.h>
-+# elif defined(_WIN32)
-+#  include <ci/tools/platform/win32_kernel.h>
-+# elif defined(__sun__)
-+#  include <ci/tools/platform/sunos_kernel.h>
-+# else
-+#  error Unknown platform.
-+# endif
-+
-+#elif defined(_WIN32)
-+
-+# include <ci/tools/platform/win32.h>
-+
-+#elif defined(__unix__)
-+
-+# include <ci/tools/platform/unix.h>
-+
-+#else
-+
-+# error Unknown platform.
-+
-+#endif
-+
-+#if defined(__linux__)
-+/*! Linux sendfile() support enable/disable. */
-+# define CI_HAVE_SENDFILE            /* provide sendfile i/f */
-+
-+# define CI_HAVE_OS_NOPAGE
-+#endif
-+
-+#if defined(__sun__)
-+# define CI_HAVE_SENDFILE          /* provide sendfile i/f */
-+# define CI_HAVE_SENDFILEV           /* provide sendfilev i/f */
-+
-+# define CI_IOCTL_SENDFILE           /*  use efrm CI_SENDFILEV ioctl */
-+#endif
-+
-+#if defined(_WIN32)
-+typedef ci_uint32 ci_uerr_t; /* range of OS user-mode return codes */
-+typedef ci_uint32 ci_kerr_t; /* range of OS kernel-mode return codes */
-+#elif defined(__unix__)
-+typedef ci_int32 ci_uerr_t; /* range of OS user-mode return codes */
-+typedef ci_int32 ci_kerr_t; /* range of OS kernel-mode return codes */
-+#endif
-+
-+
-+/**********************************************************************
-+ * Compiler and processor dependencies.
-+ */
-+
-+#if defined(__GNUC__)
-+
-+#if defined(__i386__) || defined(__x86_64__)
-+# include <ci/tools/platform/gcc_x86.h>
-+#elif defined(__PPC__)
-+#  include <ci/tools/platform/gcc_ppc.h>
-+#elif defined(__ia64__)
-+#  include <ci/tools/platform/gcc_ia64.h>
-+#else
-+# error Unknown processor.
-+#endif
-+
-+#elif defined(_MSC_VER)
-+
-+#if defined(__i386__)
-+# include <ci/tools/platform/msvc_x86.h>
-+# elif defined(__x86_64__)
-+# include <ci/tools/platform/msvc_x86_64.h>
-+#else
-+# error Unknown processor.
-+#endif
-+
-+#elif defined(__PGI)
-+
-+# include <ci/tools/platform/pg_x86.h>
-+
-+#elif defined(__INTEL_COMPILER)
-+
-+/* Intel compilers v7 claim to be very gcc compatible. */
-+# include <ci/tools/platform/gcc_x86.h>
-+
-+#else
-+# error Unknown compiler.
-+#endif
-+
-+
-+#endif  /* __CI_TOOLS_SYSDEP_H__ */
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/Makefile  2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,11 @@
-+EXTRA_CFLAGS += -Idrivers/xen/sfc_netfront -Idrivers/xen/sfc_netutil -Idrivers/xen/netfront
-+EXTRA_CFLAGS += -D__ci_driver__
-+EXTRA_CFLAGS += -Werror
-+
-+ifdef GCOV
-+EXTRA_CFLAGS += -fprofile-arcs -ftest-coverage -DEFX_GCOV
-+endif
-+
-+obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_FRONTEND)   := sfc_netfront.o
-+
-+sfc_netfront-objs := accel_msg.o accel_bufs.o accel_netfront.o accel_vi.o accel_xenbus.o accel_tso.o accel_ssr.o accel_debugfs.o falcon_event.o falcon_vi.o pt_tx.o vi_init.o
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel.h   2008-02-26 10:54:11.000000000 +0100
-@@ -0,0 +1,477 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETFRONT_ACCEL_H
-+#define NETFRONT_ACCEL_H
-+
-+#include "accel_msg_iface.h"
-+#include "accel_cuckoo_hash.h"
-+#include "accel_bufs.h"
-+
-+#include "etherfabric/ef_vi.h"
-+
-+#include <xen/xenbus.h>
-+#include <xen/evtchn.h>
-+
-+#include <linux/kernel.h>
-+#include <linux/list.h>
-+
-+enum netfront_accel_post_status {
-+      NETFRONT_ACCEL_STATUS_GOOD,
-+      NETFRONT_ACCEL_STATUS_BUSY,
-+      NETFRONT_ACCEL_STATUS_CANT
-+};
-+
-+#define NETFRONT_ACCEL_STATS 1
-+#if NETFRONT_ACCEL_STATS
-+#define NETFRONT_ACCEL_STATS_OP(x) x
-+#else
-+#define NETFRONT_ACCEL_STATS_OP(x)
-+#endif
-+
-+
-+enum netfront_accel_msg_state {
-+      NETFRONT_ACCEL_MSG_NONE = 0,
-+      NETFRONT_ACCEL_MSG_HELLO = 1,
-+      NETFRONT_ACCEL_MSG_HW = 2
-+};
-+
-+
-+typedef struct {
-+      u32 in_progress;
-+      u32 total_len;
-+      struct sk_buff *skb;
-+} netfront_accel_jumbo_state;
-+
-+
-+struct netfront_accel_ssr_state {
-+      /** List of tracked connections. */
-+      struct list_head conns;
-+
-+      /** Free efx_ssr_conn instances. */
-+      struct list_head free_conns;
-+};
-+
-+
-+struct netfront_accel_netdev_stats {
-+      /* Fastpath stats. */
-+      u32 fastpath_rx_pkts;
-+      u32 fastpath_rx_bytes;
-+      u32 fastpath_rx_errors;
-+      u32 fastpath_tx_pkts; 
-+      u32 fastpath_tx_bytes;
-+      u32 fastpath_tx_errors;
-+};
-+
-+
-+struct netfront_accel_netdev_dbfs {
-+      struct dentry *fastpath_rx_pkts;
-+      struct dentry *fastpath_rx_bytes;
-+      struct dentry *fastpath_rx_errors;
-+      struct dentry *fastpath_tx_pkts; 
-+      struct dentry *fastpath_tx_bytes;
-+      struct dentry *fastpath_tx_errors;
-+};
-+
-+
-+struct netfront_accel_stats {
-+      /** Fast path events */
-+      u64 fastpath_tx_busy;
-+
-+      /** TX DMA queue status */
-+      u64 fastpath_tx_completions;
-+
-+      /** The number of events processed. */
-+      u64 event_count;
-+
-+      /** Number of frame trunc events seen on fastpath */
-+      u64 fastpath_frm_trunc;
-+
-+      /** Number of no rx descriptor trunc events seen on fastpath */
-+      u64 rx_no_desc_trunc;
-+
-+      /** The number of misc bad events (e.g. RX_DISCARD) processed. */
-+      u64 bad_event_count;
-+
-+      /** Number of events dealt with in poll loop */
-+      u32 events_per_poll_max;
-+      u32 events_per_poll_tx_max;
-+      u32 events_per_poll_rx_max;
-+
-+      /** Largest number of concurrently outstanding tx descriptors */
-+      u32 fastpath_tx_pending_max;
-+
-+      /** The number of events since the last interrupts. */
-+      u32 event_count_since_irq;
-+
-+      /** The max number of events between interrupts. */
-+      u32 events_per_irq_max;
-+
-+      /** The number of interrupts. */
-+      u64 irq_count;
-+
-+      /** The number of useless interrupts. */
-+      u64 useless_irq_count;
-+
-+      /** The number of polls scheduled. */
-+      u64 poll_schedule_count;
-+
-+      /** The number of polls called. */
-+      u64 poll_call_count;
-+
-+      /** The number of rechecks. */
-+      u64 poll_reschedule_count;
-+
-+      /** Number of times we've called netif_stop_queue/netif_wake_queue */
-+      u64 queue_stops;
-+      u64 queue_wakes;
-+
-+      /** SSR stats */
-+      u64 ssr_bursts;
-+      u64 ssr_drop_stream;
-+      u64 ssr_misorder;
-+      u64 ssr_slow_start;
-+      u64 ssr_merges;
-+      u64 ssr_too_many;
-+      u64 ssr_new_stream;
-+};
-+
-+
-+struct netfront_accel_dbfs {
-+      struct dentry *fastpath_tx_busy;
-+      struct dentry *fastpath_tx_completions;
-+      struct dentry *fastpath_tx_pending_max;
-+      struct dentry *fastpath_frm_trunc;
-+      struct dentry *rx_no_desc_trunc;
-+      struct dentry *event_count;
-+      struct dentry *bad_event_count;
-+      struct dentry *events_per_poll_max;
-+      struct dentry *events_per_poll_rx_max;
-+      struct dentry *events_per_poll_tx_max;
-+      struct dentry *event_count_since_irq;
-+      struct dentry *events_per_irq_max;
-+      struct dentry *irq_count;
-+      struct dentry *useless_irq_count;
-+      struct dentry *poll_schedule_count;
-+      struct dentry *poll_call_count;
-+      struct dentry *poll_reschedule_count;
-+      struct dentry *queue_stops;
-+      struct dentry *queue_wakes;
-+      struct dentry *ssr_bursts;
-+      struct dentry *ssr_drop_stream;
-+      struct dentry *ssr_misorder;
-+      struct dentry *ssr_slow_start;
-+      struct dentry *ssr_merges;
-+      struct dentry *ssr_too_many;
-+      struct dentry *ssr_new_stream;
-+};
-+
-+
-+typedef struct netfront_accel_vnic {
-+      struct netfront_accel_vnic *next;
-+      
-+      struct mutex vnic_mutex;
-+
-+      spinlock_t tx_lock;
-+
-+      struct netfront_accel_bufpages bufpages;
-+      struct netfront_accel_bufinfo *rx_bufs;
-+      struct netfront_accel_bufinfo *tx_bufs;
-+      
-+      /** Hardware & VI state */
-+      ef_vi vi;
-+
-+      ef_vi_state *vi_state;
-+
-+      ef_eventq_state evq_state;
-+
-+      void *evq_mapping;
-+
-+      /** Hardware dependant state */
-+      union {
-+              struct {
-+                      /** Falcon A or B */
-+                      enum net_accel_hw_type type; 
-+                      u32 *evq_rptr;
-+                      u32 *doorbell;
-+                      void *evq_rptr_mapping;
-+                      void *doorbell_mapping;
-+                      void *txdmaq_mapping;
-+                      void *rxdmaq_mapping;
-+              } falcon;
-+      } hw;
-+  
-+      /** RX DMA queue status */
-+      u32 rx_dma_level;
-+
-+      /** Number of RX descriptors waiting to be pushed to the card. */
-+      u32 rx_dma_batched;
-+#define NETFRONT_ACCEL_RX_DESC_BATCH 16
-+
-+      /**
-+       * Hash table of remote mac addresses to decide whether to try
-+       * fast path
-+       */
-+      cuckoo_hash_table fastpath_table;
-+      spinlock_t table_lock;
-+
-+      /** the local mac address of virtual interface we're accelerating */
-+      u8 mac[ETH_ALEN];
-+
-+      int rx_pkt_stride;
-+      int rx_skb_stride;
-+
-+      /**
-+       * Keep track of fragments of jumbo packets as events are
-+       * delivered by NIC 
-+       */
-+      netfront_accel_jumbo_state jumbo_state;
-+
-+      struct net_device *net_dev;
-+
-+      /** These two gate the enabling of fast path operations */
-+      int frontend_ready;
-+      int backend_netdev_up;
-+
-+      int irq_enabled;
-+      spinlock_t irq_enabled_lock;
-+
-+      int tx_enabled;
-+
-+      int poll_enabled;
-+
-+      /** A spare slot for a TX packet.  This is treated as an extension
-+       * of the DMA queue. */
-+      struct sk_buff *tx_skb;
-+
-+      /** Keep track of fragments of SSR packets */
-+      struct netfront_accel_ssr_state ssr_state;
-+
-+      struct xenbus_device *dev;
-+
-+      /** Event channel for messages */
-+      int msg_channel;
-+      int msg_channel_irq;
-+
-+      /** Event channel for network interrupts. */
-+      int net_channel;
-+      int net_channel_irq;
-+
-+      struct net_accel_shared_page *shared_page;
-+
-+      grant_ref_t ctrl_page_gnt;
-+      grant_ref_t msg_page_gnt;
-+
-+      /** Message Qs, 1 each way. */
-+      sh_msg_fifo2 to_dom0;
-+      sh_msg_fifo2 from_dom0;
-+
-+      enum netfront_accel_msg_state msg_state;
-+
-+      /** Watch on accelstate */
-+      struct xenbus_watch backend_accel_watch;
-+      /** Watch on frontend's MAC address */
-+      struct xenbus_watch mac_address_watch;
-+
-+      /** Work to process received irq/msg */
-+      struct work_struct msg_from_bend;
-+
-+      /** Wait queue for changes in accelstate. */
-+      wait_queue_head_t state_wait_queue;
-+
-+      /** The current accelstate of this driver. */
-+      XenbusState frontend_state;
-+
-+      /** The most recent accelstate seen by the xenbus watch. */
-+      XenbusState backend_state;
-+
-+      /** Non-zero if we should reject requests to connect. */
-+      int removing;
-+
-+      /** Non-zero if the domU shared state has been initialised. */
-+      int domU_state_is_setup;
-+
-+      /** Non-zero if the dom0 shared state has been initialised. */
-+      int dom0_state_is_setup;
-+
-+      /* Those statistics that are added to the netdev stats */
-+      struct netfront_accel_netdev_stats netdev_stats;
-+      struct netfront_accel_netdev_stats stats_last_read;
-+#ifdef CONFIG_DEBUG_FS
-+      struct netfront_accel_netdev_dbfs netdev_dbfs;
-+#endif
-+
-+      /* These statistics are internal and optional */
-+#if NETFRONT_ACCEL_STATS
-+      struct netfront_accel_stats stats;
-+#ifdef CONFIG_DEBUG_FS
-+      struct netfront_accel_dbfs dbfs;
-+#endif
-+#endif
-+
-+      /** Debufs fs dir for this interface */
-+      struct dentry *dbfs_dir;
-+} netfront_accel_vnic;
-+
-+
-+/* Module parameters */
-+extern unsigned sfc_netfront_max_pages;
-+extern unsigned sfc_netfront_buffer_split;
-+
-+extern const char *frontend_name;
-+extern struct netfront_accel_hooks accel_hooks;
-+extern struct workqueue_struct *netfront_accel_workqueue;
-+
-+
-+extern
-+void netfront_accel_vi_ctor(netfront_accel_vnic *vnic);
-+
-+extern
-+int netfront_accel_vi_init(netfront_accel_vnic *vnic, 
-+                         struct net_accel_msg_hw *hw_msg);
-+
-+extern
-+void netfront_accel_vi_dtor(netfront_accel_vnic *vnic);
-+
-+
-+/**
-+ * Add new buffers which have been registered with the NIC.
-+ *
-+ * @v   vnic     The vnic instance to process the response.
-+ *
-+ * The buffers contained in the message are added to the buffer pool.
-+ */
-+extern
-+void netfront_accel_vi_add_bufs(netfront_accel_vnic *vnic, int is_rx);
-+
-+/**
-+ * Put a packet on the tx DMA queue.
-+ *
-+ * @v  vnic    The vnic instance to accept the packet.
-+ * @v  skb     A sk_buff to send.
-+ *
-+ * Attempt to send a packet.  On success, the skb is owned by the DMA
-+ * queue and will be released when the completion event arrives.
-+ */
-+extern enum netfront_accel_post_status
-+netfront_accel_vi_tx_post(netfront_accel_vnic *vnic,
-+                        struct sk_buff *skb);
-+
-+
-+/**
-+ * Process events in response to an interrupt.
-+ *
-+ * @v   vnic       The vnic instance to poll.
-+ * @v   rx_packets The maximum number of rx packets to process.
-+ * @ret rx_done    The number of rx packets processed.
-+ *
-+ * The vnic will process events until there are no more events
-+ * remaining or the specified number of rx packets has been processed.
-+ * The split from the interrupt call is to allow Linux NAPI
-+ * polling.
-+ */
-+extern
-+int netfront_accel_vi_poll(netfront_accel_vnic *vnic, int rx_packets);
-+
-+
-+/**
-+ * Iterate over the fragments of a packet buffer.
-+ *
-+ * @v   skb      The packet buffer to examine.
-+ * @v   idx      A variable name for the fragment index.
-+ * @v   data     A variable name for the address of the fragment data.
-+ * @v   length   A variable name for the fragment length.
-+ * @v   code     A section of code to execute for each fragment.
-+ *
-+ * This macro iterates over the fragments in a packet buffer and
-+ * executes the code for each of them.
-+ */
-+#define NETFRONT_ACCEL_PKTBUFF_FOR_EACH_FRAGMENT(skb, frag_idx,               \
-+                                               frag_data, frag_len,   \
-+                                               code)                  \
-+      do {                                                            \
-+              int frag_idx;                                           \
-+              void *frag_data;                                        \
-+              unsigned int      frag_len;                             \
-+                                                                      \
-+              frag_data = skb->data;                                  \
-+              frag_len = skb_headlen(skb);                            \
-+              frag_idx = 0;                                           \
-+              while (1) { /* For each fragment */                     \
-+                      code;                                           \
-+                      if (frag_idx >= skb_shinfo(skb)->nr_frags) {    \
-+                              break;                                  \
-+                      } else {                                        \
-+                              skb_frag_t *fragment;                   \
-+                              fragment = &skb_shinfo(skb)->frags[frag_idx]; \
-+                              frag_len = fragment->size;              \
-+                              frag_data = ((void*)page_address(fragment->page) \
-+                                           + fragment->page_offset);  \
-+                      };                                              \
-+                      frag_idx++;                                     \
-+              }                                                       \
-+      } while(0)
-+
-+static inline
-+void netfront_accel_disable_net_interrupts(netfront_accel_vnic *vnic)
-+{
-+      mask_evtchn(vnic->net_channel);
-+}
-+
-+static inline
-+void netfront_accel_enable_net_interrupts(netfront_accel_vnic *vnic)
-+{
-+      unmask_evtchn(vnic->net_channel);
-+}
-+
-+void netfront_accel_msg_tx_fastpath(netfront_accel_vnic *vnic, const void *mac,
-+                                  u32 ip, u16 port, u8 protocol);
-+
-+/* Process an IRQ received from back end driver */
-+irqreturn_t netfront_accel_msg_channel_irq_from_bend(int irq, void *context, 
-+                                                   struct pt_regs *unused);
-+irqreturn_t netfront_accel_net_channel_irq_from_bend(int irq, void *context, 
-+                                                   struct pt_regs *unused);
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+extern void netfront_accel_msg_from_bend(struct work_struct *context);
-+#else
-+extern void netfront_accel_msg_from_bend(void *context);
-+#endif
-+
-+extern void vnic_stop_fastpath(netfront_accel_vnic *vnic);
-+
-+extern int netfront_accel_probe(struct net_device *net_dev, 
-+                              struct xenbus_device *dev);
-+extern int netfront_accel_remove(struct xenbus_device *dev);
-+extern void netfront_accel_set_closing(netfront_accel_vnic *vnic);
-+
-+extern int netfront_accel_vi_enable_interrupts(netfront_accel_vnic *vnic);
-+
-+extern void netfront_accel_debugfs_init(void);
-+extern void netfront_accel_debugfs_fini(void);
-+extern int netfront_accel_debugfs_create(netfront_accel_vnic *vnic);
-+extern int netfront_accel_debugfs_remove(netfront_accel_vnic *vnic);
-+
-+#endif /* NETFRONT_ACCEL_H */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_bufs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_bufs.c      2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,393 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <xen/gnttab.h>
-+
-+#include "accel_bufs.h"
-+#include "accel_util.h"
-+
-+#include "accel.h"
-+
-+
-+static int 
-+netfront_accel_alloc_buf_desc_blocks(struct netfront_accel_bufinfo *manager,
-+                                   int pages)
-+{
-+      manager->desc_blocks = 
-+              kzalloc(sizeof(struct netfront_accel_pkt_desc *) * 
-+                      NETFRONT_ACCEL_BUF_NUM_BLOCKS(pages), GFP_KERNEL);
-+      if (manager->desc_blocks == NULL) {
-+              return -ENOMEM;
-+      }
-+      
-+      return 0;
-+}
-+
-+static int 
-+netfront_accel_alloc_buf_lists(struct netfront_accel_bufpages *bufpages,
-+                             int pages)
-+{
-+      bufpages->page_list = kmalloc(pages * sizeof(void *), GFP_KERNEL);
-+      if (bufpages->page_list == NULL) {
-+              return -ENOMEM;
-+      }
-+
-+      bufpages->grant_list = kzalloc(pages * sizeof(grant_ref_t), GFP_KERNEL);
-+      if (bufpages->grant_list == NULL) {
-+              kfree(bufpages->page_list);
-+              bufpages->page_list = NULL;
-+              return -ENOMEM;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+int netfront_accel_alloc_buffer_mem(struct netfront_accel_bufpages *bufpages,
-+                                  struct netfront_accel_bufinfo *rx_manager,
-+                                  struct netfront_accel_bufinfo *tx_manager,
-+                                  int pages)
-+{
-+      int n, rc;
-+
-+      if ((rc = netfront_accel_alloc_buf_desc_blocks
-+           (rx_manager, pages - (pages / sfc_netfront_buffer_split))) < 0) {
-+              goto rx_fail;
-+      }
-+
-+      if ((rc = netfront_accel_alloc_buf_desc_blocks
-+           (tx_manager, pages / sfc_netfront_buffer_split)) < 0) {
-+              goto tx_fail;
-+      }
-+
-+      if ((rc = netfront_accel_alloc_buf_lists(bufpages, pages)) < 0) {
-+              goto lists_fail;
-+      }
-+
-+      for (n = 0; n < pages; n++) {
-+              void *tmp = (void*)__get_free_page(GFP_KERNEL);
-+              if (tmp == NULL)
-+                      break;
-+
-+              bufpages->page_list[n] = tmp;
-+      }
-+
-+      if (n != pages) {
-+              EPRINTK("%s: not enough pages: %d != %d\n", __FUNCTION__, n, 
-+                      pages);
-+              for (; n >= 0; n--)
-+                      free_page((unsigned long)(bufpages->page_list[n]));
-+              rc = -ENOMEM;
-+              goto pages_fail;
-+      }
-+
-+      bufpages->max_pages = pages;
-+      bufpages->page_reqs = 0;
-+
-+      return 0;
-+
-+ pages_fail:
-+      kfree(bufpages->page_list);
-+      kfree(bufpages->grant_list);
-+
-+      bufpages->page_list = NULL;
-+      bufpages->grant_list = NULL;
-+ lists_fail:
-+      kfree(tx_manager->desc_blocks);
-+      tx_manager->desc_blocks = NULL;
-+
-+ tx_fail:
-+      kfree(rx_manager->desc_blocks);
-+      rx_manager->desc_blocks = NULL;
-+ rx_fail:
-+      return rc;
-+}
-+
-+
-+void netfront_accel_free_buffer_mem(struct netfront_accel_bufpages *bufpages,
-+                                  struct netfront_accel_bufinfo *rx_manager,
-+                                  struct netfront_accel_bufinfo *tx_manager)
-+{
-+      int i;
-+
-+      for (i = 0; i < bufpages->max_pages; i++) {
-+              if (bufpages->grant_list[i] != 0)
-+                      net_accel_ungrant_page(bufpages->grant_list[i]);
-+              free_page((unsigned long)(bufpages->page_list[i]));
-+      }
-+
-+      if (bufpages->max_pages) {
-+              kfree(bufpages->page_list);
-+              kfree(bufpages->grant_list);
-+              kfree(rx_manager->desc_blocks);
-+              kfree(tx_manager->desc_blocks);
-+      }
-+}
-+
-+
-+/*
-+ * Allocate memory for the buffer manager and create a lock.  If no
-+ * lock is supplied its own is allocated.
-+ */
-+struct netfront_accel_bufinfo *netfront_accel_init_bufs(spinlock_t *lock)
-+{
-+      struct netfront_accel_bufinfo *res = kmalloc(sizeof(*res), GFP_KERNEL);
-+      if (res != NULL) {
-+              res->npages = res->nused = 0;
-+              res->first_free = -1;
-+
-+              if (lock == NULL) {
-+                      res->lock = kmalloc(sizeof(*res->lock), GFP_KERNEL);
-+                      if (res->lock == NULL) {
-+                              kfree(res);
-+                              return NULL;
-+                      }
-+                      spin_lock_init(res->lock);
-+                      res->internally_locked = 1;
-+              } else {
-+                      res->lock = lock;
-+                      res->internally_locked = 0;
-+              }
-+              
-+              res->desc_blocks = NULL;
-+      }
-+
-+      return res;
-+}
-+
-+
-+void netfront_accel_fini_bufs(struct netfront_accel_bufinfo *bufs)
-+{
-+      if (bufs->internally_locked)
-+              kfree(bufs->lock);
-+      kfree(bufs);
-+}
-+
-+
-+int netfront_accel_buf_map_request(struct xenbus_device *dev,
-+                                 struct netfront_accel_bufpages *bufpages,
-+                                 struct net_accel_msg *msg, 
-+                                 int pages, int offset)
-+{
-+      int i, mfn;
-+      int err;
-+
-+      net_accel_msg_init(msg, NET_ACCEL_MSG_MAPBUF);
-+
-+      BUG_ON(pages > NET_ACCEL_MSG_MAX_PAGE_REQ);
-+
-+      msg->u.mapbufs.pages = pages;
-+
-+      for (i = 0; i < msg->u.mapbufs.pages; i++) {
-+              /* 
-+               * This can happen if we tried to send this message
-+               * earlier but the queue was full.
-+               */
-+              if (bufpages->grant_list[offset+i] != 0) {
-+                      msg->u.mapbufs.grants[i] = 
-+                              bufpages->grant_list[offset+i];
-+                      continue;
-+              }
-+
-+              mfn = virt_to_mfn(bufpages->page_list[offset+i]);
-+              VPRINTK("%s: Granting page %d, mfn %08x\n",
-+                      __FUNCTION__, i, mfn);
-+
-+              bufpages->grant_list[offset+i] =
-+                      net_accel_grant_page(dev, mfn, 0);
-+              msg->u.mapbufs.grants[i] = bufpages->grant_list[offset+i];
-+
-+              if (msg->u.mapbufs.grants[i] < 0) {
-+                      EPRINTK("%s: Failed to grant buffer: %d\n",
-+                              __FUNCTION__, msg->u.mapbufs.grants[i]);
-+                      err = -EIO;
-+                      goto error;
-+              }
-+      }
-+
-+      /* This is interpreted on return as the offset in the the page_list */
-+      msg->u.mapbufs.reqid = offset;
-+
-+      return 0;
-+
-+error:
-+      /* Ungrant all the pages we've successfully granted. */
-+      for (i--; i >= 0; i--) {
-+              net_accel_ungrant_page(bufpages->grant_list[offset+i]);
-+              bufpages->grant_list[offset+i] = 0;
-+      }
-+      return err;
-+}
-+
-+
-+/* Process a response to a buffer request. */
-+int netfront_accel_add_bufs(struct netfront_accel_bufpages *bufpages,
-+                          struct netfront_accel_bufinfo *manager, 
-+                          struct net_accel_msg *msg)
-+{
-+      int msg_pages, page_offset, i, newtot;
-+      int old_block_count, new_block_count;
-+      u32 msg_buf;
-+      unsigned long flags;
-+
-+      VPRINTK("%s: manager %p msg %p\n", __FUNCTION__, manager, msg);
-+
-+      BUG_ON(msg->id != (NET_ACCEL_MSG_MAPBUF | NET_ACCEL_MSG_REPLY));
-+
-+      msg_pages = msg->u.mapbufs.pages;
-+      msg_buf = msg->u.mapbufs.buf;
-+      page_offset = msg->u.mapbufs.reqid;
-+
-+      spin_lock_irqsave(manager->lock, flags);
-+      newtot = manager->npages + msg_pages;
-+      old_block_count = 
-+              (manager->npages + NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK - 1) >>
-+              NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT;
-+      new_block_count = 
-+              (newtot + NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK - 1) >>
-+              NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT;
-+
-+      for (i = old_block_count; i < new_block_count; i++) {
-+              struct netfront_accel_pkt_desc *block;
-+              if (manager->desc_blocks[i] != NULL) {
-+                      VPRINTK("Not needed\n");
-+                      continue;
-+              }
-+              block = kzalloc(NETFRONT_ACCEL_BUFS_PER_BLOCK * 
-+                              sizeof(netfront_accel_pkt_desc), GFP_ATOMIC);
-+              if (block == NULL) {
-+                      spin_unlock_irqrestore(manager->lock, flags);
-+                      return -ENOMEM;
-+              }
-+              manager->desc_blocks[i] = block;
-+      }
-+      for (i = manager->npages; i < newtot; i++) {
-+              int k, j = i - manager->npages;
-+              int block_num;
-+              int block_idx;
-+              struct netfront_accel_pkt_desc *pkt;
-+
-+              block_num = i >> NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT;
-+              block_idx = (NETFRONT_ACCEL_BUFS_PER_PAGE*i)
-+                      & (NETFRONT_ACCEL_BUFS_PER_BLOCK-1);
-+
-+              pkt = manager->desc_blocks[block_num] + block_idx;
-+              
-+              for (k = 0; k < NETFRONT_ACCEL_BUFS_PER_PAGE; k++) {
-+                      BUG_ON(page_offset + j >= bufpages->max_pages);
-+
-+                      pkt[k].buf_id = NETFRONT_ACCEL_BUFS_PER_PAGE * i + k;
-+                      pkt[k].pkt_kva = bufpages->page_list[page_offset + j] +
-+                              (PAGE_SIZE/NETFRONT_ACCEL_BUFS_PER_PAGE) * k;
-+                      pkt[k].pkt_buff_addr = msg_buf +
-+                              (PAGE_SIZE/NETFRONT_ACCEL_BUFS_PER_PAGE) * 
-+                              (NETFRONT_ACCEL_BUFS_PER_PAGE * j + k);
-+                      pkt[k].next_free = manager->first_free;
-+                      manager->first_free = pkt[k].buf_id;
-+                      *(int*)(pkt[k].pkt_kva) = pkt[k].buf_id;
-+
-+                      VPRINTK("buf %d desc %p kva %p buffaddr %x\n",
-+                              pkt[k].buf_id, &(pkt[k]), pkt[k].pkt_kva, 
-+                              pkt[k].pkt_buff_addr);
-+              }
-+      }
-+      manager->npages = newtot;
-+      spin_unlock_irqrestore(manager->lock, flags);
-+      VPRINTK("Added %d pages. Total is now %d\n", msg_pages,
-+              manager->npages);
-+      return 0;
-+}
-+
-+
-+netfront_accel_pkt_desc *
-+netfront_accel_buf_find(struct netfront_accel_bufinfo *manager, u16 id)
-+{
-+      netfront_accel_pkt_desc *pkt;
-+      int block_num = id >> NETFRONT_ACCEL_BUFS_PER_BLOCK_SHIFT;
-+      int block_idx = id & (NETFRONT_ACCEL_BUFS_PER_BLOCK - 1);
-+      BUG_ON(id >= manager->npages * NETFRONT_ACCEL_BUFS_PER_PAGE);
-+      BUG_ON(block_idx >= NETFRONT_ACCEL_BUFS_PER_BLOCK);
-+      pkt = manager->desc_blocks[block_num] + block_idx;
-+      return pkt;
-+}
-+
-+
-+/* Allocate a buffer from the buffer manager */
-+netfront_accel_pkt_desc *
-+netfront_accel_buf_get(struct netfront_accel_bufinfo *manager)
-+{
-+      int bufno = -1;
-+      netfront_accel_pkt_desc *buf = NULL;
-+      unsigned long flags = 0;
-+
-+      /* Any spare? */
-+      if (manager->first_free == -1)
-+              return NULL;
-+      /* Take lock */
-+      if (manager->internally_locked)
-+              spin_lock_irqsave(manager->lock, flags);
-+      bufno = manager->first_free;
-+      if (bufno != -1) {
-+              buf = netfront_accel_buf_find(manager, bufno);
-+              manager->first_free = buf->next_free;
-+              manager->nused++;
-+      }
-+      /* Release lock */
-+      if (manager->internally_locked)
-+              spin_unlock_irqrestore(manager->lock, flags);
-+
-+      /* Tell the world */
-+      VPRINTK("Allocated buffer %i, buffaddr %x\n", bufno,
-+              buf->pkt_buff_addr);
-+
-+      return buf;
-+}
-+
-+
-+/* Release a buffer back to the buffer manager pool */
-+int netfront_accel_buf_put(struct netfront_accel_bufinfo *manager, u16 id)
-+{
-+      netfront_accel_pkt_desc *buf = netfront_accel_buf_find(manager, id);
-+      unsigned long flags = 0;
-+      unsigned was_empty = 0;
-+      int bufno = id;
-+
-+      VPRINTK("Freeing buffer %i\n", id);
-+      BUG_ON(id == (u16)-1);
-+
-+      if (manager->internally_locked)
-+              spin_lock_irqsave(manager->lock, flags);
-+
-+      if (manager->first_free == -1)
-+              was_empty = 1;
-+
-+      buf->next_free = manager->first_free;
-+      manager->first_free = bufno;
-+      manager->nused--;
-+
-+      if (manager->internally_locked)
-+              spin_unlock_irqrestore(manager->lock, flags);
-+
-+      return was_empty;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_bufs.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_bufs.h      2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,181 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETFRONT_ACCEL_BUFS_H
-+#define NETFRONT_ACCEL_BUFS_H
-+
-+#include <linux/skbuff.h>
-+#include <linux/spinlock.h>
-+#include <xen/xenbus.h>
-+
-+#include "accel_msg_iface.h"
-+
-+
-+/*! Buffer descriptor structure */
-+typedef struct netfront_accel_pkt_desc {
-+      int buf_id;
-+      u32 pkt_buff_addr;
-+      void *pkt_kva;
-+      /* This is the socket buffer currently married to this buffer */
-+      struct sk_buff *skb;
-+      int next_free;
-+} netfront_accel_pkt_desc;
-+
-+
-+#define NETFRONT_ACCEL_DEFAULT_BUF_PAGES (384)
-+#define NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT (4)
-+#define NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK            \
-+      (1 << (NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT))
-+#define NETFRONT_ACCEL_BUFS_PER_PAGE_SHIFT (1)
-+#define NETFRONT_ACCEL_BUFS_PER_PAGE                  \
-+      (1 << (NETFRONT_ACCEL_BUFS_PER_PAGE_SHIFT))
-+#define NETFRONT_ACCEL_BUFS_PER_BLOCK_SHIFT           \
-+      (NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK_SHIFT +     \
-+       NETFRONT_ACCEL_BUFS_PER_PAGE_SHIFT)
-+#define NETFRONT_ACCEL_BUFS_PER_BLOCK                 \
-+      (1 << NETFRONT_ACCEL_BUFS_PER_BLOCK_SHIFT)
-+#define NETFRONT_ACCEL_BUF_NUM_BLOCKS(max_pages)                      \
-+      (((max_pages)+NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK-1) /           \
-+       NETFRONT_ACCEL_BUF_PAGES_PER_BLOCK)
-+
-+/*! Buffer management structure. */
-+struct netfront_accel_bufinfo {
-+      /* number added to this manager */
-+      unsigned npages;
-+      /* number currently used from this manager */
-+      unsigned nused;
-+
-+      int first_free;
-+
-+      int internally_locked;
-+      spinlock_t *lock;
-+
-+      /*
-+       * array of pointers (length NETFRONT_ACCEL_BUF_NUM_BLOCKS) to
-+       * pkt descs
-+       */
-+      struct netfront_accel_pkt_desc **desc_blocks; 
-+};
-+
-+
-+struct netfront_accel_bufpages {
-+      /* length of lists of pages/grants */
-+      int max_pages;
-+      /* list of pages allocated for network buffers */
-+      void **page_list;
-+      /* list of grants for the above pages */
-+      grant_ref_t *grant_list;
-+      
-+      /* number of page requests that have been made */
-+      unsigned page_reqs;
-+};
-+
-+
-+/*! Allocate memory for the buffer manager, set up locks etc.
-+ * Optionally takes a lock to use, if not supplied it makes its own.
-+ *
-+ * \return pointer to netfront_accel_bufinfo structure that represents the
-+ * buffer manager
-+ */
-+extern struct netfront_accel_bufinfo *
-+netfront_accel_init_bufs(spinlock_t *lock);
-+
-+/*! Allocate memory for the buffers
-+ */
-+extern int
-+netfront_accel_alloc_buffer_mem(struct netfront_accel_bufpages *bufpages,
-+                              struct netfront_accel_bufinfo *rx_res,
-+                              struct netfront_accel_bufinfo *tx_res,
-+                              int pages);
-+extern void
-+netfront_accel_free_buffer_mem(struct netfront_accel_bufpages *bufpages,
-+                             struct netfront_accel_bufinfo *rx_res,
-+                             struct netfront_accel_bufinfo *tx_res);
-+
-+/*! Release memory for the buffer manager, buffers, etc.
-+ *
-+ * \param manager pointer to netfront_accel_bufinfo structure that
-+ * represents the buffer manager
-+ */
-+extern void netfront_accel_fini_bufs(struct netfront_accel_bufinfo *manager);
-+
-+/*! Release a buffer.
-+ *
-+ * \param manager  The buffer manager which owns the buffer.
-+ * \param id   The buffer identifier.
-+ */
-+extern int netfront_accel_buf_put(struct netfront_accel_bufinfo *manager, 
-+                                u16 id);
-+
-+/*! Get the packet descriptor associated with a buffer id.
-+ *
-+ * \param manager  The buffer manager which owns the buffer.
-+ * \param id       The buffer identifier.
-+ *
-+ * The returned value is the packet descriptor for this buffer.
-+ */
-+extern netfront_accel_pkt_desc *
-+netfront_accel_buf_find(struct netfront_accel_bufinfo *manager, u16 id);
-+
-+
-+/*! Fill out a message request for some buffers to be mapped by the
-+ * back end driver
-+ * 
-+ * \param manager The buffer manager 
-+ * \param msg Pointer to an ef_msg to complete.
-+ * \return 0 on success
-+ */
-+extern int 
-+netfront_accel_buf_map_request(struct xenbus_device *dev,
-+                             struct netfront_accel_bufpages *bufpages,
-+                             struct net_accel_msg *msg, 
-+                             int pages, int offset);
-+
-+/*! Process a response to a buffer request. 
-+ * 
-+ * Deal with a received message from the back end in response to our
-+ * request for buffers
-+ * 
-+ * \param manager The buffer manager
-+ * \param msg The received message from the back end describing new
-+ * buffers
-+ * \return 0 on success
-+ */
-+extern int 
-+netfront_accel_add_bufs(struct netfront_accel_bufpages *bufpages,
-+                      struct netfront_accel_bufinfo *manager,
-+                      struct net_accel_msg *msg);
-+
-+
-+/*! Allocate a buffer from the buffer manager 
-+ *
-+ * \param manager The buffer manager data structure
-+ * \param id On exit, the id of the buffer allocated
-+ * \return Pointer to buffer descriptor.
-+ */
-+struct netfront_accel_pkt_desc *
-+netfront_accel_buf_get(struct netfront_accel_bufinfo *manager);
-+
-+#endif /* NETFRONT_ACCEL_BUFS_H */
-+
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_debugfs.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_debugfs.c   2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,211 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/fs.h>
-+#include <linux/debugfs.h>
-+
-+#include "accel.h"
-+
-+#if defined(CONFIG_DEBUG_FS)
-+static struct dentry *sfc_debugfs_root = NULL;
-+#endif
-+
-+void netfront_accel_debugfs_init(void) 
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      sfc_debugfs_root = debugfs_create_dir(frontend_name, NULL);
-+#endif
-+}
-+
-+
-+void netfront_accel_debugfs_fini(void)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      if (sfc_debugfs_root)
-+              debugfs_remove(sfc_debugfs_root);
-+#endif
-+}
-+
-+
-+int netfront_accel_debugfs_create(netfront_accel_vnic *vnic)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      if (sfc_debugfs_root == NULL)
-+              return -ENOENT;
-+
-+      vnic->dbfs_dir = debugfs_create_dir(vnic->net_dev->name, 
-+                                          sfc_debugfs_root);
-+      if (vnic->dbfs_dir == NULL)
-+              return -ENOMEM;
-+
-+      vnic->netdev_dbfs.fastpath_rx_pkts = debugfs_create_u32
-+              ("fastpath_rx_pkts", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_rx_pkts);
-+      vnic->netdev_dbfs.fastpath_rx_bytes = debugfs_create_u32
-+              ("fastpath_rx_bytes", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_rx_bytes);
-+      vnic->netdev_dbfs.fastpath_rx_errors = debugfs_create_u32
-+              ("fastpath_rx_errors", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_rx_errors);
-+      vnic->netdev_dbfs.fastpath_tx_pkts = debugfs_create_u32
-+              ("fastpath_tx_pkts", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_tx_pkts);
-+      vnic->netdev_dbfs.fastpath_tx_bytes = debugfs_create_u32
-+              ("fastpath_tx_bytes", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_tx_bytes);
-+      vnic->netdev_dbfs.fastpath_tx_errors = debugfs_create_u32
-+              ("fastpath_tx_errors", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->netdev_stats.fastpath_tx_errors);
-+
-+#if NETFRONT_ACCEL_STATS
-+      vnic->dbfs.irq_count = debugfs_create_u64
-+              ("irq_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.irq_count);
-+      vnic->dbfs.useless_irq_count = debugfs_create_u64
-+              ("useless_irq_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.useless_irq_count);
-+      vnic->dbfs.poll_schedule_count = debugfs_create_u64
-+              ("poll_schedule_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.poll_schedule_count);
-+      vnic->dbfs.poll_call_count = debugfs_create_u64
-+              ("poll_call_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.poll_call_count);
-+      vnic->dbfs.poll_reschedule_count = debugfs_create_u64
-+              ("poll_reschedule_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.poll_reschedule_count);
-+      vnic->dbfs.queue_stops = debugfs_create_u64
-+              ("queue_stops", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.queue_stops);
-+      vnic->dbfs.queue_wakes = debugfs_create_u64
-+              ("queue_wakes", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.queue_wakes);
-+      vnic->dbfs.ssr_bursts = debugfs_create_u64
-+              ("ssr_bursts", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_bursts);
-+      vnic->dbfs.ssr_drop_stream = debugfs_create_u64
-+              ("ssr_drop_stream", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_drop_stream);
-+      vnic->dbfs.ssr_misorder = debugfs_create_u64
-+              ("ssr_misorder", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_misorder);
-+      vnic->dbfs.ssr_slow_start = debugfs_create_u64
-+              ("ssr_slow_start", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_slow_start);
-+      vnic->dbfs.ssr_merges = debugfs_create_u64
-+              ("ssr_merges", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_merges);
-+      vnic->dbfs.ssr_too_many = debugfs_create_u64
-+              ("ssr_too_many", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_too_many);
-+      vnic->dbfs.ssr_new_stream = debugfs_create_u64
-+              ("ssr_new_stream", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.ssr_new_stream);
-+
-+      vnic->dbfs.fastpath_tx_busy = debugfs_create_u64
-+              ("fastpath_tx_busy", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.fastpath_tx_busy);
-+      vnic->dbfs.fastpath_tx_completions = debugfs_create_u64
-+              ("fastpath_tx_completions", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.fastpath_tx_completions);
-+      vnic->dbfs.fastpath_tx_pending_max = debugfs_create_u32
-+              ("fastpath_tx_pending_max", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.fastpath_tx_pending_max);
-+      vnic->dbfs.event_count = debugfs_create_u64
-+              ("event_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.event_count);
-+      vnic->dbfs.bad_event_count = debugfs_create_u64
-+              ("bad_event_count", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.bad_event_count);
-+      vnic->dbfs.event_count_since_irq = debugfs_create_u32
-+              ("event_count_since_irq", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.event_count_since_irq);
-+      vnic->dbfs.events_per_irq_max = debugfs_create_u32
-+              ("events_per_irq_max", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.events_per_irq_max);
-+      vnic->dbfs.fastpath_frm_trunc = debugfs_create_u64
-+              ("fastpath_frm_trunc", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.fastpath_frm_trunc);
-+      vnic->dbfs.rx_no_desc_trunc = debugfs_create_u64
-+              ("rx_no_desc_trunc", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.rx_no_desc_trunc);
-+      vnic->dbfs.events_per_poll_max = debugfs_create_u32
-+              ("events_per_poll_max", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.events_per_poll_max);
-+      vnic->dbfs.events_per_poll_rx_max = debugfs_create_u32
-+              ("events_per_poll_rx_max", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.events_per_poll_rx_max);
-+      vnic->dbfs.events_per_poll_tx_max = debugfs_create_u32
-+              ("events_per_poll_tx_max", S_IRUSR | S_IRGRP | S_IROTH,
-+               vnic->dbfs_dir, &vnic->stats.events_per_poll_tx_max);
-+#endif
-+#endif
-+      return 0;
-+}
-+
-+
-+int netfront_accel_debugfs_remove(netfront_accel_vnic *vnic)
-+{
-+#if defined(CONFIG_DEBUG_FS)
-+      if (vnic->dbfs_dir != NULL) {
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_rx_pkts);
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_rx_bytes);
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_rx_errors);
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_tx_pkts);
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_tx_bytes);
-+              debugfs_remove(vnic->netdev_dbfs.fastpath_tx_errors);
-+              
-+#if NETFRONT_ACCEL_STATS
-+              debugfs_remove(vnic->dbfs.irq_count);
-+              debugfs_remove(vnic->dbfs.useless_irq_count);
-+              debugfs_remove(vnic->dbfs.poll_schedule_count);
-+              debugfs_remove(vnic->dbfs.poll_call_count);
-+              debugfs_remove(vnic->dbfs.poll_reschedule_count);
-+              debugfs_remove(vnic->dbfs.queue_stops);
-+              debugfs_remove(vnic->dbfs.queue_wakes);
-+              debugfs_remove(vnic->dbfs.ssr_bursts);
-+              debugfs_remove(vnic->dbfs.ssr_drop_stream);
-+              debugfs_remove(vnic->dbfs.ssr_misorder);
-+              debugfs_remove(vnic->dbfs.ssr_slow_start);
-+              debugfs_remove(vnic->dbfs.ssr_merges);
-+              debugfs_remove(vnic->dbfs.ssr_too_many);
-+              debugfs_remove(vnic->dbfs.ssr_new_stream);
-+              
-+              debugfs_remove(vnic->dbfs.fastpath_tx_busy);
-+              debugfs_remove(vnic->dbfs.fastpath_tx_completions);
-+              debugfs_remove(vnic->dbfs.fastpath_tx_pending_max);
-+              debugfs_remove(vnic->dbfs.event_count);
-+              debugfs_remove(vnic->dbfs.bad_event_count);
-+              debugfs_remove(vnic->dbfs.event_count_since_irq);
-+              debugfs_remove(vnic->dbfs.events_per_irq_max);
-+              debugfs_remove(vnic->dbfs.fastpath_frm_trunc);
-+              debugfs_remove(vnic->dbfs.rx_no_desc_trunc);
-+              debugfs_remove(vnic->dbfs.events_per_poll_max);
-+              debugfs_remove(vnic->dbfs.events_per_poll_rx_max);
-+              debugfs_remove(vnic->dbfs.events_per_poll_tx_max);
-+#endif
-+              debugfs_remove(vnic->dbfs_dir);
-+      }
-+#endif
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_msg.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_msg.c       2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,566 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/stddef.h>
-+#include <linux/errno.h>
-+
-+#include <xen/xenbus.h>
-+
-+#include "accel.h"
-+#include "accel_msg_iface.h"
-+#include "accel_util.h"
-+#include "accel_bufs.h"
-+
-+#include "netfront.h" /* drivers/xen/netfront/netfront.h */
-+
-+static void vnic_start_interrupts(netfront_accel_vnic *vnic)
-+{
-+      unsigned long flags;
-+      
-+      /* Prime our interrupt */
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
-+      if (!netfront_accel_vi_enable_interrupts(vnic)) {
-+              /* Cripes, that was quick, better pass it up */
-+              netfront_accel_disable_net_interrupts(vnic);
-+              vnic->irq_enabled = 0;
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.poll_schedule_count++);
-+              netif_rx_schedule(vnic->net_dev);
-+      } else {
-+              /*
-+               * Nothing yet, make sure we get interrupts through
-+               * back end 
-+               */
-+              vnic->irq_enabled = 1;
-+              netfront_accel_enable_net_interrupts(vnic);
-+      }
-+      spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+}
-+
-+
-+static void vnic_stop_interrupts(netfront_accel_vnic *vnic)
-+{
-+      unsigned long flags;
-+
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
-+      netfront_accel_disable_net_interrupts(vnic);
-+      vnic->irq_enabled = 0;
-+      spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+}
-+
-+
-+static void vnic_start_fastpath(netfront_accel_vnic *vnic)
-+{
-+      struct net_device *net_dev = vnic->net_dev;
-+      unsigned long flags;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+
-+      spin_lock_irqsave(&vnic->tx_lock, flags);
-+      vnic->tx_enabled = 1;
-+      spin_unlock_irqrestore(&vnic->tx_lock, flags);
-+      
-+      netif_poll_disable(net_dev);
-+      vnic->poll_enabled = 1;
-+      netif_poll_enable(net_dev);
-+      
-+      vnic_start_interrupts(vnic);
-+}
-+
-+
-+void vnic_stop_fastpath(netfront_accel_vnic *vnic)
-+{
-+      struct net_device *net_dev = vnic->net_dev;
-+      struct netfront_info *np = (struct netfront_info *)netdev_priv(net_dev);
-+      unsigned long flags1, flags2;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+
-+      vnic_stop_interrupts(vnic);
-+      
-+      spin_lock_irqsave(&vnic->tx_lock, flags1);
-+      vnic->tx_enabled = 0;
-+      spin_lock_irqsave(&np->tx_lock, flags2);
-+      if (vnic->tx_skb != NULL) {
-+              dev_kfree_skb_any(vnic->tx_skb);
-+              vnic->tx_skb = NULL;
-+              if (netfront_check_queue_ready(net_dev)) {
-+                      netif_wake_queue(net_dev);
-+                      NETFRONT_ACCEL_STATS_OP
-+                              (vnic->stats.queue_wakes++);
-+              }
-+      }
-+      spin_unlock_irqrestore(&np->tx_lock, flags2);
-+      spin_unlock_irqrestore(&vnic->tx_lock, flags1);
-+      
-+      /* Must prevent polls and hold lock to modify poll_enabled */
-+      netif_poll_disable(net_dev);
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags1);
-+      vnic->poll_enabled = 0;
-+      spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags1);
-+      netif_poll_enable(net_dev);
-+}
-+
-+
-+static void netfront_accel_interface_up(netfront_accel_vnic *vnic)
-+{
-+
-+      if (!vnic->backend_netdev_up) {
-+              vnic->backend_netdev_up = 1;
-+              
-+              if (vnic->frontend_ready)
-+                      vnic_start_fastpath(vnic);
-+      }
-+}
-+
-+
-+static void netfront_accel_interface_down(netfront_accel_vnic *vnic)
-+{
-+
-+      if (vnic->backend_netdev_up) {
-+              vnic->backend_netdev_up = 0;
-+              
-+              if (vnic->frontend_ready)
-+                      vnic_stop_fastpath(vnic);
-+      }
-+}
-+
-+
-+static int vnic_add_bufs(netfront_accel_vnic *vnic, 
-+                       struct net_accel_msg *msg)
-+{
-+      int rc, offset;
-+      struct netfront_accel_bufinfo *bufinfo;
-+  
-+      BUG_ON(msg->u.mapbufs.pages > NET_ACCEL_MSG_MAX_PAGE_REQ);
-+
-+      offset = msg->u.mapbufs.reqid;
-+
-+      if (offset < vnic->bufpages.max_pages - 
-+          (vnic->bufpages.max_pages / sfc_netfront_buffer_split)) {
-+              bufinfo = vnic->rx_bufs;
-+      } else
-+              bufinfo = vnic->tx_bufs;
-+
-+      /* Queue up some Rx buffers to start things off. */
-+      if ((rc = netfront_accel_add_bufs(&vnic->bufpages, bufinfo, msg)) == 0) {
-+              netfront_accel_vi_add_bufs(vnic, bufinfo == vnic->rx_bufs);
-+
-+              if (offset + msg->u.mapbufs.pages == vnic->bufpages.max_pages) {
-+                      VPRINTK("%s: got all buffers back\n", __FUNCTION__);
-+                      vnic->frontend_ready = 1;
-+                      if (vnic->backend_netdev_up)
-+                              vnic_start_fastpath(vnic);
-+              } else {
-+                      VPRINTK("%s: got buffers back %d %d\n", __FUNCTION__, 
-+                              offset, msg->u.mapbufs.pages);
-+              }
-+      }
-+
-+      return rc;
-+}
-+
-+
-+/* The largest [o] such that (1u << o) <= n.  Requires n > 0. */
-+
-+inline unsigned log2_le(unsigned long n) {
-+      unsigned order = 1;
-+      while ((1ul << order) <= n) ++order;
-+      return (order - 1);
-+}
-+
-+static int vnic_send_buffer_requests(netfront_accel_vnic *vnic,
-+                                   struct netfront_accel_bufpages *bufpages)
-+{
-+      int pages, offset, rc = 0, sent = 0;
-+      struct net_accel_msg msg;
-+
-+      while (bufpages->page_reqs < bufpages->max_pages) {
-+              offset = bufpages->page_reqs;
-+
-+              pages = pow2(log2_le(bufpages->max_pages - 
-+                                   bufpages->page_reqs));
-+              pages = pages < NET_ACCEL_MSG_MAX_PAGE_REQ ? 
-+                      pages : NET_ACCEL_MSG_MAX_PAGE_REQ;
-+
-+              BUG_ON(offset < 0);
-+              BUG_ON(pages <= 0);
-+
-+              rc = netfront_accel_buf_map_request(vnic->dev, bufpages,
-+                                                  &msg, pages, offset);
-+              if (rc == 0) {
-+                      rc = net_accel_msg_send(vnic->shared_page, 
-+                                              &vnic->to_dom0, &msg);
-+                      if (rc < 0) {
-+                              VPRINTK("%s: queue full, stopping for now\n",
-+                                      __FUNCTION__);
-+                              break;
-+                      }
-+                      sent++;
-+              } else {
-+                      EPRINTK("%s: problem with grant, stopping for now\n",
-+                              __FUNCTION__);
-+                      break;
-+              }
-+
-+              bufpages->page_reqs += pages;
-+      }
-+
-+      if (sent)
-+              net_accel_msg_notify(vnic->msg_channel_irq);
-+
-+      return rc;
-+}
-+
-+
-+/*
-+ * In response to dom0 saying "my queue is full", we reply with this
-+ * when it is no longer full
-+ */
-+inline void vnic_set_queue_not_full(netfront_accel_vnic *vnic)
-+{
-+
-+      if (test_and_set_bit(NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL_B,
-+                          (unsigned long *)&vnic->shared_page->aflags))
-+              notify_remote_via_irq(vnic->msg_channel_irq);
-+      else
-+              VPRINTK("queue not full bit already set, not signalling\n");
-+}
-+
-+/* 
-+ * Notify dom0 that the queue we want to use is full, it should
-+ * respond by setting MSG_AFLAGS_QUEUEUNOTFULL in due course
-+ */
-+inline void vnic_set_queue_full(netfront_accel_vnic *vnic)
-+{
-+
-+      if (!test_and_set_bit(NET_ACCEL_MSG_AFLAGS_QUEUEUFULL_B,
-+                           (unsigned long *)&vnic->shared_page->aflags))
-+              notify_remote_via_irq(vnic->msg_channel_irq);
-+      else
-+              VPRINTK("queue full bit already set, not signalling\n");
-+}
-+
-+
-+static int vnic_check_hello_version(unsigned version) 
-+{
-+      if (version > NET_ACCEL_MSG_VERSION) {
-+              /* Newer protocol, we must refuse */
-+              return -EPROTO;
-+      }
-+
-+      if (version < NET_ACCEL_MSG_VERSION) {
-+              /*
-+               * We are newer, so have discretion to accept if we
-+               * wish.  For now however, just reject
-+               */
-+              return -EPROTO;
-+      }
-+
-+      BUG_ON(version != NET_ACCEL_MSG_VERSION);
-+      return 0;
-+}
-+
-+
-+static int vnic_process_hello_msg(netfront_accel_vnic *vnic,
-+                                struct net_accel_msg *msg)
-+{
-+      int err = 0;
-+      unsigned pages = sfc_netfront_max_pages;
-+
-+      if (vnic_check_hello_version(msg->u.hello.version) < 0) {
-+              msg->id = NET_ACCEL_MSG_HELLO | NET_ACCEL_MSG_REPLY 
-+                      | NET_ACCEL_MSG_ERROR;
-+              msg->u.hello.version = NET_ACCEL_MSG_VERSION;
-+      } else {
-+              vnic->backend_netdev_up
-+                      = vnic->shared_page->net_dev_up;
-+              
-+              msg->id = NET_ACCEL_MSG_HELLO | NET_ACCEL_MSG_REPLY;
-+              msg->u.hello.version = NET_ACCEL_MSG_VERSION;
-+              if (msg->u.hello.max_pages &&
-+                  msg->u.hello.max_pages < pages)
-+                      pages = msg->u.hello.max_pages;
-+              msg->u.hello.max_pages = pages;
-+              
-+              /* Half of pages for rx, half for tx */ 
-+              err = netfront_accel_alloc_buffer_mem(&vnic->bufpages,
-+                                                    vnic->rx_bufs, 
-+                                                    vnic->tx_bufs,
-+                                                    pages);
-+              if (err)
-+                      msg->id |= NET_ACCEL_MSG_ERROR;         
-+      }
-+      
-+      /* Send reply */
-+      net_accel_msg_reply_notify(vnic->shared_page, vnic->msg_channel_irq,
-+                                 &vnic->to_dom0, msg);
-+      return err;
-+}
-+
-+
-+static int vnic_process_localmac_msg(netfront_accel_vnic *vnic,
-+                                   struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      cuckoo_hash_mac_key key;
-+
-+      if (msg->u.localmac.flags & NET_ACCEL_MSG_ADD) {
-+              DPRINTK("MAC has moved, could be local: " MAC_FMT "\n",
-+                      MAC_ARG(msg->u.localmac.mac));
-+              key = cuckoo_mac_to_key(msg->u.localmac.mac);
-+              spin_lock_irqsave(&vnic->table_lock, flags);
-+              /* Try to remove it, not a big deal if not there */
-+              cuckoo_hash_remove(&vnic->fastpath_table, 
-+                                 (cuckoo_hash_key *)&key);
-+              spin_unlock_irqrestore(&vnic->table_lock, flags);
-+      }
-+      
-+      return 0;
-+}
-+
-+
-+static 
-+int vnic_process_rx_msg(netfront_accel_vnic *vnic,
-+                      struct net_accel_msg *msg)
-+{
-+      int err;
-+
-+      switch (msg->id) {
-+      case NET_ACCEL_MSG_HELLO:
-+              /* Hello, reply with Reply */
-+              DPRINTK("got Hello, with version %.8x\n",
-+                      msg->u.hello.version);
-+              BUG_ON(vnic->msg_state != NETFRONT_ACCEL_MSG_NONE);
-+              err = vnic_process_hello_msg(vnic, msg);
-+              if (err == 0)
-+                      vnic->msg_state = NETFRONT_ACCEL_MSG_HELLO;
-+              break;
-+      case NET_ACCEL_MSG_SETHW:
-+              /* Hardware info message */
-+              DPRINTK("got H/W info\n");
-+              BUG_ON(vnic->msg_state != NETFRONT_ACCEL_MSG_HELLO);
-+              err = netfront_accel_vi_init(vnic, &msg->u.hw);
-+              if (err == 0)
-+                      vnic->msg_state = NETFRONT_ACCEL_MSG_HW;
-+              break;
-+      case NET_ACCEL_MSG_MAPBUF | NET_ACCEL_MSG_REPLY:
-+              VPRINTK("Got mapped buffers back\n");
-+              BUG_ON(vnic->msg_state != NETFRONT_ACCEL_MSG_HW);
-+              err = vnic_add_bufs(vnic, msg);
-+              break;
-+      case NET_ACCEL_MSG_MAPBUF | NET_ACCEL_MSG_REPLY | NET_ACCEL_MSG_ERROR:
-+              /* No buffers.  Can't use the fast path. */
-+              EPRINTK("Got mapped buffers error.  Cannot accelerate.\n");
-+              BUG_ON(vnic->msg_state != NETFRONT_ACCEL_MSG_HW);
-+              err = -EIO;
-+              break;
-+      case NET_ACCEL_MSG_LOCALMAC:
-+              /* Should be add, remove not currently used */
-+              EPRINTK_ON(!(msg->u.localmac.flags & NET_ACCEL_MSG_ADD));
-+              BUG_ON(vnic->msg_state != NETFRONT_ACCEL_MSG_HW);
-+              err = vnic_process_localmac_msg(vnic, msg);
-+              break;
-+      default:
-+              EPRINTK("Huh? Message code is 0x%x\n", msg->id);
-+              err = -EPROTO;
-+              break;
-+      }
-+
-+      return err;
-+}
-+
-+
-+/* Process an IRQ received from back end driver */
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+void netfront_accel_msg_from_bend(struct work_struct *context)
-+#else
-+void netfront_accel_msg_from_bend(void *context)
-+#endif
-+{
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      netfront_accel_vnic *vnic = 
-+              container_of(context, netfront_accel_vnic, msg_from_bend);
-+#else
-+      netfront_accel_vnic *vnic = (netfront_accel_vnic *)context;
-+#endif
-+      struct net_accel_msg msg;
-+      int err, queue_was_full = 0;
-+      
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      /*
-+       * This happens when the shared pages have been unmapped but
-+       * the workqueue has yet to be flushed 
-+       */
-+      if (!vnic->dom0_state_is_setup) 
-+              goto unlock_out;
-+
-+      while ((vnic->shared_page->aflags & NET_ACCEL_MSG_AFLAGS_TO_DOMU_MASK)
-+             != 0) {
-+              if (vnic->shared_page->aflags &
-+                  NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL) {
-+                      /* We've been told there may now be space. */
-+                      clear_bit(NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL_B,
-+                                (unsigned long *)&vnic->shared_page->aflags);
-+              }
-+
-+              if (vnic->shared_page->aflags &
-+                  NET_ACCEL_MSG_AFLAGS_QUEUE0FULL) {
-+                      /*
-+                       * There will be space at the end of this
-+                       * function if we can make any.
-+                       */
-+                      clear_bit(NET_ACCEL_MSG_AFLAGS_QUEUE0FULL_B,
-+                                (unsigned long *)&vnic->shared_page->aflags);
-+                      queue_was_full = 1;
-+              }
-+
-+              if (vnic->shared_page->aflags &
-+                  NET_ACCEL_MSG_AFLAGS_NETUPDOWN) {
-+                      DPRINTK("%s: net interface change\n", __FUNCTION__);
-+                      clear_bit(NET_ACCEL_MSG_AFLAGS_NETUPDOWN_B,
-+                                (unsigned long *)&vnic->shared_page->aflags);
-+                      if (vnic->shared_page->net_dev_up)
-+                              netfront_accel_interface_up(vnic);
-+                      else
-+                              netfront_accel_interface_down(vnic);
-+              }
-+      }
-+
-+      /* Pull msg out of shared memory */
-+      while ((err = net_accel_msg_recv(vnic->shared_page, &vnic->from_dom0,
-+                                       &msg)) == 0) {
-+              err = vnic_process_rx_msg(vnic, &msg);
-+              
-+              if (err != 0)
-+                      goto done;
-+      }
-+
-+      /*
-+       * Send any pending buffer map request messages that we can,
-+       * and mark domU->dom0 as full if necessary.  
-+       */
-+      if (vnic->msg_state == NETFRONT_ACCEL_MSG_HW &&
-+          vnic->bufpages.page_reqs < vnic->bufpages.max_pages) {
-+              if (vnic_send_buffer_requests(vnic, &vnic->bufpages) == -ENOSPC)
-+                      vnic_set_queue_full(vnic);
-+      }
-+
-+      /* 
-+       * If there are no messages then this is not an error.  It
-+       * just means that we've finished processing the queue.
-+       */
-+      if (err == -ENOENT)
-+              err = 0;
-+ done:
-+      /* We will now have made space in the dom0->domU queue if we can */
-+      if (queue_was_full)
-+              vnic_set_queue_not_full(vnic);
-+
-+      if (err != 0) {
-+              EPRINTK("%s returned %d\n", __FUNCTION__, err);
-+              netfront_accel_set_closing(vnic);
-+      }
-+
-+ unlock_out:
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      return;
-+}
-+
-+
-+irqreturn_t netfront_accel_msg_channel_irq_from_bend(int irq, void *context, 
-+                                               struct pt_regs *unused)
-+{
-+      netfront_accel_vnic *vnic = (netfront_accel_vnic *)context;
-+      VPRINTK("irq %d from device %s\n", irq, vnic->dev->nodename);
-+
-+      queue_work(netfront_accel_workqueue, &vnic->msg_from_bend);
-+
-+      return IRQ_HANDLED;
-+}
-+
-+/* Process an interrupt received from the NIC via backend */
-+irqreturn_t netfront_accel_net_channel_irq_from_bend(int irq, void *context, 
-+                                                   struct pt_regs *unused)
-+{
-+      netfront_accel_vnic *vnic = (netfront_accel_vnic *)context;
-+      struct net_device *net_dev = vnic->net_dev;
-+      unsigned long flags;
-+
-+      VPRINTK("net irq %d from device %s\n", irq, vnic->dev->nodename);
-+      
-+      NETFRONT_ACCEL_STATS_OP(vnic->stats.irq_count++);
-+
-+      BUG_ON(net_dev==NULL);
-+
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
-+      if (vnic->irq_enabled) {
-+              netfront_accel_disable_net_interrupts(vnic);
-+              vnic->irq_enabled = 0;
-+              spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+
-+#if NETFRONT_ACCEL_STATS
-+              vnic->stats.poll_schedule_count++;
-+              if (vnic->stats.event_count_since_irq >
-+                  vnic->stats.events_per_irq_max)
-+                      vnic->stats.events_per_irq_max = 
-+                              vnic->stats.event_count_since_irq;
-+              vnic->stats.event_count_since_irq = 0;
-+#endif
-+              netif_rx_schedule(net_dev);
-+      }
-+      else {
-+              spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.useless_irq_count++);
-+              DPRINTK("%s: irq when disabled\n", __FUNCTION__);
-+      }
-+      
-+      return IRQ_HANDLED;
-+}
-+
-+
-+void netfront_accel_msg_tx_fastpath(netfront_accel_vnic *vnic, const void *mac,
-+                                  u32 ip, u16 port, u8 protocol)
-+{
-+      unsigned long lock_state;
-+      struct net_accel_msg *msg;
-+
-+      msg = net_accel_msg_start_send(vnic->shared_page, &vnic->to_dom0,
-+                                     &lock_state);
-+
-+      if (msg == NULL)
-+              return;
-+
-+      net_accel_msg_init(msg, NET_ACCEL_MSG_FASTPATH);
-+      msg->u.fastpath.flags = NET_ACCEL_MSG_REMOVE;
-+      memcpy(msg->u.fastpath.mac, mac, ETH_ALEN);
-+
-+      msg->u.fastpath.port = port;
-+      msg->u.fastpath.ip = ip;
-+      msg->u.fastpath.proto = protocol;
-+
-+      net_accel_msg_complete_send_notify(vnic->shared_page, &vnic->to_dom0, 
-+                                         &lock_state, vnic->msg_channel_irq);
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_netfront.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_netfront.c  2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,319 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/skbuff.h>
-+#include <linux/netdevice.h>
-+
-+/* drivers/xen/netfront/netfront.h */
-+#include "netfront.h"
-+
-+#include "accel.h"
-+#include "accel_bufs.h"
-+#include "accel_util.h"
-+#include "accel_msg_iface.h"
-+#include "accel_ssr.h"
-+ 
-+#ifdef EFX_GCOV
-+#include "gcov.h"
-+#endif
-+
-+#define NETFRONT_ACCEL_VNIC_FROM_NETDEV(_nd)                          \
-+      ((netfront_accel_vnic *)((struct netfront_info *)netdev_priv(net_dev))->accel_priv)
-+
-+static int netfront_accel_netdev_start_xmit(struct sk_buff *skb,
-+                                          struct net_device *net_dev)
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+      struct netfront_info *np = 
-+              (struct netfront_info *)netdev_priv(net_dev);
-+      int handled, rc;
-+      unsigned long flags1, flags2;
-+
-+      BUG_ON(vnic == NULL);
-+
-+      /* Take our tx lock and hold for the duration */
-+      spin_lock_irqsave(&vnic->tx_lock, flags1);
-+
-+      if (!vnic->tx_enabled) {
-+              rc = 0;
-+              goto unlock_out;
-+      }
-+
-+      handled = netfront_accel_vi_tx_post(vnic, skb);
-+      if (handled == NETFRONT_ACCEL_STATUS_BUSY) {
-+              BUG_ON(vnic->net_dev != net_dev);
-+              DPRINTK("%s stopping queue\n", __FUNCTION__);
-+
-+              /* Netfront's lock protects tx_skb */
-+              spin_lock_irqsave(&np->tx_lock, flags2);
-+              BUG_ON(vnic->tx_skb != NULL);
-+              vnic->tx_skb = skb;
-+              netif_stop_queue(net_dev);
-+              spin_unlock_irqrestore(&np->tx_lock, flags2);
-+
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.queue_stops++);
-+      }
-+
-+      if (handled == NETFRONT_ACCEL_STATUS_CANT)
-+              rc = 0;
-+      else
-+              rc = 1;
-+
-+unlock_out:
-+      spin_unlock_irqrestore(&vnic->tx_lock, flags1);
-+
-+      return rc;
-+}
-+
-+
-+static int netfront_accel_netdev_poll(struct net_device *net_dev, int *budget)
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+      int rx_allowed = *budget, rx_done;
-+      
-+      BUG_ON(vnic == NULL);
-+
-+      /* Can check this without lock as modifier excludes polls */ 
-+      if (!vnic->poll_enabled)
-+              return 0;
-+
-+      rx_done = netfront_accel_vi_poll(vnic, rx_allowed);
-+      *budget -= rx_done;
-+      
-+      NETFRONT_ACCEL_STATS_OP(vnic->stats.poll_call_count++);
-+
-+      VPRINTK("%s: done %d allowed %d\n",
-+              __FUNCTION__, rx_done, rx_allowed);
-+
-+      netfront_accel_ssr_end_of_burst(vnic, &vnic->ssr_state);
-+
-+      if (rx_done < rx_allowed) {
-+               return 0; /* Done */
-+      }
-+      
-+      NETFRONT_ACCEL_STATS_OP(vnic->stats.poll_reschedule_count++);
-+
-+      return 1; /* More to do. */
-+}
-+
-+
-+/*
-+ * Process request from netfront to start napi interrupt
-+ * mode. (i.e. enable interrupts as it's finished polling)
-+ */
-+static int netfront_accel_start_napi_interrupts(struct net_device *net_dev) 
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+      unsigned long flags;
-+
-+      BUG_ON(vnic == NULL);
-+      
-+      /*
-+       * Can check this without lock as writer excludes poll before
-+       * modifying
-+       */
-+      if (!vnic->poll_enabled)
-+              return 0;
-+
-+      if (!netfront_accel_vi_enable_interrupts(vnic)) {
-+              /* 
-+               * There was something there, tell caller we had
-+               * something to do.
-+               */
-+              return 1;
-+      }
-+
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
-+      vnic->irq_enabled = 1;
-+      netfront_accel_enable_net_interrupts(vnic);
-+      spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+
-+      return 0;
-+}
-+
-+
-+/*
-+ * Process request from netfront to stop napi interrupt
-+ * mode. (i.e. disable interrupts as it's starting to poll 
-+ */
-+static void netfront_accel_stop_napi_interrupts(struct net_device *net_dev) 
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+      unsigned long flags;
-+
-+      BUG_ON(vnic == NULL);
-+
-+      spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
-+
-+      if (!vnic->poll_enabled) {
-+              spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+              return;
-+      }
-+
-+      netfront_accel_disable_net_interrupts(vnic);
-+      vnic->irq_enabled = 0;
-+      spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
-+}
-+
-+
-+static int netfront_accel_check_ready(struct net_device *net_dev)
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+
-+      BUG_ON(vnic == NULL);
-+
-+      /* This is protected by netfront's lock */ 
-+      return vnic->tx_skb == NULL;
-+}
-+
-+
-+static int netfront_accel_get_stats(struct net_device *net_dev,
-+                                  struct net_device_stats *stats)
-+{
-+      netfront_accel_vnic *vnic = NETFRONT_ACCEL_VNIC_FROM_NETDEV(net_dev);
-+      struct netfront_accel_netdev_stats now;
-+
-+      BUG_ON(vnic == NULL);
-+
-+      now.fastpath_rx_pkts   = vnic->netdev_stats.fastpath_rx_pkts;
-+      now.fastpath_rx_bytes  = vnic->netdev_stats.fastpath_rx_bytes;
-+      now.fastpath_rx_errors = vnic->netdev_stats.fastpath_rx_errors;
-+      now.fastpath_tx_pkts   = vnic->netdev_stats.fastpath_tx_pkts;
-+      now.fastpath_tx_bytes  = vnic->netdev_stats.fastpath_tx_bytes;
-+      now.fastpath_tx_errors = vnic->netdev_stats.fastpath_tx_errors;
-+      
-+      stats->rx_packets += (now.fastpath_rx_pkts - 
-+                            vnic->stats_last_read.fastpath_rx_pkts);
-+      stats->rx_bytes   += (now.fastpath_rx_bytes -
-+                            vnic->stats_last_read.fastpath_rx_bytes);
-+      stats->rx_errors  += (now.fastpath_rx_errors - 
-+                            vnic->stats_last_read.fastpath_rx_errors);
-+      stats->tx_packets += (now.fastpath_tx_pkts - 
-+                            vnic->stats_last_read.fastpath_tx_pkts);
-+      stats->tx_bytes   += (now.fastpath_tx_bytes - 
-+                            vnic->stats_last_read.fastpath_tx_bytes);
-+      stats->tx_errors  += (now.fastpath_tx_errors - 
-+                            vnic->stats_last_read.fastpath_tx_errors);
-+      
-+      vnic->stats_last_read = now;
-+
-+      return 0;
-+}
-+
-+
-+struct netfront_accel_hooks accel_hooks = {
-+      .new_device         = &netfront_accel_probe,
-+      .remove         = &netfront_accel_remove,
-+      .netdev_poll       = &netfront_accel_netdev_poll,
-+      .start_xmit         = &netfront_accel_netdev_start_xmit,
-+      .start_napi_irq = &netfront_accel_start_napi_interrupts,
-+      .stop_napi_irq   = &netfront_accel_stop_napi_interrupts,
-+      .check_ready       = &netfront_accel_check_ready,
-+      .get_stats           = &netfront_accel_get_stats
-+};
-+
-+
-+unsigned sfc_netfront_max_pages = NETFRONT_ACCEL_DEFAULT_BUF_PAGES;
-+module_param_named (max_pages, sfc_netfront_max_pages, uint, 0644);
-+MODULE_PARM_DESC(max_pages, "Number of buffer pages to request");
-+
-+unsigned sfc_netfront_buffer_split = 2;
-+module_param_named (buffer_split, sfc_netfront_buffer_split, uint, 0644);
-+MODULE_PARM_DESC(buffer_split, 
-+               "Fraction of buffers to use for TX, rest for RX");
-+
-+
-+const char *frontend_name = "sfc_netfront";
-+
-+struct workqueue_struct *netfront_accel_workqueue;
-+
-+static int __init netfront_accel_init(void)
-+{
-+      int rc;
-+#ifdef EFX_GCOV       
-+      gcov_provider_init(THIS_MODULE);
-+#endif
-+
-+      /*
-+       * If we're running on dom0, netfront hasn't initialised
-+       * itself, so we need to keep away
-+       */
-+      if (is_initial_xendomain())
-+              return 0;
-+
-+      if (!is_pow2(sizeof(struct net_accel_msg)))
-+              EPRINTK("%s: bad structure size\n", __FUNCTION__);
-+
-+      netfront_accel_workqueue = create_workqueue(frontend_name);
-+
-+      netfront_accel_debugfs_init();
-+
-+      rc = netfront_accelerator_loaded(NETFRONT_ACCEL_VERSION,
-+                                       frontend_name, &accel_hooks);
-+
-+      if (rc < 0) {
-+              EPRINTK("Xen netfront accelerator version mismatch\n");
-+              return -EINVAL;
-+      }
-+
-+      if (rc > 0) {
-+              /* 
-+               * In future may want to add backwards compatibility
-+               * and accept certain subsets of previous versions
-+               */
-+              EPRINTK("Xen netfront accelerator version mismatch\n");
-+              return -EINVAL;
-+      }
-+
-+      return 0;
-+}
-+module_init(netfront_accel_init);
-+
-+static void __exit netfront_accel_exit(void)
-+{
-+      if (is_initial_xendomain())
-+              return;
-+
-+      DPRINTK("%s: unhooking\n", __FUNCTION__);
-+
-+      /* Unhook from normal netfront */
-+      netfront_accelerator_stop(frontend_name);
-+
-+      DPRINTK("%s: done\n", __FUNCTION__);
-+
-+      netfront_accel_debugfs_fini();
-+
-+      flush_workqueue(netfront_accel_workqueue);
-+
-+      destroy_workqueue(netfront_accel_workqueue);
-+
-+#ifdef EFX_GCOV
-+      gcov_provider_fini(THIS_MODULE);
-+#endif
-+      return;
-+}
-+module_exit(netfront_accel_exit);
-+
-+MODULE_LICENSE("GPL");
-+
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_ssr.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_ssr.c       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,308 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/socket.h>
-+#include <linux/in.h>
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/list.h>
-+#include <net/ip.h>
-+#include <net/checksum.h>
-+
-+#include "accel.h"
-+#include "accel_util.h"
-+#include "accel_bufs.h"
-+
-+#include "accel_ssr.h"
-+
-+static inline int list_valid(struct list_head *lh) {
-+      return(lh->next != NULL);
-+}
-+
-+static void netfront_accel_ssr_deliver (struct netfront_accel_vnic *vnic,
-+                                      struct netfront_accel_ssr_state *st,
-+                                      struct netfront_accel_ssr_conn *c);
-+
-+/** Construct an efx_ssr_state.
-+ *
-+ * @v st     The SSR state (per channel per port)
-+ * @v port   The port.
-+ */
-+void netfront_accel_ssr_init(struct netfront_accel_ssr_state *st) {
-+      unsigned i;
-+
-+      INIT_LIST_HEAD(&st->conns);
-+      INIT_LIST_HEAD(&st->free_conns);
-+      for (i = 0; i < 8; ++i) {
-+              struct netfront_accel_ssr_conn *c = 
-+                      kmalloc(sizeof(*c), GFP_KERNEL);
-+              if (c == NULL)  break;
-+              c->n_in_order_pkts = 0;
-+              c->skb = NULL;
-+              list_add(&c->link, &st->free_conns);
-+      }
-+
-+}
-+
-+
-+/** Destructor for an efx_ssr_state.
-+ *
-+ * @v st     The SSR state (per channel per port)
-+ */
-+void netfront_accel_ssr_fini(netfront_accel_vnic *vnic, 
-+                           struct netfront_accel_ssr_state *st) {
-+      struct netfront_accel_ssr_conn *c;
-+
-+      /* Return cleanly if efx_ssr_init() not previously called */
-+      BUG_ON(list_valid(&st->conns) != list_valid(&st->free_conns));
-+      if (! list_valid(&st->conns))
-+              return;
-+
-+      while ( ! list_empty(&st->free_conns)) {
-+              c = list_entry(st->free_conns.prev, 
-+                             struct netfront_accel_ssr_conn, link);
-+              list_del(&c->link);
-+              BUG_ON(c->skb != NULL);
-+              kfree(c);
-+      }
-+      while ( ! list_empty(&st->conns)) {
-+              c = list_entry(st->conns.prev, 
-+                             struct netfront_accel_ssr_conn, link);
-+              list_del(&c->link);
-+              if (c->skb)
-+                      netfront_accel_ssr_deliver(vnic, st, c);
-+              kfree(c);
-+      }
-+}
-+
-+
-+/** Calc IP checksum and deliver to the OS
-+ *
-+ * @v st     The SSR state (per channel per port)
-+ * @v c            The SSR connection state
-+ */
-+static void netfront_accel_ssr_deliver(netfront_accel_vnic *vnic,
-+                                     struct netfront_accel_ssr_state *st,
-+                                     struct netfront_accel_ssr_conn *c) {
-+      BUG_ON(c->skb == NULL);
-+
-+      /*
-+       * If we've chained packets together, recalculate the IP
-+       * checksum.
-+       */
-+      if (skb_shinfo(c->skb)->frag_list) {
-+              NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_bursts);
-+              c->iph->check = 0;
-+              c->iph->check = ip_fast_csum((unsigned char *) c->iph, 
-+                                           c->iph->ihl);
-+      }
-+
-+      VPRINTK("%s: %d\n", __FUNCTION__, c->skb->len);
-+
-+      netif_receive_skb(c->skb); 
-+      c->skb = NULL;
-+}
-+
-+
-+/** Push held skbs down into network stack.
-+ *
-+ * @v st       SSR state
-+ *
-+ * Only called if we are tracking one or more connections.
-+ */
-+void __netfront_accel_ssr_end_of_burst(netfront_accel_vnic *vnic, 
-+                                     struct netfront_accel_ssr_state *st) {
-+      struct netfront_accel_ssr_conn *c;
-+
-+      BUG_ON(list_empty(&st->conns));
-+
-+      list_for_each_entry(c, &st->conns, link)
-+              if (c->skb)
-+                      netfront_accel_ssr_deliver(vnic, st, c);
-+
-+      /* Time-out connections that have received no traffic for 20ms. */
-+      c = list_entry(st->conns.prev, struct netfront_accel_ssr_conn,
-+                     link);
-+      if (jiffies - c->last_pkt_jiffies > (HZ / 50 + 1)) {
-+              NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_drop_stream);
-+              list_del(&c->link);
-+              list_add(&c->link, &st->free_conns);
-+      }
-+}
-+
-+
-+/** Process SKB and decide whether to dispatch it to the stack now or
-+ * later.
-+ *
-+ * @v st       SSR state
-+ * @v skb     SKB to exmaine
-+ * @ret rc       0 => deliver SKB to kernel now, otherwise the SKB belongs
-+ *           us.
-+ */
-+int netfront_accel_ssr_skb(struct netfront_accel_vnic *vnic,
-+                         struct netfront_accel_ssr_state *st,
-+                         struct sk_buff *skb) {
-+      int data_length, dont_merge;
-+      struct netfront_accel_ssr_conn *c;
-+      struct iphdr *iph;
-+      struct tcphdr *th;
-+      unsigned th_seq;
-+
-+      BUG_ON(skb_shinfo(skb)->frag_list != NULL);
-+      BUG_ON(skb->next != NULL);
-+
-+      /* We're not interested if it isn't TCP over IPv4. */
-+      iph = (struct iphdr *) skb->data;
-+      if (skb->protocol != htons(ETH_P_IP) ||
-+          iph->protocol != IPPROTO_TCP) {
-+              return 0;
-+      }
-+
-+      /* Ignore segments that fail csum or are fragmented. */
-+      if (unlikely((skb->ip_summed - CHECKSUM_UNNECESSARY) |
-+                   (iph->frag_off & htons(IP_MF | IP_OFFSET)))) {
-+              return 0;
-+      }
-+
-+      th = (struct tcphdr*)(skb->data + iph->ihl * 4);
-+      data_length = ntohs(iph->tot_len) - iph->ihl * 4 - th->doff * 4;
-+      th_seq = ntohl(th->seq);
-+      dont_merge = (data_length == 0) | th->urg | th->syn | th->rst;
-+
-+      list_for_each_entry(c, &st->conns, link) {
-+              if ((c->saddr  - iph->saddr) |
-+                  (c->daddr  - iph->daddr) |
-+                  (c->source - th->source) |
-+                  (c->dest   - th->dest  ))
-+                      continue;
-+
-+              /* Re-insert at head of list to reduce lookup time. */
-+              list_del(&c->link);
-+              list_add(&c->link, &st->conns);
-+              c->last_pkt_jiffies = jiffies;
-+
-+              if (unlikely(th_seq - c->next_seq)) {
-+                      /* Out-of-order, so start counting again. */
-+                      if (c->skb)
-+                              netfront_accel_ssr_deliver(vnic, st, c);
-+                      c->n_in_order_pkts = 0;
-+                      c->next_seq = th_seq + data_length;
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_misorder);
-+                      return 0;
-+              }
-+              c->next_seq = th_seq + data_length;
-+
-+              if (++c->n_in_order_pkts < 300) {
-+                      /* May be in slow-start, so don't merge. */
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_slow_start);
-+                      return 0;
-+              }
-+
-+              if (unlikely(dont_merge)) {
-+                      if (c->skb)
-+                              netfront_accel_ssr_deliver(vnic, st, c);
-+                      return 0;
-+              }
-+
-+              if (c->skb) {
-+                      c->iph->tot_len = ntohs(c->iph->tot_len);
-+                      c->iph->tot_len += data_length;
-+                      c->iph->tot_len = htons(c->iph->tot_len);
-+                      c->th->ack_seq = th->ack_seq;
-+                      c->th->fin |= th->fin;
-+                      c->th->psh |= th->psh;
-+                      c->th->window = th->window;
-+
-+                      /* Remove the headers from this skb. */
-+                      skb_pull(skb, skb->len - data_length);
-+
-+                      /*
-+                       * Tack the new skb onto the head skb's frag_list.
-+                       * This is exactly the format that fragmented IP
-+                       * datagrams are reassembled into.
-+                       */
-+                      BUG_ON(skb->next != 0);
-+                      if ( ! skb_shinfo(c->skb)->frag_list)
-+                              skb_shinfo(c->skb)->frag_list = skb;
-+                      else
-+                              c->skb_tail->next = skb;
-+                      c->skb_tail = skb;
-+                      c->skb->len += skb->len;
-+                      c->skb->data_len += skb->len;
-+                      c->skb->truesize += skb->truesize;
-+
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_merges);
-+
-+                      /*
-+                       * If the next packet might push this super-packet
-+                       * over the limit for an IP packet, deliver it now.
-+                       * This is slightly conservative, but close enough.
-+                       */
-+                      if (c->skb->len + 
-+                          (PAGE_SIZE / NETFRONT_ACCEL_BUFS_PER_PAGE)
-+                          > 16384)
-+                              netfront_accel_ssr_deliver(vnic, st, c);
-+
-+                      return 1;
-+              }
-+              else {
-+                      c->iph = iph;
-+                      c->th = th;
-+                      c->skb = skb;
-+                      return 1;
-+              }
-+      }
-+
-+      /* We're not yet tracking this connection. */
-+
-+      if (dont_merge) {
-+              return 0;
-+      }
-+
-+      if (list_empty(&st->free_conns)) {
-+              c = list_entry(st->conns.prev, 
-+                             struct netfront_accel_ssr_conn,
-+                             link);
-+              if (c->skb) {
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_too_many);
-+                      return 0;
-+              }
-+      }
-+      else {
-+              c = list_entry(st->free_conns.next,
-+                             struct netfront_accel_ssr_conn,
-+                             link);
-+      }
-+      list_del(&c->link);
-+      list_add(&c->link, &st->conns);
-+      c->saddr = iph->saddr;
-+      c->daddr = iph->daddr;
-+      c->source = th->source;
-+      c->dest = th->dest;
-+      c->next_seq = th_seq + data_length;
-+      c->n_in_order_pkts = 0;
-+      BUG_ON(c->skb != NULL);
-+      NETFRONT_ACCEL_STATS_OP(++vnic->stats.ssr_new_stream);
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_ssr.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_ssr.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,88 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETFRONT_ACCEL_SSR_H
-+#define NETFRONT_ACCEL_SSR_H
-+
-+#include <linux/skbuff.h>
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/list.h>
-+
-+#include "accel.h"
-+
-+/** State for Soft Segment Reassembly (SSR). */
-+
-+struct netfront_accel_ssr_conn {
-+      struct list_head link;
-+
-+      unsigned saddr, daddr;
-+      unsigned short source, dest;
-+
-+      /** Number of in-order packets we've seen with payload. */
-+      unsigned n_in_order_pkts;
-+
-+      /** Next in-order sequence number. */
-+      unsigned next_seq;
-+
-+      /** Time we last saw a packet on this connection. */
-+      unsigned long last_pkt_jiffies;
-+
-+      /** The SKB we are currently holding.  If NULL, then all following
-+       * fields are undefined.
-+       */
-+      struct sk_buff *skb;
-+
-+      /** The tail of the frag_list of SKBs we're holding.  Only valid
-+       * after at least one merge.
-+       */
-+      struct sk_buff *skb_tail;
-+
-+      /** The IP header of the skb we are holding. */
-+      struct iphdr *iph;
-+      
-+      /** The TCP header of the skb we are holding. */
-+      struct tcphdr *th;
-+};
-+
-+extern void netfront_accel_ssr_init(struct netfront_accel_ssr_state *st);
-+extern void netfront_accel_ssr_fini(netfront_accel_vnic *vnic,
-+                                  struct netfront_accel_ssr_state *st);
-+
-+extern void
-+__netfront_accel_ssr_end_of_burst(netfront_accel_vnic *vnic,
-+                                struct netfront_accel_ssr_state *st);
-+
-+extern int  netfront_accel_ssr_skb(netfront_accel_vnic *vnic,
-+                                 struct netfront_accel_ssr_state *st,
-+                                 struct sk_buff *skb);
-+
-+static inline void
-+netfront_accel_ssr_end_of_burst (netfront_accel_vnic *vnic,
-+                               struct netfront_accel_ssr_state *st) {
-+      if ( ! list_empty(&st->conns) )
-+              __netfront_accel_ssr_end_of_burst(vnic, st);
-+}
-+
-+#endif /* NETFRONT_ACCEL_SSR_H */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_tso.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_tso.c       2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,511 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/pci.h>
-+#include <linux/tcp.h>
-+#include <linux/ip.h>
-+#include <linux/in.h>
-+#include <linux/if_ether.h>
-+
-+#include "accel.h"
-+#include "accel_util.h"
-+
-+#include "accel_tso.h"
-+
-+#define PTR_DIFF(p1, p2)  ((u8*)(p1) - (u8*)(p2))
-+#define ETH_HDR_LEN(skb)  ((skb)->nh.raw - (skb)->data)
-+#define SKB_TCP_OFF(skb)  PTR_DIFF ((skb)->h.th, (skb)->data)
-+#define SKB_IP_OFF(skb)   PTR_DIFF ((skb)->nh.iph, (skb)->data)
-+
-+/*
-+ * Set a maximum number of buffers in each output packet to make life
-+ * a little simpler - if this is reached it will just move on to
-+ * another packet 
-+ */
-+#define ACCEL_TSO_MAX_BUFFERS (6)
-+
-+/** TSO State.
-+ *
-+ * The state used during segmentation.  It is put into this data structure
-+ * just to make it easy to pass into inline functions.
-+ */
-+struct netfront_accel_tso_state {
-+      /** bytes of data we've yet to segment */
-+      unsigned remaining_len;
-+
-+      /** current sequence number */
-+      unsigned seqnum;
-+
-+      /** remaining space in current packet */
-+      unsigned packet_space;
-+
-+      /** List of packets to be output, containing the buffers and
-+       *  iovecs to describe each packet 
-+       */
-+      struct netfront_accel_tso_output_packet *output_packets;
-+
-+      /** Total number of buffers in output_packets */
-+      unsigned buffers;
-+
-+      /** Total number of packets in output_packets */
-+      unsigned packets;
-+
-+      /** Input Fragment Cursor.
-+       *
-+       * Where we are in the current fragment of the incoming SKB.  These
-+       * values get updated in place when we split a fragment over
-+       * multiple packets.
-+       */
-+      struct {
-+              /** address of current position */
-+              void *addr;
-+              /** remaining length */   
-+              unsigned int len;
-+      } ifc; /*  == ifc Input Fragment Cursor */
-+
-+      /** Parameters.
-+       *
-+       * These values are set once at the start of the TSO send and do
-+       * not get changed as the routine progresses.
-+       */
-+      struct {
-+              /* the number of bytes of header */
-+              unsigned int header_length;
-+
-+              /* The number of bytes to put in each outgoing segment. */
-+              int full_packet_size;
-+              
-+              /* Current IP ID, host endian. */
-+              unsigned ip_id;
-+
-+              /* Max size of each output packet payload */
-+              int gso_size;
-+      } p;
-+};
-+
-+
-+/**
-+ * Verify that our various assumptions about sk_buffs and the conditions
-+ * under which TSO will be attempted hold true.
-+ *
-+ * @v skb            The sk_buff to check.
-+ */
-+static inline void tso_check_safe(struct sk_buff *skb) {
-+      EPRINTK_ON(skb->protocol != htons (ETH_P_IP));
-+      EPRINTK_ON(((struct ethhdr*) skb->data)->h_proto != htons (ETH_P_IP));
-+      EPRINTK_ON(skb->nh.iph->protocol != IPPROTO_TCP);
-+      EPRINTK_ON((SKB_TCP_OFF(skb)
-+                  + (skb->h.th->doff << 2u)) > skb_headlen(skb));
-+}
-+
-+
-+
-+/** Parse the SKB header and initialise state. */
-+static inline void tso_start(struct netfront_accel_tso_state *st, 
-+                           struct sk_buff *skb) {
-+
-+      /*
-+       * All ethernet/IP/TCP headers combined size is TCP header size
-+       * plus offset of TCP header relative to start of packet.
-+       */
-+      st->p.header_length = (skb->h.th->doff << 2u) + SKB_TCP_OFF(skb);
-+      st->p.full_packet_size = (st->p.header_length
-+                                + skb_shinfo(skb)->gso_size);
-+      st->p.gso_size = skb_shinfo(skb)->gso_size;
-+
-+      st->p.ip_id = htons(skb->nh.iph->id);
-+      st->seqnum = ntohl(skb->h.th->seq);
-+
-+      EPRINTK_ON(skb->h.th->urg);
-+      EPRINTK_ON(skb->h.th->syn);
-+      EPRINTK_ON(skb->h.th->rst);
-+
-+      st->remaining_len = skb->len - st->p.header_length;
-+
-+      st->output_packets = NULL;
-+      st->buffers = 0;
-+      st->packets = 0;
-+
-+      VPRINTK("Starting new TSO: hl %d ps %d gso %d seq %x len %d\n",
-+              st->p.header_length, st->p.full_packet_size, st->p.gso_size,
-+              st->seqnum, skb->len);
-+}
-+
-+/**
-+ * Add another NIC mapped buffer onto an output packet  
-+ */ 
-+static inline int tso_start_new_buffer(netfront_accel_vnic *vnic,
-+                                     struct netfront_accel_tso_state *st,
-+                                     int first)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct netfront_accel_pkt_desc *buf;
-+
-+      /* Get a mapped packet buffer */
-+      buf = netfront_accel_buf_get(vnic->tx_bufs);
-+      if (buf == NULL) {
-+              DPRINTK("%s: No buffer for TX\n", __FUNCTION__);
-+              return -1;
-+      }
-+
-+      /* Store a bit of meta-data at the end */
-+      tso_buf =(struct netfront_accel_tso_buffer *)
-+              (buf->pkt_kva + NETFRONT_ACCEL_TSO_BUF_LENGTH
-+               + sizeof(struct netfront_accel_tso_output_packet));
-+
-+      tso_buf->buf = buf;
-+
-+      tso_buf->length = 0;
-+      
-+      if (first) {
-+              struct netfront_accel_tso_output_packet *output_packet 
-+                      = (struct netfront_accel_tso_output_packet *)
-+                      (buf->pkt_kva + NETFRONT_ACCEL_TSO_BUF_LENGTH);
-+              output_packet->next = st->output_packets;
-+              st->output_packets = output_packet;
-+              tso_buf->next = NULL;
-+              st->output_packets->tso_bufs = tso_buf;
-+              st->output_packets->tso_bufs_len = 1;
-+      } else {
-+              tso_buf->next = st->output_packets->tso_bufs;
-+              st->output_packets->tso_bufs = tso_buf;
-+              st->output_packets->tso_bufs_len ++;
-+      }
-+
-+      BUG_ON(st->output_packets->tso_bufs_len > ACCEL_TSO_MAX_BUFFERS);
-+      
-+      st->buffers ++;
-+
-+      /*
-+       * Store the context, set to NULL, last packet buffer will get
-+       * non-NULL later
-+       */
-+      tso_buf->buf->skb = NULL;
-+
-+      return 0;
-+}
-+
-+
-+/* Generate a new header, and prepare for the new packet.
-+ *
-+ * @v vnic          VNIC
-+ * @v skb            Socket buffer
-+ * @v st              TSO state
-+ * @ret rc          0 on success, or -1 if failed to alloc header
-+ */
-+
-+static inline 
-+int tso_start_new_packet(netfront_accel_vnic *vnic,
-+                       struct sk_buff *skb,
-+                       struct netfront_accel_tso_state *st) 
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct iphdr *tsoh_iph;
-+      struct tcphdr *tsoh_th;
-+      unsigned ip_length;
-+
-+      if (tso_start_new_buffer(vnic, st, 1) < 0) {
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_busy++);
-+              return -1;              
-+      }
-+
-+      /* This has been set up by tso_start_new_buffer() */
-+      tso_buf = st->output_packets->tso_bufs;
-+
-+      /* Copy in the header */
-+      memcpy(tso_buf->buf->pkt_kva, skb->data, st->p.header_length);
-+      tso_buf->length = st->p.header_length;
-+
-+      tsoh_th = (struct tcphdr*) 
-+              (tso_buf->buf->pkt_kva + SKB_TCP_OFF(skb));
-+      tsoh_iph = (struct iphdr*) 
-+              (tso_buf->buf->pkt_kva + SKB_IP_OFF(skb));
-+
-+      /* Set to zero to encourage falcon to fill these in */
-+      tsoh_th->check  = 0;
-+      tsoh_iph->check = 0;
-+
-+      tsoh_th->seq = htonl(st->seqnum);
-+      st->seqnum += st->p.gso_size;
-+
-+      if (st->remaining_len > st->p.gso_size) {
-+              /* This packet will not finish the TSO burst. */
-+              ip_length = st->p.full_packet_size - ETH_HDR_LEN(skb);
-+              tsoh_th->fin = 0;
-+              tsoh_th->psh = 0;
-+      } else {
-+              /* This packet will be the last in the TSO burst. */
-+              ip_length = (st->p.header_length - ETH_HDR_LEN(skb)
-+                           + st->remaining_len);
-+              tsoh_th->fin = skb->h.th->fin;
-+              tsoh_th->psh = skb->h.th->psh;
-+      }
-+
-+      tsoh_iph->tot_len = htons(ip_length);
-+
-+      /* Linux leaves suitable gaps in the IP ID space for us to fill. */
-+      tsoh_iph->id = st->p.ip_id++;
-+      tsoh_iph->id = htons(tsoh_iph->id);
-+
-+      st->packet_space = st->p.gso_size; 
-+
-+      st->packets++;
-+
-+      return 0;
-+}
-+
-+
-+
-+static inline void tso_get_fragment(struct netfront_accel_tso_state *st, 
-+                                  int len, void *addr)
-+{
-+      st->ifc.len = len;
-+      st->ifc.addr = addr;
-+      return;
-+}
-+
-+
-+static inline void tso_unwind(netfront_accel_vnic *vnic, 
-+                            struct netfront_accel_tso_state *st)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct netfront_accel_tso_output_packet *output_packet;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+
-+      while (st->output_packets != NULL) {
-+              output_packet = st->output_packets;
-+              st->output_packets = output_packet->next;
-+              while (output_packet->tso_bufs != NULL) {
-+                      tso_buf = output_packet->tso_bufs;
-+                      output_packet->tso_bufs = tso_buf->next;
-+
-+                      st->buffers --;
-+                      output_packet->tso_bufs_len --;
-+
-+                      netfront_accel_buf_put(vnic->tx_bufs, 
-+                                             tso_buf->buf->buf_id);
-+              }
-+      }
-+      BUG_ON(st->buffers != 0);
-+}
-+
-+
-+
-+static inline
-+void tso_fill_packet_with_fragment(netfront_accel_vnic *vnic,
-+                                 struct netfront_accel_tso_state *st) 
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      int n, space;
-+
-+      BUG_ON(st->output_packets == NULL);
-+      BUG_ON(st->output_packets->tso_bufs == NULL);
-+
-+      tso_buf = st->output_packets->tso_bufs;
-+
-+      if (st->ifc.len == 0)  return;
-+      if (st->packet_space == 0)  return;
-+      if (tso_buf->length == NETFRONT_ACCEL_TSO_BUF_LENGTH) return;
-+
-+      n = min(st->ifc.len, st->packet_space);
-+
-+      space = NETFRONT_ACCEL_TSO_BUF_LENGTH - tso_buf->length;
-+      n = min(n, space);
-+
-+      st->packet_space -= n;
-+      st->remaining_len -= n;
-+      st->ifc.len -= n;
-+
-+      memcpy(tso_buf->buf->pkt_kva + tso_buf->length, st->ifc.addr, n);
-+
-+      tso_buf->length += n;
-+
-+      BUG_ON(tso_buf->length > NETFRONT_ACCEL_TSO_BUF_LENGTH);
-+
-+      st->ifc.addr += n;
-+
-+      return;
-+}
-+
-+
-+int netfront_accel_enqueue_skb_tso(netfront_accel_vnic *vnic,
-+                                 struct sk_buff *skb)
-+{
-+      struct netfront_accel_tso_state state;
-+      struct netfront_accel_tso_buffer *tso_buf = NULL;
-+      struct netfront_accel_tso_output_packet *reversed_list = NULL;
-+      struct netfront_accel_tso_output_packet *tmp_pkt;
-+      ef_iovec iovecs[ACCEL_TSO_MAX_BUFFERS];
-+      int frag_i, rc, dma_id;
-+      skb_frag_t *f;
-+
-+      tso_check_safe(skb);
-+
-+      if (skb->ip_summed != CHECKSUM_HW)
-+              EPRINTK("Trying to TSO send a packet without HW checksum\n");
-+
-+      tso_start(&state, skb);
-+
-+      /*
-+       * Setup the first payload fragment.  If the skb header area
-+       * contains exactly the headers and all payload is in the frag
-+       * list things are little simpler
-+       */
-+      if (skb_headlen(skb) == state.p.header_length) {
-+              /* Grab the first payload fragment. */
-+              BUG_ON(skb_shinfo(skb)->nr_frags < 1);
-+              frag_i = 0;
-+              f = &skb_shinfo(skb)->frags[frag_i];
-+              tso_get_fragment(&state, f->size, 
-+                               page_address(f->page) + f->page_offset);
-+      } else {
-+              int hl = state.p.header_length;
-+              tso_get_fragment(&state,  skb_headlen(skb) - hl, 
-+                               skb->data + hl);
-+              frag_i = -1;
-+      }
-+
-+      if (tso_start_new_packet(vnic, skb, &state) < 0) {
-+              DPRINTK("%s: out of first start-packet memory\n",
-+                      __FUNCTION__);
-+              goto unwind;
-+      }
-+
-+      while (1) {
-+              tso_fill_packet_with_fragment(vnic, &state);
-+              
-+              /* Move onto the next fragment? */
-+              if (state.ifc.len == 0) {
-+                      if (++frag_i >= skb_shinfo(skb)->nr_frags)
-+                              /* End of payload reached. */
-+                              break;
-+                      f = &skb_shinfo(skb)->frags[frag_i];
-+                      tso_get_fragment(&state, f->size,
-+                                       page_address(f->page) +
-+                                       f->page_offset);
-+              }
-+
-+              /* Start a new buffer? */
-+              if ((state.output_packets->tso_bufs->length == 
-+                   NETFRONT_ACCEL_TSO_BUF_LENGTH) &&
-+                  tso_start_new_buffer(vnic, &state, 0)) {
-+                      DPRINTK("%s: out of start-buffer memory\n",
-+                              __FUNCTION__);
-+                      goto unwind;
-+              }
-+
-+              /* Start at new packet? */
-+              if ((state.packet_space == 0 || 
-+                   ((state.output_packets->tso_bufs_len >=
-+                     ACCEL_TSO_MAX_BUFFERS) &&
-+                    (state.output_packets->tso_bufs->length >= 
-+                     NETFRONT_ACCEL_TSO_BUF_LENGTH))) &&
-+                  tso_start_new_packet(vnic, skb, &state) < 0) {
-+                      DPRINTK("%s: out of start-packet memory\n",
-+                              __FUNCTION__);
-+                      goto unwind;
-+              }
-+
-+      }
-+
-+      /* Check for space */
-+      if (ef_vi_transmit_space(&vnic->vi) < state.buffers) {
-+              DPRINTK("%s: Not enough TX space (%d)\n",
-+                      __FUNCTION__, state.buffers);
-+              goto unwind;
-+      }
-+
-+      /*
-+       * Store the skb context in the most recent buffer (i.e. the
-+       * last buffer that will be sent)
-+       */
-+      state.output_packets->tso_bufs->buf->skb = skb;
-+
-+      /* Reverse the list of packets as we construct it on a stack */
-+      while (state.output_packets != NULL) {
-+              tmp_pkt = state.output_packets;
-+              state.output_packets = tmp_pkt->next;
-+              tmp_pkt->next = reversed_list;
-+              reversed_list = tmp_pkt;
-+      }
-+
-+      /* Pass off to hardware */
-+      while (reversed_list != NULL) {
-+              tmp_pkt = reversed_list;
-+              reversed_list = tmp_pkt->next;
-+
-+              BUG_ON(tmp_pkt->tso_bufs_len > ACCEL_TSO_MAX_BUFFERS);
-+              BUG_ON(tmp_pkt->tso_bufs_len == 0);
-+
-+              dma_id = tmp_pkt->tso_bufs->buf->buf_id;
-+
-+              /*
-+               * Make an iovec of the buffers in the list, reversing
-+               * the buffers as we go as they are constructed on a
-+               * stack
-+               */
-+              tso_buf = tmp_pkt->tso_bufs;
-+              for (frag_i = tmp_pkt->tso_bufs_len - 1;
-+                   frag_i >= 0;
-+                   frag_i--) {
-+                      iovecs[frag_i].iov_base = tso_buf->buf->pkt_buff_addr;
-+                      iovecs[frag_i].iov_len = tso_buf->length;
-+                      tso_buf = tso_buf->next;
-+              }
-+
-+              rc = ef_vi_transmitv(&vnic->vi, iovecs, tmp_pkt->tso_bufs_len,
-+                                   dma_id);
-+              /*
-+               * We checked for space already, so it really should
-+               * succeed
-+               */
-+              BUG_ON(rc != 0);
-+      }
-+
-+      /* Track number of tx fastpath stats */
-+      vnic->netdev_stats.fastpath_tx_bytes += skb->len;
-+      vnic->netdev_stats.fastpath_tx_pkts += state.packets;
-+#if NETFRONT_ACCEL_STATS
-+      {
-+              unsigned n;
-+              n = vnic->netdev_stats.fastpath_tx_pkts -
-+                      vnic->stats.fastpath_tx_completions;
-+              if (n > vnic->stats.fastpath_tx_pending_max)
-+                      vnic->stats.fastpath_tx_pending_max = n;
-+      }
-+#endif
-+
-+      return NETFRONT_ACCEL_STATUS_GOOD;
-+ 
-+ unwind:
-+      tso_unwind(vnic, &state);
-+
-+      NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_busy++);
-+
-+      return NETFRONT_ACCEL_STATUS_BUSY;
-+}
-+
-+
-+
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_tso.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_tso.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,57 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETFRONT_ACCEL_TSO_H
-+#define NETFRONT_ACCEL_TSO_H
-+
-+#include "accel_bufs.h"
-+
-+/* Track the buffers used in each output packet */
-+struct netfront_accel_tso_buffer {
-+      struct netfront_accel_tso_buffer *next;
-+      struct netfront_accel_pkt_desc *buf;
-+      unsigned length;
-+};
-+
-+/* Track the output packets formed from each input packet */
-+struct netfront_accel_tso_output_packet {
-+      struct netfront_accel_tso_output_packet *next;
-+      struct netfront_accel_tso_buffer *tso_bufs;
-+      unsigned tso_bufs_len;
-+};
-+
-+
-+/*
-+ * Max available space in a buffer for data once meta-data has taken
-+ * its place 
-+ */
-+#define NETFRONT_ACCEL_TSO_BUF_LENGTH                                 \
-+      ((PAGE_SIZE / NETFRONT_ACCEL_BUFS_PER_PAGE)                     \
-+       - sizeof(struct netfront_accel_tso_buffer)                     \
-+       - sizeof(struct netfront_accel_tso_output_packet))
-+
-+int netfront_accel_enqueue_skb_tso(netfront_accel_vnic *vnic,
-+                                 struct sk_buff *skb);
-+
-+#endif /* NETFRONT_ACCEL_TSO_H */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_vi.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_vi.c        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,1194 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/if_ether.h>
-+#include <linux/ip.h>
-+#include <net/checksum.h>
-+#include <asm/io.h>
-+
-+#include "accel.h"
-+#include "accel_util.h"
-+#include "accel_bufs.h"
-+#include "accel_tso.h"
-+#include "accel_ssr.h"
-+#include "netfront.h"
-+
-+#include "etherfabric/ef_vi.h"
-+
-+/*
-+ * Max available space in a buffer for data once meta-data has taken
-+ * its place
-+ */
-+#define NETFRONT_ACCEL_TX_BUF_LENGTH                                  \
-+      ((PAGE_SIZE / NETFRONT_ACCEL_BUFS_PER_PAGE)                     \
-+       - sizeof(struct netfront_accel_tso_buffer))
-+
-+#define ACCEL_TX_MAX_BUFFERS (6)
-+#define ACCEL_VI_POLL_EVENTS (8)
-+
-+static
-+int netfront_accel_vi_init_fini(netfront_accel_vnic *vnic, 
-+                              struct net_accel_msg_hw *hw_msg)
-+{
-+      struct ef_vi_nic_type nic_type;
-+      struct net_accel_hw_falcon_b *hw_info;
-+      void *io_kva, *evq_base, *rx_dma_kva, *tx_dma_kva, *doorbell_kva;
-+      u32 *evq_gnts;
-+      u32 evq_order;
-+      int vi_state_size;
-+      u8 vi_data[VI_MAPPINGS_SIZE];
-+
-+      if (hw_msg == NULL)
-+              goto fini;
-+
-+      /* And create the local macs table lock */
-+      spin_lock_init(&vnic->table_lock);
-+      
-+      /* Create fastpath table, initial size 8, key length 8 */
-+      if (cuckoo_hash_init(&vnic->fastpath_table, 3, 8)) {
-+              EPRINTK("failed to allocate fastpath table\n");
-+              goto fail_cuckoo;
-+      }
-+
-+      vnic->hw.falcon.type = hw_msg->type;
-+
-+      switch (hw_msg->type) {
-+      case NET_ACCEL_MSG_HWTYPE_FALCON_A:
-+              hw_info = &hw_msg->resources.falcon_a.common;
-+              /* Need the extra rptr register page on A1 */
-+              io_kva = net_accel_map_iomem_page
-+                      (vnic->dev, hw_msg->resources.falcon_a.evq_rptr_gnt,
-+                       &vnic->hw.falcon.evq_rptr_mapping);
-+              if (io_kva == NULL) {
-+                      EPRINTK("%s: evq_rptr permission failed\n", __FUNCTION__);
-+                      goto evq_rptr_fail;
-+              }
-+
-+              vnic->hw.falcon.evq_rptr = io_kva + 
-+                      (hw_info->evq_rptr & (PAGE_SIZE - 1));
-+              break;
-+      case NET_ACCEL_MSG_HWTYPE_FALCON_B:
-+              hw_info = &hw_msg->resources.falcon_b;
-+              break;
-+      default:
-+              goto bad_type;
-+      }
-+
-+      /**** Event Queue ****/
-+
-+      /* Map the event queue pages */
-+      evq_gnts = hw_info->evq_mem_gnts;
-+      evq_order = hw_info->evq_order;
-+
-+      EPRINTK_ON(hw_info->evq_offs != 0);
-+
-+      DPRINTK("Will map evq %d pages\n", 1 << evq_order);
-+
-+      evq_base =
-+              net_accel_map_grants_contig(vnic->dev, evq_gnts, 1 << evq_order,
-+                                          &vnic->evq_mapping);
-+      if (evq_base == NULL) {
-+              EPRINTK("%s: evq_base failed\n", __FUNCTION__);
-+              goto evq_fail;
-+      }
-+
-+      /**** Doorbells ****/
-+      /* Set up the doorbell mappings. */
-+      doorbell_kva = 
-+              net_accel_map_iomem_page(vnic->dev, hw_info->doorbell_gnt,
-+                                       &vnic->hw.falcon.doorbell_mapping);
-+      if (doorbell_kva == NULL) {
-+              EPRINTK("%s: doorbell permission failed\n", __FUNCTION__);
-+              goto doorbell_fail;
-+      }
-+      vnic->hw.falcon.doorbell = doorbell_kva;
-+
-+      /* On Falcon_B we get the rptr from the doorbell page */
-+      if (hw_msg->type == NET_ACCEL_MSG_HWTYPE_FALCON_B) {
-+              vnic->hw.falcon.evq_rptr = 
-+                      (u32 *)((char *)vnic->hw.falcon.doorbell 
-+                              + hw_info->evq_rptr);
-+      }
-+
-+      /**** DMA Queue ****/
-+
-+      /* Set up the DMA Queues from the message. */
-+      tx_dma_kva = net_accel_map_grants_contig
-+              (vnic->dev, &(hw_info->txdmaq_gnt), 1, 
-+               &vnic->hw.falcon.txdmaq_mapping);
-+      if (tx_dma_kva == NULL) {
-+              EPRINTK("%s: TX dma failed\n", __FUNCTION__);
-+              goto tx_dma_fail;
-+      }
-+
-+      rx_dma_kva = net_accel_map_grants_contig
-+              (vnic->dev, &(hw_info->rxdmaq_gnt), 1, 
-+               &vnic->hw.falcon.rxdmaq_mapping);
-+      if (rx_dma_kva == NULL) {
-+              EPRINTK("%s: RX dma failed\n", __FUNCTION__);
-+              goto rx_dma_fail;
-+      }
-+
-+      /* Full confession */
-+      DPRINTK("Mapped H/W"
-+              "  Tx DMAQ grant %x -> %p\n"
-+              "  Rx DMAQ grant %x -> %p\n"
-+              "  EVQ grant %x -> %p\n",
-+              hw_info->txdmaq_gnt, tx_dma_kva,
-+              hw_info->rxdmaq_gnt, rx_dma_kva,
-+              evq_gnts[0], evq_base
-+              );
-+
-+      memset(vi_data, 0, sizeof(vi_data));
-+      
-+      /* TODO BUG11305: convert efhw_arch to ef_vi_arch
-+       * e.g.
-+       * arch = ef_vi_arch_from_efhw_arch(hw_info->nic_arch);
-+       * assert(arch >= 0);
-+       * nic_type.arch = arch;
-+       */
-+      nic_type.arch = (unsigned char)hw_info->nic_arch;
-+      nic_type.variant = (char)hw_info->nic_variant;
-+      nic_type.revision = (unsigned char)hw_info->nic_revision;
-+      
-+      ef_vi_init_mapping_evq(vi_data, nic_type, hw_info->instance, 
-+                             1 << (evq_order + PAGE_SHIFT), evq_base, 
-+                             (void *)0xdeadbeef);
-+
-+      ef_vi_init_mapping_vi(vi_data, nic_type, hw_info->rx_capacity, 
-+                            hw_info->tx_capacity, hw_info->instance, 
-+                            doorbell_kva, rx_dma_kva, tx_dma_kva, 0);
-+
-+      vi_state_size = ef_vi_calc_state_bytes(hw_info->rx_capacity,
-+                                             hw_info->tx_capacity);
-+      vnic->vi_state = (ef_vi_state *)kmalloc(vi_state_size, GFP_KERNEL);
-+      if (vnic->vi_state == NULL) {
-+              EPRINTK("%s: kmalloc for VI state failed\n", __FUNCTION__);
-+              goto vi_state_fail;
-+      }
-+      ef_vi_init(&vnic->vi, vi_data, vnic->vi_state, &vnic->evq_state, 0);
-+
-+      ef_eventq_state_init(&vnic->vi);
-+
-+      ef_vi_state_init(&vnic->vi);
-+
-+      return 0;
-+
-+fini:
-+      kfree(vnic->vi_state);
-+      vnic->vi_state = NULL;
-+vi_state_fail:
-+      net_accel_unmap_grants_contig(vnic->dev, vnic->hw.falcon.rxdmaq_mapping);
-+rx_dma_fail:
-+      net_accel_unmap_grants_contig(vnic->dev, vnic->hw.falcon.txdmaq_mapping);
-+tx_dma_fail:
-+      net_accel_unmap_iomem_page(vnic->dev, vnic->hw.falcon.doorbell_mapping);
-+      vnic->hw.falcon.doorbell = NULL;
-+doorbell_fail:
-+      net_accel_unmap_grants_contig(vnic->dev, vnic->evq_mapping);
-+evq_fail:
-+      if (vnic->hw.falcon.type == NET_ACCEL_MSG_HWTYPE_FALCON_A)
-+              net_accel_unmap_iomem_page(vnic->dev, 
-+                                         vnic->hw.falcon.evq_rptr_mapping);
-+      vnic->hw.falcon.evq_rptr = NULL;
-+evq_rptr_fail:
-+bad_type:
-+      cuckoo_hash_destroy(&vnic->fastpath_table);
-+fail_cuckoo:
-+      return -EIO;
-+}
-+
-+
-+void netfront_accel_vi_ctor(netfront_accel_vnic *vnic)
-+{
-+      /* Just mark the VI as uninitialised. */
-+      vnic->vi_state = NULL;
-+}
-+
-+
-+int netfront_accel_vi_init(netfront_accel_vnic *vnic, struct net_accel_msg_hw *hw_msg)
-+{
-+      BUG_ON(hw_msg == NULL);
-+      return netfront_accel_vi_init_fini(vnic, hw_msg);
-+}
-+
-+
-+void netfront_accel_vi_dtor(netfront_accel_vnic *vnic)
-+{
-+      if (vnic->vi_state != NULL)
-+              netfront_accel_vi_init_fini(vnic, NULL);
-+}
-+
-+
-+static
-+void netfront_accel_vi_post_rx(netfront_accel_vnic *vnic, u16 id,
-+                             netfront_accel_pkt_desc *buf)
-+{
-+
-+      int idx = vnic->rx_dma_batched;
-+
-+#if 0
-+      VPRINTK("Posting buffer %d (0x%08x) for rx at index %d, space is %d\n",
-+              id, buf->pkt_buff_addr, idx, ef_vi_receive_space(&vnic->vi));
-+#endif
-+      /* Set up a virtual buffer descriptor */
-+      ef_vi_receive_init(&vnic->vi, buf->pkt_buff_addr, id,
-+                         /*rx_bytes=max*/0);
-+
-+      idx++;
-+
-+      vnic->rx_dma_level++;
-+      
-+      /* 
-+       * Only push the descriptor to the card if we've reached the
-+       * batch size.  Otherwise, the descriptors can sit around for
-+       * a while.  There will be plenty available.
-+       */
-+      if (idx >= NETFRONT_ACCEL_RX_DESC_BATCH ||
-+          vnic->rx_dma_level < NETFRONT_ACCEL_RX_DESC_BATCH) {
-+#if 0
-+              VPRINTK("Flushing %d rx descriptors.\n", idx);
-+#endif
-+
-+              /* Push buffer to hardware */
-+              ef_vi_receive_push(&vnic->vi);
-+              
-+              idx = 0;
-+      }
-+      
-+      vnic->rx_dma_batched = idx;
-+}
-+
-+
-+inline
-+void netfront_accel_vi_post_rx_or_free(netfront_accel_vnic *vnic, u16 id,
-+                                     netfront_accel_pkt_desc *buf)
-+{
-+
-+      VPRINTK("%s: %d\n", __FUNCTION__, id);
-+
-+      if (ef_vi_receive_space(&vnic->vi) <= vnic->rx_dma_batched) {
-+              VPRINTK("RX space is full\n");
-+              netfront_accel_buf_put(vnic->rx_bufs, id);
-+              return;
-+      }
-+
-+      VPRINTK("Completed buffer %d is reposted\n", id);
-+      netfront_accel_vi_post_rx(vnic, id, buf);
-+      
-+      /*
-+       * Let's see if there's any more to be pushed out to the NIC
-+       * while we're here
-+       */
-+      while (ef_vi_receive_space(&vnic->vi) > vnic->rx_dma_batched) {
-+              /* Try to allocate a buffer. */
-+              buf = netfront_accel_buf_get(vnic->rx_bufs);
-+              if (buf == NULL)
-+                      break;
-+              
-+              /* Add it to the rx dma queue. */
-+              netfront_accel_vi_post_rx(vnic, buf->buf_id, buf);      
-+      }
-+}
-+
-+
-+void netfront_accel_vi_add_bufs(netfront_accel_vnic *vnic, int is_rx)
-+{
-+
-+      while (is_rx && 
-+             ef_vi_receive_space(&vnic->vi) > vnic->rx_dma_batched) {
-+              netfront_accel_pkt_desc *buf;
-+              
-+              VPRINTK("%s: %d\n", __FUNCTION__, vnic->rx_dma_level);
-+              
-+              /* Try to allocate a buffer. */
-+              buf = netfront_accel_buf_get(vnic->rx_bufs);
-+
-+              if (buf == NULL)
-+                      break;
-+              
-+              /* Add it to the rx dma queue. */
-+              netfront_accel_vi_post_rx(vnic, buf->buf_id, buf);
-+      }
-+
-+      VPRINTK("%s: done\n", __FUNCTION__);
-+}
-+
-+
-+struct netfront_accel_multi_state {
-+      unsigned remaining_len;
-+
-+      unsigned buffers;
-+
-+      struct netfront_accel_tso_buffer *output_buffers;
-+
-+      /* Where we are in the current fragment of the SKB. */
-+      struct {
-+              /* address of current position */
-+              void *addr;
-+              /* remaining length */    
-+              unsigned int len;
-+      } ifc; /*  == Input Fragment Cursor */
-+};
-+
-+
-+static inline void multi_post_start(struct netfront_accel_multi_state *st, 
-+                                  struct sk_buff *skb)
-+{
-+      st->remaining_len = skb->len;
-+      st->output_buffers = NULL;
-+      st->buffers = 0;
-+      st->ifc.len = skb_headlen(skb);
-+      st->ifc.addr = skb->data;
-+}
-+
-+static int multi_post_start_new_buffer(netfront_accel_vnic *vnic, 
-+                                     struct netfront_accel_multi_state *st)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct netfront_accel_pkt_desc *buf;
-+
-+      /* Get a mapped packet buffer */
-+      buf = netfront_accel_buf_get(vnic->tx_bufs);
-+      if (buf == NULL) {
-+              DPRINTK("%s: No buffer for TX\n", __FUNCTION__);
-+              return -1;
-+      }
-+
-+      /* Store a bit of meta-data at the end */
-+      tso_buf = (struct netfront_accel_tso_buffer *)
-+              (buf->pkt_kva + NETFRONT_ACCEL_TX_BUF_LENGTH);
-+
-+      tso_buf->buf = buf;
-+
-+      tso_buf->length = 0;
-+      
-+      tso_buf->next = st->output_buffers;
-+      st->output_buffers = tso_buf;
-+      st->buffers++;
-+
-+      BUG_ON(st->buffers >= ACCEL_TX_MAX_BUFFERS);
-+
-+      /*
-+       * Store the context, set to NULL, last packet buffer will get
-+       * non-NULL later
-+       */
-+      tso_buf->buf->skb = NULL;
-+      
-+      return 0;
-+}
-+
-+
-+static void
-+multi_post_fill_buffer_with_fragment(netfront_accel_vnic *vnic,
-+                                   struct netfront_accel_multi_state *st)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      unsigned n, space;
-+
-+      BUG_ON(st->output_buffers == NULL);
-+      tso_buf = st->output_buffers;
-+
-+      if (st->ifc.len == 0) return;
-+      if (tso_buf->length == NETFRONT_ACCEL_TX_BUF_LENGTH) return;
-+
-+      BUG_ON(tso_buf->length > NETFRONT_ACCEL_TX_BUF_LENGTH);
-+
-+      space = NETFRONT_ACCEL_TX_BUF_LENGTH - tso_buf->length;
-+      n = min(st->ifc.len, space);
-+
-+      memcpy(tso_buf->buf->pkt_kva + tso_buf->length, st->ifc.addr, n);
-+
-+      st->remaining_len -= n;
-+      st->ifc.len -= n;
-+      tso_buf->length += n;
-+      st->ifc.addr += n;
-+
-+      BUG_ON(tso_buf->length > NETFRONT_ACCEL_TX_BUF_LENGTH);
-+
-+      return;
-+}
-+
-+
-+static inline void multi_post_unwind(netfront_accel_vnic *vnic,
-+                                   struct netfront_accel_multi_state *st)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+
-+      while (st->output_buffers != NULL) {
-+              tso_buf = st->output_buffers;
-+              st->output_buffers = tso_buf->next;
-+              st->buffers--;
-+              netfront_accel_buf_put(vnic->tx_bufs, tso_buf->buf->buf_id);
-+      }
-+      BUG_ON(st->buffers != 0);
-+}
-+
-+
-+static enum netfront_accel_post_status
-+netfront_accel_enqueue_skb_multi(netfront_accel_vnic *vnic, struct sk_buff *skb)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct netfront_accel_multi_state state;
-+      ef_iovec iovecs[ACCEL_TX_MAX_BUFFERS];
-+      skb_frag_t *f;
-+      int frag_i, rc, dma_id;
-+
-+      multi_post_start(&state, skb);
-+
-+      frag_i = -1;
-+
-+      if (skb->ip_summed == CHECKSUM_HW) {
-+              /* Set to zero to encourage falcon to work it out for us */
-+              *(u16*)(skb->h.raw + skb->csum) = 0;
-+      }
-+
-+      if (multi_post_start_new_buffer(vnic, &state)) {
-+              DPRINTK("%s: out of buffers\n", __FUNCTION__);
-+              goto unwind;
-+      }
-+
-+      while (1) {
-+              multi_post_fill_buffer_with_fragment(vnic, &state);
-+
-+              /* Move onto the next fragment? */
-+              if (state.ifc.len == 0) {
-+                      if (++frag_i >= skb_shinfo(skb)->nr_frags)
-+                              /* End of payload reached. */
-+                              break;
-+                      f = &skb_shinfo(skb)->frags[frag_i];
-+                      state.ifc.len = f->size;
-+                      state.ifc.addr = page_address(f->page) + f->page_offset;
-+              }
-+
-+              /* Start a new buffer? */
-+              if ((state.output_buffers->length == 
-+                   NETFRONT_ACCEL_TX_BUF_LENGTH) &&
-+                  multi_post_start_new_buffer(vnic, &state)) {
-+                      DPRINTK("%s: out of buffers\n", __FUNCTION__);
-+                      goto unwind;
-+              }
-+      }
-+
-+      /* Check for space */
-+      if (ef_vi_transmit_space(&vnic->vi) < state.buffers) {
-+              DPRINTK("%s: Not enough TX space (%d)\n", __FUNCTION__, state.buffers);
-+              goto unwind;
-+      }
-+
-+      /* Store the skb in what will be the last buffer's context */
-+      state.output_buffers->buf->skb = skb;
-+      /* Remember dma_id of what will be the last buffer */ 
-+      dma_id = state.output_buffers->buf->buf_id;
-+
-+      /*
-+       * Make an iovec of the buffers in the list, reversing the
-+       * buffers as we go as they are constructed on a stack
-+       */
-+      tso_buf = state.output_buffers;
-+      for (frag_i = state.buffers-1; frag_i >= 0; frag_i--) {
-+              iovecs[frag_i].iov_base = tso_buf->buf->pkt_buff_addr;
-+              iovecs[frag_i].iov_len = tso_buf->length;
-+              tso_buf = tso_buf->next;
-+      }
-+      
-+      rc = ef_vi_transmitv(&vnic->vi, iovecs, state.buffers, dma_id);
-+
-+      /* Track number of tx fastpath stats */
-+      vnic->netdev_stats.fastpath_tx_bytes += skb->len;
-+      vnic->netdev_stats.fastpath_tx_pkts ++;
-+#if NETFRONT_ACCEL_STATS
-+      {
-+              u32 n;
-+              n = vnic->netdev_stats.fastpath_tx_pkts -
-+                      (u32)vnic->stats.fastpath_tx_completions;
-+              if (n > vnic->stats.fastpath_tx_pending_max)
-+                      vnic->stats.fastpath_tx_pending_max = n;
-+      }
-+#endif
-+      return NETFRONT_ACCEL_STATUS_GOOD;
-+
-+unwind:
-+      multi_post_unwind(vnic, &state);
-+
-+      NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_busy++);
-+
-+      return NETFRONT_ACCEL_STATUS_BUSY;
-+}
-+
-+
-+static enum netfront_accel_post_status 
-+netfront_accel_enqueue_skb_single(netfront_accel_vnic *vnic, struct sk_buff *skb)
-+{
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      struct netfront_accel_pkt_desc *buf;
-+      u8 *kva;
-+      int rc;
-+
-+      if (ef_vi_transmit_space(&vnic->vi) < 1) {
-+              DPRINTK("%s: No TX space\n", __FUNCTION__);
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_busy++);
-+              return NETFRONT_ACCEL_STATUS_BUSY;
-+      }
-+
-+      buf = netfront_accel_buf_get(vnic->tx_bufs);
-+      if (buf == NULL) {
-+              DPRINTK("%s: No buffer for TX\n", __FUNCTION__);
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_busy++);
-+              return NETFRONT_ACCEL_STATUS_BUSY;
-+      }
-+
-+      /* Track number of tx fastpath stats */
-+      vnic->netdev_stats.fastpath_tx_pkts++;
-+      vnic->netdev_stats.fastpath_tx_bytes += skb->len;
-+
-+#if NETFRONT_ACCEL_STATS
-+      {
-+              u32 n;
-+              n = vnic->netdev_stats.fastpath_tx_pkts - 
-+                      (u32)vnic->stats.fastpath_tx_completions;
-+              if (n > vnic->stats.fastpath_tx_pending_max)
-+                      vnic->stats.fastpath_tx_pending_max = n;
-+      }
-+#endif
-+      
-+      /* Store the context */
-+      buf->skb = skb;
-+      
-+      kva = buf->pkt_kva;
-+
-+      if (skb->ip_summed == CHECKSUM_HW) {
-+              /* Set to zero to encourage falcon to work it out for us */
-+              *(u16*)(skb->h.raw + skb->csum) = 0;
-+      }
-+      NETFRONT_ACCEL_PKTBUFF_FOR_EACH_FRAGMENT
-+              (skb, idx, frag_data, frag_len, {
-+                      /* Copy in payload */
-+                      VPRINTK("*** Copying %d bytes to %p\n", frag_len, kva);
-+                      memcpy(kva, frag_data, frag_len);
-+                      kva += frag_len;
-+              });
-+
-+      VPRINTK("%s: id %d pkt %p kva %p buff_addr 0x%08x\n", __FUNCTION__,
-+              buf->buf_id, buf, buf->pkt_kva, buf->pkt_buff_addr);
-+
-+
-+      /* Set up the TSO meta-data for a single buffer/packet */
-+      tso_buf = (struct netfront_accel_tso_buffer *)
-+              (buf->pkt_kva + NETFRONT_ACCEL_TX_BUF_LENGTH);
-+      tso_buf->next = NULL;
-+      tso_buf->buf = buf;
-+      tso_buf->length = skb->len;
-+
-+      rc = ef_vi_transmit(&vnic->vi, buf->pkt_buff_addr, skb->len,
-+                          buf->buf_id);
-+      /* We checked for space already, so it really should succeed */
-+      BUG_ON(rc != 0);
-+
-+      return NETFRONT_ACCEL_STATUS_GOOD;
-+}
-+
-+
-+enum netfront_accel_post_status 
-+netfront_accel_vi_tx_post(netfront_accel_vnic *vnic, struct sk_buff *skb)
-+{
-+      struct ethhdr *pkt_eth_hdr;
-+      struct iphdr *pkt_ipv4_hdr;
-+      int value, try_fastpath;
-+
-+      /*
-+       * This assumes that the data field points to the dest mac
-+       * address.
-+       */
-+      cuckoo_hash_mac_key key = cuckoo_mac_to_key(skb->data);
-+
-+      /*
-+       * NB very important that all things that could return "CANT"
-+       * are tested before things that return "BUSY" as if it it
-+       * returns "BUSY" it is assumed that it won't return "CANT"
-+       * next time it is tried
-+       */
-+
-+      /*
-+       * Do a fastpath send if fast path table lookup returns true.
-+       * We do this without the table lock and so may get the wrong
-+       * answer, but current opinion is that's not a big problem 
-+       */
-+      try_fastpath = cuckoo_hash_lookup(&vnic->fastpath_table, 
-+                                        (cuckoo_hash_key *)(&key), &value);
-+
-+      if (!try_fastpath) {
-+              VPRINTK("try fast path false for mac: " MAC_FMT "\n",
-+                      MAC_ARG(skb->data));
-+              
-+              return NETFRONT_ACCEL_STATUS_CANT;
-+      }
-+
-+      /* Check to see if the packet can be sent. */
-+      if (skb_headlen(skb) < sizeof(*pkt_eth_hdr) + sizeof(*pkt_ipv4_hdr)) {
-+              EPRINTK("%s: Packet header is too small\n", __FUNCTION__);
-+              return NETFRONT_ACCEL_STATUS_CANT;
-+      }
-+
-+      pkt_eth_hdr  = (void*)skb->data;
-+      pkt_ipv4_hdr = (void*)(pkt_eth_hdr+1);
-+
-+      if (be16_to_cpu(pkt_eth_hdr->h_proto) != ETH_P_IP) {
-+              DPRINTK("%s: Packet is not IPV4 (ether_type=0x%04x)\n", __FUNCTION__,
-+                      be16_to_cpu(pkt_eth_hdr->h_proto));
-+              return NETFRONT_ACCEL_STATUS_CANT;
-+      }
-+      
-+      if (pkt_ipv4_hdr->protocol != IPPROTO_TCP &&
-+          pkt_ipv4_hdr->protocol != IPPROTO_UDP) {
-+              DPRINTK("%s: Packet is not TCP/UDP (ip_protocol=0x%02x)\n",
-+                      __FUNCTION__, pkt_ipv4_hdr->protocol);
-+              return NETFRONT_ACCEL_STATUS_CANT;
-+      }
-+      
-+      VPRINTK("%s: %d bytes, gso %d\n", __FUNCTION__, skb->len, 
-+              skb_shinfo(skb)->gso_size);
-+      
-+      if (skb_shinfo(skb)->gso_size) {
-+              return netfront_accel_enqueue_skb_tso(vnic, skb);
-+      }
-+
-+      if (skb->len <= NETFRONT_ACCEL_TX_BUF_LENGTH) {
-+              return netfront_accel_enqueue_skb_single(vnic, skb);
-+      }
-+
-+      return netfront_accel_enqueue_skb_multi(vnic, skb);
-+}
-+
-+
-+/*
-+ * Copy the data to required end destination. NB. len is the total new
-+ * length of the socket buffer, not the amount of data to copy
-+ */
-+inline
-+int ef_vnic_copy_to_skb(netfront_accel_vnic *vnic, struct sk_buff *skb, 
-+                      struct netfront_accel_pkt_desc *buf, int len)
-+{
-+      int i, extra = len - skb->len;
-+      char c;
-+      int pkt_stride = vnic->rx_pkt_stride;
-+      int skb_stride = vnic->rx_skb_stride;
-+      char *skb_start;
-+      
-+      /*
-+       * This pulls stuff into the cache - have seen performance
-+       * benefit in this, but disabled by default
-+       */
-+      skb_start = skb->data;
-+      if (pkt_stride) {
-+              for (i = 0; i < len; i += pkt_stride) {
-+                      c += ((volatile char*)(buf->pkt_kva))[i];
-+              }
-+      }
-+      if (skb_stride) {
-+              for (i = skb->len; i < len ; i += skb_stride) {
-+                      c += ((volatile char*)(skb_start))[i];
-+              }
-+      }
-+
-+      if (skb_tailroom(skb) >= extra) {
-+              memcpy(skb_put(skb, extra), buf->pkt_kva, extra);
-+              return 0;
-+      }
-+
-+      return -ENOSPC;
-+}
-+
-+
-+static void discard_jumbo_state(netfront_accel_vnic *vnic) 
-+{
-+
-+      if (vnic->jumbo_state.skb != NULL) {
-+              dev_kfree_skb_any(vnic->jumbo_state.skb);
-+
-+              vnic->jumbo_state.skb = NULL;
-+      }
-+      vnic->jumbo_state.in_progress = 0;
-+}
-+
-+
-+static void  netfront_accel_vi_rx_complete(netfront_accel_vnic *vnic,
-+                                         struct sk_buff *skb)
-+{
-+      cuckoo_hash_mac_key key;
-+      unsigned long flags;
-+      int value;
-+      struct net_device *net_dev;
-+
-+
-+      key = cuckoo_mac_to_key(skb->data + ETH_ALEN);
-+
-+      /*
-+       * If this is a MAC address that we want to do fast path TX
-+       * to, and we don't already, add it to the fastpath table.
-+       * The initial lookup is done without the table lock and so
-+       * may get the wrong answer, but current opinion is that's not
-+       * a big problem
-+       */
-+      if (is_valid_ether_addr(skb->data + ETH_ALEN) &&
-+          !cuckoo_hash_lookup(&vnic->fastpath_table, (cuckoo_hash_key *)&key,
-+                              &value)) {
-+              spin_lock_irqsave(&vnic->table_lock, flags);
-+                 
-+              cuckoo_hash_add_check(&vnic->fastpath_table,
-+                                    (cuckoo_hash_key *)&key,
-+                                    1, 1);
-+              
-+              spin_unlock_irqrestore(&vnic->table_lock, flags);
-+      }
-+
-+      if (compare_ether_addr(skb->data, vnic->mac)) {
-+              struct iphdr *ip = (struct iphdr *)(skb->data + ETH_HLEN);
-+              u16 port;
-+
-+              DPRINTK("%s: saw wrong MAC address " MAC_FMT "\n", 
-+                      __FUNCTION__, MAC_ARG(skb->data));
-+
-+              if (ip->protocol == IPPROTO_TCP) {
-+                      struct tcphdr *tcp = (struct tcphdr *)
-+                              ((char *)ip + 4 * ip->ihl);
-+                      port = tcp->dest;
-+              } else {
-+                      struct udphdr *udp = (struct udphdr *)
-+                              ((char *)ip + 4 * ip->ihl);
-+                      EPRINTK_ON(ip->protocol != IPPROTO_UDP);
-+                      port = udp->dest;
-+              }
-+
-+              netfront_accel_msg_tx_fastpath(vnic, skb->data,
-+                                             ip->daddr, port,
-+                                             ip->protocol);
-+      }
-+
-+      net_dev = vnic->net_dev;
-+      skb->dev = net_dev;
-+      skb->protocol = eth_type_trans(skb, net_dev);
-+      /* CHECKSUM_UNNECESSARY as hardware has done it already */
-+      skb->ip_summed = CHECKSUM_UNNECESSARY;
-+
-+      if (!netfront_accel_ssr_skb(vnic, &vnic->ssr_state, skb))
-+              netif_receive_skb(skb);
-+}
-+
-+
-+static int netfront_accel_vi_poll_process_rx(netfront_accel_vnic *vnic, 
-+                                           ef_event *ev)
-+{
-+      struct netfront_accel_bufinfo *bufinfo = vnic->rx_bufs;
-+      struct netfront_accel_pkt_desc *buf = NULL;
-+      struct sk_buff *skb;
-+      int id, len, sop = 0, cont = 0;
-+
-+      VPRINTK("Rx event.\n");
-+      /*
-+       * Complete the receive operation, and get the request id of
-+       * the buffer
-+       */
-+      id = ef_vi_receive_done(&vnic->vi, ev);
-+
-+      if (id < 0 || id >= bufinfo->npages*NETFRONT_ACCEL_BUFS_PER_PAGE) {
-+              EPRINTK("Rx packet %d is invalid\n", id);
-+              /* Carry on round the loop if more events */
-+              goto bad_packet;
-+      }
-+      /* Get our buffer descriptor */
-+      buf = netfront_accel_buf_find(bufinfo, id);
-+
-+      len = EF_EVENT_RX_BYTES(*ev);
-+
-+      /* An RX buffer has been removed from the DMA ring. */
-+      vnic->rx_dma_level--;
-+
-+      if (EF_EVENT_TYPE(*ev) == EF_EVENT_TYPE_RX) {
-+              sop = EF_EVENT_RX_SOP(*ev);
-+              cont = EF_EVENT_RX_CONT(*ev);
-+
-+              skb = vnic->jumbo_state.skb;
-+
-+              VPRINTK("Rx packet %d: %d bytes so far; sop %d; cont %d\n", 
-+                      id, len, sop, cont);
-+
-+              if (sop) {
-+                      if (!vnic->jumbo_state.in_progress) {
-+                              vnic->jumbo_state.in_progress = 1;
-+                              BUG_ON(vnic->jumbo_state.skb != NULL);
-+                      } else {
-+                              /*
-+                               * This fragment shows a missing tail in 
-+                               * previous one, but is itself possibly OK
-+                               */
-+                              DPRINTK("sop and in_progress => no tail\n");
-+
-+                              /* Release the socket buffer we already had */
-+                              discard_jumbo_state(vnic);
-+
-+                              /* Now start processing this fragment */
-+                              vnic->jumbo_state.in_progress = 1;
-+                              skb = NULL;
-+                      }
-+              } else if (!vnic->jumbo_state.in_progress) {
-+                      DPRINTK("!sop and !in_progress => missing head\n");
-+                      goto missing_head;
-+              }
-+
-+              if (!cont) {
-+                      /* Update state for next time */
-+                      vnic->jumbo_state.in_progress = 0;
-+                      vnic->jumbo_state.skb = NULL;
-+              } else if (!vnic->jumbo_state.in_progress) {
-+                      DPRINTK("cont and !in_progress => missing head\n");
-+                      goto missing_head;
-+              }
-+
-+              if (skb == NULL) {
-+                      BUG_ON(!sop);
-+
-+                      if (!cont)
-+                              skb = alloc_skb(len+NET_IP_ALIGN, GFP_ATOMIC);
-+                      else
-+                              skb = alloc_skb(vnic->net_dev->mtu+NET_IP_ALIGN, 
-+                                              GFP_ATOMIC);
-+
-+                      if (skb == NULL) {
-+                              DPRINTK("%s: Couldn't get an rx skb.\n",
-+                                      __FUNCTION__);
-+                              netfront_accel_vi_post_rx_or_free(vnic, (u16)id, buf);
-+                              /*
-+                               * Dropping this fragment means we
-+                               * should discard the rest too
-+                               */
-+                              discard_jumbo_state(vnic);
-+
-+                              /* Carry on round the loop if more events */
-+                              return 0;
-+                      }
-+
-+              }
-+              
-+              /* Copy the data to required end destination */
-+              if (ef_vnic_copy_to_skb(vnic, skb, buf, len) != 0) {
-+                      /*
-+                       * No space in the skb - suggests > MTU packet
-+                       * received
-+                       */
-+                      EPRINTK("%s: Rx packet too large (%d)\n",
-+                              __FUNCTION__, len);
-+                      netfront_accel_vi_post_rx_or_free(vnic, (u16)id, buf);
-+                      discard_jumbo_state(vnic);
-+                      return 0;
-+              }
-+              
-+              /* Put the buffer back in the DMA queue. */
-+              netfront_accel_vi_post_rx_or_free(vnic, (u16)id, buf);
-+
-+              if (cont) {
-+                      vnic->jumbo_state.skb = skb;
-+
-+                      return 0;
-+              } else {
-+                      /* Track number of rx fastpath packets */
-+                      vnic->netdev_stats.fastpath_rx_pkts++;
-+                      vnic->netdev_stats.fastpath_rx_bytes += len;
-+
-+                      netfront_accel_vi_rx_complete(vnic, skb);
-+
-+                      return 1;
-+              }
-+      } else {
-+              BUG_ON(EF_EVENT_TYPE(*ev) != EF_EVENT_TYPE_RX_DISCARD);
-+
-+              if (EF_EVENT_RX_DISCARD_TYPE(*ev) 
-+                  == EF_EVENT_RX_DISCARD_TRUNC) {
-+                      DPRINTK("%s: " EF_EVENT_FMT 
-+                              " buffer %d FRM_TRUNC q_id %d\n",
-+                              __FUNCTION__, EF_EVENT_PRI_ARG(*ev), id,
-+                              EF_EVENT_RX_DISCARD_Q_ID(*ev) );
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.fastpath_frm_trunc);
-+              } else if (EF_EVENT_RX_DISCARD_TYPE(*ev) 
-+                        == EF_EVENT_RX_DISCARD_OTHER) {
-+                      DPRINTK("%s: " EF_EVENT_FMT 
-+                              " buffer %d RX_DISCARD_OTHER q_id %d\n",
-+                              __FUNCTION__, EF_EVENT_PRI_ARG(*ev), id,
-+                              EF_EVENT_RX_DISCARD_Q_ID(*ev) );
-+                      /*
-+                       * Probably tail of packet for which error has
-+                       * already been logged, so don't count in
-+                       * stats
-+                       */
-+              } else {
-+                      EPRINTK("%s: " EF_EVENT_FMT 
-+                              " buffer %d rx discard type %d q_id %d\n",
-+                              __FUNCTION__, EF_EVENT_PRI_ARG(*ev), id,
-+                              EF_EVENT_RX_DISCARD_TYPE(*ev), 
-+                              EF_EVENT_RX_DISCARD_Q_ID(*ev) );
-+                      NETFRONT_ACCEL_STATS_OP(++vnic->stats.bad_event_count);
-+              }
-+      }
-+
-+      /* discard type drops through here */
-+
-+bad_packet:
-+      /* Release the socket buffer we already had */
-+      discard_jumbo_state(vnic);
-+
-+missing_head:
-+      BUG_ON(vnic->jumbo_state.in_progress != 0);
-+      BUG_ON(vnic->jumbo_state.skb != NULL);
-+
-+      if (id >= 0 && id < bufinfo->npages*NETFRONT_ACCEL_BUFS_PER_PAGE)
-+              /* Put the buffer back in the DMA queue. */
-+              netfront_accel_vi_post_rx_or_free(vnic, (u16)id, buf);
-+
-+      vnic->netdev_stats.fastpath_rx_errors++;
-+
-+      DPRINTK("%s experienced bad packet/missing fragment error: %d \n",
-+              __FUNCTION__, ev->rx.flags);
-+
-+      return 0;
-+}
-+
-+
-+static void netfront_accel_vi_not_busy(netfront_accel_vnic *vnic)
-+{
-+      struct netfront_info *np = ((struct netfront_info *)
-+                                  netdev_priv(vnic->net_dev));
-+      struct sk_buff *skb;
-+      int handled;
-+      unsigned long flags;
-+      
-+      /*
-+       * TODO if we could safely check tx_skb == NULL and return
-+       * early without taking the lock, that would obviously help
-+       * performance
-+       */
-+
-+      /* Take the netfront lock which protects tx_skb. */
-+      spin_lock_irqsave(&np->tx_lock, flags);
-+      if (vnic->tx_skb != NULL) {
-+              DPRINTK("%s trying to send spare buffer\n", __FUNCTION__);
-+              
-+              skb = vnic->tx_skb;
-+              vnic->tx_skb = NULL;
-+
-+              spin_unlock_irqrestore(&np->tx_lock, flags);
-+
-+              handled = netfront_accel_vi_tx_post(vnic, skb);
-+              
-+              spin_lock_irqsave(&np->tx_lock, flags);
-+
-+              if (handled != NETFRONT_ACCEL_STATUS_BUSY) {
-+                      DPRINTK("%s restarting tx\n", __FUNCTION__);
-+                      if (netfront_check_queue_ready(vnic->net_dev)) {
-+                              netif_wake_queue(vnic->net_dev);
-+                              NETFRONT_ACCEL_STATS_OP
-+                                      (vnic->stats.queue_wakes++);
-+                      }
-+              } else {
-+                      vnic->tx_skb = skb;
-+              }
-+              
-+              /*
-+               * Should never get a CANT, as it checks that before
-+               * deciding it was BUSY first time round 
-+               */
-+              BUG_ON(handled == NETFRONT_ACCEL_STATUS_CANT);
-+      }
-+      spin_unlock_irqrestore(&np->tx_lock, flags);
-+}
-+
-+
-+static void netfront_accel_vi_tx_complete(netfront_accel_vnic *vnic, 
-+                                        struct netfront_accel_tso_buffer *tso_buf,
-+                                        int is_last)
-+{
-+      struct netfront_accel_tso_buffer *next;
-+
-+      /* 
-+       * We get a single completion for every call to
-+       * ef_vi_transmitv so handle any other buffers which are part
-+       * of the same packet 
-+       */
-+      while (tso_buf != NULL) {
-+              if (tso_buf->buf->skb != NULL) {
-+                      dev_kfree_skb_any(tso_buf->buf->skb);
-+                      tso_buf->buf->skb = NULL;
-+              }
-+
-+              next = tso_buf->next;
-+
-+              netfront_accel_buf_put(vnic->tx_bufs, tso_buf->buf->buf_id);
-+
-+              tso_buf = next;
-+      }
-+
-+      /*
-+       * If this was the last one in the batch, we try and send any
-+       * pending tx_skb. There should now be buffers and
-+       * descriptors
-+       */
-+      if (is_last)
-+              netfront_accel_vi_not_busy(vnic);
-+}
-+
-+
-+static void netfront_accel_vi_poll_process_tx(netfront_accel_vnic *vnic,
-+                                            ef_event *ev)
-+{
-+      struct netfront_accel_pkt_desc *buf;
-+      struct netfront_accel_tso_buffer *tso_buf;
-+      ef_request_id ids[EF_VI_TRANSMIT_BATCH];
-+      int i, n_ids;
-+      unsigned long flags;
-+
-+      /* Get the request ids for this tx completion event. */
-+      n_ids = ef_vi_transmit_unbundle(&vnic->vi, ev, ids);
-+
-+      /* Take the tx buffer spin lock and hold for the duration */
-+      spin_lock_irqsave(&vnic->tx_lock, flags);
-+
-+      for (i = 0; i < n_ids; ++i) {
-+              VPRINTK("Tx packet %d complete\n", ids[i]);
-+              buf = netfront_accel_buf_find(vnic->tx_bufs, ids[i]);
-+              NETFRONT_ACCEL_STATS_OP(vnic->stats.fastpath_tx_completions++);
-+
-+              tso_buf = (struct netfront_accel_tso_buffer *)
-+                      (buf->pkt_kva + NETFRONT_ACCEL_TX_BUF_LENGTH);
-+              BUG_ON(tso_buf->buf != buf);
-+
-+              netfront_accel_vi_tx_complete(vnic, tso_buf, i == (n_ids-1));
-+      }
-+
-+      spin_unlock_irqrestore(&vnic->tx_lock, flags);
-+}
-+
-+
-+int netfront_accel_vi_poll(netfront_accel_vnic *vnic, int rx_packets)
-+{
-+      ef_event ev[ACCEL_VI_POLL_EVENTS];
-+      int rx_remain = rx_packets, rc, events, i;
-+#if NETFRONT_ACCEL_STATS
-+      int n_evs_polled = 0, rx_evs_polled = 0, tx_evs_polled = 0;
-+#endif
-+      BUG_ON(rx_packets <= 0);
-+
-+      events = ef_eventq_poll(&vnic->vi, ev, 
-+                              min(rx_remain, ACCEL_VI_POLL_EVENTS));
-+      i = 0;
-+      NETFRONT_ACCEL_STATS_OP(n_evs_polled += events);
-+
-+      VPRINTK("%s: %d events\n", __FUNCTION__, events);
-+
-+      /* Loop over each event */
-+      while (events) {
-+              VPRINTK("%s: Event "EF_EVENT_FMT", index %lu\n", __FUNCTION__, 
-+                      EF_EVENT_PRI_ARG(ev[i]),        
-+                      (unsigned long)(vnic->vi.evq_state->evq_ptr));
-+
-+              if ((EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX) ||
-+                  (EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_RX_DISCARD)) {
-+                      rc = netfront_accel_vi_poll_process_rx(vnic, &ev[i]);
-+                      rx_remain -= rc;
-+                      BUG_ON(rx_remain < 0);
-+                      NETFRONT_ACCEL_STATS_OP(rx_evs_polled++);
-+              } else if (EF_EVENT_TYPE(ev[i]) == EF_EVENT_TYPE_TX) {
-+                      netfront_accel_vi_poll_process_tx(vnic, &ev[i]);
-+                      NETFRONT_ACCEL_STATS_OP(tx_evs_polled++);
-+              } else if (EF_EVENT_TYPE(ev[i]) == 
-+                         EF_EVENT_TYPE_RX_NO_DESC_TRUNC) {
-+                      DPRINTK("%s: RX_NO_DESC_TRUNC " EF_EVENT_FMT "\n",
-+                              __FUNCTION__, EF_EVENT_PRI_ARG(ev[i]));
-+                      discard_jumbo_state(vnic);
-+                      NETFRONT_ACCEL_STATS_OP(vnic->stats.rx_no_desc_trunc++);
-+              } else {
-+                      EPRINTK("Unexpected event " EF_EVENT_FMT "\n", 
-+                              EF_EVENT_PRI_ARG(ev[i]));
-+                      NETFRONT_ACCEL_STATS_OP(vnic->stats.bad_event_count++);
-+              }
-+
-+              i++;
-+
-+              /* Carry on round the loop if more events and more space */
-+              if (i == events) {
-+                      if (rx_remain == 0)
-+                              break;
-+
-+                      events = ef_eventq_poll(&vnic->vi, ev, 
-+                                              min(rx_remain, 
-+                                                  ACCEL_VI_POLL_EVENTS));
-+                      i = 0;
-+                      NETFRONT_ACCEL_STATS_OP(n_evs_polled += events);
-+              }
-+      }
-+      
-+#if NETFRONT_ACCEL_STATS
-+      vnic->stats.event_count += n_evs_polled;
-+      vnic->stats.event_count_since_irq += n_evs_polled;
-+      if (n_evs_polled > vnic->stats.events_per_poll_max)
-+              vnic->stats.events_per_poll_max = n_evs_polled;
-+      if (rx_evs_polled > vnic->stats.events_per_poll_rx_max)
-+              vnic->stats.events_per_poll_rx_max = rx_evs_polled;
-+      if (tx_evs_polled > vnic->stats.events_per_poll_tx_max)
-+              vnic->stats.events_per_poll_tx_max = tx_evs_polled;
-+#endif
-+
-+      return rx_packets - rx_remain;
-+}
-+
-+
-+int netfront_accel_vi_enable_interrupts(netfront_accel_vnic *vnic)
-+{
-+      u32 sw_evq_ptr;
-+
-+      VPRINTK("%s: checking for event on %p\n", __FUNCTION__, &vnic->vi.evq_state);
-+
-+      BUG_ON(vnic == NULL);
-+      BUG_ON(vnic->vi.evq_state == NULL);
-+
-+      /* Do a quick check for an event. */
-+      if (ef_eventq_has_event(&vnic->vi)) {
-+              VPRINTK("%s: found event\n",  __FUNCTION__);
-+              return 0;
-+      }
-+
-+      VPRINTK("evq_ptr=0x%08x  evq_mask=0x%08x\n",
-+              vnic->evq_state.evq_ptr, vnic->vi.evq_mask);
-+  
-+      /* Request a wakeup from the hardware. */
-+      sw_evq_ptr = vnic->evq_state.evq_ptr & vnic->vi.evq_mask;
-+
-+      BUG_ON(vnic->hw.falcon.evq_rptr == NULL);
-+
-+      VPRINTK("Requesting wakeup at 0x%08x, rptr %p\n", sw_evq_ptr,
-+              vnic->hw.falcon.evq_rptr);
-+      *(volatile u32 *)(vnic->hw.falcon.evq_rptr) = (sw_evq_ptr >> 3);
-+
-+      return 1;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/accel_xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/accel_xenbus.c    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,776 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/stddef.h>
-+#include <linux/errno.h>
-+
-+#include <xen/xenbus.h>
-+#include <xen/evtchn.h>
-+#include <xen/gnttab.h>
-+
-+#include "accel.h"
-+#include "accel_util.h"
-+#include "accel_msg_iface.h"
-+#include "accel_bufs.h"
-+#include "accel_ssr.h"
-+/* drivers/xen/netfront/netfront.h */
-+#include "netfront.h"
-+
-+void netfront_accel_set_closing(netfront_accel_vnic *vnic) 
-+{
-+
-+      vnic->frontend_state = XenbusStateClosing;
-+      net_accel_update_state(vnic->dev, XenbusStateClosing);
-+}
-+      
-+
-+static void mac_address_change(struct xenbus_watch *watch,
-+                             const char **vec, unsigned int len)
-+{
-+      netfront_accel_vnic *vnic;
-+      struct xenbus_device *dev;
-+      int rc;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+      
-+      vnic = container_of(watch, netfront_accel_vnic, 
-+                              mac_address_watch);
-+      dev = vnic->dev;
-+
-+      rc = net_accel_xen_net_read_mac(dev, vnic->mac);
-+
-+      if (rc != 0)
-+              EPRINTK("%s: failed to read mac (%d)\n", __FUNCTION__, rc);
-+}
-+
-+
-+static int setup_mac_address_watch(struct xenbus_device *dev,
-+                                 netfront_accel_vnic *vnic)
-+{
-+      int err;
-+
-+      DPRINTK("Setting watch on %s/%s\n", dev->nodename, "mac");
-+
-+      err = xenbus_watch_path2(dev, dev->nodename, "mac", 
-+                               &vnic->mac_address_watch, 
-+                               mac_address_change);
-+      if (err) {
-+              EPRINTK("%s: Failed to register xenbus watch: %d\n",
-+                      __FUNCTION__, err);
-+              goto fail;
-+      }
-+
-+      return 0;
-+ fail:
-+      vnic->mac_address_watch.node = NULL;
-+      return err;
-+}
-+
-+
-+/* Grant access to some pages and publish through xenbus */
-+static int make_named_grant(struct xenbus_device *dev, void *page, 
-+                          const char *name, grant_ref_t *gnt_ref)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+      grant_ref_t gnt;
-+
-+      gnt = net_accel_grant_page(dev, virt_to_mfn(page), 0);
-+      if (gnt < 0)
-+              return gnt;
-+
-+      do {
-+              err = xenbus_transaction_start(&tr);
-+              if (err != 0) {
-+                      EPRINTK("%s: transaction start failed %d\n",
-+                              __FUNCTION__, err);
-+                      return err;
-+              }
-+              err = xenbus_printf(tr, dev->nodename, name, "%d", gnt);
-+              if (err != 0) {
-+                      EPRINTK("%s: xenbus_printf failed %d\n", __FUNCTION__,
-+                              err);
-+                      xenbus_transaction_end(tr, 1);
-+                      return err;
-+              }
-+              err = xenbus_transaction_end(tr, 0);
-+      } while (err == -EAGAIN);
-+      
-+      if (err != 0) {
-+              EPRINTK("%s: transaction end failed %d\n", __FUNCTION__, err);
-+              return err;
-+      }
-+      
-+      *gnt_ref = gnt;
-+
-+      return 0;
-+}
-+
-+
-+static int remove_named_grant(struct xenbus_device *dev,
-+                            const char *name, grant_ref_t gnt_ref)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+
-+      net_accel_ungrant_page(gnt_ref);
-+
-+      do {
-+              err = xenbus_transaction_start(&tr);
-+              if (err != 0) {
-+                      EPRINTK("%s: transaction start failed %d\n",
-+                              __FUNCTION__, err);
-+                      return err;
-+              }
-+              err = xenbus_rm(tr, dev->nodename, name);
-+              if (err != 0) {
-+                      EPRINTK("%s: xenbus_rm failed %d\n", __FUNCTION__,
-+                              err);
-+                      xenbus_transaction_end(tr, 1);
-+                      return err;
-+              }
-+              err = xenbus_transaction_end(tr, 0);
-+      } while (err == -EAGAIN);
-+      
-+      if (err != 0) {
-+              EPRINTK("%s: transaction end failed %d\n", __FUNCTION__, err);
-+              return err;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+static 
-+netfront_accel_vnic *netfront_accel_vnic_ctor(struct net_device *net_dev,
-+                                            struct xenbus_device *dev)
-+{
-+      struct netfront_info *np =
-+              (struct netfront_info *)netdev_priv(net_dev);
-+      netfront_accel_vnic *vnic;
-+      int err;
-+
-+      /*
-+       * A bug in earlier versions of Xen accel plugin system meant
-+       * you could be probed twice for the same device on suspend
-+       * cancel.  Be tolerant of that.
-+       */ 
-+      if (np->accel_priv != NULL)
-+              return ERR_PTR(-EALREADY);
-+
-+      /* Alloc mem for state */
-+      vnic = kzalloc(sizeof(netfront_accel_vnic), GFP_KERNEL);
-+      if (vnic == NULL) {
-+              EPRINTK("%s: no memory for vnic state\n", __FUNCTION__);
-+              return ERR_PTR(-ENOMEM);
-+      }
-+
-+      spin_lock_init(&vnic->tx_lock);
-+
-+      mutex_init(&vnic->vnic_mutex);
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      /* Store so state can be retrieved from device */
-+      BUG_ON(np->accel_priv != NULL);
-+      np->accel_priv = vnic;
-+      vnic->dev = dev;
-+      vnic->net_dev = net_dev;
-+      spin_lock_init(&vnic->irq_enabled_lock);
-+      netfront_accel_ssr_init(&vnic->ssr_state);
-+
-+      init_waitqueue_head(&vnic->state_wait_queue);
-+      vnic->backend_state = XenbusStateUnknown;
-+      vnic->frontend_state = XenbusStateClosed;
-+      vnic->removing = 0;
-+      vnic->domU_state_is_setup = 0;
-+      vnic->dom0_state_is_setup = 0;
-+      vnic->poll_enabled = 0;
-+      vnic->tx_enabled = 0;
-+      vnic->tx_skb = NULL;
-+
-+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
-+      INIT_WORK(&vnic->msg_from_bend, netfront_accel_msg_from_bend);
-+#else
-+      INIT_WORK(&vnic->msg_from_bend, netfront_accel_msg_from_bend, vnic);
-+#endif
-+
-+      netfront_accel_debugfs_create(vnic);
-+
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      err = net_accel_xen_net_read_mac(dev, vnic->mac);
-+      if (err) 
-+              goto fail_mac;
-+
-+      /* Setup a watch on the frontend's MAC address */
-+      err = setup_mac_address_watch(dev, vnic);
-+      if (err)
-+              goto fail_mac;
-+
-+      return vnic;
-+
-+fail_mac:
-+
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      netfront_accel_debugfs_remove(vnic);
-+
-+      netfront_accel_ssr_fini(vnic, &vnic->ssr_state);
-+
-+      EPRINTK_ON(vnic->tx_skb != NULL);
-+
-+      vnic->frontend_state = XenbusStateUnknown;
-+      net_accel_update_state(dev, XenbusStateUnknown);
-+
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      np->accel_priv = NULL;
-+      kfree(vnic);
-+
-+      return ERR_PTR(err);
-+}
-+
-+
-+static void netfront_accel_vnic_dtor(netfront_accel_vnic *vnic)
-+{
-+      struct net_device *net_dev = vnic->net_dev;
-+      struct netfront_info *np = 
-+              (struct netfront_info *)netdev_priv(net_dev);
-+
-+      /*
-+       * Now we don't hold the lock any more it is safe to remove
-+       * this watch and synchonrise with the completion of
-+       * watches
-+       */
-+      DPRINTK("%s: unregistering xenbus mac watch\n", __FUNCTION__);
-+      unregister_xenbus_watch(&vnic->mac_address_watch);
-+      kfree(vnic->mac_address_watch.node);
-+
-+      flush_workqueue(netfront_accel_workqueue);
-+
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      netfront_accel_debugfs_remove(vnic);
-+
-+      netfront_accel_ssr_fini(vnic, &vnic->ssr_state);
-+
-+      EPRINTK_ON(vnic->tx_skb != NULL);
-+
-+      vnic->frontend_state = XenbusStateUnknown;
-+      net_accel_update_state(vnic->dev, XenbusStateUnknown);
-+
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      np->accel_priv = NULL;
-+      kfree(vnic);
-+}
-+
-+
-+static int vnic_setup_domU_shared_state(struct xenbus_device *dev,
-+                                      netfront_accel_vnic *vnic)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+      int msgs_per_queue;
-+
-+
-+      DPRINTK("Setting up domU shared state.\n");
-+
-+      msgs_per_queue = (PAGE_SIZE/2) / sizeof(struct net_accel_msg);
-+
-+      /* Allocate buffer state */
-+      vnic->tx_bufs = netfront_accel_init_bufs(&vnic->tx_lock);
-+      if (vnic->tx_bufs == NULL) {
-+              err = -ENOMEM;
-+              EPRINTK("%s: Failed to allocate tx buffers\n", __FUNCTION__);
-+              goto fail_tx_bufs;
-+      }
-+
-+      vnic->rx_bufs = netfront_accel_init_bufs(NULL);
-+      if (vnic->rx_bufs == NULL) {
-+              err = -ENOMEM;
-+              EPRINTK("%s: Failed to allocate rx buffers\n", __FUNCTION__);
-+              goto fail_rx_bufs;
-+      }
-+
-+      /* 
-+       * This allocates two pages, one for the shared page and one
-+       * for the message queue.
-+       */
-+      vnic->shared_page = (struct net_accel_shared_page *)
-+              __get_free_pages(GFP_KERNEL, 1);
-+      if (vnic->shared_page == NULL) {
-+              EPRINTK("%s: no memory for shared pages\n", __FUNCTION__);
-+              err = -ENOMEM;
-+              goto fail_shared_page;
-+      }
-+
-+      net_accel_msg_init_queue
-+              (&vnic->from_dom0, &vnic->shared_page->queue0, 
-+               (struct net_accel_msg *)((u8*)vnic->shared_page + PAGE_SIZE),
-+               msgs_per_queue);
-+
-+      net_accel_msg_init_queue
-+              (&vnic->to_dom0, &vnic->shared_page->queue1,
-+               (struct net_accel_msg *)((u8*)vnic->shared_page +
-+                                        (3 * PAGE_SIZE / 2)),
-+               msgs_per_queue);
-+      
-+      vnic->msg_state = NETFRONT_ACCEL_MSG_NONE;
-+
-+      err = make_named_grant(dev, vnic->shared_page, "accel-ctrl-page",
-+                             &vnic->ctrl_page_gnt);
-+      if (err) {
-+              EPRINTK("couldn't make ctrl-page named grant\n");
-+              goto fail_ctrl_page_grant;
-+      }
-+
-+      err = make_named_grant(dev, (u8*)vnic->shared_page + PAGE_SIZE,
-+                             "accel-msg-page", &vnic->msg_page_gnt);
-+      if (err) {
-+              EPRINTK("couldn't make msg-page named grant\n");
-+              goto fail_msg_page_grant;
-+      }
-+
-+      /* Create xenbus msg event channel */
-+      err = bind_listening_port_to_irqhandler
-+              (dev->otherend_id, netfront_accel_msg_channel_irq_from_bend,
-+               SA_SAMPLE_RANDOM, "vnicctrl", vnic);
-+      if (err < 0) {
-+              EPRINTK("Couldn't bind msg event channel\n");
-+              goto fail_msg_irq;
-+      }
-+      vnic->msg_channel_irq = err;
-+      vnic->msg_channel = irq_to_evtchn_port(vnic->msg_channel_irq);
-+      
-+      /* Create xenbus net event channel */
-+      err = bind_listening_port_to_irqhandler
-+              (dev->otherend_id, netfront_accel_net_channel_irq_from_bend,
-+               SA_SAMPLE_RANDOM, "vnicfront", vnic);
-+      if (err < 0) {
-+              EPRINTK("Couldn't bind net event channel\n");
-+              goto fail_net_irq;
-+      }
-+      vnic->net_channel_irq = err;
-+      vnic->net_channel = irq_to_evtchn_port(vnic->net_channel_irq);
-+      /* Want to ensure we don't get interrupts before we're ready */
-+      netfront_accel_disable_net_interrupts(vnic);
-+
-+      DPRINTK("otherend %d has msg ch %u (%u) and net ch %u (%u)\n",
-+              dev->otherend_id, vnic->msg_channel, vnic->msg_channel_irq, 
-+              vnic->net_channel, vnic->net_channel_irq);
-+
-+      do {
-+              err = xenbus_transaction_start(&tr);
-+              if (err != 0) {
-+                      EPRINTK("%s: Transaction start failed %d\n",
-+                              __FUNCTION__, err);
-+                      goto fail_transaction;
-+              }
-+
-+              err = xenbus_printf(tr, dev->nodename, "accel-msg-channel",
-+                                  "%u", vnic->msg_channel);
-+              if (err != 0) {
-+                      EPRINTK("%s: event channel xenbus write failed %d\n",
-+                              __FUNCTION__, err);
-+                      xenbus_transaction_end(tr, 1);
-+                      goto fail_transaction;
-+              }
-+
-+              err = xenbus_printf(tr, dev->nodename, "accel-net-channel",
-+                                  "%u", vnic->net_channel);
-+              if (err != 0) {
-+                      EPRINTK("%s: net channel xenbus write failed %d\n",
-+                              __FUNCTION__, err);
-+                      xenbus_transaction_end(tr, 1);
-+                      goto fail_transaction;
-+              }
-+
-+              err = xenbus_transaction_end(tr, 0);
-+      } while (err == -EAGAIN);
-+
-+      if (err != 0) {
-+              EPRINTK("%s: Transaction end failed %d\n", __FUNCTION__, err);
-+              goto fail_transaction;
-+      }
-+
-+      DPRINTK("Completed setting up domU shared state\n");
-+
-+      return 0;
-+
-+fail_transaction:
-+
-+      unbind_from_irqhandler(vnic->net_channel_irq, vnic);
-+fail_net_irq:
-+
-+      unbind_from_irqhandler(vnic->msg_channel_irq, vnic);
-+fail_msg_irq:
-+
-+      remove_named_grant(dev, "accel-ctrl-page", vnic->ctrl_page_gnt);
-+fail_msg_page_grant:
-+
-+      remove_named_grant(dev, "accel-msg-page", vnic->msg_page_gnt);
-+fail_ctrl_page_grant:
-+
-+      free_pages((unsigned long)vnic->shared_page, 1);
-+      vnic->shared_page = NULL;
-+fail_shared_page:
-+
-+      netfront_accel_fini_bufs(vnic->rx_bufs);
-+fail_rx_bufs:
-+
-+      netfront_accel_fini_bufs(vnic->tx_bufs);
-+fail_tx_bufs:
-+
-+      /* Undo the memory allocation created when we got the HELLO */
-+      netfront_accel_free_buffer_mem(&vnic->bufpages,
-+                                     vnic->rx_bufs,
-+                                     vnic->tx_bufs);
-+
-+      DPRINTK("Failed to setup domU shared state with code %d\n", err);
-+
-+      return err;
-+}
-+
-+
-+static void vnic_remove_domU_shared_state(struct xenbus_device *dev, 
-+                                        netfront_accel_vnic *vnic)
-+{
-+      struct xenbus_transaction tr;
-+      
-+      /*
-+       * Don't remove any watches because we currently hold the
-+       * mutex and the watches take the mutex.
-+       */
-+
-+      DPRINTK("%s: removing event channel irq handlers %d %d\n",
-+              __FUNCTION__, vnic->net_channel_irq, vnic->msg_channel_irq);
-+      do {
-+              if (xenbus_transaction_start(&tr) != 0)
-+                      break;
-+              xenbus_rm(tr, dev->nodename, "accel-msg-channel");
-+              xenbus_rm(tr, dev->nodename, "accel-net-channel");
-+      } while (xenbus_transaction_end(tr, 0) == -EAGAIN);
-+
-+      unbind_from_irqhandler(vnic->net_channel_irq, vnic);
-+      unbind_from_irqhandler(vnic->msg_channel_irq, vnic);
-+
-+      /* ungrant pages for msg channel */
-+      remove_named_grant(dev, "accel-ctrl-page", vnic->ctrl_page_gnt);
-+      remove_named_grant(dev, "accel-msg-page", vnic->msg_page_gnt);
-+      free_pages((unsigned long)vnic->shared_page, 1);
-+      vnic->shared_page = NULL;
-+
-+      /* ungrant pages for buffers, and free buffer memory */
-+      netfront_accel_free_buffer_mem(&vnic->bufpages,
-+                                     vnic->rx_bufs,
-+                                     vnic->tx_bufs);
-+      netfront_accel_fini_bufs(vnic->rx_bufs);
-+      netfront_accel_fini_bufs(vnic->tx_bufs);
-+}
-+
-+
-+static void vnic_setup_dom0_shared_state(struct xenbus_device *dev,
-+                                      netfront_accel_vnic *vnic)
-+{
-+      DPRINTK("Setting up dom0 shared state\n");
-+
-+      netfront_accel_vi_ctor(vnic);
-+
-+      /*
-+       * Message processing will be enabled when this function
-+       * returns, but we might have missed an interrupt.  Schedule a
-+       * check just in case.
-+       */
-+      queue_work(netfront_accel_workqueue, &vnic->msg_from_bend);
-+}
-+
-+
-+static void vnic_remove_dom0_shared_state(struct xenbus_device *dev,
-+                                        netfront_accel_vnic *vnic)
-+{
-+      DPRINTK("Removing dom0 shared state\n");
-+
-+      vnic_stop_fastpath(vnic);
-+
-+      netfront_accel_vi_dtor(vnic);
-+}
-+
-+
-+/*************************************************************************/
-+
-+/*
-+ * The following code handles accelstate changes between the frontend
-+ * and the backend.  In response to transitions, calls the following
-+ * functions in matching pairs:
-+ *
-+ *   vnic_setup_domU_shared_state
-+ *   vnic_remove_domU_shared_state
-+ *
-+ *   vnic_setup_dom0_shared_state
-+ *   vnic_remove_dom0_shared_state
-+ *
-+ * Valid state transitions for DomU are as follows:
-+ *
-+ * Closed->Init       on probe or in response to Init from dom0
-+ *
-+ * Init->Connected    in response to Init from dom0
-+ * Init->Closing      on error providing dom0 is in Init
-+ * Init->Closed       on remove or in response to Closing from dom0
-+ *
-+ * Connected->Closing on error/remove
-+ * Connected->Closed  in response to Closing from dom0
-+ *
-+ * Closing->Closed    in response to Closing from dom0
-+ *
-+ */
-+
-+
-+/* Function to deal with Xenbus accel state change in backend */
-+static void netfront_accel_backend_accel_changed(netfront_accel_vnic *vnic,
-+                                               XenbusState backend_state)
-+{
-+      struct xenbus_device *dev = vnic->dev;
-+      XenbusState frontend_state;
-+      int state;
-+
-+      DPRINTK("%s: changing from %s to %s. nodename %s, otherend %s\n",
-+              __FUNCTION__, xenbus_strstate(vnic->backend_state),
-+              xenbus_strstate(backend_state), dev->nodename, dev->otherend);
-+
-+      /*
-+       * Ignore duplicate state changes.  This can happen if the
-+       * backend changes state twice in quick succession and the
-+       * first watch fires in the frontend after the second
-+       * transition has completed.
-+       */
-+      if (vnic->backend_state == backend_state)
-+              return;
-+
-+      vnic->backend_state = backend_state;
-+      frontend_state = vnic->frontend_state;
-+
-+      switch (backend_state) {
-+      case XenbusStateInitialising:
-+              /*
-+               * It's possible for us to miss the closed state from
-+               * dom0, so do the work here.
-+               */
-+              if (vnic->domU_state_is_setup) {
-+                      vnic_remove_domU_shared_state(dev, vnic);
-+                      vnic->domU_state_is_setup = 0;
-+              }
-+
-+              if (frontend_state != XenbusStateInitialising) {
-+                      /* Make sure the backend doesn't go away. */
-+                      frontend_state = XenbusStateInitialising;
-+                      net_accel_update_state(dev, frontend_state);
-+                      xenbus_scanf(XBT_NIL, dev->otherend, "accelstate", "%d", &state);
-+                      backend_state = (XenbusState)state;
-+                      if (backend_state != XenbusStateInitialising)
-+                              break;
-+              }
-+
-+              /* Start the new connection. */
-+              if (!vnic->removing) {
-+                      BUG_ON(vnic->domU_state_is_setup);
-+                      if (vnic_setup_domU_shared_state(dev, vnic) == 0) {
-+                              vnic->domU_state_is_setup = 1;
-+                              frontend_state = XenbusStateConnected;
-+                      } else
-+                              frontend_state = XenbusStateClosing;
-+              }
-+              break;
-+      case XenbusStateConnected:
-+              if (vnic->domU_state_is_setup &&
-+                  !vnic->dom0_state_is_setup) {
-+                      vnic_setup_dom0_shared_state(dev, vnic);
-+                      vnic->dom0_state_is_setup = 1;
-+              }
-+              break;
-+      default:
-+      case XenbusStateClosing:
-+              if (vnic->dom0_state_is_setup) {
-+                      vnic_remove_dom0_shared_state(dev, vnic);
-+                      vnic->dom0_state_is_setup = 0;
-+              }
-+              frontend_state = XenbusStateClosed;
-+              break;
-+      case XenbusStateUnknown:
-+      case XenbusStateClosed:
-+              if (vnic->domU_state_is_setup) {
-+                      vnic_remove_domU_shared_state(dev, vnic);
-+                      vnic->domU_state_is_setup = 0;
-+              }
-+              break;
-+      }
-+
-+      if (frontend_state != vnic->frontend_state) {
-+              DPRINTK("Switching from state %s (%d) to %s (%d)\n",
-+                      xenbus_strstate(vnic->frontend_state),
-+                      vnic->frontend_state,
-+                      xenbus_strstate(frontend_state), frontend_state);
-+              vnic->frontend_state = frontend_state;
-+              net_accel_update_state(dev, frontend_state);
-+      }
-+
-+      wake_up(&vnic->state_wait_queue);
-+}
-+
-+
-+static void backend_accel_state_change(struct xenbus_watch *watch,
-+                                     const char **vec, unsigned int len)
-+{
-+      int state;
-+      netfront_accel_vnic *vnic;
-+      struct xenbus_device *dev;
-+
-+      DPRINTK("%s\n", __FUNCTION__);
-+
-+      vnic = container_of(watch, struct netfront_accel_vnic,
-+                              backend_accel_watch);
-+
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      dev = vnic->dev;
-+
-+      state = (int)XenbusStateUnknown;
-+      xenbus_scanf(XBT_NIL, dev->otherend, "accelstate", "%d", &state);
-+      netfront_accel_backend_accel_changed(vnic, state);
-+
-+      mutex_unlock(&vnic->vnic_mutex);
-+}
-+
-+
-+static int setup_dom0_accel_watch(struct xenbus_device *dev,
-+                                netfront_accel_vnic *vnic)
-+{
-+      int err;
-+
-+      DPRINTK("Setting watch on %s/%s\n", dev->otherend, "accelstate");
-+
-+      err = xenbus_watch_path2(dev, dev->otherend, "accelstate", 
-+                               &vnic->backend_accel_watch, 
-+                               backend_accel_state_change);
-+      if (err) {
-+              EPRINTK("%s: Failed to register xenbus watch: %d\n",
-+                      __FUNCTION__, err);
-+              goto fail;
-+      }
-+      return 0;
-+ fail:
-+      vnic->backend_accel_watch.node = NULL;
-+      return err;
-+}
-+
-+
-+int netfront_accel_probe(struct net_device *net_dev, struct xenbus_device *dev)
-+{
-+      netfront_accel_vnic *vnic;
-+      int err;
-+
-+      DPRINTK("Probe passed device %s\n", dev->nodename);
-+
-+      vnic = netfront_accel_vnic_ctor(net_dev, dev);
-+      if (IS_ERR(vnic))
-+              return PTR_ERR(vnic);
-+
-+      /*
-+       * Setup a watch on the backend accel state.  This sets things
-+       * going.
-+       */
-+      err = setup_dom0_accel_watch(dev, vnic);
-+      if (err) {
-+              netfront_accel_vnic_dtor(vnic);
-+              EPRINTK("%s: probe failed with code %d\n", __FUNCTION__, err);
-+              return err;
-+      }
-+
-+      /*
-+       * Indicate to the other end that we're ready to start unless
-+       * the watch has already fired.
-+       */
-+      mutex_lock(&vnic->vnic_mutex);
-+      VPRINTK("setup success, updating accelstate\n");
-+      if (vnic->frontend_state == XenbusStateClosed) {
-+              vnic->frontend_state = XenbusStateInitialising;
-+              net_accel_update_state(dev, XenbusStateInitialising);
-+      }
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      DPRINTK("Probe done device %s\n", dev->nodename);
-+
-+      return 0;
-+}
-+
-+
-+int netfront_accel_remove(struct xenbus_device *dev)
-+{
-+      struct netfront_info *np =
-+              (struct netfront_info *)dev->dev.driver_data;
-+      netfront_accel_vnic *vnic = (netfront_accel_vnic *)np->accel_priv;
-+
-+      DPRINTK("%s %s\n", __FUNCTION__, dev->nodename);
-+
-+      BUG_ON(vnic == NULL);
-+
-+      mutex_lock(&vnic->vnic_mutex);
-+
-+      /* Reject any attempts to connect. */
-+      vnic->removing = 1;
-+
-+      /* Close any existing connection. */
-+      if (vnic->frontend_state == XenbusStateConnected) {
-+              vnic->frontend_state = XenbusStateClosing;
-+              net_accel_update_state(dev, XenbusStateClosing);
-+      }
-+
-+      mutex_unlock(&vnic->vnic_mutex);
-+
-+      DPRINTK("%s waiting for release of %s\n", __FUNCTION__, dev->nodename);
-+
-+      /*
-+       * Wait for the xenbus watch to release the shared resources.
-+       * This indicates that dom0 has made the transition
-+       * Closing->Closed or that dom0 was in Closed or Init and no
-+       * resources were mapped.
-+       */
-+      wait_event(vnic->state_wait_queue,
-+                 !vnic->domU_state_is_setup);
-+
-+      /*
-+       * Now we don't need this watch anymore it is safe to remove
-+       * it (and so synchronise with it completing if outstanding)
-+       */
-+      DPRINTK("%s: unregistering xenbus accel watch\n",
-+              __FUNCTION__);
-+      unregister_xenbus_watch(&vnic->backend_accel_watch);
-+      kfree(vnic->backend_accel_watch.node);
-+
-+      netfront_accel_vnic_dtor(vnic);
-+
-+      DPRINTK("%s done %s\n", __FUNCTION__, dev->nodename);
-+
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon.h    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,172 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  slp
-+ *  \brief  Falcon specific definitions
-+ *   \date  2004/08
-+ */
-+
-+#ifndef __EF_VI_FALCON_H__
-+#define __EF_VI_FALCON_H__    
-+
-+#define EFHW_4K               0x00001000u
-+#define EFHW_8K               0x00002000u
-+
-+/* include the autogenerated register definitions */
-+
-+#include "ef_vi_falcon_core.h"
-+#include "ef_vi_falcon_desc.h"
-+#include "ef_vi_falcon_event.h"
-+
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * Helpers to turn bit shifts into dword shifts and check that the bit fields 
-+ * haven't overflown the dword etc. Aim is to preserve consistency with the 
-+ * autogenerated headers - once stable we could hard code.
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+/* mask constructors */
-+#define __FALCON_MASK(WIDTH,T)  ((((T)1) << (WIDTH)) - 1)
-+#define __EFVI_MASK32(WIDTH)  __FALCON_MASK((WIDTH),uint32_t)
-+#define __EFVI_MASK64(WIDTH)  __FALCON_MASK((WIDTH),uint64_t)
-+
-+#define __EFVI_FALCON_MASKFIELD32(LBN, WIDTH)   ((uint32_t)  \
-+                             (__EFVI_MASK32(WIDTH) << (LBN)))
-+
-+/* constructors for fields which span the first and second dwords */
-+#define __LW(LBN) (32 - LBN)
-+#define LOW(v, LBN, WIDTH)   ((uint32_t)  \
-+                               (((v) & __EFVI_MASK64(__LW((LBN)))) << (LBN)))
-+#define HIGH(v, LBN, WIDTH)  ((uint32_t)(((v) >> __LW((LBN))) & \
-+                                       __EFVI_MASK64((WIDTH - __LW((LBN))))))
-+/* constructors for fields within the second dword */
-+#define __DW2(LBN)      ((LBN) - 32)
-+
-+/* constructors for fields which span the second and third dwords */
-+#define __LW2(LBN) (64 - LBN)
-+#define LOW2(v, LBN, WIDTH) ((uint32_t) \
-+                       (((v) & __EFVI_MASK64(__LW2((LBN)))) << ((LBN) - 32)))
-+#define HIGH2(v, LBN, WIDTH)  ((uint32_t) \
-+             (((v) >> __LW2((LBN))) & __EFVI_MASK64((WIDTH - __LW2((LBN))))))
-+
-+/* constructors for fields within the third dword */
-+#define __DW3(LBN)      ((LBN) - 64)
-+
-+                              
-+/* constructors for fields which span the third and fourth dwords */
-+#define __LW3(LBN) (96 - LBN)
-+#define LOW3(v, LBN, WIDTH)   ((uint32_t)    \
-+              (((v) & __EFVI_MASK64(__LW3((LBN)))) << ((LBN) - 64)))
-+#define HIGH3(v, LBN, WIDTH)  ((unit32_t)    \
-+             (((v) >> __LW3((LBN))) & __EFVI_MASK64((WIDTH - __LW3((LBN))))))
-+
-+/* constructors for fields within the fourth dword */
-+#define __DW4(LBN)      ((LBN) - 96)
-+
-+/* checks that the autogenerated headers our consistent with our model */
-+#define WIDTHCHCK(a, b) ef_assert((a) == (b))
-+#define RANGECHCK(v, WIDTH) \
-+                ef_assert(((uint64_t)(v) & ~(__EFVI_MASK64((WIDTH)))) == 0)
-+
-+/* fields within the first dword */
-+#define DWCHCK(LBN, WIDTH) ef_assert(((LBN) >= 0) &&(((LBN)+(WIDTH)) <= 32))
-+
-+/* fields which span the first and second dwords */
-+#define LWCHK(LBN, WIDTH)  ef_assert(WIDTH >= __LW(LBN))
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * Buffer virtual addresses (4K buffers) 
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+/* Form a buffer virtual address from buffer ID and offset.  If the offset
-+** is larger than the buffer size, then the buffer indexed will be
-+** calculated appropriately.  It is the responsibility of the caller to
-+** ensure that they have valid buffers programmed at that address.
-+*/
-+#define EFVI_FALCON_VADDR_4K_S        (12)         
-+#define EFVI_FALCON_VADDR_M       0xfffff             /* post shift mask  */
-+
-+
-+#define EFVI_FALCON_BUFFER_4K_ADDR(id,off)      \
-+  (((id) << EFVI_FALCON_VADDR_4K_S) + (off))
-+
-+#define EFVI_FALCON_BUFFER_4K_PAGE(vaddr)                       \
-+  (((vaddr) >> EFVI_FALCON_VADDR_4K_S) & EFVI_FALCON_VADDR_M)
-+
-+#define EFVI_FALCON_BUFFER_4K_OFF(vaddr)                \
-+  ((vaddr) & __EFVI_MASK32(EFVI_FALCON_VADDR_4K_S))
-+
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * Masks
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+#define EFVI_FALCON_CLOCK_ASIC_HZ    (125000)
-+#define EFVI_FALCON_CLOCK_FPGA_HZ    (62500)
-+#define EFVI_FALCON_CLOCK_HZ         EFVI_FALCON_CLOCK_ASIC_HZ
-+
-+
-+/*----------------------------------------------------------------------------
-+ *
-+ * Timers
-+ *
-+ *---------------------------------------------------------------------------*/
-+
-+/* Event-Queue Timer granularity - measured in us 
-+   Given by: 4096 * 3 cycle * clock period */
-+
-+#define EFVI_FALCON_EVQTIMER_PERIOD_US   ((4096 * 3 * 1000) / EFVI_FALCON_CLOCK_HZ)
-+
-+/* mode bits */
-+#define EFVI_FALCON_TIMER_MODE_DIS     0     /* disabled */
-+#define EFVI_FALCON_TIMER_MODE_RUN     1     /* started counting right away */
-+#define EFVI_FALCON_TIMER_MODE_HOLD    2     /* trigger mode (user queues) */
-+
-+#define EFVI_FALCON_EVQTIMER_HOLD     (EFVI_FALCON_TIMER_MODE_HOLD << TIMER_MODE_LBN)
-+#define EFVI_FALCON_EVQTIMER_RUN      (EFVI_FALCON_TIMER_MODE_RUN  << TIMER_MODE_LBN)
-+#define EFVI_FALCON_EVQTIMER_DISABLE  (EFVI_FALCON_TIMER_MODE_DIS  << TIMER_MODE_LBN) 
-+
-+
-+/* ---- efhw_event_t helpers --- */
-+
-+#define EFVI_FALCON_EVENT_CODE(evp) \
-+       ((evp)->u64 & EFVI_FALCON_EVENT_CODE_MASK)
-+
-+#define EFVI_FALCON_EVENT_SW_DATA_MASK    0x0000ffff
-+
-+#define __EFVI_FALCON_OPEN_MASK(WIDTH)  ((((uint64_t)1) << (WIDTH)) - 1)
-+
-+#define EFVI_FALCON_EVENT_CODE_MASK \
-+           (__EFVI_FALCON_OPEN_MASK(EV_CODE_WIDTH) << EV_CODE_LBN)
-+
-+
-+#endif  /* __EF_VI_FALCON_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_core.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_core.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,1075 @@
-+
-+#define  EFVI_FALCON_EXTENDED_P_BAR 1
-+
-+//////////////---- Bus Interface Unit Registers C Header ----//////////////
-+#define IOM_IND_ADR_REG_OFST 0x0 // IO-mapped indirect access address register
-+  #define IOM_AUTO_ADR_INC_EN_LBN 16
-+  #define IOM_AUTO_ADR_INC_EN_WIDTH 1
-+  #define IOM_IND_ADR_LBN 0
-+  #define IOM_IND_ADR_WIDTH 16
-+#define IOM_IND_DAT_REG_OFST 0x4 // IO-mapped indirect access data register
-+  #define IOM_IND_DAT_LBN 0
-+  #define IOM_IND_DAT_WIDTH 32
-+#define ADR_REGION_REG_KER_OFST 0x0 // Address region register
-+#define ADR_REGION_REG_OFST 0x0 // Address region register
-+  #define ADR_REGION3_LBN 96
-+  #define ADR_REGION3_WIDTH 18
-+  #define ADR_REGION2_LBN 64
-+  #define ADR_REGION2_WIDTH 18
-+  #define ADR_REGION1_LBN 32
-+  #define ADR_REGION1_WIDTH 18
-+  #define ADR_REGION0_LBN 0
-+  #define ADR_REGION0_WIDTH 18
-+#define INT_EN_REG_KER_OFST 0x10 // Kernel driver Interrupt enable register
-+  #define KER_INT_CHAR_LBN 4
-+  #define KER_INT_CHAR_WIDTH 1
-+  #define KER_INT_KER_LBN 3
-+  #define KER_INT_KER_WIDTH 1
-+  #define ILL_ADR_ERR_INT_EN_KER_LBN 2
-+  #define ILL_ADR_ERR_INT_EN_KER_WIDTH 1
-+  #define SRM_PERR_INT_EN_KER_LBN 1
-+  #define SRM_PERR_INT_EN_KER_WIDTH 1
-+  #define DRV_INT_EN_KER_LBN 0
-+  #define DRV_INT_EN_KER_WIDTH 1
-+#define INT_EN_REG_CHAR_OFST 0x20 // Char Driver interrupt enable register
-+  #define CHAR_INT_CHAR_LBN 4
-+  #define CHAR_INT_CHAR_WIDTH 1
-+  #define CHAR_INT_KER_LBN 3
-+  #define CHAR_INT_KER_WIDTH 1
-+  #define ILL_ADR_ERR_INT_EN_CHAR_LBN 2
-+  #define ILL_ADR_ERR_INT_EN_CHAR_WIDTH 1
-+  #define SRM_PERR_INT_EN_CHAR_LBN 1
-+  #define SRM_PERR_INT_EN_CHAR_WIDTH 1
-+  #define DRV_INT_EN_CHAR_LBN 0
-+  #define DRV_INT_EN_CHAR_WIDTH 1
-+#define INT_ADR_REG_KER_OFST 0x30 // Interrupt host address for Kernel driver
-+  #define INT_ADR_KER_LBN 0
-+  #define INT_ADR_KER_WIDTH 64
-+  #define DRV_INT_KER_LBN 32
-+  #define DRV_INT_KER_WIDTH 1
-+  #define EV_FF_HALF_INT_KER_LBN 3
-+  #define EV_FF_HALF_INT_KER_WIDTH 1
-+  #define EV_FF_FULL_INT_KER_LBN 2
-+  #define EV_FF_FULL_INT_KER_WIDTH 1
-+  #define ILL_ADR_ERR_INT_KER_LBN 1
-+  #define ILL_ADR_ERR_INT_KER_WIDTH 1
-+  #define SRAM_PERR_INT_KER_LBN 0
-+  #define SRAM_PERR_INT_KER_WIDTH 1
-+#define INT_ADR_REG_CHAR_OFST 0x40 // Interrupt host address for Char driver
-+  #define INT_ADR_CHAR_LBN 0
-+  #define INT_ADR_CHAR_WIDTH 64
-+  #define DRV_INT_CHAR_LBN 32
-+  #define DRV_INT_CHAR_WIDTH 1
-+  #define EV_FF_HALF_INT_CHAR_LBN 3
-+  #define EV_FF_HALF_INT_CHAR_WIDTH 1
-+  #define EV_FF_FULL_INT_CHAR_LBN 2
-+  #define EV_FF_FULL_INT_CHAR_WIDTH 1
-+  #define ILL_ADR_ERR_INT_CHAR_LBN 1
-+  #define ILL_ADR_ERR_INT_CHAR_WIDTH 1
-+  #define SRAM_PERR_INT_CHAR_LBN 0
-+  #define SRAM_PERR_INT_CHAR_WIDTH 1
-+#define INT_ISR0_B0_OFST 0x90 // B0 only
-+#define INT_ISR1_B0_OFST 0xA0
-+#define INT_ACK_REG_KER_A1_OFST 0x50 // Kernel interrupt acknowledge register
-+  #define RESERVED_LBN 0
-+  #define RESERVED_WIDTH 32
-+#define INT_ACK_REG_CHAR_A1_OFST 0x60 // CHAR interrupt acknowledge register
-+  #define RESERVED_LBN 0
-+  #define RESERVED_WIDTH 32
-+//////////////---- Global CSR Registers C Header ----//////////////
-+#define STRAP_REG_KER_OFST 0x200 // ASIC strap status register
-+#define STRAP_REG_OFST 0x200 // ASIC strap status register
-+  #define ONCHIP_SRAM_LBN 16
-+  #define ONCHIP_SRAM_WIDTH 0
-+  #define STRAP_ISCSI_EN_LBN 3
-+  #define STRAP_ISCSI_EN_WIDTH 1
-+  #define STRAP_PINS_LBN 0
-+  #define STRAP_PINS_WIDTH 3
-+#define GPIO_CTL_REG_KER_OFST 0x210 // GPIO control register
-+#define GPIO_CTL_REG_OFST 0x210 // GPIO control register
-+  #define GPIO_OEN_LBN 24
-+  #define GPIO_OEN_WIDTH 4
-+  #define GPIO_OUT_LBN 16
-+  #define GPIO_OUT_WIDTH 4
-+  #define GPIO_IN_LBN 8
-+  #define GPIO_IN_WIDTH 4
-+  #define GPIO_PWRUP_VALUE_LBN 0
-+  #define GPIO_PWRUP_VALUE_WIDTH 4
-+#define GLB_CTL_REG_KER_OFST 0x220 // Global control register
-+#define GLB_CTL_REG_OFST 0x220 // Global control register
-+  #define SWRST_LBN 0
-+  #define SWRST_WIDTH 1
-+#define FATAL_INTR_REG_KER_OFST 0x230 // Fatal interrupt register for Kernel
-+  #define PCI_BUSERR_INT_KER_EN_LBN 43
-+  #define PCI_BUSERR_INT_KER_EN_WIDTH 1
-+  #define SRAM_OOB_INT_KER_EN_LBN 42
-+  #define SRAM_OOB_INT_KER_EN_WIDTH 1
-+  #define BUFID_OOB_INT_KER_EN_LBN 41
-+  #define BUFID_OOB_INT_KER_EN_WIDTH 1
-+  #define MEM_PERR_INT_KER_EN_LBN 40
-+  #define MEM_PERR_INT_KER_EN_WIDTH 1
-+  #define RBUF_OWN_INT_KER_EN_LBN 39
-+  #define RBUF_OWN_INT_KER_EN_WIDTH 1
-+  #define TBUF_OWN_INT_KER_EN_LBN 38
-+  #define TBUF_OWN_INT_KER_EN_WIDTH 1
-+  #define RDESCQ_OWN_INT_KER_EN_LBN 37
-+  #define RDESCQ_OWN_INT_KER_EN_WIDTH 1
-+  #define TDESCQ_OWN_INT_KER_EN_LBN 36
-+  #define TDESCQ_OWN_INT_KER_EN_WIDTH 1
-+  #define EVQ_OWN_INT_KER_EN_LBN 35
-+  #define EVQ_OWN_INT_KER_EN_WIDTH 1
-+  #define EVFF_OFLO_INT_KER_EN_LBN 34
-+  #define EVFF_OFLO_INT_KER_EN_WIDTH 1
-+  #define ILL_ADR_INT_KER_EN_LBN 33
-+  #define ILL_ADR_INT_KER_EN_WIDTH 1
-+  #define SRM_PERR_INT_KER_EN_LBN 32
-+  #define SRM_PERR_INT_KER_EN_WIDTH 1
-+  #define PCI_BUSERR_INT_KER_LBN 11
-+  #define PCI_BUSERR_INT_KER_WIDTH 1
-+  #define SRAM_OOB_INT_KER_LBN 10
-+  #define SRAM_OOB_INT_KER_WIDTH 1
-+  #define BUFID_OOB_INT_KER_LBN 9
-+  #define BUFID_OOB_INT_KER_WIDTH 1
-+  #define MEM_PERR_INT_KER_LBN 8
-+  #define MEM_PERR_INT_KER_WIDTH 1
-+  #define RBUF_OWN_INT_KER_LBN 7
-+  #define RBUF_OWN_INT_KER_WIDTH 1
-+  #define TBUF_OWN_INT_KER_LBN 6
-+  #define TBUF_OWN_INT_KER_WIDTH 1
-+  #define RDESCQ_OWN_INT_KER_LBN 5
-+  #define RDESCQ_OWN_INT_KER_WIDTH 1
-+  #define TDESCQ_OWN_INT_KER_LBN 4
-+  #define TDESCQ_OWN_INT_KER_WIDTH 1
-+  #define EVQ_OWN_INT_KER_LBN 3
-+  #define EVQ_OWN_INT_KER_WIDTH 1
-+  #define EVFF_OFLO_INT_KER_LBN 2
-+  #define EVFF_OFLO_INT_KER_WIDTH 1
-+  #define ILL_ADR_INT_KER_LBN 1
-+  #define ILL_ADR_INT_KER_WIDTH 1
-+  #define SRM_PERR_INT_KER_LBN 0
-+  #define SRM_PERR_INT_KER_WIDTH 1
-+#define FATAL_INTR_REG_OFST 0x240 // Fatal interrupt register for Char
-+  #define PCI_BUSERR_INT_CHAR_EN_LBN 43
-+  #define PCI_BUSERR_INT_CHAR_EN_WIDTH 1
-+  #define SRAM_OOB_INT_CHAR_EN_LBN 42
-+  #define SRAM_OOB_INT_CHAR_EN_WIDTH 1
-+  #define BUFID_OOB_INT_CHAR_EN_LBN 41
-+  #define BUFID_OOB_INT_CHAR_EN_WIDTH 1
-+  #define MEM_PERR_INT_CHAR_EN_LBN 40
-+  #define MEM_PERR_INT_CHAR_EN_WIDTH 1
-+  #define RBUF_OWN_INT_CHAR_EN_LBN 39
-+  #define RBUF_OWN_INT_CHAR_EN_WIDTH 1
-+  #define TBUF_OWN_INT_CHAR_EN_LBN 38
-+  #define TBUF_OWN_INT_CHAR_EN_WIDTH 1
-+  #define RDESCQ_OWN_INT_CHAR_EN_LBN 37
-+  #define RDESCQ_OWN_INT_CHAR_EN_WIDTH 1
-+  #define TDESCQ_OWN_INT_CHAR_EN_LBN 36
-+  #define TDESCQ_OWN_INT_CHAR_EN_WIDTH 1
-+  #define EVQ_OWN_INT_CHAR_EN_LBN 35
-+  #define EVQ_OWN_INT_CHAR_EN_WIDTH 1
-+  #define EVFF_OFLO_INT_CHAR_EN_LBN 34
-+  #define EVFF_OFLO_INT_CHAR_EN_WIDTH 1
-+  #define ILL_ADR_INT_CHAR_EN_LBN 33
-+  #define ILL_ADR_INT_CHAR_EN_WIDTH 1
-+  #define SRM_PERR_INT_CHAR_EN_LBN 32
-+  #define SRM_PERR_INT_CHAR_EN_WIDTH 1
-+  #define FATAL_INTR_REG_EN_BITS    0xffffffffffffffffULL
-+  #define PCI_BUSERR_INT_CHAR_LBN 11
-+  #define PCI_BUSERR_INT_CHAR_WIDTH 1
-+  #define SRAM_OOB_INT_CHAR_LBN 10
-+  #define SRAM_OOB_INT_CHAR_WIDTH 1
-+  #define BUFID_OOB_INT_CHAR_LBN 9
-+  #define BUFID_OOB_INT_CHAR_WIDTH 1
-+  #define MEM_PERR_INT_CHAR_LBN 8
-+  #define MEM_PERR_INT_CHAR_WIDTH 1
-+  #define RBUF_OWN_INT_CHAR_LBN 7
-+  #define RBUF_OWN_INT_CHAR_WIDTH 1
-+  #define TBUF_OWN_INT_CHAR_LBN 6
-+  #define TBUF_OWN_INT_CHAR_WIDTH 1
-+  #define RDESCQ_OWN_INT_CHAR_LBN 5
-+  #define RDESCQ_OWN_INT_CHAR_WIDTH 1
-+  #define TDESCQ_OWN_INT_CHAR_LBN 4
-+  #define TDESCQ_OWN_INT_CHAR_WIDTH 1
-+  #define EVQ_OWN_INT_CHAR_LBN 3
-+  #define EVQ_OWN_INT_CHAR_WIDTH 1
-+  #define EVFF_OFLO_INT_CHAR_LBN 2
-+  #define EVFF_OFLO_INT_CHAR_WIDTH 1
-+  #define ILL_ADR_INT_CHAR_LBN 1
-+  #define ILL_ADR_INT_CHAR_WIDTH 1
-+  #define SRM_PERR_INT_CHAR_LBN 0
-+  #define SRM_PERR_INT_CHAR_WIDTH 1
-+#define DP_CTRL_REG_OFST 0x250 // Datapath control register
-+  #define FLS_EVQ_ID_LBN 0
-+  #define FLS_EVQ_ID_WIDTH 12
-+#define MEM_STAT_REG_KER_OFST 0x260 // Memory status register
-+#define MEM_STAT_REG_OFST 0x260 // Memory status register
-+  #define MEM_PERR_VEC_LBN 53
-+  #define MEM_PERR_VEC_WIDTH 38
-+  #define MBIST_CORR_LBN 38
-+  #define MBIST_CORR_WIDTH 15
-+  #define MBIST_ERR_LBN 0
-+  #define MBIST_ERR_WIDTH 38
-+#define DEBUG_REG_KER_OFST 0x270 // Debug register
-+#define DEBUG_REG_OFST 0x270 // Debug register
-+  #define DEBUG_BLK_SEL2_LBN 47
-+  #define DEBUG_BLK_SEL2_WIDTH 3
-+  #define DEBUG_BLK_SEL1_LBN 44
-+  #define DEBUG_BLK_SEL1_WIDTH 3
-+  #define DEBUG_BLK_SEL0_LBN 41
-+  #define DEBUG_BLK_SEL0_WIDTH 3
-+  #define MISC_DEBUG_ADDR_LBN 36
-+  #define MISC_DEBUG_ADDR_WIDTH 5
-+  #define SERDES_DEBUG_ADDR_LBN 31
-+  #define SERDES_DEBUG_ADDR_WIDTH 5
-+  #define EM_DEBUG_ADDR_LBN 26
-+  #define EM_DEBUG_ADDR_WIDTH 5
-+  #define SR_DEBUG_ADDR_LBN 21
-+  #define SR_DEBUG_ADDR_WIDTH 5
-+  #define EV_DEBUG_ADDR_LBN 16
-+  #define EV_DEBUG_ADDR_WIDTH 5
-+  #define RX_DEBUG_ADDR_LBN 11
-+  #define RX_DEBUG_ADDR_WIDTH 5
-+  #define TX_DEBUG_ADDR_LBN 6
-+  #define TX_DEBUG_ADDR_WIDTH 5
-+  #define BIU_DEBUG_ADDR_LBN 1
-+  #define BIU_DEBUG_ADDR_WIDTH 5
-+  #define DEBUG_EN_LBN 0
-+  #define DEBUG_EN_WIDTH 1
-+#define DRIVER_REG0_KER_OFST 0x280 // Driver scratch register 0
-+#define DRIVER_REG0_OFST 0x280 // Driver scratch register 0
-+  #define DRIVER_DW0_LBN 0
-+  #define DRIVER_DW0_WIDTH 32
-+#define DRIVER_REG1_KER_OFST 0x290 // Driver scratch register 1
-+#define DRIVER_REG1_OFST 0x290 // Driver scratch register 1
-+  #define DRIVER_DW1_LBN 0
-+  #define DRIVER_DW1_WIDTH 32
-+#define DRIVER_REG2_KER_OFST 0x2A0 // Driver scratch register 2
-+#define DRIVER_REG2_OFST 0x2A0 // Driver scratch register 2
-+  #define DRIVER_DW2_LBN 0
-+  #define DRIVER_DW2_WIDTH 32
-+#define DRIVER_REG3_KER_OFST 0x2B0 // Driver scratch register 3
-+#define DRIVER_REG3_OFST 0x2B0 // Driver scratch register 3
-+  #define DRIVER_DW3_LBN 0
-+  #define DRIVER_DW3_WIDTH 32
-+#define DRIVER_REG4_KER_OFST 0x2C0 // Driver scratch register 4
-+#define DRIVER_REG4_OFST 0x2C0 // Driver scratch register 4
-+  #define DRIVER_DW4_LBN 0
-+  #define DRIVER_DW4_WIDTH 32
-+#define DRIVER_REG5_KER_OFST 0x2D0 // Driver scratch register 5
-+#define DRIVER_REG5_OFST 0x2D0 // Driver scratch register 5
-+  #define DRIVER_DW5_LBN 0
-+  #define DRIVER_DW5_WIDTH 32
-+#define DRIVER_REG6_KER_OFST 0x2E0 // Driver scratch register 6
-+#define DRIVER_REG6_OFST 0x2E0 // Driver scratch register 6
-+  #define DRIVER_DW6_LBN 0
-+  #define DRIVER_DW6_WIDTH 32
-+#define DRIVER_REG7_KER_OFST 0x2F0 // Driver scratch register 7
-+#define DRIVER_REG7_OFST 0x2F0 // Driver scratch register 7
-+  #define DRIVER_DW7_LBN 0
-+  #define DRIVER_DW7_WIDTH 32
-+#define ALTERA_BUILD_REG_OFST 0x300 // Altera build register
-+#define ALTERA_BUILD_REG_OFST 0x300 // Altera build register
-+  #define ALTERA_BUILD_VER_LBN 0
-+  #define ALTERA_BUILD_VER_WIDTH 32
-+
-+/* so called CSR spare register 
-+    - contains separate parity enable bits for the various internal memory blocks */
-+#define MEM_PARITY_ERR_EN_REG_KER 0x310 
-+#define MEM_PARITY_ALL_BLOCKS_EN_LBN 64
-+#define MEM_PARITY_ALL_BLOCKS_EN_WIDTH 38
-+#define MEM_PARITY_TX_DATA_EN_LBN   72
-+#define MEM_PARITY_TX_DATA_EN_WIDTH 2
-+
-+//////////////---- Event & Timer Module Registers C Header ----//////////////
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define EVQ_RPTR_REG_KER_OFST 0x11B00 // Event queue read pointer register
-+#else
-+#define EVQ_RPTR_REG_KER_OFST 0x1B00 // Event queue read pointer register
-+#endif
-+
-+#define EVQ_RPTR_REG_OFST 0xFA0000 // Event queue read pointer register array.
-+  #define EVQ_RPTR_LBN 0
-+  #define EVQ_RPTR_WIDTH 15
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define EVQ_PTR_TBL_KER_OFST 0x11A00 // Event queue pointer table for kernel access
-+#else
-+#define EVQ_PTR_TBL_KER_OFST 0x1A00 // Event queue pointer table for kernel access
-+#endif
-+
-+#define EVQ_PTR_TBL_CHAR_OFST 0xF60000 // Event queue pointer table for char direct access
-+  #define EVQ_WKUP_OR_INT_EN_LBN 39
-+  #define EVQ_WKUP_OR_INT_EN_WIDTH 1
-+  #define EVQ_NXT_WPTR_LBN 24
-+  #define EVQ_NXT_WPTR_WIDTH 15
-+  #define EVQ_EN_LBN 23
-+  #define EVQ_EN_WIDTH 1
-+  #define EVQ_SIZE_LBN 20
-+  #define EVQ_SIZE_WIDTH 3
-+  #define EVQ_BUF_BASE_ID_LBN 0
-+  #define EVQ_BUF_BASE_ID_WIDTH 20
-+#define TIMER_CMD_REG_KER_OFST 0x420 // Timer table for kernel access. Page-mapped
-+#define TIMER_CMD_REG_PAGE4_OFST 0x8420 // Timer table for user-level access. Page-mapped. For lowest 1K queues.
-+#define TIMER_CMD_REG_PAGE123K_OFST 0x1000420 // Timer table for user-level access. Page-mapped. For upper 3K queues.
-+#define TIMER_TBL_OFST 0xF70000 // Timer table for char driver direct access
-+  #define TIMER_MODE_LBN 12
-+  #define TIMER_MODE_WIDTH 2
-+  #define TIMER_VAL_LBN 0
-+  #define TIMER_VAL_WIDTH 12
-+  #define TIMER_MODE_INT_HLDOFF 2
-+  #define EVQ_BUF_SIZE_LBN 0
-+  #define EVQ_BUF_SIZE_WIDTH 1
-+#define DRV_EV_REG_KER_OFST 0x440 // Driver generated event register
-+#define DRV_EV_REG_OFST 0x440 // Driver generated event register
-+  #define DRV_EV_QID_LBN 64
-+  #define DRV_EV_QID_WIDTH 12
-+  #define DRV_EV_DATA_LBN 0
-+  #define DRV_EV_DATA_WIDTH 64
-+#define EVQ_CTL_REG_KER_OFST 0x450 // Event queue control register
-+#define EVQ_CTL_REG_OFST 0x450 // Event queue control register
-+  #define RX_EVQ_WAKEUP_MASK_B0_LBN 15
-+  #define RX_EVQ_WAKEUP_MASK_B0_WIDTH 6
-+  #define EVQ_OWNERR_CTL_LBN 14
-+  #define EVQ_OWNERR_CTL_WIDTH 1
-+  #define EVQ_FIFO_AF_TH_LBN 8
-+  #define EVQ_FIFO_AF_TH_WIDTH 6
-+  #define EVQ_FIFO_NOTAF_TH_LBN 0
-+  #define EVQ_FIFO_NOTAF_TH_WIDTH 6
-+//////////////---- SRAM Module Registers C Header ----//////////////
-+#define BUF_TBL_CFG_REG_KER_OFST 0x600 // Buffer table configuration register
-+#define BUF_TBL_CFG_REG_OFST 0x600 // Buffer table configuration register
-+  #define BUF_TBL_MODE_LBN 3
-+  #define BUF_TBL_MODE_WIDTH 1
-+#define SRM_RX_DC_CFG_REG_KER_OFST 0x610 // SRAM receive descriptor cache configuration register
-+#define SRM_RX_DC_CFG_REG_OFST 0x610 // SRAM receive descriptor cache configuration register
-+  #define SRM_RX_DC_BASE_ADR_LBN 0
-+  #define SRM_RX_DC_BASE_ADR_WIDTH 21
-+#define SRM_TX_DC_CFG_REG_KER_OFST 0x620 // SRAM transmit descriptor cache configuration register
-+#define SRM_TX_DC_CFG_REG_OFST 0x620 // SRAM transmit descriptor cache configuration register
-+  #define SRM_TX_DC_BASE_ADR_LBN 0
-+  #define SRM_TX_DC_BASE_ADR_WIDTH 21
-+#define SRM_CFG_REG_KER_OFST 0x630 // SRAM configuration register
-+#define SRM_CFG_REG_OFST 0x630 // SRAM configuration register
-+  #define SRAM_OOB_ADR_INTEN_LBN 5
-+  #define SRAM_OOB_ADR_INTEN_WIDTH 1
-+  #define SRAM_OOB_BUF_INTEN_LBN 4
-+  #define SRAM_OOB_BUF_INTEN_WIDTH 1
-+  #define SRAM_BT_INIT_EN_LBN 3
-+  #define SRAM_BT_INIT_EN_WIDTH 1
-+  #define SRM_NUM_BANK_LBN 2
-+  #define SRM_NUM_BANK_WIDTH 1
-+  #define SRM_BANK_SIZE_LBN 0
-+  #define SRM_BANK_SIZE_WIDTH 2
-+#define BUF_TBL_UPD_REG_KER_OFST 0x650 // Buffer table update register
-+#define BUF_TBL_UPD_REG_OFST 0x650 // Buffer table update register
-+  #define BUF_UPD_CMD_LBN 63
-+  #define BUF_UPD_CMD_WIDTH 1
-+  #define BUF_CLR_CMD_LBN 62
-+  #define BUF_CLR_CMD_WIDTH 1
-+  #define BUF_CLR_END_ID_LBN 32
-+  #define BUF_CLR_END_ID_WIDTH 20
-+  #define BUF_CLR_START_ID_LBN 0
-+  #define BUF_CLR_START_ID_WIDTH 20
-+#define SRM_UPD_EVQ_REG_KER_OFST 0x660 // Buffer table update register
-+#define SRM_UPD_EVQ_REG_OFST 0x660 // Buffer table update register
-+  #define SRM_UPD_EVQ_ID_LBN 0
-+  #define SRM_UPD_EVQ_ID_WIDTH 12
-+#define SRAM_PARITY_REG_KER_OFST 0x670 // SRAM parity register.
-+#define SRAM_PARITY_REG_OFST 0x670 // SRAM parity register.
-+  #define FORCE_SRAM_PERR_LBN 0
-+  #define FORCE_SRAM_PERR_WIDTH 1
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define BUF_HALF_TBL_KER_OFST 0x18000 // Buffer table in half buffer table mode direct access by kernel driver
-+#else
-+#define BUF_HALF_TBL_KER_OFST 0x8000 // Buffer table in half buffer table mode direct access by kernel driver
-+#endif
-+
-+
-+#define BUF_HALF_TBL_OFST 0x800000 // Buffer table in half buffer table mode direct access by char driver
-+  #define BUF_ADR_HBUF_ODD_LBN 44
-+  #define BUF_ADR_HBUF_ODD_WIDTH 20
-+  #define BUF_OWNER_ID_HBUF_ODD_LBN 32
-+  #define BUF_OWNER_ID_HBUF_ODD_WIDTH 12
-+  #define BUF_ADR_HBUF_EVEN_LBN 12
-+  #define BUF_ADR_HBUF_EVEN_WIDTH 20
-+  #define BUF_OWNER_ID_HBUF_EVEN_LBN 0
-+  #define BUF_OWNER_ID_HBUF_EVEN_WIDTH 12
-+
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define BUF_FULL_TBL_KER_OFST 0x18000 // Buffer table in full buffer table mode direct access by kernel driver
-+#else
-+#define BUF_FULL_TBL_KER_OFST 0x8000 // Buffer table in full buffer table mode direct access by kernel driver
-+#endif
-+
-+
-+
-+
-+#define BUF_FULL_TBL_OFST 0x800000 // Buffer table in full buffer table mode direct access by char driver
-+  #define IP_DAT_BUF_SIZE_LBN 50
-+  #define IP_DAT_BUF_SIZE_WIDTH 1
-+  #define BUF_ADR_REGION_LBN 48
-+  #define BUF_ADR_REGION_WIDTH 2
-+  #define BUF_ADR_FBUF_LBN 14
-+  #define BUF_ADR_FBUF_WIDTH 34
-+  #define BUF_OWNER_ID_FBUF_LBN 0
-+  #define BUF_OWNER_ID_FBUF_WIDTH 14
-+#define SRM_DBG_REG_OFST 0x3000000 // SRAM debug access
-+  #define SRM_DBG_LBN 0
-+  #define SRM_DBG_WIDTH 64
-+//////////////---- RX Datapath Registers C Header ----//////////////
-+
-+#define RX_CFG_REG_KER_OFST 0x800 // Receive configuration register
-+#define RX_CFG_REG_OFST 0x800 // Receive configuration register
-+
-+#if !defined(FALCON_64K_RXFIFO) && !defined(FALCON_PRE_02020029)
-+# if !defined(FALCON_128K_RXFIFO)
-+#  define FALCON_128K_RXFIFO
-+# endif
-+#endif
-+
-+#if defined(FALCON_128K_RXFIFO)
-+
-+/* new for B0 */
-+  #define RX_TOEP_TCP_SUPPRESS_B0_LBN 48
-+  #define RX_TOEP_TCP_SUPPRESS_B0_WIDTH 1
-+  #define RX_INGR_EN_B0_LBN 47
-+  #define RX_INGR_EN_B0_WIDTH 1
-+  #define RX_TOEP_IPV4_B0_LBN 46
-+  #define RX_TOEP_IPV4_B0_WIDTH 1
-+  #define RX_HASH_ALG_B0_LBN 45
-+  #define RX_HASH_ALG_B0_WIDTH 1
-+  #define RX_HASH_INSERT_HDR_B0_LBN 44
-+  #define RX_HASH_INSERT_HDR_B0_WIDTH 1
-+/* moved for B0 */
-+  #define RX_DESC_PUSH_EN_B0_LBN 43
-+  #define RX_DESC_PUSH_EN_B0_WIDTH 1
-+  #define RX_RDW_PATCH_EN_LBN 42 /* Non head of line blocking */
-+  #define RX_RDW_PATCH_EN_WIDTH 1
-+  #define RX_PCI_BURST_SIZE_B0_LBN 39
-+  #define RX_PCI_BURST_SIZE_B0_WIDTH 3
-+  #define RX_OWNERR_CTL_B0_LBN 38
-+  #define RX_OWNERR_CTL_B0_WIDTH 1
-+  #define RX_XON_TX_TH_B0_LBN 33 
-+  #define RX_XON_TX_TH_B0_WIDTH 5
-+  #define RX_XOFF_TX_TH_B0_LBN 28 
-+  #define RX_XOFF_TX_TH_B0_WIDTH 5
-+  #define RX_USR_BUF_SIZE_B0_LBN 19
-+  #define RX_USR_BUF_SIZE_B0_WIDTH 9
-+  #define RX_XON_MAC_TH_B0_LBN 10
-+  #define RX_XON_MAC_TH_B0_WIDTH 9
-+  #define RX_XOFF_MAC_TH_B0_LBN 1
-+  #define RX_XOFF_MAC_TH_B0_WIDTH 9
-+  #define RX_XOFF_MAC_EN_B0_LBN 0
-+  #define RX_XOFF_MAC_EN_B0_WIDTH 1
-+
-+#elif !defined(FALCON_PRE_02020029)
-+/* new for B0 */
-+  #define RX_TOEP_TCP_SUPPRESS_B0_LBN 46
-+  #define RX_TOEP_TCP_SUPPRESS_B0_WIDTH 1
-+  #define RX_INGR_EN_B0_LBN 45
-+  #define RX_INGR_EN_B0_WIDTH 1
-+  #define RX_TOEP_IPV4_B0_LBN 44
-+  #define RX_TOEP_IPV4_B0_WIDTH 1
-+  #define RX_HASH_ALG_B0_LBN 43
-+  #define RX_HASH_ALG_B0_WIDTH 41
-+  #define RX_HASH_INSERT_HDR_B0_LBN 42
-+  #define RX_HASH_INSERT_HDR_B0_WIDTH 1
-+/* moved for B0 */
-+  #define RX_DESC_PUSH_EN_B0_LBN 41
-+  #define RX_DESC_PUSH_EN_B0_WIDTH 1
-+  #define RX_PCI_BURST_SIZE_B0_LBN 37
-+  #define RX_PCI_BURST_SIZE_B0_WIDTH 3
-+  #define RX_OWNERR_CTL_B0_LBN 36
-+  #define RX_OWNERR_CTL_B0_WIDTH 1
-+  #define RX_XON_TX_TH_B0_LBN 31
-+  #define RX_XON_TX_TH_B0_WIDTH 5
-+  #define RX_XOFF_TX_TH_B0_LBN 26
-+  #define RX_XOFF_TX_TH_B0_WIDTH 5
-+  #define RX_USR_BUF_SIZE_B0_LBN 17
-+  #define RX_USR_BUF_SIZE_B0_WIDTH 9
-+  #define RX_XON_MAC_TH_B0_LBN 9
-+  #define RX_XON_MAC_TH_B0_WIDTH 8
-+  #define RX_XOFF_MAC_TH_B0_LBN 1
-+  #define RX_XOFF_MAC_TH_B0_WIDTH 8
-+  #define RX_XOFF_MAC_EN_B0_LBN 0
-+  #define RX_XOFF_MAC_EN_B0_WIDTH 1
-+
-+#else
-+/* new for B0 */
-+  #define RX_TOEP_TCP_SUPPRESS_B0_LBN 44
-+  #define RX_TOEP_TCP_SUPPRESS_B0_WIDTH 1
-+  #define RX_INGR_EN_B0_LBN 43
-+  #define RX_INGR_EN_B0_WIDTH 1
-+  #define RX_TOEP_IPV4_B0_LBN 42
-+  #define RX_TOEP_IPV4_B0_WIDTH 1
-+  #define RX_HASH_ALG_B0_LBN 41
-+  #define RX_HASH_ALG_B0_WIDTH 41
-+  #define RX_HASH_INSERT_HDR_B0_LBN 40
-+  #define RX_HASH_INSERT_HDR_B0_WIDTH 1
-+/* moved for B0 */
-+  #define RX_DESC_PUSH_EN_B0_LBN 35
-+  #define RX_DESC_PUSH_EN_B0_WIDTH 1
-+  #define RX_PCI_BURST_SIZE_B0_LBN 35
-+  #define RX_PCI_BURST_SIZE_B0_WIDTH 2
-+  #define RX_OWNERR_CTL_B0_LBN 34
-+  #define RX_OWNERR_CTL_B0_WIDTH 1
-+  #define RX_XON_TX_TH_B0_LBN 29
-+  #define RX_XON_TX_TH_B0_WIDTH 5
-+  #define RX_XOFF_TX_TH_B0_LBN 24
-+  #define RX_XOFF_TX_TH_B0_WIDTH 5
-+  #define RX_USR_BUF_SIZE_B0_LBN 15
-+  #define RX_USR_BUF_SIZE_B0_WIDTH 9
-+  #define RX_XON_MAC_TH_B0_LBN 8
-+  #define RX_XON_MAC_TH_B0_WIDTH 7
-+  #define RX_XOFF_MAC_TH_B0_LBN 1
-+  #define RX_XOFF_MAC_TH_B0_WIDTH 7
-+  #define RX_XOFF_MAC_EN_B0_LBN 0
-+  #define RX_XOFF_MAC_EN_B0_WIDTH 1
-+
-+#endif
-+
-+/* A0/A1 */
-+  #define RX_PUSH_EN_A1_LBN 35
-+  #define RX_PUSH_EN_A1_WIDTH 1
-+  #define RX_PCI_BURST_SIZE_A1_LBN 31
-+  #define RX_PCI_BURST_SIZE_A1_WIDTH 3
-+  #define RX_OWNERR_CTL_A1_LBN 30
-+  #define RX_OWNERR_CTL_A1_WIDTH 1
-+  #define RX_XON_TX_TH_A1_LBN 25
-+  #define RX_XON_TX_TH_A1_WIDTH 5
-+  #define RX_XOFF_TX_TH_A1_LBN 20
-+  #define RX_XOFF_TX_TH_A1_WIDTH 5
-+  #define RX_USR_BUF_SIZE_A1_LBN 11
-+  #define RX_USR_BUF_SIZE_A1_WIDTH 9
-+  #define RX_XON_MAC_TH_A1_LBN 6
-+  #define RX_XON_MAC_TH_A1_WIDTH 5
-+  #define RX_XOFF_MAC_TH_A1_LBN 1
-+  #define RX_XOFF_MAC_TH_A1_WIDTH 5
-+  #define RX_XOFF_MAC_EN_A1_LBN 0
-+  #define RX_XOFF_MAC_EN_A1_WIDTH 1
-+
-+#define RX_FILTER_CTL_REG_OFST 0x810 // Receive filter control registers
-+  #define SCATTER_ENBL_NO_MATCH_Q_B0_LBN 40
-+  #define SCATTER_ENBL_NO_MATCH_Q_B0_WIDTH 1
-+  #define UDP_FULL_SRCH_LIMIT_LBN 32
-+  #define UDP_FULL_SRCH_LIMIT_WIDTH 8
-+  #define NUM_KER_LBN 24
-+  #define NUM_KER_WIDTH 2
-+  #define UDP_WILD_SRCH_LIMIT_LBN 16
-+  #define UDP_WILD_SRCH_LIMIT_WIDTH 8
-+  #define TCP_WILD_SRCH_LIMIT_LBN 8
-+  #define TCP_WILD_SRCH_LIMIT_WIDTH 8
-+  #define TCP_FULL_SRCH_LIMIT_LBN 0
-+  #define TCP_FULL_SRCH_LIMIT_WIDTH 8
-+#define RX_FLUSH_DESCQ_REG_KER_OFST 0x820 // Receive flush descriptor queue register
-+#define RX_FLUSH_DESCQ_REG_OFST 0x820 // Receive flush descriptor queue register
-+  #define RX_FLUSH_DESCQ_CMD_LBN 24
-+  #define RX_FLUSH_DESCQ_CMD_WIDTH 1
-+  #define RX_FLUSH_EVQ_ID_LBN 12
-+  #define RX_FLUSH_EVQ_ID_WIDTH 12
-+  #define RX_FLUSH_DESCQ_LBN 0
-+  #define RX_FLUSH_DESCQ_WIDTH 12
-+#define RX_DESC_UPD_REG_KER_OFST 0x830 // Kernel  receive descriptor update register. Page-mapped
-+#define RX_DESC_UPD_REG_PAGE4_OFST 0x8830 // Char & user receive descriptor update register. Page-mapped. For lowest 1K queues.
-+#define RX_DESC_UPD_REG_PAGE123K_OFST 0x1000830 // Char & user receive descriptor update register. Page-mapped. For upper 3K queues.
-+  #define RX_DESC_WPTR_LBN 96
-+  #define RX_DESC_WPTR_WIDTH 12
-+  #define RX_DESC_PUSH_CMD_LBN 95
-+  #define RX_DESC_PUSH_CMD_WIDTH 1
-+  #define RX_DESC_LBN 0
-+  #define RX_DESC_WIDTH 64
-+  #define RX_KER_DESC_LBN 0
-+  #define RX_KER_DESC_WIDTH 64
-+  #define RX_USR_DESC_LBN 0
-+  #define RX_USR_DESC_WIDTH 32
-+#define RX_DC_CFG_REG_KER_OFST 0x840 // Receive descriptor cache configuration register
-+#define RX_DC_CFG_REG_OFST 0x840 // Receive descriptor cache configuration register
-+  #define RX_DC_SIZE_LBN 0
-+  #define RX_DC_SIZE_WIDTH 2
-+#define RX_DC_PF_WM_REG_KER_OFST 0x850 // Receive descriptor cache pre-fetch watermark register
-+#define RX_DC_PF_WM_REG_OFST 0x850 // Receive descriptor cache pre-fetch watermark register
-+  #define RX_DC_PF_LWM_LO_LBN 0
-+  #define RX_DC_PF_LWM_LO_WIDTH 6
-+
-+#define RX_RSS_TKEY_B0_OFST 0x860 // RSS Toeplitz hash key (B0 only)
-+
-+#define RX_NODESC_DROP_REG 0x880
-+  #define RX_NODESC_DROP_CNT_LBN 0
-+  #define RX_NODESC_DROP_CNT_WIDTH 16
-+
-+#define XM_TX_CFG_REG_OFST 0x1230
-+  #define XM_AUTO_PAD_LBN 5
-+  #define XM_AUTO_PAD_WIDTH 1
-+
-+#define RX_FILTER_TBL0_OFST 0xF00000 // Receive filter table - even entries
-+  #define RSS_EN_0_B0_LBN 110
-+  #define RSS_EN_0_B0_WIDTH 1
-+  #define SCATTER_EN_0_B0_LBN 109
-+  #define SCATTER_EN_0_B0_WIDTH 1
-+  #define TCP_UDP_0_LBN 108
-+  #define TCP_UDP_0_WIDTH 1
-+  #define RXQ_ID_0_LBN 96
-+  #define RXQ_ID_0_WIDTH 12
-+  #define DEST_IP_0_LBN 64
-+  #define DEST_IP_0_WIDTH 32
-+  #define DEST_PORT_TCP_0_LBN 48
-+  #define DEST_PORT_TCP_0_WIDTH 16
-+  #define SRC_IP_0_LBN 16
-+  #define SRC_IP_0_WIDTH 32
-+  #define SRC_TCP_DEST_UDP_0_LBN 0
-+  #define SRC_TCP_DEST_UDP_0_WIDTH 16
-+#define RX_FILTER_TBL1_OFST 0xF00010 // Receive filter table - odd entries
-+  #define RSS_EN_1_B0_LBN 110
-+  #define RSS_EN_1_B0_WIDTH 1
-+  #define SCATTER_EN_1_B0_LBN 109
-+  #define SCATTER_EN_1_B0_WIDTH 1
-+  #define TCP_UDP_1_LBN 108
-+  #define TCP_UDP_1_WIDTH 1
-+  #define RXQ_ID_1_LBN 96
-+  #define RXQ_ID_1_WIDTH 12
-+  #define DEST_IP_1_LBN 64
-+  #define DEST_IP_1_WIDTH 32
-+  #define DEST_PORT_TCP_1_LBN 48
-+  #define DEST_PORT_TCP_1_WIDTH 16
-+  #define SRC_IP_1_LBN 16
-+  #define SRC_IP_1_WIDTH 32
-+  #define SRC_TCP_DEST_UDP_1_LBN 0
-+  #define SRC_TCP_DEST_UDP_1_WIDTH 16
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define RX_DESC_PTR_TBL_KER_OFST 0x11800 // Receive descriptor pointer kernel access
-+#else
-+#define RX_DESC_PTR_TBL_KER_OFST 0x1800 // Receive descriptor pointer kernel access
-+#endif
-+
-+
-+#define RX_DESC_PTR_TBL_OFST 0xF40000 // Receive descriptor pointer table
-+  #define RX_ISCSI_DDIG_EN_LBN 88
-+  #define RX_ISCSI_DDIG_EN_WIDTH 1
-+  #define RX_ISCSI_HDIG_EN_LBN 87
-+  #define RX_ISCSI_HDIG_EN_WIDTH 1
-+  #define RX_DESC_PREF_ACT_LBN 86
-+  #define RX_DESC_PREF_ACT_WIDTH 1
-+  #define RX_DC_HW_RPTR_LBN 80
-+  #define RX_DC_HW_RPTR_WIDTH 6
-+  #define RX_DESCQ_HW_RPTR_LBN 68
-+  #define RX_DESCQ_HW_RPTR_WIDTH 12
-+  #define RX_DESCQ_SW_WPTR_LBN 56
-+  #define RX_DESCQ_SW_WPTR_WIDTH 12
-+  #define RX_DESCQ_BUF_BASE_ID_LBN 36
-+  #define RX_DESCQ_BUF_BASE_ID_WIDTH 20
-+  #define RX_DESCQ_EVQ_ID_LBN 24
-+  #define RX_DESCQ_EVQ_ID_WIDTH 12
-+  #define RX_DESCQ_OWNER_ID_LBN 10
-+  #define RX_DESCQ_OWNER_ID_WIDTH 14
-+  #define RX_DESCQ_LABEL_LBN 5
-+  #define RX_DESCQ_LABEL_WIDTH 5
-+  #define RX_DESCQ_SIZE_LBN 3
-+  #define RX_DESCQ_SIZE_WIDTH 2
-+  #define RX_DESCQ_TYPE_LBN 2
-+  #define RX_DESCQ_TYPE_WIDTH 1
-+  #define RX_DESCQ_JUMBO_LBN 1
-+  #define RX_DESCQ_JUMBO_WIDTH 1
-+  #define RX_DESCQ_EN_LBN 0
-+  #define RX_DESCQ_EN_WIDTH 1
-+
-+
-+#define RX_RSS_INDIR_TBL_B0_OFST 0xFB0000 // RSS indirection table (B0 only)
-+  #define RX_RSS_INDIR_ENT_B0_LBN 0
-+  #define RX_RSS_INDIR_ENT_B0_WIDTH 6
-+
-+//////////////---- TX Datapath Registers C Header ----//////////////
-+#define TX_FLUSH_DESCQ_REG_KER_OFST 0xA00 // Transmit flush descriptor queue register
-+#define TX_FLUSH_DESCQ_REG_OFST 0xA00 // Transmit flush descriptor queue register
-+  #define TX_FLUSH_DESCQ_CMD_LBN 12
-+  #define TX_FLUSH_DESCQ_CMD_WIDTH 1
-+  #define TX_FLUSH_DESCQ_LBN 0
-+  #define TX_FLUSH_DESCQ_WIDTH 12
-+#define TX_DESC_UPD_REG_KER_OFST 0xA10 // Kernel transmit descriptor update register. Page-mapped
-+#define TX_DESC_UPD_REG_PAGE4_OFST 0x8A10 // Char & user transmit descriptor update register. Page-mapped
-+#define TX_DESC_UPD_REG_PAGE123K_OFST 0x1000A10 // Char & user transmit descriptor update register. Page-mapped
-+  #define TX_DESC_WPTR_LBN 96
-+  #define TX_DESC_WPTR_WIDTH 12
-+  #define TX_DESC_PUSH_CMD_LBN 95
-+  #define TX_DESC_PUSH_CMD_WIDTH 1
-+  #define TX_DESC_LBN 0
-+  #define TX_DESC_WIDTH 95
-+  #define TX_KER_DESC_LBN 0
-+  #define TX_KER_DESC_WIDTH 64
-+  #define TX_USR_DESC_LBN 0
-+  #define TX_USR_DESC_WIDTH 64
-+#define TX_DC_CFG_REG_KER_OFST 0xA20 // Transmit descriptor cache configuration register
-+#define TX_DC_CFG_REG_OFST 0xA20 // Transmit descriptor cache configuration register
-+  #define TX_DC_SIZE_LBN 0
-+  #define TX_DC_SIZE_WIDTH 2
-+
-+#if EFVI_FALCON_EXTENDED_P_BAR
-+#define TX_DESC_PTR_TBL_KER_OFST 0x11900 // Transmit descriptor pointer.
-+#else
-+#define TX_DESC_PTR_TBL_KER_OFST 0x1900 // Transmit descriptor pointer.
-+#endif
-+
-+
-+#define TX_DESC_PTR_TBL_OFST 0xF50000 // Transmit descriptor pointer
-+  #define TX_NON_IP_DROP_DIS_B0_LBN 91
-+  #define TX_NON_IP_DROP_DIS_B0_WIDTH 1
-+  #define TX_IP_CHKSM_DIS_B0_LBN 90
-+  #define TX_IP_CHKSM_DIS_B0_WIDTH 1
-+  #define TX_TCP_CHKSM_DIS_B0_LBN 89
-+  #define TX_TCP_CHKSM_DIS_B0_WIDTH 1
-+  #define TX_DESCQ_EN_LBN 88
-+  #define TX_DESCQ_EN_WIDTH 1
-+  #define TX_ISCSI_DDIG_EN_LBN 87
-+  #define TX_ISCSI_DDIG_EN_WIDTH 1
-+  #define TX_ISCSI_HDIG_EN_LBN 86
-+  #define TX_ISCSI_HDIG_EN_WIDTH 1
-+  #define TX_DC_HW_RPTR_LBN 80
-+  #define TX_DC_HW_RPTR_WIDTH 6
-+  #define TX_DESCQ_HW_RPTR_LBN 68
-+  #define TX_DESCQ_HW_RPTR_WIDTH 12
-+  #define TX_DESCQ_SW_WPTR_LBN 56
-+  #define TX_DESCQ_SW_WPTR_WIDTH 12
-+  #define TX_DESCQ_BUF_BASE_ID_LBN 36
-+  #define TX_DESCQ_BUF_BASE_ID_WIDTH 20
-+  #define TX_DESCQ_EVQ_ID_LBN 24
-+  #define TX_DESCQ_EVQ_ID_WIDTH 12
-+  #define TX_DESCQ_OWNER_ID_LBN 10
-+  #define TX_DESCQ_OWNER_ID_WIDTH 14
-+  #define TX_DESCQ_LABEL_LBN 5
-+  #define TX_DESCQ_LABEL_WIDTH 5
-+  #define TX_DESCQ_SIZE_LBN 3
-+  #define TX_DESCQ_SIZE_WIDTH 2
-+  #define TX_DESCQ_TYPE_LBN 1
-+  #define TX_DESCQ_TYPE_WIDTH 2
-+  #define TX_DESCQ_FLUSH_LBN 0
-+  #define TX_DESCQ_FLUSH_WIDTH 1
-+#define TX_CFG_REG_KER_OFST 0xA50 // Transmit configuration register
-+#define TX_CFG_REG_OFST 0xA50 // Transmit configuration register
-+  #define TX_IP_ID_P1_OFS_LBN 32
-+  #define TX_IP_ID_P1_OFS_WIDTH 15
-+  #define TX_IP_ID_P0_OFS_LBN 16
-+  #define TX_IP_ID_P0_OFS_WIDTH 15
-+  #define TX_TURBO_EN_LBN 3
-+  #define TX_TURBO_EN_WIDTH 1 
-+  #define TX_OWNERR_CTL_LBN 2
-+  #define TX_OWNERR_CTL_WIDTH 2
-+  #define TX_NON_IP_DROP_DIS_LBN 1
-+  #define TX_NON_IP_DROP_DIS_WIDTH 1
-+  #define TX_IP_ID_REP_EN_LBN 0
-+  #define TX_IP_ID_REP_EN_WIDTH 1
-+#define TX_RESERVED_REG_KER_OFST 0xA80 // Transmit configuration register
-+#define TX_RESERVED_REG_OFST 0xA80 // Transmit configuration register
-+  #define TX_CSR_PUSH_EN_LBN 89
-+  #define TX_CSR_PUSH_EN_WIDTH 1
-+  #define TX_RX_SPACER_LBN 64
-+  #define TX_RX_SPACER_WIDTH 8
-+  #define TX_SW_EV_EN_LBN 59
-+  #define TX_SW_EV_EN_WIDTH 1
-+  #define TX_RX_SPACER_EN_LBN 57
-+  #define TX_RX_SPACER_EN_WIDTH 1
-+  #define TX_CSR_PREF_WD_TMR_LBN 24
-+  #define TX_CSR_PREF_WD_TMR_WIDTH 16
-+  #define TX_CSR_ONLY1TAG_LBN 21
-+  #define TX_CSR_ONLY1TAG_WIDTH 1
-+  #define TX_PREF_THRESHOLD_LBN 19
-+  #define TX_PREF_THRESHOLD_WIDTH 2
-+  #define TX_ONE_PKT_PER_Q_LBN 18
-+  #define TX_ONE_PKT_PER_Q_WIDTH 1
-+  #define TX_DIS_NON_IP_EV_LBN 17
-+  #define TX_DIS_NON_IP_EV_WIDTH 1
-+  #define TX_DMA_SPACER_LBN 8
-+  #define TX_DMA_SPACER_WIDTH 8
-+  #define TX_FLUSH_MIN_LEN_EN_B0_LBN 7
-+  #define TX_FLUSH_MIN_LEN_EN_B0_WIDTH 1
-+  #define TX_TCP_DIS_A1_LBN 7
-+  #define TX_TCP_DIS_A1_WIDTH 1
-+  #define TX_IP_DIS_A1_LBN 6
-+  #define TX_IP_DIS_A1_WIDTH 1
-+  #define TX_MAX_CPL_LBN 2
-+  #define TX_MAX_CPL_WIDTH 2
-+  #define TX_MAX_PREF_LBN 0
-+  #define TX_MAX_PREF_WIDTH 2
-+#define TX_VLAN_REG_OFST 0xAE0 // Transmit VLAN tag register
-+  #define TX_VLAN_EN_LBN 127
-+  #define TX_VLAN_EN_WIDTH 1
-+  #define TX_VLAN7_PORT1_EN_LBN 125
-+  #define TX_VLAN7_PORT1_EN_WIDTH 1
-+  #define TX_VLAN7_PORT0_EN_LBN 124
-+  #define TX_VLAN7_PORT0_EN_WIDTH 1
-+  #define TX_VLAN7_LBN 112
-+  #define TX_VLAN7_WIDTH 12
-+  #define TX_VLAN6_PORT1_EN_LBN 109
-+  #define TX_VLAN6_PORT1_EN_WIDTH 1
-+  #define TX_VLAN6_PORT0_EN_LBN 108
-+  #define TX_VLAN6_PORT0_EN_WIDTH 1
-+  #define TX_VLAN6_LBN 96
-+  #define TX_VLAN6_WIDTH 12
-+  #define TX_VLAN5_PORT1_EN_LBN 93
-+  #define TX_VLAN5_PORT1_EN_WIDTH 1
-+  #define TX_VLAN5_PORT0_EN_LBN 92
-+  #define TX_VLAN5_PORT0_EN_WIDTH 1
-+  #define TX_VLAN5_LBN 80
-+  #define TX_VLAN5_WIDTH 12
-+  #define TX_VLAN4_PORT1_EN_LBN 77
-+  #define TX_VLAN4_PORT1_EN_WIDTH 1
-+  #define TX_VLAN4_PORT0_EN_LBN 76
-+  #define TX_VLAN4_PORT0_EN_WIDTH 1
-+  #define TX_VLAN4_LBN 64
-+  #define TX_VLAN4_WIDTH 12
-+  #define TX_VLAN3_PORT1_EN_LBN 61
-+  #define TX_VLAN3_PORT1_EN_WIDTH 1
-+  #define TX_VLAN3_PORT0_EN_LBN 60
-+  #define TX_VLAN3_PORT0_EN_WIDTH 1
-+  #define TX_VLAN3_LBN 48
-+  #define TX_VLAN3_WIDTH 12
-+  #define TX_VLAN2_PORT1_EN_LBN 45
-+  #define TX_VLAN2_PORT1_EN_WIDTH 1
-+  #define TX_VLAN2_PORT0_EN_LBN 44
-+  #define TX_VLAN2_PORT0_EN_WIDTH 1
-+  #define TX_VLAN2_LBN 32
-+  #define TX_VLAN2_WIDTH 12
-+  #define TX_VLAN1_PORT1_EN_LBN 29
-+  #define TX_VLAN1_PORT1_EN_WIDTH 1
-+  #define TX_VLAN1_PORT0_EN_LBN 28
-+  #define TX_VLAN1_PORT0_EN_WIDTH 1
-+  #define TX_VLAN1_LBN 16
-+  #define TX_VLAN1_WIDTH 12
-+  #define TX_VLAN0_PORT1_EN_LBN 13
-+  #define TX_VLAN0_PORT1_EN_WIDTH 1
-+  #define TX_VLAN0_PORT0_EN_LBN 12
-+  #define TX_VLAN0_PORT0_EN_WIDTH 1
-+  #define TX_VLAN0_LBN 0
-+  #define TX_VLAN0_WIDTH 12
-+#define TX_FIL_CTL_REG_OFST 0xAF0 // Transmit filter control register
-+  #define TX_MADR1_FIL_EN_LBN 65
-+  #define TX_MADR1_FIL_EN_WIDTH 1
-+  #define TX_MADR0_FIL_EN_LBN 64
-+  #define TX_MADR0_FIL_EN_WIDTH 1
-+  #define TX_IPFIL31_PORT1_EN_LBN 63
-+  #define TX_IPFIL31_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL31_PORT0_EN_LBN 62
-+  #define TX_IPFIL31_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL30_PORT1_EN_LBN 61
-+  #define TX_IPFIL30_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL30_PORT0_EN_LBN 60
-+  #define TX_IPFIL30_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL29_PORT1_EN_LBN 59
-+  #define TX_IPFIL29_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL29_PORT0_EN_LBN 58
-+  #define TX_IPFIL29_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL28_PORT1_EN_LBN 57
-+  #define TX_IPFIL28_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL28_PORT0_EN_LBN 56
-+  #define TX_IPFIL28_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL27_PORT1_EN_LBN 55
-+  #define TX_IPFIL27_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL27_PORT0_EN_LBN 54
-+  #define TX_IPFIL27_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL26_PORT1_EN_LBN 53
-+  #define TX_IPFIL26_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL26_PORT0_EN_LBN 52
-+  #define TX_IPFIL26_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL25_PORT1_EN_LBN 51
-+  #define TX_IPFIL25_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL25_PORT0_EN_LBN 50
-+  #define TX_IPFIL25_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL24_PORT1_EN_LBN 49
-+  #define TX_IPFIL24_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL24_PORT0_EN_LBN 48
-+  #define TX_IPFIL24_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL23_PORT1_EN_LBN 47
-+  #define TX_IPFIL23_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL23_PORT0_EN_LBN 46
-+  #define TX_IPFIL23_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL22_PORT1_EN_LBN 45
-+  #define TX_IPFIL22_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL22_PORT0_EN_LBN 44
-+  #define TX_IPFIL22_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL21_PORT1_EN_LBN 43
-+  #define TX_IPFIL21_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL21_PORT0_EN_LBN 42
-+  #define TX_IPFIL21_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL20_PORT1_EN_LBN 41
-+  #define TX_IPFIL20_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL20_PORT0_EN_LBN 40
-+  #define TX_IPFIL20_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL19_PORT1_EN_LBN 39
-+  #define TX_IPFIL19_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL19_PORT0_EN_LBN 38
-+  #define TX_IPFIL19_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL18_PORT1_EN_LBN 37
-+  #define TX_IPFIL18_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL18_PORT0_EN_LBN 36
-+  #define TX_IPFIL18_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL17_PORT1_EN_LBN 35
-+  #define TX_IPFIL17_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL17_PORT0_EN_LBN 34
-+  #define TX_IPFIL17_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL16_PORT1_EN_LBN 33
-+  #define TX_IPFIL16_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL16_PORT0_EN_LBN 32
-+  #define TX_IPFIL16_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL15_PORT1_EN_LBN 31
-+  #define TX_IPFIL15_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL15_PORT0_EN_LBN 30
-+  #define TX_IPFIL15_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL14_PORT1_EN_LBN 29
-+  #define TX_IPFIL14_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL14_PORT0_EN_LBN 28
-+  #define TX_IPFIL14_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL13_PORT1_EN_LBN 27
-+  #define TX_IPFIL13_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL13_PORT0_EN_LBN 26
-+  #define TX_IPFIL13_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL12_PORT1_EN_LBN 25
-+  #define TX_IPFIL12_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL12_PORT0_EN_LBN 24
-+  #define TX_IPFIL12_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL11_PORT1_EN_LBN 23
-+  #define TX_IPFIL11_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL11_PORT0_EN_LBN 22
-+  #define TX_IPFIL11_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL10_PORT1_EN_LBN 21
-+  #define TX_IPFIL10_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL10_PORT0_EN_LBN 20
-+  #define TX_IPFIL10_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL9_PORT1_EN_LBN 19
-+  #define TX_IPFIL9_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL9_PORT0_EN_LBN 18
-+  #define TX_IPFIL9_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL8_PORT1_EN_LBN 17
-+  #define TX_IPFIL8_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL8_PORT0_EN_LBN 16
-+  #define TX_IPFIL8_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL7_PORT1_EN_LBN 15
-+  #define TX_IPFIL7_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL7_PORT0_EN_LBN 14
-+  #define TX_IPFIL7_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL6_PORT1_EN_LBN 13
-+  #define TX_IPFIL6_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL6_PORT0_EN_LBN 12
-+  #define TX_IPFIL6_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL5_PORT1_EN_LBN 11
-+  #define TX_IPFIL5_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL5_PORT0_EN_LBN 10
-+  #define TX_IPFIL5_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL4_PORT1_EN_LBN 9
-+  #define TX_IPFIL4_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL4_PORT0_EN_LBN 8
-+  #define TX_IPFIL4_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL3_PORT1_EN_LBN 7
-+  #define TX_IPFIL3_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL3_PORT0_EN_LBN 6
-+  #define TX_IPFIL3_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL2_PORT1_EN_LBN 5
-+  #define TX_IPFIL2_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL2_PORT0_EN_LBN 4
-+  #define TX_IPFIL2_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL1_PORT1_EN_LBN 3
-+  #define TX_IPFIL1_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL1_PORT0_EN_LBN 2
-+  #define TX_IPFIL1_PORT0_EN_WIDTH 1
-+  #define TX_IPFIL0_PORT1_EN_LBN 1
-+  #define TX_IPFIL0_PORT1_EN_WIDTH 1
-+  #define TX_IPFIL0_PORT0_EN_LBN 0
-+  #define TX_IPFIL0_PORT0_EN_WIDTH 1
-+#define TX_IPFIL_TBL_OFST 0xB00 // Transmit IP source address filter table
-+  #define TX_IPFIL_MASK_LBN 32
-+  #define TX_IPFIL_MASK_WIDTH 32
-+  #define TX_IP_SRC_ADR_LBN 0
-+  #define TX_IP_SRC_ADR_WIDTH 32
-+#define TX_PACE_REG_A1_OFST 0xF80000 // Transmit pace control register
-+#define TX_PACE_REG_B0_OFST 0xA90    // Transmit pace control register
-+  #define TX_PACE_SB_AF_LBN 19
-+  #define TX_PACE_SB_AF_WIDTH 10
-+  #define TX_PACE_SB_NOTAF_LBN 9
-+  #define TX_PACE_SB_NOTAF_WIDTH 10
-+  #define TX_PACE_FB_BASE_LBN 5
-+  #define TX_PACE_FB_BASE_WIDTH 4
-+  #define TX_PACE_BIN_TH_LBN 0
-+  #define TX_PACE_BIN_TH_WIDTH 5
-+#define TX_PACE_TBL_A1_OFST 0xF80040 // Transmit pacing table
-+#define TX_PACE_TBL_FIRST_QUEUE_A1 4
-+#define TX_PACE_TBL_B0_OFST 0xF80000 // Transmit pacing table
-+#define TX_PACE_TBL_FIRST_QUEUE_B0 0
-+  #define TX_PACE_LBN 0
-+  #define TX_PACE_WIDTH 5
-+
-+//////////////---- EE/Flash Registers C Header ----//////////////
-+#define EE_SPI_HCMD_REG_KER_OFST 0x100 // SPI host command register
-+#define EE_SPI_HCMD_REG_OFST 0x100 // SPI host command register
-+  #define EE_SPI_HCMD_CMD_EN_LBN 31
-+  #define EE_SPI_HCMD_CMD_EN_WIDTH 1
-+  #define EE_WR_TIMER_ACTIVE_LBN 28
-+  #define EE_WR_TIMER_ACTIVE_WIDTH 1
-+  #define EE_SPI_HCMD_SF_SEL_LBN 24
-+  #define EE_SPI_HCMD_SF_SEL_WIDTH 1
-+  #define EE_SPI_HCMD_DABCNT_LBN 16
-+  #define EE_SPI_HCMD_DABCNT_WIDTH 5
-+  #define EE_SPI_HCMD_READ_LBN 15
-+  #define EE_SPI_HCMD_READ_WIDTH 1
-+  #define EE_SPI_HCMD_DUBCNT_LBN 12
-+  #define EE_SPI_HCMD_DUBCNT_WIDTH 2
-+  #define EE_SPI_HCMD_ADBCNT_LBN 8
-+  #define EE_SPI_HCMD_ADBCNT_WIDTH 2
-+  #define EE_SPI_HCMD_ENC_LBN 0
-+  #define EE_SPI_HCMD_ENC_WIDTH 8
-+#define EE_SPI_HADR_REG_KER_OFST 0X110 // SPI host address register
-+#define EE_SPI_HADR_REG_OFST 0X110 // SPI host address register
-+  #define EE_SPI_HADR_DUBYTE_LBN 24
-+  #define EE_SPI_HADR_DUBYTE_WIDTH 8
-+  #define EE_SPI_HADR_ADR_LBN 0
-+  #define EE_SPI_HADR_ADR_WIDTH 24
-+#define EE_SPI_HDATA_REG_KER_OFST 0x120 // SPI host data register
-+#define EE_SPI_HDATA_REG_OFST 0x120 // SPI host data register
-+  #define EE_SPI_HDATA3_LBN 96
-+  #define EE_SPI_HDATA3_WIDTH 32
-+  #define EE_SPI_HDATA2_LBN 64
-+  #define EE_SPI_HDATA2_WIDTH 32
-+  #define EE_SPI_HDATA1_LBN 32
-+  #define EE_SPI_HDATA1_WIDTH 32
-+  #define EE_SPI_HDATA0_LBN 0
-+  #define EE_SPI_HDATA0_WIDTH 32
-+#define EE_BASE_PAGE_REG_KER_OFST 0x130 // Expansion ROM base mirror register
-+#define EE_BASE_PAGE_REG_OFST 0x130 // Expansion ROM base mirror register
-+  #define EE_EXP_ROM_WINDOW_BASE_LBN 16
-+  #define EE_EXP_ROM_WINDOW_BASE_WIDTH 13
-+  #define EE_EXPROM_MASK_LBN 0
-+  #define EE_EXPROM_MASK_WIDTH 13
-+#define EE_VPD_CFG0_REG_KER_OFST 0X140 // SPI/VPD configuration register
-+#define EE_VPD_CFG0_REG_OFST 0X140 // SPI/VPD configuration register
-+  #define EE_SF_FASTRD_EN_LBN 127
-+  #define EE_SF_FASTRD_EN_WIDTH 1
-+  #define EE_SF_CLOCK_DIV_LBN 120
-+  #define EE_SF_CLOCK_DIV_WIDTH 7
-+  #define EE_VPD_WIP_POLL_LBN 119
-+  #define EE_VPD_WIP_POLL_WIDTH 1
-+  #define EE_VPDW_LENGTH_LBN 80
-+  #define EE_VPDW_LENGTH_WIDTH 15
-+  #define EE_VPDW_BASE_LBN 64
-+  #define EE_VPDW_BASE_WIDTH 15
-+  #define EE_VPD_WR_CMD_EN_LBN 56
-+  #define EE_VPD_WR_CMD_EN_WIDTH 8
-+  #define EE_VPD_BASE_LBN 32
-+  #define EE_VPD_BASE_WIDTH 24
-+  #define EE_VPD_LENGTH_LBN 16
-+  #define EE_VPD_LENGTH_WIDTH 13
-+  #define EE_VPD_AD_SIZE_LBN 8
-+  #define EE_VPD_AD_SIZE_WIDTH 5
-+  #define EE_VPD_ACCESS_ON_LBN 5
-+  #define EE_VPD_ACCESS_ON_WIDTH 1
-+#define EE_VPD_SW_CNTL_REG_KER_OFST 0X150 // VPD access SW control register
-+#define EE_VPD_SW_CNTL_REG_OFST 0X150 // VPD access SW control register
-+  #define EE_VPD_CYCLE_PENDING_LBN 31
-+  #define EE_VPD_CYCLE_PENDING_WIDTH 1
-+  #define EE_VPD_CYC_WRITE_LBN 28
-+  #define EE_VPD_CYC_WRITE_WIDTH 1
-+  #define EE_VPD_CYC_ADR_LBN 0
-+  #define EE_VPD_CYC_ADR_WIDTH 15
-+#define EE_VPD_SW_DATA_REG_KER_OFST 0x160 // VPD access SW data register
-+#define EE_VPD_SW_DATA_REG_OFST 0x160 // VPD access SW data register
-+  #define EE_VPD_CYC_DAT_LBN 0
-+  #define EE_VPD_CYC_DAT_WIDTH 32
-Index: head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_desc.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_desc.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,43 @@
-+//////////////---- Descriptors C Headers ----//////////////
-+// Receive Kernel IP Descriptor
-+  #define RX_KER_BUF_SIZE_LBN 48
-+  #define RX_KER_BUF_SIZE_WIDTH 14
-+  #define RX_KER_BUF_REGION_LBN 46
-+  #define RX_KER_BUF_REGION_WIDTH 2
-+      #define RX_KER_BUF_REGION0_DECODE 0
-+      #define RX_KER_BUF_REGION1_DECODE 1
-+      #define RX_KER_BUF_REGION2_DECODE 2
-+      #define RX_KER_BUF_REGION3_DECODE 3
-+  #define RX_KER_BUF_ADR_LBN 0
-+  #define RX_KER_BUF_ADR_WIDTH 46
-+// Receive User IP Descriptor
-+  #define RX_USR_2BYTE_OFS_LBN 20
-+  #define RX_USR_2BYTE_OFS_WIDTH 12
-+  #define RX_USR_BUF_ID_LBN 0
-+  #define RX_USR_BUF_ID_WIDTH 20
-+// Transmit Kernel IP Descriptor
-+  #define TX_KER_PORT_LBN 63
-+  #define TX_KER_PORT_WIDTH 1
-+  #define TX_KER_CONT_LBN 62
-+  #define TX_KER_CONT_WIDTH 1
-+  #define TX_KER_BYTE_CNT_LBN 48
-+  #define TX_KER_BYTE_CNT_WIDTH 14
-+  #define TX_KER_BUF_REGION_LBN 46
-+  #define TX_KER_BUF_REGION_WIDTH 2
-+      #define TX_KER_BUF_REGION0_DECODE 0
-+      #define TX_KER_BUF_REGION1_DECODE 1
-+      #define TX_KER_BUF_REGION2_DECODE 2
-+      #define TX_KER_BUF_REGION3_DECODE 3
-+  #define TX_KER_BUF_ADR_LBN 0
-+  #define TX_KER_BUF_ADR_WIDTH 46
-+// Transmit User IP Descriptor
-+  #define TX_USR_PORT_LBN 47
-+  #define TX_USR_PORT_WIDTH 1
-+  #define TX_USR_CONT_LBN 46
-+  #define TX_USR_CONT_WIDTH 1
-+  #define TX_USR_BYTE_CNT_LBN 33
-+  #define TX_USR_BYTE_CNT_WIDTH 13
-+  #define TX_USR_BUF_ID_LBN 13
-+  #define TX_USR_BUF_ID_WIDTH 20
-+  #define TX_USR_BYTE_OFS_LBN 0
-+  #define TX_USR_BYTE_OFS_WIDTH 13
-Index: head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_event.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_falcon_event.h      2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,123 @@
-+//////////////---- Events Format C Header ----//////////////
-+//////////////---- Event entry ----//////////////
-+  #define EV_CODE_LBN 60
-+  #define EV_CODE_WIDTH 4
-+      #define RX_IP_EV_DECODE 0
-+      #define TX_IP_EV_DECODE 2
-+      #define DRIVER_EV_DECODE 5
-+      #define GLOBAL_EV_DECODE 6
-+      #define DRV_GEN_EV_DECODE 7
-+  #define EV_DATA_LBN 0
-+  #define EV_DATA_WIDTH 60
-+//////////////---- Receive IP events for both Kernel & User event queues ----//////////////
-+  #define RX_EV_PKT_OK_LBN 56
-+  #define RX_EV_PKT_OK_WIDTH 1
-+  #define RX_EV_BUF_OWNER_ID_ERR_LBN 54
-+  #define RX_EV_BUF_OWNER_ID_ERR_WIDTH 1
-+  #define RX_EV_IP_HDR_CHKSUM_ERR_LBN 52
-+  #define RX_EV_IP_HDR_CHKSUM_ERR_WIDTH 1
-+  #define RX_EV_TCP_UDP_CHKSUM_ERR_LBN 51
-+  #define RX_EV_TCP_UDP_CHKSUM_ERR_WIDTH 1
-+  #define RX_EV_ETH_CRC_ERR_LBN 50
-+  #define RX_EV_ETH_CRC_ERR_WIDTH 1
-+  #define RX_EV_FRM_TRUNC_LBN 49
-+  #define RX_EV_FRM_TRUNC_WIDTH 1
-+  #define RX_EV_DRIB_NIB_LBN 48
-+  #define RX_EV_DRIB_NIB_WIDTH 1
-+  #define RX_EV_TOBE_DISC_LBN 47
-+  #define RX_EV_TOBE_DISC_WIDTH 1
-+  #define RX_EV_PKT_TYPE_LBN 44
-+  #define RX_EV_PKT_TYPE_WIDTH 3
-+      #define RX_EV_PKT_TYPE_ETH_DECODE 0
-+      #define RX_EV_PKT_TYPE_LLC_DECODE 1
-+      #define RX_EV_PKT_TYPE_JUMBO_DECODE 2
-+      #define RX_EV_PKT_TYPE_VLAN_DECODE 3
-+      #define RX_EV_PKT_TYPE_VLAN_LLC_DECODE 4
-+      #define RX_EV_PKT_TYPE_VLAN_JUMBO_DECODE 5
-+  #define RX_EV_HDR_TYPE_LBN 42
-+  #define RX_EV_HDR_TYPE_WIDTH 2
-+      #define RX_EV_HDR_TYPE_TCP_IPV4_DECODE 0
-+      #define RX_EV_HDR_TYPE_UDP_IPV4_DECODE 1
-+      #define RX_EV_HDR_TYPE_OTHER_IP_DECODE 2
-+      #define RX_EV_HDR_TYPE_NON_IP_DECODE 3
-+  #define RX_EV_DESC_Q_EMPTY_LBN 41
-+  #define RX_EV_DESC_Q_EMPTY_WIDTH 1
-+  #define RX_EV_MCAST_HASH_MATCH_LBN 40
-+  #define RX_EV_MCAST_HASH_MATCH_WIDTH 1
-+  #define RX_EV_MCAST_PKT_LBN 39
-+  #define RX_EV_MCAST_PKT_WIDTH 1
-+  #define RX_EV_Q_LABEL_LBN 32
-+  #define RX_EV_Q_LABEL_WIDTH 5
-+  #define RX_JUMBO_CONT_LBN 31
-+  #define RX_JUMBO_CONT_WIDTH 1
-+  #define RX_SOP_LBN 15
-+  #define RX_SOP_WIDTH 1
-+  #define RX_PORT_LBN 30
-+  #define RX_PORT_WIDTH 1
-+  #define RX_EV_BYTE_CNT_LBN 16
-+  #define RX_EV_BYTE_CNT_WIDTH 14
-+  #define RX_iSCSI_PKT_OK_LBN 14
-+  #define RX_iSCSI_PKT_OK_WIDTH 1
-+  #define RX_ISCSI_DDIG_ERR_LBN 13
-+  #define RX_ISCSI_DDIG_ERR_WIDTH 1
-+  #define RX_ISCSI_HDIG_ERR_LBN 12
-+  #define RX_ISCSI_HDIG_ERR_WIDTH 1
-+  #define RX_EV_DESC_PTR_LBN 0
-+  #define RX_EV_DESC_PTR_WIDTH 12
-+//////////////---- Transmit IP events for both Kernel & User event queues ----//////////////
-+  #define TX_EV_PKT_ERR_LBN 38
-+  #define TX_EV_PKT_ERR_WIDTH 1
-+  #define TX_EV_PKT_TOO_BIG_LBN 37
-+  #define TX_EV_PKT_TOO_BIG_WIDTH 1
-+  #define TX_EV_Q_LABEL_LBN 32
-+  #define TX_EV_Q_LABEL_WIDTH 5
-+  #define TX_EV_PORT_LBN 16
-+  #define TX_EV_PORT_WIDTH 1
-+  #define TX_EV_WQ_FF_FULL_LBN 15
-+  #define TX_EV_WQ_FF_FULL_WIDTH 1
-+  #define TX_EV_BUF_OWNER_ID_ERR_LBN 14
-+  #define TX_EV_BUF_OWNER_ID_ERR_WIDTH 1
-+  #define TX_EV_COMP_LBN 12
-+  #define TX_EV_COMP_WIDTH 1
-+  #define TX_EV_DESC_PTR_LBN 0
-+  #define TX_EV_DESC_PTR_WIDTH 12
-+//////////////---- Char or Kernel driver events ----//////////////
-+  #define DRIVER_EV_SUB_CODE_LBN 56
-+  #define DRIVER_EV_SUB_CODE_WIDTH 4
-+      #define TX_DESCQ_FLS_DONE_EV_DECODE 0x0
-+      #define RX_DESCQ_FLS_DONE_EV_DECODE 0x1
-+      #define EVQ_INIT_DONE_EV_DECODE 0x2
-+      #define EVQ_NOT_EN_EV_DECODE 0x3
-+      #define RX_DESCQ_FLSFF_OVFL_EV_DECODE 0x4
-+      #define SRM_UPD_DONE_EV_DECODE 0x5
-+      #define WAKE_UP_EV_DECODE 0x6
-+      #define TX_PKT_NON_TCP_UDP_DECODE 0x9
-+      #define TIMER_EV_DECODE 0xA
-+      #define RX_DSC_ERROR_EV_DECODE 0xE
-+  #define DRIVER_EV_TX_DESCQ_ID_LBN 0
-+  #define DRIVER_EV_TX_DESCQ_ID_WIDTH 12
-+  #define DRIVER_EV_RX_DESCQ_ID_LBN 0
-+  #define DRIVER_EV_RX_DESCQ_ID_WIDTH 12
-+  #define DRIVER_EV_EVQ_ID_LBN 0
-+  #define DRIVER_EV_EVQ_ID_WIDTH 12
-+  #define DRIVER_TMR_ID_LBN 0
-+  #define DRIVER_TMR_ID_WIDTH 12
-+  #define DRIVER_EV_SRM_UPD_LBN 0
-+  #define DRIVER_EV_SRM_UPD_WIDTH 2
-+      #define SRM_CLR_EV_DECODE 0
-+      #define SRM_UPD_EV_DECODE 1
-+      #define SRM_ILLCLR_EV_DECODE 2
-+//////////////---- Global events. Sent to both event queue 0 and 4. ----//////////////
-+  #define XFP_PHY_INTR_LBN 10
-+  #define XFP_PHY_INTR_WIDTH 1
-+  #define XG_PHY_INTR_LBN 9
-+  #define XG_PHY_INTR_WIDTH 1
-+  #define G_PHY1_INTR_LBN 8
-+  #define G_PHY1_INTR_WIDTH 1
-+  #define G_PHY0_INTR_LBN 7
-+  #define G_PHY0_INTR_WIDTH 1
-+//////////////---- Driver generated events ----//////////////
-+  #define DRV_GEN_EV_CODE_LBN 60
-+  #define DRV_GEN_EV_CODE_WIDTH 4
-+  #define DRV_GEN_EV_DATA_LBN 0
-+  #define DRV_GEN_EV_DATA_WIDTH 60
-Index: head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_internal.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/ef_vi_internal.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,256 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Really-and-truely-honestly internal stuff for libef.
-+ *   \date  2004/06/13
-+ */
-+
-+/*! \cidoxg_include_ci_ul */
-+#ifndef __CI_EF_VI_INTERNAL_H__
-+#define __CI_EF_VI_INTERNAL_H__
-+
-+
-+/* These flags share space with enum ef_vi_flags. */
-+#define EF_VI_BUG5692_WORKAROUND  0x10000
-+
-+
-+/* ***********************************************************************
-+ * COMPILATION CONTROL FLAGS (see ef_vi.h for "workaround" controls)
-+ */
-+
-+#define EF_VI_DO_MAGIC_CHECKS 1
-+
-+
-+/**********************************************************************
-+ * Headers
-+ */
-+
-+#include <etherfabric/ef_vi.h>
-+#include "sysdep.h"
-+#include "ef_vi_falcon.h"
-+
-+
-+/**********************************************************************
-+ * Debugging.
-+ */
-+
-+#ifndef NDEBUG
-+
-+# define _ef_assert(exp, file, line) BUG_ON(!(exp));
-+
-+# define _ef_assert2(exp, x, y, file, line)  do {     \
-+              if (unlikely(!(exp)))           \
-+                      BUG();                          \
-+      } while (0)
-+
-+#else
-+
-+# define _ef_assert(exp, file, line)
-+# define _ef_assert2(e, x, y, file, line)
-+
-+#endif
-+
-+#define ef_assert(a)          do{ _ef_assert((a),__FILE__,__LINE__); } while(0)
-+#define ef_assert_equal(a,b)  _ef_assert2((a)==(b),(a),(b),__FILE__,__LINE__)
-+#define ef_assert_eq          ef_assert_equal
-+#define ef_assert_lt(a,b)     _ef_assert2((a)<(b),(a),(b),__FILE__,__LINE__)
-+#define ef_assert_le(a,b)     _ef_assert2((a)<=(b),(a),(b),__FILE__,__LINE__)
-+#define ef_assert_nequal(a,b) _ef_assert2((a)!=(b),(a),(b),__FILE__,__LINE__)
-+#define ef_assert_ne          ef_assert_nequal
-+#define ef_assert_ge(a,b)     _ef_assert2((a)>=(b),(a),(b),__FILE__,__LINE__)
-+#define ef_assert_gt(a,b)     _ef_assert2((a)>(b),(a),(b),__FILE__,__LINE__)
-+
-+/**********************************************************************
-+ * Debug checks. ******************************************************
-+ **********************************************************************/
-+
-+#ifdef NDEBUG
-+# define EF_VI_MAGIC_SET(p, type)
-+# define EF_VI_CHECK_VI(p)
-+# define EF_VI_CHECK_EVENT_Q(p)
-+# define EF_VI_CHECK_IOBUFSET(p)
-+# define EF_VI_CHECK_FILTER(p)
-+# define EF_VI_CHECK_SHMBUF(p)
-+# define EF_VI_CHECK_PT_EP(p)
-+#else
-+# define EF_VI                    0x3
-+# define EF_EPLOCK                0x6
-+# define EF_IOBUFSET              0x9
-+# define EF_FILTER                0xa
-+# define EF_SHMBUF                0x11
-+
-+# define EF_VI_MAGIC(p, type)                         \
-+      (((unsigned)(type) << 28) |                     \
-+       (((unsigned)(intptr_t)(p)) & 0x0fffffffu))
-+
-+# if !EF_VI_DO_MAGIC_CHECKS
-+#  define EF_VI_MAGIC_SET(p, type)
-+#  define EF_VI_MAGIC_CHECK(p, type)
-+# else
-+#  define EF_VI_MAGIC_SET(p, type)                    \
-+      do {                                            \
-+              (p)->magic = EF_VI_MAGIC((p), (type));  \
-+      } while (0)
-+
-+# define EF_VI_MAGIC_OKAY(p, type)                      \
-+      ((p)->magic == EF_VI_MAGIC((p), (type)))
-+
-+# define EF_VI_MAGIC_CHECK(p, type)                     \
-+      ef_assert(EF_VI_MAGIC_OKAY((p), (type)))
-+
-+#endif /* EF_VI_DO_MAGIC_CHECKS */
-+
-+# define EF_VI_CHECK_VI(p)                    \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_VI);
-+
-+# define EF_VI_CHECK_EVENT_Q(p)                       \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_VI);          \
-+      ef_assert((p)->evq_base);               \
-+      ef_assert((p)->evq_mask);
-+
-+# define EF_VI_CHECK_PT_EP(p)                 \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_VI);          \
-+      ef_assert((p)->ep_state);
-+
-+# define EF_VI_CHECK_IOBUFSET(p)              \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_IOBUFSET)
-+
-+# define EF_VI_CHECK_FILTER(p)                        \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_FILTER);
-+
-+# define EF_VI_CHECK_SHMBUF(p)                        \
-+      ef_assert(p);                           \
-+      EF_VI_MAGIC_CHECK((p), EF_SHMBUF);
-+
-+#endif
-+
-+#ifndef NDEBUG
-+# define EF_DRIVER_MAGIC 0x00f00ba4
-+# define EF_ASSERT_THIS_DRIVER_VALID(driver)                          \
-+      do{ ef_assert(driver);                                          \
-+              EF_VI_MAGIC_CHECK((driver), EF_DRIVER_MAGIC);           \
-+              ef_assert((driver)->init);               }while(0)
-+
-+# define EF_ASSERT_DRIVER_VALID() EF_ASSERT_THIS_DRIVER_VALID(&ci_driver)
-+#else
-+# define EF_ASSERT_THIS_DRIVER_VALID(driver)
-+# define EF_ASSERT_DRIVER_VALID()
-+#endif
-+
-+
-+/* *************************************
-+ * Power of 2 FIFO
-+ */
-+
-+#define EF_VI_FIFO2_M(f, x)  ((x) & ((f)->fifo_mask))
-+#define ef_vi_fifo2_valid(f) ((f) && (f)->fifo && (f)->fifo_mask > 0 &&       \
-+                            (f)->fifo_rd_i <= (f)->fifo_mask       && \
-+                            (f)->fifo_wr_i <= (f)->fifo_mask       && \
-+                            EF_VI_IS_POW2((f)->fifo_mask+1u))
-+
-+#define ef_vi_fifo2_init(f, cap)                      \
-+      do{ ef_assert(EF_VI_IS_POW2((cap) + 1));        \
-+              (f)->fifo_rd_i = (f)->fifo_wr_i = 0u;   \
-+              (f)->fifo_mask = (cap);                 \
-+      }while(0)
-+
-+#define ef_vi_fifo2_is_empty(f) ((f)->fifo_rd_i == (f)->fifo_wr_i)
-+#define ef_vi_fifo2_capacity(f) ((f)->fifo_mask)
-+#define ef_vi_fifo2_buf_size(f) ((f)->fifo_mask + 1u)
-+#define ef_vi_fifo2_end(f)      ((f)->fifo + ef_vi_fifo2_buf_size(f))
-+#define ef_vi_fifo2_peek(f)     ((f)->fifo[(f)->fifo_rd_i])
-+#define ef_vi_fifo2_poke(f)     ((f)->fifo[(f)->fifo_wr_i])
-+#define ef_vi_fifo2_num(f)   EF_VI_FIFO2_M((f),(f)->fifo_wr_i-(f)->fifo_rd_i)
-+
-+#define ef_vi_fifo2_wr_prev(f)                                                \
-+      do{ (f)->fifo_wr_i = EF_VI_FIFO2_M((f), (f)->fifo_wr_i - 1u); }while(0)
-+#define ef_vi_fifo2_wr_next(f)                                                \
-+      do{ (f)->fifo_wr_i = EF_VI_FIFO2_M((f), (f)->fifo_wr_i + 1u); }while(0)
-+#define ef_vi_fifo2_rd_adv(f, n)                                      \
-+      do{ (f)->fifo_rd_i = EF_VI_FIFO2_M((f), (f)->fifo_rd_i + (n)); }while(0)
-+#define ef_vi_fifo2_rd_prev(f)                                                \
-+      do{ (f)->fifo_rd_i = EF_VI_FIFO2_M((f), (f)->fifo_rd_i - 1u); }while(0)
-+#define ef_vi_fifo2_rd_next(f)                                                \
-+      do{ (f)->fifo_rd_i = EF_VI_FIFO2_M((f), (f)->fifo_rd_i + 1u); }while(0)
-+
-+#define ef_vi_fifo2_put(f, v)                                         \
-+      do{ ef_vi_fifo2_poke(f) = (v); ef_vi_fifo2_wr_next(f); }while(0)
-+#define ef_vi_fifo2_get(f, pv)                                                \
-+      do{ *(pv) = ef_vi_fifo2_peek(f); ef_vi_fifo2_rd_next(f); }while(0)
-+
-+
-+/* *********************************************************************
-+ * Eventq handling
-+ */
-+
-+typedef union {
-+      uint64_t    u64;
-+      struct {
-+              uint32_t  a;
-+              uint32_t  b;
-+      } opaque;
-+} ef_vi_event;
-+
-+
-+#define EF_VI_EVENT_OFFSET(q, i)                                      \
-+      (((q)->evq_state->evq_ptr - (i) * sizeof(ef_vi_event)) & (q)->evq_mask)
-+
-+#define EF_VI_EVENT_PTR(q, i)                                           \
-+      ((ef_vi_event*) ((q)->evq_base + EF_VI_EVENT_OFFSET((q), (i))))
-+
-+/* *********************************************************************
-+ * Miscellaneous goodies
-+ */
-+#ifdef NDEBUG
-+# define EF_VI_DEBUG(x)
-+#else
-+# define EF_VI_DEBUG(x)            x
-+#endif
-+
-+#define EF_VI_ROUND_UP(i, align)   (((i)+(align)-1u) & ~((align)-1u))
-+#define EF_VI_ALIGN_FWD(p, align)  (((p)+(align)-1u) & ~((align)-1u))
-+#define EF_VI_ALIGN_BACK(p, align) ((p) & ~((align)-1u))
-+#define EF_VI_PTR_ALIGN_BACK(p, align)                                        \
-+      ((char*)EF_VI_ALIGN_BACK(((intptr_t)(p)), ((intptr_t)(align))))
-+#define EF_VI_IS_POW2(x)           ((x) && ! ((x) & ((x) - 1)))
-+
-+
-+/* ******************************************************************** 
-+ */
-+
-+extern void falcon_vi_init(ef_vi*, void* vvis ) EF_VI_HF;
-+extern void ef_eventq_state_init(ef_vi* evq) EF_VI_HF;
-+extern void __ef_init(void) EF_VI_HF;
-+
-+
-+#endif  /* __CI_EF_VI_INTERNAL_H__ */
-+
-Index: head-2008-11-25/drivers/xen/sfc_netfront/etherfabric/ef_vi.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/etherfabric/ef_vi.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,665 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ *  \brief  Virtual Interface
-+ *   \date  2007/05/16
-+ */
-+
-+#ifndef __EFAB_EF_VI_H__
-+#define __EFAB_EF_VI_H__
-+
-+
-+/**********************************************************************
-+ * Primitive types ****************************************************
-+ **********************************************************************/
-+
-+/* We standardise on the types from stdint.h and synthesise these types
-+ * for compilers/platforms that don't provide them */
-+
-+#  include <linux/types.h>
-+# define EF_VI_ALIGN(x) __attribute__ ((aligned (x)))
-+# define ef_vi_inline static inline
-+
-+
-+
-+/**********************************************************************
-+ * Types **************************************************************
-+ **********************************************************************/
-+
-+typedef uint32_t                ef_eventq_ptr;
-+
-+typedef uint64_t                ef_addr;
-+typedef char*                   ef_vi_ioaddr_t;
-+
-+/**********************************************************************
-+ * ef_event ***********************************************************
-+ **********************************************************************/
-+
-+/*! \i_ef_vi A DMA request identifier.
-+**
-+** This is an integer token specified by the transport and associated
-+** with a DMA request.  It is returned to the VI user with DMA completion
-+** events.  It is typically used to identify the buffer associated with
-+** the transfer.
-+*/
-+typedef int                   ef_request_id;
-+
-+typedef union {
-+      uint64_t  u64[1];
-+      uint32_t  u32[2];
-+} ef_vi_qword;
-+
-+typedef ef_vi_qword             ef_hw_event;
-+
-+#define EF_REQUEST_ID_BITS      16u
-+#define EF_REQUEST_ID_MASK      ((1u << EF_REQUEST_ID_BITS) - 1u)
-+
-+/*! \i_ef_event An [ef_event] is a token that identifies something that
-+** has happened.  Examples include packets received, packets transmitted
-+** and errors.
-+*/
-+typedef union {
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+      } generic;
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              /*ef_request_id  request_id :EF_REQUEST_ID_BITS;*/
-+              unsigned       q_id       :16;
-+              unsigned       len        :16;
-+              unsigned       flags      :16;
-+      } rx;
-+      struct {  /* This *must* have same layout as [rx]. */
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              /*ef_request_id  request_id :EF_REQUEST_ID_BITS;*/
-+              unsigned       q_id       :16;
-+              unsigned       len        :16;
-+              unsigned       flags      :16;
-+              unsigned       subtype    :16;
-+      } rx_discard;
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              /*ef_request_id  request_id :EF_REQUEST_ID_BITS;*/
-+              unsigned       q_id       :16;
-+      } tx;
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              /*ef_request_id  request_id :EF_REQUEST_ID_BITS;*/
-+              unsigned       q_id       :16;
-+              unsigned       subtype    :16;
-+      } tx_error;
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              unsigned       q_id       :16;
-+      } rx_no_desc_trunc;
-+      struct {
-+              ef_hw_event    ev;
-+              unsigned       type       :16;
-+              unsigned       data;
-+      } sw;
-+} ef_event;
-+
-+
-+#define EF_EVENT_TYPE(e)        ((e).generic.type)
-+enum {
-+      /** Good data was received. */
-+      EF_EVENT_TYPE_RX,
-+      /** Packets have been sent. */
-+      EF_EVENT_TYPE_TX,
-+      /** Data received and buffer consumed, but something is wrong. */
-+      EF_EVENT_TYPE_RX_DISCARD,
-+      /** Transmit of packet failed. */
-+      EF_EVENT_TYPE_TX_ERROR,
-+      /** Received packet was truncated due to lack of descriptors. */
-+      EF_EVENT_TYPE_RX_NO_DESC_TRUNC,
-+      /** Software generated event. */
-+      EF_EVENT_TYPE_SW,
-+      /** Event queue overflow. */
-+      EF_EVENT_TYPE_OFLOW,
-+};
-+
-+#define EF_EVENT_RX_BYTES(e)    ((e).rx.len)
-+#define EF_EVENT_RX_Q_ID(e)     ((e).rx.q_id)
-+#define EF_EVENT_RX_CONT(e)     ((e).rx.flags & EF_EVENT_FLAG_CONT)
-+#define EF_EVENT_RX_SOP(e)      ((e).rx.flags & EF_EVENT_FLAG_SOP)
-+#define EF_EVENT_RX_ISCSI_OKAY(e) ((e).rx.flags & EF_EVENT_FLAG_ISCSI_OK)
-+#define EF_EVENT_FLAG_SOP       0x1
-+#define EF_EVENT_FLAG_CONT      0x2
-+#define EF_EVENT_FLAG_ISCSI_OK  0x4
-+
-+#define EF_EVENT_TX_Q_ID(e)     ((e).tx.q_id)
-+
-+#define EF_EVENT_RX_DISCARD_Q_ID(e)  ((e).rx_discard.q_id)
-+#define EF_EVENT_RX_DISCARD_LEN(e)   ((e).rx_discard.len)
-+#define EF_EVENT_RX_DISCARD_TYPE(e)  ((e).rx_discard.subtype)
-+enum {
-+      EF_EVENT_RX_DISCARD_CSUM_BAD,
-+      EF_EVENT_RX_DISCARD_CRC_BAD,
-+      EF_EVENT_RX_DISCARD_TRUNC,
-+      EF_EVENT_RX_DISCARD_RIGHTS,
-+      EF_EVENT_RX_DISCARD_OTHER,
-+};
-+
-+#define EF_EVENT_TX_ERROR_Q_ID(e)    ((e).tx_error.q_id)
-+#define EF_EVENT_TX_ERROR_TYPE(e)    ((e).tx_error.subtype)
-+enum {
-+      EF_EVENT_TX_ERROR_RIGHTS,
-+      EF_EVENT_TX_ERROR_OFLOW,
-+      EF_EVENT_TX_ERROR_2BIG,
-+      EF_EVENT_TX_ERROR_BUS,
-+};
-+
-+#define EF_EVENT_RX_NO_DESC_TRUNC_Q_ID(e)  ((e).rx_no_desc_trunc.q_id)
-+
-+#define EF_EVENT_SW_DATA_MASK   0xffff
-+#define EF_EVENT_SW_DATA(e)     ((e).sw.data)
-+
-+#define EF_EVENT_FMT            "[ev:%x:%08x:%08x]"
-+#define EF_EVENT_PRI_ARG(e)     (unsigned) (e).generic.type,    \
-+              (unsigned) (e).generic.ev.u32[1],               \
-+              (unsigned) (e).generic.ev.u32[0]
-+
-+#define EF_GET_HW_EV(e)         ((e).generic.ev)
-+#define EF_GET_HW_EV_PTR(e)     (&(e).generic.ev)
-+#define EF_GET_HW_EV_U64(e)     ((e).generic.ev.u64[0])
-+
-+
-+/* ***************** */
-+
-+/*! Used by netif shared state. Must use types of explicit size. */
-+typedef struct {
-+      uint16_t              rx_last_desc_ptr;   /* for RX duplicates       */
-+      uint8_t               bad_sop;            /* bad SOP detected        */
-+      uint8_t               frag_num;           /* next fragment #, 0=>SOP */
-+} ef_rx_dup_state_t;
-+
-+
-+/* Max number of ports on any SF NIC. */
-+#define EFAB_DMAQS_PER_EVQ_MAX 32
-+
-+typedef struct {
-+      ef_eventq_ptr           evq_ptr;
-+      int32_t               trashed;
-+      ef_rx_dup_state_t     rx_dup_state[EFAB_DMAQS_PER_EVQ_MAX];
-+} ef_eventq_state;
-+
-+
-+/*! \i_ef_base [ef_iovec] is similar the standard [struct iovec].  An
-+** array of these is used to designate a scatter/gather list of I/O
-+** buffers.
-+*/
-+typedef struct {
-+      ef_addr                       iov_base EF_VI_ALIGN(8);
-+      unsigned                      iov_len;
-+} ef_iovec;
-+
-+/* Falcon constants */
-+#define TX_EV_DESC_PTR_LBN 0
-+
-+/**********************************************************************
-+ * ef_iobufset ********************************************************
-+ **********************************************************************/
-+
-+/*! \i_ef_bufs An [ef_iobufset] is a collection of buffers to be used
-+** with the NIC.
-+*/
-+typedef struct ef_iobufset {
-+      unsigned                      magic;
-+      unsigned                      bufs_mmap_bytes;
-+      unsigned                      bufs_handle;
-+      int                           bufs_ptr_off;
-+      ef_addr                       bufs_addr;
-+      unsigned                      bufs_size; /* size rounded to pow2 */
-+      int                           bufs_num;
-+      int                           faultonaccess;
-+} ef_iobufset;
-+
-+
-+/**********************************************************************
-+ * ef_vi **************************************************************
-+ **********************************************************************/
-+
-+enum ef_vi_flags {
-+      EF_VI_RX_SCATTER        = 0x1,
-+      EF_VI_ISCSI_RX_HDIG     = 0x2,
-+      EF_VI_ISCSI_TX_HDIG     = 0x4,
-+      EF_VI_ISCSI_RX_DDIG     = 0x8,
-+      EF_VI_ISCSI_TX_DDIG     = 0x10,
-+      EF_VI_TX_PHYS_ADDR      = 0x20,
-+      EF_VI_RX_PHYS_ADDR      = 0x40,
-+      EF_VI_TX_IP_CSUM_DIS    = 0x80,
-+      EF_VI_TX_TCPUDP_CSUM_DIS= 0x100,
-+      EF_VI_TX_TCPUDP_ONLY    = 0x200,
-+      /* Flags in range 0xXXXX0000 are for internal use. */
-+};
-+
-+typedef struct {
-+      uint32_t  added;
-+      uint32_t  removed;
-+} ef_vi_txq_state;
-+
-+typedef struct {
-+      uint32_t  added;
-+      uint32_t  removed;
-+} ef_vi_rxq_state;
-+
-+typedef struct {
-+      uint32_t         mask;
-+      void*            doorbell;
-+      void*            descriptors;
-+      uint16_t*        ids;
-+      unsigned         misalign_mask;
-+} ef_vi_txq;
-+
-+typedef struct {
-+      uint32_t         mask;
-+      void*            doorbell;
-+      void*            descriptors;
-+      uint16_t*        ids;
-+} ef_vi_rxq;
-+
-+typedef struct {
-+      ef_eventq_state  evq;
-+      ef_vi_txq_state  txq;
-+      ef_vi_rxq_state  rxq;
-+      /* Followed by request id fifos. */
-+} ef_vi_state;
-+
-+/*! \i_ef_vi  A virtual interface.
-+**
-+** An [ef_vi] represents a virtual interface on a specific NIC.  A
-+** virtual interface is a collection of an event queue and two DMA queues
-+** used to pass Ethernet frames between the transport implementation and
-+** the network.
-+*/
-+typedef struct ef_vi {
-+      unsigned                        magic;
-+
-+      unsigned                      vi_resource_id;
-+      unsigned                      vi_resource_handle_hack;
-+      unsigned                      vi_i;
-+
-+      char*                           vi_mem_mmap_ptr;
-+      int                           vi_mem_mmap_bytes;
-+      char*                           vi_io_mmap_ptr;
-+      int                           vi_io_mmap_bytes;
-+
-+      ef_eventq_state*              evq_state;
-+      char*                         evq_base;
-+      unsigned                      evq_mask;
-+      ef_vi_ioaddr_t                evq_timer_reg;
-+
-+      ef_vi_txq                     vi_txq;
-+      ef_vi_rxq                     vi_rxq;
-+      ef_vi_state*                  ep_state;
-+      enum ef_vi_flags              vi_flags;
-+} ef_vi;
-+
-+
-+enum ef_vi_arch {
-+      EF_VI_ARCH_FALCON,
-+};
-+
-+
-+struct ef_vi_nic_type {
-+      unsigned char  arch;
-+      char           variant;
-+      unsigned char  revision;
-+};
-+
-+
-+/* This structure is opaque to the client & used to pass mapping data
-+ * from the resource manager to the ef_vi lib. for ef_vi_init().
-+ */
-+struct vi_mappings {
-+      uint32_t         signature;
-+# define VI_MAPPING_VERSION   0x02  /*Byte: Increment me if struct altered*/
-+# define VI_MAPPING_SIGNATURE (0xBA1150 + VI_MAPPING_VERSION)
-+
-+      struct ef_vi_nic_type nic_type;
-+
-+      int              vi_instance;
-+
-+      unsigned         evq_bytes;
-+      char*            evq_base;
-+      ef_vi_ioaddr_t   evq_timer_reg;
-+
-+      unsigned         rx_queue_capacity;
-+      ef_vi_ioaddr_t   rx_dma_ef1;
-+      char*            rx_dma_falcon;
-+      ef_vi_ioaddr_t   rx_bell;
-+
-+      unsigned         tx_queue_capacity;
-+      ef_vi_ioaddr_t   tx_dma_ef1;
-+      char*            tx_dma_falcon;
-+      ef_vi_ioaddr_t   tx_bell;
-+};
-+/* This is used by clients to allocate a suitably sized buffer for the 
-+ * resource manager to fill & ef_vi_init() to use. */
-+#define VI_MAPPINGS_SIZE (sizeof(struct vi_mappings))
-+
-+
-+/**********************************************************************
-+ * ef_config **********************************************************
-+ **********************************************************************/
-+
-+struct ef_config_t {
-+      int   log;                    /* debug logging level          */
-+};
-+
-+extern struct ef_config_t  ef_config;
-+
-+
-+/**********************************************************************
-+ * ef_vi **************************************************************
-+ **********************************************************************/
-+
-+/* Initialise [data_area] with information required to initialise an ef_vi.
-+ * In the following, an unused param should be set to NULL. Note the case
-+ * marked (*) of [iobuf_mmap] for falcon/driver; for normal driver this
-+ * must be NULL.
-+ *
-+ * \param  data_area     [in,out] required, must ref at least VI_MAPPINGS_SIZE 
-+ *                                bytes
-+ * \param  evq_capacity  [in] number of events in event queue.  Specify 0 for
-+ *                            no event queue.
-+ * \param  rxq_capacity  [in] number of descriptors in RX DMA queue.  Specify
-+ *                            0 for no RX queue.
-+ * \param  txq_capacity  [in] number of descriptors in TX DMA queue.  Specify
-+ *                            0 for no TX queue.
-+ * \param  mmap_info     [in] mem-map info for resource
-+ * \param  io_mmap       [in] ef1,    required
-+ *                            falcon, required
-+ * \param  iobuf_mmap    [in] ef1,    UL: unused
-+ *                            falcon, UL: required
-+ */
-+extern void ef_vi_init_mapping_vi(void* data_area, struct ef_vi_nic_type,
-+                                  unsigned rxq_capacity,
-+                                  unsigned txq_capacity, int instance,
-+                                  void* io_mmap, void* iobuf_mmap_rx,
-+                                  void* iobuf_mmap_tx, enum ef_vi_flags);
-+
-+
-+extern void ef_vi_init_mapping_evq(void* data_area, struct ef_vi_nic_type,
-+                                   int instance, unsigned evq_bytes,
-+                                   void* base, void* timer_reg);
-+
-+ef_vi_inline unsigned ef_vi_resource_id(ef_vi* vi)
-+{ 
-+      return vi->vi_resource_id; 
-+}
-+
-+ef_vi_inline enum ef_vi_flags ef_vi_flags(ef_vi* vi)
-+{ 
-+      return vi->vi_flags; 
-+}
-+
-+
-+/**********************************************************************
-+ * Receive interface **************************************************
-+ **********************************************************************/
-+
-+/*! \i_ef_vi Returns the amount of space in the RX descriptor ring.
-+**
-+** \return the amount of space in the queue.
-+*/
-+ef_vi_inline int ef_vi_receive_space(ef_vi* vi) 
-+{
-+      ef_vi_rxq_state* qs = &vi->ep_state->rxq;
-+      return vi->vi_rxq.mask - (qs->added - qs->removed);
-+}
-+
-+
-+/*! \i_ef_vi Returns the fill level of the RX descriptor ring.
-+**
-+** \return the fill level of the queue.
-+*/
-+ef_vi_inline int ef_vi_receive_fill_level(ef_vi* vi) 
-+{
-+      ef_vi_rxq_state* qs = &vi->ep_state->rxq;
-+      return qs->added - qs->removed;
-+}
-+
-+
-+ef_vi_inline int ef_vi_receive_capacity(ef_vi* vi)
-+{ 
-+      return vi->vi_rxq.mask;
-+}
-+
-+/*! \i_ef_vi  Complete a receive operation.
-+**
-+** When a receive completion event is received, it should be passed to
-+** this function.  The request-id for the buffer that the packet was
-+** delivered to is returned.
-+**
-+** After this function returns, more space may be available in the
-+** receive queue.
-+*/
-+extern ef_request_id ef_vi_receive_done(const ef_vi*, const ef_event*);
-+
-+/*! \i_ef_vi  Return request ID indicated by a receive event
-+ */
-+ef_vi_inline ef_request_id ef_vi_receive_request_id(const ef_vi* vi,
-+                                                    const ef_event* ef_ev)
-+{
-+      const ef_vi_qword* ev = EF_GET_HW_EV_PTR(*ef_ev);
-+      return ev->u32[0] & vi->vi_rxq.mask;
-+}
-+  
-+
-+/*! \i_ef_vi  Form a receive descriptor.
-+**
-+** If \c initial_rx_bytes is zero use a reception size at least as large
-+** as an MTU.
-+*/
-+extern int ef_vi_receive_init(ef_vi* vi, ef_addr addr, ef_request_id dma_id,
-+                              int intial_rx_bytes);
-+
-+/*! \i_ef_vi  Submit initialised receive descriptors to the NIC. */
-+extern void ef_vi_receive_push(ef_vi* vi);
-+
-+/*! \i_ef_vi  Post a buffer on the receive queue.
-+**
-+**   \return 0 on success, or -EAGAIN if the receive queue is full
-+*/
-+extern int ef_vi_receive_post(ef_vi*, ef_addr addr,
-+                            ef_request_id dma_id);
-+
-+/**********************************************************************
-+ * Transmit interface *************************************************
-+ **********************************************************************/
-+
-+/*! \i_ef_vi Return the amount of space (in descriptors) in the transmit
-+**           queue.
-+**
-+** \return the amount of space in the queue (in descriptors)
-+*/
-+ef_vi_inline int ef_vi_transmit_space(ef_vi* vi) 
-+{
-+      ef_vi_txq_state* qs = &vi->ep_state->txq;
-+      return vi->vi_txq.mask - (qs->added - qs->removed);
-+}
-+
-+
-+/*! \i_ef_vi Returns the fill level of the TX descriptor ring.
-+**
-+** \return the fill level of the queue.
-+*/
-+ef_vi_inline int ef_vi_transmit_fill_level(ef_vi* vi)
-+{
-+      ef_vi_txq_state* qs = &vi->ep_state->txq;
-+      return qs->added - qs->removed;
-+}
-+
-+
-+/*! \i_ef_vi Returns the total capacity of the TX descriptor ring.
-+**
-+** \return the capacity of the queue.
-+*/
-+ef_vi_inline int ef_vi_transmit_capacity(ef_vi* vi)
-+{ 
-+      return vi->vi_txq.mask;
-+}
-+
-+
-+/*! \i_ef_vi  Transmit a packet.
-+**
-+**   \param bytes must be greater than ETH_ZLEN.
-+**   \return -EAGAIN if the transmit queue is full, or 0 on success
-+*/
-+extern int ef_vi_transmit(ef_vi*, ef_addr, int bytes, ef_request_id dma_id);
-+
-+/*! \i_ef_vi  Transmit a packet using a gather list.
-+**
-+**   \param iov_len must be greater than zero
-+**   \param iov the first must be non-zero in length (but others need not)
-+**
-+**   \return -EAGAIN if the queue is full, or 0 on success
-+*/
-+extern int ef_vi_transmitv(ef_vi*, const ef_iovec* iov, int iov_len,
-+                           ef_request_id dma_id);
-+
-+/*! \i_ef_vi  Initialise a DMA request.
-+**
-+** \return -EAGAIN if the queue is full, or 0 on success
-+*/
-+extern int ef_vi_transmit_init(ef_vi*, ef_addr, int bytes,
-+                               ef_request_id dma_id);
-+
-+/*! \i_ef_vi  Initialise a DMA request.
-+**
-+** \return -EAGAIN if the queue is full, or 0 on success
-+*/
-+extern int ef_vi_transmitv_init(ef_vi*, const ef_iovec*, int iov_len,
-+                                ef_request_id dma_id);
-+
-+/*! \i_ef_vi  Submit DMA requests to the NIC.
-+**
-+** The DMA requests must have been initialised using
-+** ef_vi_transmit_init() or ef_vi_transmitv_init().
-+*/
-+extern void ef_vi_transmit_push(ef_vi*);
-+
-+
-+/*! \i_ef_vi Maximum number of transmit completions per transmit event. */
-+#define EF_VI_TRANSMIT_BATCH  64
-+
-+/*! \i_ef_vi Determine the set of [ef_request_id]s for each DMA request
-+**           which has been completed by a given transmit completion
-+**           event.
-+**
-+** \param ids must point to an array of length EF_VI_TRANSMIT_BATCH
-+** \return the number of valid [ef_request_id]s (can be zero)
-+*/
-+extern int ef_vi_transmit_unbundle(ef_vi* ep, const ef_event*,
-+                                   ef_request_id* ids);
-+
-+
-+/*! \i_ef_event Returns true if ef_eventq_poll() will return event(s). */
-+extern int ef_eventq_has_event(ef_vi* vi);
-+
-+/*! \i_ef_event Returns true if there are quite a few events in the event
-+** queue.
-+**
-+** This looks ahead in the event queue, so has the property that it will
-+** not ping-pong a cache-line when it is called concurrently with events
-+** being delivered.
-+*/
-+extern int ef_eventq_has_many_events(ef_vi* evq, int look_ahead);
-+
-+/*! Type of function to handle unknown events arriving on event queue
-+**  Return CI_TRUE iff the event has been handled.
-+*/
-+typedef int/*bool*/ ef_event_handler_fn(void* priv, ef_vi* evq, ef_event* ev);
-+
-+/*! Standard poll exception routine */
-+extern int/*bool*/ ef_eventq_poll_exception(void* priv, ef_vi* evq,
-+                                            ef_event* ev);
-+
-+/*! \i_ef_event  Retrieve events from the event queue, handle RX/TX events
-+**  and pass any others to an exception handler function
-+**
-+**   \return The number of events retrieved.
-+*/
-+extern int ef_eventq_poll_evs(ef_vi* evq, ef_event* evs, int evs_len,
-+                              ef_event_handler_fn *exception, void *expt_priv);
-+
-+/*! \i_ef_event  Retrieve events from the event queue.
-+**
-+**   \return The number of events retrieved.
-+*/
-+ef_vi_inline int ef_eventq_poll(ef_vi* evq, ef_event* evs, int evs_len)
-+{
-+      return ef_eventq_poll_evs(evq, evs, evs_len,
-+                            &ef_eventq_poll_exception, (void*)0);
-+}
-+
-+/*! \i_ef_event Returns the capacity of an event queue. */
-+ef_vi_inline int ef_eventq_capacity(ef_vi* vi) 
-+{
-+      return (vi->evq_mask + 1u) / sizeof(ef_hw_event);
-+}
-+
-+/* Returns the instance ID of [vi] */
-+ef_vi_inline unsigned ef_vi_instance(ef_vi* vi)
-+{ return vi->vi_i; }
-+
-+
-+/**********************************************************************
-+ * Initialisation *****************************************************
-+ **********************************************************************/
-+
-+/*! Return size of state buffer of an initialised VI. */
-+extern int ef_vi_state_bytes(ef_vi*);
-+
-+/*! Return size of buffer needed for VI state given sizes of RX and TX
-+** DMA queues.  Queue sizes must be legal sizes (power of 2), or 0 (no
-+** queue).
-+*/
-+extern int ef_vi_calc_state_bytes(int rxq_size, int txq_size);
-+
-+/*! Initialise [ef_vi] from the provided resources. [vvis] must have been
-+** created by ef_make_vi_data() & remains owned by the caller.
-+*/
-+extern void ef_vi_init(ef_vi*, void* vi_info, ef_vi_state* state,
-+                       ef_eventq_state* evq_state, enum ef_vi_flags);
-+
-+extern void ef_vi_state_init(ef_vi*);
-+extern void ef_eventq_state_init(ef_vi*);
-+
-+/*! Convert an efhw device arch to ef_vi_arch, or returns -1 if not
-+** recognised.
-+*/
-+extern int  ef_vi_arch_from_efhw_arch(int efhw_arch);
-+
-+
-+#endif /* __EFAB_EF_VI_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/falcon_event.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/falcon_event.c    2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,346 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Routine to poll event queues.
-+ *   \date  2003/03/04
-+ */
-+
-+/*! \cidoxg_lib_ef */
-+#include "ef_vi_internal.h"
-+
-+/* Be worried about this on byteswapped machines */
-+/* Due to crazy chipsets, we see the event words being written in
-+** arbitrary order (bug4539).  So test for presence of event must ensure
-+** that both halves have changed from the null.
-+*/
-+# define EF_VI_IS_EVENT(evp)                                          \
-+      ( (((evp)->opaque.a != (uint32_t)-1) &&                         \
-+         ((evp)->opaque.b != (uint32_t)-1)) )
-+
-+
-+#ifdef NDEBUG
-+# define IS_DEBUG 0
-+#else
-+# define IS_DEBUG 1
-+#endif
-+
-+
-+/*! Check for RX events with inconsistent SOP/CONT
-+**
-+** Returns true if this event should be discarded
-+*/
-+ef_vi_inline int ef_eventq_is_rx_sop_cont_bad_efab(ef_vi* vi,
-+                                                 const ef_vi_qword* ev)
-+{
-+      ef_rx_dup_state_t* rx_dup_state;
-+      uint8_t* bad_sop;
-+
-+      unsigned label = QWORD_GET_U(RX_EV_Q_LABEL, *ev);
-+      unsigned sop   = QWORD_TEST_BIT(RX_SOP, *ev);
-+  
-+      ef_assert(vi);
-+      ef_assert_lt(label, EFAB_DMAQS_PER_EVQ_MAX);
-+
-+      rx_dup_state = &vi->evq_state->rx_dup_state[label];
-+      bad_sop = &rx_dup_state->bad_sop;
-+
-+      if( ! ((vi->vi_flags & EF_VI_BUG5692_WORKAROUND) || IS_DEBUG) ) {
-+              *bad_sop = (*bad_sop && !sop);
-+      }
-+      else {
-+              unsigned cont  = QWORD_TEST_BIT(RX_JUMBO_CONT, *ev);
-+              uint8_t *frag_num = &rx_dup_state->frag_num;
-+
-+              /* bad_sop should latch till the next sop */
-+              *bad_sop = (*bad_sop && !sop) || ( !!sop != (*frag_num==0) );
-+
-+              /* we do not check the number of bytes relative to the
-+               * fragment number and size of the user rx buffer here
-+               * because we don't know the size of the user rx
-+               * buffer - we probably should perform this check in
-+               * the nearest code calling this though.
-+               */
-+              *frag_num = cont ? (*frag_num + 1) : 0;
-+      }
-+
-+      return *bad_sop;
-+}
-+
-+
-+ef_vi_inline int falcon_rx_check_dup(ef_vi* evq, ef_event* ev_out,
-+                                   const ef_vi_qword* ev)
-+{
-+      unsigned q_id = QWORD_GET_U(RX_EV_Q_LABEL, *ev);
-+      unsigned desc_ptr = QWORD_GET_U(RX_EV_DESC_PTR, *ev);
-+      ef_rx_dup_state_t* rx_dup_state = &evq->evq_state->rx_dup_state[q_id];
-+
-+      if(likely( desc_ptr != rx_dup_state->rx_last_desc_ptr )) {
-+              rx_dup_state->rx_last_desc_ptr = desc_ptr;
-+              return 0;
-+      }
-+
-+      rx_dup_state->rx_last_desc_ptr = desc_ptr;
-+      rx_dup_state->bad_sop = 1;
-+#ifndef NDEBUG
-+      rx_dup_state->frag_num = 0;
-+#endif
-+      BUG_ON(!QWORD_TEST_BIT(RX_EV_FRM_TRUNC, *ev));
-+      BUG_ON( QWORD_TEST_BIT(RX_EV_PKT_OK, *ev));
-+      BUG_ON(!QWORD_GET_U(RX_EV_BYTE_CNT, *ev) == 0);
-+      ev_out->rx_no_desc_trunc.type = EF_EVENT_TYPE_RX_NO_DESC_TRUNC;
-+      ev_out->rx_no_desc_trunc.q_id = q_id;
-+      return 1;
-+}
-+
-+
-+ef_vi_inline void falcon_rx_event(ef_event* ev_out, const ef_vi_qword* ev)
-+{
-+      if(likely( QWORD_TEST_BIT(RX_EV_PKT_OK, *ev) )) {
-+              ev_out->rx.type = EF_EVENT_TYPE_RX;
-+              ev_out->rx.q_id = QWORD_GET_U(RX_EV_Q_LABEL, *ev);
-+              ev_out->rx.len  = QWORD_GET_U(RX_EV_BYTE_CNT, *ev);
-+              if( QWORD_TEST_BIT(RX_SOP, *ev) )
-+                      ev_out->rx.flags = EF_EVENT_FLAG_SOP;
-+              else
-+                      ev_out->rx.flags = 0;
-+              if( QWORD_TEST_BIT(RX_JUMBO_CONT, *ev) )
-+                      ev_out->rx.flags |= EF_EVENT_FLAG_CONT;
-+              if( QWORD_TEST_BIT(RX_iSCSI_PKT_OK, *ev) )
-+                      ev_out->rx.flags |= EF_EVENT_FLAG_ISCSI_OK;
-+      }
-+      else {
-+              ev_out->rx_discard.type = EF_EVENT_TYPE_RX_DISCARD;
-+              ev_out->rx_discard.q_id = QWORD_GET_U(RX_EV_Q_LABEL, *ev);
-+              ev_out->rx_discard.len  = QWORD_GET_U(RX_EV_BYTE_CNT, *ev);
-+#if 1  /* hack for ptloop compatability: ?? TODO purge */
-+              if( QWORD_TEST_BIT(RX_SOP, *ev) )
-+                      ev_out->rx_discard.flags = EF_EVENT_FLAG_SOP;
-+              else
-+                      ev_out->rx_discard.flags = 0;
-+              if( QWORD_TEST_BIT(RX_JUMBO_CONT, *ev) )
-+                      ev_out->rx_discard.flags |= EF_EVENT_FLAG_CONT;
-+              if( QWORD_TEST_BIT(RX_iSCSI_PKT_OK, *ev) )
-+                      ev_out->rx_discard.flags |= EF_EVENT_FLAG_ISCSI_OK;
-+#endif
-+              /* Order matters here: more fundamental errors first. */
-+              if( QWORD_TEST_BIT(RX_EV_BUF_OWNER_ID_ERR, *ev) )
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_RIGHTS;
-+              else if( QWORD_TEST_BIT(RX_EV_FRM_TRUNC, *ev) )
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_TRUNC;
-+              else if( QWORD_TEST_BIT(RX_EV_ETH_CRC_ERR, *ev) )
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_CRC_BAD;
-+              else if( QWORD_TEST_BIT(RX_EV_IP_HDR_CHKSUM_ERR, *ev) )
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_CSUM_BAD;
-+              else if( QWORD_TEST_BIT(RX_EV_TCP_UDP_CHKSUM_ERR, *ev) )
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_CSUM_BAD;
-+              else
-+                      ev_out->rx_discard.subtype = 
-+                              EF_EVENT_RX_DISCARD_OTHER;
-+      }
-+}
-+
-+
-+ef_vi_inline void falcon_tx_event(ef_event* ev_out, const ef_vi_qword* ev)
-+{
-+      /* Danger danger!  No matter what we ask for wrt batching, we
-+      ** will get a batched event every 16 descriptors, and we also
-+      ** get dma-queue-empty events.  i.e. Duplicates are expected.
-+      **
-+      ** In addition, if it's been requested in the descriptor, we
-+      ** get an event per descriptor.  (We don't currently request
-+      ** this).
-+      */
-+      if(likely( QWORD_TEST_BIT(TX_EV_COMP, *ev) )) {
-+              ev_out->tx.type = EF_EVENT_TYPE_TX;
-+              ev_out->tx.q_id = QWORD_GET_U(TX_EV_Q_LABEL, *ev);
-+      }
-+      else {
-+              ev_out->tx_error.type = EF_EVENT_TYPE_TX_ERROR;
-+              ev_out->tx_error.q_id = QWORD_GET_U(TX_EV_Q_LABEL, *ev);
-+              if(likely( QWORD_TEST_BIT(TX_EV_BUF_OWNER_ID_ERR, *ev) ))
-+                      ev_out->tx_error.subtype = EF_EVENT_TX_ERROR_RIGHTS;
-+              else if(likely( QWORD_TEST_BIT(TX_EV_WQ_FF_FULL, *ev) ))
-+                      ev_out->tx_error.subtype = EF_EVENT_TX_ERROR_OFLOW;
-+              else if(likely( QWORD_TEST_BIT(TX_EV_PKT_TOO_BIG, *ev) ))
-+                      ev_out->tx_error.subtype = EF_EVENT_TX_ERROR_2BIG;
-+              else if(likely( QWORD_TEST_BIT(TX_EV_PKT_ERR, *ev) ))
-+                      ev_out->tx_error.subtype = EF_EVENT_TX_ERROR_BUS;
-+      }
-+}
-+
-+
-+static void mark_bad(ef_event* ev)
-+{
-+      ev->generic.ev.u64[0] &=~ ((uint64_t) 1u << RX_EV_PKT_OK_LBN);
-+}
-+
-+
-+int ef_eventq_poll_evs(ef_vi* evq, ef_event* evs, int evs_len,
-+                     ef_event_handler_fn *exception, void *expt_priv)
-+{
-+      int evs_len_orig = evs_len;
-+
-+      EF_VI_CHECK_EVENT_Q(evq);
-+      ef_assert(evs);
-+      ef_assert_gt(evs_len, 0);
-+
-+      if(unlikely( EF_VI_IS_EVENT(EF_VI_EVENT_PTR(evq, 1)) ))
-+              goto overflow;
-+
-+      do {
-+              { /* Read the event out of the ring, then fiddle with
-+                 * copied version.  Reason is that the ring is
-+                 * likely to get pushed out of cache by another
-+                 * event being delivered by hardware. */
-+                      ef_vi_event* ev = EF_VI_EVENT_PTR(evq, 0);
-+                      if( ! EF_VI_IS_EVENT(ev) )
-+                              break;
-+                      evs->generic.ev.u64[0] = cpu_to_le64 (ev->u64);
-+                      evq->evq_state->evq_ptr += sizeof(ef_vi_event);
-+                      ev->u64 = (uint64_t)(int64_t) -1;
-+              }
-+
-+              /* Ugly: Exploit the fact that event code lies in top
-+               * bits of event. */
-+              ef_assert_ge(EV_CODE_LBN, 32u);
-+              switch( evs->generic.ev.u32[1] >> (EV_CODE_LBN - 32u) ) {
-+              case RX_IP_EV_DECODE:
-+                      /* Look for duplicate desc_ptr: it signals
-+                       * that a jumbo frame was truncated because we
-+                       * ran out of descriptors. */
-+                      if(unlikely( falcon_rx_check_dup
-+                                         (evq, evs, &evs->generic.ev) )) {
-+                              --evs_len;
-+                              ++evs;
-+                              break;
-+                      }
-+                      else {
-+                              /* Cope with FalconA1 bugs where RX
-+                               * gives inconsistent RX events Mark
-+                               * events as bad until SOP becomes
-+                               * consistent again
-+                               * ef_eventq_is_rx_sop_cont_bad() has
-+                               * side effects - order is important
-+                               */
-+                              if(unlikely
-+                                 (ef_eventq_is_rx_sop_cont_bad_efab
-+                                  (evq, &evs->generic.ev) )) {
-+                                      mark_bad(evs);
-+                              }
-+                      }
-+                      falcon_rx_event(evs, &evs->generic.ev);
-+                      --evs_len;      
-+                      ++evs;
-+                      break;
-+
-+              case TX_IP_EV_DECODE:
-+                      falcon_tx_event(evs, &evs->generic.ev);
-+                      --evs_len;
-+                      ++evs;
-+                      break;
-+
-+              default:
-+                      break;
-+              }
-+      } while( evs_len );
-+
-+      return evs_len_orig - evs_len;
-+
-+
-+ overflow:
-+      evs->generic.type = EF_EVENT_TYPE_OFLOW;
-+      evs->generic.ev.u64[0] = (uint64_t)((int64_t)-1);
-+      return 1;
-+}
-+
-+
-+int/*bool*/ ef_eventq_poll_exception(void* priv, ef_vi* evq, ef_event* ev)
-+{
-+      int /*bool*/ handled = 0;
-+  
-+      switch( ev->generic.ev.u32[1] >> (EV_CODE_LBN - 32u) ) {
-+      case DRIVER_EV_DECODE:
-+              if( QWORD_GET_U(DRIVER_EV_SUB_CODE, ev->generic.ev) ==
-+                  EVQ_INIT_DONE_EV_DECODE )
-+                      /* EVQ initialised event: ignore. */
-+                      handled = 1;
-+              break;
-+      }
-+      return handled;
-+}
-+
-+
-+void ef_eventq_iterate(ef_vi* vi,
-+                     void (*fn)(void* arg, ef_vi*, int rel_pos,
-+                                int abs_pos, void* event),
-+                     void* arg, int stop_at_end)
-+{
-+      int i, size_evs = (vi->evq_mask + 1) / sizeof(ef_vi_event);
-+
-+      for( i = 0; i < size_evs; ++i ) {
-+              ef_vi_event* e = EF_VI_EVENT_PTR(vi, -i);
-+              if( EF_VI_IS_EVENT(e) )
-+                      fn(arg, vi, i, 
-+                         EF_VI_EVENT_OFFSET(vi, -i) / sizeof(ef_vi_event),
-+                         e);
-+              else if( stop_at_end )
-+                      break;
-+      }
-+}
-+
-+
-+int ef_eventq_has_event(ef_vi* vi)
-+{
-+      return EF_VI_IS_EVENT(EF_VI_EVENT_PTR(vi, 0));
-+}
-+
-+
-+int ef_eventq_has_many_events(ef_vi* vi, int look_ahead)
-+{
-+      ef_assert_ge(look_ahead, 0);
-+      return EF_VI_IS_EVENT(EF_VI_EVENT_PTR(vi, -look_ahead));
-+}
-+
-+
-+int ef_eventq_has_rx_event(ef_vi* vi)
-+{
-+      ef_vi_event* ev;
-+      int i, n_evs = 0;
-+
-+      for( i = 0;  EF_VI_IS_EVENT(EF_VI_EVENT_PTR(vi, i)); --i ) {
-+              ev = EF_VI_EVENT_PTR(vi, i);
-+              if( EFVI_FALCON_EVENT_CODE(ev) == EF_EVENT_TYPE_RX )  n_evs++;
-+      }
-+      return n_evs;
-+}
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/falcon_vi.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/falcon_vi.c       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,465 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr, stg
-+ *  \brief  Falcon-specific VI
-+ *   \date  2006/11/30
-+ */
-+
-+#include "ef_vi_internal.h"
-+
-+
-+#define EFVI_FALCON_DMA_TX_FRAG               1
-+
-+
-+/* TX descriptor for both physical and virtual packet transfers */
-+typedef union {
-+      uint32_t        dword[2];
-+} ef_vi_falcon_dma_tx_buf_desc;
-+typedef ef_vi_falcon_dma_tx_buf_desc ef_vi_falcon_dma_tx_phys_desc;
-+
-+
-+/* RX descriptor for physical addressed transfers */
-+typedef union {
-+      uint32_t        dword[2];
-+} ef_vi_falcon_dma_rx_phys_desc;
-+
-+
-+/* RX descriptor for virtual packet transfers */
-+typedef struct {
-+      uint32_t        dword[1];
-+} ef_vi_falcon_dma_rx_buf_desc;
-+
-+/* Buffer table index */
-+typedef uint32_t              ef_vi_buffer_addr_t;
-+
-+ef_vi_inline int64_t dma_addr_to_u46(int64_t src_dma_addr)
-+{
-+      return (src_dma_addr & __FALCON_MASK(46, int64_t));
-+}
-+
-+/*! Setup a physical address based descriptor with a specified length */
-+ef_vi_inline void
-+__falcon_dma_rx_calc_ip_phys(ef_vi_dma_addr_t dest_pa, 
-+                           ef_vi_falcon_dma_rx_phys_desc *desc,
-+                           int bytes)
-+{
-+      int region = 0;                 /* TODO fixme */
-+      int64_t dest    = dma_addr_to_u46(dest_pa); /* lower 46 bits */
-+
-+      DWCHCK(__DW2(RX_KER_BUF_SIZE_LBN),  RX_KER_BUF_SIZE_WIDTH);
-+      DWCHCK(__DW2(RX_KER_BUF_REGION_LBN),RX_KER_BUF_REGION_WIDTH);
-+
-+      LWCHK(RX_KER_BUF_ADR_LBN, RX_KER_BUF_ADR_WIDTH);
-+
-+      RANGECHCK(bytes,  RX_KER_BUF_SIZE_WIDTH);
-+      RANGECHCK(region, RX_KER_BUF_REGION_WIDTH);
-+
-+      ef_assert(desc);
-+
-+      desc->dword[1] = ((bytes << __DW2(RX_KER_BUF_SIZE_LBN)) |
-+                        (region << __DW2(RX_KER_BUF_REGION_LBN)) |
-+                        (HIGH(dest,
-+                              RX_KER_BUF_ADR_LBN, 
-+                              RX_KER_BUF_ADR_WIDTH)));
-+
-+      desc->dword[0] = LOW(dest, 
-+                           RX_KER_BUF_ADR_LBN, 
-+                           RX_KER_BUF_ADR_WIDTH);
-+}
-+
-+/*! Setup a virtual buffer descriptor for an IPMODE transfer */
-+ef_vi_inline void
-+__falcon_dma_tx_calc_ip_buf(unsigned buf_id, unsigned buf_ofs, unsigned bytes,
-+                          int port, int frag, 
-+                          ef_vi_falcon_dma_tx_buf_desc *desc)
-+{
-+      DWCHCK(__DW2(TX_USR_PORT_LBN), TX_USR_PORT_WIDTH);
-+      DWCHCK(__DW2(TX_USR_CONT_LBN), TX_USR_CONT_WIDTH);
-+      DWCHCK(__DW2(TX_USR_BYTE_CNT_LBN), TX_USR_BYTE_CNT_WIDTH);
-+      LWCHK(RX_KER_BUF_ADR_LBN, RX_KER_BUF_ADR_WIDTH);
-+      DWCHCK(TX_USR_BYTE_OFS_LBN, TX_USR_BYTE_OFS_WIDTH);
-+
-+      RANGECHCK(bytes,   TX_USR_BYTE_CNT_WIDTH);
-+      RANGECHCK(port,    TX_USR_PORT_WIDTH);
-+      RANGECHCK(frag,    TX_USR_CONT_WIDTH);
-+      RANGECHCK(buf_id,  TX_USR_BUF_ID_WIDTH);
-+      RANGECHCK(buf_ofs, TX_USR_BYTE_OFS_WIDTH);
-+
-+      ef_assert(desc);
-+
-+      desc->dword[1] = ((port   <<  __DW2(TX_USR_PORT_LBN))      | 
-+                        (frag   <<  __DW2(TX_USR_CONT_LBN))      | 
-+                        (bytes  <<  __DW2(TX_USR_BYTE_CNT_LBN))  |
-+                        (HIGH(buf_id, 
-+                              TX_USR_BUF_ID_LBN,
-+                              TX_USR_BUF_ID_WIDTH)));
-+
-+      desc->dword[0] =  ((LOW(buf_id,
-+                              TX_USR_BUF_ID_LBN,
-+                              (TX_USR_BUF_ID_WIDTH))) |
-+                         (buf_ofs << TX_USR_BYTE_OFS_LBN));
-+}
-+
-+ef_vi_inline void
-+falcon_dma_tx_calc_ip_buf_4k(unsigned buf_vaddr, unsigned bytes,
-+                           int port, int frag, 
-+                           ef_vi_falcon_dma_tx_buf_desc *desc)
-+{
-+      /* TODO FIXME [buf_vaddr] consists of the buffer index in the
-+      ** high bits, and an offset in the low bits. Assumptions
-+      ** permate the code that these can be rolled into one 32bit
-+      ** value, so this is currently preserved for Falcon. But we
-+      ** should change to support 8K pages
-+      */
-+      unsigned buf_id =  EFVI_FALCON_BUFFER_4K_PAGE(buf_vaddr);
-+      unsigned buf_ofs = EFVI_FALCON_BUFFER_4K_OFF(buf_vaddr);
-+
-+      __falcon_dma_tx_calc_ip_buf( buf_id, buf_ofs, bytes, port, frag, desc);
-+}
-+
-+ef_vi_inline void
-+falcon_dma_tx_calc_ip_buf(unsigned buf_vaddr, unsigned bytes, int port, 
-+                        int frag, ef_vi_falcon_dma_tx_buf_desc *desc)
-+{
-+      falcon_dma_tx_calc_ip_buf_4k(buf_vaddr, bytes, port, frag, desc);
-+}
-+
-+/*! Setup a virtual buffer based descriptor */
-+ef_vi_inline void
-+__falcon_dma_rx_calc_ip_buf(unsigned buf_id, unsigned buf_ofs, 
-+                          ef_vi_falcon_dma_rx_buf_desc *desc)
-+{ 
-+      /* check alignment of buffer offset and pack */
-+      ef_assert((buf_ofs & 0x1) == 0);
-+
-+      buf_ofs >>= 1;
-+
-+      DWCHCK(RX_USR_2BYTE_OFS_LBN, RX_USR_2BYTE_OFS_WIDTH);
-+      DWCHCK(RX_USR_BUF_ID_LBN, RX_USR_BUF_ID_WIDTH);
-+
-+      RANGECHCK(buf_ofs, RX_USR_2BYTE_OFS_WIDTH);
-+      RANGECHCK(buf_id,  RX_USR_BUF_ID_WIDTH);
-+
-+      ef_assert(desc);
-+
-+      desc->dword[0] = ((buf_ofs << RX_USR_2BYTE_OFS_LBN) | 
-+                        (buf_id  << RX_USR_BUF_ID_LBN));
-+}
-+
-+ef_vi_inline void
-+falcon_dma_rx_calc_ip_buf_4k(unsigned buf_vaddr, 
-+                           ef_vi_falcon_dma_rx_buf_desc *desc)
-+{ 
-+      /* TODO FIXME [buf_vaddr] consists of the buffer index in the
-+      ** high bits, and an offset in the low bits. Assumptions
-+      ** permeate the code that these can be rolled into one 32bit
-+      ** value, so this is currently preserved for Falcon. But we
-+      ** should change to support 8K pages
-+      */
-+      unsigned buf_id =  EFVI_FALCON_BUFFER_4K_PAGE(buf_vaddr);
-+      unsigned buf_ofs = EFVI_FALCON_BUFFER_4K_OFF(buf_vaddr);
-+
-+      __falcon_dma_rx_calc_ip_buf(buf_id, buf_ofs, desc);
-+}
-+
-+ef_vi_inline void
-+falcon_dma_rx_calc_ip_buf(unsigned buf_vaddr, 
-+                        ef_vi_falcon_dma_rx_buf_desc *desc)
-+{ 
-+      falcon_dma_rx_calc_ip_buf_4k(buf_vaddr, desc);
-+}
-+
-+
-+ef_vi_inline ef_vi_dma_addr_t ef_physaddr(ef_addr efaddr)
-+{
-+      return (ef_vi_dma_addr_t) efaddr;
-+}
-+
-+
-+/*! Convert between an ef_addr and a buffer table index
-+**  Assert that this was not a physical address
-+*/
-+ef_vi_inline ef_vi_buffer_addr_t ef_bufaddr(ef_addr efaddr)
-+{
-+      ef_assert(efaddr < ((uint64_t)1 << 32) );
-+
-+      return (ef_vi_buffer_addr_t) efaddr;
-+}
-+
-+
-+/*! Setup an physical address based descriptor for an IPMODE transfer */
-+ef_vi_inline void
-+falcon_dma_tx_calc_ip_phys(ef_vi_dma_addr_t src_dma_addr, unsigned bytes, 
-+                         int port, int frag,
-+                         ef_vi_falcon_dma_tx_phys_desc *desc)
-+{
-+
-+      int region = 0; /* FIXME */
-+      int64_t src    = dma_addr_to_u46(src_dma_addr); /* lower 46 bits */
-+
-+      DWCHCK(__DW2(TX_KER_PORT_LBN),      TX_KER_PORT_WIDTH);
-+      DWCHCK(__DW2(TX_KER_CONT_LBN),      TX_KER_CONT_WIDTH);
-+      DWCHCK(__DW2(TX_KER_BYTE_CNT_LBN),  TX_KER_BYTE_CNT_WIDTH);
-+      DWCHCK(__DW2(TX_KER_BUF_REGION_LBN),TX_KER_BUF_REGION_WIDTH);
-+
-+      LWCHK(TX_KER_BUF_ADR_LBN, TX_KER_BUF_ADR_WIDTH);
-+
-+      RANGECHCK(port,   TX_KER_PORT_WIDTH);
-+      RANGECHCK(frag,   TX_KER_CONT_WIDTH);
-+      RANGECHCK(bytes,  TX_KER_BYTE_CNT_WIDTH);
-+      RANGECHCK(region, TX_KER_BUF_REGION_WIDTH);
-+
-+      desc->dword[1] = ((port   <<  __DW2(TX_KER_PORT_LBN))      | 
-+                        (frag   <<  __DW2(TX_KER_CONT_LBN))      | 
-+                        (bytes  <<  __DW2(TX_KER_BYTE_CNT_LBN))  | 
-+                        (region << __DW2(TX_KER_BUF_REGION_LBN)) |
-+                        (HIGH(src,
-+                              TX_KER_BUF_ADR_LBN, 
-+                              TX_KER_BUF_ADR_WIDTH)));
-+
-+      ef_assert_equal(TX_KER_BUF_ADR_LBN, 0);
-+      desc->dword[0] = (uint32_t) src_dma_addr;
-+}
-+
-+
-+void falcon_vi_init(ef_vi* vi, void* vvis)
-+{
-+      struct vi_mappings *vm = (struct vi_mappings*)vvis;
-+      uint16_t* ids;
-+
-+      ef_assert(vi);
-+      ef_assert(vvis);
-+      ef_assert_equal(vm->signature, VI_MAPPING_SIGNATURE);
-+      ef_assert_equal(vm->nic_type.arch, EF_VI_ARCH_FALCON);
-+
-+      /* Initialise masks to zero, so that ef_vi_state_init() will
-+      ** not do any harm when we don't have DMA queues. */
-+      vi->vi_rxq.mask = vi->vi_txq.mask = 0;
-+
-+      /* Used for BUG5391_WORKAROUND. */
-+      vi->vi_txq.misalign_mask = 0;
-+
-+      /* Initialise doorbell addresses to a distinctive small value
-+      ** which will cause a segfault, to trap doorbell pushes to VIs
-+      ** without DMA queues. */
-+      vi->vi_rxq.doorbell = vi->vi_txq.doorbell = (ef_vi_ioaddr_t)0xdb;
-+
-+      ids = (uint16_t*) (vi->ep_state + 1);
-+
-+      if( vm->tx_queue_capacity ) {
-+              vi->vi_txq.mask = vm->tx_queue_capacity - 1;
-+              vi->vi_txq.doorbell = vm->tx_bell + 12;
-+              vi->vi_txq.descriptors = vm->tx_dma_falcon;
-+              vi->vi_txq.ids = ids;
-+              ids += vi->vi_txq.mask + 1;
-+              /* Check that the id fifo fits in the space allocated. */
-+              ef_assert_le((char*) (vi->vi_txq.ids + vm->tx_queue_capacity),
-+                           (char*) vi->ep_state
-+                           + ef_vi_calc_state_bytes(vm->rx_queue_capacity,
-+                                                    vm->tx_queue_capacity));
-+      }
-+      if( vm->rx_queue_capacity ) {
-+              vi->vi_rxq.mask = vm->rx_queue_capacity - 1;
-+              vi->vi_rxq.doorbell = vm->rx_bell + 12;
-+              vi->vi_rxq.descriptors = vm->rx_dma_falcon;
-+              vi->vi_rxq.ids = ids;
-+              /* Check that the id fifo fits in the space allocated. */
-+              ef_assert_le((char*) (vi->vi_rxq.ids + vm->rx_queue_capacity),
-+                           (char*) vi->ep_state
-+                           + ef_vi_calc_state_bytes(vm->rx_queue_capacity,
-+                                                    vm->tx_queue_capacity));
-+      }
-+
-+      if( vm->nic_type.variant == 'A' ) {
-+              vi->vi_txq.misalign_mask = 15;    /* BUG5391_WORKAROUND */
-+              vi->vi_flags |= EF_VI_BUG5692_WORKAROUND;
-+      }
-+}
-+
-+
-+int ef_vi_transmitv_init(ef_vi* vi, const ef_iovec* iov, int iov_len,
-+                       ef_request_id dma_id)
-+{
-+      ef_vi_txq* q = &vi->vi_txq;
-+      ef_vi_txq_state* qs = &vi->ep_state->txq;
-+      ef_vi_falcon_dma_tx_buf_desc* dp;
-+      unsigned len, dma_len, di;
-+      unsigned added_save = qs->added;
-+      ef_addr dma_addr;
-+      unsigned last_len = 0;
-+
-+      ef_assert(iov_len > 0);
-+      ef_assert(iov);
-+      ef_assert_equal((dma_id & EF_REQUEST_ID_MASK), dma_id);
-+      ef_assert_nequal(dma_id, 0xffff);
-+
-+      dma_addr = iov->iov_base;
-+      len = iov->iov_len;
-+
-+      if( vi->vi_flags & EF_VI_ISCSI_TX_DDIG ) {
-+              /* Last 4 bytes of placeholder for digest must be
-+               * removed for h/w */
-+              ef_assert(len > 4);
-+              last_len = iov[iov_len - 1].iov_len;
-+              if( last_len <= 4 ) {
-+                      ef_assert(iov_len > 1);
-+                      --iov_len;
-+                      last_len = iov[iov_len - 1].iov_len - (4 - last_len);
-+              }
-+              else {
-+                      last_len = iov[iov_len - 1].iov_len - 4;
-+              }
-+              if( iov_len == 1 )
-+                      len = last_len;
-+      }
-+
-+      while( 1 ) {
-+              if( qs->added - qs->removed >= q->mask ) {
-+                      qs->added = added_save;
-+                      return -EAGAIN;
-+              }
-+
-+              dma_len = (~((unsigned) dma_addr) & 0xfff) + 1;
-+              if( dma_len > len )  dma_len = len;
-+              { /* BUG5391_WORKAROUND */
-+                      unsigned misalign = 
-+                              (unsigned) dma_addr & q->misalign_mask;
-+                      if( misalign && dma_len + misalign > 512 )
-+                              dma_len = 512 - misalign;
-+              }
-+
-+              di = qs->added++ & q->mask;
-+              dp = (ef_vi_falcon_dma_tx_buf_desc*) q->descriptors + di;
-+              if( vi->vi_flags & EF_VI_TX_PHYS_ADDR )
-+                      falcon_dma_tx_calc_ip_phys
-+                              (ef_physaddr(dma_addr), dma_len, /*port*/ 0,
-+                               (iov_len == 1 && dma_len == len) ? 0 :
-+                               EFVI_FALCON_DMA_TX_FRAG, dp);
-+              else
-+                      falcon_dma_tx_calc_ip_buf
-+                              (ef_bufaddr(dma_addr), dma_len, /*port*/ 0,
-+                               (iov_len == 1 && dma_len == len) ? 0 :
-+                               EFVI_FALCON_DMA_TX_FRAG, dp);
-+
-+              dma_addr += dma_len;
-+              len -= dma_len;
-+
-+              if( len == 0 ) {
-+                      if( --iov_len == 0 )  break;
-+                      ++iov;
-+                      dma_addr = iov->iov_base;
-+                      len = iov->iov_len;
-+                      if( (vi->vi_flags & EF_VI_ISCSI_TX_DDIG) &&
-+                          (iov_len == 1) )
-+                              len = last_len;
-+              }
-+      }
-+
-+      q->ids[di] = (uint16_t) dma_id;
-+      return 0;
-+}
-+
-+
-+void ef_vi_transmit_push(ef_vi* vi)
-+{
-+      ef_vi_wiob();
-+      writel((vi->ep_state->txq.added & vi->vi_txq.mask) <<
-+              __DW4(TX_DESC_WPTR_LBN),
-+              vi->vi_txq.doorbell);
-+}
-+
-+
-+/*! The value of initial_rx_bytes is used to set RX_KER_BUF_SIZE in an initial
-+**  receive descriptor here if physical addressing is being used. A value of
-+**  zero represents 16384 bytes.  This is okay, because caller must provide a
-+**  buffer than is > MTU, and mac should filter anything bigger than that.
-+*/
-+int ef_vi_receive_init(ef_vi* vi, ef_addr addr, ef_request_id dma_id,
-+                     int initial_rx_bytes)
-+{
-+      ef_vi_rxq* q = &vi->vi_rxq;
-+      ef_vi_rxq_state* qs = &vi->ep_state->rxq;
-+      unsigned di;
-+
-+      if( ef_vi_receive_space(vi) ) {
-+              di = qs->added++ & q->mask;
-+              ef_assert_equal(q->ids[di], 0xffff);
-+              q->ids[di] = (uint16_t) dma_id;
-+
-+              if( ! (vi->vi_flags & EF_VI_RX_PHYS_ADDR) ) {
-+                      ef_vi_falcon_dma_rx_buf_desc* dp;
-+                      dp = (ef_vi_falcon_dma_rx_buf_desc*) 
-+                              q->descriptors + di;
-+                      falcon_dma_rx_calc_ip_buf(ef_bufaddr(addr), dp);
-+              }
-+              else {
-+                      ef_vi_falcon_dma_rx_phys_desc* dp;
-+                      dp = (ef_vi_falcon_dma_rx_phys_desc*) 
-+                              q->descriptors + di;
-+                      __falcon_dma_rx_calc_ip_phys(addr, dp,
-+                                                   initial_rx_bytes);
-+              }
-+
-+              return 0;
-+      }
-+
-+      return -EAGAIN;
-+}
-+
-+
-+void ef_vi_receive_push(ef_vi* vi)
-+{
-+      ef_vi_wiob();
-+      writel ((vi->ep_state->rxq.added & vi->vi_rxq.mask) <<
-+              __DW4(RX_DESC_WPTR_LBN),
-+              vi->vi_rxq.doorbell);
-+}
-+
-+
-+ef_request_id ef_vi_receive_done(const ef_vi* vi, const ef_event* ef_ev)
-+{
-+      const ef_vi_qword* ev = EF_GET_HW_EV_PTR(*ef_ev);
-+      unsigned di = ev->u32[0] & vi->vi_rxq.mask;
-+      ef_request_id rq_id;
-+
-+      ef_assert(EF_EVENT_TYPE(*ef_ev) == EF_EVENT_TYPE_RX ||
-+                EF_EVENT_TYPE(*ef_ev) == EF_EVENT_TYPE_RX_DISCARD);
-+
-+      /* Detect spurious / duplicate RX events.  We may need to modify this
-+      ** code so that we are robust if they happen. */
-+      ef_assert_equal(di, vi->ep_state->rxq.removed & vi->vi_rxq.mask);
-+
-+      /* We only support 1 port: so events should be in order. */
-+      ef_assert(vi->vi_rxq.ids[di] != 0xffff);
-+
-+      rq_id = vi->vi_rxq.ids[di];
-+      vi->vi_rxq.ids[di] = 0xffff;
-+      ++vi->ep_state->rxq.removed;
-+      return rq_id;
-+}
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/pt_tx.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/pt_tx.c   2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,91 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Packet-mode transmit interface.
-+ *   \date  2003/04/02
-+ */
-+
-+/*! \cidoxg_lib_ef */
-+#include "ef_vi_internal.h"
-+
-+
-+int ef_vi_transmit_init(ef_vi* vi, ef_addr base, int len, ef_request_id dma_id)
-+{
-+      ef_iovec iov = { base, len };
-+      return ef_vi_transmitv_init(vi, &iov, 1, dma_id);
-+}
-+
-+
-+int ef_vi_transmit(ef_vi* vi, ef_addr base, int len, ef_request_id dma_id)
-+{
-+      ef_iovec iov = { base, len };
-+      int rc = ef_vi_transmitv_init(vi, &iov, 1, dma_id);
-+      if( rc == 0 )  ef_vi_transmit_push(vi);
-+      return rc;
-+}
-+
-+
-+int ef_vi_transmitv(ef_vi* vi, const ef_iovec* iov, int iov_len,
-+                    ef_request_id dma_id)
-+{
-+      int rc = ef_vi_transmitv_init(vi, iov, iov_len, dma_id);
-+      if( rc == 0 )  ef_vi_transmit_push(vi);
-+      return rc;
-+}
-+
-+
-+int ef_vi_transmit_unbundle(ef_vi* vi, const ef_event* __ev,
-+                          ef_request_id* ids)
-+{
-+      ef_request_id* ids_in = ids;
-+      ef_vi_txq* q = &vi->vi_txq;
-+      ef_vi_txq_state* qs = &vi->ep_state->txq;
-+      const ef_vi_qword* ev = EF_GET_HW_EV_PTR(*__ev);
-+      unsigned i, stop = (ev->u32[0] + 1) & q->mask;
-+
-+      ef_assert(EF_EVENT_TYPE(*__ev) == EF_EVENT_TYPE_TX ||
-+                EF_EVENT_TYPE(*__ev) == EF_EVENT_TYPE_TX_ERROR);
-+
-+      /* Shouldn't be batching more than 64 descriptors, and should not go
-+      ** backwards. */
-+      ef_assert_le((((ev->u32[0] + 1) - qs->removed) & q->mask), 64);
-+      /* Should not complete more than we've posted. */
-+      ef_assert_le((((ev->u32[0] + 1) - qs->removed) & q->mask),
-+                   qs->added - qs->removed);
-+
-+      for( i = qs->removed & q->mask; i != stop; i = ++qs->removed & q->mask )
-+              if( q->ids[i] != 0xffff ) {
-+                      *ids++ = q->ids[i];
-+                      q->ids[i] = 0xffff;
-+              }
-+
-+      ef_assert_le(ids - ids_in, EF_VI_TRANSMIT_BATCH);
-+
-+      return (int) (ids - ids_in);
-+}
-+
-+/*! \cidoxg_end */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/sysdep.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/sysdep.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,184 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  stg
-+ *  \brief  System dependent support for ef vi lib
-+ *   \date  2007/05/10
-+ */
-+
-+/*! \cidoxg_include_ci_ul */
-+#ifndef __CI_CIUL_SYSDEP_LINUX_H__
-+#define __CI_CIUL_SYSDEP_LINUX_H__
-+
-+/**********************************************************************
-+ * Kernel version compatability
-+ */
-+
-+#if defined(__GNUC__)
-+
-+/* Linux kernel doesn't have stdint.h or [u]intptr_t. */
-+# if !defined(LINUX_VERSION_CODE)
-+#  include <linux/version.h>
-+# endif
-+# include <asm/io.h>
-+
-+/* In Linux 2.6.24, linux/types.h has uintptr_t */
-+# if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
-+#  if BITS_PER_LONG == 32
-+   typedef __u32         uintptr_t;
-+#  else
-+   typedef __u64         uintptr_t;
-+#  endif
-+# endif
-+
-+/* But even 2.6.24 doesn't define intptr_t */
-+# if BITS_PER_LONG == 32
-+   typedef __s32         intptr_t;
-+# else
-+   typedef __s64         intptr_t;
-+# endif
-+
-+# if defined(__ia64__)
-+#  define EF_VI_PRIx64  "lx"
-+# else
-+#  define EF_VI_PRIx64  "llx"
-+# endif
-+
-+# define EF_VI_HF __attribute__((visibility("hidden")))
-+# define EF_VI_HV __attribute__((visibility("hidden")))
-+
-+# if defined(__i386__) || defined(__x86_64__)  /* GCC x86/x64 */
-+   typedef unsigned long long ef_vi_dma_addr_t; 
-+#  if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-+#   define ef_vi_wiob()  __asm__ __volatile__ ("sfence")
-+#  else
-+#   define ef_vi_wiob()  __asm__ __volatile__ (".byte 0x0F, 0xAE, 0xF8")
-+#  endif
-+
-+# endif
-+#endif
-+
-+#ifdef EFX_NOT_UPSTREAM
-+
-+/* Stuff for architectures/compilers not officially supported */
-+
-+#if !defined(__GNUC__)
-+# if defined(__PPC__)  /* GCC, PPC */
-+   typedef unsigned long     ef_vi_dma_addr_t;
-+#  define ef_vi_wiob()  wmb()
-+
-+#  ifdef __powerpc64__
-+#   ifdef CONFIG_SMP
-+#    define CI_SMP_SYNC        "\n   eieio     \n"         /* memory cache sync */
-+#    define CI_SMP_ISYNC       "\n   isync     \n"         /* instr cache sync */
-+#   else
-+#    define CI_SMP_SYNC
-+#    define CI_SMP_ISYNC
-+#   endif
-+#  else        /* for ppc32 systems */
-+#   ifdef CONFIG_SMP
-+#    define CI_SMP_SYNC        "\n   eieio     \n"
-+#    define CI_SMP_ISYNC       "\n   sync      \n"
-+#   else
-+#    define CI_SMP_SYNC
-+#    define CI_SMP_ISYNC
-+#   endif
-+#  endif
-+
-+# elif defined(__ia64__)  /* GCC, IA64 */
-+   typedef unsigned long     ef_vi_dma_addr_t;
-+#  define ef_vi_wiob()  __asm__ __volatile__("mf.a": : :"memory")
-+
-+# else
-+#  error Unknown processor - GNU C
-+# endif
-+
-+#elif defined(__PGI)
-+# error PGI not supported 
-+
-+#elif defined(__INTEL_COMPILER)
-+
-+/* Intel compilers v7 claim to be very gcc compatible. */
-+# if __INTEL_COMPILER >= 700
-+#  if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ > 91)
-+#   define EF_VI_LIKELY(t)    __builtin_expect((t), 1)
-+#   define EF_VI_UNLIKELY(t)  __builtin_expect((t), 0)
-+#  endif
-+
-+#  if __GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
-+#   define ef_vi_wiob()  __asm__ __volatile__ ("sfence")
-+#  else
-+#   define ef_vi_wiob()  __asm__ __volatile__ (".byte 0x0F, 0xAE, 0xF8")
-+#  endif
-+
-+# else
-+#  error Old Intel compiler not supported.
-+# endif
-+
-+#else
-+# error Unknown compiler.
-+#endif
-+
-+#endif
-+
-+
-+# include <linux/errno.h>
-+
-+
-+/**********************************************************************
-+ * Extracting bit fields.
-+ */
-+
-+#define _QWORD_GET_LOW(f, v)                                    \
-+  (((v).u32[0] >> (f##_LBN)) & ((1u << f##_WIDTH) - 1u))
-+#define _QWORD_GET_HIGH(f, v)                                           \
-+  (((v).u32[1] >> (f##_LBN - 32u)) & ((1u << f##_WIDTH) - 1u))
-+#define _QWORD_GET_ANY(f, v)                                            \
-+  (((v).u64[0] >> f##_LBN) & (((uint64_t) 1u << f##_WIDTH) - 1u))
-+
-+#define QWORD_GET(f, v)                                                     \
-+  ((f##_LBN + f##_WIDTH) <= 32u                                             \
-+   ? _QWORD_GET_LOW(f, (v))                                                 \
-+   : ((f##_LBN >= 32u) ? _QWORD_GET_HIGH(f, (v)) : _QWORD_GET_ANY(f, (v))))
-+
-+#define QWORD_GET_U(f, v)  ((unsigned) QWORD_GET(f, (v)))
-+
-+#define _QWORD_TEST_BIT_LOW(f, v)   ((v).u32[0] & (1u << (f##_LBN)))
-+#define _QWORD_TEST_BIT_HIGH(f, v)  ((v).u32[1] & (1u << (f##_LBN - 32u)))
-+
-+#define QWORD_TEST_BIT(f, v)                                                  \
-+  (f##_LBN < 32 ? _QWORD_TEST_BIT_LOW(f, (v)) : _QWORD_TEST_BIT_HIGH(f, (v)))
-+
-+
-+
-+
-+#ifndef DECLSPEC_NORETURN
-+/* normally defined on Windows to expand to a declaration that the
-+   function will not return */
-+# define DECLSPEC_NORETURN
-+#endif
-+
-+#endif  /* __CI_CIUL_SYSDEP_LINUX_H__ */
-Index: head-2008-11-25/drivers/xen/sfc_netfront/vi_init.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netfront/vi_init.c 2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,183 @@
-+/****************************************************************************
-+ * Copyright 2002-2005: Level 5 Networks Inc.
-+ * Copyright 2005-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications
-+ *  <linux-xen-drivers@solarflare.com>
-+ *  <onload-dev@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * \author  djr
-+ *  \brief  Initialisation of VIs.
-+ *   \date  2007/06/08
-+ */
-+
-+#include "ef_vi_internal.h"
-+
-+#define EF_VI_STATE_BYTES(rxq_sz, txq_sz)                     \
-+      (sizeof(ef_vi_state) + (rxq_sz) * sizeof(uint16_t)      \
-+       + (txq_sz) * sizeof(uint16_t))
-+
-+int ef_vi_calc_state_bytes(int rxq_sz, int txq_sz)
-+{
-+      ef_assert(rxq_sz == 0 || EF_VI_IS_POW2(rxq_sz));
-+      ef_assert(txq_sz == 0 || EF_VI_IS_POW2(txq_sz));
-+
-+      return EF_VI_STATE_BYTES(rxq_sz, txq_sz);
-+}
-+
-+
-+int ef_vi_state_bytes(ef_vi* vi)
-+{
-+      int rxq_sz = 0, txq_sz = 0;
-+      if( ef_vi_receive_capacity(vi) )
-+              rxq_sz = ef_vi_receive_capacity(vi) + 1;
-+      if( ef_vi_transmit_capacity(vi) )
-+              txq_sz = ef_vi_transmit_capacity(vi) + 1;
-+
-+      ef_assert(rxq_sz == 0 || EF_VI_IS_POW2(rxq_sz));
-+      ef_assert(txq_sz == 0 || EF_VI_IS_POW2(txq_sz));
-+
-+      return EF_VI_STATE_BYTES(rxq_sz, txq_sz);
-+}
-+
-+
-+void ef_eventq_state_init(ef_vi* evq)
-+{
-+      int j;
-+
-+      for (j = 0; j<EFAB_DMAQS_PER_EVQ_MAX; j++) {
-+              ef_rx_dup_state_t *rx_dup_state =
-+                      &evq->evq_state->rx_dup_state[j];
-+              rx_dup_state->bad_sop = 0;
-+              rx_dup_state->rx_last_desc_ptr = -1;
-+              rx_dup_state->frag_num = 0;
-+      }
-+
-+      evq->evq_state->evq_ptr = 0;
-+}
-+
-+
-+void ef_vi_state_init(ef_vi* vi)
-+{
-+      ef_vi_state* state = vi->ep_state;
-+      unsigned i;
-+
-+      state->txq.added = state->txq.removed = 0;
-+      state->rxq.added = state->rxq.removed = 0;
-+
-+      if( vi->vi_rxq.mask )
-+              for( i = 0; i <= vi->vi_rxq.mask; ++i )
-+                      vi->vi_rxq.ids[i] = (uint16_t) -1;
-+      if( vi->vi_txq.mask )
-+              for( i = 0; i <= vi->vi_txq.mask; ++i )
-+                      vi->vi_txq.ids[i] = (uint16_t) -1;
-+}
-+
-+
-+void ef_vi_init_mapping_evq(void* data_area, struct ef_vi_nic_type nic_type,
-+                            int instance, unsigned evq_bytes, void* base,
-+                            void* timer_reg)
-+{
-+      struct vi_mappings* vm = (struct vi_mappings*) data_area;
-+
-+      vm->signature = VI_MAPPING_SIGNATURE;
-+      vm->vi_instance = instance;
-+      vm->nic_type = nic_type;
-+      vm->evq_bytes = evq_bytes;
-+      vm->evq_base = base;
-+      vm->evq_timer_reg = timer_reg;
-+}
-+
-+
-+void ef_vi_init(ef_vi* vi, void* vvis, ef_vi_state* state,
-+                ef_eventq_state* evq_state, enum ef_vi_flags vi_flags)
-+{
-+      struct vi_mappings* vm = (struct vi_mappings*) vvis;
-+
-+      vi->vi_i = vm->vi_instance;
-+      vi->ep_state = state;
-+      vi->vi_flags = vi_flags;
-+
-+      switch( vm->nic_type.arch ) {
-+      case EF_VI_ARCH_FALCON:
-+              falcon_vi_init(vi, vvis);
-+              break;
-+      default:
-+              /* ?? TODO: We should return an error code. */
-+              ef_assert(0);
-+              break;
-+      }
-+
-+      if( vm->evq_bytes ) {
-+              vi->evq_state = evq_state;
-+              vi->evq_mask = vm->evq_bytes - 1u;
-+              vi->evq_base = vm->evq_base;
-+              vi->evq_timer_reg = vm->evq_timer_reg;
-+      }
-+
-+      EF_VI_MAGIC_SET(vi, EF_VI);
-+}
-+
-+
-+/* Initialise [data_area] with information required to initialise an ef_vi.
-+ * In the following, an unused param should be set to NULL. Note the case
-+ * marked (*) of [iobuf_mmap] for falcon/driver; for the normal driver this
-+ * must be NULL.
-+ *
-+ * \param  data_area     [in,out] required, must ref at least VI_MAPPING_SIZE 
-+ *                                bytes
-+ * \param  io_mmap       [in] ef1,    required
-+ *                            falcon, required
-+ * \param  iobuf_mmap    [in] ef1,    unused
-+ *                            falcon, required
-+ */
-+void ef_vi_init_mapping_vi(void* data_area, struct ef_vi_nic_type nic_type,
-+                           unsigned rxq_capacity, unsigned txq_capacity,
-+                           int instance, void* io_mmap,
-+                           void* iobuf_mmap_rx, void* iobuf_mmap_tx,
-+                           enum ef_vi_flags vi_flags)
-+{
-+      struct vi_mappings* vm = (struct vi_mappings*) data_area;
-+      int rx_desc_bytes, rxq_bytes;
-+
-+      ef_assert(rxq_capacity > 0 || txq_capacity > 0);
-+      ef_assert(vm);
-+      ef_assert(io_mmap);
-+      ef_assert(iobuf_mmap_rx || iobuf_mmap_tx);
-+
-+      vm->signature = VI_MAPPING_SIGNATURE;
-+      vm->vi_instance = instance;
-+      vm->nic_type = nic_type;
-+
-+      rx_desc_bytes = (vi_flags & EF_VI_RX_PHYS_ADDR) ? 8 : 4;
-+      rxq_bytes = rxq_capacity * rx_desc_bytes;
-+      rxq_bytes = (rxq_bytes + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1);
-+
-+      if( iobuf_mmap_rx == iobuf_mmap_tx )
-+              iobuf_mmap_tx = (char*) iobuf_mmap_rx + rxq_bytes;
-+
-+      vm->rx_queue_capacity = rxq_capacity;
-+      vm->rx_dma_falcon = iobuf_mmap_rx;
-+      vm->rx_bell       = (char*) io_mmap + (RX_DESC_UPD_REG_KER_OFST & 4095);
-+      vm->tx_queue_capacity = txq_capacity;
-+      vm->tx_dma_falcon = iobuf_mmap_tx;
-+      vm->tx_bell       = (char*) io_mmap + (TX_DESC_UPD_REG_KER_OFST & 4095);
-+}
-Index: head-2008-11-25/drivers/xen/sfc_netutil/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/Makefile   2008-02-26 10:54:12.000000000 +0100
-@@ -0,0 +1,11 @@
-+EXTRA_CFLAGS += -Idrivers/xen/sfc_netutil
-+EXTRA_CFLAGS += -Werror
-+
-+ifdef GGOV
-+EXTRA_CFLAGS += -fprofile-arcs -ftest-coverage -DEFX_GCOV
-+endif
-+
-+obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_UTIL) := sfc_netutil.o
-+
-+sfc_netutil-objs := accel_cuckoo_hash.o accel_msg_iface.o accel_util.o 
-+
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_cuckoo_hash.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_cuckoo_hash.c        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,651 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/types.h> /* needed for linux/random.h */
-+#include <linux/random.h>
-+
-+#include "accel_cuckoo_hash.h"
-+#include "accel_util.h"
-+
-+static inline int cuckoo_hash_key_compare(cuckoo_hash_table *hashtab,
-+                                        cuckoo_hash_key *key1, 
-+                                        cuckoo_hash_key *key2)
-+{
-+      return !memcmp(key1, key2, hashtab->key_length);
-+}
-+
-+
-+static inline void cuckoo_hash_key_set(cuckoo_hash_key *key1, 
-+                                     cuckoo_hash_key *key2)
-+{
-+      *key1 = *key2;
-+}
-+
-+
-+/*
-+ * Sets hash function parameters.  Chooses "a" to be odd, 0 < a < 2^w
-+ * where w is the length of the key
-+ */
-+static void set_hash_parameters(cuckoo_hash_table *hashtab)
-+{
-+ again:
-+      hashtab->a0 = hashtab->a1 = 0;
-+
-+      /* Make sure random */
-+      get_random_bytes(&hashtab->a0, hashtab->key_length);
-+      get_random_bytes(&hashtab->a1, hashtab->key_length);
-+
-+      /* Make sure odd */
-+      hashtab->a0 |= 1;
-+      hashtab->a1 |= 1;
-+
-+      /* Being different is good */
-+      if (hashtab->a0 != hashtab->a1)
-+              return;
-+                     
-+      goto again;
-+}
-+
-+int cuckoo_hash_init(cuckoo_hash_table *hashtab, unsigned length_bits,
-+                   unsigned key_length)
-+{
-+      char *table_mem;
-+      unsigned length = 1 << length_bits;
-+
-+      BUG_ON(length_bits >= sizeof(unsigned) * 8);
-+      BUG_ON(key_length > sizeof(cuckoo_hash_key));
-+
-+      table_mem = kmalloc(sizeof(cuckoo_hash_entry) * 2 * length, GFP_KERNEL);
-+
-+      if (table_mem == NULL)
-+              return -ENOMEM;
-+
-+      hashtab->length = length;
-+      hashtab->length_bits = length_bits;
-+      hashtab->key_length = key_length;
-+      hashtab->entries = 0;
-+
-+      hashtab->table0 = (cuckoo_hash_entry *)table_mem;
-+      hashtab->table1 = (cuckoo_hash_entry *)
-+              (table_mem + length * sizeof(cuckoo_hash_entry));
-+
-+      set_hash_parameters(hashtab);
-+
-+      /* Zero the table */
-+      memset(hashtab->table0, 0, length * 2 * sizeof(cuckoo_hash_entry));
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_init);
-+
-+void cuckoo_hash_destroy(cuckoo_hash_table *hashtab)
-+{
-+      if (hashtab->table0 != NULL)
-+              kfree(hashtab->table0);
-+}
-+
-+EXPORT_SYMBOL_GPL(cuckoo_hash_destroy);
-+
-+/* 
-+ * This computes sizeof(cuckoo_hash) bits of hash, not all will be
-+ * necessarily used, but the hash function throws away any that
-+ * aren't
-+ */ 
-+static inline void cuckoo_compute_hash_helper(cuckoo_hash_table *hashtab,
-+                                            cuckoo_hash_key *a,
-+                                            cuckoo_hash_key *x,
-+                                            cuckoo_hash *result) 
-+{
-+      u64 multiply_result = 0, a_temp, x_temp;
-+      u32 carry = 0;
-+      u32 *a_words;
-+      u32 *x_words;
-+      int i;
-+
-+      /*
-+       * As the mod and div operations in the function effectively
-+       * reduce and shift the bits of the product down to just the
-+       * third word, we need only compute that and return it as a
-+       * result.
-+       *
-+       * Do enough long multiplication to get the word we need
-+       */
-+
-+      /* This assumes things about the sizes of the key and hash */
-+      BUG_ON(hashtab->key_length % sizeof(u32) != 0);
-+      BUG_ON(sizeof(cuckoo_hash) != sizeof(u32));
-+
-+      a_words = (u32 *)a;
-+      x_words = (u32 *)x;
-+
-+      for (i = 0; i < hashtab->key_length / sizeof(u32); i++) {
-+              a_temp = a_words[i];
-+              x_temp = x_words[i];
-+              
-+              multiply_result = (a_temp * x_temp) + carry;
-+              carry = (multiply_result >> 32) & 0xffffffff;
-+      }
-+      
-+      *result = multiply_result & 0xffffffff;
-+}
-+
-+
-+/*
-+ * Want to implement (ax mod 2^w) div 2^(w-q) for odd a, 0 < a < 2^w;
-+ * w is the length of the key, q is the length of the hash, I think.
-+ * See http://www.it-c.dk/people/pagh/papers/cuckoo-jour.pdf 
-+ */
-+static cuckoo_hash cuckoo_compute_hash(cuckoo_hash_table *hashtab, 
-+                                     cuckoo_hash_key *key, 
-+                                     cuckoo_hash_key *a)
-+{
-+      unsigned q = hashtab->length_bits;
-+      unsigned shift = 32 - q;
-+      unsigned mask = ((1 << q) - 1) << shift;
-+      cuckoo_hash hash;
-+
-+      cuckoo_compute_hash_helper(hashtab, a, key, &hash);
-+
-+      /* 
-+       * Take the top few bits to get the right length for this
-+       * hash table 
-+       */
-+      hash = (hash & mask) >> shift;
-+
-+      BUG_ON(hash >= hashtab->length);
-+
-+      return hash;
-+}
-+
-+
-+static int cuckoo_hash_lookup0(cuckoo_hash_table *hashtab,
-+                             cuckoo_hash_key *key,
-+                             cuckoo_hash_value *value)
-+{
-+      cuckoo_hash hash = cuckoo_compute_hash(hashtab, key, &hashtab->a0);
-+
-+      if ((hashtab->table0[hash].state == CUCKOO_HASH_STATE_OCCUPIED)
-+          && cuckoo_hash_key_compare(hashtab, &(hashtab->table0[hash].key),
-+                                     key)) {
-+              *value = hashtab->table0[hash].value;
-+              return 1;
-+      }
-+
-+      return 0;
-+}
-+
-+static int cuckoo_hash_lookup1(cuckoo_hash_table *hashtab,
-+                             cuckoo_hash_key *key,
-+                             cuckoo_hash_value *value)
-+{
-+      cuckoo_hash hash = cuckoo_compute_hash(hashtab, key, &hashtab->a1);
-+
-+      if ((hashtab->table1[hash].state == CUCKOO_HASH_STATE_OCCUPIED)
-+          && cuckoo_hash_key_compare(hashtab, &(hashtab->table1[hash].key),
-+                                     key)) {
-+              *value = hashtab->table1[hash].value;
-+              return 1;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+int cuckoo_hash_lookup(cuckoo_hash_table *hashtab, cuckoo_hash_key *key,
-+                     cuckoo_hash_value *value)
-+{
-+      return cuckoo_hash_lookup0(hashtab, key, value)
-+              || cuckoo_hash_lookup1(hashtab, key, value);
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_lookup);
-+
-+
-+/* Transfer any active entries from "old_table" into hashtab */
-+static int cuckoo_hash_transfer_entries(cuckoo_hash_table *hashtab,
-+                                      cuckoo_hash_entry *old_table,
-+                                      unsigned capacity)
-+{
-+      int i, rc;
-+      cuckoo_hash_entry *entry;
-+
-+      hashtab->entries = 0;
-+
-+      for (i = 0; i < capacity; i++) {
-+              entry = &old_table[i];
-+              if (entry->state == CUCKOO_HASH_STATE_OCCUPIED) {
-+                      rc = cuckoo_hash_add(hashtab, &(entry->key), 
-+                                           entry->value, 0);
-+                      if (rc != 0) {
-+                              return rc;
-+                      }
-+              }
-+      }
-+  
-+      return 0;
-+}
-+
-+
-+int cuckoo_hash_rehash(cuckoo_hash_table *hashtab)
-+{
-+      cuckoo_hash_entry *new_table;
-+      cuckoo_hash_table old_hashtab;
-+      int resize = 0, rc, rehash_count;
-+
-+      /*
-+       * Store old tables so we can access the existing values and
-+       * copy across
-+       */
-+      memcpy(&old_hashtab, hashtab, sizeof(cuckoo_hash_table));
-+
-+      /* resize if hashtable is more than half full */
-+      if (old_hashtab.entries > old_hashtab.length &&
-+          old_hashtab.length_bits < 32)
-+              resize = 1;
-+
-+ resize:
-+      if (resize) {
-+              new_table = kmalloc(sizeof(cuckoo_hash_entry) * 4 * hashtab->length,
-+                                  GFP_ATOMIC);
-+              if (new_table == NULL) {
-+                      rc = -ENOMEM;
-+                      goto err;
-+              }
-+
-+              hashtab->length = 2 * hashtab->length;
-+              hashtab->length_bits++;
-+      } else {
-+              new_table = kmalloc(sizeof(cuckoo_hash_entry) * 2 * hashtab->length,
-+                                  GFP_ATOMIC);
-+              if (new_table == NULL) {
-+                      rc = -ENOMEM;
-+                      goto err;
-+              }
-+      }
-+    
-+      /*
-+       * Point hashtab to new memory region so we can try to
-+       * construct new table
-+       */
-+      hashtab->table0 = new_table;
-+      hashtab->table1 = (cuckoo_hash_entry *)
-+              ((char *)new_table + hashtab->length * sizeof(cuckoo_hash_entry));
-+  
-+      rehash_count = 0;
-+
-+ again:
-+      /* Zero the new tables */
-+      memset(new_table, 0, hashtab->length * 2 * sizeof(cuckoo_hash_entry));
-+
-+      /* Choose new parameters for the hash functions */
-+      set_hash_parameters(hashtab);
-+
-+      /*
-+       * Multiply old_table_length by 2 as the length refers to each
-+       * table, and there are two of them.  This assumes that they
-+       * are arranged sequentially in memory, so assert it 
-+       */
-+      BUG_ON(((char *)old_hashtab.table1) != 
-+             ((char *)old_hashtab.table0 + old_hashtab.length
-+              * sizeof(cuckoo_hash_entry)));
-+      rc = cuckoo_hash_transfer_entries(hashtab, old_hashtab.table0, 
-+                                        old_hashtab.length * 2);
-+      if (rc < 0) {
-+              /* Problem */
-+              if (rc == -ENOSPC) {
-+                      ++rehash_count;
-+                      if (rehash_count < CUCKOO_HASH_MAX_LOOP) {
-+                              /*
-+                               * Wanted to rehash, but rather than
-+                               * recurse we can just do it here
-+                               */
-+                              goto again;
-+                      } else {
-+                              /*
-+                               * Didn't manage to rehash, so let's
-+                               * go up a size (if we haven't already
-+                               * and there's space)
-+                               */
-+                              if (!resize && hashtab->length_bits < 32) {
-+                                      resize = 1;
-+                                      kfree(new_table);
-+                                      goto resize;
-+                              }
-+                              else
-+                                      goto err;
-+                      }
-+              }
-+              else
-+                      goto err;
-+      }
-+
-+      /* Success, I think.  Free up the old table */
-+      kfree(old_hashtab.table0);
-+  
-+      /* We should have put all the entries from old table in the new one */
-+      BUG_ON(hashtab->entries != old_hashtab.entries);
-+
-+      return 0;
-+ err:
-+      EPRINTK("%s: Rehash failed, giving up\n", __FUNCTION__);
-+      /* Some other error, give up, at least restore table to how it was */
-+      memcpy(hashtab, &old_hashtab, sizeof(cuckoo_hash_table));
-+      if (new_table)
-+              kfree(new_table);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_rehash);
-+
-+
-+static int 
-+cuckoo_hash_insert_or_displace(cuckoo_hash_entry *table, unsigned hash,
-+                             cuckoo_hash_key *key, 
-+                             cuckoo_hash_value value,
-+                             cuckoo_hash_key *displaced_key, 
-+                             cuckoo_hash_value *displaced_value)
-+{
-+      if (table[hash].state == CUCKOO_HASH_STATE_VACANT) {
-+              cuckoo_hash_key_set(&(table[hash].key), key);
-+              table[hash].value = value;
-+              table[hash].state = CUCKOO_HASH_STATE_OCCUPIED;
-+
-+              return 1;
-+      } else {
-+              cuckoo_hash_key_set(displaced_key, &(table[hash].key));
-+              *displaced_value = table[hash].value;
-+              cuckoo_hash_key_set(&(table[hash].key), key);
-+              table[hash].value = value;
-+
-+              return 0;
-+      }
-+}
-+
-+
-+int cuckoo_hash_add(cuckoo_hash_table *hashtab, cuckoo_hash_key *key,
-+                   cuckoo_hash_value value, int can_rehash)
-+{
-+      cuckoo_hash hash0, hash1;
-+      int i, rc;
-+      cuckoo_hash_key key1, key2;
-+
-+      cuckoo_hash_key_set(&key1, key);
-+
-+ again:
-+      i = 0;
-+      do {
-+              hash0 = cuckoo_compute_hash(hashtab, &key1, &hashtab->a0);
-+              if (cuckoo_hash_insert_or_displace(hashtab->table0, hash0, 
-+                                                 &key1, value, &key2,
-+                                                 &value)) {
-+                      /* Success */
-+                      hashtab->entries++;
-+                      return 0;
-+              }
-+      
-+              hash1 = cuckoo_compute_hash(hashtab, &key2, &hashtab->a1);
-+              if (cuckoo_hash_insert_or_displace(hashtab->table1, hash1,
-+                                                 &key2, value, &key1,
-+                                                 &value)) {
-+                      /* Success */
-+                      hashtab->entries++;
-+                      return 0;
-+              }
-+      } while (++i < CUCKOO_HASH_MAX_LOOP);
-+
-+      if (can_rehash) {
-+              if ((rc = cuckoo_hash_rehash(hashtab)) < 0) {
-+                      /*
-+                       * Give up - this will drop whichever
-+                       * key/value pair we have currently displaced
-+                       * on the floor
-+                       */
-+                      return rc;
-+              }
-+              goto again;
-+      }
-+  
-+      EPRINTK("%s: failed hash add\n", __FUNCTION__);
-+      /*
-+       * Couldn't do it - bad as we've now removed some random thing
-+       * from the table, and will just drop it on the floor.  Better
-+       * would be to somehow revert the table to the state it was in
-+       * at the start
-+       */
-+      return -ENOSPC;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_add);
-+
-+
-+int cuckoo_hash_add_check(cuckoo_hash_table *hashtab,
-+                        cuckoo_hash_key *key, cuckoo_hash_value value,
-+                        int can_rehash)
-+{
-+      int stored_value;
-+
-+      if (cuckoo_hash_lookup(hashtab, key, &stored_value))
-+              return -EBUSY;
-+
-+      return cuckoo_hash_add(hashtab, key, value, can_rehash);
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_add_check);
-+
-+
-+int cuckoo_hash_remove(cuckoo_hash_table *hashtab, cuckoo_hash_key *key)
-+{
-+      cuckoo_hash hash;
-+
-+      hash = cuckoo_compute_hash(hashtab, key, &hashtab->a0);
-+      if ((hashtab->table0[hash].state == CUCKOO_HASH_STATE_OCCUPIED) &&
-+          cuckoo_hash_key_compare(hashtab, &(hashtab->table0[hash].key),
-+                                  key)) {
-+              hashtab->table0[hash].state = CUCKOO_HASH_STATE_VACANT;
-+              hashtab->entries--;
-+              return 0;
-+      }
-+  
-+      hash = cuckoo_compute_hash(hashtab, key, &hashtab->a1);
-+      if ((hashtab->table1[hash].state == CUCKOO_HASH_STATE_OCCUPIED) &&
-+          cuckoo_hash_key_compare(hashtab, &(hashtab->table1[hash].key),
-+                                  key)) {
-+              hashtab->table1[hash].state = CUCKOO_HASH_STATE_VACANT;
-+              hashtab->entries--;
-+              return 0;
-+      }
-+ 
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_remove);
-+
-+
-+int cuckoo_hash_update(cuckoo_hash_table *hashtab, cuckoo_hash_key *key,
-+                     cuckoo_hash_value value)
-+{
-+      cuckoo_hash hash;
-+
-+      hash = cuckoo_compute_hash(hashtab, key, &hashtab->a0);
-+      if ((hashtab->table0[hash].state == CUCKOO_HASH_STATE_OCCUPIED) &&
-+          cuckoo_hash_key_compare(hashtab, &(hashtab->table0[hash].key),
-+                                  key)) {
-+              hashtab->table0[hash].value = value;
-+              return 0;
-+      }
-+
-+      hash = cuckoo_compute_hash(hashtab, key, &hashtab->a1);
-+      if ((hashtab->table1[hash].state == CUCKOO_HASH_STATE_OCCUPIED) &&
-+          cuckoo_hash_key_compare(hashtab, &(hashtab->table1[hash].key),
-+                                  key)) {
-+              hashtab->table1[hash].value = value;
-+              return 0;
-+      }
-+
-+      return -EINVAL;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_update);
-+
-+
-+void cuckoo_hash_iterate_reset(cuckoo_hash_table *hashtab)
-+{
-+      hashtab->iterate_index = 0;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_iterate_reset);
-+
-+
-+int cuckoo_hash_iterate(cuckoo_hash_table *hashtab,
-+                      cuckoo_hash_key *key, cuckoo_hash_value *value)
-+{
-+      unsigned index;
-+
-+      while (hashtab->iterate_index < hashtab->length) {
-+              index = hashtab->iterate_index;
-+              ++hashtab->iterate_index;
-+              if (hashtab->table0[index].state == CUCKOO_HASH_STATE_OCCUPIED) {
-+                      *key = hashtab->table0[index].key;
-+                      *value = hashtab->table0[index].value;
-+                      return 0;
-+              }
-+      }
-+
-+      while (hashtab->iterate_index >= hashtab->length &&
-+             hashtab->iterate_index < hashtab->length * 2) {
-+              index = hashtab->iterate_index - hashtab->length;
-+              ++hashtab->iterate_index;               
-+              if (hashtab->table1[index].state == CUCKOO_HASH_STATE_OCCUPIED) {
-+                      *key = hashtab->table1[index].key;
-+                      *value = hashtab->table1[index].value;
-+                      return 0;
-+              }
-+      }
-+
-+      return -ENOSPC;
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_iterate);
-+
-+
-+#if 0
-+void cuckoo_hash_valid(cuckoo_hash_table *hashtab)
-+{
-+      int i, entry_count = 0;
-+
-+      for (i=0; i < hashtab->length; i++) {
-+              EPRINTK_ON(hashtab->table0[i].state != CUCKOO_HASH_STATE_VACANT &&
-+                         hashtab->table0[i].state != CUCKOO_HASH_STATE_OCCUPIED);
-+              if (hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      entry_count++;
-+              EPRINTK_ON(hashtab->table1[i].state != CUCKOO_HASH_STATE_VACANT &&
-+                         hashtab->table1[i].state != CUCKOO_HASH_STATE_OCCUPIED);
-+              if (hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      entry_count++;  
-+      }
-+      
-+      if (entry_count != hashtab->entries) {
-+              EPRINTK("%s: bad count\n", __FUNCTION__);
-+              cuckoo_hash_dump(hashtab);
-+              return;
-+      }
-+
-+      for (i=0; i< hashtab->length; i++) {
-+              if (hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      if (i != cuckoo_compute_hash(hashtab, 
-+                                                   &hashtab->table0[i].key, 
-+                                                   &hashtab->a0)) {
-+                              EPRINTK("%s: Bad key table 0 index %d\n",
-+                                      __FUNCTION__, i);
-+                              cuckoo_hash_dump(hashtab);
-+                              return;
-+                      }
-+              if (hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      if (i != cuckoo_compute_hash(hashtab, 
-+                                                   &hashtab->table1[i].key, 
-+                                                   &hashtab->a1)) {
-+                              EPRINTK("%s: Bad key table 1 index %d\n",
-+                                      __FUNCTION__, i);
-+                              cuckoo_hash_dump(hashtab);
-+                              return;
-+                      }
-+      }
-+
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_valid);
-+
-+
-+void cuckoo_hash_dump(cuckoo_hash_table *hashtab)
-+{
-+      int i, entry_count;
-+
-+      entry_count = 0;
-+      for (i=0; i < hashtab->length; i++) {
-+              EPRINTK_ON(hashtab->table0[i].state != CUCKOO_HASH_STATE_VACANT &&
-+                         hashtab->table0[i].state != CUCKOO_HASH_STATE_OCCUPIED);
-+              if (hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      entry_count++;
-+              EPRINTK_ON(hashtab->table1[i].state != CUCKOO_HASH_STATE_VACANT &&
-+                         hashtab->table1[i].state != CUCKOO_HASH_STATE_OCCUPIED);
-+              if (hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+                      entry_count++;  
-+      }
-+
-+      EPRINTK("======================\n");
-+      EPRINTK("Cuckoo hash table dump\n");
-+      EPRINTK("======================\n");
-+      EPRINTK("length: %d; length_bits: %d; key_length: %d\n", hashtab->length,
-+              hashtab->length_bits, hashtab->key_length);
-+      EPRINTK("Recorded entries: %d\n", hashtab->entries);
-+      EPRINTK("Counted entries: %d\n", entry_count);
-+      EPRINTK("a0: %llx; a1: %llx\n", hashtab->a0, hashtab->a1);
-+      EPRINTK("-----------------------------------------\n");
-+      EPRINTK("Index  Occupied  Key  Value Index0 Index1\n");
-+      EPRINTK("-----------------------------------------\n");         
-+      for (i=0; i< hashtab->length; i++) {
-+              if (hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+              EPRINTK("%d %d %llx %d %d %d\n", i,
-+                      hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED,
-+                      hashtab->table0[i].key, hashtab->table0[i].value,
-+                      cuckoo_compute_hash(hashtab, &hashtab->table0[i].key, 
-+                                          &hashtab->a0),
-+                      cuckoo_compute_hash(hashtab, &hashtab->table0[i].key, 
-+                                          &hashtab->a1));
-+              else
-+              EPRINTK("%d %d - - - -\n", i,
-+                      hashtab->table0[i].state == CUCKOO_HASH_STATE_OCCUPIED);
-+                      
-+      }
-+      EPRINTK("-----------------------------------------\n");
-+      EPRINTK("Index  Occupied  Key  Value Index0 Index1\n");
-+      EPRINTK("-----------------------------------------\n");
-+      for (i=0; i< hashtab->length; i++) {
-+              if (hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED)
-+              EPRINTK("%d %d %llx %d %d %d\n", i,
-+                      hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED,
-+                      hashtab->table1[i].key, hashtab->table1[i].value,
-+                      cuckoo_compute_hash(hashtab, &hashtab->table1[i].key, 
-+                                          &hashtab->a0),
-+                      cuckoo_compute_hash(hashtab, &hashtab->table1[i].key, 
-+                                          &hashtab->a1));
-+              else
-+              EPRINTK("%d %d - - - -\n", i,
-+                      hashtab->table1[i].state == CUCKOO_HASH_STATE_OCCUPIED);
-+      } 
-+      EPRINTK("======================\n");
-+}
-+EXPORT_SYMBOL_GPL(cuckoo_hash_dump);
-+#endif
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_cuckoo_hash.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_cuckoo_hash.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,227 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+/*
-+ * A cuckoo hash table consists of two sub tables.  Each entry can
-+ * hash to a position in each table.  If, on entry, its position is
-+ * found to be occupied, the existing element is moved to it's other
-+ * location.  This recurses until success or a loop is found.  If a
-+ * loop is found the table is rehashed.
-+ *
-+ *  See http://www.it-c.dk/people/pagh/papers/cuckoo-jour.pdf
-+ */
-+
-+#ifndef NET_ACCEL_CUCKOO_HASH_H
-+#define NET_ACCEL_CUCKOO_HASH_H
-+
-+/*! Type used for hash table keys of ip pairs */
-+typedef struct {
-+      u32 local_ip;
-+      //u32 remote_ip;
-+      u16 local_port;
-+      //u16 remote_port;
-+      /* Technically only 1 bit, but use 16 to make key a round
-+         number size */
-+      u16 proto;
-+} cuckoo_hash_ip_key;
-+
-+/*! Type used for hash table keys of mac addresses */
-+typedef u64 cuckoo_hash_mac_key;
-+
-+/*! This type is designed to be large enough to hold all supported key
-+ *  sizes to avoid having to malloc storage for them.
-+ */
-+typedef u64 cuckoo_hash_key;
-+
-+/*! Type used for the values stored in the hash table */
-+typedef int cuckoo_hash_value;
-+
-+/*! Type used for the hash used to index the table */
-+typedef u32 cuckoo_hash;
-+
-+/*! How long to spend displacing values when adding before giving up
-+ *  and rehashing */
-+#define CUCKOO_HASH_MAX_LOOP (hashtab->length)
-+
-+/*! State of hash table entry */
-+typedef enum {
-+      CUCKOO_HASH_STATE_VACANT = 0,
-+      CUCKOO_HASH_STATE_OCCUPIED 
-+} cuckoo_hash_state;
-+
-+/*! An entry in the hash table */
-+typedef struct {
-+      cuckoo_hash_state state;
-+      cuckoo_hash_key key;
-+      cuckoo_hash_value value;
-+} cuckoo_hash_entry;
-+
-+/*! A cuckoo hash table */
-+typedef struct {
-+      /*! The length of each table (NB. there are two tables of this
-+       *  length) */
-+      unsigned length; 
-+      /*! The length of each table in bits */
-+      unsigned length_bits;
-+      /*! The length of the key in bytes */ 
-+      unsigned key_length; 
-+      /*! The number of entries currently stored in the table */
-+      unsigned entries;
-+      /*! Index into table used by cuckoo_hash_iterate */
-+      unsigned iterate_index; 
-+
-+      /* parameter of hash functions */
-+      /*! The "a" parameter of the first hash function */
-+      cuckoo_hash_key a0; 
-+      /*! The "a" parameter of the second hash function */
-+      cuckoo_hash_key a1; 
-+
-+      /*! The first table */
-+      cuckoo_hash_entry *table0; 
-+      /*! The second table */
-+      cuckoo_hash_entry *table1; 
-+} cuckoo_hash_table;
-+
-+/*! Initialise the cuckoo has table 
-+ *
-+ * \param hashtab A pointer to an unitialised hash table structure
-+ * \param length_bits The number of elements in each table equals
-+ * 2**length_bits
-+ * \param key_length The length of the key in bytes
-+ *
-+ * \return 0 on success, -ENOMEM if it couldn't allocate the tables
-+ */
-+extern
-+int cuckoo_hash_init(cuckoo_hash_table *hashtab, unsigned length_bits,
-+                   unsigned key_length);
-+
-+
-+/*! Destroy a hash table
-+ *
-+ * \param hashtab A hash table that has previously been passed to a
-+ * successful call of cuckoo_hash_init()
-+ */
-+extern
-+void cuckoo_hash_destroy(cuckoo_hash_table *hashtab);
-+
-+
-+/*! Lookup an entry in the hash table 
-+ *
-+ * \param hashtab The hash table in which to look.
-+ * \param key Pointer to a mac address to use as the key
-+ * \param value On exit set to the value stored if key was present
-+ *
-+ * \return 0 if not present in the table, non-zero if it is (and value
-+ * is set accordingly)
-+ */
-+extern
-+int cuckoo_hash_lookup(cuckoo_hash_table *hashtab,
-+                     cuckoo_hash_key *key,
-+                     cuckoo_hash_value *value);
-+
-+/*! Add an entry to the hash table.  Key must not be a duplicate of
-+ * anything already in the table.  If this is a risk, see
-+ * cuckoo_hash_add_check
-+ *
-+ * \param hashtab The hash table to add the entry to
-+ * \param key Pointer to a mac address to use as a key
-+ * \param value The value to store 
-+ * \param can_rehash Flag to allow the add function to rehash the
-+ * table if necessary
-+ *
-+ * \return 0 on success, non-zero on failure.  -ENOSPC means it just
-+ * couldn't find anywhere to put it - this is bad and probably means
-+ * an entry has been dropped on the floor (but the entry you just
-+ * tried to add may now be included)
-+ */
-+extern
-+int cuckoo_hash_add(cuckoo_hash_table *hashtab,
-+                  cuckoo_hash_key *key, 
-+                  cuckoo_hash_value value,
-+                  int can_rehash);
-+
-+/*! Same as cuckoo_hash_add but first checks to ensure entry is not
-+ * already there
-+ * \return -EBUSY if already there
-+ */
-+
-+extern
-+int cuckoo_hash_add_check(cuckoo_hash_table *hashtab,
-+                        cuckoo_hash_key *key, 
-+                        cuckoo_hash_value value,
-+                        int can_rehash);
-+/*! Remove an entry from the table 
-+ *
-+ * \param hashtab The hash table to remove the entry from
-+ * \param key The key that was used to previously add the entry
-+ *
-+ * \return 0 on success, -EINVAL if the entry couldn't be found 
-+ */
-+extern
-+int cuckoo_hash_remove(cuckoo_hash_table *hashtab, cuckoo_hash_key *key);
-+
-+
-+/*! Helper for those using mac addresses to convert to a key for the
-+ *  hash table
-+ */
-+static inline cuckoo_hash_mac_key cuckoo_mac_to_key(const u8 *mac)
-+{
-+      return (cuckoo_hash_mac_key)(mac[0])
-+              | (cuckoo_hash_mac_key)(mac[1]) << 8
-+              | (cuckoo_hash_mac_key)(mac[2]) << 16
-+              | (cuckoo_hash_mac_key)(mac[3]) << 24
-+              | (cuckoo_hash_mac_key)(mac[4]) << 32
-+              | (cuckoo_hash_mac_key)(mac[5]) << 40;
-+}
-+
-+
-+/*! Update an entry already in the hash table to take a new value 
-+ *
-+ * \param hashtab The hash table to add the entry to
-+ * \param key Pointer to a mac address to use as a key
-+ * \param value The value to store 
-+ *
-+ * \return 0 on success, non-zero on failure. 
-+ */
-+int cuckoo_hash_update(cuckoo_hash_table *hashtab, cuckoo_hash_key *key,
-+                     cuckoo_hash_value value);
-+
-+
-+/*! Go through the hash table and return all used entries (one per call)
-+ *
-+ * \param hashtab The hash table to iterate over 
-+ * \param key Pointer to a key to take the returned key
-+ * \param value Pointer to a value to take the returned value
-+ *
-+ * \return 0 on success (key, value set), non-zero on failure.
-+ */
-+int cuckoo_hash_iterate(cuckoo_hash_table *hashtab,
-+                      cuckoo_hash_key *key, cuckoo_hash_value *value);
-+void cuckoo_hash_iterate_reset(cuckoo_hash_table *hashtab);
-+
-+/* debug, not compiled by default */
-+void cuckoo_hash_valid(cuckoo_hash_table *hashtab);
-+void cuckoo_hash_dump(cuckoo_hash_table *hashtab);
-+
-+#endif /* NET_ACCEL_CUCKOO_HASH_H */
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_msg_iface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_msg_iface.c  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,301 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <xen/evtchn.h>
-+
-+#include "accel_util.h"
-+#include "accel_msg_iface.h"
-+
-+#define NET_ACCEL_MSG_Q_SIZE (1024)
-+#define NET_ACCEL_MSG_Q_MASK (NET_ACCEL_MSG_Q_SIZE - 1)
-+
-+#ifdef NDEBUG
-+#define NET_ACCEL_CHECK_MAGIC(_p, _errval)
-+#define NET_ACCEL_SHOW_QUEUE(_t, _q, _id)
-+#else
-+#define NET_ACCEL_CHECK_MAGIC(_p, _errval)                            \
-+      if (_p->magic != NET_ACCEL_MSG_MAGIC) {                         \
-+              printk(KERN_ERR "%s: passed invalid shared page %p!\n", \
-+                     __FUNCTION__, _p);                               \
-+              return _errval;                                         \
-+      }
-+#define NET_ACCEL_SHOW_QUEUE(_t, _q, _id)                             \
-+      printk(_t ": queue %d write %x read %x base %x limit %x\n",     \
-+             _id, _q->write, _q->read, _q->base, _q->limit);
-+#endif
-+
-+/*
-+ * We've been passed at least 2 pages. 1 control page and 1 or more
-+ * data pages.
-+ */
-+int net_accel_msg_init_page(void *mem, int len, int up)
-+{
-+      struct net_accel_shared_page *shared_page = 
-+              (struct net_accel_shared_page*)mem;
-+
-+      if ((unsigned long)shared_page & NET_ACCEL_MSG_Q_MASK)
-+              return -EINVAL;
-+
-+      shared_page->magic = NET_ACCEL_MSG_MAGIC;
-+
-+      shared_page->aflags = 0;
-+
-+      shared_page->net_dev_up = up;
-+
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_init_page);
-+
-+
-+void net_accel_msg_init_queue(sh_msg_fifo2 *queue,
-+                            struct net_accel_msg_queue *indices,
-+                            struct net_accel_msg *base, int size)
-+{
-+      queue->fifo = base;
-+      spin_lock_init(&queue->lock);
-+      sh_fifo2_init(queue, size-1, &indices->read, &indices->write);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_init_queue);
-+
-+
-+static inline int _net_accel_msg_send(struct net_accel_shared_page *sp,
-+                                    sh_msg_fifo2 *queue,
-+                                    struct net_accel_msg *msg,
-+                                    int is_reply)
-+{
-+      int rc = 0;
-+      NET_ACCEL_CHECK_MAGIC(sp, -EINVAL);
-+      rmb();
-+      if (is_reply) {
-+              EPRINTK_ON(sh_fifo2_is_full(queue));
-+              sh_fifo2_put(queue, *msg);
-+      } else {
-+              if (sh_fifo2_not_half_full(queue)) {
-+                      sh_fifo2_put(queue, *msg);
-+              } else {
-+                      rc = -ENOSPC;
-+              }
-+      }
-+      wmb();
-+      return rc;
-+}
-+
-+/* Notify after a batch of messages have been sent */
-+void net_accel_msg_notify(int irq)
-+{
-+      notify_remote_via_irq(irq);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_notify);
-+
-+/* 
-+ * Send a message on the specified FIFO. Returns 0 on success, -errno
-+ * on failure. The message in msg is copied to the current slot of the
-+ * FIFO.
-+ */
-+int net_accel_msg_send(struct net_accel_shared_page *sp, sh_msg_fifo2 *q, 
-+                     struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      int rc;
-+      net_accel_msg_lock_queue(q, &flags);
-+      rc = _net_accel_msg_send(sp, q, msg, 0);
-+      net_accel_msg_unlock_queue(q, &flags);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_send);
-+
-+
-+/* As net_accel_msg_send but also posts a notification to the far end. */
-+int net_accel_msg_send_notify(struct net_accel_shared_page *sp, int irq, 
-+                            sh_msg_fifo2 *q, struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      int rc;
-+      net_accel_msg_lock_queue(q, &flags);
-+      rc = _net_accel_msg_send(sp, q, msg, 0);
-+      net_accel_msg_unlock_queue(q, &flags);
-+      if (rc >= 0)
-+              notify_remote_via_irq(irq);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_send_notify);
-+
-+
-+int net_accel_msg_reply(struct net_accel_shared_page *sp, sh_msg_fifo2 *q, 
-+                     struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      int rc;
-+      net_accel_msg_lock_queue(q, &flags);
-+      rc = _net_accel_msg_send(sp, q, msg, 1);
-+      net_accel_msg_unlock_queue(q, &flags);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_reply);
-+
-+
-+/* As net_accel_msg_send but also posts a notification to the far end. */
-+int net_accel_msg_reply_notify(struct net_accel_shared_page *sp, int irq, 
-+                            sh_msg_fifo2 *q, struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      int rc;
-+      net_accel_msg_lock_queue(q, &flags);
-+      rc = _net_accel_msg_send(sp, q, msg, 1);
-+      net_accel_msg_unlock_queue(q, &flags);
-+      if (rc >= 0)
-+              notify_remote_via_irq(irq);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_reply_notify);
-+
-+
-+/*
-+ * Look at a received message, if any, so a decision can be made about
-+ * whether to read it now or not.  Cookie is a bit of debug which is
-+ * set here and checked when passed to net_accel_msg_recv_next()
-+ */
-+int net_accel_msg_peek(struct net_accel_shared_page *sp, 
-+                     sh_msg_fifo2 *queue, 
-+                     struct net_accel_msg *msg, int *cookie)
-+{
-+      unsigned long flags;
-+      int rc = 0;
-+      NET_ACCEL_CHECK_MAGIC(sp, -EINVAL);
-+      net_accel_msg_lock_queue(queue, &flags);
-+      rmb();
-+      if (sh_fifo2_is_empty(queue)) {
-+              rc = -ENOENT;
-+      } else {
-+              *msg = sh_fifo2_peek(queue);
-+              *cookie = *(queue->fifo_rd_i);
-+      }
-+      net_accel_msg_unlock_queue(queue, &flags);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_peek);
-+
-+
-+/*
-+ * Move the queue onto the next element, used after finished with a
-+ * peeked msg 
-+ */
-+int net_accel_msg_recv_next(struct net_accel_shared_page *sp, 
-+                          sh_msg_fifo2 *queue, int cookie)
-+{
-+      unsigned long flags;
-+      NET_ACCEL_CHECK_MAGIC(sp, -EINVAL);
-+      net_accel_msg_lock_queue(queue, &flags);
-+      rmb();
-+      /* Mustn't be empty */
-+      BUG_ON(sh_fifo2_is_empty(queue));
-+      /* 
-+       * Check cookie matches, i.e. we're advancing over the same message
-+       * as was got using peek 
-+       */
-+      BUG_ON(cookie != *(queue->fifo_rd_i));
-+      sh_fifo2_rd_next(queue);
-+      wmb();
-+      net_accel_msg_unlock_queue(queue, &flags);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_recv_next);
-+
-+
-+/* 
-+ * Receive a message on the specified FIFO. Returns 0 on success,
-+ * -errno on failure.
-+ */
-+int net_accel_msg_recv(struct net_accel_shared_page *sp, sh_msg_fifo2 *queue, 
-+                     struct net_accel_msg *msg)
-+{
-+      unsigned long flags;
-+      int rc = 0;
-+      NET_ACCEL_CHECK_MAGIC(sp, -EINVAL);
-+      net_accel_msg_lock_queue(queue, &flags);
-+      rmb();
-+      if (sh_fifo2_is_empty(queue)) {
-+              rc = -ENOENT;
-+      } else {
-+              sh_fifo2_get(queue, msg);
-+      }
-+      wmb();
-+      net_accel_msg_unlock_queue(queue, &flags);
-+      return rc;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_recv);
-+
-+
-+/* 
-+ * Start sending a message without copying. returns a pointer to a message
-+ * that will be filled out in place. The queue is locked until the message 
-+ * is sent.
-+ */
-+struct net_accel_msg *net_accel_msg_start_send(struct net_accel_shared_page *sp,
-+                                             sh_msg_fifo2 *queue, unsigned long *flags)
-+{
-+      struct net_accel_msg *msg;
-+      NET_ACCEL_CHECK_MAGIC(sp, NULL);
-+      net_accel_msg_lock_queue(queue, flags);
-+      rmb();
-+      if (sh_fifo2_not_half_full(queue)) {
-+              msg = sh_fifo2_pokep(queue);
-+      } else {
-+              net_accel_msg_unlock_queue(queue, flags);
-+              msg = NULL;
-+      }
-+      return msg;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_start_send);
-+
-+
-+static inline void _msg_complete(struct net_accel_shared_page *sp,
-+                               sh_msg_fifo2 *queue,
-+                               unsigned long *flags)
-+{
-+      sh_fifo2_wr_next(queue);
-+      net_accel_msg_unlock_queue(queue, flags);
-+}
-+
-+/*
-+ * Complete the sending of a message started with net_accel_msg_start_send. The 
-+ * message is implicit since the queue was locked by _start
-+ */
-+void net_accel_msg_complete_send(struct net_accel_shared_page *sp,
-+                               sh_msg_fifo2 *queue,
-+                               unsigned long *flags)
-+{
-+      _msg_complete(sp, queue, flags);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_complete_send);
-+
-+/* As net_accel_msg_complete_send but does the notify. */
-+void net_accel_msg_complete_send_notify(struct net_accel_shared_page *sp, 
-+                                      sh_msg_fifo2 *queue, 
-+                                      unsigned long *flags, int irq)
-+{
-+      _msg_complete(sp, queue, flags);
-+      notify_remote_via_irq(irq);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_msg_complete_send_notify);
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_msg_iface.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_msg_iface.h  2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,414 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NET_ACCEL_MSG_IFACE_H
-+#define NET_ACCEL_MSG_IFACE_H
-+
-+#include <linux/ip.h>
-+#include <linux/tcp.h>
-+#include <linux/udp.h>
-+#include <linux/in.h>
-+#include <linux/netdevice.h>
-+#include <linux/etherdevice.h>
-+
-+#include "accel_shared_fifo.h"
-+
-+#define NET_ACCEL_MSG_MAGIC (0x85465479)
-+
-+/*! We talk version 0.010 of the interdomain protocol */
-+#define NET_ACCEL_MSG_VERSION (0x00001000)
-+
-+/*! Shared memory portion of inter-domain FIFO */
-+struct net_accel_msg_queue {
-+      u32 read;
-+      u32 write;
-+};
-+
-+
-+/*
-+ * The aflags in the following structure is used as follows:
-+ *
-+ *  - each bit is set when one of the corresponding variables is
-+ *  changed by either end.
-+ *
-+ *  - the end that has made the change then forwards an IRQ to the
-+ *  other
-+ *
-+ *  - the IRQ handler deals with these bits either on the fast path, or
-+ *  for less common changes, by jumping onto the slow path.
-+ *
-+ *  - once it has seen a change, it clears the relevant bit.
-+ *
-+ * aflags is accessed atomically using clear_bit, test_bit,
-+ * test_and_set_bit etc
-+ */
-+
-+/*
-+ * The following used to signify to the other domain when the queue
-+ * they want to use is full, and when it is no longer full.  Could be
-+ * compressed to use fewer bits but done this way for simplicity and
-+ * clarity
-+ */
-+
-+/* "dom0->domU queue" is full */
-+#define NET_ACCEL_MSG_AFLAGS_QUEUE0FULL      0x1 
-+#define NET_ACCEL_MSG_AFLAGS_QUEUE0FULL_B    0
-+/* "dom0->domU queue" is not full */
-+#define NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL   0x2 
-+#define NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL_B 1
-+/* "domU->dom0 queue" is full */
-+#define NET_ACCEL_MSG_AFLAGS_QUEUEUFULL      0x4 
-+#define NET_ACCEL_MSG_AFLAGS_QUEUEUFULL_B    2
-+/* "domU->dom0 queue" is not full */
-+#define NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL   0x8
-+#define NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL_B 3
-+/* dom0 -> domU net_dev up/down events */
-+#define NET_ACCEL_MSG_AFLAGS_NETUPDOWN         0x10
-+#define NET_ACCEL_MSG_AFLAGS_NETUPDOWN_B       4
-+
-+/*
-+ * Masks used to test if there are any messages for domU and dom0
-+ * respectively
-+ */
-+#define NET_ACCEL_MSG_AFLAGS_TO_DOMU_MASK     \
-+      (NET_ACCEL_MSG_AFLAGS_QUEUE0FULL    |   \
-+       NET_ACCEL_MSG_AFLAGS_QUEUEUNOTFULL |   \
-+       NET_ACCEL_MSG_AFLAGS_NETUPDOWN)
-+#define NET_ACCEL_MSG_AFLAGS_TO_DOM0_MASK     \
-+      (NET_ACCEL_MSG_AFLAGS_QUEUE0NOTFULL |   \
-+       NET_ACCEL_MSG_AFLAGS_QUEUEUFULL)
-+
-+/*! The shared data structure used for inter-VM communication. */
-+struct net_accel_shared_page {
-+      /*! Sanity check */
-+      u32 magic;          
-+      /*! Used by host/Dom0 */
-+      struct net_accel_msg_queue queue0;
-+      /*! Used by guest/DomU */
-+      struct net_accel_msg_queue queue1;
-+      /*! Atomic flags, used to communicate simple state changes */
-+      u32 aflags;     
-+      /*! State of net_dev used for acceleration */     
-+      u32 net_dev_up; 
-+};
-+
-+
-+enum net_accel_hw_type {
-+      /*! Not a virtualisable NIC: use slow path. */
-+      NET_ACCEL_MSG_HWTYPE_NONE = 0,
-+      /*! NIC is Falcon-based */
-+      NET_ACCEL_MSG_HWTYPE_FALCON_A = 1,
-+      NET_ACCEL_MSG_HWTYPE_FALCON_B = 2,
-+};
-+
-+/*! The maximum number of pages used by an event queue. */
-+#define EF_HW_FALCON_EVQ_PAGES 8
-+
-+struct net_accel_hw_falcon_b {
-+      /* VI */
-+      /*! Grant for Tx DMA Q */
-+      u32 txdmaq_gnt;   
-+      /*! Grant for Rx DMA Q */
-+      u32 rxdmaq_gnt;   
-+      /*! Machine frame number for Tx/Rx doorbell page */
-+      u32 doorbell_mfn; 
-+      /*! Grant for Tx/Rx doorbell page */
-+      u32 doorbell_gnt;
-+
-+      /* Event Q */
-+      /*! Grants for the pages of the EVQ */
-+      u32 evq_mem_gnts[EF_HW_FALCON_EVQ_PAGES]; 
-+      u32 evq_offs;
-+      /*! log2(pages in event Q) */
-+      u32 evq_order;    
-+      /*! Capacity in events */
-+      u32 evq_capacity; 
-+      /*! Eventq pointer register physical address */
-+      u32 evq_rptr; 
-+      /*! Interface instance */
-+      u32 instance; 
-+      /*! Capacity of RX queue */
-+      u32 rx_capacity;
-+      /*! Capacity of TX queue */
-+      u32 tx_capacity;
-+
-+      /* NIC */
-+      s32 nic_arch;
-+      s32 nic_revision;
-+      u8 nic_variant;
-+};
-+
-+struct net_accel_hw_falcon_a {
-+      struct net_accel_hw_falcon_b common;
-+      u32 evq_rptr_gnt;
-+};
-+
-+
-+/*! Description of the hardware that the DomU is being given. */
-+struct net_accel_msg_hw {
-+      u32 type;               /*!< Hardware type */
-+      union {
-+              struct net_accel_hw_falcon_a falcon_a;
-+              struct net_accel_hw_falcon_b falcon_b;
-+      } resources;
-+};
-+
-+/*! Start-of-day handshake message. Dom0 fills in its version and
-+ * sends, DomU checks, inserts its version and replies
-+ */
-+struct net_accel_msg_hello {
-+      /*! Sender's version (set by each side in turn) */
-+      u32 version;    
-+      /*! max pages allocated/allowed for buffers */
-+      u32 max_pages;      
-+};
-+
-+/*! Maximum number of page requests that can fit in a message. */
-+#define NET_ACCEL_MSG_MAX_PAGE_REQ (8)
-+
-+/*! Request for NIC buffers. DomU fils out pages and grants (and
-+ *  optionally) reqid, dom0 fills out buf and sends reply 
-+ */
-+struct net_accel_msg_map_buffers {
-+      u32 reqid;      /*!< Optional request ID */
-+      u32 pages;      /*!< Number of pages to map */
-+      u32 grants[NET_ACCEL_MSG_MAX_PAGE_REQ];  /*!< Grant ids to map */ 
-+      u32 buf;          /*!< NIC buffer address of pages obtained */
-+};
-+
-+/*! Notification of a change to local mac address, used to filter
-+  locally destined packets off the fast path */
-+struct net_accel_msg_localmac {
-+      u32 flags;      /*!< Should this be added or removed? */
-+      u8 mac[ETH_ALEN]; /*!< The mac address to filter onto slow path */
-+};
-+
-+struct net_accel_msg_fastpath {
-+      u32 flags;      /*!< Should this be added or removed? */
-+      u8  mac[ETH_ALEN];/*!< The mac address to filter onto fast path */
-+      u16 port;        /*!< The port of the connection */
-+      u32 ip;    /*!< The IP address of the connection */
-+      u8  proto;      /*!< The protocol of connection (TCP/UDP) */
-+};
-+
-+/*! Values for struct ef_msg_localmac/fastpath.flags */
-+#define NET_ACCEL_MSG_ADD    0x1
-+#define NET_ACCEL_MSG_REMOVE 0x2
-+
-+/*! Overall message structure */
-+struct net_accel_msg {
-+      /*! ID specifying type of messge */
-+      u32 id;              
-+      union {
-+              /*! handshake */
-+              struct net_accel_msg_hello hello;  
-+              /*! hardware description */
-+              struct net_accel_msg_hw hw;     
-+              /*! buffer map request */
-+              struct net_accel_msg_map_buffers mapbufs; 
-+              /*! mac address of a local interface */
-+              struct net_accel_msg_localmac localmac; 
-+              /*! address of a new fastpath connection */
-+              struct net_accel_msg_fastpath fastpath; 
-+              /*! make the message a fixed size */
-+              u8 pad[128 - sizeof(u32)]; 
-+      }  u;
-+};
-+
-+
-+#define NET_ACCEL_MSG_HW_TO_MSG(_u) container_of(_u, struct net_accel_msg, u.hw)
-+
-+/*! Inter-domain message FIFO */
-+typedef struct {
-+      struct net_accel_msg *fifo;
-+      u32 fifo_mask;
-+      u32 *fifo_rd_i;
-+      u32 *fifo_wr_i;
-+      spinlock_t lock;
-+      u32 is_locked; /* Debug flag */
-+} sh_msg_fifo2;
-+
-+
-+#define NET_ACCEL_MSG_OFFSET_MASK PAGE_MASK
-+
-+/* Modifiers */
-+#define NET_ACCEL_MSG_REPLY    (0x80000000)
-+#define NET_ACCEL_MSG_ERROR    (0x40000000)
-+
-+/* Dom0 -> DomU and reply. Handshake/version check. */
-+#define NET_ACCEL_MSG_HELLO    (0x00000001)
-+/* Dom0 -> DomU : hardware setup (VI info.) */
-+#define NET_ACCEL_MSG_SETHW    (0x00000002)
-+/*
-+ * Dom0 -> DomU. Notification of a local mac to add/remove from slow
-+ * path filter
-+ */
-+#define NET_ACCEL_MSG_LOCALMAC (0x00000003)
-+/* 
-+ * DomU -> Dom0 and reply. Request for buffer table entries for
-+ * preallocated pages.
-+ */
-+#define NET_ACCEL_MSG_MAPBUF   (0x00000004)
-+/* 
-+ * Dom0 -> DomU. Notification of a local mac to add/remove from fast
-+ * path filter
-+ */
-+#define NET_ACCEL_MSG_FASTPATH (0x00000005)
-+
-+/*! Initialise a message and set the type
-+ * \param message : the message
-+ * \param code : the message type 
-+ */
-+static inline void net_accel_msg_init(struct net_accel_msg *msg, int code) {
-+      msg->id = (u32)code;
-+}
-+
-+/*! initialise a shared page structure
-+ * \param shared_page : mapped memory in which the structure resides
-+ * \param len : size of the message FIFO area that follows
-+ * \param up : initial up/down state of netdev 
-+ * \return 0 or an error code
-+ */
-+extern int net_accel_msg_init_page(void *shared_page, int len, int up);
-+
-+/*! initialise a message queue 
-+ * \param queue : the message FIFO to initialise 
-+ * \param indices : the read and write indices in shared memory
-+ * \param base : the start of the memory area for the FIFO
-+ * \param size : the size of the FIFO in bytes
-+ */
-+extern void net_accel_msg_init_queue(sh_msg_fifo2 *queue,
-+                                   struct net_accel_msg_queue *indices,
-+                                   struct net_accel_msg *base, int size);
-+
-+/* Notify after a batch of messages have been sent */
-+extern void net_accel_msg_notify(int irq);
-+
-+/*! Send a message on the specified FIFO. The message is copied to the 
-+ *  current slot of the FIFO.
-+ * \param sp : pointer to shared page
-+ * \param q : pointer to message FIFO to use
-+ * \param msg : pointer to message 
-+ * \return 0 on success, -errno on
-+ */ 
-+extern int net_accel_msg_send(struct net_accel_shared_page *sp,
-+                            sh_msg_fifo2 *q, 
-+                            struct net_accel_msg *msg);
-+extern int net_accel_msg_reply(struct net_accel_shared_page *sp,
-+                            sh_msg_fifo2 *q, 
-+                            struct net_accel_msg *msg);
-+
-+/*! As net_accel_msg_send but also posts a notification to the far end. */
-+extern int net_accel_msg_send_notify(struct net_accel_shared_page *sp, 
-+                                   int irq, sh_msg_fifo2 *q, 
-+                                   struct net_accel_msg *msg);
-+/*! As net_accel_msg_send but also posts a notification to the far end. */
-+extern int net_accel_msg_reply_notify(struct net_accel_shared_page *sp, 
-+                                    int irq, sh_msg_fifo2 *q, 
-+                                    struct net_accel_msg *msg);
-+
-+/*! Receive a message on the specified FIFO. Returns 0 on success,
-+ *  -errno on failure.
-+ */
-+extern int net_accel_msg_recv(struct net_accel_shared_page *sp,
-+                            sh_msg_fifo2 *q,
-+                            struct net_accel_msg *msg);
-+
-+/*! Look at a received message, if any, so a decision can be made
-+ *  about whether to read it now or not.  Cookie is a bit of debug
-+ *  which is set here and checked when passed to
-+ *  net_accel_msg_recv_next()
-+ */
-+extern int net_accel_msg_peek(struct net_accel_shared_page *sp,
-+                            sh_msg_fifo2 *queue, 
-+                            struct net_accel_msg *msg, int *cookie);
-+/*! Move the queue onto the next element, used after finished with a
-+ *  peeked msg 
-+ */
-+extern int net_accel_msg_recv_next(struct net_accel_shared_page *sp,
-+                                 sh_msg_fifo2 *queue, int cookie);
-+
-+/*! Start sending a message without copying. returns a pointer to a
-+ *  message that will be filled out in place. The queue is locked
-+ *  until the message is sent.
-+ */
-+extern 
-+struct net_accel_msg *net_accel_msg_start_send(struct net_accel_shared_page *sp,
-+                                             sh_msg_fifo2 *queue,
-+                                             unsigned long *flags);
-+
-+
-+/*! Complete the sending of a message started with
-+ *  net_accel_msg_start_send. The message is implicit since the queue
-+ *  was locked by _start 
-+ */
-+extern void net_accel_msg_complete_send(struct net_accel_shared_page *sp,
-+                                      sh_msg_fifo2 *queue,
-+                                      unsigned long *flags);
-+
-+/*! As net_accel_msg_complete_send but does the notify. */
-+extern void net_accel_msg_complete_send_notify(struct net_accel_shared_page *sp, 
-+                                             sh_msg_fifo2 *queue,
-+                                             unsigned long *flags, int irq);
-+
-+/*! Lock the queue so that multiple "_locked" functions can be called
-+ *  without the queue being modified by others 
-+ */
-+static inline
-+void net_accel_msg_lock_queue(sh_msg_fifo2 *queue, unsigned long *flags)
-+{
-+      spin_lock_irqsave(&queue->lock, (*flags));
-+      rmb();
-+      BUG_ON(queue->is_locked);
-+      queue->is_locked = 1;
-+}
-+
-+/*! Unlock the queue */
-+static inline
-+void net_accel_msg_unlock_queue(sh_msg_fifo2 *queue, unsigned long *flags)
-+{
-+      BUG_ON(!queue->is_locked);
-+      queue->is_locked = 0;
-+      wmb();
-+      spin_unlock_irqrestore(&queue->lock, (*flags));
-+}
-+
-+/*! Give up without sending a message that was started with
-+ *  net_accel_msg_start_send() 
-+ */
-+static inline 
-+void net_accel_msg_abort_send(struct net_accel_shared_page *sp,
-+                            sh_msg_fifo2 *queue, unsigned long *flags)
-+{
-+      net_accel_msg_unlock_queue(queue, flags);
-+}
-+
-+/*! Test the queue to ensure there is sufficient space */
-+static inline
-+int net_accel_msg_check_space(sh_msg_fifo2 *queue, unsigned space)
-+{
-+      return sh_fifo2_space(queue) >= space;
-+}
-+
-+#endif /* NET_ACCEL_MSG_IFACE_H */
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_shared_fifo.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_shared_fifo.h        2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,127 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NET_ACCEL_SHARED_FIFO_H
-+#define NET_ACCEL_SHARED_FIFO_H
-+
-+/*
-+ * This is based on fifo.h, but handles sharing between address spaces
-+ * that don't trust each other, by splitting out the read and write
-+ * indices. This costs at least one pointer indirection more than the
-+ * vanilla version per access.
-+ */
-+
-+typedef struct {
-+      char*    fifo;
-+      unsigned      fifo_mask;
-+      unsigned      *fifo_rd_i;
-+      unsigned      *fifo_wr_i;
-+} sh_byte_fifo2;
-+
-+#define SH_FIFO2_M(f, x)     ((x) & ((f)->fifo_mask))
-+
-+static inline unsigned log2_ge(unsigned long n, unsigned min_order) {
-+      unsigned order = min_order;
-+      while((1ul << order) < n) ++order;
-+      return order;
-+}
-+
-+static inline unsigned long pow2(unsigned order) {
-+      return (1ul << order);
-+}
-+
-+#define is_pow2(x)  (pow2(log2_ge((x), 0)) == (x))
-+
-+#define sh_fifo2_valid(f)  ((f) && (f)->fifo && (f)->fifo_mask > 0 &&   \
-+                          is_pow2((f)->fifo_mask+1u))
-+
-+#define sh_fifo2_init(f, cap, _rptr, _wptr)           \
-+      do {                                            \
-+              BUG_ON(!is_pow2((cap) + 1));            \
-+              (f)->fifo_rd_i = _rptr;                 \
-+              (f)->fifo_wr_i = _wptr;                 \
-+              *(f)->fifo_rd_i = *(f)->fifo_wr_i = 0u; \
-+              (f)->fifo_mask = (cap);                 \
-+      } while(0)
-+
-+#define sh_fifo2_num(f)      SH_FIFO2_M((f),*(f)->fifo_wr_i - *(f)->fifo_rd_i)
-+#define sh_fifo2_space(f)    SH_FIFO2_M((f),*(f)->fifo_rd_i - *(f)->fifo_wr_i-1u)
-+#define sh_fifo2_is_empty(f)  (sh_fifo2_num(f)==0)
-+#define sh_fifo2_not_empty(f) (sh_fifo2_num(f)!=0)
-+#define sh_fifo2_is_full(f)   (sh_fifo2_space(f)==0u)
-+#define sh_fifo2_not_full(f)  (sh_fifo2_space(f)!=0u)
-+#define sh_fifo2_buf_size(f) ((f)->fifo_mask + 1u)
-+#define sh_fifo2_capacity(f) ((f)->fifo_mask)
-+#define sh_fifo2_end(f)      ((f)->fifo + sh_fifo2_buf_size(f))
-+#define sh_fifo2_not_half_full(f) (sh_fifo2_space(f) > (sh_fifo2_capacity(f) >> 1))
-+
-+#define sh_fifo2_peek(f)     ((f)->fifo[SH_FIFO2_M((f), *(f)->fifo_rd_i)])
-+#define sh_fifo2_peekp(f)    ((f)->fifo + SH_FIFO2_M((f), *(f)->fifo_rd_i))
-+#define sh_fifo2_poke(f)     ((f)->fifo[SH_FIFO2_M((f), *(f)->fifo_wr_i)])
-+#define sh_fifo2_pokep(f)    ((f)->fifo + SH_FIFO2_M((f), *(f)->fifo_wr_i))
-+#define sh_fifo2_peek_i(f,i) ((f)->fifo[SH_FIFO2_M((f), *(f)->fifo_rd_i+(i))])
-+#define sh_fifo2_poke_i(f,i) ((f)->fifo[SH_FIFO2_M((f), *(f)->fifo_wr_i+(i))])
-+
-+#define sh_fifo2_rd_next(f)                                   \
-+      do {*(f)->fifo_rd_i = *(f)->fifo_rd_i + 1u;} while(0)
-+#define sh_fifo2_wr_next(f)                                   \
-+      do {*(f)->fifo_wr_i = *(f)->fifo_wr_i + 1u;} while(0)
-+#define sh_fifo2_rd_adv(f, n)                                 \
-+      do {*(f)->fifo_rd_i = *(f)->fifo_rd_i + (n);} while(0)
-+#define sh_fifo2_wr_adv(f, n)                                 \
-+      do {*(f)->fifo_wr_i = *(f)->fifo_wr_i + (n);} while(0)
-+
-+#define sh_fifo2_put(f, v)                                            \
-+      do {sh_fifo2_poke(f) = (v); wmb(); sh_fifo2_wr_next(f);} while(0)
-+
-+#define sh_fifo2_get(f, pv)                                           \
-+      do {*(pv) = sh_fifo2_peek(f); mb(); sh_fifo2_rd_next(f);} while(0)
-+
-+static inline unsigned sh_fifo2_contig_num(sh_byte_fifo2 *f)
-+{
-+      unsigned fifo_wr_i = SH_FIFO2_M(f, *f->fifo_wr_i);
-+      unsigned fifo_rd_i = SH_FIFO2_M(f, *f->fifo_rd_i);
-+
-+      return (fifo_wr_i >= fifo_rd_i)
-+              ? fifo_wr_i - fifo_rd_i
-+              : f->fifo_mask + 1u - *(f)->fifo_rd_i;
-+}
-+
-+static inline unsigned sh_fifo2_contig_space(sh_byte_fifo2 *f)
-+{
-+      unsigned fifo_wr_i = SH_FIFO2_M(f, *f->fifo_wr_i);
-+      unsigned fifo_rd_i = SH_FIFO2_M(f, *f->fifo_rd_i);
-+
-+      return (fifo_rd_i > fifo_wr_i)
-+              ? fifo_rd_i - fifo_wr_i - 1
-+              : (f->fifo_mask + 1u - fifo_wr_i
-+                 /*
-+                  * The last byte can't be used if the read pointer
-+                  * is at zero.
-+                  */
-+                 - (fifo_rd_i==0));
-+}
-+
-+
-+#endif /* NET_ACCEL_SHARED_FIFO_H */
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_util.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_util.c       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,333 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#include <linux/if_ether.h>
-+#include <asm/io.h>
-+#include <asm/pgtable.h>
-+#include <asm/hypercall.h>
-+#include <xen/xenbus.h>
-+#include <xen/driver_util.h>
-+#include <xen/gnttab.h>
-+
-+#include "accel_util.h"
-+
-+#ifdef EFX_GCOV
-+#include "gcov.h"
-+
-+static int __init net_accel_init(void)
-+{
-+      gcov_provider_init(THIS_MODULE);
-+      return 0;
-+}
-+module_init(net_accel_init);
-+
-+static void __exit net_accel_exit(void)
-+{
-+      gcov_provider_fini(THIS_MODULE);
-+}
-+module_exit(net_accel_exit);
-+#endif
-+
-+/* Shutdown remote domain that is misbehaving */
-+int net_accel_shutdown_remote(int domain)
-+{
-+      struct sched_remote_shutdown sched_shutdown = {
-+              .domain_id = domain,
-+              .reason = SHUTDOWN_crash
-+      };
-+
-+      EPRINTK("Crashing domain %d\n", domain);
-+
-+      return HYPERVISOR_sched_op(SCHEDOP_remote_shutdown, &sched_shutdown);
-+}
-+EXPORT_SYMBOL(net_accel_shutdown_remote);
-+
-+
-+/* Based on xenbus_backend_client.c:xenbus_map_ring() */
-+static int net_accel_map_grant(struct xenbus_device *dev, int gnt_ref,
-+                             grant_handle_t *handle, void *vaddr, 
-+                             u64 *dev_bus_addr, unsigned flags)
-+{
-+      struct gnttab_map_grant_ref op;
-+      
-+      gnttab_set_map_op(&op, (unsigned long)vaddr, flags,
-+                        gnt_ref, dev->otherend_id);
-+
-+      BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1));
-+
-+      if (op.status != GNTST_okay) {
-+              xenbus_dev_error
-+                      (dev, op.status,
-+                       "failed mapping in shared page %d from domain %d\n",
-+                       gnt_ref, dev->otherend_id);
-+      } else {
-+              *handle = op.handle;
-+              if (dev_bus_addr)
-+                      *dev_bus_addr = op.dev_bus_addr;
-+      }
-+
-+      return op.status;
-+}
-+
-+
-+/* Based on xenbus_backend_client.c:xenbus_unmap_ring() */
-+static int net_accel_unmap_grant(struct xenbus_device *dev, 
-+                               grant_handle_t handle,
-+                               void *vaddr, u64 dev_bus_addr,
-+                               unsigned flags)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)vaddr, flags, handle);
-+      
-+      if (dev_bus_addr)
-+              op.dev_bus_addr = dev_bus_addr;
-+
-+      BUG_ON(HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1));
-+
-+      if (op.status != GNTST_okay)
-+              xenbus_dev_error(dev, op.status,
-+                               "failed unmapping page at handle %d error %d\n",
-+                               handle, op.status);
-+
-+      return op.status;
-+}
-+
-+
-+int net_accel_map_device_page(struct xenbus_device *dev,  
-+                            int gnt_ref, grant_handle_t *handle,
-+                            u64 *dev_bus_addr)
-+{
-+      return net_accel_map_grant(dev, gnt_ref, handle, 0, dev_bus_addr,
-+                                 GNTMAP_device_map);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_map_device_page);
-+
-+ 
-+int net_accel_unmap_device_page(struct xenbus_device *dev,
-+                              grant_handle_t handle, u64 dev_bus_addr)
-+{
-+      return net_accel_unmap_grant(dev, handle, 0, dev_bus_addr, 
-+                                   GNTMAP_device_map);
-+}
-+EXPORT_SYMBOL_GPL(net_accel_unmap_device_page);
-+
-+
-+struct net_accel_valloc_grant_mapping {
-+      struct vm_struct *vm;
-+      int pages;
-+      grant_handle_t grant_handles[0];
-+};
-+
-+/* Map a series of grants into a contiguous virtual area */
-+static void *net_accel_map_grants_valloc(struct xenbus_device *dev, 
-+                                       unsigned *grants, int npages, 
-+                                       unsigned flags, void **priv)
-+{
-+      struct net_accel_valloc_grant_mapping *map;
-+      struct vm_struct *vm;
-+      void *addr;
-+      int i, j, rc;
-+
-+      vm  = alloc_vm_area(PAGE_SIZE * npages);
-+      if (vm == NULL) {
-+              EPRINTK("No memory from alloc_vm_area.\n");
-+              return NULL;
-+      }
-+      /* 
-+       * Get a structure in which we will record all the info needed
-+       * to undo the mapping.
-+       */
-+      map = kzalloc(sizeof(struct net_accel_valloc_grant_mapping)  + 
-+                    npages * sizeof(grant_handle_t), GFP_KERNEL);
-+      if (map == NULL) {
-+              EPRINTK("No memory for net_accel_valloc_grant_mapping\n");
-+              free_vm_area(vm);
-+              return NULL;
-+      }
-+      map->vm = vm;
-+      map->pages = npages;
-+
-+      /* Do the actual mapping */
-+      addr = vm->addr;
-+      for (i = 0; i < npages; i++) {
-+              rc = net_accel_map_grant(dev, grants[i], map->grant_handles + i, 
-+                                       addr, NULL, flags);
-+              if (rc != 0)
-+                      goto undo;
-+              addr = (void*)((unsigned long)addr + PAGE_SIZE);
-+      }
-+
-+      if (priv)
-+              *priv = (void *)map;
-+      else
-+              kfree(map);
-+
-+      return vm->addr;
-+
-+ undo:
-+      EPRINTK("Aborting contig map due to single map failure %d (%d of %d)\n",
-+              rc, i+1, npages);
-+      for (j = 0; j < i; j++) {
-+              addr = (void*)((unsigned long)vm->addr + (j * PAGE_SIZE));
-+              net_accel_unmap_grant(dev, map->grant_handles[j], addr, 0,
-+                                    flags);
-+      }
-+      free_vm_area(vm);
-+      kfree(map);
-+      return NULL;
-+}
-+
-+/* Undo the result of the mapping */
-+static void net_accel_unmap_grants_vfree(struct xenbus_device *dev, 
-+                                       unsigned flags, void *priv)
-+{
-+      struct net_accel_valloc_grant_mapping *map = 
-+              (struct net_accel_valloc_grant_mapping *)priv;
-+
-+      void *addr = map->vm->addr;
-+      int npages = map->pages;
-+      int i;
-+
-+      for (i = 0; i < npages; i++) {
-+              net_accel_unmap_grant(dev, map->grant_handles[i], addr, 0,
-+                                    flags);
-+              addr = (void*)((unsigned long)addr + PAGE_SIZE);
-+      }
-+      free_vm_area(map->vm);
-+      kfree(map);
-+}
-+
-+
-+void *net_accel_map_grants_contig(struct xenbus_device *dev,
-+                              unsigned *grants, int npages, 
-+                              void **priv)
-+{
-+      return net_accel_map_grants_valloc(dev, grants, npages,
-+                                         GNTMAP_host_map, priv);
-+}
-+EXPORT_SYMBOL(net_accel_map_grants_contig);
-+
-+
-+void net_accel_unmap_grants_contig(struct xenbus_device *dev,
-+                                 void *priv)
-+{
-+      net_accel_unmap_grants_vfree(dev, GNTMAP_host_map, priv);
-+}
-+EXPORT_SYMBOL(net_accel_unmap_grants_contig);
-+
-+
-+void *net_accel_map_iomem_page(struct xenbus_device *dev, int gnt_ref,
-+                           void **priv)
-+{
-+      return net_accel_map_grants_valloc(dev, &gnt_ref, 1, 
-+                                         GNTMAP_host_map, priv);
-+}
-+EXPORT_SYMBOL(net_accel_map_iomem_page);
-+
-+
-+void net_accel_unmap_iomem_page(struct xenbus_device *dev, void *priv)
-+{
-+      net_accel_unmap_grants_vfree(dev, GNTMAP_host_map, priv);
-+}
-+EXPORT_SYMBOL(net_accel_unmap_iomem_page);
-+
-+
-+int net_accel_grant_page(struct xenbus_device *dev, unsigned long mfn, 
-+                       int is_iomem)
-+{
-+      int err = gnttab_grant_foreign_access(dev->otherend_id, mfn,
-+                                            is_iomem ? GTF_PCD : 0);
-+      if (err < 0)
-+              xenbus_dev_error(dev, err, "failed granting access to page\n");
-+      return err;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_grant_page);
-+
-+
-+int net_accel_ungrant_page(grant_ref_t gntref)
-+{
-+      if (unlikely(gnttab_query_foreign_access(gntref) != 0)) {
-+              EPRINTK("%s: remote domain still using grant %d\n", __FUNCTION__, 
-+                      gntref);
-+              return -EBUSY;
-+      }
-+
-+      gnttab_end_foreign_access(gntref, 0);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_ungrant_page);
-+
-+
-+int net_accel_xen_net_read_mac(struct xenbus_device *dev, u8 mac[])
-+{
-+      char *s, *e, *macstr;
-+      int i;
-+
-+      macstr = s = xenbus_read(XBT_NIL, dev->nodename, "mac", NULL);
-+      if (IS_ERR(macstr))
-+              return PTR_ERR(macstr);
-+
-+      for (i = 0; i < ETH_ALEN; i++) {
-+              mac[i] = simple_strtoul(s, &e, 16);
-+              if ((s == e) || (*e != ((i == ETH_ALEN-1) ? '\0' : ':'))) {
-+                      kfree(macstr);
-+                      return -ENOENT;
-+              }
-+              s = e+1;
-+      }
-+
-+      kfree(macstr);
-+      return 0;
-+}
-+EXPORT_SYMBOL_GPL(net_accel_xen_net_read_mac);
-+
-+
-+void net_accel_update_state(struct xenbus_device *dev, int state)
-+{
-+      struct xenbus_transaction tr;
-+      int err;
-+
-+      DPRINTK("%s: setting accelstate to %s\n", __FUNCTION__,
-+              xenbus_strstate(state));
-+
-+      if (xenbus_exists(XBT_NIL, dev->nodename, "")) {
-+              VPRINTK("%s: nodename %s\n", __FUNCTION__, dev->nodename);
-+      again:
-+              err = xenbus_transaction_start(&tr);
-+              if (err == 0)
-+                      err = xenbus_printf(tr, dev->nodename, "accelstate",
-+                                          "%d", state);
-+              if (err != 0) {
-+                      xenbus_transaction_end(tr, 1);
-+              } else {
-+                      err = xenbus_transaction_end(tr, 0);
-+                      if (err == -EAGAIN)
-+                              goto again;
-+              }
-+      }
-+}
-+EXPORT_SYMBOL_GPL(net_accel_update_state);
-+
-+MODULE_LICENSE("GPL");
-Index: head-2008-11-25/drivers/xen/sfc_netutil/accel_util.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/sfc_netutil/accel_util.h       2008-02-20 09:32:49.000000000 +0100
-@@ -0,0 +1,127 @@
-+/****************************************************************************
-+ * Solarflare driver for Xen network acceleration
-+ *
-+ * Copyright 2006-2008: Solarflare Communications Inc,
-+ *                      9501 Jeronimo Road, Suite 250,
-+ *                      Irvine, CA 92618, USA
-+ *
-+ * Maintained by Solarflare Communications <linux-xen-drivers@solarflare.com>
-+ *
-+ * This program is free software; you can redistribute it and/or modify it
-+ * under the terms of the GNU General Public License version 2 as published
-+ * by the Free Software Foundation, incorporated herein by reference.
-+ *
-+ * This program is distributed in the hope that it will be useful,
-+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
-+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+ * GNU General Public License for more details.
-+ *
-+ * You should have received a copy of the GNU General Public License
-+ * along with this program; if not, write to the Free Software
-+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
-+ ****************************************************************************
-+ */
-+
-+#ifndef NETBACK_ACCEL_UTIL_H
-+#define NETBACK_ACCEL_UTIL_H
-+
-+#ifdef DPRINTK
-+#undef DPRINTK
-+#endif
-+
-+#define FILE_LEAF strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__
-+
-+#if 1
-+#define VPRINTK(_f, _a...) 
-+#else
-+#define VPRINTK(_f, _a...)                    \
-+      printk("(file=%s, line=%d) " _f,        \
-+             FILE_LEAF , __LINE__ , ## _a )
-+#endif
-+
-+#if 1
-+#define DPRINTK(_f, _a...) 
-+#else
-+#define DPRINTK(_f, _a...)                    \
-+      printk("(file=%s, line=%d) " _f,        \
-+             FILE_LEAF , __LINE__ , ## _a )
-+#endif
-+
-+#define EPRINTK(_f, _a...)                    \
-+      printk("(file=%s, line=%d) " _f,        \
-+             FILE_LEAF , __LINE__ , ## _a )
-+
-+#define EPRINTK_ON(exp)                                                       \
-+      do {                                                            \
-+              if (exp)                                                \
-+                      EPRINTK("%s at %s:%d\n", #exp, __FILE__, __LINE__); \
-+      } while(0)
-+
-+#define DPRINTK_ON(exp)                                                       \
-+      do {                                                            \
-+              if (exp)                                                \
-+                      DPRINTK("%s at %s:%d\n", #exp, __FILE__, __LINE__); \
-+      } while(0)
-+
-+#define MAC_FMT "%.2x:%.2x:%.2x:%.2x:%.2x:%.2x"
-+#define MAC_ARG(_mac) (_mac)[0], (_mac)[1], (_mac)[2], (_mac)[3], (_mac)[4], (_mac)[5]
-+
-+#include <xen/xenbus.h>
-+
-+/*! Map a set of pages from another domain
-+ * \param dev The xenbus device context
-+ * \param priv The private data returned by the mapping function 
-+ */
-+extern 
-+void *net_accel_map_grants_contig(struct xenbus_device *dev, 
-+                                unsigned *grants, int npages, 
-+                                void **priv);
-+
-+/*! Unmap a set of pages mapped using net_accel_map_grants_contig.
-+ * \param dev The xenbus device context
-+ * \param priv The private data returned by the mapping function 
-+ */
-+extern 
-+void net_accel_unmap_grants_contig(struct xenbus_device *dev, void *priv);
-+
-+/*! Read the MAC address of a device from xenstore */
-+extern
-+int net_accel_xen_net_read_mac(struct xenbus_device *dev, u8 mac[]);
-+
-+/*! Update the accelstate field for a device in xenstore */
-+extern
-+void net_accel_update_state(struct xenbus_device *dev, int state);
-+
-+/* These four map/unmap functions are based on
-+ * xenbus_backend_client.c:xenbus_map_ring().  However, they are not
-+ * used for ring buffers, instead just to map pages between domains,
-+ * or to map a page so that it is accessible by a device
-+ */
-+extern
-+int net_accel_map_device_page(struct xenbus_device *dev,  
-+                            int gnt_ref, grant_handle_t *handle,
-+                            u64 *dev_bus_addr);
-+extern
-+int net_accel_unmap_device_page(struct xenbus_device *dev,
-+                              grant_handle_t handle, u64 dev_bus_addr);
-+extern
-+void *net_accel_map_iomem_page(struct xenbus_device *dev, int gnt_ref,
-+                           void **priv);
-+extern
-+void net_accel_unmap_iomem_page(struct xenbus_device *dev, void *priv);
-+
-+/*! Grrant a page to remote domain */
-+extern
-+int net_accel_grant_page(struct xenbus_device *dev, unsigned long mfn, 
-+                       int is_iomem);
-+/*! Undo a net_accel_grant_page */
-+extern
-+int net_accel_ungrant_page(grant_ref_t gntref);
-+
-+
-+/*! Shutdown remote domain that is misbehaving */
-+extern
-+int net_accel_shutdown_remote(int domain);
-+
-+
-+#endif
-Index: head-2008-11-25/drivers/xen/tpmback/Makefile
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/tpmback/Makefile       2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,4 @@
-+
-+obj-$(CONFIG_XEN_TPMDEV_BACKEND)      += tpmbk.o
-+
-+tpmbk-y += tpmback.o interface.o xenbus.o
-Index: head-2008-11-25/drivers/xen/tpmback/common.h
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/tpmback/common.h       2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,85 @@
-+/******************************************************************************
-+ * drivers/xen/tpmback/common.h
-+ */
-+
-+#ifndef __TPM__BACKEND__COMMON_H__
-+#define __TPM__BACKEND__COMMON_H__
-+
-+#include <linux/version.h>
-+#include <linux/module.h>
-+#include <linux/interrupt.h>
-+#include <linux/slab.h>
-+#include <xen/evtchn.h>
-+#include <xen/driver_util.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/interface/io/tpmif.h>
-+#include <asm/io.h>
-+#include <asm/pgalloc.h>
-+
-+#define DPRINTK(_f, _a...)                    \
-+      pr_debug("(file=%s, line=%d) " _f,      \
-+               __FILE__ , __LINE__ , ## _a )
-+
-+struct backend_info;
-+
-+typedef struct tpmif_st {
-+      struct list_head tpmif_list;
-+      /* Unique identifier for this interface. */
-+      domid_t domid;
-+      unsigned int handle;
-+
-+      /* Physical parameters of the comms window. */
-+      unsigned int irq;
-+
-+      /* The shared rings and indexes. */
-+      tpmif_tx_interface_t *tx;
-+      struct vm_struct *tx_area;
-+
-+      /* Miscellaneous private stuff. */
-+      enum { DISCONNECTED, DISCONNECTING, CONNECTED } status;
-+      int active;
-+
-+      struct tpmif_st *hash_next;
-+      struct list_head list;  /* scheduling list */
-+      atomic_t refcnt;
-+
-+      struct backend_info *bi;
-+
-+      grant_handle_t shmem_handle;
-+      grant_ref_t shmem_ref;
-+      struct page **mmap_pages;
-+
-+      char devname[20];
-+} tpmif_t;
-+
-+void tpmif_disconnect_complete(tpmif_t * tpmif);
-+tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi);
-+void tpmif_interface_init(void);
-+void tpmif_interface_exit(void);
-+void tpmif_schedule_work(tpmif_t * tpmif);
-+void tpmif_deschedule_work(tpmif_t * tpmif);
-+void tpmif_xenbus_init(void);
-+void tpmif_xenbus_exit(void);
-+int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn);
-+irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs);
-+
-+long int tpmback_get_instance(struct backend_info *bi);
-+
-+int vtpm_release_packets(tpmif_t * tpmif, int send_msgs);
-+
-+
-+#define tpmif_get(_b) (atomic_inc(&(_b)->refcnt))
-+#define tpmif_put(_b)                                 \
-+      do {                                            \
-+              if (atomic_dec_and_test(&(_b)->refcnt)) \
-+                      tpmif_disconnect_complete(_b);  \
-+      } while (0)
-+
-+extern int num_frontends;
-+
-+static inline unsigned long idx_to_kaddr(tpmif_t *t, unsigned int idx)
-+{
-+      return (unsigned long)pfn_to_kaddr(page_to_pfn(t->mmap_pages[idx]));
-+}
-+
-+#endif /* __TPMIF__BACKEND__COMMON_H__ */
-Index: head-2008-11-25/drivers/xen/tpmback/interface.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/tpmback/interface.c    2008-01-21 11:15:26.000000000 +0100
-@@ -0,0 +1,168 @@
-+ /*****************************************************************************
-+ * drivers/xen/tpmback/interface.c
-+ *
-+ * Vritual TPM interface management.
-+ *
-+ * Copyright (c) 2005, IBM Corporation
-+ *
-+ * Author: Stefan Berger, stefanb@us.ibm.com
-+ *
-+ * This code has been derived from drivers/xen/netback/interface.c
-+ * Copyright (c) 2004, Keir Fraser
-+ */
-+
-+#include "common.h"
-+#include <xen/balloon.h>
-+#include <xen/gnttab.h>
-+
-+static kmem_cache_t *tpmif_cachep;
-+int num_frontends = 0;
-+
-+LIST_HEAD(tpmif_list);
-+
-+static tpmif_t *alloc_tpmif(domid_t domid, struct backend_info *bi)
-+{
-+      tpmif_t *tpmif;
-+
-+      tpmif = kmem_cache_alloc(tpmif_cachep, GFP_KERNEL);
-+      if (tpmif == NULL)
-+              goto out_of_memory;
-+
-+      memset(tpmif, 0, sizeof (*tpmif));
-+      tpmif->domid = domid;
-+      tpmif->status = DISCONNECTED;
-+      tpmif->bi = bi;
-+      snprintf(tpmif->devname, sizeof(tpmif->devname), "tpmif%d", domid);
-+      atomic_set(&tpmif->refcnt, 1);
-+
-+      tpmif->mmap_pages = alloc_empty_pages_and_pagevec(TPMIF_TX_RING_SIZE);
-+      if (tpmif->mmap_pages == NULL)
-+              goto out_of_memory;
-+
-+      list_add(&tpmif->tpmif_list, &tpmif_list);
-+      num_frontends++;
-+
-+      return tpmif;
-+
-+ out_of_memory:
-+      if (tpmif != NULL)
-+              kmem_cache_free(tpmif_cachep, tpmif);
-+      printk("%s: out of memory\n", __FUNCTION__);
-+      return ERR_PTR(-ENOMEM);
-+}
-+
-+static void free_tpmif(tpmif_t * tpmif)
-+{
-+      num_frontends--;
-+      list_del(&tpmif->tpmif_list);
-+      free_empty_pages_and_pagevec(tpmif->mmap_pages, TPMIF_TX_RING_SIZE);
-+      kmem_cache_free(tpmif_cachep, tpmif);
-+}
-+
-+tpmif_t *tpmif_find(domid_t domid, struct backend_info *bi)
-+{
-+      tpmif_t *tpmif;
-+
-+      list_for_each_entry(tpmif, &tpmif_list, tpmif_list) {
-+              if (tpmif->bi == bi) {
-+                      if (tpmif->domid == domid) {
-+                              tpmif_get(tpmif);
-+                              return tpmif;
-+                      } else {
-+                              return ERR_PTR(-EEXIST);
-+                      }
-+              }
-+      }
-+
-+      return alloc_tpmif(domid, bi);
-+}
-+
-+static int map_frontend_page(tpmif_t *tpmif, unsigned long shared_page)
-+{
-+      struct gnttab_map_grant_ref op;
-+
-+      gnttab_set_map_op(&op, (unsigned long)tpmif->tx_area->addr,
-+                        GNTMAP_host_map, shared_page, tpmif->domid);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status) {
-+              DPRINTK(" Grant table operation failure !\n");
-+              return op.status;
-+      }
-+
-+      tpmif->shmem_ref = shared_page;
-+      tpmif->shmem_handle = op.handle;
-+
-+      return 0;
-+}
-+
-+static void unmap_frontend_page(tpmif_t *tpmif)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)tpmif->tx_area->addr,
-+                          GNTMAP_host_map, tpmif->shmem_handle);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+}
-+
-+int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn)
-+{
-+      int err;
-+
-+      if (tpmif->irq)
-+              return 0;
-+
-+      if ((tpmif->tx_area = alloc_vm_area(PAGE_SIZE)) == NULL)
-+              return -ENOMEM;
-+
-+      err = map_frontend_page(tpmif, shared_page);
-+      if (err) {
-+              free_vm_area(tpmif->tx_area);
-+              return err;
-+      }
-+
-+      tpmif->tx = (tpmif_tx_interface_t *)tpmif->tx_area->addr;
-+      memset(tpmif->tx, 0, PAGE_SIZE);
-+
-+      err = bind_interdomain_evtchn_to_irqhandler(
-+              tpmif->domid, evtchn, tpmif_be_int, 0, tpmif->devname, tpmif);
-+      if (err < 0) {
-+              unmap_frontend_page(tpmif);
-+              free_vm_area(tpmif->tx_area);
-+              return err;
-+      }
-+      tpmif->irq = err;
-+
-+      tpmif->shmem_ref = shared_page;
-+      tpmif->active = 1;
-+
-+      return 0;
-+}
-+
-+void tpmif_disconnect_complete(tpmif_t *tpmif)
-+{
-+      if (tpmif->irq)
-+              unbind_from_irqhandler(tpmif->irq, tpmif);
-+
-+      if (tpmif->tx) {
-+              unmap_frontend_page(tpmif);
-+              free_vm_area(tpmif->tx_area);
-+      }
-+
-+      free_tpmif(tpmif);
-+}
-+
-+void __init tpmif_interface_init(void)
-+{
-+      tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t),
-+                                       0, 0, NULL, NULL);
-+}
-+
-+void __exit tpmif_interface_exit(void)
-+{
-+      kmem_cache_destroy(tpmif_cachep);
-+}
-Index: head-2008-11-25/drivers/xen/tpmback/tpmback.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/tpmback/tpmback.c      2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,944 @@
-+/******************************************************************************
-+ * drivers/xen/tpmback/tpmback.c
-+ *
-+ * Copyright (c) 2005, IBM Corporation
-+ *
-+ * Author: Stefan Berger, stefanb@us.ibm.com
-+ * Grant table support: Mahadevan Gomathisankaran
-+ *
-+ * This code has been derived from drivers/xen/netback/netback.c
-+ * Copyright (c) 2002-2004, K A Fraser
-+ *
-+ */
-+
-+#include "common.h"
-+#include <xen/evtchn.h>
-+
-+#include <linux/types.h>
-+#include <linux/list.h>
-+#include <linux/miscdevice.h>
-+#include <linux/poll.h>
-+#include <asm/uaccess.h>
-+#include <xen/xenbus.h>
-+#include <xen/interface/grant_table.h>
-+#include <xen/gnttab.h>
-+
-+/* local data structures */
-+struct data_exchange {
-+      struct list_head pending_pak;
-+      struct list_head current_pak;
-+      unsigned int copied_so_far;
-+      u8 has_opener:1;
-+      u8 aborted:1;
-+      rwlock_t pak_lock;      // protects all of the previous fields
-+      wait_queue_head_t wait_queue;
-+};
-+
-+struct vtpm_resp_hdr {
-+      uint32_t instance_no;
-+      uint16_t tag_no;
-+      uint32_t len_no;
-+      uint32_t ordinal_no;
-+} __attribute__ ((packed));
-+
-+struct packet {
-+      struct list_head next;
-+      unsigned int data_len;
-+      u8 *data_buffer;
-+      tpmif_t *tpmif;
-+      u32 tpm_instance;
-+      u8 req_tag;
-+      u32 last_read;
-+      u8 flags;
-+      struct timer_list processing_timer;
-+};
-+
-+enum {
-+      PACKET_FLAG_DISCARD_RESPONSE = 1,
-+};
-+
-+/* local variables */
-+static struct data_exchange dataex;
-+
-+/* local function prototypes */
-+static int _packet_write(struct packet *pak,
-+                       const char *data, size_t size, int userbuffer);
-+static void processing_timeout(unsigned long ptr);
-+static int packet_read_shmem(struct packet *pak,
-+                           tpmif_t * tpmif,
-+                           u32 offset,
-+                           char *buffer, int isuserbuffer, u32 left);
-+static int vtpm_queue_packet(struct packet *pak);
-+
-+/***************************************************************
-+ Buffer copying fo user and kernel space buffes.
-+***************************************************************/
-+static inline int copy_from_buffer(void *to,
-+                                 const void *from, unsigned long size,
-+                                 int isuserbuffer)
-+{
-+      if (isuserbuffer) {
-+              if (copy_from_user(to, (void __user *)from, size))
-+                      return -EFAULT;
-+      } else {
-+              memcpy(to, from, size);
-+      }
-+      return 0;
-+}
-+
-+static inline int copy_to_buffer(void *to,
-+                               const void *from, unsigned long size,
-+                               int isuserbuffer)
-+{
-+      if (isuserbuffer) {
-+              if (copy_to_user((void __user *)to, from, size))
-+                      return -EFAULT;
-+      } else {
-+              memcpy(to, from, size);
-+      }
-+      return 0;
-+}
-+
-+
-+static void dataex_init(struct data_exchange *dataex)
-+{
-+      INIT_LIST_HEAD(&dataex->pending_pak);
-+      INIT_LIST_HEAD(&dataex->current_pak);
-+      dataex->has_opener = 0;
-+      rwlock_init(&dataex->pak_lock);
-+      init_waitqueue_head(&dataex->wait_queue);
-+}
-+
-+/***************************************************************
-+ Packet-related functions
-+***************************************************************/
-+
-+static struct packet *packet_find_instance(struct list_head *head,
-+                                         u32 tpm_instance)
-+{
-+      struct packet *pak;
-+      struct list_head *p;
-+
-+      /*
-+       * traverse the list of packets and return the first
-+       * one with the given instance number
-+       */
-+      list_for_each(p, head) {
-+              pak = list_entry(p, struct packet, next);
-+
-+              if (pak->tpm_instance == tpm_instance) {
-+                      return pak;
-+              }
-+      }
-+      return NULL;
-+}
-+
-+static struct packet *packet_find_packet(struct list_head *head, void *packet)
-+{
-+      struct packet *pak;
-+      struct list_head *p;
-+
-+      /*
-+       * traverse the list of packets and return the first
-+       * one with the given instance number
-+       */
-+      list_for_each(p, head) {
-+              pak = list_entry(p, struct packet, next);
-+
-+              if (pak == packet) {
-+                      return pak;
-+              }
-+      }
-+      return NULL;
-+}
-+
-+static struct packet *packet_alloc(tpmif_t * tpmif,
-+                                 u32 size, u8 req_tag, u8 flags)
-+{
-+      struct packet *pak = NULL;
-+      pak = kzalloc(sizeof (struct packet), GFP_ATOMIC);
-+      if (NULL != pak) {
-+              if (tpmif) {
-+                      pak->tpmif = tpmif;
-+                      pak->tpm_instance = tpmback_get_instance(tpmif->bi);
-+                      tpmif_get(tpmif);
-+              }
-+              pak->data_len = size;
-+              pak->req_tag = req_tag;
-+              pak->last_read = 0;
-+              pak->flags = flags;
-+
-+              /*
-+               * cannot do tpmif_get(tpmif); bad things happen
-+               * on the last tpmif_put()
-+               */
-+              init_timer(&pak->processing_timer);
-+              pak->processing_timer.function = processing_timeout;
-+              pak->processing_timer.data = (unsigned long)pak;
-+      }
-+      return pak;
-+}
-+
-+static void inline packet_reset(struct packet *pak)
-+{
-+      pak->last_read = 0;
-+}
-+
-+static void packet_free(struct packet *pak)
-+{
-+      if (timer_pending(&pak->processing_timer)) {
-+              BUG();
-+      }
-+
-+      if (pak->tpmif)
-+              tpmif_put(pak->tpmif);
-+      kfree(pak->data_buffer);
-+      /*
-+       * cannot do tpmif_put(pak->tpmif); bad things happen
-+       * on the last tpmif_put()
-+       */
-+      kfree(pak);
-+}
-+
-+
-+/*
-+ * Write data to the shared memory and send it to the FE.
-+ */
-+static int packet_write(struct packet *pak,
-+                      const char *data, size_t size, int isuserbuffer)
-+{
-+      int rc = 0;
-+
-+      if (0 != (pak->flags & PACKET_FLAG_DISCARD_RESPONSE)) {
-+              /* Don't send a respone to this packet. Just acknowledge it. */
-+              rc = size;
-+      } else {
-+              rc = _packet_write(pak, data, size, isuserbuffer);
-+      }
-+
-+      return rc;
-+}
-+
-+int _packet_write(struct packet *pak,
-+                const char *data, size_t size, int isuserbuffer)
-+{
-+      /*
-+       * Write into the shared memory pages directly
-+       * and send it to the front end.
-+       */
-+      tpmif_t *tpmif = pak->tpmif;
-+      grant_handle_t handle;
-+      int rc = 0;
-+      unsigned int i = 0;
-+      unsigned int offset = 0;
-+
-+      if (tpmif == NULL) {
-+              return -EFAULT;
-+      }
-+
-+      if (tpmif->status == DISCONNECTED) {
-+              return size;
-+      }
-+
-+      while (offset < size && i < TPMIF_TX_RING_SIZE) {
-+              unsigned int tocopy;
-+              struct gnttab_map_grant_ref map_op;
-+              struct gnttab_unmap_grant_ref unmap_op;
-+              tpmif_tx_request_t *tx;
-+
-+              tx = &tpmif->tx->ring[i].req;
-+
-+              if (0 == tx->addr) {
-+                      DPRINTK("ERROR: Buffer for outgoing packet NULL?! i=%d\n", i);
-+                      return 0;
-+              }
-+
-+              gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
-+                                GNTMAP_host_map, tx->ref, tpmif->domid);
-+
-+              if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-+                                                     &map_op, 1))) {
-+                      BUG();
-+              }
-+
-+              handle = map_op.handle;
-+
-+              if (map_op.status) {
-+                      DPRINTK(" Grant table operation failure !\n");
-+                      return 0;
-+              }
-+
-+              tocopy = min_t(size_t, size - offset, PAGE_SIZE);
-+
-+              if (copy_from_buffer((void *)(idx_to_kaddr(tpmif, i) |
-+                                            (tx->addr & ~PAGE_MASK)),
-+                                   &data[offset], tocopy, isuserbuffer)) {
-+                      tpmif_put(tpmif);
-+                      return -EFAULT;
-+              }
-+              tx->size = tocopy;
-+
-+              gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
-+                                  GNTMAP_host_map, handle);
-+
-+              if (unlikely
-+                  (HYPERVISOR_grant_table_op
-+                   (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) {
-+                      BUG();
-+              }
-+
-+              offset += tocopy;
-+              i++;
-+      }
-+
-+      rc = offset;
-+      DPRINTK("Notifying frontend via irq %d\n", tpmif->irq);
-+      notify_remote_via_irq(tpmif->irq);
-+
-+      return rc;
-+}
-+
-+/*
-+ * Read data from the shared memory and copy it directly into the
-+ * provided buffer. Advance the read_last indicator which tells
-+ * how many bytes have already been read.
-+ */
-+static int packet_read(struct packet *pak, size_t numbytes,
-+                     char *buffer, size_t buffersize, int isuserbuffer)
-+{
-+      tpmif_t *tpmif = pak->tpmif;
-+
-+      /*
-+       * Read 'numbytes' of data from the buffer. The first 4
-+       * bytes are the instance number in network byte order,
-+       * after that come the data from the shared memory buffer.
-+       */
-+      u32 to_copy;
-+      u32 offset = 0;
-+      u32 room_left = buffersize;
-+
-+      if (pak->last_read < 4) {
-+              /*
-+               * copy the instance number into the buffer
-+               */
-+              u32 instance_no = htonl(pak->tpm_instance);
-+              u32 last_read = pak->last_read;
-+
-+              to_copy = min_t(size_t, 4 - last_read, numbytes);
-+
-+              if (copy_to_buffer(&buffer[0],
-+                                 &(((u8 *) & instance_no)[last_read]),
-+                                 to_copy, isuserbuffer)) {
-+                      return -EFAULT;
-+              }
-+
-+              pak->last_read += to_copy;
-+              offset += to_copy;
-+              room_left -= to_copy;
-+      }
-+
-+      /*
-+       * If the packet has a data buffer appended, read from it...
-+       */
-+
-+      if (room_left > 0) {
-+              if (pak->data_buffer) {
-+                      u32 to_copy = min_t(u32, pak->data_len - offset, room_left);
-+                      u32 last_read = pak->last_read - 4;
-+
-+                      if (copy_to_buffer(&buffer[offset],
-+                                         &pak->data_buffer[last_read],
-+                                         to_copy, isuserbuffer)) {
-+                              return -EFAULT;
-+                      }
-+                      pak->last_read += to_copy;
-+                      offset += to_copy;
-+              } else {
-+                      offset = packet_read_shmem(pak,
-+                                                 tpmif,
-+                                                 offset,
-+                                                 buffer,
-+                                                 isuserbuffer, room_left);
-+              }
-+      }
-+      return offset;
-+}
-+
-+static int packet_read_shmem(struct packet *pak,
-+                           tpmif_t * tpmif,
-+                           u32 offset, char *buffer, int isuserbuffer,
-+                           u32 room_left)
-+{
-+      u32 last_read = pak->last_read - 4;
-+      u32 i = (last_read / PAGE_SIZE);
-+      u32 pg_offset = last_read & (PAGE_SIZE - 1);
-+      u32 to_copy;
-+      grant_handle_t handle;
-+
-+      tpmif_tx_request_t *tx;
-+
-+      tx = &tpmif->tx->ring[0].req;
-+      /*
-+       * Start copying data at the page with index 'index'
-+       * and within that page at offset 'offset'.
-+       * Copy a maximum of 'room_left' bytes.
-+       */
-+      to_copy = min_t(u32, PAGE_SIZE - pg_offset, room_left);
-+      while (to_copy > 0) {
-+              void *src;
-+              struct gnttab_map_grant_ref map_op;
-+              struct gnttab_unmap_grant_ref unmap_op;
-+
-+              tx = &tpmif->tx->ring[i].req;
-+
-+              gnttab_set_map_op(&map_op, idx_to_kaddr(tpmif, i),
-+                                GNTMAP_host_map, tx->ref, tpmif->domid);
-+
-+              if (unlikely(HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref,
-+                                                     &map_op, 1))) {
-+                      BUG();
-+              }
-+
-+              if (map_op.status) {
-+                      DPRINTK(" Grant table operation failure !\n");
-+                      return -EFAULT;
-+              }
-+
-+              handle = map_op.handle;
-+
-+              if (to_copy > tx->size) {
-+                      /*
-+                       * User requests more than what's available
-+                       */
-+                      to_copy = min_t(u32, tx->size, to_copy);
-+              }
-+
-+              DPRINTK("Copying from mapped memory at %08lx\n",
-+                      (unsigned long)(idx_to_kaddr(tpmif, i) |
-+                                      (tx->addr & ~PAGE_MASK)));
-+
-+              src = (void *)(idx_to_kaddr(tpmif, i) |
-+                             ((tx->addr & ~PAGE_MASK) + pg_offset));
-+              if (copy_to_buffer(&buffer[offset],
-+                                 src, to_copy, isuserbuffer)) {
-+                      return -EFAULT;
-+              }
-+
-+              DPRINTK("Data from TPM-FE of domain %d are %d %d %d %d\n",
-+                      tpmif->domid, buffer[offset], buffer[offset + 1],
-+                      buffer[offset + 2], buffer[offset + 3]);
-+
-+              gnttab_set_unmap_op(&unmap_op, idx_to_kaddr(tpmif, i),
-+                                  GNTMAP_host_map, handle);
-+
-+              if (unlikely
-+                  (HYPERVISOR_grant_table_op
-+                   (GNTTABOP_unmap_grant_ref, &unmap_op, 1))) {
-+                      BUG();
-+              }
-+
-+              offset += to_copy;
-+              pg_offset = 0;
-+              last_read += to_copy;
-+              room_left -= to_copy;
-+
-+              to_copy = min_t(u32, PAGE_SIZE, room_left);
-+              i++;
-+      }                       /* while (to_copy > 0) */
-+      /*
-+       * Adjust the last_read pointer
-+       */
-+      pak->last_read = last_read + 4;
-+      return offset;
-+}
-+
-+/* ============================================================
-+ * The file layer for reading data from this device
-+ * ============================================================
-+ */
-+static int vtpm_op_open(struct inode *inode, struct file *f)
-+{
-+      int rc = 0;
-+      unsigned long flags;
-+
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+      if (dataex.has_opener == 0) {
-+              dataex.has_opener = 1;
-+      } else {
-+              rc = -EPERM;
-+      }
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+      return rc;
-+}
-+
-+static ssize_t vtpm_op_read(struct file *file,
-+                          char __user * data, size_t size, loff_t * offset)
-+{
-+      int ret_size = -ENODATA;
-+      struct packet *pak = NULL;
-+      unsigned long flags;
-+
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+      if (dataex.aborted) {
-+              dataex.aborted = 0;
-+              dataex.copied_so_far = 0;
-+              write_unlock_irqrestore(&dataex.pak_lock, flags);
-+              return -EIO;
-+      }
-+
-+      if (list_empty(&dataex.pending_pak)) {
-+              write_unlock_irqrestore(&dataex.pak_lock, flags);
-+              wait_event_interruptible(dataex.wait_queue,
-+                                       !list_empty(&dataex.pending_pak));
-+              write_lock_irqsave(&dataex.pak_lock, flags);
-+              dataex.copied_so_far = 0;
-+      }
-+
-+      if (!list_empty(&dataex.pending_pak)) {
-+              unsigned int left;
-+
-+              pak = list_entry(dataex.pending_pak.next, struct packet, next);
-+              left = pak->data_len - dataex.copied_so_far;
-+              list_del(&pak->next);
-+              write_unlock_irqrestore(&dataex.pak_lock, flags);
-+
-+              DPRINTK("size given by app: %d, available: %d\n", size, left);
-+
-+              ret_size = min_t(size_t, size, left);
-+
-+              ret_size = packet_read(pak, ret_size, data, size, 1);
-+
-+              write_lock_irqsave(&dataex.pak_lock, flags);
-+
-+              if (ret_size < 0) {
-+                      del_singleshot_timer_sync(&pak->processing_timer);
-+                      packet_free(pak);
-+                      dataex.copied_so_far = 0;
-+              } else {
-+                      DPRINTK("Copied %d bytes to user buffer\n", ret_size);
-+
-+                      dataex.copied_so_far += ret_size;
-+                      if (dataex.copied_so_far >= pak->data_len + 4) {
-+                              DPRINTK("All data from this packet given to app.\n");
-+                              /* All data given to app */
-+
-+                              del_singleshot_timer_sync(&pak->
-+                                                        processing_timer);
-+                              list_add_tail(&pak->next, &dataex.current_pak);
-+                              /*
-+                               * The more fontends that are handled at the same time,
-+                               * the more time we give the TPM to process the request.
-+                               */
-+                              mod_timer(&pak->processing_timer,
-+                                        jiffies + (num_frontends * 60 * HZ));
-+                              dataex.copied_so_far = 0;
-+                      } else {
-+                              list_add(&pak->next, &dataex.pending_pak);
-+                      }
-+              }
-+      }
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+
-+      DPRINTK("Returning result from read to app: %d\n", ret_size);
-+
-+      return ret_size;
-+}
-+
-+/*
-+ * Write operation - only works after a previous read operation!
-+ */
-+static ssize_t vtpm_op_write(struct file *file,
-+                           const char __user * data, size_t size,
-+                           loff_t * offset)
-+{
-+      struct packet *pak;
-+      int rc = 0;
-+      unsigned int off = 4;
-+      unsigned long flags;
-+      struct vtpm_resp_hdr vrh;
-+
-+      /*
-+       * Minimum required packet size is:
-+       * 4 bytes for instance number
-+       * 2 bytes for tag
-+       * 4 bytes for paramSize
-+       * 4 bytes for the ordinal
-+       * sum: 14 bytes
-+       */
-+      if (size < sizeof (vrh))
-+              return -EFAULT;
-+
-+      if (copy_from_user(&vrh, data, sizeof (vrh)))
-+              return -EFAULT;
-+
-+      /* malformed packet? */
-+      if ((off + ntohl(vrh.len_no)) != size)
-+              return -EFAULT;
-+
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+      pak = packet_find_instance(&dataex.current_pak,
-+                                 ntohl(vrh.instance_no));
-+
-+      if (pak == NULL) {
-+              write_unlock_irqrestore(&dataex.pak_lock, flags);
-+              DPRINTK(KERN_ALERT "No associated packet! (inst=%d)\n",
-+                      ntohl(vrh.instance_no));
-+              return -EFAULT;
-+      }
-+
-+      del_singleshot_timer_sync(&pak->processing_timer);
-+      list_del(&pak->next);
-+
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+
-+      /*
-+       * The first 'offset' bytes must be the instance number - skip them.
-+       */
-+      size -= off;
-+
-+      rc = packet_write(pak, &data[off], size, 1);
-+
-+      if (rc > 0) {
-+              /* I neglected the first 4 bytes */
-+              rc += off;
-+      }
-+      packet_free(pak);
-+      return rc;
-+}
-+
-+static int vtpm_op_release(struct inode *inode, struct file *file)
-+{
-+      unsigned long flags;
-+
-+      vtpm_release_packets(NULL, 1);
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+      dataex.has_opener = 0;
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+      return 0;
-+}
-+
-+static unsigned int vtpm_op_poll(struct file *file,
-+                               struct poll_table_struct *pts)
-+{
-+      unsigned int flags = POLLOUT | POLLWRNORM;
-+
-+      poll_wait(file, &dataex.wait_queue, pts);
-+      if (!list_empty(&dataex.pending_pak)) {
-+              flags |= POLLIN | POLLRDNORM;
-+      }
-+      return flags;
-+}
-+
-+static const struct file_operations vtpm_ops = {
-+      .owner = THIS_MODULE,
-+      .llseek = no_llseek,
-+      .open = vtpm_op_open,
-+      .read = vtpm_op_read,
-+      .write = vtpm_op_write,
-+      .release = vtpm_op_release,
-+      .poll = vtpm_op_poll,
-+};
-+
-+static struct miscdevice vtpms_miscdevice = {
-+      .minor = 225,
-+      .name = "vtpm",
-+      .fops = &vtpm_ops,
-+};
-+
-+/***************************************************************
-+ Utility functions
-+***************************************************************/
-+
-+static int tpm_send_fail_message(struct packet *pak, u8 req_tag)
-+{
-+      int rc;
-+      static const unsigned char tpm_error_message_fail[] = {
-+              0x00, 0x00,
-+              0x00, 0x00, 0x00, 0x0a,
-+              0x00, 0x00, 0x00, 0x09  /* TPM_FAIL */
-+      };
-+      unsigned char buffer[sizeof (tpm_error_message_fail)];
-+
-+      memcpy(buffer, tpm_error_message_fail,
-+             sizeof (tpm_error_message_fail));
-+      /*
-+       * Insert the right response tag depending on the given tag
-+       * All response tags are '+3' to the request tag.
-+       */
-+      buffer[1] = req_tag + 3;
-+
-+      /*
-+       * Write the data to shared memory and notify the front-end
-+       */
-+      rc = packet_write(pak, buffer, sizeof (buffer), 0);
-+
-+      return rc;
-+}
-+
-+static int _vtpm_release_packets(struct list_head *head,
-+                               tpmif_t * tpmif, int send_msgs)
-+{
-+      int aborted = 0;
-+      int c = 0;
-+      struct packet *pak;
-+      struct list_head *pos, *tmp;
-+
-+      list_for_each_safe(pos, tmp, head) {
-+              pak = list_entry(pos, struct packet, next);
-+              c += 1;
-+
-+              if (tpmif == NULL || pak->tpmif == tpmif) {
-+                      int can_send = 0;
-+
-+                      del_singleshot_timer_sync(&pak->processing_timer);
-+                      list_del(&pak->next);
-+
-+                      if (pak->tpmif && pak->tpmif->status == CONNECTED) {
-+                              can_send = 1;
-+                      }
-+
-+                      if (send_msgs && can_send) {
-+                              tpm_send_fail_message(pak, pak->req_tag);
-+                      }
-+                      packet_free(pak);
-+                      if (c == 1)
-+                              aborted = 1;
-+              }
-+      }
-+      return aborted;
-+}
-+
-+int vtpm_release_packets(tpmif_t * tpmif, int send_msgs)
-+{
-+      unsigned long flags;
-+
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+
-+      dataex.aborted = _vtpm_release_packets(&dataex.pending_pak,
-+                                             tpmif,
-+                                             send_msgs);
-+      _vtpm_release_packets(&dataex.current_pak, tpmif, send_msgs);
-+
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+      return 0;
-+}
-+
-+static int vtpm_queue_packet(struct packet *pak)
-+{
-+      int rc = 0;
-+
-+      if (dataex.has_opener) {
-+              unsigned long flags;
-+
-+              write_lock_irqsave(&dataex.pak_lock, flags);
-+              list_add_tail(&pak->next, &dataex.pending_pak);
-+              /* give the TPM some time to pick up the request */
-+              mod_timer(&pak->processing_timer, jiffies + (30 * HZ));
-+              write_unlock_irqrestore(&dataex.pak_lock, flags);
-+
-+              wake_up_interruptible(&dataex.wait_queue);
-+      } else {
-+              rc = -EFAULT;
-+      }
-+      return rc;
-+}
-+
-+static int vtpm_receive(tpmif_t * tpmif, u32 size)
-+{
-+      int rc = 0;
-+      unsigned char buffer[10];
-+      __be32 *native_size;
-+      struct packet *pak = packet_alloc(tpmif, size, 0, 0);
-+
-+      if (!pak)
-+              return -ENOMEM;
-+      /*
-+       * Read 10 bytes from the received buffer to test its
-+       * content for validity.
-+       */
-+      if (sizeof (buffer) != packet_read(pak,
-+                                         sizeof (buffer), buffer,
-+                                         sizeof (buffer), 0)) {
-+              goto failexit;
-+      }
-+      /*
-+       * Reset the packet read pointer so we can read all its
-+       * contents again.
-+       */
-+      packet_reset(pak);
-+
-+      native_size = (__force __be32 *) (&buffer[4 + 2]);
-+      /*
-+       * Verify that the size of the packet is correct
-+       * as indicated and that there's actually someone reading packets.
-+       * The minimum size of the packet is '10' for tag, size indicator
-+       * and ordinal.
-+       */
-+      if (size < 10 ||
-+          be32_to_cpu(*native_size) != size ||
-+          0 == dataex.has_opener || tpmif->status != CONNECTED) {
-+              rc = -EINVAL;
-+              goto failexit;
-+      } else {
-+              rc = vtpm_queue_packet(pak);
-+              if (rc < 0)
-+                      goto failexit;
-+      }
-+      return 0;
-+
-+      failexit:
-+      if (pak) {
-+              tpm_send_fail_message(pak, buffer[4 + 1]);
-+              packet_free(pak);
-+      }
-+      return rc;
-+}
-+
-+/*
-+ * Timeout function that gets invoked when a packet has not been processed
-+ * during the timeout period.
-+ * The packet must be on a list when this function is invoked. This
-+ * also means that once its taken off a list, the timer must be
-+ * destroyed as well.
-+ */
-+static void processing_timeout(unsigned long ptr)
-+{
-+      struct packet *pak = (struct packet *)ptr;
-+      unsigned long flags;
-+
-+      write_lock_irqsave(&dataex.pak_lock, flags);
-+      /*
-+       * The packet needs to be searched whether it
-+       * is still on the list.
-+       */
-+      if (pak == packet_find_packet(&dataex.pending_pak, pak) ||
-+          pak == packet_find_packet(&dataex.current_pak, pak)) {
-+              if ((pak->flags & PACKET_FLAG_DISCARD_RESPONSE) == 0) {
-+                      tpm_send_fail_message(pak, pak->req_tag);
-+              }
-+              /* discard future responses */
-+              pak->flags |= PACKET_FLAG_DISCARD_RESPONSE;
-+      }
-+
-+      write_unlock_irqrestore(&dataex.pak_lock, flags);
-+}
-+
-+static void tpm_tx_action(unsigned long unused);
-+static DECLARE_TASKLET(tpm_tx_tasklet, tpm_tx_action, 0);
-+
-+static struct list_head tpm_schedule_list;
-+static spinlock_t tpm_schedule_list_lock;
-+
-+static inline void maybe_schedule_tx_action(void)
-+{
-+      smp_mb();
-+      tasklet_schedule(&tpm_tx_tasklet);
-+}
-+
-+static inline int __on_tpm_schedule_list(tpmif_t * tpmif)
-+{
-+      return tpmif->list.next != NULL;
-+}
-+
-+static void remove_from_tpm_schedule_list(tpmif_t * tpmif)
-+{
-+      spin_lock_irq(&tpm_schedule_list_lock);
-+      if (likely(__on_tpm_schedule_list(tpmif))) {
-+              list_del(&tpmif->list);
-+              tpmif->list.next = NULL;
-+              tpmif_put(tpmif);
-+      }
-+      spin_unlock_irq(&tpm_schedule_list_lock);
-+}
-+
-+static void add_to_tpm_schedule_list_tail(tpmif_t * tpmif)
-+{
-+      if (__on_tpm_schedule_list(tpmif))
-+              return;
-+
-+      spin_lock_irq(&tpm_schedule_list_lock);
-+      if (!__on_tpm_schedule_list(tpmif) && tpmif->active) {
-+              list_add_tail(&tpmif->list, &tpm_schedule_list);
-+              tpmif_get(tpmif);
-+      }
-+      spin_unlock_irq(&tpm_schedule_list_lock);
-+}
-+
-+void tpmif_schedule_work(tpmif_t * tpmif)
-+{
-+      add_to_tpm_schedule_list_tail(tpmif);
-+      maybe_schedule_tx_action();
-+}
-+
-+void tpmif_deschedule_work(tpmif_t * tpmif)
-+{
-+      remove_from_tpm_schedule_list(tpmif);
-+}
-+
-+static void tpm_tx_action(unsigned long unused)
-+{
-+      struct list_head *ent;
-+      tpmif_t *tpmif;
-+      tpmif_tx_request_t *tx;
-+
-+      DPRINTK("%s: Getting data from front-end(s)!\n", __FUNCTION__);
-+
-+      while (!list_empty(&tpm_schedule_list)) {
-+              /* Get a tpmif from the list with work to do. */
-+              ent = tpm_schedule_list.next;
-+              tpmif = list_entry(ent, tpmif_t, list);
-+              tpmif_get(tpmif);
-+              remove_from_tpm_schedule_list(tpmif);
-+
-+              tx = &tpmif->tx->ring[0].req;
-+
-+              /* pass it up */
-+              vtpm_receive(tpmif, tx->size);
-+
-+              tpmif_put(tpmif);
-+      }
-+}
-+
-+irqreturn_t tpmif_be_int(int irq, void *dev_id, struct pt_regs *regs)
-+{
-+      tpmif_t *tpmif = (tpmif_t *) dev_id;
-+
-+      add_to_tpm_schedule_list_tail(tpmif);
-+      maybe_schedule_tx_action();
-+      return IRQ_HANDLED;
-+}
-+
-+static int __init tpmback_init(void)
-+{
-+      int rc;
-+
-+      if ((rc = misc_register(&vtpms_miscdevice)) != 0) {
-+              printk(KERN_ALERT
-+                     "Could not register misc device for TPM BE.\n");
-+              return rc;
-+      }
-+
-+      dataex_init(&dataex);
-+
-+      spin_lock_init(&tpm_schedule_list_lock);
-+      INIT_LIST_HEAD(&tpm_schedule_list);
-+
-+      tpmif_interface_init();
-+      tpmif_xenbus_init();
-+
-+      printk(KERN_ALERT "Successfully initialized TPM backend driver.\n");
-+
-+      return 0;
-+}
-+
-+module_init(tpmback_init);
-+
-+void __exit tpmback_exit(void)
-+{
-+      vtpm_release_packets(NULL, 0);
-+      tpmif_xenbus_exit();
-+      tpmif_interface_exit();
-+      misc_deregister(&vtpms_miscdevice);
-+}
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/tpmback/xenbus.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/tpmback/xenbus.c       2008-03-06 08:54:32.000000000 +0100
-@@ -0,0 +1,289 @@
-+/*  Xenbus code for tpmif backend
-+    Copyright (C) 2005 IBM Corporation
-+    Copyright (C) 2005 Rusty Russell <rusty@rustcorp.com.au>
-+
-+    This program is free software; you can redistribute it and/or modify
-+    it under the terms of the GNU General Public License as published by
-+    the Free Software Foundation; either version 2 of the License, or
-+    (at your option) any later version.
-+
-+    This program is distributed in the hope that it will be useful,
-+    but WITHOUT ANY WARRANTY; without even the implied warranty of
-+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-+    GNU General Public License for more details.
-+
-+    You should have received a copy of the GNU General Public License
-+    along with this program; if not, write to the Free Software
-+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-+*/
-+#include <stdarg.h>
-+#include <linux/module.h>
-+#include <xen/xenbus.h>
-+#include "common.h"
-+
-+struct backend_info
-+{
-+      struct xenbus_device *dev;
-+
-+      /* our communications channel */
-+      tpmif_t *tpmif;
-+
-+      long int frontend_id;
-+      long int instance; // instance of TPM
-+      u8 is_instance_set;// whether instance number has been set
-+
-+      /* watch front end for changes */
-+      struct xenbus_watch backend_watch;
-+};
-+
-+static void maybe_connect(struct backend_info *be);
-+static void connect(struct backend_info *be);
-+static int connect_ring(struct backend_info *be);
-+static void backend_changed(struct xenbus_watch *watch,
-+                          const char **vec, unsigned int len);
-+static void frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state);
-+
-+long int tpmback_get_instance(struct backend_info *bi)
-+{
-+      long int res = -1;
-+      if (bi && bi->is_instance_set)
-+              res = bi->instance;
-+      return res;
-+}
-+
-+static int tpmback_remove(struct xenbus_device *dev)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+
-+      if (!be) return 0;
-+
-+      if (be->backend_watch.node) {
-+              unregister_xenbus_watch(&be->backend_watch);
-+              kfree(be->backend_watch.node);
-+              be->backend_watch.node = NULL;
-+      }
-+      if (be->tpmif) {
-+              be->tpmif->bi = NULL;
-+              vtpm_release_packets(be->tpmif, 0);
-+              tpmif_put(be->tpmif);
-+              be->tpmif = NULL;
-+      }
-+      kfree(be);
-+      dev->dev.driver_data = NULL;
-+      return 0;
-+}
-+
-+static int tpmback_probe(struct xenbus_device *dev,
-+                       const struct xenbus_device_id *id)
-+{
-+      int err;
-+      struct backend_info *be = kzalloc(sizeof(struct backend_info),
-+                                        GFP_KERNEL);
-+
-+      if (!be) {
-+              xenbus_dev_fatal(dev, -ENOMEM,
-+                               "allocating backend structure");
-+              return -ENOMEM;
-+      }
-+
-+      be->is_instance_set = 0;
-+      be->dev = dev;
-+      dev->dev.driver_data = be;
-+
-+      err = xenbus_watch_path2(dev, dev->nodename,
-+                               "instance", &be->backend_watch,
-+                               backend_changed);
-+      if (err) {
-+              goto fail;
-+      }
-+
-+      err = xenbus_switch_state(dev, XenbusStateInitWait);
-+      if (err) {
-+              goto fail;
-+      }
-+      return 0;
-+fail:
-+      tpmback_remove(dev);
-+      return err;
-+}
-+
-+
-+static void backend_changed(struct xenbus_watch *watch,
-+                          const char **vec, unsigned int len)
-+{
-+      int err;
-+      long instance;
-+      struct backend_info *be
-+              = container_of(watch, struct backend_info, backend_watch);
-+      struct xenbus_device *dev = be->dev;
-+
-+      err = xenbus_scanf(XBT_NIL, dev->nodename,
-+                         "instance","%li", &instance);
-+      if (XENBUS_EXIST_ERR(err)) {
-+              return;
-+      }
-+
-+      if (err != 1) {
-+              xenbus_dev_fatal(dev, err, "reading instance");
-+              return;
-+      }
-+
-+      if (be->is_instance_set == 0) {
-+              be->instance = instance;
-+              be->is_instance_set = 1;
-+      }
-+}
-+
-+
-+static void frontend_changed(struct xenbus_device *dev,
-+                           enum xenbus_state frontend_state)
-+{
-+      struct backend_info *be = dev->dev.driver_data;
-+      int err;
-+
-+      switch (frontend_state) {
-+      case XenbusStateInitialising:
-+      case XenbusStateInitialised:
-+              break;
-+
-+      case XenbusStateConnected:
-+              err = connect_ring(be);
-+              if (err) {
-+                      return;
-+              }
-+              maybe_connect(be);
-+              break;
-+
-+      case XenbusStateClosing:
-+              be->instance = -1;
-+              xenbus_switch_state(dev, XenbusStateClosing);
-+              break;
-+
-+      case XenbusStateUnknown: /* keep it here */
-+      case XenbusStateClosed:
-+              xenbus_switch_state(dev, XenbusStateClosed);
-+              device_unregister(&be->dev->dev);
-+              tpmback_remove(dev);
-+              break;
-+
-+      default:
-+              xenbus_dev_fatal(dev, -EINVAL,
-+                               "saw state %d at frontend",
-+                               frontend_state);
-+              break;
-+      }
-+}
-+
-+
-+
-+static void maybe_connect(struct backend_info *be)
-+{
-+      if (be->tpmif == NULL || be->tpmif->status == CONNECTED)
-+              return;
-+
-+      connect(be);
-+}
-+
-+
-+static void connect(struct backend_info *be)
-+{
-+      struct xenbus_transaction xbt;
-+      int err;
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long ready = 1;
-+
-+again:
-+      err = xenbus_transaction_start(&xbt);
-+      if (err) {
-+              xenbus_dev_fatal(be->dev, err, "starting transaction");
-+              return;
-+      }
-+
-+      err = xenbus_printf(xbt, be->dev->nodename,
-+                          "ready", "%lu", ready);
-+      if (err) {
-+              xenbus_dev_fatal(be->dev, err, "writing 'ready'");
-+              goto abort;
-+      }
-+
-+      err = xenbus_transaction_end(xbt, 0);
-+      if (err == -EAGAIN)
-+              goto again;
-+      if (err)
-+              xenbus_dev_fatal(be->dev, err, "end of transaction");
-+
-+      err = xenbus_switch_state(dev, XenbusStateConnected);
-+      if (!err)
-+              be->tpmif->status = CONNECTED;
-+      return;
-+abort:
-+      xenbus_transaction_end(xbt, 1);
-+}
-+
-+
-+static int connect_ring(struct backend_info *be)
-+{
-+      struct xenbus_device *dev = be->dev;
-+      unsigned long ring_ref;
-+      unsigned int evtchn;
-+      int err;
-+
-+      err = xenbus_gather(XBT_NIL, dev->otherend,
-+                          "ring-ref", "%lu", &ring_ref,
-+                          "event-channel", "%u", &evtchn, NULL);
-+      if (err) {
-+              xenbus_dev_error(dev, err,
-+                               "reading %s/ring-ref and event-channel",
-+                               dev->otherend);
-+              return err;
-+      }
-+
-+      if (!be->tpmif) {
-+              be->tpmif = tpmif_find(dev->otherend_id, be);
-+              if (IS_ERR(be->tpmif)) {
-+                      err = PTR_ERR(be->tpmif);
-+                      be->tpmif = NULL;
-+                      xenbus_dev_fatal(dev,err,"creating vtpm interface");
-+                      return err;
-+              }
-+      }
-+
-+      if (be->tpmif != NULL) {
-+              err = tpmif_map(be->tpmif, ring_ref, evtchn);
-+              if (err) {
-+                      xenbus_dev_error(dev, err,
-+                                       "mapping shared-frame %lu port %u",
-+                                       ring_ref, evtchn);
-+                      return err;
-+              }
-+      }
-+      return 0;
-+}
-+
-+
-+static const struct xenbus_device_id tpmback_ids[] = {
-+      { "vtpm" },
-+      { "" }
-+};
-+
-+
-+static struct xenbus_driver tpmback = {
-+      .name = "vtpm",
-+      .owner = THIS_MODULE,
-+      .ids = tpmback_ids,
-+      .probe = tpmback_probe,
-+      .remove = tpmback_remove,
-+      .otherend_changed = frontend_changed,
-+};
-+
-+
-+void tpmif_xenbus_init(void)
-+{
-+      xenbus_register_backend(&tpmback);
-+}
-+
-+void tpmif_xenbus_exit(void)
-+{
-+      xenbus_unregister_driver(&tpmback);
-+}
-Index: head-2008-11-25/drivers/xen/util.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/util.c 2007-07-10 09:42:30.000000000 +0200
-@@ -0,0 +1,65 @@
-+#include <linux/mm.h>
-+#include <linux/module.h>
-+#include <linux/slab.h>
-+#include <linux/vmalloc.h>
-+#include <asm/uaccess.h>
-+#include <xen/driver_util.h>
-+
-+struct class *get_xen_class(void)
-+{
-+      static struct class *xen_class;
-+
-+      if (xen_class)
-+              return xen_class;
-+
-+      xen_class = class_create(THIS_MODULE, "xen");
-+      if (IS_ERR(xen_class)) {
-+              printk("Failed to create xen sysfs class.\n");
-+              xen_class = NULL;
-+      }
-+
-+      return xen_class;
-+}
-+EXPORT_SYMBOL_GPL(get_xen_class);
-+
-+#ifdef CONFIG_X86
-+static int f(pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
-+{
-+      /* apply_to_page_range() does all the hard work. */
-+      return 0;
-+}
-+
-+struct vm_struct *alloc_vm_area(unsigned long size)
-+{
-+      struct vm_struct *area;
-+
-+      area = get_vm_area(size, VM_IOREMAP);
-+      if (area == NULL)
-+              return NULL;
-+
-+      /*
-+       * This ensures that page tables are constructed for this region
-+       * of kernel virtual address space and mapped into init_mm.
-+       */
-+      if (apply_to_page_range(&init_mm, (unsigned long)area->addr,
-+                              area->size, f, NULL)) {
-+              free_vm_area(area);
-+              return NULL;
-+      }
-+
-+      /* Map page directories into every address space. */
-+      vmalloc_sync_all();
-+
-+      return area;
-+}
-+EXPORT_SYMBOL_GPL(alloc_vm_area);
-+
-+void free_vm_area(struct vm_struct *area)
-+{
-+      struct vm_struct *ret;
-+      ret = remove_vm_area(area->addr);
-+      BUG_ON(ret != area);
-+      kfree(area);
-+}
-+EXPORT_SYMBOL_GPL(free_vm_area);
-+#endif /* CONFIG_X86 */
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_backend_client.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_backend_client.c 2007-06-12 13:13:45.000000000 +0200
-@@ -0,0 +1,147 @@
-+/******************************************************************************
-+ * Backend-client-facing interface for the Xenbus driver.  In other words, the
-+ * interface between the Xenbus and the device-specific code in the backend
-+ * driver.
-+ *
-+ * Copyright (C) 2005-2006 XenSource Ltd
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/err.h>
-+#include <xen/gnttab.h>
-+#include <xen/xenbus.h>
-+#include <xen/driver_util.h>
-+
-+/* Based on Rusty Russell's skeleton driver's map_page */
-+struct vm_struct *xenbus_map_ring_valloc(struct xenbus_device *dev, int gnt_ref)
-+{
-+      struct gnttab_map_grant_ref op;
-+      struct vm_struct *area;
-+
-+      area = alloc_vm_area(PAGE_SIZE);
-+      if (!area)
-+              return ERR_PTR(-ENOMEM);
-+
-+      gnttab_set_map_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
-+                        gnt_ref, dev->otherend_id);
-+      
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status != GNTST_okay) {
-+              free_vm_area(area);
-+              xenbus_dev_fatal(dev, op.status,
-+                               "mapping in shared page %d from domain %d",
-+                               gnt_ref, dev->otherend_id);
-+              BUG_ON(!IS_ERR(ERR_PTR(op.status)));
-+              return ERR_PTR(op.status);
-+      }
-+
-+      /* Stuff the handle in an unused field */
-+      area->phys_addr = (unsigned long)op.handle;
-+
-+      return area;
-+}
-+EXPORT_SYMBOL_GPL(xenbus_map_ring_valloc);
-+
-+
-+int xenbus_map_ring(struct xenbus_device *dev, int gnt_ref,
-+                 grant_handle_t *handle, void *vaddr)
-+{
-+      struct gnttab_map_grant_ref op;
-+      
-+      gnttab_set_map_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
-+                        gnt_ref, dev->otherend_id);
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_map_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status != GNTST_okay) {
-+              xenbus_dev_fatal(dev, op.status,
-+                               "mapping in shared page %d from domain %d",
-+                               gnt_ref, dev->otherend_id);
-+      } else
-+              *handle = op.handle;
-+
-+      return op.status;
-+}
-+EXPORT_SYMBOL_GPL(xenbus_map_ring);
-+
-+
-+/* Based on Rusty Russell's skeleton driver's unmap_page */
-+int xenbus_unmap_ring_vfree(struct xenbus_device *dev, struct vm_struct *area)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)area->addr, GNTMAP_host_map,
-+                          (grant_handle_t)area->phys_addr);
-+
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status == GNTST_okay)
-+              free_vm_area(area);
-+      else
-+              xenbus_dev_error(dev, op.status,
-+                               "unmapping page at handle %d error %d",
-+                               (int16_t)area->phys_addr, op.status);
-+
-+      return op.status;
-+}
-+EXPORT_SYMBOL_GPL(xenbus_unmap_ring_vfree);
-+
-+
-+int xenbus_unmap_ring(struct xenbus_device *dev,
-+                   grant_handle_t handle, void *vaddr)
-+{
-+      struct gnttab_unmap_grant_ref op;
-+
-+      gnttab_set_unmap_op(&op, (unsigned long)vaddr, GNTMAP_host_map,
-+                          handle);
-+      if (HYPERVISOR_grant_table_op(GNTTABOP_unmap_grant_ref, &op, 1))
-+              BUG();
-+
-+      if (op.status != GNTST_okay)
-+              xenbus_dev_error(dev, op.status,
-+                               "unmapping page at handle %d error %d",
-+                               handle, op.status);
-+
-+      return op.status;
-+}
-+EXPORT_SYMBOL_GPL(xenbus_unmap_ring);
-+
-+int xenbus_dev_is_online(struct xenbus_device *dev)
-+{
-+      int rc, val;
-+
-+      rc = xenbus_scanf(XBT_NIL, dev->nodename, "online", "%d", &val);
-+      if (rc != 1)
-+              val = 0; /* no online node present */
-+
-+      return val;
-+}
-+EXPORT_SYMBOL_GPL(xenbus_dev_is_online);
-+
-+MODULE_LICENSE("Dual BSD/GPL");
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_dev.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_dev.c    2008-07-21 11:00:33.000000000 +0200
-@@ -0,0 +1,408 @@
-+/*
-+ * xenbus_dev.c
-+ * 
-+ * Driver giving user-space access to the kernel's xenbus connection
-+ * to xenstore.
-+ * 
-+ * Copyright (c) 2005, Christian Limpach
-+ * Copyright (c) 2005, Rusty Russell, IBM Corporation
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#include <linux/kernel.h>
-+#include <linux/errno.h>
-+#include <linux/uio.h>
-+#include <linux/notifier.h>
-+#include <linux/wait.h>
-+#include <linux/fs.h>
-+#include <linux/poll.h>
-+#include <linux/mutex.h>
-+
-+#include "xenbus_comms.h"
-+
-+#include <asm/uaccess.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+#include <xen/xen_proc.h>
-+#include <asm/hypervisor.h>
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+struct xenbus_dev_transaction {
-+      struct list_head list;
-+      struct xenbus_transaction handle;
-+};
-+
-+struct read_buffer {
-+      struct list_head list;
-+      unsigned int cons;
-+      unsigned int len;
-+      char msg[];
-+};
-+
-+struct xenbus_dev_data {
-+      /* In-progress transaction. */
-+      struct list_head transactions;
-+
-+      /* Active watches. */
-+      struct list_head watches;
-+
-+      /* Partial request. */
-+      unsigned int len;
-+      union {
-+              struct xsd_sockmsg msg;
-+              char buffer[PAGE_SIZE];
-+      } u;
-+
-+      /* Response queue. */
-+      struct list_head read_buffers;
-+      wait_queue_head_t read_waitq;
-+
-+      struct mutex reply_mutex;
-+};
-+
-+static struct proc_dir_entry *xenbus_dev_intf;
-+
-+static ssize_t xenbus_dev_read(struct file *filp,
-+                             char __user *ubuf,
-+                             size_t len, loff_t *ppos)
-+{
-+      struct xenbus_dev_data *u = filp->private_data;
-+      struct read_buffer *rb;
-+      int i, ret;
-+
-+      mutex_lock(&u->reply_mutex);
-+      while (list_empty(&u->read_buffers)) {
-+              mutex_unlock(&u->reply_mutex);
-+              ret = wait_event_interruptible(u->read_waitq,
-+                                             !list_empty(&u->read_buffers));
-+              if (ret)
-+                      return ret;
-+              mutex_lock(&u->reply_mutex);
-+      }
-+
-+      rb = list_entry(u->read_buffers.next, struct read_buffer, list);
-+      for (i = 0; i < len;) {
-+              put_user(rb->msg[rb->cons], ubuf + i);
-+              i++;
-+              rb->cons++;
-+              if (rb->cons == rb->len) {
-+                      list_del(&rb->list);
-+                      kfree(rb);
-+                      if (list_empty(&u->read_buffers))
-+                              break;
-+                      rb = list_entry(u->read_buffers.next,
-+                                      struct read_buffer, list);
-+              }
-+      }
-+      mutex_unlock(&u->reply_mutex);
-+
-+      return i;
-+}
-+
-+static void queue_reply(struct xenbus_dev_data *u,
-+                      char *data, unsigned int len)
-+{
-+      struct read_buffer *rb;
-+
-+      if (len == 0)
-+              return;
-+
-+      rb = kmalloc(sizeof(*rb) + len, GFP_KERNEL);
-+      BUG_ON(rb == NULL);
-+
-+      rb->cons = 0;
-+      rb->len = len;
-+
-+      memcpy(rb->msg, data, len);
-+
-+      list_add_tail(&rb->list, &u->read_buffers);
-+
-+      wake_up(&u->read_waitq);
-+}
-+
-+struct watch_adapter
-+{
-+      struct list_head list;
-+      struct xenbus_watch watch;
-+      struct xenbus_dev_data *dev_data;
-+      char *token;
-+};
-+
-+static void free_watch_adapter (struct watch_adapter *watch)
-+{
-+      kfree(watch->watch.node);
-+      kfree(watch->token);
-+      kfree(watch);
-+}
-+
-+static void watch_fired(struct xenbus_watch *watch,
-+                      const char **vec,
-+                      unsigned int len)
-+{
-+      struct watch_adapter *adap =
-+            container_of(watch, struct watch_adapter, watch);
-+      struct xsd_sockmsg hdr;
-+      const char *path, *token;
-+      int path_len, tok_len, body_len, data_len = 0;
-+
-+      path = vec[XS_WATCH_PATH];
-+      token = adap->token;
-+
-+      path_len = strlen(path) + 1;
-+      tok_len = strlen(token) + 1;
-+      if (len > 2)
-+              data_len = vec[len] - vec[2] + 1;
-+      body_len = path_len + tok_len + data_len;
-+
-+      hdr.type = XS_WATCH_EVENT;
-+      hdr.len = body_len;
-+
-+      mutex_lock(&adap->dev_data->reply_mutex);
-+      queue_reply(adap->dev_data, (char *)&hdr, sizeof(hdr));
-+      queue_reply(adap->dev_data, (char *)path, path_len);
-+      queue_reply(adap->dev_data, (char *)token, tok_len);
-+      if (len > 2)
-+              queue_reply(adap->dev_data, (char *)vec[2], data_len);
-+      mutex_unlock(&adap->dev_data->reply_mutex);
-+}
-+
-+static LIST_HEAD(watch_list);
-+
-+static ssize_t xenbus_dev_write(struct file *filp,
-+                              const char __user *ubuf,
-+                              size_t len, loff_t *ppos)
-+{
-+      struct xenbus_dev_data *u = filp->private_data;
-+      struct xenbus_dev_transaction *trans = NULL;
-+      uint32_t msg_type;
-+      void *reply;
-+      char *path, *token;
-+      struct watch_adapter *watch, *tmp_watch;
-+      int err, rc = len;
-+
-+      if ((len + u->len) > sizeof(u->u.buffer)) {
-+              rc = -EINVAL;
-+              goto out;
-+      }
-+
-+      if (copy_from_user(u->u.buffer + u->len, ubuf, len) != 0) {
-+              rc = -EFAULT;
-+              goto out;
-+      }
-+
-+      u->len += len;
-+      if ((u->len < sizeof(u->u.msg)) ||
-+          (u->len < (sizeof(u->u.msg) + u->u.msg.len)))
-+              return rc;
-+
-+      msg_type = u->u.msg.type;
-+
-+      switch (msg_type) {
-+      case XS_TRANSACTION_START:
-+      case XS_TRANSACTION_END:
-+      case XS_DIRECTORY:
-+      case XS_READ:
-+      case XS_GET_PERMS:
-+      case XS_RELEASE:
-+      case XS_GET_DOMAIN_PATH:
-+      case XS_WRITE:
-+      case XS_MKDIR:
-+      case XS_RM:
-+      case XS_SET_PERMS:
-+              if (msg_type == XS_TRANSACTION_START) {
-+                      trans = kmalloc(sizeof(*trans), GFP_KERNEL);
-+                      if (!trans) {
-+                              rc = -ENOMEM;
-+                              goto out;
-+                      }
-+              }
-+
-+              reply = xenbus_dev_request_and_reply(&u->u.msg);
-+              if (IS_ERR(reply)) {
-+                      kfree(trans);
-+                      rc = PTR_ERR(reply);
-+                      goto out;
-+              }
-+
-+              if (msg_type == XS_TRANSACTION_START) {
-+                      trans->handle.id = simple_strtoul(reply, NULL, 0);
-+                      list_add(&trans->list, &u->transactions);
-+              } else if (msg_type == XS_TRANSACTION_END) {
-+                      list_for_each_entry(trans, &u->transactions, list)
-+                              if (trans->handle.id == u->u.msg.tx_id)
-+                                      break;
-+                      BUG_ON(&trans->list == &u->transactions);
-+                      list_del(&trans->list);
-+                      kfree(trans);
-+              }
-+              mutex_lock(&u->reply_mutex);
-+              queue_reply(u, (char *)&u->u.msg, sizeof(u->u.msg));
-+              queue_reply(u, (char *)reply, u->u.msg.len);
-+              mutex_unlock(&u->reply_mutex);
-+              kfree(reply);
-+              break;
-+
-+      case XS_WATCH:
-+      case XS_UNWATCH: {
-+              static const char *XS_RESP = "OK";
-+              struct xsd_sockmsg hdr;
-+
-+              path = u->u.buffer + sizeof(u->u.msg);
-+              token = memchr(path, 0, u->u.msg.len);
-+              if (token == NULL) {
-+                      rc = -EILSEQ;
-+                      goto out;
-+              }
-+              token++;
-+
-+              if (msg_type == XS_WATCH) {
-+                      watch = kzalloc(sizeof(*watch), GFP_KERNEL);
-+                      watch->watch.node = kmalloc(strlen(path)+1,
-+                                                    GFP_KERNEL);
-+                      strcpy((char *)watch->watch.node, path);
-+                      watch->watch.callback = watch_fired;
-+                      watch->token = kmalloc(strlen(token)+1, GFP_KERNEL);
-+                      strcpy(watch->token, token);
-+                      watch->dev_data = u;
-+
-+                      err = register_xenbus_watch(&watch->watch);
-+                      if (err) {
-+                              free_watch_adapter(watch);
-+                              rc = err;
-+                              goto out;
-+                      }
-+                      
-+                      list_add(&watch->list, &u->watches);
-+              } else {
-+                      list_for_each_entry_safe(watch, tmp_watch,
-+                                                 &u->watches, list) {
-+                              if (!strcmp(watch->token, token) &&
-+                                  !strcmp(watch->watch.node, path))
-+                              {
-+                                      unregister_xenbus_watch(&watch->watch);
-+                                      list_del(&watch->list);
-+                                      free_watch_adapter(watch);
-+                                      break;
-+                              }
-+                      }
-+              }
-+
-+              hdr.type = msg_type;
-+              hdr.len = strlen(XS_RESP) + 1;
-+              mutex_lock(&u->reply_mutex);
-+              queue_reply(u, (char *)&hdr, sizeof(hdr));
-+              queue_reply(u, (char *)XS_RESP, hdr.len);
-+              mutex_unlock(&u->reply_mutex);
-+              break;
-+      }
-+
-+      default:
-+              rc = -EINVAL;
-+              break;
-+      }
-+
-+ out:
-+      u->len = 0;
-+      return rc;
-+}
-+
-+static int xenbus_dev_open(struct inode *inode, struct file *filp)
-+{
-+      struct xenbus_dev_data *u;
-+
-+      if (xen_store_evtchn == 0)
-+              return -ENOENT;
-+
-+      nonseekable_open(inode, filp);
-+
-+      u = kzalloc(sizeof(*u), GFP_KERNEL);
-+      if (u == NULL)
-+              return -ENOMEM;
-+
-+      INIT_LIST_HEAD(&u->transactions);
-+      INIT_LIST_HEAD(&u->watches);
-+      INIT_LIST_HEAD(&u->read_buffers);
-+      init_waitqueue_head(&u->read_waitq);
-+
-+      mutex_init(&u->reply_mutex);
-+
-+      filp->private_data = u;
-+
-+      return 0;
-+}
-+
-+static int xenbus_dev_release(struct inode *inode, struct file *filp)
-+{
-+      struct xenbus_dev_data *u = filp->private_data;
-+      struct xenbus_dev_transaction *trans, *tmp;
-+      struct watch_adapter *watch, *tmp_watch;
-+
-+      list_for_each_entry_safe(trans, tmp, &u->transactions, list) {
-+              xenbus_transaction_end(trans->handle, 1);
-+              list_del(&trans->list);
-+              kfree(trans);
-+      }
-+
-+      list_for_each_entry_safe(watch, tmp_watch, &u->watches, list) {
-+              unregister_xenbus_watch(&watch->watch);
-+              list_del(&watch->list);
-+              free_watch_adapter(watch);
-+      }
-+
-+      kfree(u);
-+
-+      return 0;
-+}
-+
-+static unsigned int xenbus_dev_poll(struct file *file, poll_table *wait)
-+{
-+      struct xenbus_dev_data *u = file->private_data;
-+
-+      poll_wait(file, &u->read_waitq, wait);
-+      if (!list_empty(&u->read_buffers))
-+              return POLLIN | POLLRDNORM;
-+      return 0;
-+}
-+
-+static const struct file_operations xenbus_dev_file_ops = {
-+      .read = xenbus_dev_read,
-+      .write = xenbus_dev_write,
-+      .open = xenbus_dev_open,
-+      .release = xenbus_dev_release,
-+      .poll = xenbus_dev_poll,
-+};
-+
-+int xenbus_dev_init(void)
-+{
-+      xenbus_dev_intf = create_xen_proc_entry("xenbus", 0400);
-+      if (xenbus_dev_intf)
-+              xenbus_dev_intf->proc_fops = &xenbus_dev_file_ops;
-+
-+      return 0;
-+}
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_probe_backend.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_probe_backend.c  2008-01-21 11:15:26.000000000 +0100
-@@ -0,0 +1,292 @@
-+/******************************************************************************
-+ * Talks to Xen Store to figure out what devices we have (backend half).
-+ *
-+ * Copyright (C) 2005 Rusty Russell, IBM Corporation
-+ * Copyright (C) 2005 Mike Wray, Hewlett-Packard
-+ * Copyright (C) 2005, 2006 XenSource Ltd
-+ * Copyright (C) 2007 Solarflare Communications, Inc.
-+ * 
-+ * This program is free software; you can redistribute it and/or
-+ * modify it under the terms of the GNU General Public License version 2
-+ * as published by the Free Software Foundation; or, when distributed
-+ * separately from the Linux kernel or incorporated into other
-+ * software packages, subject to the following license:
-+ * 
-+ * Permission is hereby granted, free of charge, to any person obtaining a copy
-+ * of this source file (the "Software"), to deal in the Software without
-+ * restriction, including without limitation the rights to use, copy, modify,
-+ * merge, publish, distribute, sublicense, and/or sell copies of the Software,
-+ * and to permit persons to whom the Software is furnished to do so, subject to
-+ * the following conditions:
-+ * 
-+ * The above copyright notice and this permission notice shall be included in
-+ * all copies or substantial portions of the Software.
-+ * 
-+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-+ * IN THE SOFTWARE.
-+ */
-+
-+#define DPRINTK(fmt, args...)                         \
-+      pr_debug("xenbus_probe (%s:%d) " fmt ".\n",     \
-+               __FUNCTION__, __LINE__, ##args)
-+
-+#include <linux/kernel.h>
-+#include <linux/err.h>
-+#include <linux/string.h>
-+#include <linux/ctype.h>
-+#include <linux/fcntl.h>
-+#include <linux/mm.h>
-+#include <linux/notifier.h>
-+
-+#include <asm/io.h>
-+#include <asm/page.h>
-+#include <asm/maddr.h>
-+#include <asm/pgtable.h>
-+#include <asm/hypervisor.h>
-+#include <xen/xenbus.h>
-+#include <xen/xen_proc.h>
-+#include <xen/evtchn.h>
-+#include <xen/features.h>
-+
-+#include "xenbus_comms.h"
-+#include "xenbus_probe.h"
-+
-+#ifdef HAVE_XEN_PLATFORM_COMPAT_H
-+#include <xen/platform-compat.h>
-+#endif
-+
-+static int xenbus_uevent_backend(struct device *dev, char **envp,
-+                               int num_envp, char *buffer, int buffer_size);
-+static int xenbus_probe_backend(const char *type, const char *domid);
-+
-+extern int read_otherend_details(struct xenbus_device *xendev,
-+                               char *id_node, char *path_node);
-+
-+static int read_frontend_details(struct xenbus_device *xendev)
-+{
-+      return read_otherend_details(xendev, "frontend-id", "frontend");
-+}
-+
-+/* backend/<type>/<fe-uuid>/<id> => <type>-<fe-domid>-<id> */
-+static int backend_bus_id(char bus_id[BUS_ID_SIZE], const char *nodename)
-+{
-+      int domid, err;
-+      const char *devid, *type, *frontend;
-+      unsigned int typelen;
-+
-+      type = strchr(nodename, '/');
-+      if (!type)
-+              return -EINVAL;
-+      type++;
-+      typelen = strcspn(type, "/");
-+      if (!typelen || type[typelen] != '/')
-+              return -EINVAL;
-+
-+      devid = strrchr(nodename, '/') + 1;
-+
-+      err = xenbus_gather(XBT_NIL, nodename, "frontend-id", "%i", &domid,
-+                          "frontend", NULL, &frontend,
-+                          NULL);
-+      if (err)
-+              return err;
-+      if (strlen(frontend) == 0)
-+              err = -ERANGE;
-+      if (!err && !xenbus_exists(XBT_NIL, frontend, ""))
-+              err = -ENOENT;
-+      kfree(frontend);
-+
-+      if (err)
-+              return err;
-+
-+      if (snprintf(bus_id, BUS_ID_SIZE,
-+                   "%.*s-%i-%s", typelen, type, domid, devid) >= BUS_ID_SIZE)
-+              return -ENOSPC;
-+      return 0;
-+}
-+
-+static struct xen_bus_type xenbus_backend = {
-+      .root = "backend",
-+      .levels = 3,            /* backend/type/<frontend>/<id> */
-+      .get_bus_id = backend_bus_id,
-+      .probe = xenbus_probe_backend,
-+      .error = -ENODEV,
-+      .bus = {
-+              .name     = "xen-backend",
-+              .match    = xenbus_match,
-+              .probe    = xenbus_dev_probe,
-+              .remove   = xenbus_dev_remove,
-+//            .shutdown = xenbus_dev_shutdown,
-+              .uevent   = xenbus_uevent_backend,
-+      },
-+      .dev = {
-+              .bus_id = "xen-backend",
-+      },
-+};
-+
-+static int xenbus_uevent_backend(struct device *dev, char **envp,
-+                               int num_envp, char *buffer, int buffer_size)
-+{
-+      struct xenbus_device *xdev;
-+      struct xenbus_driver *drv;
-+      int i = 0;
-+      int length = 0;
-+
-+      DPRINTK("");
-+
-+      if (dev == NULL)
-+              return -ENODEV;
-+
-+      xdev = to_xenbus_device(dev);
-+      if (xdev == NULL)
-+              return -ENODEV;
-+
-+      /* stuff we want to pass to /sbin/hotplug */
-+      add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-+                     "XENBUS_TYPE=%s", xdev->devicetype);
-+
-+      add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-+                     "XENBUS_PATH=%s", xdev->nodename);
-+
-+      add_uevent_var(envp, num_envp, &i, buffer, buffer_size, &length,
-+                     "XENBUS_BASE_PATH=%s", xenbus_backend.root);
-+
-+      /* terminate, set to next free slot, shrink available space */
-+      envp[i] = NULL;
-+      envp = &envp[i];
-+      num_envp -= i;
-+      buffer = &buffer[length];
-+      buffer_size -= length;
-+
-+      if (dev->driver) {
-+              drv = to_xenbus_driver(dev->driver);
-+              if (drv && drv->uevent)
-+                      return drv->uevent(xdev, envp, num_envp, buffer,
-+                                         buffer_size);
-+      }
-+
-+      return 0;
-+}
-+
-+int xenbus_register_backend(struct xenbus_driver *drv)
-+{
-+      drv->read_otherend_details = read_frontend_details;
-+
-+      return xenbus_register_driver_common(drv, &xenbus_backend);
-+}
-+EXPORT_SYMBOL_GPL(xenbus_register_backend);
-+
-+/* backend/<typename>/<frontend-uuid>/<name> */
-+static int xenbus_probe_backend_unit(const char *dir,
-+                                   const char *type,
-+                                   const char *name)
-+{
-+      char *nodename;
-+      int err;
-+
-+      nodename = kasprintf(GFP_KERNEL, "%s/%s", dir, name);
-+      if (!nodename)
-+              return -ENOMEM;
-+
-+      DPRINTK("%s\n", nodename);
-+
-+      err = xenbus_probe_node(&xenbus_backend, type, nodename);
-+      kfree(nodename);
-+      return err;
-+}
-+
-+/* backend/<typename>/<frontend-domid> */
-+static int xenbus_probe_backend(const char *type, const char *domid)
-+{
-+      char *nodename;
-+      int err = 0;
-+      char **dir;
-+      unsigned int i, dir_n = 0;
-+
-+      DPRINTK("");
-+
-+      nodename = kasprintf(GFP_KERNEL, "%s/%s/%s", xenbus_backend.root, type, domid);
-+      if (!nodename)
-+              return -ENOMEM;
-+
-+      dir = xenbus_directory(XBT_NIL, nodename, "", &dir_n);
-+      if (IS_ERR(dir)) {
-+              kfree(nodename);
-+              return PTR_ERR(dir);
-+      }
-+
-+      for (i = 0; i < dir_n; i++) {
-+              err = xenbus_probe_backend_unit(nodename, type, dir[i]);
-+              if (err)
-+                      break;
-+      }
-+      kfree(dir);
-+      kfree(nodename);
-+      return err;
-+}
-+
-+static void backend_changed(struct xenbus_watch *watch,
-+                          const char **vec, unsigned int len)
-+{
-+      DPRINTK("");
-+
-+      dev_changed(vec[XS_WATCH_PATH], &xenbus_backend);
-+}
-+
-+static struct xenbus_watch be_watch = {
-+      .node = "backend",
-+      .callback = backend_changed,
-+};
-+
-+void xenbus_backend_suspend(int (*fn)(struct device *, void *))
-+{
-+      DPRINTK("");
-+      if (!xenbus_backend.error)
-+              bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, fn);
-+}
-+
-+void xenbus_backend_resume(int (*fn)(struct device *, void *))
-+{
-+      DPRINTK("");
-+      if (!xenbus_backend.error)
-+              bus_for_each_dev(&xenbus_backend.bus, NULL, NULL, fn);
-+}
-+
-+void xenbus_backend_probe_and_watch(void)
-+{
-+      xenbus_probe_devices(&xenbus_backend);
-+      register_xenbus_watch(&be_watch);
-+}
-+
-+void xenbus_backend_bus_register(void)
-+{
-+      xenbus_backend.error = bus_register(&xenbus_backend.bus);
-+      if (xenbus_backend.error)
-+              printk(KERN_WARNING
-+                     "XENBUS: Error registering backend bus: %i\n",
-+                     xenbus_backend.error);
-+}
-+
-+void xenbus_backend_device_register(void)
-+{
-+      if (xenbus_backend.error)
-+              return;
-+
-+      xenbus_backend.error = device_register(&xenbus_backend.dev);
-+      if (xenbus_backend.error) {
-+              bus_unregister(&xenbus_backend.bus);
-+              printk(KERN_WARNING
-+                     "XENBUS: Error registering backend device: %i\n",
-+                     xenbus_backend.error);
-+      }
-+}
-+
-+int xenbus_for_each_backend(void *arg, int (*fn)(struct device *, void *))
-+{
-+      return bus_for_each_dev(&xenbus_backend.bus, NULL, arg, fn);
-+}
-+EXPORT_SYMBOL_GPL(xenbus_for_each_backend);
-Index: head-2008-11-25/drivers/xen/xenoprof/xenoprofile.c
-===================================================================
---- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ head-2008-11-25/drivers/xen/xenoprof/xenoprofile.c 2008-09-15 13:40:15.000000000 +0200
-@@ -0,0 +1,545 @@
-+/**
-+ * @file xenoprofile.c
-+ *
-+ * @remark Copyright 2002 OProfile authors
-+ * @remark Read the file COPYING
-+ *
-+ * @author John Levon <levon@movementarian.org>
-+ *
-+ * Modified by Aravind Menon and Jose Renato Santos for Xen
-+ * These modifications are:
-+ * Copyright (C) 2005 Hewlett-Packard Co.
-+ *
-+ * Separated out arch-generic part
-+ * Copyright (c) 2006 Isaku Yamahata <yamahata at valinux co jp>
-+ *                    VA Linux Systems Japan K.K.
-+ */
-+
-+#include <linux/init.h>
-+#include <linux/notifier.h>
-+#include <linux/smp.h>
-+#include <linux/oprofile.h>
-+#include <linux/sysdev.h>
-+#include <linux/slab.h>
-+#include <linux/interrupt.h>
-+#include <linux/vmalloc.h>
-+#include <asm/pgtable.h>
-+#include <xen/evtchn.h>
-+#include <xen/xenoprof.h>
-+#include <xen/driver_util.h>
-+#include <xen/interface/xen.h>
-+#include <xen/interface/xenoprof.h>
-+#include "../../../drivers/oprofile/cpu_buffer.h"
-+#include "../../../drivers/oprofile/event_buffer.h"
-+
-+#define MAX_XENOPROF_SAMPLES 16
-+
-+/* sample buffers shared with Xen */
-+static xenoprof_buf_t *xenoprof_buf[MAX_VIRT_CPUS];
-+/* Shared buffer area */
-+static struct xenoprof_shared_buffer shared_buffer;
-+
-+/* Passive sample buffers shared with Xen */
-+static xenoprof_buf_t *p_xenoprof_buf[MAX_OPROF_DOMAINS][MAX_VIRT_CPUS];
-+/* Passive shared buffer area */
-+static struct xenoprof_shared_buffer p_shared_buffer[MAX_OPROF_DOMAINS];
-+
-+static int xenoprof_start(void);
-+static void xenoprof_stop(void);
-+
-+static int xenoprof_enabled = 0;
-+static int xenoprof_is_primary = 0;
-+static int active_defined;
-+
-+extern unsigned long backtrace_depth;
-+
-+/* Number of buffers in shared area (one per VCPU) */
-+static int nbuf;
-+/* Mappings of VIRQ_XENOPROF to irq number (per cpu) */
-+static int ovf_irq[NR_CPUS];
-+/* cpu model type string - copied from Xen on XENOPROF_init command */
-+static char cpu_type[XENOPROF_CPU_TYPE_SIZE];
-+
-+#ifdef CONFIG_PM
-+
-+static int xenoprof_suspend(struct sys_device * dev, pm_message_t state)
-+{
-+      if (xenoprof_enabled == 1)
-+              xenoprof_stop();
-+      return 0;
-+}
-+
-+
-+static int xenoprof_resume(struct sys_device * dev)
-+{
-+      if (xenoprof_enabled == 1)
-+              xenoprof_start();
-+      return 0;
-+}
-+
-+
-+static struct sysdev_class oprofile_sysclass = {
-+      set_kset_name("oprofile"),
-+      .resume         = xenoprof_resume,
-+      .suspend        = xenoprof_suspend
-+};
-+
-+
-+static struct sys_device device_oprofile = {
-+      .id     = 0,
-+      .cls    = &oprofile_sysclass,
-+};
-+
-+
-+static int __init init_driverfs(void)
-+{
-+      int error;
-+      if (!(error = sysdev_class_register(&oprofile_sysclass)))
-+              error = sysdev_register(&device_oprofile);
-+      return error;
-+}
-+
-+
-+static void exit_driverfs(void)
-+{
-+      sysdev_unregister(&device_oprofile);
-+      sysdev_class_unregister(&oprofile_sysclass);
-+}
-+
-+#else
-+#define init_driverfs() do { } while (0)
-+#define exit_driverfs() do { } while (0)
-+#endif /* CONFIG_PM */
-+
-+static unsigned long long oprofile_samples;
-+static unsigned long long p_oprofile_samples;
-+
-+static unsigned int pdomains;
-+static struct xenoprof_passive passive_domains[MAX_OPROF_DOMAINS];
-+
-+/* Check whether the given entry is an escape code */
-+static int xenoprof_is_escape(xenoprof_buf_t * buf, int tail)
-+{
-+      return (buf->event_log[tail].eip == XENOPROF_ESCAPE_CODE);
-+}
-+
-+/* Get the event at the given entry  */
-+static uint8_t xenoprof_get_event(xenoprof_buf_t * buf, int tail)
-+{
-+      return (buf->event_log[tail].event);
-+}
-+
-+static void xenoprof_add_pc(xenoprof_buf_t *buf, int is_passive)
-+{
-+      int head, tail, size;
-+      int tracing = 0;
-+
-+      head = buf->event_head;
-+      tail = buf->event_tail;
-+      size = buf->event_size;
-+
-+      while (tail != head) {
-+              if (xenoprof_is_escape(buf, tail) &&
-+                  xenoprof_get_event(buf, tail) == XENOPROF_TRACE_BEGIN) {
-+                      tracing=1;
-+                      oprofile_add_pc(ESCAPE_CODE, buf->event_log[tail].mode, 
-+                                      CPU_TRACE_BEGIN); 
-+                      if (!is_passive)
-+                              oprofile_samples++;
-+                      else
-+                              p_oprofile_samples++;
-+                      
-+              } else {
-+                      oprofile_add_pc(buf->event_log[tail].eip,
-+                                      buf->event_log[tail].mode,
-+                                      buf->event_log[tail].event);
-+                      if (!tracing) {
-+                              if (!is_passive)
-+                                      oprofile_samples++;
-+                              else
-+                                      p_oprofile_samples++;
-+                      }
-+       
-+              }
-+              tail++;
-+              if(tail==size)
-+                  tail=0;
-+      }
-+      buf->event_tail = tail;
-+}
-+
-+static void xenoprof_handle_passive(void)
-+{
-+      int i, j;
-+      int flag_domain, flag_switch = 0;
-+      
-+      for (i = 0; i < pdomains; i++) {
-+              flag_domain = 0;
-+              for (j = 0; j < passive_domains[i].nbuf; j++) {
-+                      xenoprof_buf_t *buf = p_xenoprof_buf[i][j];
-+                      if (buf->event_head == buf->event_tail)
-+                              continue;
-+                      if (!flag_domain) {
-+                              if (!oprofile_add_domain_switch(
-+                                      passive_domains[i].domain_id))
-+                                      goto done;
-+                              flag_domain = 1;
-+                      }
-+                      xenoprof_add_pc(buf, 1);
-+                      flag_switch = 1;
-+              }
-+      }
-+done:
-+      if (flag_switch)
-+              oprofile_add_domain_switch(COORDINATOR_DOMAIN);
-+}
-+
-+static irqreturn_t 
-+xenoprof_ovf_interrupt(int irq, void * dev_id, struct pt_regs * regs)
-+{
-+      struct xenoprof_buf * buf;
-+      static unsigned long flag;
-+
-+      buf = xenoprof_buf[smp_processor_id()];
-+
-+      xenoprof_add_pc(buf, 0);
-+
-+      if (xenoprof_is_primary && !test_and_set_bit(0, &flag)) {
-+              xenoprof_handle_passive();
-+              smp_mb__before_clear_bit();
-+              clear_bit(0, &flag);
-+      }
-+
-+      return IRQ_HANDLED;
-+}
-+
-+
-+static void unbind_virq(void)
-+{
-+      unsigned int i;
-+
-+      for_each_online_cpu(i) {
-+              if (ovf_irq[i] >= 0) {
-+                      unbind_from_irqhandler(ovf_irq[i], NULL);
-+                      ovf_irq[i] = -1;
-+              }
-+      }
-+}
-+
-+
-+static int bind_virq(void)
-+{
-+      unsigned int i;
-+      int result;
-+
-+      for_each_online_cpu(i) {
-+              result = bind_virq_to_irqhandler(VIRQ_XENOPROF,
-+                                               i,
-+                                               xenoprof_ovf_interrupt,
-+                                               SA_INTERRUPT,
-+                                               "xenoprof",
-+                                               NULL);
-+
-+              if (result < 0) {
-+                      unbind_virq();
-+                      return result;
-+              }
-+
-+              ovf_irq[i] = result;
-+      }
-+              
-+      return 0;
-+}
-+
-+
-+static void unmap_passive_list(void)
-+{
-+      int i;
-+      for (i = 0; i < pdomains; i++)
-+              xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
-+      pdomains = 0;
-+}
-+
-+
-+static int map_xenoprof_buffer(int max_samples)
-+{
-+      struct xenoprof_get_buffer get_buffer;
-+      struct xenoprof_buf *buf;
-+      int ret, i;
-+
-+      if ( shared_buffer.buffer )
-+              return 0;
-+
-+      get_buffer.max_samples = max_samples;
-+      ret = xenoprof_arch_map_shared_buffer(&get_buffer, &shared_buffer);
-+      if (ret)
-+              return ret;
-+      nbuf = get_buffer.nbuf;
-+
-+      for (i=0; i< nbuf; i++) {
-+              buf = (struct xenoprof_buf*) 
-+                      &shared_buffer.buffer[i * get_buffer.bufsize];
-+              BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
-+              xenoprof_buf[buf->vcpu_id] = buf;
-+      }
-+
-+      return 0;
-+}
-+
-+
-+static int xenoprof_setup(void)
-+{
-+      int ret;
-+
-+      if ( (ret = map_xenoprof_buffer(MAX_XENOPROF_SAMPLES)) )
-+              return ret;
-+
-+      if ( (ret = bind_virq()) )
-+              return ret;
-+
-+      if (xenoprof_is_primary) {
-+              /* Define dom0 as an active domain if not done yet */
-+              if (!active_defined) {
-+                      domid_t domid;
-+                      ret = HYPERVISOR_xenoprof_op(
-+                              XENOPROF_reset_active_list, NULL);
-+                      if (ret)
-+                              goto err;
-+                      domid = 0;
-+                      ret = HYPERVISOR_xenoprof_op(
-+                              XENOPROF_set_active, &domid);
-+                      if (ret)
-+                              goto err;
-+                      active_defined = 1;
-+              }
-+
-+              if (backtrace_depth > 0) {
-+                      ret = HYPERVISOR_xenoprof_op(XENOPROF_set_backtrace, 
-+                                                   &backtrace_depth);
-+                      if (ret)
-+                              backtrace_depth = 0;
-+              }
-+
-+              ret = HYPERVISOR_xenoprof_op(XENOPROF_reserve_counters, NULL);
-+              if (ret)
-+                      goto err;
-+              
-+              xenoprof_arch_counter();
-+              ret = HYPERVISOR_xenoprof_op(XENOPROF_setup_events, NULL);
-+              if (ret)
-+                      goto err;
-+      }
-+
-+      ret = HYPERVISOR_xenoprof_op(XENOPROF_enable_virq, NULL);
-+      if (ret)
-+              goto err;
-+
-+      xenoprof_enabled = 1;
-+      return 0;
-+ err:
-+      unbind_virq();
-+      return ret;
-+}
-+
-+
-+static void xenoprof_shutdown(void)
-+{
-+      xenoprof_enabled = 0;
-+
-+      WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_disable_virq, NULL));
-+
-+      if (xenoprof_is_primary) {
-+              WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_release_counters,
-+                                             NULL));
-+              active_defined = 0;
-+      }
-+
-+      unbind_virq();
-+
-+      xenoprof_arch_unmap_shared_buffer(&shared_buffer);
-+      if (xenoprof_is_primary)
-+              unmap_passive_list();
-+}
-+
-+
-+static int xenoprof_start(void)
-+{
-+      int ret = 0;
-+
-+      if (xenoprof_is_primary)
-+              ret = HYPERVISOR_xenoprof_op(XENOPROF_start, NULL);
-+      if (!ret)
-+              xenoprof_arch_start();
-+      return ret;
-+}
-+
-+
-+static void xenoprof_stop(void)
-+{
-+      if (xenoprof_is_primary)
-+              WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_stop, NULL));
-+      xenoprof_arch_stop();
-+}
-+
-+
-+static int xenoprof_set_active(int * active_domains,
-+                             unsigned int adomains)
-+{
-+      int ret = 0;
-+      int i;
-+      int set_dom0 = 0;
-+      domid_t domid;
-+
-+      if (!xenoprof_is_primary)
-+              return 0;
-+
-+      if (adomains > MAX_OPROF_DOMAINS)
-+              return -E2BIG;
-+
-+      ret = HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list, NULL);
-+      if (ret)
-+              return ret;
-+
-+      for (i=0; i<adomains; i++) {
-+              domid = active_domains[i];
-+              if (domid != active_domains[i]) {
-+                      ret = -EINVAL;
-+                      goto out;
-+              }
-+              ret = HYPERVISOR_xenoprof_op(XENOPROF_set_active, &domid);
-+              if (ret)
-+                      goto out;
-+              if (active_domains[i] == 0)
-+                      set_dom0 = 1;
-+      }
-+      /* dom0 must always be active but may not be in the list */ 
-+      if (!set_dom0) {
-+              domid = 0;
-+              ret = HYPERVISOR_xenoprof_op(XENOPROF_set_active, &domid);
-+      }
-+
-+out:
-+      if (ret)
-+              WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_reset_active_list,
-+                                             NULL));
-+      active_defined = !ret;
-+      return ret;
-+}
-+
-+static int xenoprof_set_passive(int * p_domains,
-+                                unsigned int pdoms)
-+{
-+      int ret;
-+      unsigned int i, j;
-+      struct xenoprof_buf *buf;
-+
-+      if (!xenoprof_is_primary)
-+              return 0;
-+
-+      if (pdoms > MAX_OPROF_DOMAINS)
-+              return -E2BIG;
-+
-+      ret = HYPERVISOR_xenoprof_op(XENOPROF_reset_passive_list, NULL);
-+      if (ret)
-+              return ret;
-+      unmap_passive_list();
-+
-+      for (i = 0; i < pdoms; i++) {
-+              passive_domains[i].domain_id = p_domains[i];
-+              passive_domains[i].max_samples = 2048;
-+              ret = xenoprof_arch_set_passive(&passive_domains[i],
-+                                              &p_shared_buffer[i]);
-+              if (ret)
-+                      goto out;
-+              for (j = 0; j < passive_domains[i].nbuf; j++) {
-+                      buf = (struct xenoprof_buf *)
-+                              &p_shared_buffer[i].buffer[
-+                              j * passive_domains[i].bufsize];
-+                      BUG_ON(buf->vcpu_id >= MAX_VIRT_CPUS);
-+                      p_xenoprof_buf[i][buf->vcpu_id] = buf;
-+              }
-+      }
-+
-+      pdomains = pdoms;
-+      return 0;
-+
-+out:
-+      for (j = 0; j < i; j++)
-+              xenoprof_arch_unmap_shared_buffer(&p_shared_buffer[i]);
-+
-+      return ret;
-+}
-+
-+
-+/* The dummy backtrace function to keep oprofile happy
-+ * The real backtrace is done in xen
-+ */
-+static void xenoprof_dummy_backtrace(struct pt_regs * const regs, 
-+                                   unsigned int depth)
-+{
-+      /* this should never be called */
-+      BUG();
-+      return;
-+}
-+
-+
-+static struct oprofile_operations xenoprof_ops = {
-+#ifdef HAVE_XENOPROF_CREATE_FILES
-+      .create_files   = xenoprof_create_files,
-+#endif
-+      .set_active     = xenoprof_set_active,
-+      .set_passive    = xenoprof_set_passive,
-+      .setup          = xenoprof_setup,
-+      .shutdown       = xenoprof_shutdown,
-+      .start          = xenoprof_start,
-+      .stop           = xenoprof_stop,
-+      .backtrace      = xenoprof_dummy_backtrace
-+};
-+
-+
-+/* in order to get driverfs right */
-+static int using_xenoprof;
-+
-+int __init xenoprofile_init(struct oprofile_operations * ops)
-+{
-+      struct xenoprof_init init;
-+      unsigned int i;
-+      int ret;
-+
-+      ret = HYPERVISOR_xenoprof_op(XENOPROF_init, &init);
-+      if (!ret) {
-+              xenoprof_arch_init_counter(&init);
-+              xenoprof_is_primary = init.is_primary;
-+
-+              /*  cpu_type is detected by Xen */
-+              cpu_type[XENOPROF_CPU_TYPE_SIZE-1] = 0;
-+              strncpy(cpu_type, init.cpu_type, XENOPROF_CPU_TYPE_SIZE - 1);
-+              xenoprof_ops.cpu_type = cpu_type;
-+
-+              init_driverfs();
-+              using_xenoprof = 1;
-+              *ops = xenoprof_ops;
-+
-+              for (i=0; i<NR_CPUS; i++)
-+                      ovf_irq[i] = -1;
-+
-+              active_defined = 0;
-+      }
-+
-+      printk(KERN_INFO "%s: ret %d, events %d, xenoprof_is_primary %d\n",
-+             __func__, ret, init.num_events, xenoprof_is_primary);
-+      return ret;
-+}
-+
-+
-+void xenoprofile_exit(void)
-+{
-+      if (using_xenoprof)
-+              exit_driverfs();
-+
-+      xenoprof_arch_unmap_shared_buffer(&shared_buffer);
-+      if (xenoprof_is_primary) {
-+              unmap_passive_list();
-+              WARN_ON(HYPERVISOR_xenoprof_op(XENOPROF_shutdown, NULL));
-+        }
-+}
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-kconfig.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-auto-xen-kconfig.diff
deleted file mode 100644 (file)
index 49a62bd..0000000
+++ /dev/null
@@ -1,808 +0,0 @@
-Subject: xen3 xen-kconfig
-From: http://xenbits.xensource.com/linux-2.6.18-xen.hg (tip 728:832aac894efd)
-Patch-mainline: obsolete
-Acked-by: jbeulich@novell.com
-
---- sle11-2009-06-04.orig/arch/x86/Kconfig     2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/Kconfig  2009-06-04 10:18:21.000000000 +0200
-@@ -44,6 +44,7 @@ config GENERIC_LOCKBREAK
- config GENERIC_TIME
-       def_bool y
-+      depends on !X86_XEN
- config GENERIC_CMOS_UPDATE
-       def_bool y
-@@ -191,7 +192,7 @@ config X86_64_SMP
- config X86_HT
-       bool
--      depends on SMP
-+      depends on SMP && !XEN
-       depends on (X86_32 && !X86_VOYAGER) || X86_64
-       default y
-@@ -203,6 +204,17 @@ config X86_BIOS_REBOOT
- config X86_TRAMPOLINE
-       bool
-       depends on X86_SMP || (X86_VOYAGER && SMP) || (64BIT && ACPI_SLEEP)
-+      depends on !XEN
-+      default y
-+
-+config X86_NO_TSS
-+      bool
-+      depends on X86_XEN || X86_64_XEN
-+      default y
-+
-+config X86_NO_IDT
-+      bool
-+      depends on X86_XEN || X86_64_XEN
-       default y
- config KTIME_SCALAR
-@@ -271,6 +283,17 @@ config X86_PC
-       help
-         Choose this option if your computer is a standard PC or compatible.
-+config X86_XEN
-+      bool "Xen-compatible"
-+      select XEN
-+      select X86_PAE
-+      select X86_UP_APIC if !SMP && XEN_PRIVILEGED_GUEST
-+      select X86_UP_IOAPIC if !SMP && XEN_PRIVILEGED_GUEST
-+      select SWIOTLB
-+      help
-+        Choose this option if you plan to run this kernel on top of the
-+        Xen Hypervisor.
-+
- config X86_ELAN
-       bool "AMD Elan"
-       depends on X86_32
-@@ -338,6 +361,13 @@ config X86_BIGSMP
- endif
-+config X86_64_XEN
-+      bool "Enable Xen compatible kernel"
-+      select XEN
-+      select SWIOTLB
-+      help
-+        This option will compile a kernel compatible with Xen hypervisor
-+
- config X86_VSMP
-       bool "Support for ScaleMP vSMP"
-       select PARAVIRT
-@@ -478,6 +508,7 @@ source "arch/x86/Kconfig.cpu"
- config HPET_TIMER
-       def_bool X86_64
-       prompt "HPET Timer Support" if X86_32
-+      depends on !X86_XEN && !X86_64_XEN
-       help
-          Use the IA-PC HPET (High Precision Event Timer) to manage
-          time in preference to the PIT and RTC, if a HPET is
-@@ -514,7 +545,7 @@ config GART_IOMMU
-       default y
-       select SWIOTLB
-       select AGP
--      depends on X86_64 && PCI
-+      depends on X86_64 && PCI && !X86_64_XEN
-       help
-         Support for full DMA access of devices with 32bit memory access only
-         on systems with more than 3GB. This is usually needed for USB,
-@@ -529,7 +560,7 @@ config GART_IOMMU
- config CALGARY_IOMMU
-       bool "IBM Calgary IOMMU support"
-       select SWIOTLB
--      depends on X86_64 && PCI && EXPERIMENTAL
-+      depends on X86_64 && PCI && !X86_64_XEN && EXPERIMENTAL
-       help
-         Support for hardware IOMMUs in IBM's xSeries x366 and x460
-         systems. Needed to run systems with more than 3GB of memory
-@@ -597,6 +628,7 @@ config NR_CPUS
-       depends on SMP
-       default "4096" if MAXSMP
-       default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000
-+      default "16" if X86_64_XEN
-       default "8"
-       help
-         This allows you to specify the maximum number of CPUs which this
-@@ -652,7 +684,7 @@ config X86_REROUTE_FOR_BROKEN_BOOT_IRQS
- config X86_UP_APIC
-       bool "Local APIC support on uniprocessors"
--      depends on X86_32 && !SMP && !(X86_VOYAGER || X86_GENERICARCH)
-+      depends on X86_32 && !SMP && !(X86_VOYAGER || X86_GENERICARCH || XEN_UNPRIVILEGED_GUEST)
-       help
-         A local APIC (Advanced Programmable Interrupt Controller) is an
-         integrated interrupt controller in the CPU. If you have a single-CPU
-@@ -678,18 +710,25 @@ config X86_UP_IOAPIC
- config X86_LOCAL_APIC
-       def_bool y
-       depends on X86_64 || (X86_32 && (X86_UP_APIC || (SMP && !X86_VOYAGER) || X86_GENERICARCH))
-+      depends on !XEN_UNPRIVILEGED_GUEST
- config X86_IO_APIC
-       def_bool y
-       depends on X86_64 || (X86_32 && (X86_UP_IOAPIC || (SMP && !X86_VOYAGER) || X86_GENERICARCH))
-+      depends on !XEN_UNPRIVILEGED_GUEST
- config X86_VISWS_APIC
-       def_bool y
-       depends on X86_32 && X86_VISWS
-+config X86_XEN_GENAPIC
-+      bool
-+      depends on X86_64_XEN
-+      default y
-+
- config X86_MCE
-       bool "Machine Check Exception"
--      depends on !X86_VOYAGER
-+      depends on !(X86_VOYAGER || XEN)
-       ---help---
-         Machine Check Exception support allows the processor to notify the
-         kernel if it detects a problem (e.g. overheating, component failure).
-@@ -789,7 +828,7 @@ config I8K
- config X86_REBOOTFIXUPS
-       def_bool n
-       prompt "Enable X86 board specific fixups for reboot"
--      depends on X86_32 && X86
-+      depends on X86_32 && !X86_XEN
-       ---help---
-         This enables chipset and/or board specific fixups to be done
-         in order to get reboot to work correctly. This is only needed on
-@@ -806,6 +845,7 @@ config X86_REBOOTFIXUPS
- config MICROCODE
-       tristate "/dev/cpu/microcode - Intel IA32 CPU microcode support"
-+      depends on !XEN_UNPRIVILEGED_GUEST
-       select FW_LOADER
-       ---help---
-         If you say Y here, you will be able to update the microcode on
-@@ -973,7 +1013,7 @@ config DIRECT_GBPAGES
- # Common NUMA Features
- config NUMA
-       bool "Numa Memory Allocation and Scheduler Support (EXPERIMENTAL)"
--      depends on SMP
-+      depends on SMP && !XEN
-       depends on X86_64 || (X86_32 && HIGHMEM64G && (X86_NUMAQ || X86_BIGSMP || X86_SUMMIT && ACPI) && EXPERIMENTAL)
-       default n if X86_PC
-       default y if (X86_NUMAQ || X86_SUMMIT || X86_BIGSMP)
-@@ -1075,7 +1115,7 @@ config ARCH_SPARSEMEM_DEFAULT
- config ARCH_SPARSEMEM_ENABLE
-       def_bool y
--      depends on X86_64 || NUMA || (EXPERIMENTAL && X86_PC)
-+      depends on (X86_64 && !X86_64_XEN) || NUMA || (EXPERIMENTAL && X86_PC)
-       select SPARSEMEM_STATIC if X86_32
-       select SPARSEMEM_VMEMMAP_ENABLE if X86_64
-@@ -1121,6 +1161,7 @@ config X86_RESERVE_LOW_64K
- config MATH_EMULATION
-       bool
-       prompt "Math emulation" if X86_32
-+      depends on !X86_XEN
-       ---help---
-         Linux can emulate a math coprocessor (used for floating point
-         operations) if you don't have one. 486DX and Pentium processors have
-@@ -1146,6 +1187,7 @@ config MATH_EMULATION
- config MTRR
-       bool "MTRR (Memory Type Range Register) support"
-+      depends on !XEN_UNPRIVILEGED_GUEST
-       ---help---
-         On Intel P6 family processors (Pentium Pro, Pentium II and later)
-         the Memory Type Range Registers (MTRRs) may be used to control
-@@ -1227,7 +1269,7 @@ config X86_PAT
- config EFI
-       def_bool n
-       prompt "EFI runtime service support"
--      depends on ACPI
-+      depends on ACPI && !X86_XEN && !X86_64_XEN
-       ---help---
-       This enables the kernel to use EFI runtime services that are
-       available (such as the EFI variable services).
-@@ -1242,7 +1284,7 @@ config EFI
- config IRQBALANCE
-       def_bool y
-       prompt "Enable kernel irq balancing"
--      depends on X86_32 && SMP && X86_IO_APIC
-+      depends on X86_32 && SMP && X86_IO_APIC && !X86_XEN
-       help
-         The default yes will allow the kernel to do irq load balancing.
-         Saying no will keep the kernel from doing irq load balancing.
-@@ -1305,6 +1347,7 @@ source kernel/Kconfig.hz
- config KEXEC
-       bool "kexec system call"
-       depends on X86_BIOS_REBOOT
-+      depends on !XEN_UNPRIVILEGED_GUEST
-       help
-         kexec is a system call that implements the ability to shutdown your
-         current kernel, and to start another kernel.  It is like a reboot
-@@ -1322,6 +1365,7 @@ config KEXEC
- config CRASH_DUMP
-       bool "kernel crash dumps"
-       depends on X86_64 || (X86_32 && HIGHMEM)
-+      depends on !XEN
-       help
-         Generate crash dump after being started by kexec.
-         This should be normally only set in special crash dump kernels
-@@ -1440,6 +1484,7 @@ config COMPAT_VDSO
-       def_bool y
-       prompt "Compat VDSO support"
-       depends on X86_32 || IA32_EMULATION
-+      depends on !X86_XEN
-       help
-         Map the 32-bit VDSO to the predictable old-style address too.
-       ---help---
-@@ -1462,7 +1507,7 @@ config HAVE_ARCH_EARLY_PFN_TO_NID
-       depends on NUMA
- menu "Power management options"
--      depends on !X86_VOYAGER
-+      depends on !(X86_VOYAGER || XEN_UNPRIVILEGED_GUEST)
- config ARCH_HIBERNATION_HEADER
-       def_bool y
-@@ -1479,7 +1524,7 @@ config X86_APM_BOOT
- menuconfig APM
-       tristate "APM (Advanced Power Management) BIOS support"
--      depends on X86_32 && PM_SLEEP
-+      depends on X86_32 && PM_SLEEP && !XEN
-       ---help---
-         APM is a BIOS specification for saving power using several different
-         techniques. This is mostly useful for battery powered laptops with
-@@ -1645,6 +1690,7 @@ choice
- config PCI_GOBIOS
-       bool "BIOS"
-+      depends on !X86_XEN
- config PCI_GOMMCONFIG
-       bool "MMConfig"
-@@ -1656,6 +1702,13 @@ config PCI_GOOLPC
-       bool "OLPC"
-       depends on OLPC
-+config PCI_GOXEN_FE
-+      bool "Xen PCI Frontend"
-+      depends on X86_XEN
-+      help
-+        The PCI device frontend driver allows the kernel to import arbitrary
-+        PCI devices from a PCI backend to support PCI driver domains.
-+
- config PCI_GOANY
-       bool "Any"
-@@ -1663,7 +1716,7 @@ endchoice
- config PCI_BIOS
-       def_bool y
--      depends on X86_32 && PCI && (PCI_GOBIOS || PCI_GOANY)
-+      depends on X86_32 && PCI && !XEN && (PCI_GOBIOS || PCI_GOANY)
- # x86-64 doesn't support PCI BIOS access from long mode so always go direct.
- config PCI_DIRECT
-@@ -1686,6 +1739,22 @@ config PCI_MMCONFIG
-       bool "Support mmconfig PCI config space access"
-       depends on X86_64 && PCI && ACPI
-+config XEN_PCIDEV_FRONTEND
-+      bool "Xen PCI Frontend" if X86_64
-+      depends on PCI && ((X86_XEN && (PCI_GOXEN_FE || PCI_GOANY)) || X86_64_XEN)
-+      select HOTPLUG
-+      default y
-+      help
-+        The PCI device frontend driver allows the kernel to import arbitrary
-+        PCI devices from a PCI backend to support PCI driver domains.
-+
-+config XEN_PCIDEV_FE_DEBUG
-+      bool "Xen PCI Frontend Debugging"
-+      depends on XEN_PCIDEV_FRONTEND
-+      default n
-+      help
-+        Enables some debug statements within the PCI Frontend.
-+
- config DMAR
-       bool "Support for DMA Remapping Devices (EXPERIMENTAL)"
-       depends on X86_64 && PCI_MSI && ACPI && EXPERIMENTAL
-@@ -1736,7 +1805,7 @@ if X86_32
- config ISA
-       bool "ISA support"
--      depends on !X86_VOYAGER
-+      depends on !X86_VOYAGER && !XEN
-       help
-         Find out whether you have ISA slots on your motherboard.  ISA is the
-         name of a bus system, i.e. the way the CPU talks to the other stuff
-@@ -1763,7 +1832,7 @@ config EISA
- source "drivers/eisa/Kconfig"
- config MCA
--      bool "MCA support" if !X86_VOYAGER
-+      bool "MCA support" if !X86_VOYAGER && !XEN
-       default y if X86_VOYAGER
-       help
-         MicroChannel Architecture is found in some IBM PS/2 machines and
-@@ -1875,4 +1944,6 @@ source "crypto/Kconfig"
- source "arch/x86/kvm/Kconfig"
-+source "drivers/xen/Kconfig"
-+
- source "lib/Kconfig"
---- sle11-2009-06-04.orig/arch/x86/Kconfig.cpu 2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/Kconfig.cpu      2009-06-04 10:18:21.000000000 +0200
-@@ -340,7 +340,7 @@ config X86_PPRO_FENCE
- config X86_F00F_BUG
-       def_bool y
--      depends on M586MMX || M586TSC || M586 || M486 || M386
-+      depends on (M586MMX || M586TSC || M586 || M486 || M386) && !X86_NO_IDT
- config X86_WP_WORKS_OK
-       def_bool y
-@@ -397,6 +397,7 @@ config X86_P6_NOP
- config X86_TSC
-       def_bool y
-       depends on ((MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MVIAC7 || MGEODEGX1 || MGEODE_LX || MCORE2) && !X86_NUMAQ) || X86_64
-+      depends on !XEN
- config X86_CMPXCHG64
-       def_bool y
---- sle11-2009-06-04.orig/arch/x86/Kconfig.debug       2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/Kconfig.debug    2009-06-04 10:18:21.000000000 +0200
-@@ -143,7 +143,7 @@ config 4KSTACKS
- config DOUBLEFAULT
-       default y
-       bool "Enable doublefault exception handler" if EMBEDDED
--      depends on X86_32
-+      depends on X86_32 && !X86_NO_TSS
-       help
-         This option allows trapping of rare doublefault exceptions that
-         would otherwise cause a system to silently reboot. Disabling this
---- sle11-2009-06-04.orig/drivers/acpi/Kconfig 2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/acpi/Kconfig      2009-06-04 10:18:21.000000000 +0200
-@@ -362,6 +362,7 @@ config ACPI_SYSTEM
- config X86_PM_TIMER
-       bool "Power Management Timer Support" if EMBEDDED
-       depends on X86
-+      depends on !XEN
-       default y
-       help
-         The Power Management Timer is available on all ACPI-capable,
-@@ -415,4 +416,13 @@ config ACPI_SBS
-         This driver adds support for the Smart Battery System, another
-         type of access to battery information, found on some laptops.
-+config ACPI_PV_SLEEP
-+      bool
-+      depends on X86 && XEN && ACPI_SLEEP
-+      default y
-+
-+config PROCESSOR_EXTERNAL_CONTROL
-+      bool
-+      depends on (X86 || IA64) && XEN
-+      default y
- endif # ACPI
---- sle11-2009-06-04.orig/drivers/char/Kconfig 2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/char/Kconfig      2009-06-04 10:18:21.000000000 +0200
-@@ -1037,7 +1037,7 @@ config MAX_RAW_DEVS
- config HPET
-       bool "HPET - High Precision Event Timer" if (X86 || IA64)
-       default n
--      depends on ACPI
-+      depends on ACPI && !XEN
-       help
-         If you say Y here, you will have a miscdevice named "/dev/hpet/".  Each
-         open selects one of the timers supported by the HPET.  The timers are
---- sle11-2009-06-04.orig/drivers/char/tpm/Kconfig     2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/char/tpm/Kconfig  2009-06-04 10:18:21.000000000 +0200
-@@ -57,4 +57,13 @@ config TCG_INFINEON
-         Further information on this driver and the supported hardware
-         can be found at http://www.prosec.rub.de/tpm
-+config TCG_XEN
-+      tristate "XEN TPM Interface"
-+      depends on XEN
-+      ---help---
-+        If you want to make TPM support available to a Xen user domain,
-+        say Yes and it will be accessible from within Linux.
-+        To compile this driver as a module, choose M here; the module
-+        will be called tpm_xenu.
-+
- endif # TCG_TPM
---- sle11-2009-06-04.orig/drivers/cpufreq/Kconfig      2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/cpufreq/Kconfig   2009-06-04 10:18:21.000000000 +0200
-@@ -1,5 +1,6 @@
- config CPU_FREQ
-       bool "CPU Frequency scaling"
-+      depends on !PROCESSOR_EXTERNAL_CONTROL
-       help
-         CPU Frequency scaling allows you to change the clock speed of 
-         CPUs on the fly. This is a nice method to save power, because 
---- sle11-2009-06-04.orig/drivers/serial/Kconfig       2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/serial/Kconfig    2009-06-04 10:18:21.000000000 +0200
-@@ -10,6 +10,7 @@ menu "Serial drivers"
- config SERIAL_8250
-       tristate "8250/16550 and compatible serial support"
-       depends on (BROKEN || !SPARC)
-+      depends on !XEN_DISABLE_SERIAL
-       select SERIAL_CORE
-       ---help---
-         This selects whether you want to include the driver for the standard
---- sle11-2009-06-04.orig/drivers/video/Kconfig        2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/video/Kconfig     2009-06-04 10:18:21.000000000 +0200
-@@ -1583,7 +1583,7 @@ config FB_CYBLA
-       tristate "Cyberblade/i1 support"
-       depends on FB && PCI && X86_32 && !64BIT
-       select FB_CFB_IMAGEBLIT
--      select VIDEO_SELECT
-+      select VIDEO_SELECT if !XEN
-       ---help---
-         This driver is supposed to support the Trident Cyberblade/i1
-         graphics core integrated in the VIA VT8601A North Bridge,
---- sle11-2009-06-04.orig/drivers/video/console/Kconfig        2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/video/console/Kconfig     2009-06-04 10:18:21.000000000 +0200
-@@ -46,6 +46,7 @@ config VGACON_SOFT_SCROLLBACK_SIZE
- config VIDEO_SELECT
-       bool "Video mode selection support"
-       depends on  X86 && VGA_CONSOLE
-+      depends on !XEN
-       ---help---
-         This enables support for text mode selection on kernel startup. If
-         you want to take advantage of some high-resolution text mode your
---- sle11-2009-06-04.orig/drivers/xen/Kconfig  2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/Kconfig       2009-06-04 10:18:21.000000000 +0200
-@@ -1,6 +1,307 @@
-+#
-+# This Kconfig describe xen options
-+#
-+
-+mainmenu "Xen Configuration"
-+
-+config XEN
-+      bool
-+
-+if XEN
-+config XEN_INTERFACE_VERSION
-+      hex
-+      default 0x00030207
-+
-+menu "XEN"
-+
-+config XEN_PRIVILEGED_GUEST
-+      bool "Privileged Guest (domain 0)"
-+      select PCI_REASSIGN if PCI
-+      help
-+        Support for privileged operation (domain 0)
-+
-+config XEN_UNPRIVILEGED_GUEST
-+      def_bool !XEN_PRIVILEGED_GUEST
-+
-+config XEN_PRIVCMD
-+      def_bool y
-+      depends on PROC_FS
-+
-+config XEN_XENBUS_DEV
-+      def_bool y
-+      depends on PROC_FS
-+
-+config XEN_NETDEV_ACCEL_SFC_UTIL
-+      depends on X86
-+      tristate
-+
-+config XEN_BACKEND
-+        tristate "Backend driver support"
-+        default XEN_PRIVILEGED_GUEST
-+        help
-+          Support for backend device drivers that provide I/O services
-+          to other virtual machines.
-+
-+config XEN_BLKDEV_BACKEND
-+      tristate "Block-device backend driver"
-+        depends on XEN_BACKEND
-+      default XEN_BACKEND
-+      help
-+        The block-device backend driver allows the kernel to export its
-+        block devices to other guests via a high-performance shared-memory
-+        interface.
-+
-+config XEN_BLKDEV_TAP
-+      tristate "Block-device tap backend driver"
-+      depends on XEN_BACKEND
-+      default XEN_BACKEND
-+      help
-+        The block tap driver is an alternative to the block back driver
-+          and allows VM block requests to be redirected to userspace through
-+          a device interface.  The tap allows user-space development of
-+          high-performance block backends, where disk images may be implemented
-+          as files, in memory, or on other hosts across the network.  This
-+        driver can safely coexist with the existing blockback driver.
-+
-+config XEN_NETDEV_BACKEND
-+      tristate "Network-device backend driver"
-+        depends on XEN_BACKEND && NET
-+      default XEN_BACKEND
-+      help
-+        The network-device backend driver allows the kernel to export its
-+        network devices to other guests via a high-performance shared-memory
-+        interface.
-+
-+config XEN_NETDEV_PIPELINED_TRANSMITTER
-+      bool "Pipelined transmitter (DANGEROUS)"
-+      depends on XEN_NETDEV_BACKEND
-+      help
-+        If the net backend is a dumb domain, such as a transparent Ethernet
-+        bridge with no local IP interface, it is safe to say Y here to get
-+        slightly lower network overhead.
-+        If the backend has a local IP interface; or may be doing smart things
-+        like reassembling packets to perform firewall filtering; or if you
-+        are unsure; or if you experience network hangs when this option is
-+        enabled; then you must say N here.
-+
-+config XEN_NETDEV_ACCEL_SFC_BACKEND
-+      tristate "Network-device backend driver acceleration for Solarflare NICs"
-+      depends on XEN_NETDEV_BACKEND && SFC && SFC_RESOURCE && X86
-+      select XEN_NETDEV_ACCEL_SFC_UTIL
-+      default m
-+
-+config XEN_NETDEV_LOOPBACK
-+      tristate "Network-device loopback driver"
-+      depends on XEN_NETDEV_BACKEND
-+      help
-+        A two-interface loopback device to emulate a local netfront-netback
-+        connection. If unsure, it is probably safe to say N here.
-+
-+config XEN_PCIDEV_BACKEND
-+      tristate "PCI-device backend driver"
-+      depends on PCI && XEN_BACKEND
-+      default XEN_BACKEND
-+      help
-+        The PCI device backend driver allows the kernel to export arbitrary
-+        PCI devices to other guests. If you select this to be a module, you
-+        will need to make sure no other driver has bound to the device(s)
-+        you want to make visible to other guests.
-+
-+choice
-+      prompt "PCI Backend Mode"
-+      depends on XEN_PCIDEV_BACKEND
-+      default XEN_PCIDEV_BACKEND_VPCI if !IA64
-+      default XEN_PCIDEV_BACKEND_CONTROLLER if IA64
-+
-+config XEN_PCIDEV_BACKEND_VPCI
-+      bool "Virtual PCI"
-+      ---help---
-+        This PCI Backend hides the true PCI topology and makes the frontend
-+        think there is a single PCI bus with only the exported devices on it.
-+        For example, a device at 03:05.0 will be re-assigned to 00:00.0. A
-+        second device at 02:1a.1 will be re-assigned to 00:01.1.
-+
-+config XEN_PCIDEV_BACKEND_PASS
-+      bool "Passthrough"
-+      ---help---
-+        This PCI Backend provides a real view of the PCI topology to the
-+        frontend (for example, a device at 06:01.b will still appear at
-+        06:01.b to the frontend). This is similar to how Xen 2.0.x exposed
-+        PCI devices to its driver domains. This may be required for drivers
-+        which depend on finding their hardward in certain bus/slot
-+        locations.
-+
-+config XEN_PCIDEV_BACKEND_SLOT
-+      bool "Slot"
-+      ---help---
-+        This PCI Backend hides the true PCI topology and makes the frontend
-+        think there is a single PCI bus with only the exported devices on it.
-+        Contrary to the virtual PCI backend, a function becomes a new slot.
-+        For example, a device at 03:05.2 will be re-assigned to 00:00.0. A
-+        second device at 02:1a.1 will be re-assigned to 00:01.0.
-+
-+config XEN_PCIDEV_BACKEND_CONTROLLER
-+      bool "Controller"
-+      depends on IA64
-+      ---help---
-+        This PCI backend virtualizes the PCI bus topology by providing a
-+        virtual bus per PCI root device.  Devices which are physically under
-+        the same root bus will appear on the same virtual bus.  For systems
-+        with complex I/O addressing, this is the only backend which supports
-+        extended I/O port spaces and MMIO translation offsets.  This backend
-+        also supports slot virtualization.  For example, a device at
-+        0000:01:02.1 will be re-assigned to 0000:00:00.0.  A second device
-+        at 0000:02:05.0 (behind a P2P bridge on bus 0000:01) will be
-+        re-assigned to 0000:00:01.0.  A third device at 0000:16:05.0 (under
-+        a different PCI root bus) will be re-assigned to 0000:01:00.0.
-+
-+endchoice
-+
-+config XEN_PCIDEV_BE_DEBUG
-+      bool "PCI Backend Debugging"
-+      depends on XEN_PCIDEV_BACKEND
-+
-+config XEN_TPMDEV_BACKEND
-+      tristate "TPM-device backend driver"
-+        depends on XEN_BACKEND
-+      help
-+        The TPM-device backend driver
-+
-+config XEN_SCSI_BACKEND
-+      tristate "SCSI backend driver"
-+      depends on SCSI && XEN_BACKEND
-+      default m
-+      help
-+        The SCSI backend driver allows the kernel to export its SCSI Devices
-+        to other guests via a high-performance shared-memory interface.
-+
-+config XEN_BLKDEV_FRONTEND
-+      tristate "Block-device frontend driver"
-+      default y
-+      help
-+        The block-device frontend driver allows the kernel to access block
-+        devices mounted within another guest OS. Unless you are building a
-+        dedicated device-driver domain, or your master control domain
-+        (domain 0), then you almost certainly want to say Y here.
-+
-+config XEN_NETDEV_FRONTEND
-+      tristate "Network-device frontend driver"
-+      depends on NET
-+      default y
-+      help
-+        The network-device frontend driver allows the kernel to access
-+        network interfaces within another guest OS. Unless you are building a
-+        dedicated device-driver domain, or your master control domain
-+        (domain 0), then you almost certainly want to say Y here.
-+
-+config XEN_NETDEV_ACCEL_SFC_FRONTEND
-+      tristate "Network-device frontend driver acceleration for Solarflare NICs"
-+      depends on XEN_NETDEV_FRONTEND && X86
-+      select XEN_NETDEV_ACCEL_SFC_UTIL
-+      default m
-+
-+config XEN_SCSI_FRONTEND
-+      tristate "SCSI frontend driver"
-+      depends on SCSI
-+      default m
-+      help
-+        The SCSI frontend driver allows the kernel to access SCSI Devices
-+        within another guest OS.
-+
-+config XEN_GRANT_DEV
-+      tristate "User-space granted page access driver"
-+      default XEN_PRIVILEGED_GUEST
-+      help
-+        Device for accessing (in user-space) pages that have been granted
-+        by other domains.
-+
-+config XEN_FRAMEBUFFER
-+      tristate "Framebuffer-device frontend driver"
-+      depends on FB
-+      select FB_CFB_FILLRECT
-+      select FB_CFB_COPYAREA
-+      select FB_CFB_IMAGEBLIT
-+      default y
-+      help
-+        The framebuffer-device frontend drivers allows the kernel to create a
-+        virtual framebuffer.  This framebuffer can be viewed in another
-+        domain.  Unless this domain has access to a real video card, you
-+        probably want to say Y here.
-+
-+config XEN_KEYBOARD
-+      tristate "Keyboard-device frontend driver"
-+      depends on XEN_FRAMEBUFFER && INPUT
-+      default y
-+      help
-+        The keyboard-device frontend driver allows the kernel to create a
-+        virtual keyboard.  This keyboard can then be driven by another
-+        domain.  If you've said Y to CONFIG_XEN_FRAMEBUFFER, you probably
-+        want to say Y here.
-+
-+config XEN_DISABLE_SERIAL
-+      bool "Disable serial port drivers"
-+      default y
-+      help
-+        Disable serial port drivers, allowing the Xen console driver
-+        to provide a serial console at ttyS0.
-+
-+config XEN_SYSFS
-+      tristate "Export Xen attributes in sysfs"
-+      depends on SYSFS
-+      select SYS_HYPERVISOR
-+      default y
-+      help
-+        Xen hypervisor attributes will show up under /sys/hypervisor/.
-+
-+choice
-+      prompt "Xen version compatibility"
-+      default XEN_COMPAT_030002_AND_LATER
-+
-+      config XEN_COMPAT_030002_AND_LATER
-+              bool "3.0.2 and later"
-+
-+      config XEN_COMPAT_030004_AND_LATER
-+              bool "3.0.4 and later"
-+
-+      config XEN_COMPAT_030100_AND_LATER
-+              bool "3.1.0 and later"
-+
-+      config XEN_COMPAT_LATEST_ONLY
-+              bool "no compatibility code"
-+
-+endchoice
-+
-+config XEN_COMPAT
-+      hex
-+      default 0xffffff if XEN_COMPAT_LATEST_ONLY
-+      default 0x030100 if XEN_COMPAT_030100_AND_LATER
-+      default 0x030004 if XEN_COMPAT_030004_AND_LATER
-+      default 0x030002 if XEN_COMPAT_030002_AND_LATER
-+      default 0
-+
-+endmenu
-+
-+config HAVE_IRQ_IGNORE_UNHANDLED
-+      def_bool y
-+
-+config NO_IDLE_HZ
-+      def_bool y
-+
-+config XEN_SMPBOOT
-+      def_bool y
-+      depends on SMP && !PPC_XEN
-+
-+config XEN_XENCOMM
-+      bool
-+
-+config XEN_DEVMEM
-+      def_bool y
-+
-+endif
-+
- config XEN_BALLOON
--      bool "Xen memory balloon driver"
--      depends on XEN
-+      bool "Xen memory balloon driver" if PARAVIRT_XEN
-+      depends on (XEN && !PPC_XEN) || PARAVIRT_XEN
-       default y
-       help
-         The balloon driver allows the Xen domain to request more memory from
-@@ -8,12 +309,14 @@ config XEN_BALLOON
-         return unneeded memory to the system.
- config XEN_SCRUB_PAGES
--      bool "Scrub pages before returning them to system"
--      depends on XEN_BALLOON
-+      bool "Scrub memory before freeing it to Xen"
-+      depends on XEN || XEN_BALLOON
-       default y
-       help
--        Scrub pages before returning them to the system for reuse by
--        other domains.  This makes sure that any confidential data
--        is not accidentally visible to other domains.  Is it more
--        secure, but slightly less efficient.
-+        Erase memory contents before freeing it back to Xen's global
-+        pool. This ensures that any secrets contained within that
-+        memory (e.g., private keys) cannot be found by other guests that
-+        may be running on the machine. Most people will want to say Y here.
-+        If security is not a concern then you may increase performance by
-+        saying N.
-         If in doubt, say yes.
---- sle11-2009-06-04.orig/fs/Kconfig   2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/fs/Kconfig        2009-06-04 10:18:21.000000000 +0200
-@@ -1011,6 +1011,7 @@ config HUGETLBFS
-       bool "HugeTLB file system support"
-       depends on X86 || IA64 || PPC64 || SPARC64 || (SUPERH && MMU) || \
-                  (S390 && 64BIT) || BROKEN
-+      depends on !XEN
-       help
-         hugetlbfs is a filesystem backing for HugeTLB pages, based on
-         ramfs. For architectures that support it, say Y here and read
---- sle11-2009-06-04.orig/kernel/Kconfig.preempt       2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/kernel/Kconfig.preempt    2009-06-04 10:18:21.000000000 +0200
-@@ -35,6 +35,7 @@ config PREEMPT_VOLUNTARY
- config PREEMPT
-       bool "Preemptible Kernel (Low-Latency Desktop)"
-+      depends on !XEN
-       help
-         This option reduces the latency of the kernel by making
-         all kernel code (that is not executing in a critical section)
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-panic-on-io-nmi.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-panic-on-io-nmi.diff
deleted file mode 100644 (file)
index 9e49d50..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-From: Kurt Garloff <garloff@suse.de>
-Subject: [PATCH] X86: sysctl to allow panic on IOCK NMI error
-References: bnc427979
-
-This patch introduces a sysctl /proc/sys/kernel/panic_on_io_nmi.,
-which defaults to 0 (off).
-When enabled, the kernel panics when the kernel receives an NMI
-caused by an IO error.
-
-The IO error triggered NMI indicates a serious system condition,
-which could result in IO data corruption. Rather than contiuing,
-panicing and dumping might be a better choice, so one can figure
-out what's causing the IO error.
-This could be especially important to companies running IO intensive
-applications where corruption must be avoided, e.g. a banks databases.
-
-
-Signed-off-by: Roberto Angelino <robertangelino@gmail.com>
-
-
-Automatically created from "patches.suse/panic-on-io-nmi.diff" by xen-port-patches.py
-
-Index: head-2008-11-25/arch/x86/kernel/traps_32-xen.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/traps_32-xen.c        2008-11-25 12:57:05.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/traps_32-xen.c     2008-11-25 13:13:12.000000000 +0100
-@@ -83,6 +83,7 @@ gate_desc idt_table[256]
- #endif
- int panic_on_unrecovered_nmi;
-+int panic_on_io_nmi;
- int kstack_depth_to_print = 24;
- static unsigned int code_bytes = 64;
- static int ignore_nmis;
-@@ -670,6 +671,9 @@ io_check_error(unsigned char reason, str
-       printk(KERN_EMERG "NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-+      if (panic_on_io_nmi)
-+              panic("NMI IOCK error: Not continuing");
-+
-       /* Re-enable the IOCK line, wait for a few seconds */
-       clear_io_check_error(reason);
- }
-Index: head-2008-11-25/arch/x86/kernel/traps_64-xen.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/traps_64-xen.c        2008-11-25 12:57:05.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/traps_64-xen.c     2008-11-25 13:13:12.000000000 +0100
-@@ -56,6 +56,7 @@
- #include <mach_traps.h>
- int panic_on_unrecovered_nmi;
-+int panic_on_io_nmi;
- int kstack_depth_to_print = 12;
- static unsigned int code_bytes = 64;
- static int ignore_nmis;
-@@ -772,6 +773,9 @@ io_check_error(unsigned char reason, str
-       printk("NMI: IOCK error (debug interrupt?)\n");
-       show_registers(regs);
-+      if (panic_on_io_nmi)
-+              panic("NMI IOCK error: Not continuing");
-+
-       /* Re-enable the IOCK line, wait for a few seconds */
-       clear_io_check_error(reason);
- }
diff --git a/src/patches/suse-2.6.27.31/patches.xen/xen3-uv_setup_irq.diff b/src/patches/suse-2.6.27.31/patches.xen/xen3-uv_setup_irq.diff
deleted file mode 100644 (file)
index 416124f..0000000
+++ /dev/null
@@ -1,28 +0,0 @@
-From: Dean Nelson <dcn@sgi.com>
-Date: Thu, 2 Oct 2008 17:18:21 +0000 (-0500)
-Subject: x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3
-X-Git-Tag: v2.6.28-rc1~80^2~27
-X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Ftorvalds%2Flinux-2.6.git;a=commitdiff_plain;h=4173a0e7371ece227559b44943c6fd456ee470d1
-References: bnc#442461
-
-x86, UV: add uv_setup_irq() and uv_teardown_irq() functions, v3
-
-Provide a means for UV interrupt MMRs to be setup with the message to be sent
-when an MSI is raised.
-
-Signed-off-by: Dean Nelson <dcn@sgi.com>
-Signed-off-by: Ingo Molnar <mingo@elte.hu>
-Acked-by: Bernhard Walle <bwalle@suse.de>
-
-Automatically created from "patches.fixes/uv_setup_irq.diff" by xen-port-patches.py
-
-Index: head-2008-12-01/arch/x86/kernel/Makefile
-===================================================================
---- head-2008-12-01.orig/arch/x86/kernel/Makefile      2008-12-01 11:49:07.000000000 +0100
-+++ head-2008-12-01/arch/x86/kernel/Makefile   2008-12-01 12:06:39.000000000 +0100
-@@ -126,4 +126,4 @@ endif
- disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o hpet.o i8253.o \
-       i8259.o irqinit_$(BITS).o pci-swiotlb_64.o reboot.o smpboot.o \
--      tlb_$(BITS).o tsc.o tsc_sync.o vsmp_64.o
-+      tlb_$(BITS).o tsc.o tsc_sync.o uv_%.o vsmp_64.o
diff --git a/src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix.patch b/src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix.patch
new file mode 100644 (file)
index 0000000..f9ee696
--- /dev/null
@@ -0,0 +1,208 @@
+From: Andreas Herrmann <andreas.herrmann3@amd.com>
+Subject: x86: Fix CPU llc_shared_map information for AMD Magny-Cours
+References: fate#307306
+Patch-Mainline: yes
+Commit-ID: 4a376ec3a2599c02207cd4cbd5dbf73783548463
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+Construct entire NodeID and use it as cpu_llc_id. Thus internal node
+siblings are stored in llc_shared_map.
+
+Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+
+---
+ arch/x86/kernel/cpu/amd.c    |   62 +++++++++++++++++++++++++++++++++++++++++
+ arch/x86/kernel/cpu/amd_64.c |   64 +++++++++++++++++++++++++++++++++++++++++++
+ include/asm-x86/cpufeature.h |    1 
+ 3 files changed, 127 insertions(+)
+
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/cpu/amd.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/kernel/cpu/amd.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/cpu/amd.c
+@@ -4,6 +4,7 @@
+ #include <asm/io.h>
+ #include <asm/processor.h>
+ #include <asm/apic.h>
++#include <asm/pci-direct.h>
+ #include <mach_apic.h>
+ #include "cpu.h"
+@@ -38,6 +39,64 @@ static void __cpuinit early_init_amd(str
+               set_cpu_cap(c, X86_FEATURE_K6_MTRR);
+ }
++/*
++ * Fixup core topology information for AMD multi-node processors.
++ * Assumption 1: Number of cores in each internal node is the same.
++ * Assumption 2: Mixed systems with both single-node and dual-node
++ *               processors are not supported.
++ */
++#ifdef CONFIG_X86_HT
++static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
++{
++#ifdef CONFIG_PCI
++      u32 t, cpn;
++      u8 n, n_id;
++      int cpu = smp_processor_id();
++
++      /* fixup topology information only once for a core */
++      if (cpu_has(c, X86_FEATURE_AMD_DCM))
++              return;
++
++      /* check for multi-node processor on boot cpu */
++      t = read_pci_config(0, 24, 3, 0xe8);
++      if (!(t & (1 << 29)))
++              return;
++
++      set_cpu_cap(c, X86_FEATURE_AMD_DCM);
++
++      /* cores per node: each internal node has half the number of cores */
++      cpn = c->x86_max_cores >> 1;
++
++      /* even-numbered NB_id of this dual-node processor */
++      n = c->phys_proc_id << 1;
++
++      /*
++       * determine internal node id and assign cores fifty-fifty to
++       * each node of the dual-node processor
++       */
++      t = read_pci_config(0, 24 + n, 3, 0xe8);
++      n = (t>>30) & 0x3;
++      if (n == 0) {
++              if (c->cpu_core_id < cpn)
++                      n_id = 0;
++              else
++                      n_id = 1;
++      } else {
++              if (c->cpu_core_id < cpn)
++                      n_id = 1;
++              else
++                      n_id = 0;
++      }
++
++      /* compute entire NodeID, use llc_shared_map to store sibling info */
++      per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
++
++      /* fixup core id to be in range from 0 to cpn */
++      c->cpu_core_id = c->cpu_core_id % cpn;
++#endif
++}
++#endif
++
+ static void __cpuinit init_amd(struct cpuinfo_x86 *c)
+ {
+       u32 l, h;
+@@ -250,6 +309,9 @@ static void __cpuinit init_amd(struct cp
+               printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
+                      cpu, c->x86_max_cores, c->cpu_core_id);
+       }
++      /* fixup topology information on multi-node processors */
++      if ((c->x86 == 0x10) && (c->x86_model == 9))
++              amd_fixup_dcm(c);
+ #endif
+       if (cpuid_eax(0x80000000) >= 0x80000006) {
+Index: linux-2.6.27-SLE11_BRANCH/include/asm-x86/cpufeature.h
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/include/asm-x86/cpufeature.h
++++ linux-2.6.27-SLE11_BRANCH/include/asm-x86/cpufeature.h
+@@ -84,6 +84,7 @@
+ #define X86_FEATURE_AMDC1E    (3*32+21) /* AMD C1E detected */
+ #define X86_FEATURE_XTOPOLOGY (3*32+22) /* cpu topology enum extensions */
+ #define X86_FEATURE_TSC_RELIABLE (3*32+23) /* TSC is known to be reliable */
++#define X86_FEATURE_AMD_DCM     (3*32+27) /* multi-node processor */
+ /* Intel-defined CPU features, CPUID level 0x00000001 (ecx), word 4 */
+ #define X86_FEATURE_XMM3      (4*32+ 0) /* Streaming SIMD Extensions-3 */
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/cpu/amd_64.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/kernel/cpu/amd_64.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/cpu/amd_64.c
+@@ -4,6 +4,7 @@
+ #include <asm/numa_64.h>
+ #include <asm/mmconfig.h>
+ #include <asm/cacheflush.h>
++#include <asm/pci-direct.h>
+ #include <mach_apic.h>
+@@ -31,6 +32,64 @@ static int __cpuinit nearby_node(int api
+ #endif
+ /*
++ * Fixup core topology information for AMD multi-node processors.
++ * Assumption 1: Number of cores in each internal node is the same.
++ * Assumption 2: Mixed systems with both single-node and dual-node
++ *               processors are not supported.
++ */
++#ifdef CONFIG_X86_HT
++static void __cpuinit amd_fixup_dcm(struct cpuinfo_x86 *c)
++{
++#ifdef CONFIG_PCI
++      u32 t, cpn;
++      u8 n, n_id;
++      int cpu = smp_processor_id();
++
++      /* fixup topology information only once for a core */
++      if (cpu_has(c, X86_FEATURE_AMD_DCM))
++              return;
++
++      /* check for multi-node processor on boot cpu */
++      t = read_pci_config(0, 24, 3, 0xe8);
++      if (!(t & (1 << 29)))
++              return;
++
++      set_cpu_cap(c, X86_FEATURE_AMD_DCM);
++
++      /* cores per node: each internal node has half the number of cores */
++      cpn = c->x86_max_cores >> 1;
++
++      /* even-numbered NB_id of this dual-node processor */
++      n = c->phys_proc_id << 1;
++
++      /*
++       * determine internal node id and assign cores fifty-fifty to
++       * each node of the dual-node processor
++       */
++      t = read_pci_config(0, 24 + n, 3, 0xe8);
++      n = (t>>30) & 0x3;
++      if (n == 0) {
++              if (c->cpu_core_id < cpn)
++                      n_id = 0;
++              else
++                      n_id = 1;
++      } else {
++              if (c->cpu_core_id < cpn)
++                      n_id = 1;
++              else
++                      n_id = 0;
++      }
++
++      /* compute entire NodeID, use llc_shared_map to store sibling info */
++      per_cpu(cpu_llc_id, cpu) = (c->phys_proc_id << 1) + n_id;
++
++      /* fixup core id to be in range from 0 to cpn */
++      c->cpu_core_id = c->cpu_core_id % cpn;
++#endif
++}
++#endif
++
++/*
+  * On a AMD dual core setup the lower bits of the APIC id distingush the cores.
+  * Assumes number of cores is a power of two.
+  */
+@@ -49,6 +108,11 @@ static void __cpuinit amd_detect_cmp(str
+       c->cpu_core_id = c->initial_apicid & ((1 << bits)-1);
+       /* Convert the initial APIC ID into the socket ID */
+       c->phys_proc_id = c->initial_apicid >> bits;
++#ifdef CONFIG_X86_HT
++      /* fixup topology information on multi-node processors */
++      if ((c->x86 == 0x10) && (c->x86_model == 9))
++              amd_fixup_dcm(c);
++#endif
+ #ifdef CONFIG_NUMA
+       node = c->phys_proc_id;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix_1.patch b/src/patches/suse-2.6.27.39/patches.arch/amd_magny_cour_topology_fix_1.patch
new file mode 100644 (file)
index 0000000..7008648
--- /dev/null
@@ -0,0 +1,80 @@
+From: Andreas Herrmann <andreas.herrmann3@amd.com>
+Subject: x86, sched: Workaround broken sched domain creation for AMD Magny-Cours
+References: fate#307306
+Patch-Mainline: yes
+Commit-ID: 5a925b4282d7f805deafde62001a83dbaf8be275
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+Current sched domain creation code can't handle multi-node processors.
+When switching to power_savings scheduling errors show up and
+system might hang later on (due to broken sched domain hierarchy):
+
+  # echo 0  >> /sys/devices/system/cpu/sched_mc_power_savings
+  CPU0 attaching sched-domain:
+   domain 0: span 0-5 level MC
+    groups: 0 1 2 3 4 5
+    domain 1: span 0-23 level NODE
+     groups: 0-5 6-11 18-23 12-17
+  ...
+  # echo 1  >> /sys/devices/system/cpu/sched_mc_power_savings
+  CPU0 attaching sched-domain:
+   domain 0: span 0-11 level MC
+    groups: 0 1 2 3 4 5 6 7 8 9 10 11
+  ERROR: parent span is not a superset of domain->span
+    domain 1: span 0-5 level CPU
+  ERROR: domain->groups does not contain CPU0
+     groups: 6-11 (__cpu_power = 12288)
+  ERROR: groups don't span domain->span
+     domain 2: span 0-23 level NODE
+      groups:
+  ERROR: domain->cpu_power not set
+
+  ERROR: groups don't span domain->span
+  ...
+
+Fixing all aspects of power-savings scheduling for Magny-Cours needs
+some larger changes in the sched domain creation code.
+
+As a short-term and temporary workaround avoid the problems by
+extending "the worst possible hack" ;-(
+and always use llc_shared_map on AMD Magny-Cours when MC domain span
+is calculated.
+
+With this I get:
+
+  # echo 1  >> /sys/devices/system/cpu/sched_mc_power_savings
+  CPU0 attaching sched-domain:
+   domain 0: span 0-5 level MC
+    groups: 0 1 2 3 4 5
+    domain 1: span 0-5 level CPU
+     groups: 0-5 (__cpu_power = 6144)
+     domain 2: span 0-23 level NODE
+      groups: 0-5 (__cpu_power = 6144) 6-11 (__cpu_power = 6144) 18-23 (__cpu_power = 6144) 12-17 (__cpu_power = 6144)
+  ...
+
+I.e. no errors during sched domain creation, no system hangs, and also
+mc_power_savings scheduling works to a certain extend.
+
+Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
+Signed-off-by: Andreas Herrmann <andreas.herrmann3@amd.com>
+Signed-off-by: H. Peter Anvin <hpa@zytor.com>
+
+---
+ arch/x86/kernel/smpboot.c |    3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/smpboot.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/kernel/smpboot.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/smpboot.c
+@@ -502,7 +502,8 @@ cpumask_t cpu_coregroup_map(int cpu)
+        * For perf, we return last level cache shared map.
+        * And for power savings, we return cpu_core_map
+        */
+-      if (sched_mc_power_savings || sched_smt_power_savings)
++      if ((sched_mc_power_savings || sched_smt_power_savings) &&
++          !(cpu_has(c, X86_FEATURE_AMD_DCM)))
+               return per_cpu(cpu_core_map, cpu);
+       else
+               return c->llc_shared_map;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch b/src/patches/suse-2.6.27.39/patches.arch/bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch
new file mode 100644 (file)
index 0000000..f77f207
--- /dev/null
@@ -0,0 +1,108 @@
+From: Rafael J. Wysocki <rjw@suse.de>
+Subject: x86_64 / PCI: Insert IO-APIC resources before unassigned resources
+References: bnc#531260
+Patch-upstream: Yes
+
+Based on upstream commit 857fdc53a0a90c3ba7fcf5b1fb4c7a62ae03cf82
+(x86/pci: insert ioapic resource before assigning unassigned
+resources) from Yinghai Lu <yinghai@kernel.org>.
+
+It turns out that:
+(1) AMD-based systems have two HT chains.
+(2) BIOS doesn't allocate resources for BAR 6 of devices under 8132
+    etc.
+(3) Multi-peer-root patch will try to split root resources to peer
+    root resources according to PCI conf of NB
+(4) PCI core assigns unassigned resources, but they overlap with BARs
+    that are used by IO-APIC addr of io4 and 8132.
+
+This happens because at that point the IO-APIC resources have not
+been inserted yet.  The solution is to insert IO-APIC resources into
+the tree a bit earlier.
+
+Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
+---
+ arch/x86/kernel/io_apic_64.c |   10 ++--------
+ arch/x86/pci/i386.c          |    7 +++++++
+ include/asm-x86/io_apic.h    |    4 ++++
+ 3 files changed, 13 insertions(+), 8 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/include/asm-x86/io_apic.h
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/include/asm-x86/io_apic.h
++++ linux-2.6.27-SLE11_BRANCH/include/asm-x86/io_apic.h
+@@ -211,12 +211,16 @@ extern void ioapic_init_mappings(void);
+ extern int save_mask_IO_APIC_setup(void);
+ extern void restore_IO_APIC_setup(void);
+ extern void reinit_intr_remapped_IO_APIC(int);
++extern void ioapic_insert_resources(void);
++#else
++static inline void ioapic_insert_resources(void) { }
+ #endif
+ #else  /* !CONFIG_X86_IO_APIC */
+ #define io_apic_assign_pci_irqs 0
+ static const int timer_through_8259 = 0;
+ static inline void ioapic_init_mappings(void) { }
++static inline void ioapic_insert_resources(void) { }
+ #endif
+ #endif
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/io_apic_64.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/kernel/io_apic_64.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/kernel/io_apic_64.c
+@@ -3030,7 +3030,7 @@ void __init ioapic_init_mappings(void)
+       }
+ }
+-static int __init ioapic_insert_resources(void)
++void __init ioapic_insert_resources(void)
+ {
+       int i;
+       struct resource *r = ioapic_resources;
+@@ -3038,18 +3038,12 @@ static int __init ioapic_insert_resource
+       if (!r) {
+               printk(KERN_ERR
+                      "IO APIC resources could be not be allocated.\n");
+-              return -1;
++              return;
+       }
+       for (i = 0; i < nr_ioapics; i++) {
+               insert_resource(&iomem_resource, r);
+               r++;
+       }
+-
+-      return 0;
+ }
+-/* Insert the IO APIC resources after PCI initialization has occured to handle
+- * IO APICS that are mapped in on a BAR in PCI space. */
+-late_initcall(ioapic_insert_resources);
+-
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/pci/i386.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/pci/i386.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/pci/i386.c
+@@ -33,6 +33,7 @@
+ #include <linux/bootmem.h>
+ #include <asm/pat.h>
++#include <asm/io_apic.h>
+ #include "pci.h"
+@@ -227,6 +228,12 @@ void __init pcibios_resource_survey(void
+       pcibios_allocate_bus_resources(&pci_root_buses);
+       pcibios_allocate_resources(0);
+       pcibios_allocate_resources(1);
++      /*
++       * Insert the IO APIC resources after PCI initialization has
++       * occured to handle IO APICS that are mapped in on a BAR in
++       * PCI space, but before trying to assign unassigned pci res.
++       */
++      ioapic_insert_resources();
+ }
+ /**
diff --git a/src/patches/suse-2.6.27.39/patches.arch/bug-535380-x86-change-some-messages-to-debug.patch b/src/patches/suse-2.6.27.39/patches.arch/bug-535380-x86-change-some-messages-to-debug.patch
new file mode 100644 (file)
index 0000000..76193d8
--- /dev/null
@@ -0,0 +1,44 @@
+From: Rafael J. Wysocki <rjw@suse.de>
+Subject: x86: Decrease the level of some NUMA messages to KERN_DEBUG
+References: bnc#535380
+Patch-upstream: Yes
+
+This is a backport of upstream commit
+23b6c52cf558f2a1dc6c7010c601b3624eb4591f
+(x86: Decrease the level of some NUMA messages to KERN_DEBUG).
+
+Some NUMA messages in srat_32.c are confusing to users, because they
+seem to indicate errors, while in fact they reflect normal behaviour.
+
+Decrease the level of these messages to KERN_DEBUG so that they don't
+show up unnecessarily.
+
+Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
+---
+ arch/x86/mm/srat_32.c |    6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/arch/x86/mm/srat_32.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/arch/x86/mm/srat_32.c
++++ linux-2.6.27-SLE11_BRANCH/arch/x86/mm/srat_32.c
+@@ -215,8 +215,8 @@ int __init get_memcfg_from_srat(void)
+               goto out_fail;
+       if (num_memory_chunks == 0) {
+-              printk(KERN_WARNING
+-                       "could not finy any ACPI SRAT memory areas.\n");
++              printk(KERN_DEBUG
++                       "could not find any ACPI SRAT memory areas.\n");
+               goto out_fail;
+       }
+@@ -277,7 +277,7 @@ int __init get_memcfg_from_srat(void)
+       }
+       return 1;
+ out_fail:
+-      printk(KERN_ERR "failed to get NUMA memory information from SRAT"
++      printk(KERN_DEBUG "failed to get NUMA memory information from SRAT"
+                       " table\n");
+       return 0;
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.arch/ia64-fix-csum_ipv6_magic.patch b/src/patches/suse-2.6.27.39/patches.arch/ia64-fix-csum_ipv6_magic.patch
new file mode 100755 (executable)
index 0000000..e65fd37
--- /dev/null
@@ -0,0 +1,44 @@
+From: Jiri Bohac <jbohac@suse.cz>
+Patch-mainline: 2.6.31-rc9; 5afe18d2f58812f3924edbd215464e5e3e8545e7
+Subject: IA64: fix csum_ipv6_magic()
+References: bnc#459146
+    
+The 32-bit parameters (len and csum) of csum_ipv6_magic() are passed in 64-bit
+registers in2 and in4. The high order 32 bits of the registers were never
+cleared, and garbage was sometimes calculated into the checksum.
+
+Fix this by clearing the high order 32 bits of these registers.
+
+Signed-off-by: Jiri Bohac <jbohac@suse.cz>
+Signed-off-by: Tony Luck <tony.luck@intel.com>
+
+diff --git a/arch/ia64/lib/ip_fast_csum.S b/arch/ia64/lib/ip_fast_csum.S
+index 1f86aeb..620d9dc 100644
+--- a/arch/ia64/lib/ip_fast_csum.S
++++ b/arch/ia64/lib/ip_fast_csum.S
+@@ -96,20 +96,22 @@ END(ip_fast_csum)
+ GLOBAL_ENTRY(csum_ipv6_magic)
+       ld4     r20=[in0],4
+       ld4     r21=[in1],4
+-      dep     r15=in3,in2,32,16
++      zxt4    in2=in2
+       ;;
+       ld4     r22=[in0],4
+       ld4     r23=[in1],4
+-      mux1    r15=r15,@rev
++      dep     r15=in3,in2,32,16
+       ;;
+       ld4     r24=[in0],4
+       ld4     r25=[in1],4
+-      shr.u   r15=r15,16
++      mux1    r15=r15,@rev
+       add     r16=r20,r21
+       add     r17=r22,r23
++      zxt4    in4=in4
+       ;;
+       ld4     r26=[in0],4
+       ld4     r27=[in1],4
++      shr.u   r15=r15,16
+       add     r18=r24,r25
+       add     r8=r16,r17
+       ;;
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.arch/ia64-sn-fix-pci-attribute-propagation-bug.patch
rename to src/patches/suse-2.6.27.39/patches.arch/ia64-sn-fix-pci-attribute-propagation-bug.patch
index fe211d09c12c74e7fa380b66ad559a714952535c..e401038241f283c8808178aa1c5fbc69017faff8 100644 (file)
@@ -60,7 +60,7 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
                pci_addr = IS_PIC_SOFT(pcibus_info) ?
                                PHYS_TO_DMA(paddr) :
 -                              PHYS_TO_TIODMA(paddr) | dma_attributes;
-+                              PHYS_TO_TIODMA(paddr);
++                              PHYS_TO_TIODMA(paddr);
        else
 -              pci_addr = IS_PIC_SOFT(pcibus_info) ?
 -                              paddr :
similarity index 86%
rename from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries-migration_hang_fix.patch
rename to src/patches/suse-2.6.27.39/patches.arch/ppc-pseries-migration_hang_fix.patch
index 7a02348ca941aa809db6bfdd0f7d36d73dbea503..15e2a99f3a99932c479c2bb1ec563632be6c390a 100644 (file)
@@ -22,7 +22,7 @@ Signed-off-by: Olaf Hering <olh@suse.de>
 
 --- a/arch/powerpc/kernel/rtas.c
 +++ b/arch/powerpc/kernel/rtas.c
-@@ -46,6 +46,7 @@ EXPORT_SYMBOL(rtas);
+@@ -47,6 +47,7 @@ EXPORT_SYMBOL(rtas);
  
  struct rtas_suspend_me_data {
        atomic_t working; /* number of cpus accessing this struct */
@@ -30,16 +30,16 @@ Signed-off-by: Olaf Hering <olh@suse.de>
        int token; /* ibm,suspend-me */
        int error;
        struct completion *complete; /* wait on this until working == 0 */
-@@ -663,7 +664,7 @@ static int ibm_suspend_me_token = RTAS_U
+@@ -664,7 +665,7 @@ static int ibm_suspend_me_token = RTAS_U
  #ifdef CONFIG_PPC_PSERIES
  static void rtas_percpu_suspend_me(void *info)
  {
 -      long rc;
 +      long rc = H_SUCCESS;
        unsigned long msr_save;
+       u16 slb_size = mmu_slb_size;
        int cpu;
-       struct rtas_suspend_me_data *data =
-@@ -675,7 +676,8 @@ static void rtas_percpu_suspend_me(void 
+@@ -677,7 +678,8 @@ static void rtas_percpu_suspend_me(void
        msr_save = mfmsr();
        mtmsr(msr_save & ~(MSR_EE));
  
@@ -49,7 +49,7 @@ Signed-off-by: Olaf Hering <olh@suse.de>
  
        mtmsr(msr_save);
  
-@@ -698,6 +700,9 @@ static void rtas_percpu_suspend_me(void 
+@@ -703,6 +705,9 @@ static void rtas_percpu_suspend_me(void
                       smp_processor_id(), rc);
                data->error = rc;
        }
@@ -59,7 +59,7 @@ Signed-off-by: Olaf Hering <olh@suse.de>
        /* This cpu did the suspend or got an error; in either case,
         * we need to prod all other other cpus out of join state.
         * Extra prods are harmless.
-@@ -740,6 +745,7 @@ static int rtas_ibm_suspend_me(struct rt
+@@ -745,6 +750,7 @@ static int rtas_ibm_suspend_me(struct rt
        }
  
        atomic_set(&data.working, 0);
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.arch/ppc-pseries_pfn-mem-rm.patch
rename to src/patches/suse-2.6.27.39/patches.arch/ppc-pseries_pfn-mem-rm.patch
index 5ffe36fe29eae0afa2371b4dbd71d77bf6b4ab26..b2cbef617fcc0d9c5f4452c802d49a9f4c6ac092 100644 (file)
@@ -19,7 +19,7 @@ References: 435181
 +               * Failing hotplug memory add will end up calling
 +               * remove device node to clean up. Since its already
 +               * added to lmbs, we need to remove it and pretend
-+               * success.
++               * success.
 +               */
 +              lmb_remove(base, lmb_size);
 +              return 0;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/s390-01-05-kmsg-v3.patch
rename to src/patches/suse-2.6.27.39/patches.arch/s390-01-05-kmsg-v3.patch
index 074ec8f32098d4571318a10c99cb156f42406a4f..931105e7637142012aac24401b4cac5e7cb83197 100644 (file)
@@ -8659,7 +8659,7 @@ Acked-by: John Jolly <jjolly@suse.de>
        if (retval) {
 -              pr_err("zfcp: Registration with common I/O layer failed.\n");
 +              pr_err("The zfcp device driver could not register with "
-+                     "the common I/O layer\n");
++                     "the common I/O layer\n");
                goto out_ccw_register;
        }
  
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/s390-06-05-qdio_s390dbf.patch
rename to src/patches/suse-2.6.27.39/patches.arch/s390-06-05-qdio_s390dbf.patch
index 013cf886ae05beba364c393a7695aca407224637..11807d76284db5cccef4e02106603b286bd6c13b 100644 (file)
@@ -1294,8 +1294,8 @@ Acked-by: John Jolly <jjolly@suse.de>
 +               (irq_ptr->qib.qfmt == QDIO_QETH_QFMT) ? "OSA" :
 +                      ((irq_ptr->qib.qfmt == QDIO_ZFCP_QFMT) ? "ZFCP" : "HS"),
 +               irq_ptr->schid.sch_no,
-+               is_thinint_irq(irq_ptr),
-+               (irq_ptr->sch_token) ? 1 : 0,
++               is_thinint_irq(irq_ptr),
++               (irq_ptr->sch_token) ? 1 : 0,
 +               (irq_ptr->qib.ac & QIB_AC_OUTBOUND_PCI_SUPPORTED) ? 1 : 0,
 +               css_general_characteristics.aif_tdd,
 +               (irq_ptr->siga_flag.input) ? "R" : " ",
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-01-framepointer.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-01-framepointer.patch
new file mode 100644 (file)
index 0000000..a93cce1
--- /dev/null
@@ -0,0 +1,65 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [S390] omit frame pointers on s390 when possible
+References: bnc#532063,LTC#55526
+
+commit 75ee034addc9ac3f6a38a9e6b30e9b54be15d4e5
+Author: Heiko Carstens <heiko.carstens@de.ibm.com>
+Date:   Thu Apr 23 13:58:10 2009 +0200
+
+    [S390] omit frame pointers on s390 when possible
+    
+    Always omit frame pointers on s390. They aren't too useful for the
+    kernel since we have already the kernel stack backchain which allows
+    us to walk the kernel stack.
+    So eleminate the extra code for frame pointers. Only allow the extra
+    code for the function tracer since the gcc compile options -pg and
+    -fomit-frame-pointer are incompatible.
+    
+    Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ lib/Kconfig.debug |    8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+Index: linux-sles11/lib/Kconfig.debug
+===================================================================
+--- linux-sles11.orig/lib/Kconfig.debug
++++ linux-sles11/lib/Kconfig.debug
+@@ -394,7 +394,7 @@ config LOCKDEP
+       bool
+       depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
+       select STACKTRACE
+-      select FRAME_POINTER if !MIPS && !PPC
++      select FRAME_POINTER if !MIPS && !PPC && !S390
+       select KALLSYMS
+       select KALLSYMS_ALL
+@@ -539,7 +539,7 @@ config DEBUG_SG
+ config FRAME_POINTER
+       bool "Compile the kernel with frame pointers"
+       depends on DEBUG_KERNEL && \
+-              (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || S390 || \
++              (X86 || CRIS || M68K || M68KNOMMU || FRV || UML || \
+                AVR32 || SUPERH || BLACKFIN || MN10300)
+       default y if DEBUG_INFO && UML
+       help
+@@ -694,14 +694,14 @@ config FAULT_INJECTION_STACKTRACE_FILTER
+       depends on FAULT_INJECTION_DEBUG_FS && STACKTRACE_SUPPORT
+       depends on !X86_64
+       select STACKTRACE
+-      select FRAME_POINTER if !PPC && !X86
++      select FRAME_POINTER if !PPC && !X86 && !S390
+       select UNWIND_INFO if X86 && !FRAME_POINTER
+       help
+         Provide stacktrace filter for fault-injection capabilities
+ config LATENCYTOP
+       bool "Latency measuring infrastructure"
+-      select FRAME_POINTER if !MIPS && !PPC && !X86
++      select FRAME_POINTER if !MIPS && !PPC && !X86 && !S390
+       select UNWIND_INFO if X86 && !FRAME_POINTER
+       select KALLSYMS
+       select KALLSYMS_ALL
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-02-schedframepointer.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-02-schedframepointer.patch
new file mode 100644 (file)
index 0000000..aea46ca
--- /dev/null
@@ -0,0 +1,28 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] set SCHED_OMIT_FRAME_POINTER for s390
+References: bnc#532063,LTC#55526
+
+From: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+The frame pointer is useless for s390 in the sched.c code.
+
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+Index: linux-sles11/arch/s390/Kconfig
+===================================================================
+--- linux-sles11.orig/arch/s390/Kconfig        2009-08-17 14:29:52.000000000 +0200
++++ linux-sles11/arch/s390/Kconfig     2009-08-17 14:45:07.000000000 +0200
+@@ -78,6 +78,10 @@
+       select HAVE_KVM if 64BIT
+       select HAVE_ARCH_TRACEHOOK
++config SCHED_OMIT_FRAME_POINTER
++      bool
++      default y
++
+ source "init/Kconfig"
+ source "kernel/Kconfig.freezer"
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-03-qdio_inline_qdio_perf_stat_inc.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-03-qdio_inline_qdio_perf_stat_inc.patch
new file mode 100644 (file)
index 0000000..4eb472c
--- /dev/null
@@ -0,0 +1,70 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] qdio: inline qdio_perf_stat_inc
+References: bnc#532063,LTC#55526
+
+From: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Move qdio_perf_stat_inc to the header file so it can be inlined.
+Remove unused qdio_perf_stat_dec.
+
+Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/cio/qdio_perf.c |   12 ------------
+ drivers/s390/cio/qdio_perf.h |   10 ++++++----
+ 2 files changed, 6 insertions(+), 16 deletions(-)
+
+Index: linux-sles11/drivers/s390/cio/qdio_perf.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_perf.c
++++ linux-sles11/drivers/s390/cio/qdio_perf.c
+@@ -25,18 +25,6 @@ struct qdio_perf_stats perf_stats;
+ static struct proc_dir_entry *qdio_perf_pde;
+ #endif
+-inline void qdio_perf_stat_inc(atomic_long_t *count)
+-{
+-      if (qdio_performance_stats)
+-              atomic_long_inc(count);
+-}
+-
+-inline void qdio_perf_stat_dec(atomic_long_t *count)
+-{
+-      if (qdio_performance_stats)
+-              atomic_long_dec(count);
+-}
+-
+ /*
+  * procfs functions
+  */
+Index: linux-sles11/drivers/s390/cio/qdio_perf.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_perf.h
++++ linux-sles11/drivers/s390/cio/qdio_perf.h
+@@ -9,7 +9,6 @@
+ #define QDIO_PERF_H
+ #include <linux/types.h>
+-#include <linux/device.h>
+ #include <asm/atomic.h>
+ struct qdio_perf_stats {
+@@ -46,10 +45,13 @@ struct qdio_perf_stats {
+ extern struct qdio_perf_stats perf_stats;
+ extern int qdio_performance_stats;
++static inline void qdio_perf_stat_inc(atomic_long_t *count)
++{
++      if (qdio_performance_stats)
++              atomic_long_inc(count);
++}
++
+ int qdio_setup_perf_stats(void);
+ void qdio_remove_perf_stats(void);
+-extern void qdio_perf_stat_inc(atomic_long_t *count);
+-extern void qdio_perf_stat_dec(atomic_long_t *count);
+-
+ #endif
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-04-qdio_move_adapter_interrupt_tasklet_code.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-04-qdio_move_adapter_interrupt_tasklet_code.patch
new file mode 100644 (file)
index 0000000..60d6839
--- /dev/null
@@ -0,0 +1,292 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] qdio: move adapter interrupt tasklet code
+References: bnc#532063,LTC#55526
+
+From: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Move the adapter interrupt tasklet function to the qdio main code
+since all the functions used by the tasklet are located there.
+
+Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/cio/qdio.h         |   11 -----
+ drivers/s390/cio/qdio_debug.c   |    3 -
+ drivers/s390/cio/qdio_main.c    |   83 ++++++++++++++++++++++++++++++++++------
+ drivers/s390/cio/qdio_thinint.c |   57 ---------------------------
+ 4 files changed, 75 insertions(+), 79 deletions(-)
+
+Index: linux-sles11/drivers/s390/cio/qdio.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio.h
++++ linux-sles11/drivers/s390/cio/qdio.h
+@@ -348,15 +348,6 @@ static inline unsigned long long get_use
+       ((bufnr - dec) & QDIO_MAX_BUFFERS_MASK)
+ /* prototypes for thin interrupt */
+-void qdio_sync_after_thinint(struct qdio_q *q);
+-int get_buf_state(struct qdio_q *q, unsigned int bufnr, unsigned char *state,
+-                int auto_ack);
+-void qdio_check_outbound_after_thinint(struct qdio_q *q);
+-int qdio_inbound_q_moved(struct qdio_q *q);
+-void qdio_kick_inbound_handler(struct qdio_q *q);
+-void qdio_stop_polling(struct qdio_q *q);
+-int qdio_siga_sync_q(struct qdio_q *q);
+-
+ void qdio_setup_thinint(struct qdio_irq *irq_ptr);
+ int qdio_establish_thinint(struct qdio_irq *irq_ptr);
+ void qdio_shutdown_thinint(struct qdio_irq *irq_ptr);
+@@ -389,4 +380,6 @@ void qdio_setup_destroy_sysfs(struct ccw
+ int qdio_setup_init(void);
+ void qdio_setup_exit(void);
++int debug_get_buf_state(struct qdio_q *q, unsigned int bufnr,
++                      unsigned char *state);
+ #endif /* _CIO_QDIO_H */
+Index: linux-sles11/drivers/s390/cio/qdio_debug.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_debug.c
++++ linux-sles11/drivers/s390/cio/qdio_debug.c
+@@ -69,9 +69,8 @@ static int qstat_show(struct seq_file *m
+       seq_printf(m, "slsb buffer states:\n");
+       seq_printf(m, "|0      |8      |16     |24     |32     |40     |48     |56  63|\n");
+-      qdio_siga_sync_q(q);
+       for (i = 0; i < QDIO_MAX_BUFFERS_PER_Q; i++) {
+-              get_buf_state(q, i, &state, 0);
++              debug_get_buf_state(q, i, &state);
+               switch (state) {
+               case SLSB_P_INPUT_NOT_INIT:
+               case SLSB_P_OUTPUT_NOT_INIT:
+Index: linux-sles11/drivers/s390/cio/qdio_main.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_main.c
++++ linux-sles11/drivers/s390/cio/qdio_main.c
+@@ -225,8 +225,8 @@ static inline int get_buf_states(struct 
+       return i;
+ }
+-inline int get_buf_state(struct qdio_q *q, unsigned int bufnr,
+-                unsigned char *state, int auto_ack)
++static inline int get_buf_state(struct qdio_q *q, unsigned int bufnr,
++                              unsigned char *state, int auto_ack)
+ {
+       return get_buf_states(q, bufnr, state, 1, auto_ack);
+ }
+@@ -270,7 +270,7 @@ void qdio_init_buf_states(struct qdio_ir
+                              QDIO_MAX_BUFFERS_PER_Q);
+ }
+-static int qdio_siga_sync(struct qdio_q *q, unsigned int output,
++static inline int qdio_siga_sync(struct qdio_q *q, unsigned int output,
+                         unsigned int input)
+ {
+       int cc;
+@@ -287,7 +287,7 @@ static int qdio_siga_sync(struct qdio_q 
+       return cc;
+ }
+-inline int qdio_siga_sync_q(struct qdio_q *q)
++static inline int qdio_siga_sync_q(struct qdio_q *q)
+ {
+       if (q->is_input_q)
+               return qdio_siga_sync(q, 0, q->mask);
+@@ -349,8 +349,7 @@ static inline int qdio_siga_input(struct
+       return cc;
+ }
+-/* called from thinint inbound handler */
+-void qdio_sync_after_thinint(struct qdio_q *q)
++static inline void qdio_sync_after_thinint(struct qdio_q *q)
+ {
+       if (pci_out_supported(q)) {
+               if (need_siga_sync_thinint(q))
+@@ -361,7 +360,14 @@ void qdio_sync_after_thinint(struct qdio
+               qdio_siga_sync_q(q);
+ }
+-inline void qdio_stop_polling(struct qdio_q *q)
++int debug_get_buf_state(struct qdio_q *q, unsigned int bufnr,
++                      unsigned char *state)
++{
++      qdio_siga_sync_q(q);
++      return get_buf_states(q, bufnr, state, 1, 0);
++}
++
++static inline void qdio_stop_polling(struct qdio_q *q)
+ {
+       if (!q->u.in.polling)
+               return;
+@@ -507,7 +513,7 @@ out:
+       return q->first_to_check;
+ }
+-int qdio_inbound_q_moved(struct qdio_q *q)
++static int qdio_inbound_q_moved(struct qdio_q *q)
+ {
+       int bufnr;
+@@ -587,6 +593,22 @@ void qdio_kick_inbound_handler(struct qd
+       q->qdio_error = 0;
+ }
++static inline int tiqdio_inbound_q_done(struct qdio_q *q)
++{
++      unsigned char state = 0;
++
++      if (!atomic_read(&q->nr_buf_used))
++              return 1;
++
++      qdio_siga_sync_q(q);
++      get_buf_state(q, q->first_to_check, &state, 0);
++
++      if (state == SLSB_P_INPUT_PRIMED)
++              /* more work coming */
++              return 0;
++      return 1;
++}
++
+ static void __qdio_inbound_processing(struct qdio_q *q)
+ {
+       qdio_perf_stat_inc(&perf_stats.tasklet_inbound);
+@@ -609,7 +631,6 @@ again:
+               goto again;
+ }
+-/* inbound tasklet */
+ void qdio_inbound_processing(unsigned long data)
+ {
+       struct qdio_q *q = (struct qdio_q *)data;
+@@ -812,8 +833,7 @@ void qdio_outbound_timer(unsigned long d
+       tasklet_schedule(&q->tasklet);
+ }
+-/* called from thinint inbound tasklet */
+-void qdio_check_outbound_after_thinint(struct qdio_q *q)
++static inline void qdio_check_outbound_after_thinint(struct qdio_q *q)
+ {
+       struct qdio_q *out;
+       int i;
+@@ -826,6 +846,47 @@ void qdio_check_outbound_after_thinint(s
+                       tasklet_schedule(&out->tasklet);
+ }
++static void __tiqdio_inbound_processing(struct qdio_q *q)
++{
++      qdio_perf_stat_inc(&perf_stats.thinint_inbound);
++      qdio_sync_after_thinint(q);
++
++      /*
++       * The interrupt could be caused by a PCI request. Check the
++       * PCI capable outbound queues.
++       */
++      qdio_check_outbound_after_thinint(q);
++
++      if (!qdio_inbound_q_moved(q))
++              return;
++
++      qdio_kick_inbound_handler(q);
++
++      if (!tiqdio_inbound_q_done(q)) {
++              qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop);
++              if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED))
++                      tasklet_schedule(&q->tasklet);
++                      return;
++      }
++
++      qdio_stop_polling(q);
++      /*
++       * We need to check again to not lose initiative after
++       * resetting the ACK state.
++       */
++      if (!tiqdio_inbound_q_done(q)) {
++              qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop2);
++              if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED))
++                      tasklet_schedule(&q->tasklet);
++      }
++}
++
++void tiqdio_inbound_processing(unsigned long data)
++{
++      struct qdio_q *q = (struct qdio_q *)data;
++      __tiqdio_inbound_processing(q);
++}
++
+ static inline void qdio_set_state(struct qdio_irq *irq_ptr,
+                                 enum qdio_irq_states state)
+ {
+Index: linux-sles11/drivers/s390/cio/qdio_thinint.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_thinint.c
++++ linux-sles11/drivers/s390/cio/qdio_thinint.c
+@@ -126,68 +126,11 @@ void tiqdio_remove_input_queues(struct q
+       }
+ }
+-static inline int tiqdio_inbound_q_done(struct qdio_q *q)
+-{
+-      unsigned char state;
+-
+-      if (!atomic_read(&q->nr_buf_used))
+-              return 1;
+-
+-      qdio_siga_sync_q(q);
+-      get_buf_state(q, q->first_to_check, &state, 0);
+-
+-      if (state == SLSB_P_INPUT_PRIMED)
+-              /* more work coming */
+-              return 0;
+-      return 1;
+-}
+-
+ static inline int shared_ind(struct qdio_irq *irq_ptr)
+ {
+       return irq_ptr->dsci == &q_indicators[TIQDIO_SHARED_IND].ind;
+ }
+-static void __tiqdio_inbound_processing(struct qdio_q *q)
+-{
+-      qdio_perf_stat_inc(&perf_stats.thinint_inbound);
+-      qdio_sync_after_thinint(q);
+-
+-      /*
+-       * Maybe we have work on our outbound queues... at least
+-       * we have to check the PCI capable queues.
+-       */
+-      qdio_check_outbound_after_thinint(q);
+-
+-      if (!qdio_inbound_q_moved(q))
+-              return;
+-
+-      qdio_kick_inbound_handler(q);
+-
+-      if (!tiqdio_inbound_q_done(q)) {
+-              qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop);
+-              if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED))
+-                      tasklet_schedule(&q->tasklet);
+-      }
+-
+-      qdio_stop_polling(q);
+-      /*
+-       * We need to check again to not lose initiative after
+-       * resetting the ACK state.
+-       */
+-      if (!tiqdio_inbound_q_done(q)) {
+-              qdio_perf_stat_inc(&perf_stats.thinint_inbound_loop2);
+-              if (likely(q->irq_ptr->state != QDIO_IRQ_STATE_STOPPED))
+-                      tasklet_schedule(&q->tasklet);
+-      }
+-}
+-
+-void tiqdio_inbound_processing(unsigned long data)
+-{
+-      struct qdio_q *q = (struct qdio_q *)data;
+-
+-      __tiqdio_inbound_processing(q);
+-}
+-
+ /* check for work on all inbound thinint queues */
+ static void tiqdio_tasklet_fn(unsigned long data)
+ {
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-05-qdio_extract_all_primed_SBALs_at_once.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-05-qdio_extract_all_primed_SBALs_at_once.patch
new file mode 100644 (file)
index 0000000..95f0f4d
--- /dev/null
@@ -0,0 +1,89 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] qdio: extract all primed SBALs at once
+References: bnc#532063,LTC#55526
+
+From: Jan Glauber <jang@linux.vnet.ibm.com>
+
+For devices without QIOASSIST primed SBALS were extracted in a loop.
+Remove the loop since get_buf_states can already return more than
+one primed SBAL.
+
+Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/cio/qdio_main.c |   34 ++++++----------------------------
+ 1 file changed, 6 insertions(+), 28 deletions(-)
+
+Index: linux-sles11/drivers/s390/cio/qdio_main.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_main.c
++++ linux-sles11/drivers/s390/cio/qdio_main.c
+@@ -467,19 +467,13 @@ static int get_inbound_buffer_frontier(s
+       count = min(atomic_read(&q->nr_buf_used), QDIO_MAX_BUFFERS_MASK);
+       stop = add_buf(q->first_to_check, count);
+-      /*
+-       * No siga sync here, as a PCI or we after a thin interrupt
+-       * will sync the queues.
+-       */
+-
+-      /* need to set count to 1 for non-qebsm */
+-      if (!is_qebsm(q))
+-              count = 1;
+-
+-check_next:
+       if (q->first_to_check == stop)
+               goto out;
++      /*
++       * No siga sync here, as a PCI or we after a thin interrupt
++       * already sync'ed the queues.
++       */
+       count = get_buf_states(q, q->first_to_check, &state, count, 1);
+       if (!count)
+               goto out;
+@@ -487,14 +481,9 @@ check_next:
+       switch (state) {
+       case SLSB_P_INPUT_PRIMED:
+               inbound_primed(q, count);
+-              /*
+-               * No siga-sync needed for non-qebsm here, as the inbound queue
+-               * will be synced on the next siga-r, resp.
+-               * tiqdio_is_inbound_q_done will do the siga-sync.
+-               */
+               q->first_to_check = add_buf(q->first_to_check, count);
+               atomic_sub(count, &q->nr_buf_used);
+-              goto check_next;
++              break;
+       case SLSB_P_INPUT_ERROR:
+               announce_buffer_error(q, count);
+               /* process the buffer, the upper layer will take care of it */
+@@ -653,11 +642,6 @@ static int get_outbound_buffer_frontier(
+       count = min(atomic_read(&q->nr_buf_used), QDIO_MAX_BUFFERS_MASK);
+       stop = add_buf(q->first_to_check, count);
+-      /* need to set count to 1 for non-qebsm */
+-      if (!is_qebsm(q))
+-              count = 1;
+-
+-check_next:
+       if (q->first_to_check == stop)
+               return q->first_to_check;
+@@ -672,13 +656,7 @@ check_next:
+               atomic_sub(count, &q->nr_buf_used);
+               q->first_to_check = add_buf(q->first_to_check, count);
+-              /*
+-               * We fetch all buffer states at once. get_buf_states may
+-               * return count < stop. For QEBSM we do not loop.
+-               */
+-              if (is_qebsm(q))
+-                      break;
+-              goto check_next;
++              break;
+       case SLSB_P_OUTPUT_ERROR:
+               announce_buffer_error(q, count);
+               /* process the buffer, the upper layer will take care of it */
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-07-qdio_sanitize_do_QDIO_sanity_checks.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-07-qdio_sanitize_do_QDIO_sanity_checks.patch
new file mode 100644 (file)
index 0000000..aef1a0d
--- /dev/null
@@ -0,0 +1,58 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] qdio: Sanitize do_QDIO sanity checks
+References: bnc#532063,LTC#55526
+
+From: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Remove unneeded sanity checks from do_QDIO since this is the hot path.
+Change the type of bufnr and count to unsigned int so the check for the
+maximum value works.
+
+Reported-by: Roel Kluin <roel.kluin@gmail.com>
+Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ arch/s390/include/asm/qdio.h |    2 +-
+ drivers/s390/cio/qdio_main.c |    9 ++-------
+ 2 files changed, 3 insertions(+), 8 deletions(-)
+
+Index: linux-sles11/arch/s390/include/asm/qdio.h
+===================================================================
+--- linux-sles11.orig/arch/s390/include/asm/qdio.h
++++ linux-sles11/arch/s390/include/asm/qdio.h
+@@ -373,7 +373,7 @@ extern int qdio_establish(struct qdio_in
+ extern int qdio_activate(struct ccw_device *);
+ extern int do_QDIO(struct ccw_device *cdev, unsigned int callflags,
+-                 int q_nr, int bufnr, int count);
++                 int q_nr, unsigned int bufnr, unsigned int count);
+ extern int qdio_cleanup(struct ccw_device*, int);
+ extern int qdio_shutdown(struct ccw_device*, int);
+ extern int qdio_free(struct ccw_device *);
+Index: linux-sles11/drivers/s390/cio/qdio_main.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_main.c
++++ linux-sles11/drivers/s390/cio/qdio_main.c
+@@ -1582,18 +1582,13 @@ out:
+  * @count: how many buffers to process
+  */
+ int do_QDIO(struct ccw_device *cdev, unsigned int callflags,
+-          int q_nr, int bufnr, int count)
++          int q_nr, unsigned int bufnr, unsigned int count)
+ {
+       struct qdio_irq *irq_ptr;
+-      if ((bufnr > QDIO_MAX_BUFFERS_PER_Q) ||
+-          (count > QDIO_MAX_BUFFERS_PER_Q) ||
+-          (q_nr > QDIO_MAX_QUEUES_PER_IRQ))
++      if (bufnr >= QDIO_MAX_BUFFERS_PER_Q || count > QDIO_MAX_BUFFERS_PER_Q)
+               return -EINVAL;
+-      if (!count)
+-              return 0;
+-
+       irq_ptr = cdev->private->qdio_data;
+       if (!irq_ptr)
+               return -ENODEV;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-08-qdio_merge_AI_tasklet_into_interrupt_handler.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-08-qdio_merge_AI_tasklet_into_interrupt_handler.patch
new file mode 100644 (file)
index 0000000..c0b34fc
--- /dev/null
@@ -0,0 +1,131 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] qdio: merge AI tasklet into interrupt handler
+References: bnc#532063,LTC#55526
+
+From: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Since the adapter interrupt tasklet only schedules the queue tasklets
+and contains no code that requires serialization in can be merged
+with the adapter interrupt handler. That possibly safes some CPU
+cycles.
+
+Signed-off-by: Jan Glauber <jang@linux.vnet.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/cio/qdio_thinint.c |   66 ++++++++++++----------------------------
+ 1 file changed, 21 insertions(+), 45 deletions(-)
+
+Index: linux-sles11/drivers/s390/cio/qdio_thinint.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/qdio_thinint.c
++++ linux-sles11/drivers/s390/cio/qdio_thinint.c
+@@ -43,9 +43,6 @@ struct indicator_t {
+ };
+ static struct indicator_t *q_indicators;
+-static void tiqdio_tasklet_fn(unsigned long data);
+-static DECLARE_TASKLET(tiqdio_tasklet, tiqdio_tasklet_fn, 0);
+-
+ static int css_qdio_omit_svs;
+ static inline unsigned long do_clear_global_summary(void)
+@@ -103,11 +100,6 @@ void tiqdio_add_input_queues(struct qdio
+       xchg(irq_ptr->dsci, 1);
+ }
+-/*
+- * we cannot stop the tiqdio tasklet here since it is for all
+- * thinint qdio devices and it must run as long as there is a
+- * thinint device left
+- */
+ void tiqdio_remove_input_queues(struct qdio_irq *irq_ptr)
+ {
+       struct qdio_q *q;
+@@ -131,17 +123,34 @@ static inline int shared_ind(struct qdio
+       return irq_ptr->dsci == &q_indicators[TIQDIO_SHARED_IND].ind;
+ }
+-/* check for work on all inbound thinint queues */
+-static void tiqdio_tasklet_fn(unsigned long data)
++/**
++ * tiqdio_thinint_handler - thin interrupt handler for qdio
++ * @ind: pointer to adapter local summary indicator
++ * @drv_data: NULL
++ */
++static void tiqdio_thinint_handler(void *ind, void *drv_data)
+ {
+       struct qdio_q *q;
+-      qdio_perf_stat_inc(&perf_stats.tasklet_thinint);
+-again:
++      qdio_perf_stat_inc(&perf_stats.thin_int);
++
++      /*
++       * SVS only when needed: issue SVS to benefit from iqdio interrupt
++       * avoidance (SVS clears adapter interrupt suppression overwrite)
++       */
++      if (!css_qdio_omit_svs)
++              do_clear_global_summary();
++
++      /*
++       * reset local summary indicator (tiqdio_alsi) to stop adapter
++       * interrupts for now
++       */
++      xchg((u8 *)ind, 0);
+       /* protect tiq_list entries, only changed in activate or shutdown */
+       rcu_read_lock();
++      /* check for work on all inbound thinint queues */
+       list_for_each_entry_rcu(q, &tiq_list, entry)
+               /* only process queues from changed sets */
+               if (*q->irq_ptr->dsci) {
+@@ -169,37 +178,6 @@ again:
+               if (*tiqdio_alsi)
+                       xchg(&q_indicators[TIQDIO_SHARED_IND].ind, 1);
+       }
+-
+-      /* check for more work */
+-      if (*tiqdio_alsi) {
+-              xchg(tiqdio_alsi, 0);
+-              qdio_perf_stat_inc(&perf_stats.tasklet_thinint_loop);
+-              goto again;
+-      }
+-}
+-
+-/**
+- * tiqdio_thinint_handler - thin interrupt handler for qdio
+- * @ind: pointer to adapter local summary indicator
+- * @drv_data: NULL
+- */
+-static void tiqdio_thinint_handler(void *ind, void *drv_data)
+-{
+-      qdio_perf_stat_inc(&perf_stats.thin_int);
+-
+-      /*
+-       * SVS only when needed: issue SVS to benefit from iqdio interrupt
+-       * avoidance (SVS clears adapter interrupt suppression overwrite)
+-       */
+-      if (!css_qdio_omit_svs)
+-              do_clear_global_summary();
+-
+-      /*
+-       * reset local summary indicator (tiqdio_alsi) to stop adapter
+-       * interrupts for now, the tasklet will clean all dsci's
+-       */
+-      xchg((u8 *)ind, 0);
+-      tasklet_hi_schedule(&tiqdio_tasklet);
+ }
+ static int set_subchannel_ind(struct qdio_irq *irq_ptr, int reset)
+@@ -313,8 +291,6 @@ void qdio_shutdown_thinint(struct qdio_i
+ void __exit tiqdio_unregister_thinints(void)
+ {
+-      tasklet_disable(&tiqdio_tasklet);
+-
+       if (tiqdio_alsi) {
+               s390_unregister_adapter_interrupt(tiqdio_alsi, QDIO_AIRQ_ISC);
+               isc_unregister(QDIO_AIRQ_ISC);
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-09-module-plt.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-09-module-plt.patch
new file mode 100644 (file)
index 0000000..a63f52c
--- /dev/null
@@ -0,0 +1,50 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [S390] module function call optimization
+References: bnc#532063,LTC#55526
+
+commit 504665a91498f43d220b7d0942281067283a35f7
+Author: Martin Schwidefsky <schwidefsky@de.ibm.com>
+Date:   Thu Mar 26 15:24:36 2009 +0100
+
+    [S390] module function call optimization
+    
+    Avoid the detour over the PLT if the branch target of a function call
+    in a module is in the range of the bras (16-bit) or brasl (32-bit)
+    instruction. The PLT is still generated but it is unused.
+    
+    Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+diff --git a/arch/s390/kernel/module.c b/arch/s390/kernel/module.c
+index 59b4e79..eed4a00 100644
+--- a/arch/s390/kernel/module.c
++++ b/arch/s390/kernel/module.c
+@@ -310,15 +310,20 @@ apply_rela(Elf_Rela *rela, Elf_Addr base, Elf_Sym *symtab,
+                       info->plt_initialized = 1;
+               }
+               if (r_type == R_390_PLTOFF16 ||
+-                  r_type == R_390_PLTOFF32
+-                  || r_type == R_390_PLTOFF64
+-                      )
++                  r_type == R_390_PLTOFF32 ||
++                  r_type == R_390_PLTOFF64)
+                       val = me->arch.plt_offset - me->arch.got_offset +
+                               info->plt_offset + rela->r_addend;
+-              else
+-                      val =  (Elf_Addr) me->module_core +
+-                              me->arch.plt_offset + info->plt_offset + 
+-                              rela->r_addend - loc;
++              else {
++                      if (!((r_type == R_390_PLT16DBL &&
++                             val - loc + 0xffffUL < 0x1ffffeUL) ||
++                            (r_type == R_390_PLT32DBL &&
++                             val - loc + 0xffffffffULL < 0x1fffffffeULL)))
++                              val = (Elf_Addr) me->module_core +
++                                      me->arch.plt_offset +
++                                      info->plt_offset;
++                      val += rela->r_addend - loc;
++              }
+               if (r_type == R_390_PLT16DBL)
+                       *(unsigned short *) loc = val >> 1;
+               else if (r_type == R_390_PLTOFF16)
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-10-cio-scsw-helper.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-10-cio-scsw-helper.patch
new file mode 100644 (file)
index 0000000..d68936b
--- /dev/null
@@ -0,0 +1,2160 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] cio: move scsw helper functions to header file
+References: bnc#532063,LTC#55526
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+All scsw helper functions are very short and usage of them shouldn't
+result in function calls. Therefore we move them to a separate header
+file.
+Also saves a lot of EXPORT_SYMBOLs.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ arch/s390/include/asm/chsc.h |   28 +
+ arch/s390/include/asm/cio.h  |  223 ----------
+ arch/s390/include/asm/scsw.h |  956 +++++++++++++++++++++++++++++++++++++++++++
+ drivers/s390/cio/Makefile    |    2 
+ drivers/s390/cio/chsc.h      |   24 -
+ drivers/s390/cio/scsw.c      |  843 -------------------------------------
+ 6 files changed, 986 insertions(+), 1090 deletions(-)
+
+Index: linux-sles11/arch/s390/include/asm/chsc.h
+===================================================================
+--- linux-sles11.orig/arch/s390/include/asm/chsc.h
++++ linux-sles11/arch/s390/include/asm/chsc.h
+@@ -124,4 +124,32 @@ struct chsc_cpd_info {
+ #define CHSC_INFO_CPD _IOWR(CHSC_IOCTL_MAGIC, 0x87, struct chsc_cpd_info)
+ #define CHSC_INFO_DCAL _IOWR(CHSC_IOCTL_MAGIC, 0x88, struct chsc_dcal)
++#ifdef __KERNEL__
++
++struct css_general_char {
++      u64 : 12;
++      u32 dynio : 1;   /* bit 12 */
++      u32 : 28;
++      u32 aif : 1;     /* bit 41 */
++      u32 : 3;
++      u32 mcss : 1;    /* bit 45 */
++      u32 fcs : 1;     /* bit 46 */
++      u32 : 1;
++      u32 ext_mb : 1;  /* bit 48 */
++      u32 : 7;
++      u32 aif_tdd : 1; /* bit 56 */
++      u32 : 1;
++      u32 qebsm : 1;   /* bit 58 */
++      u32 : 8;
++      u32 aif_osa : 1; /* bit 67 */
++      u32 : 14;
++      u32 cib : 1;     /* bit 82 */
++      u32 : 5;
++      u32 fcx : 1;     /* bit 88 */
++      u32 : 7;
++}__attribute__((packed));
++
++extern struct css_general_char css_general_characteristics;
++
++#endif /* __KERNEL__ */
+ #endif
+Index: linux-sles11/arch/s390/include/asm/cio.h
+===================================================================
+--- linux-sles11.orig/arch/s390/include/asm/cio.h
++++ linux-sles11/arch/s390/include/asm/cio.h
+@@ -15,228 +15,7 @@
+ #define LPM_ANYPATH 0xff
+ #define __MAX_CSSID 0
+-/**
+- * struct cmd_scsw - command-mode subchannel status word
+- * @key: subchannel key
+- * @sctl: suspend control
+- * @eswf: esw format
+- * @cc: deferred condition code
+- * @fmt: format
+- * @pfch: prefetch
+- * @isic: initial-status interruption control
+- * @alcc: address-limit checking control
+- * @ssi: suppress-suspended interruption
+- * @zcc: zero condition code
+- * @ectl: extended control
+- * @pno: path not operational
+- * @res: reserved
+- * @fctl: function control
+- * @actl: activity control
+- * @stctl: status control
+- * @cpa: channel program address
+- * @dstat: device status
+- * @cstat: subchannel status
+- * @count: residual count
+- */
+-struct cmd_scsw {
+-      __u32 key  : 4;
+-      __u32 sctl : 1;
+-      __u32 eswf : 1;
+-      __u32 cc   : 2;
+-      __u32 fmt  : 1;
+-      __u32 pfch : 1;
+-      __u32 isic : 1;
+-      __u32 alcc : 1;
+-      __u32 ssi  : 1;
+-      __u32 zcc  : 1;
+-      __u32 ectl : 1;
+-      __u32 pno  : 1;
+-      __u32 res  : 1;
+-      __u32 fctl : 3;
+-      __u32 actl : 7;
+-      __u32 stctl : 5;
+-      __u32 cpa;
+-      __u32 dstat : 8;
+-      __u32 cstat : 8;
+-      __u32 count : 16;
+-} __attribute__ ((packed));
+-
+-/**
+- * struct tm_scsw - transport-mode subchannel status word
+- * @key: subchannel key
+- * @eswf: esw format
+- * @cc: deferred condition code
+- * @fmt: format
+- * @x: IRB-format control
+- * @q: interrogate-complete
+- * @ectl: extended control
+- * @pno: path not operational
+- * @fctl: function control
+- * @actl: activity control
+- * @stctl: status control
+- * @tcw: TCW address
+- * @dstat: device status
+- * @cstat: subchannel status
+- * @fcxs: FCX status
+- * @schxs: subchannel-extended status
+- */
+-struct tm_scsw {
+-      u32 key:4;
+-      u32 :1;
+-      u32 eswf:1;
+-      u32 cc:2;
+-      u32 fmt:3;
+-      u32 x:1;
+-      u32 q:1;
+-      u32 :1;
+-      u32 ectl:1;
+-      u32 pno:1;
+-      u32 :1;
+-      u32 fctl:3;
+-      u32 actl:7;
+-      u32 stctl:5;
+-      u32 tcw;
+-      u32 dstat:8;
+-      u32 cstat:8;
+-      u32 fcxs:8;
+-      u32 schxs:8;
+-} __attribute__ ((packed));
+-
+-/**
+- * union scsw - subchannel status word
+- * @cmd: command-mode SCSW
+- * @tm: transport-mode SCSW
+- */
+-union scsw {
+-      struct cmd_scsw cmd;
+-      struct tm_scsw tm;
+-} __attribute__ ((packed));
+-
+-int scsw_is_tm(union scsw *scsw);
+-u32 scsw_key(union scsw *scsw);
+-u32 scsw_eswf(union scsw *scsw);
+-u32 scsw_cc(union scsw *scsw);
+-u32 scsw_ectl(union scsw *scsw);
+-u32 scsw_pno(union scsw *scsw);
+-u32 scsw_fctl(union scsw *scsw);
+-u32 scsw_actl(union scsw *scsw);
+-u32 scsw_stctl(union scsw *scsw);
+-u32 scsw_dstat(union scsw *scsw);
+-u32 scsw_cstat(union scsw *scsw);
+-int scsw_is_solicited(union scsw *scsw);
+-int scsw_is_valid_key(union scsw *scsw);
+-int scsw_is_valid_eswf(union scsw *scsw);
+-int scsw_is_valid_cc(union scsw *scsw);
+-int scsw_is_valid_ectl(union scsw *scsw);
+-int scsw_is_valid_pno(union scsw *scsw);
+-int scsw_is_valid_fctl(union scsw *scsw);
+-int scsw_is_valid_actl(union scsw *scsw);
+-int scsw_is_valid_stctl(union scsw *scsw);
+-int scsw_is_valid_dstat(union scsw *scsw);
+-int scsw_is_valid_cstat(union scsw *scsw);
+-int scsw_cmd_is_valid_key(union scsw *scsw);
+-int scsw_cmd_is_valid_sctl(union scsw *scsw);
+-int scsw_cmd_is_valid_eswf(union scsw *scsw);
+-int scsw_cmd_is_valid_cc(union scsw *scsw);
+-int scsw_cmd_is_valid_fmt(union scsw *scsw);
+-int scsw_cmd_is_valid_pfch(union scsw *scsw);
+-int scsw_cmd_is_valid_isic(union scsw *scsw);
+-int scsw_cmd_is_valid_alcc(union scsw *scsw);
+-int scsw_cmd_is_valid_ssi(union scsw *scsw);
+-int scsw_cmd_is_valid_zcc(union scsw *scsw);
+-int scsw_cmd_is_valid_ectl(union scsw *scsw);
+-int scsw_cmd_is_valid_pno(union scsw *scsw);
+-int scsw_cmd_is_valid_fctl(union scsw *scsw);
+-int scsw_cmd_is_valid_actl(union scsw *scsw);
+-int scsw_cmd_is_valid_stctl(union scsw *scsw);
+-int scsw_cmd_is_valid_dstat(union scsw *scsw);
+-int scsw_cmd_is_valid_cstat(union scsw *scsw);
+-int scsw_cmd_is_solicited(union scsw *scsw);
+-int scsw_tm_is_valid_key(union scsw *scsw);
+-int scsw_tm_is_valid_eswf(union scsw *scsw);
+-int scsw_tm_is_valid_cc(union scsw *scsw);
+-int scsw_tm_is_valid_fmt(union scsw *scsw);
+-int scsw_tm_is_valid_x(union scsw *scsw);
+-int scsw_tm_is_valid_q(union scsw *scsw);
+-int scsw_tm_is_valid_ectl(union scsw *scsw);
+-int scsw_tm_is_valid_pno(union scsw *scsw);
+-int scsw_tm_is_valid_fctl(union scsw *scsw);
+-int scsw_tm_is_valid_actl(union scsw *scsw);
+-int scsw_tm_is_valid_stctl(union scsw *scsw);
+-int scsw_tm_is_valid_dstat(union scsw *scsw);
+-int scsw_tm_is_valid_cstat(union scsw *scsw);
+-int scsw_tm_is_valid_fcxs(union scsw *scsw);
+-int scsw_tm_is_valid_schxs(union scsw *scsw);
+-int scsw_tm_is_solicited(union scsw *scsw);
+-
+-#define SCSW_FCTL_CLEAR_FUNC   0x1
+-#define SCSW_FCTL_HALT_FUNC    0x2
+-#define SCSW_FCTL_START_FUNC   0x4
+-
+-#define SCSW_ACTL_SUSPENDED    0x1
+-#define SCSW_ACTL_DEVACT       0x2
+-#define SCSW_ACTL_SCHACT       0x4
+-#define SCSW_ACTL_CLEAR_PEND   0x8
+-#define SCSW_ACTL_HALT_PEND    0x10
+-#define SCSW_ACTL_START_PEND   0x20
+-#define SCSW_ACTL_RESUME_PEND  0x40
+-
+-#define SCSW_STCTL_STATUS_PEND         0x1
+-#define SCSW_STCTL_SEC_STATUS  0x2
+-#define SCSW_STCTL_PRIM_STATUS         0x4
+-#define SCSW_STCTL_INTER_STATUS        0x8
+-#define SCSW_STCTL_ALERT_STATUS        0x10
+-
+-#define DEV_STAT_ATTENTION     0x80
+-#define DEV_STAT_STAT_MOD      0x40
+-#define DEV_STAT_CU_END                0x20
+-#define DEV_STAT_BUSY          0x10
+-#define DEV_STAT_CHN_END       0x08
+-#define DEV_STAT_DEV_END       0x04
+-#define DEV_STAT_UNIT_CHECK    0x02
+-#define DEV_STAT_UNIT_EXCEP    0x01
+-
+-#define SCHN_STAT_PCI          0x80
+-#define SCHN_STAT_INCORR_LEN   0x40
+-#define SCHN_STAT_PROG_CHECK   0x20
+-#define SCHN_STAT_PROT_CHECK   0x10
+-#define SCHN_STAT_CHN_DATA_CHK         0x08
+-#define SCHN_STAT_CHN_CTRL_CHK         0x04
+-#define SCHN_STAT_INTF_CTRL_CHK        0x02
+-#define SCHN_STAT_CHAIN_CHECK  0x01
+-
+-/*
+- * architectured values for first sense byte
+- */
+-#define SNS0_CMD_REJECT               0x80
+-#define SNS_CMD_REJECT                SNS0_CMD_REJEC
+-#define SNS0_INTERVENTION_REQ 0x40
+-#define SNS0_BUS_OUT_CHECK    0x20
+-#define SNS0_EQUIPMENT_CHECK  0x10
+-#define SNS0_DATA_CHECK               0x08
+-#define SNS0_OVERRUN          0x04
+-#define SNS0_INCOMPL_DOMAIN   0x01
+-
+-/*
+- * architectured values for second sense byte
+- */
+-#define SNS1_PERM_ERR         0x80
+-#define SNS1_INV_TRACK_FORMAT 0x40
+-#define SNS1_EOC              0x20
+-#define SNS1_MESSAGE_TO_OPER  0x10
+-#define SNS1_NO_REC_FOUND     0x08
+-#define SNS1_FILE_PROTECTED   0x04
+-#define SNS1_WRITE_INHIBITED  0x02
+-#define SNS1_INPRECISE_END    0x01
+-
+-/*
+- * architectured values for third sense byte
+- */
+-#define SNS2_REQ_INH_WRITE    0x80
+-#define SNS2_CORRECTABLE      0x40
+-#define SNS2_FIRST_LOG_ERR    0x20
+-#define SNS2_ENV_DATA_PRESENT 0x10
+-#define SNS2_INPRECISE_END    0x04
++#include <asm/scsw.h>
+ /**
+  * struct ccw1 - channel command word
+Index: linux-sles11/arch/s390/include/asm/scsw.h
+===================================================================
+--- /dev/null
++++ linux-sles11/arch/s390/include/asm/scsw.h
+@@ -0,0 +1,956 @@
++/*
++ *  Helper functions for scsw access.
++ *
++ *    Copyright IBM Corp. 2008,2009
++ *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
++ */
++
++#ifndef _ASM_S390_SCSW_H_
++#define _ASM_S390_SCSW_H_
++
++#include <linux/types.h>
++#include <asm/chsc.h>
++#include <asm/cio.h>
++
++/**
++ * struct cmd_scsw - command-mode subchannel status word
++ * @key: subchannel key
++ * @sctl: suspend control
++ * @eswf: esw format
++ * @cc: deferred condition code
++ * @fmt: format
++ * @pfch: prefetch
++ * @isic: initial-status interruption control
++ * @alcc: address-limit checking control
++ * @ssi: suppress-suspended interruption
++ * @zcc: zero condition code
++ * @ectl: extended control
++ * @pno: path not operational
++ * @res: reserved
++ * @fctl: function control
++ * @actl: activity control
++ * @stctl: status control
++ * @cpa: channel program address
++ * @dstat: device status
++ * @cstat: subchannel status
++ * @count: residual count
++ */
++struct cmd_scsw {
++      __u32 key  : 4;
++      __u32 sctl : 1;
++      __u32 eswf : 1;
++      __u32 cc   : 2;
++      __u32 fmt  : 1;
++      __u32 pfch : 1;
++      __u32 isic : 1;
++      __u32 alcc : 1;
++      __u32 ssi  : 1;
++      __u32 zcc  : 1;
++      __u32 ectl : 1;
++      __u32 pno  : 1;
++      __u32 res  : 1;
++      __u32 fctl : 3;
++      __u32 actl : 7;
++      __u32 stctl : 5;
++      __u32 cpa;
++      __u32 dstat : 8;
++      __u32 cstat : 8;
++      __u32 count : 16;
++} __attribute__ ((packed));
++
++/**
++ * struct tm_scsw - transport-mode subchannel status word
++ * @key: subchannel key
++ * @eswf: esw format
++ * @cc: deferred condition code
++ * @fmt: format
++ * @x: IRB-format control
++ * @q: interrogate-complete
++ * @ectl: extended control
++ * @pno: path not operational
++ * @fctl: function control
++ * @actl: activity control
++ * @stctl: status control
++ * @tcw: TCW address
++ * @dstat: device status
++ * @cstat: subchannel status
++ * @fcxs: FCX status
++ * @schxs: subchannel-extended status
++ */
++struct tm_scsw {
++      u32 key:4;
++      u32 :1;
++      u32 eswf:1;
++      u32 cc:2;
++      u32 fmt:3;
++      u32 x:1;
++      u32 q:1;
++      u32 :1;
++      u32 ectl:1;
++      u32 pno:1;
++      u32 :1;
++      u32 fctl:3;
++      u32 actl:7;
++      u32 stctl:5;
++      u32 tcw;
++      u32 dstat:8;
++      u32 cstat:8;
++      u32 fcxs:8;
++      u32 schxs:8;
++} __attribute__ ((packed));
++
++/**
++ * union scsw - subchannel status word
++ * @cmd: command-mode SCSW
++ * @tm: transport-mode SCSW
++ */
++union scsw {
++      struct cmd_scsw cmd;
++      struct tm_scsw tm;
++} __attribute__ ((packed));
++
++#define SCSW_FCTL_CLEAR_FUNC   0x1
++#define SCSW_FCTL_HALT_FUNC    0x2
++#define SCSW_FCTL_START_FUNC   0x4
++
++#define SCSW_ACTL_SUSPENDED    0x1
++#define SCSW_ACTL_DEVACT       0x2
++#define SCSW_ACTL_SCHACT       0x4
++#define SCSW_ACTL_CLEAR_PEND   0x8
++#define SCSW_ACTL_HALT_PEND    0x10
++#define SCSW_ACTL_START_PEND   0x20
++#define SCSW_ACTL_RESUME_PEND  0x40
++
++#define SCSW_STCTL_STATUS_PEND         0x1
++#define SCSW_STCTL_SEC_STATUS  0x2
++#define SCSW_STCTL_PRIM_STATUS         0x4
++#define SCSW_STCTL_INTER_STATUS        0x8
++#define SCSW_STCTL_ALERT_STATUS        0x10
++
++#define DEV_STAT_ATTENTION     0x80
++#define DEV_STAT_STAT_MOD      0x40
++#define DEV_STAT_CU_END                0x20
++#define DEV_STAT_BUSY          0x10
++#define DEV_STAT_CHN_END       0x08
++#define DEV_STAT_DEV_END       0x04
++#define DEV_STAT_UNIT_CHECK    0x02
++#define DEV_STAT_UNIT_EXCEP    0x01
++
++#define SCHN_STAT_PCI          0x80
++#define SCHN_STAT_INCORR_LEN   0x40
++#define SCHN_STAT_PROG_CHECK   0x20
++#define SCHN_STAT_PROT_CHECK   0x10
++#define SCHN_STAT_CHN_DATA_CHK         0x08
++#define SCHN_STAT_CHN_CTRL_CHK         0x04
++#define SCHN_STAT_INTF_CTRL_CHK        0x02
++#define SCHN_STAT_CHAIN_CHECK  0x01
++
++/*
++ * architectured values for first sense byte
++ */
++#define SNS0_CMD_REJECT               0x80
++#define SNS_CMD_REJECT                SNS0_CMD_REJEC
++#define SNS0_INTERVENTION_REQ 0x40
++#define SNS0_BUS_OUT_CHECK    0x20
++#define SNS0_EQUIPMENT_CHECK  0x10
++#define SNS0_DATA_CHECK               0x08
++#define SNS0_OVERRUN          0x04
++#define SNS0_INCOMPL_DOMAIN   0x01
++
++/*
++ * architectured values for second sense byte
++ */
++#define SNS1_PERM_ERR         0x80
++#define SNS1_INV_TRACK_FORMAT 0x40
++#define SNS1_EOC              0x20
++#define SNS1_MESSAGE_TO_OPER  0x10
++#define SNS1_NO_REC_FOUND     0x08
++#define SNS1_FILE_PROTECTED   0x04
++#define SNS1_WRITE_INHIBITED  0x02
++#define SNS1_INPRECISE_END    0x01
++
++/*
++ * architectured values for third sense byte
++ */
++#define SNS2_REQ_INH_WRITE    0x80
++#define SNS2_CORRECTABLE      0x40
++#define SNS2_FIRST_LOG_ERR    0x20
++#define SNS2_ENV_DATA_PRESENT 0x10
++#define SNS2_INPRECISE_END    0x04
++
++/**
++ * scsw_is_tm - check for transport mode scsw
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the specified scsw is a transport mode scsw, zero
++ * otherwise.
++ */
++static inline int scsw_is_tm(union scsw *scsw)
++{
++      return css_general_characteristics.fcx && (scsw->tm.x == 1);
++}
++
++/**
++ * scsw_key - return scsw key field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the key field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_key(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.key;
++      else
++              return scsw->cmd.key;
++}
++
++/**
++ * scsw_eswf - return scsw eswf field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the eswf field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_eswf(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.eswf;
++      else
++              return scsw->cmd.eswf;
++}
++
++/**
++ * scsw_cc - return scsw cc field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the cc field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_cc(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.cc;
++      else
++              return scsw->cmd.cc;
++}
++
++/**
++ * scsw_ectl - return scsw ectl field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the ectl field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_ectl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.ectl;
++      else
++              return scsw->cmd.ectl;
++}
++
++/**
++ * scsw_pno - return scsw pno field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the pno field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_pno(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.pno;
++      else
++              return scsw->cmd.pno;
++}
++
++/**
++ * scsw_fctl - return scsw fctl field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the fctl field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_fctl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.fctl;
++      else
++              return scsw->cmd.fctl;
++}
++
++/**
++ * scsw_actl - return scsw actl field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the actl field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_actl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.actl;
++      else
++              return scsw->cmd.actl;
++}
++
++/**
++ * scsw_stctl - return scsw stctl field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the stctl field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_stctl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.stctl;
++      else
++              return scsw->cmd.stctl;
++}
++
++/**
++ * scsw_dstat - return scsw dstat field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the dstat field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_dstat(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.dstat;
++      else
++              return scsw->cmd.dstat;
++}
++
++/**
++ * scsw_cstat - return scsw cstat field
++ * @scsw: pointer to scsw
++ *
++ * Return the value of the cstat field of the specified scsw, regardless of
++ * whether it is a transport mode or command mode scsw.
++ */
++static inline u32 scsw_cstat(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw->tm.cstat;
++      else
++              return scsw->cmd.cstat;
++}
++
++/**
++ * scsw_cmd_is_valid_key - check key field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the key field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_key(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_sctl - check fctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fctl field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_sctl(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_eswf - check eswf field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the eswf field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_eswf(union scsw *scsw)
++{
++      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
++}
++
++/**
++ * scsw_cmd_is_valid_cc - check cc field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cc field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_cc(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
++             (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
++}
++
++/**
++ * scsw_cmd_is_valid_fmt - check fmt field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fmt field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_fmt(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_pfch - check pfch field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the pfch field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_pfch(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_isic - check isic field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the isic field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_isic(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_alcc - check alcc field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the alcc field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_alcc(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_ssi - check ssi field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the ssi field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_ssi(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_cmd_is_valid_zcc - check zcc field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the zcc field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_zcc(union scsw *scsw)
++{
++      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
++             (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS);
++}
++
++/**
++ * scsw_cmd_is_valid_ectl - check ectl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the ectl field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_ectl(union scsw *scsw)
++{
++      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
++             !(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
++             (scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS);
++}
++
++/**
++ * scsw_cmd_is_valid_pno - check pno field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the pno field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_pno(union scsw *scsw)
++{
++      return (scsw->cmd.fctl != 0) &&
++             (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) ||
++               ((scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
++                (scsw->cmd.actl & SCSW_ACTL_SUSPENDED)));
++}
++
++/**
++ * scsw_cmd_is_valid_fctl - check fctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fctl field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_fctl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_cmd_is_valid_actl - check actl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the actl field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_actl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_cmd_is_valid_stctl - check stctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the stctl field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_stctl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_cmd_is_valid_dstat - check dstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the dstat field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_dstat(union scsw *scsw)
++{
++      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (scsw->cmd.cc != 3);
++}
++
++/**
++ * scsw_cmd_is_valid_cstat - check cstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cstat field of the specified command mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_cmd_is_valid_cstat(union scsw *scsw)
++{
++      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (scsw->cmd.cc != 3);
++}
++
++/**
++ * scsw_tm_is_valid_key - check key field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the key field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_key(union scsw *scsw)
++{
++      return (scsw->tm.fctl & SCSW_FCTL_START_FUNC);
++}
++
++/**
++ * scsw_tm_is_valid_eswf - check eswf field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the eswf field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_eswf(union scsw *scsw)
++{
++      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
++}
++
++/**
++ * scsw_tm_is_valid_cc - check cc field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cc field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_cc(union scsw *scsw)
++{
++      return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) &&
++             (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
++}
++
++/**
++ * scsw_tm_is_valid_fmt - check fmt field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fmt field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_fmt(union scsw *scsw)
++{
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_x - check x field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the x field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_x(union scsw *scsw)
++{
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_q - check q field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the q field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_q(union scsw *scsw)
++{
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_ectl - check ectl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the ectl field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_ectl(union scsw *scsw)
++{
++      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
++             !(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
++             (scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS);
++}
++
++/**
++ * scsw_tm_is_valid_pno - check pno field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the pno field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_pno(union scsw *scsw)
++{
++      return (scsw->tm.fctl != 0) &&
++             (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) ||
++               ((scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
++                (scsw->tm.actl & SCSW_ACTL_SUSPENDED)));
++}
++
++/**
++ * scsw_tm_is_valid_fctl - check fctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fctl field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_fctl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_actl - check actl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the actl field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_actl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_stctl - check stctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the stctl field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_stctl(union scsw *scsw)
++{
++      /* Only valid if pmcw.dnv == 1*/
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_dstat - check dstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the dstat field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_dstat(union scsw *scsw)
++{
++      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (scsw->tm.cc != 3);
++}
++
++/**
++ * scsw_tm_is_valid_cstat - check cstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cstat field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_cstat(union scsw *scsw)
++{
++      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
++             (scsw->tm.cc != 3);
++}
++
++/**
++ * scsw_tm_is_valid_fcxs - check fcxs field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fcxs field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_fcxs(union scsw *scsw)
++{
++      return 1;
++}
++
++/**
++ * scsw_tm_is_valid_schxs - check schxs field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the schxs field of the specified transport mode scsw is
++ * valid, zero otherwise.
++ */
++static inline int scsw_tm_is_valid_schxs(union scsw *scsw)
++{
++      return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK |
++                                SCHN_STAT_INTF_CTRL_CHK |
++                                SCHN_STAT_PROT_CHECK |
++                                SCHN_STAT_CHN_DATA_CHK));
++}
++
++/**
++ * scsw_is_valid_actl - check actl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the actl field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_actl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_actl(scsw);
++      else
++              return scsw_cmd_is_valid_actl(scsw);
++}
++
++/**
++ * scsw_is_valid_cc - check cc field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cc field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_cc(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_cc(scsw);
++      else
++              return scsw_cmd_is_valid_cc(scsw);
++}
++
++/**
++ * scsw_is_valid_cstat - check cstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the cstat field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_cstat(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_cstat(scsw);
++      else
++              return scsw_cmd_is_valid_cstat(scsw);
++}
++
++/**
++ * scsw_is_valid_dstat - check dstat field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the dstat field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_dstat(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_dstat(scsw);
++      else
++              return scsw_cmd_is_valid_dstat(scsw);
++}
++
++/**
++ * scsw_is_valid_ectl - check ectl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the ectl field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_ectl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_ectl(scsw);
++      else
++              return scsw_cmd_is_valid_ectl(scsw);
++}
++
++/**
++ * scsw_is_valid_eswf - check eswf field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the eswf field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_eswf(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_eswf(scsw);
++      else
++              return scsw_cmd_is_valid_eswf(scsw);
++}
++
++/**
++ * scsw_is_valid_fctl - check fctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the fctl field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_fctl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_fctl(scsw);
++      else
++              return scsw_cmd_is_valid_fctl(scsw);
++}
++
++/**
++ * scsw_is_valid_key - check key field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the key field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_key(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_key(scsw);
++      else
++              return scsw_cmd_is_valid_key(scsw);
++}
++
++/**
++ * scsw_is_valid_pno - check pno field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the pno field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_pno(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_pno(scsw);
++      else
++              return scsw_cmd_is_valid_pno(scsw);
++}
++
++/**
++ * scsw_is_valid_stctl - check stctl field validity
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the stctl field of the specified scsw is valid,
++ * regardless of whether it is a transport mode or command mode scsw.
++ * Return zero if the field does not contain a valid value.
++ */
++static inline int scsw_is_valid_stctl(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_valid_stctl(scsw);
++      else
++              return scsw_cmd_is_valid_stctl(scsw);
++}
++
++/**
++ * scsw_cmd_is_solicited - check for solicited scsw
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the command mode scsw indicates that the associated
++ * status condition is solicited, zero if it is unsolicited.
++ */
++static inline int scsw_cmd_is_solicited(union scsw *scsw)
++{
++      return (scsw->cmd.cc != 0) || (scsw->cmd.stctl !=
++              (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
++}
++
++/**
++ * scsw_tm_is_solicited - check for solicited scsw
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the transport mode scsw indicates that the associated
++ * status condition is solicited, zero if it is unsolicited.
++ */
++static inline int scsw_tm_is_solicited(union scsw *scsw)
++{
++      return (scsw->tm.cc != 0) || (scsw->tm.stctl !=
++              (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
++}
++
++/**
++ * scsw_is_solicited - check for solicited scsw
++ * @scsw: pointer to scsw
++ *
++ * Return non-zero if the transport or command mode scsw indicates that the
++ * associated status condition is solicited, zero if it is unsolicited.
++ */
++static inline int scsw_is_solicited(union scsw *scsw)
++{
++      if (scsw_is_tm(scsw))
++              return scsw_tm_is_solicited(scsw);
++      else
++              return scsw_cmd_is_solicited(scsw);
++}
++
++#endif /* _ASM_S390_SCSW_H_ */
+Index: linux-sles11/drivers/s390/cio/chsc.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/chsc.h
++++ linux-sles11/drivers/s390/cio/chsc.h
+@@ -37,29 +37,6 @@ struct channel_path_desc {
+ struct channel_path;
+-struct css_general_char {
+-      u64 : 12;
+-      u32 dynio : 1;   /* bit 12 */
+-      u32 : 28;
+-      u32 aif : 1;     /* bit 41 */
+-      u32 : 3;
+-      u32 mcss : 1;    /* bit 45 */
+-      u32 fcs : 1;     /* bit 46 */
+-      u32 : 1;
+-      u32 ext_mb : 1;  /* bit 48 */
+-      u32 : 7;
+-      u32 aif_tdd : 1; /* bit 56 */
+-      u32 : 1;
+-      u32 qebsm : 1;   /* bit 58 */
+-      u32 : 8;
+-      u32 aif_osa : 1; /* bit 67 */
+-      u32 : 14;
+-      u32 cib : 1;     /* bit 82 */
+-      u32 : 5;
+-      u32 fcx : 1;     /* bit 88 */
+-      u32 : 7;
+-}__attribute__((packed));
+-
+ struct css_chsc_char {
+       u64 res;
+       u64 : 20;
+@@ -72,7 +49,6 @@ struct css_chsc_char {
+       u32 : 19;
+ }__attribute__((packed));
+-extern struct css_general_char css_general_characteristics;
+ extern struct css_chsc_char css_chsc_characteristics;
+ struct chsc_ssd_info {
+Index: linux-sles11/drivers/s390/cio/Makefile
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/Makefile
++++ linux-sles11/drivers/s390/cio/Makefile
+@@ -2,7 +2,7 @@
+ # Makefile for the S/390 common i/o drivers
+ #
+-obj-y += airq.o blacklist.o chsc.o cio.o css.o chp.o idset.o isc.o scsw.o \
++obj-y += airq.o blacklist.o chsc.o cio.o css.o chp.o idset.o isc.o \
+       fcx.o itcw.o
+ ccw_device-objs += device.o device_fsm.o device_ops.o
+ ccw_device-objs += device_id.o device_pgid.o device_status.o
+Index: linux-sles11/drivers/s390/cio/scsw.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/scsw.c
++++ /dev/null
+@@ -1,843 +0,0 @@
+-/*
+- *  Helper functions for scsw access.
+- *
+- *    Copyright IBM Corp. 2008
+- *    Author(s): Peter Oberparleiter <peter.oberparleiter@de.ibm.com>
+- */
+-
+-#include <linux/types.h>
+-#include <linux/module.h>
+-#include <asm/cio.h>
+-#include "css.h"
+-#include "chsc.h"
+-
+-/**
+- * scsw_is_tm - check for transport mode scsw
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the specified scsw is a transport mode scsw, zero
+- * otherwise.
+- */
+-int scsw_is_tm(union scsw *scsw)
+-{
+-      return css_general_characteristics.fcx && (scsw->tm.x == 1);
+-}
+-EXPORT_SYMBOL(scsw_is_tm);
+-
+-/**
+- * scsw_key - return scsw key field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the key field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_key(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.key;
+-      else
+-              return scsw->cmd.key;
+-}
+-EXPORT_SYMBOL(scsw_key);
+-
+-/**
+- * scsw_eswf - return scsw eswf field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the eswf field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_eswf(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.eswf;
+-      else
+-              return scsw->cmd.eswf;
+-}
+-EXPORT_SYMBOL(scsw_eswf);
+-
+-/**
+- * scsw_cc - return scsw cc field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the cc field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_cc(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.cc;
+-      else
+-              return scsw->cmd.cc;
+-}
+-EXPORT_SYMBOL(scsw_cc);
+-
+-/**
+- * scsw_ectl - return scsw ectl field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the ectl field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_ectl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.ectl;
+-      else
+-              return scsw->cmd.ectl;
+-}
+-EXPORT_SYMBOL(scsw_ectl);
+-
+-/**
+- * scsw_pno - return scsw pno field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the pno field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_pno(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.pno;
+-      else
+-              return scsw->cmd.pno;
+-}
+-EXPORT_SYMBOL(scsw_pno);
+-
+-/**
+- * scsw_fctl - return scsw fctl field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the fctl field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_fctl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.fctl;
+-      else
+-              return scsw->cmd.fctl;
+-}
+-EXPORT_SYMBOL(scsw_fctl);
+-
+-/**
+- * scsw_actl - return scsw actl field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the actl field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_actl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.actl;
+-      else
+-              return scsw->cmd.actl;
+-}
+-EXPORT_SYMBOL(scsw_actl);
+-
+-/**
+- * scsw_stctl - return scsw stctl field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the stctl field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_stctl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.stctl;
+-      else
+-              return scsw->cmd.stctl;
+-}
+-EXPORT_SYMBOL(scsw_stctl);
+-
+-/**
+- * scsw_dstat - return scsw dstat field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the dstat field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_dstat(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.dstat;
+-      else
+-              return scsw->cmd.dstat;
+-}
+-EXPORT_SYMBOL(scsw_dstat);
+-
+-/**
+- * scsw_cstat - return scsw cstat field
+- * @scsw: pointer to scsw
+- *
+- * Return the value of the cstat field of the specified scsw, regardless of
+- * whether it is a transport mode or command mode scsw.
+- */
+-u32 scsw_cstat(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw->tm.cstat;
+-      else
+-              return scsw->cmd.cstat;
+-}
+-EXPORT_SYMBOL(scsw_cstat);
+-
+-/**
+- * scsw_cmd_is_valid_key - check key field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the key field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_key(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_key);
+-
+-/**
+- * scsw_cmd_is_valid_sctl - check fctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fctl field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_sctl(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_sctl);
+-
+-/**
+- * scsw_cmd_is_valid_eswf - check eswf field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the eswf field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_eswf(union scsw *scsw)
+-{
+-      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_eswf);
+-
+-/**
+- * scsw_cmd_is_valid_cc - check cc field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cc field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_cc(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
+-             (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_cc);
+-
+-/**
+- * scsw_cmd_is_valid_fmt - check fmt field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fmt field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_fmt(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_fmt);
+-
+-/**
+- * scsw_cmd_is_valid_pfch - check pfch field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the pfch field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_pfch(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_pfch);
+-
+-/**
+- * scsw_cmd_is_valid_isic - check isic field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the isic field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_isic(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_isic);
+-
+-/**
+- * scsw_cmd_is_valid_alcc - check alcc field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the alcc field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_alcc(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_alcc);
+-
+-/**
+- * scsw_cmd_is_valid_ssi - check ssi field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the ssi field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_ssi(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_ssi);
+-
+-/**
+- * scsw_cmd_is_valid_zcc - check zcc field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the zcc field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_zcc(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl & SCSW_FCTL_START_FUNC) &&
+-             (scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_zcc);
+-
+-/**
+- * scsw_cmd_is_valid_ectl - check ectl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the ectl field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_ectl(union scsw *scsw)
+-{
+-      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             !(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
+-             (scsw->cmd.stctl & SCSW_STCTL_ALERT_STATUS);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_ectl);
+-
+-/**
+- * scsw_cmd_is_valid_pno - check pno field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the pno field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_pno(union scsw *scsw)
+-{
+-      return (scsw->cmd.fctl != 0) &&
+-             (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (!(scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) ||
+-               ((scsw->cmd.stctl & SCSW_STCTL_INTER_STATUS) &&
+-                (scsw->cmd.actl & SCSW_ACTL_SUSPENDED)));
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_pno);
+-
+-/**
+- * scsw_cmd_is_valid_fctl - check fctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fctl field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_fctl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_fctl);
+-
+-/**
+- * scsw_cmd_is_valid_actl - check actl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the actl field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_actl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_actl);
+-
+-/**
+- * scsw_cmd_is_valid_stctl - check stctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the stctl field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_stctl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_stctl);
+-
+-/**
+- * scsw_cmd_is_valid_dstat - check dstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the dstat field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_dstat(union scsw *scsw)
+-{
+-      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (scsw->cmd.cc != 3);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_dstat);
+-
+-/**
+- * scsw_cmd_is_valid_cstat - check cstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cstat field of the specified command mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_cmd_is_valid_cstat(union scsw *scsw)
+-{
+-      return (scsw->cmd.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (scsw->cmd.cc != 3);
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_valid_cstat);
+-
+-/**
+- * scsw_tm_is_valid_key - check key field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the key field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_key(union scsw *scsw)
+-{
+-      return (scsw->tm.fctl & SCSW_FCTL_START_FUNC);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_key);
+-
+-/**
+- * scsw_tm_is_valid_eswf - check eswf field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the eswf field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_eswf(union scsw *scsw)
+-{
+-      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_eswf);
+-
+-/**
+- * scsw_tm_is_valid_cc - check cc field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cc field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_cc(union scsw *scsw)
+-{
+-      return (scsw->tm.fctl & SCSW_FCTL_START_FUNC) &&
+-             (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_cc);
+-
+-/**
+- * scsw_tm_is_valid_fmt - check fmt field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fmt field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_fmt(union scsw *scsw)
+-{
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_fmt);
+-
+-/**
+- * scsw_tm_is_valid_x - check x field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the x field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_x(union scsw *scsw)
+-{
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_x);
+-
+-/**
+- * scsw_tm_is_valid_q - check q field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the q field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_q(union scsw *scsw)
+-{
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_q);
+-
+-/**
+- * scsw_tm_is_valid_ectl - check ectl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the ectl field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_ectl(union scsw *scsw)
+-{
+-      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             !(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
+-             (scsw->tm.stctl & SCSW_STCTL_ALERT_STATUS);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_ectl);
+-
+-/**
+- * scsw_tm_is_valid_pno - check pno field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the pno field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_pno(union scsw *scsw)
+-{
+-      return (scsw->tm.fctl != 0) &&
+-             (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (!(scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) ||
+-               ((scsw->tm.stctl & SCSW_STCTL_INTER_STATUS) &&
+-                (scsw->tm.actl & SCSW_ACTL_SUSPENDED)));
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_pno);
+-
+-/**
+- * scsw_tm_is_valid_fctl - check fctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fctl field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_fctl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_fctl);
+-
+-/**
+- * scsw_tm_is_valid_actl - check actl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the actl field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_actl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_actl);
+-
+-/**
+- * scsw_tm_is_valid_stctl - check stctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the stctl field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_stctl(union scsw *scsw)
+-{
+-      /* Only valid if pmcw.dnv == 1*/
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_stctl);
+-
+-/**
+- * scsw_tm_is_valid_dstat - check dstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the dstat field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_dstat(union scsw *scsw)
+-{
+-      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (scsw->tm.cc != 3);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_dstat);
+-
+-/**
+- * scsw_tm_is_valid_cstat - check cstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cstat field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_cstat(union scsw *scsw)
+-{
+-      return (scsw->tm.stctl & SCSW_STCTL_STATUS_PEND) &&
+-             (scsw->tm.cc != 3);
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_cstat);
+-
+-/**
+- * scsw_tm_is_valid_fcxs - check fcxs field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fcxs field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_fcxs(union scsw *scsw)
+-{
+-      return 1;
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_fcxs);
+-
+-/**
+- * scsw_tm_is_valid_schxs - check schxs field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the schxs field of the specified transport mode scsw is
+- * valid, zero otherwise.
+- */
+-int scsw_tm_is_valid_schxs(union scsw *scsw)
+-{
+-      return (scsw->tm.cstat & (SCHN_STAT_PROG_CHECK |
+-                                SCHN_STAT_INTF_CTRL_CHK |
+-                                SCHN_STAT_PROT_CHECK |
+-                                SCHN_STAT_CHN_DATA_CHK));
+-}
+-EXPORT_SYMBOL(scsw_tm_is_valid_schxs);
+-
+-/**
+- * scsw_is_valid_actl - check actl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the actl field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_actl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_actl(scsw);
+-      else
+-              return scsw_cmd_is_valid_actl(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_actl);
+-
+-/**
+- * scsw_is_valid_cc - check cc field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cc field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_cc(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_cc(scsw);
+-      else
+-              return scsw_cmd_is_valid_cc(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_cc);
+-
+-/**
+- * scsw_is_valid_cstat - check cstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the cstat field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_cstat(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_cstat(scsw);
+-      else
+-              return scsw_cmd_is_valid_cstat(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_cstat);
+-
+-/**
+- * scsw_is_valid_dstat - check dstat field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the dstat field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_dstat(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_dstat(scsw);
+-      else
+-              return scsw_cmd_is_valid_dstat(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_dstat);
+-
+-/**
+- * scsw_is_valid_ectl - check ectl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the ectl field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_ectl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_ectl(scsw);
+-      else
+-              return scsw_cmd_is_valid_ectl(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_ectl);
+-
+-/**
+- * scsw_is_valid_eswf - check eswf field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the eswf field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_eswf(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_eswf(scsw);
+-      else
+-              return scsw_cmd_is_valid_eswf(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_eswf);
+-
+-/**
+- * scsw_is_valid_fctl - check fctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the fctl field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_fctl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_fctl(scsw);
+-      else
+-              return scsw_cmd_is_valid_fctl(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_fctl);
+-
+-/**
+- * scsw_is_valid_key - check key field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the key field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_key(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_key(scsw);
+-      else
+-              return scsw_cmd_is_valid_key(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_key);
+-
+-/**
+- * scsw_is_valid_pno - check pno field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the pno field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_pno(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_pno(scsw);
+-      else
+-              return scsw_cmd_is_valid_pno(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_pno);
+-
+-/**
+- * scsw_is_valid_stctl - check stctl field validity
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the stctl field of the specified scsw is valid,
+- * regardless of whether it is a transport mode or command mode scsw.
+- * Return zero if the field does not contain a valid value.
+- */
+-int scsw_is_valid_stctl(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_valid_stctl(scsw);
+-      else
+-              return scsw_cmd_is_valid_stctl(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_valid_stctl);
+-
+-/**
+- * scsw_cmd_is_solicited - check for solicited scsw
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the command mode scsw indicates that the associated
+- * status condition is solicited, zero if it is unsolicited.
+- */
+-int scsw_cmd_is_solicited(union scsw *scsw)
+-{
+-      return (scsw->cmd.cc != 0) || (scsw->cmd.stctl !=
+-              (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
+-}
+-EXPORT_SYMBOL(scsw_cmd_is_solicited);
+-
+-/**
+- * scsw_tm_is_solicited - check for solicited scsw
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the transport mode scsw indicates that the associated
+- * status condition is solicited, zero if it is unsolicited.
+- */
+-int scsw_tm_is_solicited(union scsw *scsw)
+-{
+-      return (scsw->tm.cc != 0) || (scsw->tm.stctl !=
+-              (SCSW_STCTL_STATUS_PEND | SCSW_STCTL_ALERT_STATUS));
+-}
+-EXPORT_SYMBOL(scsw_tm_is_solicited);
+-
+-/**
+- * scsw_is_solicited - check for solicited scsw
+- * @scsw: pointer to scsw
+- *
+- * Return non-zero if the transport or command mode scsw indicates that the
+- * associated status condition is solicited, zero if it is unsolicited.
+- */
+-int scsw_is_solicited(union scsw *scsw)
+-{
+-      if (scsw_is_tm(scsw))
+-              return scsw_tm_is_solicited(scsw);
+-      else
+-              return scsw_cmd_is_solicited(scsw);
+-}
+-EXPORT_SYMBOL(scsw_is_solicited);
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-11-csum-fold.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-11-csum-fold.patch
new file mode 100644 (file)
index 0000000..d6e54c3
--- /dev/null
@@ -0,0 +1,77 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] convert/optimize csum_fold() to C
+References: bnc#532063,LTC#55526
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+In the meantime gcc generates better code than the old inline
+assemblies do. Original inline assembly results in:
+
+lr     %r1,%r2
+sr     %r3,%r3
+lr     %r2,%r1
+srdl   %r2,16
+alr    %r2,%r3
+alr    %r1,%r2
+srl    %r1,16
+xilf   %r1,65535
+llghr  %r2,%r1
+br     %r14
+
+Out of the C code gcc generates this:
+
+rll    %r1,%r2,16
+ar     %r1,%r2
+srl    %r1,16
+xilf   %r1,65535
+llghr  %r2,%r1
+br     %r14
+
+In addition we don't have any static register allocations anymore and
+gcc is free to shuffle instructions around for better pipeline usage.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ arch/s390/include/asm/checksum.h |   25 ++++---------------------
+ 1 file changed, 4 insertions(+), 21 deletions(-)
+
+diff -urpN linux-2.6/arch/s390/include/asm/checksum.h linux-2.6-patched/arch/s390/include/asm/checksum.h
+--- linux-2.6/arch/s390/include/asm/checksum.h 2009-06-10 05:05:27.000000000 +0200
++++ linux-2.6-patched/arch/s390/include/asm/checksum.h 2009-06-30 09:21:36.000000000 +0200
+@@ -78,28 +78,11 @@ csum_partial_copy_nocheck (const void *s
+  */
+ static inline __sum16 csum_fold(__wsum sum)
+ {
+-#ifndef __s390x__
+-      register_pair rp;
++      u32 csum = (__force u32) sum;
+-      asm volatile(
+-              "       slr     %N1,%N1\n"      /* %0 = H L */
+-              "       lr      %1,%0\n"        /* %0 = H L, %1 = H L 0 0 */
+-              "       srdl    %1,16\n"        /* %0 = H L, %1 = 0 H L 0 */
+-              "       alr     %1,%N1\n"       /* %0 = H L, %1 = L H L 0 */
+-              "       alr     %0,%1\n"        /* %0 = H+L+C L+H */
+-              "       srl     %0,16\n"        /* %0 = H+L+C */
+-              : "+&d" (sum), "=d" (rp) : : "cc");
+-#else /* __s390x__ */
+-      asm volatile(
+-              "       sr      3,3\n"          /* %0 = H*65536 + L */
+-              "       lr      2,%0\n"         /* %0 = H L, 2/3 = H L / 0 0 */
+-              "       srdl    2,16\n"         /* %0 = H L, 2/3 = 0 H / L 0 */
+-              "       alr     2,3\n"          /* %0 = H L, 2/3 = L H / L 0 */
+-              "       alr     %0,2\n"         /* %0 = H+L+C L+H */
+-              "       srl     %0,16\n"        /* %0 = H+L+C */
+-              : "+&d" (sum) : : "cc", "2", "3");
+-#endif /* __s390x__ */
+-      return (__force __sum16) ~sum;
++      csum += (csum >> 16) + (csum << 16);
++      csum >>= 16;
++      return (__force __sum16) ~csum;
+ }
+ /*
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-12-get_clock_monotonic.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-12-get_clock_monotonic.patch
new file mode 100644 (file)
index 0000000..d62750d
--- /dev/null
@@ -0,0 +1,60 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] introduce get_clock_monotonic
+References: bnc#532063,LTC#55526
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+Introduce get_clock_monotonic() function which can be used to get a
+(fast) timestamp. Resolution is the same as for get_clock(). The
+only difference is that the timestamps are monotonic and don't jump
+backward or forward.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ arch/s390/include/asm/timex.h |   16 ++++++++++++++++
+ arch/s390/kernel/time.c       |    3 ++-
+ 2 files changed, 18 insertions(+), 1 deletion(-)
+
+Index: linux-sles11/arch/s390/include/asm/timex.h
+===================================================================
+--- linux-sles11.orig/arch/s390/include/asm/timex.h
++++ linux-sles11/arch/s390/include/asm/timex.h
+@@ -85,4 +85,20 @@ int get_sync_clock(unsigned long long *c
+ void init_cpu_timer(void);
+ unsigned long long monotonic_clock(void);
++extern u64 jiffies_timer_cc;
++
++/**
++ * get_clock_monotonic - returns current time in clock rate units
++ *
++ * The caller must ensure that preemption is disabled.
++ * The clock and sched_clock_base get changed via stop_machine.
++ * Therefore preemption must be disabled when calling this
++ * function, otherwise the returned value is not guaranteed to
++ * be monotonic.
++ */
++static inline unsigned long long get_clock_monotonic(void)
++{
++      return get_clock_xt() - jiffies_timer_cc;
++}
++
+ #endif
+Index: linux-sles11/arch/s390/kernel/time.c
+===================================================================
+--- linux-sles11.orig/arch/s390/kernel/time.c
++++ linux-sles11/arch/s390/kernel/time.c
+@@ -63,7 +63,8 @@
+ static ext_int_info_t ext_int_info_cc;
+ static ext_int_info_t ext_int_etr_cc;
+-static u64 jiffies_timer_cc;
++u64 jiffies_timer_cc;
++EXPORT_SYMBOL(jiffies_timer_cc);
+ static DEFINE_PER_CPU(struct clock_event_device, comparators);
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-13-dasd-goodcase-perf.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-13-dasd-goodcase-perf.patch
new file mode 100644 (file)
index 0000000..080f4b7
--- /dev/null
@@ -0,0 +1,331 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] dasd: optimize cpu usage in goodcase
+References: bnc#532063,LTC#55526
+
+From: Stefan Haberland <stefan.haberland@de.ibm.com>
+
+remove unnecessary dbf call, remove string operations for magic
+
+Signed-off-by: Stefan Haberland <stefan.haberland@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+---
+ drivers/s390/block/dasd.c       |   21 ++++++++-------------
+ drivers/s390/block/dasd_alias.c |    3 +--
+ drivers/s390/block/dasd_diag.c  |    3 +--
+ drivers/s390/block/dasd_eckd.c  |   35 +++++++++++++++--------------------
+ drivers/s390/block/dasd_eer.c   |    2 +-
+ drivers/s390/block/dasd_fba.c   |    5 ++---
+ drivers/s390/block/dasd_int.h   |   11 ++++++++---
+ 7 files changed, 36 insertions(+), 44 deletions(-)
+
+Index: linux-sles11/drivers/s390/block/dasd.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd.c
++++ linux-sles11/drivers/s390/block/dasd.c
+@@ -645,14 +645,14 @@ static void dasd_profile_end(struct dasd
+  * memory and 2) dasd_smalloc_request uses the static ccw memory
+  * that gets allocated for each device.
+  */
+-struct dasd_ccw_req *dasd_kmalloc_request(char *magic, int cplength,
++struct dasd_ccw_req *dasd_kmalloc_request(int magic, int cplength,
+                                         int datasize,
+                                         struct dasd_device *device)
+ {
+       struct dasd_ccw_req *cqr;
+       /* Sanity checks */
+-      BUG_ON( magic == NULL || datasize > PAGE_SIZE ||
++      BUG_ON(datasize > PAGE_SIZE ||
+            (cplength*sizeof(struct ccw1)) > PAGE_SIZE);
+       cqr = kzalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC);
+@@ -676,14 +676,13 @@ struct dasd_ccw_req *dasd_kmalloc_reques
+                       return ERR_PTR(-ENOMEM);
+               }
+       }
+-      strncpy((char *) &cqr->magic, magic, 4);
+-      ASCEBC((char *) &cqr->magic, 4);
++      cqr->magic =  magic;
+       set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
+       dasd_get_device(device);
+       return cqr;
+ }
+-struct dasd_ccw_req *dasd_smalloc_request(char *magic, int cplength,
++struct dasd_ccw_req *dasd_smalloc_request(int magic, int cplength,
+                                         int datasize,
+                                         struct dasd_device *device)
+ {
+@@ -693,7 +692,7 @@ struct dasd_ccw_req *dasd_smalloc_reques
+       int size;
+       /* Sanity checks */
+-      BUG_ON( magic == NULL || datasize > PAGE_SIZE ||
++      BUG_ON(datasize > PAGE_SIZE ||
+            (cplength*sizeof(struct ccw1)) > PAGE_SIZE);
+       size = (sizeof(struct dasd_ccw_req) + 7L) & -8L;
+@@ -720,8 +719,7 @@ struct dasd_ccw_req *dasd_smalloc_reques
+               cqr->data = data;
+               memset(cqr->data, 0, datasize);
+       }
+-      strncpy((char *) &cqr->magic, magic, 4);
+-      ASCEBC((char *) &cqr->magic, 4);
++      cqr->magic = magic;
+       set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags);
+       dasd_get_device(device);
+       return cqr;
+@@ -865,9 +863,6 @@ int dasd_start_IO(struct dasd_ccw_req *c
+       switch (rc) {
+       case 0:
+               cqr->status = DASD_CQR_IN_IO;
+-              DBF_DEV_EVENT(DBF_DEBUG, device,
+-                            "start_IO: request %p started successful",
+-                            cqr);
+               break;
+       case -EBUSY:
+               DBF_DEV_EVENT(DBF_ERR, device, "%s",
+@@ -2393,7 +2388,7 @@ int dasd_generic_notify(struct ccw_devic
+ static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device,
+                                                  void *rdc_buffer,
+                                                  int rdc_buffer_size,
+-                                                 char *magic)
++                                                 int magic)
+ {
+       struct dasd_ccw_req *cqr;
+       struct ccw1 *ccw;
+@@ -2422,7 +2417,7 @@ static struct dasd_ccw_req *dasd_generic
+ }
+-int dasd_generic_read_dev_chars(struct dasd_device *device, char *magic,
++int dasd_generic_read_dev_chars(struct dasd_device *device, int magic,
+                               void **rdc_buffer, int rdc_buffer_size)
+ {
+       int ret;
+Index: linux-sles11/drivers/s390/block/dasd_alias.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_alias.c
++++ linux-sles11/drivers/s390/block/dasd_alias.c
+@@ -377,8 +377,7 @@ static int read_unit_address_configurati
+       int rc;
+       unsigned long flags;
+-      cqr = dasd_kmalloc_request("ECKD",
+-                                 1 /* PSF */  + 1 /* RSSD */ ,
++      cqr = dasd_kmalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */,
+                                  (sizeof(struct dasd_psf_prssd_data)),
+                                  device);
+       if (IS_ERR(cqr))
+Index: linux-sles11/drivers/s390/block/dasd_diag.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_diag.c
++++ linux-sles11/drivers/s390/block/dasd_diag.c
+@@ -521,8 +521,7 @@ static struct dasd_ccw_req *dasd_diag_bu
+       /* Build the request */
+       datasize = sizeof(struct dasd_diag_req) +
+               count*sizeof(struct dasd_diag_bio);
+-      cqr = dasd_smalloc_request(dasd_diag_discipline.name, 0,
+-                                 datasize, memdev);
++      cqr = dasd_smalloc_request(DASD_DIAG_MAGIC, 0, datasize, memdev);
+       if (IS_ERR(cqr))
+               return cqr;
+Index: linux-sles11/drivers/s390/block/dasd_eckd.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_eckd.c
++++ linux-sles11/drivers/s390/block/dasd_eckd.c
+@@ -582,7 +582,8 @@ static struct dasd_ccw_req *dasd_eckd_bu
+       struct dasd_ccw_req *cqr;
+       struct ccw1 *ccw;
+-      cqr = dasd_smalloc_request("ECKD", 1 /* RCD */, ciw->count, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* RCD */, ciw->count,
++                                 device);
+       if (IS_ERR(cqr)) {
+               DEV_MESSAGE(KERN_WARNING, device, "%s",
+@@ -784,8 +785,7 @@ static int dasd_eckd_read_features(struc
+       struct dasd_eckd_private *private;
+       private = (struct dasd_eckd_private *) device->private;
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 1 /* PSF */  + 1 /* RSSD */ ,
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ + 1 /* RSSD */,
+                                  (sizeof(struct dasd_psf_prssd_data) +
+                                   sizeof(struct dasd_rssd_features)),
+                                  device);
+@@ -846,7 +846,7 @@ static struct dasd_ccw_req *dasd_eckd_bu
+       struct dasd_psf_ssc_data *psf_ssc_data;
+       struct ccw1 *ccw;
+-      cqr = dasd_smalloc_request("ECKD", 1 /* PSF */ ,
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */ ,
+                                 sizeof(struct dasd_psf_ssc_data),
+                                 device);
+@@ -995,7 +995,8 @@ dasd_eckd_check_characteristics(struct d
+       /* Read Device Characteristics */
+       rdc_data = (void *) &(private->rdc_data);
+       memset(rdc_data, 0, sizeof(rdc_data));
+-      rc = dasd_generic_read_dev_chars(device, "ECKD", &rdc_data, 64);
++      rc = dasd_generic_read_dev_chars(device, DASD_ECKD_MAGIC, &rdc_data,
++                                       64);
+       if (rc) {
+               DEV_MESSAGE(KERN_WARNING, device,
+                           "Read device characteristics returned "
+@@ -1055,8 +1056,7 @@ dasd_eckd_analysis_ccw(struct dasd_devic
+       cplength = 8;
+       datasize = sizeof(struct DE_eckd_data) + 2*sizeof(struct LO_eckd_data);
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 cplength, datasize, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize, device);
+       if (IS_ERR(cqr))
+               return cqr;
+       ccw = cqr->cpaddr;
+@@ -1327,8 +1327,7 @@ dasd_eckd_format_device(struct dasd_devi
+               return ERR_PTR(-EINVAL);
+       }
+       /* Allocate the format ccw request. */
+-      fcp = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 cplength, datasize, device);
++      fcp = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize, device);
+       if (IS_ERR(fcp))
+               return fcp;
+@@ -1607,8 +1606,8 @@ static struct dasd_ccw_req *dasd_eckd_bu
+               datasize += count*sizeof(struct LO_eckd_data);
+       }
+       /* Allocate the ccw request. */
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 cplength, datasize, startdev);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, cplength, datasize,
++                                 startdev);
+       if (IS_ERR(cqr))
+               return cqr;
+       ccw = cqr->cpaddr;
+@@ -1865,8 +1864,7 @@ dasd_eckd_release(struct dasd_device *de
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 1, 32, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device);
+       if (IS_ERR(cqr)) {
+               DEV_MESSAGE(KERN_WARNING, device, "%s",
+                           "Could not allocate initialization request");
+@@ -1906,8 +1904,7 @@ dasd_eckd_reserve(struct dasd_device *de
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 1, 32, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device);
+       if (IS_ERR(cqr)) {
+               DEV_MESSAGE(KERN_WARNING, device, "%s",
+                           "Could not allocate initialization request");
+@@ -1946,8 +1943,7 @@ dasd_eckd_steal_lock(struct dasd_device 
+       if (!capable(CAP_SYS_ADMIN))
+               return -EACCES;
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 1, 32, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1, 32, device);
+       if (IS_ERR(cqr)) {
+               DEV_MESSAGE(KERN_WARNING, device, "%s",
+                           "Could not allocate initialization request");
+@@ -1984,8 +1980,7 @@ dasd_eckd_performance(struct dasd_device
+       struct ccw1 *ccw;
+       int rc;
+-      cqr = dasd_smalloc_request(dasd_eckd_discipline.name,
+-                                 1 /* PSF */  + 1 /* RSSD */ ,
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 1 /* PSF */  + 1 /* RSSD */,
+                                  (sizeof(struct dasd_psf_prssd_data) +
+                                   sizeof(struct dasd_rssd_perf_stats_t)),
+                                  device);
+@@ -2131,7 +2126,7 @@ static int dasd_symm_io(struct dasd_devi
+       }
+       /* setup CCWs for PSF + RSSD */
+-      cqr = dasd_smalloc_request("ECKD", 2 , 0, device);
++      cqr = dasd_smalloc_request(DASD_ECKD_MAGIC, 2 , 0, device);
+       if (IS_ERR(cqr)) {
+               DEV_MESSAGE(KERN_WARNING, device, "%s",
+                       "Could not allocate initialization request");
+Index: linux-sles11/drivers/s390/block/dasd_eer.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_eer.c
++++ linux-sles11/drivers/s390/block/dasd_eer.c
+@@ -456,7 +456,7 @@ int dasd_eer_enable(struct dasd_device *
+       if (!device->discipline || strcmp(device->discipline->name, "ECKD"))
+               return -EPERM;  /* FIXME: -EMEDIUMTYPE ? */
+-      cqr = dasd_kmalloc_request("ECKD", 1 /* SNSS */,
++      cqr = dasd_kmalloc_request(DASD_ECKD_MAGIC, 1 /* SNSS */,
+                                  SNSS_DATA_SIZE, device);
+       if (IS_ERR(cqr))
+               return -ENOMEM;
+Index: linux-sles11/drivers/s390/block/dasd_fba.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_fba.c
++++ linux-sles11/drivers/s390/block/dasd_fba.c
+@@ -148,7 +148,7 @@ dasd_fba_check_characteristics(struct da
+       /* Read Device Characteristics */
+       rdc_data = (void *) &(private->rdc_data);
+-      rc = dasd_generic_read_dev_chars(device, "FBA ", &rdc_data, 32);
++      rc = dasd_generic_read_dev_chars(device, DASD_FBA_MAGIC, &rdc_data, 32);
+       if (rc) {
+               DEV_MESSAGE(KERN_WARNING, device,
+                           "Read device characteristics returned error %d",
+@@ -298,8 +298,7 @@ static struct dasd_ccw_req *dasd_fba_bui
+               datasize += (count - 1)*sizeof(struct LO_fba_data);
+       }
+       /* Allocate the ccw request. */
+-      cqr = dasd_smalloc_request(dasd_fba_discipline.name,
+-                                 cplength, datasize, memdev);
++      cqr = dasd_smalloc_request(DASD_FBA_MAGIC, cplength, datasize, memdev);
+       if (IS_ERR(cqr))
+               return cqr;
+       ccw = cqr->cpaddr;
+Index: linux-sles11/drivers/s390/block/dasd_int.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_int.h
++++ linux-sles11/drivers/s390/block/dasd_int.h
+@@ -60,6 +60,11 @@
+ #include <asm/dasd.h>
+ #include <asm/idals.h>
++/* DASD discipline magic */
++#define DASD_ECKD_MAGIC 0xC5C3D2C4
++#define DASD_DIAG_MAGIC 0xC4C9C1C7
++#define DASD_FBA_MAGIC 0xC6C2C140
++
+ /*
+  * SECTION: Type definitions
+  */
+@@ -528,9 +533,9 @@ extern struct block_device_operations da
+ extern struct kmem_cache *dasd_page_cache;
+ struct dasd_ccw_req *
+-dasd_kmalloc_request(char *, int, int, struct dasd_device *);
++dasd_kmalloc_request(int , int, int, struct dasd_device *);
+ struct dasd_ccw_req *
+-dasd_smalloc_request(char *, int, int, struct dasd_device *);
++dasd_smalloc_request(int , int, int, struct dasd_device *);
+ void dasd_kfree_request(struct dasd_ccw_req *, struct dasd_device *);
+ void dasd_sfree_request(struct dasd_ccw_req *, struct dasd_device *);
+@@ -572,7 +577,7 @@ int dasd_generic_set_offline (struct ccw
+ int dasd_generic_notify(struct ccw_device *, int);
+ void dasd_generic_handle_state_change(struct dasd_device *);
+-int dasd_generic_read_dev_chars(struct dasd_device *, char *, void **, int);
++int dasd_generic_read_dev_chars(struct dasd_device *, int, void **, int);
+ /* externals in dasd_devmap.c */
+ extern int dasd_max_devindex;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-14-zfcp-optimize-qdio_account.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-14-zfcp-optimize-qdio_account.patch
new file mode 100644 (file)
index 0000000..cdd8589
--- /dev/null
@@ -0,0 +1,59 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] zfcp: optimize zfcp_qdio_account
+References: bnc#532063,LTC#55526
+
+From: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+Remove expensive ktime_get()/ktime_us_delta() functions from the hot
+path and use get_clock_monotonic() instead.
+This elimates seven function calls and avoids a lot of unnecessary
+calculations.
+
+Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ drivers/s390/scsi/zfcp_def.h  |    2 +-
+ drivers/s390/scsi/zfcp_qdio.c |   11 +++++------
+ 2 files changed, 6 insertions(+), 7 deletions(-)
+
+Index: linux-sles11/drivers/s390/scsi/zfcp_def.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_def.h     2009-08-17 15:31:27.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_def.h  2009-08-17 15:31:29.000000000 +0200
+@@ -472,7 +472,7 @@
+       spinlock_t              req_q_lock;        /* for operations on queue */
+       int                     req_q_pci_batch;   /* SBALs since PCI indication
+                                                     was last set */
+-      ktime_t                 req_q_time; /* time of last fill level change */
++      unsigned long long      req_q_time; /* time of last fill level change */
+       u64                     req_q_util; /* for accounting */
+       spinlock_t              qdio_stat_lock;
+       u32                     fsf_req_seq_no;    /* FSF cmnd seq number */
+Index: linux-sles11/drivers/s390/scsi/zfcp_qdio.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_qdio.c    2009-08-17 15:31:27.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_qdio.c 2009-08-17 15:31:29.000000000 +0200
+@@ -77,16 +77,15 @@
+ }
+ /* this needs to be called prior to updating the queue fill level */
+-static void zfcp_qdio_account(struct zfcp_adapter *adapter)
++static inline void zfcp_qdio_account(struct zfcp_adapter *adapter)
+ {
+-      ktime_t now;
+-      s64 span;
++      unsigned long long now, span;
+       int free, used;
+       spin_lock(&adapter->qdio_stat_lock);
+-      now = ktime_get();
+-      span = ktime_us_delta(now, adapter->req_q_time);
+-      free = max(0, atomic_read(&adapter->req_q.count));
++      now = get_clock_monotonic();
++      span = (now - adapter->req_q_time) >> 12;
++      free = atomic_read(&adapter->req_q.count);
+       used = QDIO_MAX_BUFFERS_PER_Q - free;
+       adapter->req_q_util += used * span;
+       adapter->req_q_time = now;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-15-zfcp-move-debug-data.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-15-zfcp-move-debug-data.patch
new file mode 100644 (file)
index 0000000..c17de54
--- /dev/null
@@ -0,0 +1,618 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] zfcp: Move debug data from zfcp_data to own data structure
+References: bnc#532063,LTC#55526
+
+From: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+The struct zfcp_adapter includes everything related to the debug
+traces. This introduces dependences between the definitions in
+zfcp_def.h and zfcp_dbf.h. Move all debug related data structures to a
+new data structure to break those dependencies and manage the debug
+data in zfcp_dbf.[hc].
+
+Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ drivers/s390/scsi/zfcp_aux.c |    4 
+ drivers/s390/scsi/zfcp_dbf.c |  217 ++++++++++++++++++++++++-------------------
+ drivers/s390/scsi/zfcp_dbf.h |   17 +++
+ drivers/s390/scsi/zfcp_def.h |   15 --
+ drivers/s390/scsi/zfcp_fsf.h |    3 
+ 5 files changed, 143 insertions(+), 113 deletions(-)
+
+Index: linux-sles11/drivers/s390/scsi/zfcp_aux.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_aux.c     2009-08-17 15:31:25.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_aux.c  2009-08-17 15:31:35.000000000 +0200
+@@ -494,10 +494,6 @@
+       spin_lock_init(&adapter->req_list_lock);
+-      spin_lock_init(&adapter->hba_dbf_lock);
+-      spin_lock_init(&adapter->san_dbf_lock);
+-      spin_lock_init(&adapter->scsi_dbf_lock);
+-      spin_lock_init(&adapter->rec_dbf_lock);
+       spin_lock_init(&adapter->req_q_lock);
+       spin_lock_init(&adapter->qdio_stat_lock);
+Index: linux-sles11/drivers/s390/scsi/zfcp_dbf.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_dbf.c     2009-08-17 15:31:25.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_dbf.c  2009-08-17 15:31:35.000000000 +0200
+@@ -3,13 +3,14 @@
+  *
+  * Debug traces for zfcp.
+  *
+- * Copyright IBM Corporation 2002, 2008
++ * Copyright IBM Corporation 2002, 2009
+  */
+ #define KMSG_COMPONENT "zfcp"
+ #include <linux/ctype.h>
+ #include <asm/debug.h>
++#include "zfcp_dbf.h"
+ #include "zfcp_ext.h"
+ static u32 dbfsize = 4;
+@@ -125,6 +126,7 @@
+ void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
+ {
+       struct zfcp_adapter *adapter = fsf_req->adapter;
++      struct zfcp_dbf *dbf = adapter->dbf;
+       struct fsf_qtcb *qtcb = fsf_req->qtcb;
+       union fsf_prot_status_qual *prot_status_qual =
+                                       &qtcb->prefix.prot_status_qual;
+@@ -133,12 +135,12 @@
+       struct zfcp_port *port;
+       struct zfcp_unit *unit;
+       struct zfcp_send_els *send_els;
+-      struct zfcp_hba_dbf_record *rec = &adapter->hba_dbf_buf;
++      struct zfcp_hba_dbf_record *rec = &dbf->hba_dbf_buf;
+       struct zfcp_hba_dbf_record_response *response = &rec->u.response;
+       int level;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->hba_dbf_lock, flags);
+       memset(rec, 0, sizeof(*rec));
+       strncpy(rec->tag, "resp", ZFCP_DBF_TAG_SIZE);
+@@ -223,7 +225,7 @@
+               break;
+       }
+-      debug_event(adapter->hba_dbf, level, rec, sizeof(*rec));
++      debug_event(dbf->hba_dbf, level, rec, sizeof(*rec));
+       /* have fcp channel microcode fixed to use as little as possible */
+       if (fsf_req->fsf_command != FSF_QTCB_FCP_CMND) {
+@@ -231,11 +233,11 @@
+               char *buf = (char *)qtcb + qtcb->header.log_start;
+               int len = qtcb->header.log_length;
+               for (; len && !buf[len - 1]; len--);
+-              zfcp_dbf_hexdump(adapter->hba_dbf, rec, sizeof(*rec), level,
+-                               buf, len);
++              zfcp_dbf_hexdump(dbf->hba_dbf, rec, sizeof(*rec), level, buf,
++                               len);
+       }
+-      spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
++      spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+ /**
+@@ -247,10 +249,11 @@
+ void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
+                                 struct fsf_status_read_buffer *status_buffer)
+ {
+-      struct zfcp_hba_dbf_record *rec = &adapter->hba_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_hba_dbf_record *rec = &dbf->hba_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->hba_dbf_lock, flags);
+       memset(rec, 0, sizeof(*rec));
+       strncpy(rec->tag, "stat", ZFCP_DBF_TAG_SIZE);
+       strncpy(rec->tag2, tag, ZFCP_DBF_TAG_SIZE);
+@@ -292,8 +295,8 @@
+                      &status_buffer->payload, rec->u.status.payload_size);
+       }
+-      debug_event(adapter->hba_dbf, 2, rec, sizeof(*rec));
+-      spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
++      debug_event(dbf->hba_dbf, 2, rec, sizeof(*rec));
++      spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+ /**
+@@ -307,17 +310,18 @@
+                            unsigned int qdio_error, int sbal_index,
+                            int sbal_count)
+ {
+-      struct zfcp_hba_dbf_record *r = &adapter->hba_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_hba_dbf_record *r = &dbf->hba_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->hba_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       strncpy(r->tag, "qdio", ZFCP_DBF_TAG_SIZE);
+       r->u.qdio.qdio_error = qdio_error;
+       r->u.qdio.sbal_index = sbal_index;
+       r->u.qdio.sbal_count = sbal_count;
+-      debug_event(adapter->hba_dbf, 0, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
++      debug_event(dbf->hba_dbf, 0, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+ /**
+@@ -328,17 +332,18 @@
+ void zfcp_hba_dbf_event_berr(struct zfcp_adapter *adapter,
+                            struct zfcp_fsf_req *req)
+ {
+-      struct zfcp_hba_dbf_record *r = &adapter->hba_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_hba_dbf_record *r = &dbf->hba_dbf_buf;
+       struct fsf_status_read_buffer *sr_buf = req->data;
+       struct fsf_bit_error_payload *err = &sr_buf->payload.bit_error;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->hba_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->hba_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       strncpy(r->tag, "berr", ZFCP_DBF_TAG_SIZE);
+       memcpy(&r->u.berr, err, sizeof(struct fsf_bit_error_payload));
+-      debug_event(adapter->hba_dbf, 0, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->hba_dbf_lock, flags);
++      debug_event(dbf->hba_dbf, 0, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+ static void zfcp_hba_dbf_view_response(char **p,
+                                      struct zfcp_hba_dbf_record_response *r)
+@@ -707,7 +712,8 @@
+  */
+ void zfcp_rec_dbf_event_thread(u8 id2, struct zfcp_adapter *adapter)
+ {
+-      struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_rec_dbf_record *r = &dbf->rec_dbf_buf;
+       unsigned long flags = 0;
+       struct list_head *entry;
+       unsigned ready = 0, running = 0, total;
+@@ -718,15 +724,15 @@
+               running++;
+       total = adapter->erp_total_count;
+-      spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->rec_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       r->id = ZFCP_REC_DBF_ID_THREAD;
+       r->id2 = id2;
+       r->u.thread.total = total;
+       r->u.thread.ready = ready;
+       r->u.thread.running = running;
+-      debug_event(adapter->rec_dbf, 6, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
++      debug_event(dbf->rec_dbf, 6, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->rec_dbf_lock, flags);
+ }
+ /**
+@@ -749,10 +755,11 @@
+                                     atomic_t *status, atomic_t *erp_count,
+                                     u64 wwpn, u32 d_id, u64 fcp_lun)
+ {
+-      struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_rec_dbf_record *r = &dbf->rec_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->rec_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       r->id = ZFCP_REC_DBF_ID_TARGET;
+       r->id2 = id2;
+@@ -762,8 +769,8 @@
+       r->u.target.d_id = d_id;
+       r->u.target.fcp_lun = fcp_lun;
+       r->u.target.erp_count = atomic_read(erp_count);
+-      debug_event(adapter->rec_dbf, 3, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
++      debug_event(dbf->rec_dbf, 3, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->rec_dbf_lock, flags);
+ }
+ /**
+@@ -824,10 +831,11 @@
+                               void *action, struct zfcp_adapter *adapter,
+                               struct zfcp_port *port, struct zfcp_unit *unit)
+ {
+-      struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_rec_dbf_record *r = &dbf->rec_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->rec_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       r->id = ZFCP_REC_DBF_ID_TRIGGER;
+       r->id2 = id2;
+@@ -844,8 +852,8 @@
+               r->u.trigger.us = atomic_read(&unit->status);
+               r->u.trigger.fcp_lun = unit->fcp_lun;
+       }
+-      debug_event(adapter->rec_dbf, action ? 1 : 4, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
++      debug_event(dbf->rec_dbf, action ? 1 : 4, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->rec_dbf_lock, flags);
+ }
+ /**
+@@ -856,10 +864,11 @@
+ void zfcp_rec_dbf_event_action(u8 id2, struct zfcp_erp_action *erp_action)
+ {
+       struct zfcp_adapter *adapter = erp_action->adapter;
+-      struct zfcp_rec_dbf_record *r = &adapter->rec_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_rec_dbf_record *r = &dbf->rec_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->rec_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->rec_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       r->id = ZFCP_REC_DBF_ID_ACTION;
+       r->id2 = id2;
+@@ -867,8 +876,8 @@
+       r->u.action.status = erp_action->status;
+       r->u.action.step = erp_action->step;
+       r->u.action.fsf_req = (unsigned long)erp_action->fsf_req;
+-      debug_event(adapter->rec_dbf, 5, r, sizeof(*r));
+-      spin_unlock_irqrestore(&adapter->rec_dbf_lock, flags);
++      debug_event(dbf->rec_dbf, 5, r, sizeof(*r));
++      spin_unlock_irqrestore(&dbf->rec_dbf_lock, flags);
+ }
+ /**
+@@ -880,13 +889,14 @@
+       struct zfcp_send_ct *ct = (struct zfcp_send_ct *)fsf_req->data;
+       struct zfcp_wka_port *wka_port = ct->wka_port;
+       struct zfcp_adapter *adapter = wka_port->adapter;
++      struct zfcp_dbf *dbf = adapter->dbf;
+       struct ct_hdr *hdr = sg_virt(ct->req);
+-      struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
++      struct zfcp_san_dbf_record *r = &dbf->san_dbf_buf;
+       struct zfcp_san_dbf_record_ct_request *oct = &r->u.ct_req;
+       int level = 3;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->san_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->san_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       strncpy(r->tag, "octc", ZFCP_DBF_TAG_SIZE);
+       r->fsf_reqid = (unsigned long)fsf_req;
+@@ -901,10 +911,10 @@
+       oct->max_res_size = hdr->max_res_size;
+       oct->len = min((int)ct->req->length - (int)sizeof(struct ct_hdr),
+                      ZFCP_DBF_SAN_MAX_PAYLOAD);
+-      debug_event(adapter->san_dbf, level, r, sizeof(*r));
+-      zfcp_dbf_hexdump(adapter->san_dbf, r, sizeof(*r), level,
++      debug_event(dbf->san_dbf, level, r, sizeof(*r));
++      zfcp_dbf_hexdump(dbf->san_dbf, r, sizeof(*r), level,
+                        (void *)hdr + sizeof(struct ct_hdr), oct->len);
+-      spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
++      spin_unlock_irqrestore(&dbf->san_dbf_lock, flags);
+ }
+ /**
+@@ -917,12 +927,13 @@
+       struct zfcp_wka_port *wka_port = ct->wka_port;
+       struct zfcp_adapter *adapter = wka_port->adapter;
+       struct ct_hdr *hdr = sg_virt(ct->resp);
+-      struct zfcp_san_dbf_record *r = &adapter->san_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_san_dbf_record *r = &dbf->san_dbf_buf;
+       struct zfcp_san_dbf_record_ct_response *rct = &r->u.ct_resp;
+       int level = 3;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->san_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->san_dbf_lock, flags);
+       memset(r, 0, sizeof(*r));
+       strncpy(r->tag, "rctc", ZFCP_DBF_TAG_SIZE);
+       r->fsf_reqid = (unsigned long)fsf_req;
+@@ -937,10 +948,10 @@
+       rct->max_res_size = hdr->max_res_size;
+       rct->len = min((int)ct->resp->length - (int)sizeof(struct ct_hdr),
+                      ZFCP_DBF_SAN_MAX_PAYLOAD);
+-      debug_event(adapter->san_dbf, level, r, sizeof(*r));
+-      zfcp_dbf_hexdump(adapter->san_dbf, r, sizeof(*r), level,
++      debug_event(dbf->san_dbf, level, r, sizeof(*r));
++      zfcp_dbf_hexdump(dbf->san_dbf, r, sizeof(*r), level,
+                        (void *)hdr + sizeof(struct ct_hdr), rct->len);
+-      spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
++      spin_unlock_irqrestore(&dbf->san_dbf_lock, flags);
+ }
+ static void zfcp_san_dbf_event_els(const char *tag, int level,
+@@ -949,10 +960,11 @@
+                                  int buflen)
+ {
+       struct zfcp_adapter *adapter = fsf_req->adapter;
+-      struct zfcp_san_dbf_record *rec = &adapter->san_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_san_dbf_record *rec = &dbf->san_dbf_buf;
+       unsigned long flags;
+-      spin_lock_irqsave(&adapter->san_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->san_dbf_lock, flags);
+       memset(rec, 0, sizeof(*rec));
+       strncpy(rec->tag, tag, ZFCP_DBF_TAG_SIZE);
+       rec->fsf_reqid = (unsigned long)fsf_req;
+@@ -960,10 +972,10 @@
+       rec->s_id = s_id;
+       rec->d_id = d_id;
+       rec->u.els.ls_code = ls_code;
+-      debug_event(adapter->san_dbf, level, rec, sizeof(*rec));
+-      zfcp_dbf_hexdump(adapter->san_dbf, rec, sizeof(*rec), level,
++      debug_event(dbf->san_dbf, level, rec, sizeof(*rec));
++      zfcp_dbf_hexdump(dbf->san_dbf, rec, sizeof(*rec), level,
+                        buffer, min(buflen, ZFCP_DBF_SAN_MAX_PAYLOAD));
+-      spin_unlock_irqrestore(&adapter->san_dbf_lock, flags);
++      spin_unlock_irqrestore(&dbf->san_dbf_lock, flags);
+ }
+ /**
+@@ -1067,14 +1079,15 @@
+                               struct zfcp_fsf_req *fsf_req,
+                               unsigned long old_req_id)
+ {
+-      struct zfcp_scsi_dbf_record *rec = &adapter->scsi_dbf_buf;
++      struct zfcp_dbf *dbf = adapter->dbf;
++      struct zfcp_scsi_dbf_record *rec = &dbf->scsi_dbf_buf;
+       struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec;
+       unsigned long flags;
+       struct fcp_rsp_iu *fcp_rsp;
+       char *fcp_rsp_info = NULL, *fcp_sns_info = NULL;
+       int offset = 0, buflen = 0;
+-      spin_lock_irqsave(&adapter->scsi_dbf_lock, flags);
++      spin_lock_irqsave(&dbf->scsi_dbf_lock, flags);
+       do {
+               memset(rec, 0, sizeof(*rec));
+               if (offset == 0) {
+@@ -1133,9 +1146,9 @@
+                       memcpy(dump->data, fcp_sns_info + offset, dump->size);
+                       offset += dump->size;
+               }
+-              debug_event(adapter->scsi_dbf, level, rec, sizeof(*rec));
++              debug_event(dbf->scsi_dbf, level, rec, sizeof(*rec));
+       } while (offset < buflen);
+-      spin_unlock_irqrestore(&adapter->scsi_dbf_lock, flags);
++      spin_unlock_irqrestore(&dbf->scsi_dbf_lock, flags);
+ }
+ /**
+@@ -1239,6 +1252,22 @@
+       NULL
+ };
++static debug_info_t *zfcp_dbf_reg(const char *name, int level,
++                                struct debug_view *view, int size)
++{
++      struct debug_info *d;
++
++      d = debug_register(name, dbfsize, level, size);
++      if (!d)
++              return NULL;
++
++      debug_register_view(d, &debug_hex_ascii_view);
++      debug_register_view(d, view);
++      debug_set_level(d, level);
++
++      return d;
++}
++
+ /**
+  * zfcp_adapter_debug_register - registers debug feature for an adapter
+  * @adapter: pointer to adapter for which debug features should be registered
+@@ -1247,52 +1276,56 @@
+ int zfcp_adapter_debug_register(struct zfcp_adapter *adapter)
+ {
+       char dbf_name[DEBUG_MAX_NAME_LEN];
++      struct zfcp_dbf *dbf;
++
++      dbf = kmalloc(sizeof(struct zfcp_dbf), GFP_KERNEL);
++      if (!dbf)
++              return -ENOMEM;
++
++      spin_lock_init(&dbf->hba_dbf_lock);
++      spin_lock_init(&dbf->san_dbf_lock);
++      spin_lock_init(&dbf->scsi_dbf_lock);
++      spin_lock_init(&dbf->rec_dbf_lock);
+       /* debug feature area which records recovery activity */
+       sprintf(dbf_name, "zfcp_%s_rec", zfcp_get_busid_by_adapter(adapter));
+-      adapter->rec_dbf = debug_register(dbf_name, dbfsize, 1,
+-                                        sizeof(struct zfcp_rec_dbf_record));
+-      if (!adapter->rec_dbf)
+-              goto failed;
+-      debug_register_view(adapter->rec_dbf, &debug_hex_ascii_view);
+-      debug_register_view(adapter->rec_dbf, &zfcp_rec_dbf_view);
+-      debug_set_level(adapter->rec_dbf, 3);
++      dbf->rec_dbf = zfcp_dbf_reg(dbf_name, 3, &zfcp_rec_dbf_view,
++                                  sizeof(struct zfcp_rec_dbf_record));
++      if (!dbf->rec_dbf)
++              goto fail_rec;
+       /* debug feature area which records HBA (FSF and QDIO) conditions */
+       sprintf(dbf_name, "zfcp_%s_hba", zfcp_get_busid_by_adapter(adapter));
+-      adapter->hba_dbf = debug_register(dbf_name, dbfsize, 1,
+-                                        sizeof(struct zfcp_hba_dbf_record));
+-      if (!adapter->hba_dbf)
+-              goto failed;
+-      debug_register_view(adapter->hba_dbf, &debug_hex_ascii_view);
+-      debug_register_view(adapter->hba_dbf, &zfcp_hba_dbf_view);
+-      debug_set_level(adapter->hba_dbf, 3);
++      dbf->hba_dbf = zfcp_dbf_reg(dbf_name, 3, &zfcp_hba_dbf_view,
++                                  sizeof(struct zfcp_hba_dbf_record));
++      if (!dbf->hba_dbf)
++              goto fail_hba;
+       /* debug feature area which records SAN command failures and recovery */
+       sprintf(dbf_name, "zfcp_%s_san", zfcp_get_busid_by_adapter(adapter));
+-      adapter->san_dbf = debug_register(dbf_name, dbfsize, 1,
+-                                        sizeof(struct zfcp_san_dbf_record));
+-      if (!adapter->san_dbf)
+-              goto failed;
+-      debug_register_view(adapter->san_dbf, &debug_hex_ascii_view);
+-      debug_register_view(adapter->san_dbf, &zfcp_san_dbf_view);
+-      debug_set_level(adapter->san_dbf, 6);
++      dbf->san_dbf = zfcp_dbf_reg(dbf_name, 6, &zfcp_san_dbf_view,
++                                  sizeof(struct zfcp_san_dbf_record));
++      if (!dbf->san_dbf)
++              goto fail_san;
+       /* debug feature area which records SCSI command failures and recovery */
+       sprintf(dbf_name, "zfcp_%s_scsi", zfcp_get_busid_by_adapter(adapter));
+-      adapter->scsi_dbf = debug_register(dbf_name, dbfsize, 1,
+-                                         sizeof(struct zfcp_scsi_dbf_record));
+-      if (!adapter->scsi_dbf)
+-              goto failed;
+-      debug_register_view(adapter->scsi_dbf, &debug_hex_ascii_view);
+-      debug_register_view(adapter->scsi_dbf, &zfcp_scsi_dbf_view);
+-      debug_set_level(adapter->scsi_dbf, 3);
++      dbf->scsi_dbf = zfcp_dbf_reg(dbf_name, 3, &zfcp_scsi_dbf_view,
++                                   sizeof(struct zfcp_scsi_dbf_record));
++      if (!dbf->scsi_dbf)
++              goto fail_scsi;
++      adapter->dbf = dbf;
+       return 0;
+- failed:
+-      zfcp_adapter_debug_unregister(adapter);
+-
++fail_scsi:
++      debug_unregister(dbf->san_dbf);
++fail_san:
++      debug_unregister(dbf->hba_dbf);
++fail_hba:
++      debug_unregister(dbf->rec_dbf);
++fail_rec:
++      kfree(dbf);
+       return -ENOMEM;
+ }
+@@ -1302,12 +1335,10 @@
+  */
+ void zfcp_adapter_debug_unregister(struct zfcp_adapter *adapter)
+ {
+-      debug_unregister(adapter->scsi_dbf);
+-      debug_unregister(adapter->san_dbf);
+-      debug_unregister(adapter->hba_dbf);
+-      debug_unregister(adapter->rec_dbf);
+-      adapter->scsi_dbf = NULL;
+-      adapter->san_dbf = NULL;
+-      adapter->hba_dbf = NULL;
+-      adapter->rec_dbf = NULL;
++      debug_unregister(adapter->dbf->scsi_dbf);
++      debug_unregister(adapter->dbf->san_dbf);
++      debug_unregister(adapter->dbf->hba_dbf);
++      debug_unregister(adapter->dbf->rec_dbf);
++      kfree(adapter->dbf);
++      adapter->dbf = NULL;
+ }
+Index: linux-sles11/drivers/s390/scsi/zfcp_dbf.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_dbf.h     2009-08-17 15:31:25.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_dbf.h  2009-08-17 15:31:35.000000000 +0200
+@@ -2,7 +2,7 @@
+  * This file is part of the zfcp device driver for
+  * FCP adapters for IBM System z9 and zSeries.
+  *
+- * Copyright IBM Corp. 2008, 2008
++ * Copyright IBM Corp. 2008, 2009
+  *
+  * This program is free software; you can redistribute it and/or modify
+  * it under the terms of the GNU General Public License as published by
+@@ -221,4 +221,19 @@
+       u8 sns_info[ZFCP_DBF_SCSI_FCP_SNS_INFO];
+ } __attribute__ ((packed));
++struct zfcp_dbf {
++      debug_info_t                    *rec_dbf;
++      debug_info_t                    *hba_dbf;
++      debug_info_t                    *san_dbf;
++      debug_info_t                    *scsi_dbf;
++      spinlock_t                      rec_dbf_lock;
++      spinlock_t                      hba_dbf_lock;
++      spinlock_t                      san_dbf_lock;
++      spinlock_t                      scsi_dbf_lock;
++      struct zfcp_rec_dbf_record      rec_dbf_buf;
++      struct zfcp_hba_dbf_record      hba_dbf_buf;
++      struct zfcp_san_dbf_record      san_dbf_buf;
++      struct zfcp_scsi_dbf_record     scsi_dbf_buf;
++};
++
+ #endif /* ZFCP_DBF_H */
+Index: linux-sles11/drivers/s390/scsi/zfcp_def.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_def.h     2009-08-17 15:31:29.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_def.h  2009-08-17 15:31:35.000000000 +0200
+@@ -33,10 +33,8 @@
+ #include <asm/qdio.h>
+ #include <asm/debug.h>
+ #include <asm/ebcdic.h>
+-#include "zfcp_dbf.h"
+ #include "zfcp_fsf.h"
+-
+ /********************* GENERAL DEFINES *********************************/
+ #define REQUEST_LIST_SIZE 128
+@@ -499,18 +497,7 @@
+       u32                     erp_low_mem_count; /* nr of erp actions waiting
+                                                     for memory */
+       struct zfcp_wka_port    nsp;               /* adapter's nameserver */
+-      debug_info_t            *rec_dbf;
+-      debug_info_t            *hba_dbf;
+-      debug_info_t            *san_dbf;          /* debug feature areas */
+-      debug_info_t            *scsi_dbf;
+-      spinlock_t              rec_dbf_lock;
+-      spinlock_t              hba_dbf_lock;
+-      spinlock_t              san_dbf_lock;
+-      spinlock_t              scsi_dbf_lock;
+-      struct zfcp_rec_dbf_record      rec_dbf_buf;
+-      struct zfcp_hba_dbf_record      hba_dbf_buf;
+-      struct zfcp_san_dbf_record      san_dbf_buf;
+-      struct zfcp_scsi_dbf_record     scsi_dbf_buf;
++      struct zfcp_dbf         *dbf;              /* debug traces */
+       struct zfcp_adapter_mempool     pool;      /* Adapter memory pools */
+       struct qdio_initialize  qdio_init_data;    /* for qdio_establish */
+       struct fc_host_statistics *fc_stats;
+Index: linux-sles11/drivers/s390/scsi/zfcp_fsf.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_fsf.h     2009-08-17 15:31:25.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_fsf.h  2009-08-17 15:31:35.000000000 +0200
+@@ -3,13 +3,14 @@
+  *
+  * Interface to the FSF support functions.
+  *
+- * Copyright IBM Corporation 2002, 2008
++ * Copyright IBM Corporation 2002, 2009
+  */
+ #ifndef FSF_H
+ #define FSF_H
+ #include <linux/pfn.h>
++#include <linux/scatterlist.h>
+ #define FSF_QTCB_CURRENT_VERSION              0x00000001
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-16-zfcp-scsi-trace-only-matching-debug-data.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-16-zfcp-scsi-trace-only-matching-debug-data.patch
new file mode 100644 (file)
index 0000000..b3ceb4f
--- /dev/null
@@ -0,0 +1,230 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] zfcp: Only collect SCSI debug data for matching trace levels
+References: bnc#532063,LTC#55526
+
+From: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+The default trace level is to only trace failed SCSI commands. Thus it
+is not necessary to collect trace data for most SCSI commands, since
+it will be thrown away later. Restructure the SCSI trace
+infrastructure to first check the trace level in a inline function and
+only do the expensive data collection for matching trace levels.
+
+Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ drivers/s390/scsi/zfcp_dbf.c  |   58 ++------------------------------------
+ drivers/s390/scsi/zfcp_dbf.h  |   63 ++++++++++++++++++++++++++++++++++++++++++
+ drivers/s390/scsi/zfcp_ext.h  |   11 ++-----
+ drivers/s390/scsi/zfcp_fsf.c  |    1 
+ drivers/s390/scsi/zfcp_scsi.c |    3 +-
+ 5 files changed, 73 insertions(+), 63 deletions(-)
+
+Index: linux-sles11/drivers/s390/scsi/zfcp_dbf.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_dbf.c     2009-08-17 15:31:35.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_dbf.c  2009-08-17 15:31:41.000000000 +0200
+@@ -1073,13 +1073,11 @@
+       NULL
+ };
+-static void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
+-                              struct zfcp_adapter *adapter,
+-                              struct scsi_cmnd *scsi_cmnd,
+-                              struct zfcp_fsf_req *fsf_req,
+-                              unsigned long old_req_id)
++void _zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
++                        struct zfcp_dbf *dbf, struct scsi_cmnd *scsi_cmnd,
++                        struct zfcp_fsf_req *fsf_req,
++                        unsigned long old_req_id)
+ {
+-      struct zfcp_dbf *dbf = adapter->dbf;
+       struct zfcp_scsi_dbf_record *rec = &dbf->scsi_dbf_buf;
+       struct zfcp_dbf_dump *dump = (struct zfcp_dbf_dump *)rec;
+       unsigned long flags;
+@@ -1151,54 +1149,6 @@
+       spin_unlock_irqrestore(&dbf->scsi_dbf_lock, flags);
+ }
+-/**
+- * zfcp_scsi_dbf_event_result - trace event for SCSI command completion
+- * @tag: tag indicating success or failure of SCSI command
+- * @level: trace level applicable for this event
+- * @adapter: adapter that has been used to issue the SCSI command
+- * @scsi_cmnd: SCSI command pointer
+- * @fsf_req: request used to issue SCSI command (might be NULL)
+- */
+-void zfcp_scsi_dbf_event_result(const char *tag, int level,
+-                              struct zfcp_adapter *adapter,
+-                              struct scsi_cmnd *scsi_cmnd,
+-                              struct zfcp_fsf_req *fsf_req)
+-{
+-      zfcp_scsi_dbf_event("rslt", tag, level, adapter, scsi_cmnd, fsf_req, 0);
+-}
+-
+-/**
+- * zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
+- * @tag: tag indicating success or failure of abort operation
+- * @adapter: adapter thas has been used to issue SCSI command to be aborted
+- * @scsi_cmnd: SCSI command to be aborted
+- * @new_fsf_req: request containing abort (might be NULL)
+- * @old_req_id: identifier of request containg SCSI command to be aborted
+- */
+-void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
+-                             struct scsi_cmnd *scsi_cmnd,
+-                             struct zfcp_fsf_req *new_fsf_req,
+-                             unsigned long old_req_id)
+-{
+-      zfcp_scsi_dbf_event("abrt", tag, 1, adapter, scsi_cmnd, new_fsf_req,
+-                          old_req_id);
+-}
+-
+-/**
+- * zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
+- * @tag: tag indicating success or failure of reset operation
+- * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
+- * @unit: unit that needs reset
+- * @scsi_cmnd: SCSI command which caused this error recovery
+- */
+-void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
+-                                struct zfcp_unit *unit,
+-                                struct scsi_cmnd *scsi_cmnd)
+-{
+-      zfcp_scsi_dbf_event(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
+-                          unit->port->adapter, scsi_cmnd, NULL, 0);
+-}
+-
+ static int zfcp_scsi_dbf_view_format(debug_info_t *id, struct debug_view *view,
+                                    char *out_buf, const char *in_buf)
+ {
+Index: linux-sles11/drivers/s390/scsi/zfcp_dbf.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_dbf.h     2009-08-17 15:31:35.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_dbf.h  2009-08-17 15:31:41.000000000 +0200
+@@ -22,7 +22,9 @@
+ #ifndef ZFCP_DBF_H
+ #define ZFCP_DBF_H
++#include "zfcp_ext.h"
+ #include "zfcp_fsf.h"
++#include "zfcp_def.h"
+ #define ZFCP_DBF_TAG_SIZE      4
+@@ -236,4 +238,65 @@
+       struct zfcp_scsi_dbf_record     scsi_dbf_buf;
+ };
++static inline
++void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
++                       struct zfcp_adapter *adapter, struct scsi_cmnd *scmd,
++                       struct zfcp_fsf_req *req, unsigned long old_id)
++{
++      struct zfcp_dbf *dbf = adapter->dbf;
++
++      if (level <= dbf->scsi_dbf->level)
++              _zfcp_scsi_dbf_event(tag, tag2, level, dbf, scmd, req, old_id);
++}
++
++/**
++ * zfcp_scsi_dbf_event_result - trace event for SCSI command completion
++ * @tag: tag indicating success or failure of SCSI command
++ * @level: trace level applicable for this event
++ * @adapter: adapter that has been used to issue the SCSI command
++ * @scmd: SCSI command pointer
++ * @fsf_req: request used to issue SCSI command (might be NULL)
++ */
++static inline
++void zfcp_scsi_dbf_event_result(const char *tag, int level,
++                              struct zfcp_adapter *adapter,
++                              struct scsi_cmnd *scmd,
++                              struct zfcp_fsf_req *fsf_req)
++{
++      zfcp_scsi_dbf_event("rslt", tag, level, adapter, scmd, fsf_req, 0);
++}
++
++/**
++ * zfcp_scsi_dbf_event_abort - trace event for SCSI command abort
++ * @tag: tag indicating success or failure of abort operation
++ * @adapter: adapter thas has been used to issue SCSI command to be aborted
++ * @scmd: SCSI command to be aborted
++ * @new_req: request containing abort (might be NULL)
++ * @old_id: identifier of request containg SCSI command to be aborted
++ */
++static inline
++void zfcp_scsi_dbf_event_abort(const char *tag, struct zfcp_adapter *adapter,
++                             struct scsi_cmnd *scmd,
++                             struct zfcp_fsf_req *new_req,
++                             unsigned long old_id)
++{
++      zfcp_scsi_dbf_event("abrt", tag, 1, adapter, scmd, new_req, old_id);
++}
++
++/**
++ * zfcp_scsi_dbf_event_devreset - trace event for Logical Unit or Target Reset
++ * @tag: tag indicating success or failure of reset operation
++ * @flag: indicates type of reset (Target Reset, Logical Unit Reset)
++ * @unit: unit that needs reset
++ * @scsi_cmnd: SCSI command which caused this error recovery
++ */
++static inline
++void zfcp_scsi_dbf_event_devreset(const char *tag, u8 flag,
++                                struct zfcp_unit *unit,
++                                struct scsi_cmnd *scsi_cmnd)
++{
++      zfcp_scsi_dbf_event(flag == FCP_TARGET_RESET ? "trst" : "lrst", tag, 1,
++                          unit->port->adapter, scsi_cmnd, NULL, 0);
++}
++
+ #endif /* ZFCP_DBF_H */
+Index: linux-sles11/drivers/s390/scsi/zfcp_ext.h
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_ext.h     2009-08-17 14:29:54.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_ext.h  2009-08-17 15:31:41.000000000 +0200
+@@ -56,14 +56,9 @@
+ extern void zfcp_san_dbf_event_els_request(struct zfcp_fsf_req *);
+ extern void zfcp_san_dbf_event_els_response(struct zfcp_fsf_req *);
+ extern void zfcp_san_dbf_event_incoming_els(struct zfcp_fsf_req *);
+-extern void zfcp_scsi_dbf_event_result(const char *, int, struct zfcp_adapter *,
+-                                     struct scsi_cmnd *,
+-                                     struct zfcp_fsf_req *);
+-extern void zfcp_scsi_dbf_event_abort(const char *, struct zfcp_adapter *,
+-                                    struct scsi_cmnd *, struct zfcp_fsf_req *,
+-                                    unsigned long);
+-extern void zfcp_scsi_dbf_event_devreset(const char *, u8, struct zfcp_unit *,
+-                                       struct scsi_cmnd *);
++extern void _zfcp_scsi_dbf_event(const char *, const char *, int,
++                               struct zfcp_dbf *, struct scsi_cmnd *,
++                               struct zfcp_fsf_req *, unsigned long);
+ /* zfcp_erp.c */
+ extern void zfcp_erp_modify_adapter_status(struct zfcp_adapter *, u8, void *,
+Index: linux-sles11/drivers/s390/scsi/zfcp_fsf.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_fsf.c     2009-08-17 14:29:54.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_fsf.c  2009-08-17 15:31:41.000000000 +0200
+@@ -10,6 +10,7 @@
+ #include <linux/blktrace_api.h>
+ #include "zfcp_ext.h"
++#include "zfcp_dbf.h"
+ #define ZFCP_REQ_AUTO_CLEANUP 0x00000002
+ #define ZFCP_REQ_NO_QTCB      0x00000008
+Index: linux-sles11/drivers/s390/scsi/zfcp_scsi.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/scsi/zfcp_scsi.c    2009-08-17 14:29:54.000000000 +0200
++++ linux-sles11/drivers/s390/scsi/zfcp_scsi.c 2009-08-17 15:31:41.000000000 +0200
+@@ -8,8 +8,9 @@
+ #define KMSG_COMPONENT "zfcp"
+-#include "zfcp_ext.h"
+ #include <asm/atomic.h>
++#include "zfcp_ext.h"
++#include "zfcp_dbf.h"
+ static unsigned int default_depth = 32;
+ module_param_named(queue_depth, default_depth, uint, 0600);
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-17-zfcp-fsfhba-trace-only-matching-debug-data.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-17-perf-17-zfcp-fsfhba-trace-only-matching-debug-data.patch
new file mode 100644 (file)
index 0000000..56cadff
--- /dev/null
@@ -0,0 +1,182 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: [PATCH] zfcp: Only collect FSF/HBA debug data for matching trace levels
+References: bnc#532063,LTC#55526
+
+From: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+The default trace level is to only trace failed FSF commands. Thus it
+is not necessary to collect trace data for most FSF commands, since
+it will be thrown away later. Restructure the FSF/HBA trace
+infrastructure to first check the trace level in a inline function and
+only do the expensive data collection for matching trace levels.
+
+Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+
+ drivers/s390/scsi/zfcp_dbf.c |   44 ++++++-----------------------------
+ drivers/s390/scsi/zfcp_dbf.h |   53 +++++++++++++++++++++++++++++++++++++++++++
+ drivers/s390/scsi/zfcp_ext.h |    9 ++++---
+ 3 files changed, 67 insertions(+), 39 deletions(-)
+
+--- a/drivers/s390/scsi/zfcp_dbf.c     2009-07-01 17:57:03.000000000 +0200
++++ b/drivers/s390/scsi/zfcp_dbf.c     2009-07-01 17:57:41.000000000 +0200
+@@ -119,14 +119,10 @@ static int zfcp_dbf_view_header(debug_in
+       return p - out_buf;
+ }
+-/**
+- * zfcp_hba_dbf_event_fsf_response - trace event for request completion
+- * @fsf_req: request that has been completed
+- */
+-void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *fsf_req)
++void _zfcp_hba_dbf_event_fsf_response(const char *tag2, int level,
++                                    struct zfcp_fsf_req *fsf_req,
++                                    struct zfcp_dbf *dbf)
+ {
+-      struct zfcp_adapter *adapter = fsf_req->adapter;
+-      struct zfcp_dbf *dbf = adapter->dbf;
+       struct fsf_qtcb *qtcb = fsf_req->qtcb;
+       union fsf_prot_status_qual *prot_status_qual =
+                                       &qtcb->prefix.prot_status_qual;
+@@ -137,31 +133,12 @@ void zfcp_hba_dbf_event_fsf_response(str
+       struct zfcp_send_els *send_els;
+       struct zfcp_hba_dbf_record *rec = &dbf->hba_dbf_buf;
+       struct zfcp_hba_dbf_record_response *response = &rec->u.response;
+-      int level;
+       unsigned long flags;
+       spin_lock_irqsave(&dbf->hba_dbf_lock, flags);
+       memset(rec, 0, sizeof(*rec));
+       strncpy(rec->tag, "resp", ZFCP_DBF_TAG_SIZE);
+-
+-      if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
+-          (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
+-              strncpy(rec->tag2, "perr", ZFCP_DBF_TAG_SIZE);
+-              level = 1;
+-      } else if (qtcb->header.fsf_status != FSF_GOOD) {
+-              strncpy(rec->tag2, "ferr", ZFCP_DBF_TAG_SIZE);
+-              level = 1;
+-      } else if ((fsf_req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
+-                 (fsf_req->fsf_command == FSF_QTCB_OPEN_LUN)) {
+-              strncpy(rec->tag2, "open", ZFCP_DBF_TAG_SIZE);
+-              level = 4;
+-      } else if (qtcb->header.log_length) {
+-              strncpy(rec->tag2, "qtcb", ZFCP_DBF_TAG_SIZE);
+-              level = 5;
+-      } else {
+-              strncpy(rec->tag2, "norm", ZFCP_DBF_TAG_SIZE);
+-              level = 6;
+-      }
++      strncpy(rec->tag2, tag2, ZFCP_DBF_TAG_SIZE);
+       response->fsf_command = fsf_req->fsf_command;
+       response->fsf_reqid = (unsigned long)fsf_req;
+@@ -240,14 +217,9 @@ void zfcp_hba_dbf_event_fsf_response(str
+       spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+-/**
+- * zfcp_hba_dbf_event_fsf_unsol - trace event for an unsolicited status buffer
+- * @tag: tag indicating which kind of unsolicited status has been received
+- * @adapter: adapter that has issued the unsolicited status buffer
+- * @status_buffer: buffer containing payload of unsolicited status
+- */
+-void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
+-                                struct fsf_status_read_buffer *status_buffer)
++void _zfcp_hba_dbf_event_fsf_unsol(const char *tag, int level,
++                                 struct zfcp_adapter *adapter,
++                                 struct fsf_status_read_buffer *status_buffer)
+ {
+       struct zfcp_dbf *dbf = adapter->dbf;
+       struct zfcp_hba_dbf_record *rec = &dbf->hba_dbf_buf;
+@@ -295,7 +267,7 @@ void zfcp_hba_dbf_event_fsf_unsol(const 
+                      &status_buffer->payload, rec->u.status.payload_size);
+       }
+-      debug_event(dbf->hba_dbf, 2, rec, sizeof(*rec));
++      debug_event(dbf->hba_dbf, level, rec, sizeof(*rec));
+       spin_unlock_irqrestore(&dbf->hba_dbf_lock, flags);
+ }
+--- a/drivers/s390/scsi/zfcp_dbf.h     2009-07-01 17:57:03.000000000 +0200
++++ b/drivers/s390/scsi/zfcp_dbf.h     2009-07-01 17:57:41.000000000 +0200
+@@ -239,6 +239,59 @@ struct zfcp_dbf {
+ };
+ static inline
++void zfcp_hba_dbf_event_fsf_resp(const char *tag2, int level,
++                               struct zfcp_fsf_req *req, struct zfcp_dbf *dbf)
++{
++      if (level <= dbf->hba_dbf->level)
++              _zfcp_hba_dbf_event_fsf_response(tag2, level, req, dbf);
++}
++
++/**
++ * zfcp_hba_dbf_event_fsf_response - trace event for request completion
++ * @fsf_req: request that has been completed
++ */
++static inline void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *req)
++{
++      struct zfcp_dbf *dbf = req->adapter->dbf;
++      struct fsf_qtcb *qtcb = req->qtcb;
++
++      if ((qtcb->prefix.prot_status != FSF_PROT_GOOD) &&
++          (qtcb->prefix.prot_status != FSF_PROT_FSF_STATUS_PRESENTED)) {
++              zfcp_hba_dbf_event_fsf_resp("perr", 1, req, dbf);
++
++      } else if (qtcb->header.fsf_status != FSF_GOOD) {
++              zfcp_hba_dbf_event_fsf_resp("ferr", 1, req, dbf);
++
++      } else if ((req->fsf_command == FSF_QTCB_OPEN_PORT_WITH_DID) ||
++                 (req->fsf_command == FSF_QTCB_OPEN_LUN)) {
++              zfcp_hba_dbf_event_fsf_resp("open", 4, req, dbf);
++
++      } else if (qtcb->header.log_length) {
++              zfcp_hba_dbf_event_fsf_resp("qtcb", 5, req, dbf);
++
++      } else {
++              zfcp_hba_dbf_event_fsf_resp("norm", 6, req, dbf);
++      }
++ }
++
++/**
++ * zfcp_hba_dbf_event_fsf_unsol - trace event for an unsolicited status buffer
++ * @tag: tag indicating which kind of unsolicited status has been received
++ * @adapter: adapter that has issued the unsolicited status buffer
++ * @status_buffer: buffer containing payload of unsolicited status
++ */
++static inline
++void zfcp_hba_dbf_event_fsf_unsol(const char *tag, struct zfcp_adapter *adapter,
++                                struct fsf_status_read_buffer *buf)
++{
++      struct zfcp_dbf *dbf = adapter->dbf;
++      int level = 2;
++
++      if (level <= dbf->hba_dbf->level)
++              _zfcp_hba_dbf_event_fsf_unsol(tag, level, adapter, buf);
++}
++
++static inline
+ void zfcp_scsi_dbf_event(const char *tag, const char *tag2, int level,
+                        struct zfcp_adapter *adapter, struct scsi_cmnd *scmd,
+                        struct zfcp_fsf_req *req, unsigned long old_id)
+--- a/drivers/s390/scsi/zfcp_ext.h     2009-07-01 17:57:03.000000000 +0200
++++ b/drivers/s390/scsi/zfcp_ext.h     2009-07-01 17:58:28.000000000 +0200
+@@ -44,9 +44,12 @@ extern void zfcp_rec_dbf_event_trigger(u
+                                      struct zfcp_adapter *,
+                                      struct zfcp_port *, struct zfcp_unit *);
+ extern void zfcp_rec_dbf_event_action(u8, struct zfcp_erp_action *);
+-extern void zfcp_hba_dbf_event_fsf_response(struct zfcp_fsf_req *);
+-extern void zfcp_hba_dbf_event_fsf_unsol(const char *, struct zfcp_adapter *,
+-                                       struct fsf_status_read_buffer *);
++extern void _zfcp_hba_dbf_event_fsf_response(const char *, int level,
++                                           struct zfcp_fsf_req *,
++                                           struct zfcp_dbf *dbf);
++extern void _zfcp_hba_dbf_event_fsf_unsol(const char *, int level,
++                                        struct zfcp_adapter *,
++                                        struct fsf_status_read_buffer *);
+ extern void zfcp_hba_dbf_event_qdio(struct zfcp_adapter *, unsigned int, int,
+                                   int);
+ extern void zfcp_hba_dbf_event_berr(struct zfcp_adapter *,
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-18-01-cio-retries.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-18-01-cio-retries.patch
new file mode 100644 (file)
index 0000000..6777b3a
--- /dev/null
@@ -0,0 +1,149 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: cio: number of internal I/O retries
+References: bnc#533267,LTC#55492
+
+Symptom:     A device is untruly considered nonfunctional.
+Problem:     If a device has n paths and the device is not path-
+             grouped and an internal I/O command fails, then the
+             control unit presents the error sense n times on each
+             different path. cio does only 5 retries, i.e. devices
+             with 5 or more paths run out of retries before their
+             functional status can actually be determined.      
+Solution:    Increase the number of retries to 10.
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+Index: linux-sles11/drivers/s390/cio/device_id.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/device_id.c     2009-08-17 14:49:43.000000000 +0200
++++ linux-sles11/drivers/s390/cio/device_id.c  2009-08-17 14:52:00.000000000 +0200
+@@ -164,7 +164,7 @@
+                               return ret;
+               }
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+       }
+       return ret;
+ }
+@@ -176,7 +176,7 @@
+       memset (&cdev->private->senseid, 0, sizeof (struct senseid));
+       cdev->private->imask = 0x80;
+-      cdev->private->iretry = 5;
++      cdev->private->iretry = 10;
+       ret = __ccw_device_sense_id_start(cdev);
+       if (ret && ret != -EBUSY)
+               ccw_device_sense_id_done(cdev, ret);
+@@ -299,7 +299,7 @@
+       case -EACCES:           /* channel is not operational. */
+               sch->lpm &= ~cdev->private->imask;
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               /* fall through. */
+       case -EAGAIN:           /* try again. */
+               ret = __ccw_device_sense_id_start(cdev);
+Index: linux-sles11/drivers/s390/cio/device_pgid.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/device_pgid.c   2009-08-17 14:49:43.000000000 +0200
++++ linux-sles11/drivers/s390/cio/device_pgid.c        2009-08-17 14:52:00.000000000 +0200
+@@ -88,7 +88,7 @@
+               }
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               i++;
+       }
+@@ -105,7 +105,7 @@
+       cdev->private->state = DEV_STATE_SENSE_PGID;
+       cdev->private->imask = 0x80;
+-      cdev->private->iretry = 5;
++      cdev->private->iretry = 10;
+       memset (&cdev->private->pgid, 0, sizeof (cdev->private->pgid));
+       ret = __ccw_device_sense_pgid_start(cdev);
+       if (ret && ret != -EBUSY)
+@@ -215,7 +215,7 @@
+               /* Fall through. */
+       case 0:                 /* Sense Path Group ID successful. */
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               /* Fall through. */
+       case -EAGAIN:           /* Try again. */
+               ret = __ccw_device_sense_pgid_start(cdev);
+@@ -404,7 +404,7 @@
+       sch = to_subchannel(cdev->dev.parent);
+       /* Repeat for all paths. */
+       for (; cdev->private->imask; cdev->private->imask >>= 1,
+-                                   cdev->private->iretry = 5) {
++                                   cdev->private->iretry = 10) {
+               if ((cdev->private->imask & sch->schib.pmcw.pam) == 0)
+                       /* Path not available, try next. */
+                       continue;
+@@ -460,7 +460,7 @@
+               sch->vpm |= sch->opm & cdev->private->imask;
+               /* Go on with next path. */
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               __ccw_device_verify_start(cdev);
+               break;
+       case -EOPNOTSUPP:
+@@ -475,7 +475,7 @@
+               /* Retry */
+               sch->vpm = 0;
+               cdev->private->imask = 0x80;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               /* fall through. */
+       case -EAGAIN:           /* Try again. */
+               __ccw_device_verify_start(cdev);
+@@ -485,7 +485,7 @@
+               break;
+       case -EACCES:           /* channel is not operational. */
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               __ccw_device_verify_start(cdev);
+               break;
+       }
+@@ -498,7 +498,7 @@
+       cdev->private->flags.pgid_single = 0;
+       cdev->private->imask = 0x80;
+-      cdev->private->iretry = 5;
++      cdev->private->iretry = 10;
+       /* Start with empty vpm. */
+       sch->vpm = 0;
+@@ -526,7 +526,7 @@
+                       if (ret == 0)
+                               return;
+               }
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               cdev->private->imask >>= 1;
+       }
+       ccw_device_disband_done(cdev, (sch->lpm != 0) ? 0 : -ENODEV);
+@@ -575,7 +575,7 @@
+               break;
+       case -EACCES:           /* channel is not operational. */
+               cdev->private->imask >>= 1;
+-              cdev->private->iretry = 5;
++              cdev->private->iretry = 10;
+               __ccw_device_disband_start(cdev);
+               break;
+       }
+@@ -588,7 +588,7 @@
+       ccw_device_set_timeout(cdev, 60*HZ);
+       cdev->private->flags.pgid_single = 0;
+-      cdev->private->iretry = 5;
++      cdev->private->iretry = 10;
+       cdev->private->imask = 0x80;
+       __ccw_device_disband_start(cdev);
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-18-02-cio-race.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-18-02-cio-race.patch
new file mode 100644 (file)
index 0000000..34de3af
--- /dev/null
@@ -0,0 +1,153 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: cio: failing set online/offline processing
+References: bnc#533267,LTC#55510
+
+Symptom:     A set online or set offline fails for a DASD device.
+             Afterwards this device can neither be set online nor offline.
+Problem:     When unit checks trigger sensing the device state is set to W4SENSE
+             until sense completion; then the device state is set back to
+             ONLINE. If a unit check occurs while set online or set offline
+             requests are processed then it might happen that the device's
+             temporary W4SENSE state causes these functions to terminate,
+             leaving the device in an inconsistent state when the state is set
+             back to ONLINE later on so that the device cannot be set online or
+             offline any longer.
+Solution:    Process set online/offline and related rollback or error routines
+             only if the device is in a final or DISCONNECTED state.
+
+Acked-by: John Jolly <jjolly@suse.de>
+
+Index: linux-sles11/drivers/s390/cio/device.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/device.c        2009-08-18 13:31:25.000000000 +0200
++++ linux-sles11/drivers/s390/cio/device.c     2009-08-18 13:36:48.000000000 +0200
+@@ -381,26 +381,30 @@
+       }
+       cdev->online = 0;
+       spin_lock_irq(cdev->ccwlock);
+-      ret = ccw_device_offline(cdev);
+-      if (ret == -ENODEV) {
+-              if (cdev->private->state != DEV_STATE_NOT_OPER) {
+-                      cdev->private->state = DEV_STATE_OFFLINE;
+-                      dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
+-              }
++      /* Wait until a final state or DISCONNECTED is reached */
++      while (!dev_fsm_final_state(cdev) &&
++             cdev->private->state != DEV_STATE_DISCONNECTED) {
+               spin_unlock_irq(cdev->ccwlock);
+-              return ret;
++              wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
++                         cdev->private->state == DEV_STATE_DISCONNECTED));
++              spin_lock_irq(cdev->ccwlock);
+       }
++      ret = ccw_device_offline(cdev);
++      if (ret)
++              goto error;
+       spin_unlock_irq(cdev->ccwlock);
+-      if (ret == 0)
+-              wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
+-      else {
+-              CIO_MSG_EVENT(0, "ccw_device_offline returned %d, "
+-                            "device 0.%x.%04x\n",
+-                            ret, cdev->private->dev_id.ssid,
+-                            cdev->private->dev_id.devno);
+-              cdev->online = 1;
+-      }
+-      return ret;
++      wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
++                 cdev->private->state == DEV_STATE_DISCONNECTED));
++      return 0;
++
++error:
++      CIO_MSG_EVENT(0, "ccw_device_offline returned %d, device 0.%x.%04x\n",
++                    ret, cdev->private->dev_id.ssid,
++                    cdev->private->dev_id.devno);
++      cdev->private->state = DEV_STATE_OFFLINE;
++      dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
++      spin_unlock_irq(cdev->ccwlock);
++      return -ENODEV;
+ }
+ /**
+@@ -418,6 +422,7 @@
+ int ccw_device_set_online(struct ccw_device *cdev)
+ {
+       int ret;
++      int ret2;
+       if (!cdev)
+               return -ENODEV;
+@@ -436,23 +441,47 @@
+                             cdev->private->dev_id.devno);
+               return ret;
+       }
+-      if (cdev->private->state != DEV_STATE_ONLINE)
++      spin_lock_irq(cdev->ccwlock);
++      /* Check if online processing was successful */
++      if ((cdev->private->state != DEV_STATE_ONLINE) &&
++          (cdev->private->state != DEV_STATE_W4SENSE)) {
++              spin_unlock_irq(cdev->ccwlock);
+               return -ENODEV;
+-      if (!cdev->drv->set_online || cdev->drv->set_online(cdev) == 0) {
+-              cdev->online = 1;
+-              return 0;
+       }
++      spin_unlock_irq(cdev->ccwlock);
++      if (cdev->drv->set_online)
++              ret = cdev->drv->set_online(cdev);
++      if (ret)
++              goto rollback;
++      cdev->online = 1;
++      return 0;
++
++rollback:
+       spin_lock_irq(cdev->ccwlock);
+-      ret = ccw_device_offline(cdev);
++      /* Wait until a final state or DISCONNECTED is reached */
++      while (!dev_fsm_final_state(cdev) &&
++             cdev->private->state != DEV_STATE_DISCONNECTED) {
++              spin_unlock_irq(cdev->ccwlock);
++              wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
++                         cdev->private->state == DEV_STATE_DISCONNECTED));
++              spin_lock_irq(cdev->ccwlock);
++      }
++      ret2 = ccw_device_offline(cdev);
++      if (ret2)
++              goto error;
+       spin_unlock_irq(cdev->ccwlock);
+-      if (ret == 0)
+-              wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev));
+-      else
+-              CIO_MSG_EVENT(0, "ccw_device_offline returned %d, "
+-                            "device 0.%x.%04x\n",
+-                            ret, cdev->private->dev_id.ssid,
+-                            cdev->private->dev_id.devno);
+-      return (ret == 0) ? -ENODEV : ret;
++      wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) ||
++                 cdev->private->state == DEV_STATE_DISCONNECTED));
++      return ret;
++
++error:
++      CIO_MSG_EVENT(0, "rollback ccw_device_offline returned %d, "
++                    "device 0.%x.%04x\n",
++                    ret2, cdev->private->dev_id.ssid,
++                    cdev->private->dev_id.devno);
++      cdev->private->state = DEV_STATE_OFFLINE;
++      spin_unlock_irq(cdev->ccwlock);
++      return ret;
+ }
+ static void online_store_handle_offline(struct ccw_device *cdev)
+Index: linux-sles11/drivers/s390/cio/device_fsm.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/cio/device_fsm.c    2009-08-18 13:31:26.000000000 +0200
++++ linux-sles11/drivers/s390/cio/device_fsm.c 2009-08-18 13:32:47.000000000 +0200
+@@ -903,6 +903,8 @@
+       }
+ call_handler:
+       cdev->private->state = DEV_STATE_ONLINE;
++      /* In case sensing interfered with setting the device online */
++      wake_up(&cdev->private->wait_q);
+       /* Call the handler. */
+       if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify)
+               /* Start delayed path verification. */
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-18-03-iucv-query-maxconn.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-18-03-iucv-query-maxconn.patch
new file mode 100644 (file)
index 0000000..0175191
--- /dev/null
@@ -0,0 +1,27 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: iucv: use correct output register in iucv_query_maxconn()
+References: bnc#533267,LTC#56116
+
+Symptom:     The system log contains kernel messages reporting that the
+             iucv "pathid" is greater than "max_connections".
+Problem:     When querying the maximum number of iucv connections, the
+             wrong output register is used.
+Solution:    Use the correct output register when querying the maximum
+            number of IUCV connections.
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+ net/iucv/iucv.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/iucv/iucv.c
++++ b/net/iucv/iucv.c
+@@ -334,7 +334,7 @@ static int iucv_query_maxconn(void)
+               "       srl     %0,28\n"
+               : "=d" (ccode), "+d" (reg0), "+d" (reg1) : : "cc");
+       if (ccode == 0)
+-              iucv_max_pathid = reg0;
++              iucv_max_pathid = reg1;
+       kfree(param);
+       return ccode ? -EPERM : 0;
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.arch/s390-dasd-eckd_write_r0.patch b/src/patches/suse-2.6.27.39/patches.arch/s390-dasd-eckd_write_r0.patch
new file mode 100644 (file)
index 0000000..6ff4804
--- /dev/null
@@ -0,0 +1,110 @@
+From: Gerald Schaefer <geraldsc@de.ibm.com>
+Subject: dasd_eckd: Write format record 0 is now  allowed    
+References: bnc#477816,LTC#52004
+
+Description: Permission is now granted to storage subsystem to format write
+              record 0 with:
+              * an ID = CCHHR, where CC = physical cylinder number,
+                HH = physical head number, and R = 0
+              * a key length of zero
+              * a data length of eight
+              * a data field containing all zeros
+
+Acked-by: John Jolly <jjolly@suse.de>
+---
+ drivers/s390/block/dasd_eckd.c |   28 +++++++++++++++++++++-------
+ 1 file changed, 21 insertions(+), 7 deletions(-)
+
+Index: linux-sles11/drivers/s390/block/dasd_eckd.c
+===================================================================
+--- linux-sles11.orig/drivers/s390/block/dasd_eckd.c
++++ linux-sles11/drivers/s390/block/dasd_eckd.c
+@@ -1265,6 +1265,8 @@ dasd_eckd_format_device(struct dasd_devi
+       int rpt, cyl, head;
+       int cplength, datasize;
+       int i;
++      int intensity = 0;
++      int r0_perm;
+       private = (struct dasd_eckd_private *) device->private;
+       rpt = recs_per_track(&private->rdc_data, 0, fdata->blksize);
+@@ -1296,9 +1298,18 @@ dasd_eckd_format_device(struct dasd_devi
+        *   Bit 1: write home address, currently not supported
+        *   Bit 2: invalidate tracks
+        *   Bit 3: use OS/390 compatible disk layout (cdl)
++       *   Bit 4: do not allow storage subsystem to modify record zero
+        * Only some bit combinations do make sense.
+        */
+-      switch (fdata->intensity) {
++      if (fdata->intensity & 0x10) {
++              r0_perm = 0;
++              intensity = fdata->intensity & ~0x10;
++      } else {
++              r0_perm = 1;
++              intensity = fdata->intensity;
++      }
++
++      switch (intensity) {
+       case 0x00:      /* Normal format */
+       case 0x08:      /* Normal format, use cdl. */
+               cplength = 2 + rpt;
+@@ -1323,7 +1334,7 @@ dasd_eckd_format_device(struct dasd_devi
+               break;
+       default:
+               DEV_MESSAGE(KERN_WARNING, device, "Invalid flags 0x%x.",
+-                          fdata->intensity);
++                          intensity);
+               return ERR_PTR(-EINVAL);
+       }
+       /* Allocate the format ccw request. */
+@@ -1335,11 +1346,14 @@ dasd_eckd_format_device(struct dasd_devi
+       data = fcp->data;
+       ccw = fcp->cpaddr;
+-      switch (fdata->intensity & ~0x08) {
++      switch (intensity & ~0x08) {
+       case 0x00: /* Normal format. */
+               define_extent(ccw++, (struct DE_eckd_data *) data,
+                             fdata->start_unit, fdata->start_unit,
+                             DASD_ECKD_CCW_WRITE_CKD, device);
++              /* grant subsystem permission to format R0 */
++              if (r0_perm)
++                      ((struct DE_eckd_data *)data)->ga_extended |= 0x04;
+               data += sizeof(struct DE_eckd_data);
+               ccw[-1].flags |= CCW_FLAG_CC;
+               locate_record(ccw++, (struct LO_eckd_data *) data,
+@@ -1373,7 +1387,7 @@ dasd_eckd_format_device(struct dasd_devi
+               data += sizeof(struct LO_eckd_data);
+               break;
+       }
+-      if (fdata->intensity & 0x01) {  /* write record zero */
++      if (intensity & 0x01) { /* write record zero */
+               ect = (struct eckd_count *) data;
+               data += sizeof(struct eckd_count);
+               ect->cyl = cyl;
+@@ -1388,7 +1402,7 @@ dasd_eckd_format_device(struct dasd_devi
+               ccw->cda = (__u32)(addr_t) ect;
+               ccw++;
+       }
+-      if ((fdata->intensity & ~0x08) & 0x04) {        /* erase track */
++      if ((intensity & ~0x08) & 0x04) {       /* erase track */
+               ect = (struct eckd_count *) data;
+               data += sizeof(struct eckd_count);
+               ect->cyl = cyl;
+@@ -1411,14 +1425,14 @@ dasd_eckd_format_device(struct dasd_devi
+                       ect->kl = 0;
+                       ect->dl = fdata->blksize;
+                       /* Check for special tracks 0-1 when formatting CDL */
+-                      if ((fdata->intensity & 0x08) &&
++                      if ((intensity & 0x08) &&
+                           fdata->start_unit == 0) {
+                               if (i < 3) {
+                                       ect->kl = 4;
+                                       ect->dl = sizes_trk0[i] - 4;
+                               }
+                       }
+-                      if ((fdata->intensity & 0x08) &&
++                      if ((intensity & 0x08) &&
+                           fdata->start_unit == 1) {
+                               ect->kl = 44;
+                               ect->dl = LABEL_SIZE - 44;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_04_of_41_aaa9d1dd63bf89b62f4ea9f46de376ab1a3fbc6c
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_04_of_41_aaa9d1dd63bf89b62f4ea9f46de376ab1a3fbc6c
index 937a847988cd5dc51e3dc348d2f3092ba5a6bbaf..378c2830d2596782b5ff77eef8dc5eaf6f622b67 100644 (file)
@@ -125,7 +125,7 @@ Index: linux-2.6.26/drivers/pci/dmar.c
 +#ifdef CONFIG_DMAR
 +      if (list_empty(&dmar_rmrr_units)) {
                printk(KERN_INFO PREFIX "No RMRR found\n");
-+              return -ENODEV;
++              return -ENODEV;
 +      }
 +#endif
  
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_10_of_41_b6fcb33ad6c05f152a672f7c96c1fab006527b80
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_10_of_41_b6fcb33ad6c05f152a672f7c96c1fab006527b80
index da33355587e0a07c56ed37a3bd889401af7a02dc..caaa259ae544da26e01d9f1c0e17278d05338851 100644 (file)
@@ -323,7 +323,7 @@ Index: linux-2.6.26/include/linux/dmar.h
 +extern int modify_irte(int irq, struct irte *irte_modified);
 +extern int alloc_irte(struct intel_iommu *iommu, int irq, u16 count);
 +extern int set_irte_irq(int irq, struct intel_iommu *iommu, u16 index,
-+                      u16 sub_handle);
++                      u16 sub_handle);
 +extern int map_irq_to_irte_handle(int irq, u16 *sub_handle);
 +extern int clear_irte_irq(int irq, struct intel_iommu *iommu, u16 index);
 +extern int flush_irte(int irq);
similarity index 73%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_14_of_41_0c81c746f9bdbfaafe64322d540c8b7b59c27314
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_14_of_41_0c81c746f9bdbfaafe64322d540c8b7b59c27314
index 348ebc9dc40d99c4b341a1d395ce942e75df3a69..c01036f2a0435b5b7f92a47e946b82daf4cead0b 100644 (file)
@@ -28,11 +28,9 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  include/asm-x86/smp.h                       |    4 +---
  8 files changed, 36 insertions(+), 17 deletions(-)
 
-Index: linux-2.6.26/arch/x86/kernel/apic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/apic_64.c
-+++ linux-2.6.26/arch/x86/kernel/apic_64.c
-@@ -1095,6 +1095,11 @@ void __cpuinit generic_processor_info(in
+--- a/arch/x86/kernel/apic_64.c
++++ b/arch/x86/kernel/apic_64.c
+@@ -1122,6 +1122,11 @@ void __cpuinit generic_processor_info(in
        cpu_set(cpu, cpu_present_map);
  }
  
@@ -44,10 +42,8 @@ Index: linux-2.6.26/arch/x86/kernel/apic_64.c
  /*
   * Power management
   */
-Index: linux-2.6.26/arch/x86/kernel/genapic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genapic_64.c
-+++ linux-2.6.26/arch/x86/kernel/genapic_64.c
+--- a/arch/x86/kernel/genapic_64.c
++++ b/arch/x86/kernel/genapic_64.c
 @@ -79,17 +79,6 @@ int __init acpi_madt_oem_check(char *oem
        return 0;
  }
@@ -66,10 +62,8 @@ Index: linux-2.6.26/arch/x86/kernel/genapic_64.c
  enum uv_system_type get_uv_system_type(void)
  {
        return uv_system_type;
-Index: linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genapic_flat_64.c
-+++ linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
+--- a/arch/x86/kernel/genapic_flat_64.c
++++ b/arch/x86/kernel/genapic_flat_64.c
 @@ -15,9 +15,11 @@
  #include <linux/kernel.h>
  #include <linux/ctype.h>
@@ -115,10 +109,8 @@ Index: linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
        .phys_pkg_id = phys_pkg_id,
 +      .read_apic_id = read_xapic_id,
  };
-Index: linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genx2apic_uv_x.c
-+++ linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
+--- a/arch/x86/kernel/genx2apic_uv_x.c
++++ b/arch/x86/kernel/genx2apic_uv_x.c
 @@ -18,6 +18,7 @@
  #include <linux/sched.h>
  #include <linux/bootmem.h>
@@ -156,10 +148,8 @@ Index: linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
  };
  
  static __cpuinit void set_x2apic_extra_bits(int pnode)
-Index: linux-2.6.26/include/asm-x86/genapic_64.h
-===================================================================
---- linux-2.6.26.orig/include/asm-x86/genapic_64.h
-+++ linux-2.6.26/include/asm-x86/genapic_64.h
+--- a/include/asm-x86/genapic_64.h
++++ b/include/asm-x86/genapic_64.h
 @@ -27,6 +27,7 @@ struct genapic {
        /* */
        unsigned int (*cpu_mask_to_apicid)(cpumask_t cpumask);
@@ -168,10 +158,8 @@ Index: linux-2.6.26/include/asm-x86/genapic_64.h
  };
  
  extern struct genapic *genapic;
-Index: linux-2.6.26/include/asm-x86/mach-default/mach_apic.h
-===================================================================
---- linux-2.6.26.orig/include/asm-x86/mach-default/mach_apic.h
-+++ linux-2.6.26/include/asm-x86/mach-default/mach_apic.h
+--- a/include/asm-x86/mach-default/mach_apic.h
++++ b/include/asm-x86/mach-default/mach_apic.h
 @@ -30,6 +30,7 @@ static inline cpumask_t target_cpus(void
  #define cpu_mask_to_apicid (genapic->cpu_mask_to_apicid)
  #define phys_pkg_id   (genapic->phys_pkg_id)
@@ -180,10 +168,8 @@ Index: linux-2.6.26/include/asm-x86/mach-default/mach_apic.h
  extern void setup_apic_routing(void);
  #else
  #define INT_DELIVERY_MODE dest_LowestPrio
-Index: linux-2.6.26/include/asm-x86/mach-default/mach_apicdef.h
-===================================================================
---- linux-2.6.26.orig/include/asm-x86/mach-default/mach_apicdef.h
-+++ linux-2.6.26/include/asm-x86/mach-default/mach_apicdef.h
+--- a/include/asm-x86/mach-default/mach_apicdef.h
++++ b/include/asm-x86/mach-default/mach_apicdef.h
 @@ -5,8 +5,9 @@
  
  #ifdef CONFIG_X86_64
@@ -195,10 +181,8 @@ Index: linux-2.6.26/include/asm-x86/mach-default/mach_apicdef.h
  #else
  #define               APIC_ID_MASK            (0xF<<24)
  static inline unsigned get_apic_id(unsigned long x) 
-Index: linux-2.6.26/include/asm-x86/smp.h
-===================================================================
---- linux-2.6.26.orig/include/asm-x86/smp.h
-+++ linux-2.6.26/include/asm-x86/smp.h
+--- a/include/asm-x86/smp.h
++++ b/include/asm-x86/smp.h
 @@ -176,12 +176,10 @@ static inline unsigned int read_apic_id(
  {
        return *(u32 *)(APIC_BASE + APIC_ID);
similarity index 89%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_15_of_41_2d7a66d02e11af9ab8e16c76d22767e622b4e3d7
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_15_of_41_2d7a66d02e11af9ab8e16c76d22767e622b4e3d7
index 4b1144bafbfc8b917bf6d8d43606f4ed087f0620..8a1908d1df84e3906c3e2f1435609a4dfc5e1e90 100644 (file)
@@ -50,11 +50,9 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  arch/x86/kernel/apic_64.c |    6 +++---
  1 file changed, 3 insertions(+), 3 deletions(-)
 
-Index: linux-2.6.26/arch/x86/kernel/apic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/apic_64.c
-+++ linux-2.6.26/arch/x86/kernel/apic_64.c
-@@ -629,10 +629,10 @@ int __init verify_local_APIC(void)
+--- a/arch/x86/kernel/apic_64.c
++++ b/arch/x86/kernel/apic_64.c
+@@ -656,10 +656,10 @@ int __init verify_local_APIC(void)
        /*
         * The ID register is read/write in a real APIC.
         */
@@ -67,7 +65,7 @@ Index: linux-2.6.26/arch/x86/kernel/apic_64.c
        apic_printk(APIC_DEBUG, "Getting ID: %x\n", reg1);
        apic_write(APIC_ID, reg0);
        if (reg1 != (reg0 ^ APIC_ID_MASK))
-@@ -1136,7 +1136,7 @@ static int lapic_suspend(struct sys_devi
+@@ -1163,7 +1163,7 @@ static int lapic_suspend(struct sys_devi
  
        maxlvt = lapic_get_maxlvt();
  
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_16_of_41_1b374e4d6f8b3eb2fcd034fcc24ea8ba1dfde7aa
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_16_of_41_1b374e4d6f8b3eb2fcd034fcc24ea8ba1dfde7aa
index 68c169d642a1847a32f36d2edb6b2535df0355be..a1e383ed4b2c1da46f212201e70d3a5229b177cf 100644 (file)
@@ -196,9 +196,9 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
 -       */
 -      apic_write(APIC_ICR2, SET_APIC_DEST_FIELD(phys_apicid));
 -
-+      /*
-+       * Turn INIT on target chip
-+       */
++      /*
++       * Turn INIT on target chip
++       */
        /*
         * Send IPI
         */
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_23_of_41_89027d35aa5b8f45ce0f7fa0911db85b46563da0
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_23_of_41_89027d35aa5b8f45ce0f7fa0911db85b46563da0
index 7658213baaa16167ef64a94d92fc827e34b81930..d26498ef1b14a679db7ffba6d7a39f8d666c419a 100644 (file)
@@ -330,7 +330,7 @@ Index: linux-2.6.26/arch/x86/kernel/io_apic_64.c
 +
 +      if (io_apic_level_ack_pending(irq)) {
 +              /*
-+               * Interrupt in progress. Migrating irq now will change the
++               * Interrupt in progress. Migrating irq now will change the
 +               * vector information in the IO-APIC RTE and that will confuse
 +               * the EOI broadcast performed by cpu.
 +               * So, delay the irq migration to the next instance.
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_25_1_of_41_4c9961d56ec20c27ec5d02e49fd7427748312741
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_25_1_of_41_4c9961d56ec20c27ec5d02e49fd7427748312741
index bc6826cce40317cadaabc1a2b2be4f60e2344a1f..deda9f62e1e79aae261adfb4bd9d59427cf9ba83 100644 (file)
@@ -62,7 +62,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  
 --- a/arch/x86/kernel/apic_64.c
 +++ b/arch/x86/kernel/apic_64.c
-@@ -1062,7 +1062,7 @@ void __init early_init_lapic_mapping(voi
+@@ -1089,7 +1089,7 @@ void __init early_init_lapic_mapping(voi
         * Fetch the APIC ID of the BSP in case we have a
         * default configuration (or the MP table is broken).
         */
@@ -71,7 +71,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  }
  
  /**
-@@ -1071,7 +1071,7 @@ void __init early_init_lapic_mapping(voi
+@@ -1098,7 +1098,7 @@ void __init early_init_lapic_mapping(voi
  void __init init_apic_mappings(void)
  {
        if (x2apic) {
@@ -80,7 +80,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
                return;
        }
  
-@@ -1094,7 +1094,7 @@ void __init init_apic_mappings(void)
+@@ -1121,7 +1121,7 @@ void __init init_apic_mappings(void)
         * Fetch the APIC ID of the BSP in case we have a
         * default configuration (or the MP table is broken).
         */
@@ -164,6 +164,17 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
                /* Or can we switch back to PIC here? */
        }
        preempt_enable();
+--- a/include/asm-x86/mach-default/mach_apic.h
++++ b/include/asm-x86/mach-default/mach_apic.h
+@@ -56,7 +56,7 @@ static inline void init_apic_ldr(void)
+ static inline int apic_id_registered(void)
+ {
+-      return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
++      return physid_isset(read_apic_id(), phys_cpu_present_map);
+ }
+ static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
 --- a/include/asm-x86/mach-default/mach_apicdef.h
 +++ b/include/asm-x86/mach-default/mach_apicdef.h
 @@ -5,9 +5,8 @@
@@ -177,17 +188,6 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  #else
  #define               APIC_ID_MASK            (0xF<<24)
  static inline unsigned get_apic_id(unsigned long x) 
---- a/include/asm-x86/mach-default/mach_apic.h
-+++ b/include/asm-x86/mach-default/mach_apic.h
-@@ -56,7 +56,7 @@ static inline void init_apic_ldr(void)
- static inline int apic_id_registered(void)
- {
--      return physid_isset(GET_APIC_ID(read_apic_id()), phys_cpu_present_map);
-+      return physid_isset(read_apic_id(), phys_cpu_present_map);
- }
- static inline unsigned int cpu_mask_to_apicid(cpumask_t cpumask)
 --- a/include/asm-x86/mach-es7000/mach_apic.h
 +++ b/include/asm-x86/mach-es7000/mach_apic.h
 @@ -141,7 +141,7 @@ static inline void setup_portio_remap(vo
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_25_of_41_6e1cb38a2aef7680975e71f23de187859ee8b158
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_25_of_41_6e1cb38a2aef7680975e71f23de187859ee8b158
index d3e725fcf6773fab849fc2d795b0781d40d55429..e898d27a01af5986115c41cb83710f6bbe2ed04f 100644 (file)
@@ -38,7 +38,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
 
 --- a/Documentation/kernel-parameters.txt
 +++ b/Documentation/kernel-parameters.txt
-@@ -1428,6 +1428,8 @@ and is between 256 and 4096 characters.
+@@ -1428,6 +1428,8 @@ and is between 256 and 4096 characters. 
  
        nolapic_timer   [X86-32,APIC] Do not use the local APIC timer.
  
@@ -90,7 +90,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  /* Local APIC timer works in C2 */
  int local_apic_timer_c2_ok;
  EXPORT_SYMBOL_GPL(local_apic_timer_c2_ok);
-@@ -898,6 +904,125 @@ void __cpuinit end_local_APIC_setup(void
+@@ -925,6 +931,125 @@ void __cpuinit end_local_APIC_setup(void
        apic_pm_activate();
  }
  
@@ -216,7 +216,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  /*
   * Detect and enable local APICs on non-SMP boards.
   * Original code written by Keir Fraser.
-@@ -945,6 +1070,11 @@ void __init early_init_lapic_mapping(voi
+@@ -972,6 +1097,11 @@ void __init early_init_lapic_mapping(voi
   */
  void __init init_apic_mappings(void)
  {
@@ -228,7 +228,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
        /*
         * If no local APIC can be found then set up a fake all
         * zeroes page to simulate the local APIC and another
-@@ -983,6 +1113,9 @@ int __init APIC_init_uniprocessor(void)
+@@ -1010,6 +1140,9 @@ int __init APIC_init_uniprocessor(void)
                return -1;
        }
  
@@ -238,7 +238,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
        verify_local_APIC();
  
        connect_bsp_APIC();
-@@ -1236,10 +1369,14 @@ static int lapic_resume(struct sys_devic
+@@ -1263,10 +1396,14 @@ static int lapic_resume(struct sys_devic
        maxlvt = lapic_get_maxlvt();
  
        local_irq_save(flags);
@@ -257,7 +257,7 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
        apic_write(APIC_LVTERR, ERROR_APIC_VECTOR | APIC_LVT_MASKED);
        apic_write(APIC_ID, apic_pm_state.apic_id);
        apic_write(APIC_DFR, apic_pm_state.apic_dfr);
-@@ -1379,6 +1516,15 @@ __cpuinit int apic_is_clustered_box(void
+@@ -1406,6 +1543,15 @@ __cpuinit int apic_is_clustered_box(void
        return (clusters > 2);
  }
  
@@ -302,8 +302,8 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  #else
        num_physpages = max_pfn;
  
-+      if (cpu_has_x2apic)
-+              check_x2apic();
++      if (cpu_has_x2apic)
++              check_x2apic();
  
        /* How many end-of-memory variables you have, grandma! */
        /* need this before calling reserve_initrd */
similarity index 81%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_PATCH_42_of_41_77322deb4bc676a5ee645444e7ed1a89f854473d
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_PATCH_42_of_41_77322deb4bc676a5ee645444e7ed1a89f854473d
index 90c408c244404b6c1fcc1412165014c664d6809d..1a525a32e6384a84edb1336d4d78692a4848bc20 100644 (file)
@@ -20,11 +20,9 @@ Signed-off-by: Ingo Molnar <mingo@elte.hu>
  arch/x86/kernel/io_apic_64.c |   19 +++++++++++++++++--
  2 files changed, 27 insertions(+), 5 deletions(-)
 
-Index: linux-2.6.26/arch/x86/kernel/apic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/apic_64.c
-+++ linux-2.6.26/arch/x86/kernel/apic_64.c
-@@ -969,7 +969,12 @@ void enable_IR_x2apic(void)
+--- a/arch/x86/kernel/apic_64.c
++++ b/arch/x86/kernel/apic_64.c
+@@ -996,7 +996,12 @@ void enable_IR_x2apic(void)
  
        local_irq_save(flags);
        mask_8259A();
@@ -38,7 +36,7 @@ Index: linux-2.6.26/arch/x86/kernel/apic_64.c
  
        ret = enable_intr_remapping(1);
  
-@@ -979,14 +984,15 @@ void enable_IR_x2apic(void)
+@@ -1006,14 +1011,15 @@ void enable_IR_x2apic(void)
        }
  
        if (ret)
@@ -56,7 +54,7 @@ Index: linux-2.6.26/arch/x86/kernel/apic_64.c
        if (ret)
                /*
                 * IR enabling failed
-@@ -995,6 +1001,7 @@ end:
+@@ -1022,6 +1028,7 @@ end:
        else
                reinit_intr_remapped_IO_APIC(x2apic_preenabled);
  
@@ -64,10 +62,8 @@ Index: linux-2.6.26/arch/x86/kernel/apic_64.c
        unmask_8259A();
        local_irq_restore(flags);
  
-Index: linux-2.6.26/arch/x86/kernel/io_apic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/io_apic_64.c
-+++ linux-2.6.26/arch/x86/kernel/io_apic_64.c
+--- a/arch/x86/kernel/io_apic_64.c
++++ b/arch/x86/kernel/io_apic_64.c
 @@ -474,7 +474,7 @@ int save_mask_IO_APIC_setup(void)
                        kzalloc(sizeof(struct IO_APIC_route_entry) *
                                nr_ioapic_registers[apic], GFP_KERNEL);
similarity index 65%
rename from src/patches/suse-2.6.27.31/patches.arch/x2APIC_fix_section_mismatch.patch
rename to src/patches/suse-2.6.27.39/patches.arch/x2APIC_fix_section_mismatch.patch
index f3dd5fe351fe77071c3d645ae0ef7fca52cb680f..80415fe682069421e3ec4ea0c416be1afd004f59 100644 (file)
@@ -14,10 +14,19 @@ Signed-off-by: Thomas Renninger <trenn@suse.de>
  arch/x86/kernel/genx2apic_uv_x.c    |    2 +-
  6 files changed, 8 insertions(+), 8 deletions(-)
 
-Index: linux-2.6.26/arch/x86/kernel/genapic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genapic_64.c
-+++ linux-2.6.26/arch/x86/kernel/genapic_64.c
+--- a/arch/x86/kernel/apic_64.c
++++ b/arch/x86/kernel/apic_64.c
+@@ -955,7 +955,7 @@ void enable_x2apic(void)
+       }
+ }
+-void enable_IR_x2apic(void)
++void __init enable_IR_x2apic(void)
+ {
+ #ifdef CONFIG_INTR_REMAP
+       int ret;
+--- a/arch/x86/kernel/genapic_64.c
++++ b/arch/x86/kernel/genapic_64.c
 @@ -30,7 +30,7 @@ extern struct genapic apic_x2apic_cluste
  
  struct genapic __read_mostly *genapic = &apic_flat;
@@ -36,10 +45,8 @@ Index: linux-2.6.26/arch/x86/kernel/genapic_64.c
  {
        int i;
  
-Index: linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genapic_flat_64.c
-+++ linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
+--- a/arch/x86/kernel/genapic_flat_64.c
++++ b/arch/x86/kernel/genapic_flat_64.c
 @@ -25,7 +25,7 @@
  #include <acpi/acpi_bus.h>
  #endif
@@ -58,10 +65,8 @@ Index: linux-2.6.26/arch/x86/kernel/genapic_flat_64.c
  {
  #ifdef CONFIG_ACPI
        /*
-Index: linux-2.6.26/arch/x86/kernel/genx2apic_cluster.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genx2apic_cluster.c
-+++ linux-2.6.26/arch/x86/kernel/genx2apic_cluster.c
+--- a/arch/x86/kernel/genx2apic_cluster.c
++++ b/arch/x86/kernel/genx2apic_cluster.c
 @@ -12,7 +12,7 @@
  
  DEFINE_PER_CPU(u32, x86_cpu_to_logical_apicid);
@@ -71,10 +76,8 @@ Index: linux-2.6.26/arch/x86/kernel/genx2apic_cluster.c
  {
        if (cpu_has_x2apic)
                return 1;
-Index: linux-2.6.26/arch/x86/kernel/genx2apic_phys.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genx2apic_phys.c
-+++ linux-2.6.26/arch/x86/kernel/genx2apic_phys.c
+--- a/arch/x86/kernel/genx2apic_phys.c
++++ b/arch/x86/kernel/genx2apic_phys.c
 @@ -21,7 +21,7 @@ static int set_x2apic_phys_mode(char *ar
  }
  early_param("x2apic_phys", set_x2apic_phys_mode);
@@ -84,10 +87,8 @@ Index: linux-2.6.26/arch/x86/kernel/genx2apic_phys.c
  {
        if (cpu_has_x2apic && x2apic_phys)
                return 1;
-Index: linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/genx2apic_uv_x.c
-+++ linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
+--- a/arch/x86/kernel/genx2apic_uv_x.c
++++ b/arch/x86/kernel/genx2apic_uv_x.c
 @@ -29,7 +29,7 @@
  
  static enum uv_system_type uv_system_type;
@@ -97,16 +98,3 @@ Index: linux-2.6.26/arch/x86/kernel/genx2apic_uv_x.c
  {
        if (!strcmp(oem_id, "SGI")) {
                if (!strcmp(oem_table_id, "UVL"))
-Index: linux-2.6.26/arch/x86/kernel/apic_64.c
-===================================================================
---- linux-2.6.26.orig/arch/x86/kernel/apic_64.c
-+++ linux-2.6.26/arch/x86/kernel/apic_64.c
-@@ -928,7 +928,7 @@ void enable_x2apic(void)
-       }
- }
--void enable_IR_x2apic(void)
-+void __init enable_IR_x2apic(void)
- {
- #ifdef CONFIG_INTR_REMAP
-       int ret;
diff --git a/src/patches/suse-2.6.27.39/patches.arch/x86_cpufreq_intel_blacklist.patch b/src/patches/suse-2.6.27.39/patches.arch/x86_cpufreq_intel_blacklist.patch
new file mode 100644 (file)
index 0000000..8abb236
--- /dev/null
@@ -0,0 +1,56 @@
+From: Prarit Bhargava <prarit@redhat.com>
+Subject: [CPUFREQ] Create a blacklist for processors that should not load the acpi-cpufreq module.
+References: bnc#542505
+Patch-Mainline: yes
+Commit-ID: 1a8e42fa81e62d47cc471f7764f906bb42b27a54
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+Create a blacklist for processors that should not load the acpi-cpufreq module.
+
+The initial entry in the blacklist function is the Intel 0f68 processor.  It's
+specification update mentions errata AL30 which implies that cpufreq should not
+run on this processor.
+
+Signed-off-by: Prarit Bhargava <prarit@redhat.com>
+Signed-off-by: Dave Jones <davej@redhat.com>
+
+diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+index ae9b503..badce50 100644
+--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
++++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+@@ -588,6 +588,21 @@ static const struct dmi_system_id sw_any_bug_dmi_table[] = {
+       },
+       { }
+ };
++
++static int acpi_cpufreq_blacklist(struct cpuinfo_x86 *c)
++{
++      /* http://www.intel.com/Assets/PDF/specupdate/314554.pdf
++       * AL30: A Machine Check Exception (MCE) Occurring during an
++       * Enhanced Intel SpeedStep Technology Ratio Change May Cause
++       * Both Processor Cores to Lock Up when HT is enabled*/
++      if (c->x86_vendor == X86_VENDOR_INTEL) {
++              if ((c->x86 == 15) &&
++                  (c->x86_model == 6) &&
++                  (c->x86_mask == 8) && smt_capable())
++                      return -ENODEV;
++              }
++      return 0;
++}
+ #endif
+ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
+@@ -602,6 +617,12 @@ static int acpi_cpufreq_cpu_init(struct cpufreq_policy *policy)
+       dprintk("acpi_cpufreq_cpu_init\n");
++#ifdef CONFIG_SMP
++      result = acpi_cpufreq_blacklist(c);
++      if (result)
++              return result;
++#endif
++
+       data = kzalloc(sizeof(struct acpi_cpufreq_data), GFP_KERNEL);
+       if (!data)
+               return -ENOMEM;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/aacraid-24701-update b/src/patches/suse-2.6.27.39/patches.drivers/aacraid-24701-update
new file mode 100644 (file)
index 0000000..89d536e
--- /dev/null
@@ -0,0 +1,700 @@
+From: Penchala Narsimha Reddy Chilakala <ServeRAIDDriver@hcl.in>
+Subject: Problems with aacraid
+References: bnc#524242
+
+The attached patch aac24701 was generated for the following issues only:
+
+Issue:1
+--------
+         Behavior of the ternary operation in function aac_send_raw_srb () was
+observed incorrect in 64-bit version. This issue was because of missing
+parenthesis in the condition to check the sg count.
+
+Fix details:
+-------------
+          Fixed by adding parentheses.
+
+Issue:2
+--------
+        Driver IOCTLs is signaled with EINTR while waiting on response from the
+lower layers. Returning “EINTR” will never initiate internal retry. 
+
+Fix details:
+-------------
+        Fixed by replacing “EINTR” with “ERESTARTSYS” for mid-layer retries.
+
+Issue:3
+--------
+       The driver tends to not free the memory (FIB)  when the management
+request exits prematurely. The accumulation of such un-freed memory causes the
+driver to fail to allocate anymore memory (FIB) and hence return 0x70000 value
+to the upper layer, which puts the file system into read only mode.
+
+Fix details:
+-------------
+     The fix makes sure to free the memory(FIB) even if the request exits
+prematurely hence ensuring the driver wouldn’t run out of memory(FIBs)
+
+Issue:4
+--------
+       The driver exhibits performance problems as the execution of
+SYNCHRONIZE CACHE is quite time-consuming.
+
+Fix details:
+-------------
+       The issue is fixed by setting WCE=0 in the INQUIRY data, thus
+causing the SCSI midlayer not to issue any SYNCHRONIZE CACHE commands.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+diff -ru a/drivers/scsi/aacraid/aachba.c b/drivers/scsi/aacraid/aachba.c
+--- a/drivers/scsi/aacraid/aachba.c    2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/aachba.c    2009-09-16 17:41:00.000000000 +0530
+@@ -143,7 +143,7 @@
+  */
+ static int nondasd = -1;
+-static int aac_cache;
++static int aac_cache = 2;     /* WCE=0 to avoid performance problems */
+ static int dacmode = -1;
+ int aac_msi;
+ int aac_commit = -1;
+@@ -157,7 +157,7 @@
+ MODULE_PARM_DESC(cache, "Disable Queue Flush commands:\n"
+       "\tbit 0 - Disable FUA in WRITE SCSI commands\n"
+       "\tbit 1 - Disable SYNCHRONIZE_CACHE SCSI command\n"
+-      "\tbit 2 - Disable only if Battery not protecting Cache");
++      "\tbit 2 - Disable only if Battery is protecting Cache");
+ module_param(dacmode, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(dacmode, "Control whether dma addressing is using 64 bit DAC."
+       " 0=off, 1=on");
+@@ -217,6 +217,14 @@
+ module_param_named(reset_devices, aac_reset_devices, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(reset_devices, "Force an adapter reset at initialization.");
++int aac_wwn = 1;
++module_param_named(wwn, aac_wwn, int, S_IRUGO|S_IWUSR);
++MODULE_PARM_DESC(wwn, "Select a WWN type for the arrays:\n"
++      "\t0 - Disable\n"
++      "\t1 - Array Meta Data Signature (default)\n"
++      "\t2 - Adapter Serial Number");
++
++
+ static inline int aac_valid_context(struct scsi_cmnd *scsicmd,
+               struct fib *fibptr) {
+       struct scsi_device *device;
+@@ -285,7 +293,10 @@
+                       status = -EINVAL;
+               }
+       }
+-      aac_fib_complete(fibptr);
++      /* Do not set XferState to zero unless receives a response from F/W */
++      if (status >= 0)
++              aac_fib_complete(fibptr);
++
+       /* Send a CT_COMMIT_CONFIG to enable discovery of devices */
+       if (status >= 0) {
+               if ((aac_commit == 1) || commit_flag) {
+@@ -302,13 +313,18 @@
+                                   FsaNormal,
+                                   1, 1,
+                                   NULL, NULL);
+-                      aac_fib_complete(fibptr);
++                      /* Do not set XferState to zero unless
++                       * receives a response from F/W */
++                      if (status >= 0)
++                              aac_fib_complete(fibptr);
+               } else if (aac_commit == 0) {
+                       printk(KERN_WARNING
+                         "aac_get_config_status: Foreign device configurations are being ignored\n");
+               }
+       }
+-      aac_fib_free(fibptr);
++      /* FIB should be freed only after getting the response from the F/W */
++      if (status != -ERESTARTSYS)
++              aac_fib_free(fibptr);
+       return status;
+ }
+@@ -347,7 +363,9 @@
+               maximum_num_containers = le32_to_cpu(dresp->ContainerSwitchEntries);
+               aac_fib_complete(fibptr);
+       }
+-      aac_fib_free(fibptr);
++      /* FIB should be freed only after getting the response from the F/W */
++      if (status != -ERESTARTSYS)
++              aac_fib_free(fibptr);
+       if (maximum_num_containers < MAXIMUM_NUM_CONTAINERS)
+               maximum_num_containers = MAXIMUM_NUM_CONTAINERS;
+@@ -1206,9 +1224,8 @@
+ static int aac_scsi_32_64(struct fib * fib, struct scsi_cmnd * cmd)
+ {
+-      if ((sizeof(dma_addr_t) > 4) &&
+-       (num_physpages > (0xFFFFFFFFULL >> PAGE_SHIFT)) &&
+-       (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
++      if ((sizeof(dma_addr_t) > 4) && fib->dev->needs_dac &&
++          (fib->dev->adapter_info.options & AAC_OPT_SGMAP_HOST64))
+               return FAILED;
+       return aac_scsi_32(fib, cmd);
+ }
+@@ -1238,8 +1255,12 @@
+                        NULL);
+       if (rcode < 0) {
+-              aac_fib_complete(fibptr);
+-              aac_fib_free(fibptr);
++              /* FIB should be freed only after
++               * getting the response from the F/W */
++              if (rcode != -ERESTARTSYS) {
++                      aac_fib_complete(fibptr);
++                      aac_fib_free(fibptr);
++              }
+               return rcode;
+       }
+       memcpy(&dev->adapter_info, info, sizeof(*info));
+@@ -1263,6 +1284,12 @@
+               if (rcode >= 0)
+                       memcpy(&dev->supplement_adapter_info, sinfo, sizeof(*sinfo));
++              if (rcode == -ERESTARTSYS) {
++                      fibptr = aac_fib_alloc(dev);
++                      if (!fibptr)
++                              return -ENOMEM;
++              }
++
+       }
+@@ -1371,8 +1398,11 @@
+       if (dev->nondasd_support && !dev->in_reset)
+               printk(KERN_INFO "%s%d: Non-DASD support enabled.\n",dev->name, dev->id);
++      if (dma_get_required_mask(&dev->pdev->dev) > DMA_32BIT_MASK)
++              dev->needs_dac = 1;
+       dev->dac_support = 0;
+-      if( (sizeof(dma_addr_t) > 4) && (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)){
++      if ((sizeof(dma_addr_t) > 4) && dev->needs_dac &&
++          (dev->adapter_info.options & AAC_OPT_SGMAP_HOST64)) {
+               if (!dev->in_reset)
+                       printk(KERN_INFO "%s%d: 64bit support enabled.\n",
+                               dev->name, dev->id);
+@@ -1382,6 +1412,15 @@
+       if(dacmode != -1) {
+               dev->dac_support = (dacmode!=0);
+       }
++
++      /* avoid problems with AAC_QUIRK_SCSI_32 controllers */
++      if (dev->dac_support && (aac_get_driver_ident(dev->cardtype)->quirks
++              & AAC_QUIRK_SCSI_32)) {
++              dev->nondasd_support = 0;
++              dev->jbod = 0;
++              expose_physicals = 0;
++      }
++
+       if(dev->dac_support != 0) {
+               if (!pci_set_dma_mask(dev->pdev, DMA_64BIT_MASK) &&
+                       !pci_set_consistent_dma_mask(dev->pdev, DMA_64BIT_MASK)) {
+@@ -1451,9 +1490,11 @@
+                         (dev->scsi_host_ptr->sg_tablesize * 8) + 112;
+               }
+       }
+-
+-      aac_fib_complete(fibptr);
+-      aac_fib_free(fibptr);
++      /* FIB should be freed only after getting the response from the F/W */
++      if (rcode != -ERESTARTSYS) {
++              aac_fib_complete(fibptr);
++              aac_fib_free(fibptr);
++      }
+       return rcode;
+ }
+@@ -1614,6 +1655,7 @@
+        *      Alocate and initialize a Fib
+        */
+       if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
++              printk(KERN_WARNING "aac_read: fib allocation failed\n");
+               return -1;
+       }
+@@ -1693,9 +1735,14 @@
+        *      Allocate and initialize a Fib then setup a BlockWrite command
+        */
+       if (!(cmd_fibcontext = aac_fib_alloc(dev))) {
+-              scsicmd->result = DID_ERROR << 16;
+-              scsicmd->scsi_done(scsicmd);
+-              return 0;
++              /* FIB temporarily unavailable,not catastrophic failure */
++
++              /* scsicmd->result = DID_ERROR << 16;
++               * scsicmd->scsi_done(scsicmd);
++               * return 0;
++               */
++              printk(KERN_WARNING "aac_write: fib allocation failed\n");
++              return -1;
+       }
+       status = aac_adapter_write(cmd_fibcontext, scsicmd, lba, count, fua);
+@@ -2058,7 +2105,7 @@
+               dprintk((KERN_DEBUG "INQUIRY command, ID: %d.\n", cid));
+               memset(&inq_data, 0, sizeof (struct inquiry_data));
+-              if (scsicmd->cmnd[1] & 0x1) {
++              if ((scsicmd->cmnd[1] & 0x1) && aac_wwn) {
+                       char *arr = (char *)&inq_data;
+                       /* EVPD bit set */
+@@ -2081,7 +2128,12 @@
+                               arr[1] = scsicmd->cmnd[2];
+                               scsi_sg_copy_from_buffer(scsicmd, &inq_data,
+                                                        sizeof(inq_data));
+-                              return aac_get_container_serial(scsicmd);
++                              if (aac_wwn != 2)
++                                      return aac_get_container_serial(
++                                              scsicmd);
++                              /* SLES 10 SP1 special */
++                              scsicmd->result = DID_OK << 16 |
++                                COMMAND_COMPLETE << 8 | SAM_STAT_GOOD;
+                       } else {
+                               /* vpd page not implemented */
+                               scsicmd->result = DID_OK << 16 |
+diff -ru a/drivers/scsi/aacraid/aacraid.h b/drivers/scsi/aacraid/aacraid.h
+--- a/drivers/scsi/aacraid/aacraid.h   2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/aacraid.h   2009-09-16 17:46:20.000000000 +0530
+@@ -12,7 +12,7 @@
+  *----------------------------------------------------------------------------*/
+ #ifndef AAC_DRIVER_BUILD
+-# define AAC_DRIVER_BUILD 2456
++# define AAC_DRIVER_BUILD 24701
+ # define AAC_DRIVER_BRANCH "-ms"
+ #endif
+ #define MAXIMUM_NUM_CONTAINERS        32
+@@ -865,7 +865,11 @@
+       u8      MfgPcbaSerialNo[12];
+       u8      MfgWWNName[8];
+       __le32  SupportedOptions2;
+-      __le32  ReservedGrowth[1];
++      __le32  StructExpansion;
++      /* StructExpansion == 1 */
++      __le32  FeatureBits3;
++      __le32  SupportedPerformanceModes;
++      __le32  ReservedForFutureGrowth[80];
+ };
+ #define AAC_FEATURE_FALCON    cpu_to_le32(0x00000010)
+ #define AAC_FEATURE_JBOD      cpu_to_le32(0x08000000)
+@@ -1020,6 +1024,7 @@
+       u8                      jbod;
+       u8                      cache_protected;
+       u8                      dac_support;
++      u8                      needs_dac;
+       u8                      raid_scsi_mode;
+       u8                      comm_interface;
+ #     define AAC_COMM_PRODUCER 0
+@@ -1031,6 +1036,9 @@
+       u8                      printf_enabled;
+       u8                      in_reset;
+       u8                      msi;
++      int                     management_fib_count;
++      spinlock_t              manage_lock;
++
+ };
+ #define aac_adapter_interrupt(dev) \
+diff -ru a/drivers/scsi/aacraid/commctrl.c b/drivers/scsi/aacraid/commctrl.c
+--- a/drivers/scsi/aacraid/commctrl.c  2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/commctrl.c  2009-09-16 17:41:00.000000000 +0530
+@@ -143,7 +143,7 @@
+               fibptr->hw_fib_pa = hw_fib_pa;
+               fibptr->hw_fib_va = hw_fib;
+       }
+-      if (retval != -EINTR)
++      if (retval != -ERESTARTSYS)
+               aac_fib_free(fibptr);
+       return retval;
+ }
+@@ -312,7 +312,7 @@
+               }
+               if (f.wait) {
+                       if(down_interruptible(&fibctx->wait_sem) < 0) {
+-                              status = -EINTR;
++                              status = -ERESTARTSYS;
+                       } else {
+                               /* Lock again and retry */
+                               spin_lock_irqsave(&dev->fib_lock, flags);
+@@ -583,10 +583,10 @@
+                               u64 addr;
+                               void* p;
+                               if (upsg->sg[i].count >
+-                                  (dev->adapter_info.options &
++                                  ((dev->adapter_info.options &
+                                    AAC_OPT_NEW_COMM) ?
+                                     (dev->scsi_host_ptr->max_sectors << 9) :
+-                                    65536) {
++                                    65536)) {
+                                       rcode = -EINVAL;
+                                       goto cleanup;
+                               }
+@@ -635,10 +635,10 @@
+                               u64 addr;
+                               void* p;
+                               if (usg->sg[i].count >
+-                                  (dev->adapter_info.options &
++                                  ((dev->adapter_info.options &
+                                    AAC_OPT_NEW_COMM) ?
+                                     (dev->scsi_host_ptr->max_sectors << 9) :
+-                                    65536) {
++                                    65536)) {
+                                       rcode = -EINVAL;
+                                       goto cleanup;
+                               }
+@@ -685,10 +685,10 @@
+                               uintptr_t addr;
+                               void* p;
+                               if (usg->sg[i].count >
+-                                  (dev->adapter_info.options &
++                                  ((dev->adapter_info.options &
+                                    AAC_OPT_NEW_COMM) ?
+                                     (dev->scsi_host_ptr->max_sectors << 9) :
+-                                    65536) {
++                                    65536)) {
+                                       rcode = -EINVAL;
+                                       goto cleanup;
+                               }
+@@ -724,10 +724,10 @@
+                               dma_addr_t addr;
+                               void* p;
+                               if (upsg->sg[i].count >
+-                                  (dev->adapter_info.options &
++                                  ((dev->adapter_info.options &
+                                    AAC_OPT_NEW_COMM) ?
+                                     (dev->scsi_host_ptr->max_sectors << 9) :
+-                                    65536) {
++                                    65536)) {
+                                       rcode = -EINVAL;
+                                       goto cleanup;
+                               }
+@@ -762,8 +762,8 @@
+               psg->count = cpu_to_le32(sg_indx+1);
+               status = aac_fib_send(ScsiPortCommand, srbfib, actual_fibsize, FsaNormal, 1, 1, NULL, NULL);
+       }
+-      if (status == -EINTR) {
+-              rcode = -EINTR;
++      if (status == -ERESTARTSYS) {
++              rcode = -ERESTARTSYS;
+               goto cleanup;
+       }
+@@ -800,7 +800,7 @@
+       for(i=0; i <= sg_indx; i++){
+               kfree(sg_list[i]);
+       }
+-      if (rcode != -EINTR) {
++      if (rcode != -ERESTARTSYS) {
+               aac_fib_complete(srbfib);
+               aac_fib_free(srbfib);
+       }
+@@ -832,13 +832,22 @@
+ int aac_do_ioctl(struct aac_dev * dev, int cmd, void __user *arg)
+ {
+       int status;
+-
++      unsigned long mflags;
++      
+       /*
+        *      HBA gets first crack
+        */
++      spin_lock_irqsave(&dev->manage_lock, mflags);
++      if (dev->management_fib_count > AAC_NUM_MGT_FIB) {
++              printk(KERN_INFO "No management Fibs Available:%d\n",
++                                              dev->management_fib_count);
++              spin_unlock_irqrestore(&dev->manage_lock, mflags);
++              return -EBUSY;
++      }
++      spin_unlock_irqrestore(&dev->manage_lock, mflags);
+       status = aac_dev_ioctl(dev, cmd, arg);
+-      if(status != -ENOTTY)
++      if (status != -ENOTTY)
+               return status;
+       switch (cmd) {
+diff -ru a/drivers/scsi/aacraid/comminit.c b/drivers/scsi/aacraid/comminit.c
+--- a/drivers/scsi/aacraid/comminit.c  2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/comminit.c  2009-09-16 17:41:00.000000000 +0530
+@@ -54,6 +54,7 @@
+       const unsigned long printfbufsiz = 256;
+       struct aac_init *init;
+       dma_addr_t phys;
++      unsigned long aac_max_hostphysmempages;
+       size = fibsize + sizeof(struct aac_init) + commsize + commalign + printfbufsiz;
+@@ -90,7 +91,18 @@
+       init->AdapterFibsPhysicalAddress = cpu_to_le32((u32)phys);
+       init->AdapterFibsSize = cpu_to_le32(fibsize);
+       init->AdapterFibAlign = cpu_to_le32(sizeof(struct hw_fib));
+-      init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
++      /*
++       * number of 4k pages of host physical memory. The aacraid fw needs
++       * this number to be less than 4gb worth of pages. New firmware doesn't
++       * have any issues with the mapping system, but older Firmware did, and
++       * had *troubles* dealing with the math overloading past 32 bits, thus
++       * we must limit this field.
++       */
++      aac_max_hostphysmempages = dma_get_required_mask(&dev->pdev->dev) >> 12;
++      if (aac_max_hostphysmempages < AAC_MAX_HOSTPHYSMEMPAGES)
++              init->HostPhysMemPages = cpu_to_le32(aac_max_hostphysmempages);
++      else
++              init->HostPhysMemPages = cpu_to_le32(AAC_MAX_HOSTPHYSMEMPAGES);
+       init->InitFlags = 0;
+       if (dev->comm_interface == AAC_COMM_MESSAGE) {
+@@ -182,7 +194,9 @@
+       if (status >= 0)
+               aac_fib_complete(fibctx);
+-      aac_fib_free(fibctx);
++      /* FIB should be freed only after getting the response from the F/W */
++      if (status != -ERESTARTSYS)
++              aac_fib_free(fibctx);
+       return status;
+ }
+@@ -292,6 +306,8 @@
+       /*
+        *      Check the preferred comm settings, defaults from template.
+        */
++      dev->management_fib_count = 0;
++      spin_lock_init(&dev->manage_lock);
+       dev->max_fib_size = sizeof(struct hw_fib);
+       dev->sg_tablesize = host->sg_tablesize = (dev->max_fib_size
+               - sizeof(struct aac_fibhdr)
+diff -ru a/drivers/scsi/aacraid/commsup.c b/drivers/scsi/aacraid/commsup.c
+--- a/drivers/scsi/aacraid/commsup.c   2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/commsup.c   2009-09-16 17:41:00.000000000 +0530
+@@ -189,7 +189,14 @@
+ void aac_fib_free(struct fib *fibptr)
+ {
+-      unsigned long flags;
++      unsigned long flags, flagsv;
++
++      spin_lock_irqsave(&fibptr->event_lock, flagsv);
++      if (fibptr->done == 2) {
++              spin_unlock_irqrestore(&fibptr->event_lock, flagsv);
++              return;
++      }
++      spin_unlock_irqrestore(&fibptr->event_lock, flagsv);
+       spin_lock_irqsave(&fibptr->dev->fib_lock, flags);
+       if (unlikely(fibptr->flags & FIB_CONTEXT_FLAG_TIMED_OUT))
+@@ -473,14 +480,27 @@
+       if(wait)
+               spin_lock_irqsave(&fibptr->event_lock, flags);
+-      aac_adapter_deliver(fibptr);
++
++      if (aac_adapter_deliver(fibptr) != 0) {
++              printk(KERN_ERR "aac_fib_send: returned -EBUSY\n");
++              if (wait)
++                      spin_unlock_irqrestore(&fibptr->event_lock, flags);
++              return -EBUSY;
++      }
++
+       /*
+        *      If the caller wanted us to wait for response wait now.
+        */
+       if (wait) {
++              unsigned long mflags;
+               spin_unlock_irqrestore(&fibptr->event_lock, flags);
++
++              spin_lock_irqsave(&dev->manage_lock, mflags);
++              dev->management_fib_count++;
++              spin_unlock_irqrestore(&dev->manage_lock, mflags);
++
+               /* Only set for first known interruptable command */
+               if (wait < 0) {
+                       /*
+@@ -515,15 +535,14 @@
+                               }
+                               udelay(5);
+                       }
+-              } else if (down_interruptible(&fibptr->event_wait)) {
+-                      fibptr->done = 2;
+-                      up(&fibptr->event_wait);
+-              }
++              } else
++                      down_interruptible(&fibptr->event_wait);
++
+               spin_lock_irqsave(&fibptr->event_lock, flags);
+-              if ((fibptr->done == 0) || (fibptr->done == 2)) {
++              if (fibptr->done == 0) {
+                       fibptr->done = 2; /* Tell interrupt we aborted */
+                       spin_unlock_irqrestore(&fibptr->event_lock, flags);
+-                      return -EINTR;
++                      return -ERESTARTSYS;
+               }
+               spin_unlock_irqrestore(&fibptr->event_lock, flags);
+               BUG_ON(fibptr->done == 0);
+@@ -689,6 +708,7 @@
+ int aac_fib_complete(struct fib *fibptr)
+ {
++      unsigned long flags;
+       struct hw_fib * hw_fib = fibptr->hw_fib_va;
+       /*
+@@ -709,6 +729,13 @@
+        *      command is complete that we had sent to the adapter and this
+        *      cdb could be reused.
+        */
++      spin_lock_irqsave(&fibptr->event_lock, flags);
++      if (fibptr->done == 2) {
++              spin_unlock_irqrestore(&fibptr->event_lock, flags);
++              return 0;
++      }
++      spin_unlock_irqrestore(&fibptr->event_lock, flags);
++
+       if((hw_fib->header.XferState & cpu_to_le32(SentFromHost)) &&
+               (hw_fib->header.XferState & cpu_to_le32(AdapterProcessed)))
+       {
+@@ -1355,7 +1382,10 @@
+                       if (status >= 0)
+                               aac_fib_complete(fibctx);
+-                      aac_fib_free(fibctx);
++                      /* FIB should be freed only after getting
++                       * the response from the F/W */
++                      if (status != -ERESTARTSYS)
++                              aac_fib_free(fibctx);
+               }
+       }
+@@ -1759,6 +1789,7 @@
+                               struct fib *fibptr;
+                               if ((fibptr = aac_fib_alloc(dev))) {
++                                      int status;
+                                       __le32 *info;
+                                       aac_fib_init(fibptr);
+@@ -1769,15 +1800,21 @@
+                                       *info = cpu_to_le32(now.tv_sec);
+-                                      (void)aac_fib_send(SendHostTime,
++                                      status = aac_fib_send(SendHostTime,
+                                               fibptr,
+                                               sizeof(*info),
+                                               FsaNormal,
+                                               1, 1,
+                                               NULL,
+                                               NULL);
+-                                      aac_fib_complete(fibptr);
+-                                      aac_fib_free(fibptr);
++                                      /* Do not set XferState to zero unless
++                                       * receives a response from F/W */
++                                      if (status >= 0)
++                                              aac_fib_complete(fibptr);
++                                      /* FIB should be freed only after
++                                       * getting the response from the F/W */
++                                      if (status != -ERESTARTSYS)
++                                              aac_fib_free(fibptr);
+                               }
+                               difference = (long)(unsigned)update_interval*HZ;
+                       } else {
+diff -ru a/drivers/scsi/aacraid/dpcsup.c b/drivers/scsi/aacraid/dpcsup.c
+--- a/drivers/scsi/aacraid/dpcsup.c    2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/dpcsup.c    2009-09-16 17:41:00.000000000 +0530
+@@ -57,7 +57,7 @@
+       struct hw_fib * hwfib;
+       struct fib * fib;
+       int consumed = 0;
+-      unsigned long flags;
++      unsigned long flags, mflags;
+       spin_lock_irqsave(q->lock, flags);      
+       /*
+@@ -125,12 +125,21 @@
+               } else {
+                       unsigned long flagv;
+                       spin_lock_irqsave(&fib->event_lock, flagv);
+-                      if (!fib->done)
++                      if (!fib->done) {
+                               fib->done = 1;
+-                      up(&fib->event_wait);
++                              up(&fib->event_wait);
++                      }
+                       spin_unlock_irqrestore(&fib->event_lock, flagv);
++
++                      spin_lock_irqsave(&dev->manage_lock, mflags);
++                      dev->management_fib_count--;
++                      spin_unlock_irqrestore(&dev->manage_lock, mflags);
++
+                       FIB_COUNTER_INCREMENT(aac_config.NormalRecved);
+                       if (fib->done == 2) {
++                              spin_lock_irqsave(&fib->event_lock, flagv);
++                              fib->done = 0;
++                              spin_unlock_irqrestore(&fib->event_lock, flagv);
+                               aac_fib_complete(fib);
+                               aac_fib_free(fib);
+                       }
+@@ -232,6 +241,7 @@
+ unsigned int aac_intr_normal(struct aac_dev * dev, u32 index)
+ {
++      unsigned long mflags;
+       dprintk((KERN_INFO "aac_intr_normal(%p,%x)\n", dev, index));
+       if ((index & 0x00000002L)) {
+               struct hw_fib * hw_fib;
+@@ -320,11 +330,25 @@
+                       unsigned long flagv;
+                       dprintk((KERN_INFO "event_wait up\n"));
+                       spin_lock_irqsave(&fib->event_lock, flagv);
+-                      if (!fib->done)
++                      if (!fib->done) {
+                               fib->done = 1;
+-                      up(&fib->event_wait);
++                              up(&fib->event_wait);
++                      }
+                       spin_unlock_irqrestore(&fib->event_lock, flagv);
++
++                      spin_lock_irqsave(&dev->manage_lock, mflags);
++                      dev->management_fib_count--;
++                      spin_unlock_irqrestore(&dev->manage_lock, mflags);
++
+                       FIB_COUNTER_INCREMENT(aac_config.NormalRecved);
++                      if (fib->done == 2) {
++                              spin_lock_irqsave(&fib->event_lock, flagv);
++                              fib->done = 0;
++                              spin_unlock_irqrestore(&fib->event_lock, flagv);
++                              aac_fib_complete(fib);
++                              aac_fib_free(fib);
++                      }
++
+               }
+               return 0;
+       }
+diff -ru a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
+--- a/drivers/scsi/aacraid/linit.c     2009-09-16 16:40:05.000000000 +0530
++++ b/drivers/scsi/aacraid/linit.c     2009-09-16 17:41:00.000000000 +0530
+@@ -86,7 +86,13 @@
+  *
+  * Note: The last field is used to index into aac_drivers below.
+  */
+-static struct pci_device_id aac_pci_tbl[] = {
++#ifdef DECLARE_PCI_DEVICE_TABLE
++static DECLARE_PCI_DEVICE_TABLE(aac_pci_tbl) = {
++#elif defined(__devinitconst)
++static const struct pci_device_id aac_pci_tbl[] __devinitconst = {
++#else
++static const struct pci_device_id aac_pci_tbl[] __devinitdata = {
++#endif
+       { 0x1028, 0x0001, 0x1028, 0x0001, 0, 0, 0 }, /* PERC 2/Si (Iguana/PERC2Si) */
+       { 0x1028, 0x0002, 0x1028, 0x0002, 0, 0, 1 }, /* PERC 3/Di (Opal/PERC3Di) */
+       { 0x1028, 0x0003, 0x1028, 0x0003, 0, 0, 2 }, /* PERC 3/Si (SlimFast/PERC3Si */
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-alc888-hp-quirk
rename to src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-alc888-hp-quirk
index e4d2a9c780a5fe50b3f1511c441b9159a3dcf44b..fd526a6e47be7b12431f55c3106034c1944fad0f 100644 (file)
@@ -24,7 +24,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 +      SND_PCI_QUIRK(0x103c, 0x2a72, "HP Educ.ar", ALC888_3ST_HP),
        SND_PCI_QUIRK(0x1043, 0x1873, "Asus M90V", ALC888_ASUS_M90V),
        SND_PCI_QUIRK(0x1043, 0x8249, "Asus M2A-VM HDMI", ALC883_3ST_6ch_DIG),
-+      SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
++      SND_PCI_QUIRK(0x1043, 0x8284, "Asus Z37E", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x1043, 0x835f, "Asus Eee 1601", ALC888_ASUS_EEE1601),
        SND_PCI_QUIRK(0x105b, 0x0ce8, "Foxconn P35AX-S", ALC883_6ST_DIG),
        SND_PCI_QUIRK(0x105b, 0x6668, "Foxconn", ALC883_6ST_DIG),
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-analog-updates b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-analog-updates
new file mode 100644 (file)
index 0000000..a51c2d0
--- /dev/null
@@ -0,0 +1,342 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: Fix / improve HP 2530p docking station support
+Patch-mainline: 
+References: bnc#531437, bnc#535409
+
+Update AD codec support code to fix / improve AD1984A laptop model
+for supporting the docking station.
+
+Also sync quirk entries with the upstream, which fixes the missing
+entriy for bug #531437.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_analog.c |  189 ++++++++++++++++++++++++-------------------
+ 1 file changed, 108 insertions(+), 81 deletions(-)
+
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -1395,8 +1395,8 @@
+       {0x1e, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
+       {0x1f, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
+       /* Mic boost: 0dB */
+-      {0x08, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
+-      {0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
++      {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
++      {0x18, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       /* Record selector: Front mic */
+       {0x15, AC_VERB_SET_CONNECT_SEL, 0x0},
+       {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0xb080},
+@@ -1661,10 +1661,10 @@
+       SND_PCI_QUIRK(0x1014, 0x0597, "Lenovo Z60", AD1981_THINKPAD),
+       SND_PCI_QUIRK(0x1014, 0x05b7, "Lenovo Z60m", AD1981_THINKPAD),
+       /* All HP models */
+-      SND_PCI_QUIRK(0x103c, 0, "HP nx", AD1981_HP),
++      SND_PCI_QUIRK_VENDOR(0x103c, "HP nx", AD1981_HP),
+       SND_PCI_QUIRK(0x1179, 0x0001, "Toshiba U205", AD1981_TOSHIBA),
+       /* Lenovo Thinkpad T60/X60/Z6xx */
+-      SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1981_THINKPAD),
++      SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1981_THINKPAD),
+       /* HP nx6320 (reversed SSID, H/W bug) */
+       SND_PCI_QUIRK(0x30b0, 0x103c, "HP nx6320", AD1981_HP),
+       {}
+@@ -1873,8 +1873,8 @@
+ #define AD1988_SPDIF_OUT_HDMI 0x0b
+ #define AD1988_SPDIF_IN               0x07
+-static hda_nid_t ad1989b_slave_dig_outs[2] = {
+-      AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI
++static hda_nid_t ad1989b_slave_dig_outs[] = {
++      AD1988_SPDIF_OUT, AD1988_SPDIF_OUT_HDMI, 0
+ };
+ static struct hda_input_mux ad1988_6stack_capture_source = {
+@@ -2276,10 +2276,6 @@
+       {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
+-      /* ADCs; muted */
+-      {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       { }
+ };
+@@ -2387,10 +2383,6 @@
+       {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
+-      /* ADCs; muted */
+-      {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* Analog Mix output amp */
+       {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
+       { }
+@@ -2462,10 +2454,6 @@
+       {0x0c, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0d, AC_VERB_SET_CONNECT_SEL, 0x1},
+       {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
+-      /* ADCs; muted */
+-      {0x08, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x09, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* Analog Mix output amp */
+       {0x21, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x1f}, /* 0dB */
+       { }
+@@ -3198,10 +3186,10 @@
+       {0x0e, AC_VERB_SET_CONNECT_SEL, 0x1},
+       /* Port-B (front mic) pin */
+       {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+-      {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       /* Port-C (rear mic) pin */
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+-      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       /* Analog mixer; mute as default */
+       {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+@@ -3352,7 +3340,7 @@
+       {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* docking mic boost */
+-      {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      {0x25, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       /* Analog mixer - docking mic; mute as default */
+       {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
+       /* enable EAPD bit */
+@@ -3462,7 +3450,7 @@
+ static struct snd_pci_quirk ad1984_cfg_tbl[] = {
+       /* Lenovo Thinkpad T61/X61 */
+-      SND_PCI_QUIRK(0x17aa, 0, "Lenovo Thinkpad", AD1984_THINKPAD),
++      SND_PCI_QUIRK_VENDOR(0x17aa, "Lenovo Thinkpad", AD1984_THINKPAD),
+       SND_PCI_QUIRK(0x1028, 0x0214, "Dell T3400", AD1984_DELL_DESKTOP),
+       {}
+ };
+@@ -3616,10 +3604,10 @@
+       {0x13, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+       /* Port-B (front mic) pin */
+       {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+-      {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       /* Port-C (rear line-in) pin */
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_IN},
+-      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       /* Port-E (rear mic) pin */
+       {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x1c, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+@@ -3667,19 +3655,29 @@
+  * Port F: Internal speakers
+  */
+-static struct hda_input_mux ad1884a_laptop_capture_source = {
+-      .num_items = 4,
+-      .items = {
+-              { "Mic", 0x0 },         /* port-B */
+-              { "Internal Mic", 0x1 }, /* port-C */
+-              { "Dock Mic", 0x4 },    /* port-E */
+-              { "Mix", 0x3 },
+-      },
+-};
++static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
++                                      struct snd_ctl_elem_value *ucontrol)
++{
++      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
++      int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
++      int mute = (!ucontrol->value.integer.value[0] &&
++                  !ucontrol->value.integer.value[1]);
++      /* toggle GPIO1 according to the mute state */
++      snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
++                          mute ? 0x02 : 0x0);
++      return ret;
++}
+ static struct snd_kcontrol_new ad1884a_laptop_mixers[] = {
+       HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
+-      HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),
++      {
++              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++              .name = "Master Playback Switch",
++              .info = snd_hda_mixer_amp_switch_info,
++              .get = snd_hda_mixer_amp_switch_get,
++              .put = ad1884a_mobile_master_sw_put,
++              .private_value = HDA_COMPOSE_AMP_VAL(0x21, 3, 0, HDA_OUTPUT),
++      },
+       HDA_CODEC_MUTE("Dock Playback Switch", 0x12, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("PCM Playback Volume", 0x20, 0x5, HDA_INPUT),
+       HDA_CODEC_MUTE("PCM Playback Switch", 0x20, 0x5, HDA_INPUT),
+@@ -3696,36 +3694,9 @@
+       HDA_CODEC_VOLUME("Dock Mic Boost", 0x25, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Capture Volume", 0x0c, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Capture Switch", 0x0c, 0x0, HDA_OUTPUT),
+-      HDA_CODEC_VOLUME_IDX("Capture Volume", 1, 0x0d, 0x0, HDA_OUTPUT),
+-      HDA_CODEC_MUTE_IDX("Capture Switch", 1, 0x0d, 0x0, HDA_OUTPUT),
+-      {
+-              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
+-              /* The multiple "Capture Source" controls confuse alsamixer
+-               * So call somewhat different..
+-               */
+-              /* .name = "Capture Source", */
+-              .name = "Input Source",
+-              .count = 2,
+-              .info = ad198x_mux_enum_info,
+-              .get = ad198x_mux_enum_get,
+-              .put = ad198x_mux_enum_put,
+-      },
+       { } /* end */
+ };
+-static int ad1884a_mobile_master_sw_put(struct snd_kcontrol *kcontrol,
+-                                      struct snd_ctl_elem_value *ucontrol)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      int ret = snd_hda_mixer_amp_switch_put(kcontrol, ucontrol);
+-      int mute = (!ucontrol->value.integer.value[0] &&
+-                  !ucontrol->value.integer.value[1]);
+-      /* toggle GPIO1 according to the mute state */
+-      snd_hda_codec_write_cache(codec, 0x01, 0, AC_VERB_SET_GPIO_DATA,
+-                          mute ? 0x02 : 0x0);
+-      return ret;
+-}
+-
+ static struct snd_kcontrol_new ad1884a_mobile_mixers[] = {
+       HDA_CODEC_VOLUME("Master Playback Volume", 0x21, 0x0, HDA_OUTPUT),
+       /*HDA_CODEC_MUTE("Master Playback Switch", 0x21, 0x0, HDA_OUTPUT),*/
+@@ -3797,6 +3768,63 @@
+       return 0;
+ }
++/* mute internal speaker if HP or docking HP is plugged */
++static void ad1884a_laptop_automute(struct hda_codec *codec)
++{
++      unsigned int present;
++
++      present = snd_hda_codec_read(codec, 0x11, 0, AC_VERB_GET_PIN_SENSE, 0);
++      present &= AC_PINSENSE_PRESENCE;
++      if (!present) {
++              present = snd_hda_codec_read(codec, 0x12, 0,
++                                           AC_VERB_GET_PIN_SENSE, 0);
++              present &= AC_PINSENSE_PRESENCE;
++      }
++      snd_hda_codec_amp_stereo(codec, 0x16, HDA_OUTPUT, 0,
++                               HDA_AMP_MUTE, present ? HDA_AMP_MUTE : 0);
++      snd_hda_codec_write(codec, 0x16, 0, AC_VERB_SET_EAPD_BTLENABLE,
++                          present ? 0x00 : 0x02);
++}
++
++/* switch to external mic if plugged */
++static void ad1884a_laptop_automic(struct hda_codec *codec)
++{
++      unsigned int idx;
++
++      if (snd_hda_codec_read(codec, 0x14, 0, AC_VERB_GET_PIN_SENSE, 0) &
++          AC_PINSENSE_PRESENCE)
++              idx = 0;
++      else if (snd_hda_codec_read(codec, 0x1c, 0, AC_VERB_GET_PIN_SENSE, 0) &
++               AC_PINSENSE_PRESENCE)
++              idx = 4;
++      else
++              idx = 1;
++      snd_hda_codec_write(codec, 0x0c, 0, AC_VERB_SET_CONNECT_SEL, idx);
++}
++
++/* unsolicited event for HP jack sensing */
++static void ad1884a_laptop_unsol_event(struct hda_codec *codec,
++                                     unsigned int res)
++{
++      switch (res >> 26) {
++      case AD1884A_HP_EVENT:
++              ad1884a_laptop_automute(codec);
++              break;
++      case AD1884A_MIC_EVENT:
++              ad1884a_laptop_automic(codec);
++              break;
++      }
++}
++
++/* initialize jack-sensing, too */
++static int ad1884a_laptop_init(struct hda_codec *codec)
++{
++      ad198x_init(codec);
++      ad1884a_laptop_automute(codec);
++      ad1884a_laptop_automic(codec);
++      return 0;
++}
++
+ /* additional verbs for laptop model */
+ static struct hda_verb ad1884a_laptop_verbs[] = {
+       /* Port-A (HP) pin - always unmuted */
+@@ -3804,18 +3832,28 @@
+       /* Port-F (int speaker) mixer - route only from analog mixer */
+       {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x0b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
+-      /* Port-F pin */
+-      {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_HP},
++      /* Port-F (int speaker) pin */
++      {0x16, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
++      /* required for compaq 6530s/6531s speaker output */
++      {0x1c, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       /* Port-C pin - internal mic-in */
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+       {0x14, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
+       {0x15, AC_VERB_SET_AMP_GAIN_MUTE, 0x7002}, /* raise mic as default */
++      /* Port-D (docking line-out) pin - default unmuted */
++      {0x12, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       /* analog mix */
+       {0x20, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(4)},
+       /* unsolicited event for pin-sense */
+       {0x11, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
++      {0x12, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_HP_EVENT},
+       {0x14, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
++      {0x1c, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | AD1884A_MIC_EVENT},
++      /* allow to touch GPIO1 (for mute control) */
++      {0x01, AC_VERB_SET_GPIO_MASK, 0x02},
++      {0x01, AC_VERB_SET_GPIO_DIRECTION, 0x02},
++      {0x01, AC_VERB_SET_GPIO_DATA, 0x02}, /* first muted */
+       { } /* end */
+ };
+@@ -3973,21 +4011,11 @@
+       SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
+       SND_PCI_QUIRK(0x103c, 0x3037, "HP 2230s", AD1884A_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3072, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3073, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3074, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3075, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3076, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3077, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3078, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x3079, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x307a, "HP", AD1884A_MOBILE),
+-      SND_PCI_QUIRK(0x103c, 0x30e1, "HP 2530p", AD1884A_LAPTOP),
+-      SND_PCI_QUIRK(0x103c, 0x30e6, "HP 6730b", AD1884A_LAPTOP),
+-      SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
+-      SND_PCI_QUIRK(0x103c, 0x360d, "HP 6530b", AD1884A_LAPTOP),
+-      SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
+-      SND_PCI_QUIRK(0x103c, 0x3632, "HP", AD1884A_MOBILE),
++      SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x3070, "HP", AD1884A_MOBILE),
++      SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30d0, "HP laptop", AD1884A_LAPTOP),
++      SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x30e0, "HP laptop", AD1884A_LAPTOP),
++      SND_PCI_QUIRK_MASK(0x103c, 0xff00, 0x3600, "HP laptop", AD1884A_LAPTOP),
++      SND_PCI_QUIRK_MASK(0x103c, 0xfff0, 0x7010, "HP laptop", AD1884A_MOBILE),
+       SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
+       {}
+ };
+@@ -4030,9 +4058,8 @@
+               spec->mixers[0] = ad1884a_laptop_mixers;
+               spec->init_verbs[spec->num_init_verbs++] = ad1884a_laptop_verbs;
+               spec->multiout.dig_out_nid = 0;
+-              spec->input_mux = &ad1884a_laptop_capture_source;
+-              codec->patch_ops.unsol_event = ad1884a_hp_unsol_event;
+-              codec->patch_ops.init = ad1884a_hp_init;
++              codec->patch_ops.unsol_event = ad1884a_laptop_unsol_event;
++              codec->patch_ops.init = ad1884a_laptop_init;
+               /* set the upper-limit for mixer amp to 0dB for avoiding the
+                * possible damage by overloading
+                */
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-bseries-mute-led-fix b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-hp-bseries-mute-led-fix
new file mode 100644 (file)
index 0000000..a9d970f
--- /dev/null
@@ -0,0 +1,134 @@
+From 5bdaaada16363d64e10ae081755d1a8d392429f2 Mon Sep 17 00:00:00 2001
+From: Vitaliy Kulikov <Vitaliy.Kulikov@idt.com>
+Date: Wed, 4 Nov 2009 07:57:45 +0100
+Subject: ALSA: hda - Enable GPIO control for mute LED on HP systems
+Patch-mainline: 2.6.32-rc6
+References: bnc#547357,bnc#523487
+
+This patch enables GPIO        to control mute LED indicator on the HP systems
+with the special string        in BIOS and applies it with the correct polarity on
+HP B-series systems.
+
+It also        restores configuration of the pin intended as the second Headphone
+on HP B-series systems but configured as something else in the BIOS to
+pass MS        DTM.
+
+Signed-off-by: Vitaliy Kulikov <Vitaliy.Kulikov@idt.com>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |   68 +++++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 68 insertions(+)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -28,6 +28,7 @@
+ #include <linux/delay.h>
+ #include <linux/slab.h>
+ #include <linux/pci.h>
++#include <linux/dmi.h>
+ #include <sound/core.h>
+ #include <sound/asoundef.h>
+ #include "hda_codec.h"
+@@ -1506,6 +1507,8 @@
+                     "DFI LanParty", STAC_92HD71BXX_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x30fb,
+                     "HP dv4-1222nr", STAC_HP_DV4_1222NR),
++      SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x1720,
++                        "HP", STAC_HP_DV5),
+       SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3080,
+                     "HP", STAC_HP_DV5),
+       SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x30f0,
+@@ -4439,6 +4442,26 @@
+       return 0;
+ }
++static int hp_bseries_system(u32 subsystem_id)
++{
++      switch (subsystem_id) {
++      case 0x103c307e:
++      case 0x103c307f:
++      case 0x103c3080:
++      case 0x103c3081:
++      case 0x103c1722:
++      case 0x103c1723:
++      case 0x103c1724:
++      case 0x103c1725:
++      case 0x103c1726:
++      case 0x103c1727:
++      case 0x103c1728:
++      case 0x103c1729:
++              return 1;
++      }
++      return 0;
++}
++
+ /*
+  * using power check for controlling mute led of HP notebooks
+  * check for mute state only on Speakers (nid = 0x10)
+@@ -4463,6 +4486,11 @@
+               else
+                       spec->gpio_data |= spec->gpio_led; /* white */
++              if (hp_bseries_system(codec->subsystem_id)) {
++                      /* LED state is inverted on these systems */
++                      spec->gpio_data ^= spec->gpio_led;
++              }
++
+               stac_gpio_set(codec, spec->gpio_mask,
+                             spec->gpio_dir,
+                             spec->gpio_data);
+@@ -4944,6 +4972,7 @@
+ {
+       struct sigmatel_spec *spec;
+       struct hda_verb *unmute_init = stac92hd71bxx_unmute_core_init;
++      unsigned int pin_cfg;
+       int err = 0;
+       spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
+@@ -5130,6 +5159,45 @@
+               break;
+       }
++      if (hp_bseries_system(codec->subsystem_id)) {
++              pin_cfg = snd_hda_codec_get_pincfg(codec, 0x0f);
++              if (get_defcfg_device(pin_cfg) == AC_JACK_LINE_OUT ||
++                      get_defcfg_device(pin_cfg) == AC_JACK_SPEAKER  ||
++                      get_defcfg_device(pin_cfg) == AC_JACK_HP_OUT) {
++                      /* It was changed in the BIOS to just satisfy MS DTM.
++                       * Lets turn it back into slaved HP
++                       */
++                      pin_cfg = (pin_cfg & (~AC_DEFCFG_DEVICE))
++                                      | (AC_JACK_HP_OUT <<
++                                              AC_DEFCFG_DEVICE_SHIFT);
++                      pin_cfg = (pin_cfg & (~(AC_DEFCFG_DEF_ASSOC
++                                                      | AC_DEFCFG_SEQUENCE)))
++                                                              | 0x1f;
++                      snd_hda_codec_set_pincfg(codec, 0x0f, pin_cfg);
++              }
++      }
++
++      if ((codec->subsystem_id >> 16) == PCI_VENDOR_ID_HP) {
++              const struct dmi_device *dev = NULL;
++              while ((dev = dmi_find_device(DMI_DEV_TYPE_OEM_STRING,
++                                            NULL, dev))) {
++                      if (strcmp(dev->name, "HP_Mute_LED_1")) {
++                              switch (codec->vendor_id) {
++                              case 0x111d7608:
++                                      spec->gpio_led = 0x01;
++                                      break;
++                              case 0x111d7600:
++                              case 0x111d7601:
++                              case 0x111d7602:
++                              case 0x111d7603:
++                                      spec->gpio_led = 0x08;
++                                      break;
++                              }
++                              break;
++                      }
++              }
++      }
++
+ #ifdef CONFIG_SND_HDA_POWER_SAVE
+       if (spec->gpio_led) {
+               spec->gpio_mask |= spec->gpio_led;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-reboot-notify b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-reboot-notify
new file mode 100644 (file)
index 0000000..b68d20d
--- /dev/null
@@ -0,0 +1,83 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: hda - Add reboot notifier to each codec
+Patch-mainline: 
+References: bnc#544779
+
+Add reboot notifier to each codec so that it can do some workarounds
+needed for reboot.
+So far, patch_sigmatel.c calls its shutup routine for avoiding noises
+at reboot on some HP machines.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/hda_codec.c      |   17 +++++++++++++++++
+ sound/pci/hda/hda_codec.h      |    2 ++
+ sound/pci/hda/hda_intel.c      |    1 +
+ sound/pci/hda/patch_sigmatel.c |    1 +
+ 4 files changed, 21 insertions(+)
+
+--- a/sound/pci/hda/hda_codec.c
++++ b/sound/pci/hda/hda_codec.c
+@@ -3402,6 +3402,23 @@
+       array->list = NULL;
+ }
++/* call each reboot notifier */
++void snd_hda_bus_reboot_notify(struct hda_bus *bus)
++{
++      struct hda_codec *codec;
++
++      if (!bus)
++              return;
++      list_for_each_entry(codec, &bus->codec_list, list) {
++#ifdef CONFIG_SND_HDA_POWER_SAVE
++              if (!codec->power_on)
++                      continue;
++#endif
++              if (codec->patch_ops.reboot_notify)
++                      codec->patch_ops.reboot_notify(codec);
++      }
++}
++
+ /*
+  * used by hda_proc.c and hda_eld.c
+  */
+--- a/sound/pci/hda/hda_codec.h
++++ b/sound/pci/hda/hda_codec.h
+@@ -724,6 +724,7 @@
+ #ifdef CONFIG_SND_HDA_POWER_SAVE
+       int (*check_power_status)(struct hda_codec *codec, hda_nid_t nid);
+ #endif
++      void (*reboot_notify)(struct hda_codec *codec);
+ };
+ /* record for amp information cache */
+@@ -927,6 +928,7 @@
+  * Misc
+  */
+ void snd_hda_get_codec_name(struct hda_codec *codec, char *name, int namelen);
++void snd_hda_bus_reboot_notify(struct hda_bus *bus);
+ /*
+  * power management
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2107,6 +2107,7 @@
+ static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
+ {
+       struct azx *chip = container_of(nb, struct azx, reboot_notifier);
++      snd_hda_bus_reboot_notify(chip->bus);
+       azx_stop_chip(chip);
+       return NOTIFY_OK;
+ }
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -4517,6 +4517,7 @@
+       .suspend = stac92xx_suspend,
+       .resume = stac92xx_resume,
+ #endif
++      .reboot_notify = stac92xx_shutup,
+ };
+ static int patch_stac9200(struct hda_codec *codec)
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-sigmatel-update
rename to src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-sigmatel-update
index 9826d53a88efdf69c01df87c33851e5574268a50..95ef6456f02efed02cf047a45e33fed272d5020a 100644 (file)
@@ -1199,7 +1199,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 + *
 + * So, it's basically a problem of default pin configs, likely a BIOS issue.
 + * But, disabling the code below just works around it, and I'm too tired of
-+ * bug reports with such devices... 
++ * bug reports with such devices...
 + */
                else
                        stac92xx_reset_pinctl(codec, cfg->hp_pins[i], val);
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd-hp-fixes b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd-hp-fixes
new file mode 100644 (file)
index 0000000..5154234
--- /dev/null
@@ -0,0 +1,172 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: Fix IDT92HDxx codec parser for new HP laptops
+Patch-mainline: 2.6.32-rc1
+References: bnc#532598, bnc#534202, bnc#534214
+
+Backport fixes for IDT 92HD7x and 92HD8x codecs for new HP laptops
+(and some Dell ones).
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |   65 +++++++++++++++++++++--------------------
+ 1 file changed, 34 insertions(+), 31 deletions(-)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -770,10 +770,6 @@
+ };
+ static struct hda_verb stac92hd83xxx_core_init[] = {
+-      { 0xa, AC_VERB_SET_CONNECT_SEL, 0x1},
+-      { 0xb, AC_VERB_SET_CONNECT_SEL, 0x1},
+-      { 0xd, AC_VERB_SET_CONNECT_SEL, 0x0},
+-
+       /* power state controls amps */
+       { 0x01, AC_VERB_SET_EAPD, 1 << 2},
+       {}
+@@ -1403,8 +1399,8 @@
+ };
+ static unsigned int dell_s14_pin_configs[10] = {
+-      0x02214030, 0x02211010, 0x02a19020, 0x01014050,
+-      0x40f000f0, 0x01819040, 0x40f000f0, 0x90a60160,
++      0x0221403f, 0x0221101f, 0x02a19020, 0x90170110,
++      0x40f000f0, 0x40f000f0, 0x40f000f0, 0x90a60160,
+       0x40f000f0, 0x40f000f0,
+ };
+@@ -1503,6 +1499,8 @@
+                     "HP mini 1000", STAC_HP_M4),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_HP, 0x361b,
+                     "HP HDX", STAC_HP_HDX),  /* HDX16 */
++      SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x3620,
++                    "HP dv6", STAC_HP_DV5),
+       SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_HP, 0xfff0, 0x7010,
+                     "HP", STAC_HP_DV5),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
+@@ -3944,7 +3942,10 @@
+               stac92xx_auto_set_pinctl(codec, spec->autocfg.line_out_pins[0],
+                               AC_PINCTL_OUT_EN);
+               /* fake event to set up pins */
+-              stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
++              if (cfg->hp_pins[0])
++                      stac_issue_unsol_event(codec, cfg->hp_pins[0]);
++              else if (cfg->line_out_pins[0])
++                      stac_issue_unsol_event(codec, cfg->line_out_pins[0]);
+       } else {
+               stac92xx_auto_init_multi_out(codec);
+               stac92xx_auto_init_hp_out(codec);
+@@ -4374,8 +4375,13 @@
+       snd_hda_codec_resume_amp(codec);
+       snd_hda_codec_resume_cache(codec);
+       /* fake event to set up pins again to override cached values */
+-      if (spec->hp_detect)
+-              stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
++      if (spec->hp_detect) {
++              if (spec->autocfg.hp_pins[0])
++                      stac_issue_unsol_event(codec, spec->autocfg.hp_pins[0]);
++              else if (spec->autocfg.line_out_pins[0])
++                      stac_issue_unsol_event(codec,
++                                             spec->autocfg.line_out_pins[0]);
++      }
+       return 0;
+ }
+@@ -4708,7 +4714,7 @@
+               spec->eapd_switch = 1;
+               break;
+       }
+-      if (spec->board_config > STAC_92HD73XX_REF) {
++      if (spec->board_config != STAC_92HD73XX_REF) {
+               /* GPIO0 High = Enable EAPD */
+               spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x1;
+               spec->gpio_data = 0x01;
+@@ -4756,7 +4762,6 @@
+       codec->spec = spec;
+       codec->slave_dig_outs = stac92hd83xxx_slave_dig_outs;
+-      spec->mono_nid = 0x19;
+       spec->digbeep_nid = 0x21;
+       spec->mux_nids = stac92hd83xxx_mux_nids;
+       spec->num_muxes = ARRAY_SIZE(stac92hd83xxx_mux_nids);
+@@ -4944,7 +4949,7 @@
+               stac92xx_set_config_regs(codec);
+       }
+-      if (spec->board_config > STAC_92HD71BXX_REF) {
++      if (spec->board_config != STAC_92HD71BXX_REF) {
+               /* GPIO0 = EAPD */
+               spec->gpio_mask = 0x01;
+               spec->gpio_dir = 0x01;
+@@ -5073,6 +5078,11 @@
+       case STAC_HP_DV5:
+               snd_hda_codec_set_pincfg(codec, 0x0d, 0x90170010);
+               stac92xx_auto_set_pinctl(codec, 0x0d, AC_PINCTL_OUT_EN);
++              /* HP dv6 gives the headphone pin as a line-out.  Thus we
++               * need to set hp_detect flag here to force to enable HP
++               * detection.
++               */
++              spec->hp_detect = 1;
+               break;
+       case STAC_HP_HDX:
+               spec->num_dmics = 1;
+@@ -5268,14 +5278,17 @@
+       spec->dac_list = stac927x_dac_nids;
+       spec->multiout.dac_nids = spec->dac_nids;
++      if (spec->board_config != STAC_D965_REF) {
++              /* GPIO0 High = Enable EAPD */
++              spec->eapd_mask = spec->gpio_mask = 0x01;
++              spec->gpio_dir = spec->gpio_data = 0x01;
++      }
++
+       switch (spec->board_config) {
+       case STAC_D965_3ST:
+       case STAC_D965_5ST:
+               /* GPIO0 High = Enable EAPD */
+-              spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x01;
+-              spec->gpio_data = 0x01;
+               spec->num_dmics = 0;
+-
+               spec->init = d965_core_init;
+               break;
+       case STAC_DELL_BIOS:
+@@ -5294,16 +5307,11 @@
+               snd_hda_codec_set_pincfg(codec, 0x0e, 0x02a79130);
+               /* fallthru */
+       case STAC_DELL_3ST:
+-              /* GPIO2 High = Enable EAPD */
+-              spec->eapd_mask = spec->gpio_mask = spec->gpio_dir = 0x04;
+-              spec->gpio_data = 0x04;
+-              switch (codec->subsystem_id) {
+-              case 0x1028022f:
+-                      /* correct EAPD to be GPIO0 */
+-                      spec->eapd_mask = spec->gpio_mask = 0x01;
+-                      spec->gpio_dir = spec->gpio_data = 0x01;
+-                      break;
+-              };
++              if (codec->subsystem_id != 0x1028022f) {
++                      /* GPIO2 High = Enable EAPD */
++                      spec->eapd_mask = spec->gpio_mask = 0x04;
++                      spec->gpio_dir = spec->gpio_data = 0x04;
++              }
+               spec->dmic_nids = stac927x_dmic_nids;
+               spec->num_dmics = STAC927X_NUM_DMICS;
+@@ -5312,14 +5320,9 @@
+               spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
+               break;
+       default:
+-              if (spec->board_config > STAC_D965_REF) {
+-                      /* GPIO0 High = Enable EAPD */
+-                      spec->eapd_mask = spec->gpio_mask = 0x01;
+-                      spec->gpio_dir = spec->gpio_data = 0x01;
+-              }
+               spec->num_dmics = 0;
+-
+               spec->init = stac927x_core_init;
++              break;
+       }
+       spec->num_caps = STAC927X_NUM_CAPS;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd73-fixes b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-92hd73-fixes
new file mode 100644 (file)
index 0000000..282d89a
--- /dev/null
@@ -0,0 +1,604 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: Regression fixes of broken recording with IDT 92HD73xx codecs
+Patch-mainline: 
+References: bnc#531533
+
+The IDT/STAC auto-mic patch also regressed the input source selection of
+IDT 92HD73xx codecs.  The fix is backported from the usptream tree,
+together with the clean up of dead codes.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |  355 ++++++-----------------------------------
+ 1 file changed, 60 insertions(+), 295 deletions(-)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -78,10 +78,12 @@
+       STAC_92HD73XX_AUTO,
+       STAC_92HD73XX_NO_JD, /* no jack-detection */
+       STAC_92HD73XX_REF,
++      STAC_92HD73XX_INTEL,
+       STAC_DELL_M6_AMIC,
+       STAC_DELL_M6_DMIC,
+       STAC_DELL_M6_BOTH,
+       STAC_DELL_EQ,
++      STAC_ALIENWARE_M17X,
+       STAC_92HD73XX_MODELS
+ };
+@@ -216,7 +218,6 @@
+       /* playback */
+       struct hda_input_mux *mono_mux;
+-      struct hda_input_mux *amp_mux;
+       unsigned int cur_mmux;
+       struct hda_multi_out multiout;
+       hda_nid_t dac_nids[5];
+@@ -271,7 +272,6 @@
+       unsigned int cur_smux[2];
+       unsigned int cur_amux;
+       hda_nid_t *amp_nids;
+-      unsigned int num_amps;
+       unsigned int powerdown_adcs;
+       /* i/o switches */
+@@ -289,7 +289,6 @@
+       struct hda_input_mux private_dimux;
+       struct hda_input_mux private_imux;
+       struct hda_input_mux private_smux;
+-      struct hda_input_mux private_amp_mux;
+       struct hda_input_mux private_mono_mux;
+ };
+@@ -318,11 +317,6 @@
+       0x1a, 0x1b
+ };
+-#define DELL_M6_AMP 2
+-static hda_nid_t stac92hd73xx_amp_nids[3] = {
+-      0x0b, 0x0c, 0x0e
+-};
+-
+ #define STAC92HD73XX_NUM_DMICS        2
+ static hda_nid_t stac92hd73xx_dmic_nids[STAC92HD73XX_NUM_DMICS + 1] = {
+       0x13, 0x14, 0
+@@ -330,8 +324,8 @@
+ #define STAC92HD73_DAC_COUNT 5
+-static hda_nid_t stac92hd73xx_mux_nids[4] = {
+-      0x28, 0x29, 0x2a, 0x2b,
++static hda_nid_t stac92hd73xx_mux_nids[2] = {
++      0x20, 0x21,
+ };
+ static hda_nid_t stac92hd73xx_dmux_nids[2] = {
+@@ -584,34 +578,6 @@
+       0x21, 0x22,
+ };
+-#define stac92xx_amp_volume_info snd_hda_mixer_amp_volume_info
+-
+-static int stac92xx_amp_volume_get(struct snd_kcontrol *kcontrol,
+-                               struct snd_ctl_elem_value *ucontrol)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      struct sigmatel_spec *spec = codec->spec;
+-      hda_nid_t nid = spec->amp_nids[spec->cur_amux];
+-
+-      kcontrol->private_value ^= get_amp_nid(kcontrol);
+-      kcontrol->private_value |= nid;
+-
+-      return snd_hda_mixer_amp_volume_get(kcontrol, ucontrol);
+-}
+-
+-static int stac92xx_amp_volume_put(struct snd_kcontrol *kcontrol,
+-                               struct snd_ctl_elem_value *ucontrol)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      struct sigmatel_spec *spec = codec->spec;
+-      hda_nid_t nid = spec->amp_nids[spec->cur_amux];
+-
+-      kcontrol->private_value ^= get_amp_nid(kcontrol);
+-      kcontrol->private_value |= nid;
+-
+-      return snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
+-}
+-
+ static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
+                                  struct snd_ctl_elem_info *uinfo)
+ {
+@@ -777,41 +743,6 @@
+                                    spec->mono_nid, &spec->cur_mmux);
+ }
+-static int stac92xx_amp_mux_enum_info(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_info *uinfo)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      struct sigmatel_spec *spec = codec->spec;
+-      return snd_hda_input_mux_info(spec->amp_mux, uinfo);
+-}
+-
+-static int stac92xx_amp_mux_enum_get(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      struct sigmatel_spec *spec = codec->spec;
+-
+-      ucontrol->value.enumerated.item[0] = spec->cur_amux;
+-      return 0;
+-}
+-
+-static int stac92xx_amp_mux_enum_put(struct snd_kcontrol *kcontrol,
+-      struct snd_ctl_elem_value *ucontrol)
+-{
+-      struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
+-      struct sigmatel_spec *spec = codec->spec;
+-      struct snd_kcontrol *ctl =
+-              snd_hda_find_mixer_ctl(codec, "Amp Capture Volume");
+-      if (!ctl)
+-              return -EINVAL;
+-
+-      snd_ctl_notify(codec->bus->card, SNDRV_CTL_EVENT_MASK_VALUE |
+-              SNDRV_CTL_EVENT_MASK_INFO, &ctl->id);
+-
+-      return snd_hda_input_mux_put(codec, spec->amp_mux, ucontrol,
+-                                   0, &spec->cur_amux);
+-}
+-
+ static struct hda_verb stac9200_core_init[] = {
+       /* set dac0mux for dac converter */
+       { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
+@@ -825,84 +756,16 @@
+       {}
+ };
+-static struct hda_verb stac92hd73xx_6ch_core_init[] = {
+-      /* set master volume and direct control */
+-      { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+-      /* setup adcs to point to mixer */
+-      { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      /* setup import muxs */
+-      { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
+-      {}
+-};
+-
+ static struct hda_verb dell_eq_core_init[] = {
+       /* set master volume to max value without distortion
+        * and direct control */
+       { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
+-      /* setup adcs to point to mixer */
+-      { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      /* setup import muxs */
+-      { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
+       {}
+ };
+-static struct hda_verb dell_m6_core_init[] = {
+-      { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+-      /* setup adcs to point to mixer */
+-      { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      /* setup import muxs */
+-      { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x00},
+-      {}
+-};
+-
+-static struct hda_verb stac92hd73xx_8ch_core_init[] = {
+-      /* set master volume and direct control */
+-      { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+-      /* setup adcs to point to mixer */
+-      { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      /* setup import muxs */
+-      { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
+-      {}
+-};
+-
+-static struct hda_verb stac92hd73xx_10ch_core_init[] = {
++static struct hda_verb stac92hd73xx_core_init[] = {
+       /* set master volume and direct control */
+       { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+-      /* dac3 is connected to import3 mux */
+-      { 0x18, AC_VERB_SET_AMP_GAIN_MUTE, 0xb07f},
+-      /* setup adcs to point to mixer */
+-      { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+-      { 0x0f, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x10, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      { 0x11, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+-      /* setup import muxs */
+-      { 0x28, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x29, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x2b, AC_VERB_SET_CONNECT_SEL, 0x03},
+       {}
+ };
+@@ -980,31 +843,6 @@
+               .put = stac92xx_mono_mux_enum_put, \
+       }
+-#define STAC_AMP_MUX \
+-      { \
+-              .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
+-              .name = "Amp Selector Capture Switch", \
+-              .count = 1, \
+-              .info = stac92xx_amp_mux_enum_info, \
+-              .get = stac92xx_amp_mux_enum_get, \
+-              .put = stac92xx_amp_mux_enum_put, \
+-      }
+-
+-#define STAC_AMP_VOL(xname, nid, chs, idx, dir) \
+-      { \
+-              .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
+-              .name = xname, \
+-              .index = 0, \
+-              .access = SNDRV_CTL_ELEM_ACCESS_READWRITE | \
+-                      SNDRV_CTL_ELEM_ACCESS_TLV_READ | \
+-                      SNDRV_CTL_ELEM_ACCESS_TLV_CALLBACK, \
+-              .info = stac92xx_amp_volume_info, \
+-              .get = stac92xx_amp_volume_get, \
+-              .put = stac92xx_amp_volume_put, \
+-              .tlv = { .c = snd_hda_mixer_amp_tlv }, \
+-              .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \
+-      }
+-
+ #define DC_BIAS(xname, idx, nid) \
+       { \
+               .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \
+@@ -1024,65 +862,6 @@
+       { } /* end */
+ };
+-#define DELL_M6_MIXER 6
+-static struct snd_kcontrol_new stac92hd73xx_6ch_mixer[] = {
+-      /* start of config #1 */
+-      HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
+-      HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
+-      HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
+-      HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
+-
+-      /* start of config #2 */
+-      HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
+-      HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
+-      HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
+-
+-      { } /* end */
+-};
+-
+-static struct snd_kcontrol_new stac92hd73xx_8ch_mixer[] = {
+-      HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
+-      HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
+-      HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
+-      HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
+-      HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
+-      HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
+-      { } /* end */
+-};
+-
+-static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
+-      HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
+-      HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("Mic Mixer Capture Volume", 0x1d, 0x1, HDA_INPUT),
+-      HDA_CODEC_MUTE("Mic Mixer Capture Switch", 0x1d, 0x1, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("Line In Mixer Capture Volume", 0x1d, 0x2, HDA_INPUT),
+-      HDA_CODEC_MUTE("Line In Mixer Capture Switch", 0x1d, 0x2, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
+-      HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
+-
+-      HDA_CODEC_VOLUME("CD Mixer Capture Volume", 0x1d, 0x4, HDA_INPUT),
+-      HDA_CODEC_MUTE("CD Mixer Capture Switch", 0x1d, 0x4, HDA_INPUT),
+-      { } /* end */
+-};
+-
+-
+ static struct snd_kcontrol_new stac925x_mixer[] = {
+       HDA_CODEC_VOLUME("Master Playback Volume", 0x0e, 0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Master Playback Switch", 0x0e, 0, HDA_OUTPUT),
+@@ -1548,22 +1327,32 @@
+       0x4f0000f0,
+ };
++static unsigned int alienware_m17x_pin_configs[13] = {
++      0x0321101f, 0x0321101f, 0x03a11020, 0x03014020,
++      0x90170110, 0x4f0000f0, 0x4f0000f0, 0x4f0000f0,
++      0x4f0000f0, 0x90a60160, 0x4f0000f0, 0x4f0000f0,
++      0x904601b0,
++};
++
+ static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
+       [STAC_92HD73XX_REF]     = ref92hd73xx_pin_configs,
+       [STAC_DELL_M6_AMIC]     = dell_m6_pin_configs,
+       [STAC_DELL_M6_DMIC]     = dell_m6_pin_configs,
+       [STAC_DELL_M6_BOTH]     = dell_m6_pin_configs,
+       [STAC_DELL_EQ]  = dell_m6_pin_configs,
++      [STAC_ALIENWARE_M17X]   = alienware_m17x_pin_configs,
+ };
+ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
+       [STAC_92HD73XX_AUTO] = "auto",
+       [STAC_92HD73XX_NO_JD] = "no-jd",
+       [STAC_92HD73XX_REF] = "ref",
++      [STAC_92HD73XX_INTEL] = "intel",
+       [STAC_DELL_M6_AMIC] = "dell-m6-amic",
+       [STAC_DELL_M6_DMIC] = "dell-m6-dmic",
+       [STAC_DELL_M6_BOTH] = "dell-m6",
+       [STAC_DELL_EQ] = "dell-eq",
++      [STAC_ALIENWARE_M17X] = "alienware",
+ };
+ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+@@ -1572,6 +1361,10 @@
+                               "DFI LanParty", STAC_92HD73XX_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DFI, 0x3101,
+                               "DFI LanParty", STAC_92HD73XX_REF),
++      SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5002,
++                              "Intel DG45ID", STAC_92HD73XX_INTEL),
++      SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x5003,
++                              "Intel DG45FC", STAC_92HD73XX_INTEL),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
+                               "Dell Studio 1535", STAC_DELL_M6_DMIC),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
+@@ -1597,6 +1390,12 @@
+       {} /* terminator */
+ };
++static struct snd_pci_quirk stac92hd73xx_codec_id_cfg_tbl[] = {
++      SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a1,
++                    "Alienware M17x", STAC_ALIENWARE_M17X),
++      {} /* terminator */
++};
++
+ static unsigned int ref92hd83xxx_pin_configs[10] = {
+       0x02214030, 0x02211010, 0x02a19020, 0x02170130,
+       0x01014050, 0x01819040, 0x01014020, 0x90a3014e,
+@@ -2682,8 +2481,6 @@
+       STAC_CTL_WIDGET_VOL,
+       STAC_CTL_WIDGET_MUTE,
+       STAC_CTL_WIDGET_MONO_MUX,
+-      STAC_CTL_WIDGET_AMP_MUX,
+-      STAC_CTL_WIDGET_AMP_VOL,
+       STAC_CTL_WIDGET_HP_SWITCH,
+       STAC_CTL_WIDGET_IO_SWITCH,
+       STAC_CTL_WIDGET_CLFE_SWITCH,
+@@ -2694,8 +2491,6 @@
+       HDA_CODEC_VOLUME(NULL, 0, 0, 0),
+       HDA_CODEC_MUTE(NULL, 0, 0, 0),
+       STAC_MONO_MUX,
+-      STAC_AMP_MUX,
+-      STAC_AMP_VOL(NULL, 0, 0, 0, 0),
+       STAC_CODEC_HP_SWITCH(NULL),
+       STAC_CODEC_IO_SWITCH(NULL, 0),
+       STAC_CODEC_CLFE_SWITCH(NULL, 0),
+@@ -3252,37 +3047,6 @@
+                               "Mono Mux", spec->mono_nid);
+ }
+-/* labels for amp mux outputs */
+-static const char *stac92xx_amp_labels[3] = {
+-      "Front Microphone", "Microphone", "Line In",
+-};
+-
+-/* create amp out controls mux on capable codecs */
+-static int stac92xx_auto_create_amp_output_ctls(struct hda_codec *codec)
+-{
+-      struct sigmatel_spec *spec = codec->spec;
+-      struct hda_input_mux *amp_mux = &spec->private_amp_mux;
+-      int i, err;
+-
+-      for (i = 0; i < spec->num_amps; i++) {
+-              amp_mux->items[amp_mux->num_items].label =
+-                                      stac92xx_amp_labels[i];
+-              amp_mux->items[amp_mux->num_items].index = i;
+-              amp_mux->num_items++;
+-      }
+-
+-      if (spec->num_amps > 1) {
+-              err = stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_MUX,
+-                      "Amp Selector Capture Switch", 0);
+-              if (err < 0)
+-                      return err;
+-      }
+-      return stac92xx_add_control(spec, STAC_CTL_WIDGET_AMP_VOL,
+-              "Amp Capture Volume",
+-              HDA_COMPOSE_AMP_VAL(spec->amp_nids[0], 3, 0, HDA_INPUT));
+-}
+-
+-
+ /* create PC beep volume controls */
+ static int stac92xx_auto_create_beep_ctls(struct hda_codec *codec,
+                                               hda_nid_t nid)
+@@ -3433,21 +3197,30 @@
+ }
+ /* create a volume assigned to the given pin (only if supported) */
++/* return 1 if the volume control is created */
+ static int create_elem_capture_vol(struct hda_codec *codec, hda_nid_t nid,
+-                                 const char *label)
++                                 const char *label, int direction)
+ {
+       unsigned int caps, nums;
+       char name[32];
++      int err;
+-      if (!(get_wcaps(codec, nid) & AC_WCAP_IN_AMP))
++      if (direction == HDA_OUTPUT)
++              caps = AC_WCAP_OUT_AMP;
++      else
++              caps = AC_WCAP_IN_AMP;
++      if (!(get_wcaps(codec, nid) & caps))
+               return 0;
+-      caps = query_amp_caps(codec, nid, HDA_OUTPUT);
++      caps = query_amp_caps(codec, nid, direction);
+       nums = (caps & AC_AMPCAP_NUM_STEPS) >> AC_AMPCAP_NUM_STEPS_SHIFT;
+       if (!nums)
+               return 0;
+       snprintf(name, sizeof(name), "%s Capture Volume", label);
+-      return stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name,
+-                                  HDA_COMPOSE_AMP_VAL(nid, 3, 0, HDA_INPUT));
++      err = stac92xx_add_control(codec->spec, STAC_CTL_WIDGET_VOL, name,
++                                  HDA_COMPOSE_AMP_VAL(nid, 3, 0, direction));
++      if (err < 0)
++              return err;
++      return 1;
+ }
+ /* create playback/capture controls for input pins on dmic capable codecs */
+@@ -3496,9 +3269,15 @@
+               else
+                       label = stac92xx_dmic_labels[dimux->num_items];
+-              err = create_elem_capture_vol(codec, nid, label);
++              err = create_elem_capture_vol(codec, nid, label, HDA_INPUT);
+               if (err < 0)
+                       return err;
++              if (!err) {
++                      err = create_elem_capture_vol(codec, nid, label,
++                                                    HDA_OUTPUT);
++                      if (err < 0)
++                              return err;
++              }
+               dimux->items[dimux->num_items].label = label;
+               dimux->items[dimux->num_items].index = index;
+@@ -3618,7 +3397,8 @@
+                       continue;
+               err = create_elem_capture_vol(codec, nid,
+-                                            auto_pin_cfg_labels[i]);
++                                            auto_pin_cfg_labels[i],
++                                            HDA_INPUT);
+               if (err < 0)
+                       return err;
+@@ -3836,11 +3616,6 @@
+               if (err < 0)
+                       return err;
+       }
+-      if (spec->num_amps > 0) {
+-              err = stac92xx_auto_create_amp_output_ctls(codec);
+-              if (err < 0)
+-                      return err;
+-      }
+       if (spec->num_dmics > 0 && !spec->dinput_mux)
+               if ((err = stac92xx_auto_create_dmic_input_ctls(codec,
+                                               &spec->autocfg)) < 0)
+@@ -3877,7 +3652,6 @@
+               spec->dinput_mux = &spec->private_dimux;
+       spec->sinput_mux = &spec->private_smux;
+       spec->mono_mux = &spec->private_mono_mux;
+-      spec->amp_mux = &spec->private_amp_mux;
+       return 1;
+ }
+@@ -4850,6 +4624,12 @@
+                                                       STAC_92HD73XX_MODELS,
+                                                       stac92hd73xx_models,
+                                                       stac92hd73xx_cfg_tbl);
++      /* check codec subsystem id if not found */
++      if (spec->board_config < 0)
++              spec->board_config =
++                      snd_hda_check_board_codec_sid_config(codec,
++                              STAC_92HD73XX_MODELS, stac92hd73xx_models,
++                              stac92hd73xx_codec_id_cfg_tbl);
+ again:
+       if (spec->board_config < 0) {
+               snd_printdd(KERN_INFO "hda_codec: Unknown model for"
+@@ -4873,20 +4653,7 @@
+                      "number of channels defaulting to DAC count\n");
+               num_dacs = STAC92HD73_DAC_COUNT;
+       }
+-      switch (num_dacs) {
+-      case 0x3: /* 6 Channel */
+-              spec->mixer = stac92hd73xx_6ch_mixer;
+-              spec->init = stac92hd73xx_6ch_core_init;
+-              break;
+-      case 0x4: /* 8 Channel */
+-              spec->mixer = stac92hd73xx_8ch_mixer;
+-              spec->init = stac92hd73xx_8ch_core_init;
+-              break;
+-      case 0x5: /* 10 Channel */
+-              spec->mixer = stac92hd73xx_10ch_mixer;
+-              spec->init = stac92hd73xx_10ch_core_init;
+-              break;
+-      }
++      spec->init = stac92hd73xx_core_init;
+       spec->multiout.dac_nids = spec->dac_nids;
+       spec->digbeep_nid = 0x1c;
+@@ -4895,8 +4662,6 @@
+       spec->dmic_nids = stac92hd73xx_dmic_nids;
+       spec->dmux_nids = stac92hd73xx_dmux_nids;
+       spec->smux_nids = stac92hd73xx_smux_nids;
+-      spec->amp_nids = stac92hd73xx_amp_nids;
+-      spec->num_amps = ARRAY_SIZE(stac92hd73xx_amp_nids);
+       spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
+       spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
+@@ -4914,13 +4679,8 @@
+       case STAC_DELL_M6_DMIC:
+       case STAC_DELL_M6_BOTH:
+               spec->num_smuxes = 0;
+-              spec->mixer = &stac92hd73xx_6ch_mixer[DELL_M6_MIXER];
+-              spec->amp_nids = &stac92hd73xx_amp_nids[DELL_M6_AMP];
+               spec->eapd_switch = 0;
+-              spec->num_amps = 1;
+-              if (spec->board_config != STAC_DELL_EQ)
+-                      spec->init = dell_m6_core_init;
+               switch (spec->board_config) {
+               case STAC_DELL_M6_AMIC: /* Analog Mics */
+                       snd_hda_codec_set_pincfg(codec, 0x0b, 0x90A70170);
+@@ -4937,6 +4697,11 @@
+                       break;
+               }
+               break;
++      case STAC_ALIENWARE_M17X:
++              spec->num_dmics = STAC92HD73XX_NUM_DMICS;
++              spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
++              spec->eapd_switch = 0;
++              break;
+       default:
+               spec->num_dmics = STAC92HD73XX_NUM_DMICS;
+               spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
similarity index 92%
rename from src/patches/suse-2.6.27.31/patches.drivers/alsa-post-ga-hda-stac-automic
rename to src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-automic
index a2cd15c5ee864f9a0272b7925cdad669dcb3d99d..880be51e1fe817e87ac5342b2800455065b34784 100644 (file)
@@ -39,7 +39,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_REF,
        STAC_9200_OQO,
        STAC_9200_DELL_D21,
-@@ -62,6 +65,7 @@
+@@ -62,6 +65,7 @@ enum {
  };
  
  enum {
@@ -47,7 +47,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_9205_REF,
        STAC_9205_DELL_M42,
        STAC_9205_DELL_M43,
-@@ -71,6 +75,7 @@
+@@ -71,6 +75,7 @@ enum {
  };
  
  enum {
@@ -55,7 +55,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_92HD73XX_NO_JD, /* no jack-detection */
        STAC_92HD73XX_REF,
        STAC_DELL_M6_AMIC,
-@@ -81,22 +86,28 @@
+@@ -81,22 +86,28 @@ enum {
  };
  
  enum {
@@ -84,7 +84,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_925x_REF,
        STAC_M1,
        STAC_M1_2,
-@@ -109,6 +120,7 @@
+@@ -109,6 +120,7 @@ enum {
  };
  
  enum {
@@ -92,7 +92,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_D945_REF,
        STAC_D945GTP3,
        STAC_D945GTP5,
-@@ -136,10 +148,12 @@
+@@ -136,10 +148,12 @@ enum {
  };
  
  enum {
@@ -105,7 +105,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        STAC_DELL_3ST,
        STAC_DELL_BIOS,
        STAC_927X_MODELS
-@@ -152,6 +166,18 @@
+@@ -152,6 +166,18 @@ struct sigmatel_event {
        int data;
  };
  
@@ -124,7 +124,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  struct sigmatel_spec {
        struct snd_kcontrol_new *mixers[4];
        unsigned int num_mixers;
-@@ -163,6 +189,7 @@
+@@ -163,6 +189,7 @@ struct sigmatel_spec {
        unsigned int hp_detect: 1;
        unsigned int spdif_mute: 1;
        unsigned int check_volume_offset:1;
@@ -132,7 +132,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        /* gpio lines */
        unsigned int eapd_mask;
-@@ -170,23 +197,22 @@
+@@ -170,23 +197,22 @@ struct sigmatel_spec {
        unsigned int gpio_dir;
        unsigned int gpio_data;
        unsigned int gpio_mute;
@@ -161,7 +161,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        /* playback */
        struct hda_input_mux *mono_mux;
-@@ -210,6 +236,15 @@
+@@ -210,6 +236,15 @@ struct sigmatel_spec {
        unsigned int num_dmuxes;
        hda_nid_t *smux_nids;
        unsigned int num_smuxes;
@@ -177,7 +177,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        const char **spdif_labels;
  
        hda_nid_t dig_in_nid;
-@@ -245,14 +280,12 @@
+@@ -245,14 +280,12 @@ struct sigmatel_spec {
        hda_nid_t line_switch;  /* shared line-in for input and output */
        hda_nid_t mic_switch;   /* shared mic-in for input and output */
        hda_nid_t hp_switch; /* NID of HP as line-out */
@@ -193,7 +193,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        struct hda_input_mux private_dimux;
        struct hda_input_mux private_imux;
        struct hda_input_mux private_smux;
-@@ -309,6 +342,13 @@
+@@ -309,6 +342,13 @@ static hda_nid_t stac92hd73xx_smux_nids[
        0x22, 0x23,
  };
  
@@ -207,7 +207,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  #define STAC92HD83XXX_NUM_DMICS       2
  static hda_nid_t stac92hd83xxx_dmic_nids[STAC92HD83XXX_NUM_DMICS + 1] = {
        0x11, 0x12, 0
-@@ -340,6 +380,13 @@
+@@ -340,6 +380,13 @@ static hda_nid_t stac92hd83xxx_amp_nids[
        0xc,
  };
  
@@ -221,7 +221,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static hda_nid_t stac92hd71bxx_pwr_nids[3] = {
        0x0a, 0x0d, 0x0f
  };
-@@ -369,6 +416,13 @@
+@@ -369,6 +416,13 @@ static hda_nid_t stac92hd71bxx_slave_dig
        0x22, 0
  };
  
@@ -235,7 +235,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static hda_nid_t stac925x_adc_nids[1] = {
          0x03,
  };
-@@ -390,6 +444,13 @@
+@@ -390,6 +444,13 @@ static hda_nid_t stac925x_dmux_nids[1] =
        0x14,
  };
  
@@ -249,7 +249,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static hda_nid_t stac922x_adc_nids[2] = {
          0x06, 0x07,
  };
-@@ -398,6 +459,17 @@
+@@ -398,6 +459,17 @@ static hda_nid_t stac922x_mux_nids[2] =
          0x12, 0x13,
  };
  
@@ -267,7 +267,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static hda_nid_t stac927x_adc_nids[3] = {
          0x07, 0x08, 0x09
  };
-@@ -423,6 +495,18 @@
+@@ -423,6 +495,18 @@ static hda_nid_t stac927x_dmic_nids[STAC
        0x13, 0x14, 0
  };
  
@@ -286,7 +286,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static const char *stac927x_spdif_labels[5] = {
        "Digital Playback", "ADAT", "Analog Mux 1",
        "Analog Mux 2", "Analog Mux 3"
-@@ -449,6 +533,16 @@
+@@ -449,6 +533,16 @@ static hda_nid_t stac9205_dmic_nids[STAC
          0x17, 0x18, 0
  };
  
@@ -303,7 +303,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static hda_nid_t stac9200_pin_nids[8] = {
        0x08, 0x09, 0x0d, 0x0e, 
        0x0f, 0x10, 0x11, 0x12,
-@@ -470,15 +564,21 @@
+@@ -470,15 +564,21 @@ static hda_nid_t stac92hd73xx_pin_nids[1
        0x14, 0x22, 0x23
  };
  
@@ -330,7 +330,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  };
  
  static hda_nid_t stac927x_pin_nids[14] = {
-@@ -521,36 +621,6 @@
+@@ -521,36 +621,6 @@ static int stac92xx_amp_volume_put(struc
        return snd_hda_mixer_amp_volume_put(kcontrol, ucontrol);
  }
  
@@ -367,7 +367,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static int stac92xx_smux_enum_info(struct snd_kcontrol *kcontrol,
                                   struct snd_ctl_elem_info *uinfo)
  {
-@@ -601,6 +671,40 @@
+@@ -601,6 +671,40 @@ static int stac92xx_smux_enum_put(struct
        return 0;
  }
  
@@ -408,7 +408,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static int stac92xx_mux_enum_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
  {
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
-@@ -623,9 +727,35 @@
+@@ -623,9 +727,35 @@ static int stac92xx_mux_enum_put(struct
        struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct sigmatel_spec *spec = codec->spec;
        unsigned int adc_idx = snd_ctl_get_ioffidx(kcontrol, &ucontrol->id);
@@ -446,7 +446,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  }
  
  static int stac92xx_mono_mux_enum_info(struct snd_kcontrol *kcontrol,
-@@ -691,60 +821,6 @@
+@@ -691,60 +821,6 @@ static int stac92xx_amp_mux_enum_put(str
                                     0, &spec->cur_amux);
  }
  
@@ -507,7 +507,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static struct hda_verb stac9200_core_init[] = {
        /* set dac0mux for dac converter */
        { 0x07, AC_VERB_SET_CONNECT_SEL, 0x00},
-@@ -840,9 +916,9 @@
+@@ -840,9 +916,9 @@ static struct hda_verb stac92hd73xx_10ch
  };
  
  static struct hda_verb stac92hd83xxx_core_init[] = {
@@ -520,7 +520,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        /* power state controls amps */
        { 0x01, AC_VERB_SET_EAPD, 1 << 2},
-@@ -852,26 +928,12 @@
+@@ -852,26 +928,12 @@ static struct hda_verb stac92hd83xxx_cor
  static struct hda_verb stac92hd71bxx_core_init[] = {
        /* set master volume and direct control */
        { 0x28, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
@@ -549,7 +549,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
        { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
        {}
-@@ -952,31 +1014,20 @@
+@@ -952,31 +1014,20 @@ static struct hda_verb stac9205_core_ini
                .private_value = HDA_COMPOSE_AMP_VAL(nid, chs, idx, dir) \
        }
  
@@ -588,7 +588,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        HDA_CODEC_VOLUME("Capture Volume", 0x0a, 0, HDA_OUTPUT),
        HDA_CODEC_MUTE("Capture Switch", 0x0a, 0, HDA_OUTPUT),
        { } /* end */
-@@ -1001,26 +1052,10 @@
+@@ -1001,26 +1052,10 @@ static struct snd_kcontrol_new stac92hd7
        HDA_CODEC_VOLUME("DAC Mixer Capture Volume", 0x1d, 0x3, HDA_INPUT),
        HDA_CODEC_MUTE("DAC Mixer Capture Switch", 0x1d, 0x3, HDA_INPUT),
  
@@ -615,7 +615,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
        HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
  
-@@ -1039,14 +1074,6 @@
+@@ -1039,14 +1074,6 @@ static struct snd_kcontrol_new stac92hd7
  };
  
  static struct snd_kcontrol_new stac92hd73xx_10ch_mixer[] = {
@@ -630,7 +630,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        HDA_CODEC_VOLUME("Front Mic Mixer Capture Volume", 0x1d, 0, HDA_INPUT),
        HDA_CODEC_MUTE("Front Mic Mixer Capture Switch", 0x1d, 0, HDA_INPUT),
  
-@@ -1066,12 +1093,6 @@
+@@ -1066,12 +1093,6 @@ static struct snd_kcontrol_new stac92hd7
  
  
  static struct snd_kcontrol_new stac92hd83xxx_mixer[] = {
@@ -643,7 +643,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        HDA_CODEC_VOLUME("DAC0 Capture Volume", 0x1b, 0x3, HDA_INPUT),
        HDA_CODEC_MUTE("DAC0 Capture Switch", 0x1b, 0x3, HDA_INPUT),
  
-@@ -1091,104 +1112,12 @@
+@@ -1091,104 +1112,12 @@ static struct snd_kcontrol_new stac92hd8
        { } /* end */
  };
  
@@ -748,7 +748,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static struct snd_kcontrol_new stac_smux_mixer = {
        .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
        .name = "IEC958 Playback Source",
-@@ -1205,10 +1134,7 @@
+@@ -1205,10 +1134,7 @@ static const char *slave_vols[] = {
        "LFE Playback Volume",
        "Side Playback Volume",
        "Headphone Playback Volume",
@@ -759,7 +759,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        NULL
  };
  
-@@ -1219,33 +1145,27 @@
+@@ -1219,33 +1145,27 @@ static const char *slave_sws[] = {
        "LFE Playback Switch",
        "Side Playback Switch",
        "Headphone Playback Switch",
@@ -800,7 +800,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                if (err < 0)
                        return err;
        }
-@@ -1301,6 +1221,8 @@
+@@ -1301,6 +1221,8 @@ static int stac92xx_build_controls(struc
                        return err;
        }
  
@@ -809,7 +809,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        return 0;       
  }
  
-@@ -1454,6 +1376,7 @@
+@@ -1454,6 +1376,7 @@ static unsigned int *stac9200_brd_tbl[ST
  };
  
  static const char *stac9200_models[STAC_9200_MODELS] = {
@@ -817,7 +817,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_REF] = "ref",
        [STAC_9200_OQO] = "oqo",
        [STAC_9200_DELL_D21] = "dell-d21",
-@@ -1471,10 +1394,16 @@
+@@ -1471,10 +1394,16 @@ static const char *stac9200_models[STAC_
        [STAC_9200_PANASONIC] = "panasonic",
  };
  
@@ -834,7 +834,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Dell laptops have BIOS problem */
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01a8,
                      "unknown Dell", STAC_9200_DELL_D21),
-@@ -1597,6 +1526,7 @@
+@@ -1597,6 +1526,7 @@ static unsigned int *stac925x_brd_tbl[ST
  };
  
  static const char *stac925x_models[STAC_925x_MODELS] = {
@@ -842,7 +842,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_REF] = "ref",
        [STAC_M1] = "m1",
        [STAC_M1_2] = "m1-2",
-@@ -1624,6 +1554,7 @@
+@@ -1624,6 +1554,7 @@ static struct snd_pci_quirk stac925x_cod
  static struct snd_pci_quirk stac925x_cfg_tbl[] = {
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668, "DFI LanParty", STAC_REF),
@@ -850,7 +850,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        SND_PCI_QUIRK(0x8384, 0x7632, "Stac9202 Reference Board", STAC_REF),
  
        /* Default table for unknown ID */
-@@ -1655,6 +1586,7 @@
+@@ -1655,6 +1586,7 @@ static unsigned int *stac92hd73xx_brd_tb
  };
  
  static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
@@ -858,7 +858,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_92HD73XX_NO_JD] = "no-jd",
        [STAC_92HD73XX_REF] = "ref",
        [STAC_DELL_M6_AMIC] = "dell-m6-amic",
-@@ -1667,6 +1599,8 @@
+@@ -1667,6 +1599,8 @@ static struct snd_pci_quirk stac92hd73xx
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
                                "DFI LanParty", STAC_92HD73XX_REF),
@@ -867,7 +867,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
                                "Dell Studio 1535", STAC_DELL_M6_DMIC),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
-@@ -1687,55 +1621,73 @@
+@@ -1687,55 +1621,73 @@ static struct snd_pci_quirk stac92hd73xx
                                "Dell Studio 1537", STAC_DELL_M6_DMIC),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x02a0,
                                "Dell Studio 17", STAC_DELL_M6_DMIC),
@@ -951,7 +951,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  };
  
  static unsigned int *stac92hd71bxx_brd_tbl[STAC_92HD71BXX_MODELS] = {
-@@ -1745,39 +1697,42 @@
+@@ -1745,39 +1697,42 @@ static unsigned int *stac92hd71bxx_brd_t
        [STAC_DELL_M4_3]        = dell_m4_3_pin_configs,
        [STAC_HP_M4]            = NULL,
        [STAC_HP_DV5]           = NULL,
@@ -1010,7 +1010,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0233,
                                "unknown Dell", STAC_DELL_M4_1),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0234,
-@@ -1929,6 +1884,7 @@
+@@ -1929,6 +1884,7 @@ static unsigned int *stac922x_brd_tbl[ST
  };
  
  static const char *stac922x_models[STAC_922X_MODELS] = {
@@ -1018,7 +1018,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_D945_REF] = "ref",
        [STAC_D945GTP5] = "5stack",
        [STAC_D945GTP3] = "3stack",
-@@ -1956,6 +1912,8 @@
+@@ -1956,6 +1912,8 @@ static struct snd_pci_quirk stac922x_cfg
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
                      "DFI LanParty", STAC_D945_REF),
@@ -1027,7 +1027,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Intel 945G based systems */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x0101,
                      "Intel D945G", STAC_D945GTP3),
-@@ -2036,31 +1994,7 @@
+@@ -2036,31 +1994,7 @@ static struct snd_pci_quirk stac922x_cfg
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
                      "Dell XPS M1210", STAC_922X_DELL_M82),
        /* ECS/PC Chips boards */
@@ -1060,7 +1060,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                      "ECS/PC chips", STAC_ECS_202),
        {} /* terminator */
  };
-@@ -2086,6 +2020,13 @@
+@@ -2086,6 +2020,13 @@ static unsigned int d965_5st_pin_configs
        0x40000100, 0x40000100
  };
  
@@ -1074,7 +1074,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static unsigned int dell_3st_pin_configs[14] = {
        0x02211230, 0x02a11220, 0x01a19040, 0x01114210,
        0x01111212, 0x01116211, 0x01813050, 0x01112214,
-@@ -2098,15 +2039,18 @@
+@@ -2098,15 +2039,18 @@ static unsigned int *stac927x_brd_tbl[ST
        [STAC_D965_REF]  = ref927x_pin_configs,
        [STAC_D965_3ST]  = d965_3st_pin_configs,
        [STAC_D965_5ST]  = d965_5st_pin_configs,
@@ -1093,7 +1093,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_DELL_3ST]         = "dell-3stack",
        [STAC_DELL_BIOS]        = "dell-bios",
  };
-@@ -2115,26 +2059,16 @@
+@@ -2115,26 +2059,16 @@ static struct snd_pci_quirk stac927x_cfg
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
                      "DFI LanParty", STAC_D965_REF),
@@ -1126,7 +1126,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Dell 3 stack systems */
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f7, "Dell XPS M1730", STAC_DELL_3ST),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01dd, "Dell Dimension E520", STAC_DELL_3ST),
-@@ -2144,21 +2078,16 @@
+@@ -2144,21 +2078,16 @@ static struct snd_pci_quirk stac927x_cfg
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x01f3, "Dell Inspiron 1420", STAC_DELL_BIOS),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x0227, "Dell Vostro 1400  ", STAC_DELL_BIOS),
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL,  0x022e, "Dell     ", STAC_DELL_BIOS),
@@ -1153,7 +1153,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        {} /* terminator */
  };
  
-@@ -2215,6 +2144,7 @@
+@@ -2215,6 +2144,7 @@ static unsigned int *stac9205_brd_tbl[ST
  };
  
  static const char *stac9205_models[STAC_9205_MODELS] = {
@@ -1161,7 +1161,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        [STAC_9205_REF] = "ref",
        [STAC_9205_DELL_M42] = "dell-m42",
        [STAC_9205_DELL_M43] = "dell-m43",
-@@ -2226,6 +2156,10 @@
+@@ -2226,6 +2156,10 @@ static struct snd_pci_quirk stac9205_cfg
        /* SigmaTel reference board */
        SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
                      "DFI LanParty", STAC_9205_REF),
@@ -1172,7 +1172,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Dell */
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01f1,
                      "unknown Dell", STAC_9205_DELL_M42),
-@@ -2258,6 +2192,7 @@
+@@ -2258,6 +2192,7 @@ static struct snd_pci_quirk stac9205_cfg
        SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0228,
                      "Dell Vostro 1500", STAC_9205_DELL_M42),
        /* Gateway */
@@ -1180,7 +1180,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        SND_PCI_QUIRK(0x107b, 0x0565, "Gateway T1616", STAC_9205_EAPD),
        {} /* terminator */
  };
-@@ -2515,10 +2450,18 @@
+@@ -2515,10 +2450,18 @@ static int stac92xx_build_pcms(struct hd
        return 0;
  }
  
@@ -1202,7 +1202,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        pincap = (pincap & AC_PINCAP_VREF) >> AC_PINCAP_VREF_SHIFT;
        if (pincap & AC_PINCAP_VREF_100)
                return AC_PINCTL_VREF_100;
-@@ -2550,8 +2493,7 @@
+@@ -2550,8 +2493,7 @@ static int stac92xx_hp_switch_get(struct
        return 0;
  }
  
@@ -1212,14 +1212,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
  static int stac92xx_hp_switch_put(struct snd_kcontrol *kcontrol,
                        struct snd_ctl_elem_value *ucontrol)
-@@ -2559,25 +2501,119 @@
-       struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
-       struct sigmatel_spec *spec = codec->spec;
-       int nid = kcontrol->private_value;
--
-+ 
-       spec->hp_switch = ucontrol->value.integer.value[0] ? nid : 0;
+@@ -2565,19 +2507,113 @@ static int stac92xx_hp_switch_put(struct
        /* check to be sure that the ports are upto date with
         * switch changes
         */
@@ -1337,7 +1330,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        return 0;
  }
  
-@@ -2585,9 +2621,9 @@
+@@ -2585,9 +2621,9 @@ static int stac92xx_io_switch_put(struct
  {
          struct hda_codec *codec = snd_kcontrol_chip(kcontrol);
        struct sigmatel_spec *spec = codec->spec;
@@ -1350,7 +1343,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec->io_switch[io_idx] = val;
  
-@@ -2596,7 +2632,7 @@
+@@ -2596,7 +2632,7 @@ static int stac92xx_io_switch_put(struct
        else {
                unsigned int pinctl = AC_PINCTL_IN_EN;
                if (io_idx) /* set VREF for mic */
@@ -1359,7 +1352,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                stac92xx_auto_set_pinctl(codec, nid, pinctl);
        }
  
-@@ -2604,7 +2640,7 @@
+@@ -2604,7 +2640,7 @@ static int stac92xx_io_switch_put(struct
         * appropriately according to the pin direction
         */
        if (spec->hp_detect)
@@ -1368,7 +1361,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
          return 1;
  }
-@@ -2677,7 +2713,8 @@
+@@ -2677,7 +2713,8 @@ enum {
        STAC_CTL_WIDGET_AMP_VOL,
        STAC_CTL_WIDGET_HP_SWITCH,
        STAC_CTL_WIDGET_IO_SWITCH,
@@ -1378,7 +1371,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  };
  
  static struct snd_kcontrol_new stac92xx_control_templates[] = {
-@@ -2689,38 +2726,42 @@
+@@ -2689,38 +2726,42 @@ static struct snd_kcontrol_new stac92xx_
        STAC_CODEC_HP_SWITCH(NULL),
        STAC_CODEC_IO_SWITCH(NULL, 0),
        STAC_CODEC_CLFE_SWITCH(NULL, 0),
@@ -1443,11 +1436,12 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        return 0;
  }
  
-@@ -2741,7 +2782,60 @@
+@@ -2741,8 +2782,61 @@ static inline int stac92xx_add_control(s
        return stac92xx_add_control_idx(spec, type, 0, name, val);
  }
  
 -/* check whether the line-input can be used as line-out */
+-static hda_nid_t check_line_out_switch(struct hda_codec *codec)
 +static struct snd_kcontrol_new stac_input_src_temp = {
 +      .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
 +      .name = "Input Source",
@@ -1502,10 +1496,11 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 +}
 +
 +/* check whether the line-input can be used as line-out */
- static hda_nid_t check_line_out_switch(struct hda_codec *codec)
++static hda_nid_t check_line_out_switch(struct hda_codec *codec)
  {
        struct sigmatel_spec *spec = codec->spec;
-@@ -2752,7 +2846,7 @@
+       struct auto_pin_cfg *cfg = &spec->autocfg;
+@@ -2752,7 +2846,7 @@ static hda_nid_t check_line_out_switch(s
        if (cfg->line_out_type != AUTO_PIN_LINE_OUT)
                return 0;
        nid = cfg->input_pins[AUTO_PIN_LINE];
@@ -1514,7 +1509,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        if (pincap & AC_PINCAP_OUT)
                return nid;
        return 0;
-@@ -2771,12 +2865,11 @@
+@@ -2771,12 +2865,11 @@ static hda_nid_t check_mic_out_switch(st
        mic_pin = AUTO_PIN_MIC;
        for (;;) {
                hda_nid_t nid = cfg->input_pins[mic_pin];
@@ -1529,7 +1524,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        if (pincap & AC_PINCAP_OUT)
                                return nid;
                }
-@@ -2824,9 +2917,8 @@
+@@ -2824,9 +2917,8 @@ static hda_nid_t get_unassigned_dac(stru
        conn_len = snd_hda_get_connections(codec, nid, conn,
                                           HDA_MAX_CONNECTIONS);
        for (j = 0; j < conn_len; j++) {
@@ -1541,7 +1536,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                /* we check only analog outputs */
                if (wtype != AC_WID_AUD_OUT || (wcaps & AC_WCAP_DIGITAL))
                        continue;
-@@ -2840,6 +2932,16 @@
+@@ -2840,6 +2932,16 @@ static hda_nid_t get_unassigned_dac(stru
                        return conn[j];
                }
        }
@@ -1558,7 +1553,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        return 0;
  }
  
-@@ -2880,6 +2982,26 @@
+@@ -2880,6 +2982,26 @@ static int stac92xx_auto_fill_dac_nids(s
                add_spec_dacs(spec, dac);
        }
  
@@ -1585,7 +1580,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* add line-in as output */
        nid = check_line_out_switch(codec);
        if (nid) {
-@@ -2907,26 +3029,6 @@
+@@ -2907,26 +3029,6 @@ static int stac92xx_auto_fill_dac_nids(s
                }
        }
  
@@ -1612,7 +1607,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        snd_printd("stac92xx: dac_nids=%d (0x%x/0x%x/0x%x/0x%x/0x%x)\n",
                   spec->multiout.num_dacs,
                   spec->multiout.dac_nids[0],
-@@ -2939,8 +3041,8 @@
+@@ -2939,8 +3041,8 @@ static int stac92xx_auto_fill_dac_nids(s
  }
  
  /* create volume control/switch for the given prefx type */
@@ -1623,7 +1618,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  {
        struct sigmatel_spec *spec = codec->spec;
        char name[32];
-@@ -2964,19 +3066,22 @@
+@@ -2964,19 +3066,22 @@ static int create_controls(struct hda_co
        }
  
        sprintf(name, "%s Playback Volume", pfx);
@@ -1648,7 +1643,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static int add_spec_dacs(struct sigmatel_spec *spec, hda_nid_t nid)
  {
        if (spec->multiout.num_dacs > 4) {
-@@ -3014,12 +3119,6 @@
+@@ -3014,12 +3119,6 @@ static int create_multi_out_ctls(struct
        static const char *chname[4] = {
                "Front", "Surround", NULL /*CLFE*/, "Side"
        };
@@ -1661,7 +1656,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        hda_nid_t nid;
        int i, err;
        unsigned int wid_caps;
-@@ -3055,18 +3154,22 @@
+@@ -3055,18 +3154,22 @@ static int create_multi_out_ctls(struct
  
                } else {
                        const char *name;
@@ -1687,7 +1682,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        if (err < 0)
                                return err;
                }
-@@ -3074,12 +3177,29 @@
+@@ -3074,12 +3177,29 @@ static int create_multi_out_ctls(struct
        return 0;
  }
  
@@ -1717,7 +1712,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        err = create_multi_out_ctls(codec, cfg->line_outs, cfg->line_out_pins,
                                    spec->multiout.dac_nids,
-@@ -3096,20 +3216,13 @@
+@@ -3096,20 +3216,13 @@ static int stac92xx_auto_create_multi_ou
                        return err;
        }
  
@@ -1745,7 +1740,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        }
  
        return 0;
-@@ -3152,7 +3265,7 @@
+@@ -3152,7 +3265,7 @@ static int stac92xx_auto_create_mono_out
                                spec->mono_nid,
                                con_lst,
                                HDA_MAX_NUM_INPUTS);
@@ -1754,7 +1749,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                return -EINVAL;
  
        for (i = 0; i < num_cons; i++) {
-@@ -3298,7 +3411,7 @@
+@@ -3298,7 +3411,7 @@ static int stac92xx_auto_create_spdif_mu
                                spec->smux_nids[0],
                                con_lst,
                                HDA_MAX_NUM_INPUTS);
@@ -1763,7 +1758,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                return -EINVAL;
  
        if (!labels)
-@@ -3319,53 +3432,66 @@
+@@ -3319,53 +3432,66 @@ static const char *stac92xx_dmic_labels[
        "Digital Mic 3", "Digital Mic 4"
  };
  
@@ -1852,7 +1847,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
                        err = stac92xx_add_control(spec,
                                STAC_CTL_WIDGET_VOL,
-@@ -3377,15 +3503,100 @@
+@@ -3377,15 +3503,100 @@ found:
                                return err;
                }
  
@@ -1955,7 +1950,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  /* create playback/capture controls for input pins */
  static int stac92xx_auto_create_analog_input_ctls(struct hda_codec *codec, const struct auto_pin_cfg *cfg)
  {
-@@ -3418,6 +3629,7 @@
+@@ -3418,6 +3629,7 @@ static int stac92xx_auto_create_analog_i
                imux->items[imux->num_items].index = index;
                imux->num_items++;
        }
@@ -1963,7 +1958,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        if (imux->num_items) {
                /*
-@@ -3469,7 +3681,7 @@
+@@ -3469,7 +3681,7 @@ static int stac92xx_parse_auto_config(st
  {
        struct sigmatel_spec *spec = codec->spec;
        int hp_swap = 0;
@@ -1972,7 +1967,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        if ((err = snd_hda_parse_pin_def_config(codec,
                                                &spec->autocfg,
-@@ -3509,11 +3721,10 @@
+@@ -3509,11 +3721,10 @@ static int stac92xx_parse_auto_config(st
                if (snd_hda_get_connections(codec,
                                spec->autocfg.mono_out_pin, conn_list, 1) &&
                                snd_hda_get_connections(codec, conn_list[0],
@@ -1986,7 +1981,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                                /* LR swap check, some stac925x have a mux that
                                 * changes the DACs output path instead of the
                                 * mono-mux path.
-@@ -3578,6 +3789,8 @@
+@@ -3578,6 +3789,8 @@ static int stac92xx_parse_auto_config(st
                err = snd_hda_attach_beep_device(codec, nid);
                if (err < 0)
                        return err;
@@ -1995,7 +1990,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                /* if no beep switch is available, make its own one */
                caps = query_amp_caps(codec, nid, HDA_OUTPUT);
                if (codec->beep &&
-@@ -3602,6 +3815,21 @@
+@@ -3602,6 +3815,21 @@ static int stac92xx_parse_auto_config(st
                spec->autocfg.line_outs = 0;
        }
  
@@ -2017,7 +2012,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        err = stac92xx_auto_create_analog_input_ctls(codec, &spec->autocfg);
        if (err < 0)
                return err;
-@@ -3631,6 +3859,10 @@
+@@ -3631,6 +3859,10 @@ static int stac92xx_parse_auto_config(st
                        return err;
        }
  
@@ -2028,7 +2023,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->multiout.max_channels = spec->multiout.num_dacs * 2;
        if (spec->multiout.max_channels > 2)
                spec->surr_switch = 1;
-@@ -3640,8 +3872,8 @@
+@@ -3640,8 +3872,8 @@ static int stac92xx_parse_auto_config(st
        if (dig_in && spec->autocfg.dig_in_pin)
                spec->dig_in_nid = dig_in;
  
@@ -2039,7 +2034,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec->input_mux = &spec->private_imux;
        if (!spec->dinput_mux)
-@@ -3698,9 +3930,7 @@
+@@ -3698,9 +3930,7 @@ static int stac9200_auto_create_lfe_ctls
                for (i = 0; i < spec->autocfg.line_outs && lfe_pin == 0x0; i++) {
                        hda_nid_t pin = spec->autocfg.line_out_pins[i];
                        unsigned int defcfg;
@@ -2050,7 +2045,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        if (get_defcfg_device(defcfg) == AC_JACK_SPEAKER) {
                                unsigned int wcaps = get_wcaps(codec, pin);
                                wcaps &= (AC_WCAP_STEREO | AC_WCAP_OUT_AMP);
-@@ -3744,13 +3974,17 @@
+@@ -3744,13 +3974,17 @@ static int stac9200_parse_auto_config(st
                        return err;
        }
  
@@ -2070,7 +2065,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec->input_mux = &spec->private_imux;
        spec->dinput_mux = &spec->private_dimux;
-@@ -3799,26 +4033,27 @@
+@@ -3799,26 +4033,27 @@ static int stac_add_event(struct sigmate
  {
        struct sigmatel_event *event;
  
@@ -2105,7 +2100,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        return event;
        }
        return NULL;
-@@ -3828,34 +4063,42 @@
+@@ -3828,34 +4063,42 @@ static struct sigmatel_event *stac_get_e
                                                      unsigned char tag)
  {
        struct sigmatel_spec *spec = codec->spec;
@@ -2158,7 +2153,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  }
  
  static int is_nid_hp_pin(struct auto_pin_cfg *cfg, hda_nid_t nid)
-@@ -3915,46 +4158,64 @@
+@@ -3915,46 +4158,64 @@ static int stac92xx_init(struct hda_code
                        hda_nid_t nid = cfg->hp_pins[i];
                        enable_pin_detect(codec, nid, STAC_HP_EVENT);
                }
@@ -2234,7 +2229,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        }
                }
        }
-@@ -3990,8 +4251,7 @@
+@@ -3990,8 +4251,7 @@ static int stac92xx_init(struct hda_code
                        stac_toggle_power_map(codec, nid, 1);
                        continue;
                }
@@ -2244,7 +2239,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                def_conf = get_defcfg_connect(def_conf);
                /* skip any ports that don't have jacks since presence
                 * detection is useless */
-@@ -4000,32 +4260,35 @@
+@@ -4000,32 +4260,35 @@ static int stac92xx_init(struct hda_code
                                stac_toggle_power_map(codec, nid, 1);
                        continue;
                }
@@ -2293,7 +2288,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        kfree(spec);
        snd_hda_detach_beep_device(codec);
-@@ -4034,7 +4297,9 @@
+@@ -4034,7 +4297,9 @@ static void stac92xx_free(struct hda_cod
  static void stac92xx_set_pinctl(struct hda_codec *codec, hda_nid_t nid,
                                unsigned int flag)
  {
@@ -2304,7 +2299,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
  
        if (pin_ctl & AC_PINCTL_IN_EN) {
-@@ -4048,14 +4313,17 @@
+@@ -4048,14 +4313,17 @@ static void stac92xx_set_pinctl(struct h
                        return;
        }
  
@@ -2325,7 +2320,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  }
  
  static void stac92xx_reset_pinctl(struct hda_codec *codec, hda_nid_t nid,
-@@ -4063,9 +4331,10 @@
+@@ -4063,9 +4331,10 @@ static void stac92xx_reset_pinctl(struct
  {
        unsigned int pin_ctl = snd_hda_codec_read(codec, nid,
                        0, AC_VERB_GET_PIN_WIDGET_CONTROL, 0x00);
@@ -2339,7 +2334,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  }
  
  static int get_pin_presence(struct hda_codec *codec, hda_nid_t nid)
-@@ -4078,6 +4347,48 @@
+@@ -4078,6 +4347,48 @@ static int get_pin_presence(struct hda_c
        return 0;
  }
  
@@ -2383,12 +2378,12 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 +                              spec->gpio_dir, spec->gpio_data |
 +                              spec->eapd_mask);
 +      }
-+} 
++}
 +
  /* return non-zero if the hp-pin of the given array index isn't
   * a jack-detection target
   */
-@@ -4130,13 +4441,6 @@
+@@ -4130,13 +4441,6 @@ static void stac92xx_hp_detect(struct hd
                for (i = 0; i < cfg->line_outs; i++)
                        stac92xx_reset_pinctl(codec, cfg->line_out_pins[i],
                                                AC_PINCTL_OUT_EN);
@@ -2402,7 +2397,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        } else {
                /* enable lineouts */
                if (spec->hp_switch)
-@@ -4145,14 +4449,8 @@
+@@ -4145,14 +4449,8 @@ static void stac92xx_hp_detect(struct hd
                for (i = 0; i < cfg->line_outs; i++)
                        stac92xx_set_pinctl(codec, cfg->line_out_pins[i],
                                                AC_PINCTL_OUT_EN);
@@ -2418,7 +2413,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* toggle hp outs */
        for (i = 0; i < cfg->hp_outs; i++) {
                unsigned int val = AC_PINCTL_OUT_EN | AC_PINCTL_HP_EN;
-@@ -4210,10 +4508,28 @@
+@@ -4210,10 +4508,28 @@ static void stac92xx_pin_sense(struct hd
        stac_toggle_power_map(codec, nid, get_pin_presence(codec, nid));
  }
  
@@ -2450,7 +2445,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        if (!event)
                return;
        codec->patch_ops.unsol_event(codec, (unsigned)event->tag << 26);
-@@ -4232,12 +4548,40 @@
+@@ -4232,12 +4548,40 @@ static void stac92xx_unsol_event(struct
  
        switch (event->type) {
        case STAC_HP_EVENT:
@@ -2492,7 +2487,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                break;
        case STAC_VREF_EVENT:
                data = snd_hda_codec_read(codec, codec->afg, 0,
-@@ -4254,17 +4598,48 @@
+@@ -4254,17 +4598,48 @@ static int stac92xx_resume(struct hda_co
  {
        struct sigmatel_spec *spec = codec->spec;
  
@@ -2544,7 +2539,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
  {
        struct sigmatel_spec *spec = codec->spec;
-@@ -4275,8 +4650,7 @@
+@@ -4275,8 +4650,7 @@ static int stac92xx_suspend(struct hda_c
        nid = codec->start_nid;
        for (i = 0; i < codec->num_nodes; i++, nid++) {
                unsigned int wcaps = get_wcaps(codec, nid);
@@ -2554,7 +2549,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                if (wid_type == AC_WID_PIN)
                        snd_hda_codec_read(codec, nid, 0,
                                AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
-@@ -4435,6 +4809,9 @@
+@@ -4435,6 +4809,9 @@ static int patch_stac925x(struct hda_cod
  
        spec->init = stac925x_core_init;
        spec->mixer = stac925x_mixer;
@@ -2564,7 +2559,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        err = stac92xx_parse_auto_config(codec, 0x8, 0x7);
        if (!err) {
-@@ -4456,16 +4833,6 @@
+@@ -4456,16 +4833,6 @@ static int patch_stac925x(struct hda_cod
        return 0;
  }
  
@@ -2581,7 +2576,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  static int patch_stac92hd73xx(struct hda_codec *codec)
  {
        struct sigmatel_spec *spec;
-@@ -4520,12 +4887,10 @@
+@@ -4520,12 +4887,10 @@ again:
        case 0x5: /* 10 Channel */
                spec->mixer = stac92hd73xx_10ch_mixer;
                spec->init = stac92hd73xx_10ch_core_init;
@@ -2595,7 +2590,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->digbeep_nid = 0x1c;
        spec->mux_nids = stac92hd73xx_mux_nids;
        spec->adc_nids = stac92hd73xx_adc_nids;
-@@ -4538,8 +4903,10 @@
+@@ -4538,8 +4903,10 @@ again:
        spec->num_muxes = ARRAY_SIZE(stac92hd73xx_mux_nids);
        spec->num_adcs = ARRAY_SIZE(stac92hd73xx_adc_nids);
        spec->num_dmuxes = ARRAY_SIZE(stac92hd73xx_dmux_nids);
@@ -2608,7 +2603,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        switch (spec->board_config) {
        case STAC_DELL_EQ:
-@@ -4558,20 +4925,17 @@
+@@ -4558,20 +4925,17 @@ again:
                        spec->init = dell_m6_core_init;
                switch (spec->board_config) {
                case STAC_DELL_M6_AMIC: /* Analog Mics */
@@ -2633,7 +2628,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                        break;
                }
                break;
-@@ -4579,13 +4943,13 @@
+@@ -4579,13 +4943,13 @@ again:
                spec->num_dmics = STAC92HD73XX_NUM_DMICS;
                spec->num_smuxes = ARRAY_SIZE(stac92hd73xx_smux_nids);
                spec->eapd_switch = 1;
@@ -2648,7 +2643,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec->num_pwrs = ARRAY_SIZE(stac92hd73xx_pwr_nids);
        spec->pwr_nids = stac92hd73xx_pwr_nids;
-@@ -4615,21 +4979,13 @@
+@@ -4615,21 +4979,13 @@ again:
        return 0;
  }
  
@@ -2671,7 +2666,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
        if (spec == NULL)
-@@ -4648,14 +5004,6 @@
+@@ -4648,14 +5004,6 @@ static int patch_stac92hd83xxx(struct hd
        spec->num_pwrs = ARRAY_SIZE(stac92hd83xxx_pwr_nids);
        spec->multiout.dac_nids = spec->dac_nids;
  
@@ -2686,7 +2681,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->init = stac92hd83xxx_core_init;
        spec->mixer = stac92hd83xxx_mixer;
        spec->num_pins = ARRAY_SIZE(stac92hd83xxx_pin_nids);
-@@ -4663,8 +5011,11 @@
+@@ -4663,8 +5011,11 @@ static int patch_stac92hd83xxx(struct hd
        spec->num_adcs = ARRAY_SIZE(stac92hd83xxx_adc_nids);
        spec->num_amps = ARRAY_SIZE(stac92hd83xxx_amp_nids);
        spec->num_dmics = STAC92HD83XXX_NUM_DMICS;
@@ -2699,7 +2694,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->board_config = snd_hda_check_board_config(codec,
                                                        STAC_92HD83XXX_MODELS,
                                                        stac92hd83xxx_models,
-@@ -4687,6 +5038,7 @@
+@@ -4687,6 +5038,7 @@ again:
        switch (codec->vendor_id) {
        case 0x111d7604:
        case 0x111d7605:
@@ -2707,7 +2702,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                if (spec->board_config == STAC_92HD83XXX_PWR_REF)
                        break;
                spec->num_pwrs = 0;
-@@ -4709,24 +5061,89 @@
+@@ -4709,24 +5061,89 @@ again:
                return err;
        }
  
@@ -2805,7 +2800,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        int err = 0;
  
        spec  = kzalloc(sizeof(*spec), GFP_KERNEL);
-@@ -4735,11 +5152,21 @@
+@@ -4735,11 +5152,21 @@ static int patch_stac92hd71bxx(struct hd
  
        codec->spec = spec;
        codec->patch_ops = stac92xx_patch_ops;
@@ -2831,7 +2826,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->board_config = snd_hda_check_board_config(codec,
                                                        STAC_92HD71BXX_MODELS,
                                                        stac92hd71bxx_models,
-@@ -4766,14 +5193,25 @@
+@@ -4766,14 +5193,25 @@ again:
                spec->gpio_data = 0x01;
        }
  
@@ -2858,7 +2853,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                break;
        case 0x111d7608: /* 5 Port with Analog Mixer */
                switch (spec->board_config) {
-@@ -4797,12 +5235,15 @@
+@@ -4797,12 +5235,15 @@ again:
  
                /* no output amps */
                spec->num_pwrs = 0;
@@ -2879,7 +2874,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                break;
        case 0x111d7603: /* 6 Port with Analog Mixer */
                if ((codec->revision_id & 0xf) == 1)
-@@ -4812,12 +5253,17 @@
+@@ -4812,12 +5253,17 @@ again:
                spec->num_pwrs = 0;
                /* fallthru */
        default:
@@ -2900,7 +2895,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Some HP machines seem to have unstable codec communications
         * especially with ATI fglrx driver.  For recovering from the
         * CORB/RIRB stall, allow the BUS reset and keep always sync
-@@ -4827,25 +5273,22 @@
+@@ -4827,25 +5273,22 @@ again:
                codec->bus->allow_bus_reset = 1;
        }
  
@@ -2929,7 +2924,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                stac92xx_auto_set_pinctl(codec, 0x0e,
                        AC_PINCTL_IN_EN | AC_PINCTL_VREF_80);
                /* fallthru */
-@@ -4860,19 +5303,42 @@
+@@ -4860,19 +5303,42 @@ again:
                spec->num_smuxes = 0;
                spec->num_dmuxes = 1;
                break;
@@ -2969,7 +2964,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 +              codec->patch_ops.check_power_status =
 +                      stac92xx_hp_check_power_status;
 +      }
-+#endif        
++#endif
  
        spec->multiout.dac_nids = spec->dac_nids;
 -      if (spec->dinput_mux)
@@ -2982,7 +2977,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        if (!err) {
                if (spec->board_config < 0) {
                        printk(KERN_WARNING "hda_codec: No auto-config is "
-@@ -4889,7 +5355,7 @@
+@@ -4889,7 +5355,7 @@ again:
        }
  
        return 0;
@@ -2991,7 +2986,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
  static int patch_stac922x(struct hda_codec *codec)
  {
-@@ -4967,7 +5433,10 @@
+@@ -4967,7 +5433,10 @@ static int patch_stac922x(struct hda_cod
        spec->num_pwrs = 0;
  
        spec->init = stac922x_core_init;
@@ -3003,7 +2998,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
        spec->multiout.dac_nids = spec->dac_nids;
        
-@@ -5008,6 +5477,7 @@
+@@ -5008,6 +5477,7 @@ static int patch_stac927x(struct hda_cod
                return -ENOMEM;
  
        codec->spec = spec;
@@ -3011,7 +3006,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->num_pins = ARRAY_SIZE(stac927x_pin_nids);
        spec->pin_nids = stac927x_pin_nids;
        spec->board_config = snd_hda_check_board_config(codec, STAC_927X_MODELS,
-@@ -5049,32 +5519,37 @@
+@@ -5049,32 +5519,37 @@ static int patch_stac927x(struct hda_cod
                spec->num_dmics = 0;
  
                spec->init = d965_core_init;
@@ -3056,7 +3051,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
                spec->dmux_nids = stac927x_dmux_nids;
                spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
                break;
-@@ -5087,12 +5562,13 @@
+@@ -5087,12 +5562,13 @@ static int patch_stac927x(struct hda_cod
                spec->num_dmics = 0;
  
                spec->init = stac927x_core_init;
@@ -3073,7 +3068,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        spec->eapd_switch = 1;
  
        err = stac92xx_parse_auto_config(codec, 0x1e, 0x20);
-@@ -5174,10 +5650,11 @@
+@@ -5174,10 +5650,11 @@ static int patch_stac9205(struct hda_cod
        spec->num_pwrs = 0;
  
        spec->init = stac9205_core_init;
@@ -3088,7 +3083,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        /* Turn on/off EAPD per HP plugging */
        if (spec->board_config != STAC_9205_EAPD)
                spec->eapd_switch = 1;
-@@ -5186,8 +5663,8 @@
+@@ -5186,8 +5663,8 @@ static int patch_stac9205(struct hda_cod
        switch (spec->board_config){
        case STAC_9205_DELL_M43:
                /* Enable SPDIF in/out */
@@ -3099,7 +3094,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
  
                /* Enable unsol response for GPIO4/Dock HP connection */
                err = stac_add_event(spec, codec->afg, STAC_VREF_EVENT, 0x01);
-@@ -5521,6 +5998,7 @@
+@@ -5521,6 +5998,7 @@ struct hda_codec_preset snd_hda_preset_s
        { .id = 0x83847661, .name = "CXD9872RD/K", .patch = patch_stac9872 },
        { .id = 0x83847662, .name = "STAC9872AK", .patch = patch_stac9872 },
        { .id = 0x83847664, .name = "CXD9872AKD", .patch = patch_stac9872 },
@@ -3107,7 +3102,7 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
        { .id = 0x838476a0, .name = "STAC9205", .patch = patch_stac9205 },
        { .id = 0x838476a1, .name = "STAC9205D", .patch = patch_stac9205 },
        { .id = 0x838476a2, .name = "STAC9204", .patch = patch_stac9205 },
-@@ -5532,6 +6010,7 @@
+@@ -5532,6 +6010,7 @@ struct hda_codec_preset snd_hda_preset_s
        { .id = 0x111d7603, .name = "92HD75B3X5", .patch = patch_stac92hd71bxx},
        { .id = 0x111d7604, .name = "92HD83C1X5", .patch = patch_stac92hd83xxx},
        { .id = 0x111d7605, .name = "92HD81B1X5", .patch = patch_stac92hd83xxx},
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-automic-fix b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-automic-fix
new file mode 100644 (file)
index 0000000..072d759
--- /dev/null
@@ -0,0 +1,75 @@
+From 02d3332285377c9de395c2b5b792805d43923fd0 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Thu, 1 Oct 2009 16:38:11 +0200
+Subject: ALSA: hda - Fix digita/analog mic auto-switching with IDT codecs
+Patch-mainline: 2.6.32-rc1
+References: bnc#511306
+
+When the auto-mic switching between an analog and a digital mic is
+needed with IDT codecs, the current driver doesn't reset the connection
+of the digital mux.
+
+This patch fixes the behavior by checking both mux connections properly.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |   20 ++++++++++++++------
+ 1 file changed, 14 insertions(+), 6 deletions(-)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -176,8 +176,8 @@
+ struct sigmatel_mic_route {
+       hda_nid_t pin;
+-      unsigned char mux_idx;
+-      unsigned char dmux_idx;
++      signed char mux_idx;
++      signed char dmux_idx;
+ };
+ struct sigmatel_spec {
+@@ -3326,18 +3326,26 @@
+                       break;
+       if (i <= AUTO_PIN_FRONT_MIC) {
+               /* analog pin */
+-              mic->dmux_idx = 0;
+               i = get_connection_index(codec, spec->mux_nids[0], pin);
+               if (i < 0)
+                       return -1;
+               mic->mux_idx = i;
++              mic->dmux_idx = -1;
++              if (spec->dmux_nids)
++                      mic->dmux_idx = get_connection_index(codec,
++                                                           spec->dmux_nids[0],
++                                                           spec->mux_nids[0]);
+       }  else if (spec->dmux_nids) {
+               /* digital pin */
+-              mic->mux_idx = 0;
+               i = get_connection_index(codec, spec->dmux_nids[0], pin);
+               if (i < 0)
+                       return -1;
+               mic->dmux_idx = i;
++              mic->mux_idx = -1;
++              if (spec->mux_nids)
++                      mic->mux_idx = get_connection_index(codec,
++                                                          spec->mux_nids[0],
++                                                          spec->dmux_nids[0]);
+       }
+       return 0;
+ }
+@@ -4290,11 +4298,11 @@
+               mic = &spec->ext_mic;
+       else
+               mic = &spec->int_mic;
+-      if (mic->dmux_idx)
++      if (mic->dmux_idx >= 0)
+               snd_hda_codec_write_cache(codec, spec->dmux_nids[0], 0,
+                                         AC_VERB_SET_CONNECT_SEL,
+                                         mic->dmux_idx);
+-      else
++      if (mic->mux_idx >= 0)
+               snd_hda_codec_write_cache(codec, spec->mux_nids[0], 0,
+                                         AC_VERB_SET_CONNECT_SEL,
+                                         mic->mux_idx);
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-shutup-at-free b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac-shutup-at-free
new file mode 100644 (file)
index 0000000..beb0362
--- /dev/null
@@ -0,0 +1,80 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: hda - Reset pins of IDT/STAC codecs at free
+Patch-mainline: 
+References: bnc#544779
+
+Some laptops cause annoying clicks or noises at shutdown/reboot since
+the speaker pin is set still high.  Apply the same procedure used for
+the suspend to avoid such clicks/noises for freeing the codec, too.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |   42 +++++++++++++++++++++++------------------
+ 1 file changed, 24 insertions(+), 18 deletions(-)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -4058,6 +4058,28 @@
+       snd_array_free(&spec->kctls);
+ }
++static void stac92xx_shutup(struct hda_codec *codec)
++{
++      struct sigmatel_spec *spec = codec->spec;
++      int i;
++      hda_nid_t nid;
++
++      /* reset each pin before powering down DAC/ADC to avoid click noise */
++      nid = codec->start_nid;
++      for (i = 0; i < codec->num_nodes; i++, nid++) {
++              unsigned int wcaps = get_wcaps(codec, nid);
++              unsigned int wid_type = get_wcaps_type(wcaps);
++              if (wid_type == AC_WID_PIN)
++                      snd_hda_codec_read(codec, nid, 0,
++                              AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
++      }
++
++      if (spec->eapd_mask)
++              stac_gpio_set(codec, spec->gpio_mask,
++                              spec->gpio_dir, spec->gpio_data &
++                              ~spec->eapd_mask);
++}
++
+ static void stac92xx_free(struct hda_codec *codec)
+ {
+       struct sigmatel_spec *spec = codec->spec;
+@@ -4065,6 +4087,7 @@
+       if (! spec)
+               return;
++      stac92xx_shutup(codec);
+       snd_array_free(&spec->events);
+       kfree(spec);
+@@ -4424,24 +4447,7 @@
+ static int stac92xx_suspend(struct hda_codec *codec, pm_message_t state)
+ {
+-      struct sigmatel_spec *spec = codec->spec;
+-      int i;
+-      hda_nid_t nid;
+-
+-      /* reset each pin before powering down DAC/ADC to avoid click noise */
+-      nid = codec->start_nid;
+-      for (i = 0; i < codec->num_nodes; i++, nid++) {
+-              unsigned int wcaps = get_wcaps(codec, nid);
+-              unsigned int wid_type = get_wcaps_type(wcaps);
+-              if (wid_type == AC_WID_PIN)
+-                      snd_hda_codec_read(codec, nid, 0,
+-                              AC_VERB_SET_PIN_WIDGET_CONTROL, 0);
+-      }
+-
+-      if (spec->eapd_mask)
+-              stac_gpio_set(codec, spec->gpio_mask,
+-                              spec->gpio_dir, spec->gpio_data &
+-                              ~spec->eapd_mask);
++      stac92xx_shutup(codec);
+       return 0;
+ }
+ #endif
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-dell-volknob-fix b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-dell-volknob-fix
new file mode 100644 (file)
index 0000000..b482f56
--- /dev/null
@@ -0,0 +1,47 @@
+From ccca7cdc1b8dd2e7b67e9289a6abf117b11cbe6b Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Tue, 13 Oct 2009 15:32:21 +0200
+Subject: ALSA: hda - Fix volume-knob setup for Dell laptops with STAC9228
+Patch-mainline: 
+References: bnc#545013
+
+The volume-knob widget needs to be set with 0x7f instead of 0xff
+for Dell laptops with STAC9228 codec, too, like the previous commit.
+
+Reference: Novell bnc#545013
+       http://bugzilla.novell.com/show_bug.cgi?id=545013
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |   12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -814,6 +814,16 @@
+       {}
+ };
++static struct hda_verb dell_3st_core_init[] = {
++      /* don't set delta bit */
++      {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
++      /* unmute node 0x1b */
++      {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, 0xb000},
++      /* select node 0x03 as DAC */
++      {0x0b, AC_VERB_SET_CONNECT_SEL, 0x01},
++      {}
++};
++
+ static struct hda_verb stac927x_core_init[] = {
+       /* set master volume and direct control */      
+       { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+@@ -5342,7 +5352,7 @@
+               spec->dmic_nids = stac927x_dmic_nids;
+               spec->num_dmics = STAC927X_NUM_DMICS;
+-              spec->init = d965_core_init;
++              spec->init = dell_3st_core_init;
+               spec->dmux_nids = stac927x_dmux_nids;
+               spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
+               break;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-fsc-fix b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac927x-fsc-fix
new file mode 100644 (file)
index 0000000..658a3c1
--- /dev/null
@@ -0,0 +1,95 @@
+From 54930531a00af5a1c33361a02e67dd1802110465 Mon Sep 17 00:00:00 2001
+From: Takashi Iwai <tiwai@suse.de>
+Date: Sun, 11 Oct 2009 17:38:29 +0200
+Subject: ALSA: hda - Fix mute sound with STAC9227/9228 codecs
+Patch-mainline: 
+References: bnc#546006
+
+On FSC laptops, the sound gets muted gradually when the volume is chnaged.
+This is due to the wrong volume-knob widget setup.  The delta bit (bit 7)
+shouldn't be set for these devices.
+
+This patch adds a new quirk to set the value 0x7f to the widget 0x24
+instead of 0xff.
+
+Reference: Novell bnc#546006
+        http://bugzilla.novell.com/show_bug.cgi?id=546006
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ Documentation/sound/alsa/ALSA-Configuration.txt |    1 +
+ sound/pci/hda/patch_sigmatel.c                  |   17 +++++++++++++++++
+ 2 files changed, 18 insertions(+)
+
+--- a/Documentation/sound/alsa/ALSA-Configuration.txt
++++ b/Documentation/sound/alsa/ALSA-Configuration.txt
+@@ -1075,6 +1075,7 @@
+         5stack        D965 5stack + SPDIF
+         dell-3stack   Dell Dimension E520
+         dell-bios     Fixes with Dell BIOS setup
++        volknob       Fixes with volume-knob widget 0x24
+       STAC92HD71B*
+         ref           Reference board
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -158,6 +158,7 @@
+       STAC_D965_5ST_NO_FP,
+       STAC_DELL_3ST,
+       STAC_DELL_BIOS,
++      STAC_927X_VOLKNOB,
+       STAC_927X_MODELS
+ };
+@@ -821,6 +822,14 @@
+       {}
+ };
++static struct hda_verb stac927x_volknob_core_init[] = {
++      /* don't set delta bit */
++      {0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0x7f},
++      /* enable analog pc beep path */
++      {0x01, AC_VERB_SET_DIGI_CONVERT_2, 1 << 5},
++      {}
++};
++
+ static struct hda_verb stac9205_core_init[] = {
+       /* set master volume and direct control */      
+       { 0x24, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+@@ -1812,6 +1821,7 @@
+       [STAC_D965_5ST_NO_FP]  = d965_5st_no_fp_pin_configs,
+       [STAC_DELL_3ST]  = dell_3st_pin_configs,
+       [STAC_DELL_BIOS] = NULL,
++      [STAC_927X_VOLKNOB] = NULL,
+ };
+ static const char *stac927x_models[STAC_927X_MODELS] = {
+@@ -1823,6 +1833,7 @@
+       [STAC_D965_5ST_NO_FP]   = "5stack-no-fp",
+       [STAC_DELL_3ST]         = "dell-3stack",
+       [STAC_DELL_BIOS]        = "dell-bios",
++      [STAC_927X_VOLKNOB]     = "volknob",
+ };
+ static struct snd_pci_quirk stac927x_cfg_tbl[] = {
+@@ -1858,6 +1869,8 @@
+                          "Intel D965", STAC_D965_5ST),
+       SND_PCI_QUIRK_MASK(PCI_VENDOR_ID_INTEL, 0xff00, 0x2500,
+                          "Intel D965", STAC_D965_5ST),
++      /* volume-knob fixes */
++      SND_PCI_QUIRK_VENDOR(0x10cf, "FSC", STAC_927X_VOLKNOB),
+       {} /* terminator */
+ };
+@@ -5333,6 +5346,10 @@
+               spec->dmux_nids = stac927x_dmux_nids;
+               spec->num_dmuxes = ARRAY_SIZE(stac927x_dmux_nids);
+               break;
++      case STAC_927X_VOLKNOB:
++              spec->num_dmics = 0;
++              spec->init = stac927x_volknob_core_init;
++              break;
+       default:
+               spec->num_dmics = 0;
+               spec->init = stac927x_core_init;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac9872-inputsrc-fix b/src/patches/suse-2.6.27.39/patches.drivers/alsa-post-ga-hda-stac9872-inputsrc-fix
new file mode 100644 (file)
index 0000000..550905c
--- /dev/null
@@ -0,0 +1,32 @@
+From: Takashi Iwai <tiwai@suse.de>
+Subject: ALSA: Fix Oops with STAC9872 codec
+Patch-mainline: 
+References: bnc#535497
+
+Fix Oops with STAC9872 codec due to the missing initialization of
+spec->num_analog_muxes.
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+---
+ sound/pci/hda/patch_sigmatel.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -5925,6 +5925,7 @@
+               spec->adc_nids = vaio_adcs;
+               spec->num_pwrs = 0;
+               spec->input_mux = &vaio_mux;
++              spec->num_analog_muxes = vaio_mux.num_items;
+               spec->mux_nids = vaio_mux_nids;
+               codec->patch_ops = stac9872_vaio_patch_ops;
+               break;
+@@ -5940,6 +5941,7 @@
+               spec->num_pwrs = 0;
+               spec->adc_nids = vaio_adcs;
+               spec->input_mux = &vaio_mux;
++              spec->num_analog_muxes = vaio_mux.num_items;
+               spec->mux_nids = vaio_mux_nids;
+               codec->patch_ops = stac9872_patch_ops;
+               break;
similarity index 90%
rename from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i-fix-skb-overrun
rename to src/patches/suse-2.6.27.39/patches.drivers/cxgb3i-fix-skb-overrun
index 84498c5619afb5b2031d39d3fc14ce4aaec836bd..b723f69207fb86864a0fc944f50ec2a6cab05e48 100644 (file)
@@ -10,9 +10,18 @@ Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com>
 Acked-by: Hannes Reinecke <hare@suse.de>
 ---
 
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i.h
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h        2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i.h        2009-01-26 22:00:17.000000000 -0800
+---
+ drivers/scsi/cxgb3i/cxgb3i.h         |  148 ++++++++++++++
+ drivers/scsi/cxgb3i/cxgb3i_init.c    |    4 
+ drivers/scsi/cxgb3i/cxgb3i_iscsi.c   |  138 ++++++-------
+ drivers/scsi/cxgb3i/cxgb3i_offload.c |  126 +++++++++---
+ drivers/scsi/cxgb3i/cxgb3i_offload.h |    6 
+ drivers/scsi/cxgb3i/cxgb3i_ulp2.c    |  353 ++++++++++++++++++++++++-----------
+ drivers/scsi/cxgb3i/cxgb3i_ulp2.h    |    4 
+ 7 files changed, 553 insertions(+), 226 deletions(-)
+
+--- a/drivers/scsi/cxgb3i/cxgb3i.h
++++ b/drivers/scsi/cxgb3i/cxgb3i.h
 @@ -36,6 +36,12 @@
  #define CXGB3I_MAX_TARGET     CXGB3I_MAX_CONN
  #define CXGB3I_MAX_LUN                512
@@ -26,7 +35,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.
  
  struct cxgb3i_adapter;
  struct cxgb3i_hba;
-@@ -53,12 +59,11 @@
+@@ -53,12 +59,11 @@ struct cxgb3i_endpoint;
   *
   */
  struct cxgb3i_tag_format {
@@ -41,7 +50,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.
  };
  
  /**
-@@ -95,11 +100,137 @@
+@@ -95,11 +100,137 @@ struct cxgb3i_ddp_info {
        unsigned int ulimit;
        unsigned int nppods;
        unsigned int idx_last;
@@ -179,7 +188,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.
  /**
   * struct cxgb3i_hba - cxgb3i iscsi structure (per port)
   *
-@@ -146,16 +277,22 @@
+@@ -146,16 +277,22 @@ struct cxgb3i_adapter {
   * struct cxgb3i_conn - cxgb3i iscsi connection
   *
   * @tcp_conn: pointer to iscsi_tcp_conn structure
@@ -203,7 +212,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.
  };
  
  /**
-@@ -190,8 +327,7 @@
+@@ -190,8 +327,7 @@ void cxgb3i_hba_host_remove(struct cxgb3
  int cxgb3i_ulp2_init(void);
  void cxgb3i_ulp2_cleanup(void);
  int cxgb3i_conn_ulp_setup(struct cxgb3i_conn *, int, int);
@@ -213,9 +222,8 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i.h linux-2.6.27.11-1.
  u32 cxgb3i_ddp_tag_reserve(struct cxgb3i_adapter *, unsigned int,
                           u32, unsigned int, struct scatterlist *,
                           unsigned int, int);
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_init.c linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_init.c
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_init.c   2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_init.c   2009-01-26 22:00:17.000000000 -0800
+--- a/drivers/scsi/cxgb3i/cxgb3i_init.c
++++ b/drivers/scsi/cxgb3i/cxgb3i_init.c
 @@ -11,8 +11,8 @@
  
  #include "cxgb3i.h"
@@ -227,9 +235,8 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_init.c linux-2.6.27.
  #define DRV_MODULE_RELDATE    "Jun. 1, 2008"
  
  static char version[] =
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c  2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_iscsi.c  2009-01-26 22:00:17.000000000 -0800
+--- a/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
++++ b/drivers/scsi/cxgb3i/cxgb3i_iscsi.c
 @@ -36,10 +36,10 @@
  #define cxgb3i_api_debug(fmt...)
  #endif
@@ -245,7 +252,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  
  static struct scsi_transport_template *cxgb3i_scsi_transport;
  static struct scsi_host_template cxgb3i_host_template;
-@@ -102,7 +102,7 @@
+@@ -102,7 +102,7 @@ void cxgb3i_adapter_remove(struct t3cdev
        struct cxgb3i_adapter *snic;
  
        /* remove from the list */
@@ -254,7 +261,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
        list_for_each_entry(snic, &cxgb3i_snic_list, list_head) {
                if (snic->tdev == t3dev) {
                        list_del(&snic->list_head);
-@@ -295,6 +295,8 @@
+@@ -295,6 +295,8 @@ static void cxgb3i_ep_disconnect(struct
                 * stop the xmit path so the xmit_segment function is
                 * not being called
                 */
@@ -263,7 +270,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
                write_lock_bh(&cep->c3cn->callback_lock);
                set_bit(ISCSI_SUSPEND_BIT, &cconn->conn->suspend_rx);
                cep->c3cn->user_data = NULL;
-@@ -391,20 +393,17 @@
+@@ -391,20 +393,17 @@ static void cxgb3i_session_destroy(struc
  static inline int cxgb3i_conn_max_xmit_dlength(struct iscsi_conn *conn)
  {
        struct cxgb3i_conn *cconn = conn->dd_data;
@@ -290,7 +297,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  
        cxgb3i_api_debug("conn 0x%p, set max xmit %u.\n",
                         conn, conn->max_xmit_dlength);
-@@ -415,14 +414,10 @@
+@@ -415,14 +414,10 @@ static inline int cxgb3i_conn_max_xmit_d
  static inline int cxgb3i_conn_max_recv_dlength(struct iscsi_conn *conn)
  {
        struct cxgb3i_conn *cconn = conn->dd_data;
@@ -309,7 +316,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  
        if (conn->max_recv_dlength) {
                if (conn->max_recv_dlength > max) {
-@@ -433,9 +428,9 @@
+@@ -433,9 +428,9 @@ static inline int cxgb3i_conn_max_recv_d
                }
                conn->max_recv_dlength = min_t(unsigned int,
                                                conn->max_recv_dlength, max);
@@ -320,7 +327,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  
        cxgb3i_api_debug("conn 0x%p, set max recv %u.\n",
                         conn, conn->max_recv_dlength);
-@@ -516,12 +511,14 @@
+@@ -516,12 +511,14 @@ static int cxgb3i_conn_bind(struct iscsi
  
        cep = ep->dd_data;
        c3cn = cep->c3cn;
@@ -337,7 +344,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  
        cconn->hba = cep->hba;
        cconn->cep = cep;
-@@ -609,11 +606,13 @@
+@@ -609,11 +606,13 @@ static int cxgb3i_conn_set_param(struct
                        return -ENOMEM;
        case ISCSI_PARAM_MAX_RECV_DLENGTH:
                err = iscsi_set_param(cls_conn, param, buf, buflen);
@@ -353,7 +360,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
                break;
        default:
                return iscsi_set_param(cls_conn, param, buf, buflen);
-@@ -718,49 +717,23 @@
+@@ -718,49 +717,23 @@ static void cxgb3i_conn_get_stats(struct
        stats->custom[0].value = conn->eh_abort_cnt;
  }
  
@@ -410,7 +417,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  }
  
  static int cxgb3i_reserve_itt(struct iscsi_task *task, itt_t *hdr_itt)
-@@ -771,26 +744,40 @@
+@@ -771,26 +744,40 @@ static int cxgb3i_reserve_itt(struct isc
        struct cxgb3i_conn *cconn = conn->dd_data;
        struct iscsi_tcp_conn *tcp_conn = &cconn->tcp_conn;
        struct cxgb3i_adapter *snic = cconn->hba->snic;
@@ -460,7 +467,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
        return 0;
  }
  
-@@ -800,14 +787,15 @@
+@@ -800,14 +787,15 @@ static void cxgb3i_release_itt(struct is
        struct iscsi_conn *conn = task->conn;
        struct cxgb3i_conn *cconn = conn->dd_data;
        struct cxgb3i_adapter *snic = cconn->hba->snic;
@@ -481,7 +488,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
  }
  
  /**
-@@ -820,7 +808,7 @@
+@@ -820,7 +808,7 @@ static struct scsi_host_template cxgb3i_
        .proc_name = "cxgb3i",
        .queuecommand = iscsi_queuecommand,
        .change_queue_depth = iscsi_change_queue_depth,
@@ -490,9 +497,8 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_iscsi.c linux-2.6.27
        .sg_tablesize = SG_ALL,
        .max_sectors = 0xFFFF,
        .cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_offload.c
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c        2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_offload.c        2009-01-26 22:00:17.000000000 -0800
+--- a/drivers/scsi/cxgb3i/cxgb3i_offload.c
++++ b/drivers/scsi/cxgb3i/cxgb3i_offload.c
 @@ -22,19 +22,19 @@
  #include "cxgb3i_ulp2.h"
  
@@ -528,7 +534,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  
  static int cxgb3_snd_win = 64 * 1024;
  module_param(cxgb3_snd_win, int, 0644);
-@@ -456,12 +456,9 @@
+@@ -456,12 +456,9 @@ static unsigned int wrlen __read_mostly;
   * The number of WRs needed for an skb depends on the number of fragments
   * in the skb and whether it has any payload in its main body.  This maps the
   * length of the gather list represented by an skb into the # of necessary WRs.
@@ -543,7 +549,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  static unsigned int skb_wrs[SKB_WR_LIST_SIZE] __read_mostly;
  
  static void s3_init_wr_tab(unsigned int wr_len)
-@@ -484,7 +481,7 @@
+@@ -484,7 +481,7 @@ static void s3_init_wr_tab(unsigned int
  
  static inline void reset_wr_list(struct s3_conn *c3cn)
  {
@@ -552,7 +558,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  }
  
  /*
-@@ -495,7 +492,7 @@
+@@ -495,7 +492,7 @@ static inline void reset_wr_list(struct
  static inline void enqueue_wr(struct s3_conn *c3cn,
                              struct sk_buff *skb)
  {
@@ -561,7 +567,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  
        /*
         * We want to take an extra reference since both us and the driver
-@@ -508,10 +505,22 @@
+@@ -508,10 +505,22 @@ static inline void enqueue_wr(struct s3_
        if (!c3cn->wr_pending_head)
                c3cn->wr_pending_head = skb;
        else
@@ -585,7 +591,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  static inline struct sk_buff *peek_wr(const struct s3_conn *c3cn)
  {
        return c3cn->wr_pending_head;
-@@ -528,8 +537,8 @@
+@@ -528,8 +537,8 @@ static inline struct sk_buff *dequeue_wr
  
        if (likely(skb)) {
                /* Don't bother clearing the tail */
@@ -596,7 +602,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
        }
        return skb;
  }
-@@ -542,13 +551,15 @@
+@@ -542,13 +551,15 @@ static void purge_wr_queue(struct s3_con
  }
  
  static inline void make_tx_data_wr(struct s3_conn *c3cn, struct sk_buff *skb,
@@ -614,7 +620,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
        req->wr_lo = htonl(V_WR_TID(c3cn->tid));
        req->sndseq = htonl(c3cn->snd_nxt);
        /* len includes the length of any HW ULP additions */
-@@ -556,11 +567,11 @@
+@@ -556,11 +567,11 @@ static inline void make_tx_data_wr(struc
        req->param = htonl(V_TX_PORT(c3cn->l2t->smt_idx));
        /* V_TX_ULP_SUBMODE sets both the mode and submode */
        req->flags = htonl(V_TX_ULP_SUBMODE(skb_ulp_mode(skb)) |
@@ -629,7 +635,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
                /* Sendbuffer is in units of 32KB. */
                req->param |= htonl(V_TX_SNDBUF(cxgb3_snd_win >> 15));
                c3cn_set_flag(c3cn, C3CN_TX_DATA_SENT);
-@@ -591,7 +602,7 @@
+@@ -591,7 +602,7 @@ static int c3cn_push_tx_frames(struct s3
  
        if (unlikely(c3cn->state == C3CN_STATE_CONNECTING ||
                     c3cn->state == C3CN_STATE_CLOSE_WAIT_1 ||
@@ -638,7 +644,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
                c3cn_tx_debug("c3cn 0x%p, in closing state %u.\n",
                              c3cn, c3cn->state);
                return 0;
-@@ -626,19 +637,22 @@
+@@ -626,19 +637,22 @@ static int c3cn_push_tx_frames(struct s3
                c3cn->wr_unacked += wrs_needed;
                enqueue_wr(c3cn, skb);
  
@@ -671,7 +677,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
                        CXGB3_SKB_CB(skb)->flags &= ~C3CB_FLAG_NEED_HDR;
                }
  
-@@ -1153,12 +1167,28 @@
+@@ -1153,12 +1167,28 @@ static int do_iscsi_hdr(struct t3cdev *t
   * Process an acknowledgment of WR completion.  Advance snd_una and send the
   * next batch of work requests from the write queue.
   */
@@ -700,7 +706,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
        c3cn->wr_avail += credits;
        if (c3cn->wr_unacked > c3cn->wr_max - c3cn->wr_avail)
                c3cn->wr_unacked = c3cn->wr_max - c3cn->wr_avail;
-@@ -1173,6 +1203,17 @@
+@@ -1173,6 +1203,17 @@ static void process_wr_ack(struct s3_con
                        break;
                }
                if (unlikely(credits < p->csum)) {
@@ -718,7 +724,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
                        p->csum -= credits;
                        break;
                } else {
-@@ -1182,8 +1223,14 @@
+@@ -1182,8 +1223,14 @@ static void process_wr_ack(struct s3_con
                }
        }
  
@@ -734,7 +740,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  
        if (c3cn->snd_una != snd_una) {
                c3cn->snd_una = snd_una;
-@@ -1454,11 +1501,14 @@
+@@ -1454,11 +1501,14 @@ static void init_offload_conn(struct s3_
                              struct dst_entry *dst)
  {
        BUG_ON(c3cn->cdev != cdev);
@@ -750,7 +756,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
  }
  
  static int initiate_act_open(struct s3_conn *c3cn, struct net_device *dev)
-@@ -1673,9 +1723,17 @@
+@@ -1673,9 +1723,17 @@ int cxgb3i_c3cn_send_pdus(struct s3_conn
                goto out_err;
        }
  
@@ -769,10 +775,9 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.c linux-2.6.
                goto out_err;
        }
  
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_offload.h
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.h        2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_offload.h        2009-01-26 22:00:17.000000000 -0800
-@@ -180,7 +180,7 @@
+--- a/drivers/scsi/cxgb3i/cxgb3i_offload.h
++++ b/drivers/scsi/cxgb3i/cxgb3i_offload.h
+@@ -180,7 +180,7 @@ void cxgb3i_c3cn_release(struct s3_conn
   * @seq:      tcp sequence number
   * @ddigest:  pdu data digest
   * @pdulen:   recovered pdu length
@@ -781,7 +786,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.
   */
  struct cxgb3_skb_cb {
        __u8 flags;
-@@ -188,7 +188,7 @@
+@@ -188,7 +188,7 @@ struct cxgb3_skb_cb {
        __u32 seq;
        __u32 ddigest;
        __u32 pdulen;
@@ -790,7 +795,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.
  };
  
  #define CXGB3_SKB_CB(skb)     ((struct cxgb3_skb_cb *)&((skb)->cb[0]))
-@@ -196,7 +196,7 @@
+@@ -196,7 +196,7 @@ struct cxgb3_skb_cb {
  #define skb_ulp_mode(skb)     (CXGB3_SKB_CB(skb)->ulp_mode)
  #define skb_ulp_ddigest(skb)  (CXGB3_SKB_CB(skb)->ddigest)
  #define skb_ulp_pdulen(skb)   (CXGB3_SKB_CB(skb)->pdulen)
@@ -799,10 +804,9 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_offload.h linux-2.6.
  
  enum c3cb_flags {
        C3CB_FLAG_NEED_HDR = 1 << 0,    /* packet needs a TX_DATA_WR header */
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_ulp2.c
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c   2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_ulp2.c   2009-01-26 22:00:17.000000000 -0800
-@@ -51,6 +51,7 @@
+--- a/drivers/scsi/cxgb3i/cxgb3i_ulp2.c
++++ b/drivers/scsi/cxgb3i/cxgb3i_ulp2.c
+@@ -51,6 +51,7 @@ static unsigned char ddp_page_shift[ULP2
  static unsigned char sw_tag_idx_bits;
  static unsigned char sw_tag_age_bits;
  static unsigned char page_idx = ULP2_PGIDX_MAX;
@@ -810,7 +814,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  
  static void cxgb3i_ddp_page_init(void)
  {
-@@ -59,6 +60,10 @@
+@@ -59,6 +60,10 @@ static void cxgb3i_ddp_page_init(void)
        sw_tag_idx_bits = (__ilog2_u32(ISCSI_ITT_MASK)) + 1;
        sw_tag_age_bits = (__ilog2_u32(ISCSI_AGE_MASK)) + 1;
  
@@ -821,7 +825,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        for (i = 0; i < ULP2_PGIDX_MAX; i++) {
                if (PAGE_SIZE == (1UL << ddp_page_shift[i])) {
                        page_idx = i;
-@@ -312,7 +317,6 @@
+@@ -312,7 +317,6 @@ u32 cxgb3i_ddp_tag_reserve(struct cxgb3i
                                 page_idx, sgcnt, xferlen, ULP2_DDP_THRESHOLD);
                return RESERVED_ITT;
        }
@@ -829,7 +833,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  
        gl = ddp_make_gl(xferlen, sgl, sgcnt, gfp);
        if (!gl) {
-@@ -322,9 +326,9 @@
+@@ -322,9 +326,9 @@ u32 cxgb3i_ddp_tag_reserve(struct cxgb3i
        }
  
        npods = (gl->nelem + PPOD_PAGES_MAX - 1) >> PPOD_PAGES_SHIFT;
@@ -841,13 +845,11 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
                idx = ddp_find_unused_entries(ddp, 0, idx_max, npods, gl);
        else {
                idx = ddp_find_unused_entries(ddp, ddp->idx_last + 1, idx_max,
-@@ -345,12 +349,13 @@
+@@ -346,11 +350,12 @@ u32 cxgb3i_ddp_tag_reserve(struct cxgb3i
        if (ddp_gl_map(snic->pdev, gl) < 0)
                goto unmap_sgl;
--      
 -      tag = sw_tag | (idx << snic->tag_format.rsvd_shift);
-+
 +      tag = cxgb3i_ddp_tag_base(&snic->tag_format, sw_tag);
 +      tag |= idx << PPOD_IDX_SHIFT;
  
@@ -858,7 +860,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        hdr.maxoffset = htonl(xferlen);
        hdr.pgoffset = htonl(gl->offset);
  
-@@ -372,30 +377,35 @@
+@@ -372,30 +377,35 @@ free_gl:
        return RESERVED_ITT;
  }
  
@@ -904,7 +906,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  }
  
  int cxgb3i_conn_ulp_setup(struct cxgb3i_conn *cconn, int hcrc, int dcrc)
-@@ -403,12 +413,18 @@
+@@ -403,12 +413,18 @@ int cxgb3i_conn_ulp_setup(struct cxgb3i_
        struct iscsi_tcp_conn *tcp_conn = cconn->conn->dd_data;
        struct s3_conn *c3cn = (struct s3_conn *)(tcp_conn->sock);
        struct sk_buff *skb = alloc_skb(sizeof(struct cpl_set_tcb_field),
@@ -924,7 +926,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  
        /* set up ulp submode and page size */
        req = (struct cpl_set_tcb_field *)skb_put(skb, sizeof(*req));
-@@ -476,14 +492,14 @@
+@@ -476,14 +492,14 @@ static int cxgb3i_conn_read_pdu_skb(stru
                                   (skb_ulp_mode(skb) & ULP2_FLAG_DCRC_ERROR)) ?
                    ISCSI_SEGMENT_DGST_ERR : 0;
                if (skb_ulp_mode(skb) & ULP2_FLAG_DATA_DDPED) {
@@ -945,7 +947,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
                                         skb, hdr->opcode & ISCSI_OPCODE_MASK,
                                         tcp_conn->in.datalen, hdr->itt);
                        offset += sizeof(struct cpl_iscsi_hdr_norss);
-@@ -520,24 +536,141 @@
+@@ -520,24 +536,141 @@ static inline void tx_skb_setmode(struct
        skb_ulp_mode(skb) = (ULP_MODE_ISCSI << 4) | submode;
  }
  
@@ -1094,7 +1096,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  
        /* supports max. 16K pdus, so one skb is enough to hold all the data */
        skb = alloc_skb(TX_HEADER_LEN + copylen, GFP_ATOMIC);
-@@ -575,70 +708,84 @@
+@@ -575,70 +708,84 @@ int cxgb3i_conn_ulp2_xmit(struct iscsi_c
                        skb->data_len += datalen;
                        skb->truesize += datalen;
                }
@@ -1222,7 +1224,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
                iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
                return err;
        }
-@@ -652,6 +799,9 @@
+@@ -652,6 +799,9 @@ int cxgb3i_ulp2_init(void)
                return -ENOMEM;
        memset(page_address(pad_page), 0, PAGE_SIZE);
        cxgb3i_ddp_page_init();
@@ -1232,7 +1234,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        return 0;
  }
  
-@@ -720,7 +870,7 @@
+@@ -720,7 +870,7 @@ void cxgb3i_conn_closing(struct s3_conn
  
        read_lock(&c3cn->callback_lock);
        conn = c3cn->user_data;
@@ -1241,7 +1243,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
                iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
        read_unlock(&c3cn->callback_lock);
  }
-@@ -730,7 +880,7 @@
+@@ -730,7 +880,7 @@ int cxgb3i_adapter_ulp_init(struct cxgb3
        struct t3cdev *tdev = snic->tdev;
        struct cxgb3i_ddp_info *ddp;
        struct ulp_iscsi_info uinfo;
@@ -1250,7 +1252,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        int i, err;
  
        err = tdev->ctl(tdev, ULP_ISCSI_GET_PARAMS, &uinfo);
-@@ -740,26 +890,21 @@
+@@ -740,26 +890,21 @@ int cxgb3i_adapter_ulp_init(struct cxgb3
                return err;
        }
  
@@ -1287,7 +1289,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
  
        ddp = cxgb3i_alloc_big_mem(sizeof(struct cxgb3i_ddp_info) +
                                   ppmax *
-@@ -779,12 +924,15 @@
+@@ -779,12 +924,15 @@ int cxgb3i_adapter_ulp_init(struct cxgb3
        spin_lock_init(&ddp->map_lock);
        ddp->llimit = uinfo.llimit;
        ddp->ulimit = uinfo.ulimit;
@@ -1306,7 +1308,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        uinfo.ulimit = uinfo.llimit + (ppmax << PPOD_SIZE_SHIFT);
  
        err = tdev->ctl(tdev, ULP_ISCSI_SET_PARAMS, &uinfo);
-@@ -794,19 +942,20 @@
+@@ -794,19 +942,20 @@ int cxgb3i_adapter_ulp_init(struct cxgb3
                goto free_ppod_map;
        }
  
@@ -1337,9 +1339,8 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.
        return 0;
  
  free_ppod_map:
-diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.h linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_ulp2.h
---- linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.h   2009-01-14 15:17:57.000000000 -0800
-+++ linux-2.6.27.11-1.chng/drivers/scsi/cxgb3i/cxgb3i_ulp2.h   2009-01-26 22:00:17.000000000 -0800
+--- a/drivers/scsi/cxgb3i/cxgb3i_ulp2.h
++++ b/drivers/scsi/cxgb3i/cxgb3i_ulp2.h
 @@ -13,7 +13,6 @@
  #ifndef __CXGB3I_ULP2_H__
  #define __CXGB3I_ULP2_H__
@@ -1348,7 +1349,7 @@ diff -uNr linux-2.6.27.11-1.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.h linux-2.6.27.
  #define PPOD_PAGES_MAX                4
  #define PPOD_PAGES_SHIFT      2       /* 4 pages per pod */
  
-@@ -100,9 +99,6 @@
+@@ -100,9 +99,6 @@ struct cpl_rx_data_ddp_norss {
  #define ULP2_FLAG_DCRC_ERROR          0x20
  #define ULP2_FLAG_PAD_ERROR           0x40
  
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.drivers/cxgb3i_ddp.patch
rename to src/patches/suse-2.6.27.39/patches.drivers/cxgb3i_ddp.patch
index 46a30835efa7af678b71b7cc46119435ad0fba56..08139b5f459cc2c8b24e809667b79256fd7208c4 100644 (file)
@@ -45,8 +45,8 @@ diff -uNr linux-2.6.27.7-4.orig/Documentation/scsi/cxgb3i.txt linux-2.6.27.7-4.n
 +      iface.ipaddress = <iscsi ip address>
 +
 +   * iface.ipaddress is optional, <iscsi ip address> can be either the same as
-+      the ethX's ip address or an address on the same subnet. Make sure the
-+      address is unique in the network.
++      the ethX's ip address or an address on the same subnet. Make sure the
++      address is unique in the network.
 +
 +2. edit /etc/iscsi/iscsid.conf
 +   The default setting for MaxRecvDataSegmentLength (131072) is too big, search
@@ -57,7 +57,7 @@ diff -uNr linux-2.6.27.7-4.orig/Documentation/scsi/cxgb3i.txt linux-2.6.27.7-4.n
 +      node.conn[0].iscsi.MaxRecvDataSegmentLength = 8192
 +
 +3. Load the cxgb3i driver: "modprobe cxgb3i"
-+   
++
 +   * in the case of recompiling the kernel, the cxgb3i selection is located at
 +      Device Drivers
 +              SCSI device support --->
@@ -260,15 +260,6 @@ diff -uNr linux-2.6.27.7-4.orig/drivers/scsi/cxgb3i/cxgb3i_ulp2.c linux-2.6.27.7
        }
  
        if (ddp_alloc_gl_skb(ddp, idx, npods, gfp) < 0)
-@@ -341,7 +344,7 @@
-       if (ddp_gl_map(snic->pdev, gl) < 0)
-               goto unmap_sgl;
--
-+      
-       tag = sw_tag | (idx << snic->tag_format.rsvd_shift);
-       hdr.rsvd = 0;
 @@ -363,6 +366,8 @@
        ddp_free_gl_skb(ddp, idx, npods);
  unmark_entries:
@@ -375,11 +375,11 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 +
 +        Enable a module:
 +
-+              $echo "set enabled=1 <module_name>" > dynamic_printk/modules
++              $echo "set enabled=1 <module_name>" > dynamic_printk/modules
 +
 +        Disable a module:
 +
-+              $echo "set enabled=0 <module_name>" > dynamic_printk/modules
++              $echo "set enabled=0 <module_name>" > dynamic_printk/modules
 +
 +        Enable all modules:
 +
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/e1000-return-pci_ers_result_disconnect-on-permanent-error.patch b/src/patches/suse-2.6.27.39/patches.drivers/e1000-return-pci_ers_result_disconnect-on-permanent-error.patch
new file mode 100644 (file)
index 0000000..8335a6c
--- /dev/null
@@ -0,0 +1,39 @@
+From eab633021c26025b34f36f79f0311d3d99f40ceb Mon Sep 17 00:00:00 2001
+From: Andre Detsch <adetsch@br.ibm.com>
+Date: Tue, 30 Jun 2009 12:46:13 +0000
+Subject: [PATCH] e1000: return PCI_ERS_RESULT_DISCONNECT on permanent error
+References: bnc#534961
+Patch-mainline: v2.6.31-rc1-50-geab6330
+
+PCI drivers that implement the io_error_detected callback
+should return PCI_ERS_RESULT_DISCONNECT if the state
+passed in is pci_channel_io_perm_failure.  This state is
+not checked in many of the network drivers.
+
+The patch fixes the omission in the e1000 driver.
+
+Based on Mike Mason's similar patch for e1000e.
+
+Signed-off-by: Andre Detsch <adetsch@br.ibm.com>
+CC: Mike Mason <mmlnx@us.ibm.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Brandon Philips <bphilips@suse.de>
+---
+ drivers/net/e1000/e1000_main.c |    3 +++
+ 1 file changed, 3 insertions(+)
+
+Index: linux-2.6.27-SLE11_BRANCH/drivers/net/e1000/e1000_main.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/net/e1000/e1000_main.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/net/e1000/e1000_main.c
+@@ -5170,6 +5170,9 @@ static pci_ers_result_t e1000_io_error_d
+       netif_device_detach(netdev);
++      if (state == pci_channel_io_perm_failure)
++              return PCI_ERS_RESULT_DISCONNECT;
++
+       if (netif_running(netdev))
+               e1000_down(adapter);
+       pci_disable_device(pdev);
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/e1000e-io_error_detected-callback-should-return-PCI_.patch b/src/patches/suse-2.6.27.39/patches.drivers/e1000e-io_error_detected-callback-should-return-PCI_.patch
new file mode 100644 (file)
index 0000000..f773c97
--- /dev/null
@@ -0,0 +1,41 @@
+From c93b5a76d58656158d195a7df507ebc660010969 Mon Sep 17 00:00:00 2001
+From: Mike Mason <mmlnx@us.ibm.com>
+Date: Tue, 30 Jun 2009 12:45:53 +0000
+Subject: [PATCH] e1000e: io_error_detected callback should return PCI_ERS_RESULT_DISCONNECT
+References: bnc#534977
+Patch-mainline: v2.6.31-rc1-51-gc93b5a7
+
+on permanent failure
+
+PCI drivers that implement the io_error_detected callback
+should return PCI_ERS_RESULT_DISCONNECT if the state
+passed in is pci_channel_io_perm_failure.  This state is not
+checked in many of the network drivers.
+
+This patch fixes the omission in the e1000e driver.
+
+Signed-off-by: Mike Mason <mmlnx@us.ibm.com>
+Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Brandon Philips <bphilips@suse.de>
+---
+ drivers/net/e1000e/netdev.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index 679885a..63415bb 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -4785,6 +4785,9 @@ static pci_ers_result_t e1000_io_error_detected(struct pci_dev *pdev,
+       netif_device_detach(netdev);
++      if (state == pci_channel_io_perm_failure)
++              return PCI_ERS_RESULT_DISCONNECT;
++
+       if (netif_running(netdev))
+               e1000e_down(adapter);
+       pci_disable_device(pdev);
+-- 
+1.6.3.3
+
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/intel-hp-newchips-nokms b/src/patches/suse-2.6.27.39/patches.drivers/intel-hp-newchips-nokms
new file mode 100644 (file)
index 0000000..de20e3b
--- /dev/null
@@ -0,0 +1,109 @@
+From: Matthias Hopf <mhopf@suse.de>
+Subject: Support new Intel graphic chips for HP laptops
+Patch-mainline: 
+References: bnc#544759
+
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+
+--- a/drivers/char/agp/intel-agp.c.orig        2009-08-16 12:08:52.000000000 +0200
++++ b/drivers/char/agp/intel-agp.c     2009-10-08 12:27:15.000000000 +0200
+@@ -26,6 +26,10 @@
+ #define PCI_DEVICE_ID_INTEL_82965GME_IG     0x2A12
+ #define PCI_DEVICE_ID_INTEL_82945GME_HB     0x27AC
+ #define PCI_DEVICE_ID_INTEL_82945GME_IG     0x27AE
++#define PCI_DEVICE_ID_INTEL_IGDGM_HB        0xA010
++#define PCI_DEVICE_ID_INTEL_IGDGM_IG        0xA011
++#define PCI_DEVICE_ID_INTEL_IGDG_HB         0xA000
++#define PCI_DEVICE_ID_INTEL_IGDG_IG         0xA001
+ #define PCI_DEVICE_ID_INTEL_G33_HB          0x29C0
+ #define PCI_DEVICE_ID_INTEL_G33_IG          0x29C2
+ #define PCI_DEVICE_ID_INTEL_Q35_HB          0x29B0
+@@ -60,7 +64,12 @@
+ #define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
+-              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q33_HB)
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q33_HB || \
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDGM_HB || \
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDG_HB)
++
++#define IS_IGD (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDGM_HB || \
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGDG_HB)
+ #define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_E_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
+@@ -520,7 +529,7 @@
+                       size = 512;
+               }
+               size += 4; /* add in BIOS popup space */
+-      } else if (IS_G33) {
++      } else if (IS_G33 && !IS_IGD) {
+       /* G33's GTT size defined in gmch_ctrl */
+               switch (gmch_ctrl & G33_PGETBL_SIZE_MASK) {
+               case G33_PGETBL_SIZE_1M:
+@@ -536,7 +545,7 @@
+                       size = 512;
+               }
+               size += 4;
+-      } else if (IS_G4X) {
++      } else if (IS_G4X || IS_IGD) {
+               /* On 4 series hardware, GTT stolen is separate from graphics
+                * stolen, ignore it in stolen gtt entries counting.  However,
+                * 4KB of the stolen memory doesn't get mapped to the GTT.
+@@ -2150,6 +2159,10 @@
+               NULL, &intel_g33_driver },
+       { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33",
+               NULL, &intel_g33_driver },
++      { PCI_DEVICE_ID_INTEL_IGDGM_HB, PCI_DEVICE_ID_INTEL_IGDGM_IG, 0, "IGD",
++              NULL, &intel_g33_driver },
++      { PCI_DEVICE_ID_INTEL_IGDG_HB, PCI_DEVICE_ID_INTEL_IGDG_IG, 0, "IGD",
++              NULL, &intel_g33_driver },
+       { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0,
+           "Mobile Intel® GM45 Express", NULL, &intel_i965_driver },
+       { PCI_DEVICE_ID_INTEL_IGD_E_HB, PCI_DEVICE_ID_INTEL_IGD_E_IG, 0,
+@@ -2344,6 +2357,8 @@
+       ID(PCI_DEVICE_ID_INTEL_82945G_HB),
+       ID(PCI_DEVICE_ID_INTEL_82945GM_HB),
+       ID(PCI_DEVICE_ID_INTEL_82945GME_HB),
++      ID(PCI_DEVICE_ID_INTEL_IGDGM_HB),
++      ID(PCI_DEVICE_ID_INTEL_IGDG_HB),
+       ID(PCI_DEVICE_ID_INTEL_82946GZ_HB),
+       ID(PCI_DEVICE_ID_INTEL_82G35_HB),
+       ID(PCI_DEVICE_ID_INTEL_82965Q_HB),
+--- a/drivers/gpu/drm/i915/i915_drv.h.orig     2009-08-16 12:08:43.000000000 +0200
++++ b/drivers/gpu/drm/i915/i915_drv.h  2009-10-08 12:35:45.000000000 +0200
+@@ -1127,15 +1127,23 @@
+                    (dev)->pci_device == 0x2E22 || \
+                    (dev)->pci_device == 0x2E32)
++#define IS_IGDG(dev) ((dev)->pci_device == 0xa001)
++#define IS_IGDGM(dev) ((dev)->pci_device == 0xa011)
++#define IS_IGD(dev) (IS_IGDG(dev) || IS_IGDGM(dev))
++
+ #define IS_G33(dev)    ((dev)->pci_device == 0x29C2 ||        \
+                       (dev)->pci_device == 0x29B2 ||  \
+-                      (dev)->pci_device == 0x29D2)
++                      (dev)->pci_device == 0x29D2 ||  \
++                      (IS_IGD(dev)))
++
+ #define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \
+                     IS_I945GM(dev) || IS_I965G(dev) || IS_G33(dev))
+ #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \
+-                      IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev))
++                      IS_I945GM(dev) || IS_I965GM(dev) || IS_IGD_GM(dev) || \
++                      IS_IGD(dev))
++
+ #define I915_NEED_GFX_HWS(dev) (IS_G33(dev) || IS_IGD_GM(dev) || IS_G4X(dev))
+--- a/include/drm/drm_pciids.h.orig    2009-08-16 12:08:43.000000000 +0200
++++ b/include/drm/drm_pciids.h 2009-10-08 12:37:35.000000000 +0200
+@@ -413,4 +413,6 @@
+       {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++      {0x8086, 0xa001, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++      {0x8086, 0xa011, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0, 0, 0}
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.drivers/ixgbe-dcb-setstate.patch
rename to src/patches/suse-2.6.27.39/patches.drivers/ixgbe-dcb-setstate.patch
index b8c3b3c701cf2ebdc2468a38d75ed8e21a3ae2e5..9bbc1f6dc76cbf6ab369c3cfe9866818ef17f746 100644 (file)
@@ -48,7 +48,7 @@ diff -Naurp linux-2.6.27.7-4/drivers/net/ixgbe/ixgbe_dcb_nl.c linux-2.6.27.7-4-n
 -                      adapter->rx_ring = NULL;
 -                      netdev->select_queue = &ixgbe_dcb_select_queue;
 +                      return 0;
-+              } 
++              }
  
 -                      adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
 -                      adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
@@ -60,7 +60,7 @@ diff -Naurp linux-2.6.27.7-4/drivers/net/ixgbe/ixgbe_dcb_nl.c linux-2.6.27.7-4-n
 +              if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
 +                      DPRINTK(DRV, ERR, "Enable Failed, needs MSI-X\n");
 +                      return 1;
-+              } 
++              }
 +
 +              if (netif_running(netdev))
 +                      netdev->stop(netdev);
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-aspire-3810t-noncq b/src/patches/suse-2.6.27.39/patches.drivers/libata-ahci-aspire-3810t-noncq
new file mode 100644 (file)
index 0000000..2653302
--- /dev/null
@@ -0,0 +1,68 @@
+From: Tejun Heo <teheo@suse.de>
+Subject: ahci: disable NCQ on Aspire 3810t
+References: bnc#522790
+
+Aspire 3810t issues SATA feature enable commands via _GTF without
+coordinating with the host controller side leading to NCQ command
+failures.  Proper fix is to filter those _GTF commands but the
+necessary change is too pervasive.  Disable NCQ on Aspire 3810t
+instead.
+
+Proper fix is upstream in 2.6.32.
+
+Signed-off-by: Tejun Heo <teheo@suse.de>
+---
+ drivers/ata/ahci.c |   33 +++++++++++++++++++++++++++++++++
+ 1 file changed, 33 insertions(+)
+
+Index: linux-2.6.27-SLE11_BRANCH/drivers/ata/ahci.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/ata/ahci.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/ata/ahci.c
+@@ -2544,6 +2544,37 @@ static void ahci_p5wdh_workaround(struct
+       }
+ }
++static void ahci_aspire_3810t_workaround(struct ata_host *host)
++{
++      static const struct dmi_system_id sysids[] = {
++              /*
++               * Aspire 3810T issues a bunch of SATA enable commands
++               * via _GTF including an invalid one and one which is
++               * rejected by the device.  Among the successful ones
++               * is FPDMA non-zero offset enable which when enabled
++               * only on the drive side leads to NCQ command
++               * failures.  Disable NCQ.
++               */
++              {
++                      .ident = "Aspire 3810T",
++                      .matches = {
++                              DMI_MATCH(DMI_SYS_VENDOR, "Acer"),
++                              DMI_MATCH(DMI_PRODUCT_NAME, "Aspire 3810T"),
++                      },
++              },
++              { }
++      };
++      int i;
++
++      if (dmi_check_system(sysids)) {
++              dev_printk(KERN_INFO, host->dev,
++                         "Aspire 3810T detected, disabling NCQ\n");
++
++              for (i = 0; i < host->n_ports; i++)
++                      host->ports[i]->flags &= ~ATA_FLAG_NCQ;
++      }
++}
++
+ static bool ahci_broken_system_poweroff(struct pci_dev *pdev)
+ {
+       static const struct dmi_system_id broken_systems[] = {
+@@ -2710,6 +2741,8 @@ static int ahci_init_one(struct pci_dev
+       /* apply workaround for ASUS P5W DH Deluxe mainboard */
+       ahci_p5wdh_workaround(host);
++      ahci_aspire_3810t_workaround(host);
++
+       /* initialize adapter */
+       rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
+       if (rc)
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.drivers/mpt-fusion-4.00.43.00-update
rename to src/patches/suse-2.6.27.39/patches.drivers/mpt-fusion-4.00.43.00-update
index 139298f2db9bd1e18bc07a104ce7afb511aa09ee..e2d32202a3a6cb571ff858ff20cbbd71ca2532fb 100644 (file)
@@ -4148,7 +4148,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (copy_to_user(uarg, pKarg, copy_buffer_sz)) {
 +              printk(KERN_ERR "%s@%d::%s() - "
 +                     "Unable to write out csmi_sas_get_raid_config @ %p\n",
-+                         __FILE__, __LINE__, __FUNCTION__, uarg);
++                         __FILE__, __LINE__, __FUNCTION__, uarg);
 +              free_pages((unsigned long)pKarg, memory_pages);
 +              return -EFAULT;
 +      }
@@ -5462,7 +5462,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
 +      cfg.pageAddr = (bus << 8) + id
 +          + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
-+              MPI_SAS_DEVICE_PGAD_FORM_SHIFT);
++              MPI_SAS_DEVICE_PGAD_FORM_SHIFT);
 +
 +      if ((rc = mpt_config(ioc, &cfg)) != 0) {
 +              rc=-1;
@@ -10381,7 +10381,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 -              dexitprintk(ioc, printk(MYIOC_s_INFO_FMT "free  @ %p, sz=%d bytes\n",
 -                  ioc->name, ioc->alloc, ioc->alloc_sz));
 +              dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "free  @ %p, sz=%d bytes\n",
-+                      ioc->name, ioc->alloc, ioc->alloc_sz));
++                      ioc->name, ioc->alloc, ioc->alloc_sz));
                pci_free_consistent(ioc->pcidev, sz,
                                ioc->alloc, ioc->alloc_dma);
                ioc->reply_frames = NULL;
@@ -14942,7 +14942,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
        if (numfrags > maxfrags) {
                ret = -EMLINK;
 -              goto fwdl_out;
-+              goto fwdl_out;
++              goto fwdl_out;
        }
  
        dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
@@ -19195,9 +19195,9 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +                      starget_printk(KERN_INFO, starget, MYIOC_s_FMT
 +                      "delete device: fw_channel %d, fw_id %d, phy %d, "
 +                      "sas_addr 0x%llx\n", ioc->name,
-+                      p->phy_info[i].attached.channel,
++                      p->phy_info[i].attached.channel,
 +                      p->phy_info[i].attached.id,
-+                      p->phy_info[i].attached.phy_id, (unsigned long long)
++                      p->phy_info[i].attached.phy_id, (unsigned long long)
 +                      p->phy_info[i].attached.sas_address);
 +
 +                      mptsas_port_delete(ioc, p->phy_info[i].port_details);
@@ -20884,7 +20884,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!phy_info->port_details) {
 +              dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
 +                      "%s: fw_id=%d exit at line=%d\n", ioc->name,
-+                      __FUNCTION__, fw_id, __LINE__));
++                      __FUNCTION__, fw_id, __LINE__));
 +              return;
        }
 -
@@ -20895,7 +20895,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!rphy) {
 +              dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
 +                      "%s: fw_id=%d exit at line=%d\n", ioc->name,
-+                      __FUNCTION__, fw_id, __LINE__));
++                      __FUNCTION__, fw_id, __LINE__));
 +              return;
 +      }
 +      if (phy_info->attached.device_info &
@@ -20921,7 +20921,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!port) {
 +              dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
 +                      "%s: fw_id=%d exit at line=%d\n", ioc->name,
-+                      __FUNCTION__, fw_id, __LINE__));
++                      __FUNCTION__, fw_id, __LINE__));
 +              return;
 +      }
 +      port_info = phy_info->portinfo;
@@ -21209,7 +21209,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +                  (hot_plug_info->channel << 8) + hot_plug_info->id)) {
 +                      dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
 +                      "%s: fw_id=%d exit at line=%d\n", ioc->name,
-+                              __FUNCTION__, hot_plug_info->id, __LINE__));
++                      __FUNCTION__, hot_plug_info->id, __LINE__));
 +                      break;
 +              }
  
@@ -21225,7 +21225,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +              if (!phy_info){
 +                      dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
 +                              "%s: fw_id=%d exit at line=%d\n", ioc->name,
-+                              __FUNCTION__, hot_plug_info->id, __LINE__));
++                              __FUNCTION__, hot_plug_info->id, __LINE__));
 +                      break;
 +              }
  
@@ -22708,7 +22708,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +                                         depth);
 +                              else if (depth < 0)
 +                                      sdev_printk(KERN_INFO, sdev,
-+                                      "Tagged Command Queueing is being "
++                                      "Tagged Command Queueing is being "
 +                                      "disabled\n");
 +                              else if (depth == 0)
 +                                      sdev_printk(KERN_INFO, sdev,
@@ -27716,7 +27716,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
-+              __FUNCTION__));
++              __FUNCTION__));
 +      buffer_type = karg.data.BufferType;
 +      if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
 +              printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for "
@@ -27761,7 +27761,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +                          " FAILED, (request_sz=%d)\n", ioc->name,
 +                          __FUNCTION__, request_data_sz);
 +                      mpt_free_msg_frame(ioc, mf);
-+                      return -EAGAIN;
++                      return -EAGAIN;
 +              }
 +              ioc->DiagBuffer[buffer_type] = request_data;
 +              ioc->DiagBuffer_sz[buffer_type] = request_data_sz;
@@ -27769,7 +27769,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      ioc->DiagBuffer_Status[buffer_type] = 0;
-+      diag_buffer_post_request = (DiagBufferPostRequest_t *)mf;
++      diag_buffer_post_request = (DiagBufferPostRequest_t *)mf;
 +      diag_buffer_post_request->Function = MPI_FUNCTION_DIAG_BUFFER_POST;
 +      diag_buffer_post_request->ChainOffset = 0;
 +      diag_buffer_post_request->BufferType = karg.data.BufferType;
@@ -27811,7 +27811,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
 +              rc = -ETIME;
 +              printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
-+                  __FUNCTION__);
++                      __FUNCTION__);
 +              if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
 +                      mpt_free_msg_frame(ioc, mf);
 +                      goto out;
@@ -27896,7 +27896,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
-+              __FUNCTION__));
++              __FUNCTION__));
 +      buffer_type = karg.data.UniqueId & 0x000000ff;
 +      if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
 +              printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for "
@@ -27905,7 +27905,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      if ((ioc->DiagBuffer_Status[buffer_type] &
-+              MPT_DIAG_BUFFER_IS_REGISTERED) == 0 ) {
++              MPT_DIAG_BUFFER_IS_REGISTERED) == 0 ) {
 +              printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not "
 +                  "registered\n", ioc->name, __FUNCTION__, buffer_type);
 +              return -EFAULT;
@@ -27955,7 +27955,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
 +              rc = -ETIME;
 +              printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
-+                  __FUNCTION__);
++                      __FUNCTION__);
 +              if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
 +                      mpt_free_msg_frame(ioc, mf);
 +                      goto out;
@@ -28111,7 +28111,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
-+              __FUNCTION__));
++              __FUNCTION__));
 +      buffer_type = karg.data.BufferType;
 +      if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
 +              printk(MYIOC_s_DEBUG_FMT "%s: doesn't have Capability for "
@@ -28120,7 +28120,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      }
 +
 +      if ((ioc->DiagBuffer_Status[buffer_type] &
-+              MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
++              MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
 +              printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not "
 +                  "registered\n", ioc->name, __FUNCTION__, buffer_type);
 +              goto out;
@@ -28301,7 +28301,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 +      if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
 +              rc = -ETIME;
 +              printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
-+                  __FUNCTION__);
++                      __FUNCTION__);
 +              if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
 +                      mpt_free_msg_frame(ioc, mf);
 +                      goto out;
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.drivers/mpt-fusion-4.16.00.00-update
rename to src/patches/suse-2.6.27.39/patches.drivers/mpt-fusion-4.16.00.00-update
index 4179cb02a1adc254f0db831c9316dcb7329a04eb..546c4525fefa30c3aa8763306b5e3a32c43a7429 100644 (file)
@@ -8,10 +8,28 @@ Update the mpt fusion driver to internal version 4.16.00.00.
 Signed-off-by: Satya Prakash <sathya.prakash@lsi.com>
 Acked-by: Hannes Reinecke <hare@suse.de>
 
-Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/csmi/csmisas.c
-+++ linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
+---
+ drivers/message/fusion/csmi/csmisas.c                | 1392 +++++++++----------
+ drivers/message/fusion/csmi/csmisas.h                |  551 ++-----
+ drivers/message/fusion/lsi/mpi_cnfg.h                |    3 
+ drivers/message/fusion/lsi/mpi_log_sas.h             |   12 
+ drivers/message/fusion/lsi/mpi_type.h                |   14 
+ drivers/message/fusion/mptbase.c                     |  689 +++++----
+ drivers/message/fusion/mptbase.h                     |   67 
+ drivers/message/fusion/mptctl.c                      |  240 +--
+ drivers/message/fusion/mptfc.c                       |   41 
+ drivers/message/fusion/mptlan.c                      |   26 
+ drivers/message/fusion/mptsas.c                      |  479 ++++--
+ drivers/message/fusion/mptsas.h                      |    9 
+ drivers/message/fusion/mptscsih.c                    |  223 +--
+ drivers/message/fusion/mptscsih.h                    |    6 
+ drivers/message/fusion/mptspi.c                      |   27 
+ drivers/message/fusion/rejected_ioctls/diag_buffer.c |  170 +-
+ drivers/message/fusion/rejected_ioctls/diag_buffer.h |   18 
+ 17 files changed, 2052 insertions(+), 1915 deletions(-)
+
+--- a/drivers/message/fusion/csmi/csmisas.c
++++ b/drivers/message/fusion/csmi/csmisas.c
 @@ -43,16 +43,13 @@
  */
  /*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -241,7 +259,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
  {
        int rc;
        unsigned long timeleft;
-@@ -384,42 +360,13 @@ csmisas_send_handshake_wait(MPT_ADAPTER 
+@@ -384,42 +360,13 @@ csmisas_send_handshake_wait(MPT_ADAPTER
        rc = 0;
        timeleft = 0;
  
@@ -287,7 +305,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                mpt_clear_taskmgmt_in_progress_flag(ioc);
                if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
                        mpt_free_msg_frame(ioc, mf);
-@@ -429,7 +376,6 @@ csmisas_send_handshake_wait(MPT_ADAPTER 
+@@ -429,7 +376,6 @@ csmisas_send_handshake_wait(MPT_ADAPTER
                if (!timeleft)
                        mptctl_timeout_expired(ioc, mf);
        }
@@ -2152,7 +2170,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
        return 0;
  }
  
-@@ -3090,30 +3098,30 @@ csmisas_firmware_download(unsigned long 
+@@ -3090,30 +3098,30 @@ csmisas_firmware_download(unsigned long
        CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER        karg;
        MPT_ADAPTER                     *ioc = NULL;
        int                             iocnum;
@@ -2189,7 +2207,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
  
        /* Default to success.*/
        karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_SUCCESS;
-@@ -3130,7 +3138,7 @@ csmisas_firmware_download(unsigned long 
+@@ -3130,7 +3138,7 @@ csmisas_firmware_download(unsigned long
                goto cim_firmware_download_exit;
        }
  
@@ -2198,7 +2216,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
            (CSMI_SAS_FWD_SOFT_RESET | CSMI_SAS_FWD_VALIDATE)) {
                karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED;
                karg.Information.usStatus = CSMI_SAS_FWD_REJECT;
-@@ -3142,7 +3150,7 @@ csmisas_firmware_download(unsigned long 
+@@ -3142,7 +3150,7 @@ csmisas_firmware_download(unsigned long
         * fw image attached to end of incoming packet.
         */
        pFwHeader = kmalloc(karg.Information.uBufferLength, GFP_KERNEL);
@@ -2207,7 +2225,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED;
                karg.Information.usStatus = CSMI_SAS_FWD_REJECT;
                karg.Information.usSeverity = CSMI_SAS_FWD_ERROR;
-@@ -3154,21 +3162,21 @@ csmisas_firmware_download(unsigned long 
+@@ -3154,21 +3162,21 @@ csmisas_firmware_download(unsigned long
                karg.Information.uBufferLength)) {
                printk(KERN_ERR "%s@%d::%s() - "
                    "Unable to read in pFwHeader @ %p\n",
@@ -2233,7 +2251,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
            uarg->bDataBuffer, karg.Information.uBufferLength)
            != 0) {
                karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED;
-@@ -3177,7 +3185,7 @@ csmisas_firmware_download(unsigned long 
+@@ -3177,7 +3185,7 @@ csmisas_firmware_download(unsigned long
                goto cim_firmware_download_exit;
        }
  
@@ -2242,7 +2260,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
            (karg.Information.uDownloadFlags & CSMI_SAS_FWD_HARD_RESET)) {
                if (mpt_HardResetHandler(ioc, CAN_SLEEP) != 0) {
                        karg.IoctlHeader.ReturnCode = CSMI_SAS_STATUS_FAILED;
-@@ -3188,7 +3196,7 @@ csmisas_firmware_download(unsigned long 
+@@ -3188,7 +3196,7 @@ csmisas_firmware_download(unsigned long
  
   cim_firmware_download_exit:
  
@@ -2251,7 +2269,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                kfree(pFwHeader);
  
        /* Copy the data from kernel memory to user memory
-@@ -3197,11 +3205,11 @@ csmisas_firmware_download(unsigned long 
+@@ -3197,11 +3205,11 @@ csmisas_firmware_download(unsigned long
                                sizeof(CSMI_SAS_FIRMWARE_DOWNLOAD_BUFFER))) {
                printk(KERN_ERR "%s@%d::%s() - "
                        "Unable to write out csmi_sas_firmware_download @ %p\n",
@@ -2828,7 +2846,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
        if (copy_to_user(uarg, pKarg, copy_buffer_sz)) {
                printk(KERN_ERR "%s@%d::%s() - "
                       "Unable to write out csmi_sas_get_raid_config @ %p\n",
--                         __FILE__, __LINE__, __FUNCTION__, uarg);
+-                         __FILE__, __LINE__, __FUNCTION__, uarg);
 +                     __FILE__, __LINE__, __func__, uarg);
                free_pages((unsigned long)pKarg, memory_pages);
                return -EFAULT;
@@ -2859,7 +2877,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                return -EFAULT;
        }
  
-@@ -4135,20 +4152,20 @@ csmisas_get_raid_features(unsigned long 
+@@ -4135,20 +4152,20 @@ csmisas_get_raid_features(unsigned long
        memory_pages = get_order(csmi_sas_raid_features_buffer_sz);
        pKarg = (CSMI_SAS_RAID_FEATURES_BUFFER *)__get_free_pages(
                GFP_KERNEL, memory_pages);
@@ -2885,7 +2903,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                free_pages((unsigned long)pKarg, memory_pages);
                return -EFAULT;
        }
-@@ -4156,22 +4173,22 @@ csmisas_get_raid_features(unsigned long 
+@@ -4156,22 +4173,22 @@ csmisas_get_raid_features(unsigned long
        if (((iocnum = mpt_verify_adapter(pKarg->IoctlHeader.IOControllerNumber,
            &ioc)) < 0) || (ioc == NULL)) {
                printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n",
@@ -2912,7 +2930,7 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                pKarg->IoctlHeader.ReturnCode =
                    CSMI_SAS_STATUS_INVALID_PARAMETER;
                pKarg->Information.uFailureCode =
-@@ -4218,12 +4235,12 @@ csmisas_get_raid_features(unsigned long 
+@@ -4218,12 +4235,12 @@ csmisas_get_raid_features(unsigned long
            sizeof(CSMI_SAS_RAID_FEATURES_BUFFER))) {
                printk(KERN_ERR "%s@%d::%s() - "
                "Unable to write out csmi_sas_get_raid_features @ %p\n",
@@ -3669,12 +3687,8 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
                goto fill_location_data_exit;
        }
  
-@@ -5411,10 +5412,10 @@ csmisas_fill_location_data(MPT_ADAPTER *
-       cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT;
-       cfg.pageAddr = (bus << 8) + id
-           + (MPI_SAS_DEVICE_PGAD_FORM_BUS_TARGET_ID <<
--              MPI_SAS_DEVICE_PGAD_FORM_SHIFT);
-+              MPI_SAS_DEVICE_PGAD_FORM_SHIFT);
+@@ -5414,7 +5415,7 @@ csmisas_fill_location_data(MPT_ADAPTER *
+               MPI_SAS_DEVICE_PGAD_FORM_SHIFT);
  
        if ((rc = mpt_config(ioc, &cfg)) != 0) {
 -              rc=-1;
@@ -3964,10 +3978,8 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.c
        free_pages((unsigned long)karg, memory_pages);
        return 0;
  }
-Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/csmi/csmisas.h
-+++ linux-2.6.27/drivers/message/fusion/csmi/csmisas.h
+--- a/drivers/message/fusion/csmi/csmisas.h
++++ b/drivers/message/fusion/csmi/csmisas.h
 @@ -87,10 +87,10 @@ Revision History:
  #ifndef _CSMI_SAS_H_
  #define _CSMI_SAS_H_
@@ -5143,10 +5155,8 @@ Index: linux-2.6.27/drivers/message/fusion/csmi/csmisas.h
  #pragma pack()
  
  #endif // _CSMI_SAS_H_
-Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_cnfg.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/lsi/mpi_cnfg.h
-+++ linux-2.6.27/drivers/message/fusion/lsi/mpi_cnfg.h
+--- a/drivers/message/fusion/lsi/mpi_cnfg.h
++++ b/drivers/message/fusion/lsi/mpi_cnfg.h
 @@ -1452,8 +1452,7 @@ typedef struct _CONFIG_PAGE_BIOS_2
  #define MPI_BIOSPAGE2_FORM_SAS_WWN                      (0x05)
  #define MPI_BIOSPAGE2_FORM_ENCLOSURE_SLOT               (0x06)
@@ -5157,10 +5167,8 @@ Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_cnfg.h
      CONFIG_PAGE_HEADER      Header;                     /* 00h */
      U64                     ReassignmentBaseWWID;       /* 04h */
  } CONFIG_PAGE_BIOS_4, MPI_POINTER PTR_CONFIG_PAGE_BIOS_4,
-Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_log_sas.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/lsi/mpi_log_sas.h
-+++ linux-2.6.27/drivers/message/fusion/lsi/mpi_log_sas.h
+--- a/drivers/message/fusion/lsi/mpi_log_sas.h
++++ b/drivers/message/fusion/lsi/mpi_log_sas.h
 @@ -160,11 +160,12 @@
  
  
@@ -5195,10 +5203,8 @@ Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_log_sas.h
  
  
  /****************************************************************************/
-Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_type.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/lsi/mpi_type.h
-+++ linux-2.6.27/drivers/message/fusion/lsi/mpi_type.h
+--- a/drivers/message/fusion/lsi/mpi_type.h
++++ b/drivers/message/fusion/lsi/mpi_type.h
 @@ -50,18 +50,8 @@ typedef signed   short  S16;
  typedef unsigned short  U16;
  
@@ -5220,10 +5226,8 @@ Index: linux-2.6.27/drivers/message/fusion/lsi/mpi_type.h
  
  typedef struct _S64
  {
-Index: linux-2.6.27/drivers/message/fusion/mptbase.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptbase.c
-+++ linux-2.6.27/drivers/message/fusion/mptbase.c
+--- a/drivers/message/fusion/mptbase.c
++++ b/drivers/message/fusion/mptbase.c
 @@ -83,15 +83,18 @@ MODULE_VERSION(my_VERSION);
  
  static int mpt_msi_enable_spi;
@@ -5299,7 +5303,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
  static int    SendEventAck(MPT_ADAPTER *ioc, EventNotificationReply_t *evnp);
  static int    mpt_host_page_access_control(MPT_ADAPTER *ioc, u8 access_control_value, int sleepFlag);
  static int    mpt_host_page_alloc(MPT_ADAPTER *ioc, pIOCInit_t ioc_init);
-@@ -353,10 +360,10 @@ mpt_fault_reset_work(struct work_struct 
+@@ -353,10 +360,10 @@ mpt_fault_reset_work(struct work_struct
                printk(MYIOC_s_WARN_FMT "IOC is in FAULT state (%04xh)!!!\n",
                    ioc->name, ioc_raw_state & MPI_DOORBELL_DATA_MASK);
                printk(MYIOC_s_WARN_FMT "Issuing HardReset from %s!!\n",
@@ -5312,7 +5316,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
                ioc_raw_state = mpt_GetIocState(ioc, 0);
                if ((ioc_raw_state & MPI_IOC_STATE_MASK) == MPI_IOC_STATE_FAULT)
                        printk(MYIOC_s_WARN_FMT "IOC is in FAULT state after "
-@@ -378,11 +385,11 @@ mpt_fault_reset_work(struct work_struct 
+@@ -378,11 +385,11 @@ mpt_fault_reset_work(struct work_struct
                ioc = ioc->alt_ioc;
  
        /* rearm the timer */
@@ -6001,7 +6005,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
        if (ioc->alloc != NULL) {
                sz = ioc->alloc_sz;
 -              dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT "free  @ %p, sz=%d bytes\n",
--                      ioc->name, ioc->alloc, ioc->alloc_sz));
+-                      ioc->name, ioc->alloc, ioc->alloc_sz));
 +              dexitprintk(ioc, printk(MYIOC_s_DEBUG_FMT
 +                      "free  @ %p, sz=%d bytes\n", ioc->name,
 +                      ioc->alloc, ioc->alloc_sz));
@@ -6954,7 +6958,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
        dma_addr_t               ioc6_dma;
        int                      iocpage6sz;
        void                    *mem;
-@@ -5546,13 +5634,13 @@ mpt_inactive_raid_list_free(MPT_ADAPTER 
+@@ -5546,13 +5634,13 @@ mpt_inactive_raid_list_free(MPT_ADAPTER
        if (list_empty(&ioc->raid_data.inactive_list))
                return;
  
@@ -7080,7 +7084,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
  static int
  SendEventNotification(MPT_ADAPTER *ioc, u8 EvSwitch, int sleepFlag)
  {
-@@ -6262,15 +6360,16 @@ SendEventNotification(MPT_ADAPTER *ioc, 
+@@ -6262,15 +6360,16 @@ SendEventNotification(MPT_ADAPTER *ioc,
            ioc->name, EvSwitch, &evn));
  
        return mpt_handshake_req_reply_wait(ioc, sizeof(EventNotification_t),
@@ -7562,10 +7566,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.c
  static void __exit
  fusion_exit(void)
  {
-Index: linux-2.6.27/drivers/message/fusion/mptbase.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptbase.h
-+++ linux-2.6.27/drivers/message/fusion/mptbase.h
+--- a/drivers/message/fusion/mptbase.h
++++ b/drivers/message/fusion/mptbase.h
 @@ -72,8 +72,8 @@
  #define COPYRIGHT     "Copyright (c) 1999-2008 " MODULEAUTHOR
  #endif
@@ -7751,10 +7753,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptbase.h
  extern int mpt_debug_level;
  extern int mpt_fwfault_debug;
  
-Index: linux-2.6.27/drivers/message/fusion/mptctl.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptctl.c
-+++ linux-2.6.27/drivers/message/fusion/mptctl.c
+--- a/drivers/message/fusion/mptctl.c
++++ b/drivers/message/fusion/mptctl.c
 @@ -75,7 +75,7 @@
  #if defined(CPQ_CIM)
  #include "mptsas.h"
@@ -7802,7 +7802,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptctl.c
                        sz = req->u.scsireq.SenseBufferLength;
                        req_index =
                            le16_to_cpu(req->u.frame.hwhdr.msgctxu.fld.req_idx);
-@@ -324,7 +326,8 @@ mptctl_taskmgmt_reply(MPT_ADAPTER *ioc, 
+@@ -324,7 +326,8 @@ mptctl_taskmgmt_reply(MPT_ADAPTER *ioc,
        if (!mf)
                return 0;
  
@@ -8002,15 +8002,6 @@ Index: linux-2.6.27/drivers/message/fusion/mptctl.c
                return -ENODEV; /* (-6) No such device or address */
        } else {
  
-@@ -982,7 +985,7 @@ mptctl_do_fw_download(int ioc, char __us
-                       / iocp->SGE_size;
-       if (numfrags > maxfrags) {
-               ret = -EMLINK;
--              goto fwdl_out;
-+              goto fwdl_out;
-       }
-       dctlprintk(iocp, printk(MYIOC_s_DEBUG_FMT "DbG: sgl buffer = %p, sgfrags = %d\n",
 @@ -1036,7 +1039,7 @@ mptctl_do_fw_download(int ioc, char __us
        timeleft = wait_for_completion_timeout(&iocp->ioctl_cmds.done, HZ*60);
        if (!(iocp->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
@@ -8416,10 +8407,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptctl.c
  
  #if defined(DIAG_BUFFER_SUPPORT)
  #include "rejected_ioctls/diag_buffer.c"
-Index: linux-2.6.27/drivers/message/fusion/mptfc.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptfc.c
-+++ linux-2.6.27/drivers/message/fusion/mptfc.c
+--- a/drivers/message/fusion/mptfc.c
++++ b/drivers/message/fusion/mptfc.c
 @@ -270,28 +270,28 @@ static int
  mptfc_abort(struct scsi_cmnd *SCpnt)
  {
@@ -8453,7 +8442,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptfc.c
  }
  
  static void
-@@ -553,7 +553,6 @@ mptfc_target_destroy(struct scsi_target 
+@@ -553,7 +553,6 @@ mptfc_target_destroy(struct scsi_target
        struct fc_rport         *rport;
        struct mptfc_rport_info *ri;
  
@@ -8481,7 +8470,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptfc.c
                        return rc;
        }
        return 0;
-@@ -1170,8 +1171,9 @@ mptfc_rescan_devices(struct work_struct 
+@@ -1170,8 +1171,9 @@ mptfc_rescan_devices(struct work_struct
         * if cannot set defaults, something's really wrong, bail out
         */
  
@@ -8493,7 +8482,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptfc.c
                    "mptfc_rescan.%d: unable to set PP1 defaults, rc %d.\n",
                    ioc->name, ioc->sh->host_no, rc));
                return;
-@@ -1373,8 +1375,9 @@ mptfc_probe(struct pci_dev *pdev, const 
+@@ -1373,8 +1375,9 @@ mptfc_probe(struct pci_dev *pdev, const
  
        /* initialize workqueue */
  
@@ -8569,10 +8558,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptfc.c
        /* destroy workqueue */
        if ((work_q=ioc->fc_rescan_work_q)) {
                spin_lock_irqsave(&ioc->fc_rescan_work_lock, flags);
-Index: linux-2.6.27/drivers/message/fusion/mptlan.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptlan.c
-+++ linux-2.6.27/drivers/message/fusion/mptlan.c
+--- a/drivers/message/fusion/mptlan.c
++++ b/drivers/message/fusion/mptlan.c
 @@ -614,7 +614,7 @@ mpt_lan_send_turbo(struct net_device *de
  
        dioprintk((KERN_INFO MYNAM ": %s/%s: @%s, skb %p sent.\n",
@@ -8678,10 +8665,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptlan.c
  
        clear_bit(0, &priv->post_buckets_active);
  }
-Index: linux-2.6.27/drivers/message/fusion/mptsas.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptsas.c
-+++ linux-2.6.27/drivers/message/fusion/mptsas.c
+--- a/drivers/message/fusion/mptsas.c
++++ b/drivers/message/fusion/mptsas.c
 @@ -117,19 +117,23 @@ static u8        mptsasInternalCtx = MPT_MAX_PR
  static u8     mptsasMgmtCtx = MPT_MAX_PROTOCOL_DRIVERS;
  static u8     mptsasDeviceResetCtx = MPT_MAX_PROTOCOL_DRIVERS;
@@ -8781,7 +8766,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
            port_details->num_phys, (unsigned long long)
            port_details->phy_bitmask));
  
-@@ -659,7 +664,7 @@ mptsas_add_device_component(MPT_ADAPTER 
+@@ -659,7 +664,7 @@ mptsas_add_device_component(MPT_ADAPTER
        /*
         * Delete all matching devices out of the list
         */
@@ -8790,7 +8775,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
        list_for_each_entry_safe(sas_info, next, &ioc->sas_device_info_list,
            list) {
                if (!sas_info->is_logical_volume &&
-@@ -700,7 +705,7 @@ mptsas_add_device_component(MPT_ADAPTER 
+@@ -700,7 +705,7 @@ mptsas_add_device_component(MPT_ADAPTER
        }
  
   out:
@@ -9075,7 +9060,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                if (ioc->sas_mgmt.status & MPT_MGMT_STATUS_PENDING) {
                        ioc->sas_mgmt.status |= MPT_MGMT_STATUS_DID_IOCRESET;
                        complete(&ioc->sas_mgmt.done);
-@@ -1473,7 +1486,7 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc, 
+@@ -1473,7 +1486,7 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc,
            &lun_data_dma);
        if (!lun_data) {
                printk(MYIOC_s_ERR_FMT "%s: pci_alloc_consistent(%d) FAILED!\n",
@@ -9084,7 +9069,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                rc = -ENOMEM;
                goto out;
        }
-@@ -1481,7 +1494,7 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc, 
+@@ -1481,7 +1494,7 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc,
        iocmd = kzalloc(sizeof(INTERNAL_CMD), GFP_KERNEL);
        if (!iocmd) {
                printk(MYIOC_s_ERR_FMT "%s: kzalloc(%zd) FAILED!\n",
@@ -9093,7 +9078,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                rc = -ENOMEM;
                goto out;
        }
-@@ -1499,14 +1512,14 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc, 
+@@ -1499,14 +1512,14 @@ mptsas_get_lun_number(MPT_ADAPTER *ioc,
        if ((rc = mptscsih_do_cmd(hd, iocmd)) < 0) {
                printk(MYIOC_s_ERR_FMT "%s: fw_channel=%d fw_id=%d: "
                    "report_luns failed due to rc=0x%x\n", ioc->name,
@@ -9261,18 +9246,6 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                        (unsigned long long)p->phy_info[i].attached.sas_address);
  
                        /*
-@@ -1899,9 +1914,9 @@ mptsas_target_destroy(struct scsi_target
-                       starget_printk(KERN_INFO, starget, MYIOC_s_FMT
-                       "delete device: fw_channel %d, fw_id %d, phy %d, "
-                       "sas_addr 0x%llx\n", ioc->name,
--                      p->phy_info[i].attached.channel,
-+                      p->phy_info[i].attached.channel,
-                       p->phy_info[i].attached.id,
--                      p->phy_info[i].attached.phy_id, (unsigned long long)
-+                      p->phy_info[i].attached.phy_id, (unsigned long long)
-                       p->phy_info[i].attached.sas_address);
-                       mptsas_port_delete(ioc, p->phy_info[i].port_details);
 @@ -2000,8 +2015,7 @@ mptsas_qcmd(struct scsi_cmnd *SCpnt, voi
        if (ioc->sas_discovery_quiesce_io)
                return SCSI_MLQUEUE_HOST_BUSY;
@@ -9283,7 +9256,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
  }
  
  
-@@ -2046,7 +2060,6 @@ static int mptsas_get_linkerrors(struct 
+@@ -2046,7 +2060,6 @@ static int mptsas_get_linkerrors(struct
        dma_addr_t dma_handle;
        int error;
  
@@ -9560,7 +9533,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
   **/
  static void
  mptsas_adding_inactive_raid_components(MPT_ADAPTER *ioc, u8 channel, u8 id)
-@@ -3363,10 +3525,10 @@ mptsas_add_end_device(MPT_ADAPTER *ioc, 
+@@ -3363,10 +3525,10 @@ mptsas_add_end_device(MPT_ADAPTER *ioc,
        char *ds = NULL;
        u8 fw_id;
  
@@ -9573,7 +9546,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                return 1;
        }
  
-@@ -3375,7 +3537,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc, 
+@@ -3375,7 +3537,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc,
        if (mptsas_get_rphy(phy_info)) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
@@ -9582,7 +9555,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                return 2;
        }
  
-@@ -3383,7 +3545,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc, 
+@@ -3383,7 +3545,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc,
        if (!port) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
@@ -9591,7 +9564,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                return 3;
        }
  
-@@ -3408,7 +3570,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc, 
+@@ -3408,7 +3570,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc,
        if (!rphy) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
@@ -9600,7 +9573,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                return 5; /* non-fatal: an rphy can be added later */
        }
  
-@@ -3416,7 +3578,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc, 
+@@ -3416,7 +3578,7 @@ mptsas_add_end_device(MPT_ADAPTER *ioc,
        if (sas_rphy_add(rphy)) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
@@ -9609,7 +9582,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                sas_rphy_free(rphy);
                return 6;
        }
-@@ -3439,7 +3601,7 @@ mptsas_del_end_device(MPT_ADAPTER *ioc, 
+@@ -3439,7 +3601,7 @@ mptsas_del_end_device(MPT_ADAPTER *ioc,
        struct mptsas_portinfo *port_info;
        struct mptsas_phyinfo *phy_info_parent;
        int i;
@@ -9618,11 +9591,11 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
        char *ds = NULL;
        u8 fw_id;
        u64 sas_address;
-@@ -3453,14 +3615,14 @@ mptsas_del_end_device(MPT_ADAPTER *ioc, 
+@@ -3453,14 +3615,14 @@ mptsas_del_end_device(MPT_ADAPTER *ioc,
        if (!phy_info->port_details) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
--                      __FUNCTION__, fw_id, __LINE__));
+-                      __FUNCTION__, fw_id, __LINE__));
 +                      __func__, fw_id, __LINE__));
                return;
        }
@@ -9630,16 +9603,16 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
        if (!rphy) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
--                      __FUNCTION__, fw_id, __LINE__));
+-                      __FUNCTION__, fw_id, __LINE__));
 +                      __func__, fw_id, __LINE__));
                return;
        }
        if (phy_info->attached.device_info &
-@@ -3485,13 +3647,13 @@ mptsas_del_end_device(MPT_ADAPTER *ioc, 
+@@ -3485,13 +3647,13 @@ mptsas_del_end_device(MPT_ADAPTER *ioc,
        if (!port) {
                dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
--                      __FUNCTION__, fw_id, __LINE__));
+-                      __FUNCTION__, fw_id, __LINE__));
 +                      __func__, fw_id, __LINE__));
                return;
        }
@@ -9651,7 +9624,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                        continue;
                if (phy_info_parent->attached.sas_address !=
                    sas_address)
-@@ -3507,11 +3669,11 @@ mptsas_del_end_device(MPT_ADAPTER *ioc, 
+@@ -3507,11 +3669,11 @@ mptsas_del_end_device(MPT_ADAPTER *ioc,
            "delete port %d, sas_addr (0x%llx)\n", ioc->name,
             port->port_identifier, (unsigned long long)sas_address);
        sas_port_delete(port);
@@ -9687,7 +9660,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                    (hot_plug_info->channel << 8) + hot_plug_info->id)) {
                        dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                        "%s: fw_id=%d exit at line=%d\n", ioc->name,
--                              __FUNCTION__, hot_plug_info->id, __LINE__));
+-                      __FUNCTION__, hot_plug_info->id, __LINE__));
 +                      __func__, hot_plug_info->id, __LINE__));
                        break;
                }
@@ -9699,7 +9672,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
 +              if (!phy_info) {
                        dfailprintk(ioc, printk(MYIOC_s_ERR_FMT
                                "%s: fw_id=%d exit at line=%d\n", ioc->name,
--                              __FUNCTION__, hot_plug_info->id, __LINE__));
+-                              __FUNCTION__, hot_plug_info->id, __LINE__));
 +                              __func__, hot_plug_info->id, __LINE__));
                        break;
                }
@@ -9937,7 +9910,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
                                           depth);
                                else if (depth < 0)
                                        sdev_printk(KERN_INFO, sdev,
--                                      "Tagged Command Queueing is being "
+-                                      "Tagged Command Queueing is being "
 -                                      "disabled\n");
 +                                          "Tagged Command Queueing is being "
 +                                          "disabled\n");
@@ -10022,10 +9995,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.c
  
        spin_unlock_irqrestore(&ioc->FreeQlock, flags);
  
-Index: linux-2.6.27/drivers/message/fusion/mptsas.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptsas.h
-+++ linux-2.6.27/drivers/message/fusion/mptsas.h
+--- a/drivers/message/fusion/mptsas.h
++++ b/drivers/message/fusion/mptsas.h
 @@ -84,9 +84,12 @@ struct sas_device_info {
        u16                     slot;           /* enclosure slot id */
        u64                     enclosure_logical_id; /*enclosure address */
@@ -10042,10 +10013,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptsas.h
  };
  
  struct mptsas_hotplug_event {
-Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptscsih.c
-+++ linux-2.6.27/drivers/message/fusion/mptscsih.c
+--- a/drivers/message/fusion/mptscsih.c
++++ b/drivers/message/fusion/mptscsih.c
 @@ -102,7 +102,8 @@ static void        mptscsih_copy_sense_data(str
  
  int           mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
@@ -10056,7 +10025,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
  
  void          mptscsih_remove(struct pci_dev *);
  void          mptscsih_shutdown(struct pci_dev *);
-@@ -142,12 +143,16 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER 
+@@ -142,12 +143,16 @@ mptscsih_getFreeChainBuffer(MPT_ADAPTER
                offset = (u8 *)chainBuf - (u8 *)ioc->ChainBuffer;
                chain_idx = offset / ioc->req_sz;
                rc = SUCCESS;
@@ -10391,7 +10360,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
  
        return retval;
  }
-@@ -2306,7 +2325,7 @@ mptscsih_is_phys_disk(MPT_ADAPTER *ioc, 
+@@ -2306,7 +2325,7 @@ mptscsih_is_phys_disk(MPT_ADAPTER *ioc,
                    ioc->raid_data.pIocPg3->PhysDisk[i].PhysDiskNum);
                if (num_paths < 2)
                        continue;
@@ -10400,7 +10369,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
                   (num_paths * sizeof(RAID_PHYS_DISK1_PATH)), GFP_KERNEL);
                if (!phys_disk)
                        continue;
-@@ -2339,14 +2358,14 @@ mptscsih_is_phys_disk(MPT_ADAPTER *ioc, 
+@@ -2339,14 +2358,14 @@ mptscsih_is_phys_disk(MPT_ADAPTER *ioc,
        if (list_empty(&ioc->raid_data.inactive_list))
                goto out;
  
@@ -10655,7 +10624,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
        mptscsih_do_cmd(hd, &iocmd);
  }
  
-@@ -3408,7 +3438,8 @@ static DEVICE_ATTR(debug_level, S_IRUGO 
+@@ -3408,7 +3438,8 @@ static DEVICE_ATTR(debug_level, S_IRUGO
        mptscsih_debug_level_show, mptscsih_debug_level_store);
  
  static ssize_t
@@ -10685,10 +10654,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.c
  
  struct device_attribute *mptscsih_host_attrs[] = {
        &dev_attr_version_fw,
-Index: linux-2.6.27/drivers/message/fusion/mptscsih.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptscsih.h
-+++ linux-2.6.27/drivers/message/fusion/mptscsih.h
+--- a/drivers/message/fusion/mptscsih.h
++++ b/drivers/message/fusion/mptscsih.h
 @@ -129,11 +129,13 @@ extern int mptscsih_scandv_complete(MPT_
  extern int mptscsih_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply);
  extern int mptscsih_ioc_reset(MPT_ADAPTER *ioc, int post_reset);
@@ -10705,10 +10672,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptscsih.h
 +    u8 id);
  extern struct scsi_cmnd * mptscsih_get_scsi_lookup(MPT_ADAPTER *ioc, int i);
  extern void mptscsih_taskmgmt_response_code(MPT_ADAPTER *ioc, u8 response_code);
-Index: linux-2.6.27/drivers/message/fusion/mptspi.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/mptspi.c
-+++ linux-2.6.27/drivers/message/fusion/mptspi.c
+--- a/drivers/message/fusion/mptspi.c
++++ b/drivers/message/fusion/mptspi.c
 @@ -87,7 +87,8 @@ MODULE_PARM_DESC(mpt_saf_te, " Force ena
  
  static int mpt_qas = MPTSCSIH_QAS;
@@ -10719,7 +10684,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptspi.c
  
  static void mptspi_write_offset(struct scsi_target *, int);
  static void mptspi_write_width(struct scsi_target *, int);
-@@ -240,7 +241,7 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST 
+@@ -240,7 +241,7 @@ mptspi_setTargetNegoParms(MPT_SCSI_HOST
                 */
  
                ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
@@ -10728,7 +10693,7 @@ Index: linux-2.6.27/drivers/message/fusion/mptspi.c
        }
  }
  
-@@ -314,7 +315,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd, 
+@@ -314,7 +315,7 @@ mptspi_writeIOCPage4(MPT_SCSI_HOST *hd,
  
        ddvprintk(ioc, printk(MYIOC_s_DEBUG_FMT
                "writeIOCPage4: MaxSEP=%d ActiveSEP=%d id=%d bus=%d\n",
@@ -10794,10 +10759,8 @@ Index: linux-2.6.27/drivers/message/fusion/mptspi.c
                    ioc->name, disk);
                return;
        }
-Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/rejected_ioctls/diag_buffer.c
-+++ linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
+--- a/drivers/message/fusion/rejected_ioctls/diag_buffer.c
++++ b/drivers/message/fusion/rejected_ioctls/diag_buffer.c
 @@ -4,19 +4,20 @@
   * Outputs:   None.
   * Return:    0 if successful
@@ -10822,12 +10785,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        dma_addr_t              request_data_dma;
        u32                     request_data_sz;
        MPT_FRAME_HDR           *mf;
-@@ -30,37 +31,39 @@ mptctl_register_diag_buffer (unsigned lo
-       if (copy_from_user(&karg, uarg, sizeof(mpt_diag_register_t))) {
-               printk(KERN_ERR "%s@%d::%s - "
-               "Unable to read in mpt_diag_register_t struct @ %p\n",
--                  __FILE__, __LINE__, __FUNCTION__, uarg);
-+                  __FILE__, __LINE__, __func__, uarg);
+@@ -34,33 +35,35 @@ mptctl_register_diag_buffer (unsigned lo
                return -EFAULT;
        }
  
@@ -10835,7 +10793,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
 -              (ioc == NULL)) {
 +      iocnum = mpt_verify_adapter(karg.hdr.iocnum, &ioc);
 +
-+      if ((iocnum < 0) || (ioc == NULL)) {
++      if ((iocnum  < 0) || (ioc == NULL)) {
                printk(KERN_ERR "%s::%s() @%d - ioc%d not found!\n",
 -                  __FILE__, __FUNCTION__, __LINE__, iocnum);
 +                  __FILE__, __func__, __LINE__, iocnum);
@@ -10843,7 +10801,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        }
  
        dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
--              __FUNCTION__));
+-              __FUNCTION__));
 +              __func__));
        buffer_type = karg.data.BufferType;
        if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
@@ -10866,36 +10824,24 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
         */
 -      if ((mf = mpt_get_msg_frame(mptctl_id, ioc)) == NULL)
 +      mf = mpt_get_msg_frame(mptctl_id, ioc);
-+      if (mf  == NULL)
++      if (mf == NULL)
                return -EAGAIN;
  
        request_data = ioc->DiagBuffer[buffer_type];
-@@ -85,9 +88,9 @@ mptctl_register_diag_buffer (unsigned lo
+@@ -85,7 +88,7 @@ mptctl_register_diag_buffer (unsigned lo
                if (request_data == NULL) {
                        printk(MYIOC_s_DEBUG_FMT "%s: pci_alloc_consistent"
                            " FAILED, (request_sz=%d)\n", ioc->name,
 -                          __FUNCTION__, request_data_sz);
 +                          __func__, request_data_sz);
                        mpt_free_msg_frame(ioc, mf);
--                      return -EAGAIN;
-+                      return -EAGAIN;
+                       return -EAGAIN;
                }
-               ioc->DiagBuffer[buffer_type] = request_data;
-               ioc->DiagBuffer_sz[buffer_type] = request_data_sz;
-@@ -95,7 +98,7 @@ mptctl_register_diag_buffer (unsigned lo
-       }
-       ioc->DiagBuffer_Status[buffer_type] = 0;
--      diag_buffer_post_request = (DiagBufferPostRequest_t *)mf;
-+      diag_buffer_post_request = (DiagBufferPostRequest_t *)mf;
-       diag_buffer_post_request->Function = MPI_FUNCTION_DIAG_BUFFER_POST;
-       diag_buffer_post_request->ChainOffset = 0;
-       diag_buffer_post_request->BufferType = karg.data.BufferType;
 @@ -137,7 +140,7 @@ mptctl_register_diag_buffer (unsigned lo
        if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
                rc = -ETIME;
                printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
--                  __FUNCTION__);
+-                      __FUNCTION__);
 +                  __func__);
                if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
                        mpt_free_msg_frame(ioc, mf);
@@ -10968,7 +10914,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        }
  
        dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
--              __FUNCTION__));
+-              __FUNCTION__));
 +              __func__));
        buffer_type = karg.data.UniqueId & 0x000000ff;
        if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
@@ -10979,7 +10925,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        }
  
        if ((ioc->DiagBuffer_Status[buffer_type] &
--              MPT_DIAG_BUFFER_IS_REGISTERED) == 0 ) {
+-              MPT_DIAG_BUFFER_IS_REGISTERED) == 0 ) {
 +              MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
                printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not "
 -                  "registered\n", ioc->name, __FUNCTION__, buffer_type);
@@ -11022,7 +10968,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
                rc = -ETIME;
                printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
--                  __FUNCTION__);
+-                      __FUNCTION__);
 +                  __func__);
                if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
                        mpt_free_msg_frame(ioc, mf);
@@ -11069,7 +11015,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        dma_addr_t              request_data_dma;
        u32                     request_data_sz;
        u8                      buffer_type;
-@@ -344,49 +351,48 @@ mptctl_unregister_diag_buffer (unsigned 
+@@ -344,49 +351,48 @@ mptctl_unregister_diag_buffer (unsigned
        if (copy_from_user(&karg, uarg, sizeof(mpt_diag_unregister_t))) {
                printk(KERN_ERR "%s@%d::%s - "
                "Unable to read in mpt_diag_unregister_t struct @ %p\n",
@@ -11129,7 +11075,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
                return -ENODEV;
        }
  
-@@ -405,18 +411,19 @@ mptctl_unregister_diag_buffer (unsigned 
+@@ -405,18 +411,19 @@ mptctl_unregister_diag_buffer (unsigned
   * Outputs:   None.
   * Return:    0 if successful
   *            -EFAULT if data unavailable
@@ -11152,7 +11098,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        int                     iocnum, ii, rc;
        u8                      buffer_type;
  
-@@ -424,38 +431,38 @@ mptctl_query_diag_buffer (unsigned long 
+@@ -424,38 +431,38 @@ mptctl_query_diag_buffer (unsigned long
        if (copy_from_user(&karg, uarg, sizeof(mpt_diag_query_t))) {
                printk(KERN_ERR "%s@%d::%s - "
                "Unable to read in mpt_diag_query_t struct @ %p\n",
@@ -11173,7 +11119,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        }
  
        dctlprintk(ioc, printk(MYIOC_s_DEBUG_FMT "%s enter.\n", ioc->name,
--              __FUNCTION__));
+-              __FUNCTION__));
 +              __func__));
        buffer_type = karg.data.BufferType;
        if (!(ioc->facts.IOCCapabilities & MPT_DIAG_CAPABILITY(buffer_type))) {
@@ -11184,8 +11130,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        }
  
        if ((ioc->DiagBuffer_Status[buffer_type] &
--              MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
-+              MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
+               MPT_DIAG_BUFFER_IS_REGISTERED) == 0) {
                printk(MYIOC_s_DEBUG_FMT "%s: buffer_type=%x is not "
 -                  "registered\n", ioc->name, __FUNCTION__, buffer_type);
 +                  "registered\n", ioc->name, __func__, buffer_type);
@@ -11200,7 +11145,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
                            karg.data.UniqueId);
                        goto out;
                }
-@@ -464,7 +471,7 @@ mptctl_query_diag_buffer (unsigned long 
+@@ -464,7 +471,7 @@ mptctl_query_diag_buffer (unsigned long
        request_data = ioc->DiagBuffer[buffer_type];
        if (!request_data) {
                printk(MYIOC_s_DEBUG_FMT "%s: doesn't have buffer for "
@@ -11209,7 +11154,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
                goto out;
        }
  
-@@ -490,7 +497,7 @@ mptctl_query_diag_buffer (unsigned long 
+@@ -490,7 +497,7 @@ mptctl_query_diag_buffer (unsigned long
   out:
        if (copy_to_user(uarg, &karg, sizeof(mpt_diag_query_t))) {
                printk(MYIOC_s_ERR_FMT "%s Unable to write mpt_diag_query_t "
@@ -11218,7 +11163,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
                return -EFAULT;
        }
        return rc;
-@@ -502,13 +509,14 @@ mptctl_query_diag_buffer (unsigned long 
+@@ -502,13 +509,14 @@ mptctl_query_diag_buffer (unsigned long
   * Outputs:   None.
   * Return:    0 if successful
   *            -EFAULT if data unavailable
@@ -11332,7 +11277,7 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
        if (!(ioc->ioctl_cmds.status & MPT_MGMT_STATUS_COMMAND_GOOD)) {
                rc = -ETIME;
                printk(MYIOC_s_WARN_FMT "%s: failed\n", ioc->name,
--                  __FUNCTION__);
+-                      __FUNCTION__);
 +                  __func__);
                if (ioc->ioctl_cmds.status & MPT_MGMT_STATUS_DID_IOCRESET) {
                        mpt_free_msg_frame(ioc, mf);
@@ -11355,10 +11300,8 @@ Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.c
                    diag_buffer_post_reply->IOCStatus,
                    diag_buffer_post_reply->IOCLogInfo));
                rc = -EFAULT;
-Index: linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.h
-===================================================================
---- linux-2.6.27.orig/drivers/message/fusion/rejected_ioctls/diag_buffer.h
-+++ linux-2.6.27/drivers/message/fusion/rejected_ioctls/diag_buffer.h
+--- a/drivers/message/fusion/rejected_ioctls/diag_buffer.h
++++ b/drivers/message/fusion/rejected_ioctls/diag_buffer.h
 @@ -1,8 +1,13 @@
 -#define MPTDIAGREGISTER                               _IOWR(MPT_MAGIC_NUMBER,26,mpt_diag_register_t)
 -#define MPTDIAGRELEASE                                _IOWR(MPT_MAGIC_NUMBER,27,mpt_diag_release_t)
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta4-update
rename to src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta4-update
index 5d8357c55d6a1d5ba03a3ead36dac51daec0c40c..e47d3c15c8f3f37b21ffb36fc7b9adf3e27ab59e 100644 (file)
@@ -4439,7 +4439,7 @@ index b1854b9..bfbc7d4 100644
 + * the lport to be reset before we fill out the frame header's port_id. The
 + * problem is that a reset would cause the lport's port_id to reset to 0.
 + * If we don't protect the lport we'd spew incorrect frames.
-+ * 
++ *
 + * At the time of this writing there are two primary mutexes, one for the
 + * lport and one for the rport. Since the lport uses the rport and makes
 + * calls into that block the rport should never make calls that would cause
@@ -5549,7 +5549,7 @@ index 107b304..651a3ed 100644
 -                      BUG();
 -                      break;
 +      if (!fp || PTR_ERR(fp) == -FC_EX_TIMEOUT) {
-+              /* 
++              /*
 +               * Memory allocation failure, or the exchange timed out.
 +               *  Retry after delay
 +               */
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.drivers/open-fcoe-beta5-update
rename to src/patches/suse-2.6.27.39/patches.drivers/open-fcoe-beta5-update
index 34b5cec752c565d416d8a607885bee4f0ec5c7b6..b79374280f7b1cc91414e734f0d05daa528bee14 100644 (file)
@@ -1552,15 +1552,6 @@ diff --git a/drivers/scsi/libfc/fc_lport.c b/drivers/scsi/libfc/fc_lport.c
 index bfbc7d4..7e7c060 100644
 --- a/drivers/scsi/libfc/fc_lport.c
 +++ b/drivers/scsi/libfc/fc_lport.c
-@@ -28,7 +28,7 @@
-  * the lport to be reset before we fill out the frame header's port_id. The
-  * problem is that a reset would cause the lport's port_id to reset to 0.
-  * If we don't protect the lport we'd spew incorrect frames.
-- * 
-+ *
-  * At the time of this writing there are two primary mutexes, one for the
-  * lport and one for the rport. Since the lport uses the rport and makes
-  * calls into that block the rport should never make calls that would cause
 @@ -537,7 +537,7 @@ void fc_linkdown(struct fc_lport *lport)
        if ((lport->link_status & FC_LINK_UP) == FC_LINK_UP) {
                lport->link_status &= ~(FC_LINK_UP);
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-5.01.00-k8_sles11-03-update
rename to src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-5.01.00-k8_sles11-03-update
index 847c377e57275a0bcda704a202549fbe9e1ae3b1..b32c84440ca6e358e132915264c3afc8840b3016 100644 (file)
@@ -13,15 +13,15 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  drivers/scsi/qla4xxx/ql4_dbg.h     |   59 ++--
  drivers/scsi/qla4xxx/ql4_def.h     |   11 
  drivers/scsi/qla4xxx/ql4_glbl.h    |   10 
- drivers/scsi/qla4xxx/ql4_init.c    |  172 +++++++-----
+ drivers/scsi/qla4xxx/ql4_init.c    |  166 +++++++-----
  drivers/scsi/qla4xxx/ql4_inline.h  |  143 ++++++++++
- drivers/scsi/qla4xxx/ql4_iocb.c    |  161 +----------
- drivers/scsi/qla4xxx/ql4_isr.c     |   36 +-
- drivers/scsi/qla4xxx/ql4_mbx.c     |   11 
- drivers/scsi/qla4xxx/ql4_os.c      |  499 ++++++++++++++++++++-----------------
+ drivers/scsi/qla4xxx/ql4_iocb.c    |  161 +-----------
+ drivers/scsi/qla4xxx/ql4_isr.c     |   31 +-
+ drivers/scsi/qla4xxx/ql4_mbx.c     |    7 
+ drivers/scsi/qla4xxx/ql4_os.c      |  495 ++++++++++++++++++++-----------------
  drivers/scsi/qla4xxx/ql4_os.h      |  125 +++++++++
  drivers/scsi/qla4xxx/ql4_version.h |    3 
- 12 files changed, 736 insertions(+), 530 deletions(-)
+ 12 files changed, 727 insertions(+), 520 deletions(-)
 
 --- a/drivers/scsi/qla4xxx/ql4_dbg.c
 +++ b/drivers/scsi/qla4xxx/ql4_dbg.c
@@ -285,15 +285,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  static void ql4xxx_set_mac_number(struct scsi_qla_host *ha)
  {
        uint32_t value;
-@@ -52,15 +50,14 @@ static void ql4xxx_set_mac_number(struct
- }
- /**
-- * qla4xxx_free_ddb - deallocate ddb  
-+ * qla4xxx_free_ddb - deallocate ddb
-  * @ha: pointer to host adapter structure.
-  * @ddb_entry: pointer to device database entry
-  *
+@@ -59,8 +57,7 @@ static void ql4xxx_set_mac_number(struct
   * This routine deallocates and unlinks the specified ddb_entry from the
   * adapter's
   **/
@@ -323,15 +315,6 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                                        "failed\n", __func__, fw_ddb_index));
                                goto exit_ddb_list;
                        }
-@@ -488,7 +485,7 @@ static int qla4xxx_build_ddb_list(struct
-                       ddb_entry->connection_id = conn_id;
-                       qla4xxx_fill_ddb(ddb_entry, fw_ddb_entry);
-                       ddb_entry->fw_ddb_device_state = ddb_state;
--                      
-+
-                       if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) {
-                               atomic_set(&ddb_entry->state, DDB_STATE_ONLINE);
-                               dev_info(&ha->pdev->dev,
 @@ -695,6 +692,8 @@ static int qla4xxx_initialize_ddb_list(s
  
        qla4xxx_flush_AENS(ha);
@@ -391,15 +374,6 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS)
                        return QLA_ERROR;
        }
-@@ -1083,7 +1081,7 @@ static int qla4xxx_start_firmware(struct
-  * @renew_ddb_list: Indicates what to do with the adapter's ddb list
-  *    after adapter recovery has completed.
-  *    0=preserve ddb list, 1=destroy and rebuild ddb list
-- * 
-+ *
-  * This routine parforms all of the steps necessary to initialize the adapter.
-  *
-  **/
 @@ -1119,12 +1117,12 @@ int qla4xxx_initialize_adapter(struct sc
         * followed by 0x8014 aen" to trigger the tgt discovery process.
         */
@@ -432,12 +406,12 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
        }
  
 -      if (!found)
--              ddb_entry = qla4xxx_alloc_ddb(ha, fw_ddb_index);
++      if (!found) {
+               ddb_entry = qla4xxx_alloc_ddb(ha, fw_ddb_index);
 -      else if (ddb_entry->fw_ddb_index != fw_ddb_index) {
 -              /* Target has been bound to a new fw_ddb_index */
 -              qla4xxx_free_ddb(ha, ddb_entry);
-+      if (!found) {
-               ddb_entry = qla4xxx_alloc_ddb(ha, fw_ddb_index);
+-              ddb_entry = qla4xxx_alloc_ddb(ha, fw_ddb_index);
 -      }
  
 -      if (ddb_entry == NULL) {
@@ -555,7 +529,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  
 -              DEBUG6(dev_info(&ha->pdev->dev, "%s conn startddb_entry 0x%p"
 -                      " sess 0x%p conn 0x%p\n",
--                      __func__, ddb_entry, ddb_entry->sess, ddb_entry->conn)); 
+-                      __func__, ddb_entry, ddb_entry->sess, ddb_entry->conn));
 -
 -              qla4xxx_conn_start(ddb_entry->conn);
 -
@@ -963,7 +937,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  
  /**
   * qla4xxx_status_entry - processes status IOCBs
-@@ -59,8 +60,8 @@ static void qla4xxx_status_entry(struct 
+@@ -59,8 +60,8 @@ static void qla4xxx_status_entry(struct
                        break;
                }
                if (sts_entry->iscsiFlags & ISCSI_FLAG_RESIDUAL_UNDER) {
@@ -974,7 +948,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                                   cmd->underflow)) {
                                cmd->result = DID_ERROR << 16;
                                break;
-@@ -144,7 +145,7 @@ static void qla4xxx_status_entry(struct 
+@@ -144,7 +145,7 @@ static void qla4xxx_status_entry(struct
                        break;
                }
  
@@ -983,7 +957,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  
                /*
                 * If there is scsi_status, it takes precedense over
-@@ -184,7 +185,7 @@ static void qla4xxx_status_entry(struct 
+@@ -184,7 +185,7 @@ static void qla4xxx_status_entry(struct
                        if ((sts_entry->iscsiFlags &
                             ISCSI_FLAG_RESIDUAL_UNDER) == 0) {
                                cmd->result = DID_BUS_BUSY << 16;
@@ -992,7 +966,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                                   cmd->underflow) {
                                /*
                                 * Handle mid-layer underflow???
-@@ -203,7 +204,7 @@ static void qla4xxx_status_entry(struct 
+@@ -203,7 +204,7 @@ static void qla4xxx_status_entry(struct
                                        "resid = 0x%x, compstat = 0x%x\n",
                                        ha->host_no, cmd->device->channel,
                                        cmd->device->id, cmd->device->lun,
@@ -1049,19 +1023,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                        break;
  
                case MBOX_ASTS_HEARTBEAT:
-@@ -470,9 +471,9 @@ static void qla4xxx_isr_decode_mailbox(s
-                       mbox_stat2 = readl(&ha->reg->mailbox[2]);
-                       mbox_stat3 = readl(&ha->reg->mailbox[3]);
--                      if ((mbox_stat3 == 5) && (mbox_stat2 == 3)) 
-+                      if ((mbox_stat3 == 5) && (mbox_stat2 == 3))
-                               set_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags);
--                      else if ((mbox_stat3 == 2) && (mbox_stat2 == 5)) 
-+                      else if ((mbox_stat3 == 2) && (mbox_stat2 == 5))
-                               set_bit(DPC_RESET_HA, &ha->dpc_flags);
-                       break;
-@@ -591,10 +592,10 @@ void qla4xxx_interrupt_service_routine(s
+@@ -591,8 +592,9 @@ void qla4xxx_interrupt_service_routine(s
   * qla4xxx_intr_handler - hardware interrupt handler.
   * @irq: Unused
   * @dev_id: Pointer to host adapter structure
@@ -1070,11 +1032,9 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
 -irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id)
 +QL_DECLARE_INTR_HANDLER(qla4xxx_intr_handler, irq, dev_id, regs)
  {
--
        struct scsi_qla_host *ha;
        uint32_t intr_status;
-       unsigned long flags = 0;
-@@ -625,8 +626,7 @@ irqreturn_t qla4xxx_intr_handler(int irq
+@@ -624,8 +626,7 @@ irqreturn_t qla4xxx_intr_handler(int irq
                        intr_status = readl(&ha->reg->ctrl_status);
  
                if ((intr_status &
@@ -1084,7 +1044,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                        if (reqs_count == 0)
                                ha->spurious_int_count++;
                        break;
-@@ -662,6 +662,8 @@ irqreturn_t qla4xxx_intr_handler(int irq
+@@ -661,6 +662,8 @@ irqreturn_t qla4xxx_intr_handler(int irq
                        break;
                } else if (intr_status & CSR_SCSI_RESET_INTR) {
                        clear_bit(AF_ONLINE, &ha->flags);
@@ -1120,17 +1080,6 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
        mutex_lock(&ha->mbox_sem);
        clear_bit(AF_MBOX_COMMAND, &ha->flags);
        mutex_unlock(&ha->mbox_sem);
-@@ -851,8 +855,8 @@ int qla4xxx_get_flash(struct scsi_qla_ho
-  * qla4xxx_get_fw_version - gets firmware version
-  * @ha: Pointer to host adapter structure.
-  *
-- * Retrieves the firmware version on HBA. In QLA4010, mailboxes 2 & 3 may 
-- * hold an address for data.  Make sure that we write 0 to those mailboxes, 
-+ * Retrieves the firmware version on HBA. In QLA4010, mailboxes 2 & 3 may
-+ * hold an address for data.  Make sure that we write 0 to those mailboxes,
-  * if unused.
-  **/
- int qla4xxx_get_fw_version(struct scsi_qla_host * ha)
 @@ -882,8 +886,7 @@ int qla4xxx_get_fw_version(struct scsi_q
        return QLA_SUCCESS;
  }
@@ -1449,7 +1398,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
        ddb_entry->ha = ha;
        ddb_entry->sess = sess;
        return ddb_entry;
-@@ -371,9 +389,9 @@ void qla4xxx_mark_device_missing(struct 
+@@ -371,9 +389,9 @@ void qla4xxx_mark_device_missing(struct
  }
  
  static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,
@@ -1701,14 +1650,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                spin_lock_irqsave(&ha->hardware_lock, flags);
                writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status);
                readl(&ha->reg->ctrl_status);
-@@ -881,14 +890,13 @@ static void qla4xxx_flush_active_srbs(st
-  * qla4xxx_recover_adapter - recovers adapter after a fatal error
-  * @ha: Pointer to host adapter structure.
-  **/
--static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) 
-+static int qla4xxx_recover_adapter(struct scsi_qla_host *ha)
- {
-       int status;
+@@ -887,8 +896,7 @@ static int qla4xxx_recover_adapter(struc
  
        /* Stall incoming I/O until we are done */
        clear_bit(AF_ONLINE, &ha->flags);
@@ -1811,7 +1753,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                        qla4xxx_recover_adapter(ha);
  
                if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
-@@ -1025,14 +1034,15 @@ static void qla4xxx_do_dpc(struct work_s
+@@ -1025,10 +1034,11 @@ static void qla4xxx_do_dpc(struct work_s
                                        break;
                                msleep(1000);
                        }
@@ -1825,11 +1767,6 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                        qla4xxx_flush_active_srbs(ha);
                        if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) {
                                qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
--                              status = qla4xxx_initialize_adapter(ha, 
-+                              status = qla4xxx_initialize_adapter(ha,
-                                               PRESERVE_DDB_LIST);
-                       }
-                       clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
 @@ -1049,13 +1059,42 @@ static void qla4xxx_do_dpc(struct work_s
        if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags))
                qla4xxx_get_dhcp_ip_address(ha);
@@ -1875,7 +1812,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
                                qla4xxx_relogin_device(ha, ddb_entry);
  
                        /*
-@@ -1092,7 +1131,7 @@ static void qla4xxx_free_adapter(struct 
+@@ -1092,7 +1131,7 @@ static void qla4xxx_free_adapter(struct
  
        /* Issue Soft Reset to put firmware in unknown state */
        if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS)
@@ -2160,7 +2097,7 @@ Signed-off-by: Hannes Reinecke <hare@suse.de>
  
        ret = SUCCESS;
  
-@@ -1635,7 +1689,7 @@ static int qla4xxx_eh_host_reset(struct 
+@@ -1635,7 +1689,7 @@ static int qla4xxx_eh_host_reset(struct
        }
  
        dev_info(&ha->pdev->dev, "HOST RESET %s.\n",
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-5.01.00-k8_sles11-04-update
rename to src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-5.01.00-k8_sles11-04-update
index 473e3db30906e3dad01411c64a323808f5964832..a29284bd795fac80e6fb0fbf314e456db2bea6c3 100644 (file)
@@ -114,15 +114,6 @@ index 3b38d79..cc17469 100644
        memcpy(&ddb_entry->iscsi_name[0], &fw_ddb_entry->iscsi_name[0],
                min(sizeof(ddb_entry->iscsi_name),
                sizeof(fw_ddb_entry->iscsi_name)));
-@@ -396,7 +391,7 @@ struct ddb_entry * qla4xxx_alloc_ddb(struct scsi_qla_host *ha,
-  * @ha: Pointer to host adapter structure.
-  *
-  * This routine searches for all valid firmware ddb entries and builds
-- * an internal ddb list. Ddbs that are considered valid are those with 
-+ * an internal ddb list. Ddbs that are considered valid are those with
-  * a device state of SESSION_ACTIVE.
-  **/
- static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
 @@ -486,19 +481,6 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
                        qla4xxx_fill_ddb(ddb_entry, fw_ddb_entry);
                        ddb_entry->fw_ddb_device_state = ddb_state;
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors-update b/src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-correct-extended-sense-data-errors-update
new file mode 100644 (file)
index 0000000..0455f04
--- /dev/null
@@ -0,0 +1,120 @@
+From: David Wagner <david.wagner@qlogic.com>
+Date: Mon, 7 Sep 2009 14:17:49 +0200
+Subject: qla4xxx: Correct Extended Sense Data Errors - UPDATE
+References: bnc#483706
+
+Updated algorithm to use srb data variables instead of scsi command scratchpad
+data area, as scratchpad area is already used.
+
+Signed-off-by: David Wagner <david.wagner@qlogic.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/qla4xxx/ql4_def.h |    5 +++++
+ drivers/scsi/qla4xxx/ql4_isr.c |   34 +++++++++++++++-------------------
+ 2 files changed, 20 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/scsi/qla4xxx/ql4_def.h b/drivers/scsi/qla4xxx/ql4_def.h
+index f8ea527..7c6b22c 100644
+--- a/drivers/scsi/qla4xxx/ql4_def.h
++++ b/drivers/scsi/qla4xxx/ql4_def.h
+@@ -183,6 +183,11 @@ struct srb {
+       uint16_t iocb_cnt;      /* Number of used iocbs */
+       uint16_t cc_stat;
+       uint32_t dma_len;
++
++      /* Used for extended sense / status continuation */
++      uint8_t *req_sense_ptr;
++      uint16_t req_sense_len;
++      uint16_t reserved2;
+ };
+       /*
+diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
+index c3354b8..31df8c8 100644
+--- a/drivers/scsi/qla4xxx/ql4_isr.c
++++ b/drivers/scsi/qla4xxx/ql4_isr.c
+@@ -25,7 +25,7 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
+       struct scsi_cmnd *cmd = srb->cmd;
+       uint16_t sense_len;
+-      memset(cmd->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
++      memset(cmd->sense_buffer, 0, sizeof(cmd->sense_buffer));
+       sense_len = le16_to_cpu(sts_entry->senseDataByteCnt);
+       if (sense_len == 0)
+               return;
+@@ -33,16 +33,15 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
+       /* Save total available sense length,
+        * not to exceed cmd's sense buffer size */
+       sense_len = min_t(uint16_t, sense_len, SCSI_SENSE_BUFFERSIZE);
+-      cmd->SCp.ptr = cmd->sense_buffer;
+-      cmd->SCp.this_residual = sense_len;
++      srb->req_sense_ptr = cmd->sense_buffer;
++      srb->req_sense_len = sense_len;
+       /* Copy sense from sts_entry pkt */
+       sense_len = min_t(uint16_t, sense_len, IOCB_MAX_SENSEDATA_LEN);
+       memcpy(cmd->sense_buffer, sts_entry->senseData, sense_len);
+       DEBUG2(printk("scsi%ld:%d:%d:%d: %s: sense key = %x, "
+-              "Addl.SenseLen - %02x, "
+-              "ASC/ASCQ = %02x/%02x\n", ha->host_no,
++              "ASL= %02x, ASC/ASCQ = %02x/%02x\n", ha->host_no,
+               cmd->device->channel, cmd->device->id,
+               cmd->device->lun, __func__,
+               sts_entry->senseData[2] & 0x0f,
+@@ -50,13 +49,13 @@ static void qla4xxx_copy_sense(struct scsi_qla_host *ha,
+               sts_entry->senseData[12],
+               sts_entry->senseData[13]));
+-      DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len));
++      DEBUG5(qla4xxx_dump_buffer(cmd->sense_buffer, sense_len));
+       srb->flags |= SRB_GOT_SENSE;
+       /* Update srb, in case a sts_cont pkt follows */
+-      cmd->SCp.ptr += sense_len;
+-      cmd->SCp.this_residual -= sense_len;
+-      if (cmd->SCp.this_residual != 0)
++      srb->req_sense_ptr += sense_len;
++      srb->req_sense_len -= sense_len;
++      if (srb->req_sense_len != 0)
+               ha->status_srb = srb;
+       else
+               ha->status_srb = NULL;
+@@ -77,11 +76,8 @@ qla4xxx_status_cont_entry(struct scsi_qla_host *ha,
+       struct scsi_cmnd *cmd;
+       uint8_t sense_len;
+-      if (srb == NULL) {
+-              DEBUG2(printk("scsi%ld: %s: Throw away extra STATUS CONTINUATION\n",
+-                      ha->host_no, __func__));
++      if (srb == NULL)
+               return;
+-      }
+       cmd = srb->cmd;
+       if (cmd == NULL) {
+@@ -92,15 +88,15 @@ qla4xxx_status_cont_entry(struct scsi_qla_host *ha,
+       }
+       /* Copy sense data. */
+-      sense_len = min(cmd->SCp.this_residual, IOCB_MAX_EXT_SENSEDATA_LEN);
+-      memcpy(cmd->SCp.ptr, sts_cont->extSenseData, sense_len);
+-      DEBUG5(qla4xxx_dump_buffer(cmd->SCp.ptr, sense_len));
++      sense_len = min(srb->req_sense_len, (uint16_t) IOCB_MAX_EXT_SENSEDATA_LEN);
++      memcpy(srb->req_sense_ptr, sts_cont->extSenseData, sense_len);
++      DEBUG5(qla4xxx_dump_buffer(srb->req_sense_ptr, sense_len));
+-      cmd->SCp.ptr += sense_len;
+-      cmd->SCp.this_residual -= sense_len;
++      srb->req_sense_ptr += sense_len;
++      srb->req_sense_len -= sense_len;
+       /* Place command on done queue. */
+-      if (cmd->SCp.this_residual == 0) {
++      if (srb->req_sense_len == 0) {
+               qla4xxx_srb_compl(ha, srb);
+               ha->status_srb = NULL;
+       }
+-- 
+1.5.3.2
+
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.drivers/qla4xxx-sles11-update
rename to src/patches/suse-2.6.27.39/patches.drivers/qla4xxx-sles11-update
index 060ad6412aa28dd200e4e866029bed79bd8bc60e..468a8fc275d384d60c55c0a81d659001ed7da9c7 100644 (file)
@@ -19,8 +19,7 @@ index 69cbff3..4eda26a 100644
 +      depends on PCI && SCSI
        select SCSI_ISCSI_ATTRS
        ---help---
--      This driver supports the QLogic 40xx (ISP4XXX) iSCSI host
-+      This driver supports the QLogic 40xx (ISP4XXX) iSCSI host 
+       This driver supports the QLogic 40xx (ISP4XXX) iSCSI host
        adapter family.
 diff --git a/drivers/scsi/qla4xxx/ql4_dbg.c b/drivers/scsi/qla4xxx/ql4_dbg.c
 index fcc184c..171a342 100644
@@ -648,15 +647,6 @@ index 109c5f5..6e83198 100644
  static struct ddb_entry * qla4xxx_alloc_ddb(struct scsi_qla_host *ha,
                                            uint32_t fw_ddb_index);
  
-@@ -44,7 +52,7 @@ static void ql4xxx_set_mac_number(struct scsi_qla_host *ha)
- }
- /**
-- * qla4xxx_free_ddb - deallocate ddb
-+ * qla4xxx_free_ddb - deallocate ddb  
-  * @ha: pointer to host adapter structure.
-  * @ddb_entry: pointer to device database entry
-  *
 @@ -58,8 +66,7 @@ static void qla4xxx_free_ddb(struct scsi_qla_host *ha,
        list_del_init(&ddb_entry->list);
  
@@ -894,15 +884,6 @@ index 109c5f5..6e83198 100644
        list_add_tail(&ddb_entry->list, &ha->ddb_list);
        ha->fw_ddb_index_map[fw_ddb_index] = ddb_entry;
        ha->tot_ddbs++;
-@@ -490,7 +399,7 @@ static struct ddb_entry * qla4xxx_alloc_ddb(struct scsi_qla_host *ha,
-  * @ha: Pointer to host adapter structure.
-  *
-  * This routine searches for all valid firmware ddb entries and builds
-- * an internal ddb list. Ddbs that are considered valid are those with
-+ * an internal ddb list. Ddbs that are considered valid are those with 
-  * a device state of SESSION_ACTIVE.
-  **/
- static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
 @@ -501,90 +410,116 @@ static int qla4xxx_build_ddb_list(struct scsi_qla_host *ha)
        uint32_t ddb_state;
        uint32_t conn_err, err_code;
@@ -1038,7 +1019,7 @@ index 109c5f5..6e83198 100644
 +                      ddb_entry->connection_id = conn_id;
 +                      qla4xxx_fill_ddb(ddb_entry, fw_ddb_entry);
 +                      ddb_entry->fw_ddb_device_state = ddb_state;
-+                      
++
 +                      if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) {
 +                              atomic_set(&ddb_entry->state, DDB_STATE_ONLINE);
 +                              dev_info(&ha->pdev->dev,
@@ -1201,15 +1182,6 @@ index 109c5f5..6e83198 100644
   * the QLA4010 adapter.
   **/
  static int qla4xxx_start_firmware(struct scsi_qla_host *ha)
-@@ -1127,7 +1083,7 @@ static int qla4xxx_start_firmware(struct scsi_qla_host *ha)
-  * @renew_ddb_list: Indicates what to do with the adapter's ddb list
-  *    after adapter recovery has completed.
-  *    0=preserve ddb list, 1=destroy and rebuild ddb list
-- *
-+ * 
-  * This routine parforms all of the steps necessary to initialize the adapter.
-  *
-  **/
 @@ -1211,51 +1167,81 @@ exit_init_hba:
   * This routine processes adds a device as a result of an 8014h AEN.
   **/
@@ -1379,7 +1351,7 @@ index 109c5f5..6e83198 100644
 +
 +              DEBUG6(dev_info(&ha->pdev->dev, "%s conn startddb_entry 0x%p"
 +                      " sess 0x%p conn 0x%p\n",
-+                      __func__, ddb_entry, ddb_entry->sess, ddb_entry->conn)); 
++                      __func__, ddb_entry, ddb_entry->sess, ddb_entry->conn));
 +
 +              qla4xxx_conn_start(ddb_entry->conn);
 +
@@ -1661,26 +1633,6 @@ index 799120f..dfe985b 100644
                if (ha->aen_log.count < MAX_AEN_ENTRIES) {
                        for (i = 0; i < MBOX_AEN_REG_COUNT; i++)
                                ha->aen_log.entry[ha->aen_log.count].mbox_sts[i] =
-@@ -480,9 +473,9 @@ static void qla4xxx_isr_decode_mailbox(struct scsi_qla_host * ha,
-                       mbox_stat2 = readl(&ha->reg->mailbox[2]);
-                       mbox_stat3 = readl(&ha->reg->mailbox[3]);
--                      if ((mbox_stat3 == 5) && (mbox_stat2 == 3))
-+                      if ((mbox_stat3 == 5) && (mbox_stat2 == 3)) 
-                               set_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags);
--                      else if ((mbox_stat3 == 2) && (mbox_stat2 == 5))
-+                      else if ((mbox_stat3 == 2) && (mbox_stat2 == 5)) 
-                               set_bit(DPC_RESET_HA, &ha->dpc_flags);
-                       break;
-@@ -604,6 +597,7 @@ void qla4xxx_interrupt_service_routine(struct scsi_qla_host * ha,
-  **/
- irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id)
- {
-+
-       struct scsi_qla_host *ha;
-       uint32_t intr_status;
-       unsigned long flags = 0;
 @@ -714,7 +708,17 @@ void qla4xxx_process_aen(struct scsi_qla_host * ha, uint8_t process_aen)
        int i;
        unsigned long flags;
@@ -2043,17 +1995,6 @@ index c577d79..dbd7218 100644
  
  int qla4xxx_get_flash(struct scsi_qla_host * ha, dma_addr_t dma_addr,
                      uint32_t offset, uint32_t len)
-@@ -782,8 +851,8 @@ int qla4xxx_get_flash(struct scsi_qla_host * ha, dma_addr_t dma_addr,
-  * qla4xxx_get_fw_version - gets firmware version
-  * @ha: Pointer to host adapter structure.
-  *
-- * Retrieves the firmware version on HBA. In QLA4010, mailboxes 2 & 3 may
-- * hold an address for data.  Make sure that we write 0 to those mailboxes,
-+ * Retrieves the firmware version on HBA. In QLA4010, mailboxes 2 & 3 may 
-+ * hold an address for data.  Make sure that we write 0 to those mailboxes, 
-  * if unused.
-  **/
- int qla4xxx_get_fw_version(struct scsi_qla_host * ha)
 @@ -835,7 +904,7 @@ static int qla4xxx_get_default_ddb(struct scsi_qla_host *ha,
        return QLA_SUCCESS;
  }
@@ -2557,7 +2498,7 @@ index 4255b36..a62188b 100644
   **/
 -static int qla4xxx_recover_adapter(struct scsi_qla_host *ha,
 -                              uint8_t renew_ddb_list)
-+static int qla4xxx_recover_adapter(struct scsi_qla_host *ha) 
++static int qla4xxx_recover_adapter(struct scsi_qla_host *ha)
  {
        int status;
  
@@ -2615,15 +2556,6 @@ index 4255b36..a62188b 100644
  
                if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
                        uint8_t wait_time = RESET_INTR_TOV;
-@@ -1036,7 +1032,7 @@ static void qla4xxx_do_dpc(struct work_struct *work)
-                       qla4xxx_flush_active_srbs(ha);
-                       if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) {
-                               qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
--                              status = qla4xxx_initialize_adapter(ha,
-+                              status = qla4xxx_initialize_adapter(ha, 
-                                               PRESERVE_DDB_LIST);
-                       }
-                       clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
 @@ -1070,8 +1066,8 @@ static void qla4xxx_do_dpc(struct work_struct *work)
                         */
                        if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
diff --git a/src/patches/suse-2.6.27.39/patches.drivers/sky2-no-link-at-probe.patch b/src/patches/suse-2.6.27.39/patches.drivers/sky2-no-link-at-probe.patch
new file mode 100644 (file)
index 0000000..74c7f1f
--- /dev/null
@@ -0,0 +1,38 @@
+From: Brandon Philips <bphilips@suse.de>
+Subject: sky2: assume no link at probe
+References: bnc#539010
+Patch-Mainline: queued in net-2.6 2009-10-31 and trivial
+
+Before bringing up a sky2 interface up ethtool reports 
+"Link detected: yes". Do as ixgbe does and netif_carrier_off() on
+probe().
+
+Signed-off-by: Brandon Philips <bphilips@suse.de>
+
+---
+ drivers/net/sky2.c |    5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/drivers/net/sky2.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/net/sky2.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/net/sky2.c
+@@ -1908,7 +1908,7 @@ static void sky2_link_down(struct sky2_p
+       netif_carrier_off(sky2->netdev);
+-      /* Turn on link LED */
++      /* Turn off link LED */
+       sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF);
+       if (netif_msg_link(sky2))
+@@ -4290,6 +4290,9 @@ static int __devinit sky2_probe(struct p
+               goto err_out_free_netdev;
+       }
++      /* assume no link at probe */
++      netif_carrier_off(dev);
++
+       netif_napi_add(dev, &hw->napi, sky2_poll, NAPI_WEIGHT);
+       err = request_irq(pdev->irq, sky2_intr,
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.fixes/0020-md-support-bitmaps-on-RAID10-arrays-larger-then-2-te.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/0020-md-support-bitmaps-on-RAID10-arrays-larger-then-2-te.patch
index 97363c01fd2088346f72a1da8271f8afca5b20cb..be09323994423c2944b4f4f2d29137c97012b00a 100644 (file)
@@ -31,7 +31,7 @@ Signed-off-by: NeilBrown <neilb@suse.de>
        /* now that chunksize and chunkshift are set, we can use these macros */
 -      chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) /
 -                      CHUNK_BLOCK_RATIO(bitmap);
-+      chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) >>
++      chunks = (blocks + CHUNK_BLOCK_RATIO(bitmap) - 1) >>
 +                      CHUNK_BLOCK_SHIFT(bitmap);
        pages = (chunks + PAGE_COUNTER_RATIO - 1) / PAGE_COUNTER_RATIO;
  
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/bonding-net-move-last_rx-update-into-bonding-recv-logic b/src/patches/suse-2.6.27.39/patches.fixes/bonding-net-move-last_rx-update-into-bonding-recv-logic
new file mode 100644 (file)
index 0000000..dd9cf90
--- /dev/null
@@ -0,0 +1,119 @@
+From: Jay Vosburgh <fubar@us.ibm.com>
+Date: Tue, 4 Nov 2008 02:16:50 +0000 (-0800)
+Subject: bonding, net: Move last_rx update into bonding recv logic
+Patch-mainline: v2.6.29-rc1
+Git-commit: 6cf3f41e6c08bca6641a695449791c38a25f35ff
+References: bnc#532443
+
+bonding, net: Move last_rx update into bonding recv logic
+
+       The only user of the net_device->last_rx field is bonding.
+This patch adds a conditional update of last_rx to the bonding special
+logic in skb_bond_should_drop, causing last_rx to only be updated when
+the ARP monitor is running.
+
+       This frees network device drivers from the necessity of
+updating last_rx, which can have cache line thrash issues.
+
+Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Acked-by: Jeff Mahoney <jeffm@suse.com>
+---
+
+ drivers/net/bonding/bond_main.c  |    2 ++
+ drivers/net/bonding/bond_sysfs.c |    3 +++
+ include/linux/if.h               |    1 +
+ include/linux/netdevice.h        |   32 ++++++++++++++++++--------------
+ 4 files changed, 24 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index 56c823c..39575d7 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -4564,6 +4564,8 @@ static int bond_init(struct net_device *bond_dev, struct bond_params *params)
+       bond_dev->tx_queue_len = 0;
+       bond_dev->flags |= IFF_MASTER|IFF_MULTICAST;
+       bond_dev->priv_flags |= IFF_BONDING;
++      if (bond->params.arp_interval)
++              bond_dev->priv_flags |= IFF_MASTER_ARPMON;
+       /* At first, we block adding VLANs. That's the only way to
+        * prevent problems that occur when adding VLANs over an
+diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
+index 296a865..e400d7d 100644
+--- a/drivers/net/bonding/bond_sysfs.c
++++ b/drivers/net/bonding/bond_sysfs.c
+@@ -620,6 +620,8 @@ static ssize_t bonding_store_arp_interval(struct device *d,
+              ": %s: Setting ARP monitoring interval to %d.\n",
+              bond->dev->name, new_value);
+       bond->params.arp_interval = new_value;
++      if (bond->params.arp_interval)
++              bond->dev->priv_flags |= IFF_MASTER_ARPMON;
+       if (bond->params.miimon) {
+               printk(KERN_INFO DRV_NAME
+                      ": %s: ARP monitoring cannot be used with MII monitoring. "
+@@ -1039,6 +1041,7 @@ static ssize_t bonding_store_miimon(struct device *d,
+                              "ARP monitoring. Disabling ARP monitoring...\n",
+                              bond->dev->name);
+                       bond->params.arp_interval = 0;
++                      bond->dev->priv_flags &= ~IFF_MASTER_ARPMON;
+                       if (bond->params.arp_validate) {
+                               bond_unregister_arp(bond);
+                               bond->params.arp_validate =
+diff --git a/include/linux/if.h b/include/linux/if.h
+index 6524684..2a6e296 100644
+--- a/include/linux/if.h
++++ b/include/linux/if.h
+@@ -65,6 +65,7 @@
+ #define IFF_BONDING   0x20            /* bonding master or slave      */
+ #define IFF_SLAVE_NEEDARP 0x40                /* need ARPs for validation     */
+ #define IFF_ISATAP    0x80            /* ISATAP interface (RFC4214)   */
++#define IFF_MASTER_ARPMON 0x100               /* bonding master, ARP mon in use */
+ #define IF_GET_IFACE  0x0001          /* for querying only */
+ #define IF_GET_PROTO  0x0002
+diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h
+index 9d77b1d..f1b0dbe 100644
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1742,22 +1742,26 @@ static inline int skb_bond_should_drop(struct sk_buff *skb)
+       struct net_device *dev = skb->dev;
+       struct net_device *master = dev->master;
+-      if (master &&
+-          (dev->priv_flags & IFF_SLAVE_INACTIVE)) {
+-              if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
+-                  skb->protocol == __constant_htons(ETH_P_ARP))
+-                      return 0;
+-
+-              if (master->priv_flags & IFF_MASTER_ALB) {
+-                      if (skb->pkt_type != PACKET_BROADCAST &&
+-                          skb->pkt_type != PACKET_MULTICAST)
++      if (master) {
++              if (master->priv_flags & IFF_MASTER_ARPMON)
++                      dev->last_rx = jiffies;
++
++              if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
++                      if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
++                          skb->protocol == __constant_htons(ETH_P_ARP))
+                               return 0;
+-              }
+-              if (master->priv_flags & IFF_MASTER_8023AD &&
+-                  skb->protocol == __constant_htons(ETH_P_SLOW))
+-                      return 0;
+-              return 1;
++                      if (master->priv_flags & IFF_MASTER_ALB) {
++                              if (skb->pkt_type != PACKET_BROADCAST &&
++                                  skb->pkt_type != PACKET_MULTICAST)
++                                      return 0;
++                      }
++                      if (master->priv_flags & IFF_MASTER_8023AD &&
++                          skb->protocol == __constant_htons(ETH_P_SLOW))
++                              return 0;
++
++                      return 1;
++              }
+       }
+       return 0;
+ }
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.fixes/bug-502026_fix_apicid_panic.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/bug-502026_fix_apicid_panic.patch
index 863db2b3a2c8d9bf82f750197d0cfdc3a15b4bb7..c2ea618ee7a883d2caa62fd5d8c03f57df3701ba 100644 (file)
@@ -14,7 +14,7 @@ Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
 
 --- a/arch/x86/kernel/apic_64.c
 +++ b/arch/x86/kernel/apic_64.c
-@@ -928,6 +928,18 @@ void enable_x2apic(void)
+@@ -955,6 +955,18 @@ void enable_x2apic(void)
        }
  }
  
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/cifs-fix-ssh-tunneled-mounts b/src/patches/suse-2.6.27.39/patches.fixes/cifs-fix-ssh-tunneled-mounts
new file mode 100644 (file)
index 0000000..19305a6
--- /dev/null
@@ -0,0 +1,115 @@
+From: Suresh Jayaraman <sjayaraman@suse.de>
+Subject: [PATCH] cifs: fix broken mounts when a SSH tunnel is used (try #4)
+References: bnc#527754
+Patch-mainline: in cifs-2.6.git (merge expected in 2.6.32-rcX)
+    
+    It seems there is a regression that got introduced while Jeff fixed
+    all the mount/umount races. While attempting to find whether a tcp
+    session is already existing, we were not checking whether the "port"
+    used are the same. When a second mount is attempted with a different
+    "port=" option, it is being ignored. Because of this the cifs mounts
+    that uses a SSH tunnel appears to be broken.
+    
+    Steps to reproduce:
+    
+    1. create 2 shares
+    # SSH Tunnel a SMB session
+    2. ssh -f -L 6111:127.0.0.1:445 root@localhost "sleep 86400"
+    3. ssh -f -L 6222:127.0.0.1:445 root@localhost "sleep 86400"
+    4. tcpdump -i lo 6111 &
+    5. mkdir -p /mnt/mnt1
+    6. mkdir -p /mnt/mnt2
+    7. mount.cifs //localhost/a /mnt/mnt1 -o username=guest,ip=127.0.0.1,port=6111
+    #(shows tcpdump activity on port 6111)
+    8. mount.cifs //localhost/b /mnt/mnt2 -o username=guest,ip=127.0.0.1,port=6222
+    #(shows tcpdump activity only on port 6111 and not on 6222
+    
+    Fix by adding a check to compare the port _only_ if the user tries to
+    override the tcp port with "port=" option, before deciding that an
+    existing tcp session is found. Also, clean up a bit by replacing
+    if-else if by a switch statment while at it as suggested by Jeff.
+    
+Reviewed-by: Jeff Layton <jlayton@redhat.com>
+Reviewed-by: Shirish Pargaonkar <shirishp@us.ibm.com>
+Signed-off-by: Suresh Jayaraman <sjayaraman@suse.de>
+Signed-off-by: Steve French <sfrench@us.ibm.com>
+---
+ fs/cifs/connect.c |   44 ++++++++++++++++++++++++++++++++++----------
+ 1 file changed, 34 insertions(+), 10 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/fs/cifs/connect.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/cifs/connect.c
++++ linux-2.6.27-SLE11_BRANCH/fs/cifs/connect.c
+@@ -35,6 +35,7 @@
+ #include <linux/freezer.h>
+ #include <asm/uaccess.h>
+ #include <asm/processor.h>
++#include <net/ipv6.h>
+ #include "cifspdu.h"
+ #include "cifsglob.h"
+ #include "cifsproto.h"
+@@ -1349,7 +1350,7 @@ cifs_parse_mount_options(char *options,
+ }
+ static struct TCP_Server_Info *
+-cifs_find_tcp_session(struct sockaddr_storage *addr)
++cifs_find_tcp_session(struct sockaddr_storage *addr, unsigned short int port)
+ {
+       struct list_head *tmp;
+       struct TCP_Server_Info *server;
+@@ -1369,14 +1370,37 @@ cifs_find_tcp_session(struct sockaddr_st
+               if (server->tcpStatus == CifsNew)
+                       continue;
+-              if (addr->ss_family == AF_INET &&
+-                  (addr4->sin_addr.s_addr !=
+-                   server->addr.sockAddr.sin_addr.s_addr))
+-                      continue;
+-              else if (addr->ss_family == AF_INET6 &&
+-                       memcmp(&server->addr.sockAddr6.sin6_addr,
+-                              &addr6->sin6_addr, sizeof(addr6->sin6_addr)))
+-                      continue;
++              switch (addr->ss_family) {
++              case AF_INET:
++                      if (addr4->sin_addr.s_addr ==
++                          server->addr.sockAddr.sin_addr.s_addr) {
++                              addr4->sin_port = htons(port);
++                              /* user overrode default port? */
++                              if (addr4->sin_port) {
++                                      if (addr4->sin_port !=
++                                          server->addr.sockAddr.sin_port)
++                                              continue;
++                              }
++                              break;
++                      } else
++                              continue;
++
++              case AF_INET6:
++                      if (ipv6_addr_equal(&addr6->sin6_addr,
++                          &server->addr.sockAddr6.sin6_addr) &&
++                          (addr6->sin6_scope_id ==
++                          server->addr.sockAddr6.sin6_scope_id)) {
++                              addr6->sin6_port = htons(port);
++                              /* user overrode default port? */
++                              if (addr6->sin6_port) {
++                                      if (addr6->sin6_port !=
++                                         server->addr.sockAddr6.sin6_port)
++                                              continue;
++                              }
++                              break;
++                      } else
++                              continue;
++              }
+               ++server->srv_count;
+               write_unlock(&cifs_tcp_ses_lock);
+@@ -2111,7 +2135,7 @@ cifs_mount(struct super_block *sb, struc
+               }
+       }
+-      srvTcp = cifs_find_tcp_session(&addr);
++      srvTcp = cifs_find_tcp_session(&addr, volume_info.port);
+       if (!srvTcp) { /* create socket */
+               if (addr.ss_family == AF_INET6) {
+                       cFYI(1, ("attempting ipv6 connect"));
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.fixes/cpufreq_ondemand_performance_optimise_default_settings.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/cpufreq_ondemand_performance_optimise_default_settings.patch
index 1c5b806116ae733411e58b335c3595c66c2f043c..2224839fe0f1a1555ce5d6826f48b15d914fda12 100644 (file)
@@ -37,7 +37,7 @@ Index: linux-2.6.27/drivers/cpufreq/cpufreq_ondemand.c
                        if (def_sampling_rate < MIN_STAT_SAMPLING_RATE)
                                def_sampling_rate = MIN_STAT_SAMPLING_RATE;
  
-+                      /* 
++                      /*
 +                       * Cut def_sampling rate to 300ms if it was above,
 +                       * still consider to not set it above latency
 +                       * transition * 100
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/dlm-close-connection-2.patch b/src/patches/suse-2.6.27.39/patches.fixes/dlm-close-connection-2.patch
new file mode 100644 (file)
index 0000000..8488ca0
--- /dev/null
@@ -0,0 +1,68 @@
+commit 063c4c99630c0b06afad080d2a18bda64172c1a2
+Author: Lars Marowsky-Bree <lmb@suse.de>
+From: Lars Marowsky-Bree <lmb@suse.de>
+Date:   Tue Aug 11 16:18:23 2009 -0500
+Reference: bnc#524222
+Subject:    dlm: fix connection close handling
+    
+    Closing a connection to a node can create problems if there are
+    outstanding messages for that node.  The problems include dlm_send
+    spinning attempting to reconnect, or BUG from tcp_connect_to_sock()
+    attempting to use a partially closed connection.
+    
+    To cleanly close a connection, we now first attempt to send any pending
+    messages, cancel any remaining workqueue work, and flag the connection
+    as closed to avoid reconnect attempts.
+    
+Signed-off-by: Lars Marowsky-Bree <lmb@suse.de>
+Signed-off-by: Christine Caulfield <ccaulfie@redhat.com>
+Signed-off-by: David Teigland <teigland@redhat.com>
+
+diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
+index 210d52c..bda690c 100644
+--- a/fs/dlm/lowcomms.c
++++ b/fs/dlm/lowcomms.c
+@@ -106,6 +106,7 @@ struct connection {
+ #define CF_CONNECT_PENDING 3
+ #define CF_INIT_PENDING 4
+ #define CF_IS_OTHERCON 5
++#define CF_CLOSE 6
+       struct list_head writequeue;  /* List of outgoing writequeue_entries */
+       spinlock_t writequeue_lock;
+       int (*rx_action) (struct connection *); /* What to do when active */
+@@ -299,6 +300,8 @@ static void lowcomms_write_space(struct sock *sk)
+ static inline void lowcomms_connect_sock(struct connection *con)
+ {
++      if (test_bit(CF_CLOSE, &con->flags))
++              return;
+       if (!test_and_set_bit(CF_CONNECT_PENDING, &con->flags))
+               queue_work(send_workqueue, &con->swork);
+ }
+@@ -1368,6 +1371,13 @@ int dlm_lowcomms_close(int nodeid)
+       log_print("closing connection to node %d", nodeid);
+       con = nodeid2con(nodeid, 0);
+       if (con) {
++              clear_bit(CF_CONNECT_PENDING, &con->flags);
++              clear_bit(CF_WRITE_PENDING, &con->flags);
++              set_bit(CF_CLOSE, &con->flags);
++              if (cancel_work_sync(&con->swork))
++                      log_print("canceled swork for node %d", nodeid);
++              if (cancel_work_sync(&con->rwork))
++                      log_print("canceled rwork for node %d", nodeid);
+               clean_one_writequeue(con);
+               close_connection(con, true);
+       }
+@@ -1393,9 +1403,10 @@ static void process_send_sockets(struct work_struct *work)
+       if (test_and_clear_bit(CF_CONNECT_PENDING, &con->flags)) {
+               con->connect_action(con);
++              set_bit(CF_WRITE_PENDING, &con->flags);
+       }
+-      clear_bit(CF_WRITE_PENDING, &con->flags);
+-      send_to_sock(con);
++      if (test_and_clear_bit(CF_WRITE_PENDING, &con->flags))
++              send_to_sock(con);
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/dlm-enable-debug.patch b/src/patches/suse-2.6.27.39/patches.fixes/dlm-enable-debug.patch
new file mode 100644 (file)
index 0000000..2d1d858
--- /dev/null
@@ -0,0 +1,32 @@
+Subject: enable extended dlm debugging
+From: Lars Marovsky-Bree <lmb@suse.de>
+
+  This patch enable extended dlm debugging
+
+Signed-off-by: Lars Marovsky-Bree <lmb@suse.de>
+---
+Index: fs/dlm/Makefile
+===================================================================
+--- a/fs/dlm/Makefile
++++ b/fs/dlm/Makefile
+@@ -16,6 +16,6 @@ dlm-y :=                     ast.o \
+                               recoverd.o \
+                               requestqueue.o \
+                               user.o \
+-                              util.o 
+-dlm-$(CONFIG_DLM_DEBUG) +=    debug_fs.o
++                              util.o \
++                              debug_fs.o
+Index: fs/dlm/dlm_internal.h
+===================================================================
+--- a/fs/dlm/dlm_internal.h
++++ b/fs/dlm/dlm_internal.h
+@@ -587,6 +587,7 @@ void dlm_timeout_warn(struct dlm_lkb *lk
+ int dlm_plock_init(void);
+ void dlm_plock_exit(void);
++#define CONFIG_DLM_DEBUG 1
+ #ifdef CONFIG_DLM_DEBUG
+ int dlm_register_debugfs(void);
+ void dlm_unregister_debugfs(void);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/drm-r128-add-test-for-initialisation-to-all-ioctls-that-require-it b/src/patches/suse-2.6.27.39/patches.fixes/drm-r128-add-test-for-initialisation-to-all-ioctls-that-require-it
new file mode 100644 (file)
index 0000000..deec7d0
--- /dev/null
@@ -0,0 +1,227 @@
+From: Ben Hutchings <ben@decadent.org.uk>
+Date: Sun, 23 Aug 2009 15:59:04 +0000 (+0100)
+Subject: drm/r128: Add test for initialisation to all ioctls that require it
+Patch-mainline: v2.6.32-rc1
+Git-commit: 7dc482dfeeeefcfd000d4271c4626937406756d7
+References: bnc#548071 CVE-2009-3620
+
+drm/r128: Add test for initialisation to all ioctls that require it
+
+Almost all r128's private ioctls require that the CCE state has
+already been initialised.  However, most do not test that this has
+been done, and will proceed to dereference a null pointer.  This may
+result in a security vulnerability, since some ioctls are
+unprivileged.
+
+This adds a macro for the common initialisation test and changes all
+ioctl implementations that require prior initialisation to use that
+macro.
+
+Also, r128_do_init_cce() does not test that the CCE state has not
+been initialised already.  Repeated initialisation may lead to a crash
+or resource leak.  This adds that test.
+
+Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
+Signed-off-by: Dave Airlie <airlied@redhat.com>
+Acked-by: Jeff Mahoney <jeffm@suse.com>
+
+---
+ drivers/gpu/drm/r128/r128_cce.c   |   18 ++++++++++++++----
+ drivers/gpu/drm/r128/r128_drv.h   |    8 ++++++++
+ drivers/gpu/drm/r128/r128_state.c |   36 +++++++++++++++++++-----------------
+ 3 files changed, 41 insertions(+), 21 deletions(-)
+
+--- a/drivers/gpu/drm/r128/r128_cce.c
++++ b/drivers/gpu/drm/r128/r128_cce.c
+@@ -353,6 +353,11 @@ static int r128_do_init_cce(struct drm_d
+       DRM_DEBUG("\n");
++      if (dev->dev_private) {
++              DRM_DEBUG("called when already initialized\n");
++              return -EINVAL;
++      }
++
+       dev_priv = drm_alloc(sizeof(drm_r128_private_t), DRM_MEM_DRIVER);
+       if (dev_priv == NULL)
+               return -ENOMEM;
+@@ -651,6 +656,8 @@ int r128_cce_start(struct drm_device *de
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       if (dev_priv->cce_running || dev_priv->cce_mode == R128_PM4_NONPM4) {
+               DRM_DEBUG("while CCE running\n");
+               return 0;
+@@ -673,6 +680,8 @@ int r128_cce_stop(struct drm_device *dev
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       /* Flush any pending CCE commands.  This ensures any outstanding
+        * commands are exectuted by the engine before we turn it off.
+        */
+@@ -710,10 +719,7 @@ int r128_cce_reset(struct drm_device *de
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
+-      if (!dev_priv) {
+-              DRM_DEBUG("called before init done\n");
+-              return -EINVAL;
+-      }
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
+       r128_do_cce_reset(dev_priv);
+@@ -730,6 +736,8 @@ int r128_cce_idle(struct drm_device *dev
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       if (dev_priv->cce_running) {
+               r128_do_cce_flush(dev_priv);
+       }
+@@ -743,6 +751,8 @@ int r128_engine_reset(struct drm_device
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev->dev_private);
++
+       return r128_do_engine_reset(dev);
+ }
+--- a/drivers/gpu/drm/r128/r128_drv.h
++++ b/drivers/gpu/drm/r128/r128_drv.h
+@@ -418,6 +418,14 @@ static __inline__ void r128_update_ring_
+  * Misc helper macros
+  */
++#define DEV_INIT_TEST_WITH_RETURN(_dev_priv)                          \
++do {                                                                  \
++      if (!_dev_priv) {                                               \
++              DRM_ERROR("called with no initialization\n");           \
++              return -EINVAL;                                         \
++      }                                                               \
++} while (0)
++
+ #define RING_SPACE_TEST_WITH_RETURN( dev_priv )                               \
+ do {                                                                  \
+       drm_r128_ring_buffer_t *ring = &dev_priv->ring; int i;          \
+--- a/drivers/gpu/drm/r128/r128_state.c
++++ b/drivers/gpu/drm/r128/r128_state.c
+@@ -1244,14 +1244,18 @@ static void r128_cce_dispatch_stipple(st
+ static int r128_cce_clear(struct drm_device *dev, void *data, struct drm_file *file_priv)
+ {
+       drm_r128_private_t *dev_priv = dev->dev_private;
+-      drm_r128_sarea_t *sarea_priv = dev_priv->sarea_priv;
++      drm_r128_sarea_t *sarea_priv;
+       drm_r128_clear_t *clear = data;
+       DRM_DEBUG("\n");
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       RING_SPACE_TEST_WITH_RETURN(dev_priv);
++      sarea_priv = dev_priv->sarea_priv;
++
+       if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
+               sarea_priv->nbox = R128_NR_SAREA_CLIPRECTS;
+@@ -1312,6 +1316,8 @@ static int r128_cce_flip(struct drm_devi
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       RING_SPACE_TEST_WITH_RETURN(dev_priv);
+       if (!dev_priv->page_flipping)
+@@ -1331,6 +1337,8 @@ static int r128_cce_swap(struct drm_devi
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       RING_SPACE_TEST_WITH_RETURN(dev_priv);
+       if (sarea_priv->nbox > R128_NR_SAREA_CLIPRECTS)
+@@ -1354,10 +1362,7 @@ static int r128_cce_vertex(struct drm_de
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
+-      if (!dev_priv) {
+-              DRM_ERROR("called with no initialization\n");
+-              return -EINVAL;
+-      }
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
+       DRM_DEBUG("pid=%d index=%d count=%d discard=%d\n",
+                 DRM_CURRENTPID, vertex->idx, vertex->count, vertex->discard);
+@@ -1410,10 +1415,7 @@ static int r128_cce_indices(struct drm_d
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
+-      if (!dev_priv) {
+-              DRM_ERROR("called with no initialization\n");
+-              return -EINVAL;
+-      }
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
+       DRM_DEBUG("pid=%d buf=%d s=%d e=%d d=%d\n", DRM_CURRENTPID,
+                 elts->idx, elts->start, elts->end, elts->discard);
+@@ -1476,6 +1478,8 @@ static int r128_cce_blit(struct drm_devi
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       DRM_DEBUG("pid=%d index=%d\n", DRM_CURRENTPID, blit->idx);
+       if (blit->idx < 0 || blit->idx >= dma->buf_count) {
+@@ -1501,6 +1505,8 @@ static int r128_cce_depth(struct drm_dev
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       RING_SPACE_TEST_WITH_RETURN(dev_priv);
+       ret = -EINVAL;
+@@ -1531,6 +1537,8 @@ static int r128_cce_stipple(struct drm_d
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
++
+       if (DRM_COPY_FROM_USER(&mask, stipple->mask, 32 * sizeof(u32)))
+               return -EFAULT;
+@@ -1555,10 +1563,7 @@ static int r128_cce_indirect(struct drm_
+       LOCK_TEST_WITH_RETURN(dev, file_priv);
+-      if (!dev_priv) {
+-              DRM_ERROR("called with no initialization\n");
+-              return -EINVAL;
+-      }
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
+       DRM_DEBUG("idx=%d s=%d e=%d d=%d\n",
+                 indirect->idx, indirect->start, indirect->end,
+@@ -1620,10 +1625,7 @@ static int r128_getparam(struct drm_devi
+       drm_r128_getparam_t *param = data;
+       int value;
+-      if (!dev_priv) {
+-              DRM_ERROR("called with no initialization\n");
+-              return -EINVAL;
+-      }
++      DEV_INIT_TEST_WITH_RETURN(dev_priv);
+       DRM_DEBUG("pid=%d\n", DRM_CURRENTPID);
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.fixes/ext4-fixes-2.6.28-rc8.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/ext4-fixes-2.6.28-rc8.patch
index eb0e3c694bebc1e06a9f41ffba80db9e2068389f..66d701f6c864f9153166838eddf87fa72e8958f8 100644 (file)
@@ -5354,7 +5354,7 @@ diff -rup b/fs/ext4//inode.c a/fs/ext4///inode.c
 +                      /* Make sure s_inode_readahead_blks is a power of 2 */
 +                      while (EXT4_SB(sb)->s_inode_readahead_blks &
 +                             (EXT4_SB(sb)->s_inode_readahead_blks-1))
-+                              EXT4_SB(sb)->s_inode_readahead_blks = 
++                              EXT4_SB(sb)->s_inode_readahead_blks =
 +                                 (EXT4_SB(sb)->s_inode_readahead_blks &
 +                                  (EXT4_SB(sb)->s_inode_readahead_blks-1));
 +                      b = block & ~(EXT4_SB(sb)->s_inode_readahead_blks-1);
@@ -7681,7 +7681,7 @@ diff -rup b/fs/ext4//namei.c a/fs/ext4///namei.c
        if (bcount)
 -              printk("%snames %u, fullness %u (%u%%)\n", levels?"":"   ",
 -                      names, space/bcount,(space/bcount)*100/blocksize);
-+              printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n", 
++              printk(KERN_DEBUG "%snames %u, fullness %u (%u%%)\n",
 +                     levels ? "" : "   ", names, space/bcount,
 +                     (space/bcount)*100/blocksize);
        return (struct stats) { names, space, bcount};
@@ -7752,7 +7752,7 @@ diff -rup b/fs/ext4//namei.c a/fs/ext4///namei.c
  
 -      dxtrace(printk("In htree_fill_tree, start hash: %x:%x\n", start_hash,
 -                     start_minor_hash));
-+      dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n", 
++      dxtrace(printk(KERN_DEBUG "In htree_fill_tree, start hash: %x:%x\n",
 +                     start_hash, start_minor_hash));
        dir = dir_file->f_path.dentry->d_inode;
        if (!(EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) {
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.fixes/fc_transport-devloss-callback-restore
rename to src/patches/suse-2.6.27.39/patches.fixes/fc_transport-devloss-callback-restore
index b32c7ed65eaae432bd39e49c3cfdfbc76d0cb0e9..c0ea75cadf0f36d669cecaf42a11a5636440435e 100644 (file)
@@ -70,7 +70,7 @@ include/scsi/scsi_transport_fc.h |    1 +
 +      /*
 +       * Notify the driver that the rport is now dead. The LLDD will
 +       * also guarantee that any communication to the rport is terminated
-+       * 
++       *
 +       * Note: we set the CALLBK_DONE flag above to correspond
 +       */
 +      if (i->f->dev_loss_tmo_callbk)
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/fix-balance-alb-bonding-receive b/src/patches/suse-2.6.27.39/patches.fixes/fix-balance-alb-bonding-receive
new file mode 100644 (file)
index 0000000..15f8821
--- /dev/null
@@ -0,0 +1,97 @@
+From: Jiri Pirko <jpirko@redhat.com>
+Date: Thu, 28 May 2009 01:05:00 +0000 (+0000)
+Subject: bonding: allow bond in mode balance-alb to work properly in bridge -try4.3
+Patch-mainline: v2.6.31-rc1
+Git-commit: 5d4e039b2cb1ca4de9774344ea7b61ad7fa1b0a1
+References: bnc#532443
+
+bonding: allow bond in mode balance-alb to work properly in bridge -try4.3
+
+[PATCH net-next] bonding: allow bond in mode balance-alb to work properly in bridge -try4.3
+
+(updated)
+changes v4.2 -> v4.3
+- memcpy the address always, not just in case it differs from master->dev_addr
+- compare_ether_addr_64bits() is not used so there is no direct need to make new
+  header file (I think it would be good to have bond stuff in separate file
+  anyway).
+
+changes v4.1 -> v4.2
+- use skb->pkt_type == PACKET_HOST compare rather then comparing skb dest addr
+  against skb->dev->dev_addr
+
+The problem is described in following bugzilla:
+https://bugzilla.redhat.com/show_bug.cgi?id=487763
+
+Basically here's what's going on. In every mode, bonding interface uses the same
+mac address for all enslaved devices (except fail_over_mac). Only balance-alb
+will simultaneously use multiple MAC addresses across different slaves. When you
+put this kind of bond device into a bridge it will only add one of mac adresses
+into a hash list of mac addresses, say X. This mac address is marked as local.
+But this bonding interface also has mac address Y. Now then packet arrives with
+destination address Y, this address is not marked as local and the packed looks
+like it needs to be forwarded. This packet is then lost which is wrong.
+
+Notice that interfaces can be added and removed from bond while it is in bridge.
+
+
+When the multiple addresses for bridge port approach failed to solve this issue
+due to STP I started to think other way to solve this. I returned to previous
+solution but tweaked one.
+
+This patch solves the situation in the bonding without touching bridge code.
+For every incoming frame to bonding the destination address is compared to
+current address of the slave device from which tha packet came. If these two
+match destination address is replaced by mac address of the master. This address
+is known by bridge so it is delivered properly. Note that the comparsion is not
+made directly, it's used skb->pkt_type == PACKET_HOST instead. This is "set"
+previously in eth_type_trans().
+
+I experimentally tried that this works as good as searching through the slave
+list (v4 of this patch).
+
+Jirka
+
+Signed-off-by: Jiri Pirko <jpirko@redhat.com>
+Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
+Signed-off-by: Andy Gospodarek <andy@greyhouse.net>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Acked-by: Jeff Mahoney <jeffm@suse.com>
+---
+ include/linux/netdevice.h |   18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+--- a/include/linux/netdevice.h
++++ b/include/linux/netdevice.h
+@@ -1705,6 +1705,16 @@ static inline void netif_set_gso_max_siz
+       dev->gso_max_size = size;
+ }
++static inline void skb_bond_set_mac_by_master(struct sk_buff *skb,
++                                            struct net_device *master)
++{
++      if (skb->pkt_type == PACKET_HOST) {
++              u16 *dest = (u16 *) eth_hdr(skb)->h_dest;
++
++              memcpy(dest, master->dev_addr, ETH_ALEN);
++      }
++}
++
+ /* On bonding slaves other than the currently active slave, suppress
+  * duplicates except for 802.3ad ETH_P_SLOW, alb non-mcast/bcast, and
+  * ARP on active-backup slaves with arp_validate enabled.
+@@ -1718,6 +1728,14 @@ static inline int skb_bond_should_drop(s
+               if (master->priv_flags & IFF_MASTER_ARPMON)
+                       dev->last_rx = jiffies;
++              if ((master->priv_flags & IFF_MASTER_ALB) && master->br_port) {
++                      /* Do address unmangle. The local destination address
++                       * will be always the one master has. Provides the right
++                       * functionality in a bridge.
++                       */
++                      skb_bond_set_mac_by_master(skb, master);
++              }
++
+               if (dev->priv_flags & IFF_SLAVE_INACTIVE) {
+                       if ((dev->priv_flags & IFF_SLAVE_NEEDARP) &&
+                           skb->protocol == __constant_htons(ETH_P_ARP))
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/hfs-corrupt-extent-tree-mount-oops-fix b/src/patches/suse-2.6.27.39/patches.fixes/hfs-corrupt-extent-tree-mount-oops-fix
new file mode 100644 (file)
index 0000000..e60f651
--- /dev/null
@@ -0,0 +1,34 @@
+From: Jeff Mahoney <jeffm@suse.com>
+Subject: [PATCH] hfs: fix oops on mount with corrupted btree extent records
+References: bnc#476582 bko#13083
+
+ A particular fsfuzzer run caused an hfs file system to crash on mount. This
+ is due to a corrupted MDB extent record causing a miscalculation of
+ HFS_I(inode)->first_blocks for the extent tree. If the extent records
+ are zereod out, then it won't trigger the first_blocks special case and
+ instead falls through to the extent code, which we're in the middle
+ of initializing.
+
+ This patch catches the 0 size extent records, reports the corruption,
+ and fails the mount.
+
+Reported-by: Ramon de Carvalho Valle <rcvalle@linux.vnet.ibm.com>
+Signed-off-by: Jeff Mahoney <jeffm@suse.com>
+---
+ fs/hfs/btree.c |    5 +++++
+ 1 file changed, 5 insertions(+)
+
+--- a/fs/hfs/btree.c
++++ b/fs/hfs/btree.c
+@@ -58,6 +58,11 @@ struct hfs_btree *hfs_btree_open(struct
+       }
+       unlock_new_inode(tree->inode);
++      if (!HFS_I(tree->inode)->first_blocks) {
++              printk(KERN_ERR "hfs: invalid btree extent records (0 size).\n");
++              goto free_inode;
++      }
++
+       mapping = tree->inode->i_mapping;
+       page = read_mapping_page(mapping, 0, NULL);
+       if (IS_ERR(page))
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/hpet-correct-periodic-intr.patch b/src/patches/suse-2.6.27.39/patches.fixes/hpet-correct-periodic-intr.patch
new file mode 100644 (file)
index 0000000..673043e
--- /dev/null
@@ -0,0 +1,86 @@
+From: Nils Carlson <nils.carlson@ericsson.com>
+Subject: hpet: hpet driver periodic timer setup bug fixes
+References: bnc#515640
+Patch-mainline: queued
+
+
+The periodic interrupt from drivers/char/hpet.c does not work correctly,
+both when using the periodic capability of the hardware and while
+emulating the periodic interrupt (when hardware does not support
+periodic mode).
+
+With timers capable of periodic interrupts, the comparator field is first
+set with the period value followed by set of hidden accumulator,
+which has the side effect of overwriting the comparator value. This
+results in wrong periodicity for the interrupts. For,
+periodic interrupts to work, following steps are necessary, in that order.
+* Set config with Tn_VAL_SET_CNF bit
+* Write to hidden accumulator, the value written is the time when the
+  first interrupt should be generated
+* Write compartor with period interval for subsequent interrupts
+(http://www.intel.com/hardwaredesign/hpetspec_1.pdf )
+
+When emulating periodic timer with timers not capable of periodic
+interrupt, driver is adding the period to counter value instead of
+comparator value, which causes slow drift when using this emulation.
+
+Also, driver seems to add hpetp->hp_delta both while setting up
+periodic interrupt and while emulating periodic interrupts with timers
+not capable of doing periodic interrupts. This hp_delta will result in
+slower than expected interrupt rate and should not be used while setting
+the interval.
+
+Signed-off-by: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
+Signed-off-by: Nils Carlson <nils.carlson@ericsson.com>
+Acked-by: Goldwyn Rodrigues <rgoldwyn@suse.de>
+
+---
+ drivers/char/hpet.c |   23 ++++++++++++++++-------
+ 1 file changed, 16 insertions(+), 7 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/drivers/char/hpet.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/char/hpet.c 2008-10-09 17:13:53.000000000 -0500
++++ linux-2.6.27-SLE11_BRANCH/drivers/char/hpet.c      2009-08-28 09:58:42.000000000 -0500
+@@ -164,9 +164,9 @@ static irqreturn_t hpet_interrupt(int ir
+               unsigned long m, t;
+               t = devp->hd_ireqfreq;
+-              m = read_counter(&devp->hd_hpet->hpet_mc);
+-              write_counter(t + m + devp->hd_hpets->hp_delta,
+-                            &devp->hd_timer->hpet_compare);
++              m = read_counter(&devp->hd_timer->hpet_compare);
++              write_counter(t + m, &devp->hd_timer->hpet_compare);
++
+       }
+       if (devp->hd_flags & HPET_SHARED_IRQ)
+@@ -444,15 +444,24 @@ static int hpet_ioctl_ieon(struct hpet_d
+       g = v | Tn_INT_ENB_CNF_MASK;
+       if (devp->hd_flags & HPET_PERIODIC) {
+-              write_counter(t, &timer->hpet_compare);
+               g |= Tn_TYPE_CNF_MASK;
+-              v |= Tn_TYPE_CNF_MASK;
+-              writeq(v, &timer->hpet_config);
+-              v |= Tn_VAL_SET_CNF_MASK;
++              v |= Tn_TYPE_CNF_MASK | Tn_VAL_SET_CNF_MASK;
+               writeq(v, &timer->hpet_config);
+               local_irq_save(flags);
++              /*
++               * NOTE: First we modify the hidden accumulator
++               * register supported by periodic-capable comparators.
++               * We never want to modify the (single) counter; that
++               * would affect all the comparators. The value written
++               * is the counter value when the first interrupt is due.
++               */
+               m = read_counter(&hpet->hpet_mc);
+               write_counter(t + m + hpetp->hp_delta, &timer->hpet_compare);
++              /*
++               * Then we modify the comparator, indicating the period
++               * for subsequent interrupt.
++               */
++              write_counter(t, &timer->hpet_compare);
+       } else {
+               local_irq_save(flags);
+               m = read_counter(&hpet->hpet_mc);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Evaluate-socket-state-in-data_ready b/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Evaluate-socket-state-in-data_ready
new file mode 100644 (file)
index 0000000..3ed05a1
--- /dev/null
@@ -0,0 +1,73 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Thu, 13 Aug 2009 10:35:43 +0200
+Subject: iscsi_tcp: Evaluate socket state in data_ready()
+X-Git: 523eeac6703a995d58918aaf321f128f75c13108
+References: bnc#472432
+
+The network core will call the state_change() callback
+prior to the data_ready() callback, which might cause
+us to lose a connection state change.
+So we have to evaluate the socket state at the end
+of the data_ready() callback, too.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+---
+ drivers/scsi/iscsi_tcp.c |   27 ++++++++++++++++++++++++---
+ 1 files changed, 24 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index cfcb8ec..b870bfc 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -1014,6 +1014,24 @@ error:
+       return 0;
+ }
++/**
++ * iscsi_sw_sk_state_check - check socket state
++ * @sk: socket
++ *
++ * If the socket is in CLOSE or CLOSE_WAIT we should
++ * not close the connection if there is still some
++ * data pending.
++ */
++static inline int iscsi_tcp_state_check(struct sock *sk)
++{
++      if ((sk->sk_state == TCP_CLOSE_WAIT ||
++           sk->sk_state == TCP_CLOSE) &&
++          !atomic_read(&sk->sk_rmem_alloc))
++              return -ECONNRESET;
++
++      return 0;
++}
++
+ static void
+ iscsi_tcp_data_ready(struct sock *sk, int flag)
+ {
+@@ -1033,6 +1051,11 @@ iscsi_tcp_data_ready(struct sock *sk, int flag)
+       rd_desc.count = 1;
+       tcp_read_sock(sk, &rd_desc, iscsi_tcp_recv);
++      if (iscsi_tcp_state_check(sk) < 0) {
++              debug_tcp("iscsi_tcp_data_ready: TCP_CLOSE|TCP_CLOSE_WAIT\n");
++              iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
++      }
++
+       read_unlock(&sk->sk_callback_lock);
+       /* If we had to (atomically) map a highmem page,
+@@ -1053,9 +1076,7 @@ iscsi_tcp_state_change(struct sock *sk)
+       conn = (struct iscsi_conn*)sk->sk_user_data;
+       session = conn->session;
+-      if ((sk->sk_state == TCP_CLOSE_WAIT ||
+-           sk->sk_state == TCP_CLOSE) &&
+-          !atomic_read(&sk->sk_rmem_alloc)) {
++      if (iscsi_tcp_state_check(sk) < 0) {
+               debug_tcp("iscsi_tcp_state_change: TCP_CLOSE|TCP_CLOSE_WAIT\n");
+               iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
+       }
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-1-second-send-timeout b/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-1-second-send-timeout
new file mode 100644 (file)
index 0000000..861d63d
--- /dev/null
@@ -0,0 +1,31 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 11:35:03 +0200
+Subject: iscsi_tcp: Use 1 second send timeout
+References: bnc#472432
+
+We're getting a far better response time
+when using a 1 seconds send timeout; otherwise
+we might stall for too long and trigger
+ping timeouts.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/iscsi_tcp.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index 19fae4d..a648919 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -1712,7 +1712,7 @@ iscsi_tcp_conn_bind(struct iscsi_cls_session *cls_session,
+       /* setup Socket parameters */
+       sk = sock->sk;
+       sk->sk_reuse = 1;
+-      sk->sk_sndtimeo = 15 * HZ; /* FIXME: make it configurable */
++      sk->sk_sndtimeo = 1 * HZ; /* FIXME: make it configurable */
+       sk->sk_allocation = GFP_ATOMIC;
+       iscsi_conn_set_callbacks(conn);
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-last_recv-to-track-xmits b/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-Use-last_recv-to-track-xmits
new file mode 100644 (file)
index 0000000..33d03b5
--- /dev/null
@@ -0,0 +1,50 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 10:52:27 +0200
+Subject: iscsi_tcp: Use 'last_recv' to track xmits
+References: bnc#472432
+Patch-Mainline: Not applicable
+
+A successful transmit also indicates that the
+target is alive, so can use the 'last_recv'
+count to track that, too.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/iscsi_tcp.c |   15 +++++++++++++--
+ 1 files changed, 13 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index a648919..2bbfd2b 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -1140,14 +1140,25 @@ iscsi_xmit(struct iscsi_conn *conn)
+                * is getting stopped. libiscsi will know so propogate err
+                * for it to do the right thing.
+                */
+-              if (rc == -EAGAIN)
++              if (rc == -EAGAIN) {
++                      if (consumed > 0) {
++                              conn->txdata_octets += consumed;
++                              conn->last_recv = jiffies;
++                      }
+                       return rc;
+-              else if (rc < 0) {
++              }
++              if (rc < 0) {
+                       rc = ISCSI_ERR_CONN_FAILED;
+                       goto error;
+               } else if (rc == 0)
+                       break;
++              /*
++               * Hijack the 'last_recv' for counting xmits, too.
++               * This avoids transport timeouts when running
++               * write-intensive loads.
++               */
++              conn->last_recv = jiffies;
+               consumed += rc;
+               if (segment->total_copied >= segment->total_size) {
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-propogate-EAGAIN-from-sendpage-to-libiscsi b/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-propogate-EAGAIN-from-sendpage-to-libiscsi
new file mode 100644 (file)
index 0000000..20aca91
--- /dev/null
@@ -0,0 +1,62 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 10:01:42 +0200
+Subject: iscsi_tcp: propogate EAGAIN from sendpage to libiscsi
+References: bnc#472432
+X-Git: 32382492eb18e8e20be382a1743d0c08469d1e84
+
+The net layer might return -EAGAIN because it could not
+get space/mem within the sock sndtimeo or becuase the tcp/ip
+connection was down. For the latter we do not want to retry
+because the conn/session should just be shutdown and restarted.
+libiscsi knows the state of the session recovery so propogate
+this error to that layer. It will either do iscsi recovery
+or have us retry the operation. Right now if we have partially
+sent a pdu we would always retry the IO xmit slowing down
+recovery.
+
+Backported to SLES11.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/iscsi_tcp.c |   14 +++++++++-----
+ 1 files changed, 9 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index 324e719..25094c9 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -317,8 +317,6 @@ iscsi_tcp_xmit_segment(struct iscsi_tcp_conn *tcp_conn,
+               if (r < 0) {
+                       iscsi_tcp_segment_unmap(segment);
+-                      if (copied || r == -EAGAIN)
+-                              break;
+                       return r;
+               }
+               copied += r;
+@@ -1150,11 +1148,17 @@ iscsi_xmit(struct iscsi_conn *conn)
+       while (1) {
+               rc = iscsi_tcp_xmit_segment(tcp_conn, segment);
+-              if (rc < 0) {
++              /*
++               * We may not have been able to send data because the conn
++               * is getting stopped. libiscsi will know so propogate err
++               * for it to do the right thing.
++               */
++              if (rc == -EAGAIN)
++                      return rc;
++              else if (rc < 0) {
+                       rc = ISCSI_ERR_CONN_FAILED;
+                       goto error;
+-              }
+-              if (rc == 0)
++              } else if (rc == 0)
+                       break;
+               consumed += rc;
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-return-a-descriptive-error-value b/src/patches/suse-2.6.27.39/patches.fixes/iscsi_tcp-return-a-descriptive-error-value
new file mode 100644 (file)
index 0000000..584a3b5
--- /dev/null
@@ -0,0 +1,64 @@
+From: Mike Christie <michaelc@cs.wisc.edu>
+Date: Wed, 24 Sep 2008 11:46:13 -0500
+Subject: iscsi_tcp: return a descriptive error value during connection errors
+X-Git: 6f481e3cefeb33094e87af176587e6a3027f104e
+References: bnc#472432
+
+The segment->done functions return a iscsi error value which gives
+a lot more info than conn failed, so this patch has us return
+that value. I also add a new one for xmit failures.
+
+Adapted for SLES11 to not break kABI.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index b870bfc..324e719 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -1010,7 +1010,7 @@ iscsi_tcp_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
+ error:
+       debug_tcp("Error receiving PDU, errno=%d\n", rc);
+-      iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
++      iscsi_conn_failure(conn, rc);
+       return 0;
+ }
+@@ -1150,8 +1150,10 @@ iscsi_xmit(struct iscsi_conn *conn)
+       while (1) {
+               rc = iscsi_tcp_xmit_segment(tcp_conn, segment);
+-              if (rc < 0)
++              if (rc < 0) {
++                      rc = ISCSI_ERR_CONN_FAILED;
+                       goto error;
++              }
+               if (rc == 0)
+                       break;
+@@ -1160,7 +1162,7 @@ iscsi_xmit(struct iscsi_conn *conn)
+               if (segment->total_copied >= segment->total_size) {
+                       if (segment->done != NULL) {
+                               rc = segment->done(tcp_conn, segment);
+-                              if (rc < 0)
++                              if (rc != 0)
+                                       goto error;
+                       }
+               }
+@@ -1175,8 +1177,8 @@ error:
+       /* Transmit error. We could initiate error recovery
+        * here. */
+       debug_tcp("Error sending PDU, errno=%d\n", rc);
+-      iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
+-      return rc;
++      iscsi_conn_failure(conn, rc);
++      return -EIO;
+ }
+ /**
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/iwlagn-debug-build-fix b/src/patches/suse-2.6.27.39/patches.fixes/iwlagn-debug-build-fix
new file mode 100644 (file)
index 0000000..e4bea96
--- /dev/null
@@ -0,0 +1,26 @@
+From: Jeff Mahoney <jeffm@suse.com>
+Subject: iwlagn: Fix build failure with CONFIG_IWLWIFI_DEBUG
+References: bnc#551142
+Patch-mainline: Never, replaced with pointer() %pM field
+
+ This patch fixes a missing declaration of the mac address
+ buffer. Since we don't build our release kernels with this
+ option enabled, it doesn't fail our normal builds. I'm
+ including it because the L3 and Desktop teams may need to use
+ it to create test kernels while debugging wireless problems on SLED.
+
+Signed-off-by: Jeff Mahoney <jeffm@suse.com>
+---
+ drivers/net/wireless/iwlwifi/iwl-agn.c |    1 +
+ 1 file changed, 1 insertion(+)
+
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3224,6 +3224,7 @@ static void iwl4965_mac_update_tkip_key(
+                       struct ieee80211_key_conf *keyconf, const u8 *addr,
+                       u32 iv32, u16 *phase1key)
+ {
++      DECLARE_MAC_BUF(mac);
+       struct iwl_priv *priv = hw->priv;
+       u8 sta_id = IWL_INVALID_STATION;
+       unsigned long flags;
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.fixes/iwlagn-fix-error-path.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/iwlagn-fix-error-path.patch
index 5d9067303d2ad669f39b49375df22bae6682a0fd..6ccae7c0d1eb72a1ad3ab3c4832779e8e3201522 100644 (file)
@@ -33,8 +33,8 @@ diff -urNp linux-2.6.27/drivers/net/wireless/iwlwifi/iwl-agn.c linux-2.6.27/driv
 + out_free_irq:
 +      free_irq(priv->pci_dev->irq, priv);
   out_disable_msi:
-       pci_disable_msi(priv->pci_dev);
--      pci_disable_device(priv->pci_dev);
+       pci_disable_msi(priv->pci_dev);
+-      pci_disable_device(priv->pci_dev);
   out_uninit_drv:
        iwl_uninit_drv(priv);
   out_free_eeprom:
similarity index 83%
rename from src/patches/suse-2.6.27.31/patches.fixes/iwlagn-fix-rfkill.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/iwlagn-fix-rfkill.patch
index f1f2ac8160d3a0b45e830619f8d50a010b426dcc..66c662a24c2afad60bd3ee3f18f208726dbe8885 100644 (file)
@@ -37,16 +37,16 @@ Acked-by: Jiri Benc <jbenc@suse.cz>
 -               */
 -              if (!hw_rf_kill && !test_bit(STATUS_ALIVE, &priv->status))
 -                      clear_bit(STATUS_RF_KILL_HW, &priv->status);
-+               * the driver allows loading the ucode even if the radio
-+               * is killed. Hence update the killswitch state here. The
-+               * rfkill handler will care about restarting if needed.
-+               */
-+              if (!test_bit(STATUS_ALIVE, &priv->status)) {
-+                      if (hw_rf_kill)
-+                              set_bit(STATUS_RF_KILL_HW, &priv->status);
-+                      else
-+                              clear_bit(STATUS_RF_KILL_HW, &priv->status);
-+                      queue_work(priv->workqueue, &priv->rf_kill);
++               * the driver allows loading the ucode even if the radio
++               * is killed. Hence update the killswitch state here. The
++               * rfkill handler will care about restarting if needed.
++               */
++              if (!test_bit(STATUS_ALIVE, &priv->status)) {
++                      if (hw_rf_kill)
++                              set_bit(STATUS_RF_KILL_HW, &priv->status);
++                      else
++                              clear_bit(STATUS_RF_KILL_HW, &priv->status);
++                      queue_work(priv->workqueue, &priv->rf_kill);
 +              }
  
                handled |= CSR_INT_BIT_RF_KILL;
@@ -164,14 +164,14 @@ Acked-by: Jiri Benc <jbenc@suse.cz>
        iwl4965_disable_interrupts(priv);
        spin_unlock_irqrestore(&priv->lock, flags);
  
-+      pci_enable_msi(priv->pci_dev);
++      pci_enable_msi(priv->pci_dev);
 +
-+      err = request_irq(priv->pci_dev->irq, iwl4965_isr, IRQF_SHARED,
-+                        DRV_NAME, priv);
-+      if (err) {
-+              IWL_ERROR("Error allocating IRQ %d\n", priv->pci_dev->irq);
-+              goto out_disable_msi;
-+      }
++      err = request_irq(priv->pci_dev->irq, iwl4965_isr, IRQF_SHARED,
++                        DRV_NAME, priv);
++      if (err) {
++              IWL_ERROR("Error allocating IRQ %d\n", priv->pci_dev->irq);
++              goto out_disable_msi;
++      }
        err = sysfs_create_group(&pdev->dev.kobj, &iwl4965_attribute_group);
        if (err) {
                IWL_ERROR("failed to create sysfs device attributes\n");
@@ -193,14 +193,14 @@ Acked-by: Jiri Benc <jbenc@suse.cz>
 +       * 9. Setup and register mac80211
         **********************************/
  
-+      /* enable interrupts if needed: hw bug w/a */
-+      pci_read_config_word(priv->pci_dev, PCI_COMMAND, &pci_cmd);
-+      if (pci_cmd & PCI_COMMAND_INTX_DISABLE) {
-+              pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
-+              pci_write_config_word(priv->pci_dev, PCI_COMMAND, pci_cmd);
-+      }
++      /* enable interrupts if needed: hw bug w/a */
++      pci_read_config_word(priv->pci_dev, PCI_COMMAND, &pci_cmd);
++      if (pci_cmd & PCI_COMMAND_INTX_DISABLE) {
++              pci_cmd &= ~PCI_COMMAND_INTX_DISABLE;
++              pci_write_config_word(priv->pci_dev, PCI_COMMAND, pci_cmd);
++      }
 +
-+      iwl4965_enable_interrupts(priv);
++      iwl4965_enable_interrupts(priv);
 +
        err = iwl_setup_mac(priv);
        if (err)
@@ -209,18 +209,18 @@ Acked-by: Jiri Benc <jbenc@suse.cz>
        if (err)
                IWL_ERROR("failed to create debugfs files\n");
  
-+      /* If platform's RF_KILL switch is NOT set to KILL */
-+      if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
-+              clear_bit(STATUS_RF_KILL_HW, &priv->status);
-+      else
-+              set_bit(STATUS_RF_KILL_HW, &priv->status);
++      /* If platform's RF_KILL switch is NOT set to KILL */
++      if (iwl_read32(priv, CSR_GP_CNTRL) & CSR_GP_CNTRL_REG_FLAG_HW_RF_KILL_SW)
++              clear_bit(STATUS_RF_KILL_HW, &priv->status);
++      else
++              set_bit(STATUS_RF_KILL_HW, &priv->status);
 +
        err = iwl_rfkill_init(priv);
        if (err)
                IWL_ERROR("Unable to initialize RFKILL system. "
                                  "Ignoring error: %d\n", err);
 +      else
-+              iwl_rfkill_set_hw_state(priv);
++              iwl_rfkill_set_hw_state(priv);
 +
        iwl_power_initialize(priv);
        return 0;
@@ -228,8 +228,8 @@ Acked-by: Jiri Benc <jbenc@suse.cz>
   out_remove_sysfs:
        sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group);
 + out_disable_msi:
-+      pci_disable_msi(priv->pci_dev);
-+      pci_disable_device(priv->pci_dev);
++      pci_disable_msi(priv->pci_dev);
++      pci_disable_device(priv->pci_dev);
   out_uninit_drv:
        iwl_uninit_drv(priv);
   out_free_eeprom:
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-Update-queuecommand-return-codes-for-multipath b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-Update-queuecommand-return-codes-for-multipath
new file mode 100644 (file)
index 0000000..10fdb9b
--- /dev/null
@@ -0,0 +1,44 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 11:37:41 +0200
+Subject: libiscsi: Update queuecommand return codes for multipathing
+References: bnc#472432
+
+For multipathing we should be returning DID_TRANSPORT_XXX
+messages for any error which should be retried on some other
+path. And the 'chkready' function is quite pointless here.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |    9 +++------
+ 1 files changed, 3 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 14ba60f..32b30f1 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1327,12 +1327,6 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
+       session = cls_session->dd_data;
+       spin_lock(&session->lock);
+-      reason = iscsi_session_chkready(cls_session);
+-      if (reason) {
+-              sc->result = reason;
+-              goto fault;
+-      }
+-
+       if (session->state != ISCSI_STATE_LOGGED_IN) {
+               /*
+                * to handle the race between when we set the recovery state
+@@ -1342,6 +1336,9 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
+                */
+               switch (session->state) {
+               case ISCSI_STATE_FAILED:
++                      reason = FAILURE_SESSION_FAILED;
++                      sc->result = DID_TRANSPORT_DISRUPTED << 16;
++                      break;
+               case ISCSI_STATE_IN_RECOVERY:
+                       reason = FAILURE_SESSION_IN_RECOVERY;
+                       sc->result = DID_IMM_RETRY << 16;
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-check-suspend-bit-before-each-call-to-xmit b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-check-suspend-bit-before-each-call-to-xmit
new file mode 100644 (file)
index 0000000..f22bf42
--- /dev/null
@@ -0,0 +1,104 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 10:26:50 +0200
+Subject: libiscsi: check suspend bit before each call to xmit_task
+References: bnc#472432
+X-Git: 70b31c152dc49ef70bd2b34ad53ccbd9bb4116d4
+
+If we had multiple tasks on the cmd or requeue  lists, and iscsi_tcp
+returns a error, the write_space function can still run and queue
+iscsi_data_xmit. If it was a legetimate problem and iscsi_conn_failure
+was run but we raced and iscsi_data_xmit was run first it could miss
+the suspend bit checks, and start trying to send data again and hit
+another timeout. A similar problem is present when using cxgb3i.
+
+This has libiscsi check the suspend bit before calling the xmit
+task callout, so we at least do not try sending multiple tasks
+(one could be sent).
+
+It also adds a check in iscsi_tcp before calling
+the send function. The extra call in iscsi_tcp is needed because
+we can call sendpage/sendmsg multiple times for the same pdu
+and between each call iscsi_conn_failure could be called.
+
+Backported to SLES11.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |   19 ++++++++++---------
+ 1 files changed, 10 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 0611558..95720cc 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1150,6 +1150,9 @@ static int iscsi_xmit_task(struct iscsi_conn *conn)
+       struct iscsi_task *task = conn->task;
+       int rc;
++      if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx))
++              return -ENODATA;
++
+       __iscsi_get_task(task);
+       spin_unlock_bh(&conn->session->lock);
+       rc = conn->session->tt->xmit_task(task);
+@@ -1192,7 +1195,7 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
+       int rc = 0;
+       spin_lock_bh(&conn->session->lock);
+-      if (unlikely(conn->suspend_tx)) {
++      if (test_bit(ISCSI_SUSPEND_BIT, &conn->suspend_tx)) {
+               debug_scsi("conn %d Tx suspended!\n", conn->id);
+               spin_unlock_bh(&conn->session->lock);
+               return -ENODATA;
+@@ -1200,8 +1203,8 @@ static int iscsi_data_xmit(struct iscsi_conn *conn)
+       if (conn->task) {
+               rc = iscsi_xmit_task(conn);
+-              if (rc)
+-                      goto again;
++              if (rc)
++                      goto done;
+       }
+       /*
+@@ -1220,7 +1223,7 @@ check_mgmt:
+               }
+               rc = iscsi_xmit_task(conn);
+               if (rc)
+-                      goto again;
++                      goto done;
+       }
+       /* process pending command queue */
+@@ -1240,7 +1243,7 @@ check_mgmt:
+               }
+               rc = iscsi_xmit_task(conn);
+               if (rc)
+-                      goto again;
++                      goto done;
+               /*
+                * we could continuously get new task requests so
+                * we need to check the mgmt queue for nops that need to
+@@ -1266,16 +1269,14 @@ check_mgmt:
+               list_move_tail(conn->requeue.next, &conn->run_list);
+               rc = iscsi_xmit_task(conn);
+               if (rc)
+-                      goto again;
++                      goto done;
+               if (!list_empty(&conn->mgmtqueue))
+                       goto check_mgmt;
+       }
+       spin_unlock_bh(&conn->session->lock);
+       return -ENODATA;
+-again:
+-      if (unlikely(conn->suspend_tx))
+-              rc = -ENODATA;
++done:
+       spin_unlock_bh(&conn->session->lock);
+       return rc;
+ }
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-don-t-increment-cmdsn-if-cmd-is-not-sent b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-don-t-increment-cmdsn-if-cmd-is-not-sent
new file mode 100644 (file)
index 0000000..36bc509
--- /dev/null
@@ -0,0 +1,55 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Thu, 13 Aug 2009 10:55:44 +0200
+Subject: libiscsi: don't increment cmdsn if cmd is not sent
+X-Git: d3305f3407fa3e9452079ec6cc8379067456e4aa
+References: bnc#472432
+
+We increment session->cmdsn at the top of iscsi_prep_scsi_cmd_pdu, but
+if the prep  ecb or prep bidi or init_task calls fails then we leave the
+session->cmdsn incremented. This moves the cmdsn manipulation to the end
+of the function when we know it has succeeded.
+
+It also adds a session->cmdsn--; in queuecommand for if a driver like
+bnx2i tries to send a a task from that context but it fails. We do not
+have to do this in the xmit thread context because that code will retry
+the same task if the initial call fails.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |    5 +++--
+ 1 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index b1a1b61..b87ca12 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -224,8 +224,6 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task)
+                       return rc;
+       } else
+               hdr->itt = build_itt(task->itt, session->age);
+-      hdr->cmdsn = cpu_to_be32(session->cmdsn);
+-      session->cmdsn++;
+       hdr->exp_statsn = cpu_to_be32(conn->exp_statsn);
+       cmd_len = sc->cmd_len;
+       if (cmd_len < ISCSI_CDB_SIZE)
+@@ -310,6 +308,8 @@ static int iscsi_prep_scsi_cmd_pdu(struct iscsi_task *task)
+               return -EIO;
+       task->state = ISCSI_TASK_RUNNING;
++      hdr->cmdsn = cpu_to_be32(session->cmdsn);
++      session->cmdsn++;
+       list_move_tail(&task->running, &conn->run_list);
+       conn->scsicmd_pdus_cnt++;
+@@ -1309,6 +1309,7 @@ int iscsi_queuecommand(struct scsi_cmnd *sc, void (*done)(struct scsi_cmnd *))
+                       goto fault;
+               }
+               if (session->tt->xmit_task(task)) {
++                      session->cmdsn--;
+                       sc->scsi_done = NULL;
+                       iscsi_complete_command(task);
+                       reason = FAILURE_SESSION_NOT_READY;
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-data-corruption b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-data-corruption
new file mode 100644 (file)
index 0000000..b6747cf
--- /dev/null
@@ -0,0 +1,152 @@
+From: Mike Christie <michaelc@cs.wisc.edu>
+Date: Wed, 24 Sep 2008 11:46:09 -0500
+Subject: libiscsi: fix data corruption when target has to resend data-in packets
+References: bnc#472432
+X-Git: 1d9edf0270cb5a434d32e95279ce9493581906b3
+
+iscsi_tcp was updating the exp_statsn (exp_statsn acknowledges
+status and tells the target it is ok to let the resources for
+a iscsi pdu to be reused) before it got all the data for pdu read
+into OS buffers. Data corruption was occuring if something happens
+to a packet and the network layer requests a retransmit, and the
+initiator has told the target about the udpated exp_statsn ack,
+then the target may be sending data from a buffer it has reused
+for a new iscsi pdu. This fixes the problem by having the LLD
+(iscsi_tcp in this case) just handle the transferring of data, and
+has libiscsi handle the processing of status (libiscsi completion
+processing is done after LLD data transfers are complete).
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/iscsi_tcp.c |   29 +++++------------------------
+ drivers/scsi/libiscsi.c  |   41 +++++++++++++++++++++++++++++++++++------
+ 2 files changed, 40 insertions(+), 30 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index 25094c9..babe81a 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -530,22 +530,20 @@ iscsi_tcp_cleanup_task(struct iscsi_conn *conn, struct iscsi_task *task)
+ EXPORT_SYMBOL_GPL(iscsi_tcp_cleanup_task);
+ /**
+- * iscsi_data_rsp - SCSI Data-In Response processing
++ * iscsi_data_in - SCSI Data-In Response processing
+  * @conn: iscsi connection
+  * @task: scsi command task
+  **/
+ static int
+-iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_task *task)
++iscsi_data_in(struct iscsi_conn *conn, struct iscsi_task *task)
+ {
+       struct iscsi_tcp_conn *tcp_conn = conn->dd_data;
+       struct iscsi_tcp_task *tcp_task = task->dd_data;
+       struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)tcp_conn->in.hdr;
+-      struct iscsi_session *session = conn->session;
+-      struct scsi_cmnd *sc = task->sc;
+       int datasn = be32_to_cpu(rhdr->datasn);
+-      unsigned total_in_length = scsi_in(sc)->length;
++      unsigned total_in_length = scsi_in(task->sc)->length;
+-      iscsi_update_cmdsn(session, (struct iscsi_nopin*)rhdr);
++      iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr);
+       if (tcp_conn->in.datalen == 0)
+               return 0;
+@@ -565,23 +563,6 @@ iscsi_data_rsp(struct iscsi_conn *conn, struct iscsi_task *task)
+               return ISCSI_ERR_DATA_OFFSET;
+       }
+-      if (rhdr->flags & ISCSI_FLAG_DATA_STATUS) {
+-              sc->result = (DID_OK << 16) | rhdr->cmd_status;
+-              conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
+-              if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW |
+-                                 ISCSI_FLAG_DATA_OVERFLOW)) {
+-                      int res_count = be32_to_cpu(rhdr->residual_count);
+-
+-                      if (res_count > 0 &&
+-                          (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW ||
+-                           res_count <= total_in_length))
+-                              scsi_in(sc)->resid = res_count;
+-                      else
+-                              sc->result = (DID_BAD_TARGET << 16) |
+-                                      rhdr->cmd_status;
+-              }
+-      }
+-
+       conn->datain_pdus_cnt++;
+       return 0;
+ }
+@@ -781,7 +762,7 @@ iscsi_tcp_hdr_dissect(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
+               if (!task)
+                       rc = ISCSI_ERR_BAD_ITT;
+               else
+-                      rc = iscsi_data_rsp(conn, task);
++                      rc = iscsi_data_in(conn, task);
+               if (rc) {
+                       spin_unlock(&conn->session->lock);
+                       break;
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index e7624db..8905895 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -645,6 +645,40 @@ out:
+       __iscsi_put_task(task);
+ }
++/**
++ * iscsi_data_in_rsp - SCSI Data-In Response processing
++ * @conn: iscsi connection
++ * @hdr:  iscsi pdu
++ * @task: scsi command task
++ **/
++static void
++iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
++                struct iscsi_task *task)
++{
++      struct iscsi_data_rsp *rhdr = (struct iscsi_data_rsp *)hdr;
++      struct scsi_cmnd *sc = task->sc;
++
++      if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS))
++              return;
++
++      sc->result = (DID_OK << 16) | rhdr->cmd_status;
++      conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
++      if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW |
++                         ISCSI_FLAG_DATA_OVERFLOW)) {
++              int res_count = be32_to_cpu(rhdr->residual_count);
++
++              if (res_count > 0 &&
++                  (rhdr->flags & ISCSI_FLAG_CMD_OVERFLOW ||
++                   res_count <= scsi_in(sc)->length))
++                      scsi_in(sc)->resid = res_count;
++              else
++                      sc->result = (DID_BAD_TARGET << 16) | rhdr->cmd_status;
++      }
++
++      conn->scsirsp_pdus_cnt++;
++      __iscsi_put_task(task);
++}
++
+ static void iscsi_tmf_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr)
+ {
+       struct iscsi_tm_rsp *tmf = (struct iscsi_tm_rsp *)hdr;
+@@ -911,12 +945,7 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
+               iscsi_scsi_cmd_rsp(conn, hdr, task, data, datalen);
+               break;
+       case ISCSI_OP_SCSI_DATA_IN:
+-              if (hdr->flags & ISCSI_FLAG_DATA_STATUS) {
+-                      conn->scsirsp_pdus_cnt++;
+-                      iscsi_update_cmdsn(session,
+-                                         (struct iscsi_nopin*) hdr);
+-                      __iscsi_put_task(task);
+-              }
++              iscsi_data_in_rsp(conn, hdr, task);
+               break;
+       case ISCSI_OP_LOGOUT_RSP:
+               iscsi_update_cmdsn(session, (struct iscsi_nopin*)hdr);
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-iscsi-transport-checks b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-fix-iscsi-transport-checks
new file mode 100644 (file)
index 0000000..d12870e
--- /dev/null
@@ -0,0 +1,95 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 10:46:26 +0200
+Subject: libiscsi: fix iscsi transport checks to account for slower links
+References: bnc#472432
+X-Git: 4c48a82935f833d94fcf44c2b0c5d2922acfc77a
+
+If we have not got any pdus for recv_timeout seconds, then we will
+send a iscsi ping/nop to make sure the target is still around. The
+problem is if this is a slow link, and the ping got queued after
+the data for a data_out (read), then the transport code could think
+the ping has failed when it is just slowly making its way through
+the network. This patch has us check if we are making progress while
+the nop is outstanding. If we are still reading in data, then we
+do not fail the session at that time.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |   38 +++++++++++++++++++++++++++++---------
+ 1 files changed, 29 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 95720cc..14ba60f 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1630,6 +1630,22 @@ static void iscsi_start_tx(struct iscsi_conn *conn)
+               scsi_queue_work(conn->session->host, &conn->xmitwork);
+ }
++/*
++ * We want to make sure a ping is in flight. It has timed out.
++ * And we are not busy processing a pdu that is making
++ * progress but got started before the ping and is taking a while
++ * to complete so the ping is just stuck behind it in a queue.
++ */
++static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
++{
++      if (conn->ping_task &&
++          time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) +
++                         (conn->ping_timeout * HZ), jiffies))
++              return 1;
++      else
++              return 0;
++}
++
+ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd)
+ {
+       struct iscsi_cls_session *cls_session;
+@@ -1665,16 +1681,20 @@ static enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *scmd)
+        * if the ping timedout then we are in the middle of cleaning up
+        * and can let the iscsi eh handle it
+        */
+-      if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) +
+-                          (conn->ping_timeout * HZ), jiffies))
++      if (iscsi_has_ping_timed_out(conn)) {
+               rc = BLK_EH_RESET_TIMER;
++              goto done;
++      }
+       /*
+        * if we are about to check the transport then give the command
+        * more time
+        */
+       if (time_before_eq(conn->last_recv + (conn->recv_timeout * HZ),
+-                         jiffies))
++                         jiffies)) {
+               rc = BLK_EH_RESET_TIMER;
++              goto done;
++      }
++
+       /* if in the middle of checking the transport then give us more time */
+       if (conn->ping_task)
+               rc = BLK_EH_RESET_TIMER;
+@@ -1701,13 +1721,13 @@ static void iscsi_check_transport_timeouts(unsigned long data)
+       recv_timeout *= HZ;
+       last_recv = conn->last_recv;
+-      if (conn->ping_task &&
+-          time_before_eq(conn->last_ping + (conn->ping_timeout * HZ),
+-                         jiffies)) {
++
++      if (iscsi_has_ping_timed_out(conn)) {
+               iscsi_conn_printk(KERN_ERR, conn, "ping timeout of %d secs "
+-                                "expired, last rx %lu, last ping %lu, "
+-                                "now %lu\n", conn->ping_timeout, last_recv,
+-                                conn->last_ping, jiffies);
++                                "expired, recv timeout %d, last rx %lu, "
++                                "last ping %lu, now %lu\n",
++                                conn->ping_timeout, conn->recv_timeout,
++                                last_recv, conn->last_ping, jiffies);
+               spin_unlock(&session->lock);
+               iscsi_conn_failure(conn, ISCSI_ERR_CONN_FAILED);
+               return;
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-immediate-command-rejections b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-immediate-command-rejections
new file mode 100644 (file)
index 0000000..2df6a51
--- /dev/null
@@ -0,0 +1,167 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Thu, 13 Aug 2009 11:05:16 +0200
+Subject: libiscsi: handle immediate command rejections
+X-Git: 8afa1439fcff58da8f28c1d083046f229f6ab3de
+References: bnc#472432
+
+If we sent multiple pdus as immediate the target could be
+rejecting some and we have just been dropping the rejection
+notification. This adds code to handle nop-out rejections,
+so if a nop-out was sent as a ping and rejected we do not
+mark the connection bad. Instead we just clean up the timers
+since we have pdu making a rount trip we know the connection
+is good.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |  116 +++++++++++++++++++++++++++++++++++-----------
+ 1 files changed, 88 insertions(+), 28 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index b87ca12..cc8d144 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -688,35 +688,102 @@ static void iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
+               iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
+ }
++static int iscsi_nop_out_rsp(struct iscsi_task *task,
++                           struct iscsi_nopin *nop, char *data, int datalen)
++{
++      struct iscsi_conn *conn = task->conn;
++      int rc = 0;
++
++      if (conn->ping_task != task) {
++              /*
++               * If this is not in response to one of our
++               * nops then it must be from userspace.
++               */
++              if (iscsi_recv_pdu(conn->cls_conn, (struct iscsi_hdr *)nop,
++                                 data, datalen))
++                      rc = ISCSI_ERR_CONN_FAILED;
++      } else
++              mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout);
++      __iscsi_put_task(task);
++      return rc;
++}
++
+ static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
+                              char *data, int datalen)
+ {
+       struct iscsi_reject *reject = (struct iscsi_reject *)hdr;
+       struct iscsi_hdr rejected_pdu;
+-      uint32_t itt;
++      int opcode, rc = 0;
+       conn->exp_statsn = be32_to_cpu(reject->statsn) + 1;
+-      if (reject->reason == ISCSI_REASON_DATA_DIGEST_ERROR) {
+-              if (ntoh24(reject->dlength) > datalen)
+-                      return ISCSI_ERR_PROTO;
+-
+-              if (ntoh24(reject->dlength) >= sizeof(struct iscsi_hdr)) {
+-                      memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
+-                      if (conn->session->tt->parse_itt)
+-                              conn->session->tt->parse_itt(conn,
+-                                                           rejected_pdu.itt,
+-                                                           &itt,
+-                                                           NULL);
+-                      else
+-                              itt = get_itt(rejected_pdu.itt);
+-                      iscsi_conn_printk(KERN_ERR, conn,
+-                                        "itt 0x%x had pdu (op 0x%x) rejected "
+-                                        "due to DataDigest error.\n", itt,
+-                                        rejected_pdu.opcode);
++      if (ntoh24(reject->dlength) > datalen ||
++          ntoh24(reject->dlength) < sizeof(struct iscsi_hdr)) {
++              iscsi_conn_printk(KERN_ERR, conn, "Cannot handle rejected "
++                                "pdu. Invalid data length (pdu dlength "
++                                "%u, datalen %d\n", ntoh24(reject->dlength),
++                                datalen);
++              return ISCSI_ERR_PROTO;
++      }
++       memcpy(&rejected_pdu, data, sizeof(struct iscsi_hdr));
++       opcode = rejected_pdu.opcode & ISCSI_OPCODE_MASK;
++
++      switch (reject->reason) {
++      case ISCSI_REASON_DATA_DIGEST_ERROR:
++              iscsi_conn_printk(KERN_ERR, conn,
++                                "pdu (op 0x%x itt 0x%x) rejected "
++                                "due to DataDigest error.\n",
++                                rejected_pdu.itt, opcode);
++              break;
++      case ISCSI_REASON_IMM_CMD_REJECT:
++              iscsi_conn_printk(KERN_ERR, conn,
++                                "pdu (op 0x%x itt 0x%x) rejected. Too many "
++                                "immediate commands.\n",
++                                rejected_pdu.itt, opcode);
++              /*
++               * We only send one TMF at a time so if the target could not
++               * handle it, then it should get fixed (RFC mandates that
++               * a target can handle one immediate TMF per conn).
++               *
++               * For nops-outs, we could have sent more than one if
++               * the target is sending us lots of nop-ins
++               */
++              if (opcode != ISCSI_OP_NOOP_OUT)
++                      return 0;
++
++               if (rejected_pdu.itt == cpu_to_be32(ISCSI_RESERVED_TAG))
++                      /*
++                       * nop-out in response to target's nop-out rejected.
++                       * Just resend.
++                       */
++                      iscsi_send_nopout(conn,
++                                        (struct iscsi_nopin*)&rejected_pdu);
++              else {
++                      struct iscsi_task *task;
++                      /*
++                       * Our nop as ping got dropped. We know the target
++                       * and transport are ok so just clean up
++                       */
++                      task = iscsi_itt_to_task(conn, rejected_pdu.itt);
++                      if (!task) {
++                              iscsi_conn_printk(KERN_ERR, conn,
++                                               "Invalid pdu reject. Could "
++                                               "not lookup rejected task.\n");
++                              rc = ISCSI_ERR_BAD_ITT;
++                      } else
++                              rc = iscsi_nop_out_rsp(task,
++                                      (struct iscsi_nopin*)&rejected_pdu,
++                                      NULL, 0);
+               }
++              break;
++      default:
++              iscsi_conn_printk(KERN_ERR, conn,
++                                "pdu (op 0x%x itt 0x%x) rejected. Reason "
++                                "code 0x%x\n", rejected_pdu.itt,
++                                rejected_pdu.opcode, reject->reason);
++              break;
+       }
+-      return 0;
++      return rc;
+ }
+ /**
+@@ -885,15 +952,8 @@ int __iscsi_complete_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
+               }
+               conn->exp_statsn = be32_to_cpu(hdr->statsn) + 1;
+-              if (conn->ping_task != task)
+-                      /*
+-                       * If this is not in response to one of our
+-                       * nops then it must be from userspace.
+-                       */
+-                      goto recv_pdu;
+-
+-              mod_timer(&conn->transport_timer, jiffies + conn->recv_timeout);
+-              __iscsi_put_task(task);
++              rc = iscsi_nop_out_rsp(task, (struct iscsi_nopin*)hdr,
++                                     data, datalen);
+               break;
+       default:
+               rc = ISCSI_ERR_BAD_OPCODE;
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-param-allocation-failure b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-handle-param-allocation-failure
new file mode 100644 (file)
index 0000000..1ca8fbd
--- /dev/null
@@ -0,0 +1,192 @@
+From: Mike Christie <michaelc@cs.wisc.edu>
+Date: Wed, 13 May 2009 17:57:40 -0500
+Subject: libiscsi: handle param allocation failures
+References: bnc#472432
+X-Git: 5700b1af93388544843a453e3c68f8f928bd1e88
+
+If we could not allocate the initiator name or some other id like
+the hwaddress or netdev, then userspace could deal with the failure
+by just running in a degraded mode.
+
+Now we want to be able to switch values for the params and we
+want some feedback, so this patch will check if a string like
+the initiatorname could not be allocated and return an error.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/libiscsi.c |  108 ++++++++++++++--------------------------------
+ 1 files changed, 33 insertions(+), 75 deletions(-)
+
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index cc8d144..e7624db 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -2567,6 +2567,23 @@ int iscsi_conn_bind(struct iscsi_cls_session *cls_session,
+ }
+ EXPORT_SYMBOL_GPL(iscsi_conn_bind);
++static int iscsi_switch_str_param(char **param, char *new_val_buf)
++{
++      char *new_val;
++
++      if (*param) {
++              if (!strcmp(*param, new_val_buf))
++                      return 0;
++      }
++
++      new_val = kstrdup(new_val_buf, GFP_NOIO);
++      if (!new_val)
++              return -ENOMEM;
++
++      kfree(*param);
++      *param = new_val;
++      return 0;
++}
+ int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
+                   enum iscsi_param param, char *buf, int buflen)
+@@ -2639,38 +2656,15 @@ int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
+               sscanf(buf, "%u", &conn->exp_statsn);
+               break;
+       case ISCSI_PARAM_USERNAME:
+-              kfree(session->username);
+-              session->username = kstrdup(buf, GFP_KERNEL);
+-              if (!session->username)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&session->username, buf);
+       case ISCSI_PARAM_USERNAME_IN:
+-              kfree(session->username_in);
+-              session->username_in = kstrdup(buf, GFP_KERNEL);
+-              if (!session->username_in)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&session->username_in, buf);
+       case ISCSI_PARAM_PASSWORD:
+-              kfree(session->password);
+-              session->password = kstrdup(buf, GFP_KERNEL);
+-              if (!session->password)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&session->password, buf);
+       case ISCSI_PARAM_PASSWORD_IN:
+-              kfree(session->password_in);
+-              session->password_in = kstrdup(buf, GFP_KERNEL);
+-              if (!session->password_in)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&session->password_in, buf);
+       case ISCSI_PARAM_TARGET_NAME:
+-              /* this should not change between logins */
+-              if (session->targetname)
+-                      break;
+-
+-              session->targetname = kstrdup(buf, GFP_KERNEL);
+-              if (!session->targetname)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&session->targetname, buf);
+       case ISCSI_PARAM_TPGT:
+               sscanf(buf, "%d", &session->tpgt);
+               break;
+@@ -2678,25 +2672,11 @@ int iscsi_set_param(struct iscsi_cls_conn *cls_conn,
+               sscanf(buf, "%d", &conn->persistent_port);
+               break;
+       case ISCSI_PARAM_PERSISTENT_ADDRESS:
+-              /*
+-               * this is the address returned in discovery so it should
+-               * not change between logins.
+-               */
+-              if (conn->persistent_address)
+-                      break;
+-
+-              conn->persistent_address = kstrdup(buf, GFP_KERNEL);
+-              if (!conn->persistent_address)
+-                      return -ENOMEM;
+-              break;
++              return iscsi_switch_str_param(&conn->persistent_address, buf);
+       case ISCSI_PARAM_IFACE_NAME:
+-              if (!session->ifacename)
+-                      session->ifacename = kstrdup(buf, GFP_KERNEL);
+-              break;
++              return iscsi_switch_str_param(&session->ifacename, buf);
+       case ISCSI_PARAM_INITIATOR_NAME:
+-              if (!session->initiatorname)
+-                      session->initiatorname = kstrdup(buf, GFP_KERNEL);
+-              break;
++              return iscsi_switch_str_param(&session->initiatorname, buf);
+       default:
+               return -ENOSYS;
+       }
+@@ -2767,10 +2747,7 @@ int iscsi_session_get_param(struct iscsi_cls_session *cls_session,
+               len = sprintf(buf, "%s\n", session->ifacename);
+               break;
+       case ISCSI_PARAM_INITIATOR_NAME:
+-              if (!session->initiatorname)
+-                      len = sprintf(buf, "%s\n", "unknown");
+-              else
+-                      len = sprintf(buf, "%s\n", session->initiatorname);
++              len = sprintf(buf, "%s\n", session->initiatorname);
+               break;
+       default:
+               return -ENOSYS;
+@@ -2836,29 +2813,16 @@ int iscsi_host_get_param(struct Scsi_Host *shost, enum iscsi_host_param param,
+       switch (param) {
+       case ISCSI_HOST_PARAM_NETDEV_NAME:
+-              if (!ihost->netdev)
+-                      len = sprintf(buf, "%s\n", "default");
+-              else
+-                      len = sprintf(buf, "%s\n", ihost->netdev);
++              len = sprintf(buf, "%s\n", ihost->netdev);
+               break;
+       case ISCSI_HOST_PARAM_HWADDRESS:
+-              if (!ihost->hwaddress)
+-                      len = sprintf(buf, "%s\n", "default");
+-              else
+-                      len = sprintf(buf, "%s\n", ihost->hwaddress);
++              len = sprintf(buf, "%s\n", ihost->hwaddress);
+               break;
+       case ISCSI_HOST_PARAM_INITIATOR_NAME:
+-              if (!ihost->initiatorname)
+-                      len = sprintf(buf, "%s\n", "unknown");
+-              else
+-                      len = sprintf(buf, "%s\n", ihost->initiatorname);
++              len = sprintf(buf, "%s\n", ihost->initiatorname);
+               break;
+       case ISCSI_HOST_PARAM_IPADDRESS:
+-              if (!strlen(ihost->local_address))
+-                      len = sprintf(buf, "%s\n", "unknown");
+-              else
+-                      len = sprintf(buf, "%s\n",
+-                                    ihost->local_address);
++              len = sprintf(buf, "%s\n", ihost->local_address);
+               break;
+       default:
+               return -ENOSYS;
+@@ -2875,17 +2839,11 @@ int iscsi_host_set_param(struct Scsi_Host *shost, enum iscsi_host_param param,
+       switch (param) {
+       case ISCSI_HOST_PARAM_NETDEV_NAME:
+-              if (!ihost->netdev)
+-                      ihost->netdev = kstrdup(buf, GFP_KERNEL);
+-              break;
++              return iscsi_switch_str_param(&ihost->netdev, buf);
+       case ISCSI_HOST_PARAM_HWADDRESS:
+-              if (!ihost->hwaddress)
+-                      ihost->hwaddress = kstrdup(buf, GFP_KERNEL);
+-              break;
++              return iscsi_switch_str_param(&ihost->hwaddress, buf);
+       case ISCSI_HOST_PARAM_INITIATOR_NAME:
+-              if (!ihost->initiatorname)
+-                      ihost->initiatorname = kstrdup(buf, GFP_KERNEL);
+-              break;
++              return iscsi_switch_str_param(&ihost->initiatorname, buf);
+       default:
+               return -ENOSYS;
+       }
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-have-iscsi_data_in_rsp-call-iscsi_update_cmdsn b/src/patches/suse-2.6.27.39/patches.fixes/libiscsi-have-iscsi_data_in_rsp-call-iscsi_update_cmdsn
new file mode 100644 (file)
index 0000000..2bd6eea
--- /dev/null
@@ -0,0 +1,56 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Tue, 18 Aug 2009 10:06:31 +0200
+Subject: libiscsi: have iscsi_data_in_rsp call iscsi_update_cmdsn
+References: bnc#472432
+X-Git: edbc9aa0580c0aca96ac8d11bfb2defa81d91bb3
+
+This has iscsi_data_in_rsp call iscsi_update_cmdsn when a pdu is
+completed like is done for other pdu's that are don.
+
+For iscsi_tcp, this means that it calls iscsi_update_cmdsn when
+it is handling the pdu internally to only transfer data, but if there is
+status then it does not need to call it since the completion handling
+will do it.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/iscsi_tcp.c |    8 +++++++-
+ drivers/scsi/libiscsi.c  |    1 +
+ 2 files changed, 8 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/scsi/iscsi_tcp.c b/drivers/scsi/iscsi_tcp.c
+index babe81a..19fae4d 100644
+--- a/drivers/scsi/iscsi_tcp.c
++++ b/drivers/scsi/iscsi_tcp.c
+@@ -543,7 +543,13 @@ iscsi_data_in(struct iscsi_conn *conn, struct iscsi_task *task)
+       int datasn = be32_to_cpu(rhdr->datasn);
+       unsigned total_in_length = scsi_in(task->sc)->length;
+-      iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr);
++      /*
++       * lib iscsi will update this in the completion handling if there
++       * is status.
++       */
++      if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS))
++              iscsi_update_cmdsn(conn->session, (struct iscsi_nopin*)rhdr);
++
+       if (tcp_conn->in.datalen == 0)
+               return 0;
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 8905895..0611558 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -661,6 +661,7 @@ iscsi_data_in_rsp(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
+       if (!(rhdr->flags & ISCSI_FLAG_DATA_STATUS))
+               return;
++      iscsi_update_cmdsn(conn->session, (struct iscsi_nopin *)hdr);
+       sc->result = (DID_OK << 16) | rhdr->cmd_status;
+       conn->exp_statsn = be32_to_cpu(rhdr->statsn) + 1;
+       if (rhdr->flags & (ISCSI_FLAG_DATA_UNDERFLOW |
+-- 
+1.6.0.2
+
similarity index 92%
rename from src/patches/suse-2.6.27.31/patches.fixes/mac80211-add-direct-probe.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/mac80211-add-direct-probe.patch
index 71dcdcb1cd8e3494192aad669faf7da6293b7bbd..f389df5a3daf1c79c6c96c82b82af11ec8afa91e 100644 (file)
@@ -159,13 +159,13 @@ Signed-off-by: Jiri Benc <jbenc@suse.cz>
 +      ieee80211_rx_bss_info(dev, mgmt, len, rx_status, &elems);
 +
 +      /* direct probe may be part of the association flow */
-+      if (test_and_clear_bit(IEEE80211_STA_REQ_DIRECT_PROBE,
-+                                                      &ifsta->request)) {
-+              printk(KERN_DEBUG "%s direct probe responded\n",
-+                     sdata->dev->name);
++      if (test_and_clear_bit(IEEE80211_STA_REQ_DIRECT_PROBE,
++                                                      &ifsta->request)) {
++              printk(KERN_DEBUG "%s direct probe responded\n",
++                     sdata->dev->name);
 +              ifsta->auth_tries = 0;  /* direct_probe_tries -> auth_tries */
-+              ieee80211_authenticate(dev, ifsta);
-+      }
++              ieee80211_authenticate(dev, ifsta);
++      }
 +
  }
  
@@ -193,9 +193,9 @@ Signed-off-by: Jiri Benc <jbenc@suse.cz>
        switch (ifsta->state) {
        case IEEE80211_DISABLED:
                break;
-+      case IEEE80211_DIRECT_PROBE:
-+              ieee80211_direct_probe(sdata, ifsta);
-+              break;
++      case IEEE80211_DIRECT_PROBE:
++              ieee80211_direct_probe(sdata, ifsta);
++              break;
 +
        case IEEE80211_AUTHENTICATE:
                ieee80211_authenticate(dev, ifsta);
@@ -205,15 +205,15 @@ Signed-off-by: Jiri Benc <jbenc@suse.cz>
                ieee80211_sta_set_bssid(dev, selected->bssid);
                ieee80211_sta_def_wmm_params(dev, selected, 0);
 +
-+              /* Send out direct probe if no probe resp was received or
-+               * the one we have is outdated
-+               */
-+              if (!selected->last_probe_resp ||
-+                  time_after(jiffies, selected->last_probe_resp
-+                                      + IEEE80211_SCAN_RESULT_EXPIRE))
-+                      ifsta->state = IEEE80211_DIRECT_PROBE;
-+              else
-+                      ifsta->state = IEEE80211_AUTHENTICATE;
++              /* Send out direct probe if no probe resp was received or
++               * the one we have is outdated
++               */
++              if (!selected->last_probe_resp ||
++                  time_after(jiffies, selected->last_probe_resp
++                                      + IEEE80211_SCAN_RESULT_EXPIRE))
++                      ifsta->state = IEEE80211_DIRECT_PROBE;
++              else
++                      ifsta->state = IEEE80211_AUTHENTICATE;
 +
                ieee80211_rx_bss_put(local, selected);
 -              ifsta->state = IEEE80211_AUTHENTICATE;
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/nfs-honour-server-preferred-io-size b/src/patches/suse-2.6.27.39/patches.fixes/nfs-honour-server-preferred-io-size
new file mode 100644 (file)
index 0000000..c79c95b
--- /dev/null
@@ -0,0 +1,31 @@
+From: NeilBrown <neilb@suse.de>
+Subject: NFS: Honour server-preferred io sizes
+Patch-mainline: not yet
+References: bnc#550648
+
+When interpreting the preferred IO size sent by the server, linux/nfs
+assumes that a non-zero setting means a user-specified setting so
+it ignores the server specified setting.
+
+This patch initialises rsize and wsize to zero so the server-preferred
+values get using (if no value is specified in a mount option).
+
+Signed-off-by: Neil Brown <neilb@suse.de>
+
+---
+ fs/nfs/super.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/nfs/super.c
++++ linux-2.6.27-SLE11_BRANCH/fs/nfs/super.c
+@@ -1536,8 +1536,8 @@ static int nfs_validate_mount_data(void 
+               goto out_no_data;
+       args->flags             = (NFS_MOUNT_VER3 | NFS_MOUNT_TCP);
+-      args->rsize             = NFS_MAX_FILE_IO_SIZE;
+-      args->wsize             = NFS_MAX_FILE_IO_SIZE;
++      args->rsize             = 0;
++      args->wsize             = 0;
+       args->acregmin          = NFS_DEF_ACREGMIN;
+       args->acregmax          = NFS_DEF_ACREGMAX;
+       args->acdirmin          = NFS_DEF_ACDIRMIN;
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/nfs-slot-table-alloc b/src/patches/suse-2.6.27.39/patches.fixes/nfs-slot-table-alloc
new file mode 100644 (file)
index 0000000..9eb9b45
--- /dev/null
@@ -0,0 +1,31 @@
+From: Michal Hocko <mhocko@novell.com>
+Subject: Don't fail allocations for the slot table when mounting an NFS filesystem
+Patch-mainline: no
+References: bnc#519820
+
+When the *_slot_table_entries exceeds 111, the slot_table_size
+exceeds 32K and an order-4 allocation is forced.  This does not
+retry nearly as much as order-3 so failure is more likely.
+But mount and autofs in particular doesn't cope well with failure.
+So force __GFP_REPEAT - the assumption is that people will only
+set the slot_table_size sysctl large on a machine with plenty
+of memory, so this should not block indefinitely.
+
+Acked-by: Neil Brown <neilb@suse.de>
+Signed-off-by: Neil Brown <neilb@suse.de>
+
+---
+ net/sunrpc/xprtsock.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+--- linux-2.6.27-SLE11_BRANCH.orig/net/sunrpc/xprtsock.c
++++ linux-2.6.27-SLE11_BRANCH/net/sunrpc/xprtsock.c
+@@ -2011,7 +2011,7 @@ static struct rpc_xprt *xs_setup_xprt(st
+       xprt = &new->xprt;
+       xprt->max_reqs = slot_table_size;
+-      xprt->slot = kcalloc(xprt->max_reqs, sizeof(struct rpc_rqst), GFP_KERNEL);
++      xprt->slot = kcalloc(xprt->max_reqs, sizeof(struct rpc_rqst), GFP_KERNEL | __GFP_REPEAT);
+       if (xprt->slot == NULL) {
+               kfree(xprt);
+               dprintk("RPC:       xs_setup_xprt: couldn't allocate slot "
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/nfsd-acl.patch b/src/patches/suse-2.6.27.39/patches.fixes/nfsd-acl.patch
new file mode 100644 (file)
index 0000000..25f8300
--- /dev/null
@@ -0,0 +1,45 @@
+From: Frank Filz <ffilzlnx@us.ibm.com>
+Date: Wed, 21 Oct 2009 23:45:02 +0000 (-0700)
+Subject: nfsd: Fix sort_pacl in fs/nfsd/nf4acl.c to actually sort groups
+X-git-url: http://git.linux-nfs.org/?p=bfields%2Flinux.git;a=commitdiff_plain;h=aba24d71580180dfdf6a1a83a5858a1c048fd785
+Patch-mainline: not yet
+References: bnc#549748
+
+Nfsd: Fix sort_pacl in fs/nfsd/nf4acl.c to actually sort groups
+
+We have been doing some extensive testing of Linux support for ACLs on
+NFDS v4. We have noticed that the server rejects ACLs where the groups
+are out of order, for example, the following ACL is rejected:
+
+A::OWNER@:rwaxtTcCy
+A::user101@domain:rwaxtcy
+A::GROUP@:rwaxtcy
+A:g:group102@domain:rwaxtcy
+A:g:group101@domain:rwaxtcy
+A::EVERYONE@:rwaxtcy
+
+Examining the server code, I found that after converting an NFS v4 ACL
+to POSIX, sort_pacl is called to sort the user ACEs and group ACEs.
+Unfortunately, a minor bug causes the group sort to be skipped.
+
+Signed-off-by: Frank Filz <ffilzlnx@us.ibm.com>
+Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
+Acked-by: NeilBrown <neilb@suse.de>
+
+---
+
+---
+ fs/nfsd/nfs4acl.c |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/nfsd/nfs4acl.c
++++ linux-2.6.27-SLE11_BRANCH/fs/nfsd/nfs4acl.c
+@@ -389,7 +389,7 @@ sort_pacl(struct posix_acl *pacl)
+       sort_pacl_range(pacl, 1, i-1);
+       BUG_ON(pacl->a_entries[i].e_tag != ACL_GROUP_OBJ);
+-      j = i++;
++      j = ++i;
+       while (pacl->a_entries[j].e_tag == ACL_GROUP)
+               j++;
+       sort_pacl_range(pacl, i, j-1);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/nfsd-exclusive-create-fix b/src/patches/suse-2.6.27.39/patches.fixes/nfsd-exclusive-create-fix
new file mode 100644 (file)
index 0000000..2951bec
--- /dev/null
@@ -0,0 +1,27 @@
+From: NeilBrown <neilb@suse.de>
+Subject: Fix security bug with exclusive create on NFSv4
+References: bnc#541648
+Patch-mainline: 2.6.31
+
+The call to nfsd_create_v3 in nfs4proc passes both
+fields of this union, so we must make it a struct to
+keep them distinct.
+
+Signed-off-by: NeilBrown <neilb@suse.de>
+Acked-by: NeilBrown <neilb@suse.de>
+
+---
+ include/linux/nfsd/xdr4.h |    2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- linux-2.6.25-SL110_BRANCH.orig/include/linux/nfsd/xdr4.h
++++ linux-2.6.25-SL110_BRANCH/include/linux/nfsd/xdr4.h
+@@ -207,7 +207,7 @@ struct nfsd4_open {
+       u32             op_create;          /* request */
+       u32             op_createmode;      /* request */
+       u32             op_bmval[2];        /* request */
+-      union {                             /* request */
++      struct {                            /* request */
+               struct iattr    iattr;                      /* UNCHECKED4,GUARDED4 */
+               nfs4_verifier   verf;                                /* EXCLUSIVE4 */
+       } u;
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-extra-credits-and-access-the-modified-bh.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-add-extra-credits-and-access-the-modified-bh.patch
new file mode 100644 (file)
index 0000000..7b154ef
--- /dev/null
@@ -0,0 +1,104 @@
+From 3c5e10683e684ef45614c9071847e48f633d9806 Mon Sep 17 00:00:00 2001
+From: Tao Ma <tao.ma@oracle.com>
+Date: Tue, 21 Jul 2009 15:42:05 +0800
+Subject: [PATCH] ocfs2: Add extra credits and access the modified bh in update_edge_lengths.
+References: bnc#528427
+
+In normal tree rotation left process, we will never touch the tree
+branch above subtree_index and ocfs2_extend_rotate_transaction doesn't
+reserve the credits for them either.
+
+But when we want to delete the rightmost extent block, we have to update
+the rightmost records for all the rightmost branch(See
+ocfs2_update_edge_lengths), so we have to allocate extra credits for them.
+What's more, we have to access them also.
+
+Signed-off-by: Tao Ma <tao.ma@oracle.com>
+Signed-off-by: Joel Becker <joel.becker@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/alloc.c |   44 +++++++++++++++++++++++++++++++++++++++-----
+ 1 files changed, 39 insertions(+), 5 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/ocfs2/alloc.c
++++ linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+@@ -2334,15 +2334,37 @@ out_ret_path:
+       return ret;
+ }
+-static void ocfs2_update_edge_lengths(struct inode *inode, handle_t *handle,
+-                                    struct ocfs2_path *path)
++static int ocfs2_update_edge_lengths(struct inode *inode, handle_t *handle,
++                                   int subtree_index, struct ocfs2_path *path)
+ {
+-      int i, idx;
++      int i, idx, ret;
+       struct ocfs2_extent_rec *rec;
+       struct ocfs2_extent_list *el;
+       struct ocfs2_extent_block *eb;
+       u32 range;
++      /*
++       * In normal tree rotation process, we will never touch the
++       * tree branch above subtree_index and ocfs2_extend_rotate_transaction
++       * doesn't reserve the credits for them either.
++       *
++       * But we do have a special case here which will update the rightmost
++       * records for all the bh in the path.
++       * So we have to allocate extra credits and access them.
++       */
++      ret = ocfs2_extend_trans(handle,
++                               handle->h_buffer_credits + subtree_index);
++      if (ret) {
++              mlog_errno(ret);
++              goto out;
++      }
++
++      ret = ocfs2_journal_access_path(inode, handle, path);
++      if (ret) {
++              mlog_errno(ret);
++              goto out;
++      }
++
+       /* Path should always be rightmost. */
+       eb = (struct ocfs2_extent_block *)path_leaf_bh(path)->b_data;
+       BUG_ON(eb->h_next_leaf_blk != 0ULL);
+@@ -2363,6 +2385,8 @@ static void ocfs2_update_edge_lengths(st
+               ocfs2_journal_dirty(handle, path->p_node[i].bh);
+       }
++out:
++      return ret;
+ }
+ static void ocfs2_unlink_path(struct inode *inode, handle_t *handle,
+@@ -2577,7 +2601,12 @@ static int ocfs2_rotate_subtree_left(str
+       if (del_right_subtree) {
+               ocfs2_unlink_subtree(inode, handle, left_path, right_path,
+                                    subtree_index, dealloc);
+-              ocfs2_update_edge_lengths(inode, handle, left_path);
++              ret = ocfs2_update_edge_lengths(inode, handle, subtree_index,
++                                              left_path);
++              if (ret) {
++                      mlog_errno(ret);
++                      goto out;
++              }
+               eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data;
+               ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno));
+@@ -2897,7 +2926,12 @@ static int ocfs2_remove_rightmost_path(s
+               ocfs2_unlink_subtree(inode, handle, left_path, path,
+                                    subtree_index, dealloc);
+-              ocfs2_update_edge_lengths(inode, handle, left_path);
++              ret = ocfs2_update_edge_lengths(inode, handle, subtree_index,
++                                              left_path);
++              if (ret) {
++                      mlog_errno(ret);
++                      goto out;
++              }
+               eb = (struct ocfs2_extent_block *)path_leaf_bh(left_path)->b_data;
+               ocfs2_et_set_last_eb_blk(et, le64_to_cpu(eb->h_blkno));
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-adjust-rightmost-path-in-ocfs2_add_branch.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-adjust-rightmost-path-in-ocfs2_add_branch.patch
new file mode 100644 (file)
index 0000000..c2466da
--- /dev/null
@@ -0,0 +1,234 @@
+From 6b791bcc8b2ae21daf95d18cff2f1eca7a64c9a5 Mon Sep 17 00:00:00 2001
+From: Tao Ma <tao.ma@oracle.com>
+Date: Fri, 12 Jun 2009 14:18:36 +0800
+Subject: [PATCH] ocfs2: Adjust rightmost path in ocfs2_add_branch.
+References: bnc#528427
+
+In ocfs2_add_branch, we use the rightmost rec of the leaf extent block
+to generate the e_cpos for the newly added branch. In the most case, it
+is OK but if the parent extent block's rightmost rec covers more clusters
+than the leaf does, it will cause kernel panic if we insert some clusters
+in it. The message is something like:
+(7445,1):ocfs2_insert_at_leaf:3775 ERROR: bug expression:
+le16_to_cpu(el->l_next_free_rec) >= le16_to_cpu(el->l_count)
+(7445,1):ocfs2_insert_at_leaf:3775 ERROR: inode 66053, depth 0, count 28,
+next free 28, rec.cpos 270, rec.clusters 1, insert.cpos 275, insert.clusters 1
+ [<fa7ad565>] ? ocfs2_do_insert_extent+0xb58/0xda0 [ocfs2]
+ [<fa7b08f2>] ? ocfs2_insert_extent+0x5bd/0x6ba [ocfs2]
+ [<fa7b1b8b>] ? ocfs2_add_clusters_in_btree+0x37f/0x564 [ocfs2]
+...
+
+The panic can be easily reproduced by the following small test case
+(with bs=512, cs=4K, and I remove all the error handling so that it looks
+clear enough for reading).
+
+int main(int argc, char **argv)
+{
+       int fd, i;
+       char buf[5] = "test";
+
+       fd = open(argv[1], O_RDWR|O_CREAT);
+
+       for (i = 0; i < 30; i++) {
+               lseek(fd, 40960 * i, SEEK_SET);
+               write(fd, buf, 5);
+       }
+
+       ftruncate(fd, 1146880);
+
+       lseek(fd, 1126400, SEEK_SET);
+       write(fd, buf, 5);
+
+       close(fd);
+
+       return 0;
+}
+
+The reason of the panic is that:
+the 30 writes and the ftruncate makes the file's extent list looks like:
+
+       Tree Depth: 1   Count: 19   Next Free Rec: 1
+       ## Offset        Clusters       Block#
+       0  0             280            86183
+       SubAlloc Bit: 7   SubAlloc Slot: 0
+       Blknum: 86183   Next Leaf: 0
+       CRC32: 00000000   ECC: 0000
+       Tree Depth: 0   Count: 28   Next Free Rec: 28
+       ## Offset        Clusters       Block#          Flags
+       0  0             1              143368          0x0
+       1  10            1              143376          0x0
+       ...
+       26 260           1              143576          0x0
+       27 270           1              143584          0x0
+
+Now another write at 1126400(275 cluster) whiich will write at the gap
+between 271 and 280 will trigger ocfs2_add_branch, but the result after
+the function looks like:
+       Tree Depth: 1   Count: 19   Next Free Rec: 2
+       ## Offset        Clusters       Block#
+       0  0             280            86183
+       1  271           0             143592
+So the extent record is intersected and make the following operation bug out.
+
+This patch just try to remove the gap before we add the new branch, so that
+the root(branch) rightmost rec will cover the same right position. So in the
+above case, before adding branch the tree will be changed to
+       Tree Depth: 1   Count: 19   Next Free Rec: 1
+       ## Offset        Clusters       Block#
+       0  0             271            86183
+       SubAlloc Bit: 7   SubAlloc Slot: 0
+       Blknum: 86183   Next Leaf: 0
+       CRC32: 00000000   ECC: 0000
+       Tree Depth: 0   Count: 28   Next Free Rec: 28
+       ## Offset        Clusters       Block#          Flags
+       0  0             1              143368          0x0
+       1  10            1              143376          0x0
+       ...
+       26 260           1              143576          0x0
+       27 270           1              143584          0x0
+And after branch add, the tree looks like
+       Tree Depth: 1   Count: 19   Next Free Rec: 2
+       ## Offset        Clusters       Block#
+       0  0             271            86183
+       1  271           0             143592
+
+Signed-off-by: Tao Ma <tao.ma@oracle.com>
+Acked-by: Mark Fasheh <mfasheh@suse.com>
+Signed-off-by: Joel Becker <joel.becker@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+
+---
+ fs/ocfs2/alloc.c |   80 +++++++++++++++++++++++++++++++++++++++++++++++++++---
+ 1 files changed, 76 insertions(+), 4 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/ocfs2/alloc.c
++++ linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+@@ -414,6 +414,12 @@ struct ocfs2_path {
+ #define path_leaf_el(_path) ((_path)->p_node[(_path)->p_tree_depth].el)
+ #define path_num_items(_path) ((_path)->p_tree_depth + 1)
++static int ocfs2_find_path(struct inode *inode, struct ocfs2_path *path,
++                         u32 cpos);
++static void ocfs2_adjust_rightmost_records(struct inode *inode,
++                                         handle_t *handle,
++                                         struct ocfs2_path *path,
++                                         struct ocfs2_extent_rec *insert_rec);
+ /*
+  * Reset the actual path elements so that we can re-use the structure
+  * to build another path. Generally, this involves freeing the buffer
+@@ -540,6 +546,11 @@ static struct ocfs2_path *ocfs2_new_path
+       return path;
+ }
++static struct ocfs2_path *ocfs2_new_path_from_et(struct ocfs2_extent_tree *et)
++{
++      return ocfs2_new_path(et->et_root_bh, et->et_root_el);
++}
++
+ /*
+  * Convenience function to journal all components in a path.
+  */
+@@ -838,6 +849,54 @@ static inline u32 ocfs2_sum_rightmost_re
+ }
+ /*
++ * Change range of the branches in the right most path according to the leaf
++ * extent block's rightmost record.
++ */
++static int ocfs2_adjust_rightmost_branch(handle_t *handle,
++                                       struct inode *inode,
++                                       struct ocfs2_extent_tree *et)
++{
++      int status;
++      struct ocfs2_path *path = NULL;
++      struct ocfs2_extent_list *el;
++      struct ocfs2_extent_rec *rec;
++
++      path = ocfs2_new_path_from_et(et);
++      if (!path) {
++              status = -ENOMEM;
++              return status;
++      }
++
++      status = ocfs2_find_path(inode, path, UINT_MAX);
++      if (status < 0) {
++              mlog_errno(status);
++              goto out;
++      }
++
++      status = ocfs2_extend_trans(handle, path_num_items(path) +
++                                  handle->h_buffer_credits);
++      if (status < 0) {
++              mlog_errno(status);
++              goto out;
++      }
++
++      status = ocfs2_journal_access_path(inode, handle, path);
++      if (status < 0) {
++              mlog_errno(status);
++              goto out;
++      }
++
++      el = path_leaf_el(path);
++      rec = &el->l_recs[le32_to_cpu(el->l_next_free_rec) - 1];
++
++      ocfs2_adjust_rightmost_records(inode, handle, path, rec);
++
++out:
++      ocfs2_free_path(path);
++      return status;
++}
++
++/*
+  * Add an entire tree branch to our inode. eb_bh is the extent block
+  * to start at, if we don't want to start the branch at the dinode
+  * structure.
+@@ -863,7 +922,7 @@ static int ocfs2_add_branch(struct ocfs2
+       struct ocfs2_extent_block *eb;
+       struct ocfs2_extent_list  *eb_el;
+       struct ocfs2_extent_list  *el;
+-      u32 new_cpos;
++      u32 new_cpos, root_end;
+       mlog_entry_void();
+@@ -880,6 +939,27 @@ static int ocfs2_add_branch(struct ocfs2
+       new_blocks = le16_to_cpu(el->l_tree_depth);
++      eb = (struct ocfs2_extent_block *)(*last_eb_bh)->b_data;
++      new_cpos = ocfs2_sum_rightmost_rec(&eb->h_list);
++      root_end = ocfs2_sum_rightmost_rec(et->et_root_el);
++
++      /*
++       * If there is a gap before the root end and the real end
++       * of the righmost leaf block, we need to remove the gap
++       * between new_cpos and root_end first so that the tree
++       * is consistent after we add a new branch(it will start
++       * from new_cpos).
++       */
++      if (root_end > new_cpos) {
++              mlog(0, "adjust the cluster end from %u to %u\n",
++                   root_end, new_cpos);
++              status = ocfs2_adjust_rightmost_branch(handle, inode, et);
++              if (status) {
++                      mlog_errno(status);
++                      goto bail;
++              }
++      }
++
+       /* allocate the number of new eb blocks we need */
+       new_eb_bhs = kcalloc(new_blocks, sizeof(struct buffer_head *),
+                            GFP_KERNEL);
+@@ -896,9 +976,6 @@ static int ocfs2_add_branch(struct ocfs2
+               goto bail;
+       }
+-      eb = (struct ocfs2_extent_block *)(*last_eb_bh)->b_data;
+-      new_cpos = ocfs2_sum_rightmost_rec(&eb->h_list);
+-
+       /* Note: new_eb_bhs[new_blocks - 1] is the guy which will be
+        * linked with the rest of the tree.
+        * conversly, new_eb_bhs[0] is the new bottommost leaf.
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-wait-on-lockres-instead-of-err-during-cancel.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-dlm-wait-on-lockres-instead-of-err-during-cancel.patch
new file mode 100644 (file)
index 0000000..9d63d7e
--- /dev/null
@@ -0,0 +1,38 @@
+From: Goldwyn Rodrigues <rgoldwyn@novell.com>
+Subject: ocfs2/dlm Wait on lockres instead of erroring during cancel
+References: bnc#524683
+Patch-mainline: queued
+
+If the DLM lock is in progress and someone issues a cancel, let the lock wait.
+Added conditions for the process to fall through in case flag is set to
+LKM_CANCEL.
+
+Signed-off-by: Goldwyn Rodrigues <rgoldwyn@suse.de>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+
+---
+ ocfs2/dlm/dlmunlock.c |    4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+Index: fs/ocfs2/dlm/dlmunlock.c
+===================================================================
+--- a/fs/ocfs2/dlm/dlmunlock.c 2009-07-30 16:02:55.000000000 +0200
++++ b/fs/ocfs2/dlm/dlmunlock.c 2009-08-21 18:04:03.000000000 +0200
+@@ -122,7 +122,7 @@ static enum dlm_status dlmunlock_common(
+        * that still has AST's pending... */
+       in_use = !list_empty(&lock->ast_list);
+       spin_unlock(&dlm->ast_lock);
+-      if (in_use) {
++      if (in_use && !(flags & LKM_CANCEL)) {
+              mlog(ML_ERROR, "lockres %.*s: Someone is calling dlmunlock "
+                   "while waiting for an ast!", res->lockname.len,
+                   res->lockname.name);
+@@ -131,7 +131,7 @@ static enum dlm_status dlmunlock_common(
+       spin_lock(&res->spinlock);
+       if (res->state & DLM_LOCK_RES_IN_PROGRESS) {
+-              if (master_node) {
++              if (master_node && !(flags & LKM_CANCEL)) {
+                       mlog(ML_ERROR, "lockres in progress!\n");
+                       spin_unlock(&res->spinlock);
+                       return DLM_FORWARD;
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-check-for-osb-in-kill_sb.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-fix-check-for-osb-in-kill_sb.patch
new file mode 100644 (file)
index 0000000..aa9cdb0
--- /dev/null
@@ -0,0 +1,39 @@
+Subject: Check for existence of osb in kill_sb
+Reference: bnc#552602
+From: Goldwyn Rodrigues <rgoldwyn@novell.com>
+
+In case of an error while mounting, for example - slots full, the volume
+dismounts and calls kill_sb. However, osb is not initialized as yet,
+and results in a NULL pointer dereference. Check if osb is initialized
+before operating on it.
+
+Signed-off-by: Goldwyn Rodrigues <rgoldwyn@novell.com>
+Signed-off-by: Coly Li <coly.li@suse.de>
+---
+ ocfs2/super.c |   13 +++++++------
+ 1 file changed, 7 insertions(+), 6 deletions(-)
+
+Index: fs/ocfs2/super.c
+===================================================================
+--- a/fs/ocfs2/super.c 2009-11-05 00:59:58.000000000 +0100
++++ b/fs/ocfs2/super.c 2009-11-05 17:49:51.000000000 +0100
+@@ -1019,12 +1019,13 @@ static void ocfs2_kill_sb(struct super_b
+       struct ocfs2_super *osb = OCFS2_SB(sb);
+       /* Prevent further queueing of inode drop events */
+-      spin_lock(&dentry_list_lock);
+-      ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED);
+-      spin_unlock(&dentry_list_lock);
+-      /* Wait for work to finish and/or remove it */
+-      cancel_work_sync(&osb->dentry_lock_work);
+-
++      if (osb) {
++              spin_lock(&dentry_list_lock);
++              ocfs2_set_osb_flag(osb, OCFS2_OSB_DROP_DENTRY_LOCK_IMMED);
++              spin_unlock(&dentry_list_lock);
++              /* Wait for work to finish and/or remove it */
++              cancel_work_sync(&osb->dentry_lock_work);
++      }
+       kill_block_super(sb);
+ }
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.fixes/ocfs2-quota-Make-global-quota-files-blocksize-aligned.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/ocfs2-quota-Make-global-quota-files-blocksize-aligned.patch
index f2f75631d2c547315622aff57d5a97716f227a9f..68f448830ab71d599a5e9d5d16e8934933d03227 100644 (file)
@@ -21,7 +21,7 @@ Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/quota_global.c
        }
        mutex_lock_nested(&gqinode->i_mutex, I_MUTEX_QUOTA);
        if (gqinode->i_size < off + len) {
-+              loff_t rounded_end = ALIGN(off + len, sb->s_blocksize);
++              loff_t rounded_end = ALIGN(off + len, sb->s_blocksize);
 +
                down_write(&OCFS2_I(gqinode)->ip_alloc_sem);
 -              err = ocfs2_extend_no_holes(gqinode, off + len, off);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-release-the-buffer-head-in-ocfs2_do_truncate.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-release-the-buffer-head-in-ocfs2_do_truncate.patch
new file mode 100644 (file)
index 0000000..75cfa96
--- /dev/null
@@ -0,0 +1,29 @@
+From 60e2ec48665b8495360ca4a6004c5cd52beb2bc1 Mon Sep 17 00:00:00 2001
+From: Tao Ma <tao.ma@oracle.com>
+Date: Wed, 12 Aug 2009 14:42:47 +0800
+Subject: [PATCH] ocfs2: release the buffer head in ocfs2_do_truncate.
+References: bnc#528427
+
+In ocfs2_do_truncate, we forget to release last_eb_bh which
+will cause memleak. So call brelse in the end.
+
+Signed-off-by: Tao Ma <tao.ma@oracle.com>
+Signed-off-by: Joel Becker <joel.becker@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/alloc.c |    2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/ocfs2/alloc.c
++++ linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+@@ -6716,7 +6716,7 @@ static int ocfs2_do_truncate(struct ocfs
+       }
+       status = 0;
+ bail:
+-
++      brelse(last_eb_bh);
+       mlog_exit(status);
+       return status;
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-use-ocfs2_rec_clusters-in-ocfs2_adjust_adjace.patch b/src/patches/suse-2.6.27.39/patches.fixes/ocfs2-use-ocfs2_rec_clusters-in-ocfs2_adjust_adjace.patch
new file mode 100644 (file)
index 0000000..bb75a24
--- /dev/null
@@ -0,0 +1,35 @@
+From 82e12644cf5227dab15201fbcaf0ca6330ebd70f Mon Sep 17 00:00:00 2001
+From: Tao Ma <tao.ma@oracle.com>
+Date: Thu, 23 Jul 2009 08:12:58 +0800
+Subject: [PATCH] ocfs2: Use ocfs2_rec_clusters in ocfs2_adjust_adjacent_records.
+References: bnc#528427
+
+In ocfs2_adjust_adjacent_records, we will adjust adjacent records
+according to the extent_list in the lower level. But actually
+the lower level tree will either be a leaf or a branch. If we only
+use ocfs2_is_empty_extent we will meet with some problem if the lower
+tree is a branch (tree_depth > 1). So use !ocfs2_rec_clusters instead.
+And actually only the leaf record can have holes. So add a BUG_ON
+for non-leaf branch.
+
+Signed-off-by: Tao Ma <tao.ma@oracle.com>
+Signed-off-by: Joel Becker <joel.becker@oracle.com>
+Signed-off-by: Mark Fasheh <mfasheh@suse.com>
+---
+ fs/ocfs2/alloc.c |    3 ++-
+ 1 files changed, 2 insertions(+), 1 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/fs/ocfs2/alloc.c
++++ linux-2.6.27-SLE11_BRANCH/fs/ocfs2/alloc.c
+@@ -1769,7 +1769,8 @@ static void ocfs2_adjust_adjacent_record
+        * immediately to their right.
+        */
+       left_clusters = le32_to_cpu(right_child_el->l_recs[0].e_cpos);
+-      if (ocfs2_is_empty_extent(&right_child_el->l_recs[0])) {
++      if (!ocfs2_rec_clusters(right_child_el, &right_child_el->l_recs[0])) {
++              BUG_ON(right_child_el->l_tree_depth);
+               BUG_ON(le16_to_cpu(right_child_el->l_next_free_rec) <= 1);
+               left_clusters = le32_to_cpu(right_child_el->l_recs[1].e_cpos);
+       }
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/reiserfs-truncate-failed-write b/src/patches/suse-2.6.27.39/patches.fixes/reiserfs-truncate-failed-write
new file mode 100644 (file)
index 0000000..cc06c2e
--- /dev/null
@@ -0,0 +1,54 @@
+From: Jan Kara <jack@suse.cz>
+Subject: reiserfs: Truncate blocks not used by a write
+References: bnc#483375
+Patch-mainline: 2.6.32
+
+It can happen that write does not use all the blocks allocated in write_begin
+either because of some filesystem error (like ENOSPC) or because page with
+data to write has been removed from memory. We truncate these blocks so that
+we don't have dangling blocks beyond i_size. 
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+
+diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/reiserfs/inode.c linux-2.6.27-SLE11_BRANCH-1-reiserfs_corruption/fs/reiserfs/inode.c
+--- linux-2.6.27-SLE11_BRANCH/fs/reiserfs/inode.c      2009-06-02 17:14:29.000000000 +0200
++++ linux-2.6.27-SLE11_BRANCH-1-reiserfs_corruption/fs/reiserfs/inode.c        2009-06-24 14:39:44.000000000 +0200
+@@ -2606,6 +2610,8 @@ static int reiserfs_write_begin(struct f
+       if (ret) {
+               unlock_page(page);
+               page_cache_release(page);
++              /* Truncate allocated blocks */
++              vmtruncate(inode, inode->i_size);
+       }
+       return ret;
+ }
+@@ -2698,8 +2705,7 @@ static int reiserfs_write_end(struct fil
+        ** transaction tracking stuff when the size changes.  So, we have
+        ** to do the i_size updates here.
+        */
+-      pos += copied;
+-      if (pos > inode->i_size) {
++      if (pos + copied > inode->i_size) {
+               struct reiserfs_transaction_handle myth;
+               reiserfs_write_lock(inode->i_sb);
+               /* If the file have grown beyond the border where it
+@@ -2717,7 +2723,7 @@ static int reiserfs_write_end(struct fil
+                       goto journal_error;
+               }
+               reiserfs_update_inode_transaction(inode);
+-              inode->i_size = pos;
++              inode->i_size = pos + copied;
+               /*
+                * this will just nest into our transaction.  It's important
+                * to use mark_inode_dirty so the inode gets pushed around on the
+@@ -2744,6 +2750,10 @@ static int reiserfs_write_end(struct fil
+       out:
+       unlock_page(page);
+       page_cache_release(page);
++
++      if (pos + len > inode->i_size)
++              vmtruncate(inode, inode->i_size);
++
+       return ret == 0 ? copied : ret;
+       journal_error:
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-sles10sp3-fixes b/src/patches/suse-2.6.27.39/patches.fixes/scsi-dh-rdac-sles10sp3-fixes
new file mode 100644 (file)
index 0000000..3bc78b9
--- /dev/null
@@ -0,0 +1,107 @@
+From: Vijay Kumar <vijay.chauhan@lsi.com>
+Date: Mon, 21 Sep 2009 15:00:22 +0200
+Subject: scsi_dh_rdac: Include fixes from SLES10 SP3
+References: bnc#539271
+
+This patch updates the scsi_dh_rdac device handler with
+fixes already present in SLES10 SP3:
+
+1) Adding sense 02/A1/02 in rdac_check_sense
+
+2) Changing mode_select_handle_sense format to switch-case
+
+3) Correcting entry for struct scsi_dh_devlist rdac; adding 3rd argument for
+{"LSI", "INF-01-00"}
+{"ENGENIO", "INF-01-00"}
+
+Signed-off-by: Vijay Kumar <vijay.chauhan@lsi.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/device_handler/scsi_dh_rdac.c |   48 +++++++++++++++++++--------
+ 1 files changed, 34 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
+index 6d48426..0bd33ee 100644
+--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
++++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
+@@ -449,27 +449,41 @@ static int mode_select_handle_sense(struct scsi_device *sdev,
+                                   unsigned char *sensebuf)
+ {
+       struct scsi_sense_hdr sense_hdr;
+-      int sense, err = SCSI_DH_IO, ret;
++      int err = SCSI_DH_IO, ret;
+       ret = scsi_normalize_sense(sensebuf, SCSI_SENSE_BUFFERSIZE, &sense_hdr);
+       if (!ret)
+               goto done;
+       err = SCSI_DH_OK;
+-      sense = (sense_hdr.sense_key << 16) | (sense_hdr.asc << 8) |
+-                      sense_hdr.ascq;
+-      /* If it is retryable failure, submit the c9 inquiry again */
+-      if (sense_hdr.sense_key == 6 || sense == 0x59136 || sense == 0xb8b02) {
+-              /* 0x59136    - Command lock contention
+-               * 0xb8b02    - Quiescense achieved
+-               * 0x6xxxx    - Unit Attention
+-               */
++
++      switch (sense_hdr.sense_key) {
++      case NO_SENSE:
++      case ABORTED_COMMAND:
++      case UNIT_ATTENTION:
++              err = SCSI_DH_RETRY;
++              break;
++      case NOT_READY:
++              if (sense_hdr.asc == 0x04 && sense_hdr.ascq == 0x01)
++                      /* LUN Not Ready and is in the Process
++                       * of becoming ready
++                       */
++              err = SCSI_DH_RETRY;
++              break;
++      case ILLEGAL_REQUEST:
++              if (sense_hdr.asc == 0x91 && sense_hdr.ascq == 0x36)
++                      /*
++                       * Command Lock contention
++                       */
+               err = SCSI_DH_RETRY;
++              break;
++      default:
++              sdev_printk(KERN_INFO, sdev,
++                      "MODE_SELECT failed with sense %02x/%02x/%02x.\n",
++                      sense_hdr.sense_key, sense_hdr.asc, sense_hdr.ascq);
++
+       }
+-      if (sense)
+-              sdev_printk(KERN_INFO, sdev,
+-                      "MODE_SELECT failed with sense 0x%x.\n", sense);
+ done:
+       return err;
+ }
+@@ -566,6 +580,12 @@ static int rdac_check_sense(struct scsi_device *sdev,
+                        * Just retry and wait.
+                        */
+                       return ADD_TO_MLQUEUE;
++              if (sense_hdr->asc == 0xA1  && sense_hdr->ascq == 0x02)
++                      /* LUN Not Ready - Quiescense in progress
++                       * or has been achieved
++                       * Just retry.
++                       */
++                      return ADD_TO_MLQUEUE;
+               break;
+       case ILLEGAL_REQUEST:
+               if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) {
+@@ -615,8 +635,8 @@ static const struct scsi_dh_devlist rdac_dev_list[] = {
+       {"DELL", "MD3000i", 0},
+       {"DELL", "MD32xx", 0},
+       {"DELL", "MD32xxi", 0},
+-      {"LSI", "INF-01-00"},
+-      {"ENGENIO", "INF-01-00"},
++      {"LSI", "INF-01-00", 0},
++      {"ENGENIO", "INF-01-00", 0},
+       {NULL, NULL, 0},
+ };
+-- 
+1.5.3.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-dont-call-blk_plug_device-from-scsi_target_queue_ready b/src/patches/suse-2.6.27.39/patches.fixes/scsi-dont-call-blk_plug_device-from-scsi_target_queue_ready
new file mode 100644 (file)
index 0000000..fe1eede
--- /dev/null
@@ -0,0 +1,31 @@
+From: Mike Christie <michaelc@cs.wisc.edu>
+Date: Thu, 9 Apr 2009 15:57:10 -0500
+Subject: scsi_lib.c: fix q->lock not held warning when target is busy
+X-Git: b4efdd586bc08cdf5977cad0a90091f44546a930
+References: bnc#541403
+
+We cannot call blk_plug_device from scsi_target_queue_ready
+because the q lock is not held. And we do not need to call
+it from there because when we return 0, the scsi_request_fn
+not_ready handling will plug the queue for us if needed.
+
+Signed-off-by: Mike Christie <michaelc@cs.wisc.edu>
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index d1cb64a..bb218c8 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -1291,10 +1291,8 @@ static inline int scsi_target_queue_ready(struct Scsi_Host *shost,
+               if (--starget->target_blocked == 0) {
+                       SCSI_LOG_MLQUEUE(3, starget_printk(KERN_INFO, starget,
+                                        "unblocking target at zero depth\n"));
+-              } else {
+-                      blk_plug_device(sdev->request_queue);
++              } else
+                       return 0;
+-              }
+       }
+       if (scsi_target_is_busy(starget)) {
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-fixup-recovered-error b/src/patches/suse-2.6.27.39/patches.fixes/scsi-fixup-recovered-error
new file mode 100644 (file)
index 0000000..5f7777e
--- /dev/null
@@ -0,0 +1,88 @@
+From: James Bottomley <James.Bottomley@HansenPartnership.com>
+Date: Mon Mar 30 16:55:51 2009 +0000
+X-Git: a9bddd74630b2a1f2dedc537417c372b2d9edc76
+Subject: scsi: fix recovered error handling
+References: bnc#487412
+
+We have a problem with recovered error handling in that any command
+which goes down as BLOCK_PC but which returns a sense code of RECOVERED
+ERROR gets completed with -EIO.  For actual SG_IO commands, this doesn't
+matter at all, since the error return code gets dropped in favour of
+req->errors which contain the SCSI completion code.
+
+However, if this command is part of the block system, then it will pay
+attention to the returned error code.  In particularly if a SYNCHRONIZE
+CACHE from a barrier command completes with RECOVERED ERROR, the
+resulting -EIO on the barrier causes block to error the request and
+return it to the filesystem.  Fix this by converting the -EIO for
+recovered error to zero, plus remove the printing of this from sd and
+sr so the message isn't double printed.
+
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+
+diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
+index 4b13e36..d1cb64a 100644
+--- a/drivers/scsi/scsi_lib.c
++++ b/drivers/scsi/scsi_lib.c
+@@ -791,7 +791,22 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
+                                     "%d bytes done.\n",
+                                     req->nr_sectors, good_bytes));
+-      /* A number of bytes were successfully read.  If there
++      /*
++       * Recovered errors need reporting, but they're always treated
++       * as success, so fiddle the result code here.  For BLOCK_PC
++       * we already took a copy of the original into rq->errors which
++       * is what gets returned to the user
++       */
++      if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) {
++              if (!(req->cmd_flags & REQ_QUIET))
++                      scsi_print_sense("", cmd);
++              result = 0;
++              /* BLOCK_PC may have set error */
++              error = 0;
++      }
++
++      /*
++       * A number of bytes were successfully read.  If there
+        * are leftovers and there is some kind of error
+        * (result != 0), retry the rest.
+        */
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index aeab5d9..3fcb64b 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1051,12 +1051,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)
+               good_bytes = sd_completed_bytes(SCpnt);
+               break;
+       case RECOVERED_ERROR:
+-              /* Inform the user, but make sure that it's not treated
+-               * as a hard error.
+-               */
+-              scsi_print_sense("sd", SCpnt);
+-              SCpnt->result = 0;
+-              memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
+               good_bytes = scsi_bufflen(SCpnt);
+               break;
+       case NO_SENSE:
+diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c
+index e7fa3ca..0e1a0f2 100644
+--- a/drivers/scsi/sr.c
++++ b/drivers/scsi/sr.c
+@@ -309,15 +309,6 @@ static int sr_done(struct scsi_cmnd *SCpnt)
+                       break;
+               case RECOVERED_ERROR:
+-
+-                      /*
+-                       * An error occured, but it recovered.  Inform the
+-                       * user, but make sure that it's not treated as a
+-                       * hard error.
+-                       */
+-                      scsi_print_sense("sr", SCpnt);
+-                      SCpnt->result = 0;
+-                      SCpnt->sense_buffer[0] = 0x0;
+                       good_bytes = this_count;
+                       break;
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-reservation-conflict-after-timeout b/src/patches/suse-2.6.27.39/patches.fixes/scsi-reservation-conflict-after-timeout
new file mode 100644 (file)
index 0000000..7929f13
--- /dev/null
@@ -0,0 +1,45 @@
+From: Michael Reed <mdr@sgi.com>
+Date: Mon, 10 Aug 2009 16:59:28 +0000 (-0500)
+Subject: [SCSI] reservation conflict after timeout causes device to be taken offline
+X-Git-Url: http://git.kernel.org/?p=linux%2Fkernel%2Fgit%2Fjejb%2Fscsi-misc-2.6.git;a=commitdiff_plain;h=9686abcee48e6a67ba90689e91c01e868c3134c8
+References: bnc#531384
+
+An IBM tape drive failed to complete a PERSISTENT RESERVE IN within the scsi
+cmd timeout.  Error recovery was initiated and it sequenced from abort through
+taking the tape drive offline.
+
+The device was taken offline because it repeatedly responded to the TUR command
+issued by error recovery with a RESERVATION CONFLICT status.  The tape drive
+was reserved to another system.  This is perfectly legitimate response to TUR,
+and is one that an escalation of recovery is unlikely to clear.  Further,
+escalation of recovery can have undesirable side effects on the operation of
+tape drives shared with other initiators.
+
+Instead of escalating recovery, error recovery should treat the RESERVATION
+CONFLICT response to the TUR as a good status, giving the issuer of the
+command the opportunity to handle the timeout and reservation conflict.
+
+Signed-off-by: Michael reed <mdr@sgi.com>
+Signed-off-by: James Bottomley <James.Bottomley@suse.de>
+Acked-by: Hannes Reinecke <hare@suse.de>
+---
+
+diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
+index a168935..877204d 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -382,9 +382,13 @@ static int scsi_eh_completed_normally(struct scsi_cmnd *scmd)
+                * who knows?  FIXME(eric)
+                */
+               return SUCCESS;
++      case RESERVATION_CONFLICT:
++              /*
++               * let issuer deal with this, it could be just fine
++               */
++              return SUCCESS;
+       case BUSY:
+       case QUEUE_FULL:
+-      case RESERVATION_CONFLICT:
+       default:
+               return FAILED;
+       }
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-ADD_TO_MLQUEUE-return-values b/src/patches/suse-2.6.27.39/patches.fixes/scsi-retry-ADD_TO_MLQUEUE-return-values
new file mode 100644 (file)
index 0000000..03bf63c
--- /dev/null
@@ -0,0 +1,36 @@
+From: Hannes Reinecke <hare@suse.de>
+Date: Mon, 21 Sep 2009 15:09:12 +0200
+Subject: [PATCH] Retry ADD_TO_MLQUEUE return values for SCSI EH commands
+References: bnc#536117
+
+A target reset when I/O is ongoing might result
+an eventual device offline, as scsi_eh_completed_normally()
+might return ADD_TO_MLQUEUE in addition to the
+advertised SUCCESS, FAILED, and NEEDS_RETRY.
+
+Which is unfortunate as scsi_send_eh_cmnd() will
+therefore map ADD_TO_MLQUEUE to FAILED instead of
+the more appropriate NEEDS_RETRY.
+
+Signed-off-by: Hannes Reinecke <hare@suse.de>
+---
+ drivers/scsi/scsi_error.c |    3 +++
+ 1 files changed, 3 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
+index ab326be..98b9cc3 100644
+--- a/drivers/scsi/scsi_error.c
++++ b/drivers/scsi/scsi_error.c
+@@ -818,6 +818,9 @@ static int scsi_send_eh_cmnd(struct scsi_cmnd *scmd, unsigned char *cmnd,
+               case NEEDS_RETRY:
+               case FAILED:
+                       break;
++              case ADD_TO_MLQUEUE:
++                      rtn = NEEDS_RETRY;
++                      break;
+               default:
+                       rtn = FAILED;
+                       break;
+-- 
+1.5.3.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi-ses-hotplug-fix b/src/patches/suse-2.6.27.39/patches.fixes/scsi-ses-hotplug-fix
new file mode 100644 (file)
index 0000000..b4e1b97
--- /dev/null
@@ -0,0 +1,120 @@
+From: James Bottomley <James.Bottomley@HansenPartnership.com>
+Date: Sat, 1 Aug 2009 00:39:36 +0000
+Subject: [PATCH] [SCSI] ses: fix hotplug with multiple devices and expanders
+X-Git: 163f52b6cf3a639df6a72c7937e0eb88b20f1ef3
+References: bnc#549751
+
+In a situation either with expanders or with multiple enclosure
+devices, hot add doesn't always work.  This is because we try to find
+a single enclosure device attached to the host.  Fix this by looping
+over all enclosure devices attached to the host and also by making the
+find loop recognise that the enclosure devices may be expander remote
+(i.e. not parented by the host).
+
+Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
+Signed-off-by: James Bottomley <James.Bottomley@suse.de>
+
+diff --git a/drivers/misc/enclosure.c b/drivers/misc/enclosure.c
+index 348443b..789d121 100644
+--- a/drivers/misc/enclosure.c
++++ b/drivers/misc/enclosure.c
+@@ -33,24 +33,44 @@ static DEFINE_MUTEX(container_list_lock);
+ static struct class enclosure_class;
+ /**
+- * enclosure_find - find an enclosure given a device
+- * @dev:      the device to find for
++ * enclosure_find - find an enclosure given a parent device
++ * @dev:      the parent to match against
++ * @start:    Optional enclosure device to start from (NULL if none)
+  *
+- * Looks through the list of registered enclosures to see
+- * if it can find a match for a device.  Returns NULL if no
+- * enclosure is found. Obtains a reference to the enclosure class
+- * device which must be released with device_put().
++ * Looks through the list of registered enclosures to find all those
++ * with @dev as a parent.  Returns NULL if no enclosure is
++ * found. @start can be used as a starting point to obtain multiple
++ * enclosures per parent (should begin with NULL and then be set to
++ * each returned enclosure device). Obtains a reference to the
++ * enclosure class device which must be released with device_put().
++ * If @start is not NULL, a reference must be taken on it which is
++ * released before returning (this allows a loop through all
++ * enclosures to exit with only the reference on the enclosure of
++ * interest held).  Note that the @dev may correspond to the actual
++ * device housing the enclosure, in which case no iteration via @start
++ * is required.
+  */
+-struct enclosure_device *enclosure_find(struct device *dev)
++struct enclosure_device *enclosure_find(struct device *dev,
++                                      struct enclosure_device *start)
+ {
+       struct enclosure_device *edev;
+       mutex_lock(&container_list_lock);
+-      list_for_each_entry(edev, &container_list, node) {
+-              if (edev->edev.parent == dev) {
+-                      get_device(&edev->edev);
+-                      mutex_unlock(&container_list_lock);
+-                      return edev;
++      edev = list_prepare_entry(start, &container_list, node);
++      if (start)
++              put_device(&start->edev);
++
++      list_for_each_entry_continue(edev, &container_list, node) {
++              struct device *parent = edev->edev.parent;
++              /* parent might not be immediate, so iterate up to
++               * the root of the tree if necessary */
++              while (parent) {
++                      if (parent == dev) {
++                              get_device(&edev->edev);
++                              mutex_unlock(&container_list_lock);
++                              return edev;
++                      }
++                      parent = parent->parent;
+               }
+       }
+       mutex_unlock(&container_list_lock);
+diff --git a/drivers/scsi/ses.c b/drivers/scsi/ses.c
+index 4f618f4..e1b8c82 100644
+--- a/drivers/scsi/ses.c
++++ b/drivers/scsi/ses.c
+@@ -413,10 +413,11 @@ static int ses_intf_add(struct device *cdev,
+       if (!scsi_device_enclosure(sdev)) {
+               /* not an enclosure, but might be in one */
+-              edev = enclosure_find(&sdev->host->shost_gendev);
+-              if (edev) {
++              struct enclosure_device *prev = NULL;
++
++              while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
+                       ses_match_to_enclosure(edev, sdev);
+-                      put_device(&edev->edev);
++                      prev = edev;
+               }
+               return -ENODEV;
+       }
+@@ -625,7 +626,8 @@ static void ses_intf_remove(struct device *cdev,
+       if (!scsi_device_enclosure(sdev))
+               return;
+-      edev = enclosure_find(cdev->parent);
++      /*  exact match to this enclosure */
++      edev = enclosure_find(cdev->parent, NULL);
+       if (!edev)
+               return;
+diff --git a/include/linux/enclosure.h b/include/linux/enclosure.h
+index 4332442..d77811e 100644
+--- a/include/linux/enclosure.h
++++ b/include/linux/enclosure.h
+@@ -123,7 +123,8 @@ enclosure_component_register(struct enclosure_device *, unsigned int,
+ int enclosure_add_device(struct enclosure_device *enclosure, int component,
+                        struct device *dev);
+ int enclosure_remove_device(struct enclosure_device *enclosure, int component);
+-struct enclosure_device *enclosure_find(struct device *dev);
++struct enclosure_device *enclosure_find(struct device *dev,
++                                      struct enclosure_device *start);
+ int enclosure_for_each_device(int (*fn)(struct enclosure_device *, void *),
+                             void *data);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/scsi_dh-add-del-ids-to-rdac b/src/patches/suse-2.6.27.39/patches.fixes/scsi_dh-add-del-ids-to-rdac
new file mode 100644 (file)
index 0000000..eee14e7
--- /dev/null
@@ -0,0 +1,23 @@
+From: Yanqing Liu <Yanqing_Liu@Dell.com>
+Subject: add support for next generation of Dell PV array
+References: bnc#535801
+Patch-mainline: Not yet
+
+http://marc.info/?l=dm-devel&m=125053752401784&w=2
+
+This patch is to add DM support for next generation of Dell
+PowerVault storage array.
+
+Signed-off-by: Nikanth Karthikesan <knikanth@suse.de>
+
+--- linux/drivers/scsi/device_handler/scsi_dh_rdac.c.orig
++++ linux/drivers/scsi/device_handler/scsi_dh_rdac.c
+@@ -611,6 +611,8 @@ static const struct scsi_dh_devlist rdac
+       {"SUN", "LCSM100_F", 0},
+       {"DELL", "MD3000", 0},
+       {"DELL", "MD3000i", 0},
++      {"DELL", "MD32xx", 0},
++      {"DELL", "MD32xxi", 0},
+       {"LSI", "INF-01-00"},
+       {"ENGENIO", "INF-01-00"},
+       {NULL, NULL, 0},
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/taskstats-align b/src/patches/suse-2.6.27.39/patches.fixes/taskstats-align
new file mode 100644 (file)
index 0000000..4727761
--- /dev/null
@@ -0,0 +1,61 @@
+From: Jeff Mahoney <jeffm@suse.com>
+Subject: [PATCH] delayacct: align to 8 byte boundary on 64-bit systems
+References: bnc#492547 bnc#448410
+
+ prepare_reply sets up an skb for the response. If I understand it correctly,
+ the payload contains:
+
+ +--------------------------------+
+ | genlmsghdr - 4 bytes           |
+ +--------------------------------+
+ | NLA header - 4 bytes           | /* Aggregate header */
+ +-+------------------------------+
+ | | NLA header - 4 bytes         | /* PID header */
+ | +------------------------------+
+ | | pid/tgid   - 4 bytes         |
+ | +------------------------------+
+ | | NLA header - 4 bytes         | /* stats header */
+ | + -----------------------------+ <- oops. aligned on 4 byte boundary
+ | | struct taskstats - 328 bytes |
+ +-+------------------------------+
+
+ The start of the taskstats struct must be 8 byte aligned on IA64 (and other
+ systems with 8 byte alignment rules for 64-bit types) or runtime alignment
+ warnings will be issued.
+
+ This patch pads the pid/tgid field out to sizeof(long), which forces
+ the alignment of taskstats. The getdelays userspace code is ok with this
+ since it assumes 32-bit pid/tgid and then honors that header's length field.
+
+ An array is used to avoid exposing kernel memory contents to userspace in the
+ response.
+
+Signed-off-by: Jeff Mahoney <jeffm@suse.com>
+---
+ kernel/taskstats.c |    8 +++++++-
+ 1 file changed, 7 insertions(+), 1 deletion(-)
+
+--- a/kernel/taskstats.c
++++ b/kernel/taskstats.c
+@@ -362,6 +362,12 @@ static struct taskstats *mk_reply(struct
+       struct nlattr *na, *ret;
+       int aggr;
++      /* If we don't pad, we end up with alignment on a 4 byte boundary.
++       * This causes lots of runtime warnings on systems requiring 8 byte
++       * alignment */
++      u32 pids[2] = { pid, 0 };
++      int pid_size = ALIGN(sizeof(pid), sizeof(long));
++
+       aggr = (type == TASKSTATS_TYPE_PID)
+                       ? TASKSTATS_TYPE_AGGR_PID
+                       : TASKSTATS_TYPE_AGGR_TGID;
+@@ -369,7 +375,7 @@ static struct taskstats *mk_reply(struct
+       na = nla_nest_start(skb, aggr);
+       if (!na)
+               goto err;
+-      if (nla_put(skb, type, sizeof(pid), &pid) < 0)
++      if (nla_put(skb, type, pid_size, pids) < 0)
+               goto err;
+       ret = nla_reserve(skb, TASKSTATS_TYPE_STATS, sizeof(struct taskstats));
+       if (!ret)
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/tc-fix-unitialized-kernel-memory-leak b/src/patches/suse-2.6.27.39/patches.fixes/tc-fix-unitialized-kernel-memory-leak
new file mode 100644 (file)
index 0000000..4652593
--- /dev/null
@@ -0,0 +1,31 @@
+From: Eric Dumazet <eric.dumazet@gmail.com>
+Date: Wed, 2 Sep 2009 02:40:09 +0000 (+0000)
+Subject: tc: Fix unitialized kernel memory leak
+Patch-mainline: v2.6.31-rc9
+Git-commit: 16ebb5e0b36ceadc8186f71d68b0c4fa4b6e781b
+References: bnc#536467 CVE-2009-3612 CVE-2005-4881
+
+tc: Fix unitialized kernel memory leak
+
+Three bytes of uninitialized kernel memory are currently leaked to user
+
+Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
+Reviewed-by: Jiri Pirko <jpirko@redhat.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Acked-by: Jeff Mahoney <jeffm@suse.com>
+---
+
+ net/sched/sch_api.c |    2 ++
+ 1 file changed, 2 insertions(+)
+
+--- a/net/sched/sch_api.c
++++ b/net/sched/sch_api.c
+@@ -1453,6 +1453,8 @@ static int tc_fill_tclass(struct sk_buff
+       nlh = NLMSG_NEW(skb, pid, seq, event, sizeof(*tcm), flags);
+       tcm = NLMSG_DATA(nlh);
+       tcm->tcm_family = AF_UNSPEC;
++      tcm->tcm__pad1 = 0;
++      tcm->tcm__pad2 = 0;
+       tcm->tcm_ifindex = qdisc_dev(q)->ifindex;
+       tcm->tcm_parent = q->handle;
+       tcm->tcm_handle = q->handle;
similarity index 96%
rename from src/patches/suse-2.6.27.31/patches.fixes/tg3-fix-default-wol.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/tg3-fix-default-wol.patch
index efa8f5dd0a9daaf553b9a4fbee57f05a968754de..e932873f6c5671bb90b52e05ae22600a21f68a82 100644 (file)
@@ -39,7 +39,7 @@ Index: linux-2.6.27/drivers/net/tg3.c
 -                  device_may_wakeup(&tp->pdev->dev))
 +                  (nic_cfg & NIC_SRAM_DATA_CFG_WOL_ENABLE)) {
                        tp->tg3_flags |= TG3_FLAG_WOL_ENABLE;
-+                      device_set_wakeup_enable(&tp->pdev->dev, true);
++                      device_set_wakeup_enable(&tp->pdev->dev, true);
 +              }
  
                if (cfg2 & (1 << 17))
similarity index 94%
rename from src/patches/suse-2.6.27.31/patches.fixes/udf-faster_anchor_detection.patch
rename to src/patches/suse-2.6.27.39/patches.fixes/udf-faster_anchor_detection.patch
index e562f3c5af176274730267cf42e72ed7f1d10660..d617ae87ac0272a436d3c4690f12470ec650cf24 100644 (file)
@@ -13,9 +13,13 @@ hopefully more readable and definitely shorter.
 
 Signed-off-by: Jan Kara <jack@suse.cz>
 
-diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/super.c linux-2.6.27-SLE11_BRANCH-1-udf_anchor_detection//fs/udf/super.c
---- linux-2.6.27-SLE11_BRANCH/fs/udf/super.c   2008-10-10 00:13:53.000000000 +0200
-+++ linux-2.6.27-SLE11_BRANCH-1-udf_anchor_detection/fs/udf/super.c    2009-03-19 16:44:56.000000000 +0100
+---
+ fs/udf/super.c  |  395 +++++++++++++++++++++++++-------------------------------
+ fs/udf/udf_sb.h |    2 
+ 2 files changed, 178 insertions(+), 219 deletions(-)
+
+--- a/fs/udf/super.c
++++ b/fs/udf/super.c
 @@ -83,10 +83,7 @@ static int udf_fill_super(struct super_b
  static void udf_put_super(struct super_block *);
  static void udf_write_super(struct super_block *);
@@ -215,7 +219,7 @@ diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/super.c
  static int udf_find_fileset(struct super_block *sb,
                            kernel_lb_addr *fileset,
                            kernel_lb_addr *root)
-@@ -1655,86 +1512,201 @@ static noinline int udf_process_sequence
+@@ -1655,85 +1512,199 @@ static noinline int udf_process_sequence
        return 0;
  }
  
@@ -470,11 +474,9 @@ diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/super.c
 +      }
 +      return 1;
  }
-+  
  
  static void udf_open_lvid(struct super_block *sb)
- {
-@@ -1908,18 +1880,6 @@ static int udf_fill_super(struct super_b
+@@ -1908,18 +1879,6 @@ static int udf_fill_super(struct super_b
  
        udf_debug("Multi-session=%d\n", sbi->s_session);
  
@@ -493,7 +495,7 @@ diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/super.c
        /* Fill in the rest of the superblock */
        sb->s_op = &udf_sb_ops;
        sb->s_export_op = &udf_export_ops;
-@@ -1928,7 +1888,7 @@ static int udf_fill_super(struct super_b
+@@ -1928,7 +1887,7 @@ static int udf_fill_super(struct super_b
        sb->s_magic = UDF_SUPER_MAGIC;
        sb->s_time_gran = 1000;
  
@@ -502,9 +504,8 @@ diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/super.c
                printk(KERN_WARNING "UDF-fs: No partition found (1)\n");
                goto error_out;
        }
-diff -rupX /home/jack/.kerndiffexclude linux-2.6.27-SLE11_BRANCH/fs/udf/udf_sb.h linux-2.6.27-SLE11_BRANCH-1-udf_anchor_detection//fs/udf/udf_sb.h
---- linux-2.6.27-SLE11_BRANCH/fs/udf/udf_sb.h  2008-10-10 00:13:53.000000000 +0200
-+++ linux-2.6.27-SLE11_BRANCH-1-udf_anchor_detection/fs/udf/udf_sb.h   2009-03-19 16:33:24.000000000 +0100
+--- a/fs/udf/udf_sb.h
++++ b/fs/udf/udf_sb.h
 @@ -114,7 +114,7 @@ struct udf_sb_info {
  
        /* Sector headers */
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/usb-hid-ncr-no-init-reports.patch b/src/patches/suse-2.6.27.39/patches.fixes/usb-hid-ncr-no-init-reports.patch
new file mode 100644 (file)
index 0000000..cbd7444
--- /dev/null
@@ -0,0 +1,65 @@
+From 5b915d9e6dc3d22fedde91dfef1cb1a8fa9a1870 Mon Sep 17 00:00:00 2001
+From: Jiri Kosina <jkosina@suse.cz>
+Date: Thu, 5 Nov 2009 14:08:03 +0100
+Subject: [PATCH] HID: fixup quirk for NCR devices
+Reference: bnc#548807
+
+NCR devices are terminally broken by design -- they claim themselves to contain
+proper input applications in their HID report descriptor, but behave very badly
+if treated in standard way.
+
+According to NCR developers, the devices get confused when queried for reports
+in a standard way, rendering them unusable.
+
+NCR is shipping application called "RPSL" that can be used to drive these
+devices through hiddev, under the assumption that in-kernel driver doesn't
+perform initial report query.
+If it does, neither in-kernel nor hiddev-based driver can operate with these
+devices any more.
+
+Introduce a quirk that skips the report query for all NCR devices. The previous
+NOGET quirk was wrong and had been introduced because I misunderstood the nature
+of brokenness of these devices.
+
+Signed-off-by: Jiri Kosina <jkosina@suse.cz>
+
+Index: linux-2.6.27/include/linux/hid.h
+===================================================================
+--- linux-2.6.27.orig/include/linux/hid.h
++++ linux-2.6.27/include/linux/hid.h
+@@ -284,6 +284,7 @@ struct hid_item {
+ #define HID_QUIRK_MICROSOFT_KEYS              0x08000000
+ #define HID_QUIRK_FULLSPEED_INTERVAL          0x10000000
+ #define HID_QUIRK_APPLE_NUMLOCK_EMULATION     0x20000000
++#define HID_QUIRK_NO_INIT_REPORTS              0x40000000
+ /*
+  * Separate quirks for runtime report descriptor fixup
+Index: linux-2.6.27/drivers/hid/usbhid/hid-quirks.c
+===================================================================
+--- linux-2.6.27.orig/drivers/hid/usbhid/hid-quirks.c
++++ linux-2.6.27/drivers/hid/usbhid/hid-quirks.c
+@@ -993,7 +993,7 @@ u32 usbhid_lookup_quirk(const u16 idVend
+       if (idVendor == USB_VENDOR_ID_NCR &&
+                       idProduct >= USB_DEVICE_ID_NCR_FIRST &&
+                       idProduct <= USB_DEVICE_ID_NCR_LAST)
+-                      return HID_QUIRK_NOGET;
++                       return HID_QUIRK_NO_INIT_REPORTS;
+       down_read(&dquirks_rwsem);
+       bl_entry = usbhid_exists_dquirk(idVendor, idProduct);
+Index: linux-2.6.27/drivers/hid/usbhid/hid-core.c
+===================================================================
+--- linux-2.6.27.orig/drivers/hid/usbhid/hid-core.c
++++ linux-2.6.27/drivers/hid/usbhid/hid-core.c
+@@ -980,7 +980,9 @@ static int hid_probe(struct usb_interfac
+       if (!(hid = usb_hid_configure(intf)))
+               return -ENODEV;
+-      usbhid_init_reports(hid);
++       if (!(hid->quirks & HID_QUIRK_NO_INIT_REPORTS))
++               usbhid_init_reports(hid);
++
+       hid_dump_device(hid);
+       if (hid->quirks & HID_QUIRK_RESET_LEDS)
+               usbhid_set_leds(hid);
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/use-totalram_pages b/src/patches/suse-2.6.27.39/patches.fixes/use-totalram_pages
new file mode 100644 (file)
index 0000000..0feb5f0
--- /dev/null
@@ -0,0 +1,354 @@
+From: jbeulich@novell.com
+Subject: use totalram_pages in favor of num_physpages for sizing boot time allocations
+References: bnc#509753
+Patch-mainline: not yet (in -mm as of 2009-08-20)
+
+Some of the calculations (i.e. those not intending to use high memory)
+should likely even use (totalram_pages - totalhigh_pages).
+
+Acked-by: Rusty Russell <rusty@rustcorp.com.au>
+Acked-by: Ingo Molnar <mingo@elte.hu>
+
+--- a/arch/x86/kernel/microcode.c
++++ b/arch/x86/kernel/microcode.c
+@@ -432,8 +432,8 @@ static ssize_t microcode_write (struct f
+ {
+       ssize_t ret;
+-      if ((len >> PAGE_SHIFT) > num_physpages) {
+-              printk(KERN_ERR "microcode: too much data (max %ld pages)\n", num_physpages);
++      if ((len >> PAGE_SHIFT) > totalram_pages) {
++              printk(KERN_ERR "microcode: too much data (max %ld pages)\n", totalram_pages);
+               return -EINVAL;
+       }
+--- a/drivers/char/agp/backend.c
++++ b/drivers/char/agp/backend.c
+@@ -114,9 +114,9 @@ static int agp_find_max(void)
+       long memory, index, result;
+ #if PAGE_SHIFT < 20
+-      memory = num_physpages >> (20 - PAGE_SHIFT);
++      memory = totalram_pages >> (20 - PAGE_SHIFT);
+ #else
+-      memory = num_physpages << (PAGE_SHIFT - 20);
++      memory = totalram_pages << (PAGE_SHIFT - 20);
+ #endif
+       index = 1;
+--- a/drivers/parisc/ccio-dma.c
++++ b/drivers/parisc/ccio-dma.c
+@@ -1277,7 +1277,7 @@ ccio_ioc_init(struct ioc *ioc)
+       ** Hot-Plug/Removal of PCI cards. (aka PCI OLARD).
+       */
+-      iova_space_size = (u32) (num_physpages / count_parisc_driver(&ccio_driver));
++      iova_space_size = (u32) (totalram_pages / count_parisc_driver(&ccio_driver));
+       /* limit IOVA space size to 1MB-1GB */
+@@ -1316,7 +1316,7 @@ ccio_ioc_init(struct ioc *ioc)
+       DBG_INIT("%s() hpa 0x%p mem %luMB IOV %dMB (%d bits)\n",
+                       __func__, ioc->ioc_regs,
+-                      (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
++                      (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
+                       iova_space_size>>20,
+                       iov_order + PAGE_SHIFT);
+--- a/drivers/parisc/sba_iommu.c
++++ b/drivers/parisc/sba_iommu.c
+@@ -1383,7 +1383,7 @@ sba_ioc_init(struct parisc_device *sba, 
+       ** for DMA hints - ergo only 30 bits max.
+       */
+-      iova_space_size = (u32) (num_physpages/global_ioc_cnt);
++      iova_space_size = (u32) (totalram_pages/global_ioc_cnt);
+       /* limit IOVA space size to 1MB-1GB */
+       if (iova_space_size < (1 << (20 - PAGE_SHIFT))) {
+@@ -1408,7 +1408,7 @@ sba_ioc_init(struct parisc_device *sba, 
+       DBG_INIT("%s() hpa 0x%lx mem %ldMB IOV %dMB (%d bits)\n",
+                       __func__,
+                       ioc->ioc_hpa,
+-                      (unsigned long) num_physpages >> (20 - PAGE_SHIFT),
++                      (unsigned long) totalram_pages >> (20 - PAGE_SHIFT),
+                       iova_space_size>>20,
+                       iov_order + PAGE_SHIFT);
+--- a/drivers/xen/balloon.c
++++ b/drivers/xen/balloon.c
+@@ -96,11 +96,7 @@ static struct balloon_stats balloon_stat
+ /* We increase/decrease in batches which fit in a page */
+ static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
+-/* VM /proc information for memory */
+-extern unsigned long totalram_pages;
+-
+ #ifdef CONFIG_HIGHMEM
+-extern unsigned long totalhigh_pages;
+ #define inc_totalhigh_pages() (totalhigh_pages++)
+ #define dec_totalhigh_pages() (totalhigh_pages--)
+ #else
+--- a/fs/ntfs/malloc.h
++++ b/fs/ntfs/malloc.h
+@@ -47,7 +47,7 @@ static inline void *__ntfs_malloc(unsign
+               return kmalloc(PAGE_SIZE, gfp_mask & ~__GFP_HIGHMEM);
+               /* return (void *)__get_free_page(gfp_mask); */
+       }
+-      if (likely(size >> PAGE_SHIFT < num_physpages))
++      if (likely((size >> PAGE_SHIFT) < totalram_pages))
+               return __vmalloc(size, gfp_mask, PAGE_KERNEL);
+       return NULL;
+ }
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -24,6 +24,7 @@ extern unsigned long max_mapnr;
+ #endif
+ extern unsigned long num_physpages;
++extern unsigned long totalram_pages;
+ extern void * high_memory;
+ extern int page_cluster;
+--- a/init/main.c
++++ b/init/main.c
+@@ -696,13 +696,13 @@ asmlinkage void __init start_kernel(void
+               efi_enter_virtual_mode();
+ #endif
+       thread_info_cache_init();
+-      fork_init(num_physpages);
++      fork_init(totalram_pages);
+       proc_caches_init();
+       buffer_init();
+       unnamed_dev_init();
+       key_init();
+       security_init();
+-      vfs_caches_init(num_physpages);
++      vfs_caches_init(totalram_pages);
+       radix_tree_init();
+       signals_init();
+       /* rootfs populating might need page-writeback */
+--- a/mm/memory_hotplug.c
++++ b/mm/memory_hotplug.c
+@@ -338,8 +338,11 @@ EXPORT_SYMBOL_GPL(__remove_pages);
+ void online_page(struct page *page)
+ {
++      unsigned long pfn = page_to_pfn(page);
++
+       totalram_pages++;
+-      num_physpages++;
++      if (pfn >= num_physpages)
++              num_physpages = pfn + 1;
+ #ifdef CONFIG_HIGHMEM
+       if (PageHighMem(page))
+@@ -832,7 +835,6 @@ repeat:
+       zone->present_pages -= offlined_pages;
+       zone->zone_pgdat->node_present_pages -= offlined_pages;
+       totalram_pages -= offlined_pages;
+-      num_physpages -= offlined_pages;
+       vm_total_pages = nr_free_pagecache_pages();
+       writeback_set_ratelimit();
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -1474,7 +1474,7 @@ void __init kmem_cache_init(void)
+        * Fragmentation resistance on low memory - only use bigger
+        * page orders on machines with more than 32MB of memory.
+        */
+-      if (num_physpages > (32 << 20) >> PAGE_SHIFT)
++      if (totalram_pages > (32 << 20) >> PAGE_SHIFT)
+               slab_break_gfp_order = BREAK_GFP_ORDER_HI;
+       /* Bootstrap is tricky, because several objects are allocated
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -479,7 +479,7 @@ EXPORT_SYMBOL(pagevec_lookup_tag);
+  */
+ void __init swap_setup(void)
+ {
+-      unsigned long megs = num_physpages >> (20 - PAGE_SHIFT);
++      unsigned long megs = totalram_pages >> (20 - PAGE_SHIFT);
+ #ifdef CONFIG_SWAP
+       bdi_init(swapper_space.backing_dev_info);
+--- a/mm/vmalloc.c
++++ b/mm/vmalloc.c
+@@ -466,7 +466,7 @@ void *vmap(struct page **pages, unsigned
+ {
+       struct vm_struct *area;
+-      if (count > num_physpages)
++      if (count > totalram_pages)
+               return NULL;
+       area = get_vm_area_caller((count << PAGE_SHIFT), flags,
+@@ -560,7 +560,7 @@ static void *__vmalloc_node(unsigned lon
+       struct vm_struct *area;
+       size = PAGE_ALIGN(size);
+-      if (!size || (size >> PAGE_SHIFT) > num_physpages)
++      if (!size || (size >> PAGE_SHIFT) > totalram_pages)
+               return NULL;
+       area = __get_vm_area_node(size, VM_ALLOC, VMALLOC_START, VMALLOC_END,
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -1216,12 +1216,12 @@ EXPORT_SYMBOL_GPL(sk_setup_caps);
+ void __init sk_init(void)
+ {
+-      if (num_physpages <= 4096) {
++      if (totalram_pages <= 4096) {
+               sysctl_wmem_max = 32767;
+               sysctl_rmem_max = 32767;
+               sysctl_wmem_default = 32767;
+               sysctl_rmem_default = 32767;
+-      } else if (num_physpages >= 131072) {
++      } else if (totalram_pages >= 131072) {
+               sysctl_wmem_max = 131071;
+               sysctl_rmem_max = 131071;
+       }
+--- a/net/dccp/proto.c
++++ b/net/dccp/proto.c
+@@ -1056,10 +1056,10 @@ static int __init dccp_init(void)
+        *
+        * The methodology is similar to that of the buffer cache.
+        */
+-      if (num_physpages >= (128 * 1024))
+-              goal = num_physpages >> (21 - PAGE_SHIFT);
++      if (totalram_pages >= (128 * 1024))
++              goal = totalram_pages >> (21 - PAGE_SHIFT);
+       else
+-              goal = num_physpages >> (23 - PAGE_SHIFT);
++              goal = totalram_pages >> (23 - PAGE_SHIFT);
+       if (thash_entries)
+               goal = (thash_entries *
+--- a/net/decnet/dn_route.c
++++ b/net/decnet/dn_route.c
+@@ -1754,7 +1754,7 @@ void __init dn_route_init(void)
+       dn_route_timer.expires = jiffies + decnet_dst_gc_interval * HZ;
+       add_timer(&dn_route_timer);
+-      goal = num_physpages >> (26 - PAGE_SHIFT);
++      goal = totalram_pages >> (26 - PAGE_SHIFT);
+       for(order = 0; (1UL << order) < goal; order++)
+               /* NOTHING */;
+--- a/net/ipv4/route.c
++++ b/net/ipv4/route.c
+@@ -3318,7 +3318,7 @@ int __init ip_rt_init(void)
+               alloc_large_system_hash("IP route cache",
+                                       sizeof(struct rt_hash_bucket),
+                                       rhash_entries,
+-                                      (num_physpages >= 128 * 1024) ?
++                                      (totalram_pages >= 128 * 1024) ?
+                                       15 : 17,
+                                       0,
+                                       &rt_hash_log,
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -2708,7 +2708,7 @@ void __init tcp_init(void)
+               alloc_large_system_hash("TCP established",
+                                       sizeof(struct inet_ehash_bucket),
+                                       thash_entries,
+-                                      (num_physpages >= 128 * 1024) ?
++                                      (totalram_pages >= 128 * 1024) ?
+                                       13 : 15,
+                                       0,
+                                       &tcp_hashinfo.ehash_size,
+@@ -2725,7 +2725,7 @@ void __init tcp_init(void)
+               alloc_large_system_hash("TCP bind",
+                                       sizeof(struct inet_bind_hashbucket),
+                                       tcp_hashinfo.ehash_size,
+-                                      (num_physpages >= 128 * 1024) ?
++                                      (totalram_pages >= 128 * 1024) ?
+                                       13 : 15,
+                                       0,
+                                       &tcp_hashinfo.bhash_size,
+--- a/net/netfilter/nf_conntrack_core.c
++++ b/net/netfilter/nf_conntrack_core.c
+@@ -1129,9 +1129,9 @@ int __init nf_conntrack_init(void)
+        * machine has 512 buckets. >= 1GB machines have 16384 buckets. */
+       if (!nf_conntrack_htable_size) {
+               nf_conntrack_htable_size
+-                      = (((num_physpages << PAGE_SHIFT) / 16384)
++                      = (((totalram_pages << PAGE_SHIFT) / 16384)
+                          / sizeof(struct hlist_head));
+-              if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
++              if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
+                       nf_conntrack_htable_size = 16384;
+               if (nf_conntrack_htable_size < 32)
+                       nf_conntrack_htable_size = 32;
+--- a/net/netfilter/x_tables.c
++++ b/net/netfilter/x_tables.c
+@@ -547,7 +547,7 @@ struct xt_table_info *xt_alloc_table_inf
+       int cpu;
+       /* Pedantry: prevent them from hitting BUG() in vmalloc.c --RR */
+-      if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > num_physpages)
++      if ((SMP_ALIGN(size) >> PAGE_SHIFT) + 2 > totalram_pages)
+               return NULL;
+       newinfo = kzalloc(XT_TABLE_INFO_SZ, GFP_KERNEL);
+--- a/net/netfilter/xt_hashlimit.c
++++ b/net/netfilter/xt_hashlimit.c
+@@ -194,9 +194,9 @@ static int htable_create_v0(struct xt_ha
+       if (minfo->cfg.size)
+               size = minfo->cfg.size;
+       else {
+-              size = ((num_physpages << PAGE_SHIFT) / 16384) /
++              size = ((totalram_pages << PAGE_SHIFT) / 16384) /
+                      sizeof(struct list_head);
+-              if (num_physpages > (1024 * 1024 * 1024 / PAGE_SIZE))
++              if (totalram_pages > (1024 * 1024 * 1024 / PAGE_SIZE))
+                       size = 8192;
+               if (size < 16)
+                       size = 16;
+@@ -268,9 +268,9 @@ static int htable_create(struct xt_hashl
+       if (minfo->cfg.size) {
+               size = minfo->cfg.size;
+       } else {
+-              size = (num_physpages << PAGE_SHIFT) / 16384 /
++              size = (totalram_pages << PAGE_SHIFT) / 16384 /
+                      sizeof(struct list_head);
+-              if (num_physpages > 1024 * 1024 * 1024 / PAGE_SIZE)
++              if (totalram_pages > 1024 * 1024 * 1024 / PAGE_SIZE)
+                       size = 8192;
+               if (size < 16)
+                       size = 16;
+--- a/net/netlink/af_netlink.c
++++ b/net/netlink/af_netlink.c
+@@ -1955,10 +1955,10 @@ static int __init netlink_proto_init(voi
+       if (!nl_table)
+               goto panic;
+-      if (num_physpages >= (128 * 1024))
+-              limit = num_physpages >> (21 - PAGE_SHIFT);
++      if (totalram_pages >= (128 * 1024))
++              limit = totalram_pages >> (21 - PAGE_SHIFT);
+       else
+-              limit = num_physpages >> (23 - PAGE_SHIFT);
++              limit = totalram_pages >> (23 - PAGE_SHIFT);
+       order = get_bitmask_order(limit) - 1 + PAGE_SHIFT;
+       limit = (1UL << order) / sizeof(struct hlist_head);
+--- a/net/sctp/protocol.c
++++ b/net/sctp/protocol.c
+@@ -1206,10 +1206,10 @@ SCTP_STATIC __init int sctp_init(void)
+       /* Size and allocate the association hash table.
+        * The methodology is similar to that of the tcp hash tables.
+        */
+-      if (num_physpages >= (128 * 1024))
+-              goal = num_physpages >> (22 - PAGE_SHIFT);
++      if (totalram_pages >= (128 * 1024))
++              goal = totalram_pages >> (22 - PAGE_SHIFT);
+       else
+-              goal = num_physpages >> (24 - PAGE_SHIFT);
++              goal = totalram_pages >> (24 - PAGE_SHIFT);
+       for (order = 0; (1UL << order) < goal; order++)
+               ;
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.fixes/uv-redundant-creation-of-proc-dir
rename to src/patches/suse-2.6.27.39/patches.fixes/uv-redundant-creation-of-proc-dir
index be11fc10cade6ae8949195ea164615eba7f59736..1cf47f2f8c7e2cda1123d1f62c0fae11dcbb9191 100644 (file)
@@ -33,7 +33,7 @@ Acked-by: Jeff Mahoney <jeffm@suse.com>
        uv_scir_register_cpu_notifier();
  
        uv_cpu_init();
-+      proc_mkdir("sgi_uv", NULL);
++      proc_mkdir("sgi_uv", NULL);
  }
  
 --- a/arch/x86/kernel/tlb_uv.c
diff --git a/src/patches/suse-2.6.27.39/patches.fixes/zisofs-large-pagesize-read.patch b/src/patches/suse-2.6.27.39/patches.fixes/zisofs-large-pagesize-read.patch
new file mode 100644 (file)
index 0000000..5965db8
--- /dev/null
@@ -0,0 +1,606 @@
+From: Jan Kara <jack@suse.cz>
+Subject: [PATCH] zisofs: Implement reading of compressed files when PAGE_CACHE_SIZE > compress block size
+Patch-mainline: 2.6.33
+References: bnc#540349
+
+Also split and cleanup zisofs_readpage() when we are changing it anyway.
+
+Signed-off-by: Jan Kara <jack@suse.cz>
+---
+ fs/isofs/compress.c |  533 +++++++++++++++++++++++++++------------------------
+ fs/isofs/rock.c     |    3 +-
+ 2 files changed, 286 insertions(+), 250 deletions(-)
+
+diff --git a/fs/isofs/compress.c b/fs/isofs/compress.c
+index defb932..0b3fa79 100644
+--- a/fs/isofs/compress.c
++++ b/fs/isofs/compress.c
+@@ -36,286 +36,323 @@ static void *zisofs_zlib_workspace;
+ static DEFINE_MUTEX(zisofs_zlib_lock);
+ /*
+- * When decompressing, we typically obtain more than one page
+- * per reference.  We inject the additional pages into the page
+- * cache as a form of readahead.
++ * Read data of @inode from @block_start to @block_end and uncompress
++ * to one zisofs block. Store the data in the @pages array with @pcount
++ * entries. Start storing at offset @poffset of the first page.
+  */
+-static int zisofs_readpage(struct file *file, struct page *page)
++static loff_t zisofs_uncompress_block(struct inode *inode, loff_t block_start,
++                                    loff_t block_end, int pcount,
++                                    struct page **pages, unsigned poffset,
++                                    int *errp)
+ {
+-      struct inode *inode = file->f_path.dentry->d_inode;
+-      struct address_space *mapping = inode->i_mapping;
+-      unsigned int maxpage, xpage, fpage, blockindex;
+-      unsigned long offset;
+-      unsigned long blockptr, blockendptr, cstart, cend, csize;
+-      struct buffer_head *bh, *ptrbh[2];
+-      unsigned long bufsize = ISOFS_BUFFER_SIZE(inode);
+-      unsigned int bufshift = ISOFS_BUFFER_BITS(inode);
+-      unsigned long bufmask  = bufsize - 1;
+-      int err = -EIO;
+-      int i;
+-      unsigned int header_size = ISOFS_I(inode)->i_format_parm[0];
+       unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1];
+-      /* unsigned long zisofs_block_size = 1UL << zisofs_block_shift; */
+-      unsigned int zisofs_block_page_shift = zisofs_block_shift-PAGE_CACHE_SHIFT;
+-      unsigned long zisofs_block_pages = 1UL << zisofs_block_page_shift;
+-      unsigned long zisofs_block_page_mask = zisofs_block_pages-1;
+-      struct page *pages[zisofs_block_pages];
+-      unsigned long index = page->index;
+-      int indexblocks;
+-
+-      /* We have already been given one page, this is the one
+-         we must do. */
+-      xpage = index & zisofs_block_page_mask;
+-      pages[xpage] = page;
+- 
+-      /* The remaining pages need to be allocated and inserted */
+-      offset = index & ~zisofs_block_page_mask;
+-      blockindex = offset >> zisofs_block_page_shift;
+-      maxpage = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
+-
+-      /*
+-       * If this page is wholly outside i_size we just return zero;
+-       * do_generic_file_read() will handle this for us
+-       */
+-      if (page->index >= maxpage) {
+-              SetPageUptodate(page);
+-              unlock_page(page);
++      unsigned int bufsize = ISOFS_BUFFER_SIZE(inode);
++      unsigned int bufshift = ISOFS_BUFFER_BITS(inode);
++      unsigned int bufmask = bufsize - 1;
++      int i, block_size = block_end - block_start;
++      z_stream stream = { .total_out = 0,
++                          .avail_in = 0,
++                          .avail_out = 0, };
++      int zerr;
++      int needblocks = (block_size + (block_start & bufmask) + bufmask)
++                              >> bufshift;
++      int haveblocks;
++      blkcnt_t blocknum;
++      struct buffer_head *bhs[needblocks + 1];
++      int curbh, curpage;
++
++      if (block_size > deflateBound(1UL << zisofs_block_shift)) {
++              *errp = -EIO;
+               return 0;
+       }
+-
+-      maxpage = min(zisofs_block_pages, maxpage-offset);
+-
+-      for ( i = 0 ; i < maxpage ; i++, offset++ ) {
+-              if ( i != xpage ) {
+-                      pages[i] = grab_cache_page_nowait(mapping, offset);
+-              }
+-              page = pages[i];
+-              if ( page ) {
+-                      ClearPageError(page);
+-                      kmap(page);
++      /* Empty block? */
++      if (block_size == 0) {
++              for ( i = 0 ; i < pcount ; i++ ) {
++                      if (!pages[i])
++                              continue;
++                      memset(page_address(pages[i]), 0, PAGE_CACHE_SIZE);
++                      flush_dcache_page(pages[i]);
++                      SetPageUptodate(pages[i]);
+               }
++              return ((loff_t)pcount) << PAGE_CACHE_SHIFT;
+       }
+-      /* This is the last page filled, plus one; used in case of abort. */
+-      fpage = 0;
++      /* Because zlib is not thread-safe, do all the I/O at the top. */
++      blocknum = block_start >> bufshift;
++      memset(bhs, 0, (needblocks + 1) * sizeof(struct buffer_head *));
++      haveblocks = isofs_get_blocks(inode, blocknum, bhs, needblocks);
++      ll_rw_block(READ, haveblocks, bhs);
+-      /* Find the pointer to this specific chunk */
+-      /* Note: we're not using isonum_731() here because the data is known aligned */
+-      /* Note: header_size is in 32-bit words (4 bytes) */
+-      blockptr = (header_size + blockindex) << 2;
+-      blockendptr = blockptr + 4;
++      curbh = 0;
++      curpage = 0;
++      /*
++       * First block is special since it may be fractional.  We also wait for
++       * it before grabbing the zlib mutex; odds are that the subsequent
++       * blocks are going to come in in short order so we don't hold the zlib
++       * mutex longer than necessary.
++       */
+-      indexblocks = ((blockptr^blockendptr) >> bufshift) ? 2 : 1;
+-      ptrbh[0] = ptrbh[1] = NULL;
++      if (!bhs[0])
++              goto b_eio;
+-      if ( isofs_get_blocks(inode, blockptr >> bufshift, ptrbh, indexblocks) != indexblocks ) {
+-              if ( ptrbh[0] ) brelse(ptrbh[0]);
+-              printk(KERN_DEBUG "zisofs: Null buffer on reading block table, inode = %lu, block = %lu\n",
+-                     inode->i_ino, blockptr >> bufshift);
+-              goto eio;
+-      }
+-      ll_rw_block(READ, indexblocks, ptrbh);
+-
+-      bh = ptrbh[0];
+-      if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {
+-              printk(KERN_DEBUG "zisofs: Failed to read block table, inode = %lu, block = %lu\n",
+-                     inode->i_ino, blockptr >> bufshift);
+-              if ( ptrbh[1] )
+-                      brelse(ptrbh[1]);
+-              goto eio;
+-      }
+-      cstart = le32_to_cpu(*(__le32 *)(bh->b_data + (blockptr & bufmask)));
+-
+-      if ( indexblocks == 2 ) {
+-              /* We just crossed a block boundary.  Switch to the next block */
+-              brelse(bh);
+-              bh = ptrbh[1];
+-              if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {
+-                      printk(KERN_DEBUG "zisofs: Failed to read block table, inode = %lu, block = %lu\n",
+-                             inode->i_ino, blockendptr >> bufshift);
+-                      goto eio;
+-              }
++      wait_on_buffer(bhs[0]);
++      if (!buffer_uptodate(bhs[0])) {
++              *errp = -EIO;
++              goto b_eio;
+       }
+-      cend = le32_to_cpu(*(__le32 *)(bh->b_data + (blockendptr & bufmask)));
+-      brelse(bh);
+-      if (cstart > cend)
+-              goto eio;
++      stream.workspace = zisofs_zlib_workspace;
++      mutex_lock(&zisofs_zlib_lock);
+               
+-      csize = cend-cstart;
+-
+-      if (csize > deflateBound(1UL << zisofs_block_shift))
+-              goto eio;
+-
+-      /* Now page[] contains an array of pages, any of which can be NULL,
+-         and the locks on which we hold.  We should now read the data and
+-         release the pages.  If the pages are NULL the decompressed data
+-         for that particular page should be discarded. */
+-      
+-      if ( csize == 0 ) {
+-              /* This data block is empty. */
+-
+-              for ( fpage = 0 ; fpage < maxpage ; fpage++ ) {
+-                      if ( (page = pages[fpage]) != NULL ) {
+-                              memset(page_address(page), 0, PAGE_CACHE_SIZE);
+-                              
+-                              flush_dcache_page(page);
+-                              SetPageUptodate(page);
+-                              kunmap(page);
+-                              unlock_page(page);
+-                              if ( fpage == xpage )
+-                                      err = 0; /* The critical page */
+-                              else
+-                                      page_cache_release(page);
++      zerr = zlib_inflateInit(&stream);
++      if (zerr != Z_OK) {
++              if (zerr == Z_MEM_ERROR)
++                      *errp = -ENOMEM;
++              else
++                      *errp = -EIO;
++              printk(KERN_DEBUG "zisofs: zisofs_inflateInit returned %d\n",
++                             zerr);
++              goto z_eio;
++      }
++
++      while (curpage < pcount && curbh < haveblocks &&
++             zerr != Z_STREAM_END) {
++              if (!stream.avail_out) {
++                      if (pages[curpage]) {
++                              stream.next_out = page_address(pages[curpage])
++                                              + poffset;
++                              stream.avail_out = PAGE_CACHE_SIZE - poffset;
++                              poffset = 0;
++                      } else {
++                              stream.next_out = (void *)&zisofs_sink_page;
++                              stream.avail_out = PAGE_CACHE_SIZE;
+                       }
+               }
+-      } else {
+-              /* This data block is compressed. */
+-              z_stream stream;
+-              int bail = 0, left_out = -1;
+-              int zerr;
+-              int needblocks = (csize + (cstart & bufmask) + bufmask) >> bufshift;
+-              int haveblocks;
+-              struct buffer_head *bhs[needblocks+1];
+-              struct buffer_head **bhptr;
+-
+-              /* Because zlib is not thread-safe, do all the I/O at the top. */
+-
+-              blockptr = cstart >> bufshift;
+-              memset(bhs, 0, (needblocks+1)*sizeof(struct buffer_head *));
+-              haveblocks = isofs_get_blocks(inode, blockptr, bhs, needblocks);
+-              ll_rw_block(READ, haveblocks, bhs);
+-
+-              bhptr = &bhs[0];
+-              bh = *bhptr++;
+-
+-              /* First block is special since it may be fractional.
+-                 We also wait for it before grabbing the zlib
+-                 mutex; odds are that the subsequent blocks are
+-                 going to come in in short order so we don't hold
+-                 the zlib mutex longer than necessary. */
+-
+-              if ( !bh || (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {
+-                      printk(KERN_DEBUG "zisofs: Hit null buffer, fpage = %d, xpage = %d, csize = %ld\n",
+-                             fpage, xpage, csize);
+-                      goto b_eio;
+-              }
+-              stream.next_in  = bh->b_data + (cstart & bufmask);
+-              stream.avail_in = min(bufsize-(cstart & bufmask), csize);
+-              csize -= stream.avail_in;
+-
+-              stream.workspace = zisofs_zlib_workspace;
+-              mutex_lock(&zisofs_zlib_lock);
+-              
+-              zerr = zlib_inflateInit(&stream);
+-              if ( zerr != Z_OK ) {
+-                      if ( err && zerr == Z_MEM_ERROR )
+-                              err = -ENOMEM;
+-                      printk(KERN_DEBUG "zisofs: zisofs_inflateInit returned %d\n",
+-                             zerr);
+-                      goto z_eio;
++              if (!stream.avail_in) {
++                      wait_on_buffer(bhs[curbh]);
++                      if (!buffer_uptodate(bhs[curbh])) {
++                              *errp = -EIO;
++                              break;
++                      }
++                      stream.next_in  = bhs[curbh]->b_data +
++                                              (block_start & bufmask);
++                      stream.avail_in = min_t(unsigned, bufsize -
++                                              (block_start & bufmask),
++                                              block_size);
++                      block_size -= stream.avail_in;
++                      block_start = 0;
+               }
+-              while ( !bail && fpage < maxpage ) {
+-                      page = pages[fpage];
+-                      if ( page )
+-                              stream.next_out = page_address(page);
+-                      else
+-                              stream.next_out = (void *)&zisofs_sink_page;
+-                      stream.avail_out = PAGE_CACHE_SIZE;
+-
+-                      while ( stream.avail_out ) {
+-                              int ao, ai;
+-                              if ( stream.avail_in == 0 && left_out ) {
+-                                      if ( !csize ) {
+-                                              printk(KERN_WARNING "zisofs: ZF read beyond end of input\n");
+-                                              bail = 1;
+-                                              break;
+-                                      } else {
+-                                              bh = *bhptr++;
+-                                              if ( !bh ||
+-                                                   (wait_on_buffer(bh), !buffer_uptodate(bh)) ) {
+-                                                      /* Reached an EIO */
+-                                                      printk(KERN_DEBUG "zisofs: Hit null buffer, fpage = %d, xpage = %d, csize = %ld\n",
+-                                                             fpage, xpage, csize);
+-                                                             
+-                                                      bail = 1;
+-                                                      break;
+-                                              }
+-                                              stream.next_in = bh->b_data;
+-                                              stream.avail_in = min(csize,bufsize);
+-                                              csize -= stream.avail_in;
+-                                      }
+-                              }
+-                              ao = stream.avail_out;  ai = stream.avail_in;
+-                              zerr = zlib_inflate(&stream, Z_SYNC_FLUSH);
+-                              left_out = stream.avail_out;
+-                              if ( zerr == Z_BUF_ERROR && stream.avail_in == 0 )
+-                                      continue;
+-                              if ( zerr != Z_OK ) {
+-                                      /* EOF, error, or trying to read beyond end of input */
+-                                      if ( err && zerr == Z_MEM_ERROR )
+-                                              err = -ENOMEM;
+-                                      if ( zerr != Z_STREAM_END )
+-                                              printk(KERN_DEBUG "zisofs: zisofs_inflate returned %d, inode = %lu, index = %lu, fpage = %d, xpage = %d, avail_in = %d, avail_out = %d, ai = %d, ao = %d\n",
+-                                                     zerr, inode->i_ino, index,
+-                                                     fpage, xpage,
+-                                                     stream.avail_in, stream.avail_out,
+-                                                     ai, ao);
+-                                      bail = 1;
+-                                      break;
++              while (stream.avail_out && stream.avail_in) {
++                      zerr = zlib_inflate(&stream, Z_SYNC_FLUSH);
++                      if (zerr == Z_BUF_ERROR && stream.avail_in == 0)
++                              break;
++                      if (zerr == Z_STREAM_END)
++                              break;
++                      if (zerr != Z_OK) {
++                              /* EOF, error, or trying to read beyond end of input */
++                              if (zerr == Z_MEM_ERROR)
++                                      *errp = -ENOMEM;
++                              else {
++                                      printk(KERN_DEBUG
++                                             "zisofs: zisofs_inflate returned"
++                                             " %d, inode = %lu,"
++                                             " page idx = %d, bh idx = %d,"
++                                             " avail_in = %d,"
++                                             " avail_out = %d\n",
++                                             zerr, inode->i_ino, curpage,
++                                             curbh, stream.avail_in,
++                                             stream.avail_out);
++                                      *errp = -EIO;
+                               }
++                              goto inflate_out;
+                       }
++              }
+-                      if ( stream.avail_out && zerr == Z_STREAM_END ) {
+-                              /* Fractional page written before EOF.  This may
+-                                 be the last page in the file. */
+-                              memset(stream.next_out, 0, stream.avail_out);
+-                              stream.avail_out = 0;
++              if (!stream.avail_out) {
++                      /* This page completed */
++                      if (pages[curpage]) {
++                              flush_dcache_page(pages[curpage]);
++                              SetPageUptodate(pages[curpage]);
+                       }
++                      curpage++;
++              }
++              if (!stream.avail_in)
++                      curbh++;
++      }
++inflate_out:
++      zlib_inflateEnd(&stream);
+-                      if ( !stream.avail_out ) {
+-                              /* This page completed */
+-                              if ( page ) {
+-                                      flush_dcache_page(page);
+-                                      SetPageUptodate(page);
+-                                      kunmap(page);
+-                                      unlock_page(page);
+-                                      if ( fpage == xpage )
+-                                              err = 0; /* The critical page */
+-                                      else
+-                                              page_cache_release(page);
+-                              }
+-                              fpage++;
+-                      }
++z_eio:
++      mutex_unlock(&zisofs_zlib_lock);
++
++b_eio:
++      for (i = 0; i < haveblocks; i++)
++              brelse(bhs[i]);
++      return stream.total_out;
++}
++
++/*
++ * Uncompress data so that pages[full_page] is fully uptodate and possibly
++ * fills in other pages if we have data for them.
++ */
++static int zisofs_fill_pages(struct inode *inode, int full_page, int pcount,
++                           struct page **pages)
++{
++      loff_t start_off, end_off;
++      loff_t block_start, block_end;
++      unsigned int header_size = ISOFS_I(inode)->i_format_parm[0];
++      unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1];
++      unsigned int blockptr;
++      loff_t poffset = 0;
++      blkcnt_t cstart_block, cend_block;
++      struct buffer_head *bh;
++      unsigned int blkbits = ISOFS_BUFFER_BITS(inode);
++      unsigned int blksize = 1 << blkbits;
++      int err;
++      loff_t ret;
++
++      BUG_ON(!pages[full_page]);
++
++      /*
++       * We want to read at least 'full_page' page. Because we have to
++       * uncompress the whole compression block anyway, fill the surrounding
++       * pages with the data we have anyway...
++       */
++      start_off = page_offset(pages[full_page]);
++      end_off = min_t(loff_t, start_off + PAGE_CACHE_SIZE, inode->i_size);
++
++      cstart_block = start_off >> zisofs_block_shift;
++      cend_block = (end_off + (1 << zisofs_block_shift) - 1)
++                      >> zisofs_block_shift;
++
++      WARN_ON(start_off - (full_page << PAGE_CACHE_SHIFT) !=
++              ((cstart_block << zisofs_block_shift) & PAGE_CACHE_MASK));
++
++      /* Find the pointer to this specific chunk */
++      /* Note: we're not using isonum_731() here because the data is known aligned */
++      /* Note: header_size is in 32-bit words (4 bytes) */
++      blockptr = (header_size + cstart_block) << 2;
++      bh = isofs_bread(inode, blockptr >> blkbits);
++      if (!bh)
++              return -EIO;
++      block_start = le32_to_cpu(*(__le32 *)
++                              (bh->b_data + (blockptr & (blksize - 1))));
++
++      while (cstart_block < cend_block && pcount > 0) {
++              /* Load end of the compressed block in the file */
++              blockptr += 4;
++              /* Traversed to next block? */
++              if (!(blockptr & (blksize - 1))) {
++                      brelse(bh);
++
++                      bh = isofs_bread(inode, blockptr >> blkbits);
++                      if (!bh)
++                              return -EIO;
++              }
++              block_end = le32_to_cpu(*(__le32 *)
++                              (bh->b_data + (blockptr & (blksize - 1))));
++              if (block_start > block_end) {
++                      brelse(bh);
++                      return -EIO;
++              }
++              err = 0;
++              ret = zisofs_uncompress_block(inode, block_start, block_end,
++                                            pcount, pages, poffset, &err);
++              poffset += ret;
++              pages += poffset >> PAGE_CACHE_SHIFT;
++              pcount -= poffset >> PAGE_CACHE_SHIFT;
++              full_page -= poffset >> PAGE_CACHE_SHIFT;
++              poffset &= ~PAGE_CACHE_MASK;
++
++              if (err) {
++                      brelse(bh);
++                      /*
++                       * Did we finish reading the page we really wanted
++                       * to read?
++                       */
++                      if (full_page < 0)
++                              return 0;
++                      return err;
+               }
+-              zlib_inflateEnd(&stream);
+-      z_eio:
+-              mutex_unlock(&zisofs_zlib_lock);
++              block_start = block_end;
++              cstart_block++;
++      }
++
++      if (poffset && *pages) {
++              memset(page_address(*pages) + poffset, 0,
++                     PAGE_CACHE_SIZE - poffset);
++              flush_dcache_page(*pages);
++              SetPageUptodate(*pages);
++      }
++      return 0;
++}
+-      b_eio:
+-              for ( i = 0 ; i < haveblocks ; i++ ) {
+-                      if ( bhs[i] )
+-                              brelse(bhs[i]);
++/*
++ * When decompressing, we typically obtain more than one page
++ * per reference.  We inject the additional pages into the page
++ * cache as a form of readahead.
++ */
++static int zisofs_readpage(struct file *file, struct page *page)
++{
++      struct inode *inode = file->f_path.dentry->d_inode;
++      struct address_space *mapping = inode->i_mapping;
++      int err;
++      int i, pcount, full_page;
++      unsigned int zisofs_block_shift = ISOFS_I(inode)->i_format_parm[1];
++      unsigned int zisofs_pages_per_cblock =
++              PAGE_CACHE_SHIFT <= zisofs_block_shift ?
++              (1 << (zisofs_block_shift - PAGE_CACHE_SHIFT)) : 0;
++      struct page *pages[max_t(unsigned, zisofs_pages_per_cblock, 1)];
++      pgoff_t index = page->index, end_index;
++
++      end_index = (inode->i_size + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
++      /*
++       * If this page is wholly outside i_size we just return zero;
++       * do_generic_file_read() will handle this for us
++       */
++      if (index >= end_index) {
++              SetPageUptodate(page);
++              unlock_page(page);
++              return 0;
++      }
++
++      if (PAGE_CACHE_SHIFT <= zisofs_block_shift) {
++              /* We have already been given one page, this is the one
++                 we must do. */
++              full_page = index & (zisofs_pages_per_cblock - 1);
++              pcount = min_t(int, zisofs_pages_per_cblock,
++                      end_index - (index & ~(zisofs_pages_per_cblock - 1)));
++              index -= full_page;
++      } else {
++              full_page = 0;
++              pcount = 1;
++      }
++      pages[full_page] = page;
++
++      for (i = 0; i < pcount; i++, index++) {
++              if (i != full_page)
++                      pages[i] = grab_cache_page_nowait(mapping, index);
++              if (pages[i]) {
++                      ClearPageError(pages[i]);
++                      kmap(pages[i]);
+               }
+       }
+-eio:
++      err = zisofs_fill_pages(inode, full_page, pcount, pages);
+       /* Release any residual pages, do not SetPageUptodate */
+-      while ( fpage < maxpage ) {
+-              page = pages[fpage];
+-              if ( page ) {
+-                      flush_dcache_page(page);
+-                      if ( fpage == xpage )
+-                              SetPageError(page);
+-                      kunmap(page);
+-                      unlock_page(page);
+-                      if ( fpage != xpage )
+-                              page_cache_release(page);
++      for (i = 0; i < pcount; i++) {
++              if (pages[i]) {
++                      flush_dcache_page(pages[i]);
++                      if (i == full_page && err)
++                              SetPageError(pages[i]);
++                      kunmap(pages[i]);
++                      unlock_page(pages[i]);
++                      if (i != full_page)
++                              page_cache_release(pages[i]);
+               }
+-              fpage++;
+       }                       
+       /* At this point, err contains 0 or -EIO depending on the "critical" page */
+diff --git a/fs/isofs/rock.c b/fs/isofs/rock.c
+index c2fb2dd..96a685c 100644
+--- a/fs/isofs/rock.c
++++ b/fs/isofs/rock.c
+@@ -518,8 +518,7 @@ repeat:
+                       if (algo == SIG('p', 'z')) {
+                               int block_shift =
+                                       isonum_711(&rr->u.ZF.parms[1]);
+-                              if (block_shift < PAGE_CACHE_SHIFT
+-                                              || block_shift > 17) {
++                              if (block_shift > 17) {
+                                       printk(KERN_WARNING "isofs: "
+                                               "Can't handle ZF block "
+                                               "size of 2^%d\n",
+-- 
+1.6.0.2
+
diff --git a/src/patches/suse-2.6.27.39/patches.kabi/kabi-fix-struct-parport-abi-change.patch b/src/patches/suse-2.6.27.39/patches.kabi/kabi-fix-struct-parport-abi-change.patch
new file mode 100644 (file)
index 0000000..0b3bd1d
--- /dev/null
@@ -0,0 +1,35 @@
+Date: Wed, 09 Sep 2009 15:31:16 -0700
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: KABI: fix struct parport abi change
+
+2.6.27.32 added a field to struct parport.
+
+As no external module should need this field, let's move it to the end,
+and mark it away from the kabi checker, to keep things from having
+problems.
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+---
+ include/linux/parport.h |    8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+--- a/include/linux/parport.h
++++ b/include/linux/parport.h
+@@ -326,12 +326,14 @@ struct parport {
+       int spintime;
+       atomic_t ref_count;
++      struct list_head full_list;
++      struct parport *slaves[3];
++
++#ifndef __GENKSYMS__
+       unsigned long devflags;
+ #define PARPORT_DEVPROC_REGISTERED    0
+       struct pardevice *proc_device;  /* Currently register proc device */
+-
+-      struct list_head full_list;
+-      struct parport *slaves[3];
++#endif
+ };
+ #define DEFAULT_SPIN_TIME 500 /* us */
diff --git a/src/patches/suse-2.6.27.39/patches.kabi/move-aarp_send_ddp-export-back b/src/patches/suse-2.6.27.39/patches.kabi/move-aarp_send_ddp-export-back
new file mode 100644 (file)
index 0000000..373ae11
--- /dev/null
@@ -0,0 +1,35 @@
+From: Michal Marek <mmarek@suse.cz>
+Subject: KABI: move EXPORT_SYMBOL(aarp_send_ddp) back
+
+commit 6bf956e (appletalk: Fix skb leak when ipddp interface is not
+loaded (CVE-2009-2903)) moved the aarp_send_ddp() export from
+net/appletalk/ddp.c to net/appletalk/aarp.c. As this change was not
+needed to fix the bug and it breaks the kabi singature of
+aarp_send_ddp(), move it back.
+
+Signed-off-by: Michal Marek <mmarek@suse.cz>
+---
+ net/appletalk/aarp.c |    1 -
+ net/appletalk/ddp.c  |    1 +
+ 2 files changed, 1 insertion(+), 1 deletion(-)
+
+--- a/net/appletalk/aarp.c
++++ b/net/appletalk/aarp.c
+@@ -676,7 +676,6 @@ free_it:
+ drop:
+       return NET_XMIT_DROP;
+ }
+-EXPORT_SYMBOL(aarp_send_ddp);
+ /*
+  *    An entry in the aarp unresolved queue has become resolved. Send
+--- a/net/appletalk/ddp.c
++++ b/net/appletalk/ddp.c
+@@ -1879,6 +1879,7 @@ static struct packet_type ppptalk_packet
+ static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
+ /* Export symbols for use by drivers when AppleTalk is a module */
++EXPORT_SYMBOL(aarp_send_ddp);
+ EXPORT_SYMBOL(atrtr_get_dev);
+ EXPORT_SYMBOL(atalk_find_dev_addr);
similarity index 78%
rename from src/patches/suse-2.6.27.31/patches.kabi/xen3-e1000e_Export_set_memory_ro-rw
rename to src/patches/suse-2.6.27.39/patches.kabi/xen3-e1000e_Export_set_memory_ro-rw
index 23e4a0155da58c5b125882f5a4a40887a006cb45..4eec4c499b617093c1c76cab59da69d208d0b9a9 100644 (file)
@@ -10,9 +10,9 @@ Signed-off-by: Bruce Allan <bruce.w.allan@intel.com>
 Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
 Automatically created from "patches.suse/e1000e_Export_set_memory_ro-rw" by xen-port-patches.py
 
---- sle11-2009-03-16.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:39:52.000000000 +0100
-+++ sle11-2009-03-16/arch/x86/mm/pageattr-xen.c        2009-03-16 16:40:01.000000000 +0100
-@@ -1007,11 +1007,13 @@ int set_memory_ro(unsigned long addr, in
+--- sle11-2009-06-29.orig/arch/x86/mm/pageattr-xen.c   2009-06-29 15:41:45.000000000 +0200
++++ sle11-2009-06-29/arch/x86/mm/pageattr-xen.c        2009-06-29 15:42:17.000000000 +0200
+@@ -1018,11 +1018,13 @@ int set_memory_ro(unsigned long addr, in
  {
        return change_page_attr_clear(addr, numpages, __pgprot(_PAGE_RW));
  }
diff --git a/src/patches/suse-2.6.27.39/patches.kabi/xfs-dquot-pincount-kabi.patch b/src/patches/suse-2.6.27.39/patches.kabi/xfs-dquot-pincount-kabi.patch
new file mode 100644 (file)
index 0000000..7108f23
--- /dev/null
@@ -0,0 +1,47 @@
+From: Tony Ernst <tee@sgi.com>
+Subject: hide harmless xfs kabi changes to be compatible with the GA kernel
+
+In bug 482148, a KABI breakage was introduced into xfs. An SGI engineer
+approved this because it was internal to xfs, and he believed it wouldn't
+affect any of our other products. But the CRC checking doesn't work the way he
+thought it did. So we now have a problem where one of our add-ons gets a
+dependency error with the latest kernel update.
+
+So we've made a small patch that restores the old xfs CRC (same as SLES11 GA).
+We need to get this patch into the next SLES11 kernel update. I'll attach the
+patch.
+
+Acked-by: Michal Marek <mmarek@suse.cz>
+
+Index: linux-2.6.27.25-0.gwehrman/fs/xfs/quota/xfs_dquot.h
+===================================================================
+--- linux-2.6.27.25-0.gwehrman.orig/fs/xfs/quota/xfs_dquot.h
++++ linux-2.6.27.25-0.gwehrman/fs/xfs/quota/xfs_dquot.h
+@@ -83,8 +83,13 @@ typedef struct xfs_dquot {
+       xfs_qcnt_t       q_res_rtbcount;/* total realtime blks used+reserved */
+       mutex_t          q_qlock;       /* quota lock */
+       struct completion q_flush;      /* flush completion queue */
++#ifdef __GENKSYMS__
++      uint              q_pincount;   /* dquot pin count */
++      sv_t              q_pinwait;    /* dquot pinning wait queue */
++#else
+       atomic_t          q_pincount;   /* dquot pin count */
+       wait_queue_head_t q_pinwait;    /* dquot pinning wait queue */
++#endif
+ #ifdef XFS_DQUOT_TRACE
+       struct ktrace   *q_trace;       /* trace header structure */
+Index: linux-2.6.27.25-0.gwehrman/fs/xfs/quota/xfs_qm.h
+===================================================================
+--- linux-2.6.27.25-0.gwehrman.orig/fs/xfs/quota/xfs_qm.h
++++ linux-2.6.27.25-0.gwehrman/fs/xfs/quota/xfs_qm.h
+@@ -106,6 +106,9 @@ typedef struct xfs_qm {
+ typedef struct xfs_quotainfo {
+       xfs_inode_t     *qi_uquotaip;    /* user quota inode */
+       xfs_inode_t     *qi_gquotaip;    /* group quota inode */
++#ifdef __GENKSYMS__
++      spinlock_t       qi_pinlock;     /* dquot pinning lock */
++#endif
+       xfs_dqlist_t     qi_dqlist;      /* all dquots in filesys */
+       int              qi_dqreclaims;  /* a change here indicates
+                                           a removal in the dqlist */
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1
new file mode 100644 (file)
index 0000000..5d9ad63
--- /dev/null
@@ -0,0 +1,34 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.1
+
+Upstream 2.6.27.1 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 16e3fbb..65ab041 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION =
++EXTRAVERSION = .1
+ NAME = Rotary Wombat
+ # *DOCUMENTATION*
+diff --git a/kernel/trace/Kconfig b/kernel/trace/Kconfig
+index 263e9e6..aa53fdd 100644
+--- a/kernel/trace/Kconfig
++++ b/kernel/trace/Kconfig
+@@ -103,7 +103,8 @@ config CONTEXT_SWITCH_TRACER
+         all switching of tasks.
+ config DYNAMIC_FTRACE
+-      bool "enable/disable ftrace tracepoints dynamically"
++      bool "enable/disable ftrace tracepoints dynamically (BROKEN)"
++      depends on BROKEN
+       depends on FTRACE
+       depends on HAVE_DYNAMIC_FTRACE
+       default y
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1-2 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.1-2
new file mode 100644 (file)
index 0000000..cba43eb
--- /dev/null
@@ -0,0 +1,587 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.2
+
+Upstream 2.6.27.2 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 65ab041..063fbe4 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .1
++EXTRAVERSION = .2
+ NAME = Rotary Wombat
+ # *DOCUMENTATION*
+diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
+index 65a0c1b..f509cfc 100644
+--- a/arch/x86/kernel/alternative.c
++++ b/arch/x86/kernel/alternative.c
+@@ -444,7 +444,7 @@ void __init alternative_instructions(void)
+                                           _text, _etext);
+               /* Only switch to UP mode if we don't immediately boot others */
+-              if (num_possible_cpus() == 1 || setup_max_cpus <= 1)
++              if (num_present_cpus() == 1 || setup_max_cpus <= 1)
+                       alternatives_smp_switch(0);
+       }
+ #endif
+diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
+index 4353cf5..6b839b1 100644
+--- a/arch/x86/kernel/early-quirks.c
++++ b/arch/x86/kernel/early-quirks.c
+@@ -95,6 +95,52 @@ static void __init nvidia_bugs(int num, int slot, int func)
+ }
++static u32 ati_ixp4x0_rev(int num, int slot, int func)
++{
++      u32 d;
++      u8  b;
++
++      b = read_pci_config_byte(num, slot, func, 0xac);
++      b &= ~(1<<5);
++      write_pci_config_byte(num, slot, func, 0xac, b);
++
++      d = read_pci_config(num, slot, func, 0x70);
++      d |= 1<<8;
++      write_pci_config(num, slot, func, 0x70, d);
++
++      d = read_pci_config(num, slot, func, 0x8);
++      d &= 0xff;
++      return d;
++}
++
++static void __init ati_bugs(int num, int slot, int func)
++{
++#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC)
++      u32 d;
++      u8  b;
++
++      if (acpi_use_timer_override)
++              return;
++
++      d = ati_ixp4x0_rev(num, slot, func);
++      if (d  < 0x82)
++              acpi_skip_timer_override = 1;
++      else {
++              /* check for IRQ0 interrupt swap */
++              outb(0x72, 0xcd6); b = inb(0xcd7);
++              if (!(b & 0x2))
++                      acpi_skip_timer_override = 1;
++      }
++
++      if (acpi_skip_timer_override) {
++              printk(KERN_INFO "SB4X0 revision 0x%x\n", d);
++              printk(KERN_INFO "Ignoring ACPI timer override.\n");
++              printk(KERN_INFO "If you got timer trouble "
++                     "try acpi_use_timer_override\n");
++      }
++#endif
++}
++
+ #define QFLAG_APPLY_ONCE      0x1
+ #define QFLAG_APPLIED         0x2
+ #define QFLAG_DONE            (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
+@@ -114,6 +160,8 @@ static struct chipset early_qrk[] __initdata = {
+         PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs },
+       { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB,
+         PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
++      { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
++        PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
+       {}
+ };
+diff --git a/arch/x86/kernel/io_apic_32.c b/arch/x86/kernel/io_apic_32.c
+index 09cddb5..bfd9fc5 100644
+--- a/arch/x86/kernel/io_apic_32.c
++++ b/arch/x86/kernel/io_apic_32.c
+@@ -2314,6 +2314,9 @@ void __init setup_IO_APIC(void)
+       for (i = first_system_vector; i < NR_VECTORS; i++)
+               set_bit(i, used_vectors);
++      /* Mark FIRST_DEVICE_VECTOR which is assigned to IRQ0 as used. */
++      set_bit(FIRST_DEVICE_VECTOR, used_vectors);
++
+       enable_IO_APIC();
+       io_apic_irqs = ~PIC_IRQS;
+diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
+index d4b6e6a..d0975fc 100644
+--- a/arch/x86/mm/ioremap.c
++++ b/arch/x86/mm/ioremap.c
+@@ -595,7 +595,7 @@ void __init *early_ioremap(unsigned long phys_addr, unsigned long size)
+        */
+       offset = phys_addr & ~PAGE_MASK;
+       phys_addr &= PAGE_MASK;
+-      size = PAGE_ALIGN(last_addr) - phys_addr;
++      size = PAGE_ALIGN(last_addr + 1) - phys_addr;
+       /*
+        * Mappings have to fit in the FIX_BTMAP area.
+diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c
+index e4dce87..0232485 100644
+--- a/drivers/char/tty_io.c
++++ b/drivers/char/tty_io.c
+@@ -2996,7 +2996,7 @@ long tty_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
+       case TIOCSTI:
+               return tiocsti(tty, p);
+       case TIOCGWINSZ:
+-              return tiocgwinsz(tty, p);
++              return tiocgwinsz(real_tty, p);
+       case TIOCSWINSZ:
+               return tiocswinsz(tty, real_tty, p);
+       case TIOCCONS:
+diff --git a/drivers/net/atl1e/atl1e_main.c b/drivers/net/atl1e/atl1e_main.c
+index 7685b99..9b60352 100644
+--- a/drivers/net/atl1e/atl1e_main.c
++++ b/drivers/net/atl1e/atl1e_main.c
+@@ -2390,9 +2390,7 @@ static int __devinit atl1e_probe(struct pci_dev *pdev,
+       }
+       /* Init GPHY as early as possible due to power saving issue  */
+-      spin_lock(&adapter->mdio_lock);
+       atl1e_phy_init(&adapter->hw);
+-      spin_unlock(&adapter->mdio_lock);
+       /* reset the controller to
+        * put the device in a known good starting state */
+       err = atl1e_reset_hw(&adapter->hw);
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index e24b25c..b4be33a 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -3034,7 +3034,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+       struct sky2_port *sky2 = netdev_priv(dev);
+       struct sky2_hw *hw = sky2->hw;
+-      if (wol->wolopts & ~sky2_wol_supported(sky2->hw))
++      if ((wol->wolopts & ~sky2_wol_supported(sky2->hw))
++          || !device_can_wakeup(&hw->pdev->dev))
+               return -EOPNOTSUPP;
+       sky2->wol = wol->wolopts;
+@@ -3045,6 +3046,8 @@ static int sky2_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol)
+               sky2_write32(hw, B0_CTST, sky2->wol
+                            ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF);
++      device_set_wakeup_enable(&hw->pdev->dev, sky2->wol);
++
+       if (!netif_running(dev))
+               sky2_wol_init(sky2);
+       return 0;
+@@ -4166,18 +4169,6 @@ static int __devinit sky2_test_msi(struct sky2_hw *hw)
+       return err;
+ }
+-static int __devinit pci_wake_enabled(struct pci_dev *dev)
+-{
+-      int pm  = pci_find_capability(dev, PCI_CAP_ID_PM);
+-      u16 value;
+-
+-      if (!pm)
+-              return 0;
+-      if (pci_read_config_word(dev, pm + PCI_PM_CTRL, &value))
+-              return 0;
+-      return value & PCI_PM_CTRL_PME_ENABLE;
+-}
+-
+ /* This driver supports yukon2 chipset only */
+ static const char *sky2_name(u8 chipid, char *buf, int sz)
+ {
+@@ -4238,7 +4229,7 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
+               }
+       }
+-      wol_default = pci_wake_enabled(pdev) ? WAKE_MAGIC : 0;
++      wol_default = device_may_wakeup(&pdev->dev) ? WAKE_MAGIC : 0;
+       err = -ENOMEM;
+       hw = kzalloc(sizeof(*hw), GFP_KERNEL);
+diff --git a/drivers/net/wireless/b43legacy/xmit.c b/drivers/net/wireless/b43legacy/xmit.c
+index 68e1f8c..8d5ff62 100644
+--- a/drivers/net/wireless/b43legacy/xmit.c
++++ b/drivers/net/wireless/b43legacy/xmit.c
+@@ -626,7 +626,7 @@ void b43legacy_handle_hwtxstatus(struct b43legacy_wldev *dev,
+       tmp = hw->count;
+       status.frame_count = (tmp >> 4);
+       status.rts_count = (tmp & 0x0F);
+-      tmp = hw->flags;
++      tmp = hw->flags << 1;
+       status.supp_reason = ((tmp & 0x1C) >> 2);
+       status.pm_indicated = !!(tmp & 0x80);
+       status.intermediate = !!(tmp & 0x40);
+diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c
+index bd32ac0..5bcf561 100644
+--- a/drivers/net/wireless/libertas/main.c
++++ b/drivers/net/wireless/libertas/main.c
+@@ -1196,7 +1196,13 @@ void lbs_remove_card(struct lbs_private *priv)
+       cancel_delayed_work_sync(&priv->scan_work);
+       cancel_delayed_work_sync(&priv->assoc_work);
+       cancel_work_sync(&priv->mcast_work);
++
++      /* worker thread destruction blocks on the in-flight command which
++       * should have been cleared already in lbs_stop_card().
++       */
++      lbs_deb_main("destroying worker thread\n");
+       destroy_workqueue(priv->work_thread);
++      lbs_deb_main("done destroying worker thread\n");
+       if (priv->psmode == LBS802_11POWERMODEMAX_PSP) {
+               priv->psmode = LBS802_11POWERMODECAM;
+@@ -1314,14 +1320,26 @@ void lbs_stop_card(struct lbs_private *priv)
+               device_remove_file(&dev->dev, &dev_attr_lbs_rtap);
+       }
+-      /* Flush pending command nodes */
++      /* Delete the timeout of the currently processing command */
+       del_timer_sync(&priv->command_timer);
++
++      /* Flush pending command nodes */
+       spin_lock_irqsave(&priv->driver_lock, flags);
++      lbs_deb_main("clearing pending commands\n");
+       list_for_each_entry(cmdnode, &priv->cmdpendingq, list) {
+               cmdnode->result = -ENOENT;
+               cmdnode->cmdwaitqwoken = 1;
+               wake_up_interruptible(&cmdnode->cmdwait_q);
+       }
++
++      /* Flush the command the card is currently processing */
++      if (priv->cur_cmd) {
++              lbs_deb_main("clearing current command\n");
++              priv->cur_cmd->result = -ENOENT;
++              priv->cur_cmd->cmdwaitqwoken = 1;
++              wake_up_interruptible(&priv->cur_cmd->cmdwait_q);
++      }
++      lbs_deb_main("done clearing commands\n");
+       spin_unlock_irqrestore(&priv->driver_lock, flags);
+       unregister_netdev(dev);
+diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
+index 8dfd6f2..0d22479 100644
+--- a/fs/cifs/cifsglob.h
++++ b/fs/cifs/cifsglob.h
+@@ -309,6 +309,7 @@ struct cifs_search_info {
+       __u32 resume_key;
+       char *ntwrk_buf_start;
+       char *srch_entries_start;
++      char *last_entry;
+       char *presume_name;
+       unsigned int resume_name_len;
+       bool endOfSearch:1;
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 994de7c..77a0d1f 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -3636,6 +3636,8 @@ findFirstRetry:
+                                       le16_to_cpu(parms->SearchCount);
+                       psrch_inf->index_of_last_entry = 2 /* skip . and .. */ +
+                               psrch_inf->entries_in_buffer;
++                      psrch_inf->last_entry = psrch_inf->srch_entries_start +
++                                      le16_to_cpu(parms->LastNameOffset);
+                       *pnetfid = parms->SearchHandle;
+               } else {
+                       cifs_buf_release(pSMB);
+@@ -3751,6 +3753,8 @@ int CIFSFindNext(const int xid, struct cifsTconInfo *tcon,
+                                               le16_to_cpu(parms->SearchCount);
+                       psrch_inf->index_of_last_entry +=
+                               psrch_inf->entries_in_buffer;
++                      psrch_inf->last_entry = psrch_inf->srch_entries_start +
++                                      le16_to_cpu(parms->LastNameOffset);
+ /*  cFYI(1,("fnxt2 entries in buf %d index_of_last %d",
+           psrch_inf->entries_in_buffer, psrch_inf->index_of_last_entry)); */
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
+index 5f40ed3..765adf1 100644
+--- a/fs/cifs/readdir.c
++++ b/fs/cifs/readdir.c
+@@ -640,6 +640,70 @@ static int is_dir_changed(struct file *file)
+ }
++static int cifs_save_resume_key(const char *current_entry,
++      struct cifsFileInfo *cifsFile)
++{
++      int rc = 0;
++      unsigned int len = 0;
++      __u16 level;
++      char *filename;
++
++      if ((cifsFile == NULL) || (current_entry == NULL))
++              return -EINVAL;
++
++      level = cifsFile->srch_inf.info_level;
++
++      if (level == SMB_FIND_FILE_UNIX) {
++              FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
++
++              filename = &pFindData->FileName[0];
++              if (cifsFile->srch_inf.unicode) {
++                      len = cifs_unicode_bytelen(filename);
++              } else {
++                      /* BB should we make this strnlen of PATH_MAX? */
++                      len = strnlen(filename, PATH_MAX);
++              }
++              cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
++      } else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
++              FILE_DIRECTORY_INFO *pFindData =
++                      (FILE_DIRECTORY_INFO *)current_entry;
++              filename = &pFindData->FileName[0];
++              len = le32_to_cpu(pFindData->FileNameLength);
++              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++      } else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
++              FILE_FULL_DIRECTORY_INFO *pFindData =
++                      (FILE_FULL_DIRECTORY_INFO *)current_entry;
++              filename = &pFindData->FileName[0];
++              len = le32_to_cpu(pFindData->FileNameLength);
++              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++      } else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
++              SEARCH_ID_FULL_DIR_INFO *pFindData =
++                      (SEARCH_ID_FULL_DIR_INFO *)current_entry;
++              filename = &pFindData->FileName[0];
++              len = le32_to_cpu(pFindData->FileNameLength);
++              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++      } else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
++              FILE_BOTH_DIRECTORY_INFO *pFindData =
++                      (FILE_BOTH_DIRECTORY_INFO *)current_entry;
++              filename = &pFindData->FileName[0];
++              len = le32_to_cpu(pFindData->FileNameLength);
++              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
++      } else if (level == SMB_FIND_FILE_INFO_STANDARD) {
++              FIND_FILE_STANDARD_INFO *pFindData =
++                      (FIND_FILE_STANDARD_INFO *)current_entry;
++              filename = &pFindData->FileName[0];
++              /* one byte length, no name conversion */
++              len = (unsigned int)pFindData->FileNameLength;
++              cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
++      } else {
++              cFYI(1, ("Unknown findfirst level %d", level));
++              return -EINVAL;
++      }
++      cifsFile->srch_inf.resume_name_len = len;
++      cifsFile->srch_inf.presume_name = filename;
++      return rc;
++}
++
+ /* find the corresponding entry in the search */
+ /* Note that the SMB server returns search entries for . and .. which
+    complicates logic here if we choose to parse for them and we do not
+@@ -703,6 +767,7 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
+       while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
+             (rc == 0) && !cifsFile->srch_inf.endOfSearch) {
+               cFYI(1, ("calling findnext2"));
++              cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
+               rc = CIFSFindNext(xid, pTcon, cifsFile->netfid,
+                                 &cifsFile->srch_inf);
+               if (rc)
+@@ -919,69 +984,6 @@ static int cifs_filldir(char *pfindEntry, struct file *file,
+       return rc;
+ }
+-static int cifs_save_resume_key(const char *current_entry,
+-      struct cifsFileInfo *cifsFile)
+-{
+-      int rc = 0;
+-      unsigned int len = 0;
+-      __u16 level;
+-      char *filename;
+-
+-      if ((cifsFile == NULL) || (current_entry == NULL))
+-              return -EINVAL;
+-
+-      level = cifsFile->srch_inf.info_level;
+-
+-      if (level == SMB_FIND_FILE_UNIX) {
+-              FILE_UNIX_INFO *pFindData = (FILE_UNIX_INFO *)current_entry;
+-
+-              filename = &pFindData->FileName[0];
+-              if (cifsFile->srch_inf.unicode) {
+-                      len = cifs_unicode_bytelen(filename);
+-              } else {
+-                      /* BB should we make this strnlen of PATH_MAX? */
+-                      len = strnlen(filename, PATH_MAX);
+-              }
+-              cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
+-      } else if (level == SMB_FIND_FILE_DIRECTORY_INFO) {
+-              FILE_DIRECTORY_INFO *pFindData =
+-                      (FILE_DIRECTORY_INFO *)current_entry;
+-              filename = &pFindData->FileName[0];
+-              len = le32_to_cpu(pFindData->FileNameLength);
+-              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-      } else if (level == SMB_FIND_FILE_FULL_DIRECTORY_INFO) {
+-              FILE_FULL_DIRECTORY_INFO *pFindData =
+-                      (FILE_FULL_DIRECTORY_INFO *)current_entry;
+-              filename = &pFindData->FileName[0];
+-              len = le32_to_cpu(pFindData->FileNameLength);
+-              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-      } else if (level == SMB_FIND_FILE_ID_FULL_DIR_INFO) {
+-              SEARCH_ID_FULL_DIR_INFO *pFindData =
+-                      (SEARCH_ID_FULL_DIR_INFO *)current_entry;
+-              filename = &pFindData->FileName[0];
+-              len = le32_to_cpu(pFindData->FileNameLength);
+-              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-      } else if (level == SMB_FIND_FILE_BOTH_DIRECTORY_INFO) {
+-              FILE_BOTH_DIRECTORY_INFO *pFindData =
+-                      (FILE_BOTH_DIRECTORY_INFO *)current_entry;
+-              filename = &pFindData->FileName[0];
+-              len = le32_to_cpu(pFindData->FileNameLength);
+-              cifsFile->srch_inf.resume_key = pFindData->FileIndex;
+-      } else if (level == SMB_FIND_FILE_INFO_STANDARD) {
+-              FIND_FILE_STANDARD_INFO *pFindData =
+-                      (FIND_FILE_STANDARD_INFO *)current_entry;
+-              filename = &pFindData->FileName[0];
+-              /* one byte length, no name conversion */
+-              len = (unsigned int)pFindData->FileNameLength;
+-              cifsFile->srch_inf.resume_key = pFindData->ResumeKey;
+-      } else {
+-              cFYI(1, ("Unknown findfirst level %d", level));
+-              return -EINVAL;
+-      }
+-      cifsFile->srch_inf.resume_name_len = len;
+-      cifsFile->srch_inf.presume_name = filename;
+-      return rc;
+-}
+ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
+ {
+diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
+index 986061a..36d5fcd 100644
+--- a/fs/xfs/linux-2.6/xfs_buf.c
++++ b/fs/xfs/linux-2.6/xfs_buf.c
+@@ -1001,12 +1001,13 @@ xfs_buf_iodone_work(
+        * We can get an EOPNOTSUPP to ordered writes.  Here we clear the
+        * ordered flag and reissue them.  Because we can't tell the higher
+        * layers directly that they should not issue ordered I/O anymore, they
+-       * need to check if the ordered flag was cleared during I/O completion.
++       * need to check if the _XFS_BARRIER_FAILED flag was set during I/O completion.
+        */
+       if ((bp->b_error == EOPNOTSUPP) &&
+           (bp->b_flags & (XBF_ORDERED|XBF_ASYNC)) == (XBF_ORDERED|XBF_ASYNC)) {
+               XB_TRACE(bp, "ordered_retry", bp->b_iodone);
+               bp->b_flags &= ~XBF_ORDERED;
++              bp->b_flags |= _XFS_BARRIER_FAILED;
+               xfs_buf_iorequest(bp);
+       } else if (bp->b_iodone)
+               (*(bp->b_iodone))(bp);
+diff --git a/fs/xfs/linux-2.6/xfs_buf.h b/fs/xfs/linux-2.6/xfs_buf.h
+index fe01099..456519a 100644
+--- a/fs/xfs/linux-2.6/xfs_buf.h
++++ b/fs/xfs/linux-2.6/xfs_buf.h
+@@ -85,6 +85,14 @@ typedef enum {
+        * modifications being lost.
+        */
+       _XBF_PAGE_LOCKED = (1 << 22),
++
++      /*
++       * If we try a barrier write, but it fails we have to communicate
++       * this to the upper layers.  Unfortunately b_error gets overwritten
++       * when the buffer is re-issued so we have to add another flag to
++       * keep this information.
++       */
++      _XFS_BARRIER_FAILED = (1 << 23),
+ } xfs_buf_flags_t;
+ typedef enum {
+diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
+index 503ea89..0b02c64 100644
+--- a/fs/xfs/xfs_log.c
++++ b/fs/xfs/xfs_log.c
+@@ -1033,11 +1033,12 @@ xlog_iodone(xfs_buf_t *bp)
+       l = iclog->ic_log;
+       /*
+-       * If the ordered flag has been removed by a lower
+-       * layer, it means the underlyin device no longer supports
++       * If the _XFS_BARRIER_FAILED flag was set by a lower
++       * layer, it means the underlying device no longer supports
+        * barrier I/O. Warn loudly and turn off barriers.
+        */
+-      if ((l->l_mp->m_flags & XFS_MOUNT_BARRIER) && !XFS_BUF_ISORDERED(bp)) {
++      if (bp->b_flags & _XFS_BARRIER_FAILED) {
++              bp->b_flags &= ~_XFS_BARRIER_FAILED;
+               l->l_mp->m_flags &= ~XFS_MOUNT_BARRIER;
+               xfs_fs_cmn_err(CE_WARN, l->l_mp,
+                               "xlog_iodone: Barriers are no longer supported"
+diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c
+index 1113157..37f0721 100644
+--- a/kernel/sched_rt.c
++++ b/kernel/sched_rt.c
+@@ -102,12 +102,12 @@ static void dequeue_rt_entity(struct sched_rt_entity *rt_se);
+ static void sched_rt_rq_enqueue(struct rt_rq *rt_rq)
+ {
++      struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
+       struct sched_rt_entity *rt_se = rt_rq->rt_se;
+-      if (rt_se && !on_rt_rq(rt_se) && rt_rq->rt_nr_running) {
+-              struct task_struct *curr = rq_of_rt_rq(rt_rq)->curr;
+-
+-              enqueue_rt_entity(rt_se);
++      if (rt_rq->rt_nr_running) {
++              if (rt_se && !on_rt_rq(rt_se))
++                      enqueue_rt_entity(rt_se);
+               if (rt_rq->highest_prio < curr->prio)
+                       resched_task(curr);
+       }
+diff --git a/net/mac80211/debugfs_netdev.c b/net/mac80211/debugfs_netdev.c
+index 8165df5..5c7bbe0 100644
+--- a/net/mac80211/debugfs_netdev.c
++++ b/net/mac80211/debugfs_netdev.c
+@@ -537,6 +537,7 @@ static int netdev_notify(struct notifier_block *nb,
+ {
+       struct net_device *dev = ndev;
+       struct dentry *dir;
++      struct ieee80211_local *local;
+       struct ieee80211_sub_if_data *sdata;
+       char buf[10+IFNAMSIZ];
+@@ -549,10 +550,19 @@ static int netdev_notify(struct notifier_block *nb,
+       if (dev->ieee80211_ptr->wiphy->privid != mac80211_wiphy_privid)
+               return 0;
+-      sdata = IEEE80211_DEV_TO_SUB_IF(dev);
++      /*
++       * Do not use IEEE80211_DEV_TO_SUB_IF because that
++       * BUG_ONs for the master netdev which we need to
++       * handle here.
++       */
++      sdata = netdev_priv(dev);
+-      sprintf(buf, "netdev:%s", dev->name);
+       dir = sdata->debugfsdir;
++
++      if (!dir)
++              return 0;
++
++      sprintf(buf, "netdev:%s", dev->name);
+       if (!debugfs_rename(dir->d_parent, dir, dir->d_parent, buf))
+               printk(KERN_ERR "mac80211: debugfs: failed to rename debugfs "
+                      "dir to %s\n", buf);
+diff --git a/net/rfkill/rfkill.c b/net/rfkill/rfkill.c
+index 74aecc0..10b05ce 100644
+--- a/net/rfkill/rfkill.c
++++ b/net/rfkill/rfkill.c
+@@ -117,6 +117,7 @@ static void rfkill_led_trigger_activate(struct led_classdev *led)
+ static void notify_rfkill_state_change(struct rfkill *rfkill)
+ {
++      rfkill_led_trigger(rfkill, rfkill->state);
+       blocking_notifier_call_chain(&rfkill_notifier_list,
+                       RFKILL_STATE_CHANGED,
+                       rfkill);
+@@ -204,10 +205,8 @@ static int rfkill_toggle_radio(struct rfkill *rfkill,
+                       rfkill->state = state;
+       }
+-      if (force || rfkill->state != oldstate) {
+-              rfkill_led_trigger(rfkill, rfkill->state);
++      if (force || rfkill->state != oldstate)
+               notify_rfkill_state_change(rfkill);
+-      }
+       return retval;
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.10-11 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.10-11
new file mode 100644 (file)
index 0000000..c4b5f67
--- /dev/null
@@ -0,0 +1,480 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.11
+
+Upstream 2.6.27.11 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 24f4804..240d376 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .10
++EXTRAVERSION = .11
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/lib/rheap.c b/arch/powerpc/lib/rheap.c
+index 29b2941..45907c1 100644
+--- a/arch/powerpc/lib/rheap.c
++++ b/arch/powerpc/lib/rheap.c
+@@ -556,6 +556,7 @@ unsigned long rh_alloc_fixed(rh_info_t * info, unsigned long start, int size, co
+               be = blk->start + blk->size;
+               if (s >= bs && e <= be)
+                       break;
++              blk = NULL;
+       }
+       if (blk == NULL)
+diff --git a/arch/x86/kernel/amd_iommu.c b/arch/x86/kernel/amd_iommu.c
+index 042fdc2..20804d0 100644
+--- a/arch/x86/kernel/amd_iommu.c
++++ b/arch/x86/kernel/amd_iommu.c
+@@ -235,7 +235,7 @@ static int iommu_map(struct protection_domain *dom,
+       u64 __pte, *pte, *page;
+       bus_addr  = PAGE_ALIGN(bus_addr);
+-      phys_addr = PAGE_ALIGN(bus_addr);
++      phys_addr = PAGE_ALIGN(phys_addr);
+       /* only support 512GB address spaces for now */
+       if (bus_addr > IOMMU_MAP_SIZE_L3 || !(prot & IOMMU_PROT_MASK))
+@@ -487,7 +487,7 @@ static void dma_ops_free_pagetable(struct dma_ops_domain *dma_dom)
+                       continue;
+               p2 = IOMMU_PTE_PAGE(p1[i]);
+-              for (j = 0; j < 512; ++i) {
++              for (j = 0; j < 512; ++j) {
+                       if (!IOMMU_PTE_PRESENT(p2[j]))
+                               continue;
+                       p3 = IOMMU_PTE_PAGE(p2[j]);
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
+index a1378c4..923e682 100644
+--- a/arch/x86/kernel/amd_iommu_init.c
++++ b/arch/x86/kernel/amd_iommu_init.c
+@@ -407,6 +407,10 @@ static u8 * __init alloc_command_buffer(struct amd_iommu *iommu)
+       memcpy_toio(iommu->mmio_base + MMIO_CMD_BUF_OFFSET,
+                       &entry, sizeof(entry));
++      /* set head and tail to zero manually */
++      writel(0x00, iommu->mmio_base + MMIO_CMD_HEAD_OFFSET);
++      writel(0x00, iommu->mmio_base + MMIO_CMD_TAIL_OFFSET);
++
+       iommu_feature_enable(iommu, CONTROL_CMDBUF_EN);
+       return cmd_buf;
+@@ -926,7 +930,8 @@ int __init amd_iommu_init(void)
+               goto free;
+       /* IOMMU rlookup table - find the IOMMU for a specific device */
+-      amd_iommu_rlookup_table = (void *)__get_free_pages(GFP_KERNEL,
++      amd_iommu_rlookup_table = (void *)__get_free_pages(
++                      GFP_KERNEL | __GFP_ZERO,
+                       get_order(rlookup_table_size));
+       if (amd_iommu_rlookup_table == NULL)
+               goto free;
+diff --git a/crypto/async_tx/async_xor.c b/crypto/async_tx/async_xor.c
+index c029d3e..595b786 100644
+--- a/crypto/async_tx/async_xor.c
++++ b/crypto/async_tx/async_xor.c
+@@ -53,10 +53,17 @@ do_async_xor(struct dma_chan *chan, struct page *dest, struct page **src_list,
+       int xor_src_cnt;
+       dma_addr_t dma_dest;
+-      dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_FROM_DEVICE);
+-      for (i = 0; i < src_cnt; i++)
++      /* map the dest bidrectional in case it is re-used as a source */
++      dma_dest = dma_map_page(dma->dev, dest, offset, len, DMA_BIDIRECTIONAL);
++      for (i = 0; i < src_cnt; i++) {
++              /* only map the dest once */
++              if (unlikely(src_list[i] == dest)) {
++                      dma_src[i] = dma_dest;
++                      continue;
++              }
+               dma_src[i] = dma_map_page(dma->dev, src_list[i], offset,
+                                         len, DMA_TO_DEVICE);
++      }
+       while (src_cnt) {
+               async_flags = flags;
+diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
+index 2ac91b8..ee1eb5e 100644
+--- a/drivers/block/cciss.c
++++ b/drivers/block/cciss.c
+@@ -1692,6 +1692,11 @@ static int rebuild_lun_table(ctlr_info_t *h, int first_time)
+       for (i = 0; i <= h->highest_lun; i++) {
+               int j;
+               drv_found = 0;
++
++              /* skip holes in the array from already deleted drives */
++              if (h->drv[i].raid_level == -1)
++                      continue;
++
+               for (j = 0; j < num_luns; j++) {
+                       memcpy(&lunid, &ld_buff->LUN[j][0], 4);
+                       lunid = le32_to_cpu(lunid);
+diff --git a/drivers/dma/dmaengine.c b/drivers/dma/dmaengine.c
+index dc003a3..53bb74b 100644
+--- a/drivers/dma/dmaengine.c
++++ b/drivers/dma/dmaengine.c
+@@ -388,7 +388,10 @@ int dma_async_device_register(struct dma_device *device)
+       init_completion(&device->done);
+       kref_init(&device->refcount);
++
++      mutex_lock(&dma_list_mutex);
+       device->dev_id = id++;
++      mutex_unlock(&dma_list_mutex);
+       /* represent channels in sysfs. Probably want devs too */
+       list_for_each_entry(chan, &device->channels, device_node) {
+diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
+index 3f4db54..56790f8 100644
+--- a/drivers/dma/ioat_dma.c
++++ b/drivers/dma/ioat_dma.c
+@@ -1337,10 +1337,12 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
+  */
+ #define IOAT_TEST_SIZE 2000
++DECLARE_COMPLETION(test_completion);
+ static void ioat_dma_test_callback(void *dma_async_param)
+ {
+       printk(KERN_ERR "ioatdma: ioat_dma_test_callback(%p)\n",
+               dma_async_param);
++      complete(&test_completion);
+ }
+ /**
+@@ -1406,7 +1408,8 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
+               goto free_resources;
+       }
+       device->common.device_issue_pending(dma_chan);
+-      msleep(1);
++
++      wait_for_completion_timeout(&test_completion, msecs_to_jiffies(3000));
+       if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
+                                       != DMA_SUCCESS) {
+diff --git a/drivers/dma/iop-adma.c b/drivers/dma/iop-adma.c
+index 71fba82..cbb7ab8 100644
+--- a/drivers/dma/iop-adma.c
++++ b/drivers/dma/iop-adma.c
+@@ -85,18 +85,28 @@ iop_adma_run_tx_complete_actions(struct iop_adma_desc_slot *desc,
+                       enum dma_ctrl_flags flags = desc->async_tx.flags;
+                       u32 src_cnt;
+                       dma_addr_t addr;
++                      dma_addr_t dest;
++                      src_cnt = unmap->unmap_src_cnt;
++                      dest = iop_desc_get_dest_addr(unmap, iop_chan);
+                       if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) {
+-                              addr = iop_desc_get_dest_addr(unmap, iop_chan);
+-                              dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE);
++                              enum dma_data_direction dir;
++
++                              if (src_cnt > 1) /* is xor? */
++                                      dir = DMA_BIDIRECTIONAL;
++                              else
++                                      dir = DMA_FROM_DEVICE;
++
++                              dma_unmap_page(dev, dest, len, dir);
+                       }
+                       if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
+-                              src_cnt = unmap->unmap_src_cnt;
+                               while (src_cnt--) {
+                                       addr = iop_desc_get_src_addr(unmap,
+                                                                    iop_chan,
+                                                                    src_cnt);
++                                      if (addr == dest)
++                                              continue;
+                                       dma_unmap_page(dev, addr, len,
+                                                      DMA_TO_DEVICE);
+                               }
+diff --git a/drivers/dma/mv_xor.c b/drivers/dma/mv_xor.c
+index 0328da0..bcda174 100644
+--- a/drivers/dma/mv_xor.c
++++ b/drivers/dma/mv_xor.c
+@@ -311,17 +311,26 @@ mv_xor_run_tx_complete_actions(struct mv_xor_desc_slot *desc,
+                       enum dma_ctrl_flags flags = desc->async_tx.flags;
+                       u32 src_cnt;
+                       dma_addr_t addr;
++                      dma_addr_t dest;
++                      src_cnt = unmap->unmap_src_cnt;
++                      dest = mv_desc_get_dest_addr(unmap);
+                       if (!(flags & DMA_COMPL_SKIP_DEST_UNMAP)) {
+-                              addr = mv_desc_get_dest_addr(unmap);
+-                              dma_unmap_page(dev, addr, len, DMA_FROM_DEVICE);
++                              enum dma_data_direction dir;
++
++                              if (src_cnt > 1) /* is xor ? */
++                                      dir = DMA_BIDIRECTIONAL;
++                              else
++                                      dir = DMA_FROM_DEVICE;
++                              dma_unmap_page(dev, dest, len, dir);
+                       }
+                       if (!(flags & DMA_COMPL_SKIP_SRC_UNMAP)) {
+-                              src_cnt = unmap->unmap_src_cnt;
+                               while (src_cnt--) {
+                                       addr = mv_desc_get_src_addr(unmap,
+                                                                   src_cnt);
++                                      if (addr == dest)
++                                              continue;
+                                       dma_unmap_page(dev, addr, len,
+                                                      DMA_TO_DEVICE);
+                               }
+diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
+index ac89a5d..ab7c8e4 100644
+--- a/drivers/md/bitmap.c
++++ b/drivers/md/bitmap.c
+@@ -208,16 +208,19 @@ static void bitmap_checkfree(struct bitmap *bitmap, unsigned long page)
+  */
+ /* IO operations when bitmap is stored near all superblocks */
+-static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long index)
++static struct page *read_sb_page(mddev_t *mddev, long offset,
++                               struct page *page,
++                               unsigned long index, int size)
+ {
+       /* choose a good rdev and read the page from there */
+       mdk_rdev_t *rdev;
+       struct list_head *tmp;
+-      struct page *page = alloc_page(GFP_KERNEL);
+       sector_t target;
+       if (!page)
++              page = alloc_page(GFP_KERNEL);
++      if (!page)
+               return ERR_PTR(-ENOMEM);
+       rdev_for_each(rdev, tmp, mddev) {
+@@ -227,7 +230,9 @@ static struct page *read_sb_page(mddev_t *mddev, long offset, unsigned long inde
+               target = rdev->sb_start + offset + index * (PAGE_SIZE/512);
+-              if (sync_page_io(rdev->bdev, target, PAGE_SIZE, page, READ)) {
++              if (sync_page_io(rdev->bdev, target,
++                               roundup(size, bdev_hardsect_size(rdev->bdev)),
++                               page, READ)) {
+                       page->index = index;
+                       attach_page_buffers(page, NULL); /* so that free_buffer will
+                                                         * quietly no-op */
+@@ -544,7 +549,9 @@ static int bitmap_read_sb(struct bitmap *bitmap)
+               bitmap->sb_page = read_page(bitmap->file, 0, bitmap, bytes);
+       } else {
+-              bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset, 0);
++              bitmap->sb_page = read_sb_page(bitmap->mddev, bitmap->offset,
++                                             NULL,
++                                             0, sizeof(bitmap_super_t));
+       }
+       if (IS_ERR(bitmap->sb_page)) {
+               err = PTR_ERR(bitmap->sb_page);
+@@ -957,11 +964,16 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
+                                */
+                               page = bitmap->sb_page;
+                               offset = sizeof(bitmap_super_t);
++                              read_sb_page(bitmap->mddev, bitmap->offset,
++                                           page,
++                                           index, count);
+                       } else if (file) {
+                               page = read_page(file, index, bitmap, count);
+                               offset = 0;
+                       } else {
+-                              page = read_sb_page(bitmap->mddev, bitmap->offset, index);
++                              page = read_sb_page(bitmap->mddev, bitmap->offset,
++                                                  NULL,
++                                                  index, count);
+                               offset = 0;
+                       }
+                       if (IS_ERR(page)) { /* read error */
+diff --git a/drivers/net/starfire.c b/drivers/net/starfire.c
+index 1d2ef8f..5a40f2d 100644
+--- a/drivers/net/starfire.c
++++ b/drivers/net/starfire.c
+@@ -1509,6 +1509,11 @@ static int __netdev_rx(struct net_device *dev, int *quota)
+               desc->status = 0;
+               np->rx_done = (np->rx_done + 1) % DONE_Q_SIZE;
+       }
++
++      if (*quota == 0) {      /* out of rx quota */
++              retcode = 1;
++              goto out;
++      }
+       writew(np->rx_done, np->base + CompletionQConsumerIdx);
+  out:
+diff --git a/drivers/net/wireless/iwlwifi/iwl-tx.c b/drivers/net/wireless/iwlwifi/iwl-tx.c
+index 78b1a7a..67da11b 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-tx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-tx.c
+@@ -1192,10 +1192,9 @@ void iwl_tx_cmd_complete(struct iwl_priv *priv, struct iwl_rx_mem_buffer *rxb)
+       /* If a Tx command is being handled and it isn't in the actual
+        * command queue then there a command routing bug has been introduced
+        * in the queue management code. */
+-      if (txq_id != IWL_CMD_QUEUE_NUM)
+-              IWL_ERROR("Error wrong command queue %d command id 0x%X\n",
+-                        txq_id, pkt->hdr.cmd);
+-      BUG_ON(txq_id != IWL_CMD_QUEUE_NUM);
++      if (WARN(txq_id != IWL_CMD_QUEUE_NUM,
++               "wrong command queue %d, command id 0x%X\n", txq_id, pkt->hdr.cmd))
++              return;
+       cmd_index = get_cmd_index(&priv->txq[IWL_CMD_QUEUE_NUM].q, index, huge);
+       cmd = priv->txq[IWL_CMD_QUEUE_NUM].cmd[cmd_index];
+diff --git a/drivers/scsi/aacraid/linit.c b/drivers/scsi/aacraid/linit.c
+index 9aa301c..f90fbcd 100644
+--- a/drivers/scsi/aacraid/linit.c
++++ b/drivers/scsi/aacraid/linit.c
+@@ -175,8 +175,8 @@ static struct aac_driver_ident aac_drivers[] = {
+       { aac_rx_init, "percraid", "DELL    ", "PERCRAID        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Boxster/PERC3DiB) */
+       { aac_rx_init, "aacraid",  "ADAPTEC ", "catapult        ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* catapult */
+       { aac_rx_init, "aacraid",  "ADAPTEC ", "tomcat          ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* tomcat */
+-      { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2120S (Crusader) */
+-      { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan) */
++      { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2120S   ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG },                     /* Adaptec 2120S (Crusader) */
++      { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG },                     /* Adaptec 2200S (Vulcan) */
+       { aac_rx_init, "aacraid",  "ADAPTEC ", "Adaptec 2200S   ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan-2m) */
+       { aac_rx_init, "aacraid",  "Legend  ", "Legend S220     ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S220 (Legend Crusader) */
+       { aac_rx_init, "aacraid",  "Legend  ", "Legend S230     ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S230 (Legend Vulcan) */
+diff --git a/drivers/scsi/ibmvscsi/ibmvstgt.c b/drivers/scsi/ibmvscsi/ibmvstgt.c
+index 2a5b29d..e2dd6a4 100644
+--- a/drivers/scsi/ibmvscsi/ibmvstgt.c
++++ b/drivers/scsi/ibmvscsi/ibmvstgt.c
+@@ -864,21 +864,23 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id)
+       INIT_WORK(&vport->crq_work, handle_crq);
+-      err = crq_queue_create(&vport->crq_queue, target);
++      err = scsi_add_host(shost, target->dev);
+       if (err)
+               goto free_srp_target;
+-      err = scsi_add_host(shost, target->dev);
++      err = scsi_tgt_alloc_queue(shost);
+       if (err)
+-              goto destroy_queue;
++              goto remove_host;
+-      err = scsi_tgt_alloc_queue(shost);
++      err = crq_queue_create(&vport->crq_queue, target);
+       if (err)
+-              goto destroy_queue;
++              goto free_queue;
+       return 0;
+-destroy_queue:
+-      crq_queue_destroy(target);
++free_queue:
++      scsi_tgt_free_queue(shost);
++remove_host:
++      scsi_remove_host(shost);
+ free_srp_target:
+       srp_target_free(target);
+ put_host:
+diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
+index 428b599..3a8bb53 100644
+--- a/drivers/usb/gadget/f_rndis.c
++++ b/drivers/usb/gadget/f_rndis.c
+@@ -651,6 +651,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
+                               fs_in_desc.bEndpointAddress;
+               hs_out_desc.bEndpointAddress =
+                               fs_out_desc.bEndpointAddress;
++              hs_notify_desc.bEndpointAddress =
++                              fs_notify_desc.bEndpointAddress;
+               /* copy descriptors, and track endpoint copies */
+               f->hs_descriptors = usb_copy_descriptors(eth_hs_function);
+@@ -662,6 +664,8 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
+                               f->hs_descriptors, &hs_in_desc);
+               rndis->hs.out = usb_find_endpoint(eth_hs_function,
+                               f->hs_descriptors, &hs_out_desc);
++              rndis->hs.notify = usb_find_endpoint(eth_hs_function,
++                              f->hs_descriptors, &hs_notify_desc);
+       }
+       rndis->port.open = rndis_open;
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index e61f2bf..e16d547 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -168,7 +168,7 @@ UNUSUAL_DEV(  0x0421, 0x005d, 0x0001, 0x0600,
+               US_FL_FIX_CAPACITY ),
+ /* Patch for Nokia 5310 capacity */
+-UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
++UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0701,
+               "Nokia",
+               "5310",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -253,6 +253,20 @@ UNUSUAL_DEV(  0x0421, 0x04fa, 0x0550, 0x0660,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
++/* Reported by Ozan Sener <themgzzy@gmail.com> */
++UNUSUAL_DEV(  0x0421, 0x0060, 0x0551, 0x0551,
++              "Nokia",
++              "3500c",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY ),
++
++/* Reported by CSECSY Laszlo <boobaa@frugalware.org> */
++UNUSUAL_DEV(  0x0421, 0x0063, 0x0001, 0x0601,
++              "Nokia",
++              "Nokia 3109c",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY ),
++
+ /* Patch for Nokia 5310 capacity */
+ UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
+       "Nokia",
+diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h
+index b72ec66..1f6fd4f 100644
+--- a/include/asm-parisc/tlbflush.h
++++ b/include/asm-parisc/tlbflush.h
+@@ -44,9 +44,12 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
+ {
+       BUG_ON(mm == &init_mm); /* Should never happen */
+-#ifdef CONFIG_SMP
++#if 1 || defined(CONFIG_SMP)
+       flush_tlb_all();
+ #else
++      /* FIXME: currently broken, causing space id and protection ids
++       *  to go out of sync, resulting in faults on userspace accesses.
++       */
+       if (mm) {
+               if (mm->context != 0)
+                       free_sid(mm->context);
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index 1d96aed..fdef553 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -638,6 +638,7 @@ static struct hda_verb stac92hd71bxx_core_init[] = {
+       { 0x0a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       { 0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
+       { 0x0f, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(0)},
++      {}
+ };
+ #define HD_DISABLE_PORTF 3
+diff --git a/sound/soc/omap/omap-pcm.c b/sound/soc/omap/omap-pcm.c
+index 690bfea..5e023ba 100644
+--- a/sound/soc/omap/omap-pcm.c
++++ b/sound/soc/omap/omap-pcm.c
+@@ -231,7 +231,7 @@ static int omap_pcm_open(struct snd_pcm_substream *substream)
+       if (ret < 0)
+               goto out;
+-      prtd = kzalloc(sizeof(prtd), GFP_KERNEL);
++      prtd = kzalloc(sizeof(*prtd), GFP_KERNEL);
+       if (prtd == NULL) {
+               ret = -ENOMEM;
+               goto out;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.11-12 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.11-12
new file mode 100644 (file)
index 0000000..e0a23dd
--- /dev/null
@@ -0,0 +1,6763 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.12
+
+Upstream 2.6.27.12 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 240d376..f0f8cdf 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .11
++EXTRAVERSION = .12
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/Kconfig b/arch/Kconfig
+index 364c6da..1d07625 100644
+--- a/arch/Kconfig
++++ b/arch/Kconfig
+@@ -46,6 +46,9 @@ config HAVE_EFFICIENT_UNALIGNED_ACCESS
+         See Documentation/unaligned-memory-access.txt for more
+         information on the topic of unaligned memory accesses.
++config HAVE_SYSCALL_WRAPPERS
++      bool
++
+ config KRETPROBES
+       def_bool y
+       depends on KPROBES && HAVE_KRETPROBES
+diff --git a/arch/alpha/kernel/entry.S b/arch/alpha/kernel/entry.S
+index 5fc61e2..36a93f8 100644
+--- a/arch/alpha/kernel/entry.S
++++ b/arch/alpha/kernel/entry.S
+@@ -894,9 +894,9 @@ sys_getxpid:
+ .end sys_getxpid
+       .align  4
+-      .globl  sys_pipe
+-      .ent    sys_pipe
+-sys_pipe:
++      .globl  sys_alpha_pipe
++      .ent    sys_alpha_pipe
++sys_alpha_pipe:
+       lda     $sp, -16($sp)
+       stq     $26, 0($sp)
+       .prologue 0
+@@ -914,7 +914,7 @@ sys_pipe:
+       stq     $1, 80+16($sp)
+ 1:    lda     $sp, 16($sp)
+       ret
+-.end sys_pipe
++.end sys_alpha_pipe
+       .align  4
+       .globl  sys_execve
+diff --git a/arch/alpha/kernel/systbls.S b/arch/alpha/kernel/systbls.S
+index ba914af..9d9e3a9 100644
+--- a/arch/alpha/kernel/systbls.S
++++ b/arch/alpha/kernel/systbls.S
+@@ -52,7 +52,7 @@ sys_call_table:
+       .quad sys_setpgid
+       .quad alpha_ni_syscall                  /* 40 */
+       .quad sys_dup
+-      .quad sys_pipe
++      .quad sys_alpha_pipe
+       .quad osf_set_program_attributes
+       .quad alpha_ni_syscall
+       .quad sys_open                          /* 45 */
+diff --git a/arch/arm/kernel/calls.S b/arch/arm/kernel/calls.S
+index 09a061c..9ca8d13 100644
+--- a/arch/arm/kernel/calls.S
++++ b/arch/arm/kernel/calls.S
+@@ -98,7 +98,7 @@
+               CALL(sys_uselib)
+               CALL(sys_swapon)
+               CALL(sys_reboot)
+-              CALL(OBSOLETE(old_readdir))     /* used by libc4 */
++              CALL(OBSOLETE(sys_old_readdir)) /* used by libc4 */
+ /* 90 */      CALL(OBSOLETE(old_mmap))        /* used by libc4 */
+               CALL(sys_munmap)
+               CALL(sys_truncate)
+diff --git a/arch/cris/arch-v10/kernel/entry.S b/arch/cris/arch-v10/kernel/entry.S
+index 3a65f32..2485b3e 100644
+--- a/arch/cris/arch-v10/kernel/entry.S
++++ b/arch/cris/arch-v10/kernel/entry.S
+@@ -691,7 +691,7 @@ sys_call_table:
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/cris/arch-v32/kernel/entry.S b/arch/cris/arch-v32/kernel/entry.S
+index eebbaba..149430c 100644
+--- a/arch/cris/arch-v32/kernel/entry.S
++++ b/arch/cris/arch-v32/kernel/entry.S
+@@ -614,7 +614,7 @@ sys_call_table:
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/h8300/kernel/syscalls.S b/arch/h8300/kernel/syscalls.S
+index 54e21c3..4eb67fa 100644
+--- a/arch/h8300/kernel/syscalls.S
++++ b/arch/h8300/kernel/syscalls.S
+@@ -103,7 +103,7 @@ SYMBOL_NAME_LABEL(sys_call_table)
+       .long SYMBOL_NAME(sys_uselib)
+       .long SYMBOL_NAME(sys_swapon)
+       .long SYMBOL_NAME(sys_reboot)
+-      .long SYMBOL_NAME(old_readdir)
++      .long SYMBOL_NAME(sys_old_readdir)
+       .long SYMBOL_NAME(old_mmap)             /* 90 */
+       .long SYMBOL_NAME(sys_munmap)
+       .long SYMBOL_NAME(sys_truncate)
+diff --git a/arch/ia64/ia32/ia32_entry.S b/arch/ia64/ia32/ia32_entry.S
+index ff88c48..0a67464 100644
+--- a/arch/ia64/ia32/ia32_entry.S
++++ b/arch/ia64/ia32/ia32_entry.S
+@@ -215,7 +215,7 @@ ia32_syscall_table:
+       data8 sys_mkdir
+       data8 sys_rmdir           /* 40 */
+       data8 sys_dup
+-      data8 sys32_pipe
++      data8 sys_ia64_pipe
+       data8 compat_sys_times
+       data8 sys_ni_syscall      /* old prof syscall holder */
+       data8 sys32_brk           /* 45 */
+diff --git a/arch/ia64/include/asm/unistd.h b/arch/ia64/include/asm/unistd.h
+index d535833..206d5d8 100644
+--- a/arch/ia64/include/asm/unistd.h
++++ b/arch/ia64/include/asm/unistd.h
+@@ -363,7 +363,7 @@ struct pt_regs;
+ struct sigaction;
+ long sys_execve(char __user *filename, char __user * __user *argv,
+                          char __user * __user *envp, struct pt_regs *regs);
+-asmlinkage long sys_pipe(void);
++asmlinkage long sys_ia64_pipe(void);
+ asmlinkage long sys_rt_sigaction(int sig,
+                                const struct sigaction __user *act,
+                                struct sigaction __user *oact,
+diff --git a/arch/ia64/kernel/entry.S b/arch/ia64/kernel/entry.S
+index 0dd6c14..f6e8b63 100644
+--- a/arch/ia64/kernel/entry.S
++++ b/arch/ia64/kernel/entry.S
+@@ -1436,7 +1436,7 @@ sys_call_table:
+       data8 sys_mkdir                         // 1055
+       data8 sys_rmdir
+       data8 sys_dup
+-      data8 sys_pipe
++      data8 sys_ia64_pipe
+       data8 sys_times
+       data8 ia64_brk                          // 1060
+       data8 sys_setgid
+diff --git a/arch/ia64/kernel/sys_ia64.c b/arch/ia64/kernel/sys_ia64.c
+index bcbb6d8..92ed83f 100644
+--- a/arch/ia64/kernel/sys_ia64.c
++++ b/arch/ia64/kernel/sys_ia64.c
+@@ -154,7 +154,7 @@ out:
+  * and r9) as this is faster than doing a copy_to_user().
+  */
+ asmlinkage long
+-sys_pipe (void)
++sys_ia64_pipe (void)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       int fd[2];
+diff --git a/arch/m68k/kernel/entry.S b/arch/m68k/kernel/entry.S
+index f28404d..25b2176 100644
+--- a/arch/m68k/kernel/entry.S
++++ b/arch/m68k/kernel/entry.S
+@@ -513,7 +513,7 @@ sys_call_table:
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/m68knommu/kernel/syscalltable.S b/arch/m68knommu/kernel/syscalltable.S
+index 812f8d8..5c3e3f6 100644
+--- a/arch/m68knommu/kernel/syscalltable.S
++++ b/arch/m68knommu/kernel/syscalltable.S
+@@ -107,7 +107,7 @@ ENTRY(sys_call_table)
+       .long sys_uselib
+       .long sys_ni_syscall    /* sys_swapon */
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
+index 5e75a31..61906f6 100644
+--- a/arch/mips/kernel/scall32-o32.S
++++ b/arch/mips/kernel/scall32-o32.S
+@@ -401,7 +401,7 @@ einval:    li      v0, -EINVAL
+       sys     sys_uselib              1
+       sys     sys_swapon              2
+       sys     sys_reboot              3
+-      sys     old_readdir             3
++      sys     sys_old_readdir         3
+       sys     old_mmap                6       /* 4090 */
+       sys     sys_munmap              2
+       sys     sys_truncate            2
+diff --git a/arch/mn10300/kernel/entry.S b/arch/mn10300/kernel/entry.S
+index b7cbb14..7fc6aba 100644
+--- a/arch/mn10300/kernel/entry.S
++++ b/arch/mn10300/kernel/entry.S
+@@ -477,7 +477,7 @@ ENTRY(sys_call_table)
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
+index 587da5e..a2b228f 100644
+--- a/arch/powerpc/Kconfig
++++ b/arch/powerpc/Kconfig
+@@ -122,6 +122,7 @@ config PPC
+       select HAVE_DMA_ATTRS if PPC64
+       select USE_GENERIC_SMP_HELPERS if SMP
+       select HAVE_OPROFILE
++      select HAVE_SYSCALL_WRAPPERS if PPC64
+ config EARLY_PRINTK
+       bool
+diff --git a/arch/powerpc/include/asm/systbl.h b/arch/powerpc/include/asm/systbl.h
+index f6cc7a4..180d5ea 100644
+--- a/arch/powerpc/include/asm/systbl.h
++++ b/arch/powerpc/include/asm/systbl.h
+@@ -92,7 +92,7 @@ COMPAT_SYS_SPU(readlink)
+ SYSCALL(uselib)
+ SYSCALL(swapon)
+ SYSCALL(reboot)
+-SYSX(sys_ni_syscall,compat_sys_old_readdir,old_readdir)
++SYSX(sys_ni_syscall,compat_sys_old_readdir,sys_old_readdir)
+ SYSCALL_SPU(mmap)
+ SYSCALL_SPU(munmap)
+ SYSCALL_SPU(truncate)
+diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
+index 97619fd..ddc2a30 100644
+--- a/arch/powerpc/platforms/pseries/Kconfig
++++ b/arch/powerpc/platforms/pseries/Kconfig
+@@ -54,7 +54,7 @@ config PPC_SMLPAR
+ config CMM
+       tristate "Collaborative memory management"
+-      depends on PPC_SMLPAR
++      depends on PPC_SMLPAR && !CRASH_DUMP
+       default y
+       help
+         Select this option, if you want to enable the kernel interface
+diff --git a/arch/s390/Kconfig b/arch/s390/Kconfig
+index 8d41908..f9b3dcd 100644
+--- a/arch/s390/Kconfig
++++ b/arch/s390/Kconfig
+@@ -70,6 +70,7 @@ mainmenu "Linux Kernel Configuration"
+ config S390
+       def_bool y
++      select HAVE_SYSCALL_WRAPPERS
+       select HAVE_OPROFILE
+       select HAVE_KPROBES
+       select HAVE_KRETPROBES
+diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
+index 328a20e..93a5c96 100644
+--- a/arch/s390/kernel/compat_wrapper.S
++++ b/arch/s390/kernel/compat_wrapper.S
+@@ -549,7 +549,7 @@ sys32_setdomainname_wrapper:
+       .globl  sys32_newuname_wrapper
+ sys32_newuname_wrapper:
+       llgtr   %r2,%r2                 # struct new_utsname *
+-      jg      s390x_newuname          # branch to system call
++      jg      sys_s390_newuname       # branch to system call
+       .globl  compat_sys_adjtimex_wrapper
+ compat_sys_adjtimex_wrapper:
+@@ -617,7 +617,7 @@ sys32_sysfs_wrapper:
+       .globl  sys32_personality_wrapper
+ sys32_personality_wrapper:
+       llgfr   %r2,%r2                 # unsigned long
+-      jg      s390x_personality       # branch to system call
++      jg      sys_s390_personality    # branch to system call
+       .globl  sys32_setfsuid16_wrapper
+ sys32_setfsuid16_wrapper:
+diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h
+index 6b18963..df0a813 100644
+--- a/arch/s390/kernel/entry.h
++++ b/arch/s390/kernel/entry.h
+@@ -30,23 +30,23 @@ struct fadvise64_64_args;
+ struct old_sigaction;
+ struct sel_arg_struct;
+-long sys_pipe(unsigned long __user *fildes);
+ long sys_mmap2(struct mmap_arg_struct __user  *arg);
+-long old_mmap(struct mmap_arg_struct __user *arg);
++long sys_s390_old_mmap(struct mmap_arg_struct __user *arg);
+ long sys_ipc(uint call, int first, unsigned long second,
+            unsigned long third, void __user *ptr);
+-long s390x_newuname(struct new_utsname __user *name);
+-long s390x_personality(unsigned long personality);
+-long s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
++long sys_s390_newuname(struct new_utsname __user *name);
++long sys_s390_personality(unsigned long personality);
++long sys_s390_fadvise64(int fd, u32 offset_high, u32 offset_low,
+                   size_t len, int advice);
+-long s390_fadvise64_64(struct fadvise64_64_args __user *args);
+-long s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, u32 len_low);
++long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
++long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
++                      u32 len_low);
+ long sys_fork(void);
+ long sys_clone(void);
+ long sys_vfork(void);
+ void execve_tail(void);
+ long sys_execve(void);
+-int sys_sigsuspend(int history0, int history1, old_sigset_t mask);
++long sys_sigsuspend(int history0, int history1, old_sigset_t mask);
+ long sys_sigaction(int sig, const struct old_sigaction __user *act,
+                  struct old_sigaction __user *oact);
+ long sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss);
+diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c
+index 3e2c05c..c8cb494 100644
+--- a/arch/s390/kernel/process.c
++++ b/arch/s390/kernel/process.c
+@@ -38,6 +38,7 @@
+ #include <linux/utsname.h>
+ #include <linux/tick.h>
+ #include <linux/elfcore.h>
++#include <linux/syscalls.h>
+ #include <asm/uaccess.h>
+ #include <asm/pgtable.h>
+ #include <asm/system.h>
+@@ -257,13 +258,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
+         return 0;
+ }
+-asmlinkage long sys_fork(void)
++SYSCALL_DEFINE0(fork)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
+ }
+-asmlinkage long sys_clone(void)
++SYSCALL_DEFINE0(clone)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       unsigned long clone_flags;
+@@ -290,7 +291,7 @@ asmlinkage long sys_clone(void)
+  * do not have enough call-clobbered registers to hold all
+  * the information you need.
+  */
+-asmlinkage long sys_vfork(void)
++SYSCALL_DEFINE0(vfork)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
+@@ -310,7 +311,7 @@ asmlinkage void execve_tail(void)
+ /*
+  * sys_execve() executes a new program.
+  */
+-asmlinkage long sys_execve(void)
++SYSCALL_DEFINE0(execve)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       char *filename;
+diff --git a/arch/s390/kernel/signal.c b/arch/s390/kernel/signal.c
+index b976820..68c61da 100644
+--- a/arch/s390/kernel/signal.c
++++ b/arch/s390/kernel/signal.c
+@@ -24,6 +24,7 @@
+ #include <linux/tty.h>
+ #include <linux/personality.h>
+ #include <linux/binfmts.h>
++#include <linux/syscalls.h>
+ #include <asm/ucontext.h>
+ #include <asm/uaccess.h>
+ #include <asm/lowcore.h>
+@@ -52,8 +53,7 @@ typedef struct
+ /*
+  * Atomically swap in the new signal mask, and wait for a signal.
+  */
+-asmlinkage int
+-sys_sigsuspend(int history0, int history1, old_sigset_t mask)
++SYSCALL_DEFINE3(sigsuspend, int, history0, int, history1, old_sigset_t, mask)
+ {
+       mask &= _BLOCKABLE;
+       spin_lock_irq(&current->sighand->siglock);
+@@ -69,9 +69,8 @@ sys_sigsuspend(int history0, int history1, old_sigset_t mask)
+       return -ERESTARTNOHAND;
+ }
+-asmlinkage long
+-sys_sigaction(int sig, const struct old_sigaction __user *act,
+-            struct old_sigaction __user *oact)
++SYSCALL_DEFINE3(sigaction, int, sig, const struct old_sigaction __user *, act,
++              struct old_sigaction __user *, oact)
+ {
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+@@ -101,15 +100,13 @@ sys_sigaction(int sig, const struct old_sigaction __user *act,
+       return ret;
+ }
+-asmlinkage long
+-sys_sigaltstack(const stack_t __user *uss, stack_t __user *uoss)
++SYSCALL_DEFINE2(sigaltstack, const stack_t __user *, uss,
++              stack_t __user *, uoss)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       return do_sigaltstack(uss, uoss, regs->gprs[15]);
+ }
+-
+-
+ /* Returns non-zero on fault. */
+ static int save_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
+ {
+@@ -163,7 +160,7 @@ static int restore_sigregs(struct pt_regs *regs, _sigregs __user *sregs)
+       return 0;
+ }
+-asmlinkage long sys_sigreturn(void)
++SYSCALL_DEFINE0(sigreturn)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       sigframe __user *frame = (sigframe __user *)regs->gprs[15];
+@@ -190,7 +187,7 @@ badframe:
+       return 0;
+ }
+-asmlinkage long sys_rt_sigreturn(void)
++SYSCALL_DEFINE0(rt_sigreturn)
+ {
+       struct pt_regs *regs = task_pt_regs(current);
+       rt_sigframe __user *frame = (rt_sigframe __user *)regs->gprs[15];
+diff --git a/arch/s390/kernel/sys_s390.c b/arch/s390/kernel/sys_s390.c
+index 5fdb799..e001ac1 100644
+--- a/arch/s390/kernel/sys_s390.c
++++ b/arch/s390/kernel/sys_s390.c
+@@ -29,6 +29,7 @@
+ #include <linux/personality.h>
+ #include <linux/unistd.h>
+ #include <linux/ipc.h>
++#include <linux/syscalls.h>
+ #include <asm/uaccess.h>
+ #include "entry.h"
+@@ -74,7 +75,7 @@ struct mmap_arg_struct {
+       unsigned long offset;
+ };
+-asmlinkage long sys_mmap2(struct mmap_arg_struct __user  *arg)
++SYSCALL_DEFINE1(mmap2, struct mmap_arg_struct __user *, arg)
+ {
+       struct mmap_arg_struct a;
+       int error = -EFAULT;
+@@ -86,7 +87,7 @@ out:
+       return error;
+ }
+-asmlinkage long old_mmap(struct mmap_arg_struct __user *arg)
++SYSCALL_DEFINE1(s390_old_mmap, struct mmap_arg_struct __user *, arg)
+ {
+       struct mmap_arg_struct a;
+       long error = -EFAULT;
+@@ -127,8 +128,8 @@ asmlinkage long old_select(struct sel_arg_struct __user *arg)
+  *
+  * This is really horribly ugly.
+  */
+-asmlinkage long sys_ipc(uint call, int first, unsigned long second,
+-                                unsigned long third, void __user *ptr)
++SYSCALL_DEFINE5(ipc, uint, call, int, first, unsigned long, second,
++              unsigned long, third, void __user *, ptr)
+ {
+         struct ipc_kludge tmp;
+       int ret;
+@@ -194,7 +195,7 @@ asmlinkage long sys_ipc(uint call, int first, unsigned long second,
+ }
+ #ifdef CONFIG_64BIT
+-asmlinkage long s390x_newuname(struct new_utsname __user *name)
++SYSCALL_DEFINE1(s390_newuname, struct new_utsname __user *, name)
+ {
+       int ret = sys_newuname(name);
+@@ -205,7 +206,7 @@ asmlinkage long s390x_newuname(struct new_utsname __user *name)
+       return ret;
+ }
+-asmlinkage long s390x_personality(unsigned long personality)
++SYSCALL_DEFINE1(s390_personality, unsigned long, personality)
+ {
+       int ret;
+@@ -224,15 +225,13 @@ asmlinkage long s390x_personality(unsigned long personality)
+  */
+ #ifndef CONFIG_64BIT
+-asmlinkage long
+-s390_fadvise64(int fd, u32 offset_high, u32 offset_low, size_t len, int advice)
++SYSCALL_DEFINE5(s390_fadvise64, int, fd, u32, offset_high, u32, offset_low,
++              size_t, len, int, advice)
+ {
+       return sys_fadvise64(fd, (u64) offset_high << 32 | offset_low,
+                       len, advice);
+ }
+-#endif
+-
+ struct fadvise64_64_args {
+       int fd;
+       long long offset;
+@@ -240,8 +239,7 @@ struct fadvise64_64_args {
+       int advice;
+ };
+-asmlinkage long
+-s390_fadvise64_64(struct fadvise64_64_args __user *args)
++SYSCALL_DEFINE1(s390_fadvise64_64, struct fadvise64_64_args __user *, args)
+ {
+       struct fadvise64_64_args a;
+@@ -250,7 +248,6 @@ s390_fadvise64_64(struct fadvise64_64_args __user *args)
+       return sys_fadvise64_64(a.fd, a.offset, a.len, a.advice);
+ }
+-#ifndef CONFIG_64BIT
+ /*
+  * This is a wrapper to call sys_fallocate(). For 31 bit s390 the last
+  * 64 bit argument "len" is split into the upper and lower 32 bits. The
+@@ -263,9 +260,19 @@ s390_fadvise64_64(struct fadvise64_64_args __user *args)
+  * to
+  *   %r2: fd, %r3: mode, %r4/%r5: offset, 96(%r15)-103(%r15): len
+  */
+-asmlinkage long s390_fallocate(int fd, int mode, loff_t offset,
++SYSCALL_DEFINE(s390_fallocate)(int fd, int mode, loff_t offset,
+                              u32 len_high, u32 len_low)
+ {
+       return sys_fallocate(fd, mode, offset, ((u64)len_high << 32) | len_low);
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_s390_fallocate(long fd, long mode, loff_t offset,
++                                 long len_high, long len_low)
++{
++      return SYSC_s390_fallocate((int) fd, (int) mode, offset,
++                                 (u32) len_high, (u32) len_low);
++}
++SYSCALL_ALIAS(sys_s390_fallocate, SyS_s390_fallocate);
++#endif
++
+ #endif
+diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
+index c66d35e..2a3abd4 100644
+--- a/arch/s390/kernel/syscalls.S
++++ b/arch/s390/kernel/syscalls.S
+@@ -98,7 +98,7 @@ SYSCALL(sys_uselib,sys_uselib,sys32_uselib_wrapper)
+ SYSCALL(sys_swapon,sys_swapon,sys32_swapon_wrapper)
+ SYSCALL(sys_reboot,sys_reboot,sys32_reboot_wrapper)
+ SYSCALL(sys_ni_syscall,sys_ni_syscall,old32_readdir_wrapper)  /* old readdir syscall */
+-SYSCALL(old_mmap,old_mmap,old32_mmap_wrapper)                 /* 90 */
++SYSCALL(sys_s390_old_mmap,sys_s390_old_mmap,old32_mmap_wrapper)       /* 90 */
+ SYSCALL(sys_munmap,sys_munmap,sys32_munmap_wrapper)
+ SYSCALL(sys_truncate,sys_truncate,sys32_truncate_wrapper)
+ SYSCALL(sys_ftruncate,sys_ftruncate,sys32_ftruncate_wrapper)
+@@ -130,7 +130,7 @@ SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper)
+ SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn)
+ SYSCALL(sys_clone,sys_clone,sys32_clone)                      /* 120 */
+ SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper)
+-SYSCALL(sys_newuname,s390x_newuname,sys32_newuname_wrapper)
++SYSCALL(sys_newuname,sys_s390_newuname,sys32_newuname_wrapper)
+ NI_SYSCALL                                                    /* modify_ldt for i386 */
+ SYSCALL(sys_adjtimex,sys_adjtimex,compat_sys_adjtimex_wrapper)
+ SYSCALL(sys_mprotect,sys_mprotect,sys32_mprotect_wrapper)     /* 125 */
+@@ -144,7 +144,7 @@ SYSCALL(sys_getpgid,sys_getpgid,sys32_getpgid_wrapper)
+ SYSCALL(sys_fchdir,sys_fchdir,sys32_fchdir_wrapper)
+ SYSCALL(sys_bdflush,sys_bdflush,sys32_bdflush_wrapper)
+ SYSCALL(sys_sysfs,sys_sysfs,sys32_sysfs_wrapper)              /* 135 */
+-SYSCALL(sys_personality,s390x_personality,sys32_personality_wrapper)
++SYSCALL(sys_personality,sys_s390_personality,sys32_personality_wrapper)
+ NI_SYSCALL                                                    /* for afs_syscall */
+ SYSCALL(sys_setfsuid16,sys_ni_syscall,sys32_setfsuid16_wrapper)       /* old setfsuid16 syscall */
+ SYSCALL(sys_setfsgid16,sys_ni_syscall,sys32_setfsgid16_wrapper)       /* old setfsgid16 syscall */
+@@ -261,7 +261,7 @@ SYSCALL(sys_epoll_create,sys_epoll_create,sys_epoll_create_wrapper)
+ SYSCALL(sys_epoll_ctl,sys_epoll_ctl,sys_epoll_ctl_wrapper)    /* 250 */
+ SYSCALL(sys_epoll_wait,sys_epoll_wait,sys_epoll_wait_wrapper)
+ SYSCALL(sys_set_tid_address,sys_set_tid_address,sys32_set_tid_address_wrapper)
+-SYSCALL(s390_fadvise64,sys_fadvise64_64,sys32_fadvise64_wrapper)
++SYSCALL(sys_s390_fadvise64,sys_fadvise64_64,sys32_fadvise64_wrapper)
+ SYSCALL(sys_timer_create,sys_timer_create,sys32_timer_create_wrapper)
+ SYSCALL(sys_timer_settime,sys_timer_settime,sys32_timer_settime_wrapper)      /* 255 */
+ SYSCALL(sys_timer_gettime,sys_timer_gettime,sys32_timer_gettime_wrapper)
+@@ -272,7 +272,7 @@ SYSCALL(sys_clock_gettime,sys_clock_gettime,sys32_clock_gettime_wrapper)   /* 260
+ SYSCALL(sys_clock_getres,sys_clock_getres,sys32_clock_getres_wrapper)
+ SYSCALL(sys_clock_nanosleep,sys_clock_nanosleep,sys32_clock_nanosleep_wrapper)
+ NI_SYSCALL                                                    /* reserved for vserver */
+-SYSCALL(s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper)
++SYSCALL(sys_s390_fadvise64_64,sys_ni_syscall,sys32_fadvise64_64_wrapper)
+ SYSCALL(sys_statfs64,sys_statfs64,compat_sys_statfs64_wrapper)
+ SYSCALL(sys_fstatfs64,sys_fstatfs64,compat_sys_fstatfs64_wrapper)
+ SYSCALL(sys_remap_file_pages,sys_remap_file_pages,sys32_remap_file_pages_wrapper)
+@@ -322,7 +322,7 @@ NI_SYSCALL                                                 /* 310 sys_move_pages */
+ SYSCALL(sys_getcpu,sys_getcpu,sys_getcpu_wrapper)
+ SYSCALL(sys_epoll_pwait,sys_epoll_pwait,compat_sys_epoll_pwait_wrapper)
+ SYSCALL(sys_utimes,sys_utimes,compat_sys_utimes_wrapper)
+-SYSCALL(s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
++SYSCALL(sys_s390_fallocate,sys_fallocate,sys_fallocate_wrapper)
+ SYSCALL(sys_utimensat,sys_utimensat,compat_sys_utimensat_wrapper)     /* 315 */
+ SYSCALL(sys_signalfd,sys_signalfd,compat_sys_signalfd_wrapper)
+ NI_SYSCALL                                            /* 317 old sys_timer_fd */
+diff --git a/arch/sh/kernel/sys_sh32.c b/arch/sh/kernel/sys_sh32.c
+index f0aa5c3..c907f8c 100644
+--- a/arch/sh/kernel/sys_sh32.c
++++ b/arch/sh/kernel/sys_sh32.c
+@@ -21,7 +21,7 @@
+  * sys_pipe() is the normal C calling standard for creating
+  * a pipe. It's not the way Unix traditionally does this, though.
+  */
+-asmlinkage int sys_pipe(unsigned long r4, unsigned long r5,
++asmlinkage int sys_sh_pipe(unsigned long r4, unsigned long r5,
+       unsigned long r6, unsigned long r7,
+       struct pt_regs __regs)
+ {
+diff --git a/arch/sh/kernel/syscalls_32.S b/arch/sh/kernel/syscalls_32.S
+index 0af693e..e67c173 100644
+--- a/arch/sh/kernel/syscalls_32.S
++++ b/arch/sh/kernel/syscalls_32.S
+@@ -58,7 +58,7 @@ ENTRY(sys_call_table)
+       .long sys_mkdir
+       .long sys_rmdir         /* 40 */
+       .long sys_dup
+-      .long sys_pipe
++      .long sys_sh_pipe
+       .long sys_times
+       .long sys_ni_syscall    /* old prof syscall holder */
+       .long sys_brk           /* 45 */
+@@ -105,7 +105,7 @@ ENTRY(sys_call_table)
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/sh/kernel/syscalls_64.S b/arch/sh/kernel/syscalls_64.S
+index 0b436aa..557cb91 100644
+--- a/arch/sh/kernel/syscalls_64.S
++++ b/arch/sh/kernel/syscalls_64.S
+@@ -109,7 +109,7 @@ sys_call_table:
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap                  /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
+index e8cdf71..e3b7ed0 100644
+--- a/arch/sparc/kernel/entry.S
++++ b/arch/sparc/kernel/entry.S
+@@ -1142,8 +1142,8 @@ sunos_execv:
+        ld     [%sp + STACKFRAME_SZ + PT_I0], %o0
+       .align  4
+-      .globl  sys_pipe
+-sys_pipe:
++      .globl  sys_sparc_pipe
++sys_sparc_pipe:
+       mov     %o7, %l5
+       add     %sp, STACKFRAME_SZ, %o0         ! pt_regs *regs arg
+       call    sparc_pipe
+diff --git a/arch/sparc/kernel/systbls.S b/arch/sparc/kernel/systbls.S
+index e1b9233..6a62545 100644
+--- a/arch/sparc/kernel/systbls.S
++++ b/arch/sparc/kernel/systbls.S
+@@ -24,7 +24,7 @@ sys_call_table:
+ /*25*/        .long sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_pause
+ /*30*/        .long sys_utime, sys_lchown, sys_fchown, sys_access, sys_nice
+ /*35*/        .long sys_chown, sys_sync, sys_kill, sys_newstat, sys_sendfile
+-/*40*/        .long sys_newlstat, sys_dup, sys_pipe, sys_times, sys_getuid
++/*40*/        .long sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_getuid
+ /*45*/        .long sys_umount, sys_setgid16, sys_getgid16, sys_signal, sys_geteuid16
+ /*50*/        .long sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, sys_ioctl
+ /*55*/        .long sys_reboot, sys_mmap2, sys_symlink, sys_readlink, sys_execve
+@@ -56,7 +56,7 @@ sys_call_table:
+ /*185*/       .long sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_newuname
+ /*190*/       .long sys_init_module, sys_personality, sparc_remap_file_pages, sys_epoll_create, sys_epoll_ctl
+ /*195*/       .long sys_epoll_wait, sys_ioprio_set, sys_getppid, sparc_sigaction, sys_sgetmask
+-/*200*/       .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, old_readdir
++/*200*/       .long sys_ssetmask, sys_sigsuspend, sys_newlstat, sys_uselib, sys_old_readdir
+ /*205*/       .long sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64
+ /*210*/       .long sys_fadvise64_64, sys_tgkill, sys_waitpid, sys_swapoff, sys_sysinfo
+ /*215*/       .long sys_ipc, sys_sigreturn, sys_clone, sys_ioprio_get, sys_adjtimex
+diff --git a/arch/sparc64/kernel/syscalls.S b/arch/sparc64/kernel/syscalls.S
+index a2f2427..cd2d333 100644
+--- a/arch/sparc64/kernel/syscalls.S
++++ b/arch/sparc64/kernel/syscalls.S
+@@ -20,7 +20,7 @@ execve_merge:
+        add    %sp, PTREGS_OFF, %o0
+       .align  32
+-sys_pipe:
++sys_sparc_pipe:
+       ba,pt   %xcc, sparc_pipe
+        add    %sp, PTREGS_OFF, %o0
+ sys_nis_syscall:
+diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
+index 0fdbf3b..26b39de 100644
+--- a/arch/sparc64/kernel/systbls.S
++++ b/arch/sparc64/kernel/systbls.S
+@@ -26,7 +26,7 @@ sys_call_table32:
+ /*25*/        .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause
+ /*30*/        .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice
+       .word sys_chown, sys_sync, sys32_kill, compat_sys_newstat, sys32_sendfile
+-/*40*/        .word compat_sys_newlstat, sys_dup, sys_pipe, compat_sys_times, sys_getuid
++/*40*/        .word compat_sys_newlstat, sys_dup, sys_sparc_pipe, compat_sys_times, sys_getuid
+       .word sys32_umount, sys_setgid16, sys_getgid16, sys32_signal, sys_geteuid16
+ /*50*/        .word sys_getegid16, sys_acct, sys_nis_syscall, sys_getgid, compat_sys_ioctl
+       .word sys32_reboot, sys32_mmap2, sys_symlink, sys32_readlink, sys32_execve
+@@ -100,7 +100,7 @@ sys_call_table:
+ /*25*/        .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
+ /*30*/        .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
+       .word sys_nis_syscall, sys_sync, sys_kill, sys_newstat, sys_sendfile64
+-/*40*/        .word sys_newlstat, sys_dup, sys_pipe, sys_times, sys_nis_syscall
++/*40*/        .word sys_newlstat, sys_dup, sys_sparc_pipe, sys_times, sys_nis_syscall
+       .word sys_umount, sys_setgid, sys_getgid, sys_signal, sys_geteuid
+ /*50*/        .word sys_getegid, sys_acct, sys_memory_ordering, sys_nis_syscall, sys_ioctl
+       .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index 552d2b7..388bae2 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -567,7 +567,7 @@ config AMD_IOMMU
+ # need this always selected by IOMMU for the VIA workaround
+ config SWIOTLB
+-      bool
++      def_bool y if X86_64
+       help
+         Support for software bounce buffers used on x86-64 systems
+         which don't have a hardware IOMMU (e.g. the current generation
+diff --git a/arch/x86/kernel/head64.c b/arch/x86/kernel/head64.c
+index 9bfc4d7..290cb54 100644
+--- a/arch/x86/kernel/head64.c
++++ b/arch/x86/kernel/head64.c
+@@ -26,7 +26,7 @@
+ #include <asm/bios_ebda.h>
+ /* boot cpu pda */
+-static struct x8664_pda _boot_cpu_pda __read_mostly;
++static struct x8664_pda _boot_cpu_pda;
+ #ifdef CONFIG_SMP
+ /*
+diff --git a/arch/x86/kernel/head_64.S b/arch/x86/kernel/head_64.S
+index db3280a..872d9d0 100644
+--- a/arch/x86/kernel/head_64.S
++++ b/arch/x86/kernel/head_64.S
+@@ -305,7 +305,7 @@ ENTRY(early_idt_handler)
+       call dump_stack
+ #ifdef CONFIG_KALLSYMS        
+       leaq early_idt_ripmsg(%rip),%rdi
+-      movq 8(%rsp),%rsi       # get rip again
++      movq 0(%rsp),%rsi       # get rip again
+       call __print_symbol
+ #endif
+ #endif /* EARLY_PRINTK */
+diff --git a/arch/x86/kernel/syscall_table_32.S b/arch/x86/kernel/syscall_table_32.S
+index d44395f..e2e86a0 100644
+--- a/arch/x86/kernel/syscall_table_32.S
++++ b/arch/x86/kernel/syscall_table_32.S
+@@ -88,7 +88,7 @@ ENTRY(sys_call_table)
+       .long sys_uselib
+       .long sys_swapon
+       .long sys_reboot
+-      .long old_readdir
++      .long sys_old_readdir
+       .long old_mmap          /* 90 */
+       .long sys_munmap
+       .long sys_truncate
+diff --git a/arch/x86/kernel/tlb_uv.c b/arch/x86/kernel/tlb_uv.c
+index 8b8c0d6..2fc8b6a 100644
+--- a/arch/x86/kernel/tlb_uv.c
++++ b/arch/x86/kernel/tlb_uv.c
+@@ -586,7 +586,6 @@ static int __init uv_ptc_init(void)
+ static struct bau_control * __init uv_table_bases_init(int blade, int node)
+ {
+       int i;
+-      int *ip;
+       struct bau_msg_status *msp;
+       struct bau_control *bau_tabp;
+@@ -603,13 +602,6 @@ static struct bau_control * __init uv_table_bases_init(int blade, int node)
+               bau_cpubits_clear(&msp->seen_by, (int)
+                                 uv_blade_nr_possible_cpus(blade));
+-      bau_tabp->watching =
+-          kmalloc_node(sizeof(int) * DEST_NUM_RESOURCES, GFP_KERNEL, node);
+-      BUG_ON(!bau_tabp->watching);
+-
+-      for (i = 0, ip = bau_tabp->watching; i < DEST_Q_SIZE; i++, ip++)
+-              *ip = 0;
+-
+       uv_bau_table_bases[blade] = bau_tabp;
+       return bau_tabp;
+@@ -632,7 +624,6 @@ uv_table_bases_finish(int blade, int node, int cur_cpu,
+               bcp->bau_msg_head       = bau_tablesp->va_queue_first;
+               bcp->va_queue_first     = bau_tablesp->va_queue_first;
+               bcp->va_queue_last      = bau_tablesp->va_queue_last;
+-              bcp->watching           = bau_tablesp->watching;
+               bcp->msg_statuses       = bau_tablesp->msg_statuses;
+               bcp->descriptor_base    = adp;
+       }
+diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
+index 455f3fe..da1973b 100644
+--- a/arch/x86/mm/fault.c
++++ b/arch/x86/mm/fault.c
+@@ -534,7 +534,7 @@ static int vmalloc_fault(unsigned long address)
+          happen within a race in page table update. In the later
+          case just flush. */
+-      pgd = pgd_offset(current->mm ?: &init_mm, address);
++      pgd = pgd_offset(current->active_mm, address);
+       pgd_ref = pgd_offset_k(address);
+       if (pgd_none(*pgd_ref))
+               return -1;
+diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c
+index 60ec1d0..62dc07c 100644
+--- a/arch/x86/mm/init_32.c
++++ b/arch/x86/mm/init_32.c
+@@ -718,7 +718,7 @@ void __init setup_bootmem_allocator(void)
+       after_init_bootmem = 1;
+ }
+-static void __init find_early_table_space(unsigned long end)
++static void __init find_early_table_space(unsigned long end, int use_pse)
+ {
+       unsigned long puds, pmds, ptes, tables, start;
+@@ -728,7 +728,7 @@ static void __init find_early_table_space(unsigned long end)
+       pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
+       tables += PAGE_ALIGN(pmds * sizeof(pmd_t));
+-      if (cpu_has_pse) {
++      if (use_pse) {
+               unsigned long extra;
+               extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT);
+@@ -768,12 +768,22 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+       pgd_t *pgd_base = swapper_pg_dir;
+       unsigned long start_pfn, end_pfn;
+       unsigned long big_page_start;
++#ifdef CONFIG_DEBUG_PAGEALLOC
++      /*
++       * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages.
++       * This will simplify cpa(), which otherwise needs to support splitting
++       * large pages into small in interrupt context, etc.
++       */
++      int use_pse = 0;
++#else
++      int use_pse = cpu_has_pse;
++#endif
+       /*
+        * Find space for the kernel direct mapping tables.
+        */
+       if (!after_init_bootmem)
+-              find_early_table_space(end);
++              find_early_table_space(end, use_pse);
+ #ifdef CONFIG_X86_PAE
+       set_nx();
+@@ -819,7 +829,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+       end_pfn = (end>>PMD_SHIFT) << (PMD_SHIFT - PAGE_SHIFT);
+       if (start_pfn < end_pfn)
+               kernel_physical_mapping_init(pgd_base, start_pfn, end_pfn,
+-                                              cpu_has_pse);
++                                           use_pse);
+       /* tail is not big page alignment ? */
+       start_pfn = end_pfn;
+diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
+index 1adbb3e..753ea12 100644
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -446,13 +446,14 @@ phys_pud_update(pgd_t *pgd, unsigned long addr, unsigned long end,
+       return phys_pud_init(pud, addr, end, page_size_mask);
+ }
+-static void __init find_early_table_space(unsigned long end)
++static void __init find_early_table_space(unsigned long end, int use_pse,
++                                        int use_gbpages)
+ {
+       unsigned long puds, pmds, ptes, tables, start;
+       puds = (end + PUD_SIZE - 1) >> PUD_SHIFT;
+       tables = round_up(puds * sizeof(pud_t), PAGE_SIZE);
+-      if (direct_gbpages) {
++      if (use_gbpages) {
+               unsigned long extra;
+               extra = end - ((end>>PUD_SHIFT) << PUD_SHIFT);
+               pmds = (extra + PMD_SIZE - 1) >> PMD_SHIFT;
+@@ -460,7 +461,7 @@ static void __init find_early_table_space(unsigned long end)
+               pmds = (end + PMD_SIZE - 1) >> PMD_SHIFT;
+       tables += round_up(pmds * sizeof(pmd_t), PAGE_SIZE);
+-      if (cpu_has_pse) {
++      if (use_pse) {
+               unsigned long extra;
+               extra = end - ((end>>PMD_SHIFT) << PMD_SHIFT);
+               ptes = (extra + PAGE_SIZE - 1) >> PAGE_SHIFT;
+@@ -571,6 +572,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+       struct map_range mr[NR_RANGE_MR];
+       int nr_range, i;
++      int use_pse, use_gbpages;
+       printk(KERN_INFO "init_memory_mapping\n");
+@@ -584,9 +586,21 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+       if (!after_bootmem)
+               init_gbpages();
+-      if (direct_gbpages)
++#ifdef CONFIG_DEBUG_PAGEALLOC
++      /*
++       * For CONFIG_DEBUG_PAGEALLOC, identity mapping will use small pages.
++       * This will simplify cpa(), which otherwise needs to support splitting
++       * large pages into small in interrupt context, etc.
++       */
++      use_pse = use_gbpages = 0;
++#else
++      use_pse = cpu_has_pse;
++      use_gbpages = direct_gbpages;
++#endif
++
++      if (use_gbpages)
+               page_size_mask |= 1 << PG_LEVEL_1G;
+-      if (cpu_has_pse)
++      if (use_pse)
+               page_size_mask |= 1 << PG_LEVEL_2M;
+       memset(mr, 0, sizeof(mr));
+@@ -647,7 +661,7 @@ unsigned long __init_refok init_memory_mapping(unsigned long start,
+                        (mr[i].page_size_mask & (1<<PG_LEVEL_2M))?"2M":"4k"));
+       if (!after_bootmem)
+-              find_early_table_space(end);
++              find_early_table_space(end, use_pse, use_gbpages);
+       for (i = 0; i < nr_range; i++)
+               last_map_addr = kernel_physical_mapping_init(
+diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
+index 56790f8..d62311f 100644
+--- a/drivers/dma/ioat_dma.c
++++ b/drivers/dma/ioat_dma.c
+@@ -1337,12 +1337,11 @@ static void ioat_dma_start_null_desc(struct ioat_dma_chan *ioat_chan)
+  */
+ #define IOAT_TEST_SIZE 2000
+-DECLARE_COMPLETION(test_completion);
+ static void ioat_dma_test_callback(void *dma_async_param)
+ {
+-      printk(KERN_ERR "ioatdma: ioat_dma_test_callback(%p)\n",
+-              dma_async_param);
+-      complete(&test_completion);
++      struct completion *cmp = dma_async_param;
++
++      complete(cmp);
+ }
+ /**
+@@ -1359,6 +1358,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
+       dma_addr_t dma_dest, dma_src;
+       dma_cookie_t cookie;
+       int err = 0;
++      struct completion cmp;
+       src = kzalloc(sizeof(u8) * IOAT_TEST_SIZE, GFP_KERNEL);
+       if (!src)
+@@ -1398,8 +1398,9 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
+       }
+       async_tx_ack(tx);
++      init_completion(&cmp);
+       tx->callback = ioat_dma_test_callback;
+-      tx->callback_param = (void *)0x8086;
++      tx->callback_param = &cmp;
+       cookie = tx->tx_submit(tx);
+       if (cookie < 0) {
+               dev_err(&device->pdev->dev,
+@@ -1409,7 +1410,7 @@ static int ioat_dma_self_test(struct ioatdma_device *device)
+       }
+       device->common.device_issue_pending(dma_chan);
+-      wait_for_completion_timeout(&test_completion, msecs_to_jiffies(3000));
++      wait_for_completion_timeout(&cmp, msecs_to_jiffies(3000));
+       if (device->common.device_is_tx_complete(dma_chan, cookie, NULL, NULL)
+                                       != DMA_SUCCESS) {
+diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
+index ab7c8e4..666b7ba 100644
+--- a/drivers/md/bitmap.c
++++ b/drivers/md/bitmap.c
+@@ -964,9 +964,11 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
+                                */
+                               page = bitmap->sb_page;
+                               offset = sizeof(bitmap_super_t);
+-                              read_sb_page(bitmap->mddev, bitmap->offset,
+-                                           page,
+-                                           index, count);
++                              if (!file)
++                                      read_sb_page(bitmap->mddev,
++                                                   bitmap->offset,
++                                                   page,
++                                                   index, count);
+                       } else if (file) {
+                               page = read_page(file, index, bitmap, count);
+                               offset = 0;
+diff --git a/drivers/md/dm-log.c b/drivers/md/dm-log.c
+index 5b48478..73b5ec1 100644
+--- a/drivers/md/dm-log.c
++++ b/drivers/md/dm-log.c
+@@ -467,6 +467,7 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
+               lc->disk_header = vmalloc(buf_size);
+               if (!lc->disk_header) {
+                       DMWARN("couldn't allocate disk log buffer");
++                      dm_io_client_destroy(lc->io_req.client);
+                       kfree(lc);
+                       return -ENOMEM;
+               }
+@@ -482,6 +483,8 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
+               DMWARN("couldn't allocate sync bitset");
+               if (!dev)
+                       vfree(lc->clean_bits);
++              else
++                      dm_io_client_destroy(lc->io_req.client);
+               vfree(lc->disk_header);
+               kfree(lc);
+               return -ENOMEM;
+@@ -495,6 +498,8 @@ static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
+               vfree(lc->sync_bits);
+               if (!dev)
+                       vfree(lc->clean_bits);
++              else
++                      dm_io_client_destroy(lc->io_req.client);
+               vfree(lc->disk_header);
+               kfree(lc);
+               return -ENOMEM;
+diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
+index 97ef945..8fe418b 100644
+--- a/drivers/md/dm-raid1.c
++++ b/drivers/md/dm-raid1.c
+@@ -727,9 +727,6 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type)
+       struct mirror_set *ms = m->ms;
+       struct mirror *new;
+-      if (!errors_handled(ms))
+-              return;
+-
+       /*
+        * error_count is used for nothing more than a
+        * simple way to tell if a device has encountered
+@@ -740,6 +737,9 @@ static void fail_mirror(struct mirror *m, enum dm_raid1_error error_type)
+       if (test_and_set_bit(error_type, &m->error_type))
+               return;
++      if (!errors_handled(ms))
++              return;
++
+       if (m != get_default_mirror(ms))
+               goto out;
+diff --git a/drivers/net/e1000e/e1000.h b/drivers/net/e1000e/e1000.h
+index 5ea6b60..4ee3d97 100644
+--- a/drivers/net/e1000e/e1000.h
++++ b/drivers/net/e1000e/e1000.h
+@@ -283,6 +283,7 @@ struct e1000_adapter {
+       unsigned long led_status;
+       unsigned int flags;
++      unsigned int flags2;
+       struct work_struct downshift_task;
+       struct work_struct update_phy_task;
+ };
+@@ -290,6 +291,7 @@ struct e1000_adapter {
+ struct e1000_info {
+       enum e1000_mac_type     mac;
+       unsigned int            flags;
++      unsigned int            flags2;
+       u32                     pba;
+       s32                     (*get_variants)(struct e1000_adapter *);
+       struct e1000_mac_operations *mac_ops;
+@@ -330,6 +332,9 @@ struct e1000_info {
+ #define FLAG_RX_RESTART_NOW               (1 << 30)
+ #define FLAG_MSI_TEST_FAILED              (1 << 31)
++/* CRC Stripping defines */
++#define FLAG2_CRC_STRIPPING               (1 << 0)
++
+ #define E1000_RX_DESC_PS(R, i)            \
+       (&(((union e1000_rx_desc_packet_split *)((R).desc))[i]))
+ #define E1000_GET_DESC(R, i, type)    (&(((struct type *)((R).desc))[i]))
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index 660c85a..c476982 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -497,6 +497,10 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
+                       goto next_desc;
+               }
++              /* adjust length to remove Ethernet CRC */
++              if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
++                      length -= 4;
++
+               total_rx_bytes += length;
+               total_rx_packets++;
+@@ -802,6 +806,10 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
+                       pci_dma_sync_single_for_device(pdev, ps_page->dma,
+                               PAGE_SIZE, PCI_DMA_FROMDEVICE);
++                      /* remove the CRC */
++                      if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
++                              l1 -= 4;
++
+                       skb_put(skb, l1);
+                       goto copydone;
+               } /* if */
+@@ -823,6 +831,12 @@ static bool e1000_clean_rx_irq_ps(struct e1000_adapter *adapter,
+                       skb->truesize += length;
+               }
++              /* strip the ethernet crc, problem is we're using pages now so
++               * this whole operation can get a little cpu intensive
++               */
++              if (!(adapter->flags2 & FLAG2_CRC_STRIPPING))
++                      pskb_trim(skb, skb->len - 4);
++
+ copydone:
+               total_rx_bytes += skb->len;
+               total_rx_packets++;
+@@ -1987,8 +2001,12 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)
+       else
+               rctl |= E1000_RCTL_LPE;
+-      /* Enable hardware CRC frame stripping */
+-      rctl |= E1000_RCTL_SECRC;
++      /* Some systems expect that the CRC is included in SMBUS traffic. The
++       * hardware strips the CRC before sending to both SMBUS (BMC) and to
++       * host memory when this is enabled
++       */
++      if (adapter->flags2 & FLAG2_CRC_STRIPPING)
++              rctl |= E1000_RCTL_SECRC;
+       /* Setup buffer sizes */
+       rctl &= ~E1000_RCTL_SZ_4096;
+@@ -4412,6 +4430,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+       adapter->ei = ei;
+       adapter->pba = ei->pba;
+       adapter->flags = ei->flags;
++      adapter->flags2 = ei->flags2;
+       adapter->hw.adapter = adapter;
+       adapter->hw.mac.type = ei->mac;
+       adapter->msg_enable = (1 << NETIF_MSG_DRV | NETIF_MSG_PROBE) - 1;
+diff --git a/drivers/net/e1000e/param.c b/drivers/net/e1000e/param.c
+index d91dbf7..a7c8b99 100644
+--- a/drivers/net/e1000e/param.c
++++ b/drivers/net/e1000e/param.c
+@@ -142,6 +142,16 @@ E1000_PARAM(KumeranLockLoss, "Enable Kumeran lock loss workaround");
+  */
+ E1000_PARAM(WriteProtectNVM, "Write-protect NVM [WARNING: disabling this can lead to corrupted NVM]");
++/*
++ * Enable CRC Stripping
++ *
++ * Valid Range: 0, 1
++ *
++ * Default Value: 1 (enabled)
++ */
++E1000_PARAM(CrcStripping, "Enable CRC Stripping, disable if your BMC needs " \
++                          "the CRC");
++
+ struct e1000_option {
+       enum { enable_option, range_option, list_option } type;
+       const char *name;
+@@ -377,6 +387,21 @@ void __devinit e1000e_check_options(struct e1000_adapter *adapter)
+                               adapter->flags |= FLAG_SMART_POWER_DOWN;
+               }
+       }
++      { /* CRC Stripping */
++              const struct e1000_option opt = {
++                      .type = enable_option,
++                      .name = "CRC Stripping",
++                      .err  = "defaulting to enabled",
++                      .def  = OPTION_ENABLED
++              };
++
++              if (num_CrcStripping > bd) {
++                      unsigned int crc_stripping = CrcStripping[bd];
++                      e1000_validate_option(&crc_stripping, &opt, adapter);
++                      if (crc_stripping == OPTION_ENABLED)
++                              adapter->flags2 |= FLAG2_CRC_STRIPPING;
++              }
++      }
+       { /* Kumeran Lock Loss Workaround */
+               const struct e1000_option opt = {
+                       .type = enable_option,
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index 79b7ae3..20ab0fd 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -1334,16 +1334,6 @@ static void iwl_setup_rx_handlers(struct iwl_priv *priv)
+       priv->cfg->ops->lib->rx_handler_setup(priv);
+ }
+-/*
+- * this should be called while priv->lock is locked
+-*/
+-static void __iwl_rx_replenish(struct iwl_priv *priv)
+-{
+-      iwl_rx_allocate(priv);
+-      iwl_rx_queue_restock(priv);
+-}
+-
+-
+ /**
+  * iwl_rx_handle - Main entry function for receiving responses from uCode
+  *
+@@ -1449,7 +1439,7 @@ void iwl_rx_handle(struct iwl_priv *priv)
+                       count++;
+                       if (count >= 8) {
+                               priv->rxq.read = i;
+-                              __iwl_rx_replenish(priv);
++                              iwl_rx_queue_restock(priv);
+                               count = 0;
+                       }
+               }
+diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
+index ce25379..36391ef 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
+@@ -245,25 +245,31 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+       struct list_head *element;
+       struct iwl_rx_mem_buffer *rxb;
+       unsigned long flags;
+-      spin_lock_irqsave(&rxq->lock, flags);
+-      while (!list_empty(&rxq->rx_used)) {
++
++      while (1) {
++              spin_lock_irqsave(&rxq->lock, flags);
++
++              if (list_empty(&rxq->rx_used)) {
++                      spin_unlock_irqrestore(&rxq->lock, flags);
++                      return;
++              }
+               element = rxq->rx_used.next;
+               rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
++              list_del(element);
++
++              spin_unlock_irqrestore(&rxq->lock, flags);
+               /* Alloc a new receive buffer */
+               rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
+-                              __GFP_NOWARN | GFP_ATOMIC);
++                                   GFP_KERNEL);
+               if (!rxb->skb) {
+-                      if (net_ratelimit())
+-                              printk(KERN_CRIT DRV_NAME
+-                                     ": Can not allocate SKB buffers\n");
++                      printk(KERN_CRIT DRV_NAME
++                                 "Can not allocate SKB buffers\n");
+                       /* We don't reschedule replenish work here -- we will
+                        * call the restock method and if it still needs
+                        * more buffers it will schedule replenish */
+                       break;
+               }
+-              priv->alloc_rxb_skb++;
+-              list_del(element);
+               /* Get physical address of RB/SKB */
+               rxb->real_dma_addr = pci_map_single(
+@@ -277,12 +283,15 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+               rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256);
+               skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr);
++              spin_lock_irqsave(&rxq->lock, flags);
++
+               list_add_tail(&rxb->list, &rxq->rx_free);
+               rxq->free_count++;
++              priv->alloc_rxb_skb++;
++
++              spin_unlock_irqrestore(&rxq->lock, flags);
+       }
+-      spin_unlock_irqrestore(&rxq->lock, flags);
+ }
+-EXPORT_SYMBOL(iwl_rx_allocate);
+ void iwl_rx_replenish(struct iwl_priv *priv)
+ {
+diff --git a/drivers/pci/pci-driver.c b/drivers/pci/pci-driver.c
+index a13f534..2d04b28 100644
+--- a/drivers/pci/pci-driver.c
++++ b/drivers/pci/pci-driver.c
+@@ -287,6 +287,14 @@ static void pci_device_shutdown(struct device *dev)
+ #ifdef CONFIG_PM_SLEEP
++static bool pci_has_legacy_pm_support(struct pci_dev *pci_dev)
++{
++      struct pci_driver *drv = pci_dev->driver;
++
++      return drv && (drv->suspend || drv->suspend_late || drv->resume
++              || drv->resume_early);
++}
++
+ /*
+  * Default "suspend" method for devices that have no driver provided suspend,
+  * or not even a driver at all.
+@@ -304,14 +312,22 @@ static void pci_default_pm_suspend(struct pci_dev *pci_dev)
+ /*
+  * Default "resume" method for devices that have no driver provided resume,
+- * or not even a driver at all.
++ * or not even a driver at all (first part).
+  */
+-static int pci_default_pm_resume(struct pci_dev *pci_dev)
++static void pci_default_pm_resume_early(struct pci_dev *pci_dev)
+ {
+-      int retval = 0;
+-
+       /* restore the PCI config space */
+       pci_restore_state(pci_dev);
++}
++
++/*
++ * Default "resume" method for devices that have no driver provided resume,
++ * or not even a driver at all (second part).
++ */
++static int pci_default_pm_resume_late(struct pci_dev *pci_dev)
++{
++      int retval;
++
+       /* if the device was enabled before suspend, reenable */
+       retval = pci_reenable_device(pci_dev);
+       /*
+@@ -358,10 +374,12 @@ static int pci_legacy_resume(struct device *dev)
+       struct pci_dev * pci_dev = to_pci_dev(dev);
+       struct pci_driver * drv = pci_dev->driver;
+-      if (drv && drv->resume)
++      if (drv && drv->resume) {
+               error = drv->resume(pci_dev);
+-      else
+-              error = pci_default_pm_resume(pci_dev);
++      } else {
++              pci_default_pm_resume_early(pci_dev);
++              error = pci_default_pm_resume_late(pci_dev);
++      }
+       return error;
+ }
+@@ -407,10 +425,8 @@ static int pci_pm_suspend(struct device *dev)
+               if (drv->pm->suspend) {
+                       error = drv->pm->suspend(dev);
+                       suspend_report_result(drv->pm->suspend, error);
+-              } else {
+-                      pci_default_pm_suspend(pci_dev);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_suspend(dev, PMSG_SUSPEND);
+       }
+       pci_fixup_device(pci_fixup_suspend, pci_dev);
+@@ -429,8 +445,10 @@ static int pci_pm_suspend_noirq(struct device *dev)
+                       error = drv->pm->suspend_noirq(dev);
+                       suspend_report_result(drv->pm->suspend_noirq, error);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_suspend_late(dev, PMSG_SUSPEND);
++      } else {
++              pci_default_pm_suspend(pci_dev);
+       }
+       return error;
+@@ -440,15 +458,17 @@ static int pci_pm_resume(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+-      int error;
++      int error = 0;
+       pci_fixup_device(pci_fixup_resume, pci_dev);
+       if (drv && drv->pm) {
+-              error = drv->pm->resume ? drv->pm->resume(dev) :
+-                      pci_default_pm_resume(pci_dev);
+-      } else {
++              if (drv->pm->resume)
++                      error = drv->pm->resume(dev);
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_resume(dev);
++      } else {
++              error = pci_default_pm_resume_late(pci_dev);
+       }
+       return error;
+@@ -465,8 +485,10 @@ static int pci_pm_resume_noirq(struct device *dev)
+       if (drv && drv->pm) {
+               if (drv->pm->resume_noirq)
+                       error = drv->pm->resume_noirq(dev);
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_resume_early(dev);
++      } else {
++              pci_default_pm_resume_early(pci_dev);
+       }
+       return error;
+@@ -493,10 +515,8 @@ static int pci_pm_freeze(struct device *dev)
+               if (drv->pm->freeze) {
+                       error = drv->pm->freeze(dev);
+                       suspend_report_result(drv->pm->freeze, error);
+-              } else {
+-                      pci_default_pm_suspend(pci_dev);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_suspend(dev, PMSG_FREEZE);
+               pci_fixup_device(pci_fixup_suspend, pci_dev);
+       }
+@@ -515,8 +535,10 @@ static int pci_pm_freeze_noirq(struct device *dev)
+                       error = drv->pm->freeze_noirq(dev);
+                       suspend_report_result(drv->pm->freeze_noirq, error);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_suspend_late(dev, PMSG_FREEZE);
++      } else {
++              pci_default_pm_suspend(pci_dev);
+       }
+       return error;
+@@ -524,14 +546,15 @@ static int pci_pm_freeze_noirq(struct device *dev)
+ static int pci_pm_thaw(struct device *dev)
+ {
++      struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+       if (drv && drv->pm) {
+               if (drv->pm->thaw)
+                       error =  drv->pm->thaw(dev);
+-      } else {
+-              pci_fixup_device(pci_fixup_resume, to_pci_dev(dev));
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
++              pci_fixup_device(pci_fixup_resume, pci_dev);
+               error = pci_legacy_resume(dev);
+       }
+@@ -547,7 +570,7 @@ static int pci_pm_thaw_noirq(struct device *dev)
+       if (drv && drv->pm) {
+               if (drv->pm->thaw_noirq)
+                       error = drv->pm->thaw_noirq(dev);
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               pci_fixup_device(pci_fixup_resume_early, pci_dev);
+               error = pci_legacy_resume_early(dev);
+       }
+@@ -557,17 +580,18 @@ static int pci_pm_thaw_noirq(struct device *dev)
+ static int pci_pm_poweroff(struct device *dev)
+ {
++      struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+       int error = 0;
+-      pci_fixup_device(pci_fixup_suspend, to_pci_dev(dev));
++      pci_fixup_device(pci_fixup_suspend, pci_dev);
+       if (drv && drv->pm) {
+               if (drv->pm->poweroff) {
+                       error = drv->pm->poweroff(dev);
+                       suspend_report_result(drv->pm->poweroff, error);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_suspend(dev, PMSG_HIBERNATE);
+       }
+@@ -585,7 +609,7 @@ static int pci_pm_poweroff_noirq(struct device *dev)
+                       error = drv->pm->poweroff_noirq(dev);
+                       suspend_report_result(drv->pm->poweroff_noirq, error);
+               }
+-      } else {
++      } else if (pci_has_legacy_pm_support(to_pci_dev(dev))) {
+               error = pci_legacy_suspend_late(dev, PMSG_HIBERNATE);
+       }
+@@ -596,13 +620,15 @@ static int pci_pm_restore(struct device *dev)
+ {
+       struct pci_dev *pci_dev = to_pci_dev(dev);
+       struct device_driver *drv = dev->driver;
+-      int error;
++      int error = 0;
+       if (drv && drv->pm) {
+-              error = drv->pm->restore ? drv->pm->restore(dev) :
+-                      pci_default_pm_resume(pci_dev);
+-      } else {
++              if (drv->pm->restore)
++                      error = drv->pm->restore(dev);
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_resume(dev);
++      } else {
++              error = pci_default_pm_resume_late(pci_dev);
+       }
+       pci_fixup_device(pci_fixup_resume, pci_dev);
+@@ -620,8 +646,10 @@ static int pci_pm_restore_noirq(struct device *dev)
+       if (drv && drv->pm) {
+               if (drv->pm->restore_noirq)
+                       error = drv->pm->restore_noirq(dev);
+-      } else {
++      } else if (pci_has_legacy_pm_support(pci_dev)) {
+               error = pci_legacy_resume_early(dev);
++      } else {
++              pci_default_pm_resume_early(pci_dev);
+       }
+       pci_fixup_device(pci_fixup_resume_early, pci_dev);
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index c9884bb..409e00e 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -636,19 +636,14 @@ static int pci_save_pcie_state(struct pci_dev *dev)
+       int pos, i = 0;
+       struct pci_cap_saved_state *save_state;
+       u16 *cap;
+-      int found = 0;
+       pos = pci_find_capability(dev, PCI_CAP_ID_EXP);
+       if (pos <= 0)
+               return 0;
+       save_state = pci_find_saved_cap(dev, PCI_CAP_ID_EXP);
+-      if (!save_state)
+-              save_state = kzalloc(sizeof(*save_state) + sizeof(u16) * 4, GFP_KERNEL);
+-      else
+-              found = 1;
+       if (!save_state) {
+-              dev_err(&dev->dev, "out of memory in pci_save_pcie_state\n");
++              dev_err(&dev->dev, "buffer not found in %s\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+       cap = (u16 *)&save_state->data[0];
+@@ -657,9 +652,7 @@ static int pci_save_pcie_state(struct pci_dev *dev)
+       pci_read_config_word(dev, pos + PCI_EXP_LNKCTL, &cap[i++]);
+       pci_read_config_word(dev, pos + PCI_EXP_SLTCTL, &cap[i++]);
+       pci_read_config_word(dev, pos + PCI_EXP_RTCTL, &cap[i++]);
+-      save_state->cap_nr = PCI_CAP_ID_EXP;
+-      if (!found)
+-              pci_add_saved_cap(dev, save_state);
++
+       return 0;
+ }
+@@ -684,30 +677,21 @@ static void pci_restore_pcie_state(struct pci_dev *dev)
+ static int pci_save_pcix_state(struct pci_dev *dev)
+ {
+-      int pos, i = 0;
++      int pos;
+       struct pci_cap_saved_state *save_state;
+-      u16 *cap;
+-      int found = 0;
+       pos = pci_find_capability(dev, PCI_CAP_ID_PCIX);
+       if (pos <= 0)
+               return 0;
+       save_state = pci_find_saved_cap(dev, PCI_CAP_ID_PCIX);
+-      if (!save_state)
+-              save_state = kzalloc(sizeof(*save_state) + sizeof(u16), GFP_KERNEL);
+-      else
+-              found = 1;
+       if (!save_state) {
+-              dev_err(&dev->dev, "out of memory in pci_save_pcie_state\n");
++              dev_err(&dev->dev, "buffer not found in %s\n", __FUNCTION__);
+               return -ENOMEM;
+       }
+-      cap = (u16 *)&save_state->data[0];
+-      pci_read_config_word(dev, pos + PCI_X_CMD, &cap[i++]);
+-      save_state->cap_nr = PCI_CAP_ID_PCIX;
+-      if (!found)
+-              pci_add_saved_cap(dev, save_state);
++      pci_read_config_word(dev, pos + PCI_X_CMD, (u16 *)save_state->data);
++
+       return 0;
+ }
+@@ -726,6 +710,50 @@ static void pci_restore_pcix_state(struct pci_dev *dev)
+       pci_write_config_word(dev, pos + PCI_X_CMD, cap[i++]);
+ }
++ /**
++ * pci_add_save_buffer - allocate buffer for saving given capability registers
++ * @dev: the PCI device
++ * @cap: the capability to allocate the buffer for
++ * @size: requested size of the buffer
++ */
++static int pci_add_cap_save_buffer(
++      struct pci_dev *dev, char cap, unsigned int size)
++{
++      int pos;
++      struct pci_cap_saved_state *save_state;
++
++      pos = pci_find_capability(dev, cap);
++      if (pos <= 0)
++              return 0;
++
++      save_state = kzalloc(sizeof(*save_state) + size, GFP_KERNEL);
++      if (!save_state)
++              return -ENOMEM;
++
++      save_state->cap_nr = cap;
++      pci_add_saved_cap(dev, save_state);
++
++      return 0;
++}
++
++/**
++ * pci_allocate_cap_save_buffers - allocate buffers for saving capabilities
++ * @dev: the PCI device
++ */
++void pci_allocate_cap_save_buffers(struct pci_dev *dev)
++{
++      int error;
++
++      error = pci_add_cap_save_buffer(dev, PCI_CAP_ID_EXP, 4 * sizeof(u16));
++      if (error)
++              dev_err(&dev->dev,
++                      "unable to preallocate PCI Express save buffer\n");
++
++      error = pci_add_cap_save_buffer(dev, PCI_CAP_ID_PCIX, sizeof(u16));
++      if (error)
++              dev_err(&dev->dev,
++                      "unable to preallocate PCI-X save buffer\n");
++}
+ /**
+  * pci_save_state - save the PCI configuration space of a device before suspending
+diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
+index d807cd7..7b1efe9 100644
+--- a/drivers/pci/pci.h
++++ b/drivers/pci/pci.h
+@@ -35,6 +35,7 @@ struct pci_platform_pm_ops {
+ extern int pci_set_platform_pm(struct pci_platform_pm_ops *ops);
+ extern void pci_pm_init(struct pci_dev *dev);
++extern void pci_allocate_cap_save_buffers(struct pci_dev *dev);
+ extern int pci_user_read_config_byte(struct pci_dev *dev, int where, u8 *val);
+ extern int pci_user_read_config_word(struct pci_dev *dev, int where, u16 *val);
+diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
+index 367c9c2..6abfafc 100644
+--- a/drivers/pci/pcie/portdrv_pci.c
++++ b/drivers/pci/pcie/portdrv_pci.c
+@@ -41,7 +41,6 @@ static int pcie_portdrv_restore_config(struct pci_dev *dev)
+ {
+       int retval;
+-      pci_restore_state(dev);
+       retval = pci_enable_device(dev);
+       if (retval)
+               return retval;
+@@ -52,11 +51,18 @@ static int pcie_portdrv_restore_config(struct pci_dev *dev)
+ #ifdef CONFIG_PM
+ static int pcie_portdrv_suspend(struct pci_dev *dev, pm_message_t state)
+ {
+-      int ret = pcie_port_device_suspend(dev, state);
++      return pcie_port_device_suspend(dev, state);
+-      if (!ret)
+-              ret = pcie_portdrv_save_config(dev);
+-      return ret;
++}
++
++static int pcie_portdrv_suspend_late(struct pci_dev *dev, pm_message_t state)
++{
++      return pci_save_state(dev);
++}
++
++static int pcie_portdrv_resume_early(struct pci_dev *dev)
++{
++      return pci_restore_state(dev);
+ }
+ static int pcie_portdrv_resume(struct pci_dev *dev)
+@@ -66,6 +72,8 @@ static int pcie_portdrv_resume(struct pci_dev *dev)
+ }
+ #else
+ #define pcie_portdrv_suspend NULL
++#define pcie_portdrv_suspend_late NULL
++#define pcie_portdrv_resume_early NULL
+ #define pcie_portdrv_resume NULL
+ #endif
+@@ -221,6 +229,7 @@ static pci_ers_result_t pcie_portdrv_slot_reset(struct pci_dev *dev)
+       /* If fatal, restore cfg space for possible link reset at upstream */
+       if (dev->error_state == pci_channel_io_frozen) {
++              pci_restore_state(dev);
+               pcie_portdrv_restore_config(dev);
+               pci_enable_pcie_error_reporting(dev);
+       }
+@@ -283,6 +292,8 @@ static struct pci_driver pcie_portdriver = {
+       .remove         = pcie_portdrv_remove,
+       .suspend        = pcie_portdrv_suspend,
++      .suspend_late   = pcie_portdrv_suspend_late,
++      .resume_early   = pcie_portdrv_resume_early,
+       .resume         = pcie_portdrv_resume,
+       .err_handler    = &pcie_portdrv_err_handler,
+diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
+index bcafbd6..eb6c8d1 100644
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -1028,6 +1028,9 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
+       /* Fix up broken headers */
+       pci_fixup_device(pci_fixup_header, dev);
++      /* Buffers for saving PCIe and PCI-X capabilities */
++      pci_allocate_cap_save_buffers(dev);
++
+       /* Initialize power management of the device */
+       pci_pm_init(dev);
+diff --git a/drivers/pci/syscall.c b/drivers/pci/syscall.c
+index 645d7a6..ec22284 100644
+--- a/drivers/pci/syscall.c
++++ b/drivers/pci/syscall.c
+@@ -14,10 +14,8 @@
+ #include <asm/uaccess.h>
+ #include "pci.h"
+-asmlinkage long
+-sys_pciconfig_read(unsigned long bus, unsigned long dfn,
+-                 unsigned long off, unsigned long len,
+-                 void __user *buf)
++SYSCALL_DEFINE5(pciconfig_read, unsigned long, bus, unsigned long, dfn,
++              unsigned long, off, unsigned long, len, void __user *, buf)
+ {
+       struct pci_dev *dev;
+       u8 byte;
+@@ -86,10 +84,8 @@ error:
+       return err;
+ }
+-asmlinkage long
+-sys_pciconfig_write(unsigned long bus, unsigned long dfn,
+-                  unsigned long off, unsigned long len,
+-                  void __user *buf)
++SYSCALL_DEFINE5(pciconfig_write, unsigned long, bus, unsigned long, dfn,
++              unsigned long, off, unsigned long, len, void __user *, buf)
+ {
+       struct pci_dev *dev;
+       u8 byte;
+diff --git a/drivers/scsi/eata.c b/drivers/scsi/eata.c
+index a73a6bb..976cdd5 100644
+--- a/drivers/scsi/eata.c
++++ b/drivers/scsi/eata.c
+@@ -1626,8 +1626,15 @@ static void map_dma(unsigned int i, struct hostdata *ha)
+       cpp->sense_len = SCSI_SENSE_BUFFERSIZE;
+-      count = scsi_dma_map(SCpnt);
+-      BUG_ON(count < 0);
++      if (!scsi_sg_count(SCpnt)) {
++              cpp->data_len = 0;
++              return;
++      }
++
++      count = pci_map_sg(ha->pdev, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
++                         pci_dir);
++      BUG_ON(!count);
++
+       scsi_for_each_sg(SCpnt, sg, count, k) {
+               cpp->sglist[k].address = H2DEV(sg_dma_address(sg));
+               cpp->sglist[k].num_bytes = H2DEV(sg_dma_len(sg));
+@@ -1655,7 +1662,9 @@ static void unmap_dma(unsigned int i, struct hostdata *ha)
+               pci_unmap_single(ha->pdev, DEV2H(cpp->sense_addr),
+                                DEV2H(cpp->sense_len), PCI_DMA_FROMDEVICE);
+-      scsi_dma_unmap(SCpnt);
++      if (scsi_sg_count(SCpnt))
++              pci_unmap_sg(ha->pdev, scsi_sglist(SCpnt), scsi_sg_count(SCpnt),
++                           pci_dir);
+       if (!DEV2H(cpp->data_len))
+               pci_dir = PCI_DMA_BIDIRECTIONAL;
+diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
+index 4e0b7c8..2f114b4 100644
+--- a/drivers/scsi/ibmvscsi/ibmvfc.c
++++ b/drivers/scsi/ibmvscsi/ibmvfc.c
+@@ -566,7 +566,7 @@ static void ibmvfc_init_host(struct ibmvfc_host *vhost, int relogin)
+       struct ibmvfc_target *tgt;
+       if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
+-              if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
++              if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
+                       dev_err(vhost->dev,
+                               "Host initialization retries exceeded. Taking adapter offline\n");
+                       ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
+@@ -847,11 +847,12 @@ static void ibmvfc_reset_host(struct ibmvfc_host *vhost)
+ static void ibmvfc_retry_host_init(struct ibmvfc_host *vhost)
+ {
+       if (vhost->action == IBMVFC_HOST_ACTION_INIT_WAIT) {
+-              if (++vhost->init_retries > IBMVFC_MAX_INIT_RETRIES) {
++              vhost->delay_init = 1;
++              if (++vhost->init_retries > IBMVFC_MAX_HOST_INIT_RETRIES) {
+                       dev_err(vhost->dev,
+                               "Host initialization retries exceeded. Taking adapter offline\n");
+                       ibmvfc_link_down(vhost, IBMVFC_HOST_OFFLINE);
+-              } else if (vhost->init_retries == IBMVFC_MAX_INIT_RETRIES)
++              } else if (vhost->init_retries == IBMVFC_MAX_HOST_INIT_RETRIES)
+                       __ibmvfc_reset_host(vhost);
+               else
+                       ibmvfc_set_host_action(vhost, IBMVFC_HOST_ACTION_INIT);
+@@ -2091,15 +2092,17 @@ static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
+       case IBMVFC_AE_LINK_UP:
+       case IBMVFC_AE_RESUME:
+               vhost->events_to_log |= IBMVFC_AE_LINKUP;
+-              ibmvfc_init_host(vhost, 1);
++              vhost->delay_init = 1;
++              __ibmvfc_reset_host(vhost);
+               break;
+       case IBMVFC_AE_SCN_FABRIC:
++      case IBMVFC_AE_SCN_DOMAIN:
+               vhost->events_to_log |= IBMVFC_AE_RSCN;
+-              ibmvfc_init_host(vhost, 1);
++              vhost->delay_init = 1;
++              __ibmvfc_reset_host(vhost);
+               break;
+       case IBMVFC_AE_SCN_NPORT:
+       case IBMVFC_AE_SCN_GROUP:
+-      case IBMVFC_AE_SCN_DOMAIN:
+               vhost->events_to_log |= IBMVFC_AE_RSCN;
+       case IBMVFC_AE_ELS_LOGO:
+       case IBMVFC_AE_ELS_PRLO:
+@@ -2671,7 +2674,7 @@ static void ibmvfc_init_tgt(struct ibmvfc_target *tgt,
+ static void ibmvfc_retry_tgt_init(struct ibmvfc_target *tgt,
+                                 void (*job_step) (struct ibmvfc_target *))
+ {
+-      if (++tgt->init_retries > IBMVFC_MAX_INIT_RETRIES) {
++      if (++tgt->init_retries > IBMVFC_MAX_TGT_INIT_RETRIES) {
+               ibmvfc_set_tgt_action(tgt, IBMVFC_TGT_ACTION_DEL_RPORT);
+               wake_up(&tgt->vhost->work_wait_q);
+       } else
+@@ -3521,7 +3524,13 @@ static void ibmvfc_do_work(struct ibmvfc_host *vhost)
+               break;
+       case IBMVFC_HOST_ACTION_INIT:
+               BUG_ON(vhost->state != IBMVFC_INITIALIZING);
+-              vhost->job_step(vhost);
++              if (vhost->delay_init) {
++                      vhost->delay_init = 0;
++                      spin_unlock_irqrestore(vhost->host->host_lock, flags);
++                      ssleep(15);
++                      return;
++              } else
++                      vhost->job_step(vhost);
+               break;
+       case IBMVFC_HOST_ACTION_QUERY:
+               list_for_each_entry(tgt, &vhost->targets, queue)
+diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
+index fb3177a..d0e76d5 100644
+--- a/drivers/scsi/ibmvscsi/ibmvfc.h
++++ b/drivers/scsi/ibmvscsi/ibmvfc.h
+@@ -33,7 +33,7 @@
+ #define IBMVFC_DRIVER_DATE            "(August 14, 2008)"
+ #define IBMVFC_DEFAULT_TIMEOUT        15
+-#define IBMVFC_INIT_TIMEOUT           30
++#define IBMVFC_INIT_TIMEOUT           120
+ #define IBMVFC_MAX_REQUESTS_DEFAULT   100
+ #define IBMVFC_DEBUG                  0
+@@ -43,7 +43,8 @@
+ #define IBMVFC_MAX_DISC_THREADS       4
+ #define IBMVFC_TGT_MEMPOOL_SZ         64
+ #define IBMVFC_MAX_CMDS_PER_LUN       64
+-#define IBMVFC_MAX_INIT_RETRIES       3
++#define IBMVFC_MAX_HOST_INIT_RETRIES  6
++#define IBMVFC_MAX_TGT_INIT_RETRIES           3
+ #define IBMVFC_DEV_LOSS_TMO           (5 * 60)
+ #define IBMVFC_DEFAULT_LOG_LEVEL      2
+ #define IBMVFC_MAX_CDB_LEN            16
+@@ -671,6 +672,7 @@ struct ibmvfc_host {
+       int discovery_threads;
+       int client_migrated;
+       int reinit;
++      int delay_init;
+       int events_to_log;
+ #define IBMVFC_AE_LINKUP      0x0001
+ #define IBMVFC_AE_LINKDOWN    0x0002
+diff --git a/drivers/scsi/mvsas.c b/drivers/scsi/mvsas.c
+index 1dd70d7..23e5a87 100644
+--- a/drivers/scsi/mvsas.c
++++ b/drivers/scsi/mvsas.c
+@@ -2959,7 +2959,7 @@ static int __devinit mvs_hw_init(struct mvs_info *mvi)
+       /* enable auto port detection */
+       mw32(GBL_PORT_TYPE, MODE_AUTO_DET_EN);
+-      msleep(100);
++      msleep(1100);
+       /* init and reset phys */
+       for (i = 0; i < mvi->chip->n_phy; i++) {
+               u32 lo = be32_to_cpu(*(u32 *)&mvi->sas_addr[4]);
+diff --git a/drivers/scsi/pcmcia/aha152x_stub.c b/drivers/scsi/pcmcia/aha152x_stub.c
+index 2dd0dc9..c2e2de3 100644
+--- a/drivers/scsi/pcmcia/aha152x_stub.c
++++ b/drivers/scsi/pcmcia/aha152x_stub.c
+@@ -114,7 +114,7 @@ static int aha152x_probe(struct pcmcia_device *link)
+     link->io.NumPorts1 = 0x20;
+     link->io.Attributes1 = IO_DATA_PATH_WIDTH_AUTO;
+     link->io.IOAddrLines = 10;
+-    link->irq.Attributes = IRQ_TYPE_EXCLUSIVE;
++    link->irq.Attributes = IRQ_TYPE_DYNAMIC_SHARING;
+     link->irq.IRQInfo1 = IRQ_LEVEL_ID;
+     link->conf.Attributes = CONF_ENABLE_IRQ;
+     link->conf.IntType = INT_MEMORY_AND_IO;
+diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c
+index 78b8aaa..d8b0ba5 100644
+--- a/drivers/usb/host/isp1760-if.c
++++ b/drivers/usb/host/isp1760-if.c
+@@ -267,12 +267,16 @@ static void isp1761_pci_shutdown(struct pci_dev *dev)
+       printk(KERN_ERR "ips1761_pci_shutdown\n");
+ }
+-static const struct pci_device_id isp1760_plx [] = { {
+-      /* handle any USB 2.0 EHCI controller */
+-      PCI_DEVICE_CLASS(((PCI_CLASS_BRIDGE_OTHER << 8) | (0x06 << 16)), ~0),
+-              .driver_data = 0,
+-},
+-{ /* end: all zeroes */ }
++static const struct pci_device_id isp1760_plx [] = {
++      {
++              .class          = PCI_CLASS_BRIDGE_OTHER << 8,
++              .class_mask     = ~0,
++              .vendor         = PCI_VENDOR_ID_PLX,
++              .device         = 0x5406,
++              .subvendor      = PCI_VENDOR_ID_PLX,
++              .subdevice      = 0x9054,
++      },
++      { }
+ };
+ MODULE_DEVICE_TABLE(pci, isp1760_plx);
+diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c
+index 4b994a0..5cae8fd 100644
+--- a/drivers/usb/misc/emi26.c
++++ b/drivers/usb/misc/emi26.c
+@@ -157,7 +157,7 @@ static int emi26_load_firmware (struct usb_device *dev)
+                       err("%s - error loading firmware: error = %d", __func__, err);
+                       goto wraperr;
+               }
+-      } while (i > 0);
++      } while (rec);
+       /* Assert reset (stop the CPU in the EMI) */
+       err = emi26_set_reset(dev,1);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index e16d547..476da5d 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -246,6 +246,13 @@ UNUSUAL_DEV(  0x0421, 0x04b9, 0x0500, 0x0551,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
++/* Reported by Paulo Fessel <pfessel@gmail.com> */
++UNUSUAL_DEV(  0x0421, 0x04bd, 0x0000, 0x9999,
++              "Nokia",
++              "5200",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY ),
++
+ /* Reported by Richard Nauber <RichardNauber@web.de> */
+ UNUSUAL_DEV(  0x0421, 0x04fa, 0x0550, 0x0660,
+               "Nokia",
+@@ -1040,7 +1047,7 @@ UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100,
+               US_FL_FIX_CAPACITY | US_FL_GO_SLOW ),
+ /* Reported by Alex Butcher <alex.butcher@assursys.co.uk> */
+-UNUSUAL_DEV( 0x067b, 0x3507, 0x0001, 0x0001,
++UNUSUAL_DEV( 0x067b, 0x3507, 0x0001, 0x0101,
+               "Prolific Technology Inc.",
+               "ATAPI-6 Bridge Controller",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -1320,6 +1327,13 @@ UNUSUAL_DEV( 0x0840, 0x0082, 0x0001, 0x0001,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY),
++/* Reported and patched by Nguyen Anh Quynh <aquynh@gmail.com> */
++UNUSUAL_DEV( 0x0840, 0x0084, 0x0001, 0x0001,
++              "Argosy",
++              "Storage",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY),
++
+ /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
+  * Flag will support Bulk devices which use a standards-violating 32-byte
+  * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with
+@@ -1425,6 +1439,13 @@ UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_INQUIRY ),
++/* Reported by Jaak Ristioja <Ristioja@gmail.com> */
++UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100,
++              "Pentax",
++              "K10D",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY ),
++
+ /* These are virtual windows driver CDs, which the zd1211rw driver
+  * automatically converts into WLAN devices. */
+ UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
+diff --git a/fs/affs/file.c b/fs/affs/file.c
+index 1377b12..9246cb4 100644
+--- a/fs/affs/file.c
++++ b/fs/affs/file.c
+@@ -628,7 +628,7 @@ static int affs_write_begin_ofs(struct file *file, struct address_space *mapping
+       }
+       index = pos >> PAGE_CACHE_SHIFT;
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+diff --git a/fs/aio.c b/fs/aio.c
+index f658441..048648d 100644
+--- a/fs/aio.c
++++ b/fs/aio.c
+@@ -1258,7 +1258,7 @@ static void io_destroy(struct kioctx *ioctx)
+  *    pointer is passed for ctxp.  Will fail with -ENOSYS if not
+  *    implemented.
+  */
+-asmlinkage long sys_io_setup(unsigned nr_events, aio_context_t __user *ctxp)
++SYSCALL_DEFINE2(io_setup, unsigned, nr_events, aio_context_t __user *, ctxp)
+ {
+       struct kioctx *ioctx = NULL;
+       unsigned long ctx;
+@@ -1296,7 +1296,7 @@ out:
+  *    implemented.  May fail with -EFAULT if the context pointed to
+  *    is invalid.
+  */
+-asmlinkage long sys_io_destroy(aio_context_t ctx)
++SYSCALL_DEFINE1(io_destroy, aio_context_t, ctx)
+ {
+       struct kioctx *ioctx = lookup_ioctx(ctx);
+       if (likely(NULL != ioctx)) {
+@@ -1650,8 +1650,8 @@ out_put_req:
+  *    are available to queue any iocbs.  Will return 0 if nr is 0.  Will
+  *    fail with -ENOSYS if not implemented.
+  */
+-asmlinkage long sys_io_submit(aio_context_t ctx_id, long nr,
+-                            struct iocb __user * __user *iocbpp)
++SYSCALL_DEFINE3(io_submit, aio_context_t, ctx_id, long, nr,
++              struct iocb __user * __user *, iocbpp)
+ {
+       struct kioctx *ctx;
+       long ret = 0;
+@@ -1725,8 +1725,8 @@ static struct kiocb *lookup_kiocb(struct kioctx *ctx, struct iocb __user *iocb,
+  *    invalid.  May fail with -EAGAIN if the iocb specified was not
+  *    cancelled.  Will fail with -ENOSYS if not implemented.
+  */
+-asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
+-                            struct io_event __user *result)
++SYSCALL_DEFINE3(io_cancel, aio_context_t, ctx_id, struct iocb __user *, iocb,
++              struct io_event __user *, result)
+ {
+       int (*cancel)(struct kiocb *iocb, struct io_event *res);
+       struct kioctx *ctx;
+@@ -1787,11 +1787,11 @@ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
+  *    will be updated if not NULL and the operation blocks.  Will fail
+  *    with -ENOSYS if not implemented.
+  */
+-asmlinkage long sys_io_getevents(aio_context_t ctx_id,
+-                               long min_nr,
+-                               long nr,
+-                               struct io_event __user *events,
+-                               struct timespec __user *timeout)
++SYSCALL_DEFINE5(io_getevents, aio_context_t, ctx_id,
++              long, min_nr,
++              long, nr,
++              struct io_event __user *, events,
++              struct timespec __user *, timeout)
+ {
+       struct kioctx *ioctx = lookup_ioctx(ctx_id);
+       long ret = -EINVAL;
+diff --git a/fs/buffer.c b/fs/buffer.c
+index ac78d4c..a542f97 100644
+--- a/fs/buffer.c
++++ b/fs/buffer.c
+@@ -1988,7 +1988,7 @@ int block_write_begin(struct file *file, struct address_space *mapping,
+       page = *pagep;
+       if (page == NULL) {
+               ownpage = 1;
+-              page = __grab_cache_page(mapping, index);
++              page = grab_cache_page_write_begin(mapping, index, flags);
+               if (!page) {
+                       status = -ENOMEM;
+                       goto out;
+@@ -2494,7 +2494,7 @@ int nobh_write_begin(struct file *file, struct address_space *mapping,
+       from = pos & (PAGE_CACHE_SIZE - 1);
+       to = from + len;
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+@@ -3177,7 +3177,7 @@ void block_sync_page(struct page *page)
+  * Use of bdflush() is deprecated and will be removed in a future kernel.
+  * The `pdflush' kernel threads fully replace bdflush daemons and this call.
+  */
+-asmlinkage long sys_bdflush(int func, long data)
++SYSCALL_DEFINE2(bdflush, int, func, long, data)
+ {
+       static int msg_count;
+diff --git a/fs/compat.c b/fs/compat.c
+index 075d050..a76455b 100644
+--- a/fs/compat.c
++++ b/fs/compat.c
+@@ -1640,7 +1640,7 @@ sticky:
+ }
+ #ifdef HAVE_SET_RESTORE_SIGMASK
+-asmlinkage long compat_sys_pselect7(int n, compat_ulong_t __user *inp,
++static long do_compat_pselect(int n, compat_ulong_t __user *inp,
+       compat_ulong_t __user *outp, compat_ulong_t __user *exp,
+       struct compat_timespec __user *tsp, compat_sigset_t __user *sigmask,
+       compat_size_t sigsetsize)
+@@ -1748,8 +1748,8 @@ asmlinkage long compat_sys_pselect6(int n, compat_ulong_t __user *inp,
+                               (compat_size_t __user *)(sig+sizeof(up))))
+                       return -EFAULT;
+       }
+-      return compat_sys_pselect7(n, inp, outp, exp, tsp, compat_ptr(up),
+-                                      sigsetsize);
++      return do_compat_pselect(n, inp, outp, exp, tsp, compat_ptr(up),
++                               sigsetsize);
+ }
+ asmlinkage long compat_sys_ppoll(struct pollfd __user *ufds,
+diff --git a/fs/dcache.c b/fs/dcache.c
+index e7a1a99..1c12fcc 100644
+--- a/fs/dcache.c
++++ b/fs/dcache.c
+@@ -1615,8 +1615,11 @@ static void switch_names(struct dentry *dentry, struct dentry *target)
+                        */
+                       memcpy(dentry->d_iname, target->d_name.name,
+                                       target->d_name.len + 1);
++                      dentry->d_name.len = target->d_name.len;
++                      return;
+               }
+       }
++      do_switch(dentry->d_name.len, target->d_name.len);
+ }
+ /*
+@@ -1676,7 +1679,6 @@ already_unhashed:
+       /* Switch the names.. */
+       switch_names(dentry, target);
+-      do_switch(dentry->d_name.len, target->d_name.len);
+       do_switch(dentry->d_name.hash, target->d_name.hash);
+       /* ... and switch the parents */
+@@ -1781,7 +1783,6 @@ static void __d_materialise_dentry(struct dentry *dentry, struct dentry *anon)
+       struct dentry *dparent, *aparent;
+       switch_names(dentry, anon);
+-      do_switch(dentry->d_name.len, anon->d_name.len);
+       do_switch(dentry->d_name.hash, anon->d_name.hash);
+       dparent = dentry->d_parent;
+@@ -2085,7 +2086,7 @@ Elong:
+  *            return NULL;
+  *    }
+  */
+-asmlinkage long sys_getcwd(char __user *buf, unsigned long size)
++SYSCALL_DEFINE2(getcwd, char __user *, buf, unsigned long, size)
+ {
+       int error;
+       struct path pwd, root;
+diff --git a/fs/dcookies.c b/fs/dcookies.c
+index 855d4b1..f0da95b 100644
+--- a/fs/dcookies.c
++++ b/fs/dcookies.c
+@@ -140,7 +140,7 @@ out:
+ /* And here is where the userspace process can look up the cookie value
+  * to retrieve the path.
+  */
+-asmlinkage long sys_lookup_dcookie(u64 cookie64, char __user * buf, size_t len)
++SYSCALL_DEFINE(lookup_dcookie)(u64 cookie64, char __user * buf, size_t len)
+ {
+       unsigned long cookie = (unsigned long)cookie64;
+       int err = -EINVAL;
+@@ -193,7 +193,13 @@ out:
+       mutex_unlock(&dcookie_mutex);
+       return err;
+ }
+-
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_lookup_dcookie(u64 cookie64, long buf, long len)
++{
++      return SYSC_lookup_dcookie(cookie64, (char __user *) buf, (size_t) len);
++}
++SYSCALL_ALIAS(sys_lookup_dcookie, SyS_lookup_dcookie);
++#endif
+ static int dcookie_init(void)
+ {
+diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
+index 89209f0..5e78fc1 100644
+--- a/fs/ecryptfs/inode.c
++++ b/fs/ecryptfs/inode.c
+@@ -673,10 +673,11 @@ static void *ecryptfs_follow_link(struct dentry *dentry, struct nameidata *nd)
+       ecryptfs_printk(KERN_DEBUG, "Calling readlink w/ "
+                       "dentry->d_name.name = [%s]\n", dentry->d_name.name);
+       rc = dentry->d_inode->i_op->readlink(dentry, (char __user *)buf, len);
+-      buf[rc] = '\0';
+       set_fs(old_fs);
+       if (rc < 0)
+               goto out_free;
++      else
++              buf[rc] = '\0';
+       rc = 0;
+       nd_set_link(nd, buf);
+       goto out;
+diff --git a/fs/eventfd.c b/fs/eventfd.c
+index 08bf558..5de2c2d 100644
+--- a/fs/eventfd.c
++++ b/fs/eventfd.c
+@@ -198,7 +198,7 @@ struct file *eventfd_fget(int fd)
+       return file;
+ }
+-asmlinkage long sys_eventfd2(unsigned int count, int flags)
++SYSCALL_DEFINE2(eventfd2, unsigned int, count, int, flags)
+ {
+       int fd;
+       struct eventfd_ctx *ctx;
+@@ -228,8 +228,7 @@ asmlinkage long sys_eventfd2(unsigned int count, int flags)
+       return fd;
+ }
+-asmlinkage long sys_eventfd(unsigned int count)
++SYSCALL_DEFINE1(eventfd, unsigned int, count)
+ {
+       return sys_eventfd2(count, 0);
+ }
+-
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index c8cec49..cb60f92 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -1106,7 +1106,7 @@ retry:
+ /*
+  * Open an eventpoll file descriptor.
+  */
+-asmlinkage long sys_epoll_create1(int flags)
++SYSCALL_DEFINE1(epoll_create1, int, flags)
+ {
+       int error, fd = -1;
+       struct eventpoll *ep;
+@@ -1146,7 +1146,7 @@ error_return:
+       return fd;
+ }
+-asmlinkage long sys_epoll_create(int size)
++SYSCALL_DEFINE1(epoll_create, int, size)
+ {
+       if (size < 0)
+               return -EINVAL;
+@@ -1159,8 +1159,8 @@ asmlinkage long sys_epoll_create(int size)
+  * the eventpoll file that enables the insertion/removal/change of
+  * file descriptors inside the interest set.
+  */
+-asmlinkage long sys_epoll_ctl(int epfd, int op, int fd,
+-                            struct epoll_event __user *event)
++SYSCALL_DEFINE4(epoll_ctl, int, epfd, int, op, int, fd,
++              struct epoll_event __user *, event)
+ {
+       int error;
+       struct file *file, *tfile;
+@@ -1257,8 +1257,8 @@ error_return:
+  * Implement the event wait interface for the eventpoll file. It is the kernel
+  * part of the user space epoll_wait(2).
+  */
+-asmlinkage long sys_epoll_wait(int epfd, struct epoll_event __user *events,
+-                             int maxevents, int timeout)
++SYSCALL_DEFINE4(epoll_wait, int, epfd, struct epoll_event __user *, events,
++              int, maxevents, int, timeout)
+ {
+       int error;
+       struct file *file;
+@@ -1315,9 +1315,9 @@ error_return:
+  * Implement the event wait interface for the eventpoll file. It is the kernel
+  * part of the user space epoll_pwait(2).
+  */
+-asmlinkage long sys_epoll_pwait(int epfd, struct epoll_event __user *events,
+-              int maxevents, int timeout, const sigset_t __user *sigmask,
+-              size_t sigsetsize)
++SYSCALL_DEFINE6(epoll_pwait, int, epfd, struct epoll_event __user *, events,
++              int, maxevents, int, timeout, const sigset_t __user *, sigmask,
++              size_t, sigsetsize)
+ {
+       int error;
+       sigset_t ksigmask, sigsaved;
+diff --git a/fs/exec.c b/fs/exec.c
+index b266ace..5027d01 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -105,7 +105,7 @@ static inline void put_binfmt(struct linux_binfmt * fmt)
+  *
+  * Also note that we take the address to load from from the file itself.
+  */
+-asmlinkage long sys_uselib(const char __user * library)
++SYSCALL_DEFINE1(uselib, const char __user *, library)
+ {
+       struct file *file;
+       struct nameidata nd;
+diff --git a/fs/ext3/inode.c b/fs/ext3/inode.c
+index 507d868..c5f40a0 100644
+--- a/fs/ext3/inode.c
++++ b/fs/ext3/inode.c
+@@ -1152,7 +1152,7 @@ static int ext3_write_begin(struct file *file, struct address_space *mapping,
+       to = from + len;
+ retry:
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c
+index de13e91..1f55382 100644
+--- a/fs/ext3/namei.c
++++ b/fs/ext3/namei.c
+@@ -2187,8 +2187,7 @@ retry:
+                * We have a transaction open.  All is sweetness.  It also sets
+                * i_size in generic_commit_write().
+                */
+-              err = __page_symlink(inode, symname, l,
+-                              mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
++              err = __page_symlink(inode, symname, l, 1);
+               if (err) {
+                       drop_nlink(inode);
+                       ext3_mark_inode_dirty(handle, inode);
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 846a790..d77f674 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -1370,7 +1370,7 @@ retry:
+               goto out;
+       }
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page) {
+               ext4_journal_stop(handle);
+               ret = -ENOMEM;
+@@ -2421,7 +2421,7 @@ retry:
+               goto out;
+       }
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page) {
+               ext4_journal_stop(handle);
+               ret = -ENOMEM;
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index 387ad98..d626533 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -2216,8 +2216,7 @@ retry:
+                * We have a transaction open.  All is sweetness.  It also sets
+                * i_size in generic_commit_write().
+                */
+-              err = __page_symlink(inode, symname, l,
+-                              mapping_gfp_mask(inode->i_mapping) & ~__GFP_FS);
++              err = __page_symlink(inode, symname, l, 1);
+               if (err) {
+                       clear_nlink(inode);
+                       ext4_mark_inode_dirty(handle, inode);
+diff --git a/fs/fcntl.c b/fs/fcntl.c
+index 549daf8..08a109b 100644
+--- a/fs/fcntl.c
++++ b/fs/fcntl.c
+@@ -50,7 +50,7 @@ static int get_close_on_exec(unsigned int fd)
+       return res;
+ }
+-asmlinkage long sys_dup3(unsigned int oldfd, unsigned int newfd, int flags)
++SYSCALL_DEFINE3(dup3, unsigned int, oldfd, unsigned int, newfd, int, flags)
+ {
+       int err = -EBADF;
+       struct file * file, *tofree;
+@@ -113,7 +113,7 @@ out_unlock:
+       return err;
+ }
+-asmlinkage long sys_dup2(unsigned int oldfd, unsigned int newfd)
++SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd)
+ {
+       if (unlikely(newfd == oldfd)) { /* corner case */
+               struct files_struct *files = current->files;
+@@ -126,7 +126,7 @@ asmlinkage long sys_dup2(unsigned int oldfd, unsigned int newfd)
+       return sys_dup3(oldfd, newfd, 0);
+ }
+-asmlinkage long sys_dup(unsigned int fildes)
++SYSCALL_DEFINE1(dup, unsigned int, fildes)
+ {
+       int ret = -EBADF;
+       struct file *file = fget(fildes);
+@@ -334,7 +334,7 @@ static long do_fcntl(int fd, unsigned int cmd, unsigned long arg,
+       return err;
+ }
+-asmlinkage long sys_fcntl(unsigned int fd, unsigned int cmd, unsigned long arg)
++SYSCALL_DEFINE3(fcntl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
+ {     
+       struct file *filp;
+       long err = -EBADF;
+@@ -357,7 +357,8 @@ out:
+ }
+ #if BITS_PER_LONG == 32
+-asmlinkage long sys_fcntl64(unsigned int fd, unsigned int cmd, unsigned long arg)
++SYSCALL_DEFINE3(fcntl64, unsigned int, fd, unsigned int, cmd,
++              unsigned long, arg)
+ {     
+       struct file * filp;
+       long err;
+diff --git a/fs/filesystems.c b/fs/filesystems.c
+index f37f872..25f5b6a 100644
+--- a/fs/filesystems.c
++++ b/fs/filesystems.c
+@@ -177,7 +177,7 @@ static int fs_maxindex(void)
+ /*
+  * Whee.. Weird sysv syscall. 
+  */
+-asmlinkage long sys_sysfs(int option, unsigned long arg1, unsigned long arg2)
++SYSCALL_DEFINE3(sysfs, int, option, unsigned long, arg1, unsigned long, arg2)
+ {
+       int retval = -EINVAL;
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index 2bada6b..c8206db 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -644,7 +644,7 @@ static int fuse_write_begin(struct file *file, struct address_space *mapping,
+ {
+       pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+-      *pagep = __grab_cache_page(mapping, index);
++      *pagep = grab_cache_page_write_begin(mapping, index, flags);
+       if (!*pagep)
+               return -ENOMEM;
+       return 0;
+@@ -777,7 +777,7 @@ static ssize_t fuse_fill_write_pages(struct fuse_req *req,
+                       break;
+               err = -ENOMEM;
+-              page = __grab_cache_page(mapping, index);
++              page = grab_cache_page_write_begin(mapping, index, 0);
+               if (!page)
+                       break;
+diff --git a/fs/gfs2/ops_address.c b/fs/gfs2/ops_address.c
+index e64a1b0..c75df06 100644
+--- a/fs/gfs2/ops_address.c
++++ b/fs/gfs2/ops_address.c
+@@ -675,7 +675,7 @@ static int gfs2_write_begin(struct file *file, struct address_space *mapping,
+               goto out_trans_fail;
+       error = -ENOMEM;
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       *pagep = page;
+       if (unlikely(!page))
+               goto out_endtrans;
+diff --git a/fs/hostfs/hostfs_kern.c b/fs/hostfs/hostfs_kern.c
+index d6ecabf..5e17cae 100644
+--- a/fs/hostfs/hostfs_kern.c
++++ b/fs/hostfs/hostfs_kern.c
+@@ -500,7 +500,7 @@ int hostfs_write_begin(struct file *file, struct address_space *mapping,
+ {
+       pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+-      *pagep = __grab_cache_page(mapping, index);
++      *pagep = grab_cache_page_write_begin(mapping, index, flags);
+       if (!*pagep)
+               return -ENOMEM;
+       return 0;
+diff --git a/fs/inotify_user.c b/fs/inotify_user.c
+index d85c7d9..a13f487 100644
+--- a/fs/inotify_user.c
++++ b/fs/inotify_user.c
+@@ -579,7 +579,7 @@ static const struct inotify_operations inotify_user_ops = {
+       .destroy_watch  = free_inotify_user_watch,
+ };
+-asmlinkage long sys_inotify_init1(int flags)
++SYSCALL_DEFINE1(inotify_init1, int, flags)
+ {
+       struct inotify_device *dev;
+       struct inotify_handle *ih;
+@@ -658,12 +658,13 @@ out_put_fd:
+       return ret;
+ }
+-asmlinkage long sys_inotify_init(void)
++SYSCALL_DEFINE0(inotify_init)
+ {
+       return sys_inotify_init1(0);
+ }
+-asmlinkage long sys_inotify_add_watch(int fd, const char __user *pathname, u32 mask)
++SYSCALL_DEFINE3(inotify_add_watch, int, fd, const char __user *, pathname,
++              u32, mask)
+ {
+       struct inode *inode;
+       struct inotify_device *dev;
+@@ -707,7 +708,7 @@ fput_and_out:
+       return ret;
+ }
+-asmlinkage long sys_inotify_rm_watch(int fd, u32 wd)
++SYSCALL_DEFINE2(inotify_rm_watch, int, fd, __s32, wd)
+ {
+       struct file *filp;
+       struct inotify_device *dev;
+diff --git a/fs/ioctl.c b/fs/ioctl.c
+index 612e0b2..b9a59a4 100644
+--- a/fs/ioctl.c
++++ b/fs/ioctl.c
+@@ -195,7 +195,7 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
+       return error;
+ }
+-asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
++SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg)
+ {
+       struct file *filp;
+       int error = -EBADF;
+diff --git a/fs/ioprio.c b/fs/ioprio.c
+index da3cc46..3715d7d 100644
+--- a/fs/ioprio.c
++++ b/fs/ioprio.c
+@@ -65,7 +65,7 @@ static int set_task_ioprio(struct task_struct *task, int ioprio)
+       return err;
+ }
+-asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
++SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
+ {
+       int class = IOPRIO_PRIO_CLASS(ioprio);
+       int data = IOPRIO_PRIO_DATA(ioprio);
+@@ -181,7 +181,7 @@ int ioprio_best(unsigned short aprio, unsigned short bprio)
+               return aprio;
+ }
+-asmlinkage long sys_ioprio_get(int which, int who)
++SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
+ {
+       struct task_struct *g, *p;
+       struct user_struct *user;
+@@ -245,4 +245,3 @@ asmlinkage long sys_ioprio_get(int which, int who)
+       read_unlock(&tasklist_lock);
+       return ret;
+ }
+-
+diff --git a/fs/jffs2/file.c b/fs/jffs2/file.c
+index 5a98aa8..5edc2bf 100644
+--- a/fs/jffs2/file.c
++++ b/fs/jffs2/file.c
+@@ -132,7 +132,7 @@ static int jffs2_write_begin(struct file *filp, struct address_space *mapping,
+       uint32_t pageofs = index << PAGE_CACHE_SHIFT;
+       int ret = 0;
+-      pg = __grab_cache_page(mapping, index);
++      pg = grab_cache_page_write_begin(mapping, index, flags);
+       if (!pg)
+               return -ENOMEM;
+       *pagep = pg;
+diff --git a/fs/libfs.c b/fs/libfs.c
+index 1add676..8fc2407 100644
+--- a/fs/libfs.c
++++ b/fs/libfs.c
+@@ -360,7 +360,7 @@ int simple_write_begin(struct file *file, struct address_space *mapping,
+       index = pos >> PAGE_CACHE_SHIFT;
+       from = pos & (PAGE_CACHE_SIZE - 1);
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+diff --git a/fs/locks.c b/fs/locks.c
+index 5eb259e..5d39a43 100644
+--- a/fs/locks.c
++++ b/fs/locks.c
+@@ -1564,7 +1564,7 @@ EXPORT_SYMBOL(flock_lock_file_wait);
+  *    %LOCK_MAND can be combined with %LOCK_READ or %LOCK_WRITE to allow other
+  *    processes read and write access respectively.
+  */
+-asmlinkage long sys_flock(unsigned int fd, unsigned int cmd)
++SYSCALL_DEFINE2(flock, unsigned int, fd, unsigned int, cmd)
+ {
+       struct file *filp;
+       struct file_lock *lock;
+diff --git a/fs/minix/dir.c b/fs/minix/dir.c
+index f704338..d4946c4 100644
+--- a/fs/minix/dir.c
++++ b/fs/minix/dir.c
+@@ -280,7 +280,7 @@ int minix_add_link(struct dentry *dentry, struct inode *inode)
+       return -EINVAL;
+ got_it:
+-      pos = (page->index >> PAGE_CACHE_SHIFT) + p - (char*)page_address(page);
++      pos = page_offset(page) + p - (char *)page_address(page);
+       err = __minix_write_begin(NULL, page->mapping, pos, sbi->s_dirsize,
+                                       AOP_FLAG_UNINTERRUPTIBLE, &page, NULL);
+       if (err)
+diff --git a/fs/namei.c b/fs/namei.c
+index 4ea63ed..2259d21 100644
+--- a/fs/namei.c
++++ b/fs/namei.c
+@@ -1990,8 +1990,8 @@ static int may_mknod(mode_t mode)
+       }
+ }
+-asmlinkage long sys_mknodat(int dfd, const char __user *filename, int mode,
+-                              unsigned dev)
++SYSCALL_DEFINE4(mknodat, int, dfd, const char __user *, filename, int, mode,
++              unsigned, dev)
+ {
+       int error;
+       char *tmp;
+@@ -2041,7 +2041,7 @@ out_unlock:
+       return error;
+ }
+-asmlinkage long sys_mknod(const char __user *filename, int mode, unsigned dev)
++SYSCALL_DEFINE3(mknod, const char __user *, filename, int, mode, unsigned, dev)
+ {
+       return sys_mknodat(AT_FDCWD, filename, mode, dev);
+ }
+@@ -2068,7 +2068,7 @@ int vfs_mkdir(struct inode *dir, struct dentry *dentry, int mode)
+       return error;
+ }
+-asmlinkage long sys_mkdirat(int dfd, const char __user *pathname, int mode)
++SYSCALL_DEFINE3(mkdirat, int, dfd, const char __user *, pathname, int, mode)
+ {
+       int error = 0;
+       char * tmp;
+@@ -2101,7 +2101,7 @@ out_err:
+       return error;
+ }
+-asmlinkage long sys_mkdir(const char __user *pathname, int mode)
++SYSCALL_DEFINE2(mkdir, const char __user *, pathname, int, mode)
+ {
+       return sys_mkdirat(AT_FDCWD, pathname, mode);
+ }
+@@ -2208,7 +2208,7 @@ exit1:
+       return error;
+ }
+-asmlinkage long sys_rmdir(const char __user *pathname)
++SYSCALL_DEFINE1(rmdir, const char __user *, pathname)
+ {
+       return do_rmdir(AT_FDCWD, pathname);
+ }
+@@ -2297,7 +2297,7 @@ slashes:
+       goto exit2;
+ }
+-asmlinkage long sys_unlinkat(int dfd, const char __user *pathname, int flag)
++SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag)
+ {
+       if ((flag & ~AT_REMOVEDIR) != 0)
+               return -EINVAL;
+@@ -2308,7 +2308,7 @@ asmlinkage long sys_unlinkat(int dfd, const char __user *pathname, int flag)
+       return do_unlinkat(dfd, pathname);
+ }
+-asmlinkage long sys_unlink(const char __user *pathname)
++SYSCALL_DEFINE1(unlink, const char __user *, pathname)
+ {
+       return do_unlinkat(AT_FDCWD, pathname);
+ }
+@@ -2334,8 +2334,8 @@ int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname)
+       return error;
+ }
+-asmlinkage long sys_symlinkat(const char __user *oldname,
+-                            int newdfd, const char __user *newname)
++SYSCALL_DEFINE3(symlinkat, const char __user *, oldname,
++              int, newdfd, const char __user *, newname)
+ {
+       int error;
+       char *from;
+@@ -2372,7 +2372,7 @@ out_putname:
+       return error;
+ }
+-asmlinkage long sys_symlink(const char __user *oldname, const char __user *newname)
++SYSCALL_DEFINE2(symlink, const char __user *, oldname, const char __user *, newname)
+ {
+       return sys_symlinkat(oldname, AT_FDCWD, newname);
+ }
+@@ -2424,9 +2424,8 @@ int vfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *new_de
+  * with linux 2.0, and to avoid hard-linking to directories
+  * and other special files.  --ADM
+  */
+-asmlinkage long sys_linkat(int olddfd, const char __user *oldname,
+-                         int newdfd, const char __user *newname,
+-                         int flags)
++SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname,
++              int, newdfd, const char __user *, newname, int, flags)
+ {
+       struct dentry *new_dentry;
+       struct nameidata nd;
+@@ -2471,7 +2470,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_link(const char __user *oldname, const char __user *newname)
++SYSCALL_DEFINE2(link, const char __user *, oldname, const char __user *, newname)
+ {
+       return sys_linkat(AT_FDCWD, oldname, AT_FDCWD, newname, 0);
+ }
+@@ -2622,8 +2621,8 @@ int vfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+       return error;
+ }
+-asmlinkage long sys_renameat(int olddfd, const char __user *oldname,
+-                           int newdfd, const char __user *newname)
++SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
++              int, newdfd, const char __user *, newname)
+ {
+       struct dentry *old_dir, *new_dir;
+       struct dentry *old_dentry, *new_dentry;
+@@ -2707,7 +2706,7 @@ exit:
+       return error;
+ }
+-asmlinkage long sys_rename(const char __user *oldname, const char __user *newname)
++SYSCALL_DEFINE2(rename, const char __user *, oldname, const char __user *, newname)
+ {
+       return sys_renameat(AT_FDCWD, oldname, AT_FDCWD, newname);
+ }
+@@ -2797,18 +2796,23 @@ void page_put_link(struct dentry *dentry, struct nameidata *nd, void *cookie)
+       }
+ }
+-int __page_symlink(struct inode *inode, const char *symname, int len,
+-              gfp_t gfp_mask)
++/*
++ * The nofs argument instructs pagecache_write_begin to pass AOP_FLAG_NOFS
++ */
++int __page_symlink(struct inode *inode, const char *symname, int len, int nofs)
+ {
+       struct address_space *mapping = inode->i_mapping;
+       struct page *page;
+       void *fsdata;
+       int err;
+       char *kaddr;
++      unsigned int flags = AOP_FLAG_UNINTERRUPTIBLE;
++      if (nofs)
++              flags |= AOP_FLAG_NOFS;
+ retry:
+       err = pagecache_write_begin(NULL, mapping, 0, len-1,
+-                              AOP_FLAG_UNINTERRUPTIBLE, &page, &fsdata);
++                              flags, &page, &fsdata);
+       if (err)
+               goto fail;
+@@ -2832,7 +2836,7 @@ fail:
+ int page_symlink(struct inode *inode, const char *symname, int len)
+ {
+       return __page_symlink(inode, symname, len,
+-                      mapping_gfp_mask(inode->i_mapping));
++                      !(mapping_gfp_mask(inode->i_mapping) & __GFP_FS));
+ }
+ const struct inode_operations page_symlink_inode_operations = {
+diff --git a/fs/namespace.c b/fs/namespace.c
+index 1bd5ba2..efe0251 100644
+--- a/fs/namespace.c
++++ b/fs/namespace.c
+@@ -1128,7 +1128,7 @@ static int do_umount(struct vfsmount *mnt, int flags)
+  * unixes. Our API is identical to OSF/1 to avoid making a mess of AMD
+  */
+-asmlinkage long sys_umount(char __user * name, int flags)
++SYSCALL_DEFINE2(umount, char __user *, name, int, flags)
+ {
+       struct path path;
+       int retval;
+@@ -1160,7 +1160,7 @@ out:
+ /*
+  *    The 2.0 compatible umount. No flags.
+  */
+-asmlinkage long sys_oldumount(char __user * name)
++SYSCALL_DEFINE1(oldumount, char __user *, name)
+ {
+       return sys_umount(name, 0);
+ }
+@@ -2053,9 +2053,8 @@ struct mnt_namespace *copy_mnt_ns(unsigned long flags, struct mnt_namespace *ns,
+       return new_ns;
+ }
+-asmlinkage long sys_mount(char __user * dev_name, char __user * dir_name,
+-                        char __user * type, unsigned long flags,
+-                        void __user * data)
++SYSCALL_DEFINE5(mount, char __user *, dev_name, char __user *, dir_name,
++              char __user *, type, unsigned long, flags, void __user *, data)
+ {
+       int retval;
+       unsigned long data_page;
+@@ -2180,8 +2179,8 @@ static void chroot_fs_refs(struct path *old_root, struct path *new_root)
+  *    though, so you may need to say mount --bind /nfs/my_root /nfs/my_root
+  *    first.
+  */
+-asmlinkage long sys_pivot_root(const char __user * new_root,
+-                             const char __user * put_old)
++SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
++              const char __user *, put_old)
+ {
+       struct vfsmount *tmp;
+       struct path new, old, parent_path, root_parent, root;
+diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+index 7846065..30541f0 100644
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -351,7 +351,7 @@ static int nfs_write_begin(struct file *file, struct address_space *mapping,
+               file->f_path.dentry->d_name.name,
+               mapping->host->i_ino, len, (long long) pos);
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+diff --git a/fs/nfs/read.c b/fs/nfs/read.c
+index 40d1798..f856004 100644
+--- a/fs/nfs/read.c
++++ b/fs/nfs/read.c
+@@ -533,12 +533,6 @@ readpage_async_filler(void *data, struct page *page)
+       unsigned int len;
+       int error;
+-      error = nfs_wb_page(inode, page);
+-      if (error)
+-              goto out_unlock;
+-      if (PageUptodate(page))
+-              goto out_unlock;
+-
+       len = nfs_page_length(page);
+       if (len == 0)
+               return nfs_return_empty_page(page);
+diff --git a/fs/nfsctl.c b/fs/nfsctl.c
+index aed8145..bf2cbd9 100644
+--- a/fs/nfsctl.c
++++ b/fs/nfsctl.c
+@@ -82,8 +82,8 @@ static struct {
+       },
+ };
+-long
+-asmlinkage sys_nfsservctl(int cmd, struct nfsctl_arg __user *arg, void __user *res)
++SYSCALL_DEFINE3(nfsservctl, int, cmd, struct nfsctl_arg __user *, arg,
++              void __user *, res)
+ {
+       struct file *file;
+       void __user *p = &arg->u;
+diff --git a/fs/open.c b/fs/open.c
+index 07da935..975ce3e 100644
+--- a/fs/open.c
++++ b/fs/open.c
+@@ -122,7 +122,7 @@ static int vfs_statfs64(struct dentry *dentry, struct statfs64 *buf)
+       return 0;
+ }
+-asmlinkage long sys_statfs(const char __user *pathname, struct statfs __user * buf)
++SYSCALL_DEFINE2(statfs, const char __user *, pathname, struct statfs __user *, buf)
+ {
+       struct path path;
+       int error;
+@@ -138,8 +138,7 @@ asmlinkage long sys_statfs(const char __user *pathname, struct statfs __user * b
+       return error;
+ }
+-
+-asmlinkage long sys_statfs64(const char __user *pathname, size_t sz, struct statfs64 __user *buf)
++SYSCALL_DEFINE3(statfs64, const char __user *, pathname, size_t, sz, struct statfs64 __user *, buf)
+ {
+       struct path path;
+       long error;
+@@ -157,8 +156,7 @@ asmlinkage long sys_statfs64(const char __user *pathname, size_t sz, struct stat
+       return error;
+ }
+-
+-asmlinkage long sys_fstatfs(unsigned int fd, struct statfs __user * buf)
++SYSCALL_DEFINE2(fstatfs, unsigned int, fd, struct statfs __user *, buf)
+ {
+       struct file * file;
+       struct statfs tmp;
+@@ -176,7 +174,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_fstatfs64(unsigned int fd, size_t sz, struct statfs64 __user *buf)
++SYSCALL_DEFINE3(fstatfs64, unsigned int, fd, size_t, sz, struct statfs64 __user *, buf)
+ {
+       struct file * file;
+       struct statfs64 tmp;
+@@ -287,7 +285,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_truncate(const char __user * path, unsigned long length)
++SYSCALL_DEFINE2(truncate, const char __user *, path, unsigned long, length)
+ {
+       /* on 32-bit boxen it will cut the range 2^31--2^32-1 off */
+       return do_sys_truncate(path, (long)length);
+@@ -336,7 +334,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)
++SYSCALL_DEFINE2(ftruncate, unsigned int, fd, unsigned long, length)
+ {
+       long ret = do_sys_ftruncate(fd, length, 1);
+       /* avoid REGPARM breakage on x86: */
+@@ -346,21 +344,35 @@ asmlinkage long sys_ftruncate(unsigned int fd, unsigned long length)
+ /* LFS versions of truncate are only needed on 32 bit machines */
+ #if BITS_PER_LONG == 32
+-asmlinkage long sys_truncate64(const char __user * path, loff_t length)
++SYSCALL_DEFINE(truncate64)(const char __user * path, loff_t length)
+ {
+       return do_sys_truncate(path, length);
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_truncate64(long path, loff_t length)
++{
++      return SYSC_truncate64((const char __user *) path, length);
++}
++SYSCALL_ALIAS(sys_truncate64, SyS_truncate64);
++#endif
+-asmlinkage long sys_ftruncate64(unsigned int fd, loff_t length)
++SYSCALL_DEFINE(ftruncate64)(unsigned int fd, loff_t length)
+ {
+       long ret = do_sys_ftruncate(fd, length, 0);
+       /* avoid REGPARM breakage on x86: */
+       asmlinkage_protect(2, ret, fd, length);
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_ftruncate64(long fd, loff_t length)
++{
++      return SYSC_ftruncate64((unsigned int) fd, length);
++}
++SYSCALL_ALIAS(sys_ftruncate64, SyS_ftruncate64);
+ #endif
++#endif /* BITS_PER_LONG == 32 */
+-asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len)
++SYSCALL_DEFINE(fallocate)(int fd, int mode, loff_t offset, loff_t len)
+ {
+       struct file *file;
+       struct inode *inode;
+@@ -417,13 +429,20 @@ out_fput:
+ out:
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_fallocate(long fd, long mode, loff_t offset, loff_t len)
++{
++      return SYSC_fallocate((int)fd, (int)mode, offset, len);
++}
++SYSCALL_ALIAS(sys_fallocate, SyS_fallocate);
++#endif
+ /*
+  * access() needs to use the real uid/gid, not the effective uid/gid.
+  * We do this by temporarily clearing all FS-related capabilities and
+  * switching the fsuid/fsgid around to the real ones.
+  */
+-asmlinkage long sys_faccessat(int dfd, const char __user *filename, int mode)
++SYSCALL_DEFINE3(faccessat, int, dfd, const char __user *, filename, int, mode)
+ {
+       struct path path;
+       struct inode *inode;
+@@ -503,12 +522,12 @@ out:
+       return res;
+ }
+-asmlinkage long sys_access(const char __user *filename, int mode)
++SYSCALL_DEFINE2(access, const char __user *, filename, int, mode)
+ {
+       return sys_faccessat(AT_FDCWD, filename, mode);
+ }
+-asmlinkage long sys_chdir(const char __user * filename)
++SYSCALL_DEFINE1(chdir, const char __user *, filename)
+ {
+       struct path path;
+       int error;
+@@ -529,7 +548,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_fchdir(unsigned int fd)
++SYSCALL_DEFINE1(fchdir, unsigned int, fd)
+ {
+       struct file *file;
+       struct inode *inode;
+@@ -555,7 +574,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_chroot(const char __user * filename)
++SYSCALL_DEFINE1(chroot, const char __user *, filename)
+ {
+       struct path path;
+       int error;
+@@ -580,7 +599,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_fchmod(unsigned int fd, mode_t mode)
++SYSCALL_DEFINE2(fchmod, unsigned int, fd, mode_t, mode)
+ {
+       struct inode * inode;
+       struct dentry * dentry;
+@@ -614,8 +633,7 @@ out:
+       return err;
+ }
+-asmlinkage long sys_fchmodat(int dfd, const char __user *filename,
+-                           mode_t mode)
++SYSCALL_DEFINE3(fchmodat, int, dfd, const char __user *, filename, mode_t, mode)
+ {
+       struct path path;
+       struct inode *inode;
+@@ -644,7 +662,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_chmod(const char __user *filename, mode_t mode)
++SYSCALL_DEFINE2(chmod, const char __user *, filename, mode_t, mode)
+ {
+       return sys_fchmodat(AT_FDCWD, filename, mode);
+ }
+@@ -674,7 +692,7 @@ static int chown_common(struct dentry * dentry, uid_t user, gid_t group)
+       return error;
+ }
+-asmlinkage long sys_chown(const char __user * filename, uid_t user, gid_t group)
++SYSCALL_DEFINE3(chown, const char __user *, filename, uid_t, user, gid_t, group)
+ {
+       struct path path;
+       int error;
+@@ -693,8 +711,8 @@ out:
+       return error;
+ }
+-asmlinkage long sys_fchownat(int dfd, const char __user *filename, uid_t user,
+-                           gid_t group, int flag)
++SYSCALL_DEFINE5(fchownat, int, dfd, const char __user *, filename, uid_t, user,
++              gid_t, group, int, flag)
+ {
+       struct path path;
+       int error = -EINVAL;
+@@ -718,7 +736,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_lchown(const char __user * filename, uid_t user, gid_t group)
++SYSCALL_DEFINE3(lchown, const char __user *, filename, uid_t, user, gid_t, group)
+ {
+       struct path path;
+       int error;
+@@ -737,8 +755,7 @@ out:
+       return error;
+ }
+-
+-asmlinkage long sys_fchown(unsigned int fd, uid_t user, gid_t group)
++SYSCALL_DEFINE3(fchown, unsigned int, fd, uid_t, user, gid_t, group)
+ {
+       struct file * file;
+       int error = -EBADF;
+@@ -1029,7 +1046,7 @@ long do_sys_open(int dfd, const char __user *filename, int flags, int mode)
+       return fd;
+ }
+-asmlinkage long sys_open(const char __user *filename, int flags, int mode)
++SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
+ {
+       long ret;
+@@ -1042,8 +1059,8 @@ asmlinkage long sys_open(const char __user *filename, int flags, int mode)
+       return ret;
+ }
+-asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
+-                         int mode)
++SYSCALL_DEFINE4(openat, int, dfd, const char __user *, filename, int, flags,
++              int, mode)
+ {
+       long ret;
+@@ -1062,7 +1079,7 @@ asmlinkage long sys_openat(int dfd, const char __user *filename, int flags,
+  * For backward compatibility?  Maybe this should be moved
+  * into arch/i386 instead?
+  */
+-asmlinkage long sys_creat(const char __user * pathname, int mode)
++SYSCALL_DEFINE2(creat, const char __user *, pathname, int, mode)
+ {
+       return sys_open(pathname, O_CREAT | O_WRONLY | O_TRUNC, mode);
+ }
+@@ -1098,7 +1115,7 @@ EXPORT_SYMBOL(filp_close);
+  * releasing the fd. This ensures that one clone task can't release
+  * an fd while another clone is opening it.
+  */
+-asmlinkage long sys_close(unsigned int fd)
++SYSCALL_DEFINE1(close, unsigned int, fd)
+ {
+       struct file * filp;
+       struct files_struct *files = current->files;
+@@ -1131,14 +1148,13 @@ out_unlock:
+       spin_unlock(&files->file_lock);
+       return -EBADF;
+ }
+-
+ EXPORT_SYMBOL(sys_close);
+ /*
+  * This routine simulates a hangup on the tty, to arrange that users
+  * are given clean terminals at login time.
+  */
+-asmlinkage long sys_vhangup(void)
++SYSCALL_DEFINE0(vhangup)
+ {
+       if (capable(CAP_SYS_TTY_CONFIG)) {
+               /* XXX: this needs locking */
+diff --git a/fs/pipe.c b/fs/pipe.c
+index fcba654..35d2cbb 100644
+--- a/fs/pipe.c
++++ b/fs/pipe.c
+@@ -1051,7 +1051,7 @@ int do_pipe(int *fd)
+  * sys_pipe() is the normal C calling standard for creating
+  * a pipe. It's not the way Unix traditionally does this, though.
+  */
+-asmlinkage long __weak sys_pipe2(int __user *fildes, int flags)
++SYSCALL_DEFINE2(pipe2, int __user *, fildes, int, flags)
+ {
+       int fd[2];
+       int error;
+@@ -1067,7 +1067,7 @@ asmlinkage long __weak sys_pipe2(int __user *fildes, int flags)
+       return error;
+ }
+-asmlinkage long __weak sys_pipe(int __user *fildes)
++SYSCALL_DEFINE1(pipe, int __user *, fildes)
+ {
+       return sys_pipe2(fildes, 0);
+ }
+diff --git a/fs/quota.c b/fs/quota.c
+index 7f4386e..e9851af 100644
+--- a/fs/quota.c
++++ b/fs/quota.c
+@@ -368,7 +368,8 @@ static inline struct super_block *quotactl_block(const char __user *special)
+  * calls. Maybe we need to add the process quotas etc. in the future,
+  * but we probably should use rlimits for that.
+  */
+-asmlinkage long sys_quotactl(unsigned int cmd, const char __user *special, qid_t id, void __user *addr)
++SYSCALL_DEFINE4(quotactl, unsigned int, cmd, const char __user *, special,
++              qid_t, id, void __user *, addr)
+ {
+       uint cmds, type;
+       struct super_block *sb = NULL;
+diff --git a/fs/read_write.c b/fs/read_write.c
+index 9ba495d..0619b2a 100644
+--- a/fs/read_write.c
++++ b/fs/read_write.c
+@@ -112,7 +112,7 @@ loff_t vfs_llseek(struct file *file, loff_t offset, int origin)
+ }
+ EXPORT_SYMBOL(vfs_llseek);
+-asmlinkage off_t sys_lseek(unsigned int fd, off_t offset, unsigned int origin)
++SYSCALL_DEFINE3(lseek, unsigned int, fd, off_t, offset, unsigned int, origin)
+ {
+       off_t retval;
+       struct file * file;
+@@ -136,9 +136,9 @@ bad:
+ }
+ #ifdef __ARCH_WANT_SYS_LLSEEK
+-asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,
+-                         unsigned long offset_low, loff_t __user * result,
+-                         unsigned int origin)
++SYSCALL_DEFINE5(llseek, unsigned int, fd, unsigned long, offset_high,
++              unsigned long, offset_low, loff_t __user *, result,
++              unsigned int, origin)
+ {
+       int retval;
+       struct file * file;
+@@ -334,7 +334,7 @@ static inline void file_pos_write(struct file *file, loff_t pos)
+       file->f_pos = pos;
+ }
+-asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
++SYSCALL_DEFINE3(read, unsigned int, fd, char __user *, buf, size_t, count)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -351,7 +351,8 @@ asmlinkage ssize_t sys_read(unsigned int fd, char __user * buf, size_t count)
+       return ret;
+ }
+-asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)
++SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
++              size_t, count)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -368,8 +369,8 @@ asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t co
+       return ret;
+ }
+-asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
+-                           size_t count, loff_t pos)
++SYSCALL_DEFINE(pread64)(unsigned int fd, char __user *buf,
++                      size_t count, loff_t pos)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -388,9 +389,17 @@ asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_pread64(long fd, long buf, long count, loff_t pos)
++{
++      return SYSC_pread64((unsigned int) fd, (char __user *) buf,
++                          (size_t) count, pos);
++}
++SYSCALL_ALIAS(sys_pread64, SyS_pread64);
++#endif
+-asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
+-                            size_t count, loff_t pos)
++SYSCALL_DEFINE(pwrite64)(unsigned int fd, const char __user *buf,
++                       size_t count, loff_t pos)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -409,6 +418,14 @@ asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_pwrite64(long fd, long buf, long count, loff_t pos)
++{
++      return SYSC_pwrite64((unsigned int) fd, (const char __user *) buf,
++                           (size_t) count, pos);
++}
++SYSCALL_ALIAS(sys_pwrite64, SyS_pwrite64);
++#endif
+ /*
+  * Reduce an iovec's length in-place.  Return the resulting number of segments
+@@ -637,8 +654,8 @@ ssize_t vfs_writev(struct file *file, const struct iovec __user *vec,
+ EXPORT_SYMBOL(vfs_writev);
+-asmlinkage ssize_t
+-sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
++SYSCALL_DEFINE3(readv, unsigned long, fd, const struct iovec __user *, vec,
++              unsigned long, vlen)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -658,8 +675,8 @@ sys_readv(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
+       return ret;
+ }
+-asmlinkage ssize_t
+-sys_writev(unsigned long fd, const struct iovec __user *vec, unsigned long vlen)
++SYSCALL_DEFINE3(writev, unsigned long, fd, const struct iovec __user *, vec,
++              unsigned long, vlen)
+ {
+       struct file *file;
+       ssize_t ret = -EBADF;
+@@ -777,7 +794,7 @@ out:
+       return retval;
+ }
+-asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t __user *offset, size_t count)
++SYSCALL_DEFINE4(sendfile, int, out_fd, int, in_fd, off_t __user *, offset, size_t, count)
+ {
+       loff_t pos;
+       off_t off;
+@@ -796,7 +813,7 @@ asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd, off_t __user *offset, siz
+       return do_sendfile(out_fd, in_fd, NULL, count, 0);
+ }
+-asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd, loff_t __user *offset, size_t count)
++SYSCALL_DEFINE4(sendfile64, int, out_fd, int, in_fd, loff_t __user *, offset, size_t, count)
+ {
+       loff_t pos;
+       ssize_t ret;
+diff --git a/fs/readdir.c b/fs/readdir.c
+index 93a7559..d68ea47 100644
+--- a/fs/readdir.c
++++ b/fs/readdir.c
+@@ -102,7 +102,8 @@ efault:
+       return -EFAULT;
+ }
+-asmlinkage long old_readdir(unsigned int fd, struct old_linux_dirent __user * dirent, unsigned int count)
++SYSCALL_DEFINE3(old_readdir, unsigned int, fd,
++              struct old_linux_dirent __user *, dirent, unsigned int, count)
+ {
+       int error;
+       struct file * file;
+@@ -187,7 +188,8 @@ efault:
+       return -EFAULT;
+ }
+-asmlinkage long sys_getdents(unsigned int fd, struct linux_dirent __user * dirent, unsigned int count)
++SYSCALL_DEFINE3(getdents, unsigned int, fd,
++              struct linux_dirent __user *, dirent, unsigned int, count)
+ {
+       struct file * file;
+       struct linux_dirent __user * lastdirent;
+@@ -271,7 +273,8 @@ efault:
+       return -EFAULT;
+ }
+-asmlinkage long sys_getdents64(unsigned int fd, struct linux_dirent64 __user * dirent, unsigned int count)
++SYSCALL_DEFINE3(getdents64, unsigned int, fd,
++              struct linux_dirent64 __user *, dirent, unsigned int, count)
+ {
+       struct file * file;
+       struct linux_dirent64 __user * lastdirent;
+diff --git a/fs/reiserfs/inode.c b/fs/reiserfs/inode.c
+index 5699171..8c2615e 100644
+--- a/fs/reiserfs/inode.c
++++ b/fs/reiserfs/inode.c
+@@ -2565,7 +2565,7 @@ static int reiserfs_write_begin(struct file *file,
+       }
+       index = pos >> PAGE_CACHE_SHIFT;
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page)
+               return -ENOMEM;
+       *pagep = page;
+diff --git a/fs/select.c b/fs/select.c
+index da0e882..d575e4f 100644
+--- a/fs/select.c
++++ b/fs/select.c
+@@ -374,8 +374,8 @@ out_nofds:
+       return ret;
+ }
+-asmlinkage long sys_select(int n, fd_set __user *inp, fd_set __user *outp,
+-                      fd_set __user *exp, struct timeval __user *tvp)
++SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp,
++              fd_set __user *, exp, struct timeval __user *, tvp)
+ {
+       s64 timeout = -1;
+       struct timeval tv;
+@@ -427,9 +427,9 @@ sticky:
+ }
+ #ifdef HAVE_SET_RESTORE_SIGMASK
+-asmlinkage long sys_pselect7(int n, fd_set __user *inp, fd_set __user *outp,
+-              fd_set __user *exp, struct timespec __user *tsp,
+-              const sigset_t __user *sigmask, size_t sigsetsize)
++static long do_pselect(int n, fd_set __user *inp, fd_set __user *outp,
++                     fd_set __user *exp, struct timespec __user *tsp,
++                     const sigset_t __user *sigmask, size_t sigsetsize)
+ {
+       s64 timeout = MAX_SCHEDULE_TIMEOUT;
+       sigset_t ksigmask, sigsaved;
+@@ -513,8 +513,9 @@ sticky:
+  * which has a pointer to the sigset_t itself followed by a size_t containing
+  * the sigset size.
+  */
+-asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp,
+-      fd_set __user *exp, struct timespec __user *tsp, void __user *sig)
++SYSCALL_DEFINE6(pselect6, int, n, fd_set __user *, inp, fd_set __user *, outp,
++              fd_set __user *, exp, struct timespec __user *, tsp,
++              void __user *, sig)
+ {
+       size_t sigsetsize = 0;
+       sigset_t __user *up = NULL;
+@@ -527,7 +528,7 @@ asmlinkage long sys_pselect6(int n, fd_set __user *inp, fd_set __user *outp,
+                       return -EFAULT;
+       }
+-      return sys_pselect7(n, inp, outp, exp, tsp, up, sigsetsize);
++      return do_pselect(n, inp, outp, exp, tsp, up, sigsetsize);
+ }
+ #endif /* HAVE_SET_RESTORE_SIGMASK */
+@@ -727,8 +728,8 @@ static long do_restart_poll(struct restart_block *restart_block)
+       return ret;
+ }
+-asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
+-                      long timeout_msecs)
++SYSCALL_DEFINE3(poll, struct pollfd __user *, ufds, unsigned int, nfds,
++              long, timeout_msecs)
+ {
+       s64 timeout_jiffies;
+       int ret;
+@@ -761,9 +762,9 @@ asmlinkage long sys_poll(struct pollfd __user *ufds, unsigned int nfds,
+ }
+ #ifdef HAVE_SET_RESTORE_SIGMASK
+-asmlinkage long sys_ppoll(struct pollfd __user *ufds, unsigned int nfds,
+-      struct timespec __user *tsp, const sigset_t __user *sigmask,
+-      size_t sigsetsize)
++SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
++              struct timespec __user *, tsp, const sigset_t __user *, sigmask,
++              size_t, sigsetsize)
+ {
+       sigset_t ksigmask, sigsaved;
+       struct timespec ts;
+diff --git a/fs/signalfd.c b/fs/signalfd.c
+index 9c39bc7..b07565c 100644
+--- a/fs/signalfd.c
++++ b/fs/signalfd.c
+@@ -205,8 +205,8 @@ static const struct file_operations signalfd_fops = {
+       .read           = signalfd_read,
+ };
+-asmlinkage long sys_signalfd4(int ufd, sigset_t __user *user_mask,
+-                            size_t sizemask, int flags)
++SYSCALL_DEFINE4(signalfd4, int, ufd, sigset_t __user *, user_mask,
++              size_t, sizemask, int, flags)
+ {
+       sigset_t sigmask;
+       struct signalfd_ctx *ctx;
+@@ -259,8 +259,8 @@ asmlinkage long sys_signalfd4(int ufd, sigset_t __user *user_mask,
+       return ufd;
+ }
+-asmlinkage long sys_signalfd(int ufd, sigset_t __user *user_mask,
+-                           size_t sizemask)
++SYSCALL_DEFINE3(signalfd, int, ufd, sigset_t __user *, user_mask,
++              size_t, sizemask)
+ {
+       return sys_signalfd4(ufd, user_mask, sizemask, 0);
+ }
+diff --git a/fs/smbfs/file.c b/fs/smbfs/file.c
+index e4f8d51..92d5e8f 100644
+--- a/fs/smbfs/file.c
++++ b/fs/smbfs/file.c
+@@ -297,7 +297,7 @@ static int smb_write_begin(struct file *file, struct address_space *mapping,
+                       struct page **pagep, void **fsdata)
+ {
+       pgoff_t index = pos >> PAGE_CACHE_SHIFT;
+-      *pagep = __grab_cache_page(mapping, index);
++      *pagep = grab_cache_page_write_begin(mapping, index, flags);
+       if (!*pagep)
+               return -ENOMEM;
+       return 0;
+diff --git a/fs/splice.c b/fs/splice.c
+index a1e701c..6d310c7 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -1434,8 +1434,8 @@ static long vmsplice_to_pipe(struct file *file, const struct iovec __user *iov,
+  * Currently we punt and implement it as a normal copy, see pipe_to_user().
+  *
+  */
+-asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
+-                           unsigned long nr_segs, unsigned int flags)
++SYSCALL_DEFINE4(vmsplice, int, fd, const struct iovec __user *, iov,
++              unsigned long, nr_segs, unsigned int, flags)
+ {
+       struct file *file;
+       long error;
+@@ -1460,9 +1460,9 @@ asmlinkage long sys_vmsplice(int fd, const struct iovec __user *iov,
+       return error;
+ }
+-asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
+-                         int fd_out, loff_t __user *off_out,
+-                         size_t len, unsigned int flags)
++SYSCALL_DEFINE6(splice, int, fd_in, loff_t __user *, off_in,
++              int, fd_out, loff_t __user *, off_out,
++              size_t, len, unsigned int, flags)
+ {
+       long error;
+       struct file *in, *out;
+@@ -1684,7 +1684,7 @@ static long do_tee(struct file *in, struct file *out, size_t len,
+       return ret;
+ }
+-asmlinkage long sys_tee(int fdin, int fdout, size_t len, unsigned int flags)
++SYSCALL_DEFINE4(tee, int, fdin, int, fdout, size_t, len, unsigned int, flags)
+ {
+       struct file *in;
+       int error, fput_in;
+diff --git a/fs/stat.c b/fs/stat.c
+index 7c46fbe..4bd85da 100644
+--- a/fs/stat.c
++++ b/fs/stat.c
+@@ -152,7 +152,7 @@ static int cp_old_stat(struct kstat *stat, struct __old_kernel_stat __user * sta
+       return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
+ }
+-asmlinkage long sys_stat(char __user * filename, struct __old_kernel_stat __user * statbuf)
++SYSCALL_DEFINE2(stat, char __user *, filename, struct __old_kernel_stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_stat_fd(AT_FDCWD, filename, &stat);
+@@ -162,7 +162,8 @@ asmlinkage long sys_stat(char __user * filename, struct __old_kernel_stat __user
+       return error;
+ }
+-asmlinkage long sys_lstat(char __user * filename, struct __old_kernel_stat __user * statbuf)
++
++SYSCALL_DEFINE2(lstat, char __user *, filename, struct __old_kernel_stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_lstat_fd(AT_FDCWD, filename, &stat);
+@@ -172,7 +173,8 @@ asmlinkage long sys_lstat(char __user * filename, struct __old_kernel_stat __use
+       return error;
+ }
+-asmlinkage long sys_fstat(unsigned int fd, struct __old_kernel_stat __user * statbuf)
++
++SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_fstat(fd, &stat);
+@@ -235,7 +237,7 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
+       return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
+ }
+-asmlinkage long sys_newstat(char __user *filename, struct stat __user *statbuf)
++SYSCALL_DEFINE2(newstat, char __user *, filename, struct stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_stat_fd(AT_FDCWD, filename, &stat);
+@@ -246,7 +248,7 @@ asmlinkage long sys_newstat(char __user *filename, struct stat __user *statbuf)
+       return error;
+ }
+-asmlinkage long sys_newlstat(char __user *filename, struct stat __user *statbuf)
++SYSCALL_DEFINE2(newlstat, char __user *, filename, struct stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_lstat_fd(AT_FDCWD, filename, &stat);
+@@ -258,8 +260,8 @@ asmlinkage long sys_newlstat(char __user *filename, struct stat __user *statbuf)
+ }
+ #if !defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_SYS_NEWFSTATAT)
+-asmlinkage long sys_newfstatat(int dfd, char __user *filename,
+-                              struct stat __user *statbuf, int flag)
++SYSCALL_DEFINE4(newfstatat, int, dfd, char __user *, filename,
++              struct stat __user *, statbuf, int, flag)
+ {
+       struct kstat stat;
+       int error = -EINVAL;
+@@ -280,7 +282,7 @@ out:
+ }
+ #endif
+-asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf)
++SYSCALL_DEFINE2(newfstat, unsigned int, fd, struct stat __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_fstat(fd, &stat);
+@@ -291,8 +293,8 @@ asmlinkage long sys_newfstat(unsigned int fd, struct stat __user *statbuf)
+       return error;
+ }
+-asmlinkage long sys_readlinkat(int dfd, const char __user *pathname,
+-                              char __user *buf, int bufsiz)
++SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
++              char __user *, buf, int, bufsiz)
+ {
+       struct path path;
+       int error;
+@@ -318,8 +320,8 @@ asmlinkage long sys_readlinkat(int dfd, const char __user *pathname,
+       return error;
+ }
+-asmlinkage long sys_readlink(const char __user *path, char __user *buf,
+-                              int bufsiz)
++SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf,
++              int, bufsiz)
+ {
+       return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);
+ }
+@@ -365,7 +367,7 @@ static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
+       return copy_to_user(statbuf,&tmp,sizeof(tmp)) ? -EFAULT : 0;
+ }
+-asmlinkage long sys_stat64(char __user * filename, struct stat64 __user * statbuf)
++SYSCALL_DEFINE2(stat64, char __user *, filename, struct stat64 __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_stat(filename, &stat);
+@@ -375,7 +377,8 @@ asmlinkage long sys_stat64(char __user * filename, struct stat64 __user * statbu
+       return error;
+ }
+-asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statbuf)
++
++SYSCALL_DEFINE2(lstat64, char __user *, filename, struct stat64 __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_lstat(filename, &stat);
+@@ -385,7 +388,8 @@ asmlinkage long sys_lstat64(char __user * filename, struct stat64 __user * statb
+       return error;
+ }
+-asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
++
++SYSCALL_DEFINE2(fstat64, unsigned long, fd, struct stat64 __user *, statbuf)
+ {
+       struct kstat stat;
+       int error = vfs_fstat(fd, &stat);
+@@ -396,8 +400,8 @@ asmlinkage long sys_fstat64(unsigned long fd, struct stat64 __user * statbuf)
+       return error;
+ }
+-asmlinkage long sys_fstatat64(int dfd, char __user *filename,
+-                             struct stat64 __user *statbuf, int flag)
++SYSCALL_DEFINE4(fstatat64, int, dfd, char __user *, filename,
++              struct stat64 __user *, statbuf, int, flag)
+ {
+       struct kstat stat;
+       int error = -EINVAL;
+diff --git a/fs/super.c b/fs/super.c
+index e931ae9..909fcb4 100644
+--- a/fs/super.c
++++ b/fs/super.c
+@@ -534,7 +534,7 @@ rescan:
+       return NULL;
+ }
+-asmlinkage long sys_ustat(unsigned dev, struct ustat __user * ubuf)
++SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf)
+ {
+         struct super_block *s;
+         struct ustat tmp;
+diff --git a/fs/sync.c b/fs/sync.c
+index 2967562..6cc8cb4 100644
+--- a/fs/sync.c
++++ b/fs/sync.c
+@@ -36,7 +36,7 @@ static void do_sync(unsigned long wait)
+               laptop_sync_completion();
+ }
+-asmlinkage long sys_sync(void)
++SYSCALL_DEFINE0(sync)
+ {
+       do_sync(1);
+       return 0;
+@@ -118,12 +118,12 @@ static long __do_fsync(unsigned int fd, int datasync)
+       return ret;
+ }
+-asmlinkage long sys_fsync(unsigned int fd)
++SYSCALL_DEFINE1(fsync, unsigned int, fd)
+ {
+       return __do_fsync(fd, 0);
+ }
+-asmlinkage long sys_fdatasync(unsigned int fd)
++SYSCALL_DEFINE1(fdatasync, unsigned int, fd)
+ {
+       return __do_fsync(fd, 1);
+ }
+@@ -175,8 +175,8 @@ asmlinkage long sys_fdatasync(unsigned int fd)
+  * already-instantiated disk blocks, there are no guarantees here that the data
+  * will be available after a crash.
+  */
+-asmlinkage long sys_sync_file_range(int fd, loff_t offset, loff_t nbytes,
+-                                      unsigned int flags)
++SYSCALL_DEFINE(sync_file_range)(int fd, loff_t offset, loff_t nbytes,
++                              unsigned int flags)
+ {
+       int ret;
+       struct file *file;
+@@ -236,14 +236,32 @@ out_put:
+ out:
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_sync_file_range(long fd, loff_t offset, loff_t nbytes,
++                                  long flags)
++{
++      return SYSC_sync_file_range((int) fd, offset, nbytes,
++                                  (unsigned int) flags);
++}
++SYSCALL_ALIAS(sys_sync_file_range, SyS_sync_file_range);
++#endif
+ /* It would be nice if people remember that not all the world's an i386
+    when they introduce new system calls */
+-asmlinkage long sys_sync_file_range2(int fd, unsigned int flags,
+-                                   loff_t offset, loff_t nbytes)
++SYSCALL_DEFINE(sync_file_range2)(int fd, unsigned int flags,
++                               loff_t offset, loff_t nbytes)
+ {
+       return sys_sync_file_range(fd, offset, nbytes, flags);
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_sync_file_range2(long fd, long flags,
++                                   loff_t offset, loff_t nbytes)
++{
++      return SYSC_sync_file_range2((int) fd, (unsigned int) flags,
++                                   offset, nbytes);
++}
++SYSCALL_ALIAS(sys_sync_file_range2, SyS_sync_file_range2);
++#endif
+ /*
+  * `endbyte' is inclusive
+diff --git a/fs/timerfd.c b/fs/timerfd.c
+index c502c60..ee211df 100644
+--- a/fs/timerfd.c
++++ b/fs/timerfd.c
+@@ -179,7 +179,7 @@ static struct file *timerfd_fget(int fd)
+       return file;
+ }
+-asmlinkage long sys_timerfd_create(int clockid, int flags)
++SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
+ {
+       int ufd;
+       struct timerfd_ctx *ctx;
+@@ -210,9 +210,9 @@ asmlinkage long sys_timerfd_create(int clockid, int flags)
+       return ufd;
+ }
+-asmlinkage long sys_timerfd_settime(int ufd, int flags,
+-                                  const struct itimerspec __user *utmr,
+-                                  struct itimerspec __user *otmr)
++SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
++              const struct itimerspec __user *, utmr,
++              struct itimerspec __user *, otmr)
+ {
+       struct file *file;
+       struct timerfd_ctx *ctx;
+@@ -267,7 +267,7 @@ asmlinkage long sys_timerfd_settime(int ufd, int flags,
+       return 0;
+ }
+-asmlinkage long sys_timerfd_gettime(int ufd, struct itimerspec __user *otmr)
++SYSCALL_DEFINE2(timerfd_gettime, int, ufd, struct itimerspec __user *, otmr)
+ {
+       struct file *file;
+       struct timerfd_ctx *ctx;
+diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
+index 3d698e2..40033dc 100644
+--- a/fs/ubifs/file.c
++++ b/fs/ubifs/file.c
+@@ -213,7 +213,8 @@ static void release_existing_page_budget(struct ubifs_info *c)
+ }
+ static int write_begin_slow(struct address_space *mapping,
+-                          loff_t pos, unsigned len, struct page **pagep)
++                          loff_t pos, unsigned len, struct page **pagep,
++                          unsigned flags)
+ {
+       struct inode *inode = mapping->host;
+       struct ubifs_info *c = inode->i_sb->s_fs_info;
+@@ -241,7 +242,7 @@ static int write_begin_slow(struct address_space *mapping,
+       if (unlikely(err))
+               return err;
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (unlikely(!page)) {
+               ubifs_release_budget(c, &req);
+               return -ENOMEM;
+@@ -432,7 +433,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
+               return -EROFS;
+       /* Try out the fast-path part first */
+-      page = __grab_cache_page(mapping, index);
++      page = grab_cache_page_write_begin(mapping, index, flags);
+       if (unlikely(!page))
+               return -ENOMEM;
+@@ -477,7 +478,7 @@ static int ubifs_write_begin(struct file *file, struct address_space *mapping,
+               unlock_page(page);
+               page_cache_release(page);
+-              return write_begin_slow(mapping, pos, len, pagep);
++              return write_begin_slow(mapping, pos, len, pagep, flags);
+       }
+       /*
+diff --git a/fs/utimes.c b/fs/utimes.c
+index 6929e3e..e4c75db 100644
+--- a/fs/utimes.c
++++ b/fs/utimes.c
+@@ -24,7 +24,7 @@
+  * must be owner or have write permission.
+  * Else, update from *times, must be owner or super user.
+  */
+-asmlinkage long sys_utime(char __user *filename, struct utimbuf __user *times)
++SYSCALL_DEFINE2(utime, char __user *, filename, struct utimbuf __user *, times)
+ {
+       struct timespec tv[2];
+@@ -170,7 +170,8 @@ out:
+       return error;
+ }
+-asmlinkage long sys_utimensat(int dfd, char __user *filename, struct timespec __user *utimes, int flags)
++SYSCALL_DEFINE4(utimensat, int, dfd, char __user *, filename,
++              struct timespec __user *, utimes, int, flags)
+ {
+       struct timespec tstimes[2];
+@@ -187,7 +188,8 @@ asmlinkage long sys_utimensat(int dfd, char __user *filename, struct timespec __
+       return do_utimes(dfd, filename, utimes ? tstimes : NULL, flags);
+ }
+-asmlinkage long sys_futimesat(int dfd, char __user *filename, struct timeval __user *utimes)
++SYSCALL_DEFINE3(futimesat, int, dfd, char __user *, filename,
++              struct timeval __user *, utimes)
+ {
+       struct timeval times[2];
+       struct timespec tstimes[2];
+@@ -214,7 +216,8 @@ asmlinkage long sys_futimesat(int dfd, char __user *filename, struct timeval __u
+       return do_utimes(dfd, filename, utimes ? tstimes : NULL, 0);
+ }
+-asmlinkage long sys_utimes(char __user *filename, struct timeval __user *utimes)
++SYSCALL_DEFINE2(utimes, char __user *, filename,
++              struct timeval __user *, utimes)
+ {
+       return sys_futimesat(AT_FDCWD, filename, utimes);
+ }
+diff --git a/fs/xattr.c b/fs/xattr.c
+index 468377e..086db06 100644
+--- a/fs/xattr.c
++++ b/fs/xattr.c
+@@ -251,9 +251,9 @@ setxattr(struct dentry *d, const char __user *name, const void __user *value,
+       return error;
+ }
+-asmlinkage long
+-sys_setxattr(const char __user *pathname, const char __user *name,
+-           const void __user *value, size_t size, int flags)
++SYSCALL_DEFINE5(setxattr, const char __user *, pathname,
++              const char __user *, name, const void __user *, value,
++              size_t, size, int, flags)
+ {
+       struct path path;
+       int error;
+@@ -270,9 +270,9 @@ sys_setxattr(const char __user *pathname, const char __user *name,
+       return error;
+ }
+-asmlinkage long
+-sys_lsetxattr(const char __user *pathname, const char __user *name,
+-            const void __user *value, size_t size, int flags)
++SYSCALL_DEFINE5(lsetxattr, const char __user *, pathname,
++              const char __user *, name, const void __user *, value,
++              size_t, size, int, flags)
+ {
+       struct path path;
+       int error;
+@@ -289,9 +289,8 @@ sys_lsetxattr(const char __user *pathname, const char __user *name,
+       return error;
+ }
+-asmlinkage long
+-sys_fsetxattr(int fd, const char __user *name, const void __user *value,
+-            size_t size, int flags)
++SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
++              const void __user *,value, size_t, size, int, flags)
+ {
+       struct file *f;
+       struct dentry *dentry;
+@@ -349,9 +348,8 @@ getxattr(struct dentry *d, const char __user *name, void __user *value,
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_getxattr(const char __user *pathname, const char __user *name,
+-           void __user *value, size_t size)
++SYSCALL_DEFINE4(getxattr, const char __user *, pathname,
++              const char __user *, name, void __user *, value, size_t, size)
+ {
+       struct path path;
+       ssize_t error;
+@@ -364,9 +362,8 @@ sys_getxattr(const char __user *pathname, const char __user *name,
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_lgetxattr(const char __user *pathname, const char __user *name, void __user *value,
+-            size_t size)
++SYSCALL_DEFINE4(lgetxattr, const char __user *, pathname,
++              const char __user *, name, void __user *, value, size_t, size)
+ {
+       struct path path;
+       ssize_t error;
+@@ -379,8 +376,8 @@ sys_lgetxattr(const char __user *pathname, const char __user *name, void __user
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_fgetxattr(int fd, const char __user *name, void __user *value, size_t size)
++SYSCALL_DEFINE4(fgetxattr, int, fd, const char __user *, name,
++              void __user *, value, size_t, size)
+ {
+       struct file *f;
+       ssize_t error = -EBADF;
+@@ -424,8 +421,8 @@ listxattr(struct dentry *d, char __user *list, size_t size)
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_listxattr(const char __user *pathname, char __user *list, size_t size)
++SYSCALL_DEFINE3(listxattr, const char __user *, pathname, char __user *, list,
++              size_t, size)
+ {
+       struct path path;
+       ssize_t error;
+@@ -438,8 +435,8 @@ sys_listxattr(const char __user *pathname, char __user *list, size_t size)
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_llistxattr(const char __user *pathname, char __user *list, size_t size)
++SYSCALL_DEFINE3(llistxattr, const char __user *, pathname, char __user *, list,
++              size_t, size)
+ {
+       struct path path;
+       ssize_t error;
+@@ -452,8 +449,7 @@ sys_llistxattr(const char __user *pathname, char __user *list, size_t size)
+       return error;
+ }
+-asmlinkage ssize_t
+-sys_flistxattr(int fd, char __user *list, size_t size)
++SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
+ {
+       struct file *f;
+       ssize_t error = -EBADF;
+@@ -485,8 +481,8 @@ removexattr(struct dentry *d, const char __user *name)
+       return vfs_removexattr(d, kname);
+ }
+-asmlinkage long
+-sys_removexattr(const char __user *pathname, const char __user *name)
++SYSCALL_DEFINE2(removexattr, const char __user *, pathname,
++              const char __user *, name)
+ {
+       struct path path;
+       int error;
+@@ -503,8 +499,8 @@ sys_removexattr(const char __user *pathname, const char __user *name)
+       return error;
+ }
+-asmlinkage long
+-sys_lremovexattr(const char __user *pathname, const char __user *name)
++SYSCALL_DEFINE2(lremovexattr, const char __user *, pathname,
++              const char __user *, name)
+ {
+       struct path path;
+       int error;
+@@ -521,8 +517,7 @@ sys_lremovexattr(const char __user *pathname, const char __user *name)
+       return error;
+ }
+-asmlinkage long
+-sys_fremovexattr(int fd, const char __user *name)
++SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
+ {
+       struct file *f;
+       struct dentry *dentry;
+diff --git a/include/linux/compat.h b/include/linux/compat.h
+index cf8d11c..275b9bd 100644
+--- a/include/linux/compat.h
++++ b/include/linux/compat.h
+@@ -278,5 +278,18 @@ asmlinkage long compat_sys_timerfd_settime(int ufd, int flags,
+ asmlinkage long compat_sys_timerfd_gettime(int ufd,
+                                  struct compat_itimerspec __user *otmr);
++asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
++                                    __u32 __user *pages,
++                                    const int __user *nodes,
++                                    int __user *status,
++                                    int flags);
++asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename,
++                                   struct compat_timeval __user *t);
++asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
++                                    struct compat_stat __user *statbuf,
++                                    int flag);
++asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
++                                int flags, int mode);
++
+ #endif /* CONFIG_COMPAT */
+ #endif /* _LINUX_COMPAT_H */
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index 580b513..d621217 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -403,6 +403,9 @@ enum positive_aop_returns {
+ #define AOP_FLAG_UNINTERRUPTIBLE      0x0001 /* will not do a short write */
+ #define AOP_FLAG_CONT_EXPAND          0x0002 /* called from cont_expand */
++#define AOP_FLAG_NOFS                 0x0004 /* used by filesystem to direct
++                                              * helper code (eg buffer layer)
++                                              * to clear GFP_FS from alloc */
+ /*
+  * oh the beauties of C type declarations.
+@@ -1959,7 +1962,7 @@ extern int page_readlink(struct dentry *, char __user *, int);
+ extern void *page_follow_link_light(struct dentry *, struct nameidata *);
+ extern void page_put_link(struct dentry *, struct nameidata *, void *);
+ extern int __page_symlink(struct inode *inode, const char *symname, int len,
+-              gfp_t gfp_mask);
++              int nofs);
+ extern int page_symlink(struct inode *inode, const char *symname, int len);
+ extern const struct inode_operations page_symlink_inode_operations;
+ extern int generic_readlink(struct dentry *, char __user *, int);
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 72a15dc..856d52a 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -253,7 +253,6 @@ static inline int put_page_testzero(struct page *page)
+  */
+ static inline int get_page_unless_zero(struct page *page)
+ {
+-      VM_BUG_ON(PageTail(page));
+       return atomic_inc_not_zero(&page->_count);
+ }
+diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h
+index 5da31c1..62efceb 100644
+--- a/include/linux/pagemap.h
++++ b/include/linux/pagemap.h
+@@ -213,7 +213,8 @@ unsigned find_get_pages_contig(struct address_space *mapping, pgoff_t start,
+ unsigned find_get_pages_tag(struct address_space *mapping, pgoff_t *index,
+                       int tag, unsigned int nr_pages, struct page **pages);
+-struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index);
++struct page *grab_cache_page_write_begin(struct address_space *mapping,
++                      pgoff_t index, unsigned flags);
+ /*
+  * Returns locked page at given index in given cache, creating it if needed.
+diff --git a/include/linux/radix-tree.h b/include/linux/radix-tree.h
+index a916c66..355f6e8 100644
+--- a/include/linux/radix-tree.h
++++ b/include/linux/radix-tree.h
+@@ -136,7 +136,7 @@ do {                                                                       \
+  */
+ static inline void *radix_tree_deref_slot(void **pslot)
+ {
+-      void *ret = *pslot;
++      void *ret = rcu_dereference(*pslot);
+       if (unlikely(radix_tree_is_indirect_ptr(ret)))
+               ret = RADIX_TREE_RETRY;
+       return ret;
+diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
+index d6ff145..f54aa38 100644
+--- a/include/linux/syscalls.h
++++ b/include/linux/syscalls.h
+@@ -54,6 +54,7 @@ struct compat_stat;
+ struct compat_timeval;
+ struct robust_list_head;
+ struct getcpu_cache;
++struct old_linux_dirent;
+ #include <linux/types.h>
+ #include <linux/aio_abi.h>
+@@ -65,6 +66,74 @@ struct getcpu_cache;
+ #include <linux/quota.h>
+ #include <linux/key.h>
++#define __SC_DECL1(t1, a1)    t1 a1
++#define __SC_DECL2(t2, a2, ...) t2 a2, __SC_DECL1(__VA_ARGS__)
++#define __SC_DECL3(t3, a3, ...) t3 a3, __SC_DECL2(__VA_ARGS__)
++#define __SC_DECL4(t4, a4, ...) t4 a4, __SC_DECL3(__VA_ARGS__)
++#define __SC_DECL5(t5, a5, ...) t5 a5, __SC_DECL4(__VA_ARGS__)
++#define __SC_DECL6(t6, a6, ...) t6 a6, __SC_DECL5(__VA_ARGS__)
++
++#define __SC_LONG1(t1, a1)    long a1
++#define __SC_LONG2(t2, a2, ...) long a2, __SC_LONG1(__VA_ARGS__)
++#define __SC_LONG3(t3, a3, ...) long a3, __SC_LONG2(__VA_ARGS__)
++#define __SC_LONG4(t4, a4, ...) long a4, __SC_LONG3(__VA_ARGS__)
++#define __SC_LONG5(t5, a5, ...) long a5, __SC_LONG4(__VA_ARGS__)
++#define __SC_LONG6(t6, a6, ...) long a6, __SC_LONG5(__VA_ARGS__)
++
++#define __SC_CAST1(t1, a1)    (t1) a1
++#define __SC_CAST2(t2, a2, ...) (t2) a2, __SC_CAST1(__VA_ARGS__)
++#define __SC_CAST3(t3, a3, ...) (t3) a3, __SC_CAST2(__VA_ARGS__)
++#define __SC_CAST4(t4, a4, ...) (t4) a4, __SC_CAST3(__VA_ARGS__)
++#define __SC_CAST5(t5, a5, ...) (t5) a5, __SC_CAST4(__VA_ARGS__)
++#define __SC_CAST6(t6, a6, ...) (t6) a6, __SC_CAST5(__VA_ARGS__)
++
++#define __SC_TEST(type)               BUILD_BUG_ON(sizeof(type) > sizeof(long))
++#define __SC_TEST1(t1, a1)    __SC_TEST(t1)
++#define __SC_TEST2(t2, a2, ...)       __SC_TEST(t2); __SC_TEST1(__VA_ARGS__)
++#define __SC_TEST3(t3, a3, ...)       __SC_TEST(t3); __SC_TEST2(__VA_ARGS__)
++#define __SC_TEST4(t4, a4, ...)       __SC_TEST(t4); __SC_TEST3(__VA_ARGS__)
++#define __SC_TEST5(t5, a5, ...)       __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
++#define __SC_TEST6(t6, a6, ...)       __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
++
++#define SYSCALL_DEFINE0(name)   asmlinkage long sys_##name(void)
++#define SYSCALL_DEFINE1(...)    SYSCALL_DEFINEx(1, __VA_ARGS__)
++#define SYSCALL_DEFINE2(...)    SYSCALL_DEFINEx(2, __VA_ARGS__)
++#define SYSCALL_DEFINE3(...)    SYSCALL_DEFINEx(3, __VA_ARGS__)
++#define SYSCALL_DEFINE4(...)    SYSCALL_DEFINEx(4, __VA_ARGS__)
++#define SYSCALL_DEFINE5(...)    SYSCALL_DEFINEx(5, __VA_ARGS__)
++#define SYSCALL_DEFINE6(...)    SYSCALL_DEFINEx(6, __VA_ARGS__)
++
++#ifdef CONFIG_PPC64
++#define SYSCALL_ALIAS(alias, name)                                    \
++      asm ("\t.globl " #alias "\n\t.set " #alias ", " #name "\n"      \
++           "\t.globl ." #alias "\n\t.set ." #alias ", ." #name)
++#else
++#define SYSCALL_ALIAS(alias, name)                                    \
++      asm ("\t.globl " #alias "\n\t.set " #alias ", " #name)
++#endif
++
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++
++#define SYSCALL_DEFINE(name) static inline long SYSC_##name
++#define SYSCALL_DEFINEx(x, name, ...)                                 \
++      asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__));          \
++      static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__));      \
++      asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__))           \
++      {                                                               \
++              __SC_TEST##x(__VA_ARGS__);                              \
++              return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__));   \
++      }                                                               \
++      SYSCALL_ALIAS(sys_##name, SyS_##name);                          \
++      static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__))
++
++#else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
++
++#define SYSCALL_DEFINE(name) asmlinkage long sys_##name
++#define SYSCALL_DEFINEx(x, name, ...)                                 \
++      asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__))
++
++#endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
++
+ asmlinkage long sys_time(time_t __user *tloc);
+ asmlinkage long sys_stime(time_t __user *tptr);
+ asmlinkage long sys_gettimeofday(struct timeval __user *tv,
+@@ -77,7 +146,7 @@ asmlinkage long sys_times(struct tms __user *tbuf);
+ asmlinkage long sys_gettid(void);
+ asmlinkage long sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp);
+-asmlinkage unsigned long sys_alarm(unsigned int seconds);
++asmlinkage long sys_alarm(unsigned int seconds);
+ asmlinkage long sys_getpid(void);
+ asmlinkage long sys_getppid(void);
+ asmlinkage long sys_getuid(void);
+@@ -166,7 +235,7 @@ asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
+                               unsigned long flags);
+ asmlinkage long sys_exit(int error_code);
+-asmlinkage void sys_exit_group(int error_code);
++asmlinkage long sys_exit_group(int error_code);
+ asmlinkage long sys_wait4(pid_t pid, int __user *stat_addr,
+                               int options, struct rusage __user *ru);
+ asmlinkage long sys_waitid(int which, pid_t pid,
+@@ -196,7 +265,7 @@ asmlinkage long sys_tkill(int pid, int sig);
+ asmlinkage long sys_rt_sigqueueinfo(int pid, int sig, siginfo_t __user *uinfo);
+ asmlinkage long sys_sgetmask(void);
+ asmlinkage long sys_ssetmask(int newmask);
+-asmlinkage unsigned long sys_signal(int sig, __sighandler_t handler);
++asmlinkage long sys_signal(int sig, __sighandler_t handler);
+ asmlinkage long sys_pause(void);
+ asmlinkage long sys_sync(void);
+@@ -246,29 +315,29 @@ asmlinkage long sys_lsetxattr(const char __user *path, const char __user *name,
+                             const void __user *value, size_t size, int flags);
+ asmlinkage long sys_fsetxattr(int fd, const char __user *name,
+                             const void __user *value, size_t size, int flags);
+-asmlinkage ssize_t sys_getxattr(const char __user *path, const char __user *name,
+-                              void __user *value, size_t size);
+-asmlinkage ssize_t sys_lgetxattr(const char __user *path, const char __user *name,
+-                              void __user *value, size_t size);
+-asmlinkage ssize_t sys_fgetxattr(int fd, const char __user *name,
+-                              void __user *value, size_t size);
+-asmlinkage ssize_t sys_listxattr(const char __user *path, char __user *list,
+-                              size_t size);
+-asmlinkage ssize_t sys_llistxattr(const char __user *path, char __user *list,
+-                              size_t size);
+-asmlinkage ssize_t sys_flistxattr(int fd, char __user *list, size_t size);
++asmlinkage long sys_getxattr(const char __user *path, const char __user *name,
++                           void __user *value, size_t size);
++asmlinkage long sys_lgetxattr(const char __user *path, const char __user *name,
++                            void __user *value, size_t size);
++asmlinkage long sys_fgetxattr(int fd, const char __user *name,
++                            void __user *value, size_t size);
++asmlinkage long sys_listxattr(const char __user *path, char __user *list,
++                            size_t size);
++asmlinkage long sys_llistxattr(const char __user *path, char __user *list,
++                             size_t size);
++asmlinkage long sys_flistxattr(int fd, char __user *list, size_t size);
+ asmlinkage long sys_removexattr(const char __user *path,
+                               const char __user *name);
+ asmlinkage long sys_lremovexattr(const char __user *path,
+                                const char __user *name);
+ asmlinkage long sys_fremovexattr(int fd, const char __user *name);
+-asmlinkage unsigned long sys_brk(unsigned long brk);
++asmlinkage long sys_brk(unsigned long brk);
+ asmlinkage long sys_mprotect(unsigned long start, size_t len,
+                               unsigned long prot);
+-asmlinkage unsigned long sys_mremap(unsigned long addr,
+-                              unsigned long old_len, unsigned long new_len,
+-                              unsigned long flags, unsigned long new_addr);
++asmlinkage long sys_mremap(unsigned long addr,
++                         unsigned long old_len, unsigned long new_len,
++                         unsigned long flags, unsigned long new_addr);
+ asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
+                       unsigned long prot, unsigned long pgoff,
+                       unsigned long flags);
+@@ -321,10 +390,10 @@ asmlinkage long sys_io_submit(aio_context_t, long,
+                               struct iocb __user * __user *);
+ asmlinkage long sys_io_cancel(aio_context_t ctx_id, struct iocb __user *iocb,
+                             struct io_event __user *result);
+-asmlinkage ssize_t sys_sendfile(int out_fd, int in_fd,
+-                              off_t __user *offset, size_t count);
+-asmlinkage ssize_t sys_sendfile64(int out_fd, int in_fd,
+-                              loff_t __user *offset, size_t count);
++asmlinkage long sys_sendfile(int out_fd, int in_fd,
++                           off_t __user *offset, size_t count);
++asmlinkage long sys_sendfile64(int out_fd, int in_fd,
++                             loff_t __user *offset, size_t count);
+ asmlinkage long sys_readlink(const char __user *path,
+                               char __user *buf, int bufsiz);
+ asmlinkage long sys_creat(const char __user *pathname, int mode);
+@@ -368,26 +437,25 @@ asmlinkage long sys_utime(char __user *filename,
+                               struct utimbuf __user *times);
+ asmlinkage long sys_utimes(char __user *filename,
+                               struct timeval __user *utimes);
+-asmlinkage off_t sys_lseek(unsigned int fd, off_t offset,
+-                              unsigned int origin);
++asmlinkage long sys_lseek(unsigned int fd, off_t offset,
++                        unsigned int origin);
+ asmlinkage long sys_llseek(unsigned int fd, unsigned long offset_high,
+                       unsigned long offset_low, loff_t __user *result,
+                       unsigned int origin);
+-asmlinkage ssize_t sys_read(unsigned int fd, char __user *buf,
+-                              size_t count);
+-asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count);
+-asmlinkage ssize_t sys_readv(unsigned long fd,
+-                              const struct iovec __user *vec,
+-                              unsigned long vlen);
+-asmlinkage ssize_t sys_write(unsigned int fd, const char __user *buf,
+-                              size_t count);
+-asmlinkage ssize_t sys_writev(unsigned long fd,
+-                              const struct iovec __user *vec,
+-                              unsigned long vlen);
+-asmlinkage ssize_t sys_pread64(unsigned int fd, char __user *buf,
+-                              size_t count, loff_t pos);
+-asmlinkage ssize_t sys_pwrite64(unsigned int fd, const char __user *buf,
+-                              size_t count, loff_t pos);
++asmlinkage long sys_read(unsigned int fd, char __user *buf, size_t count);
++asmlinkage long sys_readahead(int fd, loff_t offset, size_t count);
++asmlinkage long sys_readv(unsigned long fd,
++                        const struct iovec __user *vec,
++                        unsigned long vlen);
++asmlinkage long sys_write(unsigned int fd, const char __user *buf,
++                        size_t count);
++asmlinkage long sys_writev(unsigned long fd,
++                         const struct iovec __user *vec,
++                         unsigned long vlen);
++asmlinkage long sys_pread64(unsigned int fd, char __user *buf,
++                          size_t count, loff_t pos);
++asmlinkage long sys_pwrite64(unsigned int fd, const char __user *buf,
++                           size_t count, loff_t pos);
+ asmlinkage long sys_getcwd(char __user *buf, unsigned long size);
+ asmlinkage long sys_mkdir(const char __user *pathname, int mode);
+ asmlinkage long sys_chdir(const char __user *filename);
+@@ -477,7 +545,7 @@ asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf);
+ asmlinkage long sys_mq_open(const char __user *name, int oflag, mode_t mode, struct mq_attr __user *attr);
+ asmlinkage long sys_mq_unlink(const char __user *name);
+ asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *msg_ptr, size_t msg_len, unsigned int msg_prio, const struct timespec __user *abs_timeout);
+-asmlinkage ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout);
++asmlinkage long sys_mq_timedreceive(mqd_t mqdes, char __user *msg_ptr, size_t msg_len, unsigned int __user *msg_prio, const struct timespec __user *abs_timeout);
+ asmlinkage long sys_mq_notify(mqd_t mqdes, const struct sigevent __user *notification);
+ asmlinkage long sys_mq_getsetattr(mqd_t mqdes, const struct mq_attr __user *mqstat, struct mq_attr __user *omqstat);
+@@ -531,11 +599,6 @@ asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages,
+                               const int __user *nodes,
+                               int __user *status,
+                               int flags);
+-asmlinkage long compat_sys_move_pages(pid_t pid, unsigned long nr_page,
+-                              __u32 __user *pages,
+-                              const int __user *nodes,
+-                              int __user *status,
+-                              int flags);
+ asmlinkage long sys_mbind(unsigned long start, unsigned long len,
+                               unsigned long mode,
+                               unsigned long __user *nmask,
+@@ -550,7 +613,7 @@ asmlinkage long sys_inotify_init(void);
+ asmlinkage long sys_inotify_init1(int flags);
+ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path,
+                                       u32 mask);
+-asmlinkage long sys_inotify_rm_watch(int fd, u32 wd);
++asmlinkage long sys_inotify_rm_watch(int fd, __s32 wd);
+ asmlinkage long sys_spu_run(int fd, __u32 __user *unpc,
+                                __u32 __user *ustatus);
+@@ -584,13 +647,6 @@ asmlinkage long sys_readlinkat(int dfd, const char __user *path, char __user *bu
+                              int bufsiz);
+ asmlinkage long sys_utimensat(int dfd, char __user *filename,
+                               struct timespec __user *utimes, int flags);
+-asmlinkage long compat_sys_futimesat(unsigned int dfd, char __user *filename,
+-                                   struct compat_timeval __user *t);
+-asmlinkage long compat_sys_newfstatat(unsigned int dfd, char __user * filename,
+-                                    struct compat_stat __user *statbuf,
+-                                    int flag);
+-asmlinkage long compat_sys_openat(unsigned int dfd, const char __user *filename,
+-                                 int flags, int mode);
+ asmlinkage long sys_unshare(unsigned long unshare_flags);
+ asmlinkage long sys_splice(int fd_in, loff_t __user *off_in,
+@@ -622,6 +678,15 @@ asmlinkage long sys_timerfd_gettime(int ufd, struct itimerspec __user *otmr);
+ asmlinkage long sys_eventfd(unsigned int count);
+ asmlinkage long sys_eventfd2(unsigned int count, int flags);
+ asmlinkage long sys_fallocate(int fd, int mode, loff_t offset, loff_t len);
++asmlinkage long sys_old_readdir(unsigned int, struct old_linux_dirent __user *, unsigned int);
++asmlinkage long sys_pselect6(int, fd_set __user *, fd_set __user *,
++                           fd_set __user *, struct timespec __user *,
++                           void __user *);
++asmlinkage long sys_ppoll(struct pollfd __user *, unsigned int,
++                        struct timespec __user *, const sigset_t __user *,
++                        size_t);
++asmlinkage long sys_pipe2(int __user *, int);
++asmlinkage long sys_pipe(int __user *);
+ int kernel_execve(const char *filename, char *const argv[], char *const envp[]);
+diff --git a/include/linux/time.h b/include/linux/time.h
+index e15206a..0095ad1 100644
+--- a/include/linux/time.h
++++ b/include/linux/time.h
+@@ -99,6 +99,7 @@ extern unsigned long read_persistent_clock(void);
+ extern int update_persistent_clock(struct timespec now);
+ extern int no_sync_cmos_clock __read_mostly;
+ void timekeeping_init(void);
++extern int timekeeping_suspended;
+ unsigned long get_seconds(void);
+ struct timespec current_kernel_time(void);
+diff --git a/ipc/mqueue.c b/ipc/mqueue.c
+index 96fb36c..a58bfad 100644
+--- a/ipc/mqueue.c
++++ b/ipc/mqueue.c
+@@ -647,8 +647,8 @@ static int oflag2acc[O_ACCMODE] = { MAY_READ, MAY_WRITE,
+       return dentry_open(dentry, mqueue_mnt, oflag);
+ }
+-asmlinkage long sys_mq_open(const char __user *u_name, int oflag, mode_t mode,
+-                              struct mq_attr __user *u_attr)
++SYSCALL_DEFINE4(mq_open, const char __user *, u_name, int, oflag, mode_t, mode,
++              struct mq_attr __user *, u_attr)
+ {
+       struct dentry *dentry;
+       struct file *filp;
+@@ -715,7 +715,7 @@ out_putname:
+       return fd;
+ }
+-asmlinkage long sys_mq_unlink(const char __user *u_name)
++SYSCALL_DEFINE1(mq_unlink, const char __user *, u_name)
+ {
+       int err;
+       char *name;
+@@ -808,9 +808,9 @@ static inline void pipelined_receive(struct mqueue_inode_info *info)
+       sender->state = STATE_READY;
+ }
+-asmlinkage long sys_mq_timedsend(mqd_t mqdes, const char __user *u_msg_ptr,
+-      size_t msg_len, unsigned int msg_prio,
+-      const struct timespec __user *u_abs_timeout)
++SYSCALL_DEFINE5(mq_timedsend, mqd_t, mqdes, const char __user *, u_msg_ptr,
++              size_t, msg_len, unsigned int, msg_prio,
++              const struct timespec __user *, u_abs_timeout)
+ {
+       struct file *filp;
+       struct inode *inode;
+@@ -896,9 +896,9 @@ out:
+       return ret;
+ }
+-asmlinkage ssize_t sys_mq_timedreceive(mqd_t mqdes, char __user *u_msg_ptr,
+-      size_t msg_len, unsigned int __user *u_msg_prio,
+-      const struct timespec __user *u_abs_timeout)
++SYSCALL_DEFINE5(mq_timedreceive, mqd_t, mqdes, char __user *, u_msg_ptr,
++              size_t, msg_len, unsigned int __user *, u_msg_prio,
++              const struct timespec __user *, u_abs_timeout)
+ {
+       long timeout;
+       ssize_t ret;
+@@ -981,8 +981,8 @@ out:
+  * and he isn't currently owner of notification, will be silently discarded.
+  * It isn't explicitly defined in the POSIX.
+  */
+-asmlinkage long sys_mq_notify(mqd_t mqdes,
+-                              const struct sigevent __user *u_notification)
++SYSCALL_DEFINE2(mq_notify, mqd_t, mqdes,
++              const struct sigevent __user *, u_notification)
+ {
+       int ret;
+       struct file *filp;
+@@ -1107,9 +1107,9 @@ out:
+       return ret;
+ }
+-asmlinkage long sys_mq_getsetattr(mqd_t mqdes,
+-                      const struct mq_attr __user *u_mqstat,
+-                      struct mq_attr __user *u_omqstat)
++SYSCALL_DEFINE3(mq_getsetattr, mqd_t, mqdes,
++              const struct mq_attr __user *, u_mqstat,
++              struct mq_attr __user *, u_omqstat)
+ {
+       int ret;
+       struct mq_attr mqstat, omqstat;
+diff --git a/ipc/msg.c b/ipc/msg.c
+index b4eee1c..2ceab7f 100644
+--- a/ipc/msg.c
++++ b/ipc/msg.c
+@@ -309,7 +309,7 @@ static inline int msg_security(struct kern_ipc_perm *ipcp, int msgflg)
+       return security_msg_queue_associate(msq, msgflg);
+ }
+-asmlinkage long sys_msgget(key_t key, int msgflg)
++SYSCALL_DEFINE2(msgget, key_t, key, int, msgflg)
+ {
+       struct ipc_namespace *ns;
+       struct ipc_ops msg_ops;
+@@ -466,7 +466,7 @@ out_up:
+       return err;
+ }
+-asmlinkage long sys_msgctl(int msqid, int cmd, struct msqid_ds __user *buf)
++SYSCALL_DEFINE3(msgctl, int, msqid, int, cmd, struct msqid_ds __user *, buf)
+ {
+       struct msg_queue *msq;
+       int err, version;
+@@ -723,8 +723,8 @@ out_free:
+       return err;
+ }
+-asmlinkage long
+-sys_msgsnd(int msqid, struct msgbuf __user *msgp, size_t msgsz, int msgflg)
++SYSCALL_DEFINE4(msgsnd, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
++              int, msgflg)
+ {
+       long mtype;
+@@ -904,8 +904,8 @@ out_unlock:
+       return msgsz;
+ }
+-asmlinkage long sys_msgrcv(int msqid, struct msgbuf __user *msgp, size_t msgsz,
+-                         long msgtyp, int msgflg)
++SYSCALL_DEFINE5(msgrcv, int, msqid, struct msgbuf __user *, msgp, size_t, msgsz,
++              long, msgtyp, int, msgflg)
+ {
+       long err, mtype;
+diff --git a/ipc/sem.c b/ipc/sem.c
+index bf1bc36..9eb9d31 100644
+--- a/ipc/sem.c
++++ b/ipc/sem.c
+@@ -308,7 +308,7 @@ static inline int sem_more_checks(struct kern_ipc_perm *ipcp,
+       return 0;
+ }
+-asmlinkage long sys_semget(key_t key, int nsems, int semflg)
++SYSCALL_DEFINE3(semget, key_t, key, int, nsems, int, semflg)
+ {
+       struct ipc_namespace *ns;
+       struct ipc_ops sem_ops;
+@@ -887,7 +887,7 @@ out_up:
+       return err;
+ }
+-asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg)
++SYSCALL_DEFINE(semctl)(int semid, int semnum, int cmd, union semun arg)
+ {
+       int err = -EINVAL;
+       int version;
+@@ -923,6 +923,13 @@ asmlinkage long sys_semctl (int semid, int semnum, int cmd, union semun arg)
+               return -EINVAL;
+       }
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_semctl(int semid, int semnum, int cmd, union semun arg)
++{
++      return SYSC_semctl((int) semid, (int) semnum, (int) cmd, arg);
++}
++SYSCALL_ALIAS(sys_semctl, SyS_semctl);
++#endif
+ /* If the task doesn't already have a undo_list, then allocate one
+  * here.  We guarantee there is only one thread using this undo list,
+@@ -1048,8 +1055,8 @@ out:
+       return un;
+ }
+-asmlinkage long sys_semtimedop(int semid, struct sembuf __user *tsops,
+-                      unsigned nsops, const struct timespec __user *timeout)
++SYSCALL_DEFINE4(semtimedop, int, semid, struct sembuf __user *, tsops,
++              unsigned, nsops, const struct timespec __user *, timeout)
+ {
+       int error = -EINVAL;
+       struct sem_array *sma;
+@@ -1226,7 +1233,8 @@ out_free:
+       return error;
+ }
+-asmlinkage long sys_semop (int semid, struct sembuf __user *tsops, unsigned nsops)
++SYSCALL_DEFINE3(semop, int, semid, struct sembuf __user *, tsops,
++              unsigned, nsops)
+ {
+       return sys_semtimedop(semid, tsops, nsops, NULL);
+ }
+diff --git a/ipc/shm.c b/ipc/shm.c
+index e77ec69..f00c897 100644
+--- a/ipc/shm.c
++++ b/ipc/shm.c
+@@ -440,7 +440,7 @@ static inline int shm_more_checks(struct kern_ipc_perm *ipcp,
+       return 0;
+ }
+-asmlinkage long sys_shmget (key_t key, size_t size, int shmflg)
++SYSCALL_DEFINE3(shmget, key_t, key, size_t, size, int, shmflg)
+ {
+       struct ipc_namespace *ns;
+       struct ipc_ops shm_ops;
+@@ -621,7 +621,7 @@ out_up:
+       return err;
+ }
+-asmlinkage long sys_shmctl(int shmid, int cmd, struct shmid_ds __user *buf)
++SYSCALL_DEFINE3(shmctl, int, shmid, int, cmd, struct shmid_ds __user *, buf)
+ {
+       struct shmid_kernel *shp;
+       int err, version;
+@@ -941,7 +941,7 @@ out_put_dentry:
+       goto out_nattch;
+ }
+-asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg)
++SYSCALL_DEFINE3(shmat, int, shmid, char __user *, shmaddr, int, shmflg)
+ {
+       unsigned long ret;
+       long err;
+@@ -957,7 +957,7 @@ asmlinkage long sys_shmat(int shmid, char __user *shmaddr, int shmflg)
+  * detach and kill segment if marked destroyed.
+  * The work is done in shm_close.
+  */
+-asmlinkage long sys_shmdt(char __user *shmaddr)
++SYSCALL_DEFINE1(shmdt, char __user *, shmaddr)
+ {
+       struct mm_struct *mm = current->mm;
+       struct vm_area_struct *vma, *next;
+diff --git a/kernel/acct.c b/kernel/acct.c
+index dd68b90..a272f53 100644
+--- a/kernel/acct.c
++++ b/kernel/acct.c
+@@ -277,7 +277,7 @@ static int acct_on(char *name)
+  * should be written. If the filename is NULL, accounting will be
+  * shutdown.
+  */
+-asmlinkage long sys_acct(const char __user *name)
++SYSCALL_DEFINE1(acct, const char __user *, name)
+ {
+       int error;
+diff --git a/kernel/capability.c b/kernel/capability.c
+index 33e51e7..6ec8359 100644
+--- a/kernel/capability.c
++++ b/kernel/capability.c
+@@ -348,7 +348,7 @@ EXPORT_SYMBOL(cap_set_effective);
+  *
+  * Returns 0 on success and < 0 on error.
+  */
+-asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
++SYSCALL_DEFINE2(capget, cap_user_header_t, header, cap_user_data_t, dataptr)
+ {
+       int ret = 0;
+       pid_t pid;
+@@ -425,7 +425,7 @@ asmlinkage long sys_capget(cap_user_header_t header, cap_user_data_t dataptr)
+  *
+  * Returns 0 on success and < 0 on error.
+  */
+-asmlinkage long sys_capset(cap_user_header_t header, const cap_user_data_t data)
++SYSCALL_DEFINE2(capset, cap_user_header_t, header, const cap_user_data_t, data)
+ {
+       struct __user_cap_data_struct kdata[_KERNEL_CAPABILITY_U32S];
+       unsigned i, tocopy;
+diff --git a/kernel/cgroup.c b/kernel/cgroup.c
+index 0ba3a5a..271763d 100644
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -2885,7 +2885,11 @@ int cgroup_clone(struct task_struct *tsk, struct cgroup_subsys *subsys,
+       parent = task_cgroup(tsk, subsys->subsys_id);
+       /* Pin the hierarchy */
+-      atomic_inc(&parent->root->sb->s_active);
++      if (!atomic_inc_not_zero(&parent->root->sb->s_active)) {
++              /* We race with the final deactivate_super() */
++              mutex_unlock(&cgroup_mutex);
++              return 0;
++      }
+       /* Keep the cgroup alive */
+       get_css_set(cg);
+diff --git a/kernel/exec_domain.c b/kernel/exec_domain.c
+index 0d407e8..18e8a50 100644
+--- a/kernel/exec_domain.c
++++ b/kernel/exec_domain.c
+@@ -188,8 +188,7 @@ get_exec_domain_list(char *page)
+       return (len);
+ }
+-asmlinkage long
+-sys_personality(u_long personality)
++SYSCALL_DEFINE1(personality, u_long, personality)
+ {
+       u_long old = current->personality;
+diff --git a/kernel/exit.c b/kernel/exit.c
+index 85a83c8..14096a1 100644
+--- a/kernel/exit.c
++++ b/kernel/exit.c
+@@ -1145,7 +1145,7 @@ NORET_TYPE void complete_and_exit(struct completion *comp, long code)
+ EXPORT_SYMBOL(complete_and_exit);
+-asmlinkage long sys_exit(int error_code)
++SYSCALL_DEFINE1(exit, int, error_code)
+ {
+       do_exit((error_code&0xff)<<8);
+ }
+@@ -1186,9 +1186,11 @@ do_group_exit(int exit_code)
+  * wait4()-ing process will get the correct exit code - even if this
+  * thread is not the thread group leader.
+  */
+-asmlinkage void sys_exit_group(int error_code)
++SYSCALL_DEFINE1(exit_group, int, error_code)
+ {
+       do_group_exit((error_code & 0xff) << 8);
++      /* NOTREACHED */
++      return 0;
+ }
+ static struct pid *task_pid_type(struct task_struct *task, enum pid_type type)
+@@ -1749,9 +1751,8 @@ end:
+       return retval;
+ }
+-asmlinkage long sys_waitid(int which, pid_t upid,
+-                         struct siginfo __user *infop, int options,
+-                         struct rusage __user *ru)
++SYSCALL_DEFINE5(waitid, int, which, pid_t, upid, struct siginfo __user *,
++              infop, int, options, struct rusage __user *, ru)
+ {
+       struct pid *pid = NULL;
+       enum pid_type type;
+@@ -1790,8 +1791,8 @@ asmlinkage long sys_waitid(int which, pid_t upid,
+       return ret;
+ }
+-asmlinkage long sys_wait4(pid_t upid, int __user *stat_addr,
+-                        int options, struct rusage __user *ru)
++SYSCALL_DEFINE4(wait4, pid_t, upid, int __user *, stat_addr,
++              int, options, struct rusage __user *, ru)
+ {
+       struct pid *pid = NULL;
+       enum pid_type type;
+@@ -1828,7 +1829,7 @@ asmlinkage long sys_wait4(pid_t upid, int __user *stat_addr,
+  * sys_waitpid() remains for compatibility. waitpid() should be
+  * implemented by calling sys_wait4() from libc.a.
+  */
+-asmlinkage long sys_waitpid(pid_t pid, int __user *stat_addr, int options)
++SYSCALL_DEFINE3(waitpid, pid_t, pid, int __user *, stat_addr, int, options)
+ {
+       return sys_wait4(pid, stat_addr, options, NULL);
+ }
+diff --git a/kernel/fork.c b/kernel/fork.c
+index d8ad2c6..42fb5b0 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -865,7 +865,7 @@ static void copy_flags(unsigned long clone_flags, struct task_struct *p)
+       clear_freeze_flag(p);
+ }
+-asmlinkage long sys_set_tid_address(int __user *tidptr)
++SYSCALL_DEFINE1(set_tid_address, int __user *, tidptr)
+ {
+       current->clear_child_tid = tidptr;
+@@ -1561,7 +1561,7 @@ static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp
+  * constructed. Here we are modifying the current, active,
+  * task_struct.
+  */
+-asmlinkage long sys_unshare(unsigned long unshare_flags)
++SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags)
+ {
+       int err = 0;
+       struct fs_struct *fs, *new_fs = NULL;
+diff --git a/kernel/futex.c b/kernel/futex.c
+index 7d1136e..ec84da5 100644
+--- a/kernel/futex.c
++++ b/kernel/futex.c
+@@ -1797,9 +1797,8 @@ pi_faulted:
+  * @head: pointer to the list-head
+  * @len: length of the list-head, as userspace expects
+  */
+-asmlinkage long
+-sys_set_robust_list(struct robust_list_head __user *head,
+-                  size_t len)
++SYSCALL_DEFINE2(set_robust_list, struct robust_list_head __user *, head,
++              size_t, len)
+ {
+       if (!futex_cmpxchg_enabled)
+               return -ENOSYS;
+@@ -1820,9 +1819,9 @@ sys_set_robust_list(struct robust_list_head __user *head,
+  * @head_ptr: pointer to a list-head pointer, the kernel fills it in
+  * @len_ptr: pointer to a length field, the kernel fills in the header size
+  */
+-asmlinkage long
+-sys_get_robust_list(int pid, struct robust_list_head __user * __user *head_ptr,
+-                  size_t __user *len_ptr)
++SYSCALL_DEFINE3(get_robust_list, int, pid,
++              struct robust_list_head __user * __user *, head_ptr,
++              size_t __user *, len_ptr)
+ {
+       struct robust_list_head __user *head;
+       unsigned long ret;
+@@ -2036,9 +2035,9 @@ long do_futex(u32 __user *uaddr, int op, u32 val, ktime_t *timeout,
+ }
+-asmlinkage long sys_futex(u32 __user *uaddr, int op, u32 val,
+-                        struct timespec __user *utime, u32 __user *uaddr2,
+-                        u32 val3)
++SYSCALL_DEFINE6(futex, u32 __user *, uaddr, int, op, u32, val,
++              struct timespec __user *, utime, u32 __user *, uaddr2,
++              u32, val3)
+ {
+       struct timespec ts;
+       ktime_t t, *tp = NULL;
+diff --git a/kernel/hrtimer.c b/kernel/hrtimer.c
+index cdec83e..98bbbe5 100644
+--- a/kernel/hrtimer.c
++++ b/kernel/hrtimer.c
+@@ -1560,8 +1560,8 @@ out:
+       return ret;
+ }
+-asmlinkage long
+-sys_nanosleep(struct timespec __user *rqtp, struct timespec __user *rmtp)
++SYSCALL_DEFINE2(nanosleep, struct timespec __user *, rqtp,
++              struct timespec __user *, rmtp)
+ {
+       struct timespec tu;
+diff --git a/kernel/itimer.c b/kernel/itimer.c
+index ab98274..13470aa 100644
+--- a/kernel/itimer.c
++++ b/kernel/itimer.c
+@@ -109,7 +109,7 @@ int do_getitimer(int which, struct itimerval *value)
+       return 0;
+ }
+-asmlinkage long sys_getitimer(int which, struct itimerval __user *value)
++SYSCALL_DEFINE2(getitimer, int, which, struct itimerval __user *, value)
+ {
+       int error = -EFAULT;
+       struct itimerval get_buffer;
+@@ -273,9 +273,8 @@ unsigned int alarm_setitimer(unsigned int seconds)
+       return it_old.it_value.tv_sec;
+ }
+-asmlinkage long sys_setitimer(int which,
+-                            struct itimerval __user *value,
+-                            struct itimerval __user *ovalue)
++SYSCALL_DEFINE3(setitimer, int, which, struct itimerval __user *, value,
++              struct itimerval __user *, ovalue)
+ {
+       struct itimerval set_buffer, get_buffer;
+       int error;
+diff --git a/kernel/kexec.c b/kernel/kexec.c
+index aef2653..cba525a 100644
+--- a/kernel/kexec.c
++++ b/kernel/kexec.c
+@@ -933,9 +933,8 @@ struct kimage *kexec_crash_image;
+ static DEFINE_MUTEX(kexec_mutex);
+-asmlinkage long sys_kexec_load(unsigned long entry, unsigned long nr_segments,
+-                              struct kexec_segment __user *segments,
+-                              unsigned long flags)
++SYSCALL_DEFINE4(kexec_load, unsigned long, entry, unsigned long, nr_segments,
++              struct kexec_segment __user *, segments, unsigned long, flags)
+ {
+       struct kimage **dest_image, *image;
+       int result;
+diff --git a/kernel/module.c b/kernel/module.c
+index d5fcd24..69d274a 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -715,8 +715,8 @@ static void wait_for_zero_refcount(struct module *mod)
+       mutex_lock(&module_mutex);
+ }
+-asmlinkage long
+-sys_delete_module(const char __user *name_user, unsigned int flags)
++SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
++              unsigned int, flags)
+ {
+       struct module *mod;
+       char name[MODULE_NAME_LEN];
+@@ -2257,10 +2257,8 @@ static noinline struct module *load_module(void __user *umod,
+ }
+ /* This is where the real work happens */
+-asmlinkage long
+-sys_init_module(void __user *umod,
+-              unsigned long len,
+-              const char __user *uargs)
++SYSCALL_DEFINE3(init_module, void __user *, umod,
++              unsigned long, len, const char __user *, uargs)
+ {
+       struct module *mod;
+       int ret = 0;
+diff --git a/kernel/posix-timers.c b/kernel/posix-timers.c
+index 5131e54..24ae236 100644
+--- a/kernel/posix-timers.c
++++ b/kernel/posix-timers.c
+@@ -463,10 +463,9 @@ static void release_posix_timer(struct k_itimer *tmr, int it_id_set)
+ /* Create a POSIX.1b interval timer. */
+-asmlinkage long
+-sys_timer_create(const clockid_t which_clock,
+-               struct sigevent __user *timer_event_spec,
+-               timer_t __user * created_timer_id)
++SYSCALL_DEFINE3(timer_create, const clockid_t, which_clock,
++              struct sigevent __user *, timer_event_spec,
++              timer_t __user *, created_timer_id)
+ {
+       int error = 0;
+       struct k_itimer *new_timer = NULL;
+@@ -682,8 +681,8 @@ common_timer_get(struct k_itimer *timr, struct itimerspec *cur_setting)
+ }
+ /* Get the time remaining on a POSIX.1b interval timer. */
+-asmlinkage long
+-sys_timer_gettime(timer_t timer_id, struct itimerspec __user *setting)
++SYSCALL_DEFINE2(timer_gettime, timer_t, timer_id,
++              struct itimerspec __user *, setting)
+ {
+       struct k_itimer *timr;
+       struct itimerspec cur_setting;
+@@ -712,8 +711,7 @@ sys_timer_gettime(timer_t timer_id, struct itimerspec __user *setting)
+  * the call back to do_schedule_next_timer().  So all we need to do is
+  * to pick up the frozen overrun.
+  */
+-asmlinkage long
+-sys_timer_getoverrun(timer_t timer_id)
++SYSCALL_DEFINE1(timer_getoverrun, timer_t, timer_id)
+ {
+       struct k_itimer *timr;
+       int overrun;
+@@ -783,10 +781,9 @@ common_timer_set(struct k_itimer *timr, int flags,
+ }
+ /* Set a POSIX.1b interval timer */
+-asmlinkage long
+-sys_timer_settime(timer_t timer_id, int flags,
+-                const struct itimerspec __user *new_setting,
+-                struct itimerspec __user *old_setting)
++SYSCALL_DEFINE4(timer_settime, timer_t, timer_id, int, flags,
++              const struct itimerspec __user *, new_setting,
++              struct itimerspec __user *, old_setting)
+ {
+       struct k_itimer *timr;
+       struct itimerspec new_spec, old_spec;
+@@ -839,8 +836,7 @@ static inline int timer_delete_hook(struct k_itimer *timer)
+ }
+ /* Delete a POSIX.1b interval timer. */
+-asmlinkage long
+-sys_timer_delete(timer_t timer_id)
++SYSCALL_DEFINE1(timer_delete, timer_t, timer_id)
+ {
+       struct k_itimer *timer;
+       unsigned long flags;
+@@ -930,8 +926,8 @@ int do_posix_clock_nonanosleep(const clockid_t clock, int flags,
+ }
+ EXPORT_SYMBOL_GPL(do_posix_clock_nonanosleep);
+-asmlinkage long sys_clock_settime(const clockid_t which_clock,
+-                                const struct timespec __user *tp)
++SYSCALL_DEFINE2(clock_settime, const clockid_t, which_clock,
++              const struct timespec __user *, tp)
+ {
+       struct timespec new_tp;
+@@ -943,8 +939,8 @@ asmlinkage long sys_clock_settime(const clockid_t which_clock,
+       return CLOCK_DISPATCH(which_clock, clock_set, (which_clock, &new_tp));
+ }
+-asmlinkage long
+-sys_clock_gettime(const clockid_t which_clock, struct timespec __user *tp)
++SYSCALL_DEFINE2(clock_gettime, const clockid_t, which_clock,
++              struct timespec __user *,tp)
+ {
+       struct timespec kernel_tp;
+       int error;
+@@ -960,8 +956,8 @@ sys_clock_gettime(const clockid_t which_clock, struct timespec __user *tp)
+ }
+-asmlinkage long
+-sys_clock_getres(const clockid_t which_clock, struct timespec __user *tp)
++SYSCALL_DEFINE2(clock_getres, const clockid_t, which_clock,
++              struct timespec __user *, tp)
+ {
+       struct timespec rtn_tp;
+       int error;
+@@ -990,10 +986,9 @@ static int common_nsleep(const clockid_t which_clock, int flags,
+                                which_clock);
+ }
+-asmlinkage long
+-sys_clock_nanosleep(const clockid_t which_clock, int flags,
+-                  const struct timespec __user *rqtp,
+-                  struct timespec __user *rmtp)
++SYSCALL_DEFINE4(clock_nanosleep, const clockid_t, which_clock, int, flags,
++              const struct timespec __user *, rqtp,
++              struct timespec __user *, rmtp)
+ {
+       struct timespec t;
+diff --git a/kernel/printk.c b/kernel/printk.c
+index b51b156..0084812 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -421,7 +421,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_syslog(int type, char __user *buf, int len)
++SYSCALL_DEFINE3(syslog, int, type, char __user *, buf, int, len)
+ {
+       return do_syslog(type, buf, len);
+ }
+@@ -782,11 +782,6 @@ EXPORT_SYMBOL(vprintk);
+ #else
+-asmlinkage long sys_syslog(int type, char __user *buf, int len)
+-{
+-      return -ENOSYS;
+-}
+-
+ static void call_console_drivers(unsigned start, unsigned end)
+ {
+ }
+diff --git a/kernel/ptrace.c b/kernel/ptrace.c
+index 356699a..85c1983 100644
+--- a/kernel/ptrace.c
++++ b/kernel/ptrace.c
+@@ -545,7 +545,7 @@ struct task_struct *ptrace_get_task_struct(pid_t pid)
+ #define arch_ptrace_attach(child)     do { } while (0)
+ #endif
+-asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
++SYSCALL_DEFINE4(ptrace, long, request, long, pid, long, addr, long, data)
+ {
+       struct task_struct *child;
+       long ret;
+diff --git a/kernel/sched.c b/kernel/sched.c
+index 92c0a70..2a09e44 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -4942,7 +4942,7 @@ int can_nice(const struct task_struct *p, const int nice)
+  * sys_setpriority is a more generic, but much slower function that
+  * does similar things.
+  */
+-asmlinkage long sys_nice(int increment)
++SYSCALL_DEFINE1(nice, int, increment)
+ {
+       long nice, retval;
+@@ -5233,8 +5233,8 @@ do_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
+  * @policy: new policy.
+  * @param: structure containing the new RT priority.
+  */
+-asmlinkage long
+-sys_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
++SYSCALL_DEFINE3(sched_setscheduler, pid_t, pid, int, policy,
++              struct sched_param __user *, param)
+ {
+       /* negative values for policy are not valid */
+       if (policy < 0)
+@@ -5248,7 +5248,7 @@ sys_sched_setscheduler(pid_t pid, int policy, struct sched_param __user *param)
+  * @pid: the pid in question.
+  * @param: structure containing the new RT priority.
+  */
+-asmlinkage long sys_sched_setparam(pid_t pid, struct sched_param __user *param)
++SYSCALL_DEFINE2(sched_setparam, pid_t, pid, struct sched_param __user *, param)
+ {
+       return do_sched_setscheduler(pid, -1, param);
+ }
+@@ -5257,7 +5257,7 @@ asmlinkage long sys_sched_setparam(pid_t pid, struct sched_param __user *param)
+  * sys_sched_getscheduler - get the policy (scheduling class) of a thread
+  * @pid: the pid in question.
+  */
+-asmlinkage long sys_sched_getscheduler(pid_t pid)
++SYSCALL_DEFINE1(sched_getscheduler, pid_t, pid)
+ {
+       struct task_struct *p;
+       int retval;
+@@ -5282,7 +5282,7 @@ asmlinkage long sys_sched_getscheduler(pid_t pid)
+  * @pid: the pid in question.
+  * @param: structure containing the RT priority.
+  */
+-asmlinkage long sys_sched_getparam(pid_t pid, struct sched_param __user *param)
++SYSCALL_DEFINE2(sched_getparam, pid_t, pid, struct sched_param __user *, param)
+ {
+       struct sched_param lp;
+       struct task_struct *p;
+@@ -5390,8 +5390,8 @@ static int get_user_cpu_mask(unsigned long __user *user_mask_ptr, unsigned len,
+  * @len: length in bytes of the bitmask pointed to by user_mask_ptr
+  * @user_mask_ptr: user-space pointer to the new cpu mask
+  */
+-asmlinkage long sys_sched_setaffinity(pid_t pid, unsigned int len,
+-                                    unsigned long __user *user_mask_ptr)
++SYSCALL_DEFINE3(sched_setaffinity, pid_t, pid, unsigned int, len,
++              unsigned long __user *, user_mask_ptr)
+ {
+       cpumask_t new_mask;
+       int retval;
+@@ -5435,8 +5435,8 @@ out_unlock:
+  * @len: length in bytes of the bitmask pointed to by user_mask_ptr
+  * @user_mask_ptr: user-space pointer to hold the current cpu mask
+  */
+-asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
+-                                    unsigned long __user *user_mask_ptr)
++SYSCALL_DEFINE3(sched_getaffinity, pid_t, pid, unsigned int, len,
++              unsigned long __user *, user_mask_ptr)
+ {
+       int ret;
+       cpumask_t mask;
+@@ -5460,7 +5460,7 @@ asmlinkage long sys_sched_getaffinity(pid_t pid, unsigned int len,
+  * This function yields the current CPU to other tasks. If there are no
+  * other threads running on this CPU then this function will return.
+  */
+-asmlinkage long sys_sched_yield(void)
++SYSCALL_DEFINE0(sched_yield)
+ {
+       struct rq *rq = this_rq_lock();
+@@ -5601,7 +5601,7 @@ long __sched io_schedule_timeout(long timeout)
+  * this syscall returns the maximum rt_priority that can be used
+  * by a given scheduling class.
+  */
+-asmlinkage long sys_sched_get_priority_max(int policy)
++SYSCALL_DEFINE1(sched_get_priority_max, int, policy)
+ {
+       int ret = -EINVAL;
+@@ -5626,7 +5626,7 @@ asmlinkage long sys_sched_get_priority_max(int policy)
+  * this syscall returns the minimum rt_priority that can be used
+  * by a given scheduling class.
+  */
+-asmlinkage long sys_sched_get_priority_min(int policy)
++SYSCALL_DEFINE1(sched_get_priority_min, int, policy)
+ {
+       int ret = -EINVAL;
+@@ -5651,8 +5651,8 @@ asmlinkage long sys_sched_get_priority_min(int policy)
+  * this syscall writes the default timeslice value of a given process
+  * into the user-space timespec buffer. A value of '0' means infinity.
+  */
+-asmlinkage
+-long sys_sched_rr_get_interval(pid_t pid, struct timespec __user *interval)
++SYSCALL_DEFINE2(sched_rr_get_interval, pid_t, pid,
++              struct timespec __user *, interval)
+ {
+       struct task_struct *p;
+       unsigned int time_slice;
+diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
+index e8ab096..a0b0852 100644
+--- a/kernel/sched_clock.c
++++ b/kernel/sched_clock.c
+@@ -124,7 +124,7 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now)
+       clock = scd->tick_gtod + delta;
+       min_clock = wrap_max(scd->tick_gtod, scd->clock);
+-      max_clock = scd->tick_gtod + TICK_NSEC;
++      max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC);
+       clock = wrap_max(clock, min_clock);
+       clock = wrap_min(clock, max_clock);
+@@ -227,6 +227,9 @@ EXPORT_SYMBOL_GPL(sched_clock_idle_sleep_event);
+  */
+ void sched_clock_idle_wakeup_event(u64 delta_ns)
+ {
++      if (timekeeping_suspended)
++              return;
++
+       sched_clock_tick();
+       touch_softlockup_watchdog();
+ }
+diff --git a/kernel/signal.c b/kernel/signal.c
+index e661b01..6f06f43 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1936,7 +1936,7 @@ EXPORT_SYMBOL(unblock_all_signals);
+  * System call entry points.
+  */
+-asmlinkage long sys_restart_syscall(void)
++SYSCALL_DEFINE0(restart_syscall)
+ {
+       struct restart_block *restart = &current_thread_info()->restart_block;
+       return restart->fn(restart);
+@@ -1989,8 +1989,8 @@ int sigprocmask(int how, sigset_t *set, sigset_t *oldset)
+       return error;
+ }
+-asmlinkage long
+-sys_rt_sigprocmask(int how, sigset_t __user *set, sigset_t __user *oset, size_t sigsetsize)
++SYSCALL_DEFINE4(rt_sigprocmask, int, how, sigset_t __user *, set,
++              sigset_t __user *, oset, size_t, sigsetsize)
+ {
+       int error = -EINVAL;
+       sigset_t old_set, new_set;
+@@ -2049,8 +2049,7 @@ out:
+       return error;
+ }     
+-asmlinkage long
+-sys_rt_sigpending(sigset_t __user *set, size_t sigsetsize)
++SYSCALL_DEFINE2(rt_sigpending, sigset_t __user *, set, size_t, sigsetsize)
+ {
+       return do_sigpending(set, sigsetsize);
+ }
+@@ -2121,11 +2120,9 @@ int copy_siginfo_to_user(siginfo_t __user *to, siginfo_t *from)
+ #endif
+-asmlinkage long
+-sys_rt_sigtimedwait(const sigset_t __user *uthese,
+-                  siginfo_t __user *uinfo,
+-                  const struct timespec __user *uts,
+-                  size_t sigsetsize)
++SYSCALL_DEFINE4(rt_sigtimedwait, const sigset_t __user *, uthese,
++              siginfo_t __user *, uinfo, const struct timespec __user *, uts,
++              size_t, sigsetsize)
+ {
+       int ret, sig;
+       sigset_t these;
+@@ -2198,8 +2195,7 @@ sys_rt_sigtimedwait(const sigset_t __user *uthese,
+       return ret;
+ }
+-asmlinkage long
+-sys_kill(pid_t pid, int sig)
++SYSCALL_DEFINE2(kill, pid_t, pid, int, sig)
+ {
+       struct siginfo info;
+@@ -2258,7 +2254,7 @@ static int do_tkill(pid_t tgid, pid_t pid, int sig)
+  *  exists but it's not belonging to the target process anymore. This
+  *  method solves the problem of threads exiting and PIDs getting reused.
+  */
+-asmlinkage long sys_tgkill(pid_t tgid, pid_t pid, int sig)
++SYSCALL_DEFINE3(tgkill, pid_t, tgid, pid_t, pid, int, sig)
+ {
+       /* This is only valid for single tasks */
+       if (pid <= 0 || tgid <= 0)
+@@ -2270,8 +2266,7 @@ asmlinkage long sys_tgkill(pid_t tgid, pid_t pid, int sig)
+ /*
+  *  Send a signal to only one task, even if it's a CLONE_THREAD task.
+  */
+-asmlinkage long
+-sys_tkill(pid_t pid, int sig)
++SYSCALL_DEFINE2(tkill, pid_t, pid, int, sig)
+ {
+       /* This is only valid for single tasks */
+       if (pid <= 0)
+@@ -2280,8 +2275,8 @@ sys_tkill(pid_t pid, int sig)
+       return do_tkill(0, pid, sig);
+ }
+-asmlinkage long
+-sys_rt_sigqueueinfo(pid_t pid, int sig, siginfo_t __user *uinfo)
++SYSCALL_DEFINE3(rt_sigqueueinfo, pid_t, pid, int, sig,
++              siginfo_t __user *, uinfo)
+ {
+       siginfo_t info;
+@@ -2409,8 +2404,7 @@ out:
+ #ifdef __ARCH_WANT_SYS_SIGPENDING
+-asmlinkage long
+-sys_sigpending(old_sigset_t __user *set)
++SYSCALL_DEFINE1(sigpending, old_sigset_t __user *, set)
+ {
+       return do_sigpending(set, sizeof(*set));
+ }
+@@ -2421,8 +2415,8 @@ sys_sigpending(old_sigset_t __user *set)
+ /* Some platforms have their own version with special arguments others
+    support only sys_rt_sigprocmask.  */
+-asmlinkage long
+-sys_sigprocmask(int how, old_sigset_t __user *set, old_sigset_t __user *oset)
++SYSCALL_DEFINE3(sigprocmask, int, how, old_sigset_t __user *, set,
++              old_sigset_t __user *, oset)
+ {
+       int error;
+       old_sigset_t old_set, new_set;
+@@ -2472,11 +2466,10 @@ out:
+ #endif /* __ARCH_WANT_SYS_SIGPROCMASK */
+ #ifdef __ARCH_WANT_SYS_RT_SIGACTION
+-asmlinkage long
+-sys_rt_sigaction(int sig,
+-               const struct sigaction __user *act,
+-               struct sigaction __user *oact,
+-               size_t sigsetsize)
++SYSCALL_DEFINE4(rt_sigaction, int, sig,
++              const struct sigaction __user *, act,
++              struct sigaction __user *, oact,
++              size_t, sigsetsize)
+ {
+       struct k_sigaction new_sa, old_sa;
+       int ret = -EINVAL;
+@@ -2506,15 +2499,13 @@ out:
+ /*
+  * For backwards compatibility.  Functionality superseded by sigprocmask.
+  */
+-asmlinkage long
+-sys_sgetmask(void)
++SYSCALL_DEFINE0(sgetmask)
+ {
+       /* SMP safe */
+       return current->blocked.sig[0];
+ }
+-asmlinkage long
+-sys_ssetmask(int newmask)
++SYSCALL_DEFINE1(ssetmask, int, newmask)
+ {
+       int old;
+@@ -2534,8 +2525,7 @@ sys_ssetmask(int newmask)
+ /*
+  * For backwards compatibility.  Functionality superseded by sigaction.
+  */
+-asmlinkage unsigned long
+-sys_signal(int sig, __sighandler_t handler)
++SYSCALL_DEFINE2(signal, int, sig, __sighandler_t, handler)
+ {
+       struct k_sigaction new_sa, old_sa;
+       int ret;
+@@ -2552,8 +2542,7 @@ sys_signal(int sig, __sighandler_t handler)
+ #ifdef __ARCH_WANT_SYS_PAUSE
+-asmlinkage long
+-sys_pause(void)
++SYSCALL_DEFINE0(pause)
+ {
+       current->state = TASK_INTERRUPTIBLE;
+       schedule();
+@@ -2563,7 +2552,7 @@ sys_pause(void)
+ #endif
+ #ifdef __ARCH_WANT_SYS_RT_SIGSUSPEND
+-asmlinkage long sys_rt_sigsuspend(sigset_t __user *unewset, size_t sigsetsize)
++SYSCALL_DEFINE2(rt_sigsuspend, sigset_t __user *, unewset, size_t, sigsetsize)
+ {
+       sigset_t newset;
+diff --git a/kernel/sys.c b/kernel/sys.c
+index 038a7bc..10a263b 100644
+--- a/kernel/sys.c
++++ b/kernel/sys.c
+@@ -137,7 +137,7 @@ out:
+       return error;
+ }
+-asmlinkage long sys_setpriority(int which, int who, int niceval)
++SYSCALL_DEFINE3(setpriority, int, which, int, who, int, niceval)
+ {
+       struct task_struct *g, *p;
+       struct user_struct *user;
+@@ -201,7 +201,7 @@ out:
+  * has been offset by 20 (ie it returns 40..1 instead of -20..19)
+  * to stay compatible.
+  */
+-asmlinkage long sys_getpriority(int which, int who)
++SYSCALL_DEFINE2(getpriority, int, which, int, who)
+ {
+       struct task_struct *g, *p;
+       struct user_struct *user;
+@@ -347,7 +347,8 @@ EXPORT_SYMBOL_GPL(kernel_power_off);
+  *
+  * reboot doesn't sync: do that yourself before calling this.
+  */
+-asmlinkage long sys_reboot(int magic1, int magic2, unsigned int cmd, void __user * arg)
++SYSCALL_DEFINE4(reboot, int, magic1, int, magic2, unsigned int, cmd,
++              void __user *, arg)
+ {
+       char buffer[256];
+@@ -470,7 +471,7 @@ void ctrl_alt_del(void)
+  * SMP: There are not races, the GIDs are checked only by filesystem
+  *      operations (as far as semantic preservation is concerned).
+  */
+-asmlinkage long sys_setregid(gid_t rgid, gid_t egid)
++SYSCALL_DEFINE2(setregid, gid_t, rgid, gid_t, egid)
+ {
+       int old_rgid = current->gid;
+       int old_egid = current->egid;
+@@ -519,7 +520,7 @@ asmlinkage long sys_setregid(gid_t rgid, gid_t egid)
+  *
+  * SMP: Same implicit races as above.
+  */
+-asmlinkage long sys_setgid(gid_t gid)
++SYSCALL_DEFINE1(setgid, gid_t, gid)
+ {
+       int old_egid = current->egid;
+       int retval;
+@@ -589,7 +590,7 @@ static int set_user(uid_t new_ruid, int dumpclear)
+  * 100% compatible with BSD.  A program which uses just setuid() will be
+  * 100% compatible with POSIX with saved IDs. 
+  */
+-asmlinkage long sys_setreuid(uid_t ruid, uid_t euid)
++SYSCALL_DEFINE2(setreuid, uid_t, ruid, uid_t, euid)
+ {
+       int old_ruid, old_euid, old_suid, new_ruid, new_euid;
+       int retval;
+@@ -651,7 +652,7 @@ asmlinkage long sys_setreuid(uid_t ruid, uid_t euid)
+  * will allow a root program to temporarily drop privileges and be able to
+  * regain them by swapping the real and effective uid.  
+  */
+-asmlinkage long sys_setuid(uid_t uid)
++SYSCALL_DEFINE1(setuid, uid_t, uid)
+ {
+       int old_euid = current->euid;
+       int old_ruid, old_suid, new_suid;
+@@ -690,7 +691,7 @@ asmlinkage long sys_setuid(uid_t uid)
+  * This function implements a generic ability to update ruid, euid,
+  * and suid.  This allows you to implement the 4.4 compatible seteuid().
+  */
+-asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
++SYSCALL_DEFINE3(setresuid, uid_t, ruid, uid_t, euid, uid_t, suid)
+ {
+       int old_ruid = current->uid;
+       int old_euid = current->euid;
+@@ -733,7 +734,7 @@ asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
+       return security_task_post_setuid(old_ruid, old_euid, old_suid, LSM_SETID_RES);
+ }
+-asmlinkage long sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __user *suid)
++SYSCALL_DEFINE3(getresuid, uid_t __user *, ruid, uid_t __user *, euid, uid_t __user *, suid)
+ {
+       int retval;
+@@ -747,7 +748,7 @@ asmlinkage long sys_getresuid(uid_t __user *ruid, uid_t __user *euid, uid_t __us
+ /*
+  * Same as above, but for rgid, egid, sgid.
+  */
+-asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
++SYSCALL_DEFINE3(setresgid, gid_t, rgid, gid_t, egid, gid_t, sgid)
+ {
+       int retval;
+@@ -784,7 +785,7 @@ asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
+       return 0;
+ }
+-asmlinkage long sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __user *sgid)
++SYSCALL_DEFINE3(getresgid, gid_t __user *, rgid, gid_t __user *, egid, gid_t __user *, sgid)
+ {
+       int retval;
+@@ -802,7 +803,7 @@ asmlinkage long sys_getresgid(gid_t __user *rgid, gid_t __user *egid, gid_t __us
+  * whatever uid it wants to). It normally shadows "euid", except when
+  * explicitly set by setfsuid() or for access..
+  */
+-asmlinkage long sys_setfsuid(uid_t uid)
++SYSCALL_DEFINE1(setfsuid, uid_t, uid)
+ {
+       int old_fsuid;
+@@ -831,7 +832,7 @@ asmlinkage long sys_setfsuid(uid_t uid)
+ /*
+  * Samma på svenska..
+  */
+-asmlinkage long sys_setfsgid(gid_t gid)
++SYSCALL_DEFINE1(setfsgid, gid_t, gid)
+ {
+       int old_fsgid;
+@@ -853,7 +854,7 @@ asmlinkage long sys_setfsgid(gid_t gid)
+       return old_fsgid;
+ }
+-asmlinkage long sys_times(struct tms __user * tbuf)
++SYSCALL_DEFINE1(times, struct tms __user *, tbuf)
+ {
+       /*
+        *      In the SMP world we might just be unlucky and have one of
+@@ -903,7 +904,7 @@ asmlinkage long sys_times(struct tms __user * tbuf)
+  * Auch. Had to add the 'did_exec' flag to conform completely to POSIX.
+  * LBT 04.03.94
+  */
+-asmlinkage long sys_setpgid(pid_t pid, pid_t pgid)
++SYSCALL_DEFINE2(setpgid, pid_t, pid, pid_t, pgid)
+ {
+       struct task_struct *p;
+       struct task_struct *group_leader = current->group_leader;
+@@ -974,7 +975,7 @@ out:
+       return err;
+ }
+-asmlinkage long sys_getpgid(pid_t pid)
++SYSCALL_DEFINE1(getpgid, pid_t, pid)
+ {
+       struct task_struct *p;
+       struct pid *grp;
+@@ -1004,14 +1005,14 @@ out:
+ #ifdef __ARCH_WANT_SYS_GETPGRP
+-asmlinkage long sys_getpgrp(void)
++SYSCALL_DEFINE0(getpgrp)
+ {
+       return sys_getpgid(0);
+ }
+ #endif
+-asmlinkage long sys_getsid(pid_t pid)
++SYSCALL_DEFINE1(getsid, pid_t, pid)
+ {
+       struct task_struct *p;
+       struct pid *sid;
+@@ -1039,7 +1040,7 @@ out:
+       return retval;
+ }
+-asmlinkage long sys_setsid(void)
++SYSCALL_DEFINE0(setsid)
+ {
+       struct task_struct *group_leader = current->group_leader;
+       struct pid *sid = task_pid(group_leader);
+@@ -1245,7 +1246,7 @@ int set_current_groups(struct group_info *group_info)
+ EXPORT_SYMBOL(set_current_groups);
+-asmlinkage long sys_getgroups(int gidsetsize, gid_t __user *grouplist)
++SYSCALL_DEFINE2(getgroups, int, gidsetsize, gid_t __user *, grouplist)
+ {
+       int i = 0;
+@@ -1278,7 +1279,7 @@ out:
+  *    without another task interfering.
+  */
+  
+-asmlinkage long sys_setgroups(int gidsetsize, gid_t __user *grouplist)
++SYSCALL_DEFINE2(setgroups, int, gidsetsize, gid_t __user *, grouplist)
+ {
+       struct group_info *group_info;
+       int retval;
+@@ -1328,7 +1329,7 @@ EXPORT_SYMBOL(in_egroup_p);
+ DECLARE_RWSEM(uts_sem);
+-asmlinkage long sys_newuname(struct new_utsname __user * name)
++SYSCALL_DEFINE1(newuname, struct new_utsname __user *, name)
+ {
+       int errno = 0;
+@@ -1339,7 +1340,7 @@ asmlinkage long sys_newuname(struct new_utsname __user * name)
+       return errno;
+ }
+-asmlinkage long sys_sethostname(char __user *name, int len)
++SYSCALL_DEFINE2(sethostname, char __user *, name, int, len)
+ {
+       int errno;
+       char tmp[__NEW_UTS_LEN];
+@@ -1361,7 +1362,7 @@ asmlinkage long sys_sethostname(char __user *name, int len)
+ #ifdef __ARCH_WANT_SYS_GETHOSTNAME
+-asmlinkage long sys_gethostname(char __user *name, int len)
++SYSCALL_DEFINE2(gethostname, char __user *, name, int, len)
+ {
+       int i, errno;
+@@ -1384,7 +1385,7 @@ asmlinkage long sys_gethostname(char __user *name, int len)
+  * Only setdomainname; getdomainname can be implemented by calling
+  * uname()
+  */
+-asmlinkage long sys_setdomainname(char __user *name, int len)
++SYSCALL_DEFINE2(setdomainname, char __user *, name, int, len)
+ {
+       int errno;
+       char tmp[__NEW_UTS_LEN];
+@@ -1405,7 +1406,7 @@ asmlinkage long sys_setdomainname(char __user *name, int len)
+       return errno;
+ }
+-asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit __user *rlim)
++SYSCALL_DEFINE2(getrlimit, unsigned int, resource, struct rlimit __user *, rlim)
+ {
+       if (resource >= RLIM_NLIMITS)
+               return -EINVAL;
+@@ -1424,7 +1425,8 @@ asmlinkage long sys_getrlimit(unsigned int resource, struct rlimit __user *rlim)
+  *    Back compatibility for getrlimit. Needed for some apps.
+  */
+  
+-asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *rlim)
++SYSCALL_DEFINE2(old_getrlimit, unsigned int, resource,
++              struct rlimit __user *, rlim)
+ {
+       struct rlimit x;
+       if (resource >= RLIM_NLIMITS)
+@@ -1442,7 +1444,7 @@ asmlinkage long sys_old_getrlimit(unsigned int resource, struct rlimit __user *r
+ #endif
+-asmlinkage long sys_setrlimit(unsigned int resource, struct rlimit __user *rlim)
++SYSCALL_DEFINE2(setrlimit, unsigned int, resource, struct rlimit __user *, rlim)
+ {
+       struct rlimit new_rlim, *old_rlim;
+       unsigned long it_prof_secs;
+@@ -1618,7 +1620,7 @@ int getrusage(struct task_struct *p, int who, struct rusage __user *ru)
+       return copy_to_user(ru, &r, sizeof(r)) ? -EFAULT : 0;
+ }
+-asmlinkage long sys_getrusage(int who, struct rusage __user *ru)
++SYSCALL_DEFINE2(getrusage, int, who, struct rusage __user *, ru)
+ {
+       if (who != RUSAGE_SELF && who != RUSAGE_CHILDREN &&
+           who != RUSAGE_THREAD)
+@@ -1626,14 +1628,14 @@ asmlinkage long sys_getrusage(int who, struct rusage __user *ru)
+       return getrusage(current, who, ru);
+ }
+-asmlinkage long sys_umask(int mask)
++SYSCALL_DEFINE1(umask, int, mask)
+ {
+       mask = xchg(&current->fs->umask, mask & S_IRWXUGO);
+       return mask;
+ }
+-asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
+-                        unsigned long arg4, unsigned long arg5)
++SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
++              unsigned long, arg4, unsigned long, arg5)
+ {
+       long error = 0;
+@@ -1734,8 +1736,8 @@ asmlinkage long sys_prctl(int option, unsigned long arg2, unsigned long arg3,
+       return error;
+ }
+-asmlinkage long sys_getcpu(unsigned __user *cpup, unsigned __user *nodep,
+-                         struct getcpu_cache __user *unused)
++SYSCALL_DEFINE3(getcpu, unsigned __user *, cpup, unsigned __user *, nodep,
++              struct getcpu_cache __user *, unused)
+ {
+       int err = 0;
+       int cpu = raw_smp_processor_id();
+diff --git a/kernel/sys_ni.c b/kernel/sys_ni.c
+index 08d6e1b..d7b7b45 100644
+--- a/kernel/sys_ni.c
++++ b/kernel/sys_ni.c
+@@ -125,6 +125,7 @@ cond_syscall(sys_vm86old);
+ cond_syscall(sys_vm86);
+ cond_syscall(compat_sys_ipc);
+ cond_syscall(compat_sys_sysctl);
++cond_syscall(sys_syslog);
+ /* arch-specific weak syscall entries */
+ cond_syscall(sys_pciconfig_read);
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 6ffbed2..6816e6d 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -1614,7 +1614,7 @@ int do_sysctl(int __user *name, int nlen, void __user *oldval, size_t __user *ol
+       return error;
+ }
+-asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
++SYSCALL_DEFINE1(sysctl, struct __sysctl_args __user *, args)
+ {
+       struct __sysctl_args tmp;
+       int error;
+@@ -2925,7 +2925,7 @@ int sysctl_ms_jiffies(struct ctl_table *table, int __user *name, int nlen,
+ #else /* CONFIG_SYSCTL_SYSCALL */
+-asmlinkage long sys_sysctl(struct __sysctl_args __user *args)
++SYSCALL_DEFINE1(sysctl, struct __sysctl_args __user *, args)
+ {
+       struct __sysctl_args tmp;
+       int error;
+diff --git a/kernel/time.c b/kernel/time.c
+index 6a08660..4ed46e3 100644
+--- a/kernel/time.c
++++ b/kernel/time.c
+@@ -59,7 +59,7 @@ EXPORT_SYMBOL(sys_tz);
+  * why not move it into the appropriate arch directory (for those
+  * architectures that need it).
+  */
+-asmlinkage long sys_time(time_t __user * tloc)
++SYSCALL_DEFINE1(time, time_t __user *, tloc)
+ {
+       time_t i = get_seconds();
+@@ -77,7 +77,7 @@ asmlinkage long sys_time(time_t __user * tloc)
+  * architectures that need it).
+  */
+-asmlinkage long sys_stime(time_t __user *tptr)
++SYSCALL_DEFINE1(stime, time_t __user *, tptr)
+ {
+       struct timespec tv;
+       int err;
+@@ -97,8 +97,8 @@ asmlinkage long sys_stime(time_t __user *tptr)
+ #endif /* __ARCH_WANT_SYS_TIME */
+-asmlinkage long sys_gettimeofday(struct timeval __user *tv,
+-                               struct timezone __user *tz)
++SYSCALL_DEFINE2(gettimeofday, struct timeval __user *, tv,
++              struct timezone __user *, tz)
+ {
+       if (likely(tv != NULL)) {
+               struct timeval ktv;
+@@ -182,8 +182,8 @@ int do_sys_settimeofday(struct timespec *tv, struct timezone *tz)
+       return 0;
+ }
+-asmlinkage long sys_settimeofday(struct timeval __user *tv,
+-                              struct timezone __user *tz)
++SYSCALL_DEFINE2(settimeofday, struct timeval __user *, tv,
++              struct timezone __user *, tz)
+ {
+       struct timeval user_tv;
+       struct timespec new_ts;
+@@ -203,7 +203,7 @@ asmlinkage long sys_settimeofday(struct timeval __user *tv,
+       return do_sys_settimeofday(tv ? &new_ts : NULL, tz ? &new_tz : NULL);
+ }
+-asmlinkage long sys_adjtimex(struct timex __user *txc_p)
++SYSCALL_DEFINE1(adjtimex, struct timex __user *, txc_p)
+ {
+       struct timex txc;               /* Local copy of parameter */
+       int ret;
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index e91c29f..4220a2e 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -46,6 +46,9 @@ struct timespec xtime __attribute__ ((aligned (16)));
+ struct timespec wall_to_monotonic __attribute__ ((aligned (16)));
+ static unsigned long total_sleep_time;                /* seconds */
++/* flag for if timekeeping is suspended */
++int __read_mostly timekeeping_suspended;
++
+ static struct timespec xtime_cache __attribute__ ((aligned (16)));
+ void update_xtime_cache(u64 nsec)
+ {
+@@ -92,6 +95,8 @@ void getnstimeofday(struct timespec *ts)
+       unsigned long seq;
+       s64 nsecs;
++      WARN_ON(timekeeping_suspended);
++
+       do {
+               seq = read_seqbegin(&xtime_lock);
+@@ -261,8 +266,6 @@ void __init timekeeping_init(void)
+       write_sequnlock_irqrestore(&xtime_lock, flags);
+ }
+-/* flag for if timekeeping is suspended */
+-static int timekeeping_suspended;
+ /* time in seconds when suspend began */
+ static unsigned long timekeeping_suspend_time;
+ /* xtime offset when we went into suspend */
+diff --git a/kernel/timer.c b/kernel/timer.c
+index 03bc7f1..e9a0195 100644
+--- a/kernel/timer.c
++++ b/kernel/timer.c
+@@ -1074,7 +1074,7 @@ void do_timer(unsigned long ticks)
+  * For backwards compatibility?  This can be done in libc so Alpha
+  * and all newer ports shouldn't need it.
+  */
+-asmlinkage unsigned long sys_alarm(unsigned int seconds)
++SYSCALL_DEFINE1(alarm, unsigned int, seconds)
+ {
+       return alarm_setitimer(seconds);
+ }
+@@ -1097,7 +1097,7 @@ asmlinkage unsigned long sys_alarm(unsigned int seconds)
+  *
+  * This is SMP safe as current->tgid does not change.
+  */
+-asmlinkage long sys_getpid(void)
++SYSCALL_DEFINE0(getpid)
+ {
+       return task_tgid_vnr(current);
+ }
+@@ -1108,7 +1108,7 @@ asmlinkage long sys_getpid(void)
+  * value of ->real_parent under rcu_read_lock(), see
+  * release_task()->call_rcu(delayed_put_task_struct).
+  */
+-asmlinkage long sys_getppid(void)
++SYSCALL_DEFINE0(getppid)
+ {
+       int pid;
+@@ -1119,25 +1119,25 @@ asmlinkage long sys_getppid(void)
+       return pid;
+ }
+-asmlinkage long sys_getuid(void)
++SYSCALL_DEFINE0(getuid)
+ {
+       /* Only we change this so SMP safe */
+       return current->uid;
+ }
+-asmlinkage long sys_geteuid(void)
++SYSCALL_DEFINE0(geteuid)
+ {
+       /* Only we change this so SMP safe */
+       return current->euid;
+ }
+-asmlinkage long sys_getgid(void)
++SYSCALL_DEFINE0(getgid)
+ {
+       /* Only we change this so SMP safe */
+       return current->gid;
+ }
+-asmlinkage long sys_getegid(void)
++SYSCALL_DEFINE0(getegid)
+ {
+       /* Only we change this so SMP safe */
+       return  current->egid;
+@@ -1253,7 +1253,7 @@ signed long __sched schedule_timeout_uninterruptible(signed long timeout)
+ EXPORT_SYMBOL(schedule_timeout_uninterruptible);
+ /* Thread ID - the internal kernel "pid" */
+-asmlinkage long sys_gettid(void)
++SYSCALL_DEFINE0(gettid)
+ {
+       return task_pid_vnr(current);
+ }
+@@ -1345,7 +1345,7 @@ out:
+       return 0;
+ }
+-asmlinkage long sys_sysinfo(struct sysinfo __user *info)
++SYSCALL_DEFINE1(sysinfo, struct sysinfo __user *, info)
+ {
+       struct sysinfo val;
+diff --git a/kernel/uid16.c b/kernel/uid16.c
+index 3e41c16..67bb92c 100644
+--- a/kernel/uid16.c
++++ b/kernel/uid16.c
+@@ -17,7 +17,7 @@
+ #include <asm/uaccess.h>
+-asmlinkage long sys_chown16(const char __user * filename, old_uid_t user, old_gid_t group)
++SYSCALL_DEFINE3(chown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
+ {
+       long ret = sys_chown(filename, low2highuid(user), low2highgid(group));
+       /* avoid REGPARM breakage on x86: */
+@@ -25,7 +25,7 @@ asmlinkage long sys_chown16(const char __user * filename, old_uid_t user, old_gi
+       return ret;
+ }
+-asmlinkage long sys_lchown16(const char __user * filename, old_uid_t user, old_gid_t group)
++SYSCALL_DEFINE3(lchown16, const char __user *, filename, old_uid_t, user, old_gid_t, group)
+ {
+       long ret = sys_lchown(filename, low2highuid(user), low2highgid(group));
+       /* avoid REGPARM breakage on x86: */
+@@ -33,7 +33,7 @@ asmlinkage long sys_lchown16(const char __user * filename, old_uid_t user, old_g
+       return ret;
+ }
+-asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group)
++SYSCALL_DEFINE3(fchown16, unsigned int, fd, old_uid_t, user, old_gid_t, group)
+ {
+       long ret = sys_fchown(fd, low2highuid(user), low2highgid(group));
+       /* avoid REGPARM breakage on x86: */
+@@ -41,7 +41,7 @@ asmlinkage long sys_fchown16(unsigned int fd, old_uid_t user, old_gid_t group)
+       return ret;
+ }
+-asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid)
++SYSCALL_DEFINE2(setregid16, old_gid_t, rgid, old_gid_t, egid)
+ {
+       long ret = sys_setregid(low2highgid(rgid), low2highgid(egid));
+       /* avoid REGPARM breakage on x86: */
+@@ -49,7 +49,7 @@ asmlinkage long sys_setregid16(old_gid_t rgid, old_gid_t egid)
+       return ret;
+ }
+-asmlinkage long sys_setgid16(old_gid_t gid)
++SYSCALL_DEFINE1(setgid16, old_gid_t, gid)
+ {
+       long ret = sys_setgid(low2highgid(gid));
+       /* avoid REGPARM breakage on x86: */
+@@ -57,7 +57,7 @@ asmlinkage long sys_setgid16(old_gid_t gid)
+       return ret;
+ }
+-asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid)
++SYSCALL_DEFINE2(setreuid16, old_uid_t, ruid, old_uid_t, euid)
+ {
+       long ret = sys_setreuid(low2highuid(ruid), low2highuid(euid));
+       /* avoid REGPARM breakage on x86: */
+@@ -65,7 +65,7 @@ asmlinkage long sys_setreuid16(old_uid_t ruid, old_uid_t euid)
+       return ret;
+ }
+-asmlinkage long sys_setuid16(old_uid_t uid)
++SYSCALL_DEFINE1(setuid16, old_uid_t, uid)
+ {
+       long ret = sys_setuid(low2highuid(uid));
+       /* avoid REGPARM breakage on x86: */
+@@ -73,7 +73,7 @@ asmlinkage long sys_setuid16(old_uid_t uid)
+       return ret;
+ }
+-asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid)
++SYSCALL_DEFINE3(setresuid16, old_uid_t, ruid, old_uid_t, euid, old_uid_t, suid)
+ {
+       long ret = sys_setresuid(low2highuid(ruid), low2highuid(euid),
+                                low2highuid(suid));
+@@ -82,7 +82,7 @@ asmlinkage long sys_setresuid16(old_uid_t ruid, old_uid_t euid, old_uid_t suid)
+       return ret;
+ }
+-asmlinkage long sys_getresuid16(old_uid_t __user *ruid, old_uid_t __user *euid, old_uid_t __user *suid)
++SYSCALL_DEFINE3(getresuid16, old_uid_t __user *, ruid, old_uid_t __user *, euid, old_uid_t __user *, suid)
+ {
+       int retval;
+@@ -93,7 +93,7 @@ asmlinkage long sys_getresuid16(old_uid_t __user *ruid, old_uid_t __user *euid,
+       return retval;
+ }
+-asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid)
++SYSCALL_DEFINE3(setresgid16, old_gid_t, rgid, old_gid_t, egid, old_gid_t, sgid)
+ {
+       long ret = sys_setresgid(low2highgid(rgid), low2highgid(egid),
+                                low2highgid(sgid));
+@@ -102,7 +102,8 @@ asmlinkage long sys_setresgid16(old_gid_t rgid, old_gid_t egid, old_gid_t sgid)
+       return ret;
+ }
+-asmlinkage long sys_getresgid16(old_gid_t __user *rgid, old_gid_t __user *egid, old_gid_t __user *sgid)
++
++SYSCALL_DEFINE3(getresgid16, old_gid_t __user *, rgid, old_gid_t __user *, egid, old_gid_t __user *, sgid)
+ {
+       int retval;
+@@ -113,7 +114,7 @@ asmlinkage long sys_getresgid16(old_gid_t __user *rgid, old_gid_t __user *egid,
+       return retval;
+ }
+-asmlinkage long sys_setfsuid16(old_uid_t uid)
++SYSCALL_DEFINE1(setfsuid16, old_uid_t, uid)
+ {
+       long ret = sys_setfsuid(low2highuid(uid));
+       /* avoid REGPARM breakage on x86: */
+@@ -121,7 +122,7 @@ asmlinkage long sys_setfsuid16(old_uid_t uid)
+       return ret;
+ }
+-asmlinkage long sys_setfsgid16(old_gid_t gid)
++SYSCALL_DEFINE1(setfsgid16, old_gid_t, gid)
+ {
+       long ret = sys_setfsgid(low2highgid(gid));
+       /* avoid REGPARM breakage on x86: */
+@@ -159,7 +160,7 @@ static int groups16_from_user(struct group_info *group_info,
+       return 0;
+ }
+-asmlinkage long sys_getgroups16(int gidsetsize, old_gid_t __user *grouplist)
++SYSCALL_DEFINE2(getgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
+ {
+       int i = 0;
+@@ -183,7 +184,7 @@ out:
+       return i;
+ }
+-asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t __user *grouplist)
++SYSCALL_DEFINE2(setgroups16, int, gidsetsize, old_gid_t __user *, grouplist)
+ {
+       struct group_info *group_info;
+       int retval;
+@@ -208,22 +209,22 @@ asmlinkage long sys_setgroups16(int gidsetsize, old_gid_t __user *grouplist)
+       return retval;
+ }
+-asmlinkage long sys_getuid16(void)
++SYSCALL_DEFINE0(getuid16)
+ {
+       return high2lowuid(current->uid);
+ }
+-asmlinkage long sys_geteuid16(void)
++SYSCALL_DEFINE0(geteuid16)
+ {
+       return high2lowuid(current->euid);
+ }
+-asmlinkage long sys_getgid16(void)
++SYSCALL_DEFINE0(getgid16)
+ {
+       return high2lowgid(current->gid);
+ }
+-asmlinkage long sys_getegid16(void)
++SYSCALL_DEFINE0(getegid16)
+ {
+       return high2lowgid(current->egid);
+ }
+diff --git a/mm/fadvise.c b/mm/fadvise.c
+index 343cfdf..a32a66e 100644
+--- a/mm/fadvise.c
++++ b/mm/fadvise.c
+@@ -24,7 +24,7 @@
+  * POSIX_FADV_WILLNEED could set PG_Referenced, and POSIX_FADV_NOREUSE could
+  * deactivate the pages and clear PG_Referenced.
+  */
+-asmlinkage long sys_fadvise64_64(int fd, loff_t offset, loff_t len, int advice)
++SYSCALL_DEFINE(fadvise64_64)(int fd, loff_t offset, loff_t len, int advice)
+ {
+       struct file *file = fget(fd);
+       struct address_space *mapping;
+@@ -126,12 +126,26 @@ out:
+       fput(file);
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_fadvise64_64(long fd, loff_t offset, loff_t len, long advice)
++{
++      return SYSC_fadvise64_64((int) fd, offset, len, (int) advice);
++}
++SYSCALL_ALIAS(sys_fadvise64_64, SyS_fadvise64_64);
++#endif
+ #ifdef __ARCH_WANT_SYS_FADVISE64
+-asmlinkage long sys_fadvise64(int fd, loff_t offset, size_t len, int advice)
++SYSCALL_DEFINE(fadvise64)(int fd, loff_t offset, size_t len, int advice)
+ {
+       return sys_fadvise64_64(fd, offset, len, advice);
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_fadvise64(long fd, loff_t offset, long len, long advice)
++{
++      return SYSC_fadvise64((int) fd, offset, (size_t)len, (int)advice);
++}
++SYSCALL_ALIAS(sys_fadvise64, SyS_fadvise64);
++#endif
+ #endif
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 876bc59..f3033d0 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -1353,7 +1353,7 @@ do_readahead(struct address_space *mapping, struct file *filp,
+       return 0;
+ }
+-asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count)
++SYSCALL_DEFINE(readahead)(int fd, loff_t offset, size_t count)
+ {
+       ssize_t ret;
+       struct file *file;
+@@ -1372,6 +1372,13 @@ asmlinkage ssize_t sys_readahead(int fd, loff_t offset, size_t count)
+       }
+       return ret;
+ }
++#ifdef CONFIG_HAVE_SYSCALL_WRAPPERS
++asmlinkage long SyS_readahead(long fd, loff_t offset, long count)
++{
++      return SYSC_readahead((int) fd, offset, (size_t) count);
++}
++SYSCALL_ALIAS(sys_readahead, SyS_readahead);
++#endif
+ #ifdef CONFIG_MMU
+ /**
+@@ -2026,7 +2033,7 @@ int pagecache_write_begin(struct file *file, struct address_space *mapping,
+               struct inode *inode = mapping->host;
+               struct page *page;
+ again:
+-              page = __grab_cache_page(mapping, index);
++              page = grab_cache_page_write_begin(mapping, index, flags);
+               *pagep = page;
+               if (!page)
+                       return -ENOMEM;
+@@ -2190,19 +2197,24 @@ EXPORT_SYMBOL(generic_file_direct_write);
+  * Find or create a page at the given pagecache position. Return the locked
+  * page. This function is specifically for buffered writes.
+  */
+-struct page *__grab_cache_page(struct address_space *mapping, pgoff_t index)
++struct page *grab_cache_page_write_begin(struct address_space *mapping,
++                                      pgoff_t index, unsigned flags)
+ {
+       int status;
+       struct page *page;
++      gfp_t gfp_notmask = 0;
++      if (flags & AOP_FLAG_NOFS)
++              gfp_notmask = __GFP_FS;
+ repeat:
+       page = find_lock_page(mapping, index);
+       if (likely(page))
+               return page;
+-      page = page_cache_alloc(mapping);
++      page = __page_cache_alloc(mapping_gfp_mask(mapping) & ~gfp_notmask);
+       if (!page)
+               return NULL;
+-      status = add_to_page_cache_lru(page, mapping, index, GFP_KERNEL);
++      status = add_to_page_cache_lru(page, mapping, index,
++                                              GFP_KERNEL & ~gfp_notmask);
+       if (unlikely(status)) {
+               page_cache_release(page);
+               if (status == -EEXIST)
+@@ -2211,7 +2223,7 @@ repeat:
+       }
+       return page;
+ }
+-EXPORT_SYMBOL(__grab_cache_page);
++EXPORT_SYMBOL(grab_cache_page_write_begin);
+ static ssize_t generic_perform_write_2copy(struct file *file,
+                               struct iov_iter *i, loff_t pos)
+@@ -2256,7 +2268,7 @@ static ssize_t generic_perform_write_2copy(struct file *file,
+                       break;
+               }
+-              page = __grab_cache_page(mapping, index);
++              page = grab_cache_page_write_begin(mapping, index, 0);
+               if (!page) {
+                       status = -ENOMEM;
+                       break;
+diff --git a/mm/fremap.c b/mm/fremap.c
+index 7881638..b4a4aa3 100644
+--- a/mm/fremap.c
++++ b/mm/fremap.c
+@@ -118,8 +118,8 @@ static int populate_range(struct mm_struct *mm, struct vm_area_struct *vma,
+  * and the vma's default protection is used. Arbitrary protections
+  * might be implemented in the future.
+  */
+-asmlinkage long sys_remap_file_pages(unsigned long start, unsigned long size,
+-      unsigned long prot, unsigned long pgoff, unsigned long flags)
++SYSCALL_DEFINE5(remap_file_pages, unsigned long, start, unsigned long, size,
++              unsigned long, prot, unsigned long, pgoff, unsigned long, flags)
+ {
+       struct mm_struct *mm = current->mm;
+       struct address_space *mapping;
+diff --git a/mm/madvise.c b/mm/madvise.c
+index f9349c1..b9ce574 100644
+--- a/mm/madvise.c
++++ b/mm/madvise.c
+@@ -281,7 +281,7 @@ madvise_vma(struct vm_area_struct *vma, struct vm_area_struct **prev,
+  *  -EBADF  - map exists, but area maps something that isn't a file.
+  *  -EAGAIN - a kernel resource was temporarily unavailable.
+  */
+-asmlinkage long sys_madvise(unsigned long start, size_t len_in, int behavior)
++SYSCALL_DEFINE3(madvise, unsigned long, start, size_t, len_in, int, behavior)
+ {
+       unsigned long end, tmp;
+       struct vm_area_struct * vma, *prev;
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index 8336905..83bea4f 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -1059,10 +1059,9 @@ static int copy_nodes_to_user(unsigned long __user *mask, unsigned long maxnode,
+       return copy_to_user(mask, nodes_addr(*nodes), copy) ? -EFAULT : 0;
+ }
+-asmlinkage long sys_mbind(unsigned long start, unsigned long len,
+-                      unsigned long mode,
+-                      unsigned long __user *nmask, unsigned long maxnode,
+-                      unsigned flags)
++SYSCALL_DEFINE6(mbind, unsigned long, start, unsigned long, len,
++              unsigned long, mode, unsigned long __user *, nmask,
++              unsigned long, maxnode, unsigned, flags)
+ {
+       nodemask_t nodes;
+       int err;
+@@ -1082,8 +1081,8 @@ asmlinkage long sys_mbind(unsigned long start, unsigned long len,
+ }
+ /* Set the process memory policy */
+-asmlinkage long sys_set_mempolicy(int mode, unsigned long __user *nmask,
+-              unsigned long maxnode)
++SYSCALL_DEFINE3(set_mempolicy, int, mode, unsigned long __user *, nmask,
++              unsigned long, maxnode)
+ {
+       int err;
+       nodemask_t nodes;
+@@ -1101,9 +1100,9 @@ asmlinkage long sys_set_mempolicy(int mode, unsigned long __user *nmask,
+       return do_set_mempolicy(mode, flags, &nodes);
+ }
+-asmlinkage long sys_migrate_pages(pid_t pid, unsigned long maxnode,
+-              const unsigned long __user *old_nodes,
+-              const unsigned long __user *new_nodes)
++SYSCALL_DEFINE4(migrate_pages, pid_t, pid, unsigned long, maxnode,
++              const unsigned long __user *, old_nodes,
++              const unsigned long __user *, new_nodes)
+ {
+       struct mm_struct *mm;
+       struct task_struct *task;
+@@ -1171,10 +1170,9 @@ out:
+ /* Retrieve NUMA policy */
+-asmlinkage long sys_get_mempolicy(int __user *policy,
+-                              unsigned long __user *nmask,
+-                              unsigned long maxnode,
+-                              unsigned long addr, unsigned long flags)
++SYSCALL_DEFINE5(get_mempolicy, int __user *, policy,
++              unsigned long __user *, nmask, unsigned long, maxnode,
++              unsigned long, addr, unsigned long, flags)
+ {
+       int err;
+       int uninitialized_var(pval);
+diff --git a/mm/migrate.c b/mm/migrate.c
+index 2a80136..d493c02 100644
+--- a/mm/migrate.c
++++ b/mm/migrate.c
+@@ -979,10 +979,10 @@ set_status:
+  * Move a list of pages in the address space of the currently executing
+  * process.
+  */
+-asmlinkage long sys_move_pages(pid_t pid, unsigned long nr_pages,
+-                      const void __user * __user *pages,
+-                      const int __user *nodes,
+-                      int __user *status, int flags)
++SYSCALL_DEFINE6(move_pages, pid_t, pid, unsigned long, nr_pages,
++              const void __user * __user *, pages,
++              const int __user *, nodes,
++              int __user *, status, int, flags)
+ {
+       int err = 0;
+       int i;
+diff --git a/mm/mincore.c b/mm/mincore.c
+index 5178800..8cb508f 100644
+--- a/mm/mincore.c
++++ b/mm/mincore.c
+@@ -177,8 +177,8 @@ none_mapped:
+  *            mapped
+  *  -EAGAIN - A kernel resource was temporarily unavailable.
+  */
+-asmlinkage long sys_mincore(unsigned long start, size_t len,
+-      unsigned char __user * vec)
++SYSCALL_DEFINE3(mincore, unsigned long, start, size_t, len,
++              unsigned char __user *, vec)
+ {
+       long retval;
+       unsigned long pages;
+diff --git a/mm/mlock.c b/mm/mlock.c
+index 01fbe93..73ee3fa 100644
+--- a/mm/mlock.c
++++ b/mm/mlock.c
+@@ -130,7 +130,7 @@ static int do_mlock(unsigned long start, size_t len, int on)
+       return error;
+ }
+-asmlinkage long sys_mlock(unsigned long start, size_t len)
++SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
+ {
+       unsigned long locked;
+       unsigned long lock_limit;
+@@ -156,7 +156,7 @@ asmlinkage long sys_mlock(unsigned long start, size_t len)
+       return error;
+ }
+-asmlinkage long sys_munlock(unsigned long start, size_t len)
++SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
+ {
+       int ret;
+@@ -193,7 +193,7 @@ out:
+       return 0;
+ }
+-asmlinkage long sys_mlockall(int flags)
++SYSCALL_DEFINE1(mlockall, int, flags)
+ {
+       unsigned long lock_limit;
+       int ret = -EINVAL;
+@@ -219,7 +219,7 @@ out:
+       return ret;
+ }
+-asmlinkage long sys_munlockall(void)
++SYSCALL_DEFINE0(munlockall)
+ {
+       int ret;
+diff --git a/mm/mmap.c b/mm/mmap.c
+index e7a5a68..ca12a93 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -244,7 +244,7 @@ static struct vm_area_struct *remove_vma(struct vm_area_struct *vma)
+       return next;
+ }
+-asmlinkage unsigned long sys_brk(unsigned long brk)
++SYSCALL_DEFINE1(brk, unsigned long, brk)
+ {
+       unsigned long rlim, retval;
+       unsigned long newbrk, oldbrk;
+@@ -1927,7 +1927,7 @@ int do_munmap(struct mm_struct *mm, unsigned long start, size_t len)
+ EXPORT_SYMBOL(do_munmap);
+-asmlinkage long sys_munmap(unsigned long addr, size_t len)
++SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
+ {
+       int ret;
+       struct mm_struct *mm = current->mm;
+diff --git a/mm/mprotect.c b/mm/mprotect.c
+index fded06f..2623e29 100644
+--- a/mm/mprotect.c
++++ b/mm/mprotect.c
+@@ -219,8 +219,8 @@ fail:
+       return error;
+ }
+-asmlinkage long
+-sys_mprotect(unsigned long start, size_t len, unsigned long prot)
++SYSCALL_DEFINE3(mprotect, unsigned long, start, size_t, len,
++              unsigned long, prot)
+ {
+       unsigned long vm_flags, nstart, end, tmp, reqprot;
+       struct vm_area_struct *vma, *prev;
+diff --git a/mm/mremap.c b/mm/mremap.c
+index 1a77439..cfdeed9 100644
+--- a/mm/mremap.c
++++ b/mm/mremap.c
+@@ -418,9 +418,9 @@ out_nc:
+       return ret;
+ }
+-asmlinkage unsigned long sys_mremap(unsigned long addr,
+-      unsigned long old_len, unsigned long new_len,
+-      unsigned long flags, unsigned long new_addr)
++SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
++              unsigned long, new_len, unsigned long, flags,
++              unsigned long, new_addr)
+ {
+       unsigned long ret;
+diff --git a/mm/msync.c b/mm/msync.c
+index 144a757..9e06d2e 100644
+--- a/mm/msync.c
++++ b/mm/msync.c
+@@ -28,7 +28,7 @@
+  * So by _not_ starting I/O in MS_ASYNC we provide complete flexibility to
+  * applications.
+  */
+-asmlinkage long sys_msync(unsigned long start, size_t len, int flags)
++SYSCALL_DEFINE3(msync, unsigned long, start, size_t, len, int, flags)
+ {
+       unsigned long end;
+       struct mm_struct *mm = current->mm;
+diff --git a/mm/nommu.c b/mm/nommu.c
+index ed75bc9..4bf7686 100644
+--- a/mm/nommu.c
++++ b/mm/nommu.c
+@@ -355,7 +355,7 @@ EXPORT_SYMBOL(vm_insert_page);
+  *  to a regular file.  in this case, the unmapping will need
+  *  to invoke file system routines that need the global lock.
+  */
+-asmlinkage unsigned long sys_brk(unsigned long brk)
++SYSCALL_DEFINE1(brk, unsigned long, brk)
+ {
+       struct mm_struct *mm = current->mm;
+@@ -1170,7 +1170,7 @@ int do_munmap(struct mm_struct *mm, unsigned long addr, size_t len)
+ }
+ EXPORT_SYMBOL(do_munmap);
+-asmlinkage long sys_munmap(unsigned long addr, size_t len)
++SYSCALL_DEFINE2(munmap, unsigned long, addr, size_t, len)
+ {
+       int ret;
+       struct mm_struct *mm = current->mm;
+@@ -1261,9 +1261,9 @@ unsigned long do_mremap(unsigned long addr,
+ }
+ EXPORT_SYMBOL(do_mremap);
+-asmlinkage unsigned long sys_mremap(unsigned long addr,
+-      unsigned long old_len, unsigned long new_len,
+-      unsigned long flags, unsigned long new_addr)
++SYSCALL_DEFINE5(mremap, unsigned long, addr, unsigned long, old_len,
++              unsigned long, new_len, unsigned long, flags,
++              unsigned long, new_addr)
+ {
+       unsigned long ret;
+diff --git a/mm/swapfile.c b/mm/swapfile.c
+index 1e330f2..572cc78 100644
+--- a/mm/swapfile.c
++++ b/mm/swapfile.c
+@@ -1204,7 +1204,7 @@ int page_queue_congested(struct page *page)
+ }
+ #endif
+-asmlinkage long sys_swapoff(const char __user * specialfile)
++SYSCALL_DEFINE1(swapoff, const char __user *, specialfile)
+ {
+       struct swap_info_struct * p = NULL;
+       unsigned short *swap_map;
+@@ -1448,7 +1448,7 @@ __initcall(procswaps_init);
+  *
+  * The swapon system call
+  */
+-asmlinkage long sys_swapon(const char __user * specialfile, int swap_flags)
++SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags)
+ {
+       struct swap_info_struct * p;
+       char *name = NULL;
+diff --git a/net/socket.c b/net/socket.c
+index 3e8d4e3..3e2859c 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -1216,7 +1216,7 @@ int sock_create_kern(int family, int type, int protocol, struct socket **res)
+       return __sock_create(&init_net, family, type, protocol, res, 1);
+ }
+-asmlinkage long sys_socket(int family, int type, int protocol)
++SYSCALL_DEFINE3(socket, int, family, int, type, int, protocol)
+ {
+       int retval;
+       struct socket *sock;
+@@ -1257,8 +1257,8 @@ out_release:
+  *    Create a pair of connected sockets.
+  */
+-asmlinkage long sys_socketpair(int family, int type, int protocol,
+-                             int __user *usockvec)
++SYSCALL_DEFINE4(socketpair, int, family, int, type, int, protocol,
++              int __user *, usockvec)
+ {
+       struct socket *sock1, *sock2;
+       int fd1, fd2, err;
+@@ -1365,7 +1365,7 @@ out_fd:
+  *    the protocol layer (having also checked the address is ok).
+  */
+-asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
++SYSCALL_DEFINE3(bind, int, fd, struct sockaddr __user *, umyaddr, int, addrlen)
+ {
+       struct socket *sock;
+       struct sockaddr_storage address;
+@@ -1394,7 +1394,7 @@ asmlinkage long sys_bind(int fd, struct sockaddr __user *umyaddr, int addrlen)
+  *    ready for listening.
+  */
+-asmlinkage long sys_listen(int fd, int backlog)
++SYSCALL_DEFINE2(listen, int, fd, int, backlog)
+ {
+       struct socket *sock;
+       int err, fput_needed;
+@@ -1567,8 +1567,8 @@ asmlinkage long sys_paccept(int fd, struct sockaddr __user *upeer_sockaddr,
+ #endif
+ #endif
+-asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
+-                         int __user *upeer_addrlen)
++SYSCALL_DEFINE3(accept, int, fd, struct sockaddr __user *, upeer_sockaddr,
++              int __user *, upeer_addrlen)
+ {
+       return do_accept(fd, upeer_sockaddr, upeer_addrlen, 0);
+ }
+@@ -1585,8 +1585,8 @@ asmlinkage long sys_accept(int fd, struct sockaddr __user *upeer_sockaddr,
+  *    include the -EINPROGRESS status for such sockets.
+  */
+-asmlinkage long sys_connect(int fd, struct sockaddr __user *uservaddr,
+-                          int addrlen)
++SYSCALL_DEFINE3(connect, int, fd, struct sockaddr __user *, uservaddr,
++              int, addrlen)
+ {
+       struct socket *sock;
+       struct sockaddr_storage address;
+@@ -1617,8 +1617,8 @@ out:
+  *    name to user space.
+  */
+-asmlinkage long sys_getsockname(int fd, struct sockaddr __user *usockaddr,
+-                              int __user *usockaddr_len)
++SYSCALL_DEFINE3(getsockname, int, fd, struct sockaddr __user *, usockaddr,
++              int __user *, usockaddr_len)
+ {
+       struct socket *sock;
+       struct sockaddr_storage address;
+@@ -1648,8 +1648,8 @@ out:
+  *    name to user space.
+  */
+-asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+-                              int __user *usockaddr_len)
++SYSCALL_DEFINE3(getpeername, int, fd, struct sockaddr __user *, usockaddr,
++              int __user *, usockaddr_len)
+ {
+       struct socket *sock;
+       struct sockaddr_storage address;
+@@ -1680,9 +1680,9 @@ asmlinkage long sys_getpeername(int fd, struct sockaddr __user *usockaddr,
+  *    the protocol.
+  */
+-asmlinkage long sys_sendto(int fd, void __user *buff, size_t len,
+-                         unsigned flags, struct sockaddr __user *addr,
+-                         int addr_len)
++SYSCALL_DEFINE6(sendto, int, fd, void __user *, buff, size_t, len,
++              unsigned, flags, struct sockaddr __user *, addr,
++              int, addr_len)
+ {
+       struct socket *sock;
+       struct sockaddr_storage address;
+@@ -1725,7 +1725,8 @@ out:
+  *    Send a datagram down a socket.
+  */
+-asmlinkage long sys_send(int fd, void __user *buff, size_t len, unsigned flags)
++SYSCALL_DEFINE4(send, int, fd, void __user *, buff, size_t, len,
++              unsigned, flags)
+ {
+       return sys_sendto(fd, buff, len, flags, NULL, 0);
+ }
+@@ -1736,9 +1737,9 @@ asmlinkage long sys_send(int fd, void __user *buff, size_t len, unsigned flags)
+  *    sender address from kernel to user space.
+  */
+-asmlinkage long sys_recvfrom(int fd, void __user *ubuf, size_t size,
+-                           unsigned flags, struct sockaddr __user *addr,
+-                           int __user *addr_len)
++SYSCALL_DEFINE6(recvfrom, int, fd, void __user *, ubuf, size_t, size,
++              unsigned, flags, struct sockaddr __user *, addr,
++              int __user *, addr_len)
+ {
+       struct socket *sock;
+       struct iovec iov;
+@@ -1790,8 +1791,8 @@ asmlinkage long sys_recv(int fd, void __user *ubuf, size_t size,
+  *    to pass the user mode parameter for the protocols to sort out.
+  */
+-asmlinkage long sys_setsockopt(int fd, int level, int optname,
+-                             char __user *optval, int optlen)
++SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
++              char __user *, optval, int, optlen)
+ {
+       int err, fput_needed;
+       struct socket *sock;
+@@ -1824,8 +1825,8 @@ out_put:
+  *    to pass a user mode parameter for the protocols to sort out.
+  */
+-asmlinkage long sys_getsockopt(int fd, int level, int optname,
+-                             char __user *optval, int __user *optlen)
++SYSCALL_DEFINE5(getsockopt, int, fd, int, level, int, optname,
++              char __user *, optval, int __user *, optlen)
+ {
+       int err, fput_needed;
+       struct socket *sock;
+@@ -1854,7 +1855,7 @@ out_put:
+  *    Shutdown a socket.
+  */
+-asmlinkage long sys_shutdown(int fd, int how)
++SYSCALL_DEFINE2(shutdown, int, fd, int, how)
+ {
+       int err, fput_needed;
+       struct socket *sock;
+@@ -1880,7 +1881,7 @@ asmlinkage long sys_shutdown(int fd, int how)
+  *    BSD sendmsg interface
+  */
+-asmlinkage long sys_sendmsg(int fd, struct msghdr __user *msg, unsigned flags)
++SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
+ {
+       struct compat_msghdr __user *msg_compat =
+           (struct compat_msghdr __user *)msg;
+@@ -1986,8 +1987,8 @@ out:
+  *    BSD recvmsg interface
+  */
+-asmlinkage long sys_recvmsg(int fd, struct msghdr __user *msg,
+-                          unsigned int flags)
++SYSCALL_DEFINE3(recvmsg, int, fd, struct msghdr __user *, msg,
++              unsigned int, flags)
+ {
+       struct compat_msghdr __user *msg_compat =
+           (struct compat_msghdr __user *)msg;
+@@ -2110,7 +2111,7 @@ static const unsigned char nargs[19]={
+  *  it is set by the callees.
+  */
+-asmlinkage long sys_socketcall(int call, unsigned long __user *args)
++SYSCALL_DEFINE2(socketcall, int, call, unsigned long __user *, args)
+ {
+       unsigned long a[6];
+       unsigned long a0, a1;
+diff --git a/security/device_cgroup.c b/security/device_cgroup.c
+index 46f2397..9ef066d 100644
+--- a/security/device_cgroup.c
++++ b/security/device_cgroup.c
+@@ -543,6 +543,9 @@ int devcgroup_inode_mknod(int mode, dev_t dev)
+       struct dev_cgroup *dev_cgroup;
+       struct dev_whitelist_item *wh;
++      if (!S_ISBLK(mode) && !S_ISCHR(mode))
++              return 0;
++
+       rcu_read_lock();
+       dev_cgroup = task_devcgroup(current);
+diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
+index acc9c89..9b4e0e9 100644
+--- a/security/keys/keyctl.c
++++ b/security/keys/keyctl.c
+@@ -54,11 +54,11 @@ static int key_get_type_from_user(char *type,
+  * - returns the new key's serial number
+  * - implements add_key()
+  */
+-asmlinkage long sys_add_key(const char __user *_type,
+-                          const char __user *_description,
+-                          const void __user *_payload,
+-                          size_t plen,
+-                          key_serial_t ringid)
++SYSCALL_DEFINE5(add_key, const char __user *, _type,
++              const char __user *, _description,
++              const void __user *, _payload,
++              size_t, plen,
++              key_serial_t, ringid)
+ {
+       key_ref_t keyring_ref, key_ref;
+       char type[32], *description;
+@@ -146,10 +146,10 @@ asmlinkage long sys_add_key(const char __user *_type,
+  *   - if the _callout_info string is empty, it will be rendered as "-"
+  * - implements request_key()
+  */
+-asmlinkage long sys_request_key(const char __user *_type,
+-                              const char __user *_description,
+-                              const char __user *_callout_info,
+-                              key_serial_t destringid)
++SYSCALL_DEFINE4(request_key, const char __user *, _type,
++              const char __user *, _description,
++              const char __user *, _callout_info,
++              key_serial_t, destringid)
+ {
+       struct key_type *ktype;
+       struct key *key;
+@@ -1152,8 +1152,8 @@ long keyctl_get_security(key_serial_t keyid,
+ /*
+  * the key control system call
+  */
+-asmlinkage long sys_keyctl(int option, unsigned long arg2, unsigned long arg3,
+-                         unsigned long arg4, unsigned long arg5)
++SYSCALL_DEFINE5(keyctl, int, option, unsigned long, arg2, unsigned long, arg3,
++              unsigned long, arg4, unsigned long, arg5)
+ {
+       switch (option) {
+       case KEYCTL_GET_KEYRING_ID:
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index cb13307..591f62f 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -3848,6 +3848,7 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
+ static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
+       SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
++      SND_PCI_QUIRK(0x103c, 0x30e6, "HP 6730b", AD1884A_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
+       SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
+diff --git a/sound/usb/caiaq/caiaq-device.h b/sound/usb/caiaq/caiaq-device.h
+index f9fbdba..ab56e73 100644
+--- a/sound/usb/caiaq/caiaq-device.h
++++ b/sound/usb/caiaq/caiaq-device.h
+@@ -75,6 +75,7 @@ struct snd_usb_caiaqdev {
+       wait_queue_head_t ep1_wait_queue;
+       wait_queue_head_t prepare_wait_queue;
+       int spec_received, audio_parm_answer;
++      int midi_out_active;
+       char vendor_name[CAIAQ_USB_STR_LEN];
+       char product_name[CAIAQ_USB_STR_LEN];
+diff --git a/sound/usb/caiaq/caiaq-midi.c b/sound/usb/caiaq/caiaq-midi.c
+index 30b57f9..f19fd36 100644
+--- a/sound/usb/caiaq/caiaq-midi.c
++++ b/sound/usb/caiaq/caiaq-midi.c
+@@ -59,6 +59,11 @@ static int snd_usb_caiaq_midi_output_open(struct snd_rawmidi_substream *substrea
+ static int snd_usb_caiaq_midi_output_close(struct snd_rawmidi_substream *substream)
+ {
++      struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
++      if (dev->midi_out_active) {
++              usb_kill_urb(&dev->midi_out_urb);
++              dev->midi_out_active = 0;
++      }
+       return 0;
+ }
+@@ -69,7 +74,8 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
+       
+       dev->midi_out_buf[0] = EP1_CMD_MIDI_WRITE;
+       dev->midi_out_buf[1] = 0; /* port */
+-      len = snd_rawmidi_transmit_peek(substream, dev->midi_out_buf+3, EP1_BUFSIZE-3);
++      len = snd_rawmidi_transmit(substream, dev->midi_out_buf + 3,
++                                 EP1_BUFSIZE - 3);
+       
+       if (len <= 0)
+               return;
+@@ -79,24 +85,24 @@ static void snd_usb_caiaq_midi_send(struct snd_usb_caiaqdev *dev,
+       
+       ret = usb_submit_urb(&dev->midi_out_urb, GFP_ATOMIC);
+       if (ret < 0)
+-              log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed, %d\n",
+-                              substream, ret);
++              log("snd_usb_caiaq_midi_send(%p): usb_submit_urb() failed,"
++                  "ret=%d, len=%d\n",
++                  substream, ret, len);
++      else
++              dev->midi_out_active = 1;
+ }
+ static void snd_usb_caiaq_midi_output_trigger(struct snd_rawmidi_substream *substream, int up)
+ {
+       struct snd_usb_caiaqdev *dev = substream->rmidi->private_data;
+       
+-      if (dev->midi_out_substream != NULL)
+-              return;
+-      
+-      if (!up) {
++      if (up) {
++              dev->midi_out_substream = substream;
++              if (!dev->midi_out_active)
++                      snd_usb_caiaq_midi_send(dev, substream);
++      } else {
+               dev->midi_out_substream = NULL;
+-              return;
+       }
+-      
+-      dev->midi_out_substream = substream;
+-      snd_usb_caiaq_midi_send(dev, substream);
+ }
+@@ -161,16 +167,14 @@ int snd_usb_caiaq_midi_init(struct snd_usb_caiaqdev *device)
+ void snd_usb_caiaq_midi_output_done(struct urb* urb)
+ {
+       struct snd_usb_caiaqdev *dev = urb->context;
+-              char *buf = urb->transfer_buffer;
+       
++      dev->midi_out_active = 0;
+       if (urb->status != 0)
+               return;
+       if (!dev->midi_out_substream)
+               return;
+-      snd_rawmidi_transmit_ack(dev->midi_out_substream, buf[2]);
+-      dev->midi_out_substream = NULL;
+       snd_usb_caiaq_midi_send(dev, dev->midi_out_substream);
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.12-13 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.12-13
new file mode 100644 (file)
index 0000000..520f0be
--- /dev/null
@@ -0,0 +1,1750 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.13
+
+Upstream 2.6.27.13 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
+index b117e42..90f718c 100644
+--- a/Documentation/sound/alsa/ALSA-Configuration.txt
++++ b/Documentation/sound/alsa/ALSA-Configuration.txt
+@@ -960,9 +960,10 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
+         6stack        6-jack, separate surrounds (default)
+         3stack        3-stack, shared surrounds
+         laptop        2-channel only (FSC V2060, Samsung M50)
+-        laptop-eapd   2-channel with EAPD (Samsung R65, ASUS A6J)
++        laptop-eapd   2-channel with EAPD (ASUS A6J)
+         laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
+         ultra         2-channel with EAPD (Samsung Ultra tablet PC)
++        samsung       2-channel with EAPD (Samsung R65)
+       AD1988/AD1988B/AD1989A/AD1989B
+         6stack        6-jack
+diff --git a/Makefile b/Makefile
+index f0f8cdf..d879e7d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .12
++EXTRAVERSION = .13
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
+index 48e496f..fb7e69c 100644
+--- a/arch/ia64/Kconfig
++++ b/arch/ia64/Kconfig
+@@ -15,6 +15,7 @@ config IA64
+       select ACPI if (!IA64_HP_SIM)
+       select PM if (!IA64_HP_SIM)
+       select ARCH_SUPPORTS_MSI
++      select HAVE_UNSTABLE_SCHED_CLOCK
+       select HAVE_IDE
+       select HAVE_OPROFILE
+       select HAVE_KPROBES
+diff --git a/arch/powerpc/mm/slice.c b/arch/powerpc/mm/slice.c
+index db44e02..ba51948 100644
+--- a/arch/powerpc/mm/slice.c
++++ b/arch/powerpc/mm/slice.c
+@@ -710,9 +710,18 @@ int is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
+                          unsigned long len)
+ {
+       struct slice_mask mask, available;
++      unsigned int psize = mm->context.user_psize;
+       mask = slice_range_to_mask(addr, len);
+-      available = slice_mask_for_size(mm, mm->context.user_psize);
++      available = slice_mask_for_size(mm, psize);
++#ifdef CONFIG_PPC_64K_PAGES
++      /* We need to account for 4k slices too */
++      if (psize == MMU_PAGE_64K) {
++              struct slice_mask compat_mask;
++              compat_mask = slice_mask_for_size(mm, MMU_PAGE_4K);
++              or_mask(available, compat_mask);
++      }
++#endif
+ #if 0 /* too verbose */
+       slice_dbg("is_hugepage_only_range(mm=%p, addr=%lx, len=%lx)\n",
+diff --git a/drivers/firmware/dell_rbu.c b/drivers/firmware/dell_rbu.c
+index 13946eb..b4704e1 100644
+--- a/drivers/firmware/dell_rbu.c
++++ b/drivers/firmware/dell_rbu.c
+@@ -576,7 +576,7 @@ static ssize_t read_rbu_image_type(struct kobject *kobj,
+ {
+       int size = 0;
+       if (!pos)
+-              size = sprintf(buffer, "%s\n", image_type);
++              size = scnprintf(buffer, count, "%s\n", image_type);
+       return size;
+ }
+@@ -648,7 +648,7 @@ static ssize_t read_rbu_packet_size(struct kobject *kobj,
+       int size = 0;
+       if (!pos) {
+               spin_lock(&rbu_data.lock);
+-              size = sprintf(buffer, "%lu\n", rbu_data.packetsize);
++              size = scnprintf(buffer, count, "%lu\n", rbu_data.packetsize);
+               spin_unlock(&rbu_data.lock);
+       }
+       return size;
+diff --git a/drivers/hwmon/abituguru3.c b/drivers/hwmon/abituguru3.c
+index d9e7a49..58a5efb 100644
+--- a/drivers/hwmon/abituguru3.c
++++ b/drivers/hwmon/abituguru3.c
+@@ -1153,7 +1153,7 @@ static int __init abituguru3_dmi_detect(void)
+ static inline int abituguru3_dmi_detect(void)
+ {
+-      return -ENODEV;
++      return 1;
+ }
+ #endif /* CONFIG_DMI */
+diff --git a/drivers/hwmon/hwmon-vid.c b/drivers/hwmon/hwmon-vid.c
+index c54eff9..bfc2961 100644
+--- a/drivers/hwmon/hwmon-vid.c
++++ b/drivers/hwmon/hwmon-vid.c
+@@ -180,6 +180,7 @@ static struct vrm_model vrm_models[] = {
+       {X86_VENDOR_AMD, 0x6, ANY, ANY, 90},            /* Athlon Duron etc */
+       {X86_VENDOR_AMD, 0xF, 0x3F, ANY, 24},           /* Athlon 64, Opteron */
+       {X86_VENDOR_AMD, 0xF, ANY, ANY, 25},            /* NPT family 0Fh */
++      {X86_VENDOR_AMD, 0x10, ANY, ANY, 25},           /* NPT family 10h */
+       {X86_VENDOR_INTEL, 0x6, 0x9, ANY, 13},          /* Pentium M (130 nm) */
+       {X86_VENDOR_INTEL, 0x6, 0xB, ANY, 85},          /* Tualatin */
+       {X86_VENDOR_INTEL, 0x6, 0xD, ANY, 13},          /* Pentium M (90 nm) */
+diff --git a/drivers/misc/sgi-xp/xpc_sn2.c b/drivers/misc/sgi-xp/xpc_sn2.c
+index b4882cc..d32c1ee 100644
+--- a/drivers/misc/sgi-xp/xpc_sn2.c
++++ b/drivers/misc/sgi-xp/xpc_sn2.c
+@@ -904,7 +904,7 @@ xpc_update_partition_info_sn2(struct xpc_partition *part, u8 remote_rp_version,
+       dev_dbg(xpc_part, "  remote_vars_pa = 0x%016lx\n",
+               part_sn2->remote_vars_pa);
+-      part->last_heartbeat = remote_vars->heartbeat;
++      part->last_heartbeat = remote_vars->heartbeat - 1;
+       dev_dbg(xpc_part, "  last_heartbeat = 0x%016lx\n",
+               part->last_heartbeat);
+diff --git a/drivers/net/irda/irda-usb.c b/drivers/net/irda/irda-usb.c
+index b5d6b9a..b427978 100644
+--- a/drivers/net/irda/irda-usb.c
++++ b/drivers/net/irda/irda-usb.c
+@@ -1075,7 +1075,7 @@ static int stir421x_patch_device(struct irda_usb_cb *self)
+ {
+       unsigned int i;
+       int ret;
+-      char stir421x_fw_name[11];
++      char stir421x_fw_name[12];
+       const struct firmware *fw;
+       const unsigned char *fw_version_ptr; /* pointer to version string */
+       unsigned long fw_version = 0;
+diff --git a/drivers/net/r6040.c b/drivers/net/r6040.c
+index 5d86281..c71982d 100644
+--- a/drivers/net/r6040.c
++++ b/drivers/net/r6040.c
+@@ -49,8 +49,8 @@
+ #include <asm/processor.h>
+ #define DRV_NAME      "r6040"
+-#define DRV_VERSION   "0.18"
+-#define DRV_RELDATE   "13Jul2008"
++#define DRV_VERSION   "0.19"
++#define DRV_RELDATE   "18Dec2008"
+ /* PHY CHIP Address */
+ #define PHY1_ADDR     1       /* For MAC1 */
+@@ -214,7 +214,7 @@ static int r6040_phy_read(void __iomem *ioaddr, int phy_addr, int reg)
+       /* Wait for the read bit to be cleared */
+       while (limit--) {
+               cmd = ioread16(ioaddr + MMDIO);
+-              if (cmd & MDIO_READ)
++              if (!(cmd & MDIO_READ))
+                       break;
+       }
+@@ -233,7 +233,7 @@ static void r6040_phy_write(void __iomem *ioaddr, int phy_addr, int reg, u16 val
+       /* Wait for the write bit to be cleared */
+       while (limit--) {
+               cmd = ioread16(ioaddr + MMDIO);
+-              if (cmd & MDIO_WRITE)
++              if (!(cmd & MDIO_WRITE))
+                       break;
+       }
+ }
+@@ -681,8 +681,10 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
+       struct net_device *dev = dev_id;
+       struct r6040_private *lp = netdev_priv(dev);
+       void __iomem *ioaddr = lp->base;
+-      u16 status;
++      u16 misr, status;
++      /* Save MIER */
++      misr = ioread16(ioaddr + MIER);
+       /* Mask off RDC MAC interrupt */
+       iowrite16(MSK_INT, ioaddr + MIER);
+       /* Read MISR status and clear */
+@@ -702,7 +704,7 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
+                       dev->stats.rx_fifo_errors++;
+               /* Mask off RX interrupt */
+-              iowrite16(ioread16(ioaddr + MIER) & ~RX_INTS, ioaddr + MIER);
++              misr &= ~RX_INTS;
+               netif_rx_schedule(dev, &lp->napi);
+       }
+@@ -710,6 +712,9 @@ static irqreturn_t r6040_interrupt(int irq, void *dev_id)
+       if (status & TX_INTS)
+               r6040_tx(dev);
++      /* Restore RDC MAC interrupt */
++      iowrite16(misr, ioaddr + MIER);
++
+       return IRQ_HANDLED;
+ }
+diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c
+index 6dbfed0..69120b5 100644
+--- a/drivers/net/wireless/ath9k/hw.c
++++ b/drivers/net/wireless/ath9k/hw.c
+@@ -729,7 +729,7 @@ ath9k_hw_eeprom_set_board_values(struct ath_hal *ah,
+                                         AR_AN_TOP2_LOCALBIAS,
+                                         AR_AN_TOP2_LOCALBIAS_S,
+                                         pModal->local_bias);
+-              DPRINTF(ah->ah_sc, ATH_DBG_ANY, "ForceXPAon: %d\n",
++              DPRINTF(ah->ah_sc, ATH_DBG_EEPROM, "ForceXPAon: %d\n",
+                       pModal->force_xpaon);
+               REG_RMW_FIELD(ah, AR_PHY_XPA_CFG, AR_PHY_FORCE_XPA_CFG,
+                             pModal->force_xpaon);
+diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
+index cbaca23..bfff6b5 100644
+--- a/drivers/net/wireless/p54/p54usb.c
++++ b/drivers/net/wireless/p54/p54usb.c
+@@ -53,6 +53,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
+       {USB_DEVICE(0x050d, 0x7050)},   /* Belkin F5D7050 ver 1000 */
+       {USB_DEVICE(0x0572, 0x2000)},   /* Cohiba Proto board */
+       {USB_DEVICE(0x0572, 0x2002)},   /* Cohiba Proto board */
++      {USB_DEVICE(0x06b9, 0x0121)},   /* Thomson SpeedTouch 121g */
+       {USB_DEVICE(0x0707, 0xee13)},   /* SMC 2862W-G version 2 */
+       {USB_DEVICE(0x083a, 0x4521)},   /* Siemens Gigaset USB Adapter 54 version 2 */
+       {USB_DEVICE(0x0846, 0x4240)},   /* Netgear WG111 (v2) */
+diff --git a/drivers/net/wireless/rt2x00/rt73usb.c b/drivers/net/wireless/rt2x00/rt73usb.c
+index 9761eaa..45bf8f7 100644
+--- a/drivers/net/wireless/rt2x00/rt73usb.c
++++ b/drivers/net/wireless/rt2x00/rt73usb.c
+@@ -2113,6 +2113,7 @@ static struct usb_device_id rt73usb_device_table[] = {
+       /* Linksys */
+       { USB_DEVICE(0x13b1, 0x0020), USB_DEVICE_DATA(&rt73usb_ops) },
+       { USB_DEVICE(0x13b1, 0x0023), USB_DEVICE_DATA(&rt73usb_ops) },
++      { USB_DEVICE(0x13b1, 0x0028), USB_DEVICE_DATA(&rt73usb_ops) },
+       /* MSI */
+       { USB_DEVICE(0x0db0, 0x6877), USB_DEVICE_DATA(&rt73usb_ops) },
+       { USB_DEVICE(0x0db0, 0x6874), USB_DEVICE_DATA(&rt73usb_ops) },
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index aa6fda1..8a82a62 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -33,6 +33,11 @@ struct endpoint_state {
+ struct pcie_link_state {
+       struct list_head sibiling;
+       struct pci_dev *pdev;
++      bool downstream_has_switch;
++
++      struct pcie_link_state *parent;
++      struct list_head children;
++      struct list_head link;
+       /* ASPM state */
+       unsigned int support_state;
+@@ -125,7 +130,7 @@ static void pcie_set_clock_pm(struct pci_dev *pdev, int enable)
+       link_state->clk_pm_enabled = !!enable;
+ }
+-static void pcie_check_clock_pm(struct pci_dev *pdev)
++static void pcie_check_clock_pm(struct pci_dev *pdev, int blacklist)
+ {
+       int pos;
+       u32 reg32;
+@@ -149,10 +154,26 @@ static void pcie_check_clock_pm(struct pci_dev *pdev)
+               if (!(reg16 & PCI_EXP_LNKCTL_CLKREQ_EN))
+                       enabled = 0;
+       }
+-      link_state->clk_pm_capable = capable;
+       link_state->clk_pm_enabled = enabled;
+       link_state->bios_clk_state = enabled;
+-      pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
++      if (!blacklist) {
++              link_state->clk_pm_capable = capable;
++              pcie_set_clock_pm(pdev, policy_to_clkpm_state(pdev));
++      } else {
++              link_state->clk_pm_capable = 0;
++              pcie_set_clock_pm(pdev, 0);
++      }
++}
++
++static bool pcie_aspm_downstream_has_switch(struct pci_dev *pdev)
++{
++      struct pci_dev *child_dev;
++
++      list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
++              if (child_dev->pcie_type == PCI_EXP_TYPE_UPSTREAM)
++                      return true;
++      }
++      return false;
+ }
+ /*
+@@ -419,9 +440,9 @@ static unsigned int pcie_aspm_check_state(struct pci_dev *pdev,
+ {
+       struct pci_dev *child_dev;
+-      /* If no child, disable the link */
++      /* If no child, ignore the link */
+       if (list_empty(&pdev->subordinate->devices))
+-              return 0;
++              return state;
+       list_for_each_entry(child_dev, &pdev->subordinate->devices, bus_list) {
+               if (child_dev->pcie_type == PCI_EXP_TYPE_PCI_BRIDGE) {
+                       /*
+@@ -462,6 +483,9 @@ static void __pcie_aspm_config_link(struct pci_dev *pdev, unsigned int state)
+       int valid = 1;
+       struct pcie_link_state *link_state = pdev->link_state;
++      /* If no child, disable the link */
++      if (list_empty(&pdev->subordinate->devices))
++              state = 0;
+       /*
+        * if the downstream component has pci bridge function, don't do ASPM
+        * now
+@@ -493,20 +517,52 @@ static void __pcie_aspm_config_link(struct pci_dev *pdev, unsigned int state)
+       link_state->enabled_state = state;
+ }
++static struct pcie_link_state *get_root_port_link(struct pcie_link_state *link)
++{
++      struct pcie_link_state *root_port_link = link;
++      while (root_port_link->parent)
++              root_port_link = root_port_link->parent;
++      return root_port_link;
++}
++
++/* check the whole hierarchy, and configure each link in the hierarchy */
+ static void __pcie_aspm_configure_link_state(struct pci_dev *pdev,
+       unsigned int state)
+ {
+       struct pcie_link_state *link_state = pdev->link_state;
++      struct pcie_link_state *root_port_link = get_root_port_link(link_state);
++      struct pcie_link_state *leaf;
+-      if (link_state->support_state == 0)
+-              return;
+       state &= PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
+-      /* state 0 means disabling aspm */
+-      state = pcie_aspm_check_state(pdev, state);
++      /* check all links who have specific root port link */
++      list_for_each_entry(leaf, &link_list, sibiling) {
++              if (!list_empty(&leaf->children) ||
++                      get_root_port_link(leaf) != root_port_link)
++                      continue;
++              state = pcie_aspm_check_state(leaf->pdev, state);
++      }
++      /* check root port link too in case it hasn't children */
++      state = pcie_aspm_check_state(root_port_link->pdev, state);
++
+       if (link_state->enabled_state == state)
+               return;
+-      __pcie_aspm_config_link(pdev, state);
++
++      /*
++       * we must change the hierarchy. See comments in
++       * __pcie_aspm_config_link for the order
++       **/
++      if (state & PCIE_LINK_STATE_L1) {
++              list_for_each_entry(leaf, &link_list, sibiling) {
++                      if (get_root_port_link(leaf) == root_port_link)
++                              __pcie_aspm_config_link(leaf->pdev, state);
++              }
++      } else {
++              list_for_each_entry_reverse(leaf, &link_list, sibiling) {
++                      if (get_root_port_link(leaf) == root_port_link)
++                              __pcie_aspm_config_link(leaf->pdev, state);
++              }
++      }
+ }
+ /*
+@@ -570,6 +626,7 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
+       unsigned int state;
+       struct pcie_link_state *link_state;
+       int error = 0;
++      int blacklist;
+       if (aspm_disabled || !pdev->is_pcie || pdev->link_state)
+               return;
+@@ -580,29 +637,58 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
+       if (list_empty(&pdev->subordinate->devices))
+               goto out;
+-      if (pcie_aspm_sanity_check(pdev))
+-              goto out;
++      blacklist = !!pcie_aspm_sanity_check(pdev);
+       mutex_lock(&aspm_lock);
+       link_state = kzalloc(sizeof(*link_state), GFP_KERNEL);
+       if (!link_state)
+               goto unlock_out;
+-      pdev->link_state = link_state;
+-      pcie_aspm_configure_common_clock(pdev);
++      link_state->downstream_has_switch = pcie_aspm_downstream_has_switch(pdev);
++      INIT_LIST_HEAD(&link_state->children);
++      INIT_LIST_HEAD(&link_state->link);
++      if (pdev->bus->self) {/* this is a switch */
++              struct pcie_link_state *parent_link_state;
+-      pcie_aspm_cap_init(pdev);
++              parent_link_state = pdev->bus->parent->self->link_state;
++              if (!parent_link_state) {
++                      kfree(link_state);
++                      goto unlock_out;
++              }
++              list_add(&link_state->link, &parent_link_state->children);
++              link_state->parent = parent_link_state;
++      }
+-      /* config link state to avoid BIOS error */
+-      state = pcie_aspm_check_state(pdev, policy_to_aspm_state(pdev));
+-      __pcie_aspm_config_link(pdev, state);
++      pdev->link_state = link_state;
+-      pcie_check_clock_pm(pdev);
++      if (!blacklist) {
++              pcie_aspm_configure_common_clock(pdev);
++              pcie_aspm_cap_init(pdev);
++      } else {
++              link_state->enabled_state = PCIE_LINK_STATE_L0S|PCIE_LINK_STATE_L1;
++              link_state->bios_aspm_state = 0;
++              /* Set support state to 0, so we will disable ASPM later */
++              link_state->support_state = 0;
++      }
+       link_state->pdev = pdev;
+       list_add(&link_state->sibiling, &link_list);
++      if (link_state->downstream_has_switch) {
++              /*
++               * If link has switch, delay the link config. The leaf link
++               * initialization will config the whole hierarchy. but we must
++               * make sure BIOS doesn't set unsupported link state
++               **/
++              state = pcie_aspm_check_state(pdev, link_state->bios_aspm_state);
++              __pcie_aspm_config_link(pdev, state);
++      } else
++              __pcie_aspm_configure_link_state(pdev,
++                      policy_to_aspm_state(pdev));
++
++      pcie_check_clock_pm(pdev, blacklist);
++
+ unlock_out:
+       if (error)
+               free_link_state(pdev);
+@@ -635,6 +721,7 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
+       /* All functions are removed, so just disable ASPM for the link */
+       __pcie_aspm_config_one_dev(parent, 0);
+       list_del(&link_state->sibiling);
++      list_del(&link_state->link);
+       /* Clock PM is for endpoint device */
+       free_link_state(parent);
+diff --git a/drivers/usb/storage/libusual.c b/drivers/usb/storage/libusual.c
+index d617e8a..f970b27 100644
+--- a/drivers/usb/storage/libusual.c
++++ b/drivers/usb/storage/libusual.c
+@@ -46,6 +46,12 @@ static int usu_probe_thread(void *arg);
+ { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \
+   .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
++#define COMPLIANT_DEV(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax, \
++                  vendorName, productName, useProtocol, useTransport, \
++                  initFunction, flags) \
++{ USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin, bcdDeviceMax), \
++  .driver_info = (flags) }
++
+ #define USUAL_DEV(useProto, useTrans, useType) \
+ { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \
+   .driver_info = ((useType)<<24) }
+@@ -57,6 +63,7 @@ struct usb_device_id storage_usb_ids [] = {
+ #undef USUAL_DEV
+ #undef UNUSUAL_DEV
++#undef COMPLIANT_DEV
+ MODULE_DEVICE_TABLE(usb, storage_usb_ids);
+ EXPORT_SYMBOL_GPL(storage_usb_ids);
+diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
+index 09779f6..620c2b5 100644
+--- a/drivers/usb/storage/scsiglue.c
++++ b/drivers/usb/storage/scsiglue.c
+@@ -59,6 +59,13 @@
+ #include "transport.h"
+ #include "protocol.h"
++/* Vendor IDs for companies that seem to include the READ CAPACITY bug
++ * in all their devices
++ */
++#define VENDOR_ID_NOKIA               0x0421
++#define VENDOR_ID_NIKON               0x04b0
++#define VENDOR_ID_MOTOROLA    0x22b8
++
+ /***********************************************************************
+  * Host functions 
+  ***********************************************************************/
+@@ -134,6 +141,22 @@ static int slave_configure(struct scsi_device *sdev)
+        * settings can't be overridden via the scsi devinfo mechanism. */
+       if (sdev->type == TYPE_DISK) {
++              /* Some vendors seem to put the READ CAPACITY bug into
++               * all their devices -- primarily makers of cell phones
++               * and digital cameras.  Since these devices always use
++               * flash media and can be expected to have an even number
++               * of sectors, we will always enable the CAPACITY_HEURISTICS
++               * flag unless told otherwise. */
++              switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
++              case VENDOR_ID_NOKIA:
++              case VENDOR_ID_NIKON:
++              case VENDOR_ID_MOTOROLA:
++                      if (!(us->fflags & (US_FL_FIX_CAPACITY |
++                                      US_FL_CAPACITY_OK)))
++                              us->fflags |= US_FL_CAPACITY_HEURISTICS;
++                      break;
++              }
++
+               /* Disk-type devices use MODE SENSE(6) if the protocol
+                * (SubClass) is Transparent SCSI, otherwise they use
+                * MODE SENSE(10). */
+@@ -196,6 +219,14 @@ static int slave_configure(struct scsi_device *sdev)
+                * sector in a larger then 1 sector read, since the performance
+                * impact is negible we set this flag for all USB disks */
+               sdev->last_sector_bug = 1;
++
++              /* Enable last-sector hacks for single-target devices using
++               * the Bulk-only transport, unless we already know the
++               * capacity will be decremented or is correct. */
++              if (!(us->fflags & (US_FL_FIX_CAPACITY | US_FL_CAPACITY_OK |
++                                      US_FL_SCM_MULT_TARG)) &&
++                              us->protocol == US_PR_BULK)
++                      us->use_last_sector_hacks = 1;
+       } else {
+               /* Non-disk-type devices don't need to blacklist any pages
+diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
+index 3523a0b..861e308 100644
+--- a/drivers/usb/storage/transport.c
++++ b/drivers/usb/storage/transport.c
+@@ -57,6 +57,9 @@
+ #include "scsiglue.h"
+ #include "debug.h"
++#include <linux/blkdev.h>
++#include "../../scsi/sd.h"
++
+ /***********************************************************************
+  * Data transfer routines
+@@ -511,6 +514,80 @@ int usb_stor_bulk_transfer_sg(struct us_data* us, unsigned int pipe,
+  * Transport routines
+  ***********************************************************************/
++/* There are so many devices that report the capacity incorrectly,
++ * this routine was written to counteract some of the resulting
++ * problems.
++ */
++static void last_sector_hacks(struct us_data *us, struct scsi_cmnd *srb)
++{
++      struct gendisk *disk;
++      struct scsi_disk *sdkp;
++      u32 sector;
++
++      /* To Report "Medium Error: Record Not Found */
++      static unsigned char record_not_found[18] = {
++              [0]     = 0x70,                 /* current error */
++              [2]     = MEDIUM_ERROR,         /* = 0x03 */
++              [7]     = 0x0a,                 /* additional length */
++              [12]    = 0x14                  /* Record Not Found */
++      };
++
++      /* If last-sector problems can't occur, whether because the
++       * capacity was already decremented or because the device is
++       * known to report the correct capacity, then we don't need
++       * to do anything.
++       */
++      if (!us->use_last_sector_hacks)
++              return;
++
++      /* Was this command a READ(10) or a WRITE(10)? */
++      if (srb->cmnd[0] != READ_10 && srb->cmnd[0] != WRITE_10)
++              goto done;
++
++      /* Did this command access the last sector? */
++      sector = (srb->cmnd[2] << 24) | (srb->cmnd[3] << 16) |
++                      (srb->cmnd[4] << 8) | (srb->cmnd[5]);
++      disk = srb->request->rq_disk;
++      if (!disk)
++              goto done;
++      sdkp = scsi_disk(disk);
++      if (!sdkp)
++              goto done;
++      if (sector + 1 != sdkp->capacity)
++              goto done;
++
++      if (srb->result == SAM_STAT_GOOD && scsi_get_resid(srb) == 0) {
++
++              /* The command succeeded.  We know this device doesn't
++               * have the last-sector bug, so stop checking it.
++               */
++              us->use_last_sector_hacks = 0;
++
++      } else {
++              /* The command failed.  Allow up to 3 retries in case this
++               * is some normal sort of failure.  After that, assume the
++               * capacity is wrong and we're trying to access the sector
++               * beyond the end.  Replace the result code and sense data
++               * with values that will cause the SCSI core to fail the
++               * command immediately, instead of going into an infinite
++               * (or even just a very long) retry loop.
++               */
++              if (++us->last_sector_retries < 3)
++                      return;
++              srb->result = SAM_STAT_CHECK_CONDITION;
++              memcpy(srb->sense_buffer, record_not_found,
++                              sizeof(record_not_found));
++      }
++
++ done:
++      /* Don't reset the retry counter for TEST UNIT READY commands,
++       * because they get issued after device resets which might be
++       * caused by a failed last-sector access.
++       */
++      if (srb->cmnd[0] != TEST_UNIT_READY)
++              us->last_sector_retries = 0;
++}
++
+ /* Invoke the transport and basic error-handling/recovery methods
+  *
+  * This is used by the protocol layers to actually send the message to
+@@ -544,6 +621,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
+       /* if the transport provided its own sense data, don't auto-sense */
+       if (result == USB_STOR_TRANSPORT_NO_SENSE) {
+               srb->result = SAM_STAT_CHECK_CONDITION;
++              last_sector_hacks(us, srb);
+               return;
+       }
+@@ -667,6 +745,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
+                       scsi_bufflen(srb) - scsi_get_resid(srb) < srb->underflow)
+               srb->result = (DID_ERROR << 16) | (SUGGEST_RETRY << 24);
++      last_sector_hacks(us, srb);
+       return;
+       /* Error and abort processing: try to resynchronize with the device
+@@ -694,6 +773,7 @@ void usb_stor_invoke_transport(struct scsi_cmnd *srb, struct us_data *us)
+               us->transport_reset(us);
+       }
+       clear_bit(US_FLIDX_RESETTING, &us->dflags);
++      last_sector_hacks(us, srb);
+ }
+ /* Stop the current URB transfer */
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 476da5d..6fcb6d1 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -27,7 +27,8 @@
+ /* IMPORTANT NOTE: This file must be included in another file which does
+  * the following thing for it to work:
+- * The macro UNUSUAL_DEV() must be defined before this file is included
++ * The UNUSUAL_DEV, COMPLIANT_DEV, and USUAL_DEV macros must be defined
++ * before this file is included.
+  */
+ /* If you edit this file, please try to keep it sorted first by VendorID,
+@@ -46,6 +47,12 @@
+  * <usb-storage@lists.one-eyed-alien.net>
+  */
++/* Note: If you add an entry only in order to set the CAPACITY_OK flag,
++ * use the COMPLIANT_DEV macro instead of UNUSUAL_DEV.  This is
++ * because such entries mark devices which actually work correctly,
++ * as opposed to devices that do something strangely or wrongly.
++ */
++
+ /* patch submitted by Vivian Bregier <Vivian.Bregier@imag.fr>
+  */
+ UNUSUAL_DEV(  0x03eb, 0x2002, 0x0100, 0x0100,
+@@ -160,20 +167,6 @@ UNUSUAL_DEV(  0x0421, 0x0019, 0x0592, 0x0592,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_MAX_SECTORS_64 ),
+-/* Reported by Filip Joelsson <filip@blueturtle.nu> */
+-UNUSUAL_DEV(  0x0421, 0x005d, 0x0001, 0x0600,
+-              "Nokia",
+-              "Nokia 3110c",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Patch for Nokia 5310 capacity */
+-UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0701,
+-              "Nokia",
+-              "5310",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+ /* Reported by Mario Rettig <mariorettig@web.de> */
+ UNUSUAL_DEV(  0x0421, 0x042e, 0x0100, 0x0100,
+               "Nokia",
+@@ -239,56 +232,6 @@ UNUSUAL_DEV(  0x0421, 0x0495, 0x0370, 0x0370,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_MAX_SECTORS_64 ),
+-/* Reported by Cedric Godin <cedric@belbone.be> */
+-UNUSUAL_DEV(  0x0421, 0x04b9, 0x0500, 0x0551,
+-              "Nokia",
+-              "5300",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Reported by Paulo Fessel <pfessel@gmail.com> */
+-UNUSUAL_DEV(  0x0421, 0x04bd, 0x0000, 0x9999,
+-              "Nokia",
+-              "5200",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Reported by Richard Nauber <RichardNauber@web.de> */
+-UNUSUAL_DEV(  0x0421, 0x04fa, 0x0550, 0x0660,
+-              "Nokia",
+-              "6300",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Reported by Ozan Sener <themgzzy@gmail.com> */
+-UNUSUAL_DEV(  0x0421, 0x0060, 0x0551, 0x0551,
+-              "Nokia",
+-              "3500c",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Reported by CSECSY Laszlo <boobaa@frugalware.org> */
+-UNUSUAL_DEV(  0x0421, 0x0063, 0x0001, 0x0601,
+-              "Nokia",
+-              "Nokia 3109c",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+-/* Patch for Nokia 5310 capacity */
+-UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
+-      "Nokia",
+-      "5310",
+-      US_SC_DEVICE, US_PR_DEVICE, NULL,
+-      US_FL_FIX_CAPACITY ),
+-
+-/* Submitted by Ricky Wong Yung Fei <evilbladewarrior@gmail.com> */
+-/* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */
+-UNUSUAL_DEV(  0x0421, 0x00f5, 0x0000, 0x0470,
+-      "Nokia",
+-      "7610 Supernova",
+-      US_SC_DEVICE, US_PR_DEVICE, NULL,
+-      US_FL_FIX_CAPACITY ),
+-
+ /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */
+ UNUSUAL_DEV(  0x0424, 0x0fdc, 0x0210, 0x0210,
+               "SMSC",
+@@ -692,6 +635,13 @@ UNUSUAL_DEV(  0x0525, 0xa140, 0x0100, 0x0100,
+               US_SC_8070, US_PR_DEVICE, NULL,
+               US_FL_FIX_INQUIRY ),
++/* Added by Alan Stern <stern@rowland.harvard.edu> */
++COMPLIANT_DEV(0x0525, 0xa4a5, 0x0000, 0x9999,
++              "Linux",
++              "File-backed Storage Gadget",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_CAPACITY_OK ),
++
+ /* Yakumo Mega Image 37
+  * Submitted by Stephan Fuhrmann <atomenergie@t-online.de> */
+ UNUSUAL_DEV(  0x052b, 0x1801, 0x0100, 0x0100,
+diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
+index 27016fd..ceb8ac3 100644
+--- a/drivers/usb/storage/usb.c
++++ b/drivers/usb/storage/usb.c
+@@ -126,6 +126,8 @@ MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
+ { USB_DEVICE_VER(id_vendor, id_product, bcdDeviceMin,bcdDeviceMax), \
+   .driver_info = (flags)|(USB_US_TYPE_STOR<<24) }
++#define COMPLIANT_DEV UNUSUAL_DEV
++
+ #define USUAL_DEV(useProto, useTrans, useType) \
+ { USB_INTERFACE_INFO(USB_CLASS_MASS_STORAGE, useProto, useTrans), \
+   .driver_info = (USB_US_TYPE_STOR<<24) }
+@@ -134,6 +136,7 @@ static struct usb_device_id storage_usb_ids [] = {
+ #     include "unusual_devs.h"
+ #undef UNUSUAL_DEV
++#undef COMPLIANT_DEV
+ #undef USUAL_DEV
+       /* Terminating entry */
+       { }
+@@ -164,6 +167,8 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids);
+       .initFunction = init_function,  \
+ }
++#define COMPLIANT_DEV UNUSUAL_DEV
++
+ #define USUAL_DEV(use_protocol, use_transport, use_type) \
+ { \
+       .useProtocol = use_protocol,    \
+@@ -173,6 +178,7 @@ MODULE_DEVICE_TABLE (usb, storage_usb_ids);
+ static struct us_unusual_dev us_unusual_dev_list[] = {
+ #     include "unusual_devs.h" 
+ #     undef UNUSUAL_DEV
++#     undef COMPLIANT_DEV
+ #     undef USUAL_DEV
+       /* Terminating entry */
+diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
+index a4ad73b..2e995c9 100644
+--- a/drivers/usb/storage/usb.h
++++ b/drivers/usb/storage/usb.h
+@@ -155,6 +155,10 @@ struct us_data {
+ #ifdef CONFIG_PM
+       pm_hook                 suspend_resume_hook;
+ #endif
++
++      /* hacks for READ CAPACITY bug handling */
++      int                     use_last_sector_hacks;
++      int                     last_sector_retries;
+ };
+ /* Convert between us_data and the corresponding Scsi_Host */
+diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
+index 25adfc3..c8616a0 100644
+--- a/fs/fs-writeback.c
++++ b/fs/fs-writeback.c
+@@ -421,9 +421,6 @@ __writeback_single_inode(struct inode *inode, struct writeback_control *wbc)
+  * If we're a pdlfush thread, then implement pdflush collision avoidance
+  * against the entire list.
+  *
+- * WB_SYNC_HOLD is a hack for sys_sync(): reattach the inode to sb->s_dirty so
+- * that it can be located for waiting on in __writeback_single_inode().
+- *
+  * If `bdi' is non-zero then we're being asked to writeback a specific queue.
+  * This function assumes that the blockdev superblock's inodes are backed by
+  * a variety of queues, so all inodes are searched.  For other superblocks,
+@@ -443,6 +440,7 @@ void generic_sync_sb_inodes(struct super_block *sb,
+                               struct writeback_control *wbc)
+ {
+       const unsigned long start = jiffies;    /* livelock avoidance */
++      int sync = wbc->sync_mode == WB_SYNC_ALL;
+       spin_lock(&inode_lock);
+       if (!wbc->for_kupdate || list_empty(&sb->s_io))
+@@ -499,10 +497,6 @@ void generic_sync_sb_inodes(struct super_block *sb,
+               __iget(inode);
+               pages_skipped = wbc->pages_skipped;
+               __writeback_single_inode(inode, wbc);
+-              if (wbc->sync_mode == WB_SYNC_HOLD) {
+-                      inode->dirtied_when = jiffies;
+-                      list_move(&inode->i_list, &sb->s_dirty);
+-              }
+               if (current_is_pdflush())
+                       writeback_release(bdi);
+               if (wbc->pages_skipped != pages_skipped) {
+@@ -523,7 +517,49 @@ void generic_sync_sb_inodes(struct super_block *sb,
+               if (!list_empty(&sb->s_more_io))
+                       wbc->more_io = 1;
+       }
+-      spin_unlock(&inode_lock);
++
++      if (sync) {
++              struct inode *inode, *old_inode = NULL;
++
++              /*
++               * Data integrity sync. Must wait for all pages under writeback,
++               * because there may have been pages dirtied before our sync
++               * call, but which had writeout started before we write it out.
++               * In which case, the inode may not be on the dirty list, but
++               * we still have to wait for that writeout.
++               */
++              list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
++                      struct address_space *mapping;
++
++                      if (inode->i_state & (I_FREEING|I_WILL_FREE))
++                              continue;
++                      mapping = inode->i_mapping;
++                      if (mapping->nrpages == 0)
++                              continue;
++                      __iget(inode);
++                      spin_unlock(&inode_lock);
++                      /*
++                       * We hold a reference to 'inode' so it couldn't have
++                       * been removed from s_inodes list while we dropped the
++                       * inode_lock.  We cannot iput the inode now as we can
++                       * be holding the last reference and we cannot iput it
++                       * under inode_lock. So we keep the reference and iput
++                       * it later.
++                       */
++                      iput(old_inode);
++                      old_inode = inode;
++
++                      filemap_fdatawait(mapping);
++
++                      cond_resched();
++
++                      spin_lock(&inode_lock);
++              }
++              spin_unlock(&inode_lock);
++              iput(old_inode);
++      } else
++              spin_unlock(&inode_lock);
++
+       return;         /* Leave any unwritten inodes on s_io */
+ }
+ EXPORT_SYMBOL_GPL(generic_sync_sb_inodes);
+@@ -588,8 +624,7 @@ restart:
+ /*
+  * writeback and wait upon the filesystem's dirty inodes.  The caller will
+- * do this in two passes - one to write, and one to wait.  WB_SYNC_HOLD is
+- * used to park the written inodes on sb->s_dirty for the wait pass.
++ * do this in two passes - one to write, and one to wait.
+  *
+  * A finite limit is set on the number of pages which will be written.
+  * To prevent infinite livelock of sys_sync().
+@@ -600,30 +635,21 @@ restart:
+ void sync_inodes_sb(struct super_block *sb, int wait)
+ {
+       struct writeback_control wbc = {
+-              .sync_mode      = wait ? WB_SYNC_ALL : WB_SYNC_HOLD,
++              .sync_mode      = wait ? WB_SYNC_ALL : WB_SYNC_NONE,
+               .range_start    = 0,
+               .range_end      = LLONG_MAX,
+       };
+-      unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY);
+-      unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS);
+-      wbc.nr_to_write = nr_dirty + nr_unstable +
+-                      (inodes_stat.nr_inodes - inodes_stat.nr_unused) +
+-                      nr_dirty + nr_unstable;
+-      wbc.nr_to_write += wbc.nr_to_write / 2;         /* Bit more for luck */
+-      sync_sb_inodes(sb, &wbc);
+-}
++      if (!wait) {
++              unsigned long nr_dirty = global_page_state(NR_FILE_DIRTY);
++              unsigned long nr_unstable = global_page_state(NR_UNSTABLE_NFS);
+-/*
+- * Rather lame livelock avoidance.
+- */
+-static void set_sb_syncing(int val)
+-{
+-      struct super_block *sb;
+-      spin_lock(&sb_lock);
+-      list_for_each_entry_reverse(sb, &super_blocks, s_list)
+-              sb->s_syncing = val;
+-      spin_unlock(&sb_lock);
++              wbc.nr_to_write = nr_dirty + nr_unstable +
++                      (inodes_stat.nr_inodes - inodes_stat.nr_unused);
++      } else
++              wbc.nr_to_write = LONG_MAX; /* doesn't actually matter */
++
++      sync_sb_inodes(sb, &wbc);
+ }
+ /**
+@@ -652,9 +678,6 @@ static void __sync_inodes(int wait)
+       spin_lock(&sb_lock);
+ restart:
+       list_for_each_entry(sb, &super_blocks, s_list) {
+-              if (sb->s_syncing)
+-                      continue;
+-              sb->s_syncing = 1;
+               sb->s_count++;
+               spin_unlock(&sb_lock);
+               down_read(&sb->s_umount);
+@@ -672,13 +695,10 @@ restart:
+ void sync_inodes(int wait)
+ {
+-      set_sb_syncing(0);
+       __sync_inodes(0);
+-      if (wait) {
+-              set_sb_syncing(0);
++      if (wait)
+               __sync_inodes(1);
+-      }
+ }
+ /**
+diff --git a/fs/sync.c b/fs/sync.c
+index 6cc8cb4..9e5f60d 100644
+--- a/fs/sync.c
++++ b/fs/sync.c
+@@ -287,7 +287,7 @@ int do_sync_mapping_range(struct address_space *mapping, loff_t offset,
+       if (flags & SYNC_FILE_RANGE_WRITE) {
+               ret = __filemap_fdatawrite_range(mapping, offset, endbyte,
+-                                              WB_SYNC_NONE);
++                                              WB_SYNC_ALL);
+               if (ret < 0)
+                       goto out;
+       }
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index d621217..d1b3e22 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -1080,7 +1080,6 @@ struct super_block {
+       struct rw_semaphore     s_umount;
+       struct mutex            s_lock;
+       int                     s_count;
+-      int                     s_syncing;
+       int                     s_need_sync_fs;
+       atomic_t                s_active;
+ #ifdef CONFIG_SECURITY
+diff --git a/include/linux/usb_usual.h b/include/linux/usb_usual.h
+index d9a3bbe..bd414ec 100644
+--- a/include/linux/usb_usual.h
++++ b/include/linux/usb_usual.h
+@@ -52,8 +52,9 @@
+       US_FLAG(MAX_SECTORS_MIN,0x00002000)                     \
+               /* Sets max_sectors to arch min */              \
+       US_FLAG(BULK_IGNORE_TAG,0x00004000)                     \
+-              /* Ignore tag mismatch in bulk operations */
+-
++              /* Ignore tag mismatch in bulk operations */    \
++      US_FLAG(CAPACITY_OK,    0x00010000)                     \
++              /* READ CAPACITY response is correct */
+ #define US_FLAG(name, value)  US_FL_##name = value ,
+ enum { US_DO_ALL_FLAGS };
+diff --git a/include/linux/writeback.h b/include/linux/writeback.h
+index 12b15c5..c2835bb 100644
+--- a/include/linux/writeback.h
++++ b/include/linux/writeback.h
+@@ -30,7 +30,6 @@ static inline int task_is_pdflush(struct task_struct *task)
+ enum writeback_sync_modes {
+       WB_SYNC_NONE,   /* Don't wait on anything */
+       WB_SYNC_ALL,    /* Wait on every mapping */
+-      WB_SYNC_HOLD,   /* Hold the inode on sb_dirty for sys_sync() */
+ };
+ /*
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 6f06f43..3d161f0 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1141,7 +1141,8 @@ static int kill_something_info(int sig, struct siginfo *info, pid_t pid)
+               struct task_struct * p;
+               for_each_process(p) {
+-                      if (p->pid > 1 && !same_thread_group(p, current)) {
++                      if (task_pid_vnr(p) > 1 &&
++                                      !same_thread_group(p, current)) {
+                               int err = group_send_sig_info(sig, info, p);
+                               ++count;
+                               if (err != -EPERM)
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index 4220a2e..521960b 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -61,27 +61,23 @@ struct clocksource *clock;
+ #ifdef CONFIG_GENERIC_TIME
+ /**
+- * __get_nsec_offset - Returns nanoseconds since last call to periodic_hook
++ * clocksource_forward_now - update clock to the current time
+  *
+- * private function, must hold xtime_lock lock when being
+- * called. Returns the number of nanoseconds since the
+- * last call to update_wall_time() (adjusted by NTP scaling)
++ * Forward the current clock to update its state since the last call to
++ * update_wall_time(). This is useful before significant clock changes,
++ * as it avoids having to deal with this time offset explicitly.
+  */
+-static inline s64 __get_nsec_offset(void)
++static void clocksource_forward_now(void)
+ {
+       cycle_t cycle_now, cycle_delta;
+-      s64 ns_offset;
++      s64 nsec;
+-      /* read clocksource: */
+       cycle_now = clocksource_read(clock);
+-
+-      /* calculate the delta since the last update_wall_time: */
+       cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
++      clock->cycle_last = cycle_now;
+-      /* convert to nanoseconds: */
+-      ns_offset = cyc2ns(clock, cycle_delta);
+-
+-      return ns_offset;
++      nsec = cyc2ns(clock, cycle_delta);
++      timespec_add_ns(&xtime, nsec);
+ }
+ /**
+@@ -92,6 +88,7 @@ static inline s64 __get_nsec_offset(void)
+  */
+ void getnstimeofday(struct timespec *ts)
+ {
++      cycle_t cycle_now, cycle_delta;
+       unsigned long seq;
+       s64 nsecs;
+@@ -101,7 +98,15 @@ void getnstimeofday(struct timespec *ts)
+               seq = read_seqbegin(&xtime_lock);
+               *ts = xtime;
+-              nsecs = __get_nsec_offset();
++
++              /* read clocksource: */
++              cycle_now = clocksource_read(clock);
++
++              /* calculate the delta since the last update_wall_time: */
++              cycle_delta = (cycle_now - clock->cycle_last) & clock->mask;
++
++              /* convert to nanoseconds: */
++              nsecs = cyc2ns(clock, cycle_delta);
+       } while (read_seqretry(&xtime_lock, seq));
+@@ -134,22 +139,22 @@ EXPORT_SYMBOL(do_gettimeofday);
+  */
+ int do_settimeofday(struct timespec *tv)
+ {
++      struct timespec ts_delta;
+       unsigned long flags;
+-      time_t wtm_sec, sec = tv->tv_sec;
+-      long wtm_nsec, nsec = tv->tv_nsec;
+       if ((unsigned long)tv->tv_nsec >= NSEC_PER_SEC)
+               return -EINVAL;
+       write_seqlock_irqsave(&xtime_lock, flags);
+-      nsec -= __get_nsec_offset();
++      clocksource_forward_now();
++
++      ts_delta.tv_sec = tv->tv_sec - xtime.tv_sec;
++      ts_delta.tv_nsec = tv->tv_nsec - xtime.tv_nsec;
++      wall_to_monotonic = timespec_sub(wall_to_monotonic, ts_delta);
+-      wtm_sec  = wall_to_monotonic.tv_sec + (xtime.tv_sec - sec);
+-      wtm_nsec = wall_to_monotonic.tv_nsec + (xtime.tv_nsec - nsec);
++      xtime = *tv;
+-      set_normalized_timespec(&xtime, sec, nsec);
+-      set_normalized_timespec(&wall_to_monotonic, wtm_sec, wtm_nsec);
+       update_xtime_cache(0);
+       clock->error = 0;
+@@ -175,22 +180,17 @@ EXPORT_SYMBOL(do_settimeofday);
+ static void change_clocksource(void)
+ {
+       struct clocksource *new;
+-      cycle_t now;
+-      u64 nsec;
+       new = clocksource_get_next();
+       if (clock == new)
+               return;
+-      new->cycle_last = 0;
+-      now = clocksource_read(new);
+-      nsec =  __get_nsec_offset();
+-      timespec_add_ns(&xtime, nsec);
++      clocksource_forward_now();
+       clock = new;
+-      clock->cycle_last = now;
+-
++      clock->cycle_last = 0;
++      clock->cycle_last = clocksource_read(new);
+       clock->error = 0;
+       clock->xtime_nsec = 0;
+       clocksource_calculate_interval(clock, NTP_INTERVAL_LENGTH);
+@@ -205,8 +205,8 @@ static void change_clocksource(void)
+        */
+ }
+ #else
++static inline void clocksource_forward_now(void) { }
+ static inline void change_clocksource(void) { }
+-static inline s64 __get_nsec_offset(void) { return 0; }
+ #endif
+ /**
+@@ -268,8 +268,6 @@ void __init timekeeping_init(void)
+ /* time in seconds when suspend began */
+ static unsigned long timekeeping_suspend_time;
+-/* xtime offset when we went into suspend */
+-static s64 timekeeping_suspend_nsecs;
+ /**
+  * timekeeping_resume - Resumes the generic timekeeping subsystem.
+@@ -295,8 +293,6 @@ static int timekeeping_resume(struct sys_device *dev)
+               wall_to_monotonic.tv_sec -= sleep_length;
+               total_sleep_time += sleep_length;
+       }
+-      /* Make sure that we have the correct xtime reference */
+-      timespec_add_ns(&xtime, timekeeping_suspend_nsecs);
+       update_xtime_cache(0);
+       /* re-base the last cycle value */
+       clock->cycle_last = 0;
+@@ -322,8 +318,7 @@ static int timekeeping_suspend(struct sys_device *dev, pm_message_t state)
+       timekeeping_suspend_time = read_persistent_clock();
+       write_seqlock_irqsave(&xtime_lock, flags);
+-      /* Get the current xtime offset */
+-      timekeeping_suspend_nsecs = __get_nsec_offset();
++      clocksource_forward_now();
+       timekeeping_suspended = 1;
+       write_sequnlock_irqrestore(&xtime_lock, flags);
+@@ -464,10 +459,10 @@ void update_wall_time(void)
+        */
+       while (offset >= clock->cycle_interval) {
+               /* accumulate one interval */
+-              clock->xtime_nsec += clock->xtime_interval;
+-              clock->cycle_last += clock->cycle_interval;
+               offset -= clock->cycle_interval;
++              clock->cycle_last += clock->cycle_interval;
++              clock->xtime_nsec += clock->xtime_interval;
+               if (clock->xtime_nsec >= (u64)NSEC_PER_SEC << clock->shift) {
+                       clock->xtime_nsec -= (u64)NSEC_PER_SEC << clock->shift;
+                       xtime.tv_sec++;
+diff --git a/lib/idr.c b/lib/idr.c
+index 1c4f928..21154ae 100644
+--- a/lib/idr.c
++++ b/lib/idr.c
+@@ -121,7 +121,7 @@ int idr_pre_get(struct idr *idp, gfp_t gfp_mask)
+ {
+       while (idp->id_free_cnt < IDR_FREE_MAX) {
+               struct idr_layer *new;
+-              new = kmem_cache_alloc(idr_layer_cache, gfp_mask);
++              new = kmem_cache_zalloc(idr_layer_cache, gfp_mask);
+               if (new == NULL)
+                       return (0);
+               move_to_free_list(idp, new);
+@@ -623,16 +623,10 @@ void *idr_replace(struct idr *idp, void *ptr, int id)
+ }
+ EXPORT_SYMBOL(idr_replace);
+-static void idr_cache_ctor(void *idr_layer)
+-{
+-      memset(idr_layer, 0, sizeof(struct idr_layer));
+-}
+-
+ void __init idr_init_cache(void)
+ {
+       idr_layer_cache = kmem_cache_create("idr_layer_cache",
+-                              sizeof(struct idr_layer), 0, SLAB_PANIC,
+-                              idr_cache_ctor);
++                              sizeof(struct idr_layer), 0, SLAB_PANIC, NULL);
+ }
+ /**
+diff --git a/mm/filemap.c b/mm/filemap.c
+index f3033d0..8a477d3 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -209,7 +209,7 @@ int __filemap_fdatawrite_range(struct address_space *mapping, loff_t start,
+       int ret;
+       struct writeback_control wbc = {
+               .sync_mode = sync_mode,
+-              .nr_to_write = mapping->nrpages * 2,
++              .nr_to_write = LONG_MAX,
+               .range_start = start,
+               .range_end = end,
+       };
+@@ -1304,7 +1304,8 @@ generic_file_aio_read(struct kiocb *iocb, const struct iovec *iov,
+                       goto out; /* skip atime */
+               size = i_size_read(inode);
+               if (pos < size) {
+-                      retval = filemap_write_and_wait(mapping);
++                      retval = filemap_write_and_wait_range(mapping, pos,
++                                      pos + iov_length(iov, nr_segs) - 1);
+                       if (!retval) {
+                               retval = mapping->a_ops->direct_IO(READ, iocb,
+                                                       iov, pos, nr_segs);
+@@ -2117,18 +2118,10 @@ generic_file_direct_write(struct kiocb *iocb, const struct iovec *iov,
+       if (count != ocount)
+               *nr_segs = iov_shorten((struct iovec *)iov, *nr_segs, count);
+-      /*
+-       * Unmap all mmappings of the file up-front.
+-       *
+-       * This will cause any pte dirty bits to be propagated into the
+-       * pageframes for the subsequent filemap_write_and_wait().
+-       */
+       write_len = iov_length(iov, *nr_segs);
+       end = (pos + write_len - 1) >> PAGE_CACHE_SHIFT;
+-      if (mapping_mapped(mapping))
+-              unmap_mapping_range(mapping, pos, write_len, 0);
+-      written = filemap_write_and_wait(mapping);
++      written = filemap_write_and_wait_range(mapping, pos, pos + write_len - 1);
+       if (written)
+               goto out;
+@@ -2519,7 +2512,8 @@ generic_file_buffered_write(struct kiocb *iocb, const struct iovec *iov,
+        * the file data here, to try to honour O_DIRECT expectations.
+        */
+       if (unlikely(file->f_flags & O_DIRECT) && written)
+-              status = filemap_write_and_wait(mapping);
++              status = filemap_write_and_wait_range(mapping,
++                                      pos, pos + written - 1);
+       return written ? written : status;
+ }
+diff --git a/mm/page-writeback.c b/mm/page-writeback.c
+index 24de8b6..8875822 100644
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -872,9 +872,11 @@ int write_cache_pages(struct address_space *mapping,
+       int done = 0;
+       struct pagevec pvec;
+       int nr_pages;
++      pgoff_t uninitialized_var(writeback_index);
+       pgoff_t index;
+       pgoff_t end;            /* Inclusive */
+-      int scanned = 0;
++      pgoff_t done_index;
++      int cycled;
+       int range_whole = 0;
+       if (wbc->nonblocking && bdi_write_congested(bdi)) {
+@@ -884,82 +886,134 @@ int write_cache_pages(struct address_space *mapping,
+       pagevec_init(&pvec, 0);
+       if (wbc->range_cyclic) {
+-              index = mapping->writeback_index; /* Start from prev offset */
++              writeback_index = mapping->writeback_index; /* prev offset */
++              index = writeback_index;
++              if (index == 0)
++                      cycled = 1;
++              else
++                      cycled = 0;
+               end = -1;
+       } else {
+               index = wbc->range_start >> PAGE_CACHE_SHIFT;
+               end = wbc->range_end >> PAGE_CACHE_SHIFT;
+               if (wbc->range_start == 0 && wbc->range_end == LLONG_MAX)
+                       range_whole = 1;
+-              scanned = 1;
++              cycled = 1; /* ignore range_cyclic tests */
+       }
+ retry:
+-      while (!done && (index <= end) &&
+-             (nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
+-                                            PAGECACHE_TAG_DIRTY,
+-                                            min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1))) {
+-              unsigned i;
++      done_index = index;
++      while (!done && (index <= end)) {
++              int i;
++
++              nr_pages = pagevec_lookup_tag(&pvec, mapping, &index,
++                            PAGECACHE_TAG_DIRTY,
++                            min(end - index, (pgoff_t)PAGEVEC_SIZE-1) + 1);
++              if (nr_pages == 0)
++                      break;
+-              scanned = 1;
+               for (i = 0; i < nr_pages; i++) {
+                       struct page *page = pvec.pages[i];
+                       /*
+-                       * At this point we hold neither mapping->tree_lock nor
+-                       * lock on the page itself: the page may be truncated or
+-                       * invalidated (changing page->mapping to NULL), or even
+-                       * swizzled back from swapper_space to tmpfs file
+-                       * mapping
++                       * At this point, the page may be truncated or
++                       * invalidated (changing page->mapping to NULL), or
++                       * even swizzled back from swapper_space to tmpfs file
++                       * mapping. However, page->index will not change
++                       * because we have a reference on the page.
+                        */
++                      if (page->index > end) {
++                              /*
++                               * can't be range_cyclic (1st pass) because
++                               * end == -1 in that case.
++                               */
++                              done = 1;
++                              break;
++                      }
++
++                      done_index = page->index + 1;
++
+                       lock_page(page);
++                      /*
++                       * Page truncated or invalidated. We can freely skip it
++                       * then, even for data integrity operations: the page
++                       * has disappeared concurrently, so there could be no
++                       * real expectation of this data interity operation
++                       * even if there is now a new, dirty page at the same
++                       * pagecache address.
++                       */
+                       if (unlikely(page->mapping != mapping)) {
++continue_unlock:
+                               unlock_page(page);
+                               continue;
+                       }
+-                      if (!wbc->range_cyclic && page->index > end) {
+-                              done = 1;
+-                              unlock_page(page);
+-                              continue;
++                      if (!PageDirty(page)) {
++                              /* someone wrote it for us */
++                              goto continue_unlock;
+                       }
+-                      if (wbc->sync_mode != WB_SYNC_NONE)
+-                              wait_on_page_writeback(page);
+-
+-                      if (PageWriteback(page) ||
+-                          !clear_page_dirty_for_io(page)) {
+-                              unlock_page(page);
+-                              continue;
++                      if (PageWriteback(page)) {
++                              if (wbc->sync_mode != WB_SYNC_NONE)
++                                      wait_on_page_writeback(page);
++                              else
++                                      goto continue_unlock;
+                       }
++                      BUG_ON(PageWriteback(page));
++                      if (!clear_page_dirty_for_io(page))
++                              goto continue_unlock;
++
+                       ret = (*writepage)(page, wbc, data);
+-                      if (unlikely(ret == AOP_WRITEPAGE_ACTIVATE)) {
+-                              unlock_page(page);
+-                              ret = 0;
++                      if (unlikely(ret)) {
++                              if (ret == AOP_WRITEPAGE_ACTIVATE) {
++                                      unlock_page(page);
++                                      ret = 0;
++                              } else {
++                                      /*
++                                       * done_index is set past this page,
++                                       * so media errors will not choke
++                                       * background writeout for the entire
++                                       * file. This has consequences for
++                                       * range_cyclic semantics (ie. it may
++                                       * not be suitable for data integrity
++                                       * writeout).
++                                       */
++                                      done = 1;
++                                      break;
++                              }
++                      }
++
++                      if (wbc->sync_mode == WB_SYNC_NONE) {
++                              wbc->nr_to_write--;
++                              if (wbc->nr_to_write <= 0) {
++                                      done = 1;
++                                      break;
++                              }
+                       }
+-                      if (ret || (--(wbc->nr_to_write) <= 0))
+-                              done = 1;
+                       if (wbc->nonblocking && bdi_write_congested(bdi)) {
+                               wbc->encountered_congestion = 1;
+                               done = 1;
++                              break;
+                       }
+               }
+               pagevec_release(&pvec);
+               cond_resched();
+       }
+-      if (!scanned && !done) {
++      if (!cycled) {
+               /*
++               * range_cyclic:
+                * We hit the last page and there is more work to be done: wrap
+                * back to the start of the file
+                */
+-              scanned = 1;
++              cycled = 1;
+               index = 0;
++              end = writeback_index - 1;
+               goto retry;
+       }
+       if (wbc->range_cyclic || (range_whole && wbc->nr_to_write > 0))
+-              mapping->writeback_index = index;
++              mapping->writeback_index = done_index;
+       if (wbc->range_cont)
+               wbc->range_start = index << PAGE_CACHE_SHIFT;
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index 1ab341e..f57d576 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -576,10 +576,6 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
+               else if (!ret) {
+                       if (spliced)
+                               break;
+-                      if (flags & SPLICE_F_NONBLOCK) {
+-                              ret = -EAGAIN;
+-                              break;
+-                      }
+                       if (sock_flag(sk, SOCK_DONE))
+                               break;
+                       if (sk->sk_err) {
+@@ -597,6 +593,10 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
+                                       ret = -ENOTCONN;
+                               break;
+                       }
++                      if (flags & SPLICE_F_NONBLOCK) {
++                              ret = -EAGAIN;
++                              break;
++                      }
+                       if (!timeo) {
+                               ret = -EAGAIN;
+                               break;
+diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
+index 29c7c99..52ee1dc 100644
+--- a/net/ipv6/ip6_fib.c
++++ b/net/ipv6/ip6_fib.c
+@@ -298,6 +298,10 @@ static void fib6_dump_end(struct netlink_callback *cb)
+       struct fib6_walker_t *w = (void*)cb->args[2];
+       if (w) {
++              if (cb->args[4]) {
++                      cb->args[4] = 0;
++                      fib6_walker_unlink(w);
++              }
+               cb->args[2] = 0;
+               kfree(w);
+       }
+@@ -330,15 +334,12 @@ static int fib6_dump_table(struct fib6_table *table, struct sk_buff *skb,
+               read_lock_bh(&table->tb6_lock);
+               res = fib6_walk_continue(w);
+               read_unlock_bh(&table->tb6_lock);
+-              if (res != 0) {
+-                      if (res < 0)
+-                              fib6_walker_unlink(w);
+-                      goto end;
++              if (res <= 0) {
++                      fib6_walker_unlink(w);
++                      cb->args[4] = 0;
+               }
+-              fib6_walker_unlink(w);
+-              cb->args[4] = 0;
+       }
+-end:
++
+       return res;
+ }
+diff --git a/net/sched/cls_u32.c b/net/sched/cls_u32.c
+index 246f906..ea51fcd 100644
+--- a/net/sched/cls_u32.c
++++ b/net/sched/cls_u32.c
+@@ -637,8 +637,9 @@ static int u32_change(struct tcf_proto *tp, unsigned long base, u32 handle,
+                               break;
+               n->next = *ins;
+-              wmb();
++              tcf_tree_lock(tp);
+               *ins = n;
++              tcf_tree_unlock(tp);
+               *arg = (unsigned long)n;
+               return 0;
+diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c
+index d14f020..d2943a4 100644
+--- a/net/sched/sch_htb.c
++++ b/net/sched/sch_htb.c
+@@ -924,6 +924,7 @@ static struct sk_buff *htb_dequeue(struct Qdisc *sch)
+               }
+       }
+       sch->qstats.overlimits++;
++      qdisc_watchdog_cancel(&q->watchdog);
+       qdisc_watchdog_schedule(&q->watchdog, next_event);
+ fin:
+       return skb;
+diff --git a/net/sctp/sm_statefuns.c b/net/sctp/sm_statefuns.c
+index 7c622af..649d174 100644
+--- a/net/sctp/sm_statefuns.c
++++ b/net/sctp/sm_statefuns.c
+@@ -3635,6 +3635,7 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
+ {
+       struct sctp_chunk *chunk = arg;
+       struct sctp_fwdtsn_hdr *fwdtsn_hdr;
++      struct sctp_fwdtsn_skip *skip;
+       __u16 len;
+       __u32 tsn;
+@@ -3664,6 +3665,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn(const struct sctp_endpoint *ep,
+       if (sctp_tsnmap_check(&asoc->peer.tsn_map, tsn) < 0)
+               goto discard_noforce;
++      /* Silently discard the chunk if stream-id is not valid */
++      sctp_walk_fwdtsn(skip, chunk) {
++              if (ntohs(skip->stream) >= asoc->c.sinit_max_instreams)
++                      goto discard_noforce;
++      }
++
+       sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
+       if (len > sizeof(struct sctp_fwdtsn_hdr))
+               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
+@@ -3695,6 +3702,7 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
+ {
+       struct sctp_chunk *chunk = arg;
+       struct sctp_fwdtsn_hdr *fwdtsn_hdr;
++      struct sctp_fwdtsn_skip *skip;
+       __u16 len;
+       __u32 tsn;
+@@ -3724,6 +3732,12 @@ sctp_disposition_t sctp_sf_eat_fwd_tsn_fast(
+       if (sctp_tsnmap_check(&asoc->peer.tsn_map, tsn) < 0)
+               goto gen_shutdown;
++      /* Silently discard the chunk if stream-id is not valid */
++      sctp_walk_fwdtsn(skip, chunk) {
++              if (ntohs(skip->stream) >= asoc->c.sinit_max_instreams)
++                      goto gen_shutdown;
++      }
++
+       sctp_add_cmd_sf(commands, SCTP_CMD_REPORT_FWDTSN, SCTP_U32(tsn));
+       if (len > sizeof(struct sctp_fwdtsn_hdr))
+               sctp_add_cmd_sf(commands, SCTP_CMD_PROCESS_FWDTSN,
+diff --git a/security/keys/keyctl.c b/security/keys/keyctl.c
+index 9b4e0e9..3c0f421 100644
+--- a/security/keys/keyctl.c
++++ b/security/keys/keyctl.c
+@@ -270,6 +270,7 @@ long keyctl_join_session_keyring(const char __user *_name)
+       /* join the session */
+       ret = join_session_keyring(name);
++      kfree(name);
+  error:
+       return ret;
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index 591f62f..8c857d5 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -629,6 +629,36 @@ static struct snd_kcontrol_new ad1986a_laptop_eapd_mixers[] = {
+       HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
+       HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
++      HDA_CODEC_VOLUME("Internal Mic Playback Volume", 0x17, 0, HDA_OUTPUT),
++      HDA_CODEC_MUTE("Internal Mic Playback Switch", 0x17, 0, HDA_OUTPUT),
++      HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
++      HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
++      HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
++      HDA_CODEC_VOLUME("Capture Volume", 0x12, 0x0, HDA_OUTPUT),
++      HDA_CODEC_MUTE("Capture Switch", 0x12, 0x0, HDA_OUTPUT),
++      {
++              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++              .name = "Capture Source",
++              .info = ad198x_mux_enum_info,
++              .get = ad198x_mux_enum_get,
++              .put = ad198x_mux_enum_put,
++      },
++      {
++              .iface = SNDRV_CTL_ELEM_IFACE_MIXER,
++              .name = "External Amplifier",
++              .info = ad198x_eapd_info,
++              .get = ad198x_eapd_get,
++              .put = ad198x_eapd_put,
++              .private_value = 0x1b | (1 << 8), /* port-D, inversed */
++      },
++      { } /* end */
++};
++
++static struct snd_kcontrol_new ad1986a_samsung_mixers[] = {
++      HDA_BIND_VOL("Master Playback Volume", &ad1986a_laptop_master_vol),
++      HDA_BIND_SW("Master Playback Switch", &ad1986a_laptop_master_sw),
++      HDA_CODEC_VOLUME("PCM Playback Volume", 0x03, 0x0, HDA_OUTPUT),
++      HDA_CODEC_MUTE("PCM Playback Switch", 0x03, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Mic Playback Volume", 0x13, 0x0, HDA_OUTPUT),
+       HDA_CODEC_MUTE("Mic Playback Switch", 0x13, 0x0, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Mic Boost", 0x0f, 0x0, HDA_OUTPUT),
+@@ -917,6 +947,7 @@ enum {
+       AD1986A_LAPTOP_EAPD,
+       AD1986A_LAPTOP_AUTOMUTE,
+       AD1986A_ULTRA,
++      AD1986A_SAMSUNG,
+       AD1986A_MODELS
+ };
+@@ -927,6 +958,7 @@ static const char *ad1986a_models[AD1986A_MODELS] = {
+       [AD1986A_LAPTOP_EAPD]   = "laptop-eapd",
+       [AD1986A_LAPTOP_AUTOMUTE] = "laptop-automute",
+       [AD1986A_ULTRA]         = "ultra",
++      [AD1986A_SAMSUNG]       = "samsung",
+ };
+ static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
+@@ -949,9 +981,9 @@ static struct snd_pci_quirk ad1986a_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1179, 0xff40, "Toshiba", AD1986A_LAPTOP_EAPD),
+       SND_PCI_QUIRK(0x144d, 0xb03c, "Samsung R55", AD1986A_3STACK),
+       SND_PCI_QUIRK(0x144d, 0xc01e, "FSC V2060", AD1986A_LAPTOP),
+-      SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_LAPTOP_EAPD),
+-      SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_LAPTOP_EAPD),
+-      SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_LAPTOP_EAPD),
++      SND_PCI_QUIRK(0x144d, 0xc023, "Samsung X60", AD1986A_SAMSUNG),
++      SND_PCI_QUIRK(0x144d, 0xc024, "Samsung R65", AD1986A_SAMSUNG),
++      SND_PCI_QUIRK(0x144d, 0xc026, "Samsung X11", AD1986A_SAMSUNG),
+       SND_PCI_QUIRK(0x144d, 0xc027, "Samsung Q1", AD1986A_ULTRA),
+       SND_PCI_QUIRK(0x144d, 0xc504, "Samsung Q35", AD1986A_3STACK),
+       SND_PCI_QUIRK(0x17aa, 0x1011, "Lenovo M55", AD1986A_LAPTOP),
+@@ -1033,6 +1065,17 @@ static int patch_ad1986a(struct hda_codec *codec)
+               break;
+       case AD1986A_LAPTOP_EAPD:
+               spec->mixers[0] = ad1986a_laptop_eapd_mixers;
++              spec->num_init_verbs = 2;
++              spec->init_verbs[1] = ad1986a_eapd_init_verbs;
++              spec->multiout.max_channels = 2;
++              spec->multiout.num_dacs = 1;
++              spec->multiout.dac_nids = ad1986a_laptop_dac_nids;
++              if (!is_jack_available(codec, 0x25))
++                      spec->multiout.dig_out_nid = 0;
++              spec->input_mux = &ad1986a_laptop_eapd_capture_source;
++              break;
++      case AD1986A_SAMSUNG:
++              spec->mixers[0] = ad1986a_samsung_mixers;
+               spec->num_init_verbs = 3;
+               spec->init_verbs[1] = ad1986a_eapd_init_verbs;
+               spec->init_verbs[2] = ad1986a_automic_verbs;
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index a1a3a34..7225f0f 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -9882,6 +9882,7 @@ static struct snd_pci_quirk alc262_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x10cf, 0x142d, "Fujitsu Lifebook E8410", ALC262_FUJITSU),
+       SND_PCI_QUIRK(0x144d, 0xc032, "Samsung Q1 Ultra", ALC262_ULTRA),
+       SND_PCI_QUIRK(0x144d, 0xc039, "Samsung Q1U EL", ALC262_ULTRA),
++      SND_PCI_QUIRK(0x144d, 0xc510, "Samsung Q45", ALC262_HIPPO),
+       SND_PCI_QUIRK(0x17aa, 0x384e, "Lenovo 3000 y410", ALC262_LENOVO_3000),
+       SND_PCI_QUIRK(0x17ff, 0x0560, "Benq ED8", ALC262_BENQ_ED8),
+       SND_PCI_QUIRK(0x17ff, 0x058d, "Benq T31-16", ALC262_BENQ_T31),
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.13-14 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.13-14
new file mode 100644 (file)
index 0000000..a729a44
--- /dev/null
@@ -0,0 +1,1327 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.14
+
+Upstream 2.6.27.14 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index d879e7d..b2263f8 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .13
++EXTRAVERSION = .14
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/alpha/kernel/irq_srm.c b/arch/alpha/kernel/irq_srm.c
+index 3221201..a03fbca 100644
+--- a/arch/alpha/kernel/irq_srm.c
++++ b/arch/alpha/kernel/irq_srm.c
+@@ -63,6 +63,8 @@ init_srm_irqs(long max, unsigned long ignore_mask)
+ {
+       long i;
++      if (NR_IRQS <= 16)
++              return;
+       for (i = 16; i < max; ++i) {
+               if (i < 64 && ((ignore_mask >> i) & 1))
+                       continue;
+diff --git a/crypto/authenc.c b/crypto/authenc.c
+index fd9f06c..0861dc2 100644
+--- a/crypto/authenc.c
++++ b/crypto/authenc.c
+@@ -157,16 +157,19 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
+       dstp = sg_page(dst);
+       vdst = PageHighMem(dstp) ? NULL : page_address(dstp) + dst->offset;
+-      sg_init_table(cipher, 2);
+-      sg_set_buf(cipher, iv, ivsize);
+-      authenc_chain(cipher, dst, vdst == iv + ivsize);
++      if (ivsize) {
++              sg_init_table(cipher, 2);
++              sg_set_buf(cipher, iv, ivsize);
++              authenc_chain(cipher, dst, vdst == iv + ivsize);
++              dst = cipher;
++      }
+       cryptlen = req->cryptlen + ivsize;
+-      hash = crypto_authenc_hash(req, flags, cipher, cryptlen);
++      hash = crypto_authenc_hash(req, flags, dst, cryptlen);
+       if (IS_ERR(hash))
+               return PTR_ERR(hash);
+-      scatterwalk_map_and_copy(hash, cipher, cryptlen,
++      scatterwalk_map_and_copy(hash, dst, cryptlen,
+                                crypto_aead_authsize(authenc), 1);
+       return 0;
+ }
+@@ -284,11 +287,14 @@ static int crypto_authenc_iverify(struct aead_request *req, u8 *iv,
+       srcp = sg_page(src);
+       vsrc = PageHighMem(srcp) ? NULL : page_address(srcp) + src->offset;
+-      sg_init_table(cipher, 2);
+-      sg_set_buf(cipher, iv, ivsize);
+-      authenc_chain(cipher, src, vsrc == iv + ivsize);
++      if (ivsize) {
++              sg_init_table(cipher, 2);
++              sg_set_buf(cipher, iv, ivsize);
++              authenc_chain(cipher, src, vsrc == iv + ivsize);
++              src = cipher;
++      }
+-      return crypto_authenc_verify(req, cipher, cryptlen + ivsize);
++      return crypto_authenc_verify(req, src, cryptlen + ivsize);
+ }
+ static int crypto_authenc_decrypt(struct aead_request *req)
+diff --git a/crypto/ccm.c b/crypto/ccm.c
+index 7cf7e5a..c36d654 100644
+--- a/crypto/ccm.c
++++ b/crypto/ccm.c
+@@ -266,6 +266,8 @@ static int crypto_ccm_auth(struct aead_request *req, struct scatterlist *plain,
+       if (assoclen) {
+               pctx->ilen = format_adata(idata, assoclen);
+               get_data_to_compute(cipher, pctx, req->assoc, req->assoclen);
++      } else {
++              pctx->ilen = 0;
+       }
+       /* compute plaintext into mac */
+diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
+index 8fdb2ce..c5be6a1 100644
+--- a/drivers/ata/pata_via.c
++++ b/drivers/ata/pata_via.c
+@@ -87,6 +87,10 @@ enum {
+       VIA_SATA_PATA   = 0x800, /* SATA/PATA combined configuration */
+ };
++enum {
++      VIA_IDFLAG_SINGLE = (1 << 0), /* single channel controller) */
++};
++
+ /*
+  * VIA SouthBridge chips.
+  */
+@@ -98,8 +102,12 @@ static const struct via_isa_bridge {
+       u8 rev_max;
+       u16 flags;
+ } via_isa_bridges[] = {
++      { "vx855",      PCI_DEVICE_ID_VIA_VX855,    0x00, 0x2f,
++        VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
+       { "vx800",      PCI_DEVICE_ID_VIA_VX800,    0x00, 0x2f, VIA_UDMA_133 |
+       VIA_BAD_AST | VIA_SATA_PATA },
++      { "vt8261",     PCI_DEVICE_ID_VIA_8261,     0x00, 0x2f,
++        VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8237s",    PCI_DEVICE_ID_VIA_8237S,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8251",     PCI_DEVICE_ID_VIA_8251,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "cx700",      PCI_DEVICE_ID_VIA_CX700,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
+@@ -123,6 +131,8 @@ static const struct via_isa_bridge {
+       { "vt82c586",   PCI_DEVICE_ID_VIA_82C586_0, 0x00, 0x0f, VIA_UDMA_NONE | VIA_SET_FIFO },
+       { "vt82c576",   PCI_DEVICE_ID_VIA_82C576,   0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK },
+       { "vt82c576",   PCI_DEVICE_ID_VIA_82C576,   0x00, 0x2f, VIA_UDMA_NONE | VIA_SET_FIFO | VIA_NO_UNMASK | VIA_BAD_ID },
++      { "vtxxxx",     PCI_DEVICE_ID_VIA_ANON,    0x00, 0x2f,
++        VIA_UDMA_133 | VIA_BAD_AST },
+       { NULL }
+ };
+@@ -461,6 +471,7 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+       static int printed_version;
+       u8 enable;
+       u32 timing;
++      unsigned long flags = id->driver_data;
+       int rc;
+       if (!printed_version++)
+@@ -470,9 +481,13 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+       if (rc)
+               return rc;
++      if (flags & VIA_IDFLAG_SINGLE)
++              ppi[1] = &ata_dummy_port_info;
++
+       /* To find out how the IDE will behave and what features we
+          actually have to look at the bridge not the IDE controller */
+-      for (config = via_isa_bridges; config->id; config++)
++      for (config = via_isa_bridges; config->id != PCI_DEVICE_ID_VIA_ANON;
++           config++)
+               if ((isa = pci_get_device(PCI_VENDOR_ID_VIA +
+                       !!(config->flags & VIA_BAD_ID),
+                       config->id, NULL))) {
+@@ -483,10 +498,6 @@ static int via_init_one(struct pci_dev *pdev, const struct pci_device_id *id)
+                       pci_dev_put(isa);
+               }
+-      if (!config->id) {
+-              printk(KERN_WARNING "via: Unknown VIA SouthBridge, disabling.\n");
+-              return -ENODEV;
+-      }
+       pci_dev_put(isa);
+       if (!(config->flags & VIA_NO_ENABLES)) {
+@@ -588,6 +599,7 @@ static const struct pci_device_id via[] = {
+       { PCI_VDEVICE(VIA, 0x1571), },
+       { PCI_VDEVICE(VIA, 0x3164), },
+       { PCI_VDEVICE(VIA, 0x5324), },
++      { PCI_VDEVICE(VIA, 0xC409), VIA_IDFLAG_SINGLE },
+       { },
+ };
+diff --git a/drivers/ide/pci/it821x.c b/drivers/ide/pci/it821x.c
+index 4a1508a..7e975eb 100644
+--- a/drivers/ide/pci/it821x.c
++++ b/drivers/ide/pci/it821x.c
+@@ -69,6 +69,8 @@
+ #define DRV_NAME "it821x"
++#define QUIRK_VORTEX86 1
++
+ struct it821x_dev
+ {
+       unsigned int smart:1,           /* Are we in smart raid mode */
+@@ -80,6 +82,7 @@ struct it821x_dev
+       u16     pio[2];                 /* Cached PIO values */
+       u16     mwdma[2];               /* Cached MWDMA values */
+       u16     udma[2];                /* Cached UDMA values (per drive) */
++      u16     quirks;
+ };
+ #define ATA_66                0
+@@ -586,6 +589,12 @@ static void __devinit init_hwif_it821x(ide_hwif_t *hwif)
+       hwif->ultra_mask = ATA_UDMA6;
+       hwif->mwdma_mask = ATA_MWDMA2;
++
++      /* Vortex86SX quirk: prevent Ultra-DMA mode to fix BadCRC issue */
++      if (idev->quirks & QUIRK_VORTEX86) {
++              if (dev->revision == 0x11)
++                      hwif->ultra_mask = 0;
++      }
+ }
+ static void __devinit it8212_disable_raid(struct pci_dev *dev)
+@@ -658,6 +667,8 @@ static int __devinit it821x_init_one(struct pci_dev *dev, const struct pci_devic
+               return -ENOMEM;
+       }
++      itdevs->quirks = id->driver_data;
++
+       rc = ide_pci_init_one(dev, &it821x_chipset, itdevs);
+       if (rc)
+               kfree(itdevs);
+@@ -677,6 +688,7 @@ static void __devexit it821x_remove(struct pci_dev *dev)
+ static const struct pci_device_id it821x_pci_tbl[] = {
+       { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8211), 0 },
+       { PCI_VDEVICE(ITE, PCI_DEVICE_ID_ITE_8212), 0 },
++      { PCI_VDEVICE(RDC, PCI_DEVICE_ID_RDC_D1010), QUIRK_VORTEX86 },
+       { 0, },
+ };
+diff --git a/drivers/misc/sgi-xp/xpc_sn2.c b/drivers/misc/sgi-xp/xpc_sn2.c
+index d32c1ee..59ff816 100644
+--- a/drivers/misc/sgi-xp/xpc_sn2.c
++++ b/drivers/misc/sgi-xp/xpc_sn2.c
+@@ -1841,6 +1841,7 @@ xpc_process_msg_chctl_flags_sn2(struct xpc_partition *part, int ch_number)
+                */
+               xpc_clear_remote_msgqueue_flags_sn2(ch);
++              smp_wmb(); /* ensure flags have been cleared before bte_copy */
+               ch_sn2->w_remote_GP.put = ch_sn2->remote_GP.put;
+               dev_dbg(xpc_chan, "w_remote_GP.put changed to %ld, partid=%d, "
+@@ -1939,7 +1940,7 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch)
+                       break;
+               get = ch_sn2->w_local_GP.get;
+-              rmb();  /* guarantee that .get loads before .put */
++              smp_rmb();      /* guarantee that .get loads before .put */
+               if (get == ch_sn2->w_remote_GP.put)
+                       break;
+@@ -1961,11 +1962,13 @@ xpc_get_deliverable_payload_sn2(struct xpc_channel *ch)
+                       msg = xpc_pull_remote_msg_sn2(ch, get);
+-                      DBUG_ON(msg != NULL && msg->number != get);
+-                      DBUG_ON(msg != NULL && (msg->flags & XPC_M_SN2_DONE));
+-                      DBUG_ON(msg != NULL && !(msg->flags & XPC_M_SN2_READY));
++                      if (msg != NULL) {
++                              DBUG_ON(msg->number != get);
++                              DBUG_ON(msg->flags & XPC_M_SN2_DONE);
++                              DBUG_ON(!(msg->flags & XPC_M_SN2_READY));
+-                      payload = &msg->payload;
++                              payload = &msg->payload;
++                      }
+                       break;
+               }
+@@ -2058,7 +2061,7 @@ xpc_allocate_msg_sn2(struct xpc_channel *ch, u32 flags,
+       while (1) {
+               put = ch_sn2->w_local_GP.put;
+-              rmb();  /* guarantee that .put loads before .get */
++              smp_rmb();      /* guarantee that .put loads before .get */
+               if (put - ch_sn2->w_remote_GP.get < ch->local_nentries) {
+                       /* There are available message entries. We need to try
+@@ -2191,7 +2194,7 @@ xpc_send_payload_sn2(struct xpc_channel *ch, u32 flags, void *payload,
+        * The preceding store of msg->flags must occur before the following
+        * load of local_GP->put.
+        */
+-      mb();
++      smp_mb();
+       /* see if the message is next in line to be sent, if so send it */
+@@ -2292,7 +2295,7 @@ xpc_received_payload_sn2(struct xpc_channel *ch, void *payload)
+        * The preceding store of msg->flags must occur before the following
+        * load of local_GP->get.
+        */
+-      mb();
++      smp_mb();
+       /*
+        * See if this message is next in line to be acknowledged as having
+diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c
+index 1ac694c..b8f8d50 100644
+--- a/drivers/misc/sgi-xp/xpc_uv.c
++++ b/drivers/misc/sgi-xp/xpc_uv.c
+@@ -1238,7 +1238,7 @@ xpc_send_payload_uv(struct xpc_channel *ch, u32 flags, void *payload,
+               atomic_inc(&ch->n_to_notify);
+               msg_slot->key = key;
+-              wmb(); /* a non-NULL func must hit memory after the key */
++              smp_wmb(); /* a non-NULL func must hit memory after the key */
+               msg_slot->func = func;
+               if (ch->flags & XPC_C_DISCONNECTING) {
+diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c
+index 53459db..8d44404 100644
+--- a/drivers/net/bnx2x_main.c
++++ b/drivers/net/bnx2x_main.c
+@@ -8078,6 +8078,9 @@ static int bnx2x_get_eeprom(struct net_device *dev,
+       struct bnx2x *bp = netdev_priv(dev);
+       int rc;
++      if (!netif_running(dev))
++              return -EAGAIN;
++
+       DP(BNX2X_MSG_NVM, "ethtool_eeprom: cmd %d\n"
+          DP_LEVEL "  magic 0x%x  offset 0x%x (%d)  len 0x%x (%d)\n",
+          eeprom->cmd, eeprom->magic, eeprom->offset, eeprom->offset,
+diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
+index 1640096..ef84732 100644
+--- a/drivers/net/wireless/rtl8187_dev.c
++++ b/drivers/net/wireless/rtl8187_dev.c
+@@ -263,6 +263,7 @@ static int rtl8187_tx(struct ieee80211_hw *dev, struct sk_buff *skb)
+       usb_fill_bulk_urb(urb, priv->udev, usb_sndbulkpipe(priv->udev, ep),
+                         buf, skb->len, rtl8187_tx_cb, skb);
++      urb->transfer_flags |= URB_ZERO_PACKET;
+       rc = usb_submit_urb(urb, GFP_ATOMIC);
+       if (rc < 0) {
+               usb_free_urb(urb);
+diff --git a/drivers/net/wireless/rtl8187_rtl8225.c b/drivers/net/wireless/rtl8187_rtl8225.c
+index 1bae899..487593f 100644
+--- a/drivers/net/wireless/rtl8187_rtl8225.c
++++ b/drivers/net/wireless/rtl8187_rtl8225.c
+@@ -287,7 +287,10 @@ static void rtl8225_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
+       ofdm_power = priv->channels[channel - 1].hw_value >> 4;
+       cck_power = min(cck_power, (u8)11);
+-      ofdm_power = min(ofdm_power, (u8)35);
++      if (ofdm_power > (u8)15)
++              ofdm_power = 25;
++      else
++              ofdm_power += 10;
+       rtl818x_iowrite8(priv, &priv->map->TX_GAIN_CCK,
+                        rtl8225_tx_gain_cck_ofdm[cck_power / 6] >> 1);
+@@ -540,7 +543,10 @@ static void rtl8225z2_rf_set_tx_power(struct ieee80211_hw *dev, int channel)
+       cck_power += priv->txpwr_base & 0xF;
+       cck_power = min(cck_power, (u8)35);
+-      ofdm_power = min(ofdm_power, (u8)15);
++      if (ofdm_power > (u8)15)
++              ofdm_power = 25;
++      else
++              ofdm_power += 10;
+       ofdm_power += priv->txpwr_base >> 4;
+       ofdm_power = min(ofdm_power, (u8)35);
+diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
+index 6e18736..6d9b074 100644
+--- a/drivers/pci/hotplug/pciehp_core.c
++++ b/drivers/pci/hotplug/pciehp_core.c
+@@ -126,8 +126,10 @@ static int set_lock_status(struct hotplug_slot *hotplug_slot, u8 status)
+       mutex_lock(&slot->ctrl->crit_sect);
+       /* has it been >1 sec since our last toggle? */
+-      if ((get_seconds() - slot->last_emi_toggle) < 1)
++      if ((get_seconds() - slot->last_emi_toggle) < 1) {
++              mutex_unlock(&slot->ctrl->crit_sect);
+               return -EINVAL;
++      }
+       /* see what our current state is */
+       retval = get_lock_status(hotplug_slot, &value);
+diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
+index c2f2393..fd0695b 100644
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -2190,6 +2190,9 @@ static struct pci_device_id serial_pci_tbl[] = {
+       {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_COMM8,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b2_8_115200 },
++      {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_7803,
++              PCI_ANY_ID, PCI_ANY_ID, 0, 0,
++              pbn_b2_8_460800 },
+       {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_UCOMM8,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b2_8_115200 },
+diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
+index 20290c5..e52e54e 100644
+--- a/drivers/usb/core/devio.c
++++ b/drivers/usb/core/devio.c
+@@ -1700,7 +1700,7 @@ const struct file_operations usbdev_file_operations = {
+       .release =      usbdev_release,
+ };
+-void usb_fs_classdev_common_remove(struct usb_device *udev)
++static void usbdev_remove(struct usb_device *udev)
+ {
+       struct dev_state *ps;
+       struct siginfo sinfo;
+@@ -1742,10 +1742,15 @@ static void usb_classdev_remove(struct usb_device *dev)
+ {
+       if (dev->usb_classdev)
+               device_unregister(dev->usb_classdev);
+-      usb_fs_classdev_common_remove(dev);
+ }
+-static int usb_classdev_notify(struct notifier_block *self,
++#else
++#define usb_classdev_add(dev)         0
++#define usb_classdev_remove(dev)      do {} while (0)
++
++#endif
++
++static int usbdev_notify(struct notifier_block *self,
+                              unsigned long action, void *dev)
+ {
+       switch (action) {
+@@ -1755,15 +1760,15 @@ static int usb_classdev_notify(struct notifier_block *self,
+               break;
+       case USB_DEVICE_REMOVE:
+               usb_classdev_remove(dev);
++              usbdev_remove(dev);
+               break;
+       }
+       return NOTIFY_OK;
+ }
+ static struct notifier_block usbdev_nb = {
+-      .notifier_call =        usb_classdev_notify,
++      .notifier_call =        usbdev_notify,
+ };
+-#endif
+ static struct cdev usb_device_cdev;
+@@ -1797,9 +1802,8 @@ int __init usb_devio_init(void)
+        * to /sys/dev
+        */
+       usb_classdev_class->dev_kobj = NULL;
+-
+-      usb_register_notify(&usbdev_nb);
+ #endif
++      usb_register_notify(&usbdev_nb);
+ out:
+       return retval;
+@@ -1810,8 +1814,8 @@ error_cdev:
+ void usb_devio_cleanup(void)
+ {
+-#ifdef CONFIG_USB_DEVICE_CLASS
+       usb_unregister_notify(&usbdev_nb);
++#ifdef CONFIG_USB_DEVICE_CLASS
+       class_destroy(usb_classdev_class);
+ #endif
+       cdev_del(&usb_device_cdev);
+diff --git a/drivers/usb/core/inode.c b/drivers/usb/core/inode.c
+index db410e9..83887ff 100644
+--- a/drivers/usb/core/inode.c
++++ b/drivers/usb/core/inode.c
+@@ -716,7 +716,6 @@ static void usbfs_remove_device(struct usb_device *dev)
+               fs_remove_file (dev->usbfs_dentry);
+               dev->usbfs_dentry = NULL;
+       }
+-      usb_fs_classdev_common_remove(dev);
+ }
+ static int usbfs_notify(struct notifier_block *self, unsigned long action, void *dev)
+diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h
+index 9a1a45a..a9a6397 100644
+--- a/drivers/usb/core/usb.h
++++ b/drivers/usb/core/usb.h
+@@ -145,7 +145,6 @@ extern struct usb_driver usbfs_driver;
+ extern const struct file_operations usbfs_devices_fops;
+ extern const struct file_operations usbdev_file_operations;
+ extern void usbfs_conn_disc_event(void);
+-extern void usb_fs_classdev_common_remove(struct usb_device *udev);
+ extern int usb_devio_init(void);
+ extern void usb_devio_cleanup(void);
+diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
+index 0ada0fc..c542a98 100644
+--- a/drivers/usb/mon/mon_bin.c
++++ b/drivers/usb/mon/mon_bin.c
+@@ -37,6 +37,7 @@
+ #define MON_IOCX_GET   _IOW(MON_IOC_MAGIC, 6, struct mon_bin_get)
+ #define MON_IOCX_MFETCH _IOWR(MON_IOC_MAGIC, 7, struct mon_bin_mfetch)
+ #define MON_IOCH_MFLUSH _IO(MON_IOC_MAGIC, 8)
++
+ #ifdef CONFIG_COMPAT
+ #define MON_IOCX_GET32 _IOW(MON_IOC_MAGIC, 6, struct mon_bin_get32)
+ #define MON_IOCX_MFETCH32 _IOWR(MON_IOC_MAGIC, 7, struct mon_bin_mfetch32)
+@@ -921,21 +922,6 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file,
+               }
+               break;
+-#ifdef CONFIG_COMPAT
+-      case MON_IOCX_GET32: {
+-              struct mon_bin_get32 getb;
+-
+-              if (copy_from_user(&getb, (void __user *)arg,
+-                                          sizeof(struct mon_bin_get32)))
+-                      return -EFAULT;
+-
+-              ret = mon_bin_get_event(file, rp,
+-                  compat_ptr(getb.hdr32), compat_ptr(getb.data32),
+-                  getb.alloc32);
+-              }
+-              break;
+-#endif
+-
+       case MON_IOCX_MFETCH:
+               {
+               struct mon_bin_mfetch mfetch;
+@@ -962,7 +948,57 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file,
+               }
+               break;
++      case MON_IOCG_STATS: {
++              struct mon_bin_stats __user *sp;
++              unsigned int nevents;
++              unsigned int ndropped;
++
++              spin_lock_irqsave(&rp->b_lock, flags);
++              ndropped = rp->cnt_lost;
++              rp->cnt_lost = 0;
++              spin_unlock_irqrestore(&rp->b_lock, flags);
++              nevents = mon_bin_queued(rp);
++
++              sp = (struct mon_bin_stats __user *)arg;
++              if (put_user(rp->cnt_lost, &sp->dropped))
++                      return -EFAULT;
++              if (put_user(nevents, &sp->queued))
++                      return -EFAULT;
++
++              }
++              break;
++
++      default:
++              return -ENOTTY;
++      }
++
++      return ret;
++}
++
+ #ifdef CONFIG_COMPAT
++static long mon_bin_compat_ioctl(struct file *file,
++    unsigned int cmd, unsigned long arg)
++{
++      struct mon_reader_bin *rp = file->private_data;
++      int ret;
++
++      switch (cmd) {
++
++      case MON_IOCX_GET32: {
++              struct mon_bin_get32 getb;
++
++              if (copy_from_user(&getb, (void __user *)arg,
++                                          sizeof(struct mon_bin_get32)))
++                      return -EFAULT;
++
++              ret = mon_bin_get_event(file, rp,
++                  compat_ptr(getb.hdr32), compat_ptr(getb.data32),
++                  getb.alloc32);
++              if (ret < 0)
++                      return ret;
++              }
++              return 0;
++
+       case MON_IOCX_MFETCH32:
+               {
+               struct mon_bin_mfetch32 mfetch;
+@@ -986,37 +1022,25 @@ static int mon_bin_ioctl(struct inode *inode, struct file *file,
+                       return ret;
+               if (put_user(ret, &uptr->nfetch32))
+                       return -EFAULT;
+-              ret = 0;
+               }
+-              break;
+-#endif
+-
+-      case MON_IOCG_STATS: {
+-              struct mon_bin_stats __user *sp;
+-              unsigned int nevents;
+-              unsigned int ndropped;
+-
+-              spin_lock_irqsave(&rp->b_lock, flags);
+-              ndropped = rp->cnt_lost;
+-              rp->cnt_lost = 0;
+-              spin_unlock_irqrestore(&rp->b_lock, flags);
+-              nevents = mon_bin_queued(rp);
++              return 0;
+-              sp = (struct mon_bin_stats __user *)arg;
+-              if (put_user(rp->cnt_lost, &sp->dropped))
+-                      return -EFAULT;
+-              if (put_user(nevents, &sp->queued))
+-                      return -EFAULT;
++      case MON_IOCG_STATS:
++              return mon_bin_ioctl(NULL, file, cmd,
++                                          (unsigned long) compat_ptr(arg));
+-              }
+-              break;
++      case MON_IOCQ_URB_LEN:
++      case MON_IOCQ_RING_SIZE:
++      case MON_IOCT_RING_SIZE:
++      case MON_IOCH_MFLUSH:
++              return mon_bin_ioctl(NULL, file, cmd, arg);
+       default:
+-              return -ENOTTY;
++              ;
+       }
+-
+-      return ret;
++      return -ENOTTY;
+ }
++#endif /* CONFIG_COMPAT */
+ static unsigned int
+ mon_bin_poll(struct file *file, struct poll_table_struct *wait)
+@@ -1094,6 +1118,9 @@ static const struct file_operations mon_fops_binary = {
+       /* .write =     mon_text_write, */
+       .poll =         mon_bin_poll,
+       .ioctl =        mon_bin_ioctl,
++#ifdef CONFIG_COMPAT
++      .compat_ioctl = mon_bin_compat_ioctl,
++#endif
+       .release =      mon_bin_release,
+       .mmap =         mon_bin_mmap,
+ };
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 6fcb6d1..aae786c 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -2047,6 +2047,12 @@ UNUSUAL_DEV(  0x19d2, 0x2000, 0x0000, 0x0000,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_IGNORE_DEVICE),
++UNUSUAL_DEV( 0x2116, 0x0320, 0x0001, 0x0001,
++              "ST",
++              "2A",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY),
++
+ /* patch submitted by Davide Perini <perini.davide@dpsoftware.org>
+  * and Renato Perini <rperini@email.it>
+  */
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index cb60f92..801de2c 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -234,8 +234,6 @@ struct ep_pqueue {
+ /*
+  * Configuration options available inside /proc/sys/fs/epoll/
+  */
+-/* Maximum number of epoll devices, per user */
+-static int max_user_instances __read_mostly;
+ /* Maximum number of epoll watched descriptors, per user */
+ static int max_user_watches __read_mostly;
+@@ -261,14 +259,6 @@ static int zero;
+ ctl_table epoll_table[] = {
+       {
+-              .procname       = "max_user_instances",
+-              .data           = &max_user_instances,
+-              .maxlen         = sizeof(int),
+-              .mode           = 0644,
+-              .proc_handler   = &proc_dointvec_minmax,
+-              .extra1         = &zero,
+-      },
+-      {
+               .procname       = "max_user_watches",
+               .data           = &max_user_watches,
+               .maxlen         = sizeof(int),
+@@ -491,7 +481,6 @@ static void ep_free(struct eventpoll *ep)
+       mutex_unlock(&epmutex);
+       mutex_destroy(&ep->mtx);
+-      atomic_dec(&ep->user->epoll_devs);
+       free_uid(ep->user);
+       kfree(ep);
+ }
+@@ -581,10 +570,6 @@ static int ep_alloc(struct eventpoll **pep)
+       struct eventpoll *ep;
+       user = get_current_user();
+-      error = -EMFILE;
+-      if (unlikely(atomic_read(&user->epoll_devs) >=
+-                      max_user_instances))
+-              goto free_uid;
+       error = -ENOMEM;
+       ep = kzalloc(sizeof(*ep), GFP_KERNEL);
+       if (unlikely(!ep))
+@@ -1137,7 +1122,6 @@ SYSCALL_DEFINE1(epoll_create1, int, flags)
+                             flags & O_CLOEXEC);
+       if (fd < 0)
+               ep_free(ep);
+-      atomic_inc(&ep->user->epoll_devs);
+ error_return:
+       DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n",
+@@ -1362,8 +1346,10 @@ static int __init eventpoll_init(void)
+       struct sysinfo si;
+       si_meminfo(&si);
+-      max_user_instances = 128;
+-      max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) /
++      /*
++       * Allows top 4% of lomem to be allocated for epoll watches (per user).
++       */
++      max_user_watches = (((si.totalram - si.totalhigh) / 25) << PAGE_SHIFT) /
+               EP_ITEM_COST;
+       /* Initialize the structure used to perform safe poll wait head wake ups */
+diff --git a/fs/ext3/namei.c b/fs/ext3/namei.c
+index 1f55382..89b1c93 100644
+--- a/fs/ext3/namei.c
++++ b/fs/ext3/namei.c
+@@ -1374,7 +1374,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       struct fake_dirent *fde;
+       blocksize =  dir->i_sb->s_blocksize;
+-      dxtrace(printk("Creating index\n"));
++      dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
+       retval = ext3_journal_get_write_access(handle, bh);
+       if (retval) {
+               ext3_std_error(dir->i_sb, retval);
+@@ -1383,6 +1383,19 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       }
+       root = (struct dx_root *) bh->b_data;
++      /* The 0th block becomes the root, move the dirents out */
++      fde = &root->dotdot;
++      de = (struct ext3_dir_entry_2 *)((char *)fde +
++                      ext3_rec_len_from_disk(fde->rec_len));
++      if ((char *) de >= (((char *) root) + blocksize)) {
++              ext3_error(dir->i_sb, __func__,
++                         "invalid rec_len for '..' in inode %lu",
++                         dir->i_ino);
++              brelse(bh);
++              return -EIO;
++      }
++      len = ((char *) root) + blocksize - (char *) de;
++
+       bh2 = ext3_append (handle, dir, &block, &retval);
+       if (!(bh2)) {
+               brelse(bh);
+@@ -1391,11 +1404,6 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       EXT3_I(dir)->i_flags |= EXT3_INDEX_FL;
+       data1 = bh2->b_data;
+-      /* The 0th block becomes the root, move the dirents out */
+-      fde = &root->dotdot;
+-      de = (struct ext3_dir_entry_2 *)((char *)fde +
+-                      ext3_rec_len_from_disk(fde->rec_len));
+-      len = ((char *) root) + blocksize - (char *) de;
+       memcpy (data1, de, len);
+       de = (struct ext3_dir_entry_2 *) data1;
+       top = data1 + len;
+diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
+index 87250b6..279734f 100644
+--- a/fs/fuse/dev.c
++++ b/fs/fuse/dev.c
+@@ -281,7 +281,8 @@ static void request_end(struct fuse_conn *fc, struct fuse_req *req)
+                       fc->blocked = 0;
+                       wake_up_all(&fc->blocked_waitq);
+               }
+-              if (fc->num_background == FUSE_CONGESTION_THRESHOLD) {
++              if (fc->num_background == FUSE_CONGESTION_THRESHOLD &&
++                  fc->connected) {
+                       clear_bdi_congested(&fc->bdi, READ);
+                       clear_bdi_congested(&fc->bdi, WRITE);
+               }
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index c8206db..3ada9d7 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -54,7 +54,7 @@ struct fuse_file *fuse_file_alloc(void)
+               ff->reserved_req = fuse_request_alloc();
+               if (!ff->reserved_req) {
+                       kfree(ff);
+-                      ff = NULL;
++                      return NULL;
+               } else {
+                       INIT_LIST_HEAD(&ff->write_entry);
+                       atomic_set(&ff->count, 0);
+diff --git a/fs/fuse/inode.c b/fs/fuse/inode.c
+index d2249f1..57342a6 100644
+--- a/fs/fuse/inode.c
++++ b/fs/fuse/inode.c
+@@ -292,6 +292,7 @@ static void fuse_put_super(struct super_block *sb)
+       list_del(&fc->entry);
+       fuse_ctl_remove_conn(fc);
+       mutex_unlock(&fuse_mutex);
++      bdi_destroy(&fc->bdi);
+       fuse_conn_put(fc);
+ }
+@@ -531,7 +532,6 @@ void fuse_conn_put(struct fuse_conn *fc)
+               if (fc->destroy_req)
+                       fuse_request_free(fc->destroy_req);
+               mutex_destroy(&fc->inst_mutex);
+-              bdi_destroy(&fc->bdi);
+               kfree(fc);
+       }
+ }
+@@ -832,12 +832,16 @@ static int fuse_fill_super(struct super_block *sb, void *data, int silent)
+       if (!file)
+               return -EINVAL;
+-      if (file->f_op != &fuse_dev_operations)
++      if (file->f_op != &fuse_dev_operations) {
++              fput(file);
+               return -EINVAL;
++      }
+       fc = new_conn(sb);
+-      if (!fc)
++      if (!fc) {
++              fput(file);
+               return -ENOMEM;
++      }
+       fc->flags = d.flags;
+       fc->user_id = d.user_id;
+diff --git a/fs/inotify_user.c b/fs/inotify_user.c
+index a13f487..5c92d90 100644
+--- a/fs/inotify_user.c
++++ b/fs/inotify_user.c
+@@ -427,10 +427,61 @@ static unsigned int inotify_poll(struct file *file, poll_table *wait)
+       return ret;
+ }
++/*
++ * Get an inotify_kernel_event if one exists and is small
++ * enough to fit in "count". Return an error pointer if
++ * not large enough.
++ *
++ * Called with the device ev_mutex held.
++ */
++static struct inotify_kernel_event *get_one_event(struct inotify_device *dev,
++                                                size_t count)
++{
++      size_t event_size = sizeof(struct inotify_event);
++      struct inotify_kernel_event *kevent;
++
++      if (list_empty(&dev->events))
++              return NULL;
++
++      kevent = inotify_dev_get_event(dev);
++      if (kevent->name)
++              event_size += kevent->event.len;
++
++      if (event_size > count)
++              return ERR_PTR(-EINVAL);
++
++      remove_kevent(dev, kevent);
++      return kevent;
++}
++
++/*
++ * Copy an event to user space, returning how much we copied.
++ *
++ * We already checked that the event size is smaller than the
++ * buffer we had in "get_one_event()" above.
++ */
++static ssize_t copy_event_to_user(struct inotify_kernel_event *kevent,
++                                char __user *buf)
++{
++      size_t event_size = sizeof(struct inotify_event);
++
++      if (copy_to_user(buf, &kevent->event, event_size))
++              return -EFAULT;
++
++      if (kevent->name) {
++              buf += event_size;
++
++              if (copy_to_user(buf, kevent->name, kevent->event.len))
++                      return -EFAULT;
++
++              event_size += kevent->event.len;
++      }
++      return event_size;
++}
++
+ static ssize_t inotify_read(struct file *file, char __user *buf,
+                           size_t count, loff_t *pos)
+ {
+-      size_t event_size = sizeof (struct inotify_event);
+       struct inotify_device *dev;
+       char __user *start;
+       int ret;
+@@ -440,81 +491,43 @@ static ssize_t inotify_read(struct file *file, char __user *buf,
+       dev = file->private_data;
+       while (1) {
++              struct inotify_kernel_event *kevent;
+               prepare_to_wait(&dev->wq, &wait, TASK_INTERRUPTIBLE);
+               mutex_lock(&dev->ev_mutex);
+-              if (!list_empty(&dev->events)) {
+-                      ret = 0;
+-                      break;
+-              }
++              kevent = get_one_event(dev, count);
+               mutex_unlock(&dev->ev_mutex);
+-              if (file->f_flags & O_NONBLOCK) {
+-                      ret = -EAGAIN;
+-                      break;
+-              }
+-
+-              if (signal_pending(current)) {
+-                      ret = -EINTR;
+-                      break;
++              if (kevent) {
++                      ret = PTR_ERR(kevent);
++                      if (IS_ERR(kevent))
++                              break;
++                      ret = copy_event_to_user(kevent, buf);
++                      free_kevent(kevent);
++                      if (ret < 0)
++                              break;
++                      buf += ret;
++                      count -= ret;
++                      continue;
+               }
+-              schedule();
+-      }
+-
+-      finish_wait(&dev->wq, &wait);
+-      if (ret)
+-              return ret;
+-
+-      while (1) {
+-              struct inotify_kernel_event *kevent;
+-
+-              ret = buf - start;
+-              if (list_empty(&dev->events))
++              ret = -EAGAIN;
++              if (file->f_flags & O_NONBLOCK)
+                       break;
+-
+-              kevent = inotify_dev_get_event(dev);
+-              if (event_size + kevent->event.len > count) {
+-                      if (ret == 0 && count > 0) {
+-                              /*
+-                               * could not get a single event because we
+-                               * didn't have enough buffer space.
+-                               */
+-                              ret = -EINVAL;
+-                      }
++              ret = -EINTR;
++              if (signal_pending(current))
+                       break;
+-              }
+-              remove_kevent(dev, kevent);
+-              /*
+-               * Must perform the copy_to_user outside the mutex in order
+-               * to avoid a lock order reversal with mmap_sem.
+-               */
+-              mutex_unlock(&dev->ev_mutex);
+-
+-              if (copy_to_user(buf, &kevent->event, event_size)) {
+-                      ret = -EFAULT;
++              if (start != buf)
+                       break;
+-              }
+-              buf += event_size;
+-              count -= event_size;
+-
+-              if (kevent->name) {
+-                      if (copy_to_user(buf, kevent->name, kevent->event.len)){
+-                              ret = -EFAULT;
+-                              break;
+-                      }
+-                      buf += kevent->event.len;
+-                      count -= kevent->event.len;
+-              }
+-
+-              free_kevent(kevent);
+-              mutex_lock(&dev->ev_mutex);
++              schedule();
+       }
+-      mutex_unlock(&dev->ev_mutex);
++      finish_wait(&dev->wq, &wait);
++      if (start != buf && ret != -EFAULT)
++              ret = buf - start;
+       return ret;
+ }
+diff --git a/fs/sysfs/bin.c b/fs/sysfs/bin.c
+index 006fc64..aa24484 100644
+--- a/fs/sysfs/bin.c
++++ b/fs/sysfs/bin.c
+@@ -62,6 +62,9 @@ read(struct file *file, char __user *userbuf, size_t bytes, loff_t *off)
+       loff_t offs = *off;
+       int count = min_t(size_t, bytes, PAGE_SIZE);
++      if (!bytes)
++              return 0;
++
+       if (size) {
+               if (offs > size)
+                       return 0;
+@@ -119,6 +122,9 @@ static ssize_t write(struct file *file, const char __user *userbuf,
+       loff_t offs = *off;
+       int count = min_t(size_t, bytes, PAGE_SIZE);
++      if (!bytes)
++              return 0;
++
+       if (size) {
+               if (offs > size)
+                       return 0;
+diff --git a/include/asm-x86/pgalloc.h b/include/asm-x86/pgalloc.h
+index d63ea43..36ef40d 100644
+--- a/include/asm-x86/pgalloc.h
++++ b/include/asm-x86/pgalloc.h
+@@ -42,6 +42,7 @@ static inline void pte_free_kernel(struct mm_struct *mm, pte_t *pte)
+ static inline void pte_free(struct mm_struct *mm, struct page *pte)
+ {
++      pgtable_page_dtor(pte);
+       __free_page(pte);
+ }
+diff --git a/include/linux/Kbuild b/include/linux/Kbuild
+index b68ec09..d5eb2e7 100644
+--- a/include/linux/Kbuild
++++ b/include/linux/Kbuild
+@@ -41,6 +41,7 @@ header-y += baycom.h
+ header-y += bfs_fs.h
+ header-y += blkpg.h
+ header-y += bpqether.h
++header-y += bsg.h
+ header-y += can.h
+ header-y += cdk.h
+ header-y += chio.h
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index f1624b3..391cbf3 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1346,6 +1346,7 @@
+ #define PCI_DEVICE_ID_VIA_8783_0      0x3208
+ #define PCI_DEVICE_ID_VIA_8237                0x3227
+ #define PCI_DEVICE_ID_VIA_8251                0x3287
++#define PCI_DEVICE_ID_VIA_8261                0x3402
+ #define PCI_DEVICE_ID_VIA_8237A               0x3337
+ #define PCI_DEVICE_ID_VIA_8237S               0x3372
+ #define PCI_DEVICE_ID_VIA_SATA_EIDE   0x5324
+@@ -1355,10 +1356,13 @@
+ #define PCI_DEVICE_ID_VIA_CX700               0x8324
+ #define PCI_DEVICE_ID_VIA_CX700_IDE   0x0581
+ #define PCI_DEVICE_ID_VIA_VX800               0x8353
++#define PCI_DEVICE_ID_VIA_VX855               0x8409
+ #define PCI_DEVICE_ID_VIA_8371_1      0x8391
+ #define PCI_DEVICE_ID_VIA_82C598_1    0x8598
+ #define PCI_DEVICE_ID_VIA_838X_1      0xB188
+ #define PCI_DEVICE_ID_VIA_83_87XX_1   0xB198
++#define PCI_DEVICE_ID_VIA_C409_IDE    0XC409
++#define PCI_DEVICE_ID_VIA_ANON                0xFFFF
+ #define PCI_VENDOR_ID_SIEMENS           0x110A
+ #define PCI_DEVICE_ID_SIEMENS_DSCC4     0x2102
+@@ -1780,6 +1784,7 @@
+ #define PCI_DEVICE_ID_SEALEVEL_UCOMM232       0x7202
+ #define PCI_DEVICE_ID_SEALEVEL_COMM4  0x7401
+ #define PCI_DEVICE_ID_SEALEVEL_COMM8  0x7801
++#define PCI_DEVICE_ID_SEALEVEL_7803   0x7803
+ #define PCI_DEVICE_ID_SEALEVEL_UCOMM8 0x7804
+ #define PCI_VENDOR_ID_HYPERCOPE               0x1365
+@@ -2148,6 +2153,7 @@
+ #define PCI_DEVICE_ID_RDC_R6040               0x6040
+ #define PCI_DEVICE_ID_RDC_R6060               0x6060
+ #define PCI_DEVICE_ID_RDC_R6061               0x6061
++#define PCI_DEVICE_ID_RDC_D1010               0x1010
+ #define PCI_VENDOR_ID_LENOVO          0x17aa
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 086f5e1..03e0902 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -588,7 +588,6 @@ struct user_struct {
+       atomic_t inotify_devs;  /* How many inotify devs does this user have opened? */
+ #endif
+ #ifdef CONFIG_EPOLL
+-      atomic_t epoll_devs;    /* The number of epoll descriptors currently open */
+       atomic_t epoll_watches; /* The number of file descriptors currently watched */
+ #endif
+ #ifdef CONFIG_POSIX_MQUEUE
+diff --git a/kernel/relay.c b/kernel/relay.c
+index 8d13a78..b0bbf6f 100644
+--- a/kernel/relay.c
++++ b/kernel/relay.c
+@@ -664,8 +664,10 @@ int relay_late_setup_files(struct rchan *chan,
+       mutex_lock(&relay_channels_mutex);
+       /* Is chan already set up? */
+-      if (unlikely(chan->has_base_filename))
++      if (unlikely(chan->has_base_filename)) {
++              mutex_unlock(&relay_channels_mutex);
+               return -EEXIST;
++      }
+       chan->has_base_filename = 1;
+       chan->parent = parent;
+       curr_cpu = get_cpu();
+diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
+index 4788f7b..56ad58d 100644
+--- a/net/mac80211/tx.c
++++ b/net/mac80211/tx.c
+@@ -1335,8 +1335,10 @@ int ieee80211_master_start_xmit(struct sk_buff *skb,
+                       if (is_multicast_ether_addr(hdr->addr3))
+                               memcpy(hdr->addr1, hdr->addr3, ETH_ALEN);
+                       else
+-                              if (mesh_nexthop_lookup(skb, odev))
++                              if (mesh_nexthop_lookup(skb, odev)) {
++                                      dev_put(odev);
+                                       return  0;
++                              }
+                       if (memcmp(odev->dev_addr, hdr->addr4, ETH_ALEN) != 0)
+                               IEEE80211_IFSTA_MESH_CTR_INC(&osdata->u.sta,
+                                                            fwded_frames);
+diff --git a/net/sunrpc/rpcb_clnt.c b/net/sunrpc/rpcb_clnt.c
+index 24db2b4..0a22f00 100644
+--- a/net/sunrpc/rpcb_clnt.c
++++ b/net/sunrpc/rpcb_clnt.c
+@@ -469,6 +469,28 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi
+       return rpc_run_task(&task_setup_data);
+ }
++/*
++ * In the case where rpc clients have been cloned, we want to make
++ * sure that we use the program number/version etc of the actual
++ * owner of the xprt. To do so, we walk back up the tree of parents
++ * to find whoever created the transport and/or whoever has the
++ * autobind flag set.
++ */
++static struct rpc_clnt *rpcb_find_transport_owner(struct rpc_clnt *clnt)
++{
++      struct rpc_clnt *parent = clnt->cl_parent;
++
++      while (parent != clnt) {
++              if (parent->cl_xprt != clnt->cl_xprt)
++                      break;
++              if (clnt->cl_autobind)
++                      break;
++              clnt = parent;
++              parent = parent->cl_parent;
++      }
++      return clnt;
++}
++
+ /**
+  * rpcb_getport_async - obtain the port for a given RPC service on a given host
+  * @task: task that is waiting for portmapper request
+@@ -478,10 +500,10 @@ static struct rpc_task *rpcb_call_async(struct rpc_clnt *rpcb_clnt, struct rpcbi
+  */
+ void rpcb_getport_async(struct rpc_task *task)
+ {
+-      struct rpc_clnt *clnt = task->tk_client;
++      struct rpc_clnt *clnt;
+       struct rpc_procinfo *proc;
+       u32 bind_version;
+-      struct rpc_xprt *xprt = task->tk_xprt;
++      struct rpc_xprt *xprt;
+       struct rpc_clnt *rpcb_clnt;
+       static struct rpcbind_args *map;
+       struct rpc_task *child;
+@@ -490,13 +512,13 @@ void rpcb_getport_async(struct rpc_task *task)
+       size_t salen;
+       int status;
++      clnt = rpcb_find_transport_owner(task->tk_client);
++      xprt = clnt->cl_xprt;
++
+       dprintk("RPC: %5u %s(%s, %u, %u, %d)\n",
+               task->tk_pid, __func__,
+               clnt->cl_server, clnt->cl_prog, clnt->cl_vers, xprt->prot);
+-      /* Autobind on cloned rpc clients is discouraged */
+-      BUG_ON(clnt->cl_parent != clnt);
+-
+       /* Put self on the wait queue to ensure we get notified if
+        * some other task is already attempting to bind the port */
+       rpc_sleep_on(&xprt->binding, task, NULL);
+@@ -558,7 +580,7 @@ void rpcb_getport_async(struct rpc_task *task)
+               status = -ENOMEM;
+               dprintk("RPC: %5u %s: no memory available\n",
+                       task->tk_pid, __func__);
+-              goto bailout_nofree;
++              goto bailout_release_client;
+       }
+       map->r_prog = clnt->cl_prog;
+       map->r_vers = clnt->cl_vers;
+@@ -578,11 +600,13 @@ void rpcb_getport_async(struct rpc_task *task)
+                       task->tk_pid, __func__);
+               return;
+       }
+-      rpc_put_task(child);
+-      task->tk_xprt->stat.bind_count++;
++      xprt->stat.bind_count++;
++      rpc_put_task(child);
+       return;
++bailout_release_client:
++      rpc_release_client(rpcb_clnt);
+ bailout_nofree:
+       rpcb_wake_rpcbind_waiters(xprt, status);
+       task->tk_status = status;
+diff --git a/sound/pci/hda/patch_conexant.c b/sound/pci/hda/patch_conexant.c
+index 7c1eb23..a50089f 100644
+--- a/sound/pci/hda/patch_conexant.c
++++ b/sound/pci/hda/patch_conexant.c
+@@ -1470,6 +1470,7 @@ static struct snd_pci_quirk cxt5047_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x30a5, "HP DV5200T/DV8000T", CXT5047_LAPTOP_HP),
+       SND_PCI_QUIRK(0x103c, 0x30b2, "HP DV2000T/DV3000T", CXT5047_LAPTOP),
+       SND_PCI_QUIRK(0x103c, 0x30b5, "HP DV2000Z", CXT5047_LAPTOP),
++      SND_PCI_QUIRK(0x103c, 0x30cf, "HP DV6700", CXT5047_LAPTOP),
+       SND_PCI_QUIRK(0x1179, 0xff31, "Toshiba P100", CXT5047_LAPTOP_EAPD),
+       {}
+ };
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 7225f0f..aa7dc03 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6631,6 +6631,7 @@ static int patch_alc882(struct hda_codec *codec)
+               case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
+               case 0x106b2c00: /* Macbook Pro rev3 */
+               case 0x106b3600: /* Macbook 3.1 */
++              case 0x106b3800: /* MacbookPro4,1 - latter revision */
+                       board_config = ALC885_MBP3;
+                       break;
+               default:
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index fdef553..2f52cf1 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -2048,6 +2048,8 @@ static int stac92xx_build_pcms(struct hda_codec *codec)
+       info->name = "STAC92xx Analog";
+       info->stream[SNDRV_PCM_STREAM_PLAYBACK] = stac92xx_pcm_analog_playback;
++      info->stream[SNDRV_PCM_STREAM_PLAYBACK].nid =
++              spec->multiout.dac_nids[0];
+       info->stream[SNDRV_PCM_STREAM_CAPTURE] = stac92xx_pcm_analog_capture;
+       info->stream[SNDRV_PCM_STREAM_CAPTURE].nid = spec->adc_nids[0];
+       info->stream[SNDRV_PCM_STREAM_CAPTURE].substreams = spec->num_adcs;
+diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
+index 01d7b75..82a7814 100644
+--- a/sound/pci/oxygen/virtuoso.c
++++ b/sound/pci/oxygen/virtuoso.c
+@@ -26,7 +26,7 @@
+  * SPI 0 -> 1st PCM1796 (front)
+  * SPI 1 -> 2nd PCM1796 (surround)
+  * SPI 2 -> 3rd PCM1796 (center/LFE)
+- * SPI 4 -> 4th PCM1796 (back)
++ * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!)
+  *
+  * GPIO 2 -> M0 of CS5381
+  * GPIO 3 -> M1 of CS5381
+@@ -142,6 +142,12 @@ struct xonar_data {
+ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
+                         u8 reg, u8 value)
+ {
++      /*
++       * We don't want to do writes on SPI 4 because the EEPROM, which shares
++       * the same pin, might get confused and broken.  We'd better take care
++       * that the driver works with the default register values ...
++       */
++#if 0
+       /* maps ALSA channel pair number to SPI output */
+       static const u8 codec_map[4] = {
+               0, 1, 2, 4
+@@ -152,6 +158,7 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
+                        (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
+                        OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
+                        (reg << 8) | value);
++#endif
+ }
+ static void cs4398_write(struct oxygen *chip, u8 reg, u8 value)
+@@ -539,6 +546,9 @@ static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0);
+ static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
+ {
++      if (!strncmp(template->name, "Master Playback ", 16))
++              /* disable volume/mute because they would require SPI writes */
++              return 1;
+       if (!strncmp(template->name, "CD Capture ", 11))
+               /* CD in is actually connected to the video in pin */
+               template->private_value ^= AC97_CD ^ AC97_VIDEO;
+@@ -588,9 +598,8 @@ static const struct oxygen_model xonar_models[] = {
+               .dac_volume_min = 0x0f,
+               .dac_volume_max = 0xff,
+               .misc_flags = OXYGEN_MISC_MIDI,
+-              .function_flags = OXYGEN_FUNCTION_SPI |
+-                                OXYGEN_FUNCTION_ENABLE_SPI_4_5,
+-              .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
++              .function_flags = OXYGEN_FUNCTION_SPI,
++              .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
+               .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+       },
+       [MODEL_D2X] = {
+@@ -619,9 +628,8 @@ static const struct oxygen_model xonar_models[] = {
+               .dac_volume_min = 0x0f,
+               .dac_volume_max = 0xff,
+               .misc_flags = OXYGEN_MISC_MIDI,
+-              .function_flags = OXYGEN_FUNCTION_SPI |
+-                                OXYGEN_FUNCTION_ENABLE_SPI_4_5,
+-              .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
++              .function_flags = OXYGEN_FUNCTION_SPI,
++              .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
+               .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+       },
+       [MODEL_D1] = {
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.14-15 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.14-15
new file mode 100644 (file)
index 0000000..6d4dba9
--- /dev/null
@@ -0,0 +1,2395 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.15
+
+Upstream 2.6.27.15 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index b2263f8..a2dcd97 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .14
++EXTRAVERSION = .15
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
+index 6568942..a15baac 100644
+--- a/arch/ia64/sn/kernel/io_acpi_init.c
++++ b/arch/ia64/sn/kernel/io_acpi_init.c
+@@ -232,7 +232,7 @@ exit:
+ static unsigned int
+ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
+ {
+-      unsigned long adr;
++      unsigned long long adr;
+       acpi_handle child;
+       unsigned int devfn;
+       int function;
+@@ -292,8 +292,8 @@ get_host_devfn(acpi_handle device_handle, acpi_handle rootbus_handle)
+ static acpi_status
+ find_matching_device(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+-      unsigned long bbn = -1;
+-      unsigned long adr;
++      unsigned long long bbn = -1;
++      unsigned long long adr;
+       acpi_handle parent = NULL;
+       acpi_status status;
+       unsigned int devfn;
+@@ -348,7 +348,7 @@ sn_acpi_get_pcidev_info(struct pci_dev *dev, struct pcidev_info **pcidev_info,
+       unsigned int host_devfn;
+       struct sn_pcidev_match pcidev_match;
+       acpi_handle rootbus_handle;
+-      unsigned long segment;
++      unsigned long long segment;
+       acpi_status status;
+       rootbus_handle = PCI_CONTROLLER(dev)->acpi_handle;
+diff --git a/arch/m68knommu/Kconfig b/arch/m68knommu/Kconfig
+index 2e7515e..04aa00b 100644
+--- a/arch/m68knommu/Kconfig
++++ b/arch/m68knommu/Kconfig
+@@ -14,6 +14,10 @@ config MMU
+       bool
+       default n
++config NO_DMA
++      bool
++      default y
++
+ config FPU
+       bool
+       default n
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index 388bae2..d0561fe 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -123,6 +123,9 @@ config GENERIC_TIME_VSYSCALL
+ config ARCH_HAS_CPU_RELAX
+       def_bool y
++config ARCH_HAS_DEFAULT_IDLE
++      def_bool y
++
+ config ARCH_HAS_CACHE_LINE_SIZE
+       def_bool y
+diff --git a/arch/x86/kernel/acpi/cstate.c b/arch/x86/kernel/acpi/cstate.c
+index c2502eb..a4805b3 100644
+--- a/arch/x86/kernel/acpi/cstate.c
++++ b/arch/x86/kernel/acpi/cstate.c
+@@ -56,6 +56,7 @@ static struct cstate_entry *cpu_cstate_entry;        /* per CPU ptr */
+ static short mwait_supported[ACPI_PROCESSOR_MAX_POWER];
+ #define MWAIT_SUBSTATE_MASK   (0xf)
++#define MWAIT_CSTATE_MASK     (0xf)
+ #define MWAIT_SUBSTATE_SIZE   (4)
+ #define CPUID_MWAIT_LEAF (5)
+@@ -98,7 +99,8 @@ int acpi_processor_ffh_cstate_probe(unsigned int cpu,
+       cpuid(CPUID_MWAIT_LEAF, &eax, &ebx, &ecx, &edx);
+       /* Check whether this particular cx_type (in CST) is supported or not */
+-      cstate_type = (cx->address >> MWAIT_SUBSTATE_SIZE) + 1;
++      cstate_type = ((cx->address >> MWAIT_SUBSTATE_SIZE) &
++                      MWAIT_CSTATE_MASK) + 1;
+       edx_part = edx >> (cstate_type * MWAIT_SUBSTATE_SIZE);
+       num_cstate_subtype = edx_part & MWAIT_SUBSTATE_MASK;
+diff --git a/arch/x86/lib/usercopy_32.c b/arch/x86/lib/usercopy_32.c
+index 24e6094..dbeab3c 100644
+--- a/arch/x86/lib/usercopy_32.c
++++ b/arch/x86/lib/usercopy_32.c
+@@ -49,7 +49,7 @@ do {                                                                    \
+               "       jmp 2b\n"                                          \
+               ".previous\n"                                              \
+               _ASM_EXTABLE(0b,3b)                                        \
+-              : "=d"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1),      \
++              : "=&d"(res), "=&c"(count), "=&a" (__d0), "=&S" (__d1),    \
+                 "=&D" (__d2)                                             \
+               : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
+               : "memory");                                               \
+@@ -211,7 +211,7 @@ long strnlen_user(const char __user *s, long n)
+               "       .align 4\n"
+               "       .long 0b,2b\n"
+               ".previous"
+-              :"=r" (n), "=D" (s), "=a" (res), "=c" (tmp)
++              :"=&r" (n), "=&D" (s), "=&a" (res), "=&c" (tmp)
+               :"0" (n), "1" (s), "2" (0), "3" (mask)
+               :"cc");
+       return res & mask;
+diff --git a/arch/x86/lib/usercopy_64.c b/arch/x86/lib/usercopy_64.c
+index f4df6e7..500b930 100644
+--- a/arch/x86/lib/usercopy_64.c
++++ b/arch/x86/lib/usercopy_64.c
+@@ -32,7 +32,7 @@ do {                                                                    \
+               "       jmp 2b\n"                                          \
+               ".previous\n"                                              \
+               _ASM_EXTABLE(0b,3b)                                        \
+-              : "=r"(res), "=c"(count), "=&a" (__d0), "=&S" (__d1),      \
++              : "=&r"(res), "=&c"(count), "=&a" (__d0), "=&S" (__d1),    \
+                 "=&D" (__d2)                                             \
+               : "i"(-EFAULT), "0"(count), "1"(count), "3"(src), "4"(dst) \
+               : "memory");                                               \
+@@ -86,7 +86,7 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
+               ".previous\n"
+               _ASM_EXTABLE(0b,3b)
+               _ASM_EXTABLE(1b,2b)
+-              : [size8] "=c"(size), [dst] "=&D" (__d0)
++              : [size8] "=&c"(size), [dst] "=&D" (__d0)
+               : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr),
+                 [zero] "r" (0UL), [eight] "r" (8UL));
+       return size;
+diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
+index 43e2f84..5b719a0 100644
+--- a/arch/x86/mm/pageattr.c
++++ b/arch/x86/mm/pageattr.c
+@@ -582,6 +582,36 @@ out_unlock:
+       return 0;
+ }
++static int __cpa_process_fault(struct cpa_data *cpa, unsigned long vaddr,
++                             int primary)
++{
++      /*
++       * Ignore all non primary paths.
++       */
++      if (!primary)
++              return 0;
++
++      /*
++       * Ignore the NULL PTE for kernel identity mapping, as it is expected
++       * to have holes.
++       * Also set numpages to '1' indicating that we processed cpa req for
++       * one virtual address page and its pfn. TBD: numpages can be set based
++       * on the initial value and the level returned by lookup_address().
++       */
++      if (within(vaddr, PAGE_OFFSET,
++                 PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT))) {
++              cpa->numpages = 1;
++              cpa->pfn = __pa(vaddr) >> PAGE_SHIFT;
++              return 0;
++      } else {
++              WARN(1, KERN_WARNING "CPA: called for zero pte. "
++                      "vaddr = %lx cpa->vaddr = %lx\n", vaddr,
++                      cpa->vaddr);
++
++              return -EINVAL;
++      }
++}
++
+ static int __change_page_attr(struct cpa_data *cpa, int primary)
+ {
+       unsigned long address = cpa->vaddr;
+@@ -592,17 +622,11 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
+ repeat:
+       kpte = lookup_address(address, &level);
+       if (!kpte)
+-              return 0;
++              return __cpa_process_fault(cpa, address, primary);
+       old_pte = *kpte;
+-      if (!pte_val(old_pte)) {
+-              if (!primary)
+-                      return 0;
+-              WARN(1, KERN_WARNING "CPA: called for zero pte. "
+-                     "vaddr = %lx cpa->vaddr = %lx\n", address,
+-                     cpa->vaddr);
+-              return -EINVAL;
+-      }
++      if (!pte_val(old_pte))
++              return __cpa_process_fault(cpa, address, primary);
+       if (level == PG_LEVEL_4K) {
+               pte_t new_pte;
+@@ -676,12 +700,7 @@ static int cpa_process_alias(struct cpa_data *cpa)
+        * mapping already:
+        */
+       if (!(within(cpa->vaddr, PAGE_OFFSET,
+-                  PAGE_OFFSET + (max_low_pfn_mapped << PAGE_SHIFT))
+-#ifdef CONFIG_X86_64
+-              || within(cpa->vaddr, PAGE_OFFSET + (1UL<<32),
+-                  PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT))
+-#endif
+-      )) {
++                  PAGE_OFFSET + (max_pfn_mapped << PAGE_SHIFT)))) {
+               alias_cpa = *cpa;
+               alias_cpa.vaddr = (unsigned long) __va(cpa->pfn << PAGE_SHIFT);
+diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c
+index 8e07718..95e76ce 100644
+--- a/arch/x86/pci/irq.c
++++ b/arch/x86/pci/irq.c
+@@ -573,6 +573,7 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
+       case PCI_DEVICE_ID_INTEL_ICH7_1:
+       case PCI_DEVICE_ID_INTEL_ICH7_30:
+       case PCI_DEVICE_ID_INTEL_ICH7_31:
++      case PCI_DEVICE_ID_INTEL_TGP_LPC:
+       case PCI_DEVICE_ID_INTEL_ESB2_0:
+       case PCI_DEVICE_ID_INTEL_ICH8_0:
+       case PCI_DEVICE_ID_INTEL_ICH8_1:
+diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
+index 831883b..5e57a80 100644
+--- a/drivers/acpi/ac.c
++++ b/drivers/acpi/ac.c
+@@ -85,7 +85,7 @@ struct acpi_ac {
+       struct power_supply charger;
+ #endif
+       struct acpi_device * device;
+-      unsigned long state;
++      unsigned long long state;
+ };
+ #define to_acpi_ac(x) container_of(x, struct acpi_ac, charger);
+diff --git a/drivers/acpi/acpi_memhotplug.c b/drivers/acpi/acpi_memhotplug.c
+index 5f1127a..2b77316 100644
+--- a/drivers/acpi/acpi_memhotplug.c
++++ b/drivers/acpi/acpi_memhotplug.c
+@@ -194,8 +194,7 @@ acpi_memory_get_device(acpi_handle handle,
+ static int acpi_memory_check_device(struct acpi_memory_device *mem_device)
+ {
+-      unsigned long current_status;
+-
++      unsigned long long current_status;
+       /* Get device present/absent information from the _STA */
+       if (ACPI_FAILURE(acpi_evaluate_integer(mem_device->device->handle, "_STA",
+@@ -264,7 +263,7 @@ static int acpi_memory_powerdown_device(struct acpi_memory_device *mem_device)
+       acpi_status status;
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
+-      unsigned long current_status;
++      unsigned long long current_status;
+       /* Issue the _EJ0 command */
+diff --git a/drivers/acpi/asus_acpi.c b/drivers/acpi/asus_acpi.c
+index d3d0886..e2ab023 100644
+--- a/drivers/acpi/asus_acpi.c
++++ b/drivers/acpi/asus_acpi.c
+@@ -753,7 +753,7 @@ static int get_lcd_state(void)
+                       /* That's what the AML code does */
+                       lcd = out_obj.integer.value >> 8;
+       } else if (hotk->model == F3Sa) {
+-              unsigned long tmp;
++              unsigned long long tmp;
+               union acpi_object param;
+               struct acpi_object_list input;
+               acpi_status status;
+@@ -1244,6 +1244,8 @@ static int asus_hotk_get_info(void)
+                              "default values\n", string);
+                       printk(KERN_NOTICE
+                              "  send /proc/acpi/dsdt to the developers\n");
++                      kfree(model);
++                      return -ENODEV;
+               }
+               hotk->methods = &model_conf[hotk->model];
+               return AE_OK;
+diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
+index b1c723f..e5ca3a0 100644
+--- a/drivers/acpi/battery.c
++++ b/drivers/acpi/battery.c
+@@ -472,7 +472,7 @@ static void sysfs_remove_battery(struct acpi_battery *battery)
+ static int acpi_battery_update(struct acpi_battery *battery)
+ {
+-      int result;
++      int result, old_present = acpi_battery_present(battery);
+       result = acpi_battery_get_status(battery);
+       if (result)
+               return result;
+@@ -483,7 +483,8 @@ static int acpi_battery_update(struct acpi_battery *battery)
+               return 0;
+       }
+ #endif
+-      if (!battery->update_time) {
++      if (!battery->update_time ||
++          old_present != acpi_battery_present(battery)) {
+               result = acpi_battery_get_info(battery);
+               if (result)
+                       return result;
+diff --git a/drivers/acpi/bay.c b/drivers/acpi/bay.c
+index 61b6c5b..23a51e4 100644
+--- a/drivers/acpi/bay.c
++++ b/drivers/acpi/bay.c
+@@ -90,7 +90,7 @@ static int is_ejectable(acpi_handle handle)
+  */
+ static int bay_present(struct bay *bay)
+ {
+-      unsigned long sta;
++      unsigned long long sta;
+       acpi_status status;
+       if (bay) {
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index c54f38e..60c34ed 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -77,7 +77,7 @@ EXPORT_SYMBOL(acpi_bus_get_device);
+ int acpi_bus_get_status(struct acpi_device *device)
+ {
+       acpi_status status = AE_OK;
+-      unsigned long sta = 0;
++      unsigned long long sta = 0;
+       if (!device)
+@@ -155,7 +155,7 @@ int acpi_bus_get_power(acpi_handle handle, int *state)
+       int result = 0;
+       acpi_status status = 0;
+       struct acpi_device *device = NULL;
+-      unsigned long psc = 0;
++      unsigned long long psc = 0;
+       result = acpi_bus_get_device(handle, &device);
+diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
+index 59352d9..9e8e8a6 100644
+--- a/drivers/acpi/button.c
++++ b/drivers/acpi/button.c
+@@ -145,7 +145,7 @@ static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
+ {
+       struct acpi_button *button = seq->private;
+       acpi_status status;
+-      unsigned long state;
++      unsigned long long state;
+       if (!button || !button->device)
+               return 0;
+@@ -253,7 +253,7 @@ static int acpi_button_remove_fs(struct acpi_device *device)
+    -------------------------------------------------------------------------- */
+ static int acpi_lid_send_state(struct acpi_button *button)
+ {
+-      unsigned long state;
++      unsigned long long state;
+       acpi_status status;
+       status = acpi_evaluate_integer(button->device->handle, "_LID", NULL,
+diff --git a/drivers/acpi/container.c b/drivers/acpi/container.c
+index 3c25ec7..cfa5fd6 100644
+--- a/drivers/acpi/container.c
++++ b/drivers/acpi/container.c
+@@ -76,7 +76,7 @@ static int is_device_present(acpi_handle handle)
+ {
+       acpi_handle temp;
+       acpi_status status;
+-      unsigned long sta;
++      unsigned long long sta;
+       status = acpi_get_handle(handle, "_STA", &temp);
+diff --git a/drivers/acpi/dispatcher/dsmethod.c b/drivers/acpi/dispatcher/dsmethod.c
+index 4613b9c..279a5a6 100644
+--- a/drivers/acpi/dispatcher/dsmethod.c
++++ b/drivers/acpi/dispatcher/dsmethod.c
+@@ -103,6 +103,9 @@ acpi_ds_method_error(acpi_status status, struct acpi_walk_state *walk_state)
+                                                   NULL);
+               acpi_ex_enter_interpreter();
+       }
++
++      acpi_ds_clear_implicit_return(walk_state);
++
+ #ifdef ACPI_DISASSEMBLER
+       if (ACPI_FAILURE(status)) {
+diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
+index 25d2161..e28469e 100644
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -229,7 +229,7 @@ EXPORT_SYMBOL_GPL(is_dock_device);
+  */
+ static int dock_present(struct dock_station *ds)
+ {
+-      unsigned long sta;
++      unsigned long long sta;
+       acpi_status status;
+       if (ds) {
+@@ -730,13 +730,13 @@ static DEVICE_ATTR(undock, S_IWUSR, NULL, write_undock);
+ static ssize_t show_dock_uid(struct device *dev,
+                            struct device_attribute *attr, char *buf)
+ {
+-      unsigned long lbuf;
++      unsigned long long lbuf;
+       acpi_status status = acpi_evaluate_integer(dock_station->handle,
+                                       "_UID", NULL, &lbuf);
+       if (ACPI_FAILURE(status))
+           return 0;
+-      return snprintf(buf, PAGE_SIZE, "%lx\n", lbuf);
++      return snprintf(buf, PAGE_SIZE, "%llx\n", lbuf);
+ }
+ static DEVICE_ATTR(uid, S_IRUGO, show_dock_uid, NULL);
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 9ab3fb9..566206a 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -769,6 +769,7 @@ static acpi_status
+ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
+ {
+       acpi_status status;
++      unsigned long long tmp = 0;
+       struct acpi_ec *ec = context;
+       status = acpi_walk_resources(handle, METHOD_NAME__CRS,
+@@ -778,11 +779,14 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
+       /* Get GPE bit assignment (EC events). */
+       /* TODO: Add support for _GPE returning a package */
+-      status = acpi_evaluate_integer(handle, "_GPE", NULL, &ec->gpe);
++      status = acpi_evaluate_integer(handle, "_GPE", NULL, &tmp);
+       if (ACPI_FAILURE(status))
+               return status;
++      ec->gpe = tmp;
+       /* Use the global lock for all EC transactions? */
+-      acpi_evaluate_integer(handle, "_GLK", NULL, &ec->global_lock);
++      tmp = 0;
++      acpi_evaluate_integer(handle, "_GLK", NULL, &tmp);
++      ec->global_lock = tmp;
+       ec->handle = handle;
+       return AE_CTRL_TERMINATE;
+ }
+diff --git a/drivers/acpi/namespace/nsutils.c b/drivers/acpi/namespace/nsutils.c
+index b0817e1..337fb04 100644
+--- a/drivers/acpi/namespace/nsutils.c
++++ b/drivers/acpi/namespace/nsutils.c
+@@ -314,9 +314,15 @@ void acpi_ns_get_internal_name_length(struct acpi_namestring_info *info)
+        *
+        * strlen() + 1 covers the first name_seg, which has no path separator
+        */
+-      if (acpi_ns_valid_root_prefix(next_external_char[0])) {
++      if (acpi_ns_valid_root_prefix(*next_external_char)) {
+               info->fully_qualified = TRUE;
+               next_external_char++;
++
++              /* Skip redundant root_prefix, like \\_SB.PCI0.SBRG.EC0 */
++
++              while (acpi_ns_valid_root_prefix(*next_external_char)) {
++                      next_external_char++;
++              }
+       } else {
+               /*
+                * Handle Carat prefixes
+diff --git a/drivers/acpi/namespace/nsxfname.c b/drivers/acpi/namespace/nsxfname.c
+index a287ed5..3cb910d 100644
+--- a/drivers/acpi/namespace/nsxfname.c
++++ b/drivers/acpi/namespace/nsxfname.c
+@@ -253,6 +253,7 @@ acpi_get_object_info(acpi_handle handle, struct acpi_buffer * buffer)
+       node = acpi_ns_map_handle_to_node(handle);
+       if (!node) {
+               (void)acpi_ut_release_mutex(ACPI_MTX_NAMESPACE);
++              status = AE_BAD_PARAMETER;
+               goto cleanup;
+       }
+diff --git a/drivers/acpi/numa.c b/drivers/acpi/numa.c
+index cb9864e..25ceae9 100644
+--- a/drivers/acpi/numa.c
++++ b/drivers/acpi/numa.c
+@@ -258,7 +258,7 @@ int __init acpi_numa_init(void)
+ int acpi_get_pxm(acpi_handle h)
+ {
+-      unsigned long pxm;
++      unsigned long long pxm;
+       acpi_status status;
+       acpi_handle handle;
+       acpi_handle phandle = h;
+diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
+index b0d40aa..f5beb8a 100644
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -608,7 +608,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle,   /* upper bound  */
+       acpi_handle handle;
+       struct acpi_pci_id *pci_id = *id;
+       acpi_status status;
+-      unsigned long temp;
++      unsigned long long temp;
+       acpi_object_type type;
+       acpi_get_parent(chandle, &handle);
+@@ -620,8 +620,7 @@ static void acpi_os_derive_pci_id_2(acpi_handle rhandle,   /* upper bound  */
+               if ((ACPI_FAILURE(status)) || (type != ACPI_TYPE_DEVICE))
+                       return;
+-              status =
+-                  acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
++              status = acpi_evaluate_integer(handle, METHOD_NAME__ADR, NULL,
+                                         &temp);
+               if (ACPI_SUCCESS(status)) {
+                       u32 val;
+diff --git a/drivers/acpi/parser/psparse.c b/drivers/acpi/parser/psparse.c
+index 15e1702..a05e2a3 100644
+--- a/drivers/acpi/parser/psparse.c
++++ b/drivers/acpi/parser/psparse.c
+@@ -641,10 +641,12 @@ acpi_status acpi_ps_parse_aml(struct acpi_walk_state *walk_state)
+                                           ACPI_WALK_METHOD_RESTART;
+                               }
+                       } else {
+-                              /* On error, delete any return object */
++                              /* On error, delete any return object or implicit return */
+                               acpi_ut_remove_reference(previous_walk_state->
+                                                        return_desc);
++                              acpi_ds_clear_implicit_return
++                                  (previous_walk_state);
+                       }
+               }
+diff --git a/drivers/acpi/pci_link.c b/drivers/acpi/pci_link.c
+index cf47805..0ea8a9f 100644
+--- a/drivers/acpi/pci_link.c
++++ b/drivers/acpi/pci_link.c
+@@ -796,10 +796,6 @@ static int irqrouter_resume(struct sys_device *dev)
+       struct list_head *node = NULL;
+       struct acpi_pci_link *link = NULL;
+-
+-      /* Make sure SCI is enabled again (Apple firmware bug?) */
+-      acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1);
+-
+       list_for_each(node, &acpi_link.entries) {
+               link = list_entry(node, struct acpi_pci_link, node);
+               if (!link) {
+diff --git a/drivers/acpi/pci_root.c b/drivers/acpi/pci_root.c
+index c3fed31..18ff4e5 100644
+--- a/drivers/acpi/pci_root.c
++++ b/drivers/acpi/pci_root.c
+@@ -190,7 +190,7 @@ static int __devinit acpi_pci_root_add(struct acpi_device *device)
+       struct acpi_pci_root *root = NULL;
+       struct acpi_pci_root *tmp;
+       acpi_status status = AE_OK;
+-      unsigned long value = 0;
++      unsigned long long value = 0;
+       acpi_handle handle = NULL;
+       struct acpi_device *child;
+diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
+index 8d4a568..cd1f446 100644
+--- a/drivers/acpi/pci_slot.c
++++ b/drivers/acpi/pci_slot.c
+@@ -76,10 +76,10 @@ static struct acpi_pci_driver acpi_pci_slot_driver = {
+ };
+ static int
+-check_slot(acpi_handle handle, unsigned long *sun)
++check_slot(acpi_handle handle, unsigned long long *sun)
+ {
+       int device = -1;
+-      unsigned long adr, sta;
++      unsigned long long adr, sta;
+       acpi_status status;
+       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+@@ -132,7 +132,7 @@ static acpi_status
+ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+       int device;
+-      unsigned long sun;
++      unsigned long long sun;
+       char name[SLOT_NAME_SIZE];
+       struct acpi_pci_slot *slot;
+       struct pci_slot *pci_slot;
+@@ -182,7 +182,7 @@ static acpi_status
+ walk_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+       int device, function;
+-      unsigned long adr;
++      unsigned long long adr;
+       acpi_status status;
+       acpi_handle dummy_handle;
+       acpi_walk_callback user_function;
+@@ -239,7 +239,7 @@ static int
+ walk_root_bridge(acpi_handle handle, acpi_walk_callback user_function)
+ {
+       int seg, bus;
+-      unsigned long tmp;
++      unsigned long long tmp;
+       acpi_status status;
+       acpi_handle dummy_handle;
+       struct pci_bus *pci_bus;
+diff --git a/drivers/acpi/power.c b/drivers/acpi/power.c
+index 4ab21cb..89e5d2a 100644
+--- a/drivers/acpi/power.c
++++ b/drivers/acpi/power.c
+@@ -131,7 +131,7 @@ acpi_power_get_context(acpi_handle handle,
+ static int acpi_power_get_state(struct acpi_power_resource *resource, int *state)
+ {
+       acpi_status status = AE_OK;
+-      unsigned long sta = 0;
++      unsigned long long sta = 0;
+       if (!resource || !state)
+diff --git a/drivers/acpi/processor_core.c b/drivers/acpi/processor_core.c
+index ee68ac5..8a27871 100644
+--- a/drivers/acpi/processor_core.c
++++ b/drivers/acpi/processor_core.c
+@@ -563,7 +563,7 @@ static int acpi_processor_get_info(struct acpi_processor *pr, unsigned has_uid)
+       /* Check if it is a Device with HID and UID */
+       if (has_uid) {
+-              unsigned long value;
++              unsigned long long value;
+               status = acpi_evaluate_integer(pr->handle, METHOD_NAME__UID,
+                                               NULL, &value);
+               if (ACPI_FAILURE(status)) {
+@@ -875,7 +875,7 @@ static int acpi_processor_remove(struct acpi_device *device, int type)
+ static int is_processor_present(acpi_handle handle)
+ {
+       acpi_status status;
+-      unsigned long sta = 0;
++      unsigned long long sta = 0;
+       status = acpi_evaluate_integer(handle, "_STA", NULL, &sta);
+diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
+index cf5b1b7..81b40ed 100644
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -1587,6 +1587,7 @@ static int acpi_idle_enter_bm(struct cpuidle_device *dev,
+       if (acpi_idle_bm_check()) {
+               if (dev->safe_state) {
++                      dev->last_state = dev->safe_state;
+                       return dev->safe_state->enter(dev, dev->safe_state);
+               } else {
+                       local_irq_disable();
+diff --git a/drivers/acpi/processor_perflib.c b/drivers/acpi/processor_perflib.c
+index 80c251e..f8129c7 100644
+--- a/drivers/acpi/processor_perflib.c
++++ b/drivers/acpi/processor_perflib.c
+@@ -126,7 +126,7 @@ static struct notifier_block acpi_ppc_notifier_block = {
+ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
+ {
+       acpi_status status = 0;
+-      unsigned long ppc = 0;
++      unsigned long long ppc = 0;
+       if (!pr)
+diff --git a/drivers/acpi/processor_throttling.c b/drivers/acpi/processor_throttling.c
+index a56fc6c..3097b75 100644
+--- a/drivers/acpi/processor_throttling.c
++++ b/drivers/acpi/processor_throttling.c
+@@ -274,7 +274,7 @@ static int acpi_processor_throttling_notifier(unsigned long event, void *data)
+ static int acpi_processor_get_platform_limit(struct acpi_processor *pr)
+ {
+       acpi_status status = 0;
+-      unsigned long tpc = 0;
++      unsigned long long tpc = 0;
+       if (!pr)
+               return -EINVAL;
+diff --git a/drivers/acpi/sbshc.c b/drivers/acpi/sbshc.c
+index a4e3767..81d23d3 100644
+--- a/drivers/acpi/sbshc.c
++++ b/drivers/acpi/sbshc.c
+@@ -258,7 +258,7 @@ extern int acpi_ec_add_query_handler(struct acpi_ec *ec, u8 query_bit,
+ static int acpi_smbus_hc_add(struct acpi_device *device)
+ {
+       int status;
+-      unsigned long val;
++      unsigned long long val;
+       struct acpi_smb_hc *hc;
+       if (!device)
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index 0450761..afa66f4 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1262,6 +1262,16 @@ acpi_add_single_object(struct acpi_device **child,
+       acpi_device_set_id(device, parent, handle, type);
+       /*
++       * The ACPI device is attached to acpi handle before getting
++       * the power/wakeup/peformance flags. Otherwise OS can't get
++       * the corresponding ACPI device by the acpi handle in the course
++       * of getting the power/wakeup/performance flags.
++       */
++      result = acpi_device_set_context(device, type);
++      if (result)
++              goto end;
++
++      /*
+        * Power Management
+        * ----------------
+        */
+@@ -1291,8 +1301,6 @@ acpi_add_single_object(struct acpi_device **child,
+                       goto end;
+       }
+-      if ((result = acpi_device_set_context(device, type)))
+-              goto end;
+       result = acpi_device_register(device, parent);
+diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
+index 3706469..e7e0aac 100644
+--- a/drivers/acpi/sleep/main.c
++++ b/drivers/acpi/sleep/main.c
+@@ -344,6 +344,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+               DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
+               },
+       },
++      {
++      .callback = init_old_suspend_ordering,
++      .ident = "HP xw4600 Workstation",
++      .matches = {
++              DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++              DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
++              },
++      },
+       {},
+ };
+ #endif /* CONFIG_SUSPEND */
+@@ -492,7 +500,7 @@ int acpi_pm_device_sleep_state(struct device *dev, int *d_min_p)
+       acpi_handle handle = DEVICE_ACPI_HANDLE(dev);
+       struct acpi_device *adev;
+       char acpi_method[] = "_SxD";
+-      unsigned long d_min, d_max;
++      unsigned long long d_min, d_max;
+       if (!handle || ACPI_FAILURE(acpi_bus_get_device(handle, &adev))) {
+               printk(KERN_DEBUG "ACPI handle has no context!\n");
+diff --git a/drivers/acpi/thermal.c b/drivers/acpi/thermal.c
+index 9127036..47abb94 100644
+--- a/drivers/acpi/thermal.c
++++ b/drivers/acpi/thermal.c
+@@ -246,18 +246,18 @@ static const struct file_operations acpi_thermal_polling_fops = {
+ static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
+ {
+       acpi_status status = AE_OK;
+-
++      unsigned long long tmp;
+       if (!tz)
+               return -EINVAL;
+       tz->last_temperature = tz->temperature;
+-      status =
+-          acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tz->temperature);
++      status = acpi_evaluate_integer(tz->device->handle, "_TMP", NULL, &tmp);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
++      tz->temperature = tmp;
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Temperature is %lu dK\n",
+                         tz->temperature));
+@@ -267,17 +267,16 @@ static int acpi_thermal_get_temperature(struct acpi_thermal *tz)
+ static int acpi_thermal_get_polling_frequency(struct acpi_thermal *tz)
+ {
+       acpi_status status = AE_OK;
+-
++      unsigned long long tmp;
+       if (!tz)
+               return -EINVAL;
+-      status =
+-          acpi_evaluate_integer(tz->device->handle, "_TZP", NULL,
+-                                &tz->polling_frequency);
++      status = acpi_evaluate_integer(tz->device->handle, "_TZP", NULL, &tmp);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
++      tz->polling_frequency = tmp;
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Polling frequency is %lu dS\n",
+                         tz->polling_frequency));
+@@ -356,6 +355,7 @@ do {       \
+ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+ {
+       acpi_status status = AE_OK;
++      unsigned long long tmp;
+       struct acpi_handle_list devices;
+       int valid = 0;
+       int i;
+@@ -363,7 +363,8 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+       /* Critical Shutdown (required) */
+       if (flag & ACPI_TRIPS_CRITICAL) {
+               status = acpi_evaluate_integer(tz->device->handle,
+-                              "_CRT", NULL, &tz->trips.critical.temperature);
++                              "_CRT", NULL, &tmp);
++              tz->trips.critical.temperature = tmp;
+               /*
+                * Treat freezing temperatures as invalid as well; some
+                * BIOSes return really low values and cause reboots at startup.
+@@ -399,12 +400,13 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+       /* Critical Sleep (optional) */
+       if (flag & ACPI_TRIPS_HOT) {
+               status = acpi_evaluate_integer(tz->device->handle,
+-                              "_HOT", NULL, &tz->trips.hot.temperature);
++                              "_HOT", NULL, &tmp);
+               if (ACPI_FAILURE(status)) {
+                       tz->trips.hot.flags.valid = 0;
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                       "No hot threshold\n"));
+               } else {
++                      tz->trips.hot.temperature = tmp;
+                       tz->trips.hot.flags.valid = 1;
+                       ACPI_DEBUG_PRINT((ACPI_DB_INFO,
+                                       "Found hot threshold [%lu]\n",
+@@ -418,33 +420,40 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+               if (psv == -1) {
+                       status = AE_SUPPORT;
+               } else if (psv > 0) {
+-                      tz->trips.passive.temperature = CELSIUS_TO_KELVIN(psv);
++                      tmp = CELSIUS_TO_KELVIN(psv);
+                       status = AE_OK;
+               } else {
+                       status = acpi_evaluate_integer(tz->device->handle,
+-                              "_PSV", NULL, &tz->trips.passive.temperature);
++                              "_PSV", NULL, &tmp);
+               }
+               if (ACPI_FAILURE(status))
+                       tz->trips.passive.flags.valid = 0;
+               else {
++                      tz->trips.passive.temperature = tmp;
+                       tz->trips.passive.flags.valid = 1;
+                       if (flag == ACPI_TRIPS_INIT) {
+                               status = acpi_evaluate_integer(
+                                               tz->device->handle, "_TC1",
+-                                              NULL, &tz->trips.passive.tc1);
++                                              NULL, &tmp);
+                               if (ACPI_FAILURE(status))
+                                       tz->trips.passive.flags.valid = 0;
++                              else
++                                      tz->trips.passive.tc1 = tmp;
+                               status = acpi_evaluate_integer(
+                                               tz->device->handle, "_TC2",
+-                                              NULL, &tz->trips.passive.tc2);
++                                              NULL, &tmp);
+                               if (ACPI_FAILURE(status))
+                                       tz->trips.passive.flags.valid = 0;
++                              else
++                                      tz->trips.passive.tc2 = tmp;
+                               status = acpi_evaluate_integer(
+                                               tz->device->handle, "_TSP",
+-                                              NULL, &tz->trips.passive.tsp);
++                                              NULL, &tmp);
+                               if (ACPI_FAILURE(status))
+                                       tz->trips.passive.flags.valid = 0;
++                              else
++                                      tz->trips.passive.tsp = tmp;
+                       }
+               }
+       }
+@@ -479,7 +488,7 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+               if (flag & ACPI_TRIPS_ACTIVE) {
+                       status = acpi_evaluate_integer(tz->device->handle,
+-                              name, NULL, &tz->trips.active[i].temperature);
++                                                      name, NULL, &tmp);
+                       if (ACPI_FAILURE(status)) {
+                               tz->trips.active[i].flags.valid = 0;
+                               if (i == 0)
+@@ -500,8 +509,10 @@ static int acpi_thermal_trips_update(struct acpi_thermal *tz, int flag)
+                                               tz->trips.active[i - 2].temperature :
+                                               CELSIUS_TO_KELVIN(act));
+                               break;
+-                      } else
++                      } else {
++                              tz->trips.active[i].temperature = tmp;
+                               tz->trips.active[i].flags.valid = 1;
++                      }
+               }
+               name[2] = 'L';
+diff --git a/drivers/acpi/utils.c b/drivers/acpi/utils.c
+index 1009261..e827be3 100644
+--- a/drivers/acpi/utils.c
++++ b/drivers/acpi/utils.c
+@@ -256,7 +256,7 @@ EXPORT_SYMBOL(acpi_extract_package);
+ acpi_status
+ acpi_evaluate_integer(acpi_handle handle,
+                     acpi_string pathname,
+-                    struct acpi_object_list *arguments, unsigned long *data)
++                    struct acpi_object_list *arguments, unsigned long long *data)
+ {
+       acpi_status status = AE_OK;
+       union acpi_object *element;
+@@ -288,7 +288,7 @@ acpi_evaluate_integer(acpi_handle handle,
+       *data = element->integer.value;
+       kfree(element);
+-      ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%lu]\n", *data));
++      ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Return value [%llu]\n", *data));
+       return AE_OK;
+ }
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index e8a51a1..42e1e84 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -291,20 +291,20 @@ static int acpi_video_device_lcd_set_level(struct acpi_video_device *device,
+                       int level);
+ static int acpi_video_device_lcd_get_level_current(
+                       struct acpi_video_device *device,
+-                      unsigned long *level);
++                      unsigned long long *level);
+ static int acpi_video_get_next_level(struct acpi_video_device *device,
+                                    u32 level_current, u32 event);
+ static void acpi_video_switch_brightness(struct acpi_video_device *device,
+                                        int event);
+ static int acpi_video_device_get_state(struct acpi_video_device *device,
+-                          unsigned long *state);
++                          unsigned long long *state);
+ static int acpi_video_output_get(struct output_device *od);
+ static int acpi_video_device_set_state(struct acpi_video_device *device, int state);
+ /*backlight device sysfs support*/
+ static int acpi_video_get_brightness(struct backlight_device *bd)
+ {
+-      unsigned long cur_level;
++      unsigned long long cur_level;
+       int i;
+       struct acpi_video_device *vd =
+               (struct acpi_video_device *)bl_get_data(bd);
+@@ -336,7 +336,7 @@ static struct backlight_ops acpi_backlight_ops = {
+ /*video output device sysfs support*/
+ static int acpi_video_output_get(struct output_device *od)
+ {
+-      unsigned long state;
++      unsigned long long state;
+       struct acpi_video_device *vd =
+               (struct acpi_video_device *)dev_get_drvdata(&od->dev);
+       acpi_video_device_get_state(vd, &state);
+@@ -370,7 +370,7 @@ static int video_get_cur_state(struct thermal_cooling_device *cdev, char *buf)
+ {
+       struct acpi_device *device = cdev->devdata;
+       struct acpi_video_device *video = acpi_driver_data(device);
+-      unsigned long level;
++      unsigned long long level;
+       int state;
+       acpi_video_device_lcd_get_level_current(video, &level);
+@@ -410,7 +410,7 @@ static struct thermal_cooling_device_ops video_cooling_ops = {
+ /* device */
+ static int
+-acpi_video_device_query(struct acpi_video_device *device, unsigned long *state)
++acpi_video_device_query(struct acpi_video_device *device, unsigned long long *state)
+ {
+       int status;
+@@ -421,7 +421,7 @@ acpi_video_device_query(struct acpi_video_device *device, unsigned long *state)
+ static int
+ acpi_video_device_get_state(struct acpi_video_device *device,
+-                          unsigned long *state)
++                          unsigned long long *state)
+ {
+       int status;
+@@ -436,7 +436,7 @@ acpi_video_device_set_state(struct acpi_video_device *device, int state)
+       int status;
+       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
+       struct acpi_object_list args = { 1, &arg0 };
+-      unsigned long ret;
++      unsigned long long ret;
+       arg0.integer.value = state;
+@@ -482,6 +482,7 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
+       int status = AE_OK;
+       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
+       struct acpi_object_list args = { 1, &arg0 };
++      int state;
+       arg0.integer.value = level;
+@@ -490,12 +491,16 @@ acpi_video_device_lcd_set_level(struct acpi_video_device *device, int level)
+               status = acpi_evaluate_object(device->dev->handle, "_BCM",
+                                             &args, NULL);
+       device->brightness->curr = level;
++      for (state = 2; state < device->brightness->count; state++)
++              if (level == device->brightness->levels[state])
++                      device->backlight->props.brightness = state - 2;
++
+       return status;
+ }
+ static int
+ acpi_video_device_lcd_get_level_current(struct acpi_video_device *device,
+-                                      unsigned long *level)
++                                      unsigned long long *level)
+ {
+       if (device->cap._BQC)
+               return acpi_evaluate_integer(device->dev->handle, "_BQC", NULL,
+@@ -549,7 +554,7 @@ static int
+ acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
+ {
+       int status;
+-      unsigned long tmp;
++      unsigned long long tmp;
+       union acpi_object arg0 = { ACPI_TYPE_INTEGER };
+       struct acpi_object_list args = { 1, &arg0 };
+@@ -564,7 +569,7 @@ acpi_video_bus_set_POST(struct acpi_video_bus *video, unsigned long option)
+ }
+ static int
+-acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long *id)
++acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long long *id)
+ {
+       int status;
+@@ -575,7 +580,7 @@ acpi_video_bus_get_POST(struct acpi_video_bus *video, unsigned long *id)
+ static int
+ acpi_video_bus_POST_options(struct acpi_video_bus *video,
+-                          unsigned long *options)
++                          unsigned long long *options)
+ {
+       int status;
+@@ -918,7 +923,7 @@ static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
+ {
+       int status;
+       struct acpi_video_device *dev = seq->private;
+-      unsigned long state;
++      unsigned long long state;
+       if (!dev)
+@@ -927,14 +932,14 @@ static int acpi_video_device_state_seq_show(struct seq_file *seq, void *offset)
+       status = acpi_video_device_get_state(dev, &state);
+       seq_printf(seq, "state:     ");
+       if (ACPI_SUCCESS(status))
+-              seq_printf(seq, "0x%02lx\n", state);
++              seq_printf(seq, "0x%02llx\n", state);
+       else
+               seq_printf(seq, "<not supported>\n");
+       status = acpi_video_device_query(dev, &state);
+       seq_printf(seq, "query:     ");
+       if (ACPI_SUCCESS(status))
+-              seq_printf(seq, "0x%02lx\n", state);
++              seq_printf(seq, "0x%02llx\n", state);
+       else
+               seq_printf(seq, "<not supported>\n");
+@@ -1217,7 +1222,7 @@ static int acpi_video_bus_ROM_open_fs(struct inode *inode, struct file *file)
+ static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
+ {
+       struct acpi_video_bus *video = seq->private;
+-      unsigned long options;
++      unsigned long long options;
+       int status;
+@@ -1232,7 +1237,7 @@ static int acpi_video_bus_POST_info_seq_show(struct seq_file *seq, void *offset)
+                       printk(KERN_WARNING PREFIX
+                              "This indicates a BIOS bug. Please contact the manufacturer.\n");
+               }
+-              printk("%lx\n", options);
++              printk("%llx\n", options);
+               seq_printf(seq, "can POST: <integrated video>");
+               if (options & 2)
+                       seq_printf(seq, " <PCI video>");
+@@ -1256,7 +1261,7 @@ static int acpi_video_bus_POST_seq_show(struct seq_file *seq, void *offset)
+ {
+       struct acpi_video_bus *video = seq->private;
+       int status;
+-      unsigned long id;
++      unsigned long long id;
+       if (!video)
+@@ -1303,7 +1308,7 @@ acpi_video_bus_write_POST(struct file *file,
+       struct seq_file *m = file->private_data;
+       struct acpi_video_bus *video = m->private;
+       char str[12] = { 0 };
+-      unsigned long opt, options;
++      unsigned long long opt, options;
+       if (!video || count + 1 > sizeof str)
+@@ -1473,7 +1478,7 @@ static int
+ acpi_video_bus_get_one_device(struct acpi_device *device,
+                             struct acpi_video_bus *video)
+ {
+-      unsigned long device_id;
++      unsigned long long device_id;
+       int status;
+       struct acpi_video_device *data;
+       struct acpi_video_device_attrib* attribute;
+@@ -1724,7 +1729,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
+ static void
+ acpi_video_switch_brightness(struct acpi_video_device *device, int event)
+ {
+-      unsigned long level_current, level_next;
++      unsigned long long level_current, level_next;
+       if (!device->brightness)
+               return;
+       acpi_video_device_lcd_get_level_current(device, &level_current);
+diff --git a/drivers/ata/libata-acpi.c b/drivers/ata/libata-acpi.c
+index 9330b79..ae45187 100644
+--- a/drivers/ata/libata-acpi.c
++++ b/drivers/ata/libata-acpi.c
+@@ -180,7 +180,7 @@ static void ata_acpi_handle_hotplug(struct ata_port *ap, struct ata_device *dev,
+       int wait = 0;
+       unsigned long flags;
+       acpi_handle handle, tmphandle;
+-      unsigned long sta;
++      unsigned long long sta;
+       acpi_status status;
+       if (dev) {
+diff --git a/drivers/ata/sata_mv.c b/drivers/ata/sata_mv.c
+index c815f8e..394cb0c 100644
+--- a/drivers/ata/sata_mv.c
++++ b/drivers/ata/sata_mv.c
+@@ -669,8 +669,8 @@ static const struct pci_device_id mv_pci_tbl[] = {
+       { PCI_VDEVICE(MARVELL, 0x5081), chip_508x },
+       /* RocketRAID 1720/174x have different identifiers */
+       { PCI_VDEVICE(TTI, 0x1720), chip_6042 },
+-      { PCI_VDEVICE(TTI, 0x1740), chip_508x },
+-      { PCI_VDEVICE(TTI, 0x1742), chip_508x },
++      { PCI_VDEVICE(TTI, 0x1740), chip_6042 },
++      { PCI_VDEVICE(TTI, 0x1742), chip_6042 },
+       { PCI_VDEVICE(MARVELL, 0x6040), chip_604x },
+       { PCI_VDEVICE(MARVELL, 0x6041), chip_604x },
+@@ -883,7 +883,7 @@ static void mv_start_dma(struct ata_port *ap, void __iomem *port_mmio,
+               struct mv_host_priv *hpriv = ap->host->private_data;
+               int hardport = mv_hardport_from_port(ap->port_no);
+               void __iomem *hc_mmio = mv_hc_base_from_port(
+-                                      mv_host_base(ap->host), hardport);
++                                      mv_host_base(ap->host), ap->port_no);
+               u32 hc_irq_cause, ipending;
+               /* clear EDMA event indicators, if any */
+diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
+index 8714c36..89e3b7f 100644
+--- a/drivers/ata/sata_nv.c
++++ b/drivers/ata/sata_nv.c
+@@ -305,10 +305,10 @@ static irqreturn_t nv_ck804_interrupt(int irq, void *dev_instance);
+ static int nv_scr_read(struct ata_port *ap, unsigned int sc_reg, u32 *val);
+ static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
++static int nv_noclassify_hardreset(struct ata_link *link, unsigned int *class,
++                                 unsigned long deadline);
+ static void nv_nf2_freeze(struct ata_port *ap);
+ static void nv_nf2_thaw(struct ata_port *ap);
+-static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
+-                          unsigned long deadline);
+ static void nv_ck804_freeze(struct ata_port *ap);
+ static void nv_ck804_thaw(struct ata_port *ap);
+ static int nv_adma_slave_config(struct scsi_device *sdev);
+@@ -352,6 +352,7 @@ enum nv_host_type
+       NFORCE3 = NFORCE2,      /* NF2 == NF3 as far as sata_nv is concerned */
+       CK804,
+       ADMA,
++      MCP5x,
+       SWNCQ,
+ };
+@@ -363,10 +364,10 @@ static const struct pci_device_id nv_pci_tbl[] = {
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_CK804_SATA2), CK804 },
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA), CK804 },
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP04_SATA2), CK804 },
+-      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA), SWNCQ },
+-      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2), SWNCQ },
+-      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA), SWNCQ },
+-      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2), SWNCQ },
++      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA), MCP5x },
++      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP51_SATA2), MCP5x },
++      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA), MCP5x },
++      { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP55_SATA2), MCP5x },
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA), GENERIC },
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA2), GENERIC },
+       { PCI_VDEVICE(NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE_MCP61_SATA3), GENERIC },
+@@ -432,14 +433,19 @@ static struct ata_port_operations nv_nf2_ops = {
+       .inherits               = &nv_common_ops,
+       .freeze                 = nv_nf2_freeze,
+       .thaw                   = nv_nf2_thaw,
+-      .hardreset              = nv_nf2_hardreset,
++      .hardreset              = nv_noclassify_hardreset,
+ };
+-/* CK804 finally gets hardreset right */
++/* For initial probing after boot and hot plugging, hardreset mostly
++ * works fine on CK804 but curiously, reprobing on the initial port by
++ * rescanning or rmmod/insmod fails to acquire the initial D2H Reg FIS
++ * in somewhat undeterministic way.  Use noclassify hardreset.
++ */
+ static struct ata_port_operations nv_ck804_ops = {
+       .inherits               = &nv_common_ops,
+       .freeze                 = nv_ck804_freeze,
+       .thaw                   = nv_ck804_thaw,
++      .hardreset              = nv_noclassify_hardreset,
+       .host_stop              = nv_ck804_host_stop,
+ };
+@@ -467,8 +473,19 @@ static struct ata_port_operations nv_adma_ops = {
+       .host_stop              = nv_adma_host_stop,
+ };
++/* Kernel bz#12351 reports that when SWNCQ is enabled, for hotplug to
++ * work, hardreset should be used and hardreset can't report proper
++ * signature, which suggests that mcp5x is closer to nf2 as long as
++ * reset quirkiness is concerned.  Define separate ops for mcp5x with
++ * nv_noclassify_hardreset().
++ */
++static struct ata_port_operations nv_mcp5x_ops = {
++      .inherits               = &nv_common_ops,
++      .hardreset              = nv_noclassify_hardreset,
++};
++
+ static struct ata_port_operations nv_swncq_ops = {
+-      .inherits               = &nv_generic_ops,
++      .inherits               = &nv_mcp5x_ops,
+       .qc_defer               = ata_std_qc_defer,
+       .qc_prep                = nv_swncq_qc_prep,
+@@ -531,6 +548,15 @@ static const struct ata_port_info nv_port_info[] = {
+               .port_ops       = &nv_adma_ops,
+               .private_data   = NV_PI_PRIV(nv_adma_interrupt, &nv_adma_sht),
+       },
++      /* MCP5x */
++      {
++              .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY,
++              .pio_mask       = NV_PIO_MASK,
++              .mwdma_mask     = NV_MWDMA_MASK,
++              .udma_mask      = NV_UDMA_MASK,
++              .port_ops       = &nv_mcp5x_ops,
++              .private_data   = NV_PI_PRIV(nv_generic_interrupt, &nv_sht),
++      },
+       /* SWNCQ */
+       {
+               .flags          = ATA_FLAG_SATA | ATA_FLAG_NO_LEGACY |
+@@ -1530,6 +1556,17 @@ static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val)
+       return 0;
+ }
++static int nv_noclassify_hardreset(struct ata_link *link, unsigned int *class,
++                                 unsigned long deadline)
++{
++      bool online;
++      int rc;
++
++      rc = sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
++                               &online, NULL);
++      return online ? -EAGAIN : rc;
++}
++
+ static void nv_nf2_freeze(struct ata_port *ap)
+ {
+       void __iomem *scr_addr = ap->host->ports[0]->ioaddr.scr_addr;
+@@ -1554,17 +1591,6 @@ static void nv_nf2_thaw(struct ata_port *ap)
+       iowrite8(mask, scr_addr + NV_INT_ENABLE);
+ }
+-static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
+-                          unsigned long deadline)
+-{
+-      bool online;
+-      int rc;
+-
+-      rc = sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
+-                               &online, NULL);
+-      return online ? -EAGAIN : rc;
+-}
+-
+ static void nv_ck804_freeze(struct ata_port *ap)
+ {
+       void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
+@@ -2355,14 +2381,9 @@ static int nv_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+       if (type == CK804 && adma_enabled) {
+               dev_printk(KERN_NOTICE, &pdev->dev, "Using ADMA mode\n");
+               type = ADMA;
+-      }
+-
+-      if (type == SWNCQ) {
+-              if (swncq_enabled)
+-                      dev_printk(KERN_NOTICE, &pdev->dev,
+-                                 "Using SWNCQ mode\n");
+-              else
+-                      type = GENERIC;
++      } else if (type == MCP5x && swncq_enabled) {
++              dev_printk(KERN_NOTICE, &pdev->dev, "Using SWNCQ mode\n");
++              type = SWNCQ;
+       }
+       ppi[0] = &nv_port_info[type];
+diff --git a/drivers/char/selection.c b/drivers/char/selection.c
+index 2978a49..caf3fa2 100644
+--- a/drivers/char/selection.c
++++ b/drivers/char/selection.c
+@@ -268,7 +268,7 @@ int set_selection(const struct tiocl_selection __user *sel, struct tty_struct *t
+       /* Allocate a new buffer before freeing the old one ... */
+       multiplier = use_unicode ? 3 : 1;  /* chars can take up to 3 bytes */
+-      bp = kmalloc((sel_end-sel_start)/2*multiplier+1, GFP_KERNEL);
++      bp = kmalloc(((sel_end-sel_start)/2+1)*multiplier, GFP_KERNEL);
+       if (!bp) {
+               printk(KERN_WARNING "selection: kmalloc() failed\n");
+               clear_selection();
+diff --git a/drivers/cpuidle/cpuidle.c b/drivers/cpuidle/cpuidle.c
+index 5ce07b5..bb6e3b3 100644
+--- a/drivers/cpuidle/cpuidle.c
++++ b/drivers/cpuidle/cpuidle.c
+@@ -56,7 +56,11 @@ static void cpuidle_idle_call(void)
+               if (pm_idle_old)
+                       pm_idle_old();
+               else
++#if defined(CONFIG_ARCH_HAS_DEFAULT_IDLE)
++                      default_idle();
++#else
+                       local_irq_enable();
++#endif
+               return;
+       }
+@@ -67,8 +71,11 @@ static void cpuidle_idle_call(void)
+       target_state = &dev->states[next_state];
+       /* enter the state and update stats */
+-      dev->last_residency = target_state->enter(dev, target_state);
+       dev->last_state = target_state;
++      dev->last_residency = target_state->enter(dev, target_state);
++      if (dev->last_state)
++              target_state = dev->last_state;
++
+       target_state->time += (unsigned long long)dev->last_residency;
+       target_state->usage++;
+diff --git a/drivers/cpuidle/governors/menu.c b/drivers/cpuidle/governors/menu.c
+index 8d7cf3f..f1df59f 100644
+--- a/drivers/cpuidle/governors/menu.c
++++ b/drivers/cpuidle/governors/menu.c
+@@ -15,12 +15,14 @@
+ #include <linux/tick.h>
+ #define BREAK_FUZZ    4       /* 4 us */
++#define PRED_HISTORY_PCT      50
+ struct menu_device {
+       int             last_state_idx;
+       unsigned int    expected_us;
+       unsigned int    predicted_us;
++      unsigned int    current_predicted_us;
+       unsigned int    last_measured_us;
+       unsigned int    elapsed_us;
+ };
+@@ -47,6 +49,12 @@ static int menu_select(struct cpuidle_device *dev)
+       data->expected_us =
+               (u32) ktime_to_ns(tick_nohz_get_sleep_length()) / 1000;
++      /* Recalculate predicted_us based on prediction_history_pct */
++      data->predicted_us *= PRED_HISTORY_PCT;
++      data->predicted_us += (100 - PRED_HISTORY_PCT) *
++                              data->current_predicted_us;
++      data->predicted_us /= 100;
++
+       /* find the deepest idle state that satisfies our constraints */
+       for (i = CPUIDLE_DRIVER_STATE_START + 1; i < dev->state_count; i++) {
+               struct cpuidle_state *s = &dev->states[i];
+@@ -97,7 +105,7 @@ static void menu_reflect(struct cpuidle_device *dev)
+               measured_us = -1;
+       /* Predict time until next break event */
+-      data->predicted_us = max(measured_us, data->last_measured_us);
++      data->current_predicted_us = max(measured_us, data->last_measured_us);
+       if (last_idle_us + BREAK_FUZZ <
+           data->expected_us - target->exit_latency) {
+diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
+index c694eaa..191f01b 100644
+--- a/drivers/input/keyboard/atkbd.c
++++ b/drivers/input/keyboard/atkbd.c
+@@ -884,6 +884,22 @@ static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd)
+ }
+ /*
++ * Samsung NC10 with Fn+F? key release not working
++ */
++static void atkbd_samsung_keymap_fixup(struct atkbd *atkbd)
++{
++      const unsigned int forced_release_keys[] = {
++              0x82, 0x83, 0x84, 0x86, 0x88, 0x89, 0xb3, 0xf7, 0xf9,
++      };
++      int i;
++
++      if (atkbd->set == 2)
++              for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++)
++                      __set_bit(forced_release_keys[i],
++                                atkbd->force_release_mask);
++}
++
++/*
+  * atkbd_set_keycode_table() initializes keyboard's keycode table
+  * according to the selected scancode set
+  */
+@@ -1486,6 +1502,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
+               .driver_data = atkbd_dell_laptop_keymap_fixup,
+       },
+       {
++              .ident = "Dell Laptop",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Computer Corporation"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
++              },
++              .callback = atkbd_setup_fixup,
++              .driver_data = atkbd_dell_laptop_keymap_fixup,
++      },
++      {
+               .ident = "HP 2133",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
+@@ -1503,6 +1528,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
+               .callback = atkbd_setup_fixup,
+               .driver_data = atkbd_inventec_keymap_fixup,
+       },
++      {
++              .ident = "Samsung NC10",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "NC10"),
++              },
++              .callback = atkbd_setup_fixup,
++              .driver_data = atkbd_samsung_keymap_fixup,
++      },
+       { }
+ };
+diff --git a/drivers/misc/asus-laptop.c b/drivers/misc/asus-laptop.c
+index 7c6dfd0..95965a7 100644
+--- a/drivers/misc/asus-laptop.c
++++ b/drivers/misc/asus-laptop.c
+@@ -139,6 +139,7 @@ ASUS_HANDLE(lcd_switch, "\\_SB.PCI0.SBRG.EC0._Q10",        /* All new models */
+           "\\_SB.PCI0.PX40.ECD0._Q10",        /* L3C */
+           "\\_SB.PCI0.PX40.EC0.Q10",  /* M1A */
+           "\\_SB.PCI0.LPCB.EC0._Q10", /* P30 */
++          "\\_SB.PCI0.LPCB.EC0._Q0E", /* P30/P35 */
+           "\\_SB.PCI0.PX40.Q10",      /* S1x */
+           "\\Q10");           /* A2x, L2D, L3D, M2E */
+@@ -280,7 +281,7 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
+ static int read_wireless_status(int mask)
+ {
+-      ulong status;
++      unsigned long long status;
+       acpi_status rv = AE_OK;
+       if (!wireless_status_handle)
+@@ -297,7 +298,7 @@ static int read_wireless_status(int mask)
+ static int read_gps_status(void)
+ {
+-      ulong status;
++      unsigned long long status;
+       acpi_status rv = AE_OK;
+       rv = acpi_evaluate_integer(gps_status_handle, NULL, NULL, &status);
+@@ -350,7 +351,7 @@ static void write_status(acpi_handle handle, int out, int mask)
+       static void object##_led_set(struct led_classdev *led_cdev,     \
+                                    enum led_brightness value)         \
+       {                                                               \
+-              object##_led_wk = value;                                \
++              object##_led_wk = (value > 0) ? 1 : 0;                  \
+               queue_work(led_workqueue, &object##_led_work);          \
+       }                                                               \
+       static void object##_led_update(struct work_struct *ignored)    \
+@@ -404,7 +405,7 @@ static void lcd_blank(int blank)
+ static int read_brightness(struct backlight_device *bd)
+ {
+-      ulong value;
++      unsigned long long value;
+       acpi_status rv = AE_OK;
+       rv = acpi_evaluate_integer(brightness_get_handle, NULL, NULL, &value);
+@@ -455,7 +456,7 @@ static ssize_t show_infos(struct device *dev,
+                         struct device_attribute *attr, char *page)
+ {
+       int len = 0;
+-      ulong temp;
++      unsigned long long temp;
+       char buf[16];           //enough for all info
+       acpi_status rv = AE_OK;
+@@ -603,7 +604,7 @@ static void set_display(int value)
+ static int read_display(void)
+ {
+-      ulong value = 0;
++      unsigned long long value = 0;
+       acpi_status rv = AE_OK;
+       /* In most of the case, we know how to set the display, but sometime
+@@ -849,7 +850,7 @@ static int asus_hotk_get_info(void)
+ {
+       struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
+       union acpi_object *model = NULL;
+-      ulong bsts_result, hwrs_result;
++      unsigned long long bsts_result, hwrs_result;
+       char *string = NULL;
+       acpi_status status;
+diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c
+index 1ee8501..616bcbd 100644
+--- a/drivers/misc/eeepc-laptop.c
++++ b/drivers/misc/eeepc-laptop.c
+@@ -204,7 +204,7 @@ static int write_acpi_int(acpi_handle handle, const char *method, int val,
+ static int read_acpi_int(acpi_handle handle, const char *method, int *val)
+ {
+       acpi_status status;
+-      ulong result;
++      unsigned long long result;
+       status = acpi_evaluate_integer(handle, (char *)method, NULL, &result);
+       if (ACPI_FAILURE(status)) {
+diff --git a/drivers/misc/fujitsu-laptop.c b/drivers/misc/fujitsu-laptop.c
+index 3e56203..efd395a 100644
+--- a/drivers/misc/fujitsu-laptop.c
++++ b/drivers/misc/fujitsu-laptop.c
+@@ -224,7 +224,7 @@ static int set_lcd_level_alt(int level)
+ static int get_lcd_level(void)
+ {
+-      unsigned long state = 0;
++      unsigned long long state = 0;
+       acpi_status status = AE_OK;
+       vdbg_printk(FUJLAPTOP_DBG_TRACE, "get lcd level via GBLL\n");
+@@ -246,7 +246,7 @@ static int get_lcd_level(void)
+ static int get_max_brightness(void)
+ {
+-      unsigned long state = 0;
++      unsigned long long state = 0;
+       acpi_status status = AE_OK;
+       vdbg_printk(FUJLAPTOP_DBG_TRACE, "get max lcd level via RBLL\n");
+@@ -263,7 +263,7 @@ static int get_max_brightness(void)
+ static int get_lcd_level_alt(void)
+ {
+-      unsigned long state = 0;
++      unsigned long long state = 0;
+       acpi_status status = AE_OK;
+       vdbg_printk(FUJLAPTOP_DBG_TRACE, "get lcd level via GBLS\n");
+@@ -384,7 +384,7 @@ static ssize_t store_lcd_level(struct device *dev,
+ static int get_irb(void)
+ {
+-      unsigned long state = 0;
++      unsigned long long state = 0;
+       acpi_status status = AE_OK;
+       vdbg_printk(FUJLAPTOP_DBG_TRACE, "Get irb\n");
+diff --git a/drivers/misc/intel_menlow.c b/drivers/misc/intel_menlow.c
+index 80a1363..f2257a7 100644
+--- a/drivers/misc/intel_menlow.c
++++ b/drivers/misc/intel_menlow.c
+@@ -57,7 +57,7 @@ static int memory_get_int_max_bandwidth(struct thermal_cooling_device *cdev,
+ {
+       struct acpi_device *device = cdev->devdata;
+       acpi_handle handle = device->handle;
+-      unsigned long value;
++      unsigned long long value;
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
+       acpi_status status = AE_OK;
+@@ -90,7 +90,7 @@ static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev,
+ {
+       struct acpi_device *device = cdev->devdata;
+       acpi_handle handle = device->handle;
+-      unsigned long value;
++      unsigned long long value;
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
+       acpi_status status = AE_OK;
+@@ -104,7 +104,7 @@ static int memory_get_cur_bandwidth(struct thermal_cooling_device *cdev,
+       if (ACPI_FAILURE(status))
+               return -EFAULT;
+-      return sprintf(buf, "%ld\n", value);
++      return sprintf(buf, "%lld\n", value);
+ }
+ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev,
+@@ -115,7 +115,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev,
+       struct acpi_object_list arg_list;
+       union acpi_object arg;
+       acpi_status status;
+-      int temp;
++      unsigned long long temp;
+       unsigned long max_state;
+       if (memory_get_int_max_bandwidth(cdev, &max_state))
+@@ -131,7 +131,7 @@ static int memory_set_cur_bandwidth(struct thermal_cooling_device *cdev,
+       status =
+           acpi_evaluate_integer(handle, MEMORY_SET_BANDWIDTH, &arg_list,
+-                                (unsigned long *)&temp);
++                                &temp);
+       printk(KERN_INFO
+              "Bandwidth value was %d: status is %d\n", state, status);
+@@ -252,7 +252,8 @@ static DEFINE_MUTEX(intel_menlow_attr_lock);
+  * @auxtype : AUX0/AUX1
+  * @buf: syfs buffer
+  */
+-static int sensor_get_auxtrip(acpi_handle handle, int index, int *value)
++static int sensor_get_auxtrip(acpi_handle handle, int index,
++                                                      unsigned long long *value)
+ {
+       acpi_status status;
+@@ -260,7 +261,7 @@ static int sensor_get_auxtrip(acpi_handle handle, int index, int *value)
+               return -EINVAL;
+       status = acpi_evaluate_integer(handle, index ? GET_AUX1 : GET_AUX0,
+-                                     NULL, (unsigned long *)value);
++                                     NULL, value);
+       if (ACPI_FAILURE(status))
+               return -EIO;
+@@ -282,13 +283,13 @@ static int sensor_set_auxtrip(acpi_handle handle, int index, int value)
+       struct acpi_object_list args = {
+               1, &arg
+       };
+-      int temp;
++      unsigned long long temp;
+       if (index != 0 && index != 1)
+               return -EINVAL;
+       status = acpi_evaluate_integer(handle, index ? GET_AUX0 : GET_AUX1,
+-                                     NULL, (unsigned long *)&temp);
++                                     NULL, &temp);
+       if (ACPI_FAILURE(status))
+               return -EIO;
+       if ((index && value < temp) || (!index && value > temp))
+@@ -296,7 +297,7 @@ static int sensor_set_auxtrip(acpi_handle handle, int index, int value)
+       arg.integer.value = value;
+       status = acpi_evaluate_integer(handle, index ? SET_AUX1 : SET_AUX0,
+-                                     &args, (unsigned long *)&temp);
++                                     &args, &temp);
+       if (ACPI_FAILURE(status))
+               return -EIO;
+@@ -312,7 +313,7 @@ static ssize_t aux0_show(struct device *dev,
+                        struct device_attribute *dev_attr, char *buf)
+ {
+       struct intel_menlow_attribute *attr = to_intel_menlow_attr(dev_attr);
+-      int value;
++      unsigned long long value;
+       int result;
+       result = sensor_get_auxtrip(attr->handle, 0, &value);
+@@ -324,7 +325,7 @@ static ssize_t aux1_show(struct device *dev,
+                        struct device_attribute *dev_attr, char *buf)
+ {
+       struct intel_menlow_attribute *attr = to_intel_menlow_attr(dev_attr);
+-      int value;
++      unsigned long long value;
+       int result;
+       result = sensor_get_auxtrip(attr->handle, 1, &value);
+@@ -376,7 +377,7 @@ static ssize_t bios_enabled_show(struct device *dev,
+                                struct device_attribute *attr, char *buf)
+ {
+       acpi_status status;
+-      unsigned long bios_enabled;
++      unsigned long long bios_enabled;
+       status = acpi_evaluate_integer(NULL, BIOS_ENABLED, NULL, &bios_enabled);
+       if (ACPI_FAILURE(status))
+@@ -492,7 +493,7 @@ static int __init intel_menlow_module_init(void)
+ {
+       int result = -ENODEV;
+       acpi_status status;
+-      unsigned long enable;
++      unsigned long long enable;
+       if (acpi_disabled)
+               return result;
+diff --git a/drivers/net/ixgb/ixgb_main.c b/drivers/net/ixgb/ixgb_main.c
+index aa75385..be3c7dc 100644
+--- a/drivers/net/ixgb/ixgb_main.c
++++ b/drivers/net/ixgb/ixgb_main.c
+@@ -977,15 +977,17 @@ ixgb_clean_rx_ring(struct ixgb_adapter *adapter)
+       for (i = 0; i < rx_ring->count; i++) {
+               buffer_info = &rx_ring->buffer_info[i];
+-              if (buffer_info->skb) {
+-
++              if (buffer_info->dma) {
+                       pci_unmap_single(pdev,
+                                        buffer_info->dma,
+                                        buffer_info->length,
+                                        PCI_DMA_FROMDEVICE);
++                      buffer_info->dma = 0;
++                      buffer_info->length = 0;
++              }
++              if (buffer_info->skb) {
+                       dev_kfree_skb(buffer_info->skb);
+-
+                       buffer_info->skb = NULL;
+               }
+       }
+diff --git a/drivers/pci/hotplug/acpiphp_glue.c b/drivers/pci/hotplug/acpiphp_glue.c
+index a3e4705..3baee56 100644
+--- a/drivers/pci/hotplug/acpiphp_glue.c
++++ b/drivers/pci/hotplug/acpiphp_glue.c
+@@ -180,7 +180,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
+       struct acpiphp_func *newfunc;
+       acpi_handle tmp;
+       acpi_status status = AE_OK;
+-      unsigned long adr, sun;
++      unsigned long long adr, sun;
+       int device, function, retval;
+       status = acpi_evaluate_integer(handle, "_ADR", NULL, &adr);
+@@ -528,7 +528,7 @@ find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+       acpi_status status;
+       acpi_handle dummy_handle;
+-      unsigned long tmp;
++      unsigned long long tmp;
+       int device, function;
+       struct pci_dev *dev;
+       struct pci_bus *pci_bus = context;
+@@ -573,7 +573,7 @@ find_p2p_bridge(acpi_handle handle, u32 lvl, void *context, void **rv)
+ static int add_bridge(acpi_handle handle)
+ {
+       acpi_status status;
+-      unsigned long tmp;
++      unsigned long long tmp;
+       int seg, bus;
+       acpi_handle dummy_handle;
+       struct pci_bus *pci_bus;
+@@ -767,7 +767,7 @@ static int get_gsi_base(acpi_handle handle, u32 *gsi_base)
+ {
+       acpi_status status;
+       int result = -1;
+-      unsigned long gsb;
++      unsigned long long gsb;
+       struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
+       union acpi_object *obj;
+       void *table;
+@@ -808,7 +808,7 @@ static acpi_status
+ ioapic_add(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+       acpi_status status;
+-      unsigned long sta;
++      unsigned long long sta;
+       acpi_handle tmp;
+       struct pci_dev *pdev;
+       u32 gsi_base;
+@@ -872,7 +872,7 @@ static acpi_status
+ ioapic_remove(acpi_handle handle, u32 lvl, void *context, void **rv)
+ {
+       acpi_status status;
+-      unsigned long sta;
++      unsigned long long sta;
+       acpi_handle tmp;
+       u32 gsi_base;
+       struct acpiphp_ioapic *pos, *n, *ioapic = NULL;
+@@ -1264,7 +1264,7 @@ static int disable_device(struct acpiphp_slot *slot)
+ static unsigned int get_slot_status(struct acpiphp_slot *slot)
+ {
+       acpi_status status;
+-      unsigned long sta = 0;
++      unsigned long long sta = 0;
+       u32 dvid;
+       struct list_head *l;
+       struct acpiphp_func *func;
+diff --git a/drivers/pci/hotplug/acpiphp_ibm.c b/drivers/pci/hotplug/acpiphp_ibm.c
+index 2b7c45e..881fdd2 100644
+--- a/drivers/pci/hotplug/acpiphp_ibm.c
++++ b/drivers/pci/hotplug/acpiphp_ibm.c
+@@ -183,7 +183,7 @@ static int ibm_set_attention_status(struct hotplug_slot *slot, u8 status)
+       union acpi_object args[2]; 
+       struct acpi_object_list params = { .pointer = args, .count = 2 };
+       acpi_status stat; 
+-      unsigned long rc;
++      unsigned long long rc;
+       union apci_descriptor *ibm_slot;
+       ibm_slot = ibm_slot_from_id(hpslot_to_sun(slot));
+@@ -204,7 +204,7 @@ static int ibm_set_attention_status(struct hotplug_slot *slot, u8 status)
+               err("APLS evaluation failed:  0x%08x\n", stat);
+               return -ENODEV;
+       } else if (!rc) {
+-              err("APLS method failed:  0x%08lx\n", rc);
++              err("APLS method failed:  0x%08llx\n", rc);
+               return -ERANGE;
+       }
+       return 0;
+diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c
+index d748698..3eee709 100644
+--- a/drivers/pci/hotplug/sgi_hotplug.c
++++ b/drivers/pci/hotplug/sgi_hotplug.c
+@@ -413,7 +413,7 @@ static int enable_slot(struct hotplug_slot *bss_hotplug_slot)
+       /*
+        * Add the slot's devices to the ACPI infrastructure */
+       if (SN_ACPI_BASE_SUPPORT() && ssdt) {
+-              unsigned long adr;
++              unsigned long long adr;
+               struct acpi_device *pdevice;
+               struct acpi_device *device;
+               acpi_handle phandle;
+@@ -505,7 +505,7 @@ static int disable_slot(struct hotplug_slot *bss_hotplug_slot)
+       /* free the ACPI resources for the slot */
+       if (SN_ACPI_BASE_SUPPORT() &&
+             PCI_CONTROLLER(slot->pci_bus)->acpi_handle) {
+-              unsigned long adr;
++              unsigned long long adr;
+               struct acpi_device *device;
+               acpi_handle phandle;
+               acpi_handle chandle = NULL;
+diff --git a/drivers/serial/jsm/jsm_tty.c b/drivers/serial/jsm/jsm_tty.c
+index a697914..3fc7e0f 100644
+--- a/drivers/serial/jsm/jsm_tty.c
++++ b/drivers/serial/jsm/jsm_tty.c
+@@ -161,6 +161,11 @@ static void jsm_tty_stop_rx(struct uart_port *port)
+       channel->ch_bd->bd_ops->disable_receiver(channel);
+ }
++static void jsm_tty_enable_ms(struct uart_port *port)
++{
++      /* Nothing needed */
++}
++
+ static void jsm_tty_break(struct uart_port *port, int break_state)
+ {
+       unsigned long lock_flags;
+@@ -345,6 +350,7 @@ static struct uart_ops jsm_ops = {
+       .start_tx       = jsm_tty_start_tx,
+       .send_xchar     = jsm_tty_send_xchar,
+       .stop_rx        = jsm_tty_stop_rx,
++      .enable_ms      = jsm_tty_enable_ms,
+       .break_ctl      = jsm_tty_break,
+       .startup        = jsm_tty_open,
+       .shutdown       = jsm_tty_close,
+diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c
+index d8b0ba5..9c4a76a 100644
+--- a/drivers/usb/host/isp1760-if.c
++++ b/drivers/usb/host/isp1760-if.c
+@@ -129,23 +129,23 @@ static struct of_platform_driver isp1760_of_driver = {
+ #endif
+ #ifdef CONFIG_PCI
+-static u32 nxp_pci_io_base;
+-static u32 iolength;
+-static u32 pci_mem_phy0;
+-static u32 length;
+-static u8 __iomem *chip_addr;
+-static u8 __iomem *iobase;
+-
+ static int __devinit isp1761_pci_probe(struct pci_dev *dev,
+               const struct pci_device_id *id)
+ {
+       u8 latency, limit;
+       __u32 reg_data;
+       int retry_count;
+-      int length;
+-      int status = 1;
+       struct usb_hcd *hcd;
+       unsigned int devflags = 0;
++      int ret_status = 0;
++
++      resource_size_t pci_mem_phy0;
++      resource_size_t memlength;
++
++      u8 __iomem *chip_addr;
++      u8 __iomem *iobase;
++      resource_size_t nxp_pci_io_base;
++      resource_size_t iolength;
+       if (usb_disabled())
+               return -ENODEV;
+@@ -168,26 +168,30 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev,
+       iobase = ioremap_nocache(nxp_pci_io_base, iolength);
+       if (!iobase) {
+               printk(KERN_ERR "ioremap #1\n");
+-              release_mem_region(nxp_pci_io_base, iolength);
+-              return -ENOMEM;
++              ret_status = -ENOMEM;
++              goto cleanup1;
+       }
+       /* Grab the PLX PCI shared memory of the ISP 1761 we need  */
+       pci_mem_phy0 = pci_resource_start(dev, 3);
+-      length = pci_resource_len(dev, 3);
+-
+-      if (length < 0xffff) {
+-              printk(KERN_ERR "memory length for this resource is less than "
+-                              "required\n");
+-              release_mem_region(nxp_pci_io_base, iolength);
+-              iounmap(iobase);
+-              return  -ENOMEM;
++      memlength = pci_resource_len(dev, 3);
++      if (memlength < 0xffff) {
++              printk(KERN_ERR "memory length for this resource is wrong\n");
++              ret_status = -ENOMEM;
++              goto cleanup2;
+       }
+-      if (!request_mem_region(pci_mem_phy0, length, "ISP-PCI")) {
++      if (!request_mem_region(pci_mem_phy0, memlength, "ISP-PCI")) {
+               printk(KERN_ERR "host controller already in use\n");
+-              release_mem_region(nxp_pci_io_base, iolength);
+-              iounmap(iobase);
+-              return -EBUSY;
++              ret_status = -EBUSY;
++              goto cleanup2;
++      }
++
++      /* map available memory */
++      chip_addr = ioremap_nocache(pci_mem_phy0,memlength);
++      if (!chip_addr) {
++              printk(KERN_ERR "Error ioremap failed\n");
++              ret_status = -ENOMEM;
++              goto cleanup3;
+       }
+       /* bad pci latencies can contribute to overruns */
+@@ -210,38 +214,54 @@ static int __devinit isp1761_pci_probe(struct pci_dev *dev,
+                * */
+               writel(0xface, chip_addr + HC_SCRATCH_REG);
+               udelay(100);
+-              reg_data = readl(chip_addr + HC_SCRATCH_REG);
++              reg_data = readl(chip_addr + HC_SCRATCH_REG) & 0x0000ffff;
+               retry_count--;
+       }
++      iounmap(chip_addr);
++
+       /* Host Controller presence is detected by writing to scratch register
+        * and reading back and checking the contents are same or not
+        */
+       if (reg_data != 0xFACE) {
+               err("scratch register mismatch %x", reg_data);
+-              goto clean;
++              ret_status = -ENOMEM;
++              goto cleanup3;
+       }
+       pci_set_master(dev);
+-      status = readl(iobase + 0x68);
+-      status |= 0x900;
+-      writel(status, iobase + 0x68);
++      /* configure PLX PCI chip to pass interrupts */
++#define PLX_INT_CSR_REG 0x68
++      reg_data = readl(iobase + PLX_INT_CSR_REG);
++      reg_data |= 0x900;
++      writel(reg_data, iobase + PLX_INT_CSR_REG);
+       dev->dev.dma_mask = NULL;
+-      hcd = isp1760_register(pci_mem_phy0, length, dev->irq,
++      hcd = isp1760_register(pci_mem_phy0, memlength, dev->irq,
+               IRQF_SHARED | IRQF_DISABLED, &dev->dev, dev_name(&dev->dev),
+               devflags);
++      if (IS_ERR(hcd)) {
++              ret_status = -ENODEV;
++              goto cleanup3;
++      }
++
++      /* done with PLX IO access */
++      iounmap(iobase);
++      release_mem_region(nxp_pci_io_base, iolength);
++
+       pci_set_drvdata(dev, hcd);
+-      if (!hcd)
+-              return 0;
+-clean:
+-      status = -ENODEV;
++      return 0;
++
++cleanup3:
++      release_mem_region(pci_mem_phy0, memlength);
++cleanup2:
+       iounmap(iobase);
+-      release_mem_region(pci_mem_phy0, length);
++cleanup1:
+       release_mem_region(nxp_pci_io_base, iolength);
+-      return status;
++      return ret_status;
+ }
++
+ static void isp1761_pci_remove(struct pci_dev *dev)
+ {
+       struct usb_hcd *hcd;
+@@ -254,12 +274,6 @@ static void isp1761_pci_remove(struct pci_dev *dev)
+       usb_put_hcd(hcd);
+       pci_disable_device(dev);
+-
+-      iounmap(iobase);
+-      iounmap(chip_addr);
+-
+-      release_mem_region(nxp_pci_io_base, iolength);
+-      release_mem_region(pci_mem_phy0, length);
+ }
+ static void isp1761_pci_shutdown(struct pci_dev *dev)
+diff --git a/drivers/video/aty/mach64_ct.c b/drivers/video/aty/mach64_ct.c
+index c50c7cf..2745b85 100644
+--- a/drivers/video/aty/mach64_ct.c
++++ b/drivers/video/aty/mach64_ct.c
+@@ -8,6 +8,9 @@
+ #include <asm/io.h>
+ #include <video/mach64.h>
+ #include "atyfb.h"
++#ifdef CONFIG_PPC
++#include <asm/machdep.h>
++#endif
+ #undef DEBUG
+@@ -536,6 +539,14 @@ static int __devinit aty_init_pll_ct(const struct fb_info *info,
+       pll->ct.xclk_post_div_real = postdividers[xpost_div];
+       pll->ct.mclk_fb_div = q * pll->ct.xclk_post_div_real / 8;
++#ifdef CONFIG_PPC
++      if (machine_is(powermac)) {
++              /* Override PLL_EXT_CNTL & 0x07. */
++              pll->ct.xclk_post_div = xpost_div;
++              pll->ct.xclk_ref_div = 1;
++      }
++#endif
++
+ #ifdef DEBUG
+       pllmclk = (1000000 * pll->ct.mclk_fb_mult * pll->ct.mclk_fb_div) /
+                       (par->ref_clk_per * pll->ct.pll_ref_div);
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 223647f..f254235 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -1349,7 +1349,7 @@ cifs_parse_mount_options(char *options, const char *devname,
+ }
+ static struct TCP_Server_Info *
+-cifs_find_tcp_session(struct sockaddr *addr)
++cifs_find_tcp_session(struct sockaddr_storage *addr)
+ {
+       struct list_head *tmp;
+       struct TCP_Server_Info *server;
+@@ -1369,11 +1369,11 @@ cifs_find_tcp_session(struct sockaddr *addr)
+               if (server->tcpStatus == CifsNew)
+                       continue;
+-              if (addr->sa_family == AF_INET &&
++              if (addr->ss_family == AF_INET &&
+                   (addr4->sin_addr.s_addr !=
+                    server->addr.sockAddr.sin_addr.s_addr))
+                       continue;
+-              else if (addr->sa_family == AF_INET6 &&
++              else if (addr->ss_family == AF_INET6 &&
+                        memcmp(&server->addr.sockAddr6.sin6_addr,
+                               &addr6->sin6_addr, sizeof(addr6->sin6_addr)))
+                       continue;
+@@ -2027,7 +2027,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       int rc = 0;
+       int xid;
+       struct socket *csocket = NULL;
+-      struct sockaddr addr;
++      struct sockaddr_storage addr;
+       struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
+       struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
+       struct smb_vol volume_info;
+@@ -2039,7 +2039,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+ /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */
+-      memset(&addr, 0, sizeof(struct sockaddr));
++      memset(&addr, 0, sizeof(struct sockaddr_storage));
+       memset(&volume_info, 0, sizeof(struct smb_vol));
+       if (cifs_parse_mount_options(mount_data, devname, &volume_info)) {
+               rc = -EINVAL;
+@@ -2069,9 +2069,9 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+                       rc = cifs_inet_pton(AF_INET6, volume_info.UNCip,
+                                           &sin_server6->sin6_addr.in6_u);
+                       if (rc > 0)
+-                              addr.sa_family = AF_INET6;
++                              addr.ss_family = AF_INET6;
+               } else {
+-                      addr.sa_family = AF_INET;
++                      addr.ss_family = AF_INET;
+               }
+               if (rc <= 0) {
+@@ -2113,7 +2113,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       srvTcp = cifs_find_tcp_session(&addr);
+       if (!srvTcp) { /* create socket */
+-              if (addr.sa_family == AF_INET6) {
++              if (addr.ss_family == AF_INET6) {
+                       cFYI(1, ("attempting ipv6 connect"));
+                       /* BB should we allow ipv6 on port 139? */
+                       /* other OS never observed in Wild doing 139 with v6 */
+@@ -2144,7 +2144,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+               } else {
+                       srvTcp->noblocksnd = volume_info.noblocksnd;
+                       srvTcp->noautotune = volume_info.noautotune;
+-                      if (addr.sa_family == AF_INET6)
++                      if (addr.ss_family == AF_INET6)
+                               memcpy(&srvTcp->addr.sockAddr6, sin_server6,
+                                       sizeof(struct sockaddr_in6));
+                       else
+diff --git a/fs/dlm/plock.c b/fs/dlm/plock.c
+index eba87ff..ca46f11 100644
+--- a/fs/dlm/plock.c
++++ b/fs/dlm/plock.c
+@@ -304,7 +304,9 @@ int dlm_posix_get(dlm_lockspace_t *lockspace, u64 number, struct file *file,
+       if (rv == -ENOENT)
+               rv = 0;
+       else if (rv > 0) {
++              locks_init_lock(fl);
+               fl->fl_type = (op->info.ex) ? F_WRLCK : F_RDLCK;
++              fl->fl_flags = FL_POSIX;
+               fl->fl_pid = op->info.pid;
+               fl->fl_start = op->info.start;
+               fl->fl_end = op->info.end;
+diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
+index 1578d7a..ddcbed8 100644
+--- a/fs/nfsd/nfs4state.c
++++ b/fs/nfsd/nfs4state.c
+@@ -2767,6 +2767,25 @@ out:
+ }
+ /*
++ * The NFSv4 spec allows a client to do a LOCKT without holding an OPEN,
++ * so we do a temporary open here just to get an open file to pass to
++ * vfs_test_lock.  (Arguably perhaps test_lock should be done with an
++ * inode operation.)
++ */
++static int nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock)
++{
++      struct file *file;
++      int err;
++
++      err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file);
++      if (err)
++              return err;
++      err = vfs_test_lock(file, lock);
++      nfsd_close(file);
++      return err;
++}
++
++/*
+  * LOCKT operation
+  */
+ __be32
+@@ -2774,7 +2793,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+           struct nfsd4_lockt *lockt)
+ {
+       struct inode *inode;
+-      struct file file;
+       struct file_lock file_lock;
+       int error;
+       __be32 status;
+@@ -2822,7 +2840,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+               file_lock.fl_owner = (fl_owner_t)lockt->lt_stateowner;
+       file_lock.fl_pid = current->tgid;
+       file_lock.fl_flags = FL_POSIX;
+-      file_lock.fl_lmops = &nfsd_posix_mng_ops;
+       file_lock.fl_start = lockt->lt_offset;
+       if ((lockt->lt_length == ~(u64)0) || LOFF_OVERFLOW(lockt->lt_offset, lockt->lt_length))
+@@ -2832,16 +2849,8 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+       nfs4_transform_lock_offset(&file_lock);
+-      /* vfs_test_lock uses the struct file _only_ to resolve the inode.
+-       * since LOCKT doesn't require an OPEN, and therefore a struct
+-       * file may not exist, pass vfs_test_lock a struct file with
+-       * only the dentry:inode set.
+-       */
+-      memset(&file, 0, sizeof (struct file));
+-      file.f_path.dentry = cstate->current_fh.fh_dentry;
+-
+       status = nfs_ok;
+-      error = vfs_test_lock(&file, &file_lock);
++      error = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock);
+       if (error) {
+               status = nfserrno(error);
+               goto out;
+diff --git a/include/acpi/acpi_bus.h b/include/acpi/acpi_bus.h
+index a5ac0bc..c52f10d 100644
+--- a/include/acpi/acpi_bus.h
++++ b/include/acpi/acpi_bus.h
+@@ -46,7 +46,7 @@ acpi_extract_package(union acpi_object *package,
+ acpi_status
+ acpi_evaluate_integer(acpi_handle handle,
+                     acpi_string pathname,
+-                    struct acpi_object_list *arguments, unsigned long *data);
++                    struct acpi_object_list *arguments, unsigned long long *data);
+ acpi_status
+ acpi_evaluate_reference(acpi_handle handle,
+                       acpi_string pathname,
+diff --git a/include/acpi/actypes.h b/include/acpi/actypes.h
+index 4ea4f40..73d6b1c 100644
+--- a/include/acpi/actypes.h
++++ b/include/acpi/actypes.h
+@@ -1225,8 +1225,8 @@ struct acpi_resource {
+ #pragma pack()
+-#define ACPI_RS_SIZE_MIN                    12
+ #define ACPI_RS_SIZE_NO_DATA                8 /* Id + Length fields */
++#define ACPI_RS_SIZE_MIN                    (u32) ACPI_ROUND_UP_TO_NATIVE_WORD (12)
+ #define ACPI_RS_SIZE(type)                  (u32) (ACPI_RS_SIZE_NO_DATA + sizeof (type))
+ #define ACPI_NEXT_RESOURCE(res)             (struct acpi_resource *)((u8 *) res + res->length)
+diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h
+index 9e7b49b..a5cb0c3 100644
+--- a/include/linux/if_vlan.h
++++ b/include/linux/if_vlan.h
+@@ -114,6 +114,8 @@ extern u16 vlan_dev_vlan_id(const struct net_device *dev);
+ extern int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+                            u16 vlan_tci, int polling);
++extern int vlan_hwaccel_do_receive(struct sk_buff *skb);
++
+ #else
+ static inline struct net_device *vlan_dev_real_dev(const struct net_device *dev)
+ {
+@@ -133,6 +135,11 @@ static inline int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+       BUG();
+       return NET_XMIT_SUCCESS;
+ }
++
++static inline int vlan_hwaccel_do_receive(struct sk_buff *skb)
++{
++      return 0;
++}
+ #endif
+ /**
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 391cbf3..26b59cb 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -2384,6 +2384,7 @@
+ #define PCI_DEVICE_ID_INTEL_ICH7_0    0x27b8
+ #define PCI_DEVICE_ID_INTEL_ICH7_1    0x27b9
+ #define PCI_DEVICE_ID_INTEL_ICH7_30   0x27b0
++#define PCI_DEVICE_ID_INTEL_TGP_LPC   0x27bc
+ #define PCI_DEVICE_ID_INTEL_ICH7_31   0x27bd
+ #define PCI_DEVICE_ID_INTEL_ICH7_17   0x27da
+ #define PCI_DEVICE_ID_INTEL_ICH7_19   0x27dd
+diff --git a/net/8021q/vlan_core.c b/net/8021q/vlan_core.c
+index 916061f..68ced4b 100644
+--- a/net/8021q/vlan_core.c
++++ b/net/8021q/vlan_core.c
+@@ -3,11 +3,20 @@
+ #include <linux/if_vlan.h>
+ #include "vlan.h"
++struct vlan_hwaccel_cb {
++      struct net_device       *dev;
++};
++
++static inline struct vlan_hwaccel_cb *vlan_hwaccel_cb(struct sk_buff *skb)
++{
++      return (struct vlan_hwaccel_cb *)skb->cb;
++}
++
+ /* VLAN rx hw acceleration helper.  This acts like netif_{rx,receive_skb}(). */
+ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+                     u16 vlan_tci, int polling)
+ {
+-      struct net_device_stats *stats;
++      struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb);
+       if (skb_bond_should_drop(skb)) {
+               dev_kfree_skb_any(skb);
+@@ -15,23 +24,35 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+       }
+       skb->vlan_tci = vlan_tci;
++      cb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
++
++      return (polling ? netif_receive_skb(skb) : netif_rx(skb));
++}
++EXPORT_SYMBOL(__vlan_hwaccel_rx);
++
++int vlan_hwaccel_do_receive(struct sk_buff *skb)
++{
++      struct vlan_hwaccel_cb *cb = vlan_hwaccel_cb(skb);
++      struct net_device *dev = cb->dev;
++      struct net_device_stats *stats;
++
+       netif_nit_deliver(skb);
+-      skb->dev = vlan_group_get_device(grp, vlan_tci & VLAN_VID_MASK);
+-      if (skb->dev == NULL) {
+-              dev_kfree_skb_any(skb);
+-              /* Not NET_RX_DROP, this is not being dropped
+-               * due to congestion. */
+-              return NET_RX_SUCCESS;
++      if (dev == NULL) {
++              kfree_skb(skb);
++              return -1;
+       }
+-      skb->dev->last_rx = jiffies;
++
++      skb->dev = dev;
++      skb->priority = vlan_get_ingress_priority(dev, skb->vlan_tci);
+       skb->vlan_tci = 0;
+-      stats = &skb->dev->stats;
++      dev->last_rx = jiffies;
++
++      stats = &dev->stats;
+       stats->rx_packets++;
+       stats->rx_bytes += skb->len;
+-      skb->priority = vlan_get_ingress_priority(skb->dev, vlan_tci);
+       switch (skb->pkt_type) {
+       case PACKET_BROADCAST:
+               break;
+@@ -43,13 +64,12 @@ int __vlan_hwaccel_rx(struct sk_buff *skb, struct vlan_group *grp,
+                * This allows the VLAN to have a different MAC than the
+                * underlying device, and still route correctly. */
+               if (!compare_ether_addr(eth_hdr(skb)->h_dest,
+-                                      skb->dev->dev_addr))
++                                      dev->dev_addr))
+                       skb->pkt_type = PACKET_HOST;
+               break;
+       };
+-      return (polling ? netif_receive_skb(skb) : netif_rx(skb));
++      return 0;
+ }
+-EXPORT_SYMBOL(__vlan_hwaccel_rx);
+ struct net_device *vlan_dev_real_dev(const struct net_device *dev)
+ {
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 5a25896..f7a30f2 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -2187,6 +2187,9 @@ int netif_receive_skb(struct sk_buff *skb)
+       int ret = NET_RX_DROP;
+       __be16 type;
++      if (skb->vlan_tci && vlan_hwaccel_do_receive(skb))
++              return NET_RX_SUCCESS;
++
+       /* if we've gotten here through NAPI, check netpoll */
+       if (netpoll_receive_skb(skb))
+               return NET_RX_DROP;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.15-16 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.15-16
new file mode 100644 (file)
index 0000000..ce84b0e
--- /dev/null
@@ -0,0 +1,2206 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.16
+
+Upstream 2.6.27.16 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/filesystems/sysfs-pci.txt b/Documentation/filesystems/sysfs-pci.txt
+index 68ef488..de99749 100644
+--- a/Documentation/filesystems/sysfs-pci.txt
++++ b/Documentation/filesystems/sysfs-pci.txt
+@@ -9,6 +9,7 @@ that support it.  For example, a given bus might look like this:
+      |   |-- class
+      |   |-- config
+      |   |-- device
++     |   |-- enable
+      |   |-- irq
+      |   |-- local_cpus
+      |   |-- resource
+@@ -32,6 +33,7 @@ files, each with their own function.
+        class             PCI class (ascii, ro)
+        config            PCI config space (binary, rw)
+        device            PCI device (ascii, ro)
++       enable            Whether the device is enabled (ascii, rw)
+        irq               IRQ number (ascii, ro)
+        local_cpus        nearby CPU mask (cpumask, ro)
+        resource                  PCI resource host addresses (ascii, ro)
+@@ -57,10 +59,19 @@ used to do actual device programming from userspace.  Note that some platforms
+ don't support mmapping of certain resources, so be sure to check the return
+ value from any attempted mmap.
++The 'enable' file provides a counter that indicates how many times the device
++has been enabled.  If the 'enable' file currently returns '4', and a '1' is
++echoed into it, it will then return '5'.  Echoing a '0' into it will decrease
++the count.  Even when it returns to 0, though, some of the initialisation
++may not be reversed.
++
+ The 'rom' file is special in that it provides read-only access to the device's
+ ROM file, if available.  It's disabled by default, however, so applications
+ should write the string "1" to the file to enable it before attempting a read
+-call, and disable it following the access by writing "0" to the file.
++call, and disable it following the access by writing "0" to the file.  Note
++that the device must be enabled for a rom read to return data succesfully.
++In the event a driver is not bound to the device, it can be enabled using the
++'enable' file, documented above.
+ Accessing legacy resources through sysfs
+ ----------------------------------------
+diff --git a/Makefile b/Makefile
+index a2dcd97..d398828 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .15
++EXTRAVERSION = .16
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/ia64/sn/kernel/io_acpi_init.c b/arch/ia64/sn/kernel/io_acpi_init.c
+index a15baac..0c3f2a0 100644
+--- a/arch/ia64/sn/kernel/io_acpi_init.c
++++ b/arch/ia64/sn/kernel/io_acpi_init.c
+@@ -434,7 +434,7 @@ sn_acpi_slot_fixup(struct pci_dev *dev)
+               size = pci_resource_len(dev, PCI_ROM_RESOURCE);
+               addr = ioremap(pcidev_info->pdi_pio_mapped_addr[PCI_ROM_RESOURCE],
+                              size);
+-              image_size = pci_get_rom_size(addr, size);
++              image_size = pci_get_rom_size(dev, addr, size);
+               dev->resource[PCI_ROM_RESOURCE].start = (unsigned long) addr;
+               dev->resource[PCI_ROM_RESOURCE].end =
+                                       (unsigned long) addr + image_size - 1;
+diff --git a/arch/ia64/sn/kernel/io_init.c b/arch/ia64/sn/kernel/io_init.c
+index c3aa851..1a3ed90 100644
+--- a/arch/ia64/sn/kernel/io_init.c
++++ b/arch/ia64/sn/kernel/io_init.c
+@@ -269,7 +269,7 @@ sn_io_slot_fixup(struct pci_dev *dev)
+                       rom = ioremap(pci_resource_start(dev, PCI_ROM_RESOURCE),
+                                     size + 1);
+-                      image_size = pci_get_rom_size(rom, size + 1);
++                      image_size = pci_get_rom_size(dev, rom, size + 1);
+                       dev->resource[PCI_ROM_RESOURCE].end =
+                               dev->resource[PCI_ROM_RESOURCE].start +
+                               image_size - 1;
+diff --git a/arch/x86/kernel/apic_32.c b/arch/x86/kernel/apic_32.c
+index f88bd0d..ffc633c 100644
+--- a/arch/x86/kernel/apic_32.c
++++ b/arch/x86/kernel/apic_32.c
+@@ -1115,7 +1115,7 @@ static int __init detect_init_APIC(void)
+       switch (boot_cpu_data.x86_vendor) {
+       case X86_VENDOR_AMD:
+               if ((boot_cpu_data.x86 == 6 && boot_cpu_data.x86_model > 1) ||
+-                  (boot_cpu_data.x86 == 15))
++                  (boot_cpu_data.x86 >= 15))
+                       break;
+               goto no_apic;
+       case X86_VENDOR_INTEL:
+diff --git a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+index dd097b8..9943b4c 100644
+--- a/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
++++ b/arch/x86/kernel/cpu/cpufreq/acpi-cpufreq.c
+@@ -779,6 +779,9 @@ static int __init acpi_cpufreq_init(void)
+ {
+       int ret;
++      if (acpi_disabled)
++              return 0;
++
+       dprintk("acpi_cpufreq_init\n");
+       ret = acpi_cpufreq_early_init();
+diff --git a/arch/x86/mm/fault.c b/arch/x86/mm/fault.c
+index da1973b..3384255 100644
+--- a/arch/x86/mm/fault.c
++++ b/arch/x86/mm/fault.c
+@@ -607,8 +607,6 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
+       si_code = SEGV_MAPERR;
+-      if (notify_page_fault(regs))
+-              return;
+       if (unlikely(kmmio_fault(regs, address)))
+               return;
+@@ -638,6 +636,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
+               if (spurious_fault(address, error_code))
+                       return;
++              /* kprobes don't want to hook the spurious faults. */
++              if (notify_page_fault(regs))
++                      return;
+               /*
+                * Don't take the mm semaphore here. If we fixup a prefetch
+                * fault we could otherwise deadlock.
+@@ -645,6 +646,9 @@ void __kprobes do_page_fault(struct pt_regs *regs, unsigned long error_code)
+               goto bad_area_nosemaphore;
+       }
++      /* kprobes don't want to hook the spurious faults. */
++      if (notify_page_fault(regs))
++              return;
+ #ifdef CONFIG_X86_32
+       /* It's safe to allow irq's after cr2 has been saved and the vmalloc
+diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
+index e28469e..eab790f 100644
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -691,8 +691,14 @@ fdd_out:
+ static ssize_t show_docked(struct device *dev,
+                          struct device_attribute *attr, char *buf)
+ {
+-      return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
++      struct acpi_device *tmp;
++
++      struct dock_station *dock_station = *((struct dock_station **)
++              dev->platform_data);
++      if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
++              return snprintf(buf, PAGE_SIZE, "1\n");
++      return snprintf(buf, PAGE_SIZE, "0\n");
+ }
+ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
+diff --git a/drivers/acpi/executer/exconfig.c b/drivers/acpi/executer/exconfig.c
+index 8892b98..331a114 100644
+--- a/drivers/acpi/executer/exconfig.c
++++ b/drivers/acpi/executer/exconfig.c
+@@ -280,6 +280,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
+               struct acpi_walk_state *walk_state)
+ {
+       union acpi_operand_object *ddb_handle;
++      struct acpi_table_header *table;
+       struct acpi_table_desc table_desc;
+       u32 table_index;
+       acpi_status status;
+@@ -294,9 +295,8 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
+       switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
+       case ACPI_TYPE_REGION:
+-              ACPI_DEBUG_PRINT((ACPI_DB_EXEC, "Load from Region %p %s\n",
+-                                obj_desc,
+-                                acpi_ut_get_object_type_name(obj_desc)));
++              ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
++                                "Load table from Region %p\n", obj_desc));
+               /* Region must be system_memory (from ACPI spec) */
+@@ -316,61 +316,112 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
+               }
+               /*
+-               * We will simply map the memory region for the table. However, the
+-               * memory region is technically not guaranteed to remain stable and
+-               * we may eventually have to copy the table to a local buffer.
++               * Map the table header and get the actual table length. The region
++               * length is not guaranteed to be the same as the table length.
++               */
++              table = acpi_os_map_memory(obj_desc->region.address,
++                                         sizeof(struct acpi_table_header));
++              if (!table) {
++                      return_ACPI_STATUS(AE_NO_MEMORY);
++              }
++
++              length = table->length;
++              acpi_os_unmap_memory(table, sizeof(struct acpi_table_header));
++
++              /* Must have at least an ACPI table header */
++
++              if (length < sizeof(struct acpi_table_header)) {
++                      return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
++              }
++
++              /*
++               * The memory region is not guaranteed to remain stable and we must
++               * copy the table to a local buffer. For example, the memory region
++               * is corrupted after suspend on some machines. Dynamically loaded
++               * tables are usually small, so this overhead is minimal.
+                */
++
++              /* Allocate a buffer for the table */
++
++              table_desc.pointer = ACPI_ALLOCATE(length);
++              if (!table_desc.pointer) {
++                      return_ACPI_STATUS(AE_NO_MEMORY);
++              }
++
++              /* Map the entire table and copy it */
++
++              table = acpi_os_map_memory(obj_desc->region.address, length);
++              if (!table) {
++                      ACPI_FREE(table_desc.pointer);
++                      return_ACPI_STATUS(AE_NO_MEMORY);
++              }
++
++              ACPI_MEMCPY(table_desc.pointer, table, length);
++              acpi_os_unmap_memory(table, length);
++
+               table_desc.address = obj_desc->region.address;
+-              table_desc.length = obj_desc->region.length;
+-              table_desc.flags = ACPI_TABLE_ORIGIN_MAPPED;
+               break;
+       case ACPI_TYPE_BUFFER:  /* Buffer or resolved region_field */
+               ACPI_DEBUG_PRINT((ACPI_DB_EXEC,
+-                                "Load from Buffer or Field %p %s\n", obj_desc,
+-                                acpi_ut_get_object_type_name(obj_desc)));
+-
+-              length = obj_desc->buffer.length;
++                                "Load table from Buffer or Field %p\n",
++                                obj_desc));
+               /* Must have at least an ACPI table header */
+-              if (length < sizeof(struct acpi_table_header)) {
++              if (obj_desc->buffer.length < sizeof(struct acpi_table_header)) {
+                       return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
+               }
+-              /* Validate checksum here. It won't get validated in tb_add_table */
++              /* Get the actual table length from the table header */
+-              status =
+-                  acpi_tb_verify_checksum(ACPI_CAST_PTR
+-                                          (struct acpi_table_header,
+-                                           obj_desc->buffer.pointer), length);
+-              if (ACPI_FAILURE(status)) {
+-                      return_ACPI_STATUS(status);
++              table =
++                  ACPI_CAST_PTR(struct acpi_table_header,
++                                obj_desc->buffer.pointer);
++              length = table->length;
++
++              /* Table cannot extend beyond the buffer */
++
++              if (length > obj_desc->buffer.length) {
++                      return_ACPI_STATUS(AE_AML_BUFFER_LIMIT);
++              }
++              if (length < sizeof(struct acpi_table_header)) {
++                      return_ACPI_STATUS(AE_INVALID_TABLE_LENGTH);
+               }
+               /*
+-               * We need to copy the buffer since the original buffer could be
+-               * changed or deleted in the future
++               * Copy the table from the buffer because the buffer could be modified
++               * or even deleted in the future
+                */
+               table_desc.pointer = ACPI_ALLOCATE(length);
+               if (!table_desc.pointer) {
+                       return_ACPI_STATUS(AE_NO_MEMORY);
+               }
+-              ACPI_MEMCPY(table_desc.pointer, obj_desc->buffer.pointer,
+-                          length);
+-              table_desc.length = length;
+-              table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
++              ACPI_MEMCPY(table_desc.pointer, table, length);
++              table_desc.address = ACPI_TO_INTEGER(table_desc.pointer);
+               break;
+       default:
+               return_ACPI_STATUS(AE_AML_OPERAND_TYPE);
+       }
+-      /*
+-       * Install the new table into the local data structures
+-       */
++      /* Validate table checksum (will not get validated in tb_add_table) */
++
++      status = acpi_tb_verify_checksum(table_desc.pointer, length);
++      if (ACPI_FAILURE(status)) {
++              ACPI_FREE(table_desc.pointer);
++              return_ACPI_STATUS(status);
++      }
++
++      /* Complete the table descriptor */
++
++      table_desc.length = length;
++      table_desc.flags = ACPI_TABLE_ORIGIN_ALLOCATED;
++
++      /* Install the new table into the local data structures */
++
+       status = acpi_tb_add_table(&table_desc, &table_index);
+       if (ACPI_FAILURE(status)) {
+               goto cleanup;
+@@ -379,7 +430,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
+       /*
+        * Add the table to the namespace.
+        *
+-       * Note: We load the table objects relative to the root of the namespace.
++       * Note: Load the table objects relative to the root of the namespace.
+        * This appears to go against the ACPI specification, but we do it for
+        * compatibility with other ACPI implementations.
+        */
+@@ -415,7 +466,7 @@ acpi_ex_load_op(union acpi_operand_object *obj_desc,
+       cleanup:
+       if (ACPI_FAILURE(status)) {
+-              /* Delete allocated buffer or mapping */
++              /* Delete allocated table buffer */
+               acpi_tb_delete_table(&table_desc);
+       }
+diff --git a/drivers/acpi/namespace/nsxfeval.c b/drivers/acpi/namespace/nsxfeval.c
+index 38be586..f3cc376 100644
+--- a/drivers/acpi/namespace/nsxfeval.c
++++ b/drivers/acpi/namespace/nsxfeval.c
+@@ -45,9 +45,14 @@
+ #include <acpi/acpi.h>
+ #include <acpi/acnamesp.h>
+ #include <acpi/acinterp.h>
++#include <acpi/amlcode.h>
+ #define _COMPONENT          ACPI_NAMESPACE
+ ACPI_MODULE_NAME("nsxfeval")
++
++/* Local prototypes */
++static void acpi_ns_resolve_references(struct acpi_evaluate_info *info);
++
+ #ifdef ACPI_FUTURE_USAGE
+ /*******************************************************************************
+  *
+@@ -69,6 +74,7 @@ ACPI_MODULE_NAME("nsxfeval")
+  *              be valid (non-null)
+  *
+  ******************************************************************************/
++
+ acpi_status
+ acpi_evaluate_object_typed(acpi_handle handle,
+                          acpi_string pathname,
+@@ -283,6 +289,10 @@ acpi_evaluate_object(acpi_handle handle,
+                       if (ACPI_SUCCESS(status)) {
++                              /* Dereference Index and ref_of references */
++
++                              acpi_ns_resolve_references(info);
++
+                               /* Get the size of the returned object */
+                               status =
+@@ -352,6 +362,74 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
+ /*******************************************************************************
+  *
++ * FUNCTION:    acpi_ns_resolve_references
++ *
++ * PARAMETERS:  Info                    - Evaluation info block
++ *
++ * RETURN:      Info->return_object is replaced with the dereferenced object
++ *
++ * DESCRIPTION: Dereference certain reference objects. Called before an
++ *              internal return object is converted to an external union acpi_object.
++ *
++ * Performs an automatic dereference of Index and ref_of reference objects.
++ * These reference objects are not supported by the union acpi_object, so this is a
++ * last resort effort to return something useful. Also, provides compatibility
++ * with other ACPI implementations.
++ *
++ * NOTE: does not handle references within returned package objects or nested
++ * references, but this support could be added later if found to be necessary.
++ *
++ ******************************************************************************/
++static void acpi_ns_resolve_references(struct acpi_evaluate_info *info)
++{
++      union acpi_operand_object *obj_desc = NULL;
++      struct acpi_namespace_node *node;
++
++      /* We are interested in reference objects only */
++
++      if (ACPI_GET_OBJECT_TYPE(info->return_object) !=
++          ACPI_TYPE_LOCAL_REFERENCE) {
++              return;
++      }
++
++      /*
++       * Two types of references are supported - those created by Index and
++       * ref_of operators. A name reference (AML_NAMEPATH_OP) can be converted
++       * to an union acpi_object, so it is not dereferenced here. A ddb_handle
++       * (AML_LOAD_OP) cannot be dereferenced, nor can it be converted to
++       * an union acpi_object.
++       */
++      switch (info->return_object->reference.opcode) {
++      case AML_INDEX_OP:
++
++              obj_desc = *(info->return_object->reference.where);
++              break;
++
++      case AML_REF_OF_OP:
++
++              node = info->return_object->reference.object;
++              if (node) {
++                      obj_desc = node->object;
++              }
++              break;
++
++      default:
++              return;
++      }
++
++      /* Replace the existing reference object */
++
++      if (obj_desc) {
++              acpi_ut_add_reference(obj_desc);
++              acpi_ut_remove_reference(info->return_object);
++              info->return_object = obj_desc;
++      }
++
++      return;
++}
++
++/*******************************************************************************
++ *
+  * FUNCTION:    acpi_walk_namespace
+  *
+  * PARAMETERS:  Type                - acpi_object_type to search for
+@@ -379,6 +457,7 @@ ACPI_EXPORT_SYMBOL(acpi_evaluate_object)
+  *              function, etc.
+  *
+  ******************************************************************************/
++
+ acpi_status
+ acpi_walk_namespace(acpi_object_type type,
+                   acpi_handle start_object,
+diff --git a/drivers/acpi/tables.c b/drivers/acpi/tables.c
+index 775c97a..a885295 100644
+--- a/drivers/acpi/tables.c
++++ b/drivers/acpi/tables.c
+@@ -293,7 +293,12 @@ static void __init check_multiple_madt(void)
+ int __init acpi_table_init(void)
+ {
+-      acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
++      acpi_status status;
++
++      status = acpi_initialize_tables(initial_tables, ACPI_MAX_TABLES, 0);
++      if (ACPI_FAILURE(status))
++              return 1;
++
+       check_multiple_madt();
+       return 0;
+ }
+diff --git a/drivers/acpi/tables/tbutils.c b/drivers/acpi/tables/tbutils.c
+index 0cc92ef..f5d7aec 100644
+--- a/drivers/acpi/tables/tbutils.c
++++ b/drivers/acpi/tables/tbutils.c
+@@ -512,10 +512,9 @@ acpi_tb_parse_root_table(acpi_physical_address rsdp_address, u8 flags)
+                       if (ACPI_FAILURE(status)) {
+                               ACPI_WARNING((AE_INFO,
+                                             "Truncating %u table entries!",
+-                                            (unsigned)
+-                                            (acpi_gbl_root_table_list.size -
+-                                             acpi_gbl_root_table_list.
+-                                             count)));
++                                            (unsigned) (table_count -
++                                             (acpi_gbl_root_table_list.
++                                             count - 2))));
+                               break;
+                       }
+               }
+diff --git a/drivers/acpi/video.c b/drivers/acpi/video.c
+index 42e1e84..a953b5d 100644
+--- a/drivers/acpi/video.c
++++ b/drivers/acpi/video.c
+@@ -36,6 +36,7 @@
+ #include <linux/backlight.h>
+ #include <linux/thermal.h>
+ #include <linux/video_output.h>
++#include <linux/sort.h>
+ #include <asm/uaccess.h>
+ #include <acpi/acpi_bus.h>
+@@ -632,6 +633,16 @@ acpi_video_bus_DOS(struct acpi_video_bus *video, int bios_flag, int lcd_flag)
+ }
+ /*
++ * Simple comparison function used to sort backlight levels.
++ */
++
++static int
++acpi_video_cmp_level(const void *a, const void *b)
++{
++      return *(int *)a - *(int *)b;
++}
++
++/*
+  *  Arg:      
+  *    device  : video output device (LCD, CRT, ..)
+  *
+@@ -682,6 +693,10 @@ acpi_video_init_brightness(struct acpi_video_device *device)
+               count++;
+       }
++      /* don't sort the first two brightness levels */
++      sort(&br->levels[2], count - 2, sizeof(br->levels[2]),
++              acpi_video_cmp_level, NULL);
++
+       if (count < 2)
+               goto out_free_levels;
+@@ -997,7 +1012,7 @@ acpi_video_device_brightness_seq_show(struct seq_file *seq, void *offset)
+       }
+       seq_printf(seq, "levels: ");
+-      for (i = 0; i < dev->brightness->count; i++)
++      for (i = 2; i < dev->brightness->count; i++)
+               seq_printf(seq, " %d", dev->brightness->levels[i]);
+       seq_printf(seq, "\ncurrent: %d\n", dev->brightness->curr);
+@@ -1036,7 +1051,7 @@ acpi_video_device_write_brightness(struct file *file,
+               return -EFAULT;
+       /* validate through the list of available levels */
+-      for (i = 0; i < dev->brightness->count; i++)
++      for (i = 2; i < dev->brightness->count; i++)
+               if (level == dev->brightness->levels[i]) {
+                       if (ACPI_SUCCESS
+                           (acpi_video_device_lcd_set_level(dev, level)))
+@@ -1689,7 +1704,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
+       max = max_below = 0;
+       min = min_above = 255;
+       /* Find closest level to level_current */
+-      for (i = 0; i < device->brightness->count; i++) {
++      for (i = 2; i < device->brightness->count; i++) {
+               l = device->brightness->levels[i];
+               if (abs(l - level_current) < abs(delta)) {
+                       delta = l - level_current;
+@@ -1699,7 +1714,7 @@ acpi_video_get_next_level(struct acpi_video_device *device,
+       }
+       /* Ajust level_current to closest available level */
+       level_current += delta;
+-      for (i = 0; i < device->brightness->count; i++) {
++      for (i = 2; i < device->brightness->count; i++) {
+               l = device->brightness->levels[i];
+               if (l < min)
+                       min = l;
+@@ -1983,6 +1998,12 @@ static int acpi_video_bus_add(struct acpi_device *device)
+                       device->pnp.bus_id[3] = '0' + instance;
+               instance ++;
+       }
++      /* a hack to fix the duplicate name "VGA" problem on Pa 3553 */
++      if (!strcmp(device->pnp.bus_id, "VGA")) {
++              if (instance)
++                      device->pnp.bus_id[3] = '0' + instance;
++              instance++;
++      }
+       video->device = device;
+       strcpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
+diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
+index f1fe749..5eb23fa 100644
+--- a/drivers/char/agp/intel-agp.c
++++ b/drivers/char/agp/intel-agp.c
+@@ -40,6 +40,8 @@
+ #define PCI_DEVICE_ID_INTEL_Q45_IG          0x2E12
+ #define PCI_DEVICE_ID_INTEL_G45_HB          0x2E20
+ #define PCI_DEVICE_ID_INTEL_G45_IG          0x2E22
++#define PCI_DEVICE_ID_INTEL_G41_HB          0x2E30
++#define PCI_DEVICE_ID_INTEL_G41_IG          0x2E32
+ /* cover 915 and 945 variants */
+ #define IS_I915 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_E7221_HB || \
+@@ -63,7 +65,8 @@
+ #define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_E_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
+-              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB)
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB || \
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G41_HB)
+ extern int agp_memory_reserved;
+@@ -214,8 +217,8 @@ static int intel_i810_configure(void)
+       if (agp_bridge->driver->needs_scratch_page) {
+               for (i = 0; i < current_size->num_entries; i++) {
+                       writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
+-                      readl(intel_private.registers+I810_PTE_BASE+(i*4));     /* PCI posting. */
+               }
++              readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI posting. */
+       }
+       global_cache_flush();
+       return 0;
+@@ -775,8 +778,8 @@ static int intel_i830_configure(void)
+       if (agp_bridge->driver->needs_scratch_page) {
+               for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
+                       writel(agp_bridge->scratch_page, intel_private.registers+I810_PTE_BASE+(i*4));
+-                      readl(intel_private.registers+I810_PTE_BASE+(i*4));     /* PCI Posting. */
+               }
++              readl(intel_private.registers+I810_PTE_BASE+((i-1)*4)); /* PCI Posting. */
+       }
+       global_cache_flush();
+@@ -991,8 +994,8 @@ static int intel_i915_configure(void)
+       if (agp_bridge->driver->needs_scratch_page) {
+               for (i = intel_private.gtt_entries; i < current_size->num_entries; i++) {
+                       writel(agp_bridge->scratch_page, intel_private.gtt+i);
+-                      readl(intel_private.gtt+i);     /* PCI Posting. */
+               }
++              readl(intel_private.gtt+i-1);   /* PCI Posting. */
+       }
+       global_cache_flush();
+@@ -1196,6 +1199,7 @@ static void intel_i965_get_gtt_range(int *gtt_offset, int *gtt_size)
+       case PCI_DEVICE_ID_INTEL_IGD_E_HB:
+       case PCI_DEVICE_ID_INTEL_Q45_HB:
+       case PCI_DEVICE_ID_INTEL_G45_HB:
++      case PCI_DEVICE_ID_INTEL_G41_HB:
+               *gtt_offset = *gtt_size = MB(2);
+               break;
+       default:
+@@ -2128,13 +2132,15 @@ static const struct intel_driver_description {
+       { PCI_DEVICE_ID_INTEL_Q33_HB, PCI_DEVICE_ID_INTEL_Q33_IG, 0, "Q33",
+               NULL, &intel_g33_driver },
+       { PCI_DEVICE_ID_INTEL_GM45_HB, PCI_DEVICE_ID_INTEL_GM45_IG, 0,
+-          "Mobile Intel? GM45 Express", NULL, &intel_i965_driver },
++          "Mobile Intel® GM45 Express", NULL, &intel_i965_driver },
+       { PCI_DEVICE_ID_INTEL_IGD_E_HB, PCI_DEVICE_ID_INTEL_IGD_E_IG, 0,
+           "Intel Integrated Graphics Device", NULL, &intel_i965_driver },
+       { PCI_DEVICE_ID_INTEL_Q45_HB, PCI_DEVICE_ID_INTEL_Q45_IG, 0,
+           "Q45/Q43", NULL, &intel_i965_driver },
+       { PCI_DEVICE_ID_INTEL_G45_HB, PCI_DEVICE_ID_INTEL_G45_IG, 0,
+           "G45/G43", NULL, &intel_i965_driver },
++      { PCI_DEVICE_ID_INTEL_G41_HB, PCI_DEVICE_ID_INTEL_G41_IG, 0,
++          "G41", NULL, &intel_i965_driver },
+       { 0, 0, 0, NULL, NULL, NULL }
+ };
+@@ -2332,6 +2338,7 @@ static struct pci_device_id agp_intel_pci_table[] = {
+       ID(PCI_DEVICE_ID_INTEL_IGD_E_HB),
+       ID(PCI_DEVICE_ID_INTEL_Q45_HB),
+       ID(PCI_DEVICE_ID_INTEL_G45_HB),
++      ID(PCI_DEVICE_ID_INTEL_G41_HB),
+       { }
+ };
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index d429499..372267d 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -301,7 +301,7 @@ static void scrup(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
+       d = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
+       s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * (t + nr));
+       scr_memmovew(d, s, (b - t - nr) * vc->vc_size_row);
+-      scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_scrl_erase_char,
++      scr_memsetw(d + (b - t - nr) * vc->vc_cols, vc->vc_video_erase_char,
+                   vc->vc_size_row * nr);
+ }
+@@ -319,7 +319,7 @@ static void scrdown(struct vc_data *vc, unsigned int t, unsigned int b, int nr)
+       s = (unsigned short *)(vc->vc_origin + vc->vc_size_row * t);
+       step = vc->vc_cols * nr;
+       scr_memmovew(s + step, s, (b - t - nr) * vc->vc_size_row);
+-      scr_memsetw(s, vc->vc_scrl_erase_char, 2 * step);
++      scr_memsetw(s, vc->vc_video_erase_char, 2 * step);
+ }
+ static void do_update_region(struct vc_data *vc, unsigned long start, int count)
+@@ -434,7 +434,6 @@ static void update_attr(struct vc_data *vc)
+                     vc->vc_blink, vc->vc_underline,
+                     vc->vc_reverse ^ vc->vc_decscnm, vc->vc_italic);
+       vc->vc_video_erase_char = (build_attr(vc, vc->vc_color, 1, vc->vc_blink, 0, vc->vc_decscnm, 0) << 8) | ' ';
+-      vc->vc_scrl_erase_char = (build_attr(vc, vc->vc_def_color, 1, false, false, vc->vc_decscnm, false) << 8) | ' ';
+ }
+ /* Note: inverting the screen twice should revert to the original state */
+diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
+index 595759c..cd589ca 100644
+--- a/drivers/firewire/fw-ohci.c
++++ b/drivers/firewire/fw-ohci.c
+@@ -226,7 +226,7 @@ static inline struct fw_ohci *fw_ohci(struct fw_card *card)
+ #define CONTEXT_DEAD  0x0800
+ #define CONTEXT_ACTIVE        0x0400
+-#define OHCI1394_MAX_AT_REQ_RETRIES   0x2
++#define OHCI1394_MAX_AT_REQ_RETRIES   0xf
+ #define OHCI1394_MAX_AT_RESP_RETRIES  0x2
+ #define OHCI1394_MAX_PHYS_RESP_RETRIES        0x8
+diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
+index 64142c1..716370c 100644
+--- a/drivers/firewire/fw-sbp2.c
++++ b/drivers/firewire/fw-sbp2.c
+@@ -350,15 +350,17 @@ static const struct {
+               .model                  = ~0,
+               .workarounds            = SBP2_WORKAROUND_128K_MAX_TRANS,
+       },
+-
+       /*
+-       * There are iPods (2nd gen, 3rd gen) with model_id == 0, but
+-       * these iPods do not feature the read_capacity bug according
+-       * to one report.  Read_capacity behaviour as well as model_id
+-       * could change due to Apple-supplied firmware updates though.
++       * iPod 2nd generation: needs 128k max transfer size workaround
++       * iPod 3rd generation: needs fix capacity workaround
+        */
+-
+-      /* iPod 4th generation. */ {
++      {
++              .firmware_revision      = 0x0a2700,
++              .model                  = 0x000000,
++              .workarounds            = SBP2_WORKAROUND_128K_MAX_TRANS |
++                                        SBP2_WORKAROUND_FIX_CAPACITY,
++      },
++      /* iPod 4th generation */ {
+               .firmware_revision      = 0x0a2700,
+               .model                  = 0x000021,
+               .workarounds            = SBP2_WORKAROUND_FIX_CAPACITY,
+@@ -1293,6 +1295,19 @@ static struct fw_driver sbp2_driver = {
+       .id_table = sbp2_id_table,
+ };
++static void sbp2_unmap_scatterlist(struct device *card_device,
++                                 struct sbp2_command_orb *orb)
++{
++      if (scsi_sg_count(orb->cmd))
++              dma_unmap_sg(card_device, scsi_sglist(orb->cmd),
++                           scsi_sg_count(orb->cmd),
++                           orb->cmd->sc_data_direction);
++
++      if (orb->request.misc & cpu_to_be32(COMMAND_ORB_PAGE_TABLE_PRESENT))
++              dma_unmap_single(card_device, orb->page_table_bus,
++                               sizeof(orb->page_table), DMA_TO_DEVICE);
++}
++
+ static unsigned int
+ sbp2_status_to_sense_data(u8 *sbp2_status, u8 *sense_data)
+ {
+@@ -1372,15 +1387,7 @@ complete_command_orb(struct sbp2_orb *base_orb, struct sbp2_status *status)
+       dma_unmap_single(device->card->device, orb->base.request_bus,
+                        sizeof(orb->request), DMA_TO_DEVICE);
+-
+-      if (scsi_sg_count(orb->cmd) > 0)
+-              dma_unmap_sg(device->card->device, scsi_sglist(orb->cmd),
+-                           scsi_sg_count(orb->cmd),
+-                           orb->cmd->sc_data_direction);
+-
+-      if (orb->page_table_bus != 0)
+-              dma_unmap_single(device->card->device, orb->page_table_bus,
+-                               sizeof(orb->page_table), DMA_TO_DEVICE);
++      sbp2_unmap_scatterlist(device->card->device, orb);
+       orb->cmd->result = result;
+       orb->done(orb->cmd);
+@@ -1530,8 +1537,10 @@ static int sbp2_scsi_queuecommand(struct scsi_cmnd *cmd, scsi_done_fn_t done)
+       orb->base.request_bus =
+               dma_map_single(device->card->device, &orb->request,
+                              sizeof(orb->request), DMA_TO_DEVICE);
+-      if (dma_mapping_error(device->card->device, orb->base.request_bus))
++      if (dma_mapping_error(device->card->device, orb->base.request_bus)) {
++              sbp2_unmap_scatterlist(device->card->device, orb);
+               goto out;
++      }
+       sbp2_send_orb(&orb->base, lu, lu->tgt->node_id, lu->generation,
+                     lu->command_block_agent_address + SBP2_ORB_POINTER);
+diff --git a/drivers/ieee1394/ohci1394.h b/drivers/ieee1394/ohci1394.h
+index 4320bf0..7fb8ab9 100644
+--- a/drivers/ieee1394/ohci1394.h
++++ b/drivers/ieee1394/ohci1394.h
+@@ -26,7 +26,7 @@
+ #define OHCI1394_DRIVER_NAME      "ohci1394"
+-#define OHCI1394_MAX_AT_REQ_RETRIES   0x2
++#define OHCI1394_MAX_AT_REQ_RETRIES   0xf
+ #define OHCI1394_MAX_AT_RESP_RETRIES  0x2
+ #define OHCI1394_MAX_PHYS_RESP_RETRIES        0x8
+ #define OHCI1394_MAX_SELF_ID_ERRORS   16
+diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
+index bad46ea..0c0fdbb 100644
+--- a/drivers/ieee1394/sbp2.c
++++ b/drivers/ieee1394/sbp2.c
+@@ -395,6 +395,16 @@ static const struct {
+               .model_id               = SBP2_ROM_VALUE_WILDCARD,
+               .workarounds            = SBP2_WORKAROUND_128K_MAX_TRANS,
+       },
++      /*
++       * iPod 2nd generation: needs 128k max transfer size workaround
++       * iPod 3rd generation: needs fix capacity workaround
++       */
++      {
++              .firmware_revision      = 0x0a2700,
++              .model_id               = 0x000000,
++              .workarounds            = SBP2_WORKAROUND_128K_MAX_TRANS |
++                                        SBP2_WORKAROUND_FIX_CAPACITY,
++      },
+       /* iPod 4th generation */ {
+               .firmware_revision      = 0x0a2700,
+               .model_id               = 0x000021,
+diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
+index c2fcf28..61f5753 100644
+--- a/drivers/md/dm-mpath.c
++++ b/drivers/md/dm-mpath.c
+@@ -427,13 +427,13 @@ static void process_queued_ios(struct work_struct *work)
+               __choose_pgpath(m);
+       pgpath = m->current_pgpath;
+-      m->pgpath_to_activate = m->current_pgpath;
+       if ((pgpath && !m->queue_io) ||
+           (!pgpath && !m->queue_if_no_path))
+               must_queue = 0;
+-      if (m->pg_init_required && !m->pg_init_in_progress) {
++      if (m->pg_init_required && !m->pg_init_in_progress && pgpath) {
++              m->pgpath_to_activate = pgpath;
+               m->pg_init_count++;
+               m->pg_init_required = 0;
+               m->pg_init_in_progress = 1;
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index fe6eccd..60f3e59 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -1454,6 +1454,11 @@ static int bind_rdev_to_array(mdk_rdev_t * rdev, mddev_t * mddev)
+               if (find_rdev_nr(mddev, rdev->desc_nr))
+                       return -EBUSY;
+       }
++      if (mddev->max_disks && rdev->desc_nr >= mddev->max_disks) {
++              printk(KERN_WARNING "md: %s: array is limited to %d devices\n",
++                     mdname(mddev), mddev->max_disks);
++              return -EBUSY;
++      }
+       bdevname(rdev->bdev,b);
+       while ( (s=strchr(b, '/')) != NULL)
+               *s = '!';
+@@ -2362,6 +2367,15 @@ static void analyze_sbs(mddev_t * mddev)
+       i = 0;
+       rdev_for_each(rdev, tmp, mddev) {
++              if (rdev->desc_nr >= mddev->max_disks ||
++                  i > mddev->max_disks) {
++                      printk(KERN_WARNING
++                             "md: %s: %s: only %d devices permitted\n",
++                             mdname(mddev), bdevname(rdev->bdev, b),
++                             mddev->max_disks);
++                      kick_rdev_from_array(rdev);
++                      continue;
++              }
+               if (rdev != freshest)
+                       if (super_types[mddev->major_version].
+                           validate_super(mddev, rdev)) {
+@@ -2728,9 +2742,9 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
+               break;
+       case read_auto:
+               if (mddev->pers) {
+-                      if (mddev->ro != 1)
++                      if (mddev->ro == 0)
+                               err = do_md_stop(mddev, 1, 0);
+-                      else
++                      else if (mddev->ro == 1)
+                               err = restart_array(mddev);
+                       if (err == 0) {
+                               mddev->ro = 2;
+@@ -2946,7 +2960,13 @@ metadata_store(mddev_t *mddev, const char *buf, size_t len)
+ {
+       int major, minor;
+       char *e;
+-      if (!list_empty(&mddev->disks))
++      /* Changing the details of 'external' metadata is
++       * always permitted.  Otherwise there must be
++       * no devices attached to the array.
++       */
++      if (mddev->external && strncmp(buf, "external:", 9) == 0)
++              ;
++      else if (!list_empty(&mddev->disks))
+               return -EBUSY;
+       if (cmd_match(buf, "none")) {
+@@ -4450,13 +4470,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
+        * noticed in interrupt contexts ...
+        */
+-      if (rdev->desc_nr == mddev->max_disks) {
+-              printk(KERN_WARNING "%s: can not hot-add to full array!\n",
+-                      mdname(mddev));
+-              err = -EBUSY;
+-              goto abort_unbind_export;
+-      }
+-
+       rdev->raid_disk = -1;
+       md_update_sb(mddev, 1);
+@@ -4470,9 +4483,6 @@ static int hot_add_disk(mddev_t * mddev, dev_t dev)
+       md_new_event(mddev);
+       return 0;
+-abort_unbind_export:
+-      unbind_rdev_from_array(rdev);
+-
+ abort_export:
+       export_rdev(rdev);
+       return err;
+diff --git a/drivers/misc/eeepc-laptop.c b/drivers/misc/eeepc-laptop.c
+index 616bcbd..13a8996 100644
+--- a/drivers/misc/eeepc-laptop.c
++++ b/drivers/misc/eeepc-laptop.c
+@@ -381,7 +381,8 @@ static void notify_wlan(u32 *event)
+ static void notify_brn(void)
+ {
+       struct backlight_device *bd = eeepc_backlight_device;
+-      bd->props.brightness = read_brightness(bd);
++      if (bd)
++              bd->props.brightness = read_brightness(bd);
+ }
+ static void eeepc_hotk_notify(acpi_handle handle, u32 event, void *data)
+diff --git a/drivers/misc/sgi-xp/xpc.h b/drivers/misc/sgi-xp/xpc.h
+index 619208d..bcf3782 100644
+--- a/drivers/misc/sgi-xp/xpc.h
++++ b/drivers/misc/sgi-xp/xpc.h
+@@ -3,7 +3,7 @@
+  * License.  See the file "COPYING" in the main directory of this archive
+  * for more details.
+  *
+- * Copyright (c) 2004-2008 Silicon Graphics, Inc.  All Rights Reserved.
++ * Copyright (c) 2004-2009 Silicon Graphics, Inc.  All Rights Reserved.
+  */
+ /*
+@@ -502,7 +502,8 @@ struct xpc_channel_uv {
+                                               /* partition's notify mq */
+       struct xpc_send_msg_slot_uv *send_msg_slots;
+-      struct xpc_notify_mq_msg_uv *recv_msg_slots;
++      void *recv_msg_slots;   /* each slot will hold a xpc_notify_mq_msg_uv */
++                              /* structure plus the user's payload */
+       struct xpc_fifo_head_uv msg_slot_free_list;
+       struct xpc_fifo_head_uv recv_msg_list;  /* deliverable payloads */
+diff --git a/drivers/misc/sgi-xp/xpc_uv.c b/drivers/misc/sgi-xp/xpc_uv.c
+index b8f8d50..1bb8bc5 100644
+--- a/drivers/misc/sgi-xp/xpc_uv.c
++++ b/drivers/misc/sgi-xp/xpc_uv.c
+@@ -3,7 +3,7 @@
+  * License.  See the file "COPYING" in the main directory of this archive
+  * for more details.
+  *
+- * Copyright (c) 2008 Silicon Graphics, Inc.  All Rights Reserved.
++ * Copyright (c) 2008-2009 Silicon Graphics, Inc.  All Rights Reserved.
+  */
+ /*
+@@ -825,8 +825,8 @@ xpc_allocate_recv_msg_slot_uv(struct xpc_channel *ch)
+                       continue;
+               for (entry = 0; entry < nentries; entry++) {
+-                      msg_slot = ch_uv->recv_msg_slots + entry *
+-                          ch->entry_size;
++                      msg_slot = ch_uv->recv_msg_slots +
++                          entry * ch->entry_size;
+                       msg_slot->hdr.msg_slot_number = entry;
+               }
+@@ -1123,9 +1123,8 @@ xpc_handle_notify_mq_msg_uv(struct xpc_partition *part,
+       /* we're dealing with a normal message sent via the notify_mq */
+       ch_uv = &ch->sn.uv;
+-      msg_slot = (struct xpc_notify_mq_msg_uv *)((u64)ch_uv->recv_msg_slots +
+-                  (msg->hdr.msg_slot_number % ch->remote_nentries) *
+-                  ch->entry_size);
++      msg_slot = ch_uv->recv_msg_slots +
++          (msg->hdr.msg_slot_number % ch->remote_nentries) * ch->entry_size;
+       BUG_ON(msg->hdr.msg_slot_number != msg_slot->hdr.msg_slot_number);
+       BUG_ON(msg_slot->hdr.size != 0);
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index 872ea58..6b96357 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -31,7 +31,7 @@
+ char e1000_driver_name[] = "e1000";
+ static char e1000_driver_string[] = "Intel(R) PRO/1000 Network Driver";
+-#define DRV_VERSION "7.3.20-k3-NAPI"
++#define DRV_VERSION "7.3.21-k3-NAPI"
+ const char e1000_driver_version[] = DRV_VERSION;
+ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation.";
+@@ -927,7 +927,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+               err = pci_enable_device(pdev);
+       } else {
+               bars = pci_select_bars(pdev, IORESOURCE_MEM);
+-              err = pci_enable_device(pdev);
++              err = pci_enable_device_mem(pdev);
+       }
+       if (err)
+               return err;
+@@ -3835,7 +3835,7 @@ static irqreturn_t e1000_intr(int irq, void *data)
+       struct e1000_hw *hw = &adapter->hw;
+       u32 rctl, icr = er32(ICR);
+-      if (unlikely(!icr))
++      if (unlikely((!icr) || test_bit(__E1000_RESETTING, &adapter->flags)))
+               return IRQ_NONE;  /* Not our interrupt */
+       /* IMS will not auto-mask if INT_ASSERTED is not set, and if it is
+diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
+index 6e42b5a..5790194 100644
+--- a/drivers/net/usb/hso.c
++++ b/drivers/net/usb/hso.c
+@@ -2047,7 +2047,7 @@ static void hso_create_rfkill(struct hso_device *hso_dev,
+       char *rfkn;
+       hso_net->rfkill = rfkill_allocate(&interface_to_usbdev(interface)->dev,
+-                               RFKILL_TYPE_WLAN);
++                               RFKILL_TYPE_WWAN);
+       if (!hso_net->rfkill) {
+               dev_err(dev, "%s - Out of memory", __func__);
+               return;
+diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
+index dcce354..966c86c 100644
+--- a/drivers/net/wireless/ipw2200.c
++++ b/drivers/net/wireless/ipw2200.c
+@@ -4346,7 +4346,8 @@ static void ipw_handle_missed_beacon(struct ipw_priv *priv,
+               return;
+       }
+-      if (priv->status & STATUS_SCANNING) {
++      if (priv->status & STATUS_SCANNING &&
++          missed_count > IPW_MB_SCAN_CANCEL_THRESHOLD) {
+               /* Stop scan to keep fw from getting
+                * stuck (only if we aren't roaming --
+                * otherwise we'll never scan more than 2 or 3
+@@ -6276,6 +6277,20 @@ static void ipw_add_scan_channels(struct ipw_priv *priv,
+       }
+ }
++static int ipw_passive_dwell_time(struct ipw_priv *priv)
++{
++      /* staying on passive channels longer than the DTIM interval during a
++       * scan, while associated, causes the firmware to cancel the scan
++       * without notification. Hence, don't stay on passive channels longer
++       * than the beacon interval.
++       */
++      if (priv->status & STATUS_ASSOCIATED
++          && priv->assoc_network->beacon_interval > 10)
++              return priv->assoc_network->beacon_interval - 10;
++      else
++              return 120;
++}
++
+ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
+ {
+       struct ipw_scan_request_ext scan;
+@@ -6319,16 +6334,16 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
+       scan.full_scan_index = cpu_to_le32(ieee80211_get_scans(priv->ieee));
+       if (type == IW_SCAN_TYPE_PASSIVE) {
+-              IPW_DEBUG_WX("use passive scanning\n");
+-              scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN;
++              IPW_DEBUG_WX("use passive scanning\n");
++              scan_type = IPW_SCAN_PASSIVE_FULL_DWELL_SCAN;
+               scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
+-                      cpu_to_le16(120);
++                      cpu_to_le16(ipw_passive_dwell_time(priv));
+               ipw_add_scan_channels(priv, &scan, scan_type);
+               goto send_request;
+       }
+       /* Use active scan by default. */
+-      if (priv->config & CFG_SPEED_SCAN)
++      if (priv->config & CFG_SPEED_SCAN)
+               scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_SCAN] =
+                       cpu_to_le16(30);
+       else
+@@ -6338,7 +6353,8 @@ static int ipw_request_scan_helper(struct ipw_priv *priv, int type, int direct)
+       scan.dwell_time[IPW_SCAN_ACTIVE_BROADCAST_AND_DIRECT_SCAN] =
+               cpu_to_le16(20);
+-      scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] = cpu_to_le16(120);
++      scan.dwell_time[IPW_SCAN_PASSIVE_FULL_DWELL_SCAN] =
++              cpu_to_le16(ipw_passive_dwell_time(priv));
+       scan.dwell_time[IPW_SCAN_ACTIVE_DIRECT_SCAN] = cpu_to_le16(20);
+ #ifdef CONFIG_IPW2200_MONITOR
+diff --git a/drivers/net/wireless/ipw2200.h b/drivers/net/wireless/ipw2200.h
+index d4ab28b..60b4e71 100644
+--- a/drivers/net/wireless/ipw2200.h
++++ b/drivers/net/wireless/ipw2200.h
+@@ -244,6 +244,7 @@ enum connection_manager_assoc_states {
+ #define HOST_NOTIFICATION_S36_MEASUREMENT_REFUSED       31
+ #define HOST_NOTIFICATION_STATUS_BEACON_MISSING         1
++#define IPW_MB_SCAN_CANCEL_THRESHOLD                    3
+ #define IPW_MB_ROAMING_THRESHOLD_MIN                    1
+ #define IPW_MB_ROAMING_THRESHOLD_DEFAULT                8
+ #define IPW_MB_ROAMING_THRESHOLD_MAX                    30
+diff --git a/drivers/pci/pci-sysfs.c b/drivers/pci/pci-sysfs.c
+index 77baff0..3f2309f 100644
+--- a/drivers/pci/pci-sysfs.c
++++ b/drivers/pci/pci-sysfs.c
+@@ -694,8 +694,8 @@ pci_read_rom(struct kobject *kobj, struct bin_attribute *bin_attr,
+               return -EINVAL;
+       
+       rom = pci_map_rom(pdev, &size); /* size starts out as PCI window size */
+-      if (!rom)
+-              return 0;
++      if (!rom || !size)
++              return -EIO;
+               
+       if (off >= size)
+               count = 0;
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 8a82a62..e4df84b 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -713,9 +713,9 @@ void pcie_aspm_exit_link_state(struct pci_dev *pdev)
+       /*
+        * All PCIe functions are in one slot, remove one function will remove
+-       * the the whole slot, so just wait
++       * the whole slot, so just wait until we are the last function left.
+        */
+-      if (!list_empty(&parent->subordinate->devices))
++      if (!list_is_last(&pdev->bus_list, &parent->subordinate->devices))
+               goto out;
+       /* All functions are removed, so just disable ASPM for the link */
+diff --git a/drivers/pci/rom.c b/drivers/pci/rom.c
+index bd5c0e0..b2bac71 100644
+--- a/drivers/pci/rom.c
++++ b/drivers/pci/rom.c
+@@ -63,7 +63,7 @@ static void pci_disable_rom(struct pci_dev *pdev)
+  * The PCI window size could be much larger than the
+  * actual image size.
+  */
+-size_t pci_get_rom_size(void __iomem *rom, size_t size)
++size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size)
+ {
+       void __iomem *image;
+       int last_image;
+@@ -72,8 +72,10 @@ size_t pci_get_rom_size(void __iomem *rom, size_t size)
+       do {
+               void __iomem *pds;
+               /* Standard PCI ROMs start out with these bytes 55 AA */
+-              if (readb(image) != 0x55)
++              if (readb(image) != 0x55) {
++                      dev_err(&pdev->dev, "Invalid ROM contents\n");
+                       break;
++              }
+               if (readb(image + 1) != 0xAA)
+                       break;
+               /* get the PCI data structure and check its signature */
+@@ -158,7 +160,7 @@ void __iomem *pci_map_rom(struct pci_dev *pdev, size_t *size)
+        * size is much larger than the actual size of the ROM.
+        * True size is important if the ROM is going to be copied.
+        */
+-      *size = pci_get_rom_size(rom, *size);
++      *size = pci_get_rom_size(pdev, rom, *size);
+       return rom;
+ }
+diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
+index fd0695b..056071d 100644
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -599,6 +599,10 @@ static int pci_netmos_init(struct pci_dev *dev)
+       /* subdevice 0x00PS means <P> parallel, <S> serial */
+       unsigned int num_serial = dev->subsystem_device & 0xf;
++      if (dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
++                      dev->subsystem_device == 0x0299)
++              return 0;
++
+       if (num_serial == 0)
+               return -ENODEV;
+       return num_serial;
+@@ -766,6 +770,8 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
+ #define PCI_SUBDEVICE_ID_OCTPRO422    0x0208
+ #define PCI_SUBDEVICE_ID_POCTAL232    0x0308
+ #define PCI_SUBDEVICE_ID_POCTAL422    0x0408
++#define PCI_VENDOR_ID_ADVANTECH               0x13fe
++#define PCI_DEVICE_ID_ADVANTECH_PCI3620       0x3620
+ /* Unknown vendors/cards - this should not be in linux/pci_ids.h */
+ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584       0x1584
+@@ -2051,6 +2057,10 @@ static int pciserial_resume_one(struct pci_dev *dev)
+ #endif
+ static struct pci_device_id serial_pci_tbl[] = {
++      /* Advantech use PCI_DEVICE_ID_ADVANTECH_PCI3620 (0x3620) as 'PCI_SUBVENDOR_ID' */
++      {       PCI_VENDOR_ID_ADVANTECH, PCI_DEVICE_ID_ADVANTECH_PCI3620,
++              PCI_DEVICE_ID_ADVANTECH_PCI3620, 0x0001, 0, 0,
++              pbn_b2_8_921600 },
+       {       PCI_VENDOR_ID_V3, PCI_DEVICE_ID_V3_V960,
+               PCI_SUBVENDOR_ID_CONNECT_TECH,
+               PCI_SUBDEVICE_ID_CONNECT_TECH_BH8_232, 0, 0,
+@@ -2294,6 +2304,9 @@ static struct pci_device_id serial_pci_tbl[] = {
+                * For now just used the hex ID 0x950a.
+                */
+       {       PCI_VENDOR_ID_OXSEMI, 0x950a,
++              PCI_SUBVENDOR_ID_SIIG, PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL, 0, 0,
++              pbn_b0_2_115200 },
++      {       PCI_VENDOR_ID_OXSEMI, 0x950a,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+               pbn_b0_2_1130000 },
+       {       PCI_VENDOR_ID_OXSEMI, PCI_DEVICE_ID_OXSEMI_16PCI954,
+@@ -2846,6 +2859,10 @@ static struct pci_device_id serial_pci_tbl[] = {
+               0,
+               pbn_b0_8_115200 },
++      {       PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9835,
++              PCI_VENDOR_ID_IBM, 0x0299,
++              0, 0, pbn_b0_bt_2_115200 },
++
+       /*
+        * These entries match devices with class COMMUNICATION_SERIAL,
+        * COMMUNICATION_MODEM or COMMUNICATION_MULTISERIAL
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index b205311..876bf36 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -192,14 +192,15 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define NOVATELWIRELESS_PRODUCT_MC950D                0x4400
+ /* FUTURE NOVATEL PRODUCTS */
+-#define NOVATELWIRELESS_PRODUCT_EVDO_1                0x6000
+-#define NOVATELWIRELESS_PRODUCT_HSPA_1                0x7000
+-#define NOVATELWIRELESS_PRODUCT_EMBEDDED_1    0x8000
+-#define NOVATELWIRELESS_PRODUCT_GLOBAL_1      0x9000
+-#define NOVATELWIRELESS_PRODUCT_EVDO_2                0x6001
+-#define NOVATELWIRELESS_PRODUCT_HSPA_2                0x7001
+-#define NOVATELWIRELESS_PRODUCT_EMBEDDED_2    0x8001
+-#define NOVATELWIRELESS_PRODUCT_GLOBAL_2      0x9001
++#define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED        0X6000
++#define NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED        0X6001
++#define NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED        0X7000
++#define NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED        0X7001
++#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED       0X8000
++#define NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED       0X8001
++#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED       0X9000
++#define NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED       0X9001
++#define NOVATELWIRELESS_PRODUCT_GLOBAL                0XA001
+ /* AMOI PRODUCTS */
+ #define AMOI_VENDOR_ID                                0x1614
+@@ -209,6 +210,27 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define DELL_VENDOR_ID                                0x413C
++/* Dell modems */
++#define DELL_PRODUCT_5700_MINICARD            0x8114
++#define DELL_PRODUCT_5500_MINICARD            0x8115
++#define DELL_PRODUCT_5505_MINICARD            0x8116
++#define DELL_PRODUCT_5700_EXPRESSCARD         0x8117
++#define DELL_PRODUCT_5510_EXPRESSCARD         0x8118
++
++#define DELL_PRODUCT_5700_MINICARD_SPRINT     0x8128
++#define DELL_PRODUCT_5700_MINICARD_TELUS      0x8129
++
++#define DELL_PRODUCT_5720_MINICARD_VZW                0x8133
++#define DELL_PRODUCT_5720_MINICARD_SPRINT     0x8134
++#define DELL_PRODUCT_5720_MINICARD_TELUS      0x8135
++#define DELL_PRODUCT_5520_MINICARD_CINGULAR   0x8136
++#define DELL_PRODUCT_5520_MINICARD_GENERIC_L  0x8137
++#define DELL_PRODUCT_5520_MINICARD_GENERIC_I  0x8138
++
++#define DELL_PRODUCT_5730_MINICARD_SPRINT     0x8180
++#define DELL_PRODUCT_5730_MINICARD_TELUS      0x8181
++#define DELL_PRODUCT_5730_MINICARD_VZW                0x8182
++
+ #define KYOCERA_VENDOR_ID                     0x0c88
+ #define KYOCERA_PRODUCT_KPC650                        0x17da
+ #define KYOCERA_PRODUCT_KPC680                        0x180a
+@@ -267,12 +289,6 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define ERICSSON_VENDOR_ID                    0x0bdb
+ #define ERICSSON_PRODUCT_F3507G                       0x1900
+-/* Pantech products */
+-#define PANTECH_VENDOR_ID                     0x106c
+-#define PANTECH_PRODUCT_PC5740                        0x3701
+-#define PANTECH_PRODUCT_PC5750                        0x3702  /* PX-500 */
+-#define PANTECH_PRODUCT_UM150                 0x3711
+-
+ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -383,31 +399,37 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_1) }, /* Novatel EVDO product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_1) }, /* Novatel HSPA product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_1) }, /* Novatel Embedded product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_1) }, /* Novatel Global product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_2) }, /* Novatel EVDO product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_2) }, /* Novatel HSPA product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EMBEDDED_2) }, /* Novatel Embedded product */
+-      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL_2) }, /* Novatel Global product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_FULLSPEED) }, /* Novatel HSPA Embedded product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_HIGHSPEED) }, /* Novatel EVDO product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_HIGHSPEED) }, /* Novatel HSPA product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_HIGHSPEED) }, /* Novatel EVDO Embedded product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_EMBEDDED_HIGHSPEED) }, /* Novatel HSPA Embedded product */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_GLOBAL) }, /* Novatel Global product */
+       { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01) },
+       { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H01A) },
+       { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_H02) },
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8114) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8115) }, /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8116) }, /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8117) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8118) }, /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8128) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8129) }, /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8133) }, /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD) },             /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite EV620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5500_MINICARD) },             /* Dell Wireless 5500 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5505_MINICARD) },             /* Dell Wireless 5505 Mobile Broadband HSDPA Mini-Card == Novatel Expedite EU740 HSDPA/3G */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_EXPRESSCARD) },          /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO ExpressCard == Novatel Merlin XV620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5510_EXPRESSCARD) },          /* Dell Wireless 5510 Mobile Broadband HSDPA ExpressCard == Novatel Merlin XU870 HSDPA/3G */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_SPRINT) },      /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite E720 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5700_MINICARD_TELUS) },       /* Dell Wireless 5700 Mobile Broadband CDMA/EVDO Mini-Card == Novatel Expedite ET620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_VZW) },         /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_SPRINT) },      /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5720_MINICARD_TELUS) },       /* Dell Wireless 5720 == Novatel EV620 CDMA/EV-DO */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },    /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },   /* Dell Wireless HSDPA 5520 */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },   /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
++      { USB_DEVICE(DELL_VENDOR_ID, 0x8147) },                                 /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },      /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },       /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
++      { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) },         /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* ADU-E100, ADU-310 */
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
+@@ -476,9 +498,6 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+       { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
+-      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
+-      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
+-      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
+       { } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
+index 9a3e495..d8c41ae 100644
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -227,25 +227,32 @@ static unsigned int product_5052_count;
+ /* the array dimension is the number of default entries plus */
+ /* TI_EXTRA_VID_PID_COUNT user defined entries plus 1 terminating */
+ /* null entry */
+-static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = {
++static struct usb_device_id ti_id_table_3410[10+TI_EXTRA_VID_PID_COUNT+1] = {
+       { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
+ };
+-static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = {
++static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
+ };
+-static struct usb_device_id ti_id_table_combined[] = {
++static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = {
+       { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_454B_PRODUCT_ID) },
++      { USB_DEVICE(IBM_VENDOR_ID, IBM_454C_PRODUCT_ID) },
+       { }
+ };
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h
+index b5541bf..d4e4d7e 100644
+--- a/drivers/usb/serial/ti_usb_3410_5052.h
++++ b/drivers/usb/serial/ti_usb_3410_5052.h
+@@ -27,7 +27,11 @@
+ /* Vendor and product ids */
+ #define TI_VENDOR_ID                  0x0451
++#define IBM_VENDOR_ID                 0x04b3
+ #define TI_3410_PRODUCT_ID            0x3410
++#define IBM_4543_PRODUCT_ID           0x4543
++#define IBM_454B_PRODUCT_ID           0x454b
++#define IBM_454C_PRODUCT_ID           0x454c
+ #define TI_3410_EZ430_ID              0xF430  /* TI ez430 development tool */
+ #define TI_5052_BOOT_PRODUCT_ID               0x5052  /* no EEPROM, no firmware */
+ #define TI_5152_BOOT_PRODUCT_ID               0x5152  /* no EEPROM, no firmware */
+diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
+index 620c2b5..8daaace 100644
+--- a/drivers/usb/storage/scsiglue.c
++++ b/drivers/usb/storage/scsiglue.c
+@@ -64,6 +64,7 @@
+  */
+ #define VENDOR_ID_NOKIA               0x0421
+ #define VENDOR_ID_NIKON               0x04b0
++#define VENDOR_ID_PENTAX      0x0a17
+ #define VENDOR_ID_MOTOROLA    0x22b8
+ /***********************************************************************
+@@ -150,6 +151,7 @@ static int slave_configure(struct scsi_device *sdev)
+               switch (le16_to_cpu(us->pusb_dev->descriptor.idVendor)) {
+               case VENDOR_ID_NOKIA:
+               case VENDOR_ID_NIKON:
++              case VENDOR_ID_PENTAX:
+               case VENDOR_ID_MOTOROLA:
+                       if (!(us->fflags & (US_FL_FIX_CAPACITY |
+                                       US_FL_CAPACITY_OK)))
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index aae786c..d775cfe 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1381,21 +1381,6 @@ UNUSUAL_DEV( 0x0a17, 0x0004, 0x1000, 0x1000,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_INQUIRY ),
+-
+-/* Submitted by Per Winkvist <per.winkvist@uk.com> */
+-UNUSUAL_DEV( 0x0a17, 0x006, 0x0000, 0xffff,
+-              "Pentax",
+-              "Optio S/S4",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_INQUIRY ),
+-
+-/* Reported by Jaak Ristioja <Ristioja@gmail.com> */
+-UNUSUAL_DEV( 0x0a17, 0x006e, 0x0100, 0x0100,
+-              "Pentax",
+-              "K10D",
+-              US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_FIX_CAPACITY ),
+-
+ /* These are virtual windows driver CDs, which the zd1211rw driver
+  * automatically converts into WLAN devices. */
+ UNUSUAL_DEV( 0x0ace, 0x2011, 0x0101, 0x0101,
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 038ea62..93a080e 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -1855,8 +1855,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+       struct fb_info *info = registered_fb[con2fb_map[vc->vc_num]];
+       struct display *p = &fb_display[vc->vc_num];
+       int scroll_partial = info->flags & FBINFO_PARTIAL_PAN_OK;
+-      unsigned short saved_ec;
+-      int ret;
+       if (fbcon_is_inactive(vc, info))
+               return -EINVAL;
+@@ -1869,11 +1867,6 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+        *           whole screen (prevents flicker).
+        */
+-      saved_ec = vc->vc_video_erase_char;
+-      vc->vc_video_erase_char = vc->vc_scrl_erase_char;
+-
+-      ret = 0;
+-
+       switch (dir) {
+       case SM_UP:
+               if (count > vc->vc_rows)        /* Maximum realistic size */
+@@ -1890,9 +1883,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+                       scr_memsetw((unsigned short *) (vc->vc_origin +
+                                                       vc->vc_size_row *
+                                                       (b - count)),
+-                                  vc->vc_scrl_erase_char,
++                                  vc->vc_video_erase_char,
+                                   vc->vc_size_row * count);
+-                      ret = 1;
++                      return 1;
+                       break;
+               case SCROLL_WRAP_MOVE:
+@@ -1962,10 +1955,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+                       scr_memsetw((unsigned short *) (vc->vc_origin +
+                                                       vc->vc_size_row *
+                                                       (b - count)),
+-                                  vc->vc_scrl_erase_char,
++                                  vc->vc_video_erase_char,
+                                   vc->vc_size_row * count);
+-                      ret = 1;
+-                      break;
++                      return 1;
+               }
+               break;
+@@ -1982,9 +1974,9 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+                       scr_memsetw((unsigned short *) (vc->vc_origin +
+                                                       vc->vc_size_row *
+                                                       t),
+-                                  vc->vc_scrl_erase_char,
++                                  vc->vc_video_erase_char,
+                                   vc->vc_size_row * count);
+-                      ret = 1;
++                      return 1;
+                       break;
+               case SCROLL_WRAP_MOVE:
+@@ -2052,15 +2044,12 @@ static int fbcon_scroll(struct vc_data *vc, int t, int b, int dir,
+                       scr_memsetw((unsigned short *) (vc->vc_origin +
+                                                       vc->vc_size_row *
+                                                       t),
+-                                  vc->vc_scrl_erase_char,
++                                  vc->vc_video_erase_char,
+                                   vc->vc_size_row * count);
+-                      ret = 1;
+-                      break;
++                      return 1;
+               }
+-              break;
+       }
+-      vc->vc_video_erase_char = saved_ec;
+-      return ret;
++      return 0;
+ }
+@@ -2522,9 +2511,6 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
+                       c = vc->vc_video_erase_char;
+                       vc->vc_video_erase_char =
+                           ((c & 0xfe00) >> 1) | (c & 0xff);
+-                      c = vc->vc_scrl_erase_char;
+-                      vc->vc_scrl_erase_char =
+-                          ((c & 0xFE00) >> 1) | (c & 0xFF);
+                       vc->vc_attr >>= 1;
+               }
+       } else if (!vc->vc_hi_font_mask && cnt == 512) {
+@@ -2555,14 +2541,9 @@ static int fbcon_do_set_font(struct vc_data *vc, int w, int h,
+                       if (vc->vc_can_do_color) {
+                               vc->vc_video_erase_char =
+                                   ((c & 0xff00) << 1) | (c & 0xff);
+-                              c = vc->vc_scrl_erase_char;
+-                              vc->vc_scrl_erase_char =
+-                                  ((c & 0xFF00) << 1) | (c & 0xFF);
+                               vc->vc_attr <<= 1;
+-                      } else {
++                      } else
+                               vc->vc_video_erase_char = c & ~0x100;
+-                              vc->vc_scrl_erase_char = c & ~0x100;
+-                      }
+               }
+       }
+diff --git a/drivers/video/console/mdacon.c b/drivers/video/console/mdacon.c
+index 9901064..dd3eaaa 100644
+--- a/drivers/video/console/mdacon.c
++++ b/drivers/video/console/mdacon.c
+@@ -533,7 +533,7 @@ static void mdacon_cursor(struct vc_data *c, int mode)
+ static int mdacon_scroll(struct vc_data *c, int t, int b, int dir, int lines)
+ {
+-      u16 eattr = mda_convert_attr(c->vc_scrl_erase_char);
++      u16 eattr = mda_convert_attr(c->vc_video_erase_char);
+       if (!lines)
+               return 0;
+diff --git a/drivers/video/console/sticon.c b/drivers/video/console/sticon.c
+index 4055dbd..491c1c1 100644
+--- a/drivers/video/console/sticon.c
++++ b/drivers/video/console/sticon.c
+@@ -170,12 +170,12 @@ static int sticon_scroll(struct vc_data *conp, int t, int b, int dir, int count)
+     switch (dir) {
+     case SM_UP:
+       sti_bmove(sti, t + count, 0, t, 0, b - t - count, conp->vc_cols);
+-      sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
++      sti_clear(sti, b - count, 0, count, conp->vc_cols, conp->vc_video_erase_char);
+       break;
+     case SM_DOWN:
+       sti_bmove(sti, t, 0, t + count, 0, b - t - count, conp->vc_cols);
+-      sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_scrl_erase_char);
++      sti_clear(sti, t, 0, count, conp->vc_cols, conp->vc_video_erase_char);
+       break;
+     }
+diff --git a/drivers/video/console/vgacon.c b/drivers/video/console/vgacon.c
+index bd1f57b..6df29a6 100644
+--- a/drivers/video/console/vgacon.c
++++ b/drivers/video/console/vgacon.c
+@@ -1350,7 +1350,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
+               } else
+                       c->vc_origin += delta;
+               scr_memsetw((u16 *) (c->vc_origin + c->vc_screenbuf_size -
+-                                   delta), c->vc_scrl_erase_char,
++                                   delta), c->vc_video_erase_char,
+                           delta);
+       } else {
+               if (oldo - delta < vga_vram_base) {
+@@ -1363,7 +1363,7 @@ static int vgacon_scroll(struct vc_data *c, int t, int b, int dir,
+               } else
+                       c->vc_origin -= delta;
+               c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
+-              scr_memsetw((u16 *) (c->vc_origin), c->vc_scrl_erase_char,
++              scr_memsetw((u16 *) (c->vc_origin), c->vc_video_erase_char,
+                           delta);
+       }
+       c->vc_scr_end = c->vc_origin + c->vc_screenbuf_size;
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index 655ed8d..e57df48 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -1188,9 +1188,11 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
+        * check for an ELF header.  If we find one, dump the first page to
+        * aid in determining what was mapped here.
+        */
+-      if (FILTER(ELF_HEADERS) && vma->vm_file != NULL && vma->vm_pgoff == 0) {
++      if (FILTER(ELF_HEADERS) &&
++          vma->vm_pgoff == 0 && (vma->vm_flags & VM_READ)) {
+               u32 __user *header = (u32 __user *) vma->vm_start;
+               u32 word;
++              mm_segment_t fs = get_fs();
+               /*
+                * Doing it this way gets the constant folded by GCC.
+                */
+@@ -1203,7 +1205,15 @@ static unsigned long vma_dump_size(struct vm_area_struct *vma,
+               magic.elfmag[EI_MAG1] = ELFMAG1;
+               magic.elfmag[EI_MAG2] = ELFMAG2;
+               magic.elfmag[EI_MAG3] = ELFMAG3;
+-              if (get_user(word, header) == 0 && word == magic.cmp)
++              /*
++               * Switch to the user "segment" for get_user(),
++               * then put back what elf_core_dump() had in place.
++               */
++              set_fs(USER_DS);
++              if (unlikely(get_user(word, header)))
++                      word = 0;
++              set_fs(fs);
++              if (word == magic.cmp)
+                       return PAGE_SIZE;
+       }
+diff --git a/fs/seq_file.c b/fs/seq_file.c
+index bd20f7f..ef4d497 100644
+--- a/fs/seq_file.c
++++ b/fs/seq_file.c
+@@ -54,6 +54,64 @@ int seq_open(struct file *file, const struct seq_operations *op)
+ }
+ EXPORT_SYMBOL(seq_open);
++static int traverse(struct seq_file *m, loff_t offset)
++{
++      loff_t pos = 0, index;
++      int error = 0;
++      void *p;
++
++      m->version = 0;
++      index = 0;
++      m->count = m->from = 0;
++      if (!offset) {
++              m->index = index;
++              return 0;
++      }
++      if (!m->buf) {
++              m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
++              if (!m->buf)
++                      return -ENOMEM;
++      }
++      p = m->op->start(m, &index);
++      while (p) {
++              error = PTR_ERR(p);
++              if (IS_ERR(p))
++                      break;
++              error = m->op->show(m, p);
++              if (error < 0)
++                      break;
++              if (unlikely(error)) {
++                      error = 0;
++                      m->count = 0;
++              }
++              if (m->count == m->size)
++                      goto Eoverflow;
++              if (pos + m->count > offset) {
++                      m->from = offset - pos;
++                      m->count -= m->from;
++                      m->index = index;
++                      break;
++              }
++              pos += m->count;
++              m->count = 0;
++              if (pos == offset) {
++                      index++;
++                      m->index = index;
++                      break;
++              }
++              p = m->op->next(m, p, &index);
++      }
++      m->op->stop(m, p);
++      m->index = index;
++      return error;
++
++Eoverflow:
++      m->op->stop(m, p);
++      kfree(m->buf);
++      m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
++      return !m->buf ? -ENOMEM : -EAGAIN;
++}
++
+ /**
+  *    seq_read -      ->read() method for sequential files.
+  *    @file: the file to read from
+@@ -186,63 +244,6 @@ Efault:
+ }
+ EXPORT_SYMBOL(seq_read);
+-static int traverse(struct seq_file *m, loff_t offset)
+-{
+-      loff_t pos = 0, index;
+-      int error = 0;
+-      void *p;
+-
+-      m->version = 0;
+-      index = 0;
+-      m->count = m->from = 0;
+-      if (!offset) {
+-              m->index = index;
+-              return 0;
+-      }
+-      if (!m->buf) {
+-              m->buf = kmalloc(m->size = PAGE_SIZE, GFP_KERNEL);
+-              if (!m->buf)
+-                      return -ENOMEM;
+-      }
+-      p = m->op->start(m, &index);
+-      while (p) {
+-              error = PTR_ERR(p);
+-              if (IS_ERR(p))
+-                      break;
+-              error = m->op->show(m, p);
+-              if (error < 0)
+-                      break;
+-              if (unlikely(error)) {
+-                      error = 0;
+-                      m->count = 0;
+-              }
+-              if (m->count == m->size)
+-                      goto Eoverflow;
+-              if (pos + m->count > offset) {
+-                      m->from = offset - pos;
+-                      m->count -= m->from;
+-                      m->index = index;
+-                      break;
+-              }
+-              pos += m->count;
+-              m->count = 0;
+-              if (pos == offset) {
+-                      index++;
+-                      m->index = index;
+-                      break;
+-              }
+-              p = m->op->next(m, p, &index);
+-      }
+-      m->op->stop(m, p);
+-      return error;
+-
+-Eoverflow:
+-      m->op->stop(m, p);
+-      kfree(m->buf);
+-      m->buf = kmalloc(m->size <<= 1, GFP_KERNEL);
+-      return !m->buf ? -ENOMEM : -EAGAIN;
+-}
+-
+ /**
+  *    seq_lseek -     ->llseek() method for sequential files.
+  *    @file: the file in question
+diff --git a/fs/xfs/linux-2.6/xfs_buf.c b/fs/xfs/linux-2.6/xfs_buf.c
+index 36d5fcd..8454dee 100644
+--- a/fs/xfs/linux-2.6/xfs_buf.c
++++ b/fs/xfs/linux-2.6/xfs_buf.c
+@@ -1114,8 +1114,7 @@ xfs_buf_bio_end_io(
+       unsigned int            blocksize = bp->b_target->bt_bsize;
+       struct bio_vec          *bvec = bio->bi_io_vec + bio->bi_vcnt - 1;
+-      if (!test_bit(BIO_UPTODATE, &bio->bi_flags))
+-              bp->b_error = EIO;
++      xfs_buf_ioerror(bp, -error);
+       do {
+               struct page     *page = bvec->bv_page;
+diff --git a/include/acpi/pdc_intel.h b/include/acpi/pdc_intel.h
+index e72bfdd..552637b 100644
+--- a/include/acpi/pdc_intel.h
++++ b/include/acpi/pdc_intel.h
+@@ -14,6 +14,7 @@
+ #define ACPI_PDC_SMP_T_SWCOORD                (0x0080)
+ #define ACPI_PDC_C_C1_FFH             (0x0100)
+ #define ACPI_PDC_C_C2C3_FFH           (0x0200)
++#define ACPI_PDC_SMP_P_HWCOORD                (0x0800)
+ #define ACPI_PDC_EST_CAPABILITY_SMP   (ACPI_PDC_SMP_C1PT | \
+                                        ACPI_PDC_C_C1_HALT | \
+@@ -22,6 +23,7 @@
+ #define ACPI_PDC_EST_CAPABILITY_SWSMP (ACPI_PDC_SMP_C1PT | \
+                                        ACPI_PDC_C_C1_HALT | \
+                                        ACPI_PDC_SMP_P_SWCOORD | \
++                                       ACPI_PDC_SMP_P_HWCOORD | \
+                                        ACPI_PDC_P_FFH)
+ #define ACPI_PDC_C_CAPABILITY_SMP     (ACPI_PDC_SMP_C2C3  | \
+diff --git a/include/linux/console_struct.h b/include/linux/console_struct.h
+index b03f80a..d71f7c0 100644
+--- a/include/linux/console_struct.h
++++ b/include/linux/console_struct.h
+@@ -53,7 +53,6 @@ struct vc_data {
+       unsigned short  vc_hi_font_mask;        /* [#] Attribute set for upper 256 chars of font or 0 if not supported */
+       struct console_font vc_font;            /* Current VC font set */
+       unsigned short  vc_video_erase_char;    /* Background erase character */
+-      unsigned short  vc_scrl_erase_char;     /* Erase character for scroll */
+       /* VT terminal data */
+       unsigned int    vc_state;               /* Escape sequence parser state */
+       unsigned int    vc_npar,vc_par[NPAR];   /* Parameters of current escape sequence */
+diff --git a/include/linux/module.h b/include/linux/module.h
+index 68e0955..760a41b 100644
+--- a/include/linux/module.h
++++ b/include/linux/module.h
+@@ -387,7 +387,6 @@ void symbol_put_addr(void *addr);
+ static inline void __module_get(struct module *module)
+ {
+       if (module) {
+-              BUG_ON(module_refcount(module) == 0);
+               local_inc(&module->ref[get_cpu()].count);
+               put_cpu();
+       }
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index 426e029..911b99d 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -639,7 +639,7 @@ int pci_select_bars(struct pci_dev *dev, unsigned long flags);
+ /* ROM control related routines */
+ void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
+ void pci_unmap_rom(struct pci_dev *pdev, void __iomem *rom);
+-size_t pci_get_rom_size(void __iomem *rom, size_t size);
++size_t pci_get_rom_size(struct pci_dev *pdev, void __iomem *rom, size_t size);
+ /* Power management related routines */
+ int pci_save_state(struct pci_dev *dev);
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 26b59cb..794e546 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1755,6 +1755,7 @@
+ #define PCI_DEVICE_ID_SIIG_8S_20x_650 0x2081
+ #define PCI_DEVICE_ID_SIIG_8S_20x_850 0x2082
+ #define PCI_SUBDEVICE_ID_SIIG_QUARTET_SERIAL  0x2050
++#define PCI_SUBDEVICE_ID_SIIG_DUAL_SERIAL     0x2530
+ #define PCI_VENDOR_ID_RADISYS         0x1331
+diff --git a/include/linux/wait.h b/include/linux/wait.h
+index 0081147..3c2f411 100644
+--- a/include/linux/wait.h
++++ b/include/linux/wait.h
+@@ -141,6 +141,8 @@ static inline void __remove_wait_queue(wait_queue_head_t *head,
+       list_del(&old->task_list);
+ }
++void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
++                      int nr_exclusive, int sync, void *key);
+ void __wake_up(wait_queue_head_t *q, unsigned int mode, int nr, void *key);
+ extern void __wake_up_locked(wait_queue_head_t *q, unsigned int mode);
+ extern void __wake_up_sync(wait_queue_head_t *q, unsigned int mode, int nr);
+@@ -342,16 +344,19 @@ do {                                                                     \
+       for (;;) {                                                      \
+               prepare_to_wait_exclusive(&wq, &__wait,                 \
+                                       TASK_INTERRUPTIBLE);            \
+-              if (condition)                                          \
++              if (condition) {                                        \
++                      finish_wait(&wq, &__wait);                      \
+                       break;                                          \
++              }                                                       \
+               if (!signal_pending(current)) {                         \
+                       schedule();                                     \
+                       continue;                                       \
+               }                                                       \
+               ret = -ERESTARTSYS;                                     \
++              abort_exclusive_wait(&wq, &__wait,                      \
++                              TASK_INTERRUPTIBLE, NULL);              \
+               break;                                                  \
+       }                                                               \
+-      finish_wait(&wq, &__wait);                                      \
+ } while (0)
+ #define wait_event_interruptible_exclusive(wq, condition)             \
+@@ -440,6 +445,8 @@ extern long interruptible_sleep_on_timeout(wait_queue_head_t *q,
+ void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state);
+ void prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state);
+ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait);
++void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
++                      unsigned int mode, void *key);
+ int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
+ int wake_bit_function(wait_queue_t *wait, unsigned mode, int sync, void *key);
+diff --git a/ipc/shm.c b/ipc/shm.c
+index f00c897..35a65be 100644
+--- a/ipc/shm.c
++++ b/ipc/shm.c
+@@ -565,11 +565,15 @@ static void shm_get_stat(struct ipc_namespace *ns, unsigned long *rss,
+                       struct hstate *h = hstate_file(shp->shm_file);
+                       *rss += pages_per_huge_page(h) * mapping->nrpages;
+               } else {
++#ifdef CONFIG_SHMEM
+                       struct shmem_inode_info *info = SHMEM_I(inode);
+                       spin_lock(&info->lock);
+                       *rss += inode->i_mapping->nrpages;
+                       *swp += info->swapped;
+                       spin_unlock(&info->lock);
++#else
++                      *rss += inode->i_mapping->nrpages;
++#endif
+               }
+               total++;
+diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
+index 3cd441e..48c58fe 100644
+--- a/kernel/irq/chip.c
++++ b/kernel/irq/chip.c
+@@ -78,6 +78,7 @@ void dynamic_irq_cleanup(unsigned int irq)
+       desc->chip_data = NULL;
+       desc->handle_irq = handle_bad_irq;
+       desc->chip = &no_irq_chip;
++      desc->name = NULL;
+       spin_unlock_irqrestore(&desc->lock, flags);
+ }
+diff --git a/kernel/sched.c b/kernel/sched.c
+index 2a09e44..98c0cdc 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -4556,8 +4556,8 @@ EXPORT_SYMBOL(default_wake_function);
+  * started to run but is not in state TASK_RUNNING. try_to_wake_up() returns
+  * zero in this (rare) case, and we handle it by continuing to scan the queue.
+  */
+-static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
+-                           int nr_exclusive, int sync, void *key)
++void __wake_up_common(wait_queue_head_t *q, unsigned int mode,
++                      int nr_exclusive, int sync, void *key)
+ {
+       wait_queue_t *curr, *next;
+diff --git a/kernel/wait.c b/kernel/wait.c
+index c275c56..24688c7 100644
+--- a/kernel/wait.c
++++ b/kernel/wait.c
+@@ -101,6 +101,15 @@ prepare_to_wait_exclusive(wait_queue_head_t *q, wait_queue_t *wait, int state)
+ }
+ EXPORT_SYMBOL(prepare_to_wait_exclusive);
++/*
++ * finish_wait - clean up after waiting in a queue
++ * @q: waitqueue waited on
++ * @wait: wait descriptor
++ *
++ * Sets current thread back to running state and removes
++ * the wait descriptor from the given waitqueue if still
++ * queued.
++ */
+ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
+ {
+       unsigned long flags;
+@@ -127,6 +136,39 @@ void finish_wait(wait_queue_head_t *q, wait_queue_t *wait)
+ }
+ EXPORT_SYMBOL(finish_wait);
++/*
++ * abort_exclusive_wait - abort exclusive waiting in a queue
++ * @q: waitqueue waited on
++ * @wait: wait descriptor
++ * @state: runstate of the waiter to be woken
++ * @key: key to identify a wait bit queue or %NULL
++ *
++ * Sets current thread back to running state and removes
++ * the wait descriptor from the given waitqueue if still
++ * queued.
++ *
++ * Wakes up the next waiter if the caller is concurrently
++ * woken up through the queue.
++ *
++ * This prevents waiter starvation where an exclusive waiter
++ * aborts and is woken up concurrently and noone wakes up
++ * the next waiter.
++ */
++void abort_exclusive_wait(wait_queue_head_t *q, wait_queue_t *wait,
++                      unsigned int mode, void *key)
++{
++      unsigned long flags;
++
++      __set_current_state(TASK_RUNNING);
++      spin_lock_irqsave(&q->lock, flags);
++      if (!list_empty(&wait->task_list))
++              list_del_init(&wait->task_list);
++      else if (waitqueue_active(q))
++              __wake_up_common(q, mode, 1, 0, key);
++      spin_unlock_irqrestore(&q->lock, flags);
++}
++EXPORT_SYMBOL(abort_exclusive_wait);
++
+ int autoremove_wake_function(wait_queue_t *wait, unsigned mode, int sync, void *key)
+ {
+       int ret = default_wake_function(wait, mode, sync, key);
+@@ -187,17 +229,20 @@ int __sched
+ __wait_on_bit_lock(wait_queue_head_t *wq, struct wait_bit_queue *q,
+                       int (*action)(void *), unsigned mode)
+ {
+-      int ret = 0;
+-
+       do {
++              int ret;
++
+               prepare_to_wait_exclusive(wq, &q->wait, mode);
+-              if (test_bit(q->key.bit_nr, q->key.flags)) {
+-                      if ((ret = (*action)(q->key.flags)))
+-                              break;
+-              }
++              if (!test_bit(q->key.bit_nr, q->key.flags))
++                      continue;
++              ret = action(q->key.flags);
++              if (!ret)
++                      continue;
++              abort_exclusive_wait(wq, &q->wait, mode, &q->key);
++              return ret;
+       } while (test_and_set_bit(q->key.bit_nr, q->key.flags));
+       finish_wait(wq, &q->wait);
+-      return ret;
++      return 0;
+ }
+ EXPORT_SYMBOL(__wait_on_bit_lock);
+diff --git a/mm/swap.c b/mm/swap.c
+index 9e0cb31..65e6825 100644
+--- a/mm/swap.c
++++ b/mm/swap.c
+@@ -244,7 +244,6 @@ void lru_add_drain(void)
+       put_cpu();
+ }
+-#ifdef CONFIG_NUMA
+ static void lru_add_drain_per_cpu(struct work_struct *dummy)
+ {
+       lru_add_drain();
+@@ -258,18 +257,6 @@ int lru_add_drain_all(void)
+       return schedule_on_each_cpu(lru_add_drain_per_cpu);
+ }
+-#else
+-
+-/*
+- * Returns 0 for success
+- */
+-int lru_add_drain_all(void)
+-{
+-      lru_add_drain();
+-      return 0;
+-}
+-#endif
+-
+ /*
+  * Batched page_cache_release().  Decrement the reference count on all the
+  * passed pages.  If it fell to zero then remove the page from the LRU and
+diff --git a/net/sctp/input.c b/net/sctp/input.c
+index a49fa80..be736af 100644
+--- a/net/sctp/input.c
++++ b/net/sctp/input.c
+@@ -249,6 +249,19 @@ int sctp_rcv(struct sk_buff *skb)
+        */
+       sctp_bh_lock_sock(sk);
++      if (sk != rcvr->sk) {
++              /* Our cached sk is different from the rcvr->sk.  This is
++               * because migrate()/accept() may have moved the association
++               * to a new socket and released all the sockets.  So now we
++               * are holding a lock on the old socket while the user may
++               * be doing something with the new socket.  Switch our veiw
++               * of the current sk.
++               */
++              sctp_bh_unlock_sock(sk);
++              sk = rcvr->sk;
++              sctp_bh_lock_sock(sk);
++      }
++
+       if (sock_owned_by_user(sk)) {
+               SCTP_INC_STATS_BH(SCTP_MIB_IN_PKT_BACKLOG);
+               sctp_add_backlog(sk, skb);
+diff --git a/net/sunrpc/svcsock.c b/net/sunrpc/svcsock.c
+index 3e65719..e4c27c1 100644
+--- a/net/sunrpc/svcsock.c
++++ b/net/sunrpc/svcsock.c
+@@ -1171,7 +1171,11 @@ int svc_addsock(struct svc_serv *serv,
+       else if (so->state > SS_UNCONNECTED)
+               err = -EISCONN;
+       else {
+-              svsk = svc_setup_socket(serv, so, &err, SVC_SOCK_DEFAULTS);
++              if (!try_module_get(THIS_MODULE))
++                      err = -ENOENT;
++              else
++                      svsk = svc_setup_socket(serv, so, &err,
++                                              SVC_SOCK_DEFAULTS);
+               if (svsk) {
+                       struct sockaddr_storage addr;
+                       struct sockaddr *sin = (struct sockaddr *)&addr;
+@@ -1184,7 +1188,8 @@ int svc_addsock(struct svc_serv *serv,
+                       spin_unlock_bh(&serv->sv_lock);
+                       svc_xprt_received(&svsk->sk_xprt);
+                       err = 0;
+-              }
++              } else
++                      module_put(THIS_MODULE);
+       }
+       if (err) {
+               sockfd_put(so);
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index aa7dc03..db9c702 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -920,6 +920,7 @@ do_sku:
+               case 0x10ec0267:
+               case 0x10ec0268:
+               case 0x10ec0269:
++              case 0x10ec0272:
+               case 0x10ec0660:
+               case 0x10ec0662:
+               case 0x10ec0663:
+@@ -948,6 +949,7 @@ do_sku:
+               case 0x10ec0882:
+               case 0x10ec0883:
+               case 0x10ec0885:
++              case 0x10ec0887:
+               case 0x10ec0889:
+                       snd_hda_codec_write(codec, 0x20, 0,
+                                           AC_VERB_SET_COEF_INDEX, 7);
+@@ -8059,6 +8061,8 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1558, 0, "Clevo laptop", ALC883_LAPTOP_EAPD),
+       SND_PCI_QUIRK(0x15d9, 0x8780, "Supermicro PDSBA", ALC883_3ST_6ch),
+       SND_PCI_QUIRK(0x161f, 0x2054, "Medion laptop", ALC883_MEDION),
++      SND_PCI_QUIRK(0x1734, 0x1107, "FSC AMILO Xi2550",
++                    ALC883_FUJITSU_PI2515),
+       SND_PCI_QUIRK(0x1734, 0x1108, "Fujitsu AMILO Pi2515", ALC883_FUJITSU_PI2515),
+       SND_PCI_QUIRK(0x17aa, 0x101e, "Lenovo 101e", ALC883_LENOVO_101E_2ch),
+       SND_PCI_QUIRK(0x17aa, 0x2085, "Lenovo NB0763", ALC883_LENOVO_NB0763),
+diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
+index b8cfb7c..7a1a8c8 100644
+--- a/sound/usb/usbaudio.c
++++ b/sound/usb/usbaudio.c
+@@ -2958,6 +2958,7 @@ static int create_fixed_stream_quirk(struct snd_usb_audio *chip,
+               return -EINVAL;
+       }
+       alts = &iface->altsetting[fp->altset_idx];
++      fp->maxpacksize = le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize);
+       usb_set_interface(chip->dev, fp->iface, 0);
+       init_usb_pitch(chip->dev, fp->iface, alts, fp);
+       init_usb_sample_rate(chip->dev, fp->iface, alts, fp, fp->rate_max);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.16-17 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.16-17
new file mode 100644 (file)
index 0000000..e3aaf72
--- /dev/null
@@ -0,0 +1,40 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.17
+
+Upstream 2.6.27.17 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index d398828..104fb0f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .16
++EXTRAVERSION = .17
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
+index eab790f..e28469e 100644
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -691,14 +691,8 @@ fdd_out:
+ static ssize_t show_docked(struct device *dev,
+                          struct device_attribute *attr, char *buf)
+ {
+-      struct acpi_device *tmp;
+-
+-      struct dock_station *dock_station = *((struct dock_station **)
+-              dev->platform_data);
++      return snprintf(buf, PAGE_SIZE, "%d\n", dock_present(dock_station));
+-      if (ACPI_SUCCESS(acpi_bus_get_device(dock_station->handle, &tmp)))
+-              return snprintf(buf, PAGE_SIZE, "1\n");
+-      return snprintf(buf, PAGE_SIZE, "0\n");
+ }
+ static DEVICE_ATTR(docked, S_IRUGO, show_docked, NULL);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.17-18 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.17-18
new file mode 100644 (file)
index 0000000..6b39185
--- /dev/null
@@ -0,0 +1,1692 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.18
+
+Upstream 2.6.27.18 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 104fb0f..9273a73 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .17
++EXTRAVERSION = .18
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
+index 3e80aa3..a6a4310 100644
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -410,7 +410,7 @@ inline unsigned long copy_fpr_from_user(struct task_struct *task,
+  * altivec/spe instructions at some point.
+  */
+ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
+-              int sigret)
++              int sigret, int ctx_has_vsx_region)
+ {
+       unsigned long msr = regs->msr;
+@@ -451,7 +451,7 @@ static int save_user_regs(struct pt_regs *regs, struct mcontext __user *frame,
+        * the saved MSR value to indicate that frame->mc_vregs
+        * contains valid data
+        */
+-      if (current->thread.used_vsr) {
++      if (current->thread.used_vsr && ctx_has_vsx_region) {
+               __giveup_vsx(current);
+               if (copy_vsx_to_user(&frame->mc_vsregs, current))
+                       return 1;
+@@ -858,11 +858,11 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
+       frame = &rt_sf->uc.uc_mcontext;
+       addr = frame;
+       if (vdso32_rt_sigtramp && current->mm->context.vdso_base) {
+-              if (save_user_regs(regs, frame, 0))
++              if (save_user_regs(regs, frame, 0, 1))
+                       goto badframe;
+               regs->link = current->mm->context.vdso_base + vdso32_rt_sigtramp;
+       } else {
+-              if (save_user_regs(regs, frame, __NR_rt_sigreturn))
++              if (save_user_regs(regs, frame, __NR_rt_sigreturn, 1))
+                       goto badframe;
+               regs->link = (unsigned long) frame->tramp;
+       }
+@@ -936,12 +936,13 @@ long sys_swapcontext(struct ucontext __user *old_ctx,
+                    int ctx_size, int r6, int r7, int r8, struct pt_regs *regs)
+ {
+       unsigned char tmp;
++      int ctx_has_vsx_region = 0;
+ #ifdef CONFIG_PPC64
+       unsigned long new_msr = 0;
+       if (new_ctx &&
+-          __get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR]))
++          get_user(new_msr, &new_ctx->uc_mcontext.mc_gregs[PT_MSR]))
+               return -EFAULT;
+       /*
+        * Check that the context is not smaller than the original
+@@ -956,16 +957,9 @@ long sys_swapcontext(struct ucontext __user *old_ctx,
+       if ((ctx_size < sizeof(struct ucontext)) &&
+           (new_msr & MSR_VSX))
+               return -EINVAL;
+-#ifdef CONFIG_VSX
+-      /*
+-       * If userspace doesn't provide enough room for VSX data,
+-       * but current thread has used VSX, we don't have anywhere
+-       * to store the full context back into.
+-       */
+-      if ((ctx_size < sizeof(struct ucontext)) &&
+-          (current->thread.used_vsr && old_ctx))
+-              return -EINVAL;
+-#endif
++      /* Does the context have enough room to store VSX data? */
++      if (ctx_size >= sizeof(struct ucontext))
++              ctx_has_vsx_region = 1;
+ #else
+       /* Context size is for future use. Right now, we only make sure
+        * we are passed something we understand
+@@ -985,17 +979,17 @@ long sys_swapcontext(struct ucontext __user *old_ctx,
+                */
+               mctx = (struct mcontext __user *)
+                       ((unsigned long) &old_ctx->uc_mcontext & ~0xfUL);
+-              if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
+-                  || save_user_regs(regs, mctx, 0)
++              if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
++                  || save_user_regs(regs, mctx, 0, ctx_has_vsx_region)
+                   || put_sigset_t(&old_ctx->uc_sigmask, &current->blocked)
+                   || __put_user(to_user_ptr(mctx), &old_ctx->uc_regs))
+                       return -EFAULT;
+       }
+       if (new_ctx == NULL)
+               return 0;
+-      if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx))
++      if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
+           || __get_user(tmp, (u8 __user *) new_ctx)
+-          || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1))
++          || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
+               return -EFAULT;
+       /*
+@@ -1196,11 +1190,11 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka,
+               goto badframe;
+       if (vdso32_sigtramp && current->mm->context.vdso_base) {
+-              if (save_user_regs(regs, &frame->mctx, 0))
++              if (save_user_regs(regs, &frame->mctx, 0, 1))
+                       goto badframe;
+               regs->link = current->mm->context.vdso_base + vdso32_sigtramp;
+       } else {
+-              if (save_user_regs(regs, &frame->mctx, __NR_sigreturn))
++              if (save_user_regs(regs, &frame->mctx, __NR_sigreturn, 1))
+                       goto badframe;
+               regs->link = (unsigned long) frame->mctx.tramp;
+       }
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
+index 65ad925..e4acdbd 100644
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -74,7 +74,8 @@ static const char fmt64[] = KERN_INFO \
+  */
+ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
+-               int signr, sigset_t *set, unsigned long handler)
++               int signr, sigset_t *set, unsigned long handler,
++               int ctx_has_vsx_region)
+ {
+       /* When CONFIG_ALTIVEC is set, we _always_ setup v_regs even if the
+        * process never used altivec yet (MSR_VEC is zero in pt_regs of
+@@ -121,7 +122,7 @@ static long setup_sigcontext(struct sigcontext __user *sc, struct pt_regs *regs,
+        * then out to userspace.  Update v_regs to point after the
+        * VMX data.
+        */
+-      if (current->thread.used_vsr) {
++      if (current->thread.used_vsr && ctx_has_vsx_region) {
+               __giveup_vsx(current);
+               v_regs += ELF_NVRREG;
+               err |= copy_vsx_to_user(v_regs, current);
+@@ -284,9 +285,10 @@ int sys_swapcontext(struct ucontext __user *old_ctx,
+       unsigned char tmp;
+       sigset_t set;
+       unsigned long new_msr = 0;
++      int ctx_has_vsx_region = 0;
+       if (new_ctx &&
+-          __get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR]))
++          get_user(new_msr, &new_ctx->uc_mcontext.gp_regs[PT_MSR]))
+               return -EFAULT;
+       /*
+        * Check that the context is not smaller than the original
+@@ -301,28 +303,23 @@ int sys_swapcontext(struct ucontext __user *old_ctx,
+       if ((ctx_size < sizeof(struct ucontext)) &&
+           (new_msr & MSR_VSX))
+               return -EINVAL;
+-#ifdef CONFIG_VSX
+-      /*
+-       * If userspace doesn't provide enough room for VSX data,
+-       * but current thread has used VSX, we don't have anywhere
+-       * to store the full context back into.
+-       */
+-      if ((ctx_size < sizeof(struct ucontext)) &&
+-          (current->thread.used_vsr && old_ctx))
+-              return -EINVAL;
+-#endif
++      /* Does the context have enough room to store VSX data? */
++      if (ctx_size >= sizeof(struct ucontext))
++              ctx_has_vsx_region = 1;
++
+       if (old_ctx != NULL) {
+-              if (!access_ok(VERIFY_WRITE, old_ctx, sizeof(*old_ctx))
+-                  || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0)
++              if (!access_ok(VERIFY_WRITE, old_ctx, ctx_size)
++                  || setup_sigcontext(&old_ctx->uc_mcontext, regs, 0, NULL, 0,
++                                      ctx_has_vsx_region)
+                   || __copy_to_user(&old_ctx->uc_sigmask,
+                                     &current->blocked, sizeof(sigset_t)))
+                       return -EFAULT;
+       }
+       if (new_ctx == NULL)
+               return 0;
+-      if (!access_ok(VERIFY_READ, new_ctx, sizeof(*new_ctx))
++      if (!access_ok(VERIFY_READ, new_ctx, ctx_size)
+           || __get_user(tmp, (u8 __user *) new_ctx)
+-          || __get_user(tmp, (u8 __user *) (new_ctx + 1) - 1))
++          || __get_user(tmp, (u8 __user *) new_ctx + ctx_size - 1))
+               return -EFAULT;
+       /*
+@@ -425,7 +422,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
+                         &frame->uc.uc_stack.ss_flags);
+       err |= __put_user(current->sas_ss_size, &frame->uc.uc_stack.ss_size);
+       err |= setup_sigcontext(&frame->uc.uc_mcontext, regs, signr, NULL,
+-                              (unsigned long)ka->sa.sa_handler);
++                              (unsigned long)ka->sa.sa_handler, 1);
+       err |= __copy_to_user(&frame->uc.uc_sigmask, set, sizeof(*set));
+       if (err)
+               goto badframe;
+diff --git a/arch/powerpc/mm/fsl_booke_mmu.c b/arch/powerpc/mm/fsl_booke_mmu.c
+index ce10e2b..131d729 100644
+--- a/arch/powerpc/mm/fsl_booke_mmu.c
++++ b/arch/powerpc/mm/fsl_booke_mmu.c
+@@ -80,7 +80,7 @@ extern unsigned int tlbcam_index;
+ /*
+  * Return PA for this VA if it is mapped by a CAM, or 0
+  */
+-unsigned long v_mapped_by_tlbcam(unsigned long va)
++phys_addr_t v_mapped_by_tlbcam(unsigned long va)
+ {
+       int b;
+       for (b = 0; b < tlbcam_index; ++b)
+@@ -92,7 +92,7 @@ unsigned long v_mapped_by_tlbcam(unsigned long va)
+ /*
+  * Return VA for a given PA or 0 if not mapped
+  */
+-unsigned long p_mapped_by_tlbcam(unsigned long pa)
++unsigned long p_mapped_by_tlbcam(phys_addr_t pa)
+ {
+       int b;
+       for (b = 0; b < tlbcam_index; ++b)
+diff --git a/arch/powerpc/mm/pgtable_32.c b/arch/powerpc/mm/pgtable_32.c
+index 2001abd..05922b2 100644
+--- a/arch/powerpc/mm/pgtable_32.c
++++ b/arch/powerpc/mm/pgtable_32.c
+@@ -65,8 +65,8 @@ void setbat(int index, unsigned long virt, phys_addr_t phys,
+ #ifdef HAVE_TLBCAM
+ extern unsigned int tlbcam_index;
+-extern unsigned long v_mapped_by_tlbcam(unsigned long va);
+-extern unsigned long p_mapped_by_tlbcam(unsigned long pa);
++extern phys_addr_t v_mapped_by_tlbcam(unsigned long va);
++extern unsigned long p_mapped_by_tlbcam(phys_addr_t pa);
+ #else /* !HAVE_TLBCAM */
+ #define v_mapped_by_tlbcam(x) (0UL)
+ #define p_mapped_by_tlbcam(x) (0UL)
+diff --git a/arch/sparc64/Kconfig b/arch/sparc64/Kconfig
+index 36b4b7a..b376667 100644
+--- a/arch/sparc64/Kconfig
++++ b/arch/sparc64/Kconfig
+@@ -15,6 +15,7 @@ config SPARC64
+       select HAVE_FTRACE
+       select HAVE_IDE
+       select HAVE_LMB
++      select HAVE_SYSCALL_WRAPPERS
+       select HAVE_ARCH_KGDB
+       select USE_GENERIC_SMP_HELPERS if SMP
+       select HAVE_ARCH_TRACEHOOK
+diff --git a/arch/sparc64/kernel/sys_sparc.c b/arch/sparc64/kernel/sys_sparc.c
+index 39749e3..73b287e 100644
+--- a/arch/sparc64/kernel/sys_sparc.c
++++ b/arch/sparc64/kernel/sys_sparc.c
+@@ -397,7 +397,7 @@ void arch_pick_mmap_layout(struct mm_struct *mm)
+       }
+ }
+-asmlinkage unsigned long sparc_brk(unsigned long brk)
++SYSCALL_DEFINE1(sparc_brk, unsigned long, brk)
+ {
+       /* People could try to be nasty and use ta 0x6d in 32bit programs */
+       if (test_thread_flag(TIF_32BIT) && brk >= STACK_TOP32)
+@@ -413,7 +413,7 @@ asmlinkage unsigned long sparc_brk(unsigned long brk)
+  * sys_pipe() is the normal C calling standard for creating
+  * a pipe. It's not the way unix traditionally does this, though.
+  */
+-asmlinkage long sparc_pipe(struct pt_regs *regs)
++SYSCALL_DEFINE1(sparc_pipe_real, struct pt_regs *, regs)
+ {
+       int fd[2];
+       int error;
+@@ -433,8 +433,8 @@ out:
+  * This is really horribly ugly.
+  */
+-asmlinkage long sys_ipc(unsigned int call, int first, unsigned long second,
+-                      unsigned long third, void __user *ptr, long fifth)
++SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, unsigned long, second,
++              unsigned long, third, void __user *, ptr, long, fifth)
+ {
+       long err;
+@@ -517,7 +517,7 @@ out:
+       return err;
+ }
+-asmlinkage long sparc64_newuname(struct new_utsname __user *name)
++SYSCALL_DEFINE1(sparc64_newuname, struct new_utsname __user *, name)
+ {
+       int ret = sys_newuname(name);
+       
+@@ -528,7 +528,7 @@ asmlinkage long sparc64_newuname(struct new_utsname __user *name)
+       return ret;
+ }
+-asmlinkage long sparc64_personality(unsigned long personality)
++SYSCALL_DEFINE1(sparc64_personality, unsigned long, personality)
+ {
+       int ret;
+@@ -562,9 +562,9 @@ int sparc_mmap_check(unsigned long addr, unsigned long len)
+ }
+ /* Linux version of mmap */
+-asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
+-      unsigned long prot, unsigned long flags, unsigned long fd,
+-      unsigned long off)
++SYSCALL_DEFINE6(mmap, unsigned long, addr, unsigned long, len,
++              unsigned long, prot, unsigned long, flags, unsigned long, fd,
++              unsigned long, off)
+ {
+       struct file * file = NULL;
+       unsigned long retval = -EBADF;
+@@ -587,7 +587,7 @@ out:
+       return retval;
+ }
+-asmlinkage long sys64_munmap(unsigned long addr, size_t len)
++SYSCALL_DEFINE2(64_munmap, unsigned long, addr, size_t, len)
+ {
+       long ret;
+@@ -604,9 +604,9 @@ extern unsigned long do_mremap(unsigned long addr,
+       unsigned long old_len, unsigned long new_len,
+       unsigned long flags, unsigned long new_addr);
+                 
+-asmlinkage unsigned long sys64_mremap(unsigned long addr,
+-      unsigned long old_len, unsigned long new_len,
+-      unsigned long flags, unsigned long new_addr)
++SYSCALL_DEFINE5(64_mremap, unsigned long, addr,       unsigned long, old_len,
++              unsigned long, new_len, unsigned long, flags,
++              unsigned long, new_addr)
+ {
+       unsigned long ret = -EINVAL;
+@@ -669,7 +669,7 @@ asmlinkage void sparc_breakpoint(struct pt_regs *regs)
+ extern void check_pending(int signum);
+-asmlinkage long sys_getdomainname(char __user *name, int len)
++SYSCALL_DEFINE2(getdomainname, char __user *, name, int, len)
+ {
+         int nlen, err;
+@@ -692,11 +692,10 @@ out:
+       return err;
+ }
+-asmlinkage long sys_utrap_install(utrap_entry_t type,
+-                                utrap_handler_t new_p,
+-                                utrap_handler_t new_d,
+-                                utrap_handler_t __user *old_p,
+-                                utrap_handler_t __user *old_d)
++SYSCALL_DEFINE5(utrap_install, utrap_entry_t, type,
++              utrap_handler_t, new_p, utrap_handler_t, new_d,
++              utrap_handler_t __user *, old_p,
++              utrap_handler_t __user *, old_d)
+ {
+       if (type < UT_INSTRUCTION_EXCEPTION || type > UT_TRAP_INSTRUCTION_31)
+               return -EINVAL;
+@@ -762,11 +761,9 @@ asmlinkage long sparc_memory_ordering(unsigned long model,
+       return 0;
+ }
+-asmlinkage long sys_rt_sigaction(int sig,
+-                               const struct sigaction __user *act,
+-                               struct sigaction __user *oact,
+-                               void __user *restorer,
+-                               size_t sigsetsize)
++SYSCALL_DEFINE5(rt_sigaction, int, sig, const struct sigaction __user *, act,
++              struct sigaction __user *, oact, void __user *, restorer,
++              size_t, sigsetsize)
+ {
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+@@ -806,7 +803,8 @@ asmlinkage void update_perfctrs(void)
+       reset_pic();
+ }
+-asmlinkage long sys_perfctr(int opcode, unsigned long arg0, unsigned long arg1, unsigned long arg2)
++SYSCALL_DEFINE4(perfctr, int, opcode, unsigned long, arg0,
++              unsigned long, arg1, unsigned long, arg2)
+ {
+       int err = 0;
+diff --git a/arch/sparc64/kernel/syscalls.S b/arch/sparc64/kernel/syscalls.S
+index cd2d333..5a0b52e 100644
+--- a/arch/sparc64/kernel/syscalls.S
++++ b/arch/sparc64/kernel/syscalls.S
+@@ -21,7 +21,7 @@ execve_merge:
+       .align  32
+ sys_sparc_pipe:
+-      ba,pt   %xcc, sparc_pipe
++      ba,pt   %xcc, sys_sparc_pipe_real
+        add    %sp, PTREGS_OFF, %o0
+ sys_nis_syscall:
+       ba,pt   %xcc, c_sys_nis_syscall
+diff --git a/arch/sparc64/kernel/systbls.S b/arch/sparc64/kernel/systbls.S
+index 26b39de..8fafe0b 100644
+--- a/arch/sparc64/kernel/systbls.S
++++ b/arch/sparc64/kernel/systbls.S
+@@ -21,7 +21,7 @@ sys_call_table32:
+ /*0*/ .word sys_restart_syscall, sys32_exit, sys_fork, sys_read, sys_write
+ /*5*/ .word sys32_open, sys_close, sys32_wait4, sys32_creat, sys_link
+ /*10*/  .word sys_unlink, sunos_execv, sys_chdir, sys_chown16, sys32_mknod
+-/*15*/        .word sys_chmod, sys_lchown16, sparc_brk, sys32_perfctr, sys32_lseek
++/*15*/        .word sys_chmod, sys_lchown16, sys_sparc_brk, sys32_perfctr, sys32_lseek
+ /*20*/        .word sys_getpid, sys_capget, sys_capset, sys_setuid16, sys_getuid16
+ /*25*/        .word sys32_vmsplice, compat_sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause
+ /*30*/        .word compat_sys_utime, sys_lchown, sys_fchown, sys32_access, sys32_nice
+@@ -55,8 +55,8 @@ sys_call_table32:
+ /*170*/       .word sys32_lsetxattr, sys32_fsetxattr, sys_getxattr, sys_lgetxattr, compat_sys_getdents
+       .word sys_setsid, sys_fchdir, sys32_fgetxattr, sys_listxattr, sys_llistxattr
+ /*180*/       .word sys32_flistxattr, sys_removexattr, sys_lremovexattr, compat_sys_sigpending, sys_ni_syscall
+-      .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sparc64_newuname
+-/*190*/       .word sys32_init_module, sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl
++      .word sys32_setpgid, sys32_fremovexattr, sys32_tkill, sys32_exit_group, sys_sparc64_newuname
++/*190*/       .word sys32_init_module, sys_sparc64_personality, sys_remap_file_pages, sys32_epoll_create, sys32_epoll_ctl
+       .word sys32_epoll_wait, sys32_ioprio_set, sys_getppid, sys32_sigaction, sys_sgetmask
+ /*200*/       .word sys32_ssetmask, sys_sigsuspend, compat_sys_newlstat, sys_uselib, compat_sys_old_readdir
+       .word sys32_readahead, sys32_socketcall, sys32_syslog, sys32_lookup_dcookie, sys32_fadvise64
+@@ -95,7 +95,7 @@ sys_call_table:
+ /*0*/ .word sys_restart_syscall, sparc_exit, sys_fork, sys_read, sys_write
+ /*5*/ .word sys_open, sys_close, sys_wait4, sys_creat, sys_link
+ /*10*/  .word sys_unlink, sys_nis_syscall, sys_chdir, sys_chown, sys_mknod
+-/*15*/        .word sys_chmod, sys_lchown, sparc_brk, sys_perfctr, sys_lseek
++/*15*/        .word sys_chmod, sys_lchown, sys_sparc_brk, sys_perfctr, sys_lseek
+ /*20*/        .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid
+ /*25*/        .word sys_vmsplice, sys_ptrace, sys_alarm, sys_sigaltstack, sys_nis_syscall
+ /*30*/        .word sys_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
+@@ -106,7 +106,7 @@ sys_call_table:
+       .word sys_reboot, sys_nis_syscall, sys_symlink, sys_readlink, sys_execve
+ /*60*/        .word sys_umask, sys_chroot, sys_newfstat, sys_fstat64, sys_getpagesize
+       .word sys_msync, sys_vfork, sys_pread64, sys_pwrite64, sys_nis_syscall
+-/*70*/        .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys64_munmap, sys_mprotect
++/*70*/        .word sys_nis_syscall, sys_mmap, sys_nis_syscall, sys_64_munmap, sys_mprotect
+       .word sys_madvise, sys_vhangup, sys_nis_syscall, sys_mincore, sys_getgroups
+ /*80*/        .word sys_setgroups, sys_getpgrp, sys_nis_syscall, sys_setitimer, sys_nis_syscall
+       .word sys_swapon, sys_getitimer, sys_nis_syscall, sys_sethostname, sys_nis_syscall
+@@ -129,8 +129,8 @@ sys_call_table:
+ /*170*/       .word sys_lsetxattr, sys_fsetxattr, sys_getxattr, sys_lgetxattr, sys_getdents
+       .word sys_setsid, sys_fchdir, sys_fgetxattr, sys_listxattr, sys_llistxattr
+ /*180*/       .word sys_flistxattr, sys_removexattr, sys_lremovexattr, sys_nis_syscall, sys_ni_syscall
+-      .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sparc64_newuname
+-/*190*/       .word sys_init_module, sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
++      .word sys_setpgid, sys_fremovexattr, sys_tkill, sys_exit_group, sys_sparc64_newuname
++/*190*/       .word sys_init_module, sys_sparc64_personality, sys_remap_file_pages, sys_epoll_create, sys_epoll_ctl
+       .word sys_epoll_wait, sys_ioprio_set, sys_getppid, sys_nis_syscall, sys_sgetmask
+ /*200*/       .word sys_ssetmask, sys_nis_syscall, sys_newlstat, sys_uselib, sys_nis_syscall
+       .word sys_readahead, sys_socketcall, sys_syslog, sys_lookup_dcookie, sys_fadvise64
+@@ -142,7 +142,7 @@ sys_call_table:
+       .word sys_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall
+ /*240*/       .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler
+       .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys_sched_rr_get_interval, sys_nanosleep
+-/*250*/       .word sys64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl
++/*250*/       .word sys_64_mremap, sys_sysctl, sys_getsid, sys_fdatasync, sys_nfsservctl
+       .word sys_sync_file_range, sys_clock_settime, sys_clock_gettime, sys_clock_getres, sys_clock_nanosleep
+ /*260*/       .word sys_sched_getaffinity, sys_sched_setaffinity, sys_timer_settime, sys_timer_gettime, sys_timer_getoverrun
+       .word sys_timer_delete, sys_timer_create, sys_ni_syscall, sys_io_setup, sys_io_destroy
+diff --git a/arch/sparc64/kernel/systbls.h b/arch/sparc64/kernel/systbls.h
+index bc9f5da..15c2d75 100644
+--- a/arch/sparc64/kernel/systbls.h
++++ b/arch/sparc64/kernel/systbls.h
+@@ -16,9 +16,6 @@ extern asmlinkage long sys_ipc(unsigned int call, int first,
+                              void __user *ptr, long fifth);
+ extern asmlinkage long sparc64_newuname(struct new_utsname __user *name);
+ extern asmlinkage long sparc64_personality(unsigned long personality);
+-extern asmlinkage unsigned long sys_mmap(unsigned long addr, unsigned long len,
+-                                       unsigned long prot, unsigned long flags,
+-                                       unsigned long fd, unsigned long off);
+ extern asmlinkage long sys64_munmap(unsigned long addr, size_t len);
+ extern asmlinkage unsigned long sys64_mremap(unsigned long addr,
+                                            unsigned long old_len,
+diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
+index f370d38..c4e6cc9 100644
+--- a/arch/x86/kernel/vmi_32.c
++++ b/arch/x86/kernel/vmi_32.c
+@@ -430,6 +430,16 @@ static void vmi_release_pmd(u32 pfn)
+ }
+ /*
++ * We use the pgd_free hook for releasing the pgd page:
++ */
++static void vmi_pgd_free(struct mm_struct *mm, pgd_t *pgd)
++{
++      unsigned long pfn = __pa(pgd) >> PAGE_SHIFT;
++
++      vmi_ops.release_page(pfn, VMI_PAGE_L2);
++}
++
++/*
+  * Helper macros for MMU update flags.  We can defer updates until a flush
+  * or page invalidation only if the update is to the current address space
+  * (otherwise, there is no flush).  We must check against init_mm, since
+@@ -881,6 +891,7 @@ static inline int __init activate_vmi(void)
+       if (vmi_ops.release_page) {
+               pv_mmu_ops.release_pte = vmi_release_pte;
+               pv_mmu_ops.release_pmd = vmi_release_pmd;
++              pv_mmu_ops.pgd_free = vmi_pgd_free;
+       }
+       /* Set linear is needed in all cases */
+diff --git a/arch/x86/pci/fixup.c b/arch/x86/pci/fixup.c
+index 4bdaa59..315b071 100644
+--- a/arch/x86/pci/fixup.c
++++ b/arch/x86/pci/fixup.c
+@@ -496,18 +496,21 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015,
+                         pci_siemens_interrupt_controller);
+ /*
+- * Regular PCI devices have 256 bytes, but AMD Family 10h Opteron ext config
+- * have 4096 bytes.  Even if the device is capable, that doesn't mean we can
+- * access it.  Maybe we don't have a way to generate extended config space
+- * accesses.   So check it
++ * Regular PCI devices have 256 bytes, but AMD Family 10h/11h CPUs have
++ * 4096 bytes configuration space for each function of their processor
++ * configuration space.
+  */
+-static void fam10h_pci_cfg_space_size(struct pci_dev *dev)
++static void amd_cpu_pci_cfg_space_size(struct pci_dev *dev)
+ {
+       dev->cfg_size = pci_cfg_space_size_ext(dev);
+ }
+-
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, fam10h_pci_cfg_space_size);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, fam10h_pci_cfg_space_size);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, fam10h_pci_cfg_space_size);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, fam10h_pci_cfg_space_size);
+-DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, fam10h_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1200, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1201, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1202, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1203, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1204, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1300, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1301, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1302, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1303, amd_cpu_pci_cfg_space_size);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, 0x1304, amd_cpu_pci_cfg_space_size);
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index 2c4ccec..154e7d6 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -2694,12 +2694,13 @@ static int ata_eh_handle_dev_fail(struct ata_device *dev, int err)
+               /* give it just one more chance */
+               ehc->tries[dev->devno] = min(ehc->tries[dev->devno], 1);
+       case -EIO:
+-              if (ehc->tries[dev->devno] == 1 && dev->pio_mode > XFER_PIO_0) {
++              if (ehc->tries[dev->devno] == 1) {
+                       /* This is the last chance, better to slow
+                        * down than lose it.
+                        */
+                       sata_down_spd_limit(dev->link);
+-                      ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
++                      if (dev->pio_mode > XFER_PIO_0)
++                              ata_down_xfermask_limit(dev, ATA_DNXFER_PIO);
+               }
+       }
+diff --git a/drivers/block/nbd.c b/drivers/block/nbd.c
+index 1778e4a..814ffd9 100644
+--- a/drivers/block/nbd.c
++++ b/drivers/block/nbd.c
+@@ -547,6 +547,15 @@ static void do_nbd_request(struct request_queue * q)
+               BUG_ON(lo->magic != LO_MAGIC);
++              if (unlikely(!lo->sock)) {
++                      printk(KERN_ERR "%s: Attempted send on closed socket\n",
++                              lo->disk->disk_name);
++                      req->errors++;
++                      nbd_end_request(req);
++                      spin_lock_irq(q->queue_lock);
++                      continue;
++              }
++
+               spin_lock_irq(&lo->queue_lock);
+               list_add_tail(&req->queuelist, &lo->waiting_queue);
+               spin_unlock_irq(&lo->queue_lock);
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index e87956a..1371184 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -1130,24 +1130,16 @@ static void usbhid_fixup_button_consumer_descriptor(unsigned char *rdesc, int rs
+ }
+ /*
+- * Microsoft Wireless Desktop Receiver (Model 1028) has several
++ * Microsoft Wireless Desktop Receiver (Model 1028) has
+  * 'Usage Min/Max' where it ought to have 'Physical Min/Max'
+  */
+ static void usbhid_fixup_microsoft_descriptor(unsigned char *rdesc, int rsize)
+ {
+-      if (rsize == 571 && rdesc[284] == 0x19
+-                       && rdesc[286] == 0x2a
+-                       && rdesc[304] == 0x19
+-                       && rdesc[306] == 0x29
+-                       && rdesc[352] == 0x1a
+-                       && rdesc[355] == 0x2a
+-                       && rdesc[557] == 0x19
++      if (rsize == 571 && rdesc[557] == 0x19
+                        && rdesc[559] == 0x29) {
+               printk(KERN_INFO "Fixing up Microsoft Wireless Receiver Model 1028 report descriptor\n");
+-              rdesc[284] = rdesc[304] = rdesc[557] = 0x35;
+-              rdesc[352] = 0x36;
+-              rdesc[286] = rdesc[355] = 0x46;
+-              rdesc[306] = rdesc[559] = 0x45;
++              rdesc[557] = 0x35;
++              rdesc[559] = 0x45;
+       }
+ }
+diff --git a/drivers/net/skfp/skfddi.c b/drivers/net/skfp/skfddi.c
+index a2b092b..b7d829f 100644
+--- a/drivers/net/skfp/skfddi.c
++++ b/drivers/net/skfp/skfddi.c
+@@ -998,9 +998,9 @@ static int skfp_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+               break;
+       case SKFP_CLR_STATS:    /* Zero out the driver statistics */
+               if (!capable(CAP_NET_ADMIN)) {
+-                      memset(&lp->MacStat, 0, sizeof(lp->MacStat));
+-              } else {
+                       status = -EPERM;
++              } else {
++                      memset(&lp->MacStat, 0, sizeof(lp->MacStat));
+               }
+               break;
+       default:
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index b4be33a..b68bc39 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -1403,9 +1403,6 @@ static int sky2_up(struct net_device *dev)
+       }
+-      if (netif_msg_ifup(sky2))
+-              printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+-
+       netif_carrier_off(dev);
+       /* must be power of 2 */
+@@ -1484,6 +1481,9 @@ static int sky2_up(struct net_device *dev)
+       sky2_write32(hw, B0_IMSK, imask);
+       sky2_set_multicast(dev);
++
++      if (netif_msg_ifup(sky2))
++              printk(KERN_INFO PFX "%s: enabling interface\n", dev->name);
+       return 0;
+ err_out:
+diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c
+index 4291458..88f9fd5 100644
+--- a/drivers/net/sungem.c
++++ b/drivers/net/sungem.c
+@@ -2205,6 +2205,8 @@ static int gem_do_start(struct net_device *dev)
+       gp->running = 1;
++      napi_enable(&gp->napi);
++
+       if (gp->lstate == link_up) {
+               netif_carrier_on(gp->dev);
+               gem_set_link_modes(gp);
+@@ -2222,6 +2224,8 @@ static int gem_do_start(struct net_device *dev)
+               spin_lock_irqsave(&gp->lock, flags);
+               spin_lock(&gp->tx_lock);
++              napi_disable(&gp->napi);
++
+               gp->running =  0;
+               gem_reset(gp);
+               gem_clean_rings(gp);
+@@ -2322,8 +2326,6 @@ static int gem_open(struct net_device *dev)
+       if (!gp->asleep)
+               rc = gem_do_start(dev);
+       gp->opened = (rc == 0);
+-      if (gp->opened)
+-              napi_enable(&gp->napi);
+       mutex_unlock(&gp->pm_mutex);
+@@ -2460,8 +2462,6 @@ static int gem_resume(struct pci_dev *pdev)
+               /* Re-attach net device */
+               netif_device_attach(dev);
+-
+-              napi_enable(&gp->napi);
+       }
+       spin_lock_irqsave(&gp->lock, flags);
+diff --git a/drivers/net/tun.c b/drivers/net/tun.c
+index 6daea0c..f00fcb5 100644
+--- a/drivers/net/tun.c
++++ b/drivers/net/tun.c
+@@ -157,10 +157,16 @@ static int update_filter(struct tap_filter *filter, void __user *arg)
+       nexact = n;
+-      /* The rest is hashed */
++      /* Remaining multicast addresses are hashed,
++       * unicast will leave the filter disabled. */
+       memset(filter->mask, 0, sizeof(filter->mask));
+-      for (; n < uf.count; n++)
++      for (; n < uf.count; n++) {
++              if (!is_multicast_ether_addr(addr[n].u)) {
++                      err = 0; /* no filter */
++                      goto done;
++              }
+               addr_hash_set(filter->mask, addr[n].u);
++      }
+       /* For ALLMULTI just set the mask to all ones.
+        * This overrides the mask populated above. */
+diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
+index 0196a0d..ce743ec 100644
+--- a/drivers/net/virtio_net.c
++++ b/drivers/net/virtio_net.c
+@@ -24,6 +24,7 @@
+ #include <linux/virtio.h>
+ #include <linux/virtio_net.h>
+ #include <linux/scatterlist.h>
++#include <linux/if_vlan.h>
+ static int napi_weight = 128;
+ module_param(napi_weight, int, 0444);
+@@ -33,7 +34,7 @@ module_param(csum, bool, 0444);
+ module_param(gso, bool, 0444);
+ /* FIXME: MTU in config. */
+-#define MAX_PACKET_LEN (ETH_HLEN+ETH_DATA_LEN)
++#define MAX_PACKET_LEN (ETH_HLEN + VLAN_HLEN + ETH_DATA_LEN)
+ struct virtnet_info
+ {
+diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
+index 3a90a67..87d020c 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
++++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
+@@ -704,7 +704,7 @@ static void iwl_bg_request_scan(struct work_struct *data)
+       u16 cmd_len;
+       enum ieee80211_band band;
+       u8 n_probes = 2;
+-      u8 rx_chain = 0x7; /* bitmap: ABC chains */
++      u8 rx_chain = priv->hw_params.valid_rx_ant;
+       conf = ieee80211_get_hw_conf(priv->hw);
+diff --git a/drivers/net/wireless/zd1211rw/zd_rf.c b/drivers/net/wireless/zd1211rw/zd_rf.c
+index ec41293..ead3073 100644
+--- a/drivers/net/wireless/zd1211rw/zd_rf.c
++++ b/drivers/net/wireless/zd1211rw/zd_rf.c
+@@ -86,6 +86,7 @@ int zd_rf_init_hw(struct zd_rf *rf, u8 type)
+       case AL7230B_RF:
+               r = zd_rf_init_al7230b(rf);
+               break;
++      case MAXIM_NEW_RF:
+       case UW2453_RF:
+               r = zd_rf_init_uw2453(rf);
+               break;
+diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
+index a3ccd8c..5d740b5 100644
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -37,6 +37,7 @@
+ static struct usb_device_id usb_ids[] = {
+       /* ZD1211 */
+       { USB_DEVICE(0x0ace, 0x1211), .driver_info = DEVICE_ZD1211 },
++      { USB_DEVICE(0x0ace, 0xa211), .driver_info = DEVICE_ZD1211 },
+       { USB_DEVICE(0x07b8, 0x6001), .driver_info = DEVICE_ZD1211 },
+       { USB_DEVICE(0x126f, 0xa006), .driver_info = DEVICE_ZD1211 },
+       { USB_DEVICE(0x6891, 0xa727), .driver_info = DEVICE_ZD1211 },
+diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c
+index 101ed49..032db81 100644
+--- a/drivers/parport/parport_serial.c
++++ b/drivers/parport/parport_serial.c
+@@ -64,6 +64,11 @@ struct parport_pc_pci {
+ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
+ {
++      /* the rule described below doesn't hold for this device */
++      if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
++                      dev->subsystem_vendor == PCI_VENDOR_ID_IBM &&
++                      dev->subsystem_device == 0x0299)
++              return -ENODEV;
+       /*
+        * Netmos uses the subdevice ID to indicate the number of parallel
+        * and serial ports.  The form is 0x00PS, where <P> is the number of
+diff --git a/drivers/w1/slaves/w1_therm.c b/drivers/w1/slaves/w1_therm.c
+index fb28aca..521a2db 100644
+--- a/drivers/w1/slaves/w1_therm.c
++++ b/drivers/w1/slaves/w1_therm.c
+@@ -113,7 +113,7 @@ static struct w1_therm_family_converter w1_therm_families[] = {
+ static inline int w1_DS18B20_convert_temp(u8 rom[9])
+ {
+-      s16 t = (rom[1] << 8) | rom[0];
++      int t = ((s16)rom[1] << 8) | rom[0];
+       t = t*1000/16;
+       return t;
+ }
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index 5235c67..c8f8d59 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -538,6 +538,7 @@ static int dev_ifsioc(unsigned int fd, unsigned int cmd, unsigned long arg)
+                * cannot be fixed without breaking all existing apps.
+                */
+               case TUNSETIFF:
++              case TUNGETIFF:
+               case SIOCGIFFLAGS:
+               case SIOCGIFMETRIC:
+               case SIOCGIFMTU:
+@@ -1982,6 +1983,11 @@ COMPATIBLE_IOCTL(TUNSETNOCSUM)
+ COMPATIBLE_IOCTL(TUNSETDEBUG)
+ COMPATIBLE_IOCTL(TUNSETPERSIST)
+ COMPATIBLE_IOCTL(TUNSETOWNER)
++COMPATIBLE_IOCTL(TUNSETLINK)
++COMPATIBLE_IOCTL(TUNSETGROUP)
++COMPATIBLE_IOCTL(TUNGETFEATURES)
++COMPATIBLE_IOCTL(TUNSETOFFLOAD)
++COMPATIBLE_IOCTL(TUNSETTXFILTER)
+ /* Big V */
+ COMPATIBLE_IOCTL(VT_SETMODE)
+ COMPATIBLE_IOCTL(VT_GETMODE)
+@@ -2573,6 +2579,7 @@ HANDLE_IOCTL(SIOCGIFPFLAGS, dev_ifsioc)
+ HANDLE_IOCTL(SIOCGIFTXQLEN, dev_ifsioc)
+ HANDLE_IOCTL(SIOCSIFTXQLEN, dev_ifsioc)
+ HANDLE_IOCTL(TUNSETIFF, dev_ifsioc)
++HANDLE_IOCTL(TUNGETIFF, dev_ifsioc)
+ HANDLE_IOCTL(SIOCETHTOOL, ethtool_ioctl)
+ HANDLE_IOCTL(SIOCBONDENSLAVE, bond_ioctl)
+ HANDLE_IOCTL(SIOCBONDRELEASE, bond_ioctl)
+diff --git a/fs/lockd/svclock.c b/fs/lockd/svclock.c
+index cf0d5c2..dc934da 100644
+--- a/fs/lockd/svclock.c
++++ b/fs/lockd/svclock.c
+@@ -418,7 +418,7 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+                       goto out;
+               case -EAGAIN:
+                       ret = nlm_lck_denied;
+-                      goto out;
++                      break;
+               case FILE_LOCK_DEFERRED:
+                       if (wait)
+                               break;
+@@ -434,6 +434,10 @@ nlmsvc_lock(struct svc_rqst *rqstp, struct nlm_file *file,
+                       goto out;
+       }
++      ret = nlm_lck_denied;
++      if (!wait)
++              goto out;
++
+       ret = nlm_lck_blocked;
+       /* Append to list of blocked */
+diff --git a/include/linux/ata.h b/include/linux/ata.h
+index 8a12d71..8297a3c 100644
+--- a/include/linux/ata.h
++++ b/include/linux/ata.h
+@@ -681,12 +681,17 @@ static inline int ata_id_current_chs_valid(const u16 *id)
+ static inline int ata_id_is_cfa(const u16 *id)
+ {
+-      if (id[ATA_ID_CONFIG] == 0x848A)        /* Standard CF */
++      if (id[ATA_ID_CONFIG] == 0x848A)        /* Traditional CF */
+               return 1;
+-      /* Could be CF hiding as standard ATA */
+-      if (ata_id_major_version(id) >= 3 &&
+-          id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
+-         (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
++      /*
++       * CF specs don't require specific value in the word 0 anymore and yet
++       * they forbid to report the ATA version in the word 80 and require the
++       * CFA feature set support to be indicated in the word 83 in this case.
++       * Unfortunately, some cards only follow either of this requirements,
++       * and while those that don't indicate CFA feature support need some
++       * sort of quirk list, it seems impractical for the ones that do...
++       */
++      if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004)
+               return 1;
+       return 0;
+ }
+diff --git a/include/linux/syscalls.h b/include/linux/syscalls.h
+index f54aa38..258a17b 100644
+--- a/include/linux/syscalls.h
++++ b/include/linux/syscalls.h
+@@ -95,13 +95,13 @@ struct old_linux_dirent;
+ #define __SC_TEST5(t5, a5, ...)       __SC_TEST(t5); __SC_TEST4(__VA_ARGS__)
+ #define __SC_TEST6(t6, a6, ...)       __SC_TEST(t6); __SC_TEST5(__VA_ARGS__)
+-#define SYSCALL_DEFINE0(name)   asmlinkage long sys_##name(void)
+-#define SYSCALL_DEFINE1(...)    SYSCALL_DEFINEx(1, __VA_ARGS__)
+-#define SYSCALL_DEFINE2(...)    SYSCALL_DEFINEx(2, __VA_ARGS__)
+-#define SYSCALL_DEFINE3(...)    SYSCALL_DEFINEx(3, __VA_ARGS__)
+-#define SYSCALL_DEFINE4(...)    SYSCALL_DEFINEx(4, __VA_ARGS__)
+-#define SYSCALL_DEFINE5(...)    SYSCALL_DEFINEx(5, __VA_ARGS__)
+-#define SYSCALL_DEFINE6(...)    SYSCALL_DEFINEx(6, __VA_ARGS__)
++#define SYSCALL_DEFINE0(name)    asmlinkage long sys_##name(void)
++#define SYSCALL_DEFINE1(name, ...) SYSCALL_DEFINEx(1, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE2(name, ...) SYSCALL_DEFINEx(2, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE4(name, ...) SYSCALL_DEFINEx(4, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE5(name, ...) SYSCALL_DEFINEx(5, _##name, __VA_ARGS__)
++#define SYSCALL_DEFINE6(name, ...) SYSCALL_DEFINEx(6, _##name, __VA_ARGS__)
+ #ifdef CONFIG_PPC64
+ #define SYSCALL_ALIAS(alias, name)                                    \
+@@ -116,21 +116,21 @@ struct old_linux_dirent;
+ #define SYSCALL_DEFINE(name) static inline long SYSC_##name
+ #define SYSCALL_DEFINEx(x, name, ...)                                 \
+-      asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__));          \
+-      static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__));      \
+-      asmlinkage long SyS_##name(__SC_LONG##x(__VA_ARGS__))           \
++      asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__));           \
++      static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__));       \
++      asmlinkage long SyS##name(__SC_LONG##x(__VA_ARGS__))            \
+       {                                                               \
+               __SC_TEST##x(__VA_ARGS__);                              \
+-              return (long) SYSC_##name(__SC_CAST##x(__VA_ARGS__));   \
++              return (long) SYSC##name(__SC_CAST##x(__VA_ARGS__));    \
+       }                                                               \
+-      SYSCALL_ALIAS(sys_##name, SyS_##name);                          \
+-      static inline long SYSC_##name(__SC_DECL##x(__VA_ARGS__))
++      SYSCALL_ALIAS(sys##name, SyS##name);                            \
++      static inline long SYSC##name(__SC_DECL##x(__VA_ARGS__))
+ #else /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+ #define SYSCALL_DEFINE(name) asmlinkage long sys_##name
+ #define SYSCALL_DEFINEx(x, name, ...)                                 \
+-      asmlinkage long sys_##name(__SC_DECL##x(__VA_ARGS__))
++      asmlinkage long sys##name(__SC_DECL##x(__VA_ARGS__))
+ #endif /* CONFIG_HAVE_SYSCALL_WRAPPERS */
+diff --git a/include/net/sctp/checksum.h b/include/net/sctp/checksum.h
+index b799fb2..2fec3c3 100644
+--- a/include/net/sctp/checksum.h
++++ b/include/net/sctp/checksum.h
+@@ -79,5 +79,5 @@ static inline __be32 sctp_update_cksum(__u8 *buffer, __u16 length, __be32 crc32)
+ static inline __be32 sctp_end_cksum(__be32 crc32)
+ {
+-      return ~crc32;
++      return (__force __be32)~cpu_to_le32((__force u32)crc32);
+ }
+diff --git a/mm/page-writeback.c b/mm/page-writeback.c
+index 8875822..5f7cdc2 100644
+--- a/mm/page-writeback.c
++++ b/mm/page-writeback.c
+@@ -985,13 +985,25 @@ continue_unlock:
+                               }
+                       }
+-                      if (wbc->sync_mode == WB_SYNC_NONE) {
++                      if (wbc->nr_to_write > 0) {
+                               wbc->nr_to_write--;
+-                              if (wbc->nr_to_write <= 0) {
++                              if (wbc->nr_to_write == 0 &&
++                                  wbc->sync_mode == WB_SYNC_NONE) {
++                                      /*
++                                       * We stop writing back only if we are
++                                       * not doing integrity sync. In case of
++                                       * integrity sync we have to keep going
++                                       * because someone may be concurrently
++                                       * dirtying pages, and we might have
++                                       * synced a lot of newly appeared dirty
++                                       * pages, but have not synced all of the
++                                       * old dirty pages.
++                                       */
+                                       done = 1;
+                                       break;
+                               }
+                       }
++
+                       if (wbc->nonblocking && bdi_write_congested(bdi)) {
+                               wbc->encountered_congestion = 1;
+                               done = 1;
+@@ -1001,7 +1013,7 @@ continue_unlock:
+               pagevec_release(&pvec);
+               cond_resched();
+       }
+-      if (!cycled) {
++      if (!cycled && !done) {
+               /*
+                * range_cyclic:
+                * We hit the last page and there is more work to be done: wrap
+diff --git a/net/bluetooth/hidp/core.c b/net/bluetooth/hidp/core.c
+index 96434d7..0abd0ef 100644
+--- a/net/bluetooth/hidp/core.c
++++ b/net/bluetooth/hidp/core.c
+@@ -684,6 +684,10 @@ static const struct {
+ } hidp_blacklist[] = {
+       /* Apple wireless Mighty Mouse */
+       { 0x05ac, 0x030c, HID_QUIRK_MIGHTYMOUSE | HID_QUIRK_INVERT_HWHEEL },
++      /* Apple Wireless Keyboard */
++      { 0x05ac, 0x022c, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
++      { 0x05ac, 0x022d, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN | HID_QUIRK_APPLE_ISO_KEYBOARD },
++      { 0x05ac, 0x022e, HID_QUIRK_APPLE_NUMLOCK_EMULATION | HID_QUIRK_APPLE_HAS_FN },
+       { }     /* Terminating entry */
+ };
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index ca1ccdf..53425fa 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -73,17 +73,13 @@ static struct kmem_cache *skbuff_fclone_cache __read_mostly;
+ static void sock_pipe_buf_release(struct pipe_inode_info *pipe,
+                                 struct pipe_buffer *buf)
+ {
+-      struct sk_buff *skb = (struct sk_buff *) buf->private;
+-
+-      kfree_skb(skb);
++      put_page(buf->page);
+ }
+ static void sock_pipe_buf_get(struct pipe_inode_info *pipe,
+                               struct pipe_buffer *buf)
+ {
+-      struct sk_buff *skb = (struct sk_buff *) buf->private;
+-
+-      skb_get(skb);
++      get_page(buf->page);
+ }
+ static int sock_pipe_buf_steal(struct pipe_inode_info *pipe,
+@@ -1262,9 +1258,19 @@ fault:
+  */
+ static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i)
+ {
+-      struct sk_buff *skb = (struct sk_buff *) spd->partial[i].private;
++      put_page(spd->pages[i]);
++}
+-      kfree_skb(skb);
++static inline struct page *linear_to_page(struct page *page, unsigned int len,
++                                        unsigned int offset)
++{
++      struct page *p = alloc_pages(GFP_KERNEL, 0);
++
++      if (!p)
++              return NULL;
++      memcpy(page_address(p) + offset, page_address(page) + offset, len);
++
++      return p;
+ }
+ /*
+@@ -1272,16 +1278,23 @@ static void sock_spd_release(struct splice_pipe_desc *spd, unsigned int i)
+  */
+ static inline int spd_fill_page(struct splice_pipe_desc *spd, struct page *page,
+                               unsigned int len, unsigned int offset,
+-                              struct sk_buff *skb)
++                              struct sk_buff *skb, int linear)
+ {
+       if (unlikely(spd->nr_pages == PIPE_BUFFERS))
+               return 1;
++      if (linear) {
++              page = linear_to_page(page, len, offset);
++              if (!page)
++                      return 1;
++      } else
++              get_page(page);
++
+       spd->pages[spd->nr_pages] = page;
+       spd->partial[spd->nr_pages].len = len;
+       spd->partial[spd->nr_pages].offset = offset;
+-      spd->partial[spd->nr_pages].private = (unsigned long) skb_get(skb);
+       spd->nr_pages++;
++
+       return 0;
+ }
+@@ -1297,7 +1310,7 @@ static inline void __segment_seek(struct page **page, unsigned int *poff,
+ static inline int __splice_segment(struct page *page, unsigned int poff,
+                                  unsigned int plen, unsigned int *off,
+                                  unsigned int *len, struct sk_buff *skb,
+-                                 struct splice_pipe_desc *spd)
++                                 struct splice_pipe_desc *spd, int linear)
+ {
+       if (!*len)
+               return 1;
+@@ -1320,7 +1333,7 @@ static inline int __splice_segment(struct page *page, unsigned int poff,
+               /* the linear region may spread across several pages  */
+               flen = min_t(unsigned int, flen, PAGE_SIZE - poff);
+-              if (spd_fill_page(spd, page, flen, poff, skb))
++              if (spd_fill_page(spd, page, flen, poff, skb, linear))
+                       return 1;
+               __segment_seek(&page, &poff, &plen, flen);
+@@ -1347,7 +1360,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset,
+       if (__splice_segment(virt_to_page(skb->data),
+                            (unsigned long) skb->data & (PAGE_SIZE - 1),
+                            skb_headlen(skb),
+-                           offset, len, skb, spd))
++                           offset, len, skb, spd, 1))
+               return 1;
+       /*
+@@ -1357,7 +1370,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset,
+               const skb_frag_t *f = &skb_shinfo(skb)->frags[seg];
+               if (__splice_segment(f->page, f->page_offset, f->size,
+-                                   offset, len, skb, spd))
++                                   offset, len, skb, spd, 0))
+                       return 1;
+       }
+@@ -1370,7 +1383,7 @@ static int __skb_splice_bits(struct sk_buff *skb, unsigned int *offset,
+  * the frag list, if such a thing exists. We'd probably need to recurse to
+  * handle that cleanly.
+  */
+-int skb_splice_bits(struct sk_buff *__skb, unsigned int offset,
++int skb_splice_bits(struct sk_buff *skb, unsigned int offset,
+                   struct pipe_inode_info *pipe, unsigned int tlen,
+                   unsigned int flags)
+ {
+@@ -1383,16 +1396,6 @@ int skb_splice_bits(struct sk_buff *__skb, unsigned int offset,
+               .ops = &sock_pipe_buf_ops,
+               .spd_release = sock_spd_release,
+       };
+-      struct sk_buff *skb;
+-
+-      /*
+-       * I'd love to avoid the clone here, but tcp_read_sock()
+-       * ignores reference counts and unconditonally kills the sk_buff
+-       * on return from the actor.
+-       */
+-      skb = skb_clone(__skb, GFP_KERNEL);
+-      if (unlikely(!skb))
+-              return -ENOMEM;
+       /*
+        * __skb_splice_bits() only fails if the output has no room left,
+@@ -1416,15 +1419,9 @@ int skb_splice_bits(struct sk_buff *__skb, unsigned int offset,
+       }
+ done:
+-      /*
+-       * drop our reference to the clone, the pipe consumption will
+-       * drop the rest.
+-       */
+-      kfree_skb(skb);
+-
+       if (spd.nr_pages) {
++              struct sock *sk = skb->sk;
+               int ret;
+-              struct sock *sk = __skb->sk;
+               /*
+                * Drop the socket lock, otherwise we have reverse
+@@ -2001,10 +1998,10 @@ unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
+               return 0;
+ next_skb:
+-      block_limit = skb_headlen(st->cur_skb);
++      block_limit = skb_headlen(st->cur_skb) + st->stepped_offset;
+       if (abs_offset < block_limit) {
+-              *data = st->cur_skb->data + abs_offset;
++              *data = st->cur_skb->data + (abs_offset - st->stepped_offset);
+               return block_limit - abs_offset;
+       }
+@@ -2039,13 +2036,14 @@ next_skb:
+               st->frag_data = NULL;
+       }
+-      if (st->cur_skb->next) {
+-              st->cur_skb = st->cur_skb->next;
++      if (st->root_skb == st->cur_skb &&
++          skb_shinfo(st->root_skb)->frag_list) {
++              st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
+               st->frag_idx = 0;
+               goto next_skb;
+-      } else if (st->root_skb == st->cur_skb &&
+-                 skb_shinfo(st->root_skb)->frag_list) {
+-              st->cur_skb = skb_shinfo(st->root_skb)->frag_list;
++      } else if (st->cur_skb->next) {
++              st->cur_skb = st->cur_skb->next;
++              st->frag_idx = 0;
+               goto next_skb;
+       }
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 91f8bbc..b1b2f22 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -695,6 +695,8 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
+       if (len < 0)
+               return -EINVAL;
++      v.val = 0;
++
+       switch(optname) {
+       case SO_DEBUG:
+               v.val = sock_flag(sk, SOCK_DBG);
+diff --git a/net/ipv4/ipconfig.c b/net/ipv4/ipconfig.c
+index 42065ff..ff75000 100644
+--- a/net/ipv4/ipconfig.c
++++ b/net/ipv4/ipconfig.c
+@@ -1272,6 +1272,9 @@ __be32 __init root_nfs_parse_addr(char *name)
+ static int __init ip_auto_config(void)
+ {
+       __be32 addr;
++#ifdef IPCONFIG_DYNAMIC
++      int retries = CONF_OPEN_RETRIES;
++#endif
+ #ifdef CONFIG_PROC_FS
+       proc_net_fops_create(&init_net, "pnp", S_IRUGO, &pnp_seq_fops);
+@@ -1308,9 +1311,6 @@ static int __init ip_auto_config(void)
+ #endif
+           ic_first_dev->next) {
+ #ifdef IPCONFIG_DYNAMIC
+-
+-              int retries = CONF_OPEN_RETRIES;
+-
+               if (ic_dynamic() < 0) {
+                       ic_close_devs();
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index f57d576..9440ba6 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -518,8 +518,13 @@ static int tcp_splice_data_recv(read_descriptor_t *rd_desc, struct sk_buff *skb,
+                               unsigned int offset, size_t len)
+ {
+       struct tcp_splice_state *tss = rd_desc->arg.data;
++      int ret;
+-      return skb_splice_bits(skb, offset, tss->pipe, tss->len, tss->flags);
++      ret = skb_splice_bits(skb, offset, tss->pipe, min(rd_desc->count, len),
++                            tss->flags);
++      if (ret > 0)
++              rd_desc->count -= ret;
++      return ret;
+ }
+ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
+@@ -527,6 +532,7 @@ static int __tcp_splice_read(struct sock *sk, struct tcp_splice_state *tss)
+       /* Store TCP splice context information in read_descriptor_t. */
+       read_descriptor_t rd_desc = {
+               .arg.data = tss,
++              .count    = tss->len,
+       };
+       return tcp_read_sock(sk, &rd_desc, tcp_splice_data_recv);
+@@ -611,11 +617,13 @@ ssize_t tcp_splice_read(struct socket *sock, loff_t *ppos,
+               tss.len -= ret;
+               spliced += ret;
++              if (!timeo)
++                      break;
+               release_sock(sk);
+               lock_sock(sk);
+               if (sk->sk_err || sk->sk_state == TCP_CLOSE ||
+-                  (sk->sk_shutdown & RCV_SHUTDOWN) || !timeo ||
++                  (sk->sk_shutdown & RCV_SHUTDOWN) ||
+                   signal_pending(current))
+                       break;
+       }
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 915e6b7..a9b62ee 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -959,9 +959,11 @@ static int __udp_queue_rcv_skb(struct sock *sk, struct sk_buff *skb)
+       if ((rc = sock_queue_rcv_skb(sk, skb)) < 0) {
+               /* Note that an ENOMEM error is charged twice */
+-              if (rc == -ENOMEM)
++              if (rc == -ENOMEM) {
+                       UDP_INC_STATS_BH(sock_net(sk), UDP_MIB_RCVBUFERRORS,
+                                        is_udplite);
++                      atomic_inc(&sk->sk_drops);
++              }
+               goto drop;
+       }
+@@ -1172,7 +1174,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
+                  int proto)
+ {
+       struct sock *sk;
+-      struct udphdr *uh = udp_hdr(skb);
++      struct udphdr *uh;
+       unsigned short ulen;
+       struct rtable *rt = (struct rtable*)skb->dst;
+       __be32 saddr = ip_hdr(skb)->saddr;
+@@ -1185,6 +1187,7 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct hlist_head udptable[],
+       if (!pskb_may_pull(skb, sizeof(struct udphdr)))
+               goto drop;              /* No space for header. */
++      uh   = udp_hdr(skb);
+       ulen = ntohs(uh->len);
+       if (ulen > skb->len)
+               goto short_packet;
+diff --git a/net/ipv6/ip6_flowlabel.c b/net/ipv6/ip6_flowlabel.c
+index 37a4e77..489a7fd 100644
+--- a/net/ipv6/ip6_flowlabel.c
++++ b/net/ipv6/ip6_flowlabel.c
+@@ -323,17 +323,21 @@ static struct ip6_flowlabel *
+ fl_create(struct net *net, struct in6_flowlabel_req *freq, char __user *optval,
+         int optlen, int *err_p)
+ {
+-      struct ip6_flowlabel *fl;
++      struct ip6_flowlabel *fl = NULL;
+       int olen;
+       int addr_type;
+       int err;
++      olen = optlen - CMSG_ALIGN(sizeof(*freq));
++      err = -EINVAL;
++      if (olen > 64 * 1024)
++              goto done;
++
+       err = -ENOMEM;
+       fl = kzalloc(sizeof(*fl), GFP_KERNEL);
+       if (fl == NULL)
+               goto done;
+-      olen = optlen - CMSG_ALIGN(sizeof(*freq));
+       if (olen > 0) {
+               struct msghdr msg;
+               struct flowi flowi;
+diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
+index 3df2c44..a423200 100644
+--- a/net/ipv6/ip6_output.c
++++ b/net/ipv6/ip6_output.c
+@@ -1091,6 +1091,18 @@ static inline int ip6_ufo_append_data(struct sock *sk,
+       return err;
+ }
++static inline struct ipv6_opt_hdr *ip6_opt_dup(struct ipv6_opt_hdr *src,
++                                             gfp_t gfp)
++{
++      return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
++}
++
++static inline struct ipv6_rt_hdr *ip6_rthdr_dup(struct ipv6_rt_hdr *src,
++                                              gfp_t gfp)
++{
++      return src ? kmemdup(src, (src->hdrlen + 1) * 8, gfp) : NULL;
++}
++
+ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+       int offset, int len, int odd, struct sk_buff *skb),
+       void *from, int length, int transhdrlen,
+@@ -1116,17 +1128,37 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+                * setup for corking
+                */
+               if (opt) {
+-                      if (np->cork.opt == NULL) {
+-                              np->cork.opt = kmalloc(opt->tot_len,
+-                                                     sk->sk_allocation);
+-                              if (unlikely(np->cork.opt == NULL))
+-                                      return -ENOBUFS;
+-                      } else if (np->cork.opt->tot_len < opt->tot_len) {
+-                              printk(KERN_DEBUG "ip6_append_data: invalid option length\n");
++                      if (WARN_ON(np->cork.opt))
+                               return -EINVAL;
+-                      }
+-                      memcpy(np->cork.opt, opt, opt->tot_len);
+-                      inet->cork.flags |= IPCORK_OPT;
++
++                      np->cork.opt = kmalloc(opt->tot_len, sk->sk_allocation);
++                      if (unlikely(np->cork.opt == NULL))
++                              return -ENOBUFS;
++
++                      np->cork.opt->tot_len = opt->tot_len;
++                      np->cork.opt->opt_flen = opt->opt_flen;
++                      np->cork.opt->opt_nflen = opt->opt_nflen;
++
++                      np->cork.opt->dst0opt = ip6_opt_dup(opt->dst0opt,
++                                                          sk->sk_allocation);
++                      if (opt->dst0opt && !np->cork.opt->dst0opt)
++                              return -ENOBUFS;
++
++                      np->cork.opt->dst1opt = ip6_opt_dup(opt->dst1opt,
++                                                          sk->sk_allocation);
++                      if (opt->dst1opt && !np->cork.opt->dst1opt)
++                              return -ENOBUFS;
++
++                      np->cork.opt->hopopt = ip6_opt_dup(opt->hopopt,
++                                                         sk->sk_allocation);
++                      if (opt->hopopt && !np->cork.opt->hopopt)
++                              return -ENOBUFS;
++
++                      np->cork.opt->srcrt = ip6_rthdr_dup(opt->srcrt,
++                                                          sk->sk_allocation);
++                      if (opt->srcrt && !np->cork.opt->srcrt)
++                              return -ENOBUFS;
++
+                       /* need source address above miyazawa*/
+               }
+               dst_hold(&rt->u.dst);
+@@ -1153,8 +1185,7 @@ int ip6_append_data(struct sock *sk, int getfrag(void *from, char *to,
+       } else {
+               rt = (struct rt6_info *)inet->cork.dst;
+               fl = &inet->cork.fl;
+-              if (inet->cork.flags & IPCORK_OPT)
+-                      opt = np->cork.opt;
++              opt = np->cork.opt;
+               transhdrlen = 0;
+               exthdrlen = 0;
+               mtu = inet->cork.fragsize;
+@@ -1393,9 +1424,15 @@ error:
+ static void ip6_cork_release(struct inet_sock *inet, struct ipv6_pinfo *np)
+ {
+-      inet->cork.flags &= ~IPCORK_OPT;
+-      kfree(np->cork.opt);
+-      np->cork.opt = NULL;
++      if (np->cork.opt) {
++              kfree(np->cork.opt->dst0opt);
++              kfree(np->cork.opt->dst1opt);
++              kfree(np->cork.opt->hopopt);
++              kfree(np->cork.opt->srcrt);
++              kfree(np->cork.opt);
++              np->cork.opt = NULL;
++      }
++
+       if (inet->cork.dst) {
+               dst_release(inet->cork.dst);
+               inet->cork.dst = NULL;
+diff --git a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
+index 14d47d8..0610123 100644
+--- a/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
++++ b/net/ipv6/netfilter/nf_conntrack_proto_icmpv6.c
+@@ -49,8 +49,8 @@ static bool icmpv6_pkt_to_tuple(const struct sk_buff *skb,
+ static const u_int8_t invmap[] = {
+       [ICMPV6_ECHO_REQUEST - 128]     = ICMPV6_ECHO_REPLY + 1,
+       [ICMPV6_ECHO_REPLY - 128]       = ICMPV6_ECHO_REQUEST + 1,
+-      [ICMPV6_NI_QUERY - 128]         = ICMPV6_NI_QUERY + 1,
+-      [ICMPV6_NI_REPLY - 128]         = ICMPV6_NI_REPLY +1
++      [ICMPV6_NI_QUERY - 128]         = ICMPV6_NI_REPLY + 1,
++      [ICMPV6_NI_REPLY - 128]         = ICMPV6_NI_QUERY +1
+ };
+ static bool icmpv6_invert_tuple(struct nf_conntrack_tuple *tuple,
+diff --git a/net/mac80211/debugfs_sta.c b/net/mac80211/debugfs_sta.c
+index 79a0627..27bd353 100644
+--- a/net/mac80211/debugfs_sta.c
++++ b/net/mac80211/debugfs_sta.c
+@@ -200,7 +200,7 @@ static ssize_t sta_agg_status_write(struct file *file,
+               /* toggle Rx aggregation command */
+               tid_num = tid_num - 100;
+               if (tid_static_rx[tid_num] == 1) {
+-                      strcpy(state, "off ");
++                      strcpy(state, "off");
+                       ieee80211_sta_stop_rx_ba_session(dev, da, tid_num, 0,
+                                       WLAN_REASON_QSTA_REQUIRE_SETUP);
+                       sta->ampdu_mlme.tid_state_rx[tid_num] |=
+diff --git a/net/netfilter/xt_sctp.c b/net/netfilter/xt_sctp.c
+index e6e4681..aa7aec0 100644
+--- a/net/netfilter/xt_sctp.c
++++ b/net/netfilter/xt_sctp.c
+@@ -105,7 +105,7 @@ match_packet(const struct sk_buff *skb,
+       switch (chunk_match_type) {
+       case SCTP_CHUNK_MATCH_ALL:
+-              return SCTP_CHUNKMAP_IS_CLEAR(info->chunkmap);
++              return SCTP_CHUNKMAP_IS_CLEAR(chunkmapcopy);
+       case SCTP_CHUNK_MATCH_ANY:
+               return false;
+       case SCTP_CHUNK_MATCH_ONLY:
+diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
+index c718e7e..4b50878 100644
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -77,6 +77,7 @@
+ #include <linux/poll.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
++#include <linux/mutex.h>
+ #ifdef CONFIG_INET
+ #include <net/inet_common.h>
+@@ -175,6 +176,7 @@ struct packet_sock {
+ #endif
+       struct packet_type      prot_hook;
+       spinlock_t              bind_lock;
++      struct mutex            pg_vec_lock;
+       unsigned int            running:1,      /* prot_hook is attached*/
+                               auxdata:1,
+                               origdev:1;
+@@ -220,13 +222,13 @@ static void *packet_lookup_frame(struct packet_sock *po, unsigned int position,
+       h.raw = po->pg_vec[pg_vec_pos] + (frame_offset * po->frame_size);
+       switch (po->tp_version) {
+       case TPACKET_V1:
+-              if (status != h.h1->tp_status ? TP_STATUS_USER :
+-                                              TP_STATUS_KERNEL)
++              if (status != (h.h1->tp_status ? TP_STATUS_USER :
++                                              TP_STATUS_KERNEL))
+                       return NULL;
+               break;
+       case TPACKET_V2:
+-              if (status != h.h2->tp_status ? TP_STATUS_USER :
+-                                              TP_STATUS_KERNEL)
++              if (status != (h.h2->tp_status ? TP_STATUS_USER :
++                                              TP_STATUS_KERNEL))
+                       return NULL;
+               break;
+       }
+@@ -1068,6 +1070,7 @@ static int packet_create(struct net *net, struct socket *sock, int protocol)
+        */
+       spin_lock_init(&po->bind_lock);
++      mutex_init(&po->pg_vec_lock);
+       po->prot_hook.func = packet_rcv;
+       if (sock->type == SOCK_PACKET)
+@@ -1863,6 +1866,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
+       synchronize_net();
+       err = -EBUSY;
++      mutex_lock(&po->pg_vec_lock);
+       if (closing || atomic_read(&po->mapped) == 0) {
+               err = 0;
+ #define XC(a, b) ({ __typeof__ ((a)) __t; __t = (a); (a) = (b); __t; })
+@@ -1884,6 +1888,7 @@ static int packet_set_ring(struct sock *sk, struct tpacket_req *req, int closing
+               if (atomic_read(&po->mapped))
+                       printk(KERN_DEBUG "packet_mmap: vma is busy: %d\n", atomic_read(&po->mapped));
+       }
++      mutex_unlock(&po->pg_vec_lock);
+       spin_lock(&po->bind_lock);
+       if (was_running && !po->running) {
+@@ -1916,7 +1921,7 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st
+       size = vma->vm_end - vma->vm_start;
+-      lock_sock(sk);
++      mutex_lock(&po->pg_vec_lock);
+       if (po->pg_vec == NULL)
+               goto out;
+       if (size != po->pg_vec_len*po->pg_vec_pages*PAGE_SIZE)
+@@ -1939,7 +1944,7 @@ static int packet_mmap(struct file *file, struct socket *sock, struct vm_area_st
+       err = 0;
+ out:
+-      release_sock(sk);
++      mutex_unlock(&po->pg_vec_lock);
+       return err;
+ }
+ #endif
+diff --git a/net/sctp/output.c b/net/sctp/output.c
+index 225c712..e4746fd 100644
+--- a/net/sctp/output.c
++++ b/net/sctp/output.c
+@@ -324,14 +324,16 @@ append:
+       switch (chunk->chunk_hdr->type) {
+           case SCTP_CID_DATA:
+               retval = sctp_packet_append_data(packet, chunk);
++              if (SCTP_XMIT_OK != retval)
++                      goto finish;
+               /* Disallow SACK bundling after DATA. */
+               packet->has_sack = 1;
+               /* Disallow AUTH bundling after DATA */
+               packet->has_auth = 1;
+               /* Let it be knows that packet has DATA in it */
+               packet->has_data = 1;
+-              if (SCTP_XMIT_OK != retval)
+-                      goto finish;
++              /* timestamp the chunk for rtx purposes */
++              chunk->sent_at = jiffies;
+               break;
+           case SCTP_CID_COOKIE_ECHO:
+               packet->has_cookie_echo = 1;
+@@ -470,7 +472,6 @@ int sctp_packet_transmit(struct sctp_packet *packet)
+                       } else
+                               chunk->resent = 1;
+-                      chunk->sent_at = jiffies;
+                       has_data = 1;
+               }
+diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c
+index 4328ad5..fe11686 100644
+--- a/net/sctp/outqueue.c
++++ b/net/sctp/outqueue.c
+@@ -929,7 +929,6 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
+               }
+               /* Finally, transmit new packets.  */
+-              start_timer = 0;
+               while ((chunk = sctp_outq_dequeue_data(q)) != NULL) {
+                       /* RFC 2960 6.5 Every DATA chunk MUST carry a valid
+                        * stream identifier.
+@@ -1028,7 +1027,7 @@ static int sctp_outq_flush(struct sctp_outq *q, int rtx_timeout)
+                       list_add_tail(&chunk->transmitted_list,
+                                     &transport->transmitted);
+-                      sctp_transport_reset_timers(transport, start_timer-1);
++                      sctp_transport_reset_timers(transport, 0);
+                       q->empty = 0;
+diff --git a/scripts/kernel-doc b/scripts/kernel-doc
+index 44ee94d..0865a89 100755
+--- a/scripts/kernel-doc
++++ b/scripts/kernel-doc
+@@ -1758,6 +1758,40 @@ sub reset_state {
+     $state = 0;
+ }
++sub syscall_munge() {
++      my $void = 0;
++
++      $prototype =~ s@[\r\n\t]+@ @gos; # strip newlines/CR's/tabs
++##    if ($prototype =~ m/SYSCALL_DEFINE0\s*\(\s*(a-zA-Z0-9_)*\s*\)/) {
++      if ($prototype =~ m/SYSCALL_DEFINE0/) {
++              $void = 1;
++##            $prototype = "long sys_$1(void)";
++      }
++
++      $prototype =~ s/SYSCALL_DEFINE.*\(/long sys_/; # fix return type & func name
++      if ($prototype =~ m/long (sys_.*?),/) {
++              $prototype =~ s/,/\(/;
++      } elsif ($void) {
++              $prototype =~ s/\)/\(void\)/;
++      }
++
++      # now delete all of the odd-number commas in $prototype
++      # so that arg types & arg names don't have a comma between them
++      my $count = 0;
++      my $len = length($prototype);
++      if ($void) {
++              $len = 0;       # skip the for-loop
++      }
++      for (my $ix = 0; $ix < $len; $ix++) {
++              if (substr($prototype, $ix, 1) eq ',') {
++                      $count++;
++                      if ($count % 2 == 1) {
++                              substr($prototype, $ix, 1) = ' ';
++                      }
++              }
++      }
++}
++
+ sub process_state3_function($$) {
+     my $x = shift;
+     my $file = shift;
+@@ -1774,7 +1808,10 @@ sub process_state3_function($$) {
+       $prototype =~ s@/\*.*?\*/@@gos; # strip comments.
+       $prototype =~ s@[\r\n]+@ @gos; # strip newlines/cr's.
+       $prototype =~ s@^\s+@@gos; # strip leading spaces
+-      dump_function($prototype,$file);
++      if ($prototype =~ /SYSCALL_DEFINE/) {
++              syscall_munge();
++      }
++      dump_function($prototype, $file);
+       reset_state();
+     }
+ }
+diff --git a/sound/drivers/mtpav.c b/sound/drivers/mtpav.c
+index b5e1a71..04d50aa 100644
+--- a/sound/drivers/mtpav.c
++++ b/sound/drivers/mtpav.c
+@@ -706,7 +706,6 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev)
+       mtp_card->card = card;
+       mtp_card->irq = -1;
+       mtp_card->share_irq = 0;
+-      mtp_card->inmidiport = 0xffffffff;
+       mtp_card->inmidistate = 0;
+       mtp_card->outmidihwport = 0xffffffff;
+       init_timer(&mtp_card->timer);
+@@ -715,6 +714,8 @@ static int __devinit snd_mtpav_probe(struct platform_device *dev)
+       card->private_free = snd_mtpav_free;
++      mtp_card->inmidiport = mtp_card->num_ports + MTPAV_PIDX_BROADCAST;
++
+       err = snd_mtpav_get_ISA(mtp_card);
+       if (err < 0)
+               goto __error;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.18-19 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.18-19
new file mode 100644 (file)
index 0000000..7b64d96
--- /dev/null
@@ -0,0 +1,2554 @@
+From: Og <og@kroah.com>
+Subject: Linux 2.6.27.19
+
+Upstream 2.6.27.19 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 9273a73..dbe8543 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .18
++EXTRAVERSION = .19
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
+index 5af4e9b..ada0692 100644
+--- a/arch/powerpc/kernel/align.c
++++ b/arch/powerpc/kernel/align.c
+@@ -646,11 +646,16 @@ static int emulate_vsx(unsigned char __user *addr, unsigned int reg,
+                      unsigned int areg, struct pt_regs *regs,
+                      unsigned int flags, unsigned int length)
+ {
+-      char *ptr = (char *) &current->thread.TS_FPR(reg);
++      char *ptr;
+       int ret = 0;
+       flush_vsx_to_thread(current);
++      if (reg < 32)
++              ptr = (char *) &current->thread.TS_FPR(reg);
++      else
++              ptr = (char *) &current->thread.vr[reg - 32];
++
+       if (flags & ST)
+               ret = __copy_to_user(addr, ptr, length);
+         else {
+diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
+index 5b719a0..7c3b8dc 100644
+--- a/arch/x86/mm/pageattr.c
++++ b/arch/x86/mm/pageattr.c
+@@ -619,6 +619,13 @@ static int __change_page_attr(struct cpa_data *cpa, int primary)
+       unsigned int level;
+       pte_t *kpte, old_pte;
++      /*
++       * If we're called with lazy mmu updates enabled, the
++       * in-memory pte state may be stale.  Flush pending updates to
++       * bring them up to date.
++       */
++      arch_flush_lazy_mmu_mode();
++
+ repeat:
+       kpte = lookup_address(address, &level);
+       if (!kpte)
+@@ -836,6 +843,13 @@ static int change_page_attr_set_clr(unsigned long addr, int numpages,
+       else
+               cpa_flush_all(cache);
++      /*
++       * If we've been called with lazy mmu updates enabled, then
++       * make sure that everything gets flushed out before we
++       * return.
++       */
++      arch_flush_lazy_mmu_mode();
++
+ out:
+       cpa_fill_pool(NULL);
+diff --git a/drivers/ata/pata_via.c b/drivers/ata/pata_via.c
+index c5be6a1..b6f55e8 100644
+--- a/drivers/ata/pata_via.c
++++ b/drivers/ata/pata_via.c
+@@ -111,7 +111,8 @@ static const struct via_isa_bridge {
+       { "vt8237s",    PCI_DEVICE_ID_VIA_8237S,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8251",     PCI_DEVICE_ID_VIA_8251,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "cx700",      PCI_DEVICE_ID_VIA_CX700,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_SATA_PATA },
+-      { "vt6410",     PCI_DEVICE_ID_VIA_6410,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES},
++      { "vt6410",     PCI_DEVICE_ID_VIA_6410,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
++      { "vt6415",     PCI_DEVICE_ID_VIA_6415,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST | VIA_NO_ENABLES },
+       { "vt8237a",    PCI_DEVICE_ID_VIA_8237A,    0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8237",     PCI_DEVICE_ID_VIA_8237,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+       { "vt8235",     PCI_DEVICE_ID_VIA_8235,     0x00, 0x2f, VIA_UDMA_133 | VIA_BAD_AST },
+@@ -594,6 +595,7 @@ static int via_reinit_one(struct pci_dev *pdev)
+ #endif
+ static const struct pci_device_id via[] = {
++      { PCI_VDEVICE(VIA, 0x0415), },
+       { PCI_VDEVICE(VIA, 0x0571), },
+       { PCI_VDEVICE(VIA, 0x0581), },
+       { PCI_VDEVICE(VIA, 0x1571), },
+diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
+index 89e3b7f..8b6f9c0 100644
+--- a/drivers/ata/sata_nv.c
++++ b/drivers/ata/sata_nv.c
+@@ -421,19 +421,21 @@ static struct ata_port_operations nv_generic_ops = {
+       .hardreset              = ATA_OP_NULL,
+ };
+-/* OSDL bz3352 reports that nf2/3 controllers can't determine device
+- * signature reliably.  Also, the following thread reports detection
+- * failure on cold boot with the standard debouncing timing.
++/* nf2 is ripe with hardreset related problems.
++ *
++ * kernel bz#3352 reports nf2/3 controllers can't determine device
++ * signature reliably.  The following thread reports detection failure
++ * on cold boot with the standard debouncing timing.
+  *
+  * http://thread.gmane.org/gmane.linux.ide/34098
+  *
+- * Debounce with hotplug timing and request follow-up SRST.
++ * And bz#12176 reports that hardreset simply doesn't work on nf2.
++ * Give up on it and just don't do hardreset.
+  */
+ static struct ata_port_operations nv_nf2_ops = {
+-      .inherits               = &nv_common_ops,
++      .inherits               = &nv_generic_ops,
+       .freeze                 = nv_nf2_freeze,
+       .thaw                   = nv_nf2_thaw,
+-      .hardreset              = nv_noclassify_hardreset,
+ };
+ /* For initial probing after boot and hot plugging, hardreset mostly
+diff --git a/drivers/bluetooth/btsdio.c b/drivers/bluetooth/btsdio.c
+index 58630cc..f2ada0c 100644
+--- a/drivers/bluetooth/btsdio.c
++++ b/drivers/bluetooth/btsdio.c
+@@ -91,6 +91,7 @@ static int btsdio_tx_packet(struct btsdio_data *data, struct sk_buff *skb)
+       err = sdio_writesb(data->func, REG_TDAT, skb->data, skb->len);
+       if (err < 0) {
++              skb_pull(skb, 4);
+               sdio_writeb(data->func, 0x01, REG_PC_WRT, NULL);
+               return err;
+       }
+@@ -152,7 +153,7 @@ static int btsdio_rx_packet(struct btsdio_data *data)
+       err = sdio_readsb(data->func, skb->data, REG_RDAT, len - 4);
+       if (err < 0) {
+-              kfree(skb);
++              kfree_skb(skb);
+               return err;
+       }
+diff --git a/drivers/net/3c505.c b/drivers/net/3c505.c
+index fdfb2b2..ae8e36c 100644
+--- a/drivers/net/3c505.c
++++ b/drivers/net/3c505.c
+@@ -493,21 +493,27 @@ static bool receive_pcb(struct net_device *dev, pcb_struct * pcb)
+       }
+       /* read the data */
+       spin_lock_irqsave(&adapter->lock, flags);
+-      i = 0;
+-      do {
+-              j = 0;
+-              while (((stat = get_status(dev->base_addr)) & ACRF) == 0 && j++ < 20000);
+-              pcb->data.raw[i++] = inb_command(dev->base_addr);
+-              if (i > MAX_PCB_DATA)
+-                      INVALID_PCB_MSG(i);
+-      } while ((stat & ASF_PCB_MASK) != ASF_PCB_END && j < 20000);
++      for (i = 0; i < MAX_PCB_DATA; i++) {
++              for (j = 0; j < 20000; j++) {
++                      stat = get_status(dev->base_addr);
++                      if (stat & ACRF)
++                              break;
++              }
++              pcb->data.raw[i] = inb_command(dev->base_addr);
++              if ((stat & ASF_PCB_MASK) == ASF_PCB_END || j >= 20000)
++                      break;
++      }
+       spin_unlock_irqrestore(&adapter->lock, flags);
++      if (i >= MAX_PCB_DATA) {
++              INVALID_PCB_MSG(i);
++              return false;
++      }
+       if (j >= 20000) {
+               TIMEOUT_MSG(__LINE__);
+               return false;
+       }
+-      /* woops, the last "data" byte was really the length! */
+-      total_length = pcb->data.raw[--i];
++      /* the last "data" byte was really the length! */
++      total_length = pcb->data.raw[i];
+       /* safety check total length vs data length */
+       if (total_length != (pcb->length + 2)) {
+diff --git a/drivers/pci/intel-iommu.c b/drivers/pci/intel-iommu.c
+index c3edcdc..2d90a3c 100644
+--- a/drivers/pci/intel-iommu.c
++++ b/drivers/pci/intel-iommu.c
+@@ -72,6 +72,8 @@ static struct deferred_flush_tables *deferred_flush;
+ /* bitmap for indexing intel_iommus */
+ static int g_num_of_iommus;
++static int rwbf_quirk = 0;
++
+ static DEFINE_SPINLOCK(async_umap_flush_lock);
+ static LIST_HEAD(unmaps_to_do);
+@@ -527,7 +529,7 @@ static void iommu_flush_write_buffer(struct intel_iommu *iommu)
+       u32 val;
+       unsigned long flag;
+-      if (!cap_rwbf(iommu->cap))
++      if (!rwbf_quirk && !cap_rwbf(iommu->cap))
+               return;
+       val = iommu->gcmd | DMA_GCMD_WBF;
+@@ -2453,3 +2455,12 @@ int __init intel_iommu_init(void)
+       return 0;
+ }
++static void __devinit quirk_iommu_rwbf(struct pci_dev *dev)
++{
++      /* Mobile 4 Series Chipset neglects to set RWBF capability,
++         but needs it */
++      printk(KERN_INFO "DMAR: Forcing write-buffer flush capability\n");
++      rwbf_quirk = 1;
++}
++
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2a40, quirk_iommu_rwbf);
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 299e075..55ac5c3 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1844,6 +1844,7 @@ void iscsi_pool_free(struct iscsi_pool *q)
+               kfree(q->pool[i]);
+       if (q->pool)
+               kfree(q->pool);
++      kfree(q->queue);
+ }
+ EXPORT_SYMBOL_GPL(iscsi_pool_free);
+diff --git a/fs/ext2/super.c b/fs/ext2/super.c
+index fd88c7b..2ebc0c4 100644
+--- a/fs/ext2/super.c
++++ b/fs/ext2/super.c
+@@ -1177,9 +1177,12 @@ static int ext2_remount (struct super_block * sb, int * flags, char * data)
+       es = sbi->s_es;
+       if (((sbi->s_mount_opt & EXT2_MOUNT_XIP) !=
+           (old_mount_opt & EXT2_MOUNT_XIP)) &&
+-          invalidate_inodes(sb))
+-              ext2_warning(sb, __func__, "busy inodes while remounting "\
+-                           "xip remain in cache (no functional problem)");
++          invalidate_inodes(sb)) {
++              ext2_warning(sb, __func__, "refusing change of xip flag "
++                           "with busy inodes while remounting");
++              sbi->s_mount_opt &= ~EXT2_MOUNT_XIP;
++              sbi->s_mount_opt |= old_mount_opt & EXT2_MOUNT_XIP;
++      }
+       if ((*flags & MS_RDONLY) == (sb->s_flags & MS_RDONLY))
+               return 0;
+       if (*flags & MS_RDONLY) {
+diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c
+index e9fa960..8b7c776 100644
+--- a/fs/ext4/balloc.c
++++ b/fs/ext4/balloc.c
+@@ -20,6 +20,7 @@
+ #include "ext4.h"
+ #include "ext4_jbd2.h"
+ #include "group.h"
++#include "mballoc.h"
+ /*
+  * balloc.c contains the blocks allocation and deallocation routines
+@@ -318,18 +319,41 @@ ext4_read_block_bitmap(struct super_block *sb, ext4_group_t block_group)
+                           block_group, bitmap_blk);
+               return NULL;
+       }
+-      if (bh_uptodate_or_lock(bh))
++
++      if (bitmap_uptodate(bh))
+               return bh;
++      lock_buffer(bh);
++      if (bitmap_uptodate(bh)) {
++              unlock_buffer(bh);
++              return bh;
++      }
+       spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
+       if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
+               ext4_init_block_bitmap(sb, bh, block_group, desc);
++              set_bitmap_uptodate(bh);
+               set_buffer_uptodate(bh);
+               unlock_buffer(bh);
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
+               return bh;
+       }
+       spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
++      if (buffer_uptodate(bh)) {
++              /*
++               * if not uninit if bh is uptodate,
++               * bitmap is also uptodate
++               */
++              set_bitmap_uptodate(bh);
++              unlock_buffer(bh);
++              return bh;
++      }
++      /*
++       * submit the buffer_head for read. We can
++       * safely mark the bitmap as uptodate now.
++       * We do it here so the bitmap uptodate bit
++       * get set with buffer lock held.
++       */
++      set_bitmap_uptodate(bh);
+       if (bh_submit_read(bh) < 0) {
+               put_bh(bh);
+               ext4_error(sb, __func__,
+@@ -837,6 +861,136 @@ error_return:
+ }
+ /**
++ * ext4_add_groupblocks() -- Add given blocks to an existing group
++ * @handle:                   handle to this transaction
++ * @sb:                               super block
++ * @block:                    start physcial block to add to the block group
++ * @count:                    number of blocks to free
++ *
++ * This marks the blocks as free in the bitmap. We ask the
++ * mballoc to reload the buddy after this by setting group
++ * EXT4_GROUP_INFO_NEED_INIT_BIT flag
++ */
++void ext4_add_groupblocks(handle_t *handle, struct super_block *sb,
++                       ext4_fsblk_t block, unsigned long count)
++{
++      struct buffer_head *bitmap_bh = NULL;
++      struct buffer_head *gd_bh;
++      ext4_group_t block_group;
++      ext4_grpblk_t bit;
++      unsigned long i;
++      struct ext4_group_desc *desc;
++      struct ext4_super_block *es;
++      struct ext4_sb_info *sbi;
++      int err = 0, ret;
++      ext4_grpblk_t blocks_freed;
++      struct ext4_group_info *grp;
++
++      sbi = EXT4_SB(sb);
++      es = sbi->s_es;
++      ext4_debug("Adding block(s) %llu-%llu\n", block, block + count - 1);
++
++      ext4_get_group_no_and_offset(sb, block, &block_group, &bit);
++      grp = ext4_get_group_info(sb, block_group);
++      /*
++       * Check to see if we are freeing blocks across a group
++       * boundary.
++       */
++      if (bit + count > EXT4_BLOCKS_PER_GROUP(sb))
++              goto error_return;
++
++      bitmap_bh = ext4_read_block_bitmap(sb, block_group);
++      if (!bitmap_bh)
++              goto error_return;
++      desc = ext4_get_group_desc(sb, block_group, &gd_bh);
++      if (!desc)
++              goto error_return;
++
++      if (in_range(ext4_block_bitmap(sb, desc), block, count) ||
++          in_range(ext4_inode_bitmap(sb, desc), block, count) ||
++          in_range(block, ext4_inode_table(sb, desc), sbi->s_itb_per_group) ||
++          in_range(block + count - 1, ext4_inode_table(sb, desc),
++                   sbi->s_itb_per_group)) {
++              ext4_error(sb, __func__,
++                         "Adding blocks in system zones - "
++                          "Block = %llu, count = %lu",
++                          block, count);
++              goto error_return;
++      }
++
++      /*
++       * We are about to add blocks to the bitmap,
++       * so we need undo access.
++       */
++      BUFFER_TRACE(bitmap_bh, "getting undo access");
++      err = ext4_journal_get_undo_access(handle, bitmap_bh);
++      if (err)
++              goto error_return;
++
++      /*
++       * We are about to modify some metadata.  Call the journal APIs
++       * to unshare ->b_data if a currently-committing transaction is
++       * using it
++       */
++      BUFFER_TRACE(gd_bh, "get_write_access");
++      err = ext4_journal_get_write_access(handle, gd_bh);
++      if (err)
++              goto error_return;
++      /*
++       * make sure we don't allow a parallel init on other groups in the
++       * same buddy cache
++       */
++      down_write(&grp->alloc_sem);
++      for (i = 0, blocks_freed = 0; i < count; i++) {
++              BUFFER_TRACE(bitmap_bh, "clear bit");
++              if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
++                                              bit + i, bitmap_bh->b_data)) {
++                      ext4_error(sb, __func__,
++                                 "bit already cleared for block %llu",
++                                 (ext4_fsblk_t)(block + i));
++                      BUFFER_TRACE(bitmap_bh, "bit already cleared");
++              } else {
++                      blocks_freed++;
++              }
++      }
++      spin_lock(sb_bgl_lock(sbi, block_group));
++      le16_add_cpu(&desc->bg_free_blocks_count, blocks_freed);
++      desc->bg_checksum = ext4_group_desc_csum(sbi, block_group, desc);
++      spin_unlock(sb_bgl_lock(sbi, block_group));
++      percpu_counter_add(&sbi->s_freeblocks_counter, blocks_freed);
++
++      if (sbi->s_log_groups_per_flex) {
++              ext4_group_t flex_group = ext4_flex_group(sbi, block_group);
++              spin_lock(sb_bgl_lock(sbi, flex_group));
++              sbi->s_flex_groups[flex_group].free_blocks += blocks_freed;
++              spin_unlock(sb_bgl_lock(sbi, flex_group));
++      }
++      /*
++       * request to reload the buddy with the
++       * new bitmap information
++       */
++      set_bit(EXT4_GROUP_INFO_NEED_INIT_BIT, &(grp->bb_state));
++      ext4_mb_update_group_info(grp, blocks_freed);
++      up_write(&grp->alloc_sem);
++
++      /* We dirtied the bitmap block */
++      BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
++      err = ext4_journal_dirty_metadata(handle, bitmap_bh);
++
++      /* And the group descriptor block */
++      BUFFER_TRACE(gd_bh, "dirtied group descriptor block");
++      ret = ext4_journal_dirty_metadata(handle, gd_bh);
++      if (!err)
++              err = ret;
++      sb->s_dirt = 1;
++
++error_return:
++      brelse(bitmap_bh);
++      ext4_std_error(sb, err);
++      return;
++}
++
++/**
+  * ext4_free_blocks() -- Free given blocks and update quota
+  * @handle:           handle for this transaction
+  * @inode:            inode
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index 4829dac..85f58af 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -19,6 +19,7 @@
+ #include <linux/types.h>
+ #include <linux/blkdev.h>
+ #include <linux/magic.h>
++#include <linux/jbd2.h>
+ #include "ext4_i.h"
+ /*
+@@ -889,6 +890,9 @@ static inline __le16 ext4_rec_len_to_disk(unsigned len)
+ #define DX_HASH_LEGACY                0
+ #define DX_HASH_HALF_MD4      1
+ #define DX_HASH_TEA           2
++#define DX_HASH_LEGACY_UNSIGNED       3
++#define DX_HASH_HALF_MD4_UNSIGNED     4
++#define DX_HASH_TEA_UNSIGNED          5
+ #ifdef __KERNEL__
+@@ -988,9 +992,11 @@ extern ext4_fsblk_t ext4_has_free_blocks(struct ext4_sb_info *sbi,
+                                               ext4_fsblk_t nblocks);
+ extern void ext4_free_blocks (handle_t *handle, struct inode *inode,
+                       ext4_fsblk_t block, unsigned long count, int metadata);
+-extern void ext4_free_blocks_sb (handle_t *handle, struct super_block *sb,
+-                               ext4_fsblk_t block, unsigned long count,
++extern void ext4_free_blocks_sb(handle_t *handle, struct super_block *sb,
++                              ext4_fsblk_t block, unsigned long count,
+                               unsigned long *pdquot_freed_blocks);
++extern void ext4_add_groupblocks(handle_t *handle, struct super_block *sb,
++                              ext4_fsblk_t block, unsigned long count);
+ extern ext4_fsblk_t ext4_count_free_blocks (struct super_block *);
+ extern void ext4_check_blocks_bitmap (struct super_block *);
+ extern struct ext4_group_desc * ext4_get_group_desc(struct super_block * sb,
+@@ -1038,12 +1044,13 @@ extern int __init init_ext4_mballoc(void);
+ extern void exit_ext4_mballoc(void);
+ extern void ext4_mb_free_blocks(handle_t *, struct inode *,
+               unsigned long, unsigned long, int, unsigned long *);
+-extern int ext4_mb_add_more_groupinfo(struct super_block *sb,
++extern int ext4_mb_add_groupinfo(struct super_block *sb,
+               ext4_group_t i, struct ext4_group_desc *desc);
+ extern void ext4_mb_update_group_info(struct ext4_group_info *grp,
+               ext4_grpblk_t add);
+-
+-
++extern int ext4_mb_get_buddy_cache_lock(struct super_block *, ext4_group_t);
++extern void ext4_mb_put_buddy_cache_lock(struct super_block *,
++                                              ext4_group_t, int);
+ /* inode.c */
+ int ext4_forget(handle_t *handle, int is_metadata, struct inode *inode,
+               struct buffer_head *bh, ext4_fsblk_t blocknr);
+@@ -1167,8 +1174,11 @@ static inline void ext4_r_blocks_count_set(struct ext4_super_block *es,
+ static inline loff_t ext4_isize(struct ext4_inode *raw_inode)
+ {
+-      return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
+-              le32_to_cpu(raw_inode->i_size_lo);
++      if (S_ISREG(le16_to_cpu(raw_inode->i_mode)))
++              return ((loff_t)le32_to_cpu(raw_inode->i_size_high) << 32) |
++                      le32_to_cpu(raw_inode->i_size_lo);
++      else
++              return (loff_t) le32_to_cpu(raw_inode->i_size_lo);
+ }
+ static inline void ext4_isize_set(struct ext4_inode *raw_inode, loff_t i_size)
+@@ -1244,6 +1254,23 @@ extern int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode,
+                       sector_t block, unsigned long max_blocks,
+                       struct buffer_head *bh, int create,
+                       int extend_disksize, int flag);
++/*
++ * Add new method to test wether block and inode bitmaps are properly
++ * initialized. With uninit_bg reading the block from disk is not enough
++ * to mark the bitmap uptodate. We need to also zero-out the bitmap
++ */
++#define BH_BITMAP_UPTODATE BH_JBDPrivateStart
++
++static inline int bitmap_uptodate(struct buffer_head *bh)
++{
++      return (buffer_uptodate(bh) &&
++              test_bit(BH_BITMAP_UPTODATE, &(bh)->b_state));
++}
++static inline void set_bitmap_uptodate(struct buffer_head *bh)
++{
++      set_bit(BH_BITMAP_UPTODATE, &(bh)->b_state);
++}
++
+ #endif        /* __KERNEL__ */
+ #endif        /* _EXT4_H */
+diff --git a/fs/ext4/ext4_sb.h b/fs/ext4/ext4_sb.h
+index 6300226..f20df8a 100644
+--- a/fs/ext4/ext4_sb.h
++++ b/fs/ext4/ext4_sb.h
+@@ -56,6 +56,7 @@ struct ext4_sb_info {
+       u32 s_next_generation;
+       u32 s_hash_seed[4];
+       int s_def_hash_version;
++      int s_hash_unsigned;    /* 3 if hash should be signed, 0 if not */
+       struct percpu_counter s_freeblocks_counter;
+       struct percpu_counter s_freeinodes_counter;
+       struct percpu_counter s_dirs_counter;
+@@ -102,7 +103,8 @@ struct ext4_sb_info {
+       struct list_head s_committed_transaction;
+       spinlock_t s_md_lock;
+       tid_t s_last_transaction;
+-      unsigned short *s_mb_offsets, *s_mb_maxs;
++      unsigned short *s_mb_offsets;
++      unsigned int *s_mb_maxs;
+       /* tunables */
+       unsigned long s_stripe;
+diff --git a/fs/ext4/hash.c b/fs/ext4/hash.c
+index 1d6329d..bd7d14d 100644
+--- a/fs/ext4/hash.c
++++ b/fs/ext4/hash.c
+@@ -35,23 +35,71 @@ static void TEA_transform(__u32 buf[4], __u32 const in[])
+ /* The old legacy hash */
+-static __u32 dx_hack_hash (const char *name, int len)
++static __u32 dx_hack_hash_unsigned(const char *name, int len)
+ {
+-      __u32 hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
++      __u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
++      const unsigned char *ucp = (const unsigned char *) name;
++
++      while (len--) {
++              hash = hash1 + (hash0 ^ (((int) *ucp++) * 7152373));
++
++              if (hash & 0x80000000)
++                      hash -= 0x7fffffff;
++              hash1 = hash0;
++              hash0 = hash;
++      }
++      return hash0 << 1;
++}
++
++static __u32 dx_hack_hash_signed(const char *name, int len)
++{
++      __u32 hash, hash0 = 0x12a3fe2d, hash1 = 0x37abe8f9;
++      const signed char *scp = (const signed char *) name;
++
+       while (len--) {
+-              __u32 hash = hash1 + (hash0 ^ (*name++ * 7152373));
++              hash = hash1 + (hash0 ^ (((int) *scp++) * 7152373));
+-              if (hash & 0x80000000) hash -= 0x7fffffff;
++              if (hash & 0x80000000)
++                      hash -= 0x7fffffff;
+               hash1 = hash0;
+               hash0 = hash;
+       }
+-      return (hash0 << 1);
++      return hash0 << 1;
+ }
+-static void str2hashbuf(const char *msg, int len, __u32 *buf, int num)
++static void str2hashbuf_signed(const char *msg, int len, __u32 *buf, int num)
+ {
+       __u32   pad, val;
+       int     i;
++      const signed char *scp = (const signed char *) msg;
++
++      pad = (__u32)len | ((__u32)len << 8);
++      pad |= pad << 16;
++
++      val = pad;
++      if (len > num*4)
++              len = num * 4;
++      for (i = 0; i < len; i++) {
++              if ((i % 4) == 0)
++                      val = pad;
++              val = ((int) scp[i]) + (val << 8);
++              if ((i % 4) == 3) {
++                      *buf++ = val;
++                      val = pad;
++                      num--;
++              }
++      }
++      if (--num >= 0)
++              *buf++ = val;
++      while (--num >= 0)
++              *buf++ = pad;
++}
++
++static void str2hashbuf_unsigned(const char *msg, int len, __u32 *buf, int num)
++{
++      __u32   pad, val;
++      int     i;
++      const unsigned char *ucp = (const unsigned char *) msg;
+       pad = (__u32)len | ((__u32)len << 8);
+       pad |= pad << 16;
+@@ -62,7 +110,7 @@ static void str2hashbuf(const char *msg, int len, __u32 *buf, int num)
+       for (i=0; i < len; i++) {
+               if ((i % 4) == 0)
+                       val = pad;
+-              val = msg[i] + (val << 8);
++              val = ((int) ucp[i]) + (val << 8);
+               if ((i % 4) == 3) {
+                       *buf++ = val;
+                       val = pad;
+@@ -95,6 +143,8 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
+       const char      *p;
+       int             i;
+       __u32           in[8], buf[4];
++      void            (*str2hashbuf)(const char *, int, __u32 *, int) =
++                              str2hashbuf_signed;
+       /* Initialize the default seed for the hash checksum functions */
+       buf[0] = 0x67452301;
+@@ -113,13 +163,18 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
+       }
+       switch (hinfo->hash_version) {
++      case DX_HASH_LEGACY_UNSIGNED:
++              hash = dx_hack_hash_unsigned(name, len);
++              break;
+       case DX_HASH_LEGACY:
+-              hash = dx_hack_hash(name, len);
++              hash = dx_hack_hash_signed(name, len);
+               break;
++      case DX_HASH_HALF_MD4_UNSIGNED:
++              str2hashbuf = str2hashbuf_unsigned;
+       case DX_HASH_HALF_MD4:
+               p = name;
+               while (len > 0) {
+-                      str2hashbuf(p, len, in, 8);
++                      (*str2hashbuf)(p, len, in, 8);
+                       half_md4_transform(buf, in);
+                       len -= 32;
+                       p += 32;
+@@ -127,10 +182,12 @@ int ext4fs_dirhash(const char *name, int len, struct dx_hash_info *hinfo)
+               minor_hash = buf[2];
+               hash = buf[1];
+               break;
++      case DX_HASH_TEA_UNSIGNED:
++              str2hashbuf = str2hashbuf_unsigned;
+       case DX_HASH_TEA:
+               p = name;
+               while (len > 0) {
+-                      str2hashbuf(p, len, in, 4);
++                      (*str2hashbuf)(p, len, in, 4);
+                       TEA_transform(buf, in);
+                       len -= 16;
+                       p += 16;
+diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
+index 9805924..b994854 100644
+--- a/fs/ext4/ialloc.c
++++ b/fs/ext4/ialloc.c
+@@ -84,7 +84,7 @@ unsigned ext4_init_inode_bitmap(struct super_block *sb, struct buffer_head *bh,
+       }
+       memset(bh->b_data, 0, (EXT4_INODES_PER_GROUP(sb) + 7) / 8);
+-      mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), EXT4_BLOCKS_PER_GROUP(sb),
++      mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8,
+                       bh->b_data);
+       return EXT4_INODES_PER_GROUP(sb);
+@@ -115,18 +115,40 @@ ext4_read_inode_bitmap(struct super_block *sb, ext4_group_t block_group)
+                           block_group, bitmap_blk);
+               return NULL;
+       }
+-      if (bh_uptodate_or_lock(bh))
++      if (bitmap_uptodate(bh))
+               return bh;
++      lock_buffer(bh);
++      if (bitmap_uptodate(bh)) {
++              unlock_buffer(bh);
++              return bh;
++      }
+       spin_lock(sb_bgl_lock(EXT4_SB(sb), block_group));
+       if (desc->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
+               ext4_init_inode_bitmap(sb, bh, block_group, desc);
++              set_bitmap_uptodate(bh);
+               set_buffer_uptodate(bh);
+               unlock_buffer(bh);
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
+               return bh;
+       }
+       spin_unlock(sb_bgl_lock(EXT4_SB(sb), block_group));
++      if (buffer_uptodate(bh)) {
++              /*
++               * if not uninit if bh is uptodate,
++               * bitmap is also uptodate
++               */
++              set_bitmap_uptodate(bh);
++              unlock_buffer(bh);
++              return bh;
++      }
++      /*
++       * submit the buffer_head for read. We can
++       * safely mark the bitmap as uptodate now.
++       * We do it here so the bitmap uptodate bit
++       * get set with buffer lock held.
++       */
++      set_bitmap_uptodate(bh);
+       if (bh_submit_read(bh) < 0) {
+               put_bh(bh);
+               ext4_error(sb, __func__,
+@@ -567,6 +589,77 @@ static int find_group_other(struct super_block *sb, struct inode *parent,
+ }
+ /*
++ * claim the inode from the inode bitmap. If the group
++ * is uninit we need to take the groups's sb_bgl_lock
++ * and clear the uninit flag. The inode bitmap update
++ * and group desc uninit flag clear should be done
++ * after holding sb_bgl_lock so that ext4_read_inode_bitmap
++ * doesn't race with the ext4_claim_inode
++ */
++static int ext4_claim_inode(struct super_block *sb,
++                      struct buffer_head *inode_bitmap_bh,
++                      unsigned long ino, ext4_group_t group, int mode)
++{
++      int free = 0, retval = 0;
++      struct ext4_sb_info *sbi = EXT4_SB(sb);
++      struct ext4_group_desc *gdp = ext4_get_group_desc(sb, group, NULL);
++
++      spin_lock(sb_bgl_lock(sbi, group));
++      if (ext4_set_bit(ino, inode_bitmap_bh->b_data)) {
++              /* not a free inode */
++              retval = 1;
++              goto err_ret;
++      }
++      ino++;
++      if ((group == 0 && ino < EXT4_FIRST_INO(sb)) ||
++                      ino > EXT4_INODES_PER_GROUP(sb)) {
++              spin_unlock(sb_bgl_lock(sbi, group));
++              ext4_error(sb, __func__,
++                         "reserved inode or inode > inodes count - "
++                         "block_group = %lu, inode=%lu", group,
++                         ino + group * EXT4_INODES_PER_GROUP(sb));
++              return 1;
++      }
++      /* If we didn't allocate from within the initialized part of the inode
++       * table then we need to initialize up to this inode. */
++      if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
++
++              if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
++                      gdp->bg_flags &= cpu_to_le16(~EXT4_BG_INODE_UNINIT);
++                      /* When marking the block group with
++                       * ~EXT4_BG_INODE_UNINIT we don't want to depend
++                       * on the value of bg_itable_unused even though
++                       * mke2fs could have initialized the same for us.
++                       * Instead we calculated the value below
++                       */
++
++                      free = 0;
++              } else {
++                      free = EXT4_INODES_PER_GROUP(sb) -
++                              le16_to_cpu(gdp->bg_itable_unused);
++              }
++
++              /*
++               * Check the relative inode number against the last used
++               * relative inode number in this group. if it is greater
++               * we need to  update the bg_itable_unused count
++               *
++               */
++              if (ino > free)
++                      gdp->bg_itable_unused =
++                              cpu_to_le16(EXT4_INODES_PER_GROUP(sb) - ino);
++      }
++      le16_add_cpu(&gdp->bg_free_inodes_count, -1);
++      if (S_ISDIR(mode)) {
++              le16_add_cpu(&gdp->bg_used_dirs_count, 1);
++      }
++      gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp);
++err_ret:
++      spin_unlock(sb_bgl_lock(sbi, group));
++      return retval;
++}
++
++/*
+  * There are two policies for allocating an inode.  If the new inode is
+  * a directory, then a forward search is made for a block group with both
+  * free space and a low directory-to-inode ratio; if that fails, then of
+@@ -649,8 +742,12 @@ repeat_in_this_group:
+                       if (err)
+                               goto fail;
+-                      if (!ext4_set_bit_atomic(sb_bgl_lock(sbi, group),
+-                                              ino, bitmap_bh->b_data)) {
++                      BUFFER_TRACE(bh2, "get_write_access");
++                      err = ext4_journal_get_write_access(handle, bh2);
++                      if (err)
++                              goto fail;
++                      if (!ext4_claim_inode(sb, bitmap_bh,
++                                              ino, group, mode)) {
+                               /* we won it */
+                               BUFFER_TRACE(bitmap_bh,
+                                       "call ext4_journal_dirty_metadata");
+@@ -658,10 +755,13 @@ repeat_in_this_group:
+                                                               bitmap_bh);
+                               if (err)
+                                       goto fail;
++                              /* zero bit is inode number 1*/
++                              ino++;
+                               goto got;
+                       }
+                       /* we lost it */
+                       jbd2_journal_release_buffer(handle, bitmap_bh);
++                      jbd2_journal_release_buffer(handle, bh2);
+                       if (++ino < EXT4_INODES_PER_GROUP(sb))
+                               goto repeat_in_this_group;
+@@ -681,21 +781,6 @@ repeat_in_this_group:
+       goto out;
+ got:
+-      ino++;
+-      if ((group == 0 && ino < EXT4_FIRST_INO(sb)) ||
+-          ino > EXT4_INODES_PER_GROUP(sb)) {
+-              ext4_error(sb, __func__,
+-                         "reserved inode or inode > inodes count - "
+-                         "block_group = %lu, inode=%lu", group,
+-                         ino + group * EXT4_INODES_PER_GROUP(sb));
+-              err = -EIO;
+-              goto fail;
+-      }
+-
+-      BUFFER_TRACE(bh2, "get_write_access");
+-      err = ext4_journal_get_write_access(handle, bh2);
+-      if (err) goto fail;
+-
+       /* We may have to initialize the block bitmap if it isn't already */
+       if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM) &&
+           gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
+@@ -730,47 +815,10 @@ got:
+               if (err)
+                       goto fail;
+       }
+-
+-      spin_lock(sb_bgl_lock(sbi, group));
+-      /* If we didn't allocate from within the initialized part of the inode
+-       * table then we need to initialize up to this inode. */
+-      if (EXT4_HAS_RO_COMPAT_FEATURE(sb, EXT4_FEATURE_RO_COMPAT_GDT_CSUM)) {
+-              if (gdp->bg_flags & cpu_to_le16(EXT4_BG_INODE_UNINIT)) {
+-                      gdp->bg_flags &= cpu_to_le16(~EXT4_BG_INODE_UNINIT);
+-
+-                      /* When marking the block group with
+-                       * ~EXT4_BG_INODE_UNINIT we don't want to depend
+-                       * on the value of bg_itable_unused even though
+-                       * mke2fs could have initialized the same for us.
+-                       * Instead we calculated the value below
+-                       */
+-
+-                      free = 0;
+-              } else {
+-                      free = EXT4_INODES_PER_GROUP(sb) -
+-                              le16_to_cpu(gdp->bg_itable_unused);
+-              }
+-
+-              /*
+-               * Check the relative inode number against the last used
+-               * relative inode number in this group. if it is greater
+-               * we need to  update the bg_itable_unused count
+-               *
+-               */
+-              if (ino > free)
+-                      gdp->bg_itable_unused =
+-                              cpu_to_le16(EXT4_INODES_PER_GROUP(sb) - ino);
+-      }
+-
+-      le16_add_cpu(&gdp->bg_free_inodes_count, -1);
+-      if (S_ISDIR(mode)) {
+-              le16_add_cpu(&gdp->bg_used_dirs_count, 1);
+-      }
+-      gdp->bg_checksum = ext4_group_desc_csum(sbi, group, gdp);
+-      spin_unlock(sb_bgl_lock(sbi, group));
+-      BUFFER_TRACE(bh2, "call ext4_journal_dirty_metadata");
++      BUFFER_TRACE(bh2, "call ext4_handle_dirty_metadata");
+       err = ext4_journal_dirty_metadata(handle, bh2);
+-      if (err) goto fail;
++      if (err)
++              goto fail;
+       percpu_counter_dec(&sbi->s_freeinodes_counter);
+       if (S_ISDIR(mode))
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index d77f674..6e7f085 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -351,9 +351,9 @@ static int ext4_block_to_path(struct inode *inode,
+               final = ptrs;
+       } else {
+               ext4_warning(inode->i_sb, "ext4_block_to_path",
+-                              "block %lu > max",
++                              "block %lu > max in inode %lu",
+                               i_block + direct_blocks +
+-                              indirect_blocks + double_blocks);
++                              indirect_blocks + double_blocks, inode->i_ino);
+       }
+       if (boundary)
+               *boundary = final - 1 - (i_block & (ptrs - 1));
+@@ -1648,18 +1648,25 @@ struct mpage_da_data {
+  */
+ static int mpage_da_submit_io(struct mpage_da_data *mpd)
+ {
+-      struct address_space *mapping = mpd->inode->i_mapping;
+-      int ret = 0, err, nr_pages, i;
+-      unsigned long index, end;
++      long pages_skipped;
+       struct pagevec pvec;
++      unsigned long index, end;
++      int ret = 0, err, nr_pages, i;
++      struct inode *inode = mpd->inode;
++      struct address_space *mapping = inode->i_mapping;
+       BUG_ON(mpd->next_page <= mpd->first_page);
+-      pagevec_init(&pvec, 0);
++      /*
++       * We need to start from the first_page to the next_page - 1
++       * to make sure we also write the mapped dirty buffer_heads.
++       * If we look at mpd->lbh.b_blocknr we would only be looking
++       * at the currently mapped buffer_heads.
++       */
+       index = mpd->first_page;
+       end = mpd->next_page - 1;
++      pagevec_init(&pvec, 0);
+       while (index <= end) {
+-              /* XXX: optimize tail */
+               nr_pages = pagevec_lookup(&pvec, mapping, index, PAGEVEC_SIZE);
+               if (nr_pages == 0)
+                       break;
+@@ -1671,6 +1678,10 @@ static int mpage_da_submit_io(struct mpage_da_data *mpd)
+                               break;
+                       index++;
++                      BUG_ON(!PageLocked(page));
++                      BUG_ON(PageWriteback(page));
++
++                      pages_skipped = mpd->wbc->pages_skipped;
+                       err = mapping->a_ops->writepage(page, mpd->wbc);
+                       if (!err)
+                               mpd->pages_written++;
+@@ -1991,11 +2002,29 @@ static int __mpage_da_writepage(struct page *page,
+               bh = head;
+               do {
+                       BUG_ON(buffer_locked(bh));
++                      /*
++                       * We need to try to allocate
++                       * unmapped blocks in the same page.
++                       * Otherwise we won't make progress
++                       * with the page in ext4_da_writepage
++                       */
+                       if (buffer_dirty(bh) &&
+                               (!buffer_mapped(bh) || buffer_delay(bh))) {
+                               mpage_add_bh_to_extent(mpd, logical, bh);
+                               if (mpd->io_done)
+                                       return MPAGE_DA_EXTENT_TAIL;
++                      } else if (buffer_dirty(bh) && (buffer_mapped(bh))) {
++                              /*
++                               * mapped dirty buffer. We need to update
++                               * the b_state because we look at
++                               * b_state in mpage_da_map_blocks. We don't
++                               * update b_size because if we find an
++                               * unmapped buffer_head later we need to
++                               * use the b_state flag of that buffer_head.
++                               */
++                              if (mpd->lbh.b_size == 0)
++                                      mpd->lbh.b_state =
++                                              bh->b_state & BH_FLAGS;
+                       }
+                       logical++;
+               } while ((bh = bh->b_this_page) != head);
+@@ -2298,6 +2327,20 @@ static int ext4_da_writepages(struct address_space *mapping,
+        */
+       if (!mapping->nrpages || !mapping_tagged(mapping, PAGECACHE_TAG_DIRTY))
+               return 0;
++
++      /*
++       * If the filesystem has aborted, it is read-only, so return
++       * right away instead of dumping stack traces later on that
++       * will obscure the real source of the problem.  We test
++       * EXT4_MOUNT_ABORT instead of sb->s_flag's MS_RDONLY because
++       * the latter could be true if the filesystem is mounted
++       * read-only, and in that case, ext4_da_writepages should
++       * *never* be called, so if that ever happens, we would want
++       * the stack trace.
++       */
++      if (unlikely(sbi->s_mount_opt & EXT4_MOUNT_ABORT))
++              return -EROFS;
++
+       /*
+        * Make sure nr_to_write is >= sbi->s_mb_stream_request
+        * This make sure small files blocks are allocated in
+@@ -2336,7 +2379,7 @@ restart_loop:
+               handle = ext4_journal_start(inode, needed_blocks);
+               if (IS_ERR(handle)) {
+                       ret = PTR_ERR(handle);
+-                      printk(KERN_EMERG "%s: jbd2_start: "
++                      printk(KERN_CRIT "%s: jbd2_start: "
+                              "%ld pages, ino %lu; err %d\n", __func__,
+                               wbc->nr_to_write, inode->i_ino, ret);
+                       dump_stack();
+diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
+index ba86b56..dbf6c0e 100644
+--- a/fs/ext4/mballoc.c
++++ b/fs/ext4/mballoc.c
+@@ -100,7 +100,7 @@
+  * inode as:
+  *
+  *  {                        page                        }
+- *  [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]...
++ *  [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]...
+  *
+  *
+  * one block each for bitmap and buddy information.  So for each group we
+@@ -330,6 +330,18 @@
+  *        object
+  *
+  */
++static struct kmem_cache *ext4_pspace_cachep;
++static struct kmem_cache *ext4_ac_cachep;
++static struct kmem_cache *ext4_free_ext_cachep;
++static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
++                                      ext4_group_t group);
++static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
++                                              ext4_group_t group);
++static int ext4_mb_init_per_dev_proc(struct super_block *sb);
++static int ext4_mb_destroy_per_dev_proc(struct super_block *sb);
++static void ext4_mb_free_committed_blocks(struct super_block *);
++static void ext4_mb_poll_new_transaction(struct super_block *sb,
++                                       handle_t *handle);
+ static inline void *mb_correct_addr_and_bit(int *bit, void *addr)
+ {
+@@ -718,7 +730,7 @@ static void ext4_mb_generate_buddy(struct super_block *sb,
+  * stored in the inode as
+  *
+  * {                        page                        }
+- * [ group 0 buddy][ group 0 bitmap] [group 1][ group 1]...
++ * [ group 0 bitmap][ group 0 buddy] [group 1][ group 1]...
+  *
+  *
+  * one block each for bitmap and buddy information.
+@@ -784,20 +796,42 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
+               if (bh[i] == NULL)
+                       goto out;
+-              if (bh_uptodate_or_lock(bh[i]))
++              if (bitmap_uptodate(bh[i]))
+                       continue;
++              lock_buffer(bh[i]);
++              if (bitmap_uptodate(bh[i])) {
++                      unlock_buffer(bh[i]);
++                      continue;
++              }
+               spin_lock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
+               if (desc->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
+                       ext4_init_block_bitmap(sb, bh[i],
+                                               first_group + i, desc);
++                      set_bitmap_uptodate(bh[i]);
+                       set_buffer_uptodate(bh[i]);
+                       unlock_buffer(bh[i]);
+                       spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
+                       continue;
+               }
+               spin_unlock(sb_bgl_lock(EXT4_SB(sb), first_group + i));
++              if (buffer_uptodate(bh[i])) {
++                      /*
++                       * if not uninit if bh is uptodate,
++                       * bitmap is also uptodate
++                       */
++                      set_bitmap_uptodate(bh[i]);
++                      unlock_buffer(bh[i]);
++                      continue;
++              }
+               get_bh(bh[i]);
++              /*
++               * submit the buffer_head for read. We can
++               * safely mark the bitmap as uptodate now.
++               * We do it here so the bitmap uptodate bit
++               * get set with buffer lock held.
++               */
++              set_bitmap_uptodate(bh[i]);
+               bh[i]->b_end_io = end_buffer_read_sync;
+               submit_bh(READ, bh[i]);
+               mb_debug("read bitmap for group %lu\n", first_group + i);
+@@ -814,6 +848,8 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
+       err = 0;
+       first_block = page->index * blocks_per_page;
++      /* init the page  */
++      memset(page_address(page), 0xff, PAGE_CACHE_SIZE);
+       for (i = 0; i < blocks_per_page; i++) {
+               int group;
+               struct ext4_group_info *grinfo;
+@@ -840,7 +876,6 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
+                       BUG_ON(incore == NULL);
+                       mb_debug("put buddy for group %u in page %lu/%x\n",
+                               group, page->index, i * blocksize);
+-                      memset(data, 0xff, blocksize);
+                       grinfo = ext4_get_group_info(sb, group);
+                       grinfo->bb_fragments = 0;
+                       memset(grinfo->bb_counters, 0,
+@@ -848,7 +883,9 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
+                       /*
+                        * incore got set to the group block bitmap below
+                        */
++                      ext4_lock_group(sb, group);
+                       ext4_mb_generate_buddy(sb, data, incore, group);
++                      ext4_unlock_group(sb, group);
+                       incore = NULL;
+               } else {
+                       /* this is block of bitmap */
+@@ -862,6 +899,7 @@ static int ext4_mb_init_cache(struct page *page, char *incore)
+                       /* mark all preallocated blks used in in-core bitmap */
+                       ext4_mb_generate_from_pa(sb, data, group);
++                      ext4_mb_generate_from_freelist(sb, data, group);
+                       ext4_unlock_group(sb, group);
+                       /* set incore so that the buddy information can be
+@@ -886,18 +924,20 @@ static noinline_for_stack int
+ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
+                                       struct ext4_buddy *e4b)
+ {
+-      struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      struct inode *inode = sbi->s_buddy_cache;
+       int blocks_per_page;
+       int block;
+       int pnum;
+       int poff;
+       struct page *page;
+       int ret;
++      struct ext4_group_info *grp;
++      struct ext4_sb_info *sbi = EXT4_SB(sb);
++      struct inode *inode = sbi->s_buddy_cache;
+       mb_debug("load group %lu\n", group);
+       blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
++      grp = ext4_get_group_info(sb, group);
+       e4b->bd_blkbits = sb->s_blocksize_bits;
+       e4b->bd_info = ext4_get_group_info(sb, group);
+@@ -905,6 +945,15 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
+       e4b->bd_group = group;
+       e4b->bd_buddy_page = NULL;
+       e4b->bd_bitmap_page = NULL;
++      e4b->alloc_semp = &grp->alloc_sem;
++
++      /* Take the read lock on the group alloc
++       * sem. This would make sure a parallel
++       * ext4_mb_init_group happening on other
++       * groups mapped by the page is blocked
++       * till we are done with allocation
++       */
++      down_read(e4b->alloc_semp);
+       /*
+        * the buddy cache inode stores the block bitmap
+@@ -920,6 +969,14 @@ ext4_mb_load_buddy(struct super_block *sb, ext4_group_t group,
+       page = find_get_page(inode->i_mapping, pnum);
+       if (page == NULL || !PageUptodate(page)) {
+               if (page)
++                      /*
++                       * drop the page reference and try
++                       * to get the page with lock. If we
++                       * are not uptodate that implies
++                       * somebody just created the page but
++                       * is yet to initialize the same. So
++                       * wait for it to initialize.
++                       */
+                       page_cache_release(page);
+               page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
+               if (page) {
+@@ -985,6 +1042,9 @@ err:
+               page_cache_release(e4b->bd_buddy_page);
+       e4b->bd_buddy = NULL;
+       e4b->bd_bitmap = NULL;
++
++      /* Done with the buddy cache */
++      up_read(e4b->alloc_semp);
+       return ret;
+ }
+@@ -994,6 +1054,9 @@ static void ext4_mb_release_desc(struct ext4_buddy *e4b)
+               page_cache_release(e4b->bd_bitmap_page);
+       if (e4b->bd_buddy_page)
+               page_cache_release(e4b->bd_buddy_page);
++      /* Done with the buddy cache */
++      if (e4b->alloc_semp)
++              up_read(e4b->alloc_semp);
+ }
+@@ -1031,7 +1094,10 @@ static void mb_clear_bits(spinlock_t *lock, void *bm, int cur, int len)
+                       cur += 32;
+                       continue;
+               }
+-              mb_clear_bit_atomic(lock, cur, bm);
++              if (lock)
++                      mb_clear_bit_atomic(lock, cur, bm);
++              else
++                      mb_clear_bit(cur, bm);
+               cur++;
+       }
+ }
+@@ -1049,7 +1115,10 @@ static void mb_set_bits(spinlock_t *lock, void *bm, int cur, int len)
+                       cur += 32;
+                       continue;
+               }
+-              mb_set_bit_atomic(lock, cur, bm);
++              if (lock)
++                      mb_set_bit_atomic(lock, cur, bm);
++              else
++                      mb_set_bit(cur, bm);
+               cur++;
+       }
+ }
+@@ -1296,13 +1365,20 @@ static void ext4_mb_use_best_found(struct ext4_allocation_context *ac,
+       ac->ac_tail = ret & 0xffff;
+       ac->ac_buddy = ret >> 16;
+-      /* XXXXXXX: SUCH A HORRIBLE **CK */
+-      /*FIXME!! Why ? */
++      /*
++       * take the page reference. We want the page to be pinned
++       * so that we don't get a ext4_mb_init_cache_call for this
++       * group until we update the bitmap. That would mean we
++       * double allocate blocks. The reference is dropped
++       * in ext4_mb_release_context
++       */
+       ac->ac_bitmap_page = e4b->bd_bitmap_page;
+       get_page(ac->ac_bitmap_page);
+       ac->ac_buddy_page = e4b->bd_buddy_page;
+       get_page(ac->ac_buddy_page);
+-
++      /* on allocation we use ac to track the held semaphore */
++      ac->alloc_semp =  e4b->alloc_semp;
++      e4b->alloc_semp = NULL;
+       /* store last allocated for subsequent stream allocation */
+       if ((ac->ac_flags & EXT4_MB_HINT_DATA)) {
+               spin_lock(&sbi->s_md_lock);
+@@ -1326,6 +1402,8 @@ static void ext4_mb_check_limits(struct ext4_allocation_context *ac,
+       struct ext4_free_extent ex;
+       int max;
++      if (ac->ac_status == AC_STATUS_FOUND)
++              return;
+       /*
+        * We don't want to scan for a whole year
+        */
+@@ -1692,6 +1770,173 @@ static int ext4_mb_good_group(struct ext4_allocation_context *ac,
+       return 0;
+ }
++/*
++ * lock the group_info alloc_sem of all the groups
++ * belonging to the same buddy cache page. This
++ * make sure other parallel operation on the buddy
++ * cache doesn't happen  whild holding the buddy cache
++ * lock
++ */
++int ext4_mb_get_buddy_cache_lock(struct super_block *sb, ext4_group_t group)
++{
++      int i;
++      int block, pnum;
++      int blocks_per_page;
++      int groups_per_page;
++      ext4_group_t first_group;
++      struct ext4_group_info *grp;
++
++      blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
++      /*
++       * the buddy cache inode stores the block bitmap
++       * and buddy information in consecutive blocks.
++       * So for each group we need two blocks.
++       */
++      block = group * 2;
++      pnum = block / blocks_per_page;
++      first_group = pnum * blocks_per_page / 2;
++
++      groups_per_page = blocks_per_page >> 1;
++      if (groups_per_page == 0)
++              groups_per_page = 1;
++      /* read all groups the page covers into the cache */
++      for (i = 0; i < groups_per_page; i++) {
++
++              if ((first_group + i) >= EXT4_SB(sb)->s_groups_count)
++                      break;
++              grp = ext4_get_group_info(sb, first_group + i);
++              /* take all groups write allocation
++               * semaphore. This make sure there is
++               * no block allocation going on in any
++               * of that groups
++               */
++              down_write(&grp->alloc_sem);
++      }
++      return i;
++}
++
++void ext4_mb_put_buddy_cache_lock(struct super_block *sb,
++                                      ext4_group_t group, int locked_group)
++{
++      int i;
++      int block, pnum;
++      int blocks_per_page;
++      ext4_group_t first_group;
++      struct ext4_group_info *grp;
++
++      blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
++      /*
++       * the buddy cache inode stores the block bitmap
++       * and buddy information in consecutive blocks.
++       * So for each group we need two blocks.
++       */
++      block = group * 2;
++      pnum = block / blocks_per_page;
++      first_group = pnum * blocks_per_page / 2;
++      /* release locks on all the groups */
++      for (i = 0; i < locked_group; i++) {
++
++              grp = ext4_get_group_info(sb, first_group + i);
++              /* take all groups write allocation
++               * semaphore. This make sure there is
++               * no block allocation going on in any
++               * of that groups
++               */
++              up_write(&grp->alloc_sem);
++      }
++
++}
++
++static int ext4_mb_init_group(struct super_block *sb, ext4_group_t group)
++{
++
++      int ret;
++      void *bitmap;
++      int blocks_per_page;
++      int block, pnum, poff;
++      int num_grp_locked = 0;
++      struct ext4_group_info *this_grp;
++      struct ext4_sb_info *sbi = EXT4_SB(sb);
++      struct inode *inode = sbi->s_buddy_cache;
++      struct page *page = NULL, *bitmap_page = NULL;
++
++      mb_debug("init group %lu\n", group);
++      blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
++      this_grp = ext4_get_group_info(sb, group);
++      /*
++       * This ensures we don't add group
++       * to this buddy cache via resize
++       */
++      num_grp_locked =  ext4_mb_get_buddy_cache_lock(sb, group);
++      if (!EXT4_MB_GRP_NEED_INIT(this_grp)) {
++              /*
++               * somebody initialized the group
++               * return without doing anything
++               */
++              ret = 0;
++              goto err;
++      }
++      /*
++       * the buddy cache inode stores the block bitmap
++       * and buddy information in consecutive blocks.
++       * So for each group we need two blocks.
++       */
++      block = group * 2;
++      pnum = block / blocks_per_page;
++      poff = block % blocks_per_page;
++      page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
++      if (page) {
++              BUG_ON(page->mapping != inode->i_mapping);
++              ret = ext4_mb_init_cache(page, NULL);
++              if (ret) {
++                      unlock_page(page);
++                      goto err;
++              }
++              unlock_page(page);
++      }
++      if (page == NULL || !PageUptodate(page)) {
++              ret = -EIO;
++              goto err;
++      }
++      mark_page_accessed(page);
++      bitmap_page = page;
++      bitmap = page_address(page) + (poff * sb->s_blocksize);
++
++      /* init buddy cache */
++      block++;
++      pnum = block / blocks_per_page;
++      poff = block % blocks_per_page;
++      page = find_or_create_page(inode->i_mapping, pnum, GFP_NOFS);
++      if (page == bitmap_page) {
++              /*
++               * If both the bitmap and buddy are in
++               * the same page we don't need to force
++               * init the buddy
++               */
++              unlock_page(page);
++      } else if (page) {
++              BUG_ON(page->mapping != inode->i_mapping);
++              ret = ext4_mb_init_cache(page, bitmap);
++              if (ret) {
++                      unlock_page(page);
++                      goto err;
++              }
++              unlock_page(page);
++      }
++      if (page == NULL || !PageUptodate(page)) {
++              ret = -EIO;
++              goto err;
++      }
++      mark_page_accessed(page);
++err:
++      ext4_mb_put_buddy_cache_lock(sb, group, num_grp_locked);
++      if (bitmap_page)
++              page_cache_release(bitmap_page);
++      if (page)
++              page_cache_release(page);
++      return ret;
++}
++
+ static noinline_for_stack int
+ ext4_mb_regular_allocator(struct ext4_allocation_context *ac)
+ {
+@@ -1775,7 +2020,7 @@ repeat:
+                               group = 0;
+                       /* quick check to skip empty groups */
+-                      grp = ext4_get_group_info(ac->ac_sb, group);
++                      grp = ext4_get_group_info(sb, group);
+                       if (grp->bb_free == 0)
+                               continue;
+@@ -1788,10 +2033,9 @@ repeat:
+                                * we need full data about the group
+                                * to make a good selection
+                                */
+-                              err = ext4_mb_load_buddy(sb, group, &e4b);
++                              err = ext4_mb_init_group(sb, group);
+                               if (err)
+                                       goto out;
+-                              ext4_mb_release_desc(&e4b);
+                       }
+                       /*
+@@ -2299,6 +2543,8 @@ int ext4_mb_add_groupinfo(struct super_block *sb, ext4_group_t group,
+       }
+       INIT_LIST_HEAD(&meta_group_info[i]->bb_prealloc_list);
++      init_rwsem(&meta_group_info[i]->alloc_sem);
++      meta_group_info[i]->bb_free_root.rb_node = NULL;;
+ #ifdef DOUBLE_CHECK
+       {
+@@ -2325,54 +2571,6 @@ exit_meta_group_info:
+ } /* ext4_mb_add_groupinfo */
+ /*
+- * Add a group to the existing groups.
+- * This function is used for online resize
+- */
+-int ext4_mb_add_more_groupinfo(struct super_block *sb, ext4_group_t group,
+-                             struct ext4_group_desc *desc)
+-{
+-      struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      struct inode *inode = sbi->s_buddy_cache;
+-      int blocks_per_page;
+-      int block;
+-      int pnum;
+-      struct page *page;
+-      int err;
+-
+-      /* Add group based on group descriptor*/
+-      err = ext4_mb_add_groupinfo(sb, group, desc);
+-      if (err)
+-              return err;
+-
+-      /*
+-       * Cache pages containing dynamic mb_alloc datas (buddy and bitmap
+-       * datas) are set not up to date so that they will be re-initilaized
+-       * during the next call to ext4_mb_load_buddy
+-       */
+-
+-      /* Set buddy page as not up to date */
+-      blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
+-      block = group * 2;
+-      pnum = block / blocks_per_page;
+-      page = find_get_page(inode->i_mapping, pnum);
+-      if (page != NULL) {
+-              ClearPageUptodate(page);
+-              page_cache_release(page);
+-      }
+-
+-      /* Set bitmap page as not up to date */
+-      block++;
+-      pnum = block / blocks_per_page;
+-      page = find_get_page(inode->i_mapping, pnum);
+-      if (page != NULL) {
+-              ClearPageUptodate(page);
+-              page_cache_release(page);
+-      }
+-
+-      return 0;
+-}
+-
+-/*
+  * Update an existing group.
+  * This function is used for online resize
+  */
+@@ -2495,6 +2693,8 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery)
+               clear_opt(sbi->s_mount_opt, MBALLOC);
+               return -ENOMEM;
+       }
++
++      i = (sb->s_blocksize_bits + 2) * sizeof(unsigned int);
+       sbi->s_mb_maxs = kmalloc(i, GFP_KERNEL);
+       if (sbi->s_mb_maxs == NULL) {
+               clear_opt(sbi->s_mount_opt, MBALLOC);
+@@ -2658,13 +2858,11 @@ int ext4_mb_release(struct super_block *sb)
+ static noinline_for_stack void
+ ext4_mb_free_committed_blocks(struct super_block *sb)
+ {
+-      struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      int err;
+-      int i;
+-      int count = 0;
+-      int count2 = 0;
+-      struct ext4_free_metadata *md;
+       struct ext4_buddy e4b;
++      struct ext4_group_info *db;
++      struct ext4_sb_info *sbi = EXT4_SB(sb);
++      int err, count = 0, count2 = 0;
++      struct ext4_free_data *entry;
+       if (list_empty(&sbi->s_committed_transaction))
+               return;
+@@ -2672,44 +2870,46 @@ ext4_mb_free_committed_blocks(struct super_block *sb)
+       /* there is committed blocks to be freed yet */
+       do {
+               /* get next array of blocks */
+-              md = NULL;
++              entry = NULL;
+               spin_lock(&sbi->s_md_lock);
+               if (!list_empty(&sbi->s_committed_transaction)) {
+-                      md = list_entry(sbi->s_committed_transaction.next,
+-                                      struct ext4_free_metadata, list);
+-                      list_del(&md->list);
++                      entry = list_entry(sbi->s_committed_transaction.next,
++                                      struct ext4_free_data, list);
++                      list_del(&entry->list);
+               }
+               spin_unlock(&sbi->s_md_lock);
+-              if (md == NULL)
++              if (entry == NULL)
+                       break;
+               mb_debug("gonna free %u blocks in group %lu (0x%p):",
+-                              md->num, md->group, md);
++                              entry->count, entry->group, entry);
+-              err = ext4_mb_load_buddy(sb, md->group, &e4b);
++              err = ext4_mb_load_buddy(sb, entry->group, &e4b);
+               /* we expect to find existing buddy because it's pinned */
+               BUG_ON(err != 0);
++              db = e4b.bd_info;
+               /* there are blocks to put in buddy to make them really free */
+-              count += md->num;
++              count += entry->count;
+               count2++;
+-              ext4_lock_group(sb, md->group);
+-              for (i = 0; i < md->num; i++) {
+-                      mb_debug(" %u", md->blocks[i]);
+-                      mb_free_blocks(NULL, &e4b, md->blocks[i], 1);
++              ext4_lock_group(sb, entry->group);
++              /* Take it out of per group rb tree */
++              rb_erase(&entry->node, &(db->bb_free_root));
++              mb_free_blocks(NULL, &e4b, entry->start_blk, entry->count);
++
++              if (!db->bb_free_root.rb_node) {
++                      /* No more items in the per group rb tree
++                       * balance refcounts from ext4_mb_free_metadata()
++                       */
++                      page_cache_release(e4b.bd_buddy_page);
++                      page_cache_release(e4b.bd_bitmap_page);
+               }
+-              mb_debug("\n");
+-              ext4_unlock_group(sb, md->group);
+-
+-              /* balance refcounts from ext4_mb_free_metadata() */
+-              page_cache_release(e4b.bd_buddy_page);
+-              page_cache_release(e4b.bd_bitmap_page);
++              ext4_unlock_group(sb, entry->group);
+-              kfree(md);
++              kmem_cache_free(ext4_free_ext_cachep, entry);
+               ext4_mb_release_desc(&e4b);
+-
+-      } while (md);
++      } while (1);
+       mb_debug("freed %u blocks in %u structures\n", count, count2);
+ }
+@@ -2864,6 +3064,16 @@ int __init init_ext4_mballoc(void)
+               kmem_cache_destroy(ext4_pspace_cachep);
+               return -ENOMEM;
+       }
++
++      ext4_free_ext_cachep =
++              kmem_cache_create("ext4_free_block_extents",
++                                   sizeof(struct ext4_free_data),
++                                   0, SLAB_RECLAIM_ACCOUNT, NULL);
++      if (ext4_free_ext_cachep == NULL) {
++              kmem_cache_destroy(ext4_pspace_cachep);
++              kmem_cache_destroy(ext4_ac_cachep);
++              return -ENOMEM;
++      }
+ #ifdef CONFIG_PROC_FS
+       proc_root_ext4 = proc_mkdir("fs/ext4", NULL);
+       if (proc_root_ext4 == NULL)
+@@ -2880,6 +3090,7 @@ void exit_ext4_mballoc(void)
+ #ifdef CONFIG_PROC_FS
+       remove_proc_entry("fs/ext4", NULL);
+ #endif
++      kmem_cache_destroy(ext4_free_ext_cachep);
+ }
+@@ -2941,8 +3152,8 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
+           in_range(block + len - 1, ext4_inode_table(sb, gdp),
+                    EXT4_SB(sb)->s_itb_per_group)) {
+               ext4_error(sb, __func__,
+-                         "Allocating block in system zone - block = %llu",
+-                         block);
++                         "Allocating block %llu in system zone of %lu group\n",
++                         block, ac->ac_b_ex.fe_group);
+               /* File system mounted not to panic on error
+                * Fix the bitmap and repeat the block allocation
+                * We leak some of the blocks here.
+@@ -2964,10 +3175,9 @@ ext4_mb_mark_diskspace_used(struct ext4_allocation_context *ac,
+               }
+       }
+ #endif
+-      mb_set_bits(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group), bitmap_bh->b_data,
+-                              ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+-
+       spin_lock(sb_bgl_lock(sbi, ac->ac_b_ex.fe_group));
++      mb_set_bits(NULL, bitmap_bh->b_data,
++                              ac->ac_b_ex.fe_start, ac->ac_b_ex.fe_len);
+       if (gdp->bg_flags & cpu_to_le16(EXT4_BG_BLOCK_UNINIT)) {
+               gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT);
+               gdp->bg_free_blocks_count =
+@@ -3400,10 +3610,37 @@ ext4_mb_use_preallocated(struct ext4_allocation_context *ac)
+               ac->ac_criteria = 20;
+               return 1;
+       }
++
+       return 0;
+ }
+ /*
++ * the function goes through all block freed in the group
++ * but not yet committed and marks them used in in-core bitmap.
++ * buddy must be generated from this bitmap
++ * Need to be called with ext4 group lock (ext4_lock_group)
++ */
++static void ext4_mb_generate_from_freelist(struct super_block *sb, void *bitmap,
++                                              ext4_group_t group)
++{
++      struct rb_node *n;
++      struct ext4_group_info *grp;
++      struct ext4_free_data *entry;
++
++      grp = ext4_get_group_info(sb, group);
++      n = rb_first(&(grp->bb_free_root));
++
++      while (n) {
++              entry = rb_entry(n, struct ext4_free_data, node);
++              mb_set_bits(sb_bgl_lock(EXT4_SB(sb), group),
++                              bitmap, entry->start_blk,
++                              entry->count);
++              n = rb_next(n);
++      }
++      return;
++}
++
++/*
+  * the function goes through all preallocation in this group and marks them
+  * used in in-core bitmap. buddy must be generated from this bitmap
+  * Need to be called with ext4 group lock (ext4_lock_group)
+@@ -4166,6 +4403,7 @@ ext4_mb_initialize_context(struct ext4_allocation_context *ac,
+       ac->ac_pa = NULL;
+       ac->ac_bitmap_page = NULL;
+       ac->ac_buddy_page = NULL;
++      ac->alloc_semp = NULL;
+       ac->ac_lg = NULL;
+       /* we have to define context: we'll we work with a file or
+@@ -4346,6 +4584,8 @@ static int ext4_mb_release_context(struct ext4_allocation_context *ac)
+               }
+               ext4_mb_put_pa(ac, ac->ac_sb, pa);
+       }
++      if (ac->alloc_semp)
++              up_read(ac->alloc_semp);
+       if (ac->ac_bitmap_page)
+               page_cache_release(ac->ac_bitmap_page);
+       if (ac->ac_buddy_page)
+@@ -4449,10 +4689,14 @@ repeat:
+                               ac->ac_o_ex.fe_len < ac->ac_b_ex.fe_len)
+                       ext4_mb_new_preallocation(ac);
+       }
+-
+       if (likely(ac->ac_status == AC_STATUS_FOUND)) {
+               *errp = ext4_mb_mark_diskspace_used(ac, handle);
+               if (*errp ==  -EAGAIN) {
++                      /*
++                       * drop the reference that we took
++                       * in ext4_mb_use_best_found
++                       */
++                      ext4_mb_release_context(ac);
+                       ac->ac_b_ex.fe_group = 0;
+                       ac->ac_b_ex.fe_start = 0;
+                       ac->ac_b_ex.fe_len = 0;
+@@ -4517,65 +4761,97 @@ static void ext4_mb_poll_new_transaction(struct super_block *sb,
+       ext4_mb_free_committed_blocks(sb);
+ }
++/*
++ * We can merge two free data extents only if the physical blocks
++ * are contiguous, AND the extents were freed by the same transaction,
++ * AND the blocks are associated with the same group.
++ */
++static int can_merge(struct ext4_free_data *entry1,
++                      struct ext4_free_data *entry2)
++{
++      if ((entry1->t_tid == entry2->t_tid) &&
++          (entry1->group == entry2->group) &&
++          ((entry1->start_blk + entry1->count) == entry2->start_blk))
++              return 1;
++      return 0;
++}
++
+ static noinline_for_stack int
+ ext4_mb_free_metadata(handle_t *handle, struct ext4_buddy *e4b,
+-                        ext4_group_t group, ext4_grpblk_t block, int count)
++                      struct ext4_free_data *new_entry)
+ {
++      ext4_grpblk_t block;
++      struct ext4_free_data *entry;
+       struct ext4_group_info *db = e4b->bd_info;
+       struct super_block *sb = e4b->bd_sb;
+       struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      struct ext4_free_metadata *md;
+-      int i;
++      struct rb_node **n = &db->bb_free_root.rb_node, *node;
++      struct rb_node *parent = NULL, *new_node;
+       BUG_ON(e4b->bd_bitmap_page == NULL);
+       BUG_ON(e4b->bd_buddy_page == NULL);
+-      ext4_lock_group(sb, group);
+-      for (i = 0; i < count; i++) {
+-              md = db->bb_md_cur;
+-              if (md && db->bb_tid != handle->h_transaction->t_tid) {
+-                      db->bb_md_cur = NULL;
+-                      md = NULL;
++      new_node = &new_entry->node;
++      block = new_entry->start_blk;
++
++      if (!*n) {
++              /* first free block exent. We need to
++                 protect buddy cache from being freed,
++               * otherwise we'll refresh it from
++               * on-disk bitmap and lose not-yet-available
++               * blocks */
++              page_cache_get(e4b->bd_buddy_page);
++              page_cache_get(e4b->bd_bitmap_page);
++      }
++      while (*n) {
++              parent = *n;
++              entry = rb_entry(parent, struct ext4_free_data, node);
++              if (block < entry->start_blk)
++                      n = &(*n)->rb_left;
++              else if (block >= (entry->start_blk + entry->count))
++                      n = &(*n)->rb_right;
++              else {
++                      ext4_error(sb, __func__,
++                          "Double free of blocks %d (%d %d)\n",
++                          block, entry->start_blk, entry->count);
++                      return 0;
+               }
++      }
+-              if (md == NULL) {
+-                      ext4_unlock_group(sb, group);
+-                      md = kmalloc(sizeof(*md), GFP_NOFS);
+-                      if (md == NULL)
+-                              return -ENOMEM;
+-                      md->num = 0;
+-                      md->group = group;
+-
+-                      ext4_lock_group(sb, group);
+-                      if (db->bb_md_cur == NULL) {
+-                              spin_lock(&sbi->s_md_lock);
+-                              list_add(&md->list, &sbi->s_active_transaction);
+-                              spin_unlock(&sbi->s_md_lock);
+-                              /* protect buddy cache from being freed,
+-                               * otherwise we'll refresh it from
+-                               * on-disk bitmap and lose not-yet-available
+-                               * blocks */
+-                              page_cache_get(e4b->bd_buddy_page);
+-                              page_cache_get(e4b->bd_bitmap_page);
+-                              db->bb_md_cur = md;
+-                              db->bb_tid = handle->h_transaction->t_tid;
+-                              mb_debug("new md 0x%p for group %lu\n",
+-                                              md, md->group);
+-                      } else {
+-                              kfree(md);
+-                              md = db->bb_md_cur;
+-                      }
++      rb_link_node(new_node, parent, n);
++      rb_insert_color(new_node, &db->bb_free_root);
++
++      /* Now try to see the extent can be merged to left and right */
++      node = rb_prev(new_node);
++      if (node) {
++              entry = rb_entry(node, struct ext4_free_data, node);
++              if (can_merge(entry, new_entry)) {
++                      new_entry->start_blk = entry->start_blk;
++                      new_entry->count += entry->count;
++                      rb_erase(node, &(db->bb_free_root));
++                      spin_lock(&sbi->s_md_lock);
++                      list_del(&entry->list);
++                      spin_unlock(&sbi->s_md_lock);
++                      kmem_cache_free(ext4_free_ext_cachep, entry);
+               }
++      }
+-              BUG_ON(md->num >= EXT4_BB_MAX_BLOCKS);
+-              md->blocks[md->num] = block + i;
+-              md->num++;
+-              if (md->num == EXT4_BB_MAX_BLOCKS) {
+-                      /* no more space, put full container on a sb's list */
+-                      db->bb_md_cur = NULL;
++      node = rb_next(new_node);
++      if (node) {
++              entry = rb_entry(node, struct ext4_free_data, node);
++              if (can_merge(new_entry, entry)) {
++                      new_entry->count += entry->count;
++                      rb_erase(node, &(db->bb_free_root));
++                      spin_lock(&sbi->s_md_lock);
++                      list_del(&entry->list);
++                      spin_unlock(&sbi->s_md_lock);
++                      kmem_cache_free(ext4_free_ext_cachep, entry);
+               }
+       }
+-      ext4_unlock_group(sb, group);
++      /* Add the extent to active_transaction list */
++      spin_lock(&sbi->s_md_lock);
++      list_add(&new_entry->list, &sbi->s_active_transaction);
++      spin_unlock(&sbi->s_md_lock);
+       return 0;
+ }
+@@ -4675,11 +4951,6 @@ do_more:
+       err = ext4_journal_get_write_access(handle, gd_bh);
+       if (err)
+               goto error_return;
+-
+-      err = ext4_mb_load_buddy(sb, block_group, &e4b);
+-      if (err)
+-              goto error_return;
+-
+ #ifdef AGGRESSIVE_CHECK
+       {
+               int i;
+@@ -4687,13 +4958,6 @@ do_more:
+                       BUG_ON(!mb_test_bit(bit + i, bitmap_bh->b_data));
+       }
+ #endif
+-      mb_clear_bits(sb_bgl_lock(sbi, block_group), bitmap_bh->b_data,
+-                      bit, count);
+-
+-      /* We dirtied the bitmap block */
+-      BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
+-      err = ext4_journal_dirty_metadata(handle, bitmap_bh);
+-
+       if (ac) {
+               ac->ac_b_ex.fe_group = block_group;
+               ac->ac_b_ex.fe_start = bit;
+@@ -4701,12 +4965,33 @@ do_more:
+               ext4_mb_store_history(ac);
+       }
++      err = ext4_mb_load_buddy(sb, block_group, &e4b);
++      if (err)
++              goto error_return;
+       if (metadata) {
+-              /* blocks being freed are metadata. these blocks shouldn't
+-               * be used until this transaction is committed */
+-              ext4_mb_free_metadata(handle, &e4b, block_group, bit, count);
++              struct ext4_free_data *new_entry;
++              /*
++               * blocks being freed are metadata. these blocks shouldn't
++               * be used until this transaction is committed
++               */
++              new_entry  = kmem_cache_alloc(ext4_free_ext_cachep, GFP_NOFS);
++              new_entry->start_blk = bit;
++              new_entry->group  = block_group;
++              new_entry->count = count;
++              new_entry->t_tid = handle->h_transaction->t_tid;
++              ext4_lock_group(sb, block_group);
++              mb_clear_bits(sb_bgl_lock(sbi, block_group), bitmap_bh->b_data,
++                              bit, count);
++              ext4_mb_free_metadata(handle, &e4b, new_entry);
++              ext4_unlock_group(sb, block_group);
+       } else {
+               ext4_lock_group(sb, block_group);
++              /* need to update group_info->bb_free and bitmap
++               * with group lock held. generate_buddy look at
++               * them with group lock_held
++               */
++              mb_clear_bits(sb_bgl_lock(sbi, block_group), bitmap_bh->b_data,
++                              bit, count);
+               mb_free_blocks(inode, &e4b, bit, count);
+               ext4_mb_return_to_preallocation(inode, &e4b, block, count);
+               ext4_unlock_group(sb, block_group);
+@@ -4729,6 +5014,10 @@ do_more:
+       *freed += count;
++      /* We dirtied the bitmap block */
++      BUFFER_TRACE(bitmap_bh, "dirtied bitmap block");
++      err = ext4_journal_dirty_metadata(handle, bitmap_bh);
++
+       /* And the group descriptor block */
+       BUFFER_TRACE(gd_bh, "dirtied group descriptor block");
+       ret = ext4_journal_dirty_metadata(handle, gd_bh);
+diff --git a/fs/ext4/mballoc.h b/fs/ext4/mballoc.h
+index c7c9906..0a28dd3 100644
+--- a/fs/ext4/mballoc.h
++++ b/fs/ext4/mballoc.h
+@@ -18,6 +18,7 @@
+ #include <linux/pagemap.h>
+ #include <linux/seq_file.h>
+ #include <linux/version.h>
++#include <linux/mutex.h>
+ #include "ext4_jbd2.h"
+ #include "ext4.h"
+ #include "group.h"
+@@ -96,25 +97,27 @@
+  */
+ #define MB_DEFAULT_GROUP_PREALLOC     512
+-static struct kmem_cache *ext4_pspace_cachep;
+-static struct kmem_cache *ext4_ac_cachep;
++struct ext4_free_data {
++      /* this links the free block information from group_info */
++      struct rb_node node;
+-#ifdef EXT4_BB_MAX_BLOCKS
+-#undef EXT4_BB_MAX_BLOCKS
+-#endif
+-#define EXT4_BB_MAX_BLOCKS    30
++      /* this links the free block information from ext4_sb_info */
++      struct list_head list;
+-struct ext4_free_metadata {
++      /* group which free block extent belongs */
+       ext4_group_t group;
+-      unsigned short num;
+-      ext4_grpblk_t  blocks[EXT4_BB_MAX_BLOCKS];
+-      struct list_head list;
++
++      /* free block extent */
++      ext4_grpblk_t start_blk;
++      ext4_grpblk_t count;
++
++      /* transaction which freed this extent */
++      tid_t   t_tid;
+ };
+ struct ext4_group_info {
+       unsigned long   bb_state;
+-      unsigned long   bb_tid;
+-      struct ext4_free_metadata *bb_md_cur;
++      struct rb_root  bb_free_root;
+       unsigned short  bb_first_free;
+       unsigned short  bb_free;
+       unsigned short  bb_fragments;
+@@ -122,6 +125,7 @@ struct ext4_group_info {
+ #ifdef DOUBLE_CHECK
+       void            *bb_bitmap;
+ #endif
++      struct rw_semaphore alloc_sem;
+       unsigned short  bb_counters[];
+ };
+@@ -209,6 +213,11 @@ struct ext4_allocation_context {
+       __u8 ac_op;             /* operation, for history only */
+       struct page *ac_bitmap_page;
+       struct page *ac_buddy_page;
++      /*
++       * pointer to the held semaphore upon successful
++       * block allocation
++       */
++      struct rw_semaphore *alloc_semp;
+       struct ext4_prealloc_space *ac_pa;
+       struct ext4_locality_group *ac_lg;
+ };
+@@ -242,6 +251,7 @@ struct ext4_buddy {
+       struct super_block *bd_sb;
+       __u16 bd_blkbits;
+       ext4_group_t bd_group;
++      struct rw_semaphore *alloc_semp;
+ };
+ #define EXT4_MB_BITMAP(e4b)   ((e4b)->bd_bitmap)
+ #define EXT4_MB_BUDDY(e4b)    ((e4b)->bd_buddy)
+@@ -251,8 +261,6 @@ static inline void ext4_mb_store_history(struct ext4_allocation_context *ac)
+ {
+       return;
+ }
+-#else
+-static void ext4_mb_store_history(struct ext4_allocation_context *ac);
+ #endif
+ #define in_range(b, first, len)       ((b) >= (first) && (b) <= (first) + (len) - 1)
+@@ -260,19 +268,6 @@ static void ext4_mb_store_history(struct ext4_allocation_context *ac);
+ static struct proc_dir_entry *proc_root_ext4;
+ struct buffer_head *read_block_bitmap(struct super_block *, ext4_group_t);
+-static void ext4_mb_generate_from_pa(struct super_block *sb, void *bitmap,
+-                                      ext4_group_t group);
+-static void ext4_mb_poll_new_transaction(struct super_block *, handle_t *);
+-static void ext4_mb_free_committed_blocks(struct super_block *);
+-static void ext4_mb_return_to_preallocation(struct inode *inode,
+-                                      struct ext4_buddy *e4b, sector_t block,
+-                                      int count);
+-static void ext4_mb_put_pa(struct ext4_allocation_context *,
+-                      struct super_block *, struct ext4_prealloc_space *pa);
+-static int ext4_mb_init_per_dev_proc(struct super_block *sb);
+-static int ext4_mb_destroy_per_dev_proc(struct super_block *sb);
+-
+-
+ static inline void ext4_lock_group(struct super_block *sb, ext4_group_t group)
+ {
+       struct ext4_group_info *grinfo = ext4_get_group_info(sb, group);
+@@ -297,7 +292,7 @@ static inline int ext4_is_group_locked(struct super_block *sb,
+                                               &(grinfo->bb_state));
+ }
+-static ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb,
++static inline ext4_fsblk_t ext4_grp_offs_to_block(struct super_block *sb,
+                                       struct ext4_free_extent *fex)
+ {
+       ext4_fsblk_t block;
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index d626533..4f3628f 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -371,6 +371,8 @@ dx_probe(struct dentry *dentry, struct inode *dir,
+               goto fail;
+       }
+       hinfo->hash_version = root->info.hash_version;
++      if (hinfo->hash_version <= DX_HASH_TEA)
++              hinfo->hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
+       hinfo->seed = EXT4_SB(dir->i_sb)->s_hash_seed;
+       if (dentry)
+               ext4fs_dirhash(dentry->d_name.name, dentry->d_name.len, hinfo);
+@@ -640,6 +642,9 @@ int ext4_htree_fill_tree(struct file *dir_file, __u32 start_hash,
+       dir = dir_file->f_path.dentry->d_inode;
+       if (!(EXT4_I(dir)->i_flags & EXT4_INDEX_FL)) {
+               hinfo.hash_version = EXT4_SB(dir->i_sb)->s_def_hash_version;
++              if (hinfo.hash_version <= DX_HASH_TEA)
++                      hinfo.hash_version +=
++                              EXT4_SB(dir->i_sb)->s_hash_unsigned;
+               hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
+               count = htree_dirblock_to_tree(dir_file, dir, 0, &hinfo,
+                                              start_hash, start_minor_hash);
+@@ -1377,7 +1382,7 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       struct fake_dirent *fde;
+       blocksize =  dir->i_sb->s_blocksize;
+-      dxtrace(printk("Creating index\n"));
++      dxtrace(printk(KERN_DEBUG "Creating index: inode %lu\n", dir->i_ino));
+       retval = ext4_journal_get_write_access(handle, bh);
+       if (retval) {
+               ext4_std_error(dir->i_sb, retval);
+@@ -1386,6 +1391,20 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       }
+       root = (struct dx_root *) bh->b_data;
++      /* The 0th block becomes the root, move the dirents out */
++      fde = &root->dotdot;
++      de = (struct ext4_dir_entry_2 *)((char *)fde +
++              ext4_rec_len_from_disk(fde->rec_len));
++      if ((char *) de >= (((char *) root) + blocksize)) {
++              ext4_error(dir->i_sb, __func__,
++                         "invalid rec_len for '..' in inode %lu",
++                         dir->i_ino);
++              brelse(bh);
++              return -EIO;
++      }
++      len = ((char *) root) + blocksize - (char *) de;
++
++      /* Allocate new block for the 0th block's dirents */
+       bh2 = ext4_append (handle, dir, &block, &retval);
+       if (!(bh2)) {
+               brelse(bh);
+@@ -1394,11 +1413,6 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       EXT4_I(dir)->i_flags |= EXT4_INDEX_FL;
+       data1 = bh2->b_data;
+-      /* The 0th block becomes the root, move the dirents out */
+-      fde = &root->dotdot;
+-      de = (struct ext4_dir_entry_2 *)((char *)fde +
+-              ext4_rec_len_from_disk(fde->rec_len));
+-      len = ((char *) root) + blocksize - (char *) de;
+       memcpy (data1, de, len);
+       de = (struct ext4_dir_entry_2 *) data1;
+       top = data1 + len;
+@@ -1418,6 +1432,8 @@ static int make_indexed_dir(handle_t *handle, struct dentry *dentry,
+       /* Initialize as for dx_probe */
+       hinfo.hash_version = root->info.hash_version;
++      if (hinfo.hash_version <= DX_HASH_TEA)
++              hinfo.hash_version += EXT4_SB(dir->i_sb)->s_hash_unsigned;
+       hinfo.seed = EXT4_SB(dir->i_sb)->s_hash_seed;
+       ext4fs_dirhash(name, namelen, &hinfo);
+       frame = frames;
+diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
+index 3922a8b..0070431 100644
+--- a/fs/ext4/resize.c
++++ b/fs/ext4/resize.c
+@@ -284,11 +284,9 @@ static int setup_new_group_blocks(struct super_block *sb,
+       if ((err = extend_or_restart_transaction(handle, 2, bh)))
+               goto exit_bh;
+-      mark_bitmap_end(input->blocks_count, EXT4_BLOCKS_PER_GROUP(sb),
+-                      bh->b_data);
++      mark_bitmap_end(input->blocks_count, sb->s_blocksize * 8, bh->b_data);
+       ext4_journal_dirty_metadata(handle, bh);
+       brelse(bh);
+-
+       /* Mark unused entries in inode bitmap used */
+       ext4_debug("clear inode bitmap %#04llx (+%llu)\n",
+                  input->inode_bitmap, input->inode_bitmap - start);
+@@ -297,7 +295,7 @@ static int setup_new_group_blocks(struct super_block *sb,
+               goto exit_journal;
+       }
+-      mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), EXT4_BLOCKS_PER_GROUP(sb),
++      mark_bitmap_end(EXT4_INODES_PER_GROUP(sb), sb->s_blocksize * 8,
+                       bh->b_data);
+       ext4_journal_dirty_metadata(handle, bh);
+ exit_bh:
+@@ -747,6 +745,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+       struct inode *inode = NULL;
+       handle_t *handle;
+       int gdb_off, gdb_num;
++      int num_grp_locked = 0;
+       int err, err2;
+       gdb_num = input->group / EXT4_DESC_PER_BLOCK(sb);
+@@ -787,6 +786,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+               }
+       }
++
+       if ((err = verify_group_input(sb, input)))
+               goto exit_put;
+@@ -855,15 +855,18 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+          * using the new disk blocks.
+          */
++      num_grp_locked = ext4_mb_get_buddy_cache_lock(sb, input->group);
+       /* Update group descriptor block for new group */
+       gdp = (struct ext4_group_desc *)((char *)primary->b_data +
+                                        gdb_off * EXT4_DESC_SIZE(sb));
++      memset(gdp, 0, EXT4_DESC_SIZE(sb));
+       ext4_block_bitmap_set(sb, gdp, input->block_bitmap); /* LV FIXME */
+       ext4_inode_bitmap_set(sb, gdp, input->inode_bitmap); /* LV FIXME */
+       ext4_inode_table_set(sb, gdp, input->inode_table); /* LV FIXME */
+       gdp->bg_free_blocks_count = cpu_to_le16(input->free_blocks_count);
+       gdp->bg_free_inodes_count = cpu_to_le16(EXT4_INODES_PER_GROUP(sb));
++      gdp->bg_flags = cpu_to_le16(EXT4_BG_INODE_ZEROED);
+       gdp->bg_checksum = ext4_group_desc_csum(sbi, input->group, gdp);
+       /*
+@@ -871,9 +874,11 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+        * descriptor
+        */
+       if (test_opt(sb, MBALLOC)) {
+-              err = ext4_mb_add_more_groupinfo(sb, input->group, gdp);
+-              if (err)
++              err = ext4_mb_add_groupinfo(sb, input->group, gdp);
++              if (err) {
++                      ext4_mb_put_buddy_cache_lock(sb, input->group, num_grp_locked);
+                       goto exit_journal;
++              }
+       }
+       /*
+        * Make the new blocks and inodes valid next.  We do this before
+@@ -915,6 +920,7 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+       /* Update the global fs size fields */
+       sbi->s_groups_count++;
++      ext4_mb_put_buddy_cache_lock(sb, input->group, num_grp_locked);
+       ext4_journal_dirty_metadata(handle, primary);
+@@ -976,9 +982,7 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es,
+       struct buffer_head * bh;
+       handle_t *handle;
+       int err;
+-      unsigned long freed_blocks;
+       ext4_group_t group;
+-      struct ext4_group_info *grp;
+       /* We don't need to worry about locking wrt other resizers just
+        * yet: we're going to revalidate es->s_blocks_count after
+@@ -1077,50 +1081,13 @@ int ext4_group_extend(struct super_block *sb, struct ext4_super_block *es,
+       unlock_super(sb);
+       ext4_debug("freeing blocks %llu through %llu\n", o_blocks_count,
+                  o_blocks_count + add);
+-      ext4_free_blocks_sb(handle, sb, o_blocks_count, add, &freed_blocks);
++      /* We add the blocks to the bitmap and set the group need init bit */
++      ext4_add_groupblocks(handle, sb, o_blocks_count, add);
+       ext4_debug("freed blocks %llu through %llu\n", o_blocks_count,
+                  o_blocks_count + add);
+       if ((err = ext4_journal_stop(handle)))
+               goto exit_put;
+-      /*
+-       * Mark mballoc pages as not up to date so that they will be updated
+-       * next time they are loaded by ext4_mb_load_buddy.
+-       */
+-      if (test_opt(sb, MBALLOC)) {
+-              struct ext4_sb_info *sbi = EXT4_SB(sb);
+-              struct inode *inode = sbi->s_buddy_cache;
+-              int blocks_per_page;
+-              int block;
+-              int pnum;
+-              struct page *page;
+-
+-              /* Set buddy page as not up to date */
+-              blocks_per_page = PAGE_CACHE_SIZE / sb->s_blocksize;
+-              block = group * 2;
+-              pnum = block / blocks_per_page;
+-              page = find_get_page(inode->i_mapping, pnum);
+-              if (page != NULL) {
+-                      ClearPageUptodate(page);
+-                      page_cache_release(page);
+-              }
+-
+-              /* Set bitmap page as not up to date */
+-              block++;
+-              pnum = block / blocks_per_page;
+-              page = find_get_page(inode->i_mapping, pnum);
+-              if (page != NULL) {
+-                      ClearPageUptodate(page);
+-                      page_cache_release(page);
+-              }
+-
+-              /* Get the info on the last group */
+-              grp = ext4_get_group_info(sb, group);
+-
+-              /* Update free blocks in group info */
+-              ext4_mb_update_group_info(grp, add);
+-      }
+-
+       if (test_opt(sb, DEBUG))
+               printk(KERN_DEBUG "EXT4-fs: extended group to %llu blocks\n",
+                      ext4_blocks_count(es));
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index 7726e8e..5e4491d 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -1493,7 +1493,6 @@ static int ext4_fill_flex_info(struct super_block *sb)
+       ext4_group_t flex_group_count;
+       ext4_group_t flex_group;
+       int groups_per_flex = 0;
+-      __u64 block_bitmap = 0;
+       int i;
+       if (!sbi->s_es->s_log_groups_per_flex) {
+@@ -1516,9 +1515,6 @@ static int ext4_fill_flex_info(struct super_block *sb)
+               goto failed;
+       }
+-      gdp = ext4_get_group_desc(sb, 1, &bh);
+-      block_bitmap = ext4_block_bitmap(sb, gdp) - 1;
+-
+       for (i = 0; i < sbi->s_groups_count; i++) {
+               gdp = ext4_get_group_desc(sb, i, &bh);
+@@ -1920,8 +1916,8 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+       struct inode *root;
+       int ret = -EINVAL;
+       int blocksize;
+-      int db_count;
+-      int i;
++      unsigned int db_count;
++      unsigned int i;
+       int needs_recovery;
+       __le32 features;
+       __u64 blocks_count;
+@@ -2172,6 +2168,18 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+       for (i = 0; i < 4; i++)
+               sbi->s_hash_seed[i] = le32_to_cpu(es->s_hash_seed[i]);
+       sbi->s_def_hash_version = es->s_def_hash_version;
++      i = le32_to_cpu(es->s_flags);
++      if (i & EXT2_FLAGS_UNSIGNED_HASH)
++              sbi->s_hash_unsigned = 3;
++      else if ((i & EXT2_FLAGS_SIGNED_HASH) == 0) {
++#ifdef __CHAR_UNSIGNED__
++              es->s_flags |= cpu_to_le32(EXT2_FLAGS_UNSIGNED_HASH);
++              sbi->s_hash_unsigned = 3;
++#else
++              es->s_flags |= cpu_to_le32(EXT2_FLAGS_SIGNED_HASH);
++#endif
++              sb->s_dirt = 1;
++      }
+       if (sbi->s_blocks_per_group > blocksize * 8) {
+               printk(KERN_ERR
+@@ -2199,20 +2207,30 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+       if (EXT4_BLOCKS_PER_GROUP(sb) == 0)
+               goto cantfind_ext4;
+-      /* ensure blocks_count calculation below doesn't sign-extend */
+-      if (ext4_blocks_count(es) + EXT4_BLOCKS_PER_GROUP(sb) <
+-          le32_to_cpu(es->s_first_data_block) + 1) {
+-              printk(KERN_WARNING "EXT4-fs: bad geometry: block count %llu, "
+-                     "first data block %u, blocks per group %lu\n",
+-                      ext4_blocks_count(es),
+-                      le32_to_cpu(es->s_first_data_block),
+-                      EXT4_BLOCKS_PER_GROUP(sb));
++      /*
++       * It makes no sense for the first data block to be beyond the end
++       * of the filesystem.
++       */
++      if (le32_to_cpu(es->s_first_data_block) >= ext4_blocks_count(es)) {
++              printk(KERN_WARNING "EXT4-fs: bad geometry: first data"
++                     "block %u is beyond end of filesystem (%llu)\n",
++                     le32_to_cpu(es->s_first_data_block),
++                     ext4_blocks_count(es));
+               goto failed_mount;
+       }
+       blocks_count = (ext4_blocks_count(es) -
+                       le32_to_cpu(es->s_first_data_block) +
+                       EXT4_BLOCKS_PER_GROUP(sb) - 1);
+       do_div(blocks_count, EXT4_BLOCKS_PER_GROUP(sb));
++      if (blocks_count > ((uint64_t)1<<32) - EXT4_DESC_PER_BLOCK(sb)) {
++              printk(KERN_WARNING "EXT4-fs: groups count too large: %u "
++                     "(block count %llu, first data block %u, "
++                     "blocks per group %lu)\n", sbi->s_groups_count,
++                     ext4_blocks_count(es),
++                     le32_to_cpu(es->s_first_data_block),
++                     EXT4_BLOCKS_PER_GROUP(sb));
++              goto failed_mount;
++      }
+       sbi->s_groups_count = blocks_count;
+       db_count = (sbi->s_groups_count + EXT4_DESC_PER_BLOCK(sb) - 1) /
+                  EXT4_DESC_PER_BLOCK(sb);
+diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
+index 6caf22d..b1f0756 100644
+--- a/fs/jbd2/commit.c
++++ b/fs/jbd2/commit.c
+@@ -24,6 +24,7 @@
+ #include <linux/crc32.h>
+ #include <linux/writeback.h>
+ #include <linux/backing-dev.h>
++#include <linux/bio.h>
+ /*
+  * Default IO end handler for temporary BJ_IO buffer_heads.
+@@ -170,12 +171,34 @@ static int journal_submit_commit_record(journal_t *journal,
+  * This function along with journal_submit_commit_record
+  * allows to write the commit record asynchronously.
+  */
+-static int journal_wait_on_commit_record(struct buffer_head *bh)
++static int journal_wait_on_commit_record(journal_t *journal,
++                                       struct buffer_head *bh)
+ {
+       int ret = 0;
++retry:
+       clear_buffer_dirty(bh);
+       wait_on_buffer(bh);
++      if (buffer_eopnotsupp(bh) && (journal->j_flags & JBD2_BARRIER)) {
++              printk(KERN_WARNING
++                     "JBD2: wait_on_commit_record: sync failed on %s - "
++                     "disabling barriers\n", journal->j_devname);
++              spin_lock(&journal->j_state_lock);
++              journal->j_flags &= ~JBD2_BARRIER;
++              spin_unlock(&journal->j_state_lock);
++
++              lock_buffer(bh);
++              clear_buffer_dirty(bh);
++              set_buffer_uptodate(bh);
++              bh->b_end_io = journal_end_buffer_io_sync;
++
++              ret = submit_bh(WRITE_SYNC, bh);
++              if (ret) {
++                      unlock_buffer(bh);
++                      return ret;
++              }
++              goto retry;
++      }
+       if (unlikely(!buffer_uptodate(bh)))
+               ret = -EIO;
+@@ -795,7 +818,7 @@ wait_for_iobuf:
+                       __jbd2_journal_abort_hard(journal);
+       }
+       if (!err && !is_journal_aborted(journal))
+-              err = journal_wait_on_commit_record(cbh);
++              err = journal_wait_on_commit_record(journal, cbh);
+       if (err)
+               jbd2_journal_abort(journal, err);
+diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
+index 66c3499..0e1bd70 100644
+--- a/include/linux/jbd2.h
++++ b/include/linux/jbd2.h
+@@ -308,7 +308,8 @@ void buffer_assertion_failure(struct buffer_head *bh);
+               int val = (expr);                                            \
+               if (!val) {                                                  \
+                       printk(KERN_ERR                                      \
+-                              "EXT3-fs unexpected failure: %s;\n",# expr); \
++                             "JBD2 unexpected failure: %s: %s;\n",         \
++                             __func__, #expr);                             \
+                       printk(KERN_ERR why "\n");                           \
+               }                                                            \
+               val;                                                         \
+@@ -329,6 +330,7 @@ enum jbd_state_bits {
+       BH_State,               /* Pins most journal_head state */
+       BH_JournalHead,         /* Pins bh->b_private and jh->b_bh */
+       BH_Unshadow,            /* Dummy bit, for BJ_Shadow wakeup filtering */
++      BH_JBDPrivateStart,     /* First bit available for private use by FS */
+ };
+ BUFFER_FNS(JBD, jbd)
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index 794e546..e7e7c7d 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1301,6 +1301,7 @@
+ #define PCI_DEVICE_ID_VIA_VT3351      0x0351
+ #define PCI_DEVICE_ID_VIA_VT3364      0x0364
+ #define PCI_DEVICE_ID_VIA_8371_0      0x0391
++#define PCI_DEVICE_ID_VIA_6415                0x0415
+ #define PCI_DEVICE_ID_VIA_8501_0      0x0501
+ #define PCI_DEVICE_ID_VIA_82C561      0x0561
+ #define PCI_DEVICE_ID_VIA_82C586_1    0x0571
+diff --git a/include/linux/pid.h b/include/linux/pid.h
+index d7e98ff..93997c9 100644
+--- a/include/linux/pid.h
++++ b/include/linux/pid.h
+@@ -123,6 +123,24 @@ extern struct pid *alloc_pid(struct pid_namespace *ns);
+ extern void free_pid(struct pid *pid);
+ /*
++ * ns_of_pid() returns the pid namespace in which the specified pid was
++ * allocated.
++ *
++ * NOTE:
++ *    ns_of_pid() is expected to be called for a process (task) that has
++ *    an attached 'struct pid' (see attach_pid(), detach_pid()) i.e @pid
++ *    is expected to be non-NULL. If @pid is NULL, caller should handle
++ *    the resulting NULL pid-ns.
++ */
++static inline struct pid_namespace *ns_of_pid(struct pid *pid)
++{
++      struct pid_namespace *ns = NULL;
++      if (pid)
++              ns = pid->numbers[pid->level].ns;
++      return ns;
++}
++
++/*
+  * the helpers to get the pid's id seen from different namespaces
+  *
+  * pid_nr()    : global id, i.e. the id seen from the init namespace;
+diff --git a/ipc/mqueue.c b/ipc/mqueue.c
+index a58bfad..ca502aa 100644
+--- a/ipc/mqueue.c
++++ b/ipc/mqueue.c
+@@ -498,7 +498,8 @@ static void __do_notify(struct mqueue_inode_info *info)
+                       sig_i.si_errno = 0;
+                       sig_i.si_code = SI_MESGQ;
+                       sig_i.si_value = info->notify.sigev_value;
+-                      sig_i.si_pid = task_tgid_vnr(current);
++                      sig_i.si_pid = task_tgid_nr_ns(current,
++                                              ns_of_pid(info->notify_owner));
+                       sig_i.si_uid = current->uid;
+                       kill_pid_info(info->notify.sigev_signo,
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.19-20 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.19-20
new file mode 100644 (file)
index 0000000..b0253bc
--- /dev/null
@@ -0,0 +1,3462 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.20
+
+Upstream 2.6.27.20 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index dbe8543..9f4860d 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .19
++EXTRAVERSION = .20
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c
+index ce8470f..f78262e 100644
+--- a/arch/arm/mach-rpc/riscpc.c
++++ b/arch/arm/mach-rpc/riscpc.c
+@@ -18,6 +18,7 @@
+ #include <linux/device.h>
+ #include <linux/serial_8250.h>
+ #include <linux/ata_platform.h>
++#include <linux/i2c.h>
+ #include <asm/elf.h>
+ #include <asm/io.h>
+@@ -201,8 +202,13 @@ static struct platform_device *devs[] __initdata = {
+       &pata_device,
+ };
++static struct i2c_board_info i2c_rtc = {
++      I2C_BOARD_INFO("pcf8583", 0x50)
++};
++
+ static int __init rpc_init(void)
+ {
++      i2c_register_board_info(0, &i2c_rtc, 1);
+       return platform_add_devices(devs, ARRAY_SIZE(devs));
+ }
+diff --git a/arch/ia64/include/asm/mmzone.h b/arch/ia64/include/asm/mmzone.h
+index 34efe88..f2ca320 100644
+--- a/arch/ia64/include/asm/mmzone.h
++++ b/arch/ia64/include/asm/mmzone.h
+@@ -31,10 +31,6 @@ static inline int pfn_to_nid(unsigned long pfn)
+ #endif
+ }
+-#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
+-extern int early_pfn_to_nid(unsigned long pfn);
+-#endif
+-
+ #ifdef CONFIG_IA64_DIG /* DIG systems are small */
+ # define MAX_PHYSNODE_ID      8
+ # define NR_NODE_MEMBLKS      (MAX_NUMNODES * 8)
+diff --git a/arch/ia64/mm/numa.c b/arch/ia64/mm/numa.c
+index b73bf18..3efea7d 100644
+--- a/arch/ia64/mm/numa.c
++++ b/arch/ia64/mm/numa.c
+@@ -58,7 +58,7 @@ paddr_to_nid(unsigned long paddr)
+  * SPARSEMEM to allocate the SPARSEMEM sectionmap on the NUMA node where
+  * the section resides.
+  */
+-int early_pfn_to_nid(unsigned long pfn)
++int __meminit __early_pfn_to_nid(unsigned long pfn)
+ {
+       int i, section = pfn >> PFN_SECTION_SHIFT, ssec, esec;
+@@ -70,7 +70,7 @@ int early_pfn_to_nid(unsigned long pfn)
+                       return node_memblk[i].nid;
+       }
+-      return 0;
++      return -1;
+ }
+ #ifdef CONFIG_MEMORY_HOTPLUG
+diff --git a/arch/powerpc/include/asm/compat.h b/arch/powerpc/include/asm/compat.h
+index d811a8c..4774c2f 100644
+--- a/arch/powerpc/include/asm/compat.h
++++ b/arch/powerpc/include/asm/compat.h
+@@ -210,5 +210,10 @@ struct compat_shmid64_ds {
+       compat_ulong_t __unused6;
+ };
++static inline int is_compat_task(void)
++{
++      return test_thread_flag(TIF_32BIT);
++}
++
+ #endif /* __KERNEL__ */
+ #endif /* _ASM_POWERPC_COMPAT_H */
+diff --git a/arch/powerpc/include/asm/seccomp.h b/arch/powerpc/include/asm/seccomp.h
+index 853765e..00c1d91 100644
+--- a/arch/powerpc/include/asm/seccomp.h
++++ b/arch/powerpc/include/asm/seccomp.h
+@@ -1,10 +1,6 @@
+ #ifndef _ASM_POWERPC_SECCOMP_H
+ #define _ASM_POWERPC_SECCOMP_H
+-#ifdef __KERNEL__
+-#include <linux/thread_info.h>
+-#endif
+-
+ #include <linux/unistd.h>
+ #define __NR_seccomp_read __NR_read
+diff --git a/arch/powerpc/kernel/align.c b/arch/powerpc/kernel/align.c
+index ada0692..73cb6a3 100644
+--- a/arch/powerpc/kernel/align.c
++++ b/arch/powerpc/kernel/align.c
+@@ -367,27 +367,24 @@ static int emulate_multiple(struct pt_regs *regs, unsigned char __user *addr,
+ static int emulate_fp_pair(unsigned char __user *addr, unsigned int reg,
+                          unsigned int flags)
+ {
+-      char *ptr = (char *) &current->thread.TS_FPR(reg);
+-      int i, ret;
++      char *ptr0 = (char *) &current->thread.TS_FPR(reg);
++      char *ptr1 = (char *) &current->thread.TS_FPR(reg+1);
++      int i, ret, sw = 0;
+       if (!(flags & F))
+               return 0;
+       if (reg & 1)
+               return 0;       /* invalid form: FRS/FRT must be even */
+-      if (!(flags & SW)) {
+-              /* not byte-swapped - easy */
+-              if (!(flags & ST))
+-                      ret = __copy_from_user(ptr, addr, 16);
+-              else
+-                      ret = __copy_to_user(addr, ptr, 16);
+-      } else {
+-              /* each FPR value is byte-swapped separately */
+-              ret = 0;
+-              for (i = 0; i < 16; ++i) {
+-                      if (!(flags & ST))
+-                              ret |= __get_user(ptr[i^7], addr + i);
+-                      else
+-                              ret |= __put_user(ptr[i^7], addr + i);
++      if (flags & SW)
++              sw = 7;
++      ret = 0;
++      for (i = 0; i < 8; ++i) {
++              if (!(flags & ST)) {
++                      ret |= __get_user(ptr0[i^sw], addr + i);
++                      ret |= __get_user(ptr1[i^sw], addr + i + 8);
++              } else {
++                      ret |= __put_user(ptr0[i^sw], addr + i);
++                      ret |= __put_user(ptr1[i^sw], addr + i + 8);
+               }
+       }
+       if (ret)
+diff --git a/arch/sparc/include/asm/compat.h b/arch/sparc/include/asm/compat.h
+index f260b58..0e70625 100644
+--- a/arch/sparc/include/asm/compat.h
++++ b/arch/sparc/include/asm/compat.h
+@@ -240,4 +240,9 @@ struct compat_shmid64_ds {
+       unsigned int    __unused2;
+ };
++static inline int is_compat_task(void)
++{
++      return test_thread_flag(TIF_32BIT);
++}
++
+ #endif /* _ASM_SPARC64_COMPAT_H */
+diff --git a/arch/sparc/include/asm/ptrace_32.h b/arch/sparc/include/asm/ptrace_32.h
+index d409c4f..4cef450 100644
+--- a/arch/sparc/include/asm/ptrace_32.h
++++ b/arch/sparc/include/asm/ptrace_32.h
+@@ -62,6 +62,8 @@ struct sparc_stackf {
+ #ifdef __KERNEL__
++#include <asm/system.h>
++
+ static inline bool pt_regs_is_syscall(struct pt_regs *regs)
+ {
+       return (regs->psr & PSR_SYSCALL);
+@@ -72,6 +74,14 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
+       return (regs->psr &= ~PSR_SYSCALL);
+ }
++#define arch_ptrace_stop_needed(exit_code, info) \
++({    flush_user_windows(); \
++      current_thread_info()->w_saved != 0;    \
++})
++
++#define arch_ptrace_stop(exit_code, info) \
++      synchronize_user_stack()
++
+ #define user_mode(regs) (!((regs)->psr & PSR_PS))
+ #define instruction_pointer(regs) ((regs)->pc)
+ #define user_stack_pointer(regs) ((regs)->u_regs[UREG_FP])
+diff --git a/arch/sparc/include/asm/ptrace_64.h b/arch/sparc/include/asm/ptrace_64.h
+index 06e4914..a54074a 100644
+--- a/arch/sparc/include/asm/ptrace_64.h
++++ b/arch/sparc/include/asm/ptrace_64.h
+@@ -113,6 +113,8 @@ struct sparc_trapf {
+ #ifdef __KERNEL__
++#include <asm/system.h>
++
+ static inline int pt_regs_trap_type(struct pt_regs *regs)
+ {
+       return regs->magic & 0x1ff;
+@@ -128,6 +130,14 @@ static inline bool pt_regs_clear_syscall(struct pt_regs *regs)
+       return (regs->tstate &= ~TSTATE_SYSCALL);
+ }
++#define arch_ptrace_stop_needed(exit_code, info) \
++({    flush_user_windows(); \
++      get_thread_wsaved() != 0; \
++})
++
++#define arch_ptrace_stop(exit_code, info) \
++      synchronize_user_stack()
++
+ struct global_reg_snapshot {
+       unsigned long           tstate;
+       unsigned long           tpc;
+diff --git a/arch/sparc/include/asm/seccomp.h b/arch/sparc/include/asm/seccomp.h
+index 7fcd996..adca1bc 100644
+--- a/arch/sparc/include/asm/seccomp.h
++++ b/arch/sparc/include/asm/seccomp.h
+@@ -1,11 +1,5 @@
+ #ifndef _ASM_SECCOMP_H
+-#include <linux/thread_info.h> /* already defines TIF_32BIT */
+-
+-#ifndef TIF_32BIT
+-#error "unexpected TIF_32BIT on sparc64"
+-#endif
+-
+ #include <linux/unistd.h>
+ #define __NR_seccomp_read __NR_read
+diff --git a/arch/sparc64/kernel/traps.c b/arch/sparc64/kernel/traps.c
+index c824df1..eb19724 100644
+--- a/arch/sparc64/kernel/traps.c
++++ b/arch/sparc64/kernel/traps.c
+@@ -1,6 +1,6 @@
+ /* arch/sparc64/kernel/traps.c
+  *
+- * Copyright (C) 1995,1997,2008 David S. Miller (davem@davemloft.net)
++ * Copyright (C) 1995,1997,2008,2009 David S. Miller (davem@davemloft.net)
+  * Copyright (C) 1997,1999,2000 Jakub Jelinek (jakub@redhat.com)
+  */
+@@ -262,6 +262,21 @@ void sun4v_data_access_exception(struct pt_regs *regs, unsigned long addr, unsig
+               return;
+       if (regs->tstate & TSTATE_PRIV) {
++              /* Test if this comes from uaccess places. */
++              const struct exception_table_entry *entry;
++
++              entry = search_exception_tables(regs->tpc);
++              if (entry) {
++                      /* Ouch, somebody is trying VM hole tricks on us... */
++#ifdef DEBUG_EXCEPTIONS
++                      printk("Exception: PC<%016lx> faddr<UNKNOWN>\n", regs->tpc);
++                      printk("EX_TABLE: insn<%016lx> fixup<%016lx>\n",
++                             regs->tpc, entry->fixup);
++#endif
++                      regs->tpc = entry->fixup;
++                      regs->tnpc = regs->tpc + 4;
++                      return;
++              }
+               printk("sun4v_data_access_exception: ADDR[%016lx] "
+                      "CTX[%04x] TYPE[%04x], going.\n",
+                      addr, ctx, type);
+diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
+index ffc1bb4..5e65290 100644
+--- a/arch/x86/ia32/ia32entry.S
++++ b/arch/x86/ia32/ia32entry.S
+@@ -424,9 +424,9 @@ ENTRY(ia32_syscall)
+       orl   $TS_COMPAT,TI_status(%r10)
+       testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
+       jnz ia32_tracesys
+-ia32_do_syscall:      
+       cmpl $(IA32_NR_syscalls-1),%eax
+-      ja  int_ret_from_sys_call       /* ia32_tracesys has set RAX(%rsp) */
++      ja ia32_badsys
++ia32_do_call:
+       IA32_ARG_FIXUP
+       call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
+ ia32_sysret:
+@@ -441,7 +441,9 @@ ia32_tracesys:
+       call syscall_trace_enter
+       LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
+       RESTORE_REST
+-      jmp ia32_do_syscall
++      cmpl $(IA32_NR_syscalls-1),%eax
++      ja  int_ret_from_sys_call       /* ia32_tracesys has set RAX(%rsp) */
++      jmp ia32_do_call
+ END(ia32_syscall)
+ ia32_badsys:
+diff --git a/arch/x86/kernel/cpu/mtrr/main.c b/arch/x86/kernel/cpu/mtrr/main.c
+index 885c826..ebd4638 100644
+--- a/arch/x86/kernel/cpu/mtrr/main.c
++++ b/arch/x86/kernel/cpu/mtrr/main.c
+@@ -1496,8 +1496,7 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn)
+       /* kvm/qemu doesn't have mtrr set right, don't trim them all */
+       if (!highest_pfn) {
+-              WARN(!kvm_para_available(), KERN_WARNING
+-                              "WARNING: strange, CPU MTRRs all blank?\n");
++              printk(KERN_INFO "CPU MTRRs all blank - virtualized system.\n");
+               return 0;
+       }
+diff --git a/arch/x86/kernel/io_apic_64.c b/arch/x86/kernel/io_apic_64.c
+index 61a83b7..6ad530f 100644
+--- a/arch/x86/kernel/io_apic_64.c
++++ b/arch/x86/kernel/io_apic_64.c
+@@ -1729,7 +1729,7 @@ static inline void __init check_timer(void)
+                       setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
+               }
+               unmask_IO_APIC_irq(0);
+-              if (!no_timer_check && timer_irq_works()) {
++              if (no_timer_check || timer_irq_works()) {
+                       if (nmi_watchdog == NMI_IO_APIC) {
+                               setup_nmi();
+                               enable_8259A_irq(0);
+diff --git a/arch/x86/kernel/ptrace.c b/arch/x86/kernel/ptrace.c
+index e37dccc..12fe589 100644
+--- a/arch/x86/kernel/ptrace.c
++++ b/arch/x86/kernel/ptrace.c
+@@ -1403,7 +1403,7 @@ static void syscall_trace(struct pt_regs *regs)
+ #ifdef CONFIG_X86_32
+ # define IS_IA32      1
+ #elif defined CONFIG_IA32_EMULATION
+-# define IS_IA32      test_thread_flag(TIF_IA32)
++# define IS_IA32      is_compat_task()
+ #else
+ # define IS_IA32      0
+ #endif
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index 724adfc..dfaa343 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -193,6 +193,14 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "HP Compaq"),
+               },
+       },
++      {       /* Handle problems with rebooting on Dell XPS710 */
++              .callback = set_bios_reboot,
++              .ident = "Dell XPS710",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Dell XPS710"),
++              },
++      },
+       { }
+ };
+diff --git a/arch/x86/kernel/vmiclock_32.c b/arch/x86/kernel/vmiclock_32.c
+index 6953859..3339772 100644
+--- a/arch/x86/kernel/vmiclock_32.c
++++ b/arch/x86/kernel/vmiclock_32.c
+@@ -280,10 +280,13 @@ void __devinit vmi_time_ap_init(void)
+ #endif
+ /** vmi clocksource */
++static struct clocksource clocksource_vmi;
+ static cycle_t read_real_cycles(void)
+ {
+-      return vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
++      cycle_t ret = (cycle_t)vmi_timer_ops.get_cycle_counter(VMI_CYCLES_REAL);
++      return ret >= clocksource_vmi.cycle_last ?
++              ret : clocksource_vmi.cycle_last;
+ }
+ static struct clocksource clocksource_vmi = {
+diff --git a/arch/x86/mm/numa_64.c b/arch/x86/mm/numa_64.c
+index a4dd793..4020c3c 100644
+--- a/arch/x86/mm/numa_64.c
++++ b/arch/x86/mm/numa_64.c
+@@ -145,7 +145,7 @@ int __init compute_hash_shift(struct bootnode *nodes, int numnodes,
+       return shift;
+ }
+-int early_pfn_to_nid(unsigned long pfn)
++int __meminit  __early_pfn_to_nid(unsigned long pfn)
+ {
+       return phys_to_nid(pfn << PAGE_SHIFT);
+ }
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index 6bbcf8a..001c099 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -1707,6 +1707,9 @@ asmlinkage void __init xen_start_kernel(void)
+          possible map and a non-dummy shared_info. */
+       per_cpu(xen_vcpu, 0) = &HYPERVISOR_shared_info->vcpu_info[0];
++      local_irq_disable();
++      early_boot_irqs_off();
++
+       xen_raw_console_write("mapping kernel into physical memory\n");
+       pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages);
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 566206a..2694998 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -759,9 +759,10 @@ acpi_ec_register_query_methods(acpi_handle handle, u32 level,
+       struct acpi_namespace_node *node = handle;
+       struct acpi_ec *ec = context;
+       int value = 0;
+-      if (sscanf(node->name.ascii, "_Q%x", &value) == 1) {
++
++      if (sscanf(node->name.ascii, "_Q%2x", &value) == 1)
+               acpi_ec_add_query_handler(ec, value, handle, NULL, NULL);
+-      }
++
+       return AE_OK;
+ }
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index f38e2af..2bcf350 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -1190,14 +1190,16 @@ static u64 ata_id_n_sectors(const u16 *id)
+ {
+       if (ata_id_has_lba(id)) {
+               if (ata_id_has_lba48(id))
+-                      return ata_id_u64(id, 100);
++                      return ata_id_u64(id, ATA_ID_LBA_CAPACITY_2);
+               else
+-                      return ata_id_u32(id, 60);
++                      return ata_id_u32(id, ATA_ID_LBA_CAPACITY);
+       } else {
+               if (ata_id_current_chs_valid(id))
+-                      return ata_id_u32(id, 57);
++                      return id[ATA_ID_CUR_CYLS] * id[ATA_ID_CUR_HEADS] *
++                             id[ATA_ID_CUR_SECTORS];
+               else
+-                      return id[1] * id[3] * id[6];
++                      return id[ATA_ID_CYLS] * id[ATA_ID_HEADS] *
++                             id[ATA_ID_SECTORS];
+       }
+ }
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index 154e7d6..22995d7 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -2272,11 +2272,14 @@ int ata_eh_reset(struct ata_link *link, int classify,
+               }
+               /* prereset() might have cleared ATA_EH_RESET.  If so,
+-               * bang classes and return.
++               * bang classes, thaw and return.
+                */
+               if (reset && !(ehc->i.action & ATA_EH_RESET)) {
+                       ata_link_for_each_dev(dev, link)
+                               classes[dev->devno] = ATA_DEV_NONE;
++                      if ((ap->pflags & ATA_PFLAG_FROZEN) &&
++                          ata_is_host_link(link))
++                              ata_eh_thaw_port(ap);
+                       rc = 0;
+                       goto out;
+               }
+diff --git a/drivers/atm/fore200e.c b/drivers/atm/fore200e.c
+index 73338d2..31c18f4 100644
+--- a/drivers/atm/fore200e.c
++++ b/drivers/atm/fore200e.c
+@@ -2578,8 +2578,8 @@ fore200e_load_and_start_fw(struct fore200e* fore200e)
+       return err;
+     sprintf(buf, "%s%s", fore200e->bus->proc_name, FW_EXT);
+-    if (request_firmware(&firmware, buf, device) == 1) {
+-      printk(FORE200E "missing %s firmware image\n", fore200e->bus->model_name);
++    if ((err = request_firmware(&firmware, buf, device)) < 0) {
++      printk(FORE200E "problem loading firmware image %s\n", fore200e->bus->model_name);
+       return err;
+     }
+diff --git a/drivers/block/aoe/aoe.h b/drivers/block/aoe/aoe.h
+index 5b4c6e6..5552cef 100644
+--- a/drivers/block/aoe/aoe.h
++++ b/drivers/block/aoe/aoe.h
+@@ -18,6 +18,7 @@
+ enum {
+       AOECMD_ATA,
+       AOECMD_CFG,
++      AOECMD_VEND_MIN = 0xf0,
+       AOEFL_RSP = (1<<3),
+       AOEFL_ERR = (1<<2),
+diff --git a/drivers/block/aoe/aoenet.c b/drivers/block/aoe/aoenet.c
+index 0c81ca7..8d73e61 100644
+--- a/drivers/block/aoe/aoenet.c
++++ b/drivers/block/aoe/aoenet.c
+@@ -154,6 +154,8 @@ aoenet_rcv(struct sk_buff *skb, struct net_device *ifp, struct packet_type *pt,
+               aoecmd_cfg_rsp(skb);
+               break;
+       default:
++              if (h->cmd >= AOECMD_VEND_MIN)
++                      break;  /* don't complain about vendor commands */
+               printk(KERN_INFO "aoe: unknown cmd %d\n", h->cmd);
+       }
+ exit:
+diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c
+index 3ca643c..ffab750 100644
+--- a/drivers/block/xen-blkfront.c
++++ b/drivers/block/xen-blkfront.c
+@@ -40,6 +40,7 @@
+ #include <linux/hdreg.h>
+ #include <linux/cdrom.h>
+ #include <linux/module.h>
++#include <linux/scatterlist.h>
+ #include <xen/xenbus.h>
+ #include <xen/grant_table.h>
+@@ -82,6 +83,7 @@ struct blkfront_info
+       enum blkif_state connected;
+       int ring_ref;
+       struct blkif_front_ring ring;
++      struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
+       unsigned int evtchn, irq;
+       struct request_queue *rq;
+       struct work_struct work;
+@@ -203,12 +205,11 @@ static int blkif_queue_request(struct request *req)
+       struct blkfront_info *info = req->rq_disk->private_data;
+       unsigned long buffer_mfn;
+       struct blkif_request *ring_req;
+-      struct req_iterator iter;
+-      struct bio_vec *bvec;
+       unsigned long id;
+       unsigned int fsect, lsect;
+-      int ref;
++      int i, ref;
+       grant_ref_t gref_head;
++      struct scatterlist *sg;
+       if (unlikely(info->connected != BLKIF_STATE_CONNECTED))
+               return 1;
+@@ -237,12 +238,13 @@ static int blkif_queue_request(struct request *req)
+       if (blk_barrier_rq(req))
+               ring_req->operation = BLKIF_OP_WRITE_BARRIER;
+-      ring_req->nr_segments = 0;
+-      rq_for_each_segment(bvec, req, iter) {
+-              BUG_ON(ring_req->nr_segments == BLKIF_MAX_SEGMENTS_PER_REQUEST);
+-              buffer_mfn = pfn_to_mfn(page_to_pfn(bvec->bv_page));
+-              fsect = bvec->bv_offset >> 9;
+-              lsect = fsect + (bvec->bv_len >> 9) - 1;
++      ring_req->nr_segments = blk_rq_map_sg(req->q, req, info->sg);
++      BUG_ON(ring_req->nr_segments > BLKIF_MAX_SEGMENTS_PER_REQUEST);
++
++      for_each_sg(info->sg, sg, ring_req->nr_segments, i) {
++              buffer_mfn = pfn_to_mfn(page_to_pfn(sg_page(sg)));
++              fsect = sg->offset >> 9;
++              lsect = fsect + (sg->length >> 9) - 1;
+               /* install a grant reference. */
+               ref = gnttab_claim_grant_reference(&gref_head);
+               BUG_ON(ref == -ENOSPC);
+@@ -253,16 +255,12 @@ static int blkif_queue_request(struct request *req)
+                               buffer_mfn,
+                               rq_data_dir(req) );
+-              info->shadow[id].frame[ring_req->nr_segments] =
+-                              mfn_to_pfn(buffer_mfn);
+-
+-              ring_req->seg[ring_req->nr_segments] =
++              info->shadow[id].frame[i] = mfn_to_pfn(buffer_mfn);
++              ring_req->seg[i] =
+                               (struct blkif_request_segment) {
+                                       .gref       = ref,
+                                       .first_sect = fsect,
+                                       .last_sect  = lsect };
+-
+-              ring_req->nr_segments++;
+       }
+       info->ring.req_prod_pvt++;
+@@ -592,6 +590,8 @@ static int setup_blkring(struct xenbus_device *dev,
+       SHARED_RING_INIT(sring);
+       FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
++      sg_init_table(info->sg, BLKIF_MAX_SEGMENTS_PER_REQUEST);
++
+       err = xenbus_grant_ring(dev, virt_to_mfn(info->ring.sring));
+       if (err < 0) {
+               free_page((unsigned long)sring);
+diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
+index 5eb23fa..c052627 100644
+--- a/drivers/char/agp/intel-agp.c
++++ b/drivers/char/agp/intel-agp.c
+@@ -633,13 +633,15 @@ static void intel_i830_init_gtt_entries(void)
+                       break;
+               }
+       }
+-      if (gtt_entries > 0)
++      if (gtt_entries > 0) {
+               dev_info(&agp_bridge->dev->dev, "detected %dK %s memory\n",
+                      gtt_entries / KB(1), local ? "local" : "stolen");
+-      else
++              gtt_entries /= KB(4);
++      } else {
+               dev_info(&agp_bridge->dev->dev,
+                      "no pre-allocated video memory detected\n");
+-      gtt_entries /= KB(4);
++              gtt_entries = 0;
++      }
+       intel_private.gtt_entries = gtt_entries;
+ }
+diff --git a/drivers/hwmon/f71882fg.c b/drivers/hwmon/f71882fg.c
+index 67067e9..71556e6 100644
+--- a/drivers/hwmon/f71882fg.c
++++ b/drivers/hwmon/f71882fg.c
+@@ -837,7 +837,7 @@ static int __init f71882fg_find(int sioaddr, unsigned short *address)
+       devid = superio_inw(sioaddr, SIO_REG_MANID);
+       if (devid != SIO_FINTEK_ID) {
+-              printk(KERN_INFO DRVNAME ": Not a Fintek device\n");
++              pr_debug(DRVNAME ": Not a Fintek device\n");
+               goto exit;
+       }
+diff --git a/drivers/hwmon/it87.c b/drivers/hwmon/it87.c
+index d793cc0..c620b20 100644
+--- a/drivers/hwmon/it87.c
++++ b/drivers/hwmon/it87.c
+@@ -207,7 +207,7 @@ static inline u16 FAN16_TO_REG(long rpm)
+ #define TEMP_TO_REG(val) (SENSORS_LIMIT(((val)<0?(((val)-500)/1000):\
+                                       ((val)+500)/1000),-128,127))
+-#define TEMP_FROM_REG(val) (((val)>0x80?(val)-0x100:(val))*1000)
++#define TEMP_FROM_REG(val) ((val) * 1000)
+ #define PWM_TO_REG(val)   ((val) >> 1)
+ #define PWM_FROM_REG(val) (((val)&0x7f) << 1)
+@@ -261,9 +261,9 @@ struct it87_data {
+       u8 has_fan;             /* Bitfield, fans enabled */
+       u16 fan[5];             /* Register values, possibly combined */
+       u16 fan_min[5];         /* Register values, possibly combined */
+-      u8 temp[3];             /* Register value */
+-      u8 temp_high[3];        /* Register value */
+-      u8 temp_low[3];         /* Register value */
++      s8 temp[3];             /* Register value */
++      s8 temp_high[3];        /* Register value */
++      s8 temp_low[3];         /* Register value */
+       u8 sensor;              /* Register value */
+       u8 fan_div[3];          /* Register encoding, shifted right */
+       u8 vid;                 /* Register encoding, combined */
+diff --git a/drivers/i2c/busses/i2c-acorn.c b/drivers/i2c/busses/i2c-acorn.c
+index 75089fe..c9a8d6f 100644
+--- a/drivers/i2c/busses/i2c-acorn.c
++++ b/drivers/i2c/busses/i2c-acorn.c
+@@ -84,6 +84,7 @@ static struct i2c_algo_bit_data ioc_data = {
+ static struct i2c_adapter ioc_ops = {
+       .id                     = I2C_HW_B_IOC,
++      .nr                     = 0,
+       .algo_data              = &ioc_data,
+ };
+@@ -91,7 +92,7 @@ static int __init i2c_ioc_init(void)
+ {
+       force_ones = FORCE_ONES | SCL | SDA;
+-      return i2c_bit_add_bus(&ioc_ops);
++      return i2c_bit_add_numbered_bus(&ioc_ops);
+ }
+ module_init(i2c_ioc_init);
+diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c
+index 3972208..c688237 100644
+--- a/drivers/i2c/busses/i2c-amd8111.c
++++ b/drivers/i2c/busses/i2c-amd8111.c
+@@ -72,7 +72,7 @@ static unsigned int amd_ec_wait_write(struct amd_smbus *smbus)
+ {
+       int timeout = 500;
+-      while (timeout-- && (inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF))
++      while ((inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_IBF) && --timeout)
+               udelay(1);
+       if (!timeout) {
+@@ -88,7 +88,7 @@ static unsigned int amd_ec_wait_read(struct amd_smbus *smbus)
+ {
+       int timeout = 500;
+-      while (timeout-- && (~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF))
++      while ((~inb(smbus->base + AMD_EC_SC) & AMD_EC_SC_OBF) && --timeout)
+               udelay(1);
+       if (!timeout) {
+diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c
+index 44d8384..cdbae97 100644
+--- a/drivers/i2c/busses/i2c-pxa.c
++++ b/drivers/i2c/busses/i2c-pxa.c
+@@ -604,7 +604,7 @@ static int i2c_pxa_do_pio_xfer(struct pxa_i2c *i2c,
+       i2c_pxa_start_message(i2c);
+-      while (timeout-- && i2c->msg_num > 0) {
++      while (i2c->msg_num > 0 && --timeout) {
+               i2c_pxa_handler(0, i2c);
+               udelay(10);
+       }
+diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c
+index b346a68..a10d0d2 100644
+--- a/drivers/i2c/i2c-core.c
++++ b/drivers/i2c/i2c-core.c
+@@ -1795,7 +1795,8 @@ static s32 i2c_smbus_xfer_emulated(struct i2c_adapter * adapter, u16 addr,
+       case I2C_SMBUS_QUICK:
+               msg[0].len = 0;
+               /* Special case: The read/write field is used as data */
+-              msg[0].flags = flags | (read_write==I2C_SMBUS_READ)?I2C_M_RD:0;
++              msg[0].flags = flags | (read_write == I2C_SMBUS_READ ?
++                                      I2C_M_RD : 0);
+               num = 1;
+               break;
+       case I2C_SMBUS_BYTE:
+diff --git a/drivers/ide/ide-iops.c b/drivers/ide/ide-iops.c
+index 2cbadff..40fbf42 100644
+--- a/drivers/ide/ide-iops.c
++++ b/drivers/ide/ide-iops.c
+@@ -325,6 +325,8 @@ void ide_output_data(ide_drive_t *drive, struct request *rq, void *buf,
+       u8 io_32bit = drive->io_32bit;
+       u8 mmio = (hwif->host_flags & IDE_HFLAG_MMIO) ? 1 : 0;
++      len++;
++
+       if (io_32bit) {
+               unsigned long uninitialized_var(flags);
+diff --git a/drivers/infiniband/hw/nes/nes_cm.c b/drivers/infiniband/hw/nes/nes_cm.c
+index 499d3cf..6f732ff 100644
+--- a/drivers/infiniband/hw/nes/nes_cm.c
++++ b/drivers/infiniband/hw/nes/nes_cm.c
+@@ -2474,12 +2474,14 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
+       int ret = 0;
+       struct nes_vnic *nesvnic;
+       struct nes_device *nesdev;
++      struct nes_ib_device *nesibdev;
+       nesvnic = to_nesvnic(nesqp->ibqp.device);
+       if (!nesvnic)
+               return -EINVAL;
+       nesdev = nesvnic->nesdev;
++      nesibdev = nesvnic->nesibdev;
+       nes_debug(NES_DBG_CM, "netdev refcnt = %u.\n",
+                       atomic_read(&nesvnic->netdev->refcnt));
+@@ -2491,6 +2493,8 @@ static int nes_disconnect(struct nes_qp *nesqp, int abrupt)
+       } else {
+               /* Need to free the Last Streaming Mode Message */
+               if (nesqp->ietf_frame) {
++                      if (nesqp->lsmm_mr)
++                              nesibdev->ibdev.dereg_mr(nesqp->lsmm_mr);
+                       pci_free_consistent(nesdev->pcidev,
+                                       nesqp->private_data_len+sizeof(struct ietf_mpa_frame),
+                                       nesqp->ietf_frame, nesqp->ietf_frame_pbase);
+@@ -2524,6 +2528,10 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
+       struct iw_cm_event cm_event;
+       struct nes_hw_qp_wqe *wqe;
+       struct nes_v4_quad nes_quad;
++      struct nes_ib_device *nesibdev;
++      struct ib_mr *ibmr = NULL;
++      struct ib_phys_buf ibphysbuf;
++      struct nes_pd *nespd;
+       u32 crc_value;
+       int ret;
+@@ -2584,6 +2592,26 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
+       if (cm_id->remote_addr.sin_addr.s_addr !=
+                       cm_id->local_addr.sin_addr.s_addr) {
+               u64temp = (unsigned long)nesqp;
++              nesibdev = nesvnic->nesibdev;
++              nespd = nesqp->nespd;
++              ibphysbuf.addr = nesqp->ietf_frame_pbase;
++              ibphysbuf.size = conn_param->private_data_len +
++                                      sizeof(struct ietf_mpa_frame);
++              ibmr = nesibdev->ibdev.reg_phys_mr((struct ib_pd *)nespd,
++                                              &ibphysbuf, 1,
++                                              IB_ACCESS_LOCAL_WRITE,
++                                              (u64 *)&nesqp->ietf_frame);
++              if (!ibmr) {
++                      nes_debug(NES_DBG_CM, "Unable to register memory region"
++                                      "for lSMM for cm_node = %p \n",
++                                      cm_node);
++                      return -ENOMEM;
++              }
++
++              ibmr->pd = &nespd->ibpd;
++              ibmr->device = nespd->ibpd.device;
++              nesqp->lsmm_mr = ibmr;
++
+               u64temp |= NES_SW_CONTEXT_ALIGN>>1;
+               set_wqe_64bit_value(wqe->wqe_words,
+                       NES_IWARP_SQ_WQE_COMP_CTX_LOW_IDX,
+@@ -2594,14 +2622,13 @@ int nes_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)
+               wqe->wqe_words[NES_IWARP_SQ_WQE_TOTAL_PAYLOAD_IDX] =
+                       cpu_to_le32(conn_param->private_data_len +
+                       sizeof(struct ietf_mpa_frame));
+-              wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_LOW_IDX] =
+-                      cpu_to_le32((u32)nesqp->ietf_frame_pbase);
+-              wqe->wqe_words[NES_IWARP_SQ_WQE_FRAG0_HIGH_IDX] =
+-                      cpu_to_le32((u32)((u64)nesqp->ietf_frame_pbase >> 32));
++              set_wqe_64bit_value(wqe->wqe_words,
++                                      NES_IWARP_SQ_WQE_FRAG0_LOW_IDX,
++                                      (u64)nesqp->ietf_frame);
+               wqe->wqe_words[NES_IWARP_SQ_WQE_LENGTH0_IDX] =
+                       cpu_to_le32(conn_param->private_data_len +
+                       sizeof(struct ietf_mpa_frame));
+-              wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = 0;
++              wqe->wqe_words[NES_IWARP_SQ_WQE_STAG0_IDX] = ibmr->lkey;
+               nesqp->nesqp_context->ird_ord_sizes |=
+                       cpu_to_le32(NES_QPCONTEXT_ORDIRD_LSMM_PRESENT |
+diff --git a/drivers/infiniband/hw/nes/nes_verbs.c b/drivers/infiniband/hw/nes/nes_verbs.c
+index d79942e..7c79451 100644
+--- a/drivers/infiniband/hw/nes/nes_verbs.c
++++ b/drivers/infiniband/hw/nes/nes_verbs.c
+@@ -1338,8 +1338,10 @@ static struct ib_qp *nes_create_qp(struct ib_pd *ibpd,
+                                       NES_QPCONTEXT_MISC_RQ_SIZE_SHIFT);
+                       nesqp->nesqp_context->misc |= cpu_to_le32((u32)nesqp->hwqp.sq_encoded_size <<
+                                       NES_QPCONTEXT_MISC_SQ_SIZE_SHIFT);
++                      if (!udata) {
+                               nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_PRIV_EN);
+                               nesqp->nesqp_context->misc |= cpu_to_le32(NES_QPCONTEXT_MISC_FAST_REGISTER_EN);
++                      }
+                       nesqp->nesqp_context->cqs = cpu_to_le32(nesqp->nesscq->hw_cq.cq_number +
+                                       ((u32)nesqp->nesrcq->hw_cq.cq_number << 16));
+                       u64temp = (u64)nesqp->hwqp.sq_pbase;
+diff --git a/drivers/infiniband/hw/nes/nes_verbs.h b/drivers/infiniband/hw/nes/nes_verbs.h
+index 6c6b4da..ae0ca9b 100644
+--- a/drivers/infiniband/hw/nes/nes_verbs.h
++++ b/drivers/infiniband/hw/nes/nes_verbs.h
+@@ -134,6 +134,7 @@ struct nes_qp {
+       struct ietf_mpa_frame *ietf_frame;
+       dma_addr_t            ietf_frame_pbase;
+       wait_queue_head_t     state_waitq;
++      struct ib_mr          *lsmm_mr;
+       unsigned long         socket;
+       struct nes_hw_qp      hwqp;
+       struct work_struct    work;
+diff --git a/drivers/md/raid1.c b/drivers/md/raid1.c
+index 03a5ab7..2b510a3 100644
+--- a/drivers/md/raid1.c
++++ b/drivers/md/raid1.c
+@@ -1229,8 +1229,9 @@ static void end_sync_write(struct bio *bio, int error)
+       update_head_pos(mirror, r1_bio);
+       if (atomic_dec_and_test(&r1_bio->remaining)) {
+-              md_done_sync(mddev, r1_bio->sectors, uptodate);
++              sector_t s = r1_bio->sectors;
+               put_buf(r1_bio);
++              md_done_sync(mddev, s, uptodate);
+       }
+ }
+diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
+index 941576d..dc50f98 100644
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -1231,6 +1231,7 @@ static void end_sync_read(struct bio *bio, int error)
+       /* for reconstruct, we always reschedule after a read.
+        * for resync, only after all reads
+        */
++      rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
+       if (test_bit(R10BIO_IsRecover, &r10_bio->state) ||
+           atomic_dec_and_test(&r10_bio->remaining)) {
+               /* we have read all the blocks,
+@@ -1238,7 +1239,6 @@ static void end_sync_read(struct bio *bio, int error)
+                */
+               reschedule_retry(r10_bio);
+       }
+-      rdev_dec_pending(conf->mirrors[d].rdev, conf->mddev);
+ }
+ static void end_sync_write(struct bio *bio, int error)
+@@ -1259,11 +1259,13 @@ static void end_sync_write(struct bio *bio, int error)
+       update_head_pos(i, r10_bio);
++      rdev_dec_pending(conf->mirrors[d].rdev, mddev);
+       while (atomic_dec_and_test(&r10_bio->remaining)) {
+               if (r10_bio->master_bio == NULL) {
+                       /* the primary of several recovery bios */
+-                      md_done_sync(mddev, r10_bio->sectors, 1);
++                      sector_t s = r10_bio->sectors;
+                       put_buf(r10_bio);
++                      md_done_sync(mddev, s, 1);
+                       break;
+               } else {
+                       r10bio_t *r10_bio2 = (r10bio_t *)r10_bio->master_bio;
+@@ -1271,7 +1273,6 @@ static void end_sync_write(struct bio *bio, int error)
+                       r10_bio = r10_bio2;
+               }
+       }
+-      rdev_dec_pending(conf->mirrors[d].rdev, mddev);
+ }
+ /*
+@@ -1747,8 +1748,6 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
+       if (!go_faster && conf->nr_waiting)
+               msleep_interruptible(1000);
+-      bitmap_cond_end_sync(mddev->bitmap, sector_nr);
+-
+       /* Again, very different code for resync and recovery.
+        * Both must result in an r10bio with a list of bios that
+        * have bi_end_io, bi_sector, bi_bdev set,
+@@ -1884,6 +1883,8 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
+               /* resync. Schedule a read for every block at this virt offset */
+               int count = 0;
++              bitmap_cond_end_sync(mddev->bitmap, sector_nr);
++
+               if (!bitmap_start_sync(mddev->bitmap, sector_nr,
+                                      &sync_blocks, mddev->degraded) &&
+                   !conf->fullsync && !test_bit(MD_RECOVERY_REQUESTED, &mddev->recovery)) {
+@@ -2009,13 +2010,13 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
+       /* There is nowhere to write, so all non-sync
+        * drives must be failed, so try the next chunk...
+        */
+-      {
+-      sector_t sec = max_sector - sector_nr;
+-      sectors_skipped += sec;
++      if (sector_nr + max_sync < max_sector)
++              max_sector = sector_nr + max_sync;
++
++      sectors_skipped += (max_sector - sector_nr);
+       chunks_skipped ++;
+       sector_nr = max_sector;
+       goto skipped;
+-      }
+ }
+ static int run(mddev_t *mddev)
+diff --git a/drivers/media/common/tuners/tda8290.c b/drivers/media/common/tuners/tda8290.c
+index 91204d3..9690264 100644
+--- a/drivers/media/common/tuners/tda8290.c
++++ b/drivers/media/common/tuners/tda8290.c
+@@ -726,7 +726,8 @@ struct dvb_frontend *tda829x_attach(struct dvb_frontend *fe,
+       fe->ops.analog_ops.info.name = name;
+       if (priv->ver & TDA8290) {
+-              tda8290_init_tuner(fe);
++              if (priv->ver & (TDA8275 | TDA8275A))
++                      tda8290_init_tuner(fe);
+               tda8290_init_if(fe);
+       } else if (priv->ver & TDA8295)
+               tda8295_init_if(fe);
+diff --git a/drivers/media/dvb/frontends/s5h1409.c b/drivers/media/dvb/frontends/s5h1409.c
+index 7500a1c..3541938 100644
+--- a/drivers/media/dvb/frontends/s5h1409.c
++++ b/drivers/media/dvb/frontends/s5h1409.c
+@@ -542,9 +542,6 @@ static int s5h1409_set_frontend (struct dvb_frontend* fe,
+       s5h1409_enable_modulation(fe, p->u.vsb.modulation);
+-      /* Allow the demod to settle */
+-      msleep(100);
+-
+       if (fe->ops.tuner_ops.set_params) {
+               if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl(fe, 1);
+               fe->ops.tuner_ops.set_params(fe, p);
+@@ -557,6 +554,10 @@ static int s5h1409_set_frontend (struct dvb_frontend* fe,
+               s5h1409_set_qam_interleave_mode(fe);
+       }
++      /* Issue a reset to the demod so it knows to resync against the
++         newly tuned frequency */
++      s5h1409_softreset(fe);
++
+       return 0;
+ }
+diff --git a/drivers/media/video/ivtv/ivtv-ioctl.c b/drivers/media/video/ivtv/ivtv-ioctl.c
+index 6103030..21f2aca 100644
+--- a/drivers/media/video/ivtv/ivtv-ioctl.c
++++ b/drivers/media/video/ivtv/ivtv-ioctl.c
+@@ -1744,6 +1744,18 @@ static int ivtv_default(struct file *file, void *fh, int cmd, void *arg)
+               break;
+       }
++      case IVTV_IOC_DMA_FRAME:
++      case VIDEO_GET_PTS:
++      case VIDEO_GET_FRAME_COUNT:
++      case VIDEO_GET_EVENT:
++      case VIDEO_PLAY:
++      case VIDEO_STOP:
++      case VIDEO_FREEZE:
++      case VIDEO_CONTINUE:
++      case VIDEO_COMMAND:
++      case VIDEO_TRY_COMMAND:
++              return ivtv_decoder_ioctls(file, cmd, (void *)arg);
++
+       default:
+               return -EINVAL;
+       }
+@@ -1786,18 +1798,6 @@ static int ivtv_serialized_ioctl(struct ivtv *itv, struct inode *inode, struct f
+               ivtv_vapi(itv, CX2341X_DEC_SET_AUDIO_MODE, 2, itv->audio_bilingual_mode, itv->audio_stereo_mode);
+               return 0;
+-      case IVTV_IOC_DMA_FRAME:
+-      case VIDEO_GET_PTS:
+-      case VIDEO_GET_FRAME_COUNT:
+-      case VIDEO_GET_EVENT:
+-      case VIDEO_PLAY:
+-      case VIDEO_STOP:
+-      case VIDEO_FREEZE:
+-      case VIDEO_CONTINUE:
+-      case VIDEO_COMMAND:
+-      case VIDEO_TRY_COMMAND:
+-              return ivtv_decoder_ioctls(filp, cmd, (void *)arg);
+-
+       default:
+               break;
+       }
+diff --git a/drivers/misc/hpilo.c b/drivers/misc/hpilo.c
+index 05e2982..174a35f 100644
+--- a/drivers/misc/hpilo.c
++++ b/drivers/misc/hpilo.c
+@@ -710,6 +710,7 @@ out:
+ static struct pci_device_id ilo_devices[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB204) },
++      { PCI_DEVICE(PCI_VENDOR_ID_HP, 0x3307) },
+       { }
+ };
+ MODULE_DEVICE_TABLE(pci, ilo_devices);
+diff --git a/drivers/mmc/card/mmc_test.c b/drivers/mmc/card/mmc_test.c
+index b92b172..b9f1e84 100644
+--- a/drivers/mmc/card/mmc_test.c
++++ b/drivers/mmc/card/mmc_test.c
+@@ -494,7 +494,7 @@ static int mmc_test_basic_read(struct mmc_test_card *test)
+       sg_init_one(&sg, test->buffer, 512);
+-      ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 1);
++      ret = mmc_test_simple_transfer(test, &sg, 1, 0, 1, 512, 0);
+       if (ret)
+               return ret;
+diff --git a/drivers/mmc/host/s3cmci.c b/drivers/mmc/host/s3cmci.c
+index ae16d84..42b70d7 100644
+--- a/drivers/mmc/host/s3cmci.c
++++ b/drivers/mmc/host/s3cmci.c
+@@ -756,8 +756,7 @@ static void s3cmci_dma_setup(struct s3cmci_host *host,
+                             host->mem->start + host->sdidata);
+       if (!setup_ok) {
+-              s3c2410_dma_config(host->dma, 4,
+-                      (S3C2410_DCON_HWTRIG | S3C2410_DCON_CH0_SDI));
++              s3c2410_dma_config(host->dma, 4, 0);
+               s3c2410_dma_set_buffdone_fn(host->dma,
+                                           s3cmci_dma_done_callback);
+               s3c2410_dma_setflags(host->dma, S3C2410_DMAF_AUTOSTART);
+diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c
+index e3a8133..cc0feae 100644
+--- a/drivers/mmc/host/sdhci.c
++++ b/drivers/mmc/host/sdhci.c
+@@ -1690,7 +1690,9 @@ int sdhci_add_host(struct sdhci_host *host)
+ #endif
+ #ifdef CONFIG_LEDS_CLASS
+-      host->led.name = mmc_hostname(mmc);
++      snprintf(host->led_name, sizeof(host->led_name),
++              "%s::", mmc_hostname(mmc));
++      host->led.name = host->led_name;
+       host->led.brightness = LED_OFF;
+       host->led.default_trigger = mmc_hostname(mmc);
+       host->led.brightness_set = sdhci_led_control;
+diff --git a/drivers/mmc/host/sdhci.h b/drivers/mmc/host/sdhci.h
+index 197d4a0..590d78f 100644
+--- a/drivers/mmc/host/sdhci.h
++++ b/drivers/mmc/host/sdhci.h
+@@ -220,6 +220,7 @@ struct sdhci_host {
+ #ifdef CONFIG_LEDS_CLASS
+       struct led_classdev     led;            /* LED control */
++      char   led_name[32];
+ #endif
+       spinlock_t              lock;           /* Mutex */
+diff --git a/drivers/mtd/devices/mtd_dataflash.c b/drivers/mtd/devices/mtd_dataflash.c
+index 8bd0dea..90279da 100644
+--- a/drivers/mtd/devices/mtd_dataflash.c
++++ b/drivers/mtd/devices/mtd_dataflash.c
+@@ -628,7 +628,8 @@ static struct flash_info *__devinit jedec_probe(struct spi_device *spi)
+                                       if (!(info->flags & IS_POW2PS))
+                                               return info;
+                               }
+-                      }
++                      } else
++                              return info;
+               }
+       }
+diff --git a/drivers/net/sis190.c b/drivers/net/sis190.c
+index 3fe0176..e6e3bf5 100644
+--- a/drivers/net/sis190.c
++++ b/drivers/net/sis190.c
+@@ -317,6 +317,7 @@ static struct mii_chip_info {
+         unsigned int type;
+       u32 feature;
+ } mii_chip_table[] = {
++      { "Atheros PHY AR8012",   { 0x004d, 0xd020 }, LAN, 0 },
+       { "Broadcom PHY BCM5461", { 0x0020, 0x60c0 }, LAN, F_PHY_BCM5461 },
+       { "Broadcom PHY AC131",   { 0x0143, 0xbc70 }, LAN, 0 },
+       { "Agere PHY ET1101B",    { 0x0282, 0xf010 }, LAN, 0 },
+diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
+index 37ecf84..375a0bd 100644
+--- a/drivers/net/usb/asix.c
++++ b/drivers/net/usb/asix.c
+@@ -1444,6 +1444,18 @@ static const struct usb_device_id       products [] = {
+       // Apple USB Ethernet Adapter
+       USB_DEVICE(0x05ac, 0x1402),
+       .driver_info = (unsigned long) &ax88772_info,
++}, {
++      // Cables-to-Go USB Ethernet Adapter
++      USB_DEVICE(0x0b95, 0x772a),
++      .driver_info = (unsigned long) &ax88772_info,
++}, {
++      // ABOCOM for pci
++      USB_DEVICE(0x14ea, 0xab11),
++      .driver_info = (unsigned long) &ax88178_info,
++}, {
++      // ASIX 88772a
++      USB_DEVICE(0x0db0, 0xa877),
++      .driver_info = (unsigned long) &ax88772_info,
+ },
+       { },            // END
+ };
+diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
+index 0e061df..55e8ecc 100644
+--- a/drivers/net/usb/cdc_ether.c
++++ b/drivers/net/usb/cdc_ether.c
+@@ -559,6 +559,11 @@ static const struct usb_device_id products [] = {
+       USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ETHERNET,
+                       USB_CDC_PROTO_NONE),
+       .driver_info = (unsigned long) &cdc_info,
++}, {
++      /* Ericsson F3507g */
++      USB_DEVICE_AND_INTERFACE_INFO(0x0bdb, 0x1900, USB_CLASS_COMM,
++                      USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
++      .driver_info = (unsigned long) &cdc_info,
+ },
+       { },            // END
+ };
+diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c
+index e24f7b3..04882c8 100644
+--- a/drivers/net/usb/zaurus.c
++++ b/drivers/net/usb/zaurus.c
+@@ -341,6 +341,11 @@ static const struct usb_device_id products [] = {
+       USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_MDLM,
+                       USB_CDC_PROTO_NONE),
+       .driver_info = (unsigned long) &bogus_mdlm_info,
++}, {
++      /* Motorola MOTOMAGX phones */
++      USB_DEVICE_AND_INTERFACE_INFO(0x22b8, 0x6425, USB_CLASS_COMM,
++                      USB_CDC_SUBCLASS_MDLM, USB_CDC_PROTO_NONE),
++      .driver_info = (unsigned long) &bogus_mdlm_info,
+ },
+ /* Olympus has some models with a Zaurus-compatible option.
+diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
+index ef84732..cee6288 100644
+--- a/drivers/net/wireless/rtl8187_dev.c
++++ b/drivers/net/wireless/rtl8187_dev.c
+@@ -40,6 +40,10 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
+       {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
+       {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
+       {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
++      /* Surecom */
++      {USB_DEVICE(0x0769, 0x11F2), .driver_info = DEVICE_RTL8187},
++      /* Logitech */
++      {USB_DEVICE(0x0789, 0x010C), .driver_info = DEVICE_RTL8187},
+       /* Netgear */
+       {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
+       {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
+@@ -49,8 +53,16 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
+       /* Sitecom */
+       {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
+       {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
++      /* Sphairon Access Systems GmbH */
++      {USB_DEVICE(0x114B, 0x0150), .driver_info = DEVICE_RTL8187},
++      /* Dick Smith Electronics */
++      {USB_DEVICE(0x1371, 0x9401), .driver_info = DEVICE_RTL8187},
+       /* Abocom */
+       {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
++      /* Qcom */
++      {USB_DEVICE(0x18E8, 0x6232), .driver_info = DEVICE_RTL8187},
++      /* AirLive */
++      {USB_DEVICE(0x1b75, 0x8187), .driver_info = DEVICE_RTL8187},
+       {}
+ };
+diff --git a/drivers/pci/pcie/aer/aerdrv_core.c b/drivers/pci/pcie/aer/aerdrv_core.c
+index ee5e7b5..4dccc0a 100644
+--- a/drivers/pci/pcie/aer/aerdrv_core.c
++++ b/drivers/pci/pcie/aer/aerdrv_core.c
+@@ -134,6 +134,34 @@ int pci_cleanup_aer_correct_error_status(struct pci_dev *dev)
+ }
+ #endif  /*  0  */
++
++static void set_device_error_reporting(struct pci_dev *dev, void *data)
++{
++      bool enable = *((bool *)data);
++
++      if (dev->pcie_type != PCIE_RC_PORT &&
++          dev->pcie_type != PCIE_SW_UPSTREAM_PORT &&
++          dev->pcie_type != PCIE_SW_DOWNSTREAM_PORT)
++              return;
++
++      if (enable)
++              pci_enable_pcie_error_reporting(dev);
++      else
++              pci_disable_pcie_error_reporting(dev);
++}
++
++/**
++ * set_downstream_devices_error_reporting - enable/disable the error reporting  bits on the root port and its downstream ports.
++ * @dev: pointer to root port's pci_dev data structure
++ * @enable: true = enable error reporting, false = disable error reporting.
++ */
++static void set_downstream_devices_error_reporting(struct pci_dev *dev,
++                                                 bool enable)
++{
++      set_device_error_reporting(dev, &enable);
++      pci_walk_bus(dev->subordinate, set_device_error_reporting, &enable);
++}
++
+ static int find_device_iter(struct device *device, void *data)
+ {
+       struct pci_dev *dev;
+@@ -551,15 +579,11 @@ void aer_enable_rootport(struct aer_rpc *rpc)
+       pci_read_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, &reg32);
+       pci_write_config_dword(pdev, aer_pos + PCI_ERR_UNCOR_STATUS, reg32);
+-      /* Enable Root Port device reporting error itself */
+-      pci_read_config_word(pdev, pos+PCI_EXP_DEVCTL, &reg16);
+-      reg16 = reg16 |
+-              PCI_EXP_DEVCTL_CERE |
+-              PCI_EXP_DEVCTL_NFERE |
+-              PCI_EXP_DEVCTL_FERE |
+-              PCI_EXP_DEVCTL_URRE;
+-      pci_write_config_word(pdev, pos+PCI_EXP_DEVCTL,
+-              reg16);
++      /*
++       * Enable error reporting for the root port device and downstream port
++       * devices.
++       */
++      set_downstream_devices_error_reporting(pdev, true);
+       /* Enable Root Port's interrupt in response to error messages */
+       pci_write_config_dword(pdev,
+@@ -579,6 +603,12 @@ static void disable_root_aer(struct aer_rpc *rpc)
+       u32 reg32;
+       int pos;
++      /*
++       * Disable error reporting for the root port device and downstream port
++       * devices.
++       */
++      set_downstream_devices_error_reporting(pdev, false);
++
+       pos = pci_find_aer_capability(pdev);
+       /* Disable Root's interrupt in response to error messages */
+       pci_write_config_dword(pdev, pos + PCI_ERR_ROOT_COMMAND, 0);
+diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
+index 6abfafc..e6b77cb 100644
+--- a/drivers/pci/pcie/portdrv_pci.c
++++ b/drivers/pci/pcie/portdrv_pci.c
+@@ -109,14 +109,13 @@ static int __devinit pcie_portdrv_probe (struct pci_dev *dev,
+       pcie_portdrv_save_config(dev);
+-      pci_enable_pcie_error_reporting(dev);
+-
+       return 0;
+ }
+ static void pcie_portdrv_remove (struct pci_dev *dev)
+ {
+       pcie_port_device_remove(dev);
++      pci_disable_device(dev);
+       kfree(pci_get_drvdata(dev));
+ }
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index 9236e7f..d0e5769 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -22,6 +22,7 @@
+ #include <linux/delay.h>
+ #include <linux/acpi.h>
+ #include <linux/kallsyms.h>
++#include <linux/pci-aspm.h>
+ #include "pci.h"
+ /* The Mellanox Tavor device gives false positive parity errors
+@@ -1542,6 +1543,30 @@ static void __devinit quirk_e100_interrupt(struct pci_dev *dev)
+ }
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_ANY_ID, quirk_e100_interrupt);
++/*
++ * The 82575 and 82598 may experience data corruption issues when transitioning
++ * out of L0S.  To prevent this we need to disable L0S on the pci-e link
++ */
++static void __devinit quirk_disable_aspm_l0s(struct pci_dev *dev)
++{
++      dev_info(&dev->dev, "Disabling L0s\n");
++      pci_disable_link_state(dev, PCIE_LINK_STATE_L0S);
++}
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a7, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10a9, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10b6, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c6, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c7, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10c8, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10d6, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10db, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10dd, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10e1, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10ec, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f1, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x10f4, quirk_disable_aspm_l0s);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, 0x1508, quirk_disable_aspm_l0s);
++
+ static void __devinit fixup_rev1_53c810(struct pci_dev* dev)
+ {
+       /* rev 1 ncr53c810 chips don't set the class at all which means
+@@ -1856,7 +1881,6 @@ static void __devinit quirk_msi_ht_cap(struct pci_dev *dev)
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_HT2000_PCIE,
+                       quirk_msi_ht_cap);
+-
+ /* The nVidia CK804 chipset may have 2 HT MSI mappings.
+  * MSI are supported if the MSI capability set in any of these mappings.
+  */
+@@ -1907,6 +1931,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SERVERWORKS,
+                        PCI_DEVICE_ID_SERVERWORKS_HT1000_PXB,
+                        ht_enable_msi_mapping);
++DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8132_BRIDGE,
++                       ht_enable_msi_mapping);
++
+ static void __devinit nv_msi_ht_cap_quirk(struct pci_dev *dev)
+ {
+       struct pci_dev *host_bridge;
+diff --git a/drivers/scsi/hptiop.c b/drivers/scsi/hptiop.c
+index a48e499..34be88d 100644
+--- a/drivers/scsi/hptiop.c
++++ b/drivers/scsi/hptiop.c
+@@ -1251,6 +1251,7 @@ static struct pci_device_id hptiop_id_table[] = {
+       { PCI_VDEVICE(TTI, 0x3530), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x3560), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4322), (kernel_ulong_t)&hptiop_itl_ops },
++      { PCI_VDEVICE(TTI, 0x4321), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4210), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4211), (kernel_ulong_t)&hptiop_itl_ops },
+       { PCI_VDEVICE(TTI, 0x4310), (kernel_ulong_t)&hptiop_itl_ops },
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index b7ea69c..0353e8b 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -99,6 +99,7 @@ static void scsi_disk_release(struct device *cdev);
+ static void sd_print_sense_hdr(struct scsi_disk *, struct scsi_sense_hdr *);
+ static void sd_print_result(struct scsi_disk *, int);
++static DEFINE_SPINLOCK(sd_index_lock);
+ static DEFINE_IDA(sd_index_ida);
+ /* This semaphore is used to mediate the 0->1 reference get in the
+@@ -1817,7 +1818,9 @@ static int sd_probe(struct device *dev)
+               if (!ida_pre_get(&sd_index_ida, GFP_KERNEL))
+                       goto out_put;
++              spin_lock(&sd_index_lock);
+               error = ida_get_new(&sd_index_ida, &index);
++              spin_unlock(&sd_index_lock);
+       } while (error == -EAGAIN);
+       if (error)
+@@ -1891,7 +1894,9 @@ static int sd_probe(struct device *dev)
+       return 0;
+  out_free_index:
++      spin_lock(&sd_index_lock);
+       ida_remove(&sd_index_ida, index);
++      spin_unlock(&sd_index_lock);
+  out_put:
+       put_disk(gd);
+  out_free:
+@@ -1941,7 +1946,9 @@ static void scsi_disk_release(struct device *dev)
+       struct scsi_disk *sdkp = to_scsi_disk(dev);
+       struct gendisk *disk = sdkp->disk;
+       
++      spin_lock(&sd_index_lock);
+       ida_remove(&sd_index_ida, sdkp->index);
++      spin_unlock(&sd_index_lock);
+       disk->private_data = NULL;
+       put_disk(disk);
+diff --git a/drivers/serial/8250.c b/drivers/serial/8250.c
+index 9ccc563..3499a9d 100644
+--- a/drivers/serial/8250.c
++++ b/drivers/serial/8250.c
+@@ -1956,6 +1956,20 @@ static int serial8250_startup(struct uart_port *port)
+       serial8250_set_mctrl(&up->port, up->port.mctrl);
++      /* Serial over Lan (SoL) hack:
++         Intel 8257x Gigabit ethernet chips have a
++         16550 emulation, to be used for Serial Over Lan.
++         Those chips take a longer time than a normal
++         serial device to signalize that a transmission
++         data was queued. Due to that, the above test generally
++         fails. One solution would be to delay the reading of
++         iir. However, this is not reliable, since the timeout
++         is variable. So, let's just don't test if we receive
++         TX irq. This way, we'll never enable UART_BUG_TXEN.
++       */
++      if (up->port.flags & UPF_NO_TXEN_TEST)
++              goto dont_test_tx_en;
++
+       /*
+        * Do a quick test to see if we receive an
+        * interrupt when we enable the TX irq.
+@@ -1975,6 +1989,7 @@ static int serial8250_startup(struct uart_port *port)
+               up->bugs &= ~UART_BUG_TXEN;
+       }
++dont_test_tx_en:
+       spin_unlock_irqrestore(&up->port.lock, flags);
+       /*
+diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
+index 056071d..9f72ad7 100644
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -762,6 +762,21 @@ pci_default_setup(struct serial_private *priv, struct pciserial_board *board,
+       return setup_port(priv, port, bar, offset, board->reg_shift);
+ }
++static int skip_tx_en_setup(struct serial_private *priv,
++                      const struct pciserial_board *board,
++                      struct uart_port *port, int idx)
++{
++      port->flags |= UPF_NO_TXEN_TEST;
++      printk(KERN_DEBUG "serial8250: skipping TxEn test for device "
++                        "[%04x:%04x] subsystem [%04x:%04x]\n",
++                        priv->dev->vendor,
++                        priv->dev->device,
++                        priv->dev->subsystem_vendor,
++                        priv->dev->subsystem_device);
++
++      return pci_default_setup(priv, board, port, idx);
++}
++
+ /* This should be in linux/pci_ids.h */
+ #define PCI_VENDOR_ID_SBSMODULARIO    0x124B
+ #define PCI_SUBVENDOR_ID_SBSMODULARIO 0x124B
+@@ -828,6 +843,27 @@ static struct pci_serial_quirk pci_serial_quirks[] __refdata = {
+               .init           = pci_inteli960ni_init,
+               .setup          = pci_default_setup,
+       },
++      {
++              .vendor         = PCI_VENDOR_ID_INTEL,
++              .device         = PCI_DEVICE_ID_INTEL_8257X_SOL,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .setup          = skip_tx_en_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTEL,
++              .device         = PCI_DEVICE_ID_INTEL_82573L_SOL,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .setup          = skip_tx_en_setup,
++      },
++      {
++              .vendor         = PCI_VENDOR_ID_INTEL,
++              .device         = PCI_DEVICE_ID_INTEL_82573E_SOL,
++              .subvendor      = PCI_ANY_ID,
++              .subdevice      = PCI_ANY_ID,
++              .setup          = skip_tx_en_setup,
++      },
+       /*
+        * ITE
+        */
+diff --git a/drivers/serial/jsm/jsm_driver.c b/drivers/serial/jsm/jsm_driver.c
+index 338cf8a..edec3a9 100644
+--- a/drivers/serial/jsm/jsm_driver.c
++++ b/drivers/serial/jsm/jsm_driver.c
+@@ -84,6 +84,8 @@ static int jsm_probe_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+       brd->pci_dev = pdev;
+       if (pdev->device == PCIE_DEVICE_ID_NEO_4_IBM)
+               brd->maxports = 4;
++      else if (pdev->device == PCI_DEVICE_ID_DIGI_NEO_8)
++              brd->maxports = 8;
+       else
+               brd->maxports = 2;
+@@ -212,6 +214,7 @@ static struct pci_device_id jsm_pci_tbl[] = {
+       { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45), 0, 0, 2 },
+       { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_NEO_2RJ45PRI), 0, 0, 3 },
+       { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCIE_DEVICE_ID_NEO_4_IBM), 0, 0, 4 },
++      { PCI_DEVICE(PCI_VENDOR_ID_DIGI, PCI_DEVICE_ID_DIGI_NEO_8), 0, 0, 5 },
+       { 0, }
+ };
+ MODULE_DEVICE_TABLE(pci, jsm_pci_tbl);
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index 61524fc..a250cae 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -1365,6 +1365,8 @@ static struct usb_device_id acm_ids[] = {
+       { USB_DEVICE(0x0572, 0x1321), /* Conexant USB MODEM CX93010 */
+       .driver_info = NO_UNION_NORMAL, /* has no union descriptor */
+       },
++      { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
++      },
+       /* control interfaces with various AT-command sets */
+       { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
+diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
+index 9cfa366..2aa2a58 100644
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -651,7 +651,7 @@ int usb_get_descriptor(struct usb_device *dev, unsigned char type,
+               if (result <= 0 && result != -ETIMEDOUT)
+                       continue;
+               if (result > 1 && ((u8 *)buf)[1] != type) {
+-                      result = -EPROTO;
++                      result = -ENODATA;
+                       continue;
+               }
+               break;
+@@ -694,8 +694,13 @@ static int usb_get_string(struct usb_device *dev, unsigned short langid,
+                       USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
+                       (USB_DT_STRING << 8) + index, langid, buf, size,
+                       USB_CTRL_GET_TIMEOUT);
+-              if (!(result == 0 || result == -EPIPE))
+-                      break;
++              if (result == 0 || result == -EPIPE)
++                      continue;
++              if (result > 1 && ((u8 *) buf)[1] != USB_DT_STRING) {
++                      result = -ENODATA;
++                      continue;
++              }
++              break;
+       }
+       return result;
+ }
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index dc21ade..df7b605 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -485,6 +485,7 @@ static int ehci_init(struct usb_hcd *hcd)
+        * periodic_size can shrink by USBCMD update if hcc_params allows.
+        */
+       ehci->periodic_size = DEFAULT_I_TDPS;
++      INIT_LIST_HEAD(&ehci->cached_itd_list);
+       if ((retval = ehci_mem_init(ehci, GFP_KERNEL)) < 0)
+               return retval;
+@@ -497,6 +498,7 @@ static int ehci_init(struct usb_hcd *hcd)
+       ehci->reclaim = NULL;
+       ehci->next_uframe = -1;
++      ehci->clock_frame = -1;
+       /*
+        * dedicate a qh for the async ring head, since we couldn't unlink
+diff --git a/drivers/usb/host/ehci-mem.c b/drivers/usb/host/ehci-mem.c
+index 0431397..10d5291 100644
+--- a/drivers/usb/host/ehci-mem.c
++++ b/drivers/usb/host/ehci-mem.c
+@@ -128,6 +128,7 @@ static inline void qh_put (struct ehci_qh *qh)
+ static void ehci_mem_cleanup (struct ehci_hcd *ehci)
+ {
++      free_cached_itd_list(ehci);
+       if (ehci->async)
+               qh_put (ehci->async);
+       ehci->async = NULL;
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index a081ee6..07bcb93 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1004,7 +1004,8 @@ iso_stream_put(struct ehci_hcd *ehci, struct ehci_iso_stream *stream)
+               is_in = (stream->bEndpointAddress & USB_DIR_IN) ? 0x10 : 0;
+               stream->bEndpointAddress &= 0x0f;
+-              stream->ep->hcpriv = NULL;
++              if (stream->ep)
++                      stream->ep->hcpriv = NULL;
+               if (stream->rescheduled) {
+                       ehci_info (ehci, "ep%d%s-iso rescheduled "
+@@ -1653,14 +1654,28 @@ itd_complete (
+                       (stream->bEndpointAddress & USB_DIR_IN) ? "in" : "out");
+       }
+       iso_stream_put (ehci, stream);
+-      /* OK to recycle this ITD now that its completion callback ran. */
++
+ done:
+       usb_put_urb(urb);
+       itd->urb = NULL;
+-      itd->stream = NULL;
+-      list_move(&itd->itd_list, &stream->free_list);
+-      iso_stream_put(ehci, stream);
+-
++      if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {
++              /* OK to recycle this ITD now. */
++              itd->stream = NULL;
++              list_move(&itd->itd_list, &stream->free_list);
++              iso_stream_put(ehci, stream);
++      } else {
++              /* HW might remember this ITD, so we can't recycle it yet.
++               * Move it to a safe place until a new frame starts.
++               */
++              list_move(&itd->itd_list, &ehci->cached_itd_list);
++              if (stream->refcount == 2) {
++                      /* If iso_stream_put() were called here, stream
++                       * would be freed.  Instead, just prevent reuse.
++                       */
++                      stream->ep->hcpriv = NULL;
++                      stream->ep = NULL;
++              }
++      }
+       return retval;
+ }
+@@ -2101,6 +2116,20 @@ done:
+ /*-------------------------------------------------------------------------*/
++static void free_cached_itd_list(struct ehci_hcd *ehci)
++{
++      struct ehci_itd *itd, *n;
++
++      list_for_each_entry_safe(itd, n, &ehci->cached_itd_list, itd_list) {
++              struct ehci_iso_stream  *stream = itd->stream;
++              itd->stream = NULL;
++              list_move(&itd->itd_list, &stream->free_list);
++              iso_stream_put(ehci, stream);
++      }
++}
++
++/*-------------------------------------------------------------------------*/
++
+ static void
+ scan_periodic (struct ehci_hcd *ehci)
+ {
+@@ -2115,10 +2144,17 @@ scan_periodic (struct ehci_hcd *ehci)
+        * Touches as few pages as possible:  cache-friendly.
+        */
+       now_uframe = ehci->next_uframe;
+-      if (HC_IS_RUNNING (ehci_to_hcd(ehci)->state))
++      if (HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) {
+               clock = ehci_readl(ehci, &ehci->regs->frame_index);
+-      else
++              clock_frame = (clock >> 3) % ehci->periodic_size;
++      } else  {
+               clock = now_uframe + mod - 1;
++              clock_frame = -1;
++      }
++      if (ehci->clock_frame != clock_frame) {
++              free_cached_itd_list(ehci);
++              ehci->clock_frame = clock_frame;
++      }
+       clock %= mod;
+       clock_frame = clock >> 3;
+@@ -2277,6 +2313,10 @@ restart:
+                       /* rescan the rest of this frame, then ... */
+                       clock = now;
+                       clock_frame = clock >> 3;
++                      if (ehci->clock_frame != clock_frame) {
++                              free_cached_itd_list(ehci);
++                              ehci->clock_frame = clock_frame;
++                      }
+               } else {
+                       now_uframe++;
+                       now_uframe %= mod;
+diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
+index 5799298..33459d7 100644
+--- a/drivers/usb/host/ehci.h
++++ b/drivers/usb/host/ehci.h
+@@ -87,6 +87,10 @@ struct ehci_hcd {                   /* one per controller */
+       int                     next_uframe;    /* scan periodic, start here */
+       unsigned                periodic_sched; /* periodic activity count */
++      /* list of itds completed while clock_frame was still active */
++      struct list_head        cached_itd_list;
++      unsigned                clock_frame;
++
+       /* per root hub port */
+       unsigned long           reset_done [EHCI_MAX_ROOT_PORTS];
+@@ -208,6 +212,8 @@ timer_action (struct ehci_hcd *ehci, enum ehci_timer_action action)
+       }
+ }
++static void free_cached_itd_list(struct ehci_hcd *ehci);
++
+ /*-------------------------------------------------------------------------*/
+ /* EHCI register interface, corresponds to EHCI Revision 0.95 specification */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 876bf36..9930150 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -289,6 +289,9 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define ERICSSON_VENDOR_ID                    0x0bdb
+ #define ERICSSON_PRODUCT_F3507G                       0x1900
++#define BENQ_VENDOR_ID                                0x04a5
++#define BENQ_PRODUCT_H10                      0x4068
++
+ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -498,6 +501,8 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+       { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
++      { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
++      { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
+       { } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index d775cfe..019bd62 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -953,13 +953,13 @@ UNUSUAL_DEV(  0x05e3, 0x0701, 0x0000, 0xffff,
+               "Genesys Logic",
+               "USB to IDE Optical",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
++              US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
+ UNUSUAL_DEV(  0x05e3, 0x0702, 0x0000, 0xffff,
+               "Genesys Logic",
+               "USB to IDE Disk",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 ),
++              US_FL_GO_SLOW | US_FL_MAX_SECTORS_64 | US_FL_IGNORE_RESIDUE ),
+ /* Reported by Hanno Boeck <hanno@gmx.de>
+  * Taken from the Lycoris Kernel */
+diff --git a/drivers/watchdog/ks8695_wdt.c b/drivers/watchdog/ks8695_wdt.c
+index 0b798fd..74c92d3 100644
+--- a/drivers/watchdog/ks8695_wdt.c
++++ b/drivers/watchdog/ks8695_wdt.c
+@@ -21,6 +21,7 @@
+ #include <linux/watchdog.h>
+ #include <linux/io.h>
+ #include <linux/uaccess.h>
++#include <mach/timex.h>
+ #include <mach/regs-timer.h>
+ #define WDT_DEFAULT_TIME      5       /* seconds */
+diff --git a/drivers/watchdog/rc32434_wdt.c b/drivers/watchdog/rc32434_wdt.c
+index c9c73b6..e96f2ef 100644
+--- a/drivers/watchdog/rc32434_wdt.c
++++ b/drivers/watchdog/rc32434_wdt.c
+@@ -33,104 +33,89 @@
+ #include <asm/time.h>
+ #include <asm/mach-rc32434/integ.h>
+-#define MAX_TIMEOUT                   20
+-#define RC32434_WDT_INTERVAL          (15 * HZ)
+-
+-#define VERSION "0.2"
++#define VERSION "0.4"
+ static struct {
+-      struct completion stop;
+-      int running;
+-      struct timer_list timer;
+-      int queue;
+-      int default_ticks;
+       unsigned long inuse;
+ } rc32434_wdt_device;
+ static struct integ __iomem *wdt_reg;
+-static int ticks = 100 * HZ;
+ static int expect_close;
+-static int timeout;
++
++/* Board internal clock speed in Hz,
++ * the watchdog timer ticks at. */
++extern unsigned int idt_cpu_freq;
++
++/* translate wtcompare value to seconds and vice versa */
++#define WTCOMP2SEC(x) (x / idt_cpu_freq)
++#define SEC2WTCOMP(x) (x * idt_cpu_freq)
++
++/* Use a default timeout of 20s. This should be
++ * safe for CPU clock speeds up to 400MHz, as
++ * ((2 ^ 32) - 1) / (400MHz / 2) = 21s.  */
++#define WATCHDOG_TIMEOUT 20
++
++static int timeout = WATCHDOG_TIMEOUT;
+ static int nowayout = WATCHDOG_NOWAYOUT;
+ module_param(nowayout, int, 0);
+ MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
+       __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
++/* apply or and nand masks to data read from addr and write back */
++#define SET_BITS(addr, or, nand) \
++      writel((readl(&addr) | or) & ~nand, &addr)
+ static void rc32434_wdt_start(void)
+ {
+-      u32 val;
+-
+-      if (!rc32434_wdt_device.inuse) {
+-              writel(0, &wdt_reg->wtcount);
++      u32 or, nand;
+-              val = RC32434_ERR_WRE;
+-              writel(readl(&wdt_reg->errcs) | val, &wdt_reg->errcs);
++      /* zero the counter before enabling */
++      writel(0, &wdt_reg->wtcount);
+-              val = RC32434_WTC_EN;
+-              writel(readl(&wdt_reg->wtc) | val, &wdt_reg->wtc);
+-      }
+-      rc32434_wdt_device.running++;
+-}
++      /* don't generate a non-maskable interrupt,
++       * do a warm reset instead */
++      nand = 1 << RC32434_ERR_WNE;
++      or = 1 << RC32434_ERR_WRE;
+-static void rc32434_wdt_stop(void)
+-{
+-      u32 val;
++      /* reset the ERRCS timeout bit in case it's set */
++      nand |= 1 << RC32434_ERR_WTO;
+-      if (rc32434_wdt_device.running) {
++      SET_BITS(wdt_reg->errcs, or, nand);
+-              val = ~RC32434_WTC_EN;
+-              writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
++      /* reset WTC timeout bit and enable WDT */
++      nand = 1 << RC32434_WTC_TO;
++      or = 1 << RC32434_WTC_EN;
+-              val = ~RC32434_ERR_WRE;
+-              writel(readl(&wdt_reg->errcs) & val, &wdt_reg->errcs);
++      SET_BITS(wdt_reg->wtc, or, nand);
++}
+-              rc32434_wdt_device.running = 0;
+-      }
++static void rc32434_wdt_stop(void)
++{
++      /* Disable WDT */
++      SET_BITS(wdt_reg->wtc, 0, 1 << RC32434_WTC_EN);
+ }
+-static void rc32434_wdt_set(int new_timeout)
++static int rc32434_wdt_set(int new_timeout)
+ {
+-      u32 cmp = new_timeout * HZ;
+-      u32 state, val;
++      int max_to = WTCOMP2SEC((u32)-1);
++      if (new_timeout < 0 || new_timeout > max_to) {
++              printk(KERN_ERR KBUILD_MODNAME
++                      ": timeout value must be between 0 and %d",
++                      max_to);
++              return -EINVAL;
++      }
+       timeout = new_timeout;
+-      /*
+-       * store and disable WTC
+-       */
+-      state = (u32)(readl(&wdt_reg->wtc) & RC32434_WTC_EN);
+-      val = ~RC32434_WTC_EN;
+-      writel(readl(&wdt_reg->wtc) & val, &wdt_reg->wtc);
+-
+-      writel(0, &wdt_reg->wtcount);
+-      writel(cmp, &wdt_reg->wtcompare);
+-
+-      /*
+-       * restore WTC
+-       */
+-
+-      writel(readl(&wdt_reg->wtc) | state, &wdt_reg);
+-}
++      writel(SEC2WTCOMP(timeout), &wdt_reg->wtcompare);
+-static void rc32434_wdt_reset(void)
+-{
+-      ticks = rc32434_wdt_device.default_ticks;
++      return 0;
+ }
+-static void rc32434_wdt_update(unsigned long unused)
++static void rc32434_wdt_ping(void)
+ {
+-      if (rc32434_wdt_device.running)
+-              ticks--;
+-
+       writel(0, &wdt_reg->wtcount);
+-
+-      if (rc32434_wdt_device.queue && ticks)
+-              mod_timer(&rc32434_wdt_device.timer,
+-                      jiffies + RC32434_WDT_INTERVAL);
+-      else
+-              complete(&rc32434_wdt_device.stop);
+ }
+ static int rc32434_wdt_open(struct inode *inode, struct file *file)
+@@ -141,19 +126,23 @@ static int rc32434_wdt_open(struct inode *inode, struct file *file)
+       if (nowayout)
+               __module_get(THIS_MODULE);
++      rc32434_wdt_start();
++      rc32434_wdt_ping();
++
+       return nonseekable_open(inode, file);
+ }
+ static int rc32434_wdt_release(struct inode *inode, struct file *file)
+ {
+-      if (expect_close && nowayout == 0) {
++      if (expect_close == 42) {
+               rc32434_wdt_stop();
+               printk(KERN_INFO KBUILD_MODNAME ": disabling watchdog timer\n");
+               module_put(THIS_MODULE);
+-      } else
++      } else {
+               printk(KERN_CRIT KBUILD_MODNAME
+                       ": device closed unexpectedly. WDT will not stop !\n");
+-
++              rc32434_wdt_ping();
++      }
+       clear_bit(0, &rc32434_wdt_device.inuse);
+       return 0;
+ }
+@@ -173,10 +162,10 @@ static ssize_t rc32434_wdt_write(struct file *file, const char *data,
+                               if (get_user(c, data + i))
+                                       return -EFAULT;
+                               if (c == 'V')
+-                                      expect_close = 1;
++                                      expect_close = 42;
+                       }
+               }
+-              rc32434_wdt_update(0);
++              rc32434_wdt_ping();
+               return len;
+       }
+       return 0;
+@@ -196,11 +185,11 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,
+       };
+       switch (cmd) {
+       case WDIOC_KEEPALIVE:
+-              rc32434_wdt_reset();
++              rc32434_wdt_ping();
+               break;
+       case WDIOC_GETSTATUS:
+       case WDIOC_GETBOOTSTATUS:
+-              value = readl(&wdt_reg->wtcount);
++              value = 0;
+               if (copy_to_user(argp, &value, sizeof(int)))
+                       return -EFAULT;
+               break;
+@@ -217,6 +206,7 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,
+                       break;
+               case WDIOS_DISABLECARD:
+                       rc32434_wdt_stop();
++                      break;
+               default:
+                       return -EINVAL;
+               }
+@@ -224,11 +214,9 @@ static long rc32434_wdt_ioctl(struct file *file, unsigned int cmd,
+       case WDIOC_SETTIMEOUT:
+               if (copy_from_user(&new_timeout, argp, sizeof(int)))
+                       return -EFAULT;
+-              if (new_timeout < 1)
++              if (rc32434_wdt_set(new_timeout))
+                       return -EINVAL;
+-              if (new_timeout > MAX_TIMEOUT)
+-                      return -EINVAL;
+-              rc32434_wdt_set(new_timeout);
++              /* Fall through */
+       case WDIOC_GETTIMEOUT:
+               return copy_to_user(argp, &timeout, sizeof(int));
+       default:
+@@ -253,15 +241,15 @@ static struct miscdevice rc32434_wdt_miscdev = {
+       .fops   = &rc32434_wdt_fops,
+ };
+-static char banner[] = KERN_INFO KBUILD_MODNAME
++static char banner[] __devinitdata = KERN_INFO KBUILD_MODNAME
+               ": Watchdog Timer version " VERSION ", timer margin: %d sec\n";
+-static int rc32434_wdt_probe(struct platform_device *pdev)
++static int __devinit rc32434_wdt_probe(struct platform_device *pdev)
+ {
+       int ret;
+       struct resource *r;
+-      r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb500_wdt_res");
++      r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "rb532_wdt_res");
+       if (!r) {
+               printk(KERN_ERR KBUILD_MODNAME
+                       "failed to retrieve resources\n");
+@@ -276,24 +264,12 @@ static int rc32434_wdt_probe(struct platform_device *pdev)
+       }
+       ret = misc_register(&rc32434_wdt_miscdev);
+-
+       if (ret < 0) {
+               printk(KERN_ERR KBUILD_MODNAME
+                       "failed to register watchdog device\n");
+               goto unmap;
+       }
+-      init_completion(&rc32434_wdt_device.stop);
+-      rc32434_wdt_device.queue = 0;
+-
+-      clear_bit(0, &rc32434_wdt_device.inuse);
+-
+-      setup_timer(&rc32434_wdt_device.timer, rc32434_wdt_update, 0L);
+-
+-      rc32434_wdt_device.default_ticks = ticks;
+-
+-      rc32434_wdt_start();
+-
+       printk(banner, timeout);
+       return 0;
+@@ -303,23 +279,17 @@ unmap:
+       return ret;
+ }
+-static int rc32434_wdt_remove(struct platform_device *pdev)
++static int __devexit rc32434_wdt_remove(struct platform_device *pdev)
+ {
+-      if (rc32434_wdt_device.queue) {
+-              rc32434_wdt_device.queue = 0;
+-              wait_for_completion(&rc32434_wdt_device.stop);
+-      }
+       misc_deregister(&rc32434_wdt_miscdev);
+-
+       iounmap(wdt_reg);
+-
+       return 0;
+ }
+ static struct platform_driver rc32434_wdt = {
+       .probe  = rc32434_wdt_probe,
+-      .remove = rc32434_wdt_remove,
+-      .driver = {
++      .remove = __devexit_p(rc32434_wdt_remove),
++      .driver = {
+               .name = "rc32434_wdt",
+       }
+ };
+diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
+index 06e521a..088e9ae 100644
+--- a/fs/cifs/CHANGES
++++ b/fs/cifs/CHANGES
+@@ -1,3 +1,5 @@
++Fix oops in cifs_dfs_ref.c when prefixpath is not reachable when using DFS.
++
+ Version 1.54
+ ------------
+ Fix premature write failure on congested networks (we would give up
+diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
+index 252fdc0..89fac77 100644
+--- a/fs/cifs/sess.c
++++ b/fs/cifs/sess.c
+@@ -228,7 +228,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
+       kfree(ses->serverOS);
+       /* UTF-8 string will not grow more than four times as big as UCS-16 */
+-      ses->serverOS = kzalloc(4 * len, GFP_KERNEL);
++      ses->serverOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
+       if (ses->serverOS != NULL)
+               cifs_strfromUCS_le(ses->serverOS, (__le16 *)data, len, nls_cp);
+       data += 2 * (len + 1);
+@@ -241,7 +241,7 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
+               return rc;
+       kfree(ses->serverNOS);
+-      ses->serverNOS = kzalloc(4 * len, GFP_KERNEL); /* BB this is wrong length FIXME BB */
++      ses->serverNOS = kzalloc((4 * len) + 2 /* trailing null */, GFP_KERNEL);
+       if (ses->serverNOS != NULL) {
+               cifs_strfromUCS_le(ses->serverNOS, (__le16 *)data, len,
+                                  nls_cp);
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index c8f8d59..61cb48f 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -1938,6 +1938,8 @@ ULONG_IOCTL(SET_BITMAP_FILE)
+ /* Big K */
+ COMPATIBLE_IOCTL(PIO_FONT)
+ COMPATIBLE_IOCTL(GIO_FONT)
++COMPATIBLE_IOCTL(PIO_CMAP)
++COMPATIBLE_IOCTL(GIO_CMAP)
+ ULONG_IOCTL(KDSIGACCEPT)
+ COMPATIBLE_IOCTL(KDGETKEYCODE)
+ COMPATIBLE_IOCTL(KDSETKEYCODE)
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index 85f58af..f613d57 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -860,7 +860,7 @@ static inline unsigned ext4_rec_len_from_disk(__le16 dlen)
+ {
+       unsigned len = le16_to_cpu(dlen);
+-      if (len == EXT4_MAX_REC_LEN)
++      if (len == EXT4_MAX_REC_LEN || len == 0)
+               return 1 << 16;
+       return len;
+ }
+diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
+index b994854..cce841f 100644
+--- a/fs/ext4/ialloc.c
++++ b/fs/ext4/ialloc.c
+@@ -702,6 +702,13 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode * dir, int mode)
+       if (sbi->s_log_groups_per_flex) {
+               ret2 = find_group_flex(sb, dir, &group);
++              if (ret2 == -1) {
++                      ret2 = find_group_other(sb, dir, &group);
++                      if (ret2 == 0 && printk_ratelimit())
++                              printk(KERN_NOTICE "ext4: find_group_flex "
++                                     "failed, fallback succeeded dir %lu\n",
++                                     dir->i_ino);
++              }
+               goto got_group;
+       }
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 6e7f085..b233ade 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -46,8 +46,10 @@
+ static inline int ext4_begin_ordered_truncate(struct inode *inode,
+                                             loff_t new_size)
+ {
+-      return jbd2_journal_begin_ordered_truncate(&EXT4_I(inode)->jinode,
+-                                                 new_size);
++      return jbd2_journal_begin_ordered_truncate(
++                                      EXT4_SB(inode->i_sb)->s_journal,
++                                      &EXT4_I(inode)->jinode,
++                                      new_size);
+ }
+ static void ext4_invalidatepage(struct page *page, unsigned long offset);
+@@ -1370,6 +1372,10 @@ retry:
+               goto out;
+       }
++      /* We cannot recurse into the filesystem as the transaction is already
++       * started */
++      flags |= AOP_FLAG_NOFS;
++
+       page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page) {
+               ext4_journal_stop(handle);
+@@ -1379,7 +1385,7 @@ retry:
+       *pagep = page;
+       ret = block_write_begin(file, mapping, pos, len, flags, pagep, fsdata,
+-                                                      ext4_get_block);
++                              ext4_get_block);
+       if (!ret && ext4_should_journal_data(inode)) {
+               ret = walk_page_buffers(handle, page_buffers(page),
+@@ -2463,6 +2469,9 @@ retry:
+               ret = PTR_ERR(handle);
+               goto out;
+       }
++      /* We cannot recurse into the filesystem as the transaction is already
++       * started */
++      flags |= AOP_FLAG_NOFS;
+       page = grab_cache_page_write_begin(mapping, index, flags);
+       if (!page) {
+diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
+index dbf6c0e..39d7cc1 100644
+--- a/fs/ext4/mballoc.c
++++ b/fs/ext4/mballoc.c
+@@ -3802,6 +3802,8 @@ ext4_mb_new_inode_pa(struct ext4_allocation_context *ac)
+       pa->pa_free = pa->pa_len;
+       atomic_set(&pa->pa_count, 1);
+       spin_lock_init(&pa->pa_lock);
++      INIT_LIST_HEAD(&pa->pa_inode_list);
++      INIT_LIST_HEAD(&pa->pa_group_list);
+       pa->pa_deleted = 0;
+       pa->pa_linear = 0;
+@@ -3860,6 +3862,7 @@ ext4_mb_new_group_pa(struct ext4_allocation_context *ac)
+       atomic_set(&pa->pa_count, 1);
+       spin_lock_init(&pa->pa_lock);
+       INIT_LIST_HEAD(&pa->pa_inode_list);
++      INIT_LIST_HEAD(&pa->pa_group_list);
+       pa->pa_deleted = 0;
+       pa->pa_linear = 1;
+@@ -4569,23 +4572,26 @@ static int ext4_mb_release_context(struct ext4_allocation_context *ac)
+                       pa->pa_free -= ac->ac_b_ex.fe_len;
+                       pa->pa_len -= ac->ac_b_ex.fe_len;
+                       spin_unlock(&pa->pa_lock);
+-                      /*
+-                       * We want to add the pa to the right bucket.
+-                       * Remove it from the list and while adding
+-                       * make sure the list to which we are adding
+-                       * doesn't grow big.
+-                       */
+-                      if (likely(pa->pa_free)) {
+-                              spin_lock(pa->pa_obj_lock);
+-                              list_del_rcu(&pa->pa_inode_list);
+-                              spin_unlock(pa->pa_obj_lock);
+-                              ext4_mb_add_n_trim(ac);
+-                      }
+               }
+-              ext4_mb_put_pa(ac, ac->ac_sb, pa);
+       }
+       if (ac->alloc_semp)
+               up_read(ac->alloc_semp);
++      if (pa) {
++              /*
++               * We want to add the pa to the right bucket.
++               * Remove it from the list and while adding
++               * make sure the list to which we are adding
++               * doesn't grow big.  We need to release
++               * alloc_semp before calling ext4_mb_add_n_trim()
++               */
++              if (pa->pa_linear && likely(pa->pa_free)) {
++                      spin_lock(pa->pa_obj_lock);
++                      list_del_rcu(&pa->pa_inode_list);
++                      spin_unlock(pa->pa_obj_lock);
++                      ext4_mb_add_n_trim(ac);
++              }
++              ext4_mb_put_pa(ac, ac->ac_sb, pa);
++      }
+       if (ac->ac_bitmap_page)
+               page_cache_release(ac->ac_bitmap_page);
+       if (ac->ac_buddy_page)
+diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c
+index f2a9cf4..9aa0fbe 100644
+--- a/fs/ext4/migrate.c
++++ b/fs/ext4/migrate.c
+@@ -480,7 +480,7 @@ int ext4_ext_migrate(struct inode *inode)
+                                       + 1);
+       if (IS_ERR(handle)) {
+               retval = PTR_ERR(handle);
+-              goto err_out;
++              return retval;
+       }
+       tmp_inode = ext4_new_inode(handle,
+                               inode->i_sb->s_root->d_inode,
+@@ -488,8 +488,7 @@ int ext4_ext_migrate(struct inode *inode)
+       if (IS_ERR(tmp_inode)) {
+               retval = -ENOMEM;
+               ext4_journal_stop(handle);
+-              tmp_inode = NULL;
+-              goto err_out;
++              return retval;
+       }
+       i_size_write(tmp_inode, i_size_read(inode));
+       /*
+@@ -617,8 +616,7 @@ err_out:
+       ext4_journal_stop(handle);
+-      if (tmp_inode)
+-              iput(tmp_inode);
++      iput(tmp_inode);
+       return retval;
+ }
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index 5e4491d..db2642a 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -2950,14 +2950,14 @@ static void ext4_write_super(struct super_block *sb)
+ static int ext4_sync_fs(struct super_block *sb, int wait)
+ {
+-      int ret = 0;
++      tid_t target;
+       sb->s_dirt = 0;
+-      if (wait)
+-              ret = ext4_force_commit(sb);
+-      else
+-              jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, NULL);
+-      return ret;
++      if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, &target)) {
++              if (wait)
++                      jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, target);
++      }
++      return 0;
+ }
+ /*
+diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
+index c8616a0..6caa023 100644
+--- a/fs/fs-writeback.c
++++ b/fs/fs-writeback.c
+@@ -274,6 +274,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)
+       int ret;
+       BUG_ON(inode->i_state & I_SYNC);
++      WARN_ON(inode->i_state & I_NEW);
+       /* Set I_SYNC, reset I_DIRTY */
+       dirty = inode->i_state & I_DIRTY;
+@@ -298,6 +299,7 @@ __sync_single_inode(struct inode *inode, struct writeback_control *wbc)
+       }
+       spin_lock(&inode_lock);
++      WARN_ON(inode->i_state & I_NEW);
+       inode->i_state &= ~I_SYNC;
+       if (!(inode->i_state & I_FREEING)) {
+               if (!(inode->i_state & I_DIRTY) &&
+@@ -470,6 +472,11 @@ void generic_sync_sb_inodes(struct super_block *sb,
+                       break;
+               }
++              if (inode->i_state & I_NEW) {
++                      requeue_io(inode);
++                      continue;
++              }
++
+               if (wbc->nonblocking && bdi_write_congested(bdi)) {
+                       wbc->encountered_congestion = 1;
+                       if (!sb_is_blkdev_sb(sb))
+@@ -531,7 +538,7 @@ void generic_sync_sb_inodes(struct super_block *sb,
+               list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+                       struct address_space *mapping;
+-                      if (inode->i_state & (I_FREEING|I_WILL_FREE))
++                      if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))
+                               continue;
+                       mapping = inode->i_mapping;
+                       if (mapping->nrpages == 0)
+diff --git a/fs/inode.c b/fs/inode.c
+index 0487ddb..7b2acc1 100644
+--- a/fs/inode.c
++++ b/fs/inode.c
+@@ -339,6 +339,7 @@ static int invalidate_list(struct list_head *head, struct list_head *dispose)
+               invalidate_inode_buffers(inode);
+               if (!atomic_read(&inode->i_count)) {
+                       list_move(&inode->i_list, dispose);
++                      WARN_ON(inode->i_state & I_NEW);
+                       inode->i_state |= I_FREEING;
+                       count++;
+                       continue;
+@@ -440,6 +441,7 @@ static void prune_icache(int nr_to_scan)
+                               continue;
+               }
+               list_move(&inode->i_list, &freeable);
++              WARN_ON(inode->i_state & I_NEW);
+               inode->i_state |= I_FREEING;
+               nr_pruned++;
+       }
+@@ -595,6 +597,7 @@ void unlock_new_inode(struct inode *inode)
+        * just created it (so there can be no old holders
+        * that haven't tested I_LOCK).
+        */
++      WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
+       inode->i_state &= ~(I_LOCK|I_NEW);
+       wake_up_inode(inode);
+ }
+@@ -1041,6 +1044,7 @@ void generic_delete_inode(struct inode *inode)
+       list_del_init(&inode->i_list);
+       list_del_init(&inode->i_sb_list);
++      WARN_ON(inode->i_state & I_NEW);
+       inode->i_state |= I_FREEING;
+       inodes_stat.nr_inodes--;
+       spin_unlock(&inode_lock);
+@@ -1082,16 +1086,19 @@ static void generic_forget_inode(struct inode *inode)
+                       spin_unlock(&inode_lock);
+                       return;
+               }
++              WARN_ON(inode->i_state & I_NEW);
+               inode->i_state |= I_WILL_FREE;
+               spin_unlock(&inode_lock);
+               write_inode_now(inode, 1);
+               spin_lock(&inode_lock);
++              WARN_ON(inode->i_state & I_NEW);
+               inode->i_state &= ~I_WILL_FREE;
+               inodes_stat.nr_unused--;
+               hlist_del_init(&inode->i_hash);
+       }
+       list_del_init(&inode->i_list);
+       list_del_init(&inode->i_sb_list);
++      WARN_ON(inode->i_state & I_NEW);
+       inode->i_state |= I_FREEING;
+       inodes_stat.nr_inodes--;
+       spin_unlock(&inode_lock);
+diff --git a/fs/inotify.c b/fs/inotify.c
+index 7bbed1b..213546b 100644
+--- a/fs/inotify.c
++++ b/fs/inotify.c
+@@ -156,7 +156,7 @@ static int inotify_handle_get_wd(struct inotify_handle *ih,
+       int ret;
+       do {
+-              if (unlikely(!idr_pre_get(&ih->idr, GFP_KERNEL)))
++              if (unlikely(!idr_pre_get(&ih->idr, GFP_NOFS)))
+                       return -ENOSPC;
+               ret = idr_get_new_above(&ih->idr, watch, ih->last_wd+1, &watch->wd);
+       } while (ret == -EAGAIN);
+diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
+index 52d2bee..ecb2603 100644
+--- a/fs/jbd2/journal.c
++++ b/fs/jbd2/journal.c
+@@ -430,7 +430,7 @@ int __jbd2_log_space_left(journal_t *journal)
+ }
+ /*
+- * Called under j_state_lock.  Returns true if a transaction was started.
++ * Called under j_state_lock.  Returns true if a transaction commit was started.
+  */
+ int __jbd2_log_start_commit(journal_t *journal, tid_t target)
+ {
+@@ -498,7 +498,8 @@ int jbd2_journal_force_commit_nested(journal_t *journal)
+ /*
+  * Start a commit of the current running transaction (if any).  Returns true
+- * if a transaction was started, and fills its tid in at *ptid
++ * if a transaction is going to be committed (or is currently already
++ * committing), and fills its tid in at *ptid
+  */
+ int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid)
+ {
+@@ -508,15 +509,19 @@ int jbd2_journal_start_commit(journal_t *journal, tid_t *ptid)
+       if (journal->j_running_transaction) {
+               tid_t tid = journal->j_running_transaction->t_tid;
+-              ret = __jbd2_log_start_commit(journal, tid);
+-              if (ret && ptid)
++              __jbd2_log_start_commit(journal, tid);
++              /* There's a running transaction and we've just made sure
++               * it's commit has been scheduled. */
++              if (ptid)
+                       *ptid = tid;
+-      } else if (journal->j_committing_transaction && ptid) {
++              ret = 1;
++      } else if (journal->j_committing_transaction) {
+               /*
+                * If ext3_write_super() recently started a commit, then we
+                * have to wait for completion of that transaction
+                */
+-              *ptid = journal->j_committing_transaction->t_tid;
++              if (ptid)
++                      *ptid = journal->j_committing_transaction->t_tid;
+               ret = 1;
+       }
+       spin_unlock(&journal->j_state_lock);
+diff --git a/fs/jbd2/transaction.c b/fs/jbd2/transaction.c
+index e5d5405..92d77c9 100644
+--- a/fs/jbd2/transaction.c
++++ b/fs/jbd2/transaction.c
+@@ -2049,26 +2049,46 @@ done:
+ }
+ /*
+- * This function must be called when inode is journaled in ordered mode
+- * before truncation happens. It starts writeout of truncated part in
+- * case it is in the committing transaction so that we stand to ordered
+- * mode consistency guarantees.
++ * File truncate and transaction commit interact with each other in a
++ * non-trivial way.  If a transaction writing data block A is
++ * committing, we cannot discard the data by truncate until we have
++ * written them.  Otherwise if we crashed after the transaction with
++ * write has committed but before the transaction with truncate has
++ * committed, we could see stale data in block A.  This function is a
++ * helper to solve this problem.  It starts writeout of the truncated
++ * part in case it is in the committing transaction.
++ *
++ * Filesystem code must call this function when inode is journaled in
++ * ordered mode before truncation happens and after the inode has been
++ * placed on orphan list with the new inode size. The second condition
++ * avoids the race that someone writes new data and we start
++ * committing the transaction after this function has been called but
++ * before a transaction for truncate is started (and furthermore it
++ * allows us to optimize the case where the addition to orphan list
++ * happens in the same transaction as write --- we don't have to write
++ * any data in such case).
+  */
+-int jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode,
++int jbd2_journal_begin_ordered_truncate(journal_t *journal,
++                                      struct jbd2_inode *jinode,
+                                       loff_t new_size)
+ {
+-      journal_t *journal;
+-      transaction_t *commit_trans;
++      transaction_t *inode_trans, *commit_trans;
+       int ret = 0;
+-      if (!inode->i_transaction && !inode->i_next_transaction)
++      /* This is a quick check to avoid locking if not necessary */
++      if (!jinode->i_transaction)
+               goto out;
+-      journal = inode->i_transaction->t_journal;
++      /* Locks are here just to force reading of recent values, it is
++       * enough that the transaction was not committing before we started
++       * a transaction adding the inode to orphan list */
+       spin_lock(&journal->j_state_lock);
+       commit_trans = journal->j_committing_transaction;
+       spin_unlock(&journal->j_state_lock);
+-      if (inode->i_transaction == commit_trans) {
+-              ret = filemap_fdatawrite_range(inode->i_vfs_inode->i_mapping,
++      spin_lock(&journal->j_list_lock);
++      inode_trans = jinode->i_transaction;
++      spin_unlock(&journal->j_list_lock);
++      if (inode_trans == commit_trans) {
++              ret = filemap_fdatawrite_range(jinode->i_vfs_inode->i_mapping,
+                       new_size, LLONG_MAX);
+               if (ret)
+                       jbd2_journal_abort(journal, ret);
+diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c
+index 6ca08ad..1fc1e92 100644
+--- a/fs/jffs2/readinode.c
++++ b/fs/jffs2/readinode.c
+@@ -220,7 +220,7 @@ static int jffs2_add_tn_to_tree(struct jffs2_sb_info *c,
+                               struct jffs2_tmp_dnode_info *tn)
+ {
+       uint32_t fn_end = tn->fn->ofs + tn->fn->size;
+-      struct jffs2_tmp_dnode_info *this;
++      struct jffs2_tmp_dnode_info *this, *ptn;
+       dbg_readinode("insert fragment %#04x-%#04x, ver %u at %08x\n", tn->fn->ofs, fn_end, tn->version, ref_offset(tn->fn->raw));
+@@ -251,11 +251,18 @@ static int jffs2_add_tn_to_tree(struct jffs2_sb_info *c,
+       if (this) {
+               /* If the node is coincident with another at a lower address,
+                  back up until the other node is found. It may be relevant */
+-              while (this->overlapped)
+-                      this = tn_prev(this);
+-
+-              /* First node should never be marked overlapped */
+-              BUG_ON(!this);
++              while (this->overlapped) {
++                      ptn = tn_prev(this);
++                      if (!ptn) {
++                              /*
++                               * We killed a node which set the overlapped
++                               * flags during the scan. Fix it up.
++                               */
++                              this->overlapped = 0;
++                              break;
++                      }
++                      this = ptn;
++              }
+               dbg_readinode("'this' found %#04x-%#04x (%s)\n", this->fn->ofs, this->fn->ofs + this->fn->size, this->fn ? "data" : "hole");
+       }
+@@ -360,7 +367,17 @@ static int jffs2_add_tn_to_tree(struct jffs2_sb_info *c,
+                       }
+                       if (!this->overlapped)
+                               break;
+-                      this = tn_prev(this);
++
++                      ptn = tn_prev(this);
++                      if (!ptn) {
++                              /*
++                               * We killed a node which set the overlapped
++                               * flags during the scan. Fix it up.
++                               */
++                              this->overlapped = 0;
++                              break;
++                      }
++                      this = ptn;
+               }
+       }
+@@ -456,8 +473,15 @@ static int jffs2_build_inode_fragtree(struct jffs2_sb_info *c,
+               eat_last(&rii->tn_root, &last->rb);
+               ver_insert(&ver_root, last);
+-              if (unlikely(last->overlapped))
+-                      continue;
++              if (unlikely(last->overlapped)) {
++                      if (pen)
++                              continue;
++                      /*
++                       * We killed a node which set the overlapped
++                       * flags during the scan. Fix it up.
++                       */
++                      last->overlapped = 0;
++              }
+               /* Now we have a bunch of nodes in reverse version
+                  order, in the tree at ver_root. Most of the time,
+diff --git a/fs/proc/proc_misc.c b/fs/proc/proc_misc.c
+index 29e20c6..8463dd3 100644
+--- a/fs/proc/proc_misc.c
++++ b/fs/proc/proc_misc.c
+@@ -797,7 +797,7 @@ static struct file_operations proc_kpagecount_operations = {
+ #define KPF_RECLAIM    9
+ #define KPF_BUDDY     10
+-#define kpf_copy_bit(flags, srcpos, dstpos) (((flags >> srcpos) & 1) << dstpos)
++#define kpf_copy_bit(flags, dstpos, srcpos) (((flags >> srcpos) & 1) << dstpos)
+ static ssize_t kpageflags_read(struct file *file, char __user *buf,
+                            size_t count, loff_t *ppos)
+@@ -824,7 +824,7 @@ static ssize_t kpageflags_read(struct file *file, char __user *buf,
+               else
+                       kflags = ppage->flags;
+-              uflags = kpf_copy_bit(KPF_LOCKED, PG_locked, kflags) |
++              uflags = kpf_copy_bit(kflags, KPF_LOCKED, PG_locked) |
+                       kpf_copy_bit(kflags, KPF_ERROR, PG_error) |
+                       kpf_copy_bit(kflags, KPF_REFERENCED, PG_referenced) |
+                       kpf_copy_bit(kflags, KPF_UPTODATE, PG_uptodate) |
+diff --git a/fs/seq_file.c b/fs/seq_file.c
+index ef4d497..0712add 100644
+--- a/fs/seq_file.c
++++ b/fs/seq_file.c
+@@ -48,8 +48,16 @@ int seq_open(struct file *file, const struct seq_operations *op)
+        */
+       file->f_version = 0;
+-      /* SEQ files support lseek, but not pread/pwrite */
+-      file->f_mode &= ~(FMODE_PREAD | FMODE_PWRITE);
++      /*
++       * seq_files support lseek() and pread().  They do not implement
++       * write() at all, but we clear FMODE_PWRITE here for historical
++       * reasons.
++       *
++       * If a client of seq_files a) implements file.write() and b) wishes to
++       * support pwrite() then that client will need to implement its own
++       * file.open() which calls seq_open() and then sets FMODE_PWRITE.
++       */
++      file->f_mode &= ~FMODE_PWRITE;
+       return 0;
+ }
+ EXPORT_SYMBOL(seq_open);
+@@ -131,6 +139,22 @@ ssize_t seq_read(struct file *file, char __user *buf, size_t size, loff_t *ppos)
+       int err = 0;
+       mutex_lock(&m->lock);
++
++      /* Don't assume *ppos is where we left it */
++      if (unlikely(*ppos != m->read_pos)) {
++              m->read_pos = *ppos;
++              while ((err = traverse(m, *ppos)) == -EAGAIN)
++                      ;
++              if (err) {
++                      /* With prejudice... */
++                      m->read_pos = 0;
++                      m->version = 0;
++                      m->index = 0;
++                      m->count = 0;
++                      goto Done;
++              }
++      }
++
+       /*
+        * seq_file->op->..m_start/m_stop/m_next may do special actions
+        * or optimisations based on the file->f_version, so we want to
+@@ -230,8 +254,10 @@ Fill:
+ Done:
+       if (!copied)
+               copied = err;
+-      else
++      else {
+               *ppos += copied;
++              m->read_pos += copied;
++      }
+       file->f_version = m->version;
+       mutex_unlock(&m->lock);
+       return copied;
+@@ -266,16 +292,18 @@ loff_t seq_lseek(struct file *file, loff_t offset, int origin)
+                       if (offset < 0)
+                               break;
+                       retval = offset;
+-                      if (offset != file->f_pos) {
++                      if (offset != m->read_pos) {
+                               while ((retval=traverse(m, offset)) == -EAGAIN)
+                                       ;
+                               if (retval) {
+                                       /* with extreme prejudice... */
+                                       file->f_pos = 0;
++                                      m->read_pos = 0;
+                                       m->version = 0;
+                                       m->index = 0;
+                                       m->count = 0;
+                               } else {
++                                      m->read_pos = offset;
+                                       retval = file->f_pos = offset;
+                               }
+                       }
+diff --git a/fs/timerfd.c b/fs/timerfd.c
+index ee211df..43feb6d 100644
+--- a/fs/timerfd.c
++++ b/fs/timerfd.c
+@@ -188,10 +188,9 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
+       BUILD_BUG_ON(TFD_CLOEXEC != O_CLOEXEC);
+       BUILD_BUG_ON(TFD_NONBLOCK != O_NONBLOCK);
+-      if (flags & ~(TFD_CLOEXEC | TFD_NONBLOCK))
+-              return -EINVAL;
+-      if (clockid != CLOCK_MONOTONIC &&
+-          clockid != CLOCK_REALTIME)
++      if ((flags & ~TFD_CREATE_FLAGS) ||
++          (clockid != CLOCK_MONOTONIC &&
++           clockid != CLOCK_REALTIME))
+               return -EINVAL;
+       ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+@@ -203,7 +202,7 @@ SYSCALL_DEFINE2(timerfd_create, int, clockid, int, flags)
+       hrtimer_init(&ctx->tmr, clockid, HRTIMER_MODE_ABS);
+       ufd = anon_inode_getfd("[timerfd]", &timerfd_fops, ctx,
+-                             flags & (O_CLOEXEC | O_NONBLOCK));
++                             flags & TFD_SHARED_FCNTL_FLAGS);
+       if (ufd < 0)
+               kfree(ctx);
+@@ -221,7 +220,8 @@ SYSCALL_DEFINE4(timerfd_settime, int, ufd, int, flags,
+       if (copy_from_user(&ktmr, utmr, sizeof(ktmr)))
+               return -EFAULT;
+-      if (!timespec_valid(&ktmr.it_value) ||
++      if ((flags & ~TFD_SETTIME_FLAGS) ||
++          !timespec_valid(&ktmr.it_value) ||
+           !timespec_valid(&ktmr.it_interval))
+               return -EINVAL;
+diff --git a/include/asm-mips/compat.h b/include/asm-mips/compat.h
+index ac5d541..6c5b409 100644
+--- a/include/asm-mips/compat.h
++++ b/include/asm-mips/compat.h
+@@ -3,6 +3,8 @@
+ /*
+  * Architecture specific compatibility types
+  */
++#include <linux/seccomp.h>
++#include <linux/thread_info.h>
+ #include <linux/types.h>
+ #include <asm/page.h>
+ #include <asm/ptrace.h>
+@@ -218,4 +220,9 @@ struct compat_shmid64_ds {
+       compat_ulong_t  __unused2;
+ };
++static inline int is_compat_task(void)
++{
++      return test_thread_flag(TIF_32BIT);
++}
++
+ #endif /* _ASM_COMPAT_H */
+diff --git a/include/asm-mips/seccomp.h b/include/asm-mips/seccomp.h
+index 36ed440..a6772e9 100644
+--- a/include/asm-mips/seccomp.h
++++ b/include/asm-mips/seccomp.h
+@@ -1,6 +1,5 @@
+ #ifndef __ASM_SECCOMP_H
+-#include <linux/thread_info.h>
+ #include <linux/unistd.h>
+ #define __NR_seccomp_read __NR_read
+diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h
+index eb77583..8132319 100644
+--- a/include/asm-x86/mmzone_32.h
++++ b/include/asm-x86/mmzone_32.h
+@@ -32,8 +32,6 @@ static inline void get_memcfg_numa(void)
+       get_memcfg_numa_flat();
+ }
+-extern int early_pfn_to_nid(unsigned long pfn);
+-
+ extern void resume_map_numa_kva(pgd_t *pgd);
+ #else /* !CONFIG_NUMA */
+diff --git a/include/asm-x86/mmzone_64.h b/include/asm-x86/mmzone_64.h
+index 594bd0d..ca3f5b1 100644
+--- a/include/asm-x86/mmzone_64.h
++++ b/include/asm-x86/mmzone_64.h
+@@ -41,8 +41,6 @@ static inline __attribute__((pure)) int phys_to_nid(unsigned long addr)
+ #define node_end_pfn(nid)       (NODE_DATA(nid)->node_start_pfn +     \
+                                NODE_DATA(nid)->node_spanned_pages)
+-extern int early_pfn_to_nid(unsigned long pfn);
+-
+ #ifdef CONFIG_NUMA_EMU
+ #define FAKE_NODE_MIN_SIZE    (64 * 1024 * 1024)
+ #define FAKE_NODE_MIN_HASH_MASK       (~(FAKE_NODE_MIN_SIZE - 1UL))
+diff --git a/include/asm-x86/seccomp_32.h b/include/asm-x86/seccomp_32.h
+index 36e71c5..5846ab6 100644
+--- a/include/asm-x86/seccomp_32.h
++++ b/include/asm-x86/seccomp_32.h
+@@ -1,12 +1,6 @@
+ #ifndef _ASM_SECCOMP_H
+ #define _ASM_SECCOMP_H
+-#include <linux/thread_info.h>
+-
+-#ifdef TIF_32BIT
+-#error "unexpected TIF_32BIT on i386"
+-#endif
+-
+ #include <linux/unistd.h>
+ #define __NR_seccomp_read __NR_read
+diff --git a/include/asm-x86/seccomp_64.h b/include/asm-x86/seccomp_64.h
+index 76cfe69..2199b54 100644
+--- a/include/asm-x86/seccomp_64.h
++++ b/include/asm-x86/seccomp_64.h
+@@ -1,14 +1,6 @@
+ #ifndef _ASM_SECCOMP_H
+ #define _ASM_SECCOMP_H
+-#include <linux/thread_info.h>
+-
+-#ifdef TIF_32BIT
+-#error "unexpected TIF_32BIT on x86_64"
+-#else
+-#define TIF_32BIT TIF_IA32
+-#endif
+-
+ #include <linux/unistd.h>
+ #include <asm/ia32_unistd.h>
+diff --git a/include/linux/fs.h b/include/linux/fs.h
+index d1b3e22..909e13e 100644
+--- a/include/linux/fs.h
++++ b/include/linux/fs.h
+@@ -63,18 +63,23 @@ extern int dir_notify_enable;
+ #define MAY_ACCESS 16
+ #define MAY_OPEN 32
+-#define FMODE_READ 1
+-#define FMODE_WRITE 2
+-
+-/* Internal kernel extensions */
+-#define FMODE_LSEEK   4
+-#define FMODE_PREAD   8
+-#define FMODE_PWRITE  FMODE_PREAD     /* These go hand in hand */
+-
+-/* File is being opened for execution. Primary users of this flag are
+-   distributed filesystems that can use it to achieve correct ETXTBUSY
+-   behavior for cross-node execution/opening_for_writing of files */
+-#define FMODE_EXEC    16
++/*
++ * flags in file.f_mode.  Note that FMODE_READ and FMODE_WRITE must correspond
++ * to O_WRONLY and O_RDWR via the strange trick in __dentry_open()
++ */
++
++/* file is open for reading */
++#define FMODE_READ            (1)
++/* file is open for writing */
++#define FMODE_WRITE           (2)
++/* file is seekable */
++#define FMODE_LSEEK           (4)
++/* file can be accessed using pread */
++#define FMODE_PREAD           (8)
++/* file can be accessed using pwrite */
++#define FMODE_PWRITE          (16)
++/* File is opened for execution with sys_execve / sys_uselib */
++#define FMODE_EXEC            (32)
+ #define RW_MASK               1
+ #define RWA_MASK      2
+diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
+index 0e1bd70..df4137e 100644
+--- a/include/linux/jbd2.h
++++ b/include/linux/jbd2.h
+@@ -1075,7 +1075,8 @@ extern int          jbd2_journal_clear_err  (journal_t *);
+ extern int       jbd2_journal_bmap(journal_t *, unsigned long, unsigned long long *);
+ extern int       jbd2_journal_force_commit(journal_t *);
+ extern int       jbd2_journal_file_inode(handle_t *handle, struct jbd2_inode *inode);
+-extern int       jbd2_journal_begin_ordered_truncate(struct jbd2_inode *inode, loff_t new_size);
++extern int       jbd2_journal_begin_ordered_truncate(journal_t *journal,
++                              struct jbd2_inode *inode, loff_t new_size);
+ extern void      jbd2_journal_init_jbd_inode(struct jbd2_inode *jinode, struct inode *inode);
+ extern void      jbd2_journal_release_jbd_inode(journal_t *journal, struct jbd2_inode *jinode);
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 856d52a..2a75579 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -1027,10 +1027,23 @@ extern void free_bootmem_with_active_regions(int nid,
+ typedef int (*work_fn_t)(unsigned long, unsigned long, void *);
+ extern void work_with_active_regions(int nid, work_fn_t work_fn, void *data);
+ extern void sparse_memory_present_with_active_regions(int nid);
+-#ifndef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
+-extern int early_pfn_to_nid(unsigned long pfn);
+-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
+ #endif /* CONFIG_ARCH_POPULATES_NODE_MAP */
++
++#if !defined(CONFIG_ARCH_POPULATES_NODE_MAP) && \
++    !defined(CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID)
++static inline int __early_pfn_to_nid(unsigned long pfn)
++{
++      return 0;
++}
++#else
++/* please see mm/page_alloc.c */
++extern int __meminit early_pfn_to_nid(unsigned long pfn);
++#ifdef CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID
++/* there is a per-arch backend function. */
++extern int __meminit __early_pfn_to_nid(unsigned long pfn);
++#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
++#endif
++
+ extern void set_dma_reserve(unsigned long new_dma_reserve);
+ extern void memmap_init_zone(unsigned long, int, unsigned long,
+                               unsigned long, enum memmap_context);
+diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
+index 428328a..803fc9d 100644
+--- a/include/linux/mmzone.h
++++ b/include/linux/mmzone.h
+@@ -978,7 +978,7 @@ void sparse_init(void);
+ #endif /* CONFIG_SPARSEMEM */
+ #ifdef CONFIG_NODES_SPAN_OTHER_NODES
+-#define early_pfn_in_nid(pfn, nid)    (early_pfn_to_nid(pfn) == (nid))
++bool early_pfn_in_nid(unsigned long pfn, int nid);
+ #else
+ #define early_pfn_in_nid(pfn, nid)    (1)
+ #endif
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index e7e7c7d..ba91fe1 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -1432,6 +1432,7 @@
+ #define PCI_DEVICE_ID_DIGI_DF_M_E     0x0071
+ #define PCI_DEVICE_ID_DIGI_DF_M_IOM2_A        0x0072
+ #define PCI_DEVICE_ID_DIGI_DF_M_A     0x0073
++#define PCI_DEVICE_ID_DIGI_NEO_8      0x00B1
+ #define PCI_DEVICE_ID_NEO_2DB9          0x00C8
+ #define PCI_DEVICE_ID_NEO_2DB9PRI       0x00C9
+ #define PCI_DEVICE_ID_NEO_2RJ45         0x00CA
+@@ -2283,6 +2284,9 @@
+ #define PCI_DEVICE_ID_INTEL_82378     0x0484
+ #define PCI_DEVICE_ID_INTEL_I960      0x0960
+ #define PCI_DEVICE_ID_INTEL_I960RM    0x0962
++#define PCI_DEVICE_ID_INTEL_8257X_SOL 0x1062
++#define PCI_DEVICE_ID_INTEL_82573E_SOL        0x1085
++#define PCI_DEVICE_ID_INTEL_82573L_SOL        0x108F
+ #define PCI_DEVICE_ID_INTEL_82815_MC  0x1130
+ #define PCI_DEVICE_ID_INTEL_82815_CGC 0x1132
+ #define PCI_DEVICE_ID_INTEL_82092AA_0 0x1221
+diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h
+index a1783b2..19d6ca9 100644
+--- a/include/linux/seq_file.h
++++ b/include/linux/seq_file.h
+@@ -19,6 +19,7 @@ struct seq_file {
+       size_t from;
+       size_t count;
+       loff_t index;
++      loff_t read_pos;
+       u64 version;
+       struct mutex lock;
+       const struct seq_operations *op;
+diff --git a/include/linux/serial_core.h b/include/linux/serial_core.h
+index 3b2f6c0..d05ad88 100644
+--- a/include/linux/serial_core.h
++++ b/include/linux/serial_core.h
+@@ -285,6 +285,7 @@ struct uart_port {
+ #define UPF_HARDPPS_CD                ((__force upf_t) (1 << 11))
+ #define UPF_LOW_LATENCY               ((__force upf_t) (1 << 13))
+ #define UPF_BUGGY_UART                ((__force upf_t) (1 << 14))
++#define UPF_NO_TXEN_TEST      ((__force upf_t) (1 << 15))
+ #define UPF_MAGIC_MULTIPLIER  ((__force upf_t) (1 << 16))
+ #define UPF_CONS_FLOW         ((__force upf_t) (1 << 23))
+ #define UPF_SHARE_IRQ         ((__force upf_t) (1 << 24))
+diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
+index 9099237..2dc6958 100644
+--- a/include/linux/skbuff.h
++++ b/include/linux/skbuff.h
+@@ -395,15 +395,6 @@ extern void             skb_over_panic(struct sk_buff *skb, int len,
+                                    void *here);
+ extern void         skb_under_panic(struct sk_buff *skb, int len,
+                                     void *here);
+-extern void         skb_truesize_bug(struct sk_buff *skb);
+-
+-static inline void skb_truesize_check(struct sk_buff *skb)
+-{
+-      int len = sizeof(struct sk_buff) + skb->len;
+-
+-      if (unlikely((int)skb->truesize < len))
+-              skb_truesize_bug(skb);
+-}
+ extern int skb_append_datato_frags(struct sock *sk, struct sk_buff *skb,
+                       int getfrag(void *from, char *to, int offset,
+diff --git a/include/linux/timerfd.h b/include/linux/timerfd.h
+index 86cb050..2d07929 100644
+--- a/include/linux/timerfd.h
++++ b/include/linux/timerfd.h
+@@ -11,13 +11,21 @@
+ /* For O_CLOEXEC and O_NONBLOCK */
+ #include <linux/fcntl.h>
+-/* Flags for timerfd_settime.  */
++/*
++ * CAREFUL: Check include/asm-generic/fcntl.h when defining
++ * new flags, since they might collide with O_* ones. We want
++ * to re-use O_* flags that couldn't possibly have a meaning
++ * from eventfd, in order to leave a free define-space for
++ * shared O_* flags.
++ */
+ #define TFD_TIMER_ABSTIME (1 << 0)
+-
+-/* Flags for timerfd_create.  */
+ #define TFD_CLOEXEC O_CLOEXEC
+ #define TFD_NONBLOCK O_NONBLOCK
++#define TFD_SHARED_FCNTL_FLAGS (TFD_CLOEXEC | TFD_NONBLOCK)
++/* Flags for timerfd_create.  */
++#define TFD_CREATE_FLAGS TFD_SHARED_FCNTL_FLAGS
++/* Flags for timerfd_settime.  */
++#define TFD_SETTIME_FLAGS TFD_TIMER_ABSTIME
+ #endif /* _LINUX_TIMERFD_H */
+-
+diff --git a/include/net/sock.h b/include/net/sock.h
+index 06c5259..df43f56 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -777,7 +777,6 @@ static inline void sk_mem_uncharge(struct sock *sk, int size)
+ static inline void sk_wmem_free_skb(struct sock *sk, struct sk_buff *skb)
+ {
+-      skb_truesize_check(skb);
+       sock_set_flag(sk, SOCK_QUEUE_SHRUNK);
+       sk->sk_wmem_queued -= skb->truesize;
+       sk_mem_uncharge(sk, skb->truesize);
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 42fb5b0..843ce75 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -1137,10 +1137,6 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+ #endif
+       clear_all_latency_tracing(p);
+-      /* Our parent execution domain becomes current domain
+-         These must match for thread signalling to apply */
+-      p->parent_exec_id = p->self_exec_id;
+-
+       /* ok, now we should be set up.. */
+       p->exit_signal = (clone_flags & CLONE_THREAD) ? -1 : (clone_flags & CSIGNAL);
+       p->pdeath_signal = 0;
+@@ -1178,10 +1174,13 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+               set_task_cpu(p, smp_processor_id());
+       /* CLONE_PARENT re-uses the old parent */
+-      if (clone_flags & (CLONE_PARENT|CLONE_THREAD))
++      if (clone_flags & (CLONE_PARENT|CLONE_THREAD)) {
+               p->real_parent = current->real_parent;
+-      else
++              p->parent_exec_id = current->parent_exec_id;
++      } else {
+               p->real_parent = current;
++              p->parent_exec_id = current->self_exec_id;
++      }
+       spin_lock(&current->sighand->siglock);
+diff --git a/kernel/seccomp.c b/kernel/seccomp.c
+index ad64fcb..57d4b13 100644
+--- a/kernel/seccomp.c
++++ b/kernel/seccomp.c
+@@ -8,6 +8,7 @@
+ #include <linux/seccomp.h>
+ #include <linux/sched.h>
++#include <linux/compat.h>
+ /* #define SECCOMP_DEBUG 1 */
+ #define NR_SECCOMP_MODES 1
+@@ -22,7 +23,7 @@ static int mode1_syscalls[] = {
+       0, /* null terminated */
+ };
+-#ifdef TIF_32BIT
++#ifdef CONFIG_COMPAT
+ static int mode1_syscalls_32[] = {
+       __NR_seccomp_read_32, __NR_seccomp_write_32, __NR_seccomp_exit_32, __NR_seccomp_sigreturn_32,
+       0, /* null terminated */
+@@ -37,8 +38,8 @@ void __secure_computing(int this_syscall)
+       switch (mode) {
+       case 1:
+               syscall = mode1_syscalls;
+-#ifdef TIF_32BIT
+-              if (test_thread_flag(TIF_32BIT))
++#ifdef CONFIG_COMPAT
++              if (is_compat_task())
+                       syscall = mode1_syscalls_32;
+ #endif
+               do {
+diff --git a/kernel/tsacct.c b/kernel/tsacct.c
+index 8ebcd85..5275fba 100644
+--- a/kernel/tsacct.c
++++ b/kernel/tsacct.c
+@@ -120,8 +120,10 @@ void acct_update_integrals(struct task_struct *tsk)
+       if (likely(tsk->mm)) {
+               cputime_t time, dtime;
+               struct timeval value;
++              unsigned long flags;
+               u64 delta;
++              local_irq_save(flags);
+               time = tsk->stime + tsk->utime;
+               dtime = cputime_sub(time, tsk->acct_timexpd);
+               jiffies_to_timeval(cputime_to_jiffies(dtime), &value);
+@@ -129,10 +131,12 @@ void acct_update_integrals(struct task_struct *tsk)
+               delta = delta * USEC_PER_SEC + value.tv_usec;
+               if (delta == 0)
+-                      return;
++                      goto out;
+               tsk->acct_timexpd = time;
+               tsk->acct_rss_mem1 += delta * get_mm_rss(tsk->mm);
+               tsk->acct_vm_mem1 += delta * tsk->mm->total_vm;
++      out:
++              local_irq_restore(flags);
+       }
+ }
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 51daae5..4205f7f 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -2949,7 +2949,7 @@ static int __meminit next_active_region_index_in_nid(int index, int nid)
+  * was used and there are no special requirements, this is a convenient
+  * alternative
+  */
+-int __meminit early_pfn_to_nid(unsigned long pfn)
++int __meminit __early_pfn_to_nid(unsigned long pfn)
+ {
+       int i;
+@@ -2960,10 +2960,33 @@ int __meminit early_pfn_to_nid(unsigned long pfn)
+               if (start_pfn <= pfn && pfn < end_pfn)
+                       return early_node_map[i].nid;
+       }
++      /* This is a memory hole */
++      return -1;
++}
++#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
++
++int __meminit early_pfn_to_nid(unsigned long pfn)
++{
++      int nid;
++      nid = __early_pfn_to_nid(pfn);
++      if (nid >= 0)
++              return nid;
++      /* just returns 0 */
+       return 0;
+ }
+-#endif /* CONFIG_HAVE_ARCH_EARLY_PFN_TO_NID */
++
++#ifdef CONFIG_NODES_SPAN_OTHER_NODES
++bool __meminit early_pfn_in_nid(unsigned long pfn, int node)
++{
++      int nid;
++
++      nid = __early_pfn_to_nid(pfn);
++      if (nid >= 0 && nid != node)
++              return false;
++      return true;
++}
++#endif
+ /* Basic iterator support to walk early_node_map[] */
+ #define for_each_active_range_index_in_nid(i, nid) \
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index 6a9a6cd..9abd450 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -101,6 +101,18 @@ static inline __be16 pppoe_proto(const struct sk_buff *skb)
+        pppoe_proto(skb) == htons(PPP_IPV6) && \
+        brnf_filter_pppoe_tagged)
++static void fake_update_pmtu(struct dst_entry *dst, u32 mtu)
++{
++}
++
++static struct dst_ops fake_dst_ops = {
++      .family =               AF_INET,
++      .protocol =             __constant_htons(ETH_P_IP),
++      .update_pmtu =          fake_update_pmtu,
++      .entry_size =           sizeof(struct rtable),
++      .entries =              ATOMIC_INIT(0),
++};
++
+ /*
+  * Initialize bogus route table used to keep netfilter happy.
+  * Currently, we fill in the PMTU entry because netfilter
+@@ -117,6 +129,7 @@ void br_netfilter_rtable_init(struct net_bridge *br)
+       rt->u.dst.path = &rt->u.dst;
+       rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
+       rt->u.dst.flags = DST_NOXFRM;
++      rt->u.dst.ops = &fake_dst_ops;
+ }
+ static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 53425fa..0675991 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -143,14 +143,6 @@ void skb_under_panic(struct sk_buff *skb, int sz, void *here)
+       BUG();
+ }
+-void skb_truesize_bug(struct sk_buff *skb)
+-{
+-      printk(KERN_ERR "SKB BUG: Invalid truesize (%u) "
+-             "len=%u, sizeof(sk_buff)=%Zd\n",
+-             skb->truesize, skb->len, sizeof(struct sk_buff));
+-}
+-EXPORT_SYMBOL(skb_truesize_bug);
+-
+ /*    Allocate a new skbuff. We do this ourselves so we can fill in a few
+  *    'private' fields and also do memory statistics to find all the
+  *    [BEEP] leaks.
+diff --git a/net/core/sock.c b/net/core/sock.c
+index b1b2f22..93adc5c 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -695,7 +695,7 @@ int sock_getsockopt(struct socket *sock, int level, int optname,
+       if (len < 0)
+               return -EINVAL;
+-      v.val = 0;
++      memset(&v, 0, sizeof(v));
+       switch(optname) {
+       case SO_DEBUG:
+@@ -1136,7 +1136,6 @@ void sock_rfree(struct sk_buff *skb)
+ {
+       struct sock *sk = skb->sk;
+-      skb_truesize_check(skb);
+       atomic_sub(skb->truesize, &sk->sk_rmem_alloc);
+       sk_mem_uncharge(skb->sk, skb->truesize);
+ }
+diff --git a/security/selinux/netlabel.c b/security/selinux/netlabel.c
+index 89b4183..89e0cc1 100644
+--- a/security/selinux/netlabel.c
++++ b/security/selinux/netlabel.c
+@@ -236,11 +236,12 @@ int selinux_netlbl_inode_permission(struct inode *inode, int mask)
+       if (!S_ISSOCK(inode->i_mode) ||
+           ((mask & (MAY_WRITE | MAY_APPEND)) == 0))
+               return 0;
+-
+       sock = SOCKET_I(inode);
+       sk = sock->sk;
++      if (sk == NULL)
++              return 0;
+       sksec = sk->sk_security;
+-      if (sksec->nlbl_state != NLBL_REQUIRE)
++      if (sksec == NULL || sksec->nlbl_state != NLBL_REQUIRE)
+               return 0;
+       local_bh_disable();
+@@ -339,8 +340,10 @@ int selinux_netlbl_socket_setsockopt(struct socket *sock,
+               lock_sock(sk);
+               rc = netlbl_sock_getattr(sk, &secattr);
+               release_sock(sk);
+-              if (rc == 0 && secattr.flags != NETLBL_SECATTR_NONE)
++              if (rc == 0)
+                       rc = -EACCES;
++              else if (rc == -ENOMSG)
++                      rc = 0;
+               netlbl_secattr_destroy(&secattr);
+       }
+diff --git a/sound/core/oss/rate.c b/sound/core/oss/rate.c
+index 14dfb31..bc9d87d 100644
+--- a/sound/core/oss/rate.c
++++ b/sound/core/oss/rate.c
+@@ -157,7 +157,7 @@ static void resample_shrink(struct snd_pcm_plugin *plugin,
+               while (dst_frames1 > 0) {
+                       S1 = S2;
+                       if (src_frames1-- > 0) {
+-                              S1 = *src;
++                              S2 = *src;
+                               src += src_step;
+                       }
+                       if (pos & ~R_MASK) {
+diff --git a/sound/pci/aw2/aw2-alsa.c b/sound/pci/aw2/aw2-alsa.c
+index 3f00ddf..c7c54e7 100644
+--- a/sound/pci/aw2/aw2-alsa.c
++++ b/sound/pci/aw2/aw2-alsa.c
+@@ -165,7 +165,7 @@ module_param_array(enable, bool, NULL, 0444);
+ MODULE_PARM_DESC(enable, "Enable Audiowerk2 soundcard.");
+ static struct pci_device_id snd_aw2_ids[] = {
+-      {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, PCI_ANY_ID, PCI_ANY_ID,
++      {PCI_VENDOR_ID_SAA7146, PCI_DEVICE_ID_SAA7146, 0, 0,
+        0, 0, 0},
+       {0}
+ };
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index db9c702..3b5c6c2 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -6630,6 +6630,7 @@ static int patch_alc882(struct hda_codec *codec)
+               case 0x106b2800: /* AppleTV */
+                       board_config = ALC885_IMAC24;
+                       break;
++              case 0x106b00a0: /* MacBookPro3,1 - Another revision */
+               case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
+               case 0x106b2c00: /* Macbook Pro rev3 */
+               case 0x106b3600: /* Macbook 3.1 */
+diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
+index 82a7814..01d7b75 100644
+--- a/sound/pci/oxygen/virtuoso.c
++++ b/sound/pci/oxygen/virtuoso.c
+@@ -26,7 +26,7 @@
+  * SPI 0 -> 1st PCM1796 (front)
+  * SPI 1 -> 2nd PCM1796 (surround)
+  * SPI 2 -> 3rd PCM1796 (center/LFE)
+- * SPI 4 -> 4th PCM1796 (back) and EEPROM self-destruct (do not use!)
++ * SPI 4 -> 4th PCM1796 (back)
+  *
+  * GPIO 2 -> M0 of CS5381
+  * GPIO 3 -> M1 of CS5381
+@@ -142,12 +142,6 @@ struct xonar_data {
+ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
+                         u8 reg, u8 value)
+ {
+-      /*
+-       * We don't want to do writes on SPI 4 because the EEPROM, which shares
+-       * the same pin, might get confused and broken.  We'd better take care
+-       * that the driver works with the default register values ...
+-       */
+-#if 0
+       /* maps ALSA channel pair number to SPI output */
+       static const u8 codec_map[4] = {
+               0, 1, 2, 4
+@@ -158,7 +152,6 @@ static void pcm1796_write(struct oxygen *chip, unsigned int codec,
+                        (codec_map[codec] << OXYGEN_SPI_CODEC_SHIFT) |
+                        OXYGEN_SPI_CEN_LATCH_CLOCK_HI,
+                        (reg << 8) | value);
+-#endif
+ }
+ static void cs4398_write(struct oxygen *chip, u8 reg, u8 value)
+@@ -546,9 +539,6 @@ static const DECLARE_TLV_DB_SCALE(cs4362a_db_scale, -12700, 100, 0);
+ static int xonar_d2_control_filter(struct snd_kcontrol_new *template)
+ {
+-      if (!strncmp(template->name, "Master Playback ", 16))
+-              /* disable volume/mute because they would require SPI writes */
+-              return 1;
+       if (!strncmp(template->name, "CD Capture ", 11))
+               /* CD in is actually connected to the video in pin */
+               template->private_value ^= AC97_CD ^ AC97_VIDEO;
+@@ -598,8 +588,9 @@ static const struct oxygen_model xonar_models[] = {
+               .dac_volume_min = 0x0f,
+               .dac_volume_max = 0xff,
+               .misc_flags = OXYGEN_MISC_MIDI,
+-              .function_flags = OXYGEN_FUNCTION_SPI,
+-              .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
++              .function_flags = OXYGEN_FUNCTION_SPI |
++                                OXYGEN_FUNCTION_ENABLE_SPI_4_5,
++              .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+               .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+       },
+       [MODEL_D2X] = {
+@@ -628,8 +619,9 @@ static const struct oxygen_model xonar_models[] = {
+               .dac_volume_min = 0x0f,
+               .dac_volume_max = 0xff,
+               .misc_flags = OXYGEN_MISC_MIDI,
+-              .function_flags = OXYGEN_FUNCTION_SPI,
+-              .dac_i2s_format = OXYGEN_I2S_FORMAT_I2S,
++              .function_flags = OXYGEN_FUNCTION_SPI |
++                                OXYGEN_FUNCTION_ENABLE_SPI_4_5,
++              .dac_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+               .adc_i2s_format = OXYGEN_I2S_FORMAT_LJUST,
+       },
+       [MODEL_D1] = {
+diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
+index 7a1a8c8..1710623 100644
+--- a/sound/usb/usbaudio.c
++++ b/sound/usb/usbaudio.c
+@@ -2516,7 +2516,6 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform
+                * build the rate table and bitmap flags
+                */
+               int r, idx;
+-              unsigned int nonzero_rates = 0;
+               fp->rate_table = kmalloc(sizeof(int) * nr_rates, GFP_KERNEL);
+               if (fp->rate_table == NULL) {
+@@ -2524,24 +2523,27 @@ static int parse_audio_format_rates(struct snd_usb_audio *chip, struct audioform
+                       return -1;
+               }
+-              fp->nr_rates = nr_rates;
+-              fp->rate_min = fp->rate_max = combine_triple(&fmt[8]);
++              fp->nr_rates = 0;
++              fp->rate_min = fp->rate_max = 0;
+               for (r = 0, idx = offset + 1; r < nr_rates; r++, idx += 3) {
+                       unsigned int rate = combine_triple(&fmt[idx]);
++                      if (!rate)
++                              continue;
+                       /* C-Media CM6501 mislabels its 96 kHz altsetting */
+                       if (rate == 48000 && nr_rates == 1 &&
+-                          chip->usb_id == USB_ID(0x0d8c, 0x0201) &&
++                          (chip->usb_id == USB_ID(0x0d8c, 0x0201) ||
++                           chip->usb_id == USB_ID(0x0d8c, 0x0102)) &&
+                           fp->altsetting == 5 && fp->maxpacksize == 392)
+                               rate = 96000;
+-                      fp->rate_table[r] = rate;
+-                      nonzero_rates |= rate;
+-                      if (rate < fp->rate_min)
++                      fp->rate_table[fp->nr_rates] = rate;
++                      if (!fp->rate_min || rate < fp->rate_min)
+                               fp->rate_min = rate;
+-                      else if (rate > fp->rate_max)
++                      if (!fp->rate_max || rate > fp->rate_max)
+                               fp->rate_max = rate;
+                       fp->rates |= snd_pcm_rate_to_rate_bit(rate);
++                      fp->nr_rates++;
+               }
+-              if (!nonzero_rates) {
++              if (!fp->nr_rates) {
+                       hwc_debug("All rates were zero. Skipping format!\n");
+                       return -1;
+               }
+diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
+index 6676a17..940ae5a 100644
+--- a/sound/usb/usbmidi.c
++++ b/sound/usb/usbmidi.c
+@@ -1583,6 +1583,7 @@ static int snd_usbmidi_create_endpoints_midiman(struct snd_usb_midi* umidi,
+       }
+       ep_info.out_ep = get_endpoint(hostif, 2)->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK;
++      ep_info.out_interval = 0;
+       ep_info.out_cables = endpoint->out_cables & 0x5555;
+       err = snd_usbmidi_out_endpoint_create(umidi, &ep_info, &umidi->endpoints[0]);
+       if (err < 0)
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.2-3 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.2-3
new file mode 100644 (file)
index 0000000..4679223
--- /dev/null
@@ -0,0 +1,761 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.3
+
+Upstream 2.6.27.3 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/video4linux/CARDLIST.au0828 b/Documentation/video4linux/CARDLIST.au0828
+index aa05e5b..d5cb4ea 100644
+--- a/Documentation/video4linux/CARDLIST.au0828
++++ b/Documentation/video4linux/CARDLIST.au0828
+@@ -1,5 +1,5 @@
+   0 -> Unknown board                            (au0828)
+-  1 -> Hauppauge HVR950Q                        (au0828)        [2040:7200,2040:7210,2040:7217,2040:721b,2040:721f,2040:7280,0fd9:0008]
++  1 -> Hauppauge HVR950Q                        (au0828)        [2040:7200,2040:7210,2040:7217,2040:721b,2040:721e,2040:721f,2040:7280,0fd9:0008]
+   2 -> Hauppauge HVR850                         (au0828)        [2040:7240]
+   3 -> DViCO FusionHDTV USB                     (au0828)        [0fe9:d620]
+   4 -> Hauppauge HVR950Q rev xxF8               (au0828)        [2040:7201,2040:7211,2040:7281]
+diff --git a/Makefile b/Makefile
+index 063fbe4..e4b635a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,8 +1,8 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .2
+-NAME = Rotary Wombat
++EXTRAVERSION = .3
++NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+ # To see a list of typical targets execute "make help"
+diff --git a/drivers/base/core.c b/drivers/base/core.c
+index d021c98..473c323 100644
+--- a/drivers/base/core.c
++++ b/drivers/base/core.c
+@@ -523,11 +523,16 @@ static void klist_children_put(struct klist_node *n)
+  * device_initialize - init device structure.
+  * @dev: device.
+  *
+- * This prepares the device for use by other layers,
+- * including adding it to the device hierarchy.
++ * This prepares the device for use by other layers by initializing
++ * its fields.
+  * It is the first half of device_register(), if called by
+- * that, though it can also be called separately, so one
+- * may use @dev's fields (e.g. the refcount).
++ * that function, though it can also be called separately, so one
++ * may use @dev's fields. In particular, get_device()/put_device()
++ * may be used for reference counting of @dev after calling this
++ * function.
++ *
++ * NOTE: Use put_device() to give up your reference instead of freeing
++ * @dev directly once you have called this function.
+  */
+ void device_initialize(struct device *dev)
+ {
+@@ -836,9 +841,13 @@ static void device_remove_sys_dev_entry(struct device *dev)
+  * This is part 2 of device_register(), though may be called
+  * separately _iff_ device_initialize() has been called separately.
+  *
+- * This adds it to the kobject hierarchy via kobject_add(), adds it
++ * This adds @dev to the kobject hierarchy via kobject_add(), adds it
+  * to the global and sibling lists for the device, then
+  * adds it to the other relevant subsystems of the driver model.
++ *
++ * NOTE: _Never_ directly free @dev after calling this function, even
++ * if it returned an error! Always use put_device() to give up your
++ * reference instead.
+  */
+ int device_add(struct device *dev)
+ {
+@@ -965,6 +974,10 @@ done:
+  * I.e. you should only call the two helpers separately if
+  * have a clearly defined need to use and refcount the device
+  * before it is added to the hierarchy.
++ *
++ * NOTE: _Never_ directly free @dev after calling this function, even
++ * if it returned an error! Always use put_device() to give up the
++ * reference initialized in this function instead.
+  */
+ int device_register(struct device *dev)
+ {
+@@ -1243,7 +1256,7 @@ struct device *device_create_vargs(struct class *class, struct device *parent,
+       return dev;
+ error:
+-      kfree(dev);
++      put_device(dev);
+       return ERR_PTR(retval);
+ }
+ EXPORT_SYMBOL_GPL(device_create_vargs);
+diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
+index 8897434..a219ae4 100644
+--- a/drivers/gpu/drm/i915/i915_dma.c
++++ b/drivers/gpu/drm/i915/i915_dma.c
+@@ -836,7 +836,7 @@ struct drm_ioctl_desc i915_ioctls[] = {
+       DRM_IOCTL_DEF(DRM_I915_SET_VBLANK_PIPE,  i915_vblank_pipe_set, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY ),
+       DRM_IOCTL_DEF(DRM_I915_GET_VBLANK_PIPE,  i915_vblank_pipe_get, DRM_AUTH ),
+       DRM_IOCTL_DEF(DRM_I915_VBLANK_SWAP, i915_vblank_swap, DRM_AUTH),
+-      DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH),
++      DRM_IOCTL_DEF(DRM_I915_HWS_ADDR, i915_set_status_page, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
+ };
+ int i915_max_ioctl = DRM_ARRAY_SIZE(i915_ioctls);
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index deeac4b..fe6eccd 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -2109,8 +2109,6 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+       if (strict_strtoull(buf, 10, &size) < 0)
+               return -EINVAL;
+-      if (size < my_mddev->size)
+-              return -EINVAL;
+       if (my_mddev->pers && rdev->raid_disk >= 0) {
+               if (my_mddev->persistent) {
+                       size = super_types[my_mddev->major_version].
+@@ -2121,9 +2119,9 @@ rdev_size_store(mdk_rdev_t *rdev, const char *buf, size_t len)
+                       size = (rdev->bdev->bd_inode->i_size >> 10);
+                       size -= rdev->data_offset/2;
+               }
+-              if (size < my_mddev->size)
+-                      return -EINVAL; /* component must fit device */
+       }
++      if (size < my_mddev->size)
++              return -EINVAL; /* component must fit device */
+       rdev->size = size;
+       if (size > oldsize && my_mddev->external) {
+diff --git a/drivers/media/dvb/siano/sms-cards.c b/drivers/media/dvb/siano/sms-cards.c
+index 9da260f..6f9b773 100644
+--- a/drivers/media/dvb/siano/sms-cards.c
++++ b/drivers/media/dvb/siano/sms-cards.c
+@@ -42,6 +42,10 @@ struct usb_device_id smsusb_id_table[] = {
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5510),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
++      { USB_DEVICE(0x2040, 0x5520),
++              .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
++      { USB_DEVICE(0x2040, 0x5530),
++              .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5580),
+               .driver_info = SMS1XXX_BOARD_HAUPPAUGE_WINDHAM },
+       { USB_DEVICE(0x2040, 0x5590),
+diff --git a/drivers/media/video/au0828/au0828-cards.c b/drivers/media/video/au0828/au0828-cards.c
+index ed48908..6294938 100644
+--- a/drivers/media/video/au0828/au0828-cards.c
++++ b/drivers/media/video/au0828/au0828-cards.c
+@@ -90,6 +90,7 @@ static void hauppauge_eeprom(struct au0828_dev *dev, u8 *eeprom_data)
+       case 72221: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
+       case 72231: /* WinTV-HVR950q (OEM, IR, ATSC/QAM and basic analog video */
+       case 72241: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM and basic analog video */
++      case 72251: /* WinTV-HVR950q (Retail, IR, ATSC/QAM and basic analog video */
+       case 72301: /* WinTV-HVR850 (Retail, IR, ATSC and basic analog video */
+       case 72500: /* WinTV-HVR950q (OEM, No IR, ATSC/QAM */
+               break;
+@@ -198,6 +199,8 @@ struct usb_device_id au0828_usb_id_table [] = {
+               .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+       { USB_DEVICE(0x2040, 0x721b),
+               .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
++      { USB_DEVICE(0x2040, 0x721e),
++              .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+       { USB_DEVICE(0x2040, 0x721f),
+               .driver_info = AU0828_BOARD_HAUPPAUGE_HVR950Q },
+       { USB_DEVICE(0x2040, 0x7280),
+diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
+index 463680b..b59e472 100644
+--- a/drivers/media/video/tvaudio.c
++++ b/drivers/media/video/tvaudio.c
+@@ -1792,7 +1792,7 @@ static int chip_command(struct i2c_client *client,
+               break;
+       case VIDIOC_S_FREQUENCY:
+               chip->mode = 0; /* automatic */
+-              if (desc->checkmode) {
++              if (desc->checkmode && desc->setmode) {
+                       desc->setmode(chip,V4L2_TUNER_MODE_MONO);
+                       if (chip->prevmode != V4L2_TUNER_MODE_MONO)
+                               chip->prevmode = -1; /* reset previous mode */
+diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h
+index 2f84093..88f4cc3 100644
+--- a/drivers/net/wireless/ath9k/core.h
++++ b/drivers/net/wireless/ath9k/core.h
+@@ -316,7 +316,7 @@ void ath_descdma_cleanup(struct ath_softc *sc,
+ #define ATH_RX_TIMEOUT           40      /* 40 milliseconds */
+ #define WME_NUM_TID              16
+ #define IEEE80211_BAR_CTL_TID_M  0xF000  /* tid mask */
+-#define IEEE80211_BAR_CTL_TID_S  2       /* tid shift */
++#define IEEE80211_BAR_CTL_TID_S  12      /* tid shift */
+ enum ATH_RX_TYPE {
+       ATH_RX_NON_CONSUMED = 0,
+diff --git a/drivers/net/wireless/ath9k/main.c b/drivers/net/wireless/ath9k/main.c
+index acebdf1..b4c7174 100644
+--- a/drivers/net/wireless/ath9k/main.c
++++ b/drivers/net/wireless/ath9k/main.c
+@@ -1007,6 +1007,11 @@ static int ath9k_ampdu_action(struct ieee80211_hw *hw,
+       return ret;
+ }
++static int ath9k_no_fragmentation(struct ieee80211_hw *hw, u32 value)
++{
++      return -EOPNOTSUPP;
++}
++
+ static struct ieee80211_ops ath9k_ops = {
+       .tx                 = ath9k_tx,
+       .start              = ath9k_start,
+@@ -1031,7 +1036,8 @@ static struct ieee80211_ops ath9k_ops = {
+       .get_tsf            = ath9k_get_tsf,
+       .reset_tsf          = ath9k_reset_tsf,
+       .tx_last_beacon     = NULL,
+-      .ampdu_action       = ath9k_ampdu_action
++      .ampdu_action       = ath9k_ampdu_action,
++      .set_frag_threshold = ath9k_no_fragmentation,
+ };
+ void ath_get_beaconconfig(struct ath_softc *sc,
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
+index 8ab389d..706f3e6 100644
+--- a/drivers/usb/core/hcd.c
++++ b/drivers/usb/core/hcd.c
+@@ -81,6 +81,10 @@
+ /*-------------------------------------------------------------------------*/
++/* Keep track of which host controller drivers are loaded */
++unsigned long usb_hcds_loaded;
++EXPORT_SYMBOL_GPL(usb_hcds_loaded);
++
+ /* host controllers we manage */
+ LIST_HEAD (usb_bus_list);
+ EXPORT_SYMBOL_GPL (usb_bus_list);
+diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
+index e710ce0..2dcde61 100644
+--- a/drivers/usb/core/hcd.h
++++ b/drivers/usb/core/hcd.h
+@@ -482,4 +482,10 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
+  */
+ extern struct rw_semaphore ehci_cf_port_reset_rwsem;
++/* Keep track of which host controller drivers are loaded */
++#define USB_UHCI_LOADED               0
++#define USB_OHCI_LOADED               1
++#define USB_EHCI_LOADED               2
++extern unsigned long usb_hcds_loaded;
++
+ #endif /* __KERNEL__ */
+diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c
+index 29d13eb..48f51b1 100644
+--- a/drivers/usb/gadget/s3c2410_udc.c
++++ b/drivers/usb/gadget/s3c2410_udc.c
+@@ -1651,7 +1651,7 @@ int usb_gadget_register_driver(struct usb_gadget_driver *driver)
+               return -EBUSY;
+       if (!driver->bind || !driver->setup
+-                      || driver->speed != USB_SPEED_FULL) {
++                      || driver->speed < USB_SPEED_FULL) {
+               printk(KERN_ERR "Invalid driver: bind %p setup %p speed %d\n",
+                       driver->bind, driver->setup, driver->speed);
+               return -EINVAL;
+diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
+index 3791e62..38a55af 100644
+--- a/drivers/usb/gadget/u_ether.c
++++ b/drivers/usb/gadget/u_ether.c
+@@ -873,6 +873,13 @@ struct net_device *gether_connect(struct gether *link)
+               spin_lock(&dev->lock);
+               dev->port_usb = link;
+               link->ioport = dev;
++              if (netif_running(dev->net)) {
++                      if (link->open)
++                              link->open(link);
++              } else {
++                      if (link->close)
++                              link->close(link);
++              }
+               spin_unlock(&dev->lock);
+               netif_carrier_on(dev->net);
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 8409e07..86e38b0 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -1049,6 +1049,12 @@ static int __init ehci_hcd_init(void)
+ {
+       int retval = 0;
++      set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
++      if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
++                      test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
++              printk(KERN_WARNING "Warning! ehci_hcd should always be loaded"
++                              " before uhci_hcd and ohci_hcd, not after\n");
++
+       pr_debug("%s: block sizes: qh %Zd qtd %Zd itd %Zd sitd %Zd\n",
+                hcd_name,
+                sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
+@@ -1056,8 +1062,10 @@ static int __init ehci_hcd_init(void)
+ #ifdef DEBUG
+       ehci_debug_root = debugfs_create_dir("ehci", NULL);
+-      if (!ehci_debug_root)
+-              return -ENOENT;
++      if (!ehci_debug_root) {
++              retval = -ENOENT;
++              goto err_debug;
++      }
+ #endif
+ #ifdef PLATFORM_DRIVER
+@@ -1104,7 +1112,9 @@ clean0:
+ #ifdef DEBUG
+       debugfs_remove(ehci_debug_root);
+       ehci_debug_root = NULL;
++err_debug:
+ #endif
++      clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+       return retval;
+ }
+ module_init(ehci_hcd_init);
+@@ -1126,6 +1136,7 @@ static void __exit ehci_hcd_cleanup(void)
+ #ifdef DEBUG
+       debugfs_remove(ehci_debug_root);
+ #endif
++      clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
+ }
+ module_exit(ehci_hcd_cleanup);
+diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
+index 8990196..8bec02c 100644
+--- a/drivers/usb/host/ohci-hcd.c
++++ b/drivers/usb/host/ohci-hcd.c
+@@ -1098,6 +1098,7 @@ static int __init ohci_hcd_mod_init(void)
+       printk (KERN_DEBUG "%s: " DRIVER_INFO "\n", hcd_name);
+       pr_debug ("%s: block sizes: ed %Zd td %Zd\n", hcd_name,
+               sizeof (struct ed), sizeof (struct td));
++      set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+ #ifdef DEBUG
+       ohci_debug_root = debugfs_create_dir("ohci", NULL);
+@@ -1184,6 +1185,7 @@ static int __init ohci_hcd_mod_init(void)
+  error_debug:
+ #endif
++      clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+       return retval;
+ }
+ module_init(ohci_hcd_mod_init);
+@@ -1214,6 +1216,7 @@ static void __exit ohci_hcd_mod_exit(void)
+ #ifdef DEBUG
+       debugfs_remove(ohci_debug_root);
+ #endif
++      clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
+ }
+ module_exit(ohci_hcd_mod_exit);
+diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c
+index 7ea9a7b..32bbce9 100644
+--- a/drivers/usb/host/ohci-hub.c
++++ b/drivers/usb/host/ohci-hub.c
+@@ -359,21 +359,24 @@ static void ohci_finish_controller_resume(struct usb_hcd *hcd)
+ /* Carry out polling-, autostop-, and autoresume-related state changes */
+ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
+-              int any_connected)
++              int any_connected, int rhsc_status)
+ {
+       int     poll_rh = 1;
+-      int     rhsc;
++      int     rhsc_enable;
+-      rhsc = ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC;
+-      switch (ohci->hc_control & OHCI_CTRL_HCFS) {
++      /* Some broken controllers never turn off RHCS in the interrupt
++       * status register.  For their sake we won't re-enable RHSC
++       * interrupts if the interrupt bit is already active.
++       */
++      rhsc_enable = ohci_readl(ohci, &ohci->regs->intrenable) &
++                      OHCI_INTR_RHSC;
++      switch (ohci->hc_control & OHCI_CTRL_HCFS) {
+       case OHCI_USB_OPER:
+-              /* If no status changes are pending, enable status-change
+-               * interrupts.
+-               */
+-              if (!rhsc && !changed) {
+-                      rhsc = OHCI_INTR_RHSC;
+-                      ohci_writel(ohci, rhsc, &ohci->regs->intrenable);
++              /* If no status changes are pending, enable RHSC interrupts. */
++              if (!rhsc_enable && !rhsc_status && !changed) {
++                      rhsc_enable = OHCI_INTR_RHSC;
++                      ohci_writel(ohci, rhsc_enable, &ohci->regs->intrenable);
+               }
+               /* Keep on polling until we know a device is connected
+@@ -383,7 +386,7 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
+                       if (any_connected ||
+                                       !device_may_wakeup(&ohci_to_hcd(ohci)
+                                               ->self.root_hub->dev)) {
+-                              if (rhsc)
++                              if (rhsc_enable)
+                                       poll_rh = 0;
+                       } else {
+                               ohci->autostop = 1;
+@@ -396,34 +399,45 @@ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
+                               ohci->autostop = 0;
+                               ohci->next_statechange = jiffies +
+                                               STATECHANGE_DELAY;
+-                      } else if (rhsc && time_after_eq(jiffies,
++                      } else if (time_after_eq(jiffies,
+                                               ohci->next_statechange)
+                                       && !ohci->ed_rm_list
+                                       && !(ohci->hc_control &
+                                               OHCI_SCHED_ENABLES)) {
+                               ohci_rh_suspend(ohci, 1);
+-                              poll_rh = 0;
++                              if (rhsc_enable)
++                                      poll_rh = 0;
+                       }
+               }
+               break;
+-      /* if there is a port change, autostart or ask to be resumed */
+       case OHCI_USB_SUSPEND:
+       case OHCI_USB_RESUME:
++              /* if there is a port change, autostart or ask to be resumed */
+               if (changed) {
+                       if (ohci->autostop)
+                               ohci_rh_resume(ohci);
+                       else
+                               usb_hcd_resume_root_hub(ohci_to_hcd(ohci));
+-              } else {
+-                      if (!rhsc && (ohci->autostop ||
+-                                      ohci_to_hcd(ohci)->self.root_hub->
+-                                              do_remote_wakeup))
+-                              ohci_writel(ohci, OHCI_INTR_RHSC,
+-                                              &ohci->regs->intrenable);
+-                      /* everything is idle, no need for polling */
++              /* If remote wakeup is disabled, stop polling */
++              } else if (!ohci->autostop &&
++                              !ohci_to_hcd(ohci)->self.root_hub->
++                                      do_remote_wakeup) {
+                       poll_rh = 0;
++
++              } else {
++                      /* If no status changes are pending,
++                       * enable RHSC interrupts
++                       */
++                      if (!rhsc_enable && !rhsc_status) {
++                              rhsc_enable = OHCI_INTR_RHSC;
++                              ohci_writel(ohci, rhsc_enable,
++                                              &ohci->regs->intrenable);
++                      }
++                      /* Keep polling until RHSC is enabled */
++                      if (rhsc_enable)
++                              poll_rh = 0;
+               }
+               break;
+       }
+@@ -441,18 +455,22 @@ static inline int ohci_rh_resume(struct ohci_hcd *ohci)
+  * autostop isn't used when CONFIG_PM is turned off.
+  */
+ static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed,
+-              int any_connected)
++              int any_connected, int rhsc_status)
+ {
+       /* If RHSC is enabled, don't poll */
+       if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC)
+               return 0;
+-      /* If no status changes are pending, enable status-change interrupts */
+-      if (!changed) {
+-              ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable);
+-              return 0;
+-      }
+-      return 1;
++      /* If status changes are pending, continue polling.
++       * Conversely, if no status changes are pending but the RHSC
++       * status bit was set, then RHSC may be broken so continue polling.
++       */
++      if (changed || rhsc_status)
++              return 1;
++
++      /* It's safe to re-enable RHSC interrupts */
++      ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable);
++      return 0;
+ }
+ #endif        /* CONFIG_PM */
+@@ -467,6 +485,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
+       struct ohci_hcd *ohci = hcd_to_ohci (hcd);
+       int             i, changed = 0, length = 1;
+       int             any_connected = 0;
++      int             rhsc_status;
+       unsigned long   flags;
+       spin_lock_irqsave (&ohci->lock, flags);
+@@ -492,12 +511,10 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
+               length++;
+       }
+-      /* Some broken controllers never turn off RHCS in the interrupt
+-       * status register.  For their sake we won't re-enable RHSC
+-       * interrupts if the flag is already set.
+-       */
+-      if (ohci_readl(ohci, &ohci->regs->intrstatus) & OHCI_INTR_RHSC)
+-              changed = 1;
++      /* Clear the RHSC status flag before reading the port statuses */
++      ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrstatus);
++      rhsc_status = ohci_readl(ohci, &ohci->regs->intrstatus) &
++                      OHCI_INTR_RHSC;
+       /* look at each port */
+       for (i = 0; i < ohci->num_ports; i++) {
+@@ -517,7 +534,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf)
+       }
+       hcd->poll_rh = ohci_root_hub_state_changes(ohci, changed,
+-                      any_connected);
++                      any_connected, rhsc_status);
+ done:
+       spin_unlock_irqrestore (&ohci->lock, flags);
+diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
+index 3a7bfe7..59bed3c 100644
+--- a/drivers/usb/host/uhci-hcd.c
++++ b/drivers/usb/host/uhci-hcd.c
+@@ -953,6 +953,7 @@ static int __init uhci_hcd_init(void)
+       printk(KERN_INFO DRIVER_DESC " " DRIVER_VERSION "%s\n",
+                       ignore_oc ? ", overcurrent ignored" : "");
++      set_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
+       if (usb_disabled())
+               return -ENODEV;
+@@ -988,6 +989,7 @@ debug_failed:
+ errbuf_failed:
++      clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
+       return retval;
+ }
+@@ -997,6 +999,7 @@ static void __exit uhci_hcd_cleanup(void)
+       kmem_cache_destroy(uhci_up_cachep);
+       debugfs_remove(uhci_debugfs_root);
+       kfree(errbuf);
++      clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
+ }
+ module_init(uhci_hcd_init);
+diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig
+index 58b2b8f..4b9542b 100644
+--- a/drivers/usb/musb/Kconfig
++++ b/drivers/usb/musb/Kconfig
+@@ -33,10 +33,6 @@ config USB_MUSB_SOC
+       default y if ARCH_DAVINCI
+       default y if ARCH_OMAP2430
+       default y if ARCH_OMAP34XX
+-      help
+-        Use a static <asm/arch/hdrc_cnf.h> file to describe how the
+-        controller is configured (endpoints, mechanisms, etc) on the
+-        current iteration of a given system-on-chip.
+ comment "DaVinci 644x USB support"
+       depends on USB_MUSB_HDRC && ARCH_DAVINCI
+diff --git a/drivers/usb/musb/cppi_dma.h b/drivers/usb/musb/cppi_dma.h
+index fc5216b..729b407 100644
+--- a/drivers/usb/musb/cppi_dma.h
++++ b/drivers/usb/musb/cppi_dma.h
+@@ -119,8 +119,8 @@ struct cppi {
+       void __iomem                    *mregs;         /* Mentor regs */
+       void __iomem                    *tibase;        /* TI/CPPI regs */
+-      struct cppi_channel             tx[MUSB_C_NUM_EPT - 1];
+-      struct cppi_channel             rx[MUSB_C_NUM_EPR - 1];
++      struct cppi_channel             tx[4];
++      struct cppi_channel             rx[4];
+       struct dma_pool                 *pool;
+diff --git a/drivers/usb/musb/davinci.c b/drivers/usb/musb/davinci.c
+index 75baf18..dfb3bcb 100644
+--- a/drivers/usb/musb/davinci.c
++++ b/drivers/usb/musb/davinci.c
+@@ -30,6 +30,7 @@
+ #include <linux/delay.h>
+ #include <linux/clk.h>
+ #include <linux/io.h>
++#include <linux/gpio.h>
+ #include <asm/arch/hardware.h>
+ #include <asm/arch/memory.h>
+@@ -39,7 +40,7 @@
+ #include "musb_core.h"
+ #ifdef CONFIG_MACH_DAVINCI_EVM
+-#include <asm/arch/i2c-client.h>
++#define GPIO_nVBUS_DRV                87
+ #endif
+ #include "davinci.h"
+@@ -138,7 +139,6 @@ static int vbus_state = -1;
+ /* VBUS SWITCHING IS BOARD-SPECIFIC */
+ #ifdef CONFIG_MACH_DAVINCI_EVM
+-#ifndef CONFIG_MACH_DAVINCI_EVM_OTG
+ /* I2C operations are always synchronous, and require a task context.
+  * With unloaded systems, using the shared workqueue seems to suffice
+@@ -146,12 +146,11 @@ static int vbus_state = -1;
+  */
+ static void evm_deferred_drvvbus(struct work_struct *ignored)
+ {
+-      davinci_i2c_expander_op(0x3a, USB_DRVVBUS, vbus_state);
++      gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
+       vbus_state = !vbus_state;
+ }
+ static DECLARE_WORK(evm_vbus_work, evm_deferred_drvvbus);
+-#endif        /* modified board */
+ #endif        /* EVM */
+ static void davinci_source_power(struct musb *musb, int is_on, int immediate)
+@@ -165,21 +164,10 @@ static void davinci_source_power(struct musb *musb, int is_on, int immediate)
+ #ifdef CONFIG_MACH_DAVINCI_EVM
+       if (machine_is_davinci_evm()) {
+-#ifdef CONFIG_MACH_DAVINCI_EVM_OTG
+-              /* modified EVM board switching VBUS with GPIO(6) not I2C
+-               * NOTE:  PINMUX0.RGB888 (bit23) must be clear
+-               */
+-              if (is_on)
+-                      gpio_set(GPIO(6));
+-              else
+-                      gpio_clear(GPIO(6));
+-              immediate = 1;
+-#else
+               if (immediate)
+-                      davinci_i2c_expander_op(0x3a, USB_DRVVBUS, !is_on);
++                      gpio_set_value_cansleep(GPIO_nVBUS_DRV, vbus_state);
+               else
+                       schedule_work(&evm_vbus_work);
+-#endif
+       }
+ #endif
+       if (immediate)
+diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c
+index 128e949..5c5bc1a 100644
+--- a/drivers/usb/musb/musb_core.c
++++ b/drivers/usb/musb/musb_core.c
+@@ -82,9 +82,9 @@
+ /*
+  * This gets many kinds of configuration information:
+  *    - Kconfig for everything user-configurable
+- *    - <asm/arch/hdrc_cnf.h> for SOC or family details
+  *    - platform_device for addressing, irq, and platform_data
+  *    - platform_data is mostly for board-specific informarion
++ *      (plus recentrly, SOC or family details)
+  *
+  * Most of the conditional compilation will (someday) vanish.
+  */
+@@ -974,9 +974,9 @@ static void musb_shutdown(struct platform_device *pdev)
+ /*
+  * The silicon either has hard-wired endpoint configurations, or else
+  * "dynamic fifo" sizing.  The driver has support for both, though at this
+- * writing only the dynamic sizing is very well tested.   We use normal
+- * idioms to so both modes are compile-tested, but dead code elimination
+- * leaves only the relevant one in the object file.
++ * writing only the dynamic sizing is very well tested.   Since we switched
++ * away from compile-time hardware parameters, we can no longer rely on
++ * dead code elimination to leave only the relevant one in the object file.
+  *
+  * We don't currently use dynamic fifo setup capability to do anything
+  * more than selecting one of a bunch of predefined configurations.
+diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
+index 8b4be01..13205fe 100644
+--- a/drivers/usb/musb/musb_host.c
++++ b/drivers/usb/musb/musb_host.c
+@@ -108,7 +108,7 @@ static void musb_ep_program(struct musb *musb, u8 epnum,
+ /*
+  * Clear TX fifo. Needed to avoid BABBLE errors.
+  */
+-static inline void musb_h_tx_flush_fifo(struct musb_hw_ep *ep)
++static void musb_h_tx_flush_fifo(struct musb_hw_ep *ep)
+ {
+       void __iomem    *epio = ep->regs;
+       u16             csr;
+@@ -436,7 +436,7 @@ musb_advance_schedule(struct musb *musb, struct urb *urb,
+       }
+ }
+-static inline u16 musb_h_flush_rxfifo(struct musb_hw_ep *hw_ep, u16 csr)
++static u16 musb_h_flush_rxfifo(struct musb_hw_ep *hw_ep, u16 csr)
+ {
+       /* we don't want fifo to fill itself again;
+        * ignore dma (various models),
+@@ -1005,7 +1005,7 @@ static bool musb_h_ep0_continue(struct musb *musb, u16 len, struct urb *urb)
+ /*
+  * Handle default endpoint interrupt as host. Only called in IRQ time
+- * from the LinuxIsr() interrupt service routine.
++ * from musb_interrupt().
+  *
+  * called with controller irqlocked
+  */
+diff --git a/drivers/video/console/fbcon.c b/drivers/video/console/fbcon.c
+index 9cbff84..038ea62 100644
+--- a/drivers/video/console/fbcon.c
++++ b/drivers/video/console/fbcon.c
+@@ -2996,8 +2996,8 @@ static void fbcon_set_all_vcs(struct fb_info *info)
+               p = &fb_display[vc->vc_num];
+               set_blitting_type(vc, info);
+               var_to_display(p, &info->var, info);
+-              cols = FBCON_SWAP(p->rotate, info->var.xres, info->var.yres);
+-              rows = FBCON_SWAP(p->rotate, info->var.yres, info->var.xres);
++              cols = FBCON_SWAP(ops->rotate, info->var.xres, info->var.yres);
++              rows = FBCON_SWAP(ops->rotate, info->var.yres, info->var.xres);
+               cols /= vc->vc_font.width;
+               rows /= vc->vc_font.height;
+               vc_resize(vc, cols, rows);
+diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c
+index 18d3c84..cbdf97d 100644
+--- a/fs/xfs/linux-2.6/xfs_super.c
++++ b/fs/xfs/linux-2.6/xfs_super.c
+@@ -1323,7 +1323,7 @@ xfs_fs_remount(
+       "XFS: mount option \"%s\" not supported for remount\n", p);
+                       return -EINVAL;
+ #else
+-                      return 0;
++                      break;
+ #endif
+               }
+       }
+diff --git a/kernel/module.c b/kernel/module.c
+index 9db1191..d5fcd24 100644
+--- a/kernel/module.c
++++ b/kernel/module.c
+@@ -1173,7 +1173,7 @@ static void free_notes_attrs(struct module_notes_attrs *notes_attrs,
+               while (i-- > 0)
+                       sysfs_remove_bin_file(notes_attrs->dir,
+                                             &notes_attrs->attrs[i]);
+-              kobject_del(notes_attrs->dir);
++              kobject_put(notes_attrs->dir);
+       }
+       kfree(notes_attrs);
+ }
+diff --git a/net/mac80211/wext.c b/net/mac80211/wext.c
+index 34fa8ed..48db9bb 100644
+--- a/net/mac80211/wext.c
++++ b/net/mac80211/wext.c
+@@ -804,7 +804,7 @@ static int ieee80211_ioctl_siwfrag(struct net_device *dev,
+        * configure it here */
+       if (local->ops->set_frag_threshold)
+-              local->ops->set_frag_threshold(
++              return local->ops->set_frag_threshold(
+                       local_to_hw(local),
+                       local->fragmentation_threshold);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.20-21 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.20-21
new file mode 100644 (file)
index 0000000..558d9c4
--- /dev/null
@@ -0,0 +1,860 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.21
+
+Upstream 2.6.27.21 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 9f4860d..0664c76 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .20
++EXTRAVERSION = .21
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+@@ -555,6 +555,9 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
+ # disable pointer signed / unsigned warnings in gcc 4.0
+ KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
++# disable invalid "can't wrap" optimzations for signed / pointers
++KBUILD_CFLAGS += $(call cc-option,-fwrapv)
++
+ # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
+ # But warn user when we do so
+ warn-assign = \
+diff --git a/arch/ia64/Kconfig b/arch/ia64/Kconfig
+index fb7e69c..48dfb6f 100644
+--- a/arch/ia64/Kconfig
++++ b/arch/ia64/Kconfig
+@@ -444,8 +444,7 @@ config HOLES_IN_ZONE
+       default y if VIRTUAL_MEM_MAP
+ config HAVE_ARCH_EARLY_PFN_TO_NID
+-      def_bool y
+-      depends on NEED_MULTIPLE_NODES
++      def_bool NUMA && SPARSEMEM
+ config HAVE_ARCH_NODEDATA_EXTENSION
+       def_bool y
+diff --git a/arch/powerpc/sysdev/fsl_soc.c b/arch/powerpc/sysdev/fsl_soc.c
+index 214388e..dd1d7ed 100644
+--- a/arch/powerpc/sysdev/fsl_soc.c
++++ b/arch/powerpc/sysdev/fsl_soc.c
+@@ -255,7 +255,7 @@ static int __init gfar_mdio_of_init(void)
+               gfar_mdio_of_init_one(np);
+       /* try the deprecated version */
+-      for_each_compatible_node(np, "mdio", "gianfar");
++      for_each_compatible_node(np, "mdio", "gianfar")
+               gfar_mdio_of_init_one(np);
+       return 0;
+diff --git a/arch/s390/lib/div64.c b/arch/s390/lib/div64.c
+index a5f8300..d9e62c0 100644
+--- a/arch/s390/lib/div64.c
++++ b/arch/s390/lib/div64.c
+@@ -61,7 +61,7 @@ static uint32_t __div64_31(uint64_t *n, uint32_t base)
+               "       clr     %0,%3\n"
+               "       jl      0f\n"
+               "       slr     %0,%3\n"
+-              "       alr     %1,%2\n"
++              "       ahi     %1,1\n"
+               "0:\n"
+               : "+d" (reg2), "+d" (reg3), "=d" (tmp)
+               : "d" (base), "2" (1UL) : "cc" );
+diff --git a/arch/x86/kernel/cpu/intel.c b/arch/x86/kernel/cpu/intel.c
+index b75f256..31027aa 100644
+--- a/arch/x86/kernel/cpu/intel.c
++++ b/arch/x86/kernel/cpu/intel.c
+@@ -32,6 +32,19 @@ struct movsl_mask movsl_mask __read_mostly;
+ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
+ {
++      /* Unmask CPUID levels if masked: */
++      if (c->x86 == 6 && c->x86_model >= 15) {
++              u64 misc_enable;
++
++              rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
++
++              if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
++                      misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
++                      wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
++                      c->cpuid_level = cpuid_eax(0);
++              }
++      }
++
+       /* Netburst reports 64 bytes clflush size, but does IO in 128 bytes */
+       if (c->x86 == 15 && c->x86_cache_alignment == 64)
+               c->x86_cache_alignment = 128;
+diff --git a/arch/x86/kernel/cpu/intel_64.c b/arch/x86/kernel/cpu/intel_64.c
+index 1019c58..7ccd551 100644
+--- a/arch/x86/kernel/cpu/intel_64.c
++++ b/arch/x86/kernel/cpu/intel_64.c
+@@ -9,6 +9,19 @@
+ static void __cpuinit early_init_intel(struct cpuinfo_x86 *c)
+ {
++      /* Unmask CPUID levels if masked: */
++      if (c->x86 == 6 && c->x86_model >= 15) {
++              u64 misc_enable;
++
++              rdmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
++
++              if (misc_enable & MSR_IA32_MISC_ENABLE_LIMIT_CPUID) {
++                      misc_enable &= ~MSR_IA32_MISC_ENABLE_LIMIT_CPUID;
++                      wrmsrl(MSR_IA32_MISC_ENABLE, misc_enable);
++                      c->cpuid_level = cpuid_eax(0);
++              }
++      }
++
+       if ((c->x86 == 0xf && c->x86_model >= 0x03) ||
+           (c->x86 == 0x6 && c->x86_model >= 0x0e))
+               set_cpu_cap(c, X86_FEATURE_CONSTANT_TSC);
+diff --git a/drivers/ata/ata_piix.c b/drivers/ata/ata_piix.c
+index e6b4606..d78a5b2 100644
+--- a/drivers/ata/ata_piix.c
++++ b/drivers/ata/ata_piix.c
+@@ -1363,6 +1363,39 @@ static const int *__devinit piix_init_sata_map(struct pci_dev *pdev,
+       return map;
+ }
++static bool piix_no_sidpr(struct ata_host *host)
++{
++      struct pci_dev *pdev = to_pci_dev(host->dev);
++
++      /*
++       * Samsung DB-P70 only has three ATA ports exposed and
++       * curiously the unconnected first port reports link online
++       * while not responding to SRST protocol causing excessive
++       * detection delay.
++       *
++       * Unfortunately, the system doesn't carry enough DMI
++       * information to identify the machine but does have subsystem
++       * vendor and device set.  As it's unclear whether the
++       * subsystem vendor/device is used only for this specific
++       * board, the port can't be disabled solely with the
++       * information; however, turning off SIDPR access works around
++       * the problem.  Turn it off.
++       *
++       * This problem is reported in bnc#441240.
++       *
++       * https://bugzilla.novell.com/show_bug.cgi?id=441420
++       */
++      if (pdev->vendor == PCI_VENDOR_ID_INTEL && pdev->device == 0x2920 &&
++          pdev->subsystem_vendor == PCI_VENDOR_ID_SAMSUNG &&
++          pdev->subsystem_device == 0xb049) {
++              dev_printk(KERN_WARNING, host->dev,
++                         "Samsung DB-P70 detected, disabling SIDPR\n");
++              return true;
++      }
++
++      return false;
++}
++
+ static void __devinit piix_init_sidpr(struct ata_host *host)
+ {
+       struct pci_dev *pdev = to_pci_dev(host->dev);
+@@ -1376,6 +1409,10 @@ static void __devinit piix_init_sidpr(struct ata_host *host)
+               if (hpriv->map[i] == IDE)
+                       return;
++      /* is it blacklisted? */
++      if (piix_no_sidpr(host))
++              return;
++
+       if (!(host->ports[0]->flags & PIIX_FLAG_SIDPR))
+               return;
+diff --git a/drivers/md/dm-crypt.c b/drivers/md/dm-crypt.c
+index 1395643..8ac02cf 100644
+--- a/drivers/md/dm-crypt.c
++++ b/drivers/md/dm-crypt.c
+@@ -59,6 +59,7 @@ struct dm_crypt_io {
+ };
+ struct dm_crypt_request {
++      struct convert_context *ctx;
+       struct scatterlist sg_in;
+       struct scatterlist sg_out;
+ };
+@@ -336,6 +337,18 @@ static void crypt_convert_init(struct crypt_config *cc,
+       atomic_set(&ctx->pending, 1);
+ }
++static struct dm_crypt_request *dmreq_of_req(struct crypt_config *cc,
++                                           struct ablkcipher_request *req)
++{
++      return (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
++}
++
++static struct ablkcipher_request *req_of_dmreq(struct crypt_config *cc,
++                                             struct dm_crypt_request *dmreq)
++{
++      return (struct ablkcipher_request *)((char *)dmreq - cc->dmreq_start);
++}
++
+ static int crypt_convert_block(struct crypt_config *cc,
+                              struct convert_context *ctx,
+                              struct ablkcipher_request *req)
+@@ -346,10 +359,11 @@ static int crypt_convert_block(struct crypt_config *cc,
+       u8 *iv;
+       int r = 0;
+-      dmreq = (struct dm_crypt_request *)((char *)req + cc->dmreq_start);
++      dmreq = dmreq_of_req(cc, req);
+       iv = (u8 *)ALIGN((unsigned long)(dmreq + 1),
+                        crypto_ablkcipher_alignmask(cc->tfm) + 1);
++      dmreq->ctx = ctx;
+       sg_init_table(&dmreq->sg_in, 1);
+       sg_set_page(&dmreq->sg_in, bv_in->bv_page, 1 << SECTOR_SHIFT,
+                   bv_in->bv_offset + ctx->offset_in);
+@@ -396,8 +410,9 @@ static void crypt_alloc_req(struct crypt_config *cc,
+               cc->req = mempool_alloc(cc->req_pool, GFP_NOIO);
+       ablkcipher_request_set_tfm(cc->req, cc->tfm);
+       ablkcipher_request_set_callback(cc->req, CRYPTO_TFM_REQ_MAY_BACKLOG |
+-                                           CRYPTO_TFM_REQ_MAY_SLEEP,
+-                                           kcryptd_async_done, ctx);
++                                      CRYPTO_TFM_REQ_MAY_SLEEP,
++                                      kcryptd_async_done,
++                                      dmreq_of_req(cc, cc->req));
+ }
+ /*
+@@ -757,7 +772,8 @@ static void kcryptd_crypt_read_convert(struct dm_crypt_io *io)
+ static void kcryptd_async_done(struct crypto_async_request *async_req,
+                              int error)
+ {
+-      struct convert_context *ctx = async_req->data;
++      struct dm_crypt_request *dmreq = async_req->data;
++      struct convert_context *ctx = dmreq->ctx;
+       struct dm_crypt_io *io = container_of(ctx, struct dm_crypt_io, ctx);
+       struct crypt_config *cc = io->target->private;
+@@ -766,7 +782,7 @@ static void kcryptd_async_done(struct crypto_async_request *async_req,
+               return;
+       }
+-      mempool_free(ablkcipher_request_cast(async_req), cc->req_pool);
++      mempool_free(req_of_dmreq(cc, dmreq), cc->req_pool);
+       if (!atomic_dec_and_test(&ctx->pending))
+               return;
+diff --git a/drivers/md/dm-io.c b/drivers/md/dm-io.c
+index 4789c42..427e5ed 100644
+--- a/drivers/md/dm-io.c
++++ b/drivers/md/dm-io.c
+@@ -292,6 +292,8 @@ static void do_region(int rw, unsigned region, struct dm_io_region *where,
+                                            (PAGE_SIZE >> SECTOR_SHIFT));
+               num_bvecs = 1 + min_t(int, bio_get_nr_vecs(where->bdev),
+                                     num_bvecs);
++              if (unlikely(num_bvecs > BIO_MAX_PAGES))
++                      num_bvecs = BIO_MAX_PAGES;
+               bio = bio_alloc_bioset(GFP_NOIO, num_bvecs, io->client->bios);
+               bio->bi_sector = where->sector + (where->count - remaining);
+               bio->bi_bdev = where->bdev;
+diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c
+index b262c00..b8ab11f 100644
+--- a/drivers/md/dm-ioctl.c
++++ b/drivers/md/dm-ioctl.c
+@@ -704,7 +704,8 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
+       char *new_name = (char *) param + param->data_start;
+       if (new_name < param->data ||
+-          invalid_str(new_name, (void *) param + param_size)) {
++          invalid_str(new_name, (void *) param + param_size) ||
++          strlen(new_name) > DM_NAME_LEN - 1) {
+               DMWARN("Invalid new logical volume name supplied.");
+               return -EINVAL;
+       }
+diff --git a/drivers/media/video/cx23885/cx23885-417.c b/drivers/media/video/cx23885/cx23885-417.c
+index 7b0e8c0..b2c68bc 100644
+--- a/drivers/media/video/cx23885/cx23885-417.c
++++ b/drivers/media/video/cx23885/cx23885-417.c
+@@ -1585,7 +1585,8 @@ static int mpeg_open(struct inode *inode, struct file *file)
+       list_for_each(list, &cx23885_devlist) {
+               h = list_entry(list, struct cx23885_dev, devlist);
+-              if (h->v4l_device->minor == minor) {
++              if (h->v4l_device &&
++                  h->v4l_device->minor == minor) {
+                       dev = h;
+                       break;
+               }
+diff --git a/drivers/media/video/cx23885/cx23885-video.c b/drivers/media/video/cx23885/cx23885-video.c
+index 6047c78..7d2802a 100644
+--- a/drivers/media/video/cx23885/cx23885-video.c
++++ b/drivers/media/video/cx23885/cx23885-video.c
+@@ -733,12 +733,13 @@ static int video_open(struct inode *inode, struct file *file)
+       list_for_each(list, &cx23885_devlist) {
+               h = list_entry(list, struct cx23885_dev, devlist);
+-              if (h->video_dev->minor == minor) {
++              if (h->video_dev &&
++                  h->video_dev->minor == minor) {
+                       dev  = h;
+                       type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
+               }
+               if (h->vbi_dev &&
+-                 h->vbi_dev->minor == minor) {
++                  h->vbi_dev->minor == minor) {
+                       dev  = h;
+                       type = V4L2_BUF_TYPE_VBI_CAPTURE;
+               }
+diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
+index 6b93007..34bb0e4 100644
+--- a/drivers/misc/thinkpad_acpi.c
++++ b/drivers/misc/thinkpad_acpi.c
+@@ -6826,7 +6826,7 @@ MODULE_ALIAS(TPACPI_DRVR_SHORTNAME);
+  * if it is not there yet.
+  */
+ #define IBM_BIOS_MODULE_ALIAS(__type) \
+-      MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW")
++      MODULE_ALIAS("dmi:bvnIBM:bvr" __type "ET??WW*")
+ /* Non-ancient thinkpads */
+ MODULE_ALIAS("dmi:bvnIBM:*:svnIBM:*:pvrThinkPad*:rvnIBM:*");
+@@ -6835,9 +6835,9 @@ MODULE_ALIAS("dmi:bvnLENOVO:*:svnLENOVO:*:pvrThinkPad*:rvnLENOVO:*");
+ /* Ancient thinkpad BIOSes have to be identified by
+  * BIOS type or model number, and there are far less
+  * BIOS types than model numbers... */
+-IBM_BIOS_MODULE_ALIAS("I[B,D,H,I,M,N,O,T,W,V,Y,Z]");
+-IBM_BIOS_MODULE_ALIAS("1[0,3,6,8,A-G,I,K,M-P,S,T]");
+-IBM_BIOS_MODULE_ALIAS("K[U,X-Z]");
++IBM_BIOS_MODULE_ALIAS("I[BDHIMNOTWVYZ]");
++IBM_BIOS_MODULE_ALIAS("1[0368A-GIKM-PST]");
++IBM_BIOS_MODULE_ALIAS("K[UX-Z]");
+ MODULE_AUTHOR("Borislav Deianov, Henrique de Moraes Holschuh");
+ MODULE_DESCRIPTION(TPACPI_DESC);
+diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
+index e52e54e..8d2d79e 100644
+--- a/drivers/usb/core/devio.c
++++ b/drivers/usb/core/devio.c
+@@ -359,11 +359,6 @@ static void destroy_async(struct dev_state *ps, struct list_head *list)
+               spin_lock_irqsave(&ps->lock, flags);
+       }
+       spin_unlock_irqrestore(&ps->lock, flags);
+-      as = async_getcompleted(ps);
+-      while (as) {
+-              free_async(as);
+-              as = async_getcompleted(ps);
+-      }
+ }
+ static void destroy_async_on_interface(struct dev_state *ps,
+@@ -639,6 +634,7 @@ static int usbdev_release(struct inode *inode, struct file *file)
+       struct dev_state *ps = file->private_data;
+       struct usb_device *dev = ps->dev;
+       unsigned int ifnum;
++      struct async *as;
+       usb_lock_device(dev);
+@@ -657,6 +653,12 @@ static int usbdev_release(struct inode *inode, struct file *file)
+       usb_unlock_device(dev);
+       usb_put_dev(dev);
+       put_pid(ps->disc_pid);
++
++      as = async_getcompleted(ps);
++      while (as) {
++              free_async(as);
++              as = async_getcompleted(ps);
++      }
+       kfree(ps);
+       return 0;
+ }
+diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
+index 3712b92..ecc9b66 100644
+--- a/drivers/usb/host/ehci-q.c
++++ b/drivers/usb/host/ehci-q.c
+@@ -1095,7 +1095,8 @@ static void start_unlink_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
+       prev->qh_next = qh->qh_next;
+       wmb ();
+-      if (unlikely (ehci_to_hcd(ehci)->state == HC_STATE_HALT)) {
++      /* If the controller isn't running, we don't have to wait for it */
++      if (unlikely(!HC_IS_RUNNING(ehci_to_hcd(ehci)->state))) {
+               /* if (unlikely (qh->reclaim != 0))
+                *      this will recurse, probably not much
+                */
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index 07bcb93..1d0b49e 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1536,7 +1536,7 @@ itd_link_urb (
+                                       struct ehci_itd, itd_list);
+                       list_move_tail (&itd->itd_list, &stream->td_list);
+                       itd->stream = iso_stream_get (stream);
+-                      itd->urb = usb_get_urb (urb);
++                      itd->urb = urb;
+                       itd_init (ehci, stream, itd);
+               }
+@@ -1645,7 +1645,7 @@ itd_complete (
+       (void) disable_periodic(ehci);
+       ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+-      if (unlikely (list_empty (&stream->td_list))) {
++      if (unlikely(list_is_singular(&stream->td_list))) {
+               ehci_to_hcd(ehci)->self.bandwidth_allocated
+                               -= stream->bandwidth;
+               ehci_vdbg (ehci,
+@@ -1656,7 +1656,6 @@ itd_complete (
+       iso_stream_put (ehci, stream);
+ done:
+-      usb_put_urb(urb);
+       itd->urb = NULL;
+       if (ehci->clock_frame != itd->frame || itd->index[7] != -1) {
+               /* OK to recycle this ITD now. */
+@@ -1949,7 +1948,7 @@ sitd_link_urb (
+                               struct ehci_sitd, sitd_list);
+               list_move_tail (&sitd->sitd_list, &stream->td_list);
+               sitd->stream = iso_stream_get (stream);
+-              sitd->urb = usb_get_urb (urb);
++              sitd->urb = urb;
+               sitd_patch(ehci, stream, sitd, sched, packet);
+               sitd_link (ehci, (next_uframe >> 3) % ehci->periodic_size,
+@@ -2034,7 +2033,7 @@ sitd_complete (
+       (void) disable_periodic(ehci);
+       ehci_to_hcd(ehci)->self.bandwidth_isoc_reqs--;
+-      if (list_empty (&stream->td_list)) {
++      if (list_is_singular(&stream->td_list)) {
+               ehci_to_hcd(ehci)->self.bandwidth_allocated
+                               -= stream->bandwidth;
+               ehci_vdbg (ehci,
+@@ -2045,7 +2044,6 @@ sitd_complete (
+       iso_stream_put (ehci, stream);
+       /* OK to recycle this SITD now that its completion callback ran. */
+ done:
+-      usb_put_urb(urb);
+       sitd->urb = NULL;
+       sitd->stream = NULL;
+       list_move(&sitd->sitd_list, &stream->free_list);
+diff --git a/drivers/usb/serial/cp2101.c b/drivers/usb/serial/cp2101.c
+index 1279553..69e6687 100644
+--- a/drivers/usb/serial/cp2101.c
++++ b/drivers/usb/serial/cp2101.c
+@@ -77,6 +77,7 @@ static struct usb_device_id id_table [] = {
+       { USB_DEVICE(0x10C4, 0x814A) }, /* West Mountain Radio RIGblaster P&P */
+       { USB_DEVICE(0x10C4, 0x814B) }, /* West Mountain Radio RIGtalk */
+       { USB_DEVICE(0x10C4, 0x815E) }, /* Helicomm IP-Link 1220-DVM */
++      { USB_DEVICE(0x10C4, 0x819F) }, /* MJS USB Toslink Switcher */
+       { USB_DEVICE(0x10C4, 0x81A6) }, /* ThinkOptics WavIt */
+       { USB_DEVICE(0x10C4, 0x81AC) }, /* MSD Dash Hawk */
+       { USB_DEVICE(0x10C4, 0x81C8) }, /* Lipowsky Industrie Elektronik GmbH, Baby-JTAG */
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 3dc93b5..2d78712 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -657,6 +657,11 @@ static struct usb_device_id id_table_combined [] = {
+       { USB_DEVICE(PAPOUCH_VID, PAPOUCH_QUIDO4x4_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DGQG_PID) },
+       { USB_DEVICE(FTDI_VID, FTDI_DOMINTELL_DUSB_PID) },
++      { USB_DEVICE(ATMEL_VID, STK541_PID) },
++      { USB_DEVICE(DE_VID, STB_PID) },
++      { USB_DEVICE(DE_VID, WHT_PID) },
++      { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
++              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { },                                    /* Optional parameter entry */
+       { }                                     /* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 8a5b6df..80fa76e 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -870,6 +870,26 @@
+ #define RATOC_PRODUCT_ID_USB60F       0xb020
+ /*
++ * Atmel STK541
++ */
++#define ATMEL_VID             0x03eb /* Vendor ID */
++#define STK541_PID            0x2109 /* Zigbee Controller */
++
++/*
++ * Dresden Elektronic Sensor Terminal Board
++ */
++#define DE_VID                        0x1cf1 /* Vendor ID */
++#define STB_PID                       0x0001 /* Sensor Terminal Board */
++#define WHT_PID                       0x0004 /* Wireless Handheld Terminal */
++
++/*
++ * Blackfin gnICE JTAG
++ * http://docs.blackfin.uclinux.org/doku.php?id=hw:jtag:gnice
++ */
++#define ADI_VID               0x0456
++#define ADI_GNICE_PID                 0xF000
++
++/*
+  *   BmRequestType:  1100 0000b
+  *   bRequest:       FTDI_E2_READ
+  *   wValue:         0
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 9930150..211cd61 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -89,6 +89,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define OPTION_PRODUCT_ETNA_MODEM_GT          0x7041
+ #define OPTION_PRODUCT_ETNA_MODEM_EX          0x7061
+ #define OPTION_PRODUCT_ETNA_KOI_MODEM         0x7100
++#define OPTION_PRODUCT_GTM380_MODEM           0x7201
+ #define HUAWEI_VENDOR_ID                      0x12D1
+ #define HUAWEI_PRODUCT_E600                   0x1001
+@@ -190,6 +191,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ /* OVATION PRODUCTS */
+ #define NOVATELWIRELESS_PRODUCT_MC727         0x4100
+ #define NOVATELWIRELESS_PRODUCT_MC950D                0x4400
++#define NOVATELWIRELESS_PRODUCT_U727          0x5010
+ /* FUTURE NOVATEL PRODUCTS */
+ #define NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED        0X6000
+@@ -281,14 +283,11 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ /* ZTE PRODUCTS */
+ #define ZTE_VENDOR_ID                         0x19d2
++#define ZTE_PRODUCT_MF622                     0x0001
+ #define ZTE_PRODUCT_MF628                     0x0015
+ #define ZTE_PRODUCT_MF626                     0x0031
+ #define ZTE_PRODUCT_CDMA_TECH                 0xfffe
+-/* Ericsson products */
+-#define ERICSSON_VENDOR_ID                    0x0bdb
+-#define ERICSSON_PRODUCT_F3507G                       0x1900
+-
+ #define BENQ_VENDOR_ID                                0x04a5
+ #define BENQ_PRODUCT_H10                      0x4068
+@@ -317,6 +316,7 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
++      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTM380_MODEM) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
+@@ -402,6 +402,7 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EU870D) }, /* Novatel EU850D/EU860D/EU870D */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC950D) }, /* Novatel MC930D/MC950D */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_MC727) }, /* Novatel MC727/U727/USB727 */
++      { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_U727) }, /* Novatel MC727/U727/USB727 */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_FULLSPEED) }, /* Novatel EVDO product */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_HSPA_FULLSPEED) }, /* Novatel HSPA product */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_EVDO_EMBEDDED_FULLSPEED) }, /* Novatel EVDO Embedded product */
+@@ -429,7 +430,6 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_CINGULAR) },    /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_L) },   /* Dell Wireless HSDPA 5520 */
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5520_MINICARD_GENERIC_I) },   /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+-      { USB_DEVICE(DELL_VENDOR_ID, 0x8147) },                                 /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_SPRINT) },      /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_TELUS) },       /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+       { USB_DEVICE(DELL_VENDOR_ID, DELL_PRODUCT_5730_MINICARD_VZW) },         /* Dell Wireless 5730 Mobile Broadband EVDO/HSPA Mini-Card */
+@@ -497,10 +497,10 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+       { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
++      { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF622) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
+-      { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
+       { USB_DEVICE(BENQ_VENDOR_ID, BENQ_PRODUCT_H10) },
+       { USB_DEVICE(0x1da5, 0x4515) }, /* BenQ H20 */
+       { } /* Terminating entry */
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 019bd62..d21995a 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -219,7 +219,7 @@ UNUSUAL_DEV(  0x0421, 0x047c, 0x0370, 0x0610,
+               US_FL_MAX_SECTORS_64 ),
+ /* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */
+-UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452,
++UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x9999,
+               "Nokia",
+               "Nokia 6233",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -990,7 +990,9 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
+               US_FL_FIX_CAPACITY ),
+ /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
+-UNUSUAL_DEV( 0x067b, 0x2507, 0x0100, 0x0100,
++/* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
++ * Thomas Bartosik <tbartdev@gmx-topmail.de> */
++UNUSUAL_DEV( 0x067b, 0x2507, 0x0001, 0x0100,
+               "Prolific Technology Inc.",
+               "Mass Storage Device",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -1405,6 +1407,16 @@ UNUSUAL_DEV( 0x0af0, 0x7401, 0x0000, 0x0000,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               0 ),
++/* Reported by Jan Dumon <j.dumon@option.com>
++ * This device (wrongly) has a vendor-specific device descriptor.
++ * The entry is needed so usb-storage can bind to it's mass-storage
++ * interface as an interface driver */
++UNUSUAL_DEV( 0x0af0, 0x7501, 0x0000, 0x0000,
++              "Option",
++              "GI 0431 SD-Card",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              0 ),
++
+ #ifdef CONFIG_USB_STORAGE_ISD200
+ UNUSUAL_DEV(  0x0bf6, 0xa001, 0x0100, 0x0110,
+               "ATI",
+diff --git a/fs/aio.c b/fs/aio.c
+index 048648d..c1174b5 100644
+--- a/fs/aio.c
++++ b/fs/aio.c
+@@ -428,7 +428,7 @@ static struct kiocb *__aio_get_req(struct kioctx *ctx)
+       req->private = NULL;
+       req->ki_iovec = NULL;
+       INIT_LIST_HEAD(&req->ki_run_list);
+-      req->ki_eventfd = ERR_PTR(-EINVAL);
++      req->ki_eventfd = NULL;
+       /* Check if the completion queue has enough free space to
+        * accept an event from this io.
+@@ -470,8 +470,6 @@ static inline void really_put_req(struct kioctx *ctx, struct kiocb *req)
+ {
+       assert_spin_locked(&ctx->ctx_lock);
+-      if (!IS_ERR(req->ki_eventfd))
+-              fput(req->ki_eventfd);
+       if (req->ki_dtor)
+               req->ki_dtor(req);
+       if (req->ki_iovec != &req->ki_inline_vec)
+@@ -493,8 +491,11 @@ static void aio_fput_routine(struct work_struct *data)
+               list_del(&req->ki_list);
+               spin_unlock_irq(&fput_lock);
+-              /* Complete the fput */
+-              __fput(req->ki_filp);
++              /* Complete the fput(s) */
++              if (req->ki_filp != NULL)
++                      __fput(req->ki_filp);
++              if (req->ki_eventfd != NULL)
++                      __fput(req->ki_eventfd);
+               /* Link the iocb into the context's free list */
+               spin_lock_irq(&ctx->ctx_lock);
+@@ -512,12 +513,14 @@ static void aio_fput_routine(struct work_struct *data)
+  */
+ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
+ {
++      int schedule_putreq = 0;
++
+       dprintk(KERN_DEBUG "aio_put(%p): f_count=%ld\n",
+               req, atomic_long_read(&req->ki_filp->f_count));
+       assert_spin_locked(&ctx->ctx_lock);
+-      req->ki_users --;
++      req->ki_users--;
+       BUG_ON(req->ki_users < 0);
+       if (likely(req->ki_users))
+               return 0;
+@@ -525,10 +528,23 @@ static int __aio_put_req(struct kioctx *ctx, struct kiocb *req)
+       req->ki_cancel = NULL;
+       req->ki_retry = NULL;
+-      /* Must be done under the lock to serialise against cancellation.
+-       * Call this aio_fput as it duplicates fput via the fput_work.
++      /*
++       * Try to optimize the aio and eventfd file* puts, by avoiding to
++       * schedule work in case it is not __fput() time. In normal cases,
++       * we would not be holding the last reference to the file*, so
++       * this function will be executed w/out any aio kthread wakeup.
+        */
+-      if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count))) {
++      if (unlikely(atomic_long_dec_and_test(&req->ki_filp->f_count)))
++              schedule_putreq++;
++      else
++              req->ki_filp = NULL;
++      if (req->ki_eventfd != NULL) {
++              if (unlikely(atomic_long_dec_and_test(&req->ki_eventfd->f_count)))
++                      schedule_putreq++;
++              else
++                      req->ki_eventfd = NULL;
++      }
++      if (unlikely(schedule_putreq)) {
+               get_ioctx(ctx);
+               spin_lock(&fput_lock);
+               list_add(&req->ki_list, &fput_head);
+@@ -992,7 +1008,7 @@ int aio_complete(struct kiocb *iocb, long res, long res2)
+        * eventfd. The eventfd_signal() function is safe to be called
+        * from IRQ context.
+        */
+-      if (!IS_ERR(iocb->ki_eventfd))
++      if (iocb->ki_eventfd != NULL)
+               eventfd_signal(iocb->ki_eventfd, 1);
+ put_rq:
+@@ -1596,6 +1612,7 @@ static int io_submit_one(struct kioctx *ctx, struct iocb __user *user_iocb,
+               req->ki_eventfd = eventfd_fget((int) iocb->aio_resfd);
+               if (IS_ERR(req->ki_eventfd)) {
+                       ret = PTR_ERR(req->ki_eventfd);
++                      req->ki_eventfd = NULL;
+                       goto out_put_req;
+               }
+       }
+diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
+index 14ba4d9..b0b07df 100644
+--- a/fs/nfsd/nfs4xdr.c
++++ b/fs/nfsd/nfs4xdr.c
+@@ -2593,6 +2593,7 @@ static nfsd4_enc nfsd4_enc_ops[] = {
+       [OP_LOOKUPP]            = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_NVERIFY]            = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_OPEN]               = (nfsd4_enc)nfsd4_encode_open,
++      [OP_OPENATTR]           = (nfsd4_enc)nfsd4_encode_noop,
+       [OP_OPEN_CONFIRM]       = (nfsd4_enc)nfsd4_encode_open_confirm,
+       [OP_OPEN_DOWNGRADE]     = (nfsd4_enc)nfsd4_encode_open_downgrade,
+       [OP_PUTFH]              = (nfsd4_enc)nfsd4_encode_noop,
+diff --git a/include/asm-x86/msr-index.h b/include/asm-x86/msr-index.h
+index 44bce77..d3a20f3 100644
+--- a/include/asm-x86/msr-index.h
++++ b/include/asm-x86/msr-index.h
+@@ -196,6 +196,35 @@
+ #define MSR_IA32_THERM_STATUS         0x0000019c
+ #define MSR_IA32_MISC_ENABLE          0x000001a0
++/* MISC_ENABLE bits: architectural */
++#define MSR_IA32_MISC_ENABLE_FAST_STRING      (1ULL << 0)
++#define MSR_IA32_MISC_ENABLE_TCC              (1ULL << 1)
++#define MSR_IA32_MISC_ENABLE_EMON             (1ULL << 7)
++#define MSR_IA32_MISC_ENABLE_BTS_UNAVAIL      (1ULL << 11)
++#define MSR_IA32_MISC_ENABLE_PEBS_UNAVAIL     (1ULL << 12)
++#define MSR_IA32_MISC_ENABLE_ENHANCED_SPEEDSTEP       (1ULL << 16)
++#define MSR_IA32_MISC_ENABLE_MWAIT            (1ULL << 18)
++#define MSR_IA32_MISC_ENABLE_LIMIT_CPUID      (1ULL << 22)
++#define MSR_IA32_MISC_ENABLE_XTPR_DISABLE     (1ULL << 23)
++#define MSR_IA32_MISC_ENABLE_XD_DISABLE               (1ULL << 34)
++
++/* MISC_ENABLE bits: model-specific, meaning may vary from core to core */
++#define MSR_IA32_MISC_ENABLE_X87_COMPAT               (1ULL << 2)
++#define MSR_IA32_MISC_ENABLE_TM1              (1ULL << 3)
++#define MSR_IA32_MISC_ENABLE_SPLIT_LOCK_DISABLE       (1ULL << 4)
++#define MSR_IA32_MISC_ENABLE_L3CACHE_DISABLE  (1ULL << 6)
++#define MSR_IA32_MISC_ENABLE_SUPPRESS_LOCK    (1ULL << 8)
++#define MSR_IA32_MISC_ENABLE_PREFETCH_DISABLE (1ULL << 9)
++#define MSR_IA32_MISC_ENABLE_FERR             (1ULL << 10)
++#define MSR_IA32_MISC_ENABLE_FERR_MULTIPLEX   (1ULL << 10)
++#define MSR_IA32_MISC_ENABLE_TM2              (1ULL << 13)
++#define MSR_IA32_MISC_ENABLE_ADJ_PREF_DISABLE (1ULL << 19)
++#define MSR_IA32_MISC_ENABLE_SPEEDSTEP_LOCK   (1ULL << 20)
++#define MSR_IA32_MISC_ENABLE_L1D_CONTEXT      (1ULL << 24)
++#define MSR_IA32_MISC_ENABLE_DCU_PREF_DISABLE (1ULL << 37)
++#define MSR_IA32_MISC_ENABLE_TURBO_DISABLE    (1ULL << 38)
++#define MSR_IA32_MISC_ENABLE_IP_PREF_DISABLE  (1ULL << 39)
++
+ /* Intel Model 6 */
+ #define MSR_P6_EVNTSEL0                       0x00000186
+ #define MSR_P6_EVNTSEL1                       0x00000187
+diff --git a/include/linux/capability.h b/include/linux/capability.h
+index 9d1fe30..28863f4 100644
+--- a/include/linux/capability.h
++++ b/include/linux/capability.h
+@@ -382,8 +382,10 @@ typedef struct kernel_cap_struct {
+ # define CAP_FULL_SET     ((kernel_cap_t){{ ~0, ~0 }})
+ # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
+ # define CAP_FS_SET       ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
+-# define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0|CAP_TO_MASK(CAP_SYS_RESOURCE), \
+-                                      CAP_FS_MASK_B1 } })
++# define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0 \
++                                          | CAP_TO_MASK(CAP_SYS_RESOURCE) \
++                                          | CAP_TO_MASK(CAP_MKNOD), \
++                                          CAP_FS_MASK_B1 } })
+ #endif /* _KERNEL_CAPABILITY_U32S != 2 */
+diff --git a/sound/core/oss/pcm_oss.c b/sound/core/oss/pcm_oss.c
+index 4c601b1..35afb41 100644
+--- a/sound/core/oss/pcm_oss.c
++++ b/sound/core/oss/pcm_oss.c
+@@ -2854,7 +2854,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,
+                       setup = kmalloc(sizeof(*setup), GFP_KERNEL);
+                       if (! setup) {
+                               buffer->error = -ENOMEM;
+-                              mutex_lock(&pstr->oss.setup_mutex);
++                              mutex_unlock(&pstr->oss.setup_mutex);
+                               return;
+                       }
+                       if (pstr->oss.setup_list == NULL)
+@@ -2868,7 +2868,7 @@ static void snd_pcm_oss_proc_write(struct snd_info_entry *entry,
+                       if (! template.task_name) {
+                               kfree(setup);
+                               buffer->error = -ENOMEM;
+-                              mutex_lock(&pstr->oss.setup_mutex);
++                              mutex_unlock(&pstr->oss.setup_mutex);
+                               return;
+                       }
+               }
+diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c
+index cefd228..91f16ac 100644
+--- a/sound/core/sgbuf.c
++++ b/sound/core/sgbuf.c
+@@ -38,6 +38,10 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)
+       if (! sgbuf)
+               return -EINVAL;
++      if (dmab->area)
++              vunmap(dmab->area);
++      dmab->area = NULL;
++
+       tmpb.dev.type = SNDRV_DMA_TYPE_DEV;
+       tmpb.dev.dev = sgbuf->dev;
+       for (i = 0; i < sgbuf->pages; i++) {
+@@ -46,9 +50,6 @@ int snd_free_sgbuf_pages(struct snd_dma_buffer *dmab)
+               tmpb.bytes = PAGE_SIZE;
+               snd_dma_free_pages(&tmpb);
+       }
+-      if (dmab->area)
+-              vunmap(dmab->area);
+-      dmab->area = NULL;
+       kfree(sgbuf->table);
+       kfree(sgbuf->page_table);
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 0f014b1..0b93ef6 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -2110,9 +2110,17 @@ static int __devinit azx_create(struct snd_card *card, struct pci_dev *pci,
+       gcap = azx_readw(chip, GCAP);
+       snd_printdd("chipset global capabilities = 0x%x\n", gcap);
++      /* ATI chips seems buggy about 64bit DMA addresses */
++      if (chip->driver_type == AZX_DRIVER_ATI)
++              gcap &= ~0x01;
++
+       /* allow 64bit DMA address if supported by H/W */
+       if ((gcap & 0x01) && !pci_set_dma_mask(pci, DMA_64BIT_MASK))
+               pci_set_consistent_dma_mask(pci, DMA_64BIT_MASK);
++      else {
++              pci_set_dma_mask(pci, DMA_32BIT_MASK);
++              pci_set_consistent_dma_mask(pci, DMA_32BIT_MASK);
++      }
+       /* read number of streams from GCAP register instead of using
+        * hardcoded value
+diff --git a/sound/pci/mixart/mixart.c b/sound/pci/mixart/mixart.c
+index 3dd0c79..7e83131 100644
+--- a/sound/pci/mixart/mixart.c
++++ b/sound/pci/mixart/mixart.c
+@@ -607,6 +607,7 @@ static int snd_mixart_hw_params(struct snd_pcm_substream *subs,
+       /* set the format to the board */
+       err = mixart_set_format(stream, format);
+       if(err < 0) {
++              mutex_unlock(&mgr->setup_mutex);
+               return err;
+       }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.21-22 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.21-22
new file mode 100644 (file)
index 0000000..e837481
--- /dev/null
@@ -0,0 +1,2387 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.22
+
+Upstream 2.6.27.22 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 0664c76..d3b7fc8 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .21
++EXTRAVERSION = .22
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/include/asm/futex.h b/arch/powerpc/include/asm/futex.h
+index 6d406c5..9696cc3 100644
+--- a/arch/powerpc/include/asm/futex.h
++++ b/arch/powerpc/include/asm/futex.h
+@@ -27,7 +27,7 @@
+       PPC_LONG "1b,4b,2b,4b\n" \
+       ".previous" \
+       : "=&r" (oldval), "=&r" (ret) \
+-      : "b" (uaddr), "i" (-EFAULT), "1" (oparg) \
++      : "b" (uaddr), "i" (-EFAULT), "r" (oparg) \
+       : "cr0", "memory")
+ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
+@@ -47,19 +47,19 @@ static inline int futex_atomic_op_inuser (int encoded_op, int __user *uaddr)
+       switch (op) {
+       case FUTEX_OP_SET:
+-              __futex_atomic_op("", ret, oldval, uaddr, oparg);
++              __futex_atomic_op("mr %1,%4\n", ret, oldval, uaddr, oparg);
+               break;
+       case FUTEX_OP_ADD:
+-              __futex_atomic_op("add %1,%0,%1\n", ret, oldval, uaddr, oparg);
++              __futex_atomic_op("add %1,%0,%4\n", ret, oldval, uaddr, oparg);
+               break;
+       case FUTEX_OP_OR:
+-              __futex_atomic_op("or %1,%0,%1\n", ret, oldval, uaddr, oparg);
++              __futex_atomic_op("or %1,%0,%4\n", ret, oldval, uaddr, oparg);
+               break;
+       case FUTEX_OP_ANDN:
+-              __futex_atomic_op("andc %1,%0,%1\n", ret, oldval, uaddr, oparg);
++              __futex_atomic_op("andc %1,%0,%4\n", ret, oldval, uaddr, oparg);
+               break;
+       case FUTEX_OP_XOR:
+-              __futex_atomic_op("xor %1,%0,%1\n", ret, oldval, uaddr, oparg);
++              __futex_atomic_op("xor %1,%0,%4\n", ret, oldval, uaddr, oparg);
+               break;
+       default:
+               ret = -ENOSYS;
+diff --git a/arch/powerpc/include/asm/processor.h b/arch/powerpc/include/asm/processor.h
+index 101ed87..ae1c5b5 100644
+--- a/arch/powerpc/include/asm/processor.h
++++ b/arch/powerpc/include/asm/processor.h
+@@ -309,6 +309,25 @@ static inline void prefetchw(const void *x)
+ #define HAVE_ARCH_PICK_MMAP_LAYOUT
+ #endif
++#ifdef CONFIG_PPC64
++static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32)
++{
++      unsigned long sp;
++
++      if (is_32)
++              sp = regs->gpr[1] & 0x0ffffffffUL;
++      else
++              sp = regs->gpr[1];
++
++      return sp;
++}
++#else
++static inline unsigned long get_clean_sp(struct pt_regs *regs, int is_32)
++{
++      return regs->gpr[1];
++}
++#endif
++
+ #endif /* __KERNEL__ */
+ #endif /* __ASSEMBLY__ */
+ #endif /* _ASM_POWERPC_PROCESSOR_H */
+diff --git a/arch/powerpc/kernel/signal.c b/arch/powerpc/kernel/signal.c
+index a54405e..00b5078 100644
+--- a/arch/powerpc/kernel/signal.c
++++ b/arch/powerpc/kernel/signal.c
+@@ -26,12 +26,12 @@ int show_unhandled_signals = 0;
+  * Allocate space for the signal frame
+  */
+ void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
+-                         size_t frame_size)
++                         size_t frame_size, int is_32)
+ {
+         unsigned long oldsp, newsp;
+         /* Default to using normal stack */
+-        oldsp = regs->gpr[1];
++        oldsp = get_clean_sp(regs, is_32);
+       /* Check for alt stack */
+       if ((ka->sa.sa_flags & SA_ONSTACK) &&
+diff --git a/arch/powerpc/kernel/signal.h b/arch/powerpc/kernel/signal.h
+index 28f4b9f..f77d502 100644
+--- a/arch/powerpc/kernel/signal.h
++++ b/arch/powerpc/kernel/signal.h
+@@ -13,7 +13,7 @@
+ #define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
+ extern void __user * get_sigframe(struct k_sigaction *ka, struct pt_regs *regs,
+-                                size_t frame_size);
++                                size_t frame_size, int is_32);
+ extern void restore_sigmask(sigset_t *set);
+ extern int handle_signal32(unsigned long sig, struct k_sigaction *ka,
+diff --git a/arch/powerpc/kernel/signal_32.c b/arch/powerpc/kernel/signal_32.c
+index a6a4310..9084a27 100644
+--- a/arch/powerpc/kernel/signal_32.c
++++ b/arch/powerpc/kernel/signal_32.c
+@@ -836,7 +836,7 @@ int handle_rt_signal32(unsigned long sig, struct k_sigaction *ka,
+       /* Set up Signal Frame */
+       /* Put a Real Time Context onto stack */
+-      rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf));
++      rt_sf = get_sigframe(ka, regs, sizeof(*rt_sf), 1);
+       addr = rt_sf;
+       if (unlikely(rt_sf == NULL))
+               goto badframe;
+@@ -1170,7 +1170,7 @@ int handle_signal32(unsigned long sig, struct k_sigaction *ka,
+       unsigned long newsp = 0;
+       /* Set up Signal Frame */
+-      frame = get_sigframe(ka, regs, sizeof(*frame));
++      frame = get_sigframe(ka, regs, sizeof(*frame), 1);
+       if (unlikely(frame == NULL))
+               goto badframe;
+       sc = (struct sigcontext __user *) &frame->sctx;
+diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c
+index e4acdbd..3de15b0 100644
+--- a/arch/powerpc/kernel/signal_64.c
++++ b/arch/powerpc/kernel/signal_64.c
+@@ -404,7 +404,7 @@ int handle_rt_signal64(int signr, struct k_sigaction *ka, siginfo_t *info,
+       unsigned long newsp = 0;
+       long err = 0;
+-      frame = get_sigframe(ka, regs, sizeof(*frame));
++      frame = get_sigframe(ka, regs, sizeof(*frame), 0);
+       if (unlikely(frame == NULL))
+               goto badframe;
+diff --git a/arch/x86/boot/memory.c b/arch/x86/boot/memory.c
+index 8c3c25f..a99dbbe 100644
+--- a/arch/x86/boot/memory.c
++++ b/arch/x86/boot/memory.c
+@@ -27,13 +27,14 @@ static int detect_memory_e820(void)
+       do {
+               size = sizeof(struct e820entry);
+-              /* Important: %edx is clobbered by some BIOSes,
+-                 so it must be either used for the error output
++              /* Important: %edx and %esi are clobbered by some BIOSes,
++                 so they must be either used for the error output
+                  or explicitly marked clobbered. */
+               asm("int $0x15; setc %0"
+                   : "=d" (err), "+b" (next), "=a" (id), "+c" (size),
+                     "=m" (*desc)
+-                  : "D" (desc), "d" (SMAP), "a" (0xe820));
++                  : "D" (desc), "d" (SMAP), "a" (0xe820)
++                  : "esi");
+               /* BIOSes which terminate the chain with CF = 1 as opposed
+                  to %ebx = 0 don't always report the SMAP signature on
+diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c
+index cb7d3b6..26baabd 100644
+--- a/arch/x86/kernel/cpu/mtrr/generic.c
++++ b/arch/x86/kernel/cpu/mtrr/generic.c
+@@ -45,6 +45,32 @@ u64 mtrr_tom2;
+ static int mtrr_show;
+ module_param_named(show, mtrr_show, bool, 0);
++/**
++ * BIOS is expected to clear MtrrFixDramModEn bit, see for example
++ * "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
++ * Opteron Processors" (26094 Rev. 3.30 February 2006), section
++ * "13.2.1.2 SYSCFG Register": "The MtrrFixDramModEn bit should be set
++ * to 1 during BIOS initalization of the fixed MTRRs, then cleared to
++ * 0 for operation."
++ */
++static inline void k8_check_syscfg_dram_mod_en(void)
++{
++      u32 lo, hi;
++
++      if (!((boot_cpu_data.x86_vendor == X86_VENDOR_AMD) &&
++            (boot_cpu_data.x86 >= 0x0f)))
++              return;
++
++      rdmsr(MSR_K8_SYSCFG, lo, hi);
++      if (lo & K8_MTRRFIXRANGE_DRAM_MODIFY) {
++              printk(KERN_ERR "MTRR: CPU %u: SYSCFG[MtrrFixDramModEn]"
++                     " not cleared by BIOS, clearing this bit\n",
++                     smp_processor_id());
++              lo &= ~K8_MTRRFIXRANGE_DRAM_MODIFY;
++              mtrr_wrmsr(MSR_K8_SYSCFG, lo, hi);
++      }
++}
++
+ /*
+  * Returns the effective MTRR type for the region
+  * Error returns:
+@@ -178,6 +204,8 @@ get_fixed_ranges(mtrr_type * frs)
+       unsigned int *p = (unsigned int *) frs;
+       int i;
++      k8_check_syscfg_dram_mod_en();
++
+       rdmsr(MTRRfix64K_00000_MSR, p[0], p[1]);
+       for (i = 0; i < 2; i++)
+@@ -312,27 +340,10 @@ void mtrr_wrmsr(unsigned msr, unsigned a, unsigned b)
+ }
+ /**
+- * Enable and allow read/write of extended fixed-range MTRR bits on K8 CPUs
+- * see AMD publication no. 24593, chapter 3.2.1 for more information
+- */
+-static inline void k8_enable_fixed_iorrs(void)
+-{
+-      unsigned lo, hi;
+-
+-      rdmsr(MSR_K8_SYSCFG, lo, hi);
+-      mtrr_wrmsr(MSR_K8_SYSCFG, lo
+-                              | K8_MTRRFIXRANGE_DRAM_ENABLE
+-                              | K8_MTRRFIXRANGE_DRAM_MODIFY, hi);
+-}
+-
+-/**
+  * set_fixed_range - checks & updates a fixed-range MTRR if it differs from the value it should have
+  * @msr: MSR address of the MTTR which should be checked and updated
+  * @changed: pointer which indicates whether the MTRR needed to be changed
+  * @msrwords: pointer to the MSR values which the MSR should have
+- *
+- * If K8 extentions are wanted, update the K8 SYSCFG MSR also.
+- * See AMD publication no. 24593, chapter 7.8.1, page 233 for more information.
+  */
+ static void set_fixed_range(int msr, bool *changed, unsigned int *msrwords)
+ {
+@@ -341,10 +352,6 @@ static void set_fixed_range(int msr, bool *changed, unsigned int *msrwords)
+       rdmsr(msr, lo, hi);
+       if (lo != msrwords[0] || hi != msrwords[1]) {
+-              if (boot_cpu_data.x86_vendor == X86_VENDOR_AMD &&
+-                  (boot_cpu_data.x86 >= 0x0f && boot_cpu_data.x86 <= 0x11) &&
+-                  ((msrwords[0] | msrwords[1]) & K8_MTRR_RDMEM_WRMEM_MASK))
+-                      k8_enable_fixed_iorrs();
+               mtrr_wrmsr(msr, msrwords[0], msrwords[1]);
+               *changed = true;
+       }
+@@ -428,6 +435,8 @@ static int set_fixed_ranges(mtrr_type * frs)
+       bool changed = false;
+       int block=-1, range;
++      k8_check_syscfg_dram_mod_en();
++
+       while (fixed_range_blocks[++block].ranges)
+           for (range=0; range < fixed_range_blocks[block].ranges; range++)
+               set_fixed_range(fixed_range_blocks[block].base_msr + range,
+diff --git a/arch/x86/pci/i386.c b/arch/x86/pci/i386.c
+index 8791fc5..b4b899a 100644
+--- a/arch/x86/pci/i386.c
++++ b/arch/x86/pci/i386.c
+@@ -326,6 +326,9 @@ int pci_mmap_page_range(struct pci_dev *dev, struct vm_area_struct *vma,
+                       return -EINVAL;
+               }
+               flags = new_flags;
++              vma->vm_page_prot = __pgprot(
++                      (pgprot_val(vma->vm_page_prot) & ~_PAGE_CACHE_MASK) |
++                      flags);
+       }
+       if (((vma->vm_pgoff < max_low_pfn_mapped) ||
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 2694998..e618cbe 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -968,9 +968,9 @@ static const struct acpi_device_id ec_device_ids[] = {
+ int __init acpi_ec_ecdt_probe(void)
+ {
+-      int ret;
+       acpi_status status;
+       struct acpi_table_ecdt *ecdt_ptr;
++      acpi_handle dummy;
+       boot_ec = make_acpi_ec();
+       if (!boot_ec)
+@@ -996,30 +996,31 @@ int __init acpi_ec_ecdt_probe(void)
+               boot_ec->gpe = ecdt_ptr->gpe;
+               boot_ec->handle = ACPI_ROOT_OBJECT;
+               acpi_get_handle(ACPI_ROOT_OBJECT, ecdt_ptr->id, &boot_ec->handle);
+-      } else {
+-              /* This workaround is needed only on some broken machines,
+-               * which require early EC, but fail to provide ECDT */
+-              acpi_handle x;
+-              printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
+-              status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
+-                                              boot_ec, NULL);
+-              /* Check that acpi_get_devices actually find something */
+-              if (ACPI_FAILURE(status) || !boot_ec->handle)
+-                      goto error;
+-              /* We really need to limit this workaround, the only ASUS,
+-               * which needs it, has fake EC._INI method, so use it as flag.
+-               * Keep boot_ec struct as it will be needed soon.
+-               */
+-              if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &x)))
+-                      return -ENODEV;
++              /* Add some basic check against completely broken table */
++              if (boot_ec->data_addr != boot_ec->command_addr)
++                      goto install;
++      /* fall through */
+       }
+-
+-      ret = ec_install_handlers(boot_ec);
+-      if (!ret) {
++      /* This workaround is needed only on some broken machines,
++       * which require early EC, but fail to provide ECDT */
++      printk(KERN_DEBUG PREFIX "Look up EC in DSDT\n");
++      status = acpi_get_devices(ec_device_ids[0].id, ec_parse_device,
++                                      boot_ec, NULL);
++      /* Check that acpi_get_devices actually find something */
++      if (ACPI_FAILURE(status) || !boot_ec->handle)
++              goto error;
++      /* We really need to limit this workaround, the only ASUS,
++       * which needs it, has fake EC._INI method, so use it as flag.
++       * Keep boot_ec struct as it will be needed soon.
++       */
++      if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &dummy)))
++              return -ENODEV;
++install:
++      if (!ec_install_handlers(boot_ec)) {
+               first_ec = boot_ec;
+               return 0;
+       }
+-      error:
++error:
+       kfree(boot_ec);
+       boot_ec = NULL;
+       return -ENODEV;
+diff --git a/drivers/ata/pata_hpt37x.c b/drivers/ata/pata_hpt37x.c
+index 4216399..233a5fd 100644
+--- a/drivers/ata/pata_hpt37x.c
++++ b/drivers/ata/pata_hpt37x.c
+@@ -8,7 +8,7 @@
+  * Copyright (C) 1999-2003            Andre Hedrick <andre@linux-ide.org>
+  * Portions Copyright (C) 2001                Sun Microsystems, Inc.
+  * Portions Copyright (C) 2003                Red Hat Inc
+- * Portions Copyright (C) 2005-2007   MontaVista Software, Inc.
++ * Portions Copyright (C) 2005-2009   MontaVista Software, Inc.
+  *
+  * TODO
+  *    Look into engine reset on timeout errors. Should not be required.
+@@ -24,7 +24,7 @@
+ #include <linux/libata.h>
+ #define DRV_NAME      "pata_hpt37x"
+-#define DRV_VERSION   "0.6.11"
++#define DRV_VERSION   "0.6.12"
+ struct hpt_clock {
+       u8      xfer_speed;
+@@ -445,23 +445,6 @@ static void hpt370_set_dmamode(struct ata_port *ap, struct ata_device *adev)
+ }
+ /**
+- *    hpt370_bmdma_start              -       DMA engine begin
+- *    @qc: ATA command
+- *
+- *    The 370 and 370A want us to reset the DMA engine each time we
+- *    use it. The 372 and later are fine.
+- */
+-
+-static void hpt370_bmdma_start(struct ata_queued_cmd *qc)
+-{
+-      struct ata_port *ap = qc->ap;
+-      struct pci_dev *pdev = to_pci_dev(ap->host->dev);
+-      pci_write_config_byte(pdev, 0x50 + 4 * ap->port_no, 0x37);
+-      udelay(10);
+-      ata_bmdma_start(qc);
+-}
+-
+-/**
+  *    hpt370_bmdma_end                -       DMA engine stop
+  *    @qc: ATA command
+  *
+@@ -598,7 +581,6 @@ static struct scsi_host_template hpt37x_sht = {
+ static struct ata_port_operations hpt370_port_ops = {
+       .inherits       = &ata_bmdma_port_ops,
+-      .bmdma_start    = hpt370_bmdma_start,
+       .bmdma_stop     = hpt370_bmdma_stop,
+       .mode_filter    = hpt370_filter,
+diff --git a/drivers/char/agp/generic.c b/drivers/char/agp/generic.c
+index 118dbde..8cf3dca 100644
+--- a/drivers/char/agp/generic.c
++++ b/drivers/char/agp/generic.c
+@@ -1207,7 +1207,7 @@ void *agp_generic_alloc_page(struct agp_bridge_data *bridge)
+ {
+       struct page * page;
+-      page = alloc_page(GFP_KERNEL | GFP_DMA32);
++      page = alloc_page(GFP_KERNEL | GFP_DMA32 | __GFP_ZERO);
+       if (page == NULL)
+               return NULL;
+diff --git a/drivers/char/raw.c b/drivers/char/raw.c
+index 47b8cf2..92022aa 100644
+--- a/drivers/char/raw.c
++++ b/drivers/char/raw.c
+@@ -90,6 +90,7 @@ out1:
+       blkdev_put(bdev);
+ out:
+       mutex_unlock(&raw_mutex);
++      unlock_kernel();
+       return err;
+ }
+diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
+index 2d637e0..fdcd0ab 100644
+--- a/drivers/crypto/ixp4xx_crypto.c
++++ b/drivers/crypto/ixp4xx_crypto.c
+@@ -101,6 +101,7 @@ struct buffer_desc {
+       u32 phys_addr;
+       u32 __reserved[4];
+       struct buffer_desc *next;
++      enum dma_data_direction dir;
+ };
+ struct crypt_ctl {
+@@ -132,14 +133,10 @@ struct crypt_ctl {
+ struct ablk_ctx {
+       struct buffer_desc *src;
+       struct buffer_desc *dst;
+-      unsigned src_nents;
+-      unsigned dst_nents;
+ };
+ struct aead_ctx {
+       struct buffer_desc *buffer;
+-      unsigned short assoc_nents;
+-      unsigned short src_nents;
+       struct scatterlist ivlist;
+       /* used when the hmac is not on one sg entry */
+       u8 *hmac_virt;
+@@ -312,7 +309,7 @@ static struct crypt_ctl *get_crypt_desc_emerg(void)
+       }
+ }
+-static void free_buf_chain(struct buffer_desc *buf, u32 phys)
++static void free_buf_chain(struct device *dev, struct buffer_desc *buf,u32 phys)
+ {
+       while (buf) {
+               struct buffer_desc *buf1;
+@@ -320,6 +317,7 @@ static void free_buf_chain(struct buffer_desc *buf, u32 phys)
+               buf1 = buf->next;
+               phys1 = buf->phys_next;
++              dma_unmap_single(dev, buf->phys_next, buf->buf_len, buf->dir);
+               dma_pool_free(buffer_pool, buf, phys);
+               buf = buf1;
+               phys = phys1;
+@@ -348,7 +346,6 @@ static void one_packet(dma_addr_t phys)
+       struct crypt_ctl *crypt;
+       struct ixp_ctx *ctx;
+       int failed;
+-      enum dma_data_direction src_direction = DMA_BIDIRECTIONAL;
+       failed = phys & 0x1 ? -EBADMSG : 0;
+       phys &= ~0x3;
+@@ -358,13 +355,8 @@ static void one_packet(dma_addr_t phys)
+       case CTL_FLAG_PERFORM_AEAD: {
+               struct aead_request *req = crypt->data.aead_req;
+               struct aead_ctx *req_ctx = aead_request_ctx(req);
+-              dma_unmap_sg(dev, req->assoc, req_ctx->assoc_nents,
+-                              DMA_TO_DEVICE);
+-              dma_unmap_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL);
+-              dma_unmap_sg(dev, req->src, req_ctx->src_nents,
+-                              DMA_BIDIRECTIONAL);
+-              free_buf_chain(req_ctx->buffer, crypt->src_buf);
++              free_buf_chain(dev, req_ctx->buffer, crypt->src_buf);
+               if (req_ctx->hmac_virt) {
+                       finish_scattered_hmac(crypt);
+               }
+@@ -374,16 +366,11 @@ static void one_packet(dma_addr_t phys)
+       case CTL_FLAG_PERFORM_ABLK: {
+               struct ablkcipher_request *req = crypt->data.ablk_req;
+               struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req);
+-              int nents;
++
+               if (req_ctx->dst) {
+-                      nents = req_ctx->dst_nents;
+-                      dma_unmap_sg(dev, req->dst, nents, DMA_FROM_DEVICE);
+-                      free_buf_chain(req_ctx->dst, crypt->dst_buf);
+-                      src_direction = DMA_TO_DEVICE;
++                      free_buf_chain(dev, req_ctx->dst, crypt->dst_buf);
+               }
+-              nents = req_ctx->src_nents;
+-              dma_unmap_sg(dev, req->src, nents, src_direction);
+-              free_buf_chain(req_ctx->src, crypt->src_buf);
++              free_buf_chain(dev, req_ctx->src, crypt->src_buf);
+               req->base.complete(&req->base, failed);
+               break;
+       }
+@@ -748,56 +735,35 @@ static int setup_cipher(struct crypto_tfm *tfm, int encrypt,
+       return 0;
+ }
+-static int count_sg(struct scatterlist *sg, int nbytes)
++static struct buffer_desc *chainup_buffers(struct device *dev,
++              struct scatterlist *sg, unsigned nbytes,
++              struct buffer_desc *buf, gfp_t flags,
++              enum dma_data_direction dir)
+ {
+-      int i;
+-      for (i = 0; nbytes > 0; i++, sg = sg_next(sg))
+-              nbytes -= sg->length;
+-      return i;
+-}
+-
+-static struct buffer_desc *chainup_buffers(struct scatterlist *sg,
+-                      unsigned nbytes, struct buffer_desc *buf, gfp_t flags)
+-{
+-      int nents = 0;
+-
+-      while (nbytes > 0) {
++      for (;nbytes > 0; sg = scatterwalk_sg_next(sg)) {
++              unsigned len = min(nbytes, sg->length);
+               struct buffer_desc *next_buf;
+               u32 next_buf_phys;
+-              unsigned len = min(nbytes, sg_dma_len(sg));
++              void *ptr;
+-              nents++;
+               nbytes -= len;
+-              if (!buf->phys_addr) {
+-                      buf->phys_addr = sg_dma_address(sg);
+-                      buf->buf_len = len;
+-                      buf->next = NULL;
+-                      buf->phys_next = 0;
+-                      goto next;
+-              }
+-              /* Two consecutive chunks on one page may be handled by the old
+-               * buffer descriptor, increased by the length of the new one
+-               */
+-              if (sg_dma_address(sg) == buf->phys_addr + buf->buf_len) {
+-                      buf->buf_len += len;
+-                      goto next;
+-              }
++              ptr = page_address(sg_page(sg)) + sg->offset;
+               next_buf = dma_pool_alloc(buffer_pool, flags, &next_buf_phys);
+-              if (!next_buf)
+-                      return NULL;
++              if (!next_buf) {
++                      buf = NULL;
++                      break;
++              }
++              sg_dma_address(sg) = dma_map_single(dev, ptr, len, dir);
+               buf->next = next_buf;
+               buf->phys_next = next_buf_phys;
+-
+               buf = next_buf;
+-              buf->next = NULL;
+-              buf->phys_next = 0;
++
+               buf->phys_addr = sg_dma_address(sg);
+               buf->buf_len = len;
+-next:
+-              if (nbytes > 0) {
+-                      sg = sg_next(sg);
+-              }
++              buf->dir = dir;
+       }
++      buf->next = NULL;
++      buf->phys_next = 0;
+       return buf;
+ }
+@@ -858,12 +824,12 @@ static int ablk_perform(struct ablkcipher_request *req, int encrypt)
+       struct crypto_ablkcipher *tfm = crypto_ablkcipher_reqtfm(req);
+       struct ixp_ctx *ctx = crypto_ablkcipher_ctx(tfm);
+       unsigned ivsize = crypto_ablkcipher_ivsize(tfm);
+-      int ret = -ENOMEM;
+       struct ix_sa_dir *dir;
+       struct crypt_ctl *crypt;
+-      unsigned int nbytes = req->nbytes, nents;
++      unsigned int nbytes = req->nbytes;
+       enum dma_data_direction src_direction = DMA_BIDIRECTIONAL;
+       struct ablk_ctx *req_ctx = ablkcipher_request_ctx(req);
++      struct buffer_desc src_hook;
+       gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
+                               GFP_KERNEL : GFP_ATOMIC;
+@@ -876,7 +842,7 @@ static int ablk_perform(struct ablkcipher_request *req, int encrypt)
+       crypt = get_crypt_desc();
+       if (!crypt)
+-              return ret;
++              return -ENOMEM;
+       crypt->data.ablk_req = req;
+       crypt->crypto_ctx = dir->npe_ctx_phys;
+@@ -889,53 +855,41 @@ static int ablk_perform(struct ablkcipher_request *req, int encrypt)
+       BUG_ON(ivsize && !req->info);
+       memcpy(crypt->iv, req->info, ivsize);
+       if (req->src != req->dst) {
++              struct buffer_desc dst_hook;
+               crypt->mode |= NPE_OP_NOT_IN_PLACE;
+-              nents = count_sg(req->dst, nbytes);
+               /* This was never tested by Intel
+                * for more than one dst buffer, I think. */
+-              BUG_ON(nents != 1);
+-              req_ctx->dst_nents = nents;
+-              dma_map_sg(dev, req->dst, nents, DMA_FROM_DEVICE);
+-              req_ctx->dst = dma_pool_alloc(buffer_pool, flags,&crypt->dst_buf);
+-              if (!req_ctx->dst)
+-                      goto unmap_sg_dest;
+-              req_ctx->dst->phys_addr = 0;
+-              if (!chainup_buffers(req->dst, nbytes, req_ctx->dst, flags))
++              BUG_ON(req->dst->length < nbytes);
++              req_ctx->dst = NULL;
++              if (!chainup_buffers(dev, req->dst, nbytes, &dst_hook,
++                                      flags, DMA_FROM_DEVICE))
+                       goto free_buf_dest;
+               src_direction = DMA_TO_DEVICE;
++              req_ctx->dst = dst_hook.next;
++              crypt->dst_buf = dst_hook.phys_next;
+       } else {
+               req_ctx->dst = NULL;
+-              req_ctx->dst_nents = 0;
+       }
+-      nents = count_sg(req->src, nbytes);
+-      req_ctx->src_nents = nents;
+-      dma_map_sg(dev, req->src, nents, src_direction);
+-
+-      req_ctx->src = dma_pool_alloc(buffer_pool, flags, &crypt->src_buf);
+-      if (!req_ctx->src)
+-              goto unmap_sg_src;
+-      req_ctx->src->phys_addr = 0;
+-      if (!chainup_buffers(req->src, nbytes, req_ctx->src, flags))
++      req_ctx->src = NULL;
++      if (!chainup_buffers(dev, req->src, nbytes, &src_hook,
++                              flags, src_direction))
+               goto free_buf_src;
++      req_ctx->src = src_hook.next;
++      crypt->src_buf = src_hook.phys_next;
+       crypt->ctl_flags |= CTL_FLAG_PERFORM_ABLK;
+       qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
+       BUG_ON(qmgr_stat_overflow(SEND_QID));
+       return -EINPROGRESS;
+ free_buf_src:
+-      free_buf_chain(req_ctx->src, crypt->src_buf);
+-unmap_sg_src:
+-      dma_unmap_sg(dev, req->src, req_ctx->src_nents, src_direction);
++      free_buf_chain(dev, req_ctx->src, crypt->src_buf);
+ free_buf_dest:
+       if (req->src != req->dst) {
+-              free_buf_chain(req_ctx->dst, crypt->dst_buf);
+-unmap_sg_dest:
+-              dma_unmap_sg(dev, req->src, req_ctx->dst_nents,
+-                      DMA_FROM_DEVICE);
++              free_buf_chain(dev, req_ctx->dst, crypt->dst_buf);
+       }
+       crypt->ctl_flags = CTL_FLAG_UNUSED;
+-      return ret;
++      return -ENOMEM;
+ }
+ static int ablk_encrypt(struct ablkcipher_request *req)
+@@ -983,7 +937,7 @@ static int hmac_inconsistent(struct scatterlist *sg, unsigned start,
+                       break;
+               offset += sg->length;
+-              sg = sg_next(sg);
++              sg = scatterwalk_sg_next(sg);
+       }
+       return (start + nbytes > offset + sg->length);
+ }
+@@ -995,11 +949,10 @@ static int aead_perform(struct aead_request *req, int encrypt,
+       struct ixp_ctx *ctx = crypto_aead_ctx(tfm);
+       unsigned ivsize = crypto_aead_ivsize(tfm);
+       unsigned authsize = crypto_aead_authsize(tfm);
+-      int ret = -ENOMEM;
+       struct ix_sa_dir *dir;
+       struct crypt_ctl *crypt;
+-      unsigned int cryptlen, nents;
+-      struct buffer_desc *buf;
++      unsigned int cryptlen;
++      struct buffer_desc *buf, src_hook;
+       struct aead_ctx *req_ctx = aead_request_ctx(req);
+       gfp_t flags = req->base.flags & CRYPTO_TFM_REQ_MAY_SLEEP ?
+                               GFP_KERNEL : GFP_ATOMIC;
+@@ -1020,7 +973,7 @@ static int aead_perform(struct aead_request *req, int encrypt,
+       }
+       crypt = get_crypt_desc();
+       if (!crypt)
+-              return ret;
++              return -ENOMEM;
+       crypt->data.aead_req = req;
+       crypt->crypto_ctx = dir->npe_ctx_phys;
+@@ -1039,31 +992,27 @@ static int aead_perform(struct aead_request *req, int encrypt,
+               BUG(); /* -ENOTSUP because of my lazyness */
+       }
+-      req_ctx->buffer = dma_pool_alloc(buffer_pool, flags, &crypt->src_buf);
+-      if (!req_ctx->buffer)
+-              goto out;
+-      req_ctx->buffer->phys_addr = 0;
+       /* ASSOC data */
+-      nents = count_sg(req->assoc, req->assoclen);
+-      req_ctx->assoc_nents = nents;
+-      dma_map_sg(dev, req->assoc, nents, DMA_TO_DEVICE);
+-      buf = chainup_buffers(req->assoc, req->assoclen, req_ctx->buffer,flags);
++      buf = chainup_buffers(dev, req->assoc, req->assoclen, &src_hook,
++              flags, DMA_TO_DEVICE);
++      req_ctx->buffer = src_hook.next;
++      crypt->src_buf = src_hook.phys_next;
+       if (!buf)
+-              goto unmap_sg_assoc;
++              goto out;
+       /* IV */
+       sg_init_table(&req_ctx->ivlist, 1);
+       sg_set_buf(&req_ctx->ivlist, iv, ivsize);
+-      dma_map_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL);
+-      buf = chainup_buffers(&req_ctx->ivlist, ivsize, buf, flags);
++      buf = chainup_buffers(dev, &req_ctx->ivlist, ivsize, buf, flags,
++                      DMA_BIDIRECTIONAL);
+       if (!buf)
+-              goto unmap_sg_iv;
++              goto free_chain;
+       if (unlikely(hmac_inconsistent(req->src, cryptlen, authsize))) {
+               /* The 12 hmac bytes are scattered,
+                * we need to copy them into a safe buffer */
+               req_ctx->hmac_virt = dma_pool_alloc(buffer_pool, flags,
+                               &crypt->icv_rev_aes);
+               if (unlikely(!req_ctx->hmac_virt))
+-                      goto unmap_sg_iv;
++                      goto free_chain;
+               if (!encrypt) {
+                       scatterwalk_map_and_copy(req_ctx->hmac_virt,
+                               req->src, cryptlen, authsize, 0);
+@@ -1073,33 +1022,28 @@ static int aead_perform(struct aead_request *req, int encrypt,
+               req_ctx->hmac_virt = NULL;
+       }
+       /* Crypt */
+-      nents = count_sg(req->src, cryptlen + authsize);
+-      req_ctx->src_nents = nents;
+-      dma_map_sg(dev, req->src, nents, DMA_BIDIRECTIONAL);
+-      buf = chainup_buffers(req->src, cryptlen + authsize, buf, flags);
++      buf = chainup_buffers(dev, req->src, cryptlen + authsize, buf, flags,
++                      DMA_BIDIRECTIONAL);
+       if (!buf)
+-              goto unmap_sg_src;
++              goto free_hmac_virt;
+       if (!req_ctx->hmac_virt) {
+               crypt->icv_rev_aes = buf->phys_addr + buf->buf_len - authsize;
+       }
++
+       crypt->ctl_flags |= CTL_FLAG_PERFORM_AEAD;
+       qmgr_put_entry(SEND_QID, crypt_virt2phys(crypt));
+       BUG_ON(qmgr_stat_overflow(SEND_QID));
+       return -EINPROGRESS;
+-unmap_sg_src:
+-      dma_unmap_sg(dev, req->src, req_ctx->src_nents, DMA_BIDIRECTIONAL);
++free_hmac_virt:
+       if (req_ctx->hmac_virt) {
+               dma_pool_free(buffer_pool, req_ctx->hmac_virt,
+                               crypt->icv_rev_aes);
+       }
+-unmap_sg_iv:
+-      dma_unmap_sg(dev, &req_ctx->ivlist, 1, DMA_BIDIRECTIONAL);
+-unmap_sg_assoc:
+-      dma_unmap_sg(dev, req->assoc, req_ctx->assoc_nents, DMA_TO_DEVICE);
+-      free_buf_chain(req_ctx->buffer, crypt->src_buf);
++free_chain:
++      free_buf_chain(dev, req_ctx->buffer, crypt->src_buf);
+ out:
+       crypt->ctl_flags = CTL_FLAG_UNUSED;
+-      return ret;
++      return -ENOMEM;
+ }
+ static int aead_setup(struct crypto_aead *tfm, unsigned int authsize)
+diff --git a/drivers/ide/pci/hpt366.c b/drivers/ide/pci/hpt366.c
+index c37ab17..7e443a3 100644
+--- a/drivers/ide/pci/hpt366.c
++++ b/drivers/ide/pci/hpt366.c
+@@ -114,6 +114,8 @@
+  *   the register setting lists into the table indexed by the clock selected
+  * - set the correct hwif->ultra_mask for each individual chip
+  * - add Ultra and MW DMA mode filtering for the HPT37[24] based SATA cards
++ * - stop resetting HPT370's state machine before each DMA transfer as that has
++ *   caused more harm than good
+  *    Sergei Shtylyov, <sshtylyov@ru.mvista.com> or <source@mvista.com>
+  */
+@@ -134,7 +136,7 @@
+ #define DRV_NAME "hpt366"
+ /* various tuning parameters */
+-#define HPT_RESET_STATE_ENGINE
++#undef        HPT_RESET_STATE_ENGINE
+ #undef        HPT_DELAY_INTERRUPT
+ #define HPT_SERIALIZE_IO      0
+diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
+index 3f11910..fcec2df 100644
+--- a/drivers/isdn/gigaset/bas-gigaset.c
++++ b/drivers/isdn/gigaset/bas-gigaset.c
+@@ -46,6 +46,9 @@ MODULE_PARM_DESC(cidmode, "Call-ID mode");
+ /* length limit according to Siemens 3070usb-protokoll.doc ch. 2.1 */
+ #define IF_WRITEBUF 264
++/* interrupt pipe message size according to ibid. ch. 2.2 */
++#define IP_MSGSIZE 3
++
+ /* Values for the Gigaset 307x */
+ #define USB_GIGA_VENDOR_ID      0x0681
+ #define USB_3070_PRODUCT_ID     0x0001
+@@ -110,7 +113,7 @@ struct bas_cardstate {
+       unsigned char           *rcvbuf;        /* AT reply receive buffer */
+       struct urb              *urb_int_in;    /* URB for interrupt pipe */
+-      unsigned char           int_in_buf[3];
++      unsigned char           *int_in_buf;
+       spinlock_t              lock;           /* locks all following */
+       int                     basstate;       /* bitmap (BS_*) */
+@@ -657,7 +660,7 @@ static void read_int_callback(struct urb *urb)
+       }
+       /* drop incomplete packets even if the missing bytes wouldn't matter */
+-      if (unlikely(urb->actual_length < 3)) {
++      if (unlikely(urb->actual_length < IP_MSGSIZE)) {
+               dev_warn(cs->dev, "incomplete interrupt packet (%d bytes)\n",
+                        urb->actual_length);
+               goto resubmit;
+@@ -2127,6 +2130,7 @@ static void gigaset_reinitbcshw(struct bc_state *bcs)
+ static void gigaset_freecshw(struct cardstate *cs)
+ {
+       /* timers, URBs and rcvbuf are disposed of in disconnect */
++      kfree(cs->hw.bas->int_in_buf);
+       kfree(cs->hw.bas);
+       cs->hw.bas = NULL;
+ }
+@@ -2232,6 +2236,12 @@ static int gigaset_probe(struct usb_interface *interface,
+               }
+               hostif = interface->cur_altsetting;
+       }
++      ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL);
++      if (!ucs->int_in_buf) {
++              kfree(ucs);
++              pr_err("out of memory\n");
++              return 0;
++      }
+       /* Reject application specific interfaces
+        */
+@@ -2290,7 +2300,7 @@ static int gigaset_probe(struct usb_interface *interface,
+       usb_fill_int_urb(ucs->urb_int_in, udev,
+                        usb_rcvintpipe(udev,
+                                       (endpoint->bEndpointAddress) & 0x0f),
+-                       ucs->int_in_buf, 3, read_int_callback, cs,
++                       ucs->int_in_buf, IP_MSGSIZE, read_int_callback, cs,
+                        endpoint->bInterval);
+       if ((rc = usb_submit_urb(ucs->urb_int_in, GFP_KERNEL)) != 0) {
+               dev_err(cs->dev, "could not submit interrupt URB: %s\n",
+diff --git a/drivers/misc/thinkpad_acpi.c b/drivers/misc/thinkpad_acpi.c
+index 34bb0e4..1a551a8 100644
+--- a/drivers/misc/thinkpad_acpi.c
++++ b/drivers/misc/thinkpad_acpi.c
+@@ -282,11 +282,17 @@ static u32 dbg_level;
+ static struct workqueue_struct *tpacpi_wq;
++enum led_status_t {
++      TPACPI_LED_OFF = 0,
++      TPACPI_LED_ON,
++      TPACPI_LED_BLINK,
++};
++
+ /* Special LED class that can defer work */
+ struct tpacpi_led_classdev {
+       struct led_classdev led_classdev;
+       struct work_struct work;
+-      enum led_brightness new_brightness;
++      enum led_status_t new_state;
+       unsigned int led;
+ };
+@@ -3478,7 +3484,7 @@ static void light_set_status_worker(struct work_struct *work)
+                       container_of(work, struct tpacpi_led_classdev, work);
+       if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING))
+-              light_set_status((data->new_brightness != LED_OFF));
++              light_set_status((data->new_state != TPACPI_LED_OFF));
+ }
+ static void light_sysfs_set(struct led_classdev *led_cdev,
+@@ -3488,7 +3494,8 @@ static void light_sysfs_set(struct led_classdev *led_cdev,
+               container_of(led_cdev,
+                            struct tpacpi_led_classdev,
+                            led_classdev);
+-      data->new_brightness = brightness;
++      data->new_state = (brightness != LED_OFF) ?
++                              TPACPI_LED_ON : TPACPI_LED_OFF;
+       queue_work(tpacpi_wq, &data->work);
+ }
+@@ -3995,12 +4002,6 @@ enum {  /* For TPACPI_LED_OLD */
+       TPACPI_LED_EC_HLMS = 0x0e,      /* EC reg to select led to command */
+ };
+-enum led_status_t {
+-      TPACPI_LED_OFF = 0,
+-      TPACPI_LED_ON,
+-      TPACPI_LED_BLINK,
+-};
+-
+ static enum led_access_mode led_supported;
+ TPACPI_HANDLE(led, ec, "SLED",        /* 570 */
+@@ -4094,23 +4095,13 @@ static int led_set_status(const unsigned int led,
+       return rc;
+ }
+-static void led_sysfs_set_status(unsigned int led,
+-                               enum led_brightness brightness)
+-{
+-      led_set_status(led,
+-                      (brightness == LED_OFF) ?
+-                      TPACPI_LED_OFF :
+-                      (tpacpi_led_state_cache[led] == TPACPI_LED_BLINK) ?
+-                              TPACPI_LED_BLINK : TPACPI_LED_ON);
+-}
+-
+ static void led_set_status_worker(struct work_struct *work)
+ {
+       struct tpacpi_led_classdev *data =
+               container_of(work, struct tpacpi_led_classdev, work);
+       if (likely(tpacpi_lifecycle == TPACPI_LIFE_RUNNING))
+-              led_sysfs_set_status(data->led, data->new_brightness);
++              led_set_status(data->led, data->new_state);
+ }
+ static void led_sysfs_set(struct led_classdev *led_cdev,
+@@ -4119,7 +4110,13 @@ static void led_sysfs_set(struct led_classdev *led_cdev,
+       struct tpacpi_led_classdev *data = container_of(led_cdev,
+                            struct tpacpi_led_classdev, led_classdev);
+-      data->new_brightness = brightness;
++      if (brightness == LED_OFF)
++              data->new_state = TPACPI_LED_OFF;
++      else if (tpacpi_led_state_cache[data->led] != TPACPI_LED_BLINK)
++              data->new_state = TPACPI_LED_ON;
++      else
++              data->new_state = TPACPI_LED_BLINK;
++
+       queue_work(tpacpi_wq, &data->work);
+ }
+@@ -4137,7 +4134,7 @@ static int led_sysfs_blink_set(struct led_classdev *led_cdev,
+       } else if ((*delay_on != 500) || (*delay_off != 500))
+               return -EINVAL;
+-      data->new_brightness = TPACPI_LED_BLINK;
++      data->new_state = TPACPI_LED_BLINK;
+       queue_work(tpacpi_wq, &data->work);
+       return 0;
+diff --git a/drivers/net/b44.c b/drivers/net/b44.c
+index c3bda5c..f1521c6 100644
+--- a/drivers/net/b44.c
++++ b/drivers/net/b44.c
+@@ -750,7 +750,7 @@ static void b44_recycle_rx(struct b44 *bp, int src_idx, u32 dest_idx_unmasked)
+                                            dest_idx * sizeof(dest_desc),
+                                            DMA_BIDIRECTIONAL);
+-      ssb_dma_sync_single_for_device(bp->sdev, le32_to_cpu(src_desc->addr),
++      ssb_dma_sync_single_for_device(bp->sdev, dest_map->mapping,
+                                      RX_PKT_BUF_SZ,
+                                      DMA_FROM_DEVICE);
+ }
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index 1b9c4dc..f9f29c9 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -3516,11 +3516,26 @@ static int bond_slave_netdev_event(unsigned long event, struct net_device *slave
+               }
+               break;
+       case NETDEV_CHANGE:
+-              /*
+-               * TODO: is this what we get if somebody
+-               * sets up a hierarchical bond, then rmmod's
+-               * one of the slave bonding devices?
+-               */
++              if (bond->params.mode == BOND_MODE_8023AD || bond_is_lb(bond)) {
++                      struct slave *slave;
++
++                      slave = bond_get_slave_by_dev(bond, slave_dev);
++                      if (slave) {
++                              u16 old_speed = slave->speed;
++                              u16 old_duplex = slave->duplex;
++
++                              bond_update_speed_duplex(slave);
++
++                              if (bond_is_lb(bond))
++                                      break;
++
++                              if (old_speed != slave->speed)
++                                      bond_3ad_adapter_speed_changed(slave);
++                              if (old_duplex != slave->duplex)
++                                      bond_3ad_adapter_duplex_changed(slave);
++                      }
++              }
++
+               break;
+       case NETDEV_DOWN:
+               /*
+diff --git a/drivers/net/bonding/bonding.h b/drivers/net/bonding/bonding.h
+index fb730ec..0f6de5f 100644
+--- a/drivers/net/bonding/bonding.h
++++ b/drivers/net/bonding/bonding.h
+@@ -248,6 +248,12 @@ static inline struct bonding *bond_get_bond_by_slave(struct slave *slave)
+       return (struct bonding *)slave->dev->master->priv;
+ }
++static inline bool bond_is_lb(const struct bonding *bond)
++{
++        return bond->params.mode == BOND_MODE_TLB
++                || bond->params.mode == BOND_MODE_ALB;
++}
++
+ #define BOND_FOM_NONE                 0
+ #define BOND_FOM_ACTIVE                       1
+ #define BOND_FOM_FOLLOW                       2
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 39c17bb..a98d31a 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -375,6 +375,22 @@ enum features {
+       RTL_FEATURE_GMII        = (1 << 2),
+ };
++struct rtl8169_counters {
++      __le64  tx_packets;
++      __le64  rx_packets;
++      __le64  tx_errors;
++      __le32  rx_errors;
++      __le16  rx_missed;
++      __le16  align_errors;
++      __le32  tx_one_collision;
++      __le32  tx_multi_collision;
++      __le64  rx_unicast;
++      __le64  rx_broadcast;
++      __le32  rx_multicast;
++      __le16  tx_aborted;
++      __le16  tx_underun;
++};
++
+ struct rtl8169_private {
+       void __iomem *mmio_addr;        /* memory map physical address */
+       struct pci_dev *pci_dev;        /* Index of PCI device */
+@@ -416,6 +432,7 @@ struct rtl8169_private {
+       unsigned features;
+       struct mii_if_info mii;
++      struct rtl8169_counters counters;
+ };
+ MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
+@@ -960,22 +977,6 @@ static const char rtl8169_gstrings[][ETH_GSTRING_LEN] = {
+       "tx_underrun",
+ };
+-struct rtl8169_counters {
+-      __le64  tx_packets;
+-      __le64  rx_packets;
+-      __le64  tx_errors;
+-      __le32  rx_errors;
+-      __le16  rx_missed;
+-      __le16  align_errors;
+-      __le32  tx_one_collision;
+-      __le32  tx_multi_collision;
+-      __le64  rx_unicast;
+-      __le64  rx_broadcast;
+-      __le32  rx_multicast;
+-      __le16  tx_aborted;
+-      __le16  tx_underun;
+-};
+-
+ static int rtl8169_get_sset_count(struct net_device *dev, int sset)
+ {
+       switch (sset) {
+@@ -986,16 +987,21 @@ static int rtl8169_get_sset_count(struct net_device *dev, int sset)
+       }
+ }
+-static void rtl8169_get_ethtool_stats(struct net_device *dev,
+-                                    struct ethtool_stats *stats, u64 *data)
++static void rtl8169_update_counters(struct net_device *dev)
+ {
+       struct rtl8169_private *tp = netdev_priv(dev);
+       void __iomem *ioaddr = tp->mmio_addr;
+       struct rtl8169_counters *counters;
+       dma_addr_t paddr;
+       u32 cmd;
++      int wait = 1000;
+-      ASSERT_RTNL();
++      /*
++       * Some chips are unable to dump tally counters when the receiver
++       * is disabled.
++       */
++      if ((RTL_R8(ChipCmd) & CmdRxEnb) == 0)
++              return;
+       counters = pci_alloc_consistent(tp->pci_dev, sizeof(*counters), &paddr);
+       if (!counters)
+@@ -1006,31 +1012,45 @@ static void rtl8169_get_ethtool_stats(struct net_device *dev,
+       RTL_W32(CounterAddrLow, cmd);
+       RTL_W32(CounterAddrLow, cmd | CounterDump);
+-      while (RTL_R32(CounterAddrLow) & CounterDump) {
+-              if (msleep_interruptible(1))
++      while (wait--) {
++              if ((RTL_R32(CounterAddrLow) & CounterDump) == 0) {
++                      /* copy updated counters */
++                      memcpy(&tp->counters, counters, sizeof(*counters));
+                       break;
++              }
++              udelay(10);
+       }
+       RTL_W32(CounterAddrLow, 0);
+       RTL_W32(CounterAddrHigh, 0);
+-      data[0] = le64_to_cpu(counters->tx_packets);
+-      data[1] = le64_to_cpu(counters->rx_packets);
+-      data[2] = le64_to_cpu(counters->tx_errors);
+-      data[3] = le32_to_cpu(counters->rx_errors);
+-      data[4] = le16_to_cpu(counters->rx_missed);
+-      data[5] = le16_to_cpu(counters->align_errors);
+-      data[6] = le32_to_cpu(counters->tx_one_collision);
+-      data[7] = le32_to_cpu(counters->tx_multi_collision);
+-      data[8] = le64_to_cpu(counters->rx_unicast);
+-      data[9] = le64_to_cpu(counters->rx_broadcast);
+-      data[10] = le32_to_cpu(counters->rx_multicast);
+-      data[11] = le16_to_cpu(counters->tx_aborted);
+-      data[12] = le16_to_cpu(counters->tx_underun);
+-
+       pci_free_consistent(tp->pci_dev, sizeof(*counters), counters, paddr);
+ }
++static void rtl8169_get_ethtool_stats(struct net_device *dev,
++                                    struct ethtool_stats *stats, u64 *data)
++{
++      struct rtl8169_private *tp = netdev_priv(dev);
++
++      ASSERT_RTNL();
++
++      rtl8169_update_counters(dev);
++
++      data[0] = le64_to_cpu(tp->counters.tx_packets);
++      data[1] = le64_to_cpu(tp->counters.rx_packets);
++      data[2] = le64_to_cpu(tp->counters.tx_errors);
++      data[3] = le32_to_cpu(tp->counters.rx_errors);
++      data[4] = le16_to_cpu(tp->counters.rx_missed);
++      data[5] = le16_to_cpu(tp->counters.align_errors);
++      data[6] = le32_to_cpu(tp->counters.tx_one_collision);
++      data[7] = le32_to_cpu(tp->counters.tx_multi_collision);
++      data[8] = le64_to_cpu(tp->counters.rx_unicast);
++      data[9] = le64_to_cpu(tp->counters.rx_broadcast);
++      data[10] = le32_to_cpu(tp->counters.rx_multicast);
++      data[11] = le16_to_cpu(tp->counters.tx_aborted);
++      data[12] = le16_to_cpu(tp->counters.tx_underun);
++}
++
+ static void rtl8169_get_strings(struct net_device *dev, u32 stringset, u8 *data)
+ {
+       switch(stringset) {
+@@ -1667,8 +1687,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+               goto err_out_free_res_4;
+       }
+-      /* Unneeded ? Don't mess with Mrs. Murphy. */
+-      rtl8169_irq_mask_and_ack(ioaddr);
++      RTL_W16(IntrMask, 0x0000);
+       /* Soft reset the chip. */
+       RTL_W8(ChipCmd, CmdReset);
+@@ -1680,6 +1699,8 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+               msleep_interruptible(1);
+       }
++      RTL_W16(IntrStatus, 0xffff);
++
+       /* Identify chip attached to board */
+       rtl8169_get_mac_version(tp, ioaddr);
+@@ -2529,13 +2550,6 @@ static int rtl8169_start_xmit(struct sk_buff *skb, struct net_device *dev)
+               opts1 |= FirstFrag;
+       } else {
+               len = skb->len;
+-
+-              if (unlikely(len < ETH_ZLEN)) {
+-                      if (skb_padto(skb, ETH_ZLEN))
+-                              goto err_update_stats;
+-                      len = ETH_ZLEN;
+-              }
+-
+               opts1 |= FirstFrag | LastFrag;
+               tp->tx_skb[entry].skb = skb;
+       }
+@@ -2573,7 +2587,6 @@ out:
+ err_stop:
+       netif_stop_queue(dev);
+       ret = NETDEV_TX_BUSY;
+-err_update_stats:
+       dev->stats.tx_dropped++;
+       goto out;
+ }
+@@ -2979,6 +2992,9 @@ static int rtl8169_close(struct net_device *dev)
+       struct rtl8169_private *tp = netdev_priv(dev);
+       struct pci_dev *pdev = tp->pci_dev;
++      /* update counters before going down */
++      rtl8169_update_counters(dev);
++
+       rtl8169_down(dev);
+       free_irq(dev->irq, dev);
+diff --git a/drivers/net/wireless/ath9k/ath9k.h b/drivers/net/wireless/ath9k/ath9k.h
+index d1b0fba..8ccf374 100644
+--- a/drivers/net/wireless/ath9k/ath9k.h
++++ b/drivers/net/wireless/ath9k/ath9k.h
+@@ -591,8 +591,8 @@ struct ath9k_country_entry {
+       u8 iso[3];
+ };
+-#define REG_WRITE(_ah, _reg, _val) iowrite32(_val, _ah->ah_sh + _reg)
+-#define REG_READ(_ah, _reg) ioread32(_ah->ah_sh + _reg)
++#define REG_WRITE(_ah, _reg, _val) ath9k_iowrite32((_ah), (_reg), (_val))
++#define REG_READ(_ah, _reg) ath9k_ioread32((_ah), (_reg))
+ #define SM(_v, _f)  (((_v) << _f##_S) & _f)
+ #define MS(_v, _f)  (((_v) & _f) >> _f##_S)
+diff --git a/drivers/net/wireless/ath9k/core.c b/drivers/net/wireless/ath9k/core.c
+index 87e37bc..e50ba6d 100644
+--- a/drivers/net/wireless/ath9k/core.c
++++ b/drivers/net/wireless/ath9k/core.c
+@@ -1120,6 +1120,7 @@ int ath_init(u16 devid, struct ath_softc *sc)
+       sc->sc_cachelsz = csz << 2;     /* convert to bytes */
+       spin_lock_init(&sc->sc_resetlock);
++      spin_lock_init(&sc->sc_serial_rw);
+       ah = ath9k_hw_attach(devid, sc, sc->mem, &status);
+       if (ah == NULL) {
+diff --git a/drivers/net/wireless/ath9k/core.h b/drivers/net/wireless/ath9k/core.h
+index 88f4cc3..51ef315 100644
+--- a/drivers/net/wireless/ath9k/core.h
++++ b/drivers/net/wireless/ath9k/core.h
+@@ -1022,6 +1022,7 @@ struct ath_softc {
+       spinlock_t sc_rxbuflock;
+       spinlock_t sc_txbuflock;
+       spinlock_t sc_resetlock;
++      spinlock_t sc_serial_rw;
+       spinlock_t node_lock;
+ };
+@@ -1069,4 +1070,36 @@ void ath_skb_unmap_single(struct ath_softc *sc,
+ void ath_mcast_merge(struct ath_softc *sc, u32 mfilt[2]);
+ enum ath9k_ht_macmode ath_cwm_macmode(struct ath_softc *sc);
++/*
++ * Read and write, they both share the same lock. We do this to serialize
++ * reads and writes on Atheros 802.11n PCI devices only. This is required
++ * as the FIFO on these devices can only accept sanely 2 requests. After
++ * that the device goes bananas. Serializing the reads/writes prevents this
++ * from happening.
++ */
++
++static inline void ath9k_iowrite32(struct ath_hal *ah, u32 reg_offset, u32 val)
++{
++      if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
++              unsigned long flags;
++              spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
++              iowrite32(val, ah->ah_sc->mem + reg_offset);
++              spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
++      } else
++              iowrite32(val, ah->ah_sc->mem + reg_offset);
++}
++
++static inline unsigned int ath9k_ioread32(struct ath_hal *ah, u32 reg_offset)
++{
++      u32 val;
++      if (ah->ah_config.serialize_regmode == SER_REG_MODE_ON) {
++              unsigned long flags;
++              spin_lock_irqsave(&ah->ah_sc->sc_serial_rw, flags);
++              val = ioread32(ah->ah_sc->mem + reg_offset);
++              spin_unlock_irqrestore(&ah->ah_sc->sc_serial_rw, flags);
++      } else
++              val = ioread32(ah->ah_sc->mem + reg_offset);
++      return val;
++}
++
+ #endif /* CORE_H */
+diff --git a/drivers/net/wireless/ath9k/hw.c b/drivers/net/wireless/ath9k/hw.c
+index 69120b5..c40b677 100644
+--- a/drivers/net/wireless/ath9k/hw.c
++++ b/drivers/net/wireless/ath9k/hw.c
+@@ -369,6 +369,25 @@ static void ath9k_hw_set_defaults(struct ath_hal *ah)
+       }
+       ah->ah_config.intr_mitigation = 0;
++
++      /*
++       * We need this for PCI devices only (Cardbus, PCI, miniPCI)
++       * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
++       * This means we use it for all AR5416 devices, and the few
++       * minor PCI AR9280 devices out there.
++       *
++       * Serialization is required because these devices do not handle
++       * well the case of two concurrent reads/writes due to the latency
++       * involved. During one read/write another read/write can be issued
++       * on another CPU while the previous read/write may still be working
++       * on our hardware, if we hit this case the hardware poops in a loop.
++       * We prevent this by serializing reads and writes.
++       *
++       * This issue is not present on PCI-Express devices or pre-AR5416
++       * devices (legacy, 802.11abg).
++       */
++       if (num_possible_cpus() > 1)
++               ah->ah_config.serialize_regmode = SER_REG_MODE_AUTO;
+ }
+ static inline void ath9k_hw_override_ini(struct ath_hal *ah,
+@@ -3294,7 +3313,8 @@ static struct ath_hal *ath9k_hw_do_attach(u16 devid,
+       }
+       if (ah->ah_config.serialize_regmode == SER_REG_MODE_AUTO) {
+-              if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI) {
++              if (ah->ah_macVersion == AR_SREV_VERSION_5416_PCI ||
++                  (AR_SREV_9280(ah) && !ah->ah_isPciExpress)) {
+                       ah->ah_config.serialize_regmode =
+                               SER_REG_MODE_ON;
+               } else {
+diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c
+index 9dda816..4102aaa 100644
+--- a/drivers/net/wireless/b43/xmit.c
++++ b/drivers/net/wireless/b43/xmit.c
+@@ -51,7 +51,7 @@ static int b43_plcp_get_bitrate_idx_cck(struct b43_plcp_hdr6 *plcp)
+ }
+ /* Extract the bitrate index out of an OFDM PLCP header. */
+-static u8 b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy)
++static int b43_plcp_get_bitrate_idx_ofdm(struct b43_plcp_hdr6 *plcp, bool aphy)
+ {
+       int base = aphy ? 0 : 4;
+diff --git a/drivers/scsi/libiscsi.c b/drivers/scsi/libiscsi.c
+index 55ac5c3..cb009f3 100644
+--- a/drivers/scsi/libiscsi.c
++++ b/drivers/scsi/libiscsi.c
+@@ -1807,12 +1807,14 @@ iscsi_pool_init(struct iscsi_pool *q, int max, void ***items, int item_size)
+               num_arrays++;
+       q->pool = kzalloc(num_arrays * max * sizeof(void*), GFP_KERNEL);
+       if (q->pool == NULL)
+-              goto enomem;
++              return -ENOMEM;
+       q->queue = kfifo_init((void*)q->pool, max * sizeof(void*),
+                             GFP_KERNEL, NULL);
+-      if (q->queue == ERR_PTR(-ENOMEM))
++      if (IS_ERR(q->queue)) {
++              q->queue = NULL;
+               goto enomem;
++      }
+       for (i = 0; i < max; i++) {
+               q->pool[i] = kzalloc(item_size, GFP_KERNEL);
+@@ -1842,8 +1844,7 @@ void iscsi_pool_free(struct iscsi_pool *q)
+       for (i = 0; i < q->max; i++)
+               kfree(q->pool[i]);
+-      if (q->pool)
+-              kfree(q->pool);
++      kfree(q->pool);
+       kfree(q->queue);
+ }
+ EXPORT_SYMBOL_GPL(iscsi_pool_free);
+diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
+index 023a4e9..abbdb31 100644
+--- a/drivers/usb/class/cdc-wdm.c
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -641,7 +641,7 @@ next_desc:
+       iface = &intf->altsetting[0];
+       ep = &iface->endpoint[0].desc;
+-      if (!usb_endpoint_is_int_in(ep)) {
++      if (!ep || !usb_endpoint_is_int_in(ep)) {
+               rv = -EINVAL;
+               goto err;
+       }
+diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
+index 3a8bb53..fd7b356 100644
+--- a/drivers/usb/gadget/f_rndis.c
++++ b/drivers/usb/gadget/f_rndis.c
+@@ -437,7 +437,7 @@ invalid:
+               DBG(cdev, "rndis req%02x.%02x v%04x i%04x l%d\n",
+                       ctrl->bRequestType, ctrl->bRequest,
+                       w_value, w_index, w_length);
+-              req->zero = 0;
++              req->zero = (value < w_length);
+               req->length = value;
+               value = usb_ep_queue(cdev->gadget->ep0, req, GFP_ATOMIC);
+               if (value < 0)
+diff --git a/drivers/usb/gadget/u_ether.c b/drivers/usb/gadget/u_ether.c
+index 38a55af..bb3d7c3 100644
+--- a/drivers/usb/gadget/u_ether.c
++++ b/drivers/usb/gadget/u_ether.c
+@@ -175,12 +175,6 @@ static void eth_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *p)
+       strlcpy(p->bus_info, dev_name(&dev->gadget->dev), sizeof p->bus_info);
+ }
+-static u32 eth_get_link(struct net_device *net)
+-{
+-      struct eth_dev  *dev = netdev_priv(net);
+-      return dev->gadget->speed != USB_SPEED_UNKNOWN;
+-}
+-
+ /* REVISIT can also support:
+  *   - WOL (by tracking suspends and issuing remote wakeup)
+  *   - msglevel (implies updated messaging)
+@@ -189,7 +183,7 @@ static u32 eth_get_link(struct net_device *net)
+ static struct ethtool_ops ops = {
+       .get_drvinfo = eth_get_drvinfo,
+-      .get_link = eth_get_link
++      .get_link = ethtool_op_get_link,
+ };
+ static void defer_kevent(struct eth_dev *dev, int flag)
+diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c
+index ecc9b66..01132ac 100644
+--- a/drivers/usb/host/ehci-q.c
++++ b/drivers/usb/host/ehci-q.c
+@@ -333,12 +333,40 @@ qh_completions (struct ehci_hcd *ehci, struct ehci_qh *qh)
+               token = hc32_to_cpu(ehci, qtd->hw_token);
+               /* always clean up qtds the hc de-activated */
++ retry_xacterr:
+               if ((token & QTD_STS_ACTIVE) == 0) {
+                       /* on STALL, error, and short reads this urb must
+                        * complete and all its qtds must be recycled.
+                        */
+                       if ((token & QTD_STS_HALT) != 0) {
++
++                              /* retry transaction errors until we
++                               * reach the software xacterr limit
++                               */
++                              if ((token & QTD_STS_XACT) &&
++                                              QTD_CERR(token) == 0 &&
++                                              --qh->xacterrs > 0 &&
++                                              !urb->unlinked) {
++                                      ehci_dbg(ehci,
++      "detected XactErr len %d/%d retry %d\n",
++      qtd->length - QTD_LENGTH(token), qtd->length,
++      QH_XACTERR_MAX - qh->xacterrs);
++
++                                      /* reset the token in the qtd and the
++                                       * qh overlay (which still contains
++                                       * the qtd) so that we pick up from
++                                       * where we left off
++                                       */
++                                      token &= ~QTD_STS_HALT;
++                                      token |= QTD_STS_ACTIVE |
++                                                      (EHCI_TUNE_CERR << 10);
++                                      qtd->hw_token = cpu_to_hc32(ehci,
++                                                      token);
++                                      wmb();
++                                      qh->hw_token = cpu_to_hc32(ehci, token);
++                                      goto retry_xacterr;
++                              }
+                               stopped = 1;
+                       /* magic dummy for some short reads; qh won't advance.
+@@ -421,6 +449,9 @@ halt:
+               /* remove qtd; it's recycled after possible urb completion */
+               list_del (&qtd->qtd_list);
+               last = qtd;
++
++              /* reinit the xacterr counter for the next qtd */
++              qh->xacterrs = QH_XACTERR_MAX;
+       }
+       /* last urb's completion might still need calling */
+@@ -862,6 +893,7 @@ static void qh_link_async (struct ehci_hcd *ehci, struct ehci_qh *qh)
+       head->qh_next.qh = qh;
+       head->hw_next = dma;
++      qh->xacterrs = QH_XACTERR_MAX;
+       qh->qh_state = QH_STATE_LINKED;
+       /* qtd completions reported later by interrupt */
+ }
+diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h
+index 33459d7..c165fe4 100644
+--- a/drivers/usb/host/ehci.h
++++ b/drivers/usb/host/ehci.h
+@@ -500,6 +500,9 @@ struct ehci_qh {
+ #define       QH_STATE_UNLINK_WAIT    4               /* LINKED and on reclaim q */
+ #define       QH_STATE_COMPLETING     5               /* don't touch token.HALT */
++      u8                      xacterrs;       /* XactErr retry counter */
++#define       QH_XACTERR_MAX          32              /* XactErr retry limit */
++
+       /* periodic schedule info */
+       u8                      usecs;          /* intr bandwidth */
+       u8                      gap_uf;         /* uframes split/csplit gap */
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 2d78712..13b34bc 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -662,6 +662,7 @@ static struct usb_device_id id_table_combined [] = {
+       { USB_DEVICE(DE_VID, WHT_PID) },
+       { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
+               .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
++      { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
+       { },                                    /* Optional parameter entry */
+       { }                                     /* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 80fa76e..3425122 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -890,6 +890,13 @@
+ #define ADI_GNICE_PID                 0xF000
+ /*
++ * JETI SPECTROMETER SPECBOS 1201
++ * http://www.jeti.com/products/sys/scb/scb1201.php
++ */
++#define JETI_VID              0x0c6c
++#define JETI_SPC1201_PID      0x04b2
++
++/*
+  *   BmRequestType:  1100 0000b
+  *   bRequest:       FTDI_E2_READ
+  *   wValue:         0
+diff --git a/drivers/usb/storage/cypress_atacb.c b/drivers/usb/storage/cypress_atacb.c
+index 898e67d..9466a99 100644
+--- a/drivers/usb/storage/cypress_atacb.c
++++ b/drivers/usb/storage/cypress_atacb.c
+@@ -133,19 +133,18 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
+               /* build the command for
+                * reading the ATA registers */
+-              scsi_eh_prep_cmnd(srb, &ses, NULL, 0, 0);
+-              srb->sdb.length = sizeof(regs);
+-              sg_init_one(&ses.sense_sgl, regs, srb->sdb.length);
+-              srb->sdb.table.sgl = &ses.sense_sgl;
+-              srb->sc_data_direction = DMA_FROM_DEVICE;
+-              srb->sdb.table.nents = 1;
++              scsi_eh_prep_cmnd(srb, &ses, NULL, 0, sizeof(regs));
++
+               /* we use the same command as before, but we set
+                * the read taskfile bit, for not executing atacb command,
+                * but reading register selected in srb->cmnd[4]
+                */
++              srb->cmd_len = 16;
++              srb->cmnd = ses.cmnd;
+               srb->cmnd[2] = 1;
+               usb_stor_transparent_scsi_command(srb, us);
++              memcpy(regs, srb->sense_buffer, sizeof(regs));
+               tmp_result = srb->result;
+               scsi_eh_restore_cmnd(srb, &ses);
+               /* we fail to get registers, report invalid command */
+@@ -162,8 +161,8 @@ void cypress_atacb_passthrough(struct scsi_cmnd *srb, struct us_data *us)
+               /* XXX we should generate sk, asc, ascq from status and error
+                * regs
+-               * (see 11.1 Error translation ­ ATA device error to SCSI error map)
+-               * and ata_to_sense_error from libata.
++               * (see 11.1 Error translation ATA device error to SCSI error
++               *  map, and ata_to_sense_error from libata.)
+                */
+               /* Sense data is current and format is descriptor. */
+diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
+index 8daaace..5f484ae 100644
+--- a/drivers/usb/storage/scsiglue.c
++++ b/drivers/usb/storage/scsiglue.c
+@@ -135,6 +135,12 @@ static int slave_configure(struct scsi_device *sdev)
+               if (sdev->request_queue->max_sectors > max_sectors)
+                       blk_queue_max_sectors(sdev->request_queue,
+                                             max_sectors);
++      } else if (sdev->type == TYPE_TAPE) {
++              /* Tapes need much higher max_sector limits, so just
++               * raise it to the maximum possible (4 GB / 512) and
++               * let the queue segment size sort out the real limit.
++               */
++              blk_queue_max_sectors(sdev->request_queue, 0x7FFFFF);
+       }
+       /* We can't put these settings in slave_alloc() because that gets
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index d21995a..4cf1617 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1241,12 +1241,14 @@ UNUSUAL_DEV(  0x07c4, 0xa400, 0x0000, 0xffff,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_INQUIRY ),
+-/* Reported by Rauch Wolke <rauchwolke@gmx.net> */
++/* Reported by Rauch Wolke <rauchwolke@gmx.net>
++ * and augmented by binbin <binbinsh@gmail.com> (Bugzilla #12882)
++ */
+ UNUSUAL_DEV(  0x07c4, 0xa4a5, 0x0000, 0xffff,
+               "Simple Tech/Datafab",
+               "CF+SM Reader",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+-              US_FL_IGNORE_RESIDUE ),
++              US_FL_IGNORE_RESIDUE | US_FL_MAX_SECTORS_64 ),
+ /* Casio QV 2x00/3x00/4000/8000 digital still cameras are not conformant
+  * to the USB storage specification in two ways:
+diff --git a/fs/buffer.c b/fs/buffer.c
+index a542f97..a5d806d 100644
+--- a/fs/buffer.c
++++ b/fs/buffer.c
+@@ -3042,7 +3042,7 @@ int sync_dirty_buffer(struct buffer_head *bh)
+       if (test_clear_buffer_dirty(bh)) {
+               get_bh(bh);
+               bh->b_end_io = end_buffer_write_sync;
+-              ret = submit_bh(WRITE_SYNC, bh);
++              ret = submit_bh(WRITE, bh);
+               wait_on_buffer(bh);
+               if (buffer_eopnotsupp(bh)) {
+                       clear_buffer_eopnotsupp(bh);
+diff --git a/fs/cifs/CHANGES b/fs/cifs/CHANGES
+index 088e9ae..455257e 100644
+--- a/fs/cifs/CHANGES
++++ b/fs/cifs/CHANGES
+@@ -1,4 +1,7 @@
+ Fix oops in cifs_dfs_ref.c when prefixpath is not reachable when using DFS.
++Fix "redzone overwritten" bug in cifs_put_tcon (CIFSTcon may allocate too
++little memory for the "nativeFileSystem" field returned by the server
++during mount).
+ Version 1.54
+ ------------
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 8f0f86d..9231e0a 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -2348,8 +2348,10 @@ winCreateHardLinkRetry:
+                                    PATH_MAX, nls_codepage, remap);
+               name_len++;     /* trailing null */
+               name_len *= 2;
+-              pSMB->OldFileName[name_len] = 0;        /* pad */
+-              pSMB->OldFileName[name_len + 1] = 0x04;
++
++              /* protocol specifies ASCII buffer format (0x04) for unicode */
++              pSMB->OldFileName[name_len] = 0x04;
++              pSMB->OldFileName[name_len + 1] = 0x00; /* pad */
+               name_len2 =
+                   cifsConvertToUCS((__le16 *)&pSMB->OldFileName[name_len + 2],
+                                    toName, PATH_MAX, nls_codepage, remap);
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index f254235..21a1abf 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -3549,7 +3549,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
+                           BCC(smb_buffer_response)) {
+                               kfree(tcon->nativeFileSystem);
+                               tcon->nativeFileSystem =
+-                                  kzalloc(length + 2, GFP_KERNEL);
++                                  kzalloc(2*(length + 1), GFP_KERNEL);
+                               if (tcon->nativeFileSystem)
+                                       cifs_strfromUCS_le(
+                                               tcon->nativeFileSystem,
+diff --git a/fs/compat.c b/fs/compat.c
+index a76455b..a53216d 100644
+--- a/fs/compat.c
++++ b/fs/compat.c
+@@ -1353,12 +1353,17 @@ int compat_do_execve(char * filename,
+ {
+       struct linux_binprm *bprm;
+       struct file *file;
++      struct files_struct *displaced;
+       int retval;
++      retval = unshare_files(&displaced);
++      if (retval)
++              goto out_ret;
++
+       retval = -ENOMEM;
+       bprm = kzalloc(sizeof(*bprm), GFP_KERNEL);
+       if (!bprm)
+-              goto out_ret;
++              goto out_files;
+       file = open_exec(filename);
+       retval = PTR_ERR(file);
+@@ -1410,6 +1415,8 @@ int compat_do_execve(char * filename,
+               security_bprm_free(bprm);
+               acct_update_integrals(current);
+               free_bprm(bprm);
++              if (displaced)
++                      put_files_struct(displaced);
+               return retval;
+       }
+@@ -1430,6 +1437,9 @@ out_file:
+ out_kfree:
+       free_bprm(bprm);
++out_files:
++      if (displaced)
++              reset_files_struct(displaced);
+ out_ret:
+       return retval;
+ }
+diff --git a/fs/dquot.c b/fs/dquot.c
+index 8ec4d6c..150fc96 100644
+--- a/fs/dquot.c
++++ b/fs/dquot.c
+@@ -726,7 +726,7 @@ static void add_dquot_ref(struct super_block *sb, int type)
+                       continue;
+               if (!dqinit_needed(inode, type))
+                       continue;
+-              if (inode->i_state & (I_FREEING|I_WILL_FREE))
++              if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE))
+                       continue;
+               __iget(inode);
+diff --git a/fs/drop_caches.c b/fs/drop_caches.c
+index 3e5637f..f7e66c0 100644
+--- a/fs/drop_caches.c
++++ b/fs/drop_caches.c
+@@ -18,7 +18,7 @@ static void drop_pagecache_sb(struct super_block *sb)
+       spin_lock(&inode_lock);
+       list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+-              if (inode->i_state & (I_FREEING|I_WILL_FREE))
++              if (inode->i_state & (I_FREEING|I_CLEAR|I_WILL_FREE))
+                       continue;
+               if (inode->i_mapping->nrpages == 0)
+                       continue;
+diff --git a/fs/exec.c b/fs/exec.c
+index 5027d01..5ec0f56 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1089,9 +1089,7 @@ static int unsafe_exec(struct task_struct *p)
+ {
+       int unsafe = tracehook_unsafe_exec(p);
+-      if (atomic_read(&p->fs->count) > 1 ||
+-          atomic_read(&p->files->count) > 1 ||
+-          atomic_read(&p->sighand->count) > 1)
++      if (atomic_read(&p->fs->count) > 1)
+               unsafe |= LSM_UNSAFE_SHARE;
+       return unsafe;
+diff --git a/fs/fs-writeback.c b/fs/fs-writeback.c
+index 6caa023..6b60261 100644
+--- a/fs/fs-writeback.c
++++ b/fs/fs-writeback.c
+@@ -538,7 +538,8 @@ void generic_sync_sb_inodes(struct super_block *sb,
+               list_for_each_entry(inode, &sb->s_inodes, i_sb_list) {
+                       struct address_space *mapping;
+-                      if (inode->i_state & (I_FREEING|I_WILL_FREE|I_NEW))
++                      if (inode->i_state &
++                                      (I_FREEING|I_CLEAR|I_WILL_FREE|I_NEW))
+                               continue;
+                       mapping = inode->i_mapping;
+                       if (mapping->nrpages == 0)
+diff --git a/fs/hugetlbfs/inode.c b/fs/hugetlbfs/inode.c
+index 3f58923..a12a6b3 100644
+--- a/fs/hugetlbfs/inode.c
++++ b/fs/hugetlbfs/inode.c
+@@ -26,7 +26,6 @@
+ #include <linux/pagevec.h>
+ #include <linux/parser.h>
+ #include <linux/mman.h>
+-#include <linux/quotaops.h>
+ #include <linux/slab.h>
+ #include <linux/dnotify.h>
+ #include <linux/statfs.h>
+@@ -838,7 +837,7 @@ hugetlbfs_parse_options(char *options, struct hugetlbfs_config *pconfig)
+ bad_val:
+       printk(KERN_ERR "hugetlbfs: Bad value '%s' for mount option '%s'\n",
+              args[0].from, p);
+-      return 1;
++      return -EINVAL;
+ }
+ static int
+diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
+index ec2ed15..6f7ea0a 100644
+--- a/fs/ocfs2/file.c
++++ b/fs/ocfs2/file.c
+@@ -2089,7 +2089,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
+                  out->f_path.dentry->d_name.len,
+                  out->f_path.dentry->d_name.name);
+-      inode_double_lock(inode, pipe->inode);
++      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+       ret = ocfs2_rw_lock(inode, 1);
+       if (ret < 0) {
+@@ -2104,12 +2104,16 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
+               goto out_unlock;
+       }
++      if (pipe->inode)
++              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
+       ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags);
++      if (pipe->inode)
++              mutex_unlock(&pipe->inode->i_mutex);
+ out_unlock:
+       ocfs2_rw_unlock(inode, 1);
+ out:
+-      inode_double_unlock(inode, pipe->inode);
++      mutex_unlock(&inode->i_mutex);
+       mlog_exit(ret);
+       return ret;
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index a28840b..0e910b3 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -151,15 +151,22 @@ static unsigned int pid_entry_count_dirs(const struct pid_entry *entries,
+ int maps_protect;
+ EXPORT_SYMBOL(maps_protect);
+-static struct fs_struct *get_fs_struct(struct task_struct *task)
++static int get_fs_path(struct task_struct *task, struct path *path, bool root)
+ {
+       struct fs_struct *fs;
++      int result = -ENOENT;
++
+       task_lock(task);
+       fs = task->fs;
+-      if(fs)
+-              atomic_inc(&fs->count);
++      if (fs) {
++              read_lock(&fs->lock);
++              *path = root ? fs->root : fs->pwd;
++              path_get(path);
++              read_unlock(&fs->lock);
++              result = 0;
++      }
+       task_unlock(task);
+-      return fs;
++      return result;
+ }
+ static int get_nr_threads(struct task_struct *tsk)
+@@ -178,42 +185,24 @@ static int get_nr_threads(struct task_struct *tsk)
+ static int proc_cwd_link(struct inode *inode, struct path *path)
+ {
+       struct task_struct *task = get_proc_task(inode);
+-      struct fs_struct *fs = NULL;
+       int result = -ENOENT;
+       if (task) {
+-              fs = get_fs_struct(task);
++              result = get_fs_path(task, path, 0);
+               put_task_struct(task);
+       }
+-      if (fs) {
+-              read_lock(&fs->lock);
+-              *path = fs->pwd;
+-              path_get(&fs->pwd);
+-              read_unlock(&fs->lock);
+-              result = 0;
+-              put_fs_struct(fs);
+-      }
+       return result;
+ }
+ static int proc_root_link(struct inode *inode, struct path *path)
+ {
+       struct task_struct *task = get_proc_task(inode);
+-      struct fs_struct *fs = NULL;
+       int result = -ENOENT;
+       if (task) {
+-              fs = get_fs_struct(task);
++              result = get_fs_path(task, path, 1);
+               put_task_struct(task);
+       }
+-      if (fs) {
+-              read_lock(&fs->lock);
+-              *path = fs->root;
+-              path_get(&fs->root);
+-              read_unlock(&fs->lock);
+-              result = 0;
+-              put_fs_struct(fs);
+-      }
+       return result;
+ }
+@@ -575,7 +564,6 @@ static int mounts_open_common(struct inode *inode, struct file *file,
+       struct task_struct *task = get_proc_task(inode);
+       struct nsproxy *nsp;
+       struct mnt_namespace *ns = NULL;
+-      struct fs_struct *fs = NULL;
+       struct path root;
+       struct proc_mounts *p;
+       int ret = -EINVAL;
+@@ -589,22 +577,16 @@ static int mounts_open_common(struct inode *inode, struct file *file,
+                               get_mnt_ns(ns);
+               }
+               rcu_read_unlock();
+-              if (ns)
+-                      fs = get_fs_struct(task);
++              if (ns && get_fs_path(task, &root, 1) == 0)
++                      ret = 0;
+               put_task_struct(task);
+       }
+       if (!ns)
+               goto err;
+-      if (!fs)
++      if (ret)
+               goto err_put_ns;
+-      read_lock(&fs->lock);
+-      root = fs->root;
+-      path_get(&root);
+-      read_unlock(&fs->lock);
+-      put_fs_struct(fs);
+-
+       ret = -ENOMEM;
+       p = kmalloc(sizeof(struct proc_mounts), GFP_KERNEL);
+       if (!p)
+diff --git a/fs/splice.c b/fs/splice.c
+index 6d310c7..aea1eb4 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -735,10 +735,19 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
+        * ->commit_write. Most of the time, these expect i_mutex to
+        * be held. Since this may result in an ABBA deadlock with
+        * pipe->inode, we have to order lock acquiry here.
++       *
++       * Outer lock must be inode->i_mutex, as pipe_wait() will
++       * release and reacquire pipe->inode->i_mutex, AND inode must
++       * never be a pipe.
+        */
+-      inode_double_lock(inode, pipe->inode);
++      WARN_ON(S_ISFIFO(inode->i_mode));
++      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
++      if (pipe->inode)
++              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
+       ret = __splice_from_pipe(pipe, &sd, actor);
+-      inode_double_unlock(inode, pipe->inode);
++      if (pipe->inode)
++              mutex_unlock(&pipe->inode->i_mutex);
++      mutex_unlock(&inode->i_mutex);
+       return ret;
+ }
+@@ -829,11 +838,17 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
+       };
+       ssize_t ret;
+-      inode_double_lock(inode, pipe->inode);
++      WARN_ON(S_ISFIFO(inode->i_mode));
++      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+       ret = file_remove_suid(out);
+-      if (likely(!ret))
++      if (likely(!ret)) {
++              if (pipe->inode)
++                      mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
+               ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
+-      inode_double_unlock(inode, pipe->inode);
++              if (pipe->inode)
++                      mutex_unlock(&pipe->inode->i_mutex);
++      }
++      mutex_unlock(&inode->i_mutex);
+       if (ret > 0) {
+               unsigned long nr_pages;
+diff --git a/include/linux/capability.h b/include/linux/capability.h
+index 28863f4..dc09ff6 100644
+--- a/include/linux/capability.h
++++ b/include/linux/capability.h
+@@ -366,7 +366,21 @@ typedef struct kernel_cap_struct {
+ #define CAP_FOR_EACH_U32(__capi)  \
+       for (__capi = 0; __capi < _KERNEL_CAPABILITY_U32S; ++__capi)
++/*
++ * CAP_FS_MASK and CAP_NFSD_MASKS:
++ *
++ * The fs mask is all the privileges that fsuid==0 historically meant.
++ * At one time in the past, that included CAP_MKNOD and CAP_LINUX_IMMUTABLE.
++ *
++ * It has never meant setting security.* and trusted.* xattrs.
++ *
++ * We could also define fsmask as follows:
++ *   1. CAP_FS_MASK is the privilege to bypass all fs-related DAC permissions
++ *   2. The security.* and trusted.* xattrs are fs-related MAC permissions
++ */
++
+ # define CAP_FS_MASK_B0     (CAP_TO_MASK(CAP_CHOWN)           \
++                          | CAP_TO_MASK(CAP_MKNOD)            \
+                           | CAP_TO_MASK(CAP_DAC_OVERRIDE)     \
+                           | CAP_TO_MASK(CAP_DAC_READ_SEARCH)  \
+                           | CAP_TO_MASK(CAP_FOWNER)           \
+@@ -381,11 +395,12 @@ typedef struct kernel_cap_struct {
+ # define CAP_EMPTY_SET    ((kernel_cap_t){{ 0, 0 }})
+ # define CAP_FULL_SET     ((kernel_cap_t){{ ~0, ~0 }})
+ # define CAP_INIT_EFF_SET ((kernel_cap_t){{ ~CAP_TO_MASK(CAP_SETPCAP), ~0 }})
+-# define CAP_FS_SET       ((kernel_cap_t){{ CAP_FS_MASK_B0, CAP_FS_MASK_B1 } })
++# define CAP_FS_SET       ((kernel_cap_t){{ CAP_FS_MASK_B0 \
++                                  | CAP_TO_MASK(CAP_LINUX_IMMUTABLE), \
++                                  CAP_FS_MASK_B1 } })
+ # define CAP_NFSD_SET     ((kernel_cap_t){{ CAP_FS_MASK_B0 \
+-                                          | CAP_TO_MASK(CAP_SYS_RESOURCE) \
+-                                          | CAP_TO_MASK(CAP_MKNOD), \
+-                                          CAP_FS_MASK_B1 } })
++                                  | CAP_TO_MASK(CAP_SYS_RESOURCE), \
++                                  CAP_FS_MASK_B1 } })
+ #endif /* _KERNEL_CAPABILITY_U32S != 2 */
+diff --git a/include/linux/pci_regs.h b/include/linux/pci_regs.h
+index 450684f..f5cd050 100644
+--- a/include/linux/pci_regs.h
++++ b/include/linux/pci_regs.h
+@@ -234,7 +234,7 @@
+ #define  PCI_PM_CAP_PME_SHIFT 11      /* Start of the PME Mask in PMC */
+ #define PCI_PM_CTRL           4       /* PM control and status register */
+ #define  PCI_PM_CTRL_STATE_MASK       0x0003  /* Current power state (D0 to D3) */
+-#define  PCI_PM_CTRL_NO_SOFT_RESET    0x0004  /* No reset for D3hot->D0 */
++#define  PCI_PM_CTRL_NO_SOFT_RESET    0x0008  /* No reset for D3hot->D0 */
+ #define  PCI_PM_CTRL_PME_ENABLE       0x0100  /* PME pin enable */
+ #define  PCI_PM_CTRL_DATA_SEL_MASK    0x1e00  /* Data select (??) */
+ #define  PCI_PM_CTRL_DATA_SCALE_MASK  0x6000  /* Data scale (??) */
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 03e0902..09c5851 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -201,7 +201,8 @@ extern unsigned long long time_sync_thresh;
+ #define task_is_stopped_or_traced(task)       \
+                       ((task->state & (__TASK_STOPPED | __TASK_TRACED)) != 0)
+ #define task_contributes_to_load(task)        \
+-                              ((task->state & TASK_UNINTERRUPTIBLE) != 0)
++                              ((task->state & TASK_UNINTERRUPTIBLE) != 0 && \
++                               (task->flags & PF_FROZEN) == 0)
+ #define __set_task_state(tsk, state_value)            \
+       do { (tsk)->state = (state_value); } while (0)
+diff --git a/kernel/exit.c b/kernel/exit.c
+index 14096a1..8715136 100644
+--- a/kernel/exit.c
++++ b/kernel/exit.c
+@@ -938,8 +938,7 @@ static void exit_notify(struct task_struct *tsk, int group_dead)
+        */
+       if (tsk->exit_signal != SIGCHLD && !task_detached(tsk) &&
+           (tsk->parent_exec_id != tsk->real_parent->self_exec_id ||
+-           tsk->self_exec_id != tsk->parent_exec_id) &&
+-          !capable(CAP_KILL))
++           tsk->self_exec_id != tsk->parent_exec_id))
+               tsk->exit_signal = SIGCHLD;
+       signal = tracehook_notify_death(tsk, &cookie, group_dead);
+diff --git a/kernel/kprobes.c b/kernel/kprobes.c
+index 75bc2cd..0920fa0 100644
+--- a/kernel/kprobes.c
++++ b/kernel/kprobes.c
+@@ -890,10 +890,8 @@ static int __kprobes pre_handler_kretprobe(struct kprobe *p,
+               ri->rp = rp;
+               ri->task = current;
+-              if (rp->entry_handler && rp->entry_handler(ri, regs)) {
+-                      spin_unlock_irqrestore(&rp->lock, flags);
++              if (rp->entry_handler && rp->entry_handler(ri, regs))
+                       return 0;
+-              }
+               arch_prepare_kretprobe(ri, regs);
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 3d161f0..7d0a222 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -1549,7 +1549,15 @@ static void ptrace_stop(int exit_code, int clear_code, siginfo_t *info)
+       read_lock(&tasklist_lock);
+       if (may_ptrace_stop()) {
+               do_notify_parent_cldstop(current, CLD_TRAPPED);
++              /*
++               * Don't want to allow preemption here, because
++               * sys_ptrace() needs this task to be inactive.
++               *
++               * XXX: implement read_unlock_no_resched().
++               */
++              preempt_disable();
+               read_unlock(&tasklist_lock);
++              preempt_enable_no_resched();
+               schedule();
+       } else {
+               /*
+diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c
+index b5167df..e8b2b18 100644
+--- a/mm/filemap_xip.c
++++ b/mm/filemap_xip.c
+@@ -89,8 +89,8 @@ do_xip_mapping_read(struct address_space *mapping,
+                       }
+               }
+               nr = nr - offset;
+-              if (nr > len)
+-                      nr = len;
++              if (nr > len - copied)
++                      nr = len - copied;
+               error = mapping->a_ops->get_xip_mem(mapping, index, 0,
+                                                       &xip_mem, &xip_pfn);
+diff --git a/mm/mmap.c b/mm/mmap.c
+index ca12a93..2ae093e 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -2068,6 +2068,9 @@ void exit_mmap(struct mm_struct *mm)
+       arch_exit_mmap(mm);
+       mmu_notifier_release(mm);
++      if (!mm->mmap)  /* Can happen if dup_mmap() received an OOM */
++              return;
++
+       lru_add_drain();
+       flush_cache_mm(mm);
+       tlb = tlb_gather_mmu(mm, 1);
+diff --git a/net/bridge/br_if.c b/net/bridge/br_if.c
+index 63c18aa..2043c8e 100644
+--- a/net/bridge/br_if.c
++++ b/net/bridge/br_if.c
+@@ -419,7 +419,6 @@ err2:
+ err1:
+       kobject_del(&p->kobj);
+ err0:
+-      kobject_put(&p->kobj);
+       dev_set_promiscuity(dev, -1);
+ put_back:
+       dev_put(dev);
+diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c
+index 03e83a6..6671485 100644
+--- a/net/ipv4/netfilter/arp_tables.c
++++ b/net/ipv4/netfilter/arp_tables.c
+@@ -372,7 +372,9 @@ static int mark_source_chains(struct xt_table_info *newinfo,
+                           && unconditional(&e->arp)) || visited) {
+                               unsigned int oldpos, size;
+-                              if (t->verdict < -NF_MAX_VERDICT - 1) {
++                              if ((strcmp(t->target.u.user.name,
++                                          ARPT_STANDARD_TARGET) == 0) &&
++                                  t->verdict < -NF_MAX_VERDICT - 1) {
+                                       duprintf("mark_source_chains: bad "
+                                               "negative verdict (%i)\n",
+                                                               t->verdict);
+diff --git a/net/ipv4/netfilter/ip_tables.c b/net/ipv4/netfilter/ip_tables.c
+index 4e7c719..b56a203 100644
+--- a/net/ipv4/netfilter/ip_tables.c
++++ b/net/ipv4/netfilter/ip_tables.c
+@@ -502,7 +502,9 @@ mark_source_chains(struct xt_table_info *newinfo,
+                           && unconditional(&e->ip)) || visited) {
+                               unsigned int oldpos, size;
+-                              if (t->verdict < -NF_MAX_VERDICT - 1) {
++                              if ((strcmp(t->target.u.user.name,
++                                          IPT_STANDARD_TARGET) == 0) &&
++                                  t->verdict < -NF_MAX_VERDICT - 1) {
+                                       duprintf("mark_source_chains: bad "
+                                               "negative verdict (%i)\n",
+                                                               t->verdict);
+diff --git a/net/ipv6/inet6_hashtables.c b/net/ipv6/inet6_hashtables.c
+index 1646a56..4494cb6 100644
+--- a/net/ipv6/inet6_hashtables.c
++++ b/net/ipv6/inet6_hashtables.c
+@@ -210,11 +210,11 @@ unique:
+       if (twp != NULL) {
+               *twp = tw;
+-              NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
++              NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
+       } else if (tw != NULL) {
+               /* Silly. Should hash-dance instead... */
+               inet_twsk_deschedule(tw, death_row);
+-              NET_INC_STATS_BH(twsk_net(tw), LINUX_MIB_TIMEWAITRECYCLED);
++              NET_INC_STATS_BH(net, LINUX_MIB_TIMEWAITRECYCLED);
+               inet_twsk_put(tw);
+       }
+diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c
+index 7e14ccc..e55427d 100644
+--- a/net/ipv6/ip6_input.c
++++ b/net/ipv6/ip6_input.c
+@@ -74,8 +74,7 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt
+       if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL ||
+           !idev || unlikely(idev->cnf.disable_ipv6)) {
+               IP6_INC_STATS_BH(idev, IPSTATS_MIB_INDISCARDS);
+-              rcu_read_unlock();
+-              goto out;
++              goto drop;
+       }
+       memset(IP6CB(skb), 0, sizeof(struct inet6_skb_parm));
+@@ -145,7 +144,6 @@ err:
+ drop:
+       rcu_read_unlock();
+       kfree_skb(skb);
+-out:
+       return 0;
+ }
+diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c
+index 0b4557e..81751c3 100644
+--- a/net/ipv6/netfilter/ip6_tables.c
++++ b/net/ipv6/netfilter/ip6_tables.c
+@@ -529,7 +529,9 @@ mark_source_chains(struct xt_table_info *newinfo,
+                           && unconditional(&e->ipv6)) || visited) {
+                               unsigned int oldpos, size;
+-                              if (t->verdict < -NF_MAX_VERDICT - 1) {
++                              if ((strcmp(t->target.u.user.name,
++                                          IP6T_STANDARD_TARGET) == 0) &&
++                                  t->verdict < -NF_MAX_VERDICT - 1) {
+                                       duprintf("mark_source_chains: bad "
+                                               "negative verdict (%i)\n",
+                                                               t->verdict);
+diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c
+index 6f61261..fcbc6b9 100644
+--- a/net/netfilter/nf_conntrack_proto_tcp.c
++++ b/net/netfilter/nf_conntrack_proto_tcp.c
+@@ -15,6 +15,7 @@
+ #include <linux/skbuff.h>
+ #include <linux/ipv6.h>
+ #include <net/ip6_checksum.h>
++#include <asm/unaligned.h>
+ #include <net/tcp.h>
+@@ -466,7 +467,7 @@ static void tcp_sack(const struct sk_buff *skb, unsigned int dataoff,
+                               for (i = 0;
+                                    i < (opsize - TCPOLEN_SACK_BASE);
+                                    i += TCPOLEN_SACK_PERBLOCK) {
+-                                      tmp = ntohl(*((__be32 *)(ptr+i)+1));
++                                      tmp = get_unaligned_be32((__be32 *)(ptr+i)+1);
+                                       if (after(tmp, *sack))
+                                               *sack = tmp;
+diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
+index 9f1ea4a..db9e263 100644
+--- a/net/netrom/af_netrom.c
++++ b/net/netrom/af_netrom.c
+@@ -1082,7 +1082,13 @@ static int nr_sendmsg(struct kiocb *iocb, struct socket *sock,
+       SOCK_DEBUG(sk, "NET/ROM: sendto: Addresses built.\n");
+-      /* Build a packet */
++      /* Build a packet - the conventional user limit is 236 bytes. We can
++         do ludicrously large NetROM frames but must not overflow */
++      if (len > 65536) {
++              err = -EMSGSIZE;
++              goto out;
++      }
++
+       SOCK_DEBUG(sk, "NET/ROM: sendto: building packet.\n");
+       size = len + NR_NETWORK_LEN + NR_TRANSPORT_LEN;
+diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
+index a7f1ce1..c062361 100644
+--- a/net/rose/af_rose.c
++++ b/net/rose/af_rose.c
+@@ -1120,6 +1120,10 @@ static int rose_sendmsg(struct kiocb *iocb, struct socket *sock,
+       /* Build a packet */
+       SOCK_DEBUG(sk, "ROSE: sendto: building packet.\n");
++      /* Sanity check the packet size */
++      if (len > 65535)
++              return -EMSGSIZE;
++
+       size = len + AX25_BPQ_HEADER_LEN + AX25_MAX_HEADER_LEN + ROSE_MIN_LEN;
+       if ((skb = sock_alloc_send_skb(sk, size, msg->msg_flags & MSG_DONTWAIT, &err)) == NULL)
+diff --git a/net/sctp/endpointola.c b/net/sctp/endpointola.c
+index 4c8d9f4..905fda5 100644
+--- a/net/sctp/endpointola.c
++++ b/net/sctp/endpointola.c
+@@ -111,7 +111,8 @@ static struct sctp_endpoint *sctp_endpoint_init(struct sctp_endpoint *ep,
+               if (sctp_addip_enable) {
+                       auth_chunks->chunks[0] = SCTP_CID_ASCONF;
+                       auth_chunks->chunks[1] = SCTP_CID_ASCONF_ACK;
+-                      auth_chunks->param_hdr.length += htons(2);
++                      auth_chunks->param_hdr.length =
++                                      htons(sizeof(sctp_paramhdr_t) + 2);
+               }
+       }
+diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
+index 9fc5b02..88d80f5 100644
+--- a/net/x25/af_x25.c
++++ b/net/x25/af_x25.c
+@@ -1037,6 +1037,12 @@ static int x25_sendmsg(struct kiocb *iocb, struct socket *sock,
+               sx25.sx25_addr   = x25->dest_addr;
+       }
++      /* Sanity check the packet size */
++      if (len > 65535) {
++              rc = -EMSGSIZE;
++              goto out;
++      }
++
+       SOCK_DEBUG(sk, "x25_sendmsg: sendto: Addresses built.\n");
+       /* Build a packet */
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index 03fc6a8..f028f70 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -4467,6 +4467,7 @@ static int selinux_ip_postroute_iptables_compat(struct sock *sk,
+       if (err)
+               return err;
+       err = avc_has_perm(sk_sid, if_sid, SECCLASS_NETIF, netif_perm, ad);
++      if (err)
+               return err;
+       err = sel_netnode_sid(addrp, family, &node_sid);
+diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
+index 87d7541..b802923 100644
+--- a/security/smack/smack_lsm.c
++++ b/security/smack/smack_lsm.c
+@@ -604,6 +604,8 @@ static int smack_inode_setxattr(struct dentry *dentry, const char *name,
+           strcmp(name, XATTR_NAME_SMACKIPOUT) == 0) {
+               if (!capable(CAP_MAC_ADMIN))
+                       rc = -EPERM;
++              if (size == 0)
++                      rc = -EINVAL;
+       } else
+               rc = cap_inode_setxattr(dentry, name, value, size, flags);
+@@ -1360,7 +1362,7 @@ static int smack_inode_setsecurity(struct inode *inode, const char *name,
+       struct socket *sock;
+       int rc = 0;
+-      if (value == NULL || size > SMK_LABELLEN)
++      if (value == NULL || size > SMK_LABELLEN || size == 0)
+               return -EACCES;
+       sp = smk_import(value, size);
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index 8c857d5..026f723 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -3220,7 +3220,7 @@ static const char *ad1884_slave_vols[] = {
+       "Mic Playback Volume",
+       "CD Playback Volume",
+       "Internal Mic Playback Volume",
+-      "Docking Mic Playback Volume"
++      "Docking Mic Playback Volume",
+       "Beep Playback Volume",
+       "IEC958 Playback Volume",
+       NULL
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.22-23 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.22-23
new file mode 100644 (file)
index 0000000..56e024f
--- /dev/null
@@ -0,0 +1,1383 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Upstream 2.6.27.23 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index d3b7fc8..a5c7ae5 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .22
++EXTRAVERSION = .23
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/mips/Kconfig b/arch/mips/Kconfig
+index 1e06d23..952f051 100644
+--- a/arch/mips/Kconfig
++++ b/arch/mips/Kconfig
+@@ -1293,6 +1293,7 @@ config 32BIT
+ config 64BIT
+       bool "64-bit kernel"
+       depends on CPU_SUPPORTS_64BIT_KERNEL && SYS_SUPPORTS_64BIT_KERNEL
++      select HAVE_SYSCALL_WRAPPERS
+       help
+         Select this option if you want to build a 64-bit kernel.
+diff --git a/arch/mips/kernel/linux32.c b/arch/mips/kernel/linux32.c
+index 2fefb14..645f6d2 100644
+--- a/arch/mips/kernel/linux32.c
++++ b/arch/mips/kernel/linux32.c
+@@ -32,6 +32,7 @@
+ #include <linux/module.h>
+ #include <linux/binfmts.h>
+ #include <linux/security.h>
++#include <linux/syscalls.h>
+ #include <linux/compat.h>
+ #include <linux/vfs.h>
+ #include <linux/ipc.h>
+@@ -98,9 +99,9 @@ int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf)
+       return copy_to_user(statbuf, &tmp, sizeof(tmp)) ? -EFAULT : 0;
+ }
+-asmlinkage unsigned long
+-sys32_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
+-         unsigned long flags, unsigned long fd, unsigned long pgoff)
++SYSCALL_DEFINE6(32_mmap2, unsigned long, addr, unsigned long, len,
++      unsigned long, prot, unsigned long, flags, unsigned long, fd,
++      unsigned long, pgoff)
+ {
+       struct file * file = NULL;
+       unsigned long error;
+@@ -156,14 +157,14 @@ struct rlimit32 {
+       int     rlim_max;
+ };
+-asmlinkage long sys32_truncate64(const char __user * path,
+-      unsigned long __dummy, int a2, int a3)
++SYSCALL_DEFINE4(32_truncate64, const char __user *, path,
++      unsigned long, __dummy, unsigned long, a2, unsigned long, a3)
+ {
+       return sys_truncate(path, merge_64(a2, a3));
+ }
+-asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long __dummy,
+-      int a2, int a3)
++SYSCALL_DEFINE4(32_ftruncate64, unsigned long, fd, unsigned long, __dummy,
++      unsigned long, a2, unsigned long, a3)
+ {
+       return sys_ftruncate(fd, merge_64(a2, a3));
+ }
+@@ -234,9 +235,9 @@ sys32_settimeofday(struct compat_timeval __user *tv, struct timezone __user *tz)
+       return do_sys_settimeofday(tv ? &kts : NULL, tz ? &ktz : NULL);
+ }
+-asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
+-                          unsigned int offset_low, loff_t __user * result,
+-                          unsigned int origin)
++SYSCALL_DEFINE5(32_llseek, unsigned int, fd, unsigned int, offset_high,
++              unsigned int, offset_low, loff_t __user *, result,
++              unsigned int, origin)
+ {
+       return sys_llseek(fd, offset_high, offset_low, result, origin);
+ }
+@@ -245,20 +246,20 @@ asmlinkage int sys32_llseek(unsigned int fd, unsigned int offset_high,
+    lseek back to original location.  They fail just like lseek does on
+    non-seekable files.  */
+-asmlinkage ssize_t sys32_pread(unsigned int fd, char __user * buf,
+-                             size_t count, u32 unused, u64 a4, u64 a5)
++SYSCALL_DEFINE6(32_pread, unsigned long, fd, char __user *, buf, size_t, count,
++      unsigned long, unused, unsigned long, a4, unsigned long, a5)
+ {
+       return sys_pread64(fd, buf, count, merge_64(a4, a5));
+ }
+-asmlinkage ssize_t sys32_pwrite(unsigned int fd, const char __user * buf,
+-                              size_t count, u32 unused, u64 a4, u64 a5)
++SYSCALL_DEFINE6(32_pwrite, unsigned int, fd, const char __user *, buf,
++      size_t, count, u32, unused, u64, a4, u64, a5)
+ {
+       return sys_pwrite64(fd, buf, count, merge_64(a4, a5));
+ }
+-asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
+-      struct compat_timespec __user *interval)
++SYSCALL_DEFINE2(32_sched_rr_get_interval, compat_pid_t, pid,
++      struct compat_timespec __user *, interval)
+ {
+       struct timespec t;
+       int ret;
+@@ -275,8 +276,8 @@ asmlinkage int sys32_sched_rr_get_interval(compat_pid_t pid,
+ #ifdef CONFIG_SYSVIPC
+-asmlinkage long
+-sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
++SYSCALL_DEFINE6(32_ipc, u32, call, long, first, long, second, long, third,
++      unsigned long, ptr, unsigned long, fifth)
+ {
+       int version, err;
+@@ -334,8 +335,8 @@ sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
+ #else
+-asmlinkage long
+-sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
++SYSCALL_DEFINE6(32_ipc, u32, call, int, first, int, second, int, third,
++      u32, ptr, u32, fifth)
+ {
+       return -ENOSYS;
+ }
+@@ -343,7 +344,7 @@ sys32_ipc(u32 call, int first, int second, int third, u32 ptr, u32 fifth)
+ #endif /* CONFIG_SYSVIPC */
+ #ifdef CONFIG_MIPS32_N32
+-asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg)
++SYSCALL_DEFINE4(n32_semctl, int, semid, int, semnum, int, cmd, u32, arg)
+ {
+       /* compat_sys_semctl expects a pointer to union semun */
+       u32 __user *uptr = compat_alloc_user_space(sizeof(u32));
+@@ -352,13 +353,14 @@ asmlinkage long sysn32_semctl(int semid, int semnum, int cmd, u32 arg)
+       return compat_sys_semctl(semid, semnum, cmd, uptr);
+ }
+-asmlinkage long sysn32_msgsnd(int msqid, u32 msgp, unsigned msgsz, int msgflg)
++SYSCALL_DEFINE4(n32_msgsnd, int, msqid, u32, msgp, unsigned int, msgsz,
++      int, msgflg)
+ {
+       return compat_sys_msgsnd(msqid, msgsz, msgflg, compat_ptr(msgp));
+ }
+-asmlinkage long sysn32_msgrcv(int msqid, u32 msgp, size_t msgsz, int msgtyp,
+-                            int msgflg)
++SYSCALL_DEFINE5(n32_msgrcv, int, msqid, u32, msgp, size_t, msgsz,
++      int, msgtyp, int, msgflg)
+ {
+       return compat_sys_msgrcv(msqid, msgsz, msgtyp, msgflg, IPC_64,
+                                compat_ptr(msgp));
+@@ -378,7 +380,7 @@ struct sysctl_args32
+ #ifdef CONFIG_SYSCTL_SYSCALL
+-asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
++SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
+ {
+       struct sysctl_args32 tmp;
+       int error;
+@@ -417,9 +419,16 @@ asmlinkage long sys32_sysctl(struct sysctl_args32 __user *args)
+       return error;
+ }
++#else
++
++SYSCALL_DEFINE1(32_sysctl, struct sysctl_args32 __user *, args)
++{
++      return -ENOSYS;
++}
++
+ #endif /* CONFIG_SYSCTL_SYSCALL */
+-asmlinkage long sys32_newuname(struct new_utsname __user * name)
++SYSCALL_DEFINE1(32_newuname, struct new_utsname __user *, name)
+ {
+       int ret = 0;
+@@ -435,7 +444,7 @@ asmlinkage long sys32_newuname(struct new_utsname __user * name)
+       return ret;
+ }
+-asmlinkage int sys32_personality(unsigned long personality)
++SYSCALL_DEFINE1(32_personality, unsigned long, personality)
+ {
+       int ret;
+       personality &= 0xffffffff;
+@@ -458,7 +467,7 @@ struct ustat32 {
+ extern asmlinkage long sys_ustat(dev_t dev, struct ustat __user * ubuf);
+-asmlinkage int sys32_ustat(dev_t dev, struct ustat32 __user * ubuf32)
++SYSCALL_DEFINE2(32_ustat, dev_t, dev, struct ustat32 __user *, ubuf32)
+ {
+       int err;
+       struct ustat tmp;
+@@ -482,8 +491,8 @@ out:
+       return err;
+ }
+-asmlinkage int sys32_sendfile(int out_fd, int in_fd, compat_off_t __user *offset,
+-      s32 count)
++SYSCALL_DEFINE4(32_sendfile, long, out_fd, long, in_fd,
++      compat_off_t __user *, offset, s32, count)
+ {
+       mm_segment_t old_fs = get_fs();
+       int ret;
+diff --git a/arch/mips/kernel/scall32-o32.S b/arch/mips/kernel/scall32-o32.S
+index 61906f6..e6115c6 100644
+--- a/arch/mips/kernel/scall32-o32.S
++++ b/arch/mips/kernel/scall32-o32.S
+@@ -402,7 +402,7 @@ einval:    li      v0, -EINVAL
+       sys     sys_swapon              2
+       sys     sys_reboot              3
+       sys     sys_old_readdir         3
+-      sys     old_mmap                6       /* 4090 */
++      sys     sys_mips_mmap           6       /* 4090 */
+       sys     sys_munmap              2
+       sys     sys_truncate            2
+       sys     sys_ftruncate           2
+@@ -522,7 +522,7 @@ einval:    li      v0, -EINVAL
+       sys     sys_sendfile            4
+       sys     sys_ni_syscall          0
+       sys     sys_ni_syscall          0
+-      sys     sys_mmap2               6       /* 4210 */
++      sys     sys_mips_mmap2          6       /* 4210 */
+       sys     sys_truncate64          4
+       sys     sys_ftruncate64         4
+       sys     sys_stat64              2
+diff --git a/arch/mips/kernel/scall64-64.S b/arch/mips/kernel/scall64-64.S
+index 3d58204..96d27af 100644
+--- a/arch/mips/kernel/scall64-64.S
++++ b/arch/mips/kernel/scall64-64.S
+@@ -207,7 +207,7 @@ sys_call_table:
+       PTR     sys_newlstat
+       PTR     sys_poll
+       PTR     sys_lseek
+-      PTR     old_mmap
++      PTR     sys_mips_mmap
+       PTR     sys_mprotect                    /* 5010 */
+       PTR     sys_munmap
+       PTR     sys_brk
+diff --git a/arch/mips/kernel/scall64-n32.S b/arch/mips/kernel/scall64-n32.S
+index da7f1b6..06941b3 100644
+--- a/arch/mips/kernel/scall64-n32.S
++++ b/arch/mips/kernel/scall64-n32.S
+@@ -129,12 +129,12 @@ EXPORT(sysn32_call_table)
+       PTR     sys_newlstat
+       PTR     sys_poll
+       PTR     sys_lseek
+-      PTR     old_mmap
++      PTR     sys_mips_mmap
+       PTR     sys_mprotect                    /* 6010 */
+       PTR     sys_munmap
+       PTR     sys_brk
+-      PTR     sys32_rt_sigaction
+-      PTR     sys32_rt_sigprocmask
++      PTR     sys_32_rt_sigaction
++      PTR     sys_32_rt_sigprocmask
+       PTR     compat_sys_ioctl                /* 6015 */
+       PTR     sys_pread64
+       PTR     sys_pwrite64
+@@ -159,7 +159,7 @@ EXPORT(sysn32_call_table)
+       PTR     compat_sys_setitimer
+       PTR     sys_alarm
+       PTR     sys_getpid
+-      PTR     sys32_sendfile
++      PTR     sys_32_sendfile
+       PTR     sys_socket                      /* 6040 */
+       PTR     sys_connect
+       PTR     sys_accept
+@@ -181,14 +181,14 @@ EXPORT(sysn32_call_table)
+       PTR     sys_exit
+       PTR     compat_sys_wait4
+       PTR     sys_kill                        /* 6060 */
+-      PTR     sys32_newuname
++      PTR     sys_32_newuname
+       PTR     sys_semget
+       PTR     sys_semop
+-      PTR     sysn32_semctl
++      PTR     sys_n32_semctl
+       PTR     sys_shmdt                       /* 6065 */
+       PTR     sys_msgget
+-      PTR     sysn32_msgsnd
+-      PTR     sysn32_msgrcv
++      PTR     sys_n32_msgsnd
++      PTR     sys_n32_msgrcv
+       PTR     compat_sys_msgctl
+       PTR     compat_sys_fcntl                /* 6070 */
+       PTR     sys_flock
+@@ -245,15 +245,15 @@ EXPORT(sysn32_call_table)
+       PTR     sys_getsid
+       PTR     sys_capget
+       PTR     sys_capset
+-      PTR     sys32_rt_sigpending             /* 6125 */
++      PTR     sys_32_rt_sigpending            /* 6125 */
+       PTR     compat_sys_rt_sigtimedwait
+-      PTR     sys32_rt_sigqueueinfo
++      PTR     sys_32_rt_sigqueueinfo
+       PTR     sysn32_rt_sigsuspend
+       PTR     sys32_sigaltstack
+       PTR     compat_sys_utime                /* 6130 */
+       PTR     sys_mknod
+-      PTR     sys32_personality
+-      PTR     sys32_ustat
++      PTR     sys_32_personality
++      PTR     sys_32_ustat
+       PTR     compat_sys_statfs
+       PTR     compat_sys_fstatfs              /* 6135 */
+       PTR     sys_sysfs
+@@ -265,14 +265,14 @@ EXPORT(sysn32_call_table)
+       PTR     sys_sched_getscheduler
+       PTR     sys_sched_get_priority_max
+       PTR     sys_sched_get_priority_min
+-      PTR     sys32_sched_rr_get_interval     /* 6145 */
++      PTR     sys_32_sched_rr_get_interval    /* 6145 */
+       PTR     sys_mlock
+       PTR     sys_munlock
+       PTR     sys_mlockall
+       PTR     sys_munlockall
+       PTR     sys_vhangup                     /* 6150 */
+       PTR     sys_pivot_root
+-      PTR     sys32_sysctl
++      PTR     sys_32_sysctl
+       PTR     sys_prctl
+       PTR     compat_sys_adjtimex
+       PTR     compat_sys_setrlimit            /* 6155 */
+diff --git a/arch/mips/kernel/scall64-o32.S b/arch/mips/kernel/scall64-o32.S
+index d7cd1aa..ddb52e6 100644
+--- a/arch/mips/kernel/scall64-o32.S
++++ b/arch/mips/kernel/scall64-o32.S
+@@ -267,12 +267,12 @@ sys_call_table:
+       PTR     sys_olduname
+       PTR     sys_umask                       /* 4060 */
+       PTR     sys_chroot
+-      PTR     sys32_ustat
++      PTR     sys_32_ustat
+       PTR     sys_dup2
+       PTR     sys_getppid
+       PTR     sys_getpgrp                     /* 4065 */
+       PTR     sys_setsid
+-      PTR     sys32_sigaction
++      PTR     sys_32_sigaction
+       PTR     sys_sgetmask
+       PTR     sys_ssetmask
+       PTR     sys_setreuid                    /* 4070 */
+@@ -295,7 +295,7 @@ sys_call_table:
+       PTR     sys_swapon
+       PTR     sys_reboot
+       PTR     compat_sys_old_readdir
+-      PTR     old_mmap                        /* 4090 */
++      PTR     sys_mips_mmap                   /* 4090 */
+       PTR     sys_munmap
+       PTR     sys_truncate
+       PTR     sys_ftruncate
+@@ -322,12 +322,12 @@ sys_call_table:
+       PTR     compat_sys_wait4
+       PTR     sys_swapoff                     /* 4115 */
+       PTR     compat_sys_sysinfo
+-      PTR     sys32_ipc
++      PTR     sys_32_ipc
+       PTR     sys_fsync
+       PTR     sys32_sigreturn
+       PTR     sys32_clone                     /* 4120 */
+       PTR     sys_setdomainname
+-      PTR     sys32_newuname
++      PTR     sys_32_newuname
+       PTR     sys_ni_syscall                  /* sys_modify_ldt */
+       PTR     compat_sys_adjtimex
+       PTR     sys_mprotect                    /* 4125 */
+@@ -341,11 +341,11 @@ sys_call_table:
+       PTR     sys_fchdir
+       PTR     sys_bdflush
+       PTR     sys_sysfs                       /* 4135 */
+-      PTR     sys32_personality
++      PTR     sys_32_personality
+       PTR     sys_ni_syscall                  /* for afs_syscall */
+       PTR     sys_setfsuid
+       PTR     sys_setfsgid
+-      PTR     sys32_llseek                    /* 4140 */
++      PTR     sys_32_llseek                   /* 4140 */
+       PTR     compat_sys_getdents
+       PTR     compat_sys_select
+       PTR     sys_flock
+@@ -358,7 +358,7 @@ sys_call_table:
+       PTR     sys_ni_syscall                  /* 4150 */
+       PTR     sys_getsid
+       PTR     sys_fdatasync
+-      PTR     sys32_sysctl
++      PTR     sys_32_sysctl
+       PTR     sys_mlock
+       PTR     sys_munlock                     /* 4155 */
+       PTR     sys_mlockall
+@@ -370,7 +370,7 @@ sys_call_table:
+       PTR     sys_sched_yield
+       PTR     sys_sched_get_priority_max
+       PTR     sys_sched_get_priority_min
+-      PTR     sys32_sched_rr_get_interval     /* 4165 */
++      PTR     sys_32_sched_rr_get_interval    /* 4165 */
+       PTR     compat_sys_nanosleep
+       PTR     sys_mremap
+       PTR     sys_accept
+@@ -399,25 +399,25 @@ sys_call_table:
+       PTR     sys_getresgid
+       PTR     sys_prctl
+       PTR     sys32_rt_sigreturn
+-      PTR     sys32_rt_sigaction
+-      PTR     sys32_rt_sigprocmask            /* 4195 */
+-      PTR     sys32_rt_sigpending
++      PTR     sys_32_rt_sigaction
++      PTR     sys_32_rt_sigprocmask           /* 4195 */
++      PTR     sys_32_rt_sigpending
+       PTR     compat_sys_rt_sigtimedwait
+-      PTR     sys32_rt_sigqueueinfo
++      PTR     sys_32_rt_sigqueueinfo
+       PTR     sys32_rt_sigsuspend
+-      PTR     sys32_pread                     /* 4200 */
+-      PTR     sys32_pwrite
++      PTR     sys_32_pread                    /* 4200 */
++      PTR     sys_32_pwrite
+       PTR     sys_chown
+       PTR     sys_getcwd
+       PTR     sys_capget
+       PTR     sys_capset                      /* 4205 */
+       PTR     sys32_sigaltstack
+-      PTR     sys32_sendfile
++      PTR     sys_32_sendfile
+       PTR     sys_ni_syscall
+       PTR     sys_ni_syscall
+-      PTR     sys32_mmap2                     /* 4210 */
+-      PTR     sys32_truncate64
+-      PTR     sys32_ftruncate64
++      PTR     sys_mips_mmap2                  /* 4210 */
++      PTR     sys_32_truncate64
++      PTR     sys_32_ftruncate64
+       PTR     sys_newstat
+       PTR     sys_newlstat
+       PTR     sys_newfstat                    /* 4215 */
+@@ -483,7 +483,7 @@ sys_call_table:
+       PTR     compat_sys_mq_notify            /* 4275 */
+       PTR     compat_sys_mq_getsetattr
+       PTR     sys_ni_syscall                  /* sys_vserver */
+-      PTR     sys32_waitid
++      PTR     sys_32_waitid
+       PTR     sys_ni_syscall                  /* available, was setaltroot */
+       PTR     sys_add_key                     /* 4280 */
+       PTR     sys_request_key
+diff --git a/arch/mips/kernel/signal.c b/arch/mips/kernel/signal.c
+index a4e106c..830c5ef 100644
+--- a/arch/mips/kernel/signal.c
++++ b/arch/mips/kernel/signal.c
+@@ -19,6 +19,7 @@
+ #include <linux/ptrace.h>
+ #include <linux/unistd.h>
+ #include <linux/compiler.h>
++#include <linux/syscalls.h>
+ #include <linux/uaccess.h>
+ #include <asm/abi.h>
+@@ -338,8 +339,8 @@ asmlinkage int sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
+ }
+ #ifdef CONFIG_TRAD_SIGNALS
+-asmlinkage int sys_sigaction(int sig, const struct sigaction __user *act,
+-      struct sigaction __user *oact)
++SYSCALL_DEFINE3(sigaction, int, sig, const struct sigaction __user *, act,
++      struct sigaction __user *, oact)
+ {
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+diff --git a/arch/mips/kernel/signal32.c b/arch/mips/kernel/signal32.c
+index 572c610..86d23ea 100644
+--- a/arch/mips/kernel/signal32.c
++++ b/arch/mips/kernel/signal32.c
+@@ -349,8 +349,8 @@ asmlinkage int sys32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
+       return -ERESTARTNOHAND;
+ }
+-asmlinkage int sys32_sigaction(int sig, const struct sigaction32 __user *act,
+-                               struct sigaction32 __user *oact)
++SYSCALL_DEFINE3(32_sigaction, long, sig, const struct sigaction32 __user *, act,
++      struct sigaction32 __user *, oact)
+ {
+       struct k_sigaction new_ka, old_ka;
+       int ret;
+@@ -692,9 +692,9 @@ struct mips_abi mips_abi_32 = {
+       .restart        = __NR_O32_restart_syscall
+ };
+-asmlinkage int sys32_rt_sigaction(int sig, const struct sigaction32 __user *act,
+-                                struct sigaction32 __user *oact,
+-                                unsigned int sigsetsize)
++SYSCALL_DEFINE4(32_rt_sigaction, int, sig,
++      const struct sigaction32 __user *, act,
++      struct sigaction32 __user *, oact, unsigned int, sigsetsize)
+ {
+       struct k_sigaction new_sa, old_sa;
+       int ret = -EINVAL;
+@@ -736,8 +736,8 @@ out:
+       return ret;
+ }
+-asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
+-      compat_sigset_t __user *oset, unsigned int sigsetsize)
++SYSCALL_DEFINE4(32_rt_sigprocmask, int, how, compat_sigset_t __user *, set,
++      compat_sigset_t __user *, oset, unsigned int, sigsetsize)
+ {
+       sigset_t old_set, new_set;
+       int ret;
+@@ -758,8 +758,8 @@ asmlinkage int sys32_rt_sigprocmask(int how, compat_sigset_t __user *set,
+       return ret;
+ }
+-asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
+-      unsigned int sigsetsize)
++SYSCALL_DEFINE2(32_rt_sigpending, compat_sigset_t __user *, uset,
++      unsigned int, sigsetsize)
+ {
+       int ret;
+       sigset_t set;
+@@ -775,7 +775,8 @@ asmlinkage int sys32_rt_sigpending(compat_sigset_t __user *uset,
+       return ret;
+ }
+-asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo)
++SYSCALL_DEFINE3(32_rt_sigqueueinfo, int, pid, int, sig,
++      compat_siginfo_t __user *, uinfo)
+ {
+       siginfo_t info;
+       int ret;
+@@ -790,10 +791,9 @@ asmlinkage int sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *
+       return ret;
+ }
+-asmlinkage long
+-sys32_waitid(int which, compat_pid_t pid,
+-           compat_siginfo_t __user *uinfo, int options,
+-           struct compat_rusage __user *uru)
++SYSCALL_DEFINE5(32_waitid, int, which, compat_pid_t, pid,
++           compat_siginfo_t __user *, uinfo, int, options,
++           struct compat_rusage __user *, uru)
+ {
+       siginfo_t info;
+       struct rusage ru;
+diff --git a/arch/mips/kernel/syscall.c b/arch/mips/kernel/syscall.c
+index 343015a..e43e843 100644
+--- a/arch/mips/kernel/syscall.c
++++ b/arch/mips/kernel/syscall.c
+@@ -153,9 +153,9 @@ out:
+       return error;
+ }
+-asmlinkage unsigned long
+-old_mmap(unsigned long addr, unsigned long len, int prot,
+-      int flags, int fd, off_t offset)
++SYSCALL_DEFINE6(mips_mmap, unsigned long, addr, unsigned long, len,
++      unsigned long, prot, unsigned long, flags, unsigned long,
++      fd, off_t, offset)
+ {
+       unsigned long result;
+@@ -169,9 +169,9 @@ out:
+       return result;
+ }
+-asmlinkage unsigned long
+-sys_mmap2(unsigned long addr, unsigned long len, unsigned long prot,
+-          unsigned long flags, unsigned long fd, unsigned long pgoff)
++SYSCALL_DEFINE6(mips_mmap2, unsigned long, addr, unsigned long, len,
++      unsigned long, prot, unsigned long, flags, unsigned long, fd,
++      unsigned long, pgoff)
+ {
+       if (pgoff & (~PAGE_MASK >> 12))
+               return -EINVAL;
+@@ -241,7 +241,7 @@ out:
+ /*
+  * Compacrapability ...
+  */
+-asmlinkage int sys_uname(struct old_utsname __user * name)
++SYSCALL_DEFINE1(uname, struct old_utsname __user *, name)
+ {
+       if (name && !copy_to_user(name, utsname(), sizeof (*name)))
+               return 0;
+@@ -251,7 +251,7 @@ asmlinkage int sys_uname(struct old_utsname __user * name)
+ /*
+  * Compacrapability ...
+  */
+-asmlinkage int sys_olduname(struct oldold_utsname __user * name)
++SYSCALL_DEFINE1(olduname, struct oldold_utsname __user *, name)
+ {
+       int error;
+@@ -280,7 +280,7 @@ asmlinkage int sys_olduname(struct oldold_utsname __user * name)
+       return error;
+ }
+-asmlinkage int sys_set_thread_area(unsigned long addr)
++SYSCALL_DEFINE1(set_thread_area, unsigned long, addr)
+ {
+       struct thread_info *ti = task_thread_info(current);
+@@ -291,7 +291,7 @@ asmlinkage int sys_set_thread_area(unsigned long addr)
+       return 0;
+ }
+-asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
++asmlinkage int _sys_sysmips(long cmd, long arg1, long arg2, long arg3)
+ {
+       switch (cmd) {
+       case MIPS_ATOMIC_SET:
+@@ -326,8 +326,8 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
+  *
+  * This is really horribly ugly.
+  */
+-asmlinkage int sys_ipc(unsigned int call, int first, int second,
+-                     unsigned long third, void __user *ptr, long fifth)
++SYSCALL_DEFINE6(ipc, unsigned int, call, int, first, int, second,
++      unsigned long, third, void __user *, ptr, long, fifth)
+ {
+       int version, ret;
+@@ -412,7 +412,7 @@ asmlinkage int sys_ipc(unsigned int call, int first, int second,
+ /*
+  * No implemented yet ...
+  */
+-asmlinkage int sys_cachectl(char *addr, int nbytes, int op)
++SYSCALL_DEFINE3(cachectl, char *, addr, int, nbytes, int, op)
+ {
+       return -ENOSYS;
+ }
+diff --git a/arch/mips/mm/cache.c b/arch/mips/mm/cache.c
+index 1eb7c71..789c97a 100644
+--- a/arch/mips/mm/cache.c
++++ b/arch/mips/mm/cache.c
+@@ -13,6 +13,7 @@
+ #include <linux/linkage.h>
+ #include <linux/module.h>
+ #include <linux/sched.h>
++#include <linux/syscalls.h>
+ #include <linux/mm.h>
+ #include <asm/cacheflush.h>
+@@ -58,8 +59,8 @@ EXPORT_SYMBOL(_dma_cache_wback_inv);
+  * We could optimize the case where the cache argument is not BCACHE but
+  * that seems very atypical use ...
+  */
+-asmlinkage int sys_cacheflush(unsigned long addr,
+-      unsigned long bytes, unsigned int cache)
++SYSCALL_DEFINE3(cacheflush, unsigned long, addr, unsigned long, bytes,
++      unsigned int, cache)
+ {
+       if (bytes == 0)
+               return 0;
+diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
+index d963576..76d49eb 100644
+--- a/arch/x86/pci/mmconfig-shared.c
++++ b/arch/x86/pci/mmconfig-shared.c
+@@ -255,7 +255,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
+               if (!fixmem32)
+                       return AE_OK;
+               if ((mcfg_res->start >= fixmem32->address) &&
+-                  (mcfg_res->end < (fixmem32->address +
++                  (mcfg_res->end <= (fixmem32->address +
+                                     fixmem32->address_length))) {
+                       mcfg_res->flags = 1;
+                       return AE_CTRL_TERMINATE;
+@@ -272,7 +272,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
+               return AE_OK;
+       if ((mcfg_res->start >= address.minimum) &&
+-          (mcfg_res->end < (address.minimum + address.address_length))) {
++          (mcfg_res->end <= (address.minimum + address.address_length))) {
+               mcfg_res->flags = 1;
+               return AE_CTRL_TERMINATE;
+       }
+@@ -319,7 +319,7 @@ static int __init is_mmconf_reserved(check_reserved_t is_reserved,
+       u64 old_size = size;
+       int valid = 0;
+-      while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
++      while (!is_reserved(addr, addr + size, E820_RESERVED)) {
+               size >>= 1;
+               if (size < (16UL<<20))
+                       break;
+diff --git a/drivers/acpi/resources/rscreate.c b/drivers/acpi/resources/rscreate.c
+index 7804a8c..c277455 100644
+--- a/drivers/acpi/resources/rscreate.c
++++ b/drivers/acpi/resources/rscreate.c
+@@ -191,8 +191,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
+       user_prt = ACPI_CAST_PTR(struct acpi_pci_routing_table, buffer);
+       for (index = 0; index < number_of_elements; index++) {
+-              int source_name_index = 2;
+-              int source_index_index = 3;
+               /*
+                * Point user_prt past this current structure
+@@ -261,27 +259,6 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
+                       return_ACPI_STATUS(AE_BAD_DATA);
+               }
+-              /*
+-               * If BIOS erroneously reversed the _PRT source_name and source_index,
+-               * then reverse them back.
+-               */
+-              if (ACPI_GET_OBJECT_TYPE(sub_object_list[3]) !=
+-                  ACPI_TYPE_INTEGER) {
+-                      if (acpi_gbl_enable_interpreter_slack) {
+-                              source_name_index = 3;
+-                              source_index_index = 2;
+-                              printk(KERN_WARNING
+-                                     "ACPI: Handling Garbled _PRT entry\n");
+-                      } else {
+-                              ACPI_ERROR((AE_INFO,
+-                                          "(PRT[%X].source_index) Need Integer, found %s",
+-                                          index,
+-                                          acpi_ut_get_object_type_name
+-                                          (sub_object_list[3])));
+-                              return_ACPI_STATUS(AE_BAD_DATA);
+-                      }
+-              }
+-
+               user_prt->pin = (u32) obj_desc->integer.value;
+               /*
+@@ -305,7 +282,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
+                * 3) Third subobject: Dereference the PRT.source_name
+                * The name may be unresolved (slack mode), so allow a null object
+                */
+-              obj_desc = sub_object_list[source_name_index];
++              obj_desc = sub_object_list[2];
+               if (obj_desc) {
+                       switch (ACPI_GET_OBJECT_TYPE(obj_desc)) {
+                       case ACPI_TYPE_LOCAL_REFERENCE:
+@@ -380,7 +357,7 @@ acpi_rs_create_pci_routing_table(union acpi_operand_object *package_object,
+               /* 4) Fourth subobject: Dereference the PRT.source_index */
+-              obj_desc = sub_object_list[source_index_index];
++              obj_desc = sub_object_list[3];
+               if (ACPI_GET_OBJECT_TYPE(obj_desc) != ACPI_TYPE_INTEGER) {
+                       ACPI_ERROR((AE_INFO,
+                                   "(PRT[%X].SourceIndex) Need Integer, found %s",
+diff --git a/drivers/char/hw_random/virtio-rng.c b/drivers/char/hw_random/virtio-rng.c
+index d0e563e..86e83f8 100644
+--- a/drivers/char/hw_random/virtio-rng.c
++++ b/drivers/char/hw_random/virtio-rng.c
+@@ -37,9 +37,9 @@ static void random_recv_done(struct virtqueue *vq)
+ {
+       int len;
+-      /* We never get spurious callbacks. */
++      /* We can get spurious callbacks, e.g. shared IRQs + virtio_pci. */
+       if (!vq->vq_ops->get_buf(vq, &len))
+-              BUG();
++              return;
+       data_left = len / sizeof(random_data[0]);
+       complete(&have_data);
+diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
+index d7326d9..83dee5a 100644
+--- a/drivers/gpu/drm/i915/i915_drv.h
++++ b/drivers/gpu/drm/i915/i915_drv.h
+@@ -1115,7 +1115,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+                      (dev)->pci_device == 0x2A42 || \
+                      (dev)->pci_device == 0x2E02 || \
+                      (dev)->pci_device == 0x2E12 || \
+-                     (dev)->pci_device == 0x2E22)
++                     (dev)->pci_device == 0x2E22 || \
++                     (dev)->pci_device == 0x2E32)
+ #define IS_I965GM(dev) ((dev)->pci_device == 0x2A02)
+@@ -1123,7 +1124,8 @@ extern int i915_wait_ring(struct drm_device * dev, int n, const char *caller);
+ #define IS_G4X(dev) ((dev)->pci_device == 0x2E02 || \
+                    (dev)->pci_device == 0x2E12 || \
+-                   (dev)->pci_device == 0x2E22)
++                   (dev)->pci_device == 0x2E22 || \
++                   (dev)->pci_device == 0x2E32)
+ #define IS_G33(dev)    ((dev)->pci_device == 0x29C2 ||        \
+                       (dev)->pci_device == 0x29B2 ||  \
+diff --git a/drivers/net/forcedeth.c b/drivers/net/forcedeth.c
+index eeb55ed..bf76dec 100644
+--- a/drivers/net/forcedeth.c
++++ b/drivers/net/forcedeth.c
+@@ -5967,6 +5967,9 @@ static int nv_resume(struct pci_dev *pdev)
+       for (i = 0;i <= np->register_size/sizeof(u32); i++)
+               writel(np->saved_config_space[i], base+i*sizeof(u32));
++      /* restore phy state, including autoneg */
++      phy_init(dev);
++
+       netif_device_attach(dev);
+       if (netif_running(dev)) {
+               rc = nv_open(dev);
+diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
+index 0a18b9e..abd5a89 100644
+--- a/drivers/net/mv643xx_eth.c
++++ b/drivers/net/mv643xx_eth.c
+@@ -1060,7 +1060,6 @@ static void mib_counters_update(struct mv643xx_eth_private *mp)
+       struct mib_counters *p = &mp->mib_counters;
+       p->good_octets_received += mib_read(mp, 0x00);
+-      p->good_octets_received += (u64)mib_read(mp, 0x04) << 32;
+       p->bad_octets_received += mib_read(mp, 0x08);
+       p->internal_mac_transmit_err += mib_read(mp, 0x0c);
+       p->good_frames_received += mib_read(mp, 0x10);
+@@ -1074,7 +1073,6 @@ static void mib_counters_update(struct mv643xx_eth_private *mp)
+       p->frames_512_to_1023_octets += mib_read(mp, 0x30);
+       p->frames_1024_to_max_octets += mib_read(mp, 0x34);
+       p->good_octets_sent += mib_read(mp, 0x38);
+-      p->good_octets_sent += (u64)mib_read(mp, 0x3c) << 32;
+       p->good_frames_sent += mib_read(mp, 0x40);
+       p->excessive_collision += mib_read(mp, 0x44);
+       p->multicast_frames_sent += mib_read(mp, 0x48);
+diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c
+index 098f886..b64d701 100644
+--- a/drivers/net/wireless/b43/dma.c
++++ b/drivers/net/wireless/b43/dma.c
+@@ -551,11 +551,32 @@ address_error:
+       return 1;
+ }
++static bool b43_rx_buffer_is_poisoned(struct b43_dmaring *ring, struct sk_buff *skb)
++{
++      unsigned char *f = skb->data + ring->frameoffset;
++
++      return ((f[0] & f[1] & f[2] & f[3] & f[4] & f[5] & f[6] & f[7]) == 0xFF);
++}
++
++static void b43_poison_rx_buffer(struct b43_dmaring *ring, struct sk_buff *skb)
++{
++      struct b43_rxhdr_fw4 *rxhdr;
++      unsigned char *frame;
++
++      /* This poisons the RX buffer to detect DMA failures. */
++
++      rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
++      rxhdr->frame_len = 0;
++
++      B43_WARN_ON(ring->rx_buffersize < ring->frameoffset + sizeof(struct b43_plcp_hdr6) + 2);
++      frame = skb->data + ring->frameoffset;
++      memset(frame, 0xFF, sizeof(struct b43_plcp_hdr6) + 2 /* padding */);
++}
++
+ static int setup_rx_descbuffer(struct b43_dmaring *ring,
+                              struct b43_dmadesc_generic *desc,
+                              struct b43_dmadesc_meta *meta, gfp_t gfp_flags)
+ {
+-      struct b43_rxhdr_fw4 *rxhdr;
+       dma_addr_t dmaaddr;
+       struct sk_buff *skb;
+@@ -564,6 +585,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
+       skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
+       if (unlikely(!skb))
+               return -ENOMEM;
++      b43_poison_rx_buffer(ring, skb);
+       dmaaddr = map_descbuffer(ring, skb->data, ring->rx_buffersize, 0);
+       if (b43_dma_mapping_error(ring, dmaaddr, ring->rx_buffersize, 0)) {
+               /* ugh. try to realloc in zone_dma */
+@@ -574,6 +596,7 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
+               skb = __dev_alloc_skb(ring->rx_buffersize, gfp_flags);
+               if (unlikely(!skb))
+                       return -ENOMEM;
++              b43_poison_rx_buffer(ring, skb);
+               dmaaddr = map_descbuffer(ring, skb->data,
+                                        ring->rx_buffersize, 0);
+       }
+@@ -589,9 +612,6 @@ static int setup_rx_descbuffer(struct b43_dmaring *ring,
+       ring->ops->fill_descriptor(ring, desc, dmaaddr,
+                                  ring->rx_buffersize, 0, 0, 0);
+-      rxhdr = (struct b43_rxhdr_fw4 *)(skb->data);
+-      rxhdr->frame_len = 0;
+-
+       return 0;
+ }
+@@ -1478,12 +1498,17 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
+                       len = le16_to_cpu(rxhdr->frame_len);
+               } while (len == 0 && i++ < 5);
+               if (unlikely(len == 0)) {
+-                      /* recycle the descriptor buffer. */
+-                      sync_descbuffer_for_device(ring, meta->dmaaddr,
+-                                                 ring->rx_buffersize);
+-                      goto drop;
++                      dmaaddr = meta->dmaaddr;
++                      goto drop_recycle_buffer;
+               }
+       }
++      if (unlikely(b43_rx_buffer_is_poisoned(ring, skb))) {
++              /* Something went wrong with the DMA.
++               * The device did not touch the buffer and did not overwrite the poison. */
++              b43dbg(ring->dev->wl, "DMA RX: Dropping poisoned buffer.\n");
++              dmaaddr = meta->dmaaddr;
++              goto drop_recycle_buffer;
++      }
+       if (unlikely(len > ring->rx_buffersize)) {
+               /* The data did not fit into one descriptor buffer
+                * and is split over multiple buffers.
+@@ -1496,6 +1521,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
+               while (1) {
+                       desc = ops->idx2desc(ring, *slot, &meta);
+                       /* recycle the descriptor buffer. */
++                      b43_poison_rx_buffer(ring, meta->skb);
+                       sync_descbuffer_for_device(ring, meta->dmaaddr,
+                                                  ring->rx_buffersize);
+                       *slot = next_slot(ring, *slot);
+@@ -1514,8 +1540,7 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
+       err = setup_rx_descbuffer(ring, desc, meta, GFP_ATOMIC);
+       if (unlikely(err)) {
+               b43dbg(ring->dev->wl, "DMA RX: setup_rx_descbuffer() failed\n");
+-              sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
+-              goto drop;
++              goto drop_recycle_buffer;
+       }
+       unmap_descbuffer(ring, dmaaddr, ring->rx_buffersize, 0);
+@@ -1525,6 +1550,11 @@ static void dma_rx(struct b43_dmaring *ring, int *slot)
+       b43_rx(ring->dev, skb, rxhdr);
+ drop:
+       return;
++
++drop_recycle_buffer:
++      /* Poison and recycle the RX buffer. */
++      b43_poison_rx_buffer(ring, skb);
++      sync_descbuffer_for_device(ring, dmaaddr, ring->rx_buffersize);
+ }
+ void b43_dma_rx(struct b43_dmaring *ring)
+diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c
+index 00e965b..49e923d 100644
+--- a/drivers/net/wireless/rndis_wlan.c
++++ b/drivers/net/wireless/rndis_wlan.c
+@@ -2556,6 +2556,11 @@ static int rndis_wext_bind(struct usbnet *usbdev, struct usb_interface *intf)
+       mutex_init(&priv->command_lock);
+       spin_lock_init(&priv->stats_lock);
++      /* because rndis_command() sleeps we need to use workqueue */
++      priv->workqueue = create_singlethread_workqueue("rndis_wlan");
++      INIT_WORK(&priv->work, rndis_wext_worker);
++      INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats);
++
+       /* try bind rndis_host */
+       retval = generic_rndis_bind(usbdev, intf, FLAG_RNDIS_PHYM_WIRELESS);
+       if (retval < 0)
+@@ -2600,16 +2605,17 @@ static int rndis_wext_bind(struct usbnet *usbdev, struct usb_interface *intf)
+       disassociate(usbdev, 1);
+       netif_carrier_off(usbdev->net);
+-      /* because rndis_command() sleeps we need to use workqueue */
+-      priv->workqueue = create_singlethread_workqueue("rndis_wlan");
+-      INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats);
+       queue_delayed_work(priv->workqueue, &priv->stats_work,
+               round_jiffies_relative(STATS_UPDATE_JIFFIES));
+-      INIT_WORK(&priv->work, rndis_wext_worker);
+       return 0;
+ fail:
++      cancel_delayed_work_sync(&priv->stats_work);
++      cancel_work_sync(&priv->work);
++      flush_workqueue(priv->workqueue);
++      destroy_workqueue(priv->workqueue);
++
+       kfree(priv);
+       return retval;
+ }
+diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
+index d0e5769..5368689 100644
+--- a/drivers/pci/quirks.c
++++ b/drivers/pci/quirks.c
+@@ -1832,6 +1832,7 @@ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS400_200, quirk_di
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RS480, quirk_disable_all_msi);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3336, quirk_disable_all_msi);
+ DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3351, quirk_disable_all_msi);
++DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_VT3364, quirk_disable_all_msi);
+ /* Disable MSI on chipsets that are known to not support it */
+ static void __devinit quirk_disable_msi(struct pci_dev *dev)
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index 4f7f9e3..9fcc272 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -136,22 +136,10 @@ static void destroy_serial(struct kref *kref)
+       dbg("%s - %s", __func__, serial->type->description);
+-      serial->type->shutdown(serial);
+-
+       /* return the minor range that this device had */
+       if (serial->minor != SERIAL_TTY_NO_MINOR)
+               return_serial(serial);
+-      for (i = 0; i < serial->num_ports; ++i)
+-              serial->port[i]->port.count = 0;
+-
+-      /* the ports are cleaned up and released in port_release() */
+-      for (i = 0; i < serial->num_ports; ++i)
+-              if (serial->port[i]->dev.parent != NULL) {
+-                      device_unregister(&serial->port[i]->dev);
+-                      serial->port[i] = NULL;
+-              }
+-
+       /* If this is a "fake" port, we have to clean it up here, as it will
+        * not get cleaned up in port_release() as it was never registered with
+        * the driver core */
+@@ -186,7 +174,7 @@ static int serial_open (struct tty_struct *tty, struct file *filp)
+       struct usb_serial *serial;
+       struct usb_serial_port *port;
+       unsigned int portNumber;
+-      int retval;
++      int retval = 0;
+       dbg("%s", __func__);
+@@ -197,16 +185,24 @@ static int serial_open (struct tty_struct *tty, struct file *filp)
+               return -ENODEV;
+       }
++      mutex_lock(&serial->disc_mutex);
+       portNumber = tty->index - serial->minor;
+       port = serial->port[portNumber];
+-      if (!port) {
++      if (!port || serial->disconnected)
+               retval = -ENODEV;
+-              goto bailout_kref_put;
+-      }
++      else
++              get_device(&port->dev);
++      /*
++       * Note: Our locking order requirement does not allow port->mutex
++       * to be acquired while serial->disc_mutex is held.
++       */
++      mutex_unlock(&serial->disc_mutex);
++      if (retval)
++              goto bailout_serial_put;
+       if (mutex_lock_interruptible(&port->mutex)) {
+               retval = -ERESTARTSYS;
+-              goto bailout_kref_put;
++              goto bailout_port_put;
+       }
+       ++port->port.count;
+@@ -226,14 +222,20 @@ static int serial_open (struct tty_struct *tty, struct file *filp)
+                       goto bailout_mutex_unlock;
+               }
+-              retval = usb_autopm_get_interface(serial->interface);
++              mutex_lock(&serial->disc_mutex);
++              if (serial->disconnected)
++                      retval = -ENODEV;
++              else
++                      retval = usb_autopm_get_interface(serial->interface);
+               if (retval)
+                       goto bailout_module_put;
++
+               /* only call the device specific open if this
+                * is the first time the port is opened */
+               retval = serial->type->open(tty, port, filp);
+               if (retval)
+                       goto bailout_interface_put;
++              mutex_unlock(&serial->disc_mutex);
+       }
+       mutex_unlock(&port->mutex);
+@@ -242,13 +244,16 @@ static int serial_open (struct tty_struct *tty, struct file *filp)
+ bailout_interface_put:
+       usb_autopm_put_interface(serial->interface);
+ bailout_module_put:
++      mutex_unlock(&serial->disc_mutex);
+       module_put(serial->type->driver.owner);
+ bailout_mutex_unlock:
+       port->port.count = 0;
+       tty->driver_data = NULL;
+       port->port.tty = NULL;
+       mutex_unlock(&port->mutex);
+-bailout_kref_put:
++bailout_port_put:
++      put_device(&port->dev);
++bailout_serial_put:
+       usb_serial_put(serial);
+       return retval;
+ }
+@@ -256,6 +261,9 @@ bailout_kref_put:
+ static void serial_close(struct tty_struct *tty, struct file *filp)
+ {
+       struct usb_serial_port *port = tty->driver_data;
++      struct usb_serial *serial;
++      struct module *owner;
++      int count;
+       if (!port)
+               return;
+@@ -263,6 +271,8 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
+       dbg("%s - port %d", __func__, port->number);
+       mutex_lock(&port->mutex);
++      serial = port->serial;
++      owner = serial->type->driver.owner;
+       if (port->port.count == 0) {
+               mutex_unlock(&port->mutex);
+@@ -273,7 +283,7 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
+       if (port->port.count == 0)
+               /* only call the device specific close if this
+                * port is being closed by the last owner */
+-              port->serial->type->close(tty, port, filp);
++              serial->type->close(tty, port, filp);
+       if (port->port.count == (port->console? 1 : 0)) {
+               if (port->port.tty) {
+@@ -283,16 +293,22 @@ static void serial_close(struct tty_struct *tty, struct file *filp)
+               }
+       }
+-      if (port->port.count == 0) {
+-              mutex_lock(&port->serial->disc_mutex);
+-              if (!port->serial->disconnected)
+-                      usb_autopm_put_interface(port->serial->interface);
+-              mutex_unlock(&port->serial->disc_mutex);
+-              module_put(port->serial->type->driver.owner);
++      count = port->port.count;
++      mutex_unlock(&port->mutex);
++      put_device(&port->dev);
++
++      /* Mustn't dereference port any more */
++      if (count == 0) {
++              mutex_lock(&serial->disc_mutex);
++              if (!serial->disconnected)
++                      usb_autopm_put_interface(serial->interface);
++              mutex_unlock(&serial->disc_mutex);
+       }
++      usb_serial_put(serial);
+-      mutex_unlock(&port->mutex);
+-      usb_serial_put(port->serial);
++      /* Mustn't dereference serial any more */
++      if (count == 0)
++              module_put(owner);
+ }
+ static int serial_write(struct tty_struct *tty, const unsigned char *buf,
+@@ -544,7 +560,13 @@ static void kill_traffic(struct usb_serial_port *port)
+ static void port_free(struct usb_serial_port *port)
+ {
++      /*
++       * Stop all the traffic before cancelling the work, so that
++       * nobody will restart it by calling usb_serial_port_softint.
++       */
+       kill_traffic(port);
++      cancel_work_sync(&port->work);
++
+       usb_free_urb(port->read_urb);
+       usb_free_urb(port->write_urb);
+       usb_free_urb(port->interrupt_in_urb);
+@@ -553,7 +575,6 @@ static void port_free(struct usb_serial_port *port)
+       kfree(port->bulk_out_buffer);
+       kfree(port->interrupt_in_buffer);
+       kfree(port->interrupt_out_buffer);
+-      flush_scheduled_work();         /* port->work */
+       kfree(port);
+ }
+@@ -1037,17 +1058,33 @@ void usb_serial_disconnect(struct usb_interface *interface)
+       usb_set_intfdata(interface, NULL);
+       /* must set a flag, to signal subdrivers */
+       serial->disconnected = 1;
++      mutex_unlock(&serial->disc_mutex);
++
++      /* Unfortunately, many of the sub-drivers expect the port structures
++       * to exist when their shutdown method is called, so we have to go
++       * through this awkward two-step unregistration procedure.
++       */
+       for (i = 0; i < serial->num_ports; ++i) {
+               port = serial->port[i];
+               if (port) {
+                       if (port->port.tty)
+                               tty_hangup(port->port.tty);
+                       kill_traffic(port);
++                      cancel_work_sync(&port->work);
++                      device_del(&port->dev);
+               }
+       }
++      serial->type->shutdown(serial);
++      for (i = 0; i < serial->num_ports; ++i) {
++              port = serial->port[i];
++              if (port) {
++                      put_device(&port->dev);
++                      serial->port[i] = NULL;
++              }
++      }
++
+       /* let the last holder of this object
+        * cause it to be cleaned up */
+-      mutex_unlock(&serial->disc_mutex);
+       usb_serial_put(serial);
+       dev_info(dev, "device disconnected\n");
+ }
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 4cf1617..65115a5 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -2147,6 +2147,12 @@ UNUSUAL_DEV(  0xed06, 0x4500, 0x0001, 0x0001,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_CAPACITY_HEURISTICS),
++/* Reported by Alessio Treglia <quadrispro@ubuntu.com> */
++UNUSUAL_DEV( 0xed10, 0x7636, 0x0001, 0x0001,
++              "TGE",
++              "Digital MP3 Audio Player",
++              US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ),
++
+ /* Control/Bulk transport for all SubClass values */
+ USUAL_DEV(US_SC_RBC, US_PR_CB, USB_US_TYPE_STOR),
+ USUAL_DEV(US_SC_8020, US_PR_CB, USB_US_TYPE_STOR),
+diff --git a/fs/proc/array.c b/fs/proc/array.c
+index 71c9be5..c0cf3bf 100644
+--- a/fs/proc/array.c
++++ b/fs/proc/array.c
+@@ -80,6 +80,7 @@
+ #include <linux/delayacct.h>
+ #include <linux/seq_file.h>
+ #include <linux/pid_namespace.h>
++#include <linux/ptrace.h>
+ #include <linux/tracehook.h>
+ #include <asm/pgtable.h>
+@@ -347,6 +348,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
+       char state;
+       pid_t ppid = 0, pgid = -1, sid = -1;
+       int num_threads = 0;
++      int permitted;
+       struct mm_struct *mm;
+       unsigned long long start_time;
+       unsigned long cmin_flt = 0, cmaj_flt = 0;
+@@ -359,11 +361,14 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
+       state = *get_task_state(task);
+       vsize = eip = esp = 0;
++      permitted = ptrace_may_access(task, PTRACE_MODE_READ);
+       mm = get_task_mm(task);
+       if (mm) {
+               vsize = task_vsize(mm);
+-              eip = KSTK_EIP(task);
+-              esp = KSTK_ESP(task);
++              if (permitted) {
++                      eip = KSTK_EIP(task);
++                      esp = KSTK_ESP(task);
++              }
+       }
+       get_task_comm(tcomm, task);
+@@ -419,7 +424,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
+               unlock_task_sighand(task, &flags);
+       }
+-      if (!whole || num_threads < 2)
++      if (permitted && (!whole || num_threads < 2))
+               wchan = get_wchan(task);
+       if (!whole) {
+               min_flt = task->min_flt;
+@@ -471,7 +476,7 @@ static int do_task_stat(struct seq_file *m, struct pid_namespace *ns,
+               rsslim,
+               mm ? mm->start_code : 0,
+               mm ? mm->end_code : 0,
+-              mm ? mm->start_stack : 0,
++              (permitted && mm) ? mm->start_stack : 0,
+               esp,
+               eip,
+               /* The signal information here is obsolete.
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index 0e910b3..a488f61 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -327,7 +327,10 @@ static int proc_pid_wchan(struct task_struct *task, char *buffer)
+       wchan = get_wchan(task);
+       if (lookup_symbol_name(wchan, symname) < 0)
+-              return sprintf(buffer, "%lu", wchan);
++              if (!ptrace_may_access(task, PTRACE_MODE_READ))
++                      return 0;
++              else
++                      return sprintf(buffer, "%lu", wchan);
+       else
+               return sprintf(buffer, "%s", symname);
+ }
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 8b84227..c7f64a9 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -665,6 +665,10 @@ static ssize_t pagemap_read(struct file *file, char __user *buf,
+               goto out_task;
+       ret = 0;
++
++      if (!count)
++              goto out_task;
++
+       mm = get_task_mm(task);
+       if (!mm)
+               goto out_task;
+diff --git a/include/drm/drm_pciids.h b/include/drm/drm_pciids.h
+index 135bd19..0d97c90 100644
+--- a/include/drm/drm_pciids.h
++++ b/include/drm/drm_pciids.h
+@@ -412,4 +412,5 @@
+       {0x8086, 0x2e02, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0x8086, 0x2e12, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0x8086, 0x2e22, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
++      {0x8086, 0x2e32, PCI_ANY_ID, PCI_ANY_ID, 0, 0, 0}, \
+       {0, 0, 0}
+diff --git a/kernel/time/tick-common.c b/kernel/time/tick-common.c
+index df12434..bad22e2 100644
+--- a/kernel/time/tick-common.c
++++ b/kernel/time/tick-common.c
+@@ -93,7 +93,17 @@ void tick_handle_periodic(struct clock_event_device *dev)
+       for (;;) {
+               if (!clockevents_program_event(dev, next, ktime_get()))
+                       return;
+-              tick_periodic(cpu);
++              /*
++               * Have to be careful here. If we're in oneshot mode,
++               * before we call tick_periodic() in a loop, we need
++               * to be sure we're using a real hardware clocksource.
++               * Otherwise we could get trapped in an infinite
++               * loop, as the tick_periodic() increments jiffies,
++               * when then will increment time, posibly causing
++               * the loop to trigger again and again.
++               */
++              if (timekeeping_valid_for_hres())
++                      tick_periodic(cpu);
+               next = ktime_add(next, tick_period);
+       }
+ }
+diff --git a/mm/madvise.c b/mm/madvise.c
+index b9ce574..36d6ea2 100644
+--- a/mm/madvise.c
++++ b/mm/madvise.c
+@@ -112,6 +112,14 @@ static long madvise_willneed(struct vm_area_struct * vma,
+       if (!file)
+               return -EBADF;
++      /*
++       * Page cache readahead assumes page cache pages are order-0 which
++       * is not the case for hugetlbfs. Do not give a bad return value
++       * but ignore the advice.
++       */
++      if (vma->vm_flags & VM_HUGETLB)
++              return 0;
++
+       if (file->f_mapping->a_ops->get_xip_mem) {
+               /* no bad return value, but ignore advice */
+               return 0;
+diff --git a/scripts/mod/modpost.c b/scripts/mod/modpost.c
+index 8e0de6a..f05e36a 100644
+--- a/scripts/mod/modpost.c
++++ b/scripts/mod/modpost.c
+@@ -1997,6 +1997,7 @@ static void read_markers(const char *fname)
+               if (!mod->skip)
+                       add_marker(mod, marker, fmt);
+       }
++      release_file(file, size);
+       return;
+ fail:
+       fatal("parse error in markers list file\n");
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.23-24 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.23-24
new file mode 100644 (file)
index 0000000..93c8d40
--- /dev/null
@@ -0,0 +1,1633 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Upstream 2.6.27.24 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/filesystems/Locking b/Documentation/filesystems/Locking
+index 8362860..0a7c8a9 100644
+--- a/Documentation/filesystems/Locking
++++ b/Documentation/filesystems/Locking
+@@ -502,23 +502,31 @@ prototypes:
+       void (*open)(struct vm_area_struct*);
+       void (*close)(struct vm_area_struct*);
+       int (*fault)(struct vm_area_struct*, struct vm_fault *);
+-      int (*page_mkwrite)(struct vm_area_struct *, struct page *);
++      int (*page_mkwrite)(struct vm_area_struct *, struct vm_fault *);
+       int (*access)(struct vm_area_struct *, unsigned long, void*, int, int);
+ locking rules:
+               BKL     mmap_sem        PageLocked(page)
+ open:         no      yes
+ close:                no      yes
+-fault:                no      yes
+-page_mkwrite: no      yes             no
++fault:                no      yes             can return with page locked
++page_mkwrite: no      yes             can return with page locked
+ access:               no      yes
+-      ->page_mkwrite() is called when a previously read-only page is
+-about to become writeable. The file system is responsible for
+-protecting against truncate races. Once appropriate action has been
+-taking to lock out truncate, the page range should be verified to be
+-within i_size. The page mapping should also be checked that it is not
+-NULL.
++      ->fault() is called when a previously not present pte is about
++to be faulted in. The filesystem must find and return the page associated
++with the passed in "pgoff" in the vm_fault structure. If it is possible that
++the page may be truncated and/or invalidated, then the filesystem must lock
++the page, then ensure it is not already truncated (the page lock will block
++subsequent truncate), and then return with VM_FAULT_LOCKED, and the page
++locked. The VM will unlock the page.
++
++      ->page_mkwrite() is called when a previously read-only pte is
++about to become writeable. The filesystem again must ensure that there are
++no truncate/invalidate races, and then return with the page locked. If
++the page has been truncated, the filesystem should not look up a new page
++like the ->fault() handler, but simply return with VM_FAULT_NOPAGE, which
++will cause the VM to retry the fault.
+       ->access() is called when get_user_pages() fails in
+ acces_process_vm(), typically used to debug a process through
+diff --git a/Makefile b/Makefile
+index a5c7ae5..2b8138a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .23
++EXTRAVERSION = .24
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
+index eb8f72c..0e034a4 100644
+--- a/drivers/i2c/algos/i2c-algo-bit.c
++++ b/drivers/i2c/algos/i2c-algo-bit.c
+@@ -104,7 +104,7 @@ static int sclhi(struct i2c_algo_bit_data *adap)
+                * chips may hold it low ("clock stretching") while they
+                * are processing data internally.
+                */
+-              if (time_after_eq(jiffies, start + adap->timeout))
++              if (time_after(jiffies, start + adap->timeout))
+                       return -ETIMEDOUT;
+               cond_resched();
+       }
+diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c
+index d50b329..2346a89 100644
+--- a/drivers/i2c/algos/i2c-algo-pca.c
++++ b/drivers/i2c/algos/i2c-algo-pca.c
+@@ -270,10 +270,21 @@ static int pca_xfer(struct i2c_adapter *i2c_adap,
+               case 0x30: /* Data byte in I2CDAT has been transmitted; NOT ACK has been received */
+                       DEB2("NOT ACK received after data byte\n");
++                      pca_stop(adap);
+                       goto out;
+               case 0x38: /* Arbitration lost during SLA+W, SLA+R or data bytes */
+                       DEB2("Arbitration lost\n");
++                      /*
++                       * The PCA9564 data sheet (2006-09-01) says "A
++                       * START condition will be transmitted when the
++                       * bus becomes free (STOP or SCL and SDA high)"
++                       * when the STA bit is set (p. 11).
++                       *
++                       * In case this won't work, try pca_reset()
++                       * instead.
++                       */
++                      pca_start(adap);
+                       goto out;
+               case 0x58: /* Data byte has been received; NOT ACK has been returned */
+diff --git a/drivers/md/bitmap.c b/drivers/md/bitmap.c
+index 666b7ba..8c50857 100644
+--- a/drivers/md/bitmap.c
++++ b/drivers/md/bitmap.c
+@@ -986,6 +986,9 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
+                       oldindex = index;
+                       oldpage = page;
++                      bitmap->filemap[bitmap->file_pages++] = page;
++                      bitmap->last_page_size = count;
++
+                       if (outofdate) {
+                               /*
+                                * if bitmap is out of date, dirty the
+@@ -998,15 +1001,9 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
+                               write_page(bitmap, page, 1);
+                               ret = -EIO;
+-                              if (bitmap->flags & BITMAP_WRITE_ERROR) {
+-                                      /* release, page not in filemap yet */
+-                                      put_page(page);
++                              if (bitmap->flags & BITMAP_WRITE_ERROR)
+                                       goto err;
+-                              }
+                       }
+-
+-                      bitmap->filemap[bitmap->file_pages++] = page;
+-                      bitmap->last_page_size = count;
+               }
+               paddr = kmap_atomic(page, KM_USER0);
+               if (bitmap->flags & BITMAP_HOSTENDIAN)
+@@ -1016,9 +1013,11 @@ static int bitmap_init_from_disk(struct bitmap *bitmap, sector_t start)
+               kunmap_atomic(paddr, KM_USER0);
+               if (b) {
+                       /* if the disk bit is set, set the memory bit */
+-                      bitmap_set_memory_bits(bitmap, i << CHUNK_BLOCK_SHIFT(bitmap),
+-                                             ((i+1) << (CHUNK_BLOCK_SHIFT(bitmap)) >= start)
+-                              );
++                      int needed = ((sector_t)(i+1) << (CHUNK_BLOCK_SHIFT(bitmap))
++                                    >= start);
++                      bitmap_set_memory_bits(bitmap,
++                                             (sector_t)i << CHUNK_BLOCK_SHIFT(bitmap),
++                                             needed);
+                       bit_cnt++;
+                       set_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+               }
+@@ -1154,8 +1153,9 @@ void bitmap_daemon_work(struct bitmap *bitmap)
+                       spin_lock_irqsave(&bitmap->lock, flags);
+                       clear_page_attr(bitmap, page, BITMAP_PAGE_CLEAN);
+               }
+-              bmc = bitmap_get_counter(bitmap, j << CHUNK_BLOCK_SHIFT(bitmap),
+-                                      &blocks, 0);
++              bmc = bitmap_get_counter(bitmap,
++                                       (sector_t)j << CHUNK_BLOCK_SHIFT(bitmap),
++                                       &blocks, 0);
+               if (bmc) {
+ /*
+   if (j < 100) printk("bitmap: j=%lu, *bmc = 0x%x\n", j, *bmc);
+@@ -1169,7 +1169,8 @@ void bitmap_daemon_work(struct bitmap *bitmap)
+                       } else if (*bmc == 1) {
+                               /* we can clear the bit */
+                               *bmc = 0;
+-                              bitmap_count_page(bitmap, j << CHUNK_BLOCK_SHIFT(bitmap),
++                              bitmap_count_page(bitmap,
++                                                (sector_t)j << CHUNK_BLOCK_SHIFT(bitmap),
+                                                 -1);
+                               /* clear the bit */
+@@ -1485,7 +1486,7 @@ void bitmap_dirty_bits(struct bitmap *bitmap, unsigned long s, unsigned long e)
+       unsigned long chunk;
+       for (chunk = s; chunk <= e; chunk++) {
+-              sector_t sec = chunk << CHUNK_BLOCK_SHIFT(bitmap);
++              sector_t sec = (sector_t)chunk << CHUNK_BLOCK_SHIFT(bitmap);
+               bitmap_set_memory_bits(bitmap, sec, 1);
+               bitmap_file_set_bit(bitmap, sec);
+       }
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index 60f3e59..ebbc3bb 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -2772,11 +2772,8 @@ array_state_store(mddev_t *mddev, const char *buf, size_t len)
+                       } else
+                               err = -EBUSY;
+                       spin_unlock_irq(&mddev->write_lock);
+-              } else {
+-                      mddev->ro = 0;
+-                      mddev->recovery_cp = MaxSector;
+-                      err = do_md_run(mddev);
+-              }
++              } else
++                      err = -EINVAL;
+               break;
+       case active:
+               if (mddev->pers) {
+diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
+index dc50f98..b08dd95 100644
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -1805,17 +1805,17 @@ static sector_t sync_request(mddev_t *mddev, sector_t sector_nr, int *skipped, i
+                               r10_bio->sector = sect;
+                               raid10_find_phys(conf, r10_bio);
+-                              /* Need to check if this section will still be
++
++                              /* Need to check if the array will still be
+                                * degraded
+                                */
+-                              for (j=0; j<conf->copies;j++) {
+-                                      int d = r10_bio->devs[j].devnum;
+-                                      if (conf->mirrors[d].rdev == NULL ||
+-                                          test_bit(Faulty, &conf->mirrors[d].rdev->flags)) {
++                              for (j=0; j<conf->raid_disks; j++)
++                                      if (conf->mirrors[j].rdev == NULL ||
++                                          test_bit(Faulty, &conf->mirrors[j].rdev->flags)) {
+                                               still_degraded = 1;
+                                               break;
+                                       }
+-                              }
++
+                               must_sync = bitmap_start_sync(mddev->bitmap, sect,
+                                                             &sync_blocks, still_degraded);
+diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
+index b70c531..a6e730f 100644
+--- a/drivers/net/ehea/ehea_main.c
++++ b/drivers/net/ehea/ehea_main.c
+@@ -529,14 +529,17 @@ static inline struct sk_buff *get_skb_by_index(struct sk_buff **skb_array,
+       x &= (arr_len - 1);
+       pref = skb_array[x];
+-      prefetchw(pref);
+-      prefetchw(pref + EHEA_CACHE_LINE);
+-
+-      pref = (skb_array[x]->data);
+-      prefetch(pref);
+-      prefetch(pref + EHEA_CACHE_LINE);
+-      prefetch(pref + EHEA_CACHE_LINE * 2);
+-      prefetch(pref + EHEA_CACHE_LINE * 3);
++      if (pref) {
++              prefetchw(pref);
++              prefetchw(pref + EHEA_CACHE_LINE);
++
++              pref = (skb_array[x]->data);
++              prefetch(pref);
++              prefetch(pref + EHEA_CACHE_LINE);
++              prefetch(pref + EHEA_CACHE_LINE * 2);
++              prefetch(pref + EHEA_CACHE_LINE * 3);
++      }
++
+       skb = skb_array[skb_index];
+       skb_array[skb_index] = NULL;
+       return skb;
+@@ -553,12 +556,14 @@ static inline struct sk_buff *get_skb_by_index_ll(struct sk_buff **skb_array,
+       x &= (arr_len - 1);
+       pref = skb_array[x];
+-      prefetchw(pref);
+-      prefetchw(pref + EHEA_CACHE_LINE);
++      if (pref) {
++              prefetchw(pref);
++              prefetchw(pref + EHEA_CACHE_LINE);
+-      pref = (skb_array[x]->data);
+-      prefetchw(pref);
+-      prefetchw(pref + EHEA_CACHE_LINE);
++              pref = (skb_array[x]->data);
++              prefetchw(pref);
++              prefetchw(pref + EHEA_CACHE_LINE);
++      }
+       skb = skb_array[wqe_index];
+       skb_array[wqe_index] = NULL;
+diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
+index 3612607..32e7acb 100644
+--- a/drivers/serial/mpc52xx_uart.c
++++ b/drivers/serial/mpc52xx_uart.c
+@@ -515,7 +515,7 @@ mpc52xx_uart_startup(struct uart_port *port)
+       /* Request IRQ */
+       ret = request_irq(port->irq, mpc52xx_uart_int,
+-              IRQF_DISABLED | IRQF_SAMPLE_RANDOM | IRQF_SHARED,
++              IRQF_DISABLED | IRQF_SAMPLE_RANDOM,
+               "mpc52xx_psc_uart", port);
+       if (ret)
+               return ret;
+diff --git a/drivers/usb/gadget/usbstring.c b/drivers/usb/gadget/usbstring.c
+index 4154be3..58c4d37 100644
+--- a/drivers/usb/gadget/usbstring.c
++++ b/drivers/usb/gadget/usbstring.c
+@@ -38,7 +38,7 @@ static int utf8_to_utf16le(const char *s, __le16 *cp, unsigned len)
+                               uchar = (c & 0x1f) << 6;
+                               c = (u8) *s++;
+-                              if ((c & 0xc0) != 0xc0)
++                              if ((c & 0xc0) != 0x80)
+                                       goto fail;
+                               c &= 0x3f;
+                               uchar |= c;
+@@ -49,13 +49,13 @@ static int utf8_to_utf16le(const char *s, __le16 *cp, unsigned len)
+                               uchar = (c & 0x0f) << 12;
+                               c = (u8) *s++;
+-                              if ((c & 0xc0) != 0xc0)
++                              if ((c & 0xc0) != 0x80)
+                                       goto fail;
+                               c &= 0x3f;
+                               uchar |= c << 6;
+                               c = (u8) *s++;
+-                              if ((c & 0xc0) != 0xc0)
++                              if ((c & 0xc0) != 0x80)
+                                       goto fail;
+                               c &= 0x3f;
+                               uchar |= c;
+diff --git a/drivers/video/fb_defio.c b/drivers/video/fb_defio.c
+index 4835bdc..d1c3cba 100644
+--- a/drivers/video/fb_defio.c
++++ b/drivers/video/fb_defio.c
+@@ -70,8 +70,9 @@ EXPORT_SYMBOL_GPL(fb_deferred_io_fsync);
+ /* vm_ops->page_mkwrite handler */
+ static int fb_deferred_io_mkwrite(struct vm_area_struct *vma,
+-                                struct page *page)
++                                struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       struct fb_info *info = vma->vm_private_data;
+       struct fb_deferred_io *fbdefio = info->fbdefio;
+       struct page *cur;
+diff --git a/fs/buffer.c b/fs/buffer.c
+index a5d806d..abe9640 100644
+--- a/fs/buffer.c
++++ b/fs/buffer.c
+@@ -2402,20 +2402,22 @@ int block_commit_write(struct page *page, unsigned from, unsigned to)
+  * unlock the page.
+  */
+ int
+-block_page_mkwrite(struct vm_area_struct *vma, struct page *page,
++block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
+                  get_block_t get_block)
+ {
++      struct page *page = vmf->page;
+       struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+       unsigned long end;
+       loff_t size;
+-      int ret = -EINVAL;
++      int ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */
+       lock_page(page);
+       size = i_size_read(inode);
+       if ((page->mapping != inode->i_mapping) ||
+           (page_offset(page) > size)) {
+               /* page got truncated out from underneath us */
+-              goto out_unlock;
++              unlock_page(page);
++              goto out;
+       }
+       /* page is wholly or partially inside EOF */
+@@ -2428,8 +2430,16 @@ block_page_mkwrite(struct vm_area_struct *vma, struct page *page,
+       if (!ret)
+               ret = block_commit_write(page, 0, end);
+-out_unlock:
+-      unlock_page(page);
++      if (unlikely(ret)) {
++              unlock_page(page);
++              if (ret == -ENOMEM)
++                      ret = VM_FAULT_OOM;
++              else /* -ENOSPC, -EIO, etc */
++                      ret = VM_FAULT_SIGBUS;
++      } else
++              ret = VM_FAULT_LOCKED;
++
++out:
+       return ret;
+ }
+diff --git a/fs/cifs/cifs_unicode.h b/fs/cifs/cifs_unicode.h
+index 14eb9a2..604ce8a 100644
+--- a/fs/cifs/cifs_unicode.h
++++ b/fs/cifs/cifs_unicode.h
+@@ -64,6 +64,13 @@ int cifs_strtoUCS(__le16 *, const char *, int, const struct nls_table *);
+ #endif
+ /*
++ * To be safe - for UCS to UTF-8 with strings loaded with the rare long
++ * characters alloc more to account for such multibyte target UTF-8
++ * characters.
++ */
++#define UNICODE_NAME_MAX ((4 * NAME_MAX) + 2)
++
++/*
+  * UniStrcat:  Concatenate the second string to the first
+  *
+  * Returns:
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 9231e0a..cff0c53 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -91,23 +91,22 @@ static int
+ cifs_strncpy_to_host(char **dst, const char *src, const int maxlen,
+                const bool is_unicode, const struct nls_table *nls_codepage)
+ {
+-      int plen;
++      int src_len, dst_len;
+       if (is_unicode) {
+-              plen = UniStrnlen((wchar_t *)src, maxlen);
+-              *dst = kmalloc(plen + 2, GFP_KERNEL);
++              src_len = UniStrnlen((wchar_t *)src, maxlen);
++              *dst = kmalloc((4 * src_len) + 2, GFP_KERNEL);
+               if (!*dst)
+                       goto cifs_strncpy_to_host_ErrExit;
+-              cifs_strfromUCS_le(*dst, (__le16 *)src, plen, nls_codepage);
++              dst_len = cifs_strfromUCS_le(*dst, (__le16 *)src, src_len, nls_codepage);
++              (*dst)[dst_len + 1] = 0;
+       } else {
+-              plen = strnlen(src, maxlen);
+-              *dst = kmalloc(plen + 2, GFP_KERNEL);
++              src_len = strnlen(src, maxlen);
++              *dst = kmalloc(src_len + 1, GFP_KERNEL);
+               if (!*dst)
+                       goto cifs_strncpy_to_host_ErrExit;
+-              strncpy(*dst, src, plen);
++              strlcpy(*dst, src, src_len + 1);
+       }
+-      (*dst)[plen] = 0;
+-      (*dst)[plen+1] = 0; /* harmless for ASCII case, needed for Unicode */
+       return 0;
+ cifs_strncpy_to_host_ErrExit:
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 21a1abf..d059b3f 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -3549,16 +3549,12 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
+                           BCC(smb_buffer_response)) {
+                               kfree(tcon->nativeFileSystem);
+                               tcon->nativeFileSystem =
+-                                  kzalloc(2*(length + 1), GFP_KERNEL);
++                                  kzalloc((4 * length) + 2, GFP_KERNEL);
+                               if (tcon->nativeFileSystem)
+                                       cifs_strfromUCS_le(
+                                               tcon->nativeFileSystem,
+                                               (__le16 *) bcc_ptr,
+                                               length, nls_codepage);
+-                              bcc_ptr += 2 * length;
+-                              bcc_ptr[0] = 0; /* null terminate the string */
+-                              bcc_ptr[1] = 0;
+-                              bcc_ptr += 2;
+                       }
+                       /* else do not bother copying these information fields*/
+               } else {
+diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
+index b891553..6205593 100644
+--- a/fs/cifs/misc.c
++++ b/fs/cifs/misc.c
+@@ -685,14 +685,15 @@ cifs_convertUCSpath(char *target, const __le16 *source, int maxlen,
+                                               NLS_MAX_CHARSET_SIZE);
+                               if (len > 0) {
+                                       j += len;
+-                                      continue;
++                                      goto overrun_chk;
+                               } else {
+                                       target[j] = '?';
+                               }
+               }
+               j++;
+               /* make sure we do not overrun callers allocated temp buffer */
+-              if (j >= (2 * NAME_MAX))
++overrun_chk:
++              if (j >= UNICODE_NAME_MAX)
+                       break;
+       }
+ cUCS_out:
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
+index 58d5729..2878892 100644
+--- a/fs/cifs/readdir.c
++++ b/fs/cifs/readdir.c
+@@ -1075,7 +1075,7 @@ int cifs_readdir(struct file *file, void *direntry, filldir_t filldir)
+               with the rare long characters alloc more to account for
+               such multibyte target UTF-8 characters. cifs_unicode.c,
+               which actually does the conversion, has the same limit */
+-              tmp_buf = kmalloc((2 * NAME_MAX) + 4, GFP_KERNEL);
++              tmp_buf = kmalloc(UNICODE_NAME_MAX, GFP_KERNEL);
+               for (i = 0; (i < num_to_fill) && (rc == 0); i++) {
+                       if (current_entry == NULL) {
+                               /* evaluate whether this case is an error */
+diff --git a/fs/cifs/sess.c b/fs/cifs/sess.c
+index 89fac77..3890cc2 100644
+--- a/fs/cifs/sess.c
++++ b/fs/cifs/sess.c
+@@ -202,27 +202,26 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
+       int words_left, len;
+       char *data = *pbcc_area;
+-
+-
+       cFYI(1, ("bleft %d", bleft));
+-
+-      /* SMB header is unaligned, so cifs servers word align start of
+-         Unicode strings */
+-      data++;
+-      bleft--; /* Windows servers do not always double null terminate
+-                  their final Unicode string - in which case we
+-                  now will not attempt to decode the byte of junk
+-                  which follows it */
++      /*
++       * Windows servers do not always double null terminate their final
++       * Unicode string. Check to see if there are an uneven number of bytes
++       * left. If so, then add an extra NULL pad byte to the end of the
++       * response.
++       *
++       * See section 2.7.2 in "Implementing CIFS" for details
++       */
++      if (bleft % 2) {
++              data[bleft] = 0;
++              ++bleft;
++      }
+       words_left = bleft / 2;
+       /* save off server operating system */
+       len = UniStrnlen((wchar_t *) data, words_left);
+-/* We look for obvious messed up bcc or strings in response so we do not go off
+-   the end since (at least) WIN2K and Windows XP have a major bug in not null
+-   terminating last Unicode string in response  */
+       if (len >= words_left)
+               return rc;
+@@ -260,13 +259,10 @@ static int decode_unicode_ssetup(char **pbcc_area, int bleft,
+               return rc;
+       kfree(ses->serverDomain);
+-      ses->serverDomain = kzalloc(2 * (len + 1), GFP_KERNEL); /* BB FIXME wrong length */
+-      if (ses->serverDomain != NULL) {
++      ses->serverDomain = kzalloc((4 * len) + 2, GFP_KERNEL);
++      if (ses->serverDomain != NULL)
+               cifs_strfromUCS_le(ses->serverDomain, (__le16 *)data, len,
+                                  nls_cp);
+-              ses->serverDomain[2*len] = 0;
+-              ses->serverDomain[(2*len) + 1] = 0;
+-      }
+       data += 2 * (len + 1);
+       words_left -= len + 1;
+@@ -616,12 +612,18 @@ CIFS_SessSetup(unsigned int xid, struct cifsSesInfo *ses, int first_time,
+       }
+       /* BB check if Unicode and decode strings */
+-      if (smb_buf->Flags2 & SMBFLG2_UNICODE)
++      if (smb_buf->Flags2 & SMBFLG2_UNICODE) {
++              /* unicode string area must be word-aligned */
++              if (((unsigned long) bcc_ptr - (unsigned long) smb_buf) % 2) {
++                      ++bcc_ptr;
++                      --bytes_remaining;
++              }
+               rc = decode_unicode_ssetup(&bcc_ptr, bytes_remaining,
+-                                                 ses, nls_cp);
+-      else
++                                         ses, nls_cp);
++      } else {
+               rc = decode_ascii_ssetup(&bcc_ptr, bytes_remaining,
+                                        ses, nls_cp);
++      }
+ ssetup_exit:
+       if (spnego_key)
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index 801de2c..fd5835b 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -1132,7 +1132,7 @@ error_return:
+ SYSCALL_DEFINE1(epoll_create, int, size)
+ {
+-      if (size < 0)
++      if (size <= 0)
+               return -EINVAL;
+       return sys_epoll_create1(0);
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index f613d57..eadbee3 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -1084,7 +1084,7 @@ extern int ext4_meta_trans_blocks(struct inode *, int nrblocks, int idxblocks);
+ extern int ext4_chunk_trans_blocks(struct inode *, int nrblocks);
+ extern int ext4_block_truncate_page(handle_t *handle,
+               struct address_space *mapping, loff_t from);
+-extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct page *page);
++extern int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf);
+ /* ioctl.c */
+ extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index b233ade..63b911b 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -4861,8 +4861,9 @@ static int ext4_bh_unmapped(handle_t *handle, struct buffer_head *bh)
+       return !buffer_mapped(bh);
+ }
+-int ext4_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++int ext4_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       loff_t size;
+       unsigned long len;
+       int ret = -EINVAL;
+@@ -4913,6 +4914,8 @@ int ext4_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+               goto out_unlock;
+       ret = 0;
+ out_unlock:
++      if (ret)
++              ret = VM_FAULT_SIGBUS;
+       up_read(&inode->i_alloc_sem);
+       return ret;
+ }
+diff --git a/fs/fcntl.c b/fs/fcntl.c
+index 08a109b..ac79b7e 100644
+--- a/fs/fcntl.c
++++ b/fs/fcntl.c
+@@ -117,11 +117,13 @@ SYSCALL_DEFINE2(dup2, unsigned int, oldfd, unsigned int, newfd)
+ {
+       if (unlikely(newfd == oldfd)) { /* corner case */
+               struct files_struct *files = current->files;
++              int retval = oldfd;
++
+               rcu_read_lock();
+               if (!fcheck_files(files, oldfd))
+-                      oldfd = -EBADF;
++                      retval = -EBADF;
+               rcu_read_unlock();
+-              return oldfd;
++              return retval;
+       }
+       return sys_dup3(oldfd, newfd, 0);
+ }
+diff --git a/fs/fuse/file.c b/fs/fuse/file.c
+index 3ada9d7..0c92f15 100644
+--- a/fs/fuse/file.c
++++ b/fs/fuse/file.c
+@@ -1219,8 +1219,9 @@ static void fuse_vma_close(struct vm_area_struct *vma)
+  * - sync(2)
+  * - try_to_free_pages() with order > PAGE_ALLOC_COSTLY_ORDER
+  */
+-static int fuse_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++static int fuse_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       /*
+        * Don't use page->mapping as it may become NULL from a
+        * concurrent truncate.
+diff --git a/fs/gfs2/ops_file.c b/fs/gfs2/ops_file.c
+index e9a366d..641c43b 100644
+--- a/fs/gfs2/ops_file.c
++++ b/fs/gfs2/ops_file.c
+@@ -338,8 +338,9 @@ static int gfs2_allocate_page_backing(struct page *page)
+  * blocks allocated on disk to back that page.
+  */
+-static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++static int gfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+       struct gfs2_inode *ip = GFS2_I(inode);
+       struct gfs2_sbd *sdp = GFS2_SB(inode);
+@@ -411,6 +412,10 @@ out_unlock:
+       gfs2_glock_dq(&gh);
+ out:
+       gfs2_holder_uninit(&gh);
++      if (ret == -ENOMEM)
++              ret = VM_FAULT_OOM;
++      else if (ret)
++              ret = VM_FAULT_SIGBUS;
+       return ret;
+ }
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index 74f92b7..bff8733 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1613,8 +1613,7 @@ static int nfs_rename(struct inode *old_dir, struct dentry *old_dentry,
+               } else if (atomic_read(&new_dentry->d_count) > 1)
+                       /* dentry still busy? */
+                       goto out;
+-      } else
+-              nfs_drop_nlink(new_inode);
++      }
+ go_ahead:
+       /*
+@@ -1627,10 +1626,8 @@ go_ahead:
+       }
+       nfs_inode_return_delegation(old_inode);
+-      if (new_inode != NULL) {
++      if (new_inode != NULL)
+               nfs_inode_return_delegation(new_inode);
+-              d_delete(new_dentry);
+-      }
+       error = NFS_PROTO(old_dir)->rename(old_dir, &old_dentry->d_name,
+                                          new_dir, &new_dentry->d_name);
+@@ -1639,6 +1636,8 @@ out:
+       if (rehash)
+               d_rehash(rehash);
+       if (!error) {
++              if (new_inode != NULL)
++                      nfs_drop_nlink(new_inode);
+               d_move(old_dentry, new_dentry);
+               nfs_set_verifier(new_dentry,
+                                       nfs_save_change_attribute(new_dir));
+diff --git a/fs/nfs/file.c b/fs/nfs/file.c
+index 30541f0..4a57a0f 100644
+--- a/fs/nfs/file.c
++++ b/fs/nfs/file.c
+@@ -448,8 +448,9 @@ const struct address_space_operations nfs_file_aops = {
+       .launder_page = nfs_launder_page,
+ };
+-static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       struct file *filp = vma->vm_file;
+       struct dentry *dentry = filp->f_path.dentry;
+       unsigned pagelen;
+@@ -476,11 +477,11 @@ static int nfs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+               goto out_unlock;
+       ret = nfs_updatepage(filp, page, 0, pagelen);
+-      if (ret == 0)
+-              ret = pagelen;
+ out_unlock:
++      if (!ret)
++              return VM_FAULT_LOCKED;
+       unlock_page(page);
+-      return ret;
++      return VM_FAULT_SIGBUS;
+ }
+ static struct vm_operations_struct nfs_file_vm_ops = {
+diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
+index b0b07df..abffc90 100644
+--- a/fs/nfsd/nfs4xdr.c
++++ b/fs/nfsd/nfs4xdr.c
+@@ -1833,6 +1833,15 @@ nfsd4_encode_dirent_fattr(struct nfsd4_readdir *cd,
+       dentry = lookup_one_len(name, cd->rd_fhp->fh_dentry, namlen);
+       if (IS_ERR(dentry))
+               return nfserrno(PTR_ERR(dentry));
++      if (!dentry->d_inode) {
++              /*
++               * nfsd_buffered_readdir drops the i_mutex between
++               * readdir and calling this callback, leaving a window
++               * where this directory entry could have gone away.
++               */
++              dput(dentry);
++              return nfserr_noent;
++      }
+       exp_get(exp);
+       /*
+@@ -1895,6 +1904,7 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
+       struct nfsd4_readdir *cd = container_of(ccd, struct nfsd4_readdir, common);
+       int buflen;
+       __be32 *p = cd->buffer;
++      __be32 *cookiep;
+       __be32 nfserr = nfserr_toosmall;
+       /* In nfsv4, "." and ".." never make it onto the wire.. */
+@@ -1911,7 +1921,7 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
+               goto fail;
+       *p++ = xdr_one;                             /* mark entry present */
+-      cd->offset = p;                             /* remember pointer */
++      cookiep = p;
+       p = xdr_encode_hyper(p, NFS_OFFSET_MAX);    /* offset of next entry */
+       p = xdr_encode_array(p, name, namlen);      /* name length & name */
+@@ -1925,6 +1935,8 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
+               goto fail;
+       case nfserr_dropit:
+               goto fail;
++      case nfserr_noent:
++              goto skip_entry;
+       default:
+               /*
+                * If the client requested the RDATTR_ERROR attribute,
+@@ -1943,6 +1955,8 @@ nfsd4_encode_dirent(void *ccdv, const char *name, int namlen,
+       }
+       cd->buflen -= (p - cd->buffer);
+       cd->buffer = p;
++      cd->offset = cookiep;
++skip_entry:
+       cd->common.err = nfs_ok;
+       return 0;
+ fail:
+diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
+index 6f7ea0a..08af0ed 100644
+--- a/fs/ocfs2/file.c
++++ b/fs/ocfs2/file.c
+@@ -2075,6 +2075,22 @@ out_sems:
+       return written ? written : ret;
+ }
++static int ocfs2_splice_to_file(struct pipe_inode_info *pipe,
++                              struct file *out,
++                              struct splice_desc *sd)
++{
++      int ret;
++
++      ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, &sd->pos,
++                                          sd->total_len, 0, NULL);
++      if (ret < 0) {
++              mlog_errno(ret);
++              return ret;
++      }
++
++      return splice_from_pipe_feed(pipe, sd, pipe_to_file);
++}
++
+ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
+                                      struct file *out,
+                                      loff_t *ppos,
+@@ -2082,38 +2098,76 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
+                                      unsigned int flags)
+ {
+       int ret;
+-      struct inode *inode = out->f_path.dentry->d_inode;
++      struct address_space *mapping = out->f_mapping;
++      struct inode *inode = mapping->host;
++      struct splice_desc sd = {
++              .total_len = len,
++              .flags = flags,
++              .pos = *ppos,
++              .u.file = out,
++      };
+       mlog_entry("(0x%p, 0x%p, %u, '%.*s')\n", out, pipe,
+                  (unsigned int)len,
+                  out->f_path.dentry->d_name.len,
+                  out->f_path.dentry->d_name.name);
+-      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
++      if (pipe->inode)
++              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT);
+-      ret = ocfs2_rw_lock(inode, 1);
+-      if (ret < 0) {
+-              mlog_errno(ret);
+-              goto out;
+-      }
++      splice_from_pipe_begin(&sd);
++      do {
++              ret = splice_from_pipe_next(pipe, &sd);
++              if (ret <= 0)
++                      break;
+-      ret = ocfs2_prepare_inode_for_write(out->f_path.dentry, ppos, len, 0,
+-                                          NULL);
+-      if (ret < 0) {
+-              mlog_errno(ret);
+-              goto out_unlock;
+-      }
++              mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
++              ret = ocfs2_rw_lock(inode, 1);
++              if (ret < 0)
++                      mlog_errno(ret);
++              else {
++                      ret = ocfs2_splice_to_file(pipe, out, &sd);
++                      ocfs2_rw_unlock(inode, 1);
++              }
++              mutex_unlock(&inode->i_mutex);
++      } while (ret > 0);
++      splice_from_pipe_end(pipe, &sd);
+       if (pipe->inode)
+-              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
+-      ret = generic_file_splice_write_nolock(pipe, out, ppos, len, flags);
+-      if (pipe->inode)
+               mutex_unlock(&pipe->inode->i_mutex);
+-out_unlock:
+-      ocfs2_rw_unlock(inode, 1);
+-out:
+-      mutex_unlock(&inode->i_mutex);
++      if (sd.num_spliced)
++              ret = sd.num_spliced;
++
++      if (ret > 0) {
++              unsigned long nr_pages;
++
++              *ppos += ret;
++              nr_pages = (ret + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
++
++              /*
++               * If file or inode is SYNC and we actually wrote some data,
++               * sync it.
++               */
++              if (unlikely((out->f_flags & O_SYNC) || IS_SYNC(inode))) {
++                      int err;
++
++                      mutex_lock(&inode->i_mutex);
++                      err = ocfs2_rw_lock(inode, 1);
++                      if (err < 0) {
++                              mlog_errno(err);
++                      } else {
++                              err = generic_osync_inode(inode, mapping,
++                                                OSYNC_METADATA|OSYNC_DATA);
++                              ocfs2_rw_unlock(inode, 1);
++                      }
++                      mutex_unlock(&inode->i_mutex);
++
++                      if (err)
++                              ret = err;
++              }
++              balance_dirty_pages_ratelimited_nr(mapping, nr_pages);
++      }
+       mlog_exit(ret);
+       return ret;
+diff --git a/fs/ocfs2/mmap.c b/fs/ocfs2/mmap.c
+index 3dc18d6..2383cbd 100644
+--- a/fs/ocfs2/mmap.c
++++ b/fs/ocfs2/mmap.c
+@@ -150,8 +150,9 @@ out:
+       return ret;
+ }
+-static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++static int ocfs2_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+       struct buffer_head *di_bh = NULL;
+       sigset_t blocked, oldset;
+@@ -192,7 +193,8 @@ out:
+       ret2 = ocfs2_vm_op_unblock_sigs(&oldset);
+       if (ret2 < 0)
+               mlog_errno(ret2);
+-
++      if (ret)
++              ret = VM_FAULT_SIGBUS;
+       return ret;
+ }
+diff --git a/fs/splice.c b/fs/splice.c
+index aea1eb4..2f2d8c1 100644
+--- a/fs/splice.c
++++ b/fs/splice.c
+@@ -553,8 +553,8 @@ static int pipe_to_sendpage(struct pipe_inode_info *pipe,
+  * SPLICE_F_MOVE isn't set, or we cannot move the page, we simply create
+  * a new page in the output file page cache and fill/dirty that.
+  */
+-static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
+-                      struct splice_desc *sd)
++int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
++               struct splice_desc *sd)
+ {
+       struct file *file = sd->u.file;
+       struct address_space *mapping = file->f_mapping;
+@@ -598,108 +598,178 @@ static int pipe_to_file(struct pipe_inode_info *pipe, struct pipe_buffer *buf,
+ out:
+       return ret;
+ }
++EXPORT_SYMBOL(pipe_to_file);
++
++static void wakeup_pipe_writers(struct pipe_inode_info *pipe)
++{
++      smp_mb();
++      if (waitqueue_active(&pipe->wait))
++              wake_up_interruptible(&pipe->wait);
++      kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
++}
+ /**
+- * __splice_from_pipe - splice data from a pipe to given actor
++ * splice_from_pipe_feed - feed available data from a pipe to a file
+  * @pipe:     pipe to splice from
+  * @sd:               information to @actor
+  * @actor:    handler that splices the data
+  *
+  * Description:
+- *    This function does little more than loop over the pipe and call
+- *    @actor to do the actual moving of a single struct pipe_buffer to
+- *    the desired destination. See pipe_to_file, pipe_to_sendpage, or
+- *    pipe_to_user.
++
++ *    This function loops over the pipe and calls @actor to do the
++ *    actual moving of a single struct pipe_buffer to the desired
++ *    destination.  It returns when there's no more buffers left in
++ *    the pipe or if the requested number of bytes (@sd->total_len)
++ *    have been copied.  It returns a positive number (one) if the
++ *    pipe needs to be filled with more data, zero if the required
++ *    number of bytes have been copied and -errno on error.
+  *
++ *    This, together with splice_from_pipe_{begin,end,next}, may be
++ *    used to implement the functionality of __splice_from_pipe() when
++ *    locking is required around copying the pipe buffers to the
++ *    destination.
+  */
+-ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd,
+-                         splice_actor *actor)
++int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd,
++                        splice_actor *actor)
+ {
+-      int ret, do_wakeup, err;
+-
+-      ret = 0;
+-      do_wakeup = 0;
+-
+-      for (;;) {
+-              if (pipe->nrbufs) {
+-                      struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
+-                      const struct pipe_buf_operations *ops = buf->ops;
++      int ret;
+-                      sd->len = buf->len;
+-                      if (sd->len > sd->total_len)
+-                              sd->len = sd->total_len;
++      while (pipe->nrbufs) {
++              struct pipe_buffer *buf = pipe->bufs + pipe->curbuf;
++              const struct pipe_buf_operations *ops = buf->ops;
+-                      err = actor(pipe, buf, sd);
+-                      if (err <= 0) {
+-                              if (!ret && err != -ENODATA)
+-                                      ret = err;
++              sd->len = buf->len;
++              if (sd->len > sd->total_len)
++                      sd->len = sd->total_len;
+-                              break;
+-                      }
++              ret = actor(pipe, buf, sd);
++              if (ret <= 0) {
++                      if (ret == -ENODATA)
++                              ret = 0;
++                      return ret;
++              }
++              buf->offset += ret;
++              buf->len -= ret;
+-                      ret += err;
+-                      buf->offset += err;
+-                      buf->len -= err;
++              sd->num_spliced += ret;
++              sd->len -= ret;
++              sd->pos += ret;
++              sd->total_len -= ret;
+-                      sd->len -= err;
+-                      sd->pos += err;
+-                      sd->total_len -= err;
+-                      if (sd->len)
+-                              continue;
++              if (!buf->len) {
++                      buf->ops = NULL;
++                      ops->release(pipe, buf);
++                      pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
++                      pipe->nrbufs--;
++                      if (pipe->inode)
++                              sd->need_wakeup = true;
++              }
+-                      if (!buf->len) {
+-                              buf->ops = NULL;
+-                              ops->release(pipe, buf);
+-                              pipe->curbuf = (pipe->curbuf + 1) & (PIPE_BUFFERS - 1);
+-                              pipe->nrbufs--;
+-                              if (pipe->inode)
+-                                      do_wakeup = 1;
+-                      }
++              if (!sd->total_len)
++                      return 0;
++      }
+-                      if (!sd->total_len)
+-                              break;
+-              }
++      return 1;
++}
++EXPORT_SYMBOL(splice_from_pipe_feed);
+-              if (pipe->nrbufs)
+-                      continue;
++/**
++ * splice_from_pipe_next - wait for some data to splice from
++ * @pipe:     pipe to splice from
++ * @sd:               information about the splice operation
++ *
++ * Description:
++ *    This function will wait for some data and return a positive
++ *    value (one) if pipe buffers are available.  It will return zero
++ *    or -errno if no more data needs to be spliced.
++ */
++int splice_from_pipe_next(struct pipe_inode_info *pipe, struct splice_desc *sd)
++{
++      while (!pipe->nrbufs) {
+               if (!pipe->writers)
+-                      break;
+-              if (!pipe->waiting_writers) {
+-                      if (ret)
+-                              break;
+-              }
++                      return 0;
+-              if (sd->flags & SPLICE_F_NONBLOCK) {
+-                      if (!ret)
+-                              ret = -EAGAIN;
+-                      break;
+-              }
++              if (!pipe->waiting_writers && sd->num_spliced)
++                      return 0;
+-              if (signal_pending(current)) {
+-                      if (!ret)
+-                              ret = -ERESTARTSYS;
+-                      break;
+-              }
++              if (sd->flags & SPLICE_F_NONBLOCK)
++                      return -EAGAIN;
+-              if (do_wakeup) {
+-                      smp_mb();
+-                      if (waitqueue_active(&pipe->wait))
+-                              wake_up_interruptible_sync(&pipe->wait);
+-                      kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
+-                      do_wakeup = 0;
++              if (signal_pending(current))
++                      return -ERESTARTSYS;
++
++              if (sd->need_wakeup) {
++                      wakeup_pipe_writers(pipe);
++                      sd->need_wakeup = false;
+               }
+               pipe_wait(pipe);
+       }
+-      if (do_wakeup) {
+-              smp_mb();
+-              if (waitqueue_active(&pipe->wait))
+-                      wake_up_interruptible(&pipe->wait);
+-              kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
+-      }
++      return 1;
++}
++EXPORT_SYMBOL(splice_from_pipe_next);
+-      return ret;
++/**
++ * splice_from_pipe_begin - start splicing from pipe
++ * @pipe:     pipe to splice from
++ *
++ * Description:
++ *    This function should be called before a loop containing
++ *    splice_from_pipe_next() and splice_from_pipe_feed() to
++ *    initialize the necessary fields of @sd.
++ */
++void splice_from_pipe_begin(struct splice_desc *sd)
++{
++      sd->num_spliced = 0;
++      sd->need_wakeup = false;
++}
++EXPORT_SYMBOL(splice_from_pipe_begin);
++
++/**
++ * splice_from_pipe_end - finish splicing from pipe
++ * @pipe:     pipe to splice from
++ * @sd:               information about the splice operation
++ *
++ * Description:
++ *    This function will wake up pipe writers if necessary.  It should
++ *    be called after a loop containing splice_from_pipe_next() and
++ *    splice_from_pipe_feed().
++ */
++void splice_from_pipe_end(struct pipe_inode_info *pipe, struct splice_desc *sd)
++{
++      if (sd->need_wakeup)
++              wakeup_pipe_writers(pipe);
++}
++EXPORT_SYMBOL(splice_from_pipe_end);
++
++/**
++ * __splice_from_pipe - splice data from a pipe to given actor
++ * @pipe:     pipe to splice from
++ * @sd:               information to @actor
++ * @actor:    handler that splices the data
++ *
++ * Description:
++ *    This function does little more than loop over the pipe and call
++ *    @actor to do the actual moving of a single struct pipe_buffer to
++ *    the desired destination. See pipe_to_file, pipe_to_sendpage, or
++ *    pipe_to_user.
++ *
++ */
++ssize_t __splice_from_pipe(struct pipe_inode_info *pipe, struct splice_desc *sd,
++                         splice_actor *actor)
++{
++      int ret;
++
++      splice_from_pipe_begin(sd);
++      do {
++              ret = splice_from_pipe_next(pipe, sd);
++              if (ret > 0)
++                      ret = splice_from_pipe_feed(pipe, sd, actor);
++      } while (ret > 0);
++      splice_from_pipe_end(pipe, sd);
++
++      return sd->num_spliced ? sd->num_spliced : ret;
+ }
+ EXPORT_SYMBOL(__splice_from_pipe);
+@@ -713,7 +783,7 @@ EXPORT_SYMBOL(__splice_from_pipe);
+  * @actor:    handler that splices the data
+  *
+  * Description:
+- *    See __splice_from_pipe. This function locks the input and output inodes,
++ *    See __splice_from_pipe. This function locks the pipe inode,
+  *    otherwise it's identical to __splice_from_pipe().
+  *
+  */
+@@ -722,7 +792,6 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
+                        splice_actor *actor)
+ {
+       ssize_t ret;
+-      struct inode *inode = out->f_mapping->host;
+       struct splice_desc sd = {
+               .total_len = len,
+               .flags = flags,
+@@ -730,24 +799,11 @@ ssize_t splice_from_pipe(struct pipe_inode_info *pipe, struct file *out,
+               .u.file = out,
+       };
+-      /*
+-       * The actor worker might be calling ->prepare_write and
+-       * ->commit_write. Most of the time, these expect i_mutex to
+-       * be held. Since this may result in an ABBA deadlock with
+-       * pipe->inode, we have to order lock acquiry here.
+-       *
+-       * Outer lock must be inode->i_mutex, as pipe_wait() will
+-       * release and reacquire pipe->inode->i_mutex, AND inode must
+-       * never be a pipe.
+-       */
+-      WARN_ON(S_ISFIFO(inode->i_mode));
+-      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+       if (pipe->inode)
+-              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
++              mutex_lock(&pipe->inode->i_mutex);
+       ret = __splice_from_pipe(pipe, &sd, actor);
+       if (pipe->inode)
+               mutex_unlock(&pipe->inode->i_mutex);
+-      mutex_unlock(&inode->i_mutex);
+       return ret;
+ }
+@@ -838,17 +894,29 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
+       };
+       ssize_t ret;
+-      WARN_ON(S_ISFIFO(inode->i_mode));
+-      mutex_lock_nested(&inode->i_mutex, I_MUTEX_PARENT);
+-      ret = file_remove_suid(out);
+-      if (likely(!ret)) {
+-              if (pipe->inode)
+-                      mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_CHILD);
+-              ret = __splice_from_pipe(pipe, &sd, pipe_to_file);
+-              if (pipe->inode)
+-                      mutex_unlock(&pipe->inode->i_mutex);
+-      }
+-      mutex_unlock(&inode->i_mutex);
++      if (pipe->inode)
++              mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT);
++
++      splice_from_pipe_begin(&sd);
++      do {
++              ret = splice_from_pipe_next(pipe, &sd);
++              if (ret <= 0)
++                      break;
++
++              mutex_lock_nested(&inode->i_mutex, I_MUTEX_CHILD);
++              ret = file_remove_suid(out);
++              if (!ret)
++                      ret = splice_from_pipe_feed(pipe, &sd, pipe_to_file);
++              mutex_unlock(&inode->i_mutex);
++      } while (ret > 0);
++      splice_from_pipe_end(pipe, &sd);
++
++      if (pipe->inode)
++              mutex_unlock(&pipe->inode->i_mutex);
++
++      if (sd.num_spliced)
++              ret = sd.num_spliced;
++
+       if (ret > 0) {
+               unsigned long nr_pages;
+diff --git a/fs/ubifs/file.c b/fs/ubifs/file.c
+index 40033dc..82b1c4a 100644
+--- a/fs/ubifs/file.c
++++ b/fs/ubifs/file.c
+@@ -1140,8 +1140,9 @@ static int ubifs_releasepage(struct page *page, gfp_t unused_gfp_flags)
+  * mmap()d file has taken write protection fault and is being made
+  * writable. UBIFS must ensure page is budgeted for.
+  */
+-static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
++static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf)
+ {
++      struct page *page = vmf->page;
+       struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+       struct ubifs_info *c = inode->i_sb->s_fs_info;
+       struct timespec now = ubifs_current_time(inode);
+@@ -1153,7 +1154,7 @@ static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+       ubifs_assert(!(inode->i_sb->s_flags & MS_RDONLY));
+       if (unlikely(c->ro_media))
+-              return -EROFS;
++              return VM_FAULT_SIGBUS; /* -EROFS */
+       /*
+        * We have not locked @page so far so we may budget for changing the
+@@ -1186,7 +1187,7 @@ static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+               if (err == -ENOSPC)
+                       ubifs_warn("out of space for mmapped file "
+                                  "(inode number %lu)", inode->i_ino);
+-              return err;
++              return VM_FAULT_SIGBUS;
+       }
+       lock_page(page);
+@@ -1226,6 +1227,8 @@ static int ubifs_vm_page_mkwrite(struct vm_area_struct *vma, struct page *page)
+ out_unlock:
+       unlock_page(page);
+       ubifs_release_budget(c, &req);
++      if (err)
++              err = VM_FAULT_SIGBUS;
+       return err;
+ }
+diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
+index 5311c1a..469502c 100644
+--- a/fs/xfs/linux-2.6/xfs_file.c
++++ b/fs/xfs/linux-2.6/xfs_file.c
+@@ -427,9 +427,9 @@ xfs_file_ioctl_invis(
+ STATIC int
+ xfs_vm_page_mkwrite(
+       struct vm_area_struct   *vma,
+-      struct page             *page)
++      struct vm_fault         *vmf)
+ {
+-      return block_page_mkwrite(vma, page, xfs_get_blocks);
++      return block_page_mkwrite(vma, vmf, xfs_get_blocks);
+ }
+ const struct file_operations xfs_file_operations = {
+diff --git a/include/linux/buffer_head.h b/include/linux/buffer_head.h
+index eadaab4..657c072 100644
+--- a/include/linux/buffer_head.h
++++ b/include/linux/buffer_head.h
+@@ -222,7 +222,7 @@ int cont_write_begin(struct file *, struct address_space *, loff_t,
+                       get_block_t *, loff_t *);
+ int generic_cont_expand_simple(struct inode *inode, loff_t size);
+ int block_commit_write(struct page *page, unsigned from, unsigned to);
+-int block_page_mkwrite(struct vm_area_struct *vma, struct page *page,
++int block_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf,
+                               get_block_t get_block);
+ void block_sync_page(struct page *);
+ sector_t generic_block_bmap(struct address_space *, sector_t, get_block_t *);
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index 2a75579..ae9775d 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -138,6 +138,7 @@ extern pgprot_t protection_map[16];
+ #define FAULT_FLAG_WRITE      0x01    /* Fault was a write access */
+ #define FAULT_FLAG_NONLINEAR  0x02    /* Fault was via a nonlinear mapping */
++#define FAULT_FLAG_MKWRITE    0x04    /* Fault was mkwrite of existing pte */
+ /*
+@@ -173,7 +174,7 @@ struct vm_operations_struct {
+       /* notification that a previously read-only page is about to become
+        * writable, if an error is returned it will cause a SIGBUS */
+-      int (*page_mkwrite)(struct vm_area_struct *vma, struct page *page);
++      int (*page_mkwrite)(struct vm_area_struct *vma, struct vm_fault *vmf);
+       /* called by access_process_vm when get_user_pages() fails, typically
+        * for use by special VMAs that can switch between memory and hardware
+diff --git a/include/linux/splice.h b/include/linux/splice.h
+index 528dcb9..5f3faa9 100644
+--- a/include/linux/splice.h
++++ b/include/linux/splice.h
+@@ -36,6 +36,8 @@ struct splice_desc {
+               void *data;             /* cookie */
+       } u;
+       loff_t pos;                     /* file position */
++      size_t num_spliced;             /* number of bytes already spliced */
++      bool need_wakeup;               /* need to wake up writer */
+ };
+ struct partial_page {
+@@ -66,6 +68,16 @@ extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
+                               splice_actor *);
+ extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
+                                 struct splice_desc *, splice_actor *);
++extern int splice_from_pipe_feed(struct pipe_inode_info *, struct splice_desc *,
++                               splice_actor *);
++extern int splice_from_pipe_next(struct pipe_inode_info *,
++                               struct splice_desc *);
++extern void splice_from_pipe_begin(struct splice_desc *);
++extern void splice_from_pipe_end(struct pipe_inode_info *,
++                               struct splice_desc *);
++extern int pipe_to_file(struct pipe_inode_info *, struct pipe_buffer *,
++                      struct splice_desc *);
++
+ extern ssize_t splice_to_pipe(struct pipe_inode_info *,
+                             struct splice_pipe_desc *);
+ extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
+diff --git a/mm/memory.c b/mm/memory.c
+index 1002f47..3856c36 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -1801,6 +1801,15 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
+                * get_user_pages(.write=1, .force=1).
+                */
+               if (vma->vm_ops && vma->vm_ops->page_mkwrite) {
++                      struct vm_fault vmf;
++                      int tmp;
++
++                      vmf.virtual_address = (void __user *)(address &
++                                                              PAGE_MASK);
++                      vmf.pgoff = old_page->index;
++                      vmf.flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE;
++                      vmf.page = old_page;
++
+                       /*
+                        * Notify the address space that the page is about to
+                        * become writable so that it can prohibit this or wait
+@@ -1812,8 +1821,21 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
+                       page_cache_get(old_page);
+                       pte_unmap_unlock(page_table, ptl);
+-                      if (vma->vm_ops->page_mkwrite(vma, old_page) < 0)
++                      tmp = vma->vm_ops->page_mkwrite(vma, &vmf);
++                      if (unlikely(tmp &
++                                      (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) {
++                              ret = tmp;
+                               goto unwritable_page;
++                      }
++                      if (unlikely(!(tmp & VM_FAULT_LOCKED))) {
++                              lock_page(old_page);
++                              if (!old_page->mapping) {
++                                      ret = 0; /* retry the fault */
++                                      unlock_page(old_page);
++                                      goto unwritable_page;
++                              }
++                      } else
++                              VM_BUG_ON(!PageLocked(old_page));
+                       /*
+                        * Since we dropped the lock we need to revalidate
+@@ -1823,9 +1845,11 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,
+                        */
+                       page_table = pte_offset_map_lock(mm, pmd, address,
+                                                        &ptl);
+-                      page_cache_release(old_page);
+-                      if (!pte_same(*page_table, orig_pte))
++                      if (!pte_same(*page_table, orig_pte)) {
++                              unlock_page(old_page);
++                              page_cache_release(old_page);
+                               goto unlock;
++                      }
+                       page_mkwrite = 1;
+               }
+@@ -1930,9 +1954,6 @@ gotten:
+ unlock:
+       pte_unmap_unlock(page_table, ptl);
+       if (dirty_page) {
+-              if (vma->vm_file)
+-                      file_update_time(vma->vm_file);
+-
+               /*
+                * Yes, Virginia, this is actually required to prevent a race
+                * with clear_page_dirty_for_io() from clearing the page dirty
+@@ -1941,21 +1962,46 @@ unlock:
+                *
+                * do_no_page is protected similarly.
+                */
+-              wait_on_page_locked(dirty_page);
+-              set_page_dirty_balance(dirty_page, page_mkwrite);
++              if (!page_mkwrite) {
++                      wait_on_page_locked(dirty_page);
++                      set_page_dirty_balance(dirty_page, page_mkwrite);
++              }
+               put_page(dirty_page);
++              if (page_mkwrite) {
++                      struct address_space *mapping = dirty_page->mapping;
++
++                      set_page_dirty(dirty_page);
++                      unlock_page(dirty_page);
++                      page_cache_release(dirty_page);
++                      if (mapping)    {
++                              /*
++                               * Some device drivers do not set page.mapping
++                               * but still dirty their pages
++                               */
++                              balance_dirty_pages_ratelimited(mapping);
++                      }
++              }
++
++              /* file_update_time outside page_lock */
++              if (vma->vm_file)
++                      file_update_time(vma->vm_file);
+       }
+       return ret;
+ oom_free_new:
+       page_cache_release(new_page);
+ oom:
+-      if (old_page)
++      if (old_page) {
++              if (page_mkwrite) {
++                      unlock_page(old_page);
++                      page_cache_release(old_page);
++              }
+               page_cache_release(old_page);
++      }
+       return VM_FAULT_OOM;
+ unwritable_page:
+       page_cache_release(old_page);
+-      return VM_FAULT_SIGBUS;
++      return ret;
+ }
+ /*
+@@ -2472,25 +2518,25 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+                        * to become writable
+                        */
+                       if (vma->vm_ops->page_mkwrite) {
++                              int tmp;
++
+                               unlock_page(page);
+-                              if (vma->vm_ops->page_mkwrite(vma, page) < 0) {
+-                                      ret = VM_FAULT_SIGBUS;
+-                                      anon = 1; /* no anon but release vmf.page */
+-                                      goto out_unlocked;
+-                              }
+-                              lock_page(page);
+-                              /*
+-                               * XXX: this is not quite right (racy vs
+-                               * invalidate) to unlock and relock the page
+-                               * like this, however a better fix requires
+-                               * reworking page_mkwrite locking API, which
+-                               * is better done later.
+-                               */
+-                              if (!page->mapping) {
+-                                      ret = 0;
+-                                      anon = 1; /* no anon but release vmf.page */
+-                                      goto out;
++                              vmf.flags = FAULT_FLAG_WRITE|FAULT_FLAG_MKWRITE;
++                              tmp = vma->vm_ops->page_mkwrite(vma, &vmf);
++                              if (unlikely(tmp &
++                                        (VM_FAULT_ERROR | VM_FAULT_NOPAGE))) {
++                                      ret = tmp;
++                                      goto unwritable_page;
+                               }
++                              if (unlikely(!(tmp & VM_FAULT_LOCKED))) {
++                                      lock_page(page);
++                                      if (!page->mapping) {
++                                              ret = 0; /* retry the fault */
++                                              unlock_page(page);
++                                              goto unwritable_page;
++                                      }
++                              } else
++                                      VM_BUG_ON(!PageLocked(page));
+                               page_mkwrite = 1;
+                       }
+               }
+@@ -2547,19 +2593,35 @@ static int __do_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+       pte_unmap_unlock(page_table, ptl);
+ out:
+-      unlock_page(vmf.page);
+-out_unlocked:
+-      if (anon)
+-              page_cache_release(vmf.page);
+-      else if (dirty_page) {
+-              if (vma->vm_file)
+-                      file_update_time(vma->vm_file);
++      if (dirty_page) {
++              struct address_space *mapping = page->mapping;
+-              set_page_dirty_balance(dirty_page, page_mkwrite);
++              if (set_page_dirty(dirty_page))
++                      page_mkwrite = 1;
++              unlock_page(dirty_page);
+               put_page(dirty_page);
++              if (page_mkwrite && mapping) {
++                      /*
++                       * Some device drivers do not set page.mapping but still
++                       * dirty their pages
++                       */
++                      balance_dirty_pages_ratelimited(mapping);
++              }
++
++              /* file_update_time outside page_lock */
++              if (vma->vm_file)
++                      file_update_time(vma->vm_file);
++      } else {
++              unlock_page(vmf.page);
++              if (anon)
++                      page_cache_release(vmf.page);
+       }
+       return ret;
++
++unwritable_page:
++      page_cache_release(page);
++      return ret;
+ }
+ static int do_linear_fault(struct mm_struct *mm, struct vm_area_struct *vma,
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.24-25 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.24-25
new file mode 100644 (file)
index 0000000..5b76a1f
--- /dev/null
@@ -0,0 +1,1798 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Upstream 2.6.27.25 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/filesystems/ext4.txt b/Documentation/filesystems/ext4.txt
+index 0d53949..befe8d4 100644
+--- a/Documentation/filesystems/ext4.txt
++++ b/Documentation/filesystems/ext4.txt
+@@ -73,7 +73,7 @@ Mailing list: linux-ext4@vger.kernel.org
+ * extent format more robust in face of on-disk corruption due to magics,
+ * internal redunancy in tree
+ * improved file allocation (multi-block alloc)
+-* fix 32000 subdirectory limit
++* lift 32000 subdirectory limit imposed by i_links_count[1]
+ * nsec timestamps for mtime, atime, ctime, create time
+ * inode version field on disk (NFSv4, Lustre)
+ * reduced e2fsck time via uninit_bg feature
+@@ -88,6 +88,9 @@ Mailing list: linux-ext4@vger.kernel.org
+ * efficent new ordered mode in JBD2 and ext4(avoid using buffer head to force
+   the ordering)
++[1] Filesystems with a block size of 1k may see a limit imposed by the
++directory hash tree having a maximum depth of two.
++
+ 2.2 Candidate features for future inclusion
+ * Online defrag (patches available but not well tested)
+diff --git a/Makefile b/Makefile
+index 2b8138a..1314692 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .24
++EXTRAVERSION = .25
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/sparc/include/asm/pil.h b/arch/sparc/include/asm/pil.h
+index 71819bb..6ea90d7 100644
+--- a/arch/sparc/include/asm/pil.h
++++ b/arch/sparc/include/asm/pil.h
+@@ -18,5 +18,6 @@
+ #define PIL_SMP_CTX_NEW_VERSION       4
+ #define PIL_DEVICE_IRQ                5
+ #define PIL_SMP_CALL_FUNC_SNGL        6
++#define PIL_KGDB_CAPTURE      8
+ #endif /* !(_SPARC64_PIL_H) */
+diff --git a/arch/sparc/include/asm/tlb_64.h b/arch/sparc/include/asm/tlb_64.h
+index ec81cde..0aaa086 100644
+--- a/arch/sparc/include/asm/tlb_64.h
++++ b/arch/sparc/include/asm/tlb_64.h
+@@ -58,6 +58,8 @@ static inline struct mmu_gather *tlb_gather_mmu(struct mm_struct *mm, unsigned i
+ static inline void tlb_flush_mmu(struct mmu_gather *mp)
+ {
+       if (mp->need_flush) {
++              if (!mp->fullmm)
++                      flush_tlb_pending();
+               free_pages_and_swap_cache(mp->pages, mp->pages_nr);
+               mp->pages_nr = 0;
+               mp->need_flush = 0;
+@@ -78,8 +80,6 @@ static inline void tlb_finish_mmu(struct mmu_gather *mp, unsigned long start, un
+       if (mp->fullmm)
+               mp->fullmm = 0;
+-      else
+-              flush_tlb_pending();
+       /* keep the page table cache within bounds */
+       check_pgt_cache();
+diff --git a/arch/sparc/kernel/of_device.c b/arch/sparc/kernel/of_device.c
+index f58c537..e0bfc51 100644
+--- a/arch/sparc/kernel/of_device.c
++++ b/arch/sparc/kernel/of_device.c
+@@ -223,8 +223,25 @@ static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
+ static int of_bus_sbus_match(struct device_node *np)
+ {
+-      return !strcmp(np->name, "sbus") ||
+-              !strcmp(np->name, "sbi");
++      struct device_node *dp = np;
++
++      while (dp) {
++              if (!strcmp(dp->name, "sbus") ||
++                  !strcmp(dp->name, "sbi"))
++                      return 1;
++
++              /* Have a look at use_1to1_mapping().  We're trying
++               * to match SBUS if that's the top-level bus and we
++               * don't have some intervening real bus that provides
++               * ranges based translations.
++               */
++              if (of_find_property(dp, "ranges", NULL) != NULL)
++                      break;
++
++              dp = dp->parent;
++      }
++
++      return 0;
+ }
+ static void of_bus_sbus_count_cells(struct device_node *child,
+diff --git a/arch/sparc64/kernel/irq.c b/arch/sparc64/kernel/irq.c
+index 7495bc7..0708a5b 100644
+--- a/arch/sparc64/kernel/irq.c
++++ b/arch/sparc64/kernel/irq.c
+@@ -318,17 +318,25 @@ static void sun4u_set_affinity(unsigned int virt_irq, cpumask_t mask)
+       sun4u_irq_enable(virt_irq);
+ }
++/* Don't do anything.  The desc->status check for IRQ_DISABLED in
++ * handler_irq() will skip the handler call and that will leave the
++ * interrupt in the sent state.  The next ->enable() call will hit the
++ * ICLR register to reset the state machine.
++ *
++ * This scheme is necessary, instead of clearing the Valid bit in the
++ * IMAP register, to handle the case of IMAP registers being shared by
++ * multiple INOs (and thus ICLR registers).  Since we use a different
++ * virtual IRQ for each shared IMAP instance, the generic code thinks
++ * there is only one user so it prematurely calls ->disable() on
++ * free_irq().
++ *
++ * We have to provide an explicit ->disable() method instead of using
++ * NULL to get the default.  The reason is that if the generic code
++ * sees that, it also hooks up a default ->shutdown method which
++ * invokes ->mask() which we do not want.  See irq_chip_set_defaults().
++ */
+ static void sun4u_irq_disable(unsigned int virt_irq)
+ {
+-      struct irq_handler_data *data = get_irq_chip_data(virt_irq);
+-
+-      if (likely(data)) {
+-              unsigned long imap = data->imap;
+-              unsigned long tmp = upa_readq(imap);
+-
+-              tmp &= ~IMAP_VALID;
+-              upa_writeq(tmp, imap);
+-      }
+ }
+ static void sun4u_irq_eoi(unsigned int virt_irq)
+@@ -739,7 +747,8 @@ void handler_irq(int irq, struct pt_regs *regs)
+               desc = irq_desc + virt_irq;
+-              desc->handle_irq(virt_irq, desc);
++              if (!(desc->status & IRQ_DISABLED))
++                      desc->handle_irq(virt_irq, desc);
+               bucket_pa = next_pa;
+       }
+diff --git a/arch/sparc64/kernel/kgdb.c b/arch/sparc64/kernel/kgdb.c
+index fefbe6d..f5a0fd4 100644
+--- a/arch/sparc64/kernel/kgdb.c
++++ b/arch/sparc64/kernel/kgdb.c
+@@ -108,7 +108,7 @@ void gdb_regs_to_pt_regs(unsigned long *gdb_regs, struct pt_regs *regs)
+ }
+ #ifdef CONFIG_SMP
+-void smp_kgdb_capture_client(struct pt_regs *regs)
++void smp_kgdb_capture_client(int irq, struct pt_regs *regs)
+ {
+       unsigned long flags;
+diff --git a/arch/sparc64/kernel/of_device.c b/arch/sparc64/kernel/of_device.c
+index 100ebd5..d342723 100644
+--- a/arch/sparc64/kernel/of_device.c
++++ b/arch/sparc64/kernel/of_device.c
+@@ -278,8 +278,25 @@ static unsigned long of_bus_pci_get_flags(const u32 *addr, unsigned long flags)
+ static int of_bus_sbus_match(struct device_node *np)
+ {
+-      return !strcmp(np->name, "sbus") ||
+-              !strcmp(np->name, "sbi");
++      struct device_node *dp = np;
++
++      while (dp) {
++              if (!strcmp(dp->name, "sbus") ||
++                  !strcmp(dp->name, "sbi"))
++                      return 1;
++
++              /* Have a look at use_1to1_mapping().  We're trying
++               * to match SBUS if that's the top-level bus and we
++               * don't have some intervening real bus that provides
++               * ranges based translations.
++               */
++              if (of_find_property(dp, "ranges", NULL) != NULL)
++                      break;
++
++              dp = dp->parent;
++      }
++
++      return 0;
+ }
+ static void of_bus_sbus_count_cells(struct device_node *child,
+diff --git a/arch/sparc64/kernel/pci_common.c b/arch/sparc64/kernel/pci_common.c
+index 09a5ec2..d498c60 100644
+--- a/arch/sparc64/kernel/pci_common.c
++++ b/arch/sparc64/kernel/pci_common.c
+@@ -368,7 +368,7 @@ static void pci_register_iommu_region(struct pci_pbm_info *pbm)
+       const u32 *vdma = of_get_property(pbm->prom_node, "virtual-dma", NULL);
+       if (vdma) {
+-              struct resource *rp = kmalloc(sizeof(*rp), GFP_KERNEL);
++              struct resource *rp = kzalloc(sizeof(*rp), GFP_KERNEL);
+               if (!rp) {
+                       prom_printf("Cannot allocate IOMMU resource.\n");
+diff --git a/arch/sparc64/kernel/smp.c b/arch/sparc64/kernel/smp.c
+index 2be166c..a0ad401 100644
+--- a/arch/sparc64/kernel/smp.c
++++ b/arch/sparc64/kernel/smp.c
+@@ -118,9 +118,9 @@ void __cpuinit smp_callin(void)
+       while (!cpu_isset(cpuid, smp_commenced_mask))
+               rmb();
+-      ipi_call_lock();
++      ipi_call_lock_irq();
+       cpu_set(cpuid, cpu_online_map);
+-      ipi_call_unlock();
++      ipi_call_unlock_irq();
+       /* idle thread is expected to have preempt disabled */
+       preempt_disable();
+@@ -1031,7 +1031,7 @@ void smp_fetch_global_regs(void)
+  *    If the address space is non-shared (ie. mm->count == 1) we avoid
+  *    cross calls when we want to flush the currently running process's
+  *    tlb state.  This is done by clearing all cpu bits except the current
+- *    processor's in current->active_mm->cpu_vm_mask and performing the
++ *    processor's in current->mm->cpu_vm_mask and performing the
+  *    flush locally only.  This will force any subsequent cpus which run
+  *    this task to flush the context from the local tlb if the process
+  *    migrates to another cpu (again).
+@@ -1074,7 +1074,7 @@ void smp_flush_tlb_pending(struct mm_struct *mm, unsigned long nr, unsigned long
+       u32 ctx = CTX_HWBITS(mm->context);
+       int cpu = get_cpu();
+-      if (mm == current->active_mm && atomic_read(&mm->mm_users) == 1)
++      if (mm == current->mm && atomic_read(&mm->mm_users) == 1)
+               mm->cpu_vm_mask = cpumask_of_cpu(cpu);
+       else
+               smp_cross_call_masked(&xcall_flush_tlb_pending,
+diff --git a/arch/sparc64/kernel/ttable.S b/arch/sparc64/kernel/ttable.S
+index 1ade3d6..89bf646 100644
+--- a/arch/sparc64/kernel/ttable.S
++++ b/arch/sparc64/kernel/ttable.S
+@@ -63,7 +63,13 @@ tl0_irq6:   TRAP_IRQ(smp_call_function_single_client, 6)
+ #else
+ tl0_irq6:     BTRAP(0x46)
+ #endif
+-tl0_irq7:     BTRAP(0x47) BTRAP(0x48) BTRAP(0x49)
++tl0_irq7:     BTRAP(0x47)
++#ifdef CONFIG_KGDB
++tl0_irq8:     TRAP_IRQ(smp_kgdb_capture_client, 8)
++#else
++tl0_irq8:     BTRAP(0x48)
++#endif
++tl0_irq9:     BTRAP(0x49)
+ tl0_irq10:    BTRAP(0x4a) BTRAP(0x4b) BTRAP(0x4c) BTRAP(0x4d)
+ tl0_irq14:    TRAP_IRQ(timer_interrupt, 14)
+ tl0_irq15:    TRAP_IRQ(handler_irq, 15)
+diff --git a/arch/sparc64/mm/ultra.S b/arch/sparc64/mm/ultra.S
+index 86773e8..f1d76cb 100644
+--- a/arch/sparc64/mm/ultra.S
++++ b/arch/sparc64/mm/ultra.S
+@@ -681,28 +681,8 @@ xcall_new_mmu_context_version:
+ #ifdef CONFIG_KGDB
+       .globl          xcall_kgdb_capture
+ xcall_kgdb_capture:
+-661:  rdpr            %pstate, %g2
+-      wrpr            %g2, PSTATE_IG | PSTATE_AG, %pstate
+-      .section        .sun4v_2insn_patch, "ax"
+-      .word           661b
+-      nop
+-      nop
+-      .previous
+-
+-      rdpr            %pil, %g2
+-      wrpr            %g0, 15, %pil
+-      sethi           %hi(109f), %g7
+-      ba,pt           %xcc, etrap_irq
+-109:   or             %g7, %lo(109b), %g7
+-#ifdef CONFIG_TRACE_IRQFLAGS
+-      call            trace_hardirqs_off
+-       nop
+-#endif
+-      call            smp_kgdb_capture_client
+-       add            %sp, PTREGS_OFF, %o0
+-      /* Has to be a non-v9 branch due to the large distance. */
+-      ba              rtrap_xcall
+-       ldx            [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
++      wr              %g0, (1 << PIL_KGDB_CAPTURE), %set_softint
++      retry
+ #endif
+ #endif /* CONFIG_SMP */
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 6d5a3c4..2781331 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -730,6 +730,9 @@ void __init setup_arch(char **cmdline_p)
+       finish_e820_parsing();
++      if (efi_enabled)
++              efi_init();
++
+       dmi_scan_machine();
+       dmi_check_system(bad_bios_dmi_table);
+@@ -743,8 +746,6 @@ void __init setup_arch(char **cmdline_p)
+       insert_resource(&iomem_resource, &data_resource);
+       insert_resource(&iomem_resource, &bss_resource);
+-      if (efi_enabled)
+-              efi_init();
+ #ifdef CONFIG_X86_32
+       if (ppro_with_ram_bug()) {
+diff --git a/arch/x86/mm/hugetlbpage.c b/arch/x86/mm/hugetlbpage.c
+index 8f307d9..f46c340 100644
+--- a/arch/x86/mm/hugetlbpage.c
++++ b/arch/x86/mm/hugetlbpage.c
+@@ -26,12 +26,16 @@ static unsigned long page_table_shareable(struct vm_area_struct *svma,
+       unsigned long sbase = saddr & PUD_MASK;
+       unsigned long s_end = sbase + PUD_SIZE;
++      /* Allow segments to share if only one is marked locked */
++      unsigned long vm_flags = vma->vm_flags & ~VM_LOCKED;
++      unsigned long svm_flags = svma->vm_flags & ~VM_LOCKED;
++
+       /*
+        * match the virtual addresses, permission and the alignment of the
+        * page table page.
+        */
+       if (pmd_index(addr) != pmd_index(saddr) ||
+-          vma->vm_flags != svma->vm_flags ||
++          vm_flags != svm_flags ||
+           sbase < svma->vm_start || svma->vm_end < s_end)
+               return 0;
+diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
+index 7c3b8dc..5468c19 100644
+--- a/arch/x86/mm/pageattr.c
++++ b/arch/x86/mm/pageattr.c
+@@ -565,6 +565,17 @@ static int split_large_page(pte_t *kpte, unsigned long address)
+       ref_prot = pte_pgprot(pte_mkexec(pte_clrhuge(*kpte)));
+       pgprot_val(ref_prot) |= _PAGE_PRESENT;
+       __set_pmd_pte(kpte, address, mk_pte(base, ref_prot));
++
++      /*
++       * Intel Atom errata AAH41 workaround.
++       *
++       * The real fix should be in hw or in a microcode update, but
++       * we also probabilistically try to reduce the window of having
++       * a large TLB mixed with 4K TLBs while instruction fetches are
++       * going on.
++       */
++      __flush_tlb_all();
++
+       base = NULL;
+ out_unlock:
+diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c
+index 76d49eb..8a06160 100644
+--- a/arch/x86/pci/mmconfig-shared.c
++++ b/arch/x86/pci/mmconfig-shared.c
+@@ -255,7 +255,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
+               if (!fixmem32)
+                       return AE_OK;
+               if ((mcfg_res->start >= fixmem32->address) &&
+-                  (mcfg_res->end <= (fixmem32->address +
++                  (mcfg_res->end < (fixmem32->address +
+                                     fixmem32->address_length))) {
+                       mcfg_res->flags = 1;
+                       return AE_CTRL_TERMINATE;
+@@ -272,7 +272,7 @@ static acpi_status __init check_mcfg_resource(struct acpi_resource *res,
+               return AE_OK;
+       if ((mcfg_res->start >= address.minimum) &&
+-          (mcfg_res->end <= (address.minimum + address.address_length))) {
++          (mcfg_res->end < (address.minimum + address.address_length))) {
+               mcfg_res->flags = 1;
+               return AE_CTRL_TERMINATE;
+       }
+@@ -298,7 +298,7 @@ static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
+       struct resource mcfg_res;
+       mcfg_res.start = start;
+-      mcfg_res.end = end;
++      mcfg_res.end = end - 1;
+       mcfg_res.flags = 0;
+       acpi_get_devices("PNP0C01", find_mboard_resource, &mcfg_res, NULL);
+diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c
+index 81b40ed..5639e27 100644
+--- a/drivers/acpi/processor_idle.c
++++ b/drivers/acpi/processor_idle.c
+@@ -303,6 +303,9 @@ static void acpi_timer_check_state(int state, struct acpi_processor *pr,
+       struct acpi_processor_power *pwr = &pr->power;
+       u8 type = local_apic_timer_c2_ok ? ACPI_STATE_C3 : ACPI_STATE_C2;
++      if (boot_cpu_has(X86_FEATURE_AMDC1E))
++              type = ACPI_STATE_C1;
++
+       /*
+        * Check, if one of the previous states already marked the lapic
+        * unstable
+@@ -1154,6 +1157,7 @@ static int acpi_processor_power_verify(struct acpi_processor *pr)
+               switch (cx->type) {
+               case ACPI_STATE_C1:
+                       cx->valid = 1;
++                      acpi_timer_check_state(i, pr, cx);
+                       break;
+               case ACPI_STATE_C2:
+@@ -1468,20 +1472,22 @@ static int acpi_idle_enter_c1(struct cpuidle_device *dev,
+       /* Do not access any ACPI IO ports in suspend path */
+       if (acpi_idle_suspend) {
+-              acpi_safe_halt();
+               local_irq_enable();
++              cpu_relax();
+               return 0;
+       }
+       if (pr->flags.bm_check)
+               acpi_idle_update_bm_rld(pr, cx);
++      acpi_state_timer_broadcast(pr, cx, 1);
+       t1 = inl(acpi_gbl_FADT.xpm_timer_block.address);
+       acpi_idle_do_entry(cx);
+       t2 = inl(acpi_gbl_FADT.xpm_timer_block.address);
+       local_irq_enable();
+       cx->usage++;
++      acpi_state_timer_broadcast(pr, cx, 0);
+       return ticks_elapsed_in_us(t1, t2);
+ }
+diff --git a/drivers/char/random.c b/drivers/char/random.c
+index 7ce1ac4..201b2c1 100644
+--- a/drivers/char/random.c
++++ b/drivers/char/random.c
+@@ -1626,15 +1626,20 @@ EXPORT_SYMBOL(secure_dccp_sequence_number);
+  * value is not cryptographically secure but for several uses the cost of
+  * depleting entropy is too high
+  */
++DEFINE_PER_CPU(__u32 [4], get_random_int_hash);
+ unsigned int get_random_int(void)
+ {
+-      /*
+-       * Use IP's RNG. It suits our purpose perfectly: it re-keys itself
+-       * every second, from the entropy pool (and thus creates a limited
+-       * drain on it), and uses halfMD4Transform within the second. We
+-       * also mix it with jiffies and the PID:
+-       */
+-      return secure_ip_id((__force __be32)(current->pid + jiffies));
++      struct keydata *keyptr;
++      __u32 *hash = get_cpu_var(get_random_int_hash);
++      int ret;
++
++      keyptr = get_keyptr();
++      hash[0] += current->pid + jiffies + get_cycles();
++
++      ret = half_md4_transform(hash, keyptr->secret);
++      put_cpu_var(get_random_int_hash);
++
++      return ret;
+ }
+ /*
+diff --git a/drivers/char/tpm/tpm_bios.c b/drivers/char/tpm/tpm_bios.c
+index 68f052b..2db432d 100644
+--- a/drivers/char/tpm/tpm_bios.c
++++ b/drivers/char/tpm/tpm_bios.c
+@@ -214,7 +214,8 @@ static int get_event_name(char *dest, struct tcpa_event *event,
+                       unsigned char * event_entry)
+ {
+       const char *name = "";
+-      char data[40] = "";
++      /* 41 so there is room for 40 data and 1 nul */
++      char data[41] = "";
+       int i, n_len = 0, d_len = 0;
+       struct tcpa_pc_event *pc_event;
+diff --git a/drivers/hwmon/lm78.c b/drivers/hwmon/lm78.c
+index ed7859f..affee01 100644
+--- a/drivers/hwmon/lm78.c
++++ b/drivers/hwmon/lm78.c
+@@ -178,7 +178,7 @@ static struct platform_driver lm78_isa_driver = {
+               .name   = "lm78",
+       },
+       .probe          = lm78_isa_probe,
+-      .remove         = lm78_isa_remove,
++      .remove         = __devexit_p(lm78_isa_remove),
+ };
+diff --git a/drivers/media/video/cx88/cx88-input.c b/drivers/media/video/cx88/cx88-input.c
+index 53526d9..dedf96b 100644
+--- a/drivers/media/video/cx88/cx88-input.c
++++ b/drivers/media/video/cx88/cx88-input.c
+@@ -48,8 +48,7 @@ struct cx88_IR {
+       /* poll external decoder */
+       int polling;
+-      struct work_struct work;
+-      struct timer_list timer;
++      struct delayed_work work;
+       u32 gpio_addr;
+       u32 last_gpio;
+       u32 mask_keycode;
+@@ -143,27 +142,19 @@ static void cx88_ir_handle_key(struct cx88_IR *ir)
+       }
+ }
+-static void ir_timer(unsigned long data)
+-{
+-      struct cx88_IR *ir = (struct cx88_IR *)data;
+-
+-      schedule_work(&ir->work);
+-}
+-
+ static void cx88_ir_work(struct work_struct *work)
+ {
+-      struct cx88_IR *ir = container_of(work, struct cx88_IR, work);
++      struct cx88_IR *ir = container_of(work, struct cx88_IR, work.work);
+       cx88_ir_handle_key(ir);
+-      mod_timer(&ir->timer, jiffies + msecs_to_jiffies(ir->polling));
++      schedule_delayed_work(&ir->work, msecs_to_jiffies(ir->polling));
+ }
+ void cx88_ir_start(struct cx88_core *core, struct cx88_IR *ir)
+ {
+       if (ir->polling) {
+-              setup_timer(&ir->timer, ir_timer, (unsigned long)ir);
+-              INIT_WORK(&ir->work, cx88_ir_work);
+-              schedule_work(&ir->work);
++              INIT_DELAYED_WORK(&ir->work, cx88_ir_work);
++              schedule_delayed_work(&ir->work, 0);
+       }
+       if (ir->sampling) {
+               core->pci_irqmask |= PCI_INT_IR_SMPINT;
+@@ -179,10 +170,8 @@ void cx88_ir_stop(struct cx88_core *core, struct cx88_IR *ir)
+               core->pci_irqmask &= ~PCI_INT_IR_SMPINT;
+       }
+-      if (ir->polling) {
+-              del_timer_sync(&ir->timer);
+-              flush_scheduled_work();
+-      }
++      if (ir->polling)
++              cancel_delayed_work_sync(&ir->work);
+ }
+ /* ---------------------------------------------------------------------- */
+diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c
+index 2486a65..ba91aee 100644
+--- a/drivers/net/bnx2.c
++++ b/drivers/net/bnx2.c
+@@ -2574,6 +2574,7 @@ bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
+       /* Tell compiler that status block fields can change. */
+       barrier();
+       cons = *bnapi->hw_tx_cons_ptr;
++      barrier();
+       if (unlikely((cons & MAX_TX_DESC_CNT) == MAX_TX_DESC_CNT))
+               cons++;
+       return cons;
+@@ -2849,6 +2850,7 @@ bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
+       /* Tell compiler that status block fields can change. */
+       barrier();
+       cons = *bnapi->hw_rx_cons_ptr;
++      barrier();
+       if (unlikely((cons & MAX_RX_DESC_CNT) == MAX_RX_DESC_CNT))
+               cons++;
+       return cons;
+diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
+index 4489e58..e929e61 100644
+--- a/drivers/net/bonding/bond_alb.c
++++ b/drivers/net/bonding/bond_alb.c
+@@ -1716,9 +1716,6 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr)
+               }
+       }
+-      write_unlock_bh(&bond->curr_slave_lock);
+-      read_unlock(&bond->lock);
+-
+       if (swap_slave) {
+               alb_swap_mac_addr(bond, swap_slave, bond->curr_active_slave);
+               alb_fasten_mac_swap(bond, swap_slave, bond->curr_active_slave);
+@@ -1726,16 +1723,15 @@ int bond_alb_set_mac_address(struct net_device *bond_dev, void *addr)
+               alb_set_slave_mac_addr(bond->curr_active_slave, bond_dev->dev_addr,
+                                      bond->alb_info.rlb_enabled);
++              read_lock(&bond->lock);
+               alb_send_learning_packets(bond->curr_active_slave, bond_dev->dev_addr);
+               if (bond->alb_info.rlb_enabled) {
+                       /* inform clients mac address has changed */
+                       rlb_req_update_slave_clients(bond, bond->curr_active_slave);
+               }
++              read_unlock(&bond->lock);
+       }
+-      read_lock(&bond->lock);
+-      write_lock_bh(&bond->curr_slave_lock);
+-
+       return 0;
+ }
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index 6b96357..1f60117 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -4133,8 +4133,9 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
+                                PCI_DMA_FROMDEVICE);
+               length = le16_to_cpu(rx_desc->length);
+-
+-              if (unlikely(!(status & E1000_RXD_STAT_EOP))) {
++              /* !EOP means multiple descriptors were used to store a single
++               * packet, also make sure the frame isn't just CRC only */
++              if (unlikely(!(status & E1000_RXD_STAT_EOP) || (length <= 4))) {
+                       /* All receives must fit into a single buffer */
+                       E1000_DBG("%s: Receive packet consumed multiple"
+                                 " buffers\n", netdev->name);
+diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c
+index 89964fa..23110d8 100644
+--- a/drivers/net/igb/igb_ethtool.c
++++ b/drivers/net/igb/igb_ethtool.c
+@@ -2029,6 +2029,10 @@ static struct ethtool_ops igb_ethtool_ops = {
+       .get_ethtool_stats      = igb_get_ethtool_stats,
+       .get_coalesce           = igb_get_coalesce,
+       .set_coalesce           = igb_set_coalesce,
++      .get_flags              = ethtool_op_get_flags,
++#ifdef CONFIG_IGB_LRO
++      .set_flags              = ethtool_op_set_flags,
++#endif
+ };
+ void igb_set_ethtool_ops(struct net_device *netdev)
+diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c
+index 4239450..1aa0388 100644
+--- a/drivers/net/macvlan.c
++++ b/drivers/net/macvlan.c
+@@ -328,7 +328,8 @@ static u32 macvlan_ethtool_get_rx_csum(struct net_device *dev)
+       const struct macvlan_dev *vlan = netdev_priv(dev);
+       struct net_device *lowerdev = vlan->lowerdev;
+-      if (lowerdev->ethtool_ops->get_rx_csum == NULL)
++      if (lowerdev->ethtool_ops == NULL ||
++          lowerdev->ethtool_ops->get_rx_csum == NULL)
+               return 0;
+       return lowerdev->ethtool_ops->get_rx_csum(lowerdev);
+ }
+diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
+index d6524db..7d41ec8 100644
+--- a/drivers/net/myri10ge/myri10ge.c
++++ b/drivers/net/myri10ge/myri10ge.c
+@@ -2379,6 +2379,7 @@ static int myri10ge_open(struct net_device *dev)
+               lro_mgr->lro_arr = ss->rx_done.lro_desc;
+               lro_mgr->get_frag_header = myri10ge_get_frag_header;
+               lro_mgr->max_aggr = myri10ge_lro_max_pkts;
++              lro_mgr->frag_align_pad = 2;
+               if (lro_mgr->max_aggr > MAX_SKB_FRAGS)
+                       lro_mgr->max_aggr = MAX_SKB_FRAGS;
+diff --git a/drivers/scsi/3w-xxxx.c b/drivers/scsi/3w-xxxx.c
+index a0537f0..6221cdc 100644
+--- a/drivers/scsi/3w-xxxx.c
++++ b/drivers/scsi/3w-xxxx.c
+@@ -6,7 +6,7 @@
+                    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+                      Brad Strand <linux@3ware.com>
+-   Copyright (C) 1999-2007 3ware Inc.
++   Copyright (C) 1999-2009 3ware Inc.
+    Kernel compatiblity By:    Andre Hedrick <andre@suse.com>
+    Non-Copyright (C) 2000     Andre Hedrick <andre@suse.com>
+@@ -1294,7 +1294,8 @@ static void tw_unmap_scsi_data(struct pci_dev *pdev, struct scsi_cmnd *cmd)
+ {
+       dprintk(KERN_WARNING "3w-xxxx: tw_unmap_scsi_data()\n");
+-      scsi_dma_unmap(cmd);
++      if (cmd->SCp.phase == TW_PHASE_SGLIST)
++              scsi_dma_unmap(cmd);
+ } /* End tw_unmap_scsi_data() */
+ /* This function will reset a device extension */
+diff --git a/drivers/scsi/3w-xxxx.h b/drivers/scsi/3w-xxxx.h
+index 0742e68..e938615 100644
+--- a/drivers/scsi/3w-xxxx.h
++++ b/drivers/scsi/3w-xxxx.h
+@@ -6,7 +6,7 @@
+                    Arnaldo Carvalho de Melo <acme@conectiva.com.br>
+                      Brad Strand <linux@3ware.com>
+-   Copyright (C) 1999-2007 3ware Inc.
++   Copyright (C) 1999-2009 3ware Inc.
+    Kernel compatiblity By:    Andre Hedrick <andre@suse.com>
+    Non-Copyright (C) 2000     Andre Hedrick <andre@suse.com>
+diff --git a/drivers/serial/icom.c b/drivers/serial/icom.c
+index 2b7531d..08eefec 100644
+--- a/drivers/serial/icom.c
++++ b/drivers/serial/icom.c
+@@ -1482,8 +1482,8 @@ static void icom_remove_adapter(struct icom_adapter *icom_adapter)
+       free_irq(icom_adapter->pci_dev->irq, (void *) icom_adapter);
+       iounmap(icom_adapter->base_addr);
+-      icom_free_adapter(icom_adapter);
+       pci_release_regions(icom_adapter->pci_dev);
++      icom_free_adapter(icom_adapter);
+ }
+ static void icom_kref_release(struct kref *kref)
+diff --git a/drivers/serial/mpc52xx_uart.c b/drivers/serial/mpc52xx_uart.c
+index 32e7acb..3485510 100644
+--- a/drivers/serial/mpc52xx_uart.c
++++ b/drivers/serial/mpc52xx_uart.c
+@@ -1000,7 +1000,7 @@ mpc52xx_console_setup(struct console *co, char *options)
+       pr_debug("mpc52xx_console_setup co=%p, co->index=%i, options=%s\n",
+                co, co->index, options);
+-      if ((co->index < 0) || (co->index > MPC52xx_PSC_MAXNUM)) {
++      if ((co->index < 0) || (co->index >= MPC52xx_PSC_MAXNUM)) {
+               pr_debug("PSC%x out of range\n", co->index);
+               return -EINVAL;
+       }
+diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c
+index 8017f1c..eb3b103 100644
+--- a/drivers/usb/host/isp1760-hcd.c
++++ b/drivers/usb/host/isp1760-hcd.c
+@@ -1645,6 +1645,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+       u32 reg_base, or_reg, skip_reg;
+       unsigned long flags;
+       struct ptd ptd;
++      packet_enqueue *pe;
+       switch (usb_pipetype(urb->pipe)) {
+       case PIPE_ISOCHRONOUS:
+@@ -1656,6 +1657,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+               reg_base = INT_REGS_OFFSET;
+               or_reg = HC_INT_IRQ_MASK_OR_REG;
+               skip_reg = HC_INT_PTD_SKIPMAP_REG;
++              pe = enqueue_an_INT_packet;
+               break;
+       default:
+@@ -1663,6 +1665,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+               reg_base = ATL_REGS_OFFSET;
+               or_reg = HC_ATL_IRQ_MASK_OR_REG;
+               skip_reg = HC_ATL_PTD_SKIPMAP_REG;
++              pe =  enqueue_an_ATL_packet;
+               break;
+       }
+@@ -1674,6 +1677,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+                       u32 skip_map;
+                       u32 or_map;
+                       struct isp1760_qtd *qtd;
++                      struct isp1760_qh *qh = ints->qh;
+                       skip_map = isp1760_readl(hcd->regs + skip_reg);
+                       skip_map |= 1 << i;
+@@ -1686,8 +1690,7 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+                       priv_write_copy(priv, (u32 *)&ptd, hcd->regs + reg_base
+                                       + i * sizeof(ptd), sizeof(ptd));
+                       qtd = ints->qtd;
+-
+-                      clean_up_qtdlist(qtd);
++                      qtd = clean_up_qtdlist(qtd);
+                       free_mem(priv, ints->payload);
+@@ -1698,7 +1701,24 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb,
+                       ints->payload = 0;
+                       isp1760_urb_done(priv, urb, status);
++                      if (qtd)
++                              pe(hcd, qh, qtd);
+                       break;
++
++              } else if (ints->qtd) {
++                      struct isp1760_qtd *qtd, *prev_qtd = ints->qtd;
++
++                      for (qtd = ints->qtd->hw_next; qtd; qtd = qtd->hw_next) {
++                              if (qtd->urb == urb) {
++                                      prev_qtd->hw_next = clean_up_qtdlist(qtd);
++                                      isp1760_urb_done(priv, urb, status);
++                                      break;
++                              }
++                              prev_qtd = qtd;
++                      }
++                      /* we found the urb before the end of the list */
++                      if (qtd)
++                              break;
+               }
+               ints++;
+       }
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index eadbee3..1985721 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -248,6 +248,30 @@ struct flex_groups {
+ #define EXT4_FL_USER_VISIBLE          0x000BDFFF /* User visible flags */
+ #define EXT4_FL_USER_MODIFIABLE               0x000380FF /* User modifiable flags */
++/* Flags that should be inherited by new inodes from their parent. */
++#define EXT4_FL_INHERITED (EXT4_SECRM_FL | EXT4_UNRM_FL | EXT4_COMPR_FL |\
++                         EXT4_SYNC_FL | EXT4_IMMUTABLE_FL | EXT4_APPEND_FL |\
++                         EXT4_NODUMP_FL | EXT4_NOATIME_FL |\
++                         EXT4_NOCOMPR_FL | EXT4_JOURNAL_DATA_FL |\
++                         EXT4_NOTAIL_FL | EXT4_DIRSYNC_FL)
++
++/* Flags that are appropriate for regular files (all but dir-specific ones). */
++#define EXT4_REG_FLMASK (~(EXT4_DIRSYNC_FL | EXT4_TOPDIR_FL))
++
++/* Flags that are appropriate for non-directories/regular files. */
++#define EXT4_OTHER_FLMASK (EXT4_NODUMP_FL | EXT4_NOATIME_FL)
++
++/* Mask out flags that are inappropriate for the given type of inode. */
++static inline __u32 ext4_mask_flags(umode_t mode, __u32 flags)
++{
++      if (S_ISDIR(mode))
++              return flags;
++      else if (S_ISREG(mode))
++              return flags & EXT4_REG_FLMASK;
++      else
++              return flags & EXT4_OTHER_FLMASK;
++}
++
+ /*
+  * Inode dynamic state flags
+  */
+@@ -255,6 +279,7 @@ struct flex_groups {
+ #define EXT4_STATE_NEW                        0x00000002 /* inode is newly created */
+ #define EXT4_STATE_XATTR              0x00000004 /* has in-inode xattrs */
+ #define EXT4_STATE_NO_EXPAND          0x00000008 /* No space for expansion */
++#define EXT4_STATE_DA_ALLOC_CLOSE     0x00000010 /* Alloc DA blks on close */
+ /* Used to pass group descriptor data when online resize is done */
+ struct ext4_new_group_input {
+@@ -302,7 +327,9 @@ struct ext4_new_group_data {
+ #define EXT4_IOC_GROUP_EXTEND         _IOW('f', 7, unsigned long)
+ #define EXT4_IOC_GROUP_ADD            _IOW('f', 8, struct ext4_new_group_input)
+ #define EXT4_IOC_MIGRATE              _IO('f', 9)
++ /* note ioctl 10 reserved for an early version of the FIEMAP ioctl */
+  /* note ioctl 11 reserved for filesystem-independent FIEMAP ioctl */
++#define EXT4_IOC_ALLOC_DA_BLKS                _IO('f', 12)
+ /*
+  * ioctl commands in 32 bit emulation
+@@ -1078,6 +1105,7 @@ extern int ext4_can_truncate(struct inode *inode);
+ extern void ext4_truncate (struct inode *);
+ extern void ext4_set_inode_flags(struct inode *);
+ extern void ext4_get_inode_flags(struct ext4_inode_info *);
++extern int ext4_alloc_da_blocks(struct inode *inode);
+ extern void ext4_set_aops(struct inode *inode);
+ extern int ext4_writepage_trans_blocks(struct inode *);
+ extern int ext4_meta_trans_blocks(struct inode *, int nrblocks, int idxblocks);
+diff --git a/fs/ext4/extents.c b/fs/ext4/extents.c
+index b24d3c5..f99635a 100644
+--- a/fs/ext4/extents.c
++++ b/fs/ext4/extents.c
+@@ -1118,7 +1118,8 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path,
+       struct ext4_extent_idx *ix;
+       struct ext4_extent *ex;
+       ext4_fsblk_t block;
+-      int depth, ee_len;
++      int depth;      /* Note, NOT eh_depth; depth from top of tree */
++      int ee_len;
+       BUG_ON(path == NULL);
+       depth = path->p_depth;
+@@ -1177,7 +1178,8 @@ ext4_ext_search_right(struct inode *inode, struct ext4_ext_path *path,
+               if (bh == NULL)
+                       return -EIO;
+               eh = ext_block_hdr(bh);
+-              if (ext4_ext_check_header(inode, eh, depth)) {
++              /* subtract from p_depth to get proper eh_depth */
++              if (ext4_ext_check_header(inode, eh, path->p_depth - depth)) {
+                       put_bh(bh);
+                       return -EIO;
+               }
+@@ -1631,11 +1633,13 @@ ext4_ext_put_in_cache(struct inode *inode, ext4_lblk_t block,
+ {
+       struct ext4_ext_cache *cex;
+       BUG_ON(len == 0);
++      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
+       cex = &EXT4_I(inode)->i_cached_extent;
+       cex->ec_type = type;
+       cex->ec_block = block;
+       cex->ec_len = len;
+       cex->ec_start = start;
++      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
+ }
+ /*
+@@ -1692,12 +1696,17 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
+                       struct ext4_extent *ex)
+ {
+       struct ext4_ext_cache *cex;
++      int ret = EXT4_EXT_CACHE_NO;
++      /*
++       * We borrow i_block_reservation_lock to protect i_cached_extent
++       */
++      spin_lock(&EXT4_I(inode)->i_block_reservation_lock);
+       cex = &EXT4_I(inode)->i_cached_extent;
+       /* has cache valid data? */
+       if (cex->ec_type == EXT4_EXT_CACHE_NO)
+-              return EXT4_EXT_CACHE_NO;
++              goto errout;
+       BUG_ON(cex->ec_type != EXT4_EXT_CACHE_GAP &&
+                       cex->ec_type != EXT4_EXT_CACHE_EXTENT);
+@@ -1708,11 +1717,11 @@ ext4_ext_in_cache(struct inode *inode, ext4_lblk_t block,
+               ext_debug("%u cached by %u:%u:%llu\n",
+                               block,
+                               cex->ec_block, cex->ec_len, cex->ec_start);
+-              return cex->ec_type;
++              ret = cex->ec_type;
+       }
+-
+-      /* not in cache */
+-      return EXT4_EXT_CACHE_NO;
++errout:
++      spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
++      return ret;
+ }
+ /*
+@@ -2668,6 +2677,8 @@ int ext4_ext_get_blocks(handle_t *handle, struct inode *inode,
+                               if (allocated > max_blocks)
+                                       allocated = max_blocks;
+                               set_buffer_unwritten(bh_result);
++                              bh_result->b_bdev = inode->i_sb->s_bdev;
++                              bh_result->b_blocknr = newblock;
+                               goto out2;
+                       }
+diff --git a/fs/ext4/file.c b/fs/ext4/file.c
+index 430eb79..c0d02f8 100644
+--- a/fs/ext4/file.c
++++ b/fs/ext4/file.c
+@@ -33,9 +33,14 @@
+  */
+ static int ext4_release_file (struct inode * inode, struct file * filp)
+ {
++      if (EXT4_I(inode)->i_state & EXT4_STATE_DA_ALLOC_CLOSE) {
++              ext4_alloc_da_blocks(inode);
++              EXT4_I(inode)->i_state &= ~EXT4_STATE_DA_ALLOC_CLOSE;
++      }
+       /* if we are the last writer on the inode, drop the block reservation */
+       if ((filp->f_mode & FMODE_WRITE) &&
+-                      (atomic_read(&inode->i_writecount) == 1))
++                      (atomic_read(&inode->i_writecount) == 1) &&
++                      !EXT4_I(inode)->i_reserved_data_blocks)
+       {
+               down_write(&EXT4_I(inode)->i_data_sem);
+               ext4_discard_reservation(inode);
+diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
+index cce841f..e8754fd 100644
+--- a/fs/ext4/ialloc.c
++++ b/fs/ext4/ialloc.c
+@@ -188,7 +188,7 @@ void ext4_free_inode (handle_t *handle, struct inode * inode)
+       struct ext4_group_desc * gdp;
+       struct ext4_super_block * es;
+       struct ext4_sb_info *sbi;
+-      int fatal = 0, err;
++      int fatal = 0, err, cleared;
+       ext4_group_t flex_group;
+       if (atomic_read(&inode->i_count) > 1) {
+@@ -242,10 +242,12 @@ void ext4_free_inode (handle_t *handle, struct inode * inode)
+               goto error_return;
+       /* Ok, now we can actually update the inode bitmaps.. */
+-      if (!ext4_clear_bit_atomic(sb_bgl_lock(sbi, block_group),
+-                                      bit, bitmap_bh->b_data))
+-              ext4_error (sb, "ext4_free_inode",
+-                            "bit already cleared for inode %lu", ino);
++      spin_lock(sb_bgl_lock(sbi, block_group));
++      cleared = ext4_clear_bit(bit, bitmap_bh->b_data);
++      spin_unlock(sb_bgl_lock(sbi, block_group));
++      if (!cleared)
++              ext4_error(sb, "ext4_free_inode",
++                         "bit already cleared for inode %lu", ino);
+       else {
+               gdp = ext4_get_group_desc (sb, block_group, &bh2);
+@@ -685,6 +687,7 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode * dir, int mode)
+       struct inode *ret;
+       ext4_group_t i;
+       int free = 0;
++      static int once = 1;
+       ext4_group_t flex_group;
+       /* Cannot create files in a deleted directory */
+@@ -704,10 +707,12 @@ struct inode *ext4_new_inode(handle_t *handle, struct inode * dir, int mode)
+               ret2 = find_group_flex(sb, dir, &group);
+               if (ret2 == -1) {
+                       ret2 = find_group_other(sb, dir, &group);
+-                      if (ret2 == 0 && printk_ratelimit())
++                      if (ret2 == 0 && once) {
++                              once = 0;
+                               printk(KERN_NOTICE "ext4: find_group_flex "
+                                      "failed, fallback succeeded dir %lu\n",
+                                      dir->i_ino);
++                      }
+               }
+               goto got_group;
+       }
+@@ -861,16 +866,12 @@ got:
+       ei->i_disksize = 0;
+       /*
+-       * Don't inherit extent flag from directory. We set extent flag on
+-       * newly created directory and file only if -o extent mount option is
+-       * specified
++       * Don't inherit extent flag from directory, amongst others. We set
++       * extent flag on newly created directory and file only if -o extent
++       * mount option is specified
+        */
+-      ei->i_flags = EXT4_I(dir)->i_flags & ~(EXT4_INDEX_FL|EXT4_EXTENTS_FL);
+-      if (S_ISLNK(mode))
+-              ei->i_flags &= ~(EXT4_IMMUTABLE_FL|EXT4_APPEND_FL);
+-      /* dirsync only applies to directories */
+-      if (!S_ISDIR(mode))
+-              ei->i_flags &= ~EXT4_DIRSYNC_FL;
++      ei->i_flags =
++              ext4_mask_flags(mode, EXT4_I(dir)->i_flags & EXT4_FL_INHERITED);
+       ei->i_file_acl = 0;
+       ei->i_dtime = 0;
+       ei->i_block_alloc_info = NULL;
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 63b911b..aeebfc2 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -1046,6 +1046,14 @@ static void ext4_da_update_reserve_space(struct inode *inode, int used)
+       EXT4_I(inode)->i_reserved_meta_blocks = mdb;
+       EXT4_I(inode)->i_allocated_meta_blocks = 0;
+       spin_unlock(&EXT4_I(inode)->i_block_reservation_lock);
++
++      /*
++       * If we have done all the pending block allocations and if
++       * there aren't any writers on the inode, we can discard the
++       * inode's preallocations.
++       */
++      if (!total && (atomic_read(&inode->i_writecount) == 0))
++              ext4_discard_reservation(inode);
+ }
+ /*
+@@ -1077,6 +1085,7 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block,
+       int retval;
+       clear_buffer_mapped(bh);
++      clear_buffer_unwritten(bh);
+       /*
+        * Try to see if we can get  the block without requesting
+@@ -1107,6 +1116,18 @@ int ext4_get_blocks_wrap(handle_t *handle, struct inode *inode, sector_t block,
+               return retval;
+       /*
++       * When we call get_blocks without the create flag, the
++       * BH_Unwritten flag could have gotten set if the blocks
++       * requested were part of a uninitialized extent.  We need to
++       * clear this flag now that we are committed to convert all or
++       * part of the uninitialized extent to be an initialized
++       * extent.  This is because we need to avoid the combination
++       * of BH_Unwritten and BH_Mapped flags being simultaneously
++       * set on the buffer_head.
++       */
++      clear_buffer_unwritten(bh);
++
++      /*
+        * New blocks allocate and/or writing to uninitialized extent
+        * will possibly result in updating i_data, so we take
+        * the write lock of i_data_sem, and call get_blocks()
+@@ -2097,6 +2118,10 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
+                                 struct buffer_head *bh_result, int create)
+ {
+       int ret = 0;
++      sector_t invalid_block = ~((sector_t) 0xffff);
++
++      if (invalid_block < ext4_blocks_count(EXT4_SB(inode->i_sb)->s_es))
++              invalid_block = ~0;
+       BUG_ON(create == 0);
+       BUG_ON(bh_result->b_size != inode->i_sb->s_blocksize);
+@@ -2118,11 +2143,18 @@ static int ext4_da_get_block_prep(struct inode *inode, sector_t iblock,
+                       /* not enough space to reserve */
+                       return ret;
+-              map_bh(bh_result, inode->i_sb, 0);
++              map_bh(bh_result, inode->i_sb, invalid_block);
+               set_buffer_new(bh_result);
+               set_buffer_delay(bh_result);
+       } else if (ret > 0) {
+               bh_result->b_size = (ret << inode->i_blkbits);
++              /*
++               * With sub-block writes into unwritten extents
++               * we also need to mark the buffer as new so that
++               * the unwritten parts of the buffer gets correctly zeroed.
++               */
++              if (buffer_unwritten(bh_result))
++                      set_buffer_new(bh_result);
+               ret = 0;
+       }
+@@ -2585,6 +2617,48 @@ out:
+       return;
+ }
++/*
++ * Force all delayed allocation blocks to be allocated for a given inode.
++ */
++int ext4_alloc_da_blocks(struct inode *inode)
++{
++      if (!EXT4_I(inode)->i_reserved_data_blocks &&
++          !EXT4_I(inode)->i_reserved_meta_blocks)
++              return 0;
++
++      /*
++       * We do something simple for now.  The filemap_flush() will
++       * also start triggering a write of the data blocks, which is
++       * not strictly speaking necessary (and for users of
++       * laptop_mode, not even desirable).  However, to do otherwise
++       * would require replicating code paths in:
++       *
++       * ext4_da_writepages() ->
++       *    write_cache_pages() ---> (via passed in callback function)
++       *        __mpage_da_writepage() -->
++       *           mpage_add_bh_to_extent()
++       *           mpage_da_map_blocks()
++       *
++       * The problem is that write_cache_pages(), located in
++       * mm/page-writeback.c, marks pages clean in preparation for
++       * doing I/O, which is not desirable if we're not planning on
++       * doing I/O at all.
++       *
++       * We could call write_cache_pages(), and then redirty all of
++       * the pages by calling redirty_page_for_writeback() but that
++       * would be ugly in the extreme.  So instead we would need to
++       * replicate parts of the code in the above functions,
++       * simplifying them becuase we wouldn't actually intend to
++       * write out the pages, but rather only collect contiguous
++       * logical block extents, call the multi-block allocator, and
++       * then update the buffer heads with the block allocations.
++       *
++       * For now, though, we'll cheat by calling filemap_flush(),
++       * which will map the blocks, and start the I/O, but not
++       * actually wait for the I/O to complete.
++       */
++      return filemap_flush(inode->i_mapping);
++}
+ /*
+  * bmap() is special.  It gets used by applications such as lilo and by
+@@ -3594,6 +3668,9 @@ void ext4_truncate(struct inode *inode)
+       if (!ext4_can_truncate(inode))
+               return;
++      if (inode->i_size == 0)
++              ei->i_state |= EXT4_STATE_DA_ALLOC_CLOSE;
++
+       if (EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL) {
+               ext4_ext_truncate(inode);
+               return;
+@@ -4011,11 +4088,9 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
+       ei->i_flags = le32_to_cpu(raw_inode->i_flags);
+       inode->i_blocks = ext4_inode_blocks(raw_inode, ei);
+       ei->i_file_acl = le32_to_cpu(raw_inode->i_file_acl_lo);
+-      if (EXT4_SB(inode->i_sb)->s_es->s_creator_os !=
+-          cpu_to_le32(EXT4_OS_HURD)) {
++      if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_64BIT))
+               ei->i_file_acl |=
+                       ((__u64)le16_to_cpu(raw_inode->i_file_acl_high)) << 32;
+-      }
+       inode->i_size = ext4_isize(raw_inode);
+       ei->i_disksize = inode->i_size;
+       inode->i_generation = le32_to_cpu(raw_inode->i_generation);
+@@ -4062,6 +4137,18 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
+                       (__u64)(le32_to_cpu(raw_inode->i_version_hi)) << 32;
+       }
++      if (ei->i_file_acl &&
++          ((ei->i_file_acl <
++            (le32_to_cpu(EXT4_SB(sb)->s_es->s_first_data_block) +
++             EXT4_SB(sb)->s_gdb_count)) ||
++           (ei->i_file_acl >= ext4_blocks_count(EXT4_SB(sb)->s_es)))) {
++              ext4_error(sb, __func__,
++                         "bad extended attribute block %llu in inode #%lu",
++                         ei->i_file_acl, inode->i_ino);
++              ret = -EIO;
++              goto bad_inode;
++      }
++
+       if (S_ISREG(inode->i_mode)) {
+               inode->i_op = &ext4_file_inode_operations;
+               inode->i_fop = &ext4_file_operations;
+@@ -4076,7 +4163,8 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
+                       inode->i_op = &ext4_symlink_inode_operations;
+                       ext4_set_aops(inode);
+               }
+-      } else {
++      } else if (S_ISCHR(inode->i_mode) || S_ISBLK(inode->i_mode) ||
++            S_ISFIFO(inode->i_mode) || S_ISSOCK(inode->i_mode)) {
+               inode->i_op = &ext4_special_inode_operations;
+               if (raw_inode->i_block[0])
+                       init_special_inode(inode, inode->i_mode,
+@@ -4084,6 +4172,13 @@ struct inode *ext4_iget(struct super_block *sb, unsigned long ino)
+               else
+                       init_special_inode(inode, inode->i_mode,
+                          new_decode_dev(le32_to_cpu(raw_inode->i_block[1])));
++      } else {
++              brelse(bh);
++              ret = -EIO;
++              ext4_error(inode->i_sb, __func__,
++                         "bogus i_mode (%o) for inode=%lu",
++                         inode->i_mode, inode->i_ino);
++              goto bad_inode;
+       }
+       brelse (iloc.bh);
+       ext4_set_inode_flags(inode);
+diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
+index 306bfd4..58dedf0 100644
+--- a/fs/ext4/ioctl.c
++++ b/fs/ext4/ioctl.c
+@@ -49,8 +49,7 @@ long ext4_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+               if (err)
+                       return err;
+-              if (!S_ISDIR(inode->i_mode))
+-                      flags &= ~EXT4_DIRSYNC_FL;
++              flags = ext4_mask_flags(inode->i_mode, flags);
+               err = -EPERM;
+               mutex_lock(&inode->i_mutex);
+@@ -288,6 +287,20 @@ setversion_out:
+               return err;
+       }
++      case EXT4_IOC_ALLOC_DA_BLKS:
++      {
++              int err;
++              if (!is_owner_or_cap(inode))
++                      return -EACCES;
++
++              err = mnt_want_write(filp->f_path.mnt);
++              if (err)
++                      return err;
++              err = ext4_alloc_da_blocks(inode);
++              mnt_drop_write(filp->f_path.mnt);
++              return err;
++      }
++
+       default:
+               return -ENOTTY;
+       }
+diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
+index 39d7cc1..c7dc115 100644
+--- a/fs/ext4/mballoc.c
++++ b/fs/ext4/mballoc.c
+@@ -1450,7 +1450,7 @@ static void ext4_mb_measure_extent(struct ext4_allocation_context *ac,
+       struct ext4_free_extent *gex = &ac->ac_g_ex;
+       BUG_ON(ex->fe_len <= 0);
+-      BUG_ON(ex->fe_len >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++      BUG_ON(ex->fe_len > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       BUG_ON(ex->fe_start >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       BUG_ON(ac->ac_status != AC_STATUS_CONTINUE);
+@@ -2698,7 +2698,7 @@ int ext4_mb_init(struct super_block *sb, int needs_recovery)
+       sbi->s_mb_maxs = kmalloc(i, GFP_KERNEL);
+       if (sbi->s_mb_maxs == NULL) {
+               clear_opt(sbi->s_mount_opt, MBALLOC);
+-              kfree(sbi->s_mb_maxs);
++              kfree(sbi->s_mb_offsets);
+               return -ENOMEM;
+       }
+@@ -3400,7 +3400,7 @@ ext4_mb_normalize_request(struct ext4_allocation_context *ac,
+       }
+       BUG_ON(start + size <= ac->ac_o_ex.fe_logical &&
+                       start > ac->ac_o_ex.fe_logical);
+-      BUG_ON(size <= 0 || size >= EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
++      BUG_ON(size <= 0 || size > EXT4_BLOCKS_PER_GROUP(ac->ac_sb));
+       /* now prepare goal request */
+@@ -3698,6 +3698,7 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,
+                       struct super_block *sb, struct ext4_prealloc_space *pa)
+ {
+       unsigned long grp;
++      ext4_fsblk_t grp_blk;
+       if (!atomic_dec_and_test(&pa->pa_count) || pa->pa_free != 0)
+               return;
+@@ -3712,8 +3713,12 @@ static void ext4_mb_put_pa(struct ext4_allocation_context *ac,
+       pa->pa_deleted = 1;
+       spin_unlock(&pa->pa_lock);
+-      /* -1 is to protect from crossing allocation group */
+-      ext4_get_group_no_and_offset(sb, pa->pa_pstart - 1, &grp, NULL);
++      grp_blk = pa->pa_pstart;
++      /* If linear, pa_pstart may be in the next group when pa is used up */
++      if (pa->pa_linear)
++              grp_blk--;
++
++      ext4_get_group_no_and_offset(sb, grp_blk, &grp, NULL);
+       /*
+        * possible race:
+@@ -4527,7 +4532,7 @@ static void ext4_mb_add_n_trim(struct ext4_allocation_context *ac)
+                                               pa_inode_list) {
+               spin_lock(&tmp_pa->pa_lock);
+               if (tmp_pa->pa_deleted) {
+-                      spin_unlock(&pa->pa_lock);
++                      spin_unlock(&tmp_pa->pa_lock);
+                       continue;
+               }
+               if (!added && pa->pa_free < tmp_pa->pa_free) {
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index 4f3628f..6a71680 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -1055,8 +1055,16 @@ static struct dentry *ext4_lookup(struct inode * dir, struct dentry *dentry, str
+                       return ERR_PTR(-EIO);
+               }
+               inode = ext4_iget(dir->i_sb, ino);
+-              if (IS_ERR(inode))
+-                      return ERR_CAST(inode);
++              if (unlikely(IS_ERR(inode))) {
++                      if (PTR_ERR(inode) == -ESTALE) {
++                              ext4_error(dir->i_sb, __func__,
++                                              "deleted inode referenced: %u",
++                                              ino);
++                              return ERR_PTR(-EIO);
++                      } else {
++                              return ERR_CAST(inode);
++                      }
++              }
+       }
+       return d_splice_alias(inode, dentry);
+ }
+@@ -2306,7 +2314,7 @@ static int ext4_rename (struct inode * old_dir, struct dentry *old_dentry,
+       struct inode * old_inode, * new_inode;
+       struct buffer_head * old_bh, * new_bh, * dir_bh;
+       struct ext4_dir_entry_2 * old_de, * new_de;
+-      int retval;
++      int retval, force_da_alloc = 0;
+       old_bh = new_bh = dir_bh = NULL;
+@@ -2444,6 +2452,7 @@ static int ext4_rename (struct inode * old_dir, struct dentry *old_dentry,
+               ext4_mark_inode_dirty(handle, new_inode);
+               if (!new_inode->i_nlink)
+                       ext4_orphan_add(handle, new_inode);
++              force_da_alloc = 1;
+       }
+       retval = 0;
+@@ -2452,6 +2461,8 @@ end_rename:
+       brelse (old_bh);
+       brelse (new_bh);
+       ext4_journal_stop(handle);
++      if (retval == 0 && force_da_alloc)
++              ext4_alloc_da_blocks(old_inode);
+       return retval;
+ }
+diff --git a/fs/jbd2/revoke.c b/fs/jbd2/revoke.c
+index 257ff26..bbe6d59 100644
+--- a/fs/jbd2/revoke.c
++++ b/fs/jbd2/revoke.c
+@@ -55,6 +55,25 @@
+  *                    need do nothing.
+  * RevokeValid set, Revoked set:
+  *                    buffer has been revoked.
++ *
++ * Locking rules:
++ * We keep two hash tables of revoke records. One hashtable belongs to the
++ * running transaction (is pointed to by journal->j_revoke), the other one
++ * belongs to the committing transaction. Accesses to the second hash table
++ * happen only from the kjournald and no other thread touches this table.  Also
++ * journal_switch_revoke_table() which switches which hashtable belongs to the
++ * running and which to the committing transaction is called only from
++ * kjournald. Therefore we need no locks when accessing the hashtable belonging
++ * to the committing transaction.
++ *
++ * All users operating on the hash table belonging to the running transaction
++ * have a handle to the transaction. Therefore they are safe from kjournald
++ * switching hash tables under them. For operations on the lists of entries in
++ * the hash table j_revoke_lock is used.
++ *
++ * Finally, also replay code uses the hash tables but at this moment noone else
++ * can touch them (filesystem isn't mounted yet) and hence no locking is
++ * needed.
+  */
+ #ifndef __KERNEL__
+@@ -401,8 +420,6 @@ int jbd2_journal_revoke(handle_t *handle, unsigned long long blocknr,
+  * the second time we would still have a pending revoke to cancel.  So,
+  * do not trust the Revoked bit on buffers unless RevokeValid is also
+  * set.
+- *
+- * The caller must have the journal locked.
+  */
+ int jbd2_journal_cancel_revoke(handle_t *handle, struct journal_head *jh)
+ {
+@@ -480,10 +497,7 @@ void jbd2_journal_switch_revoke_table(journal_t *journal)
+ /*
+  * Write revoke records to the journal for all entries in the current
+  * revoke hash, deleting the entries as we go.
+- *
+- * Called with the journal lock held.
+  */
+-
+ void jbd2_journal_write_revoke_records(journal_t *journal,
+                                 transaction_t *transaction)
+ {
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index bff8733..c3fe156 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1925,7 +1925,8 @@ int nfs_permission(struct inode *inode, int mask)
+               case S_IFREG:
+                       /* NFSv4 has atomic_open... */
+                       if (nfs_server_capable(inode, NFS_CAP_ATOMIC_OPEN)
+-                                      && (mask & MAY_OPEN))
++                                      && (mask & MAY_OPEN)
++                                      && !(mask & MAY_EXEC))
+                               goto out;
+                       break;
+               case S_IFDIR:
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 81e9a82..1ecbcf6 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -286,7 +286,7 @@ void resv_map_release(struct kref *ref)
+ static struct resv_map *vma_resv_map(struct vm_area_struct *vma)
+ {
+       VM_BUG_ON(!is_vm_hugetlb_page(vma));
+-      if (!(vma->vm_flags & VM_SHARED))
++      if (!(vma->vm_flags & VM_MAYSHARE))
+               return (struct resv_map *)(get_vma_private_data(vma) &
+                                                       ~HPAGE_RESV_MASK);
+       return 0;
+@@ -295,7 +295,7 @@ static struct resv_map *vma_resv_map(struct vm_area_struct *vma)
+ static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map)
+ {
+       VM_BUG_ON(!is_vm_hugetlb_page(vma));
+-      VM_BUG_ON(vma->vm_flags & VM_SHARED);
++      VM_BUG_ON(vma->vm_flags & VM_MAYSHARE);
+       set_vma_private_data(vma, (get_vma_private_data(vma) &
+                               HPAGE_RESV_MASK) | (unsigned long)map);
+@@ -304,7 +304,7 @@ static void set_vma_resv_map(struct vm_area_struct *vma, struct resv_map *map)
+ static void set_vma_resv_flags(struct vm_area_struct *vma, unsigned long flags)
+ {
+       VM_BUG_ON(!is_vm_hugetlb_page(vma));
+-      VM_BUG_ON(vma->vm_flags & VM_SHARED);
++      VM_BUG_ON(vma->vm_flags & VM_MAYSHARE);
+       set_vma_private_data(vma, get_vma_private_data(vma) | flags);
+ }
+@@ -323,7 +323,7 @@ static void decrement_hugepage_resv_vma(struct hstate *h,
+       if (vma->vm_flags & VM_NORESERVE)
+               return;
+-      if (vma->vm_flags & VM_SHARED) {
++      if (vma->vm_flags & VM_MAYSHARE) {
+               /* Shared mappings always use reserves */
+               h->resv_huge_pages--;
+       } else if (is_vma_resv_set(vma, HPAGE_RESV_OWNER)) {
+@@ -339,14 +339,14 @@ static void decrement_hugepage_resv_vma(struct hstate *h,
+ void reset_vma_resv_huge_pages(struct vm_area_struct *vma)
+ {
+       VM_BUG_ON(!is_vm_hugetlb_page(vma));
+-      if (!(vma->vm_flags & VM_SHARED))
++      if (!(vma->vm_flags & VM_MAYSHARE))
+               vma->vm_private_data = (void *)0;
+ }
+ /* Returns true if the VMA has associated reserve pages */
+ static int vma_has_reserves(struct vm_area_struct *vma)
+ {
+-      if (vma->vm_flags & VM_SHARED)
++      if (vma->vm_flags & VM_MAYSHARE)
+               return 1;
+       if (is_vma_resv_set(vma, HPAGE_RESV_OWNER))
+               return 1;
+@@ -890,7 +890,7 @@ static int vma_needs_reservation(struct hstate *h,
+       struct address_space *mapping = vma->vm_file->f_mapping;
+       struct inode *inode = mapping->host;
+-      if (vma->vm_flags & VM_SHARED) {
++      if (vma->vm_flags & VM_MAYSHARE) {
+               pgoff_t idx = vma_hugecache_offset(h, vma, addr);
+               return region_chg(&inode->i_mapping->private_list,
+                                                       idx, idx + 1);
+@@ -915,7 +915,7 @@ static void vma_commit_reservation(struct hstate *h,
+       struct address_space *mapping = vma->vm_file->f_mapping;
+       struct inode *inode = mapping->host;
+-      if (vma->vm_flags & VM_SHARED) {
++      if (vma->vm_flags & VM_MAYSHARE) {
+               pgoff_t idx = vma_hugecache_offset(h, vma, addr);
+               region_add(&inode->i_mapping->private_list, idx, idx + 1);
+@@ -1862,7 +1862,7 @@ retry_avoidcopy:
+        * at the time of fork() could consume its reserves on COW instead
+        * of the full address range.
+        */
+-      if (!(vma->vm_flags & VM_SHARED) &&
++      if (!(vma->vm_flags & VM_MAYSHARE) &&
+                       is_vma_resv_set(vma, HPAGE_RESV_OWNER) &&
+                       old_page != pagecache_page)
+               outside_reserve = 1;
+@@ -1969,7 +1969,7 @@ retry:
+               clear_huge_page(page, address, huge_page_size(h));
+               __SetPageUptodate(page);
+-              if (vma->vm_flags & VM_SHARED) {
++              if (vma->vm_flags & VM_MAYSHARE) {
+                       int err;
+                       struct inode *inode = mapping->host;
+@@ -2073,7 +2073,7 @@ int hugetlb_fault(struct mm_struct *mm, struct vm_area_struct *vma,
+                       goto out_unlock;
+               }
+-              if (!(vma->vm_flags & VM_SHARED))
++              if (!(vma->vm_flags & VM_MAYSHARE))
+                       pagecache_page = hugetlbfs_pagecache_page(h,
+                                                               vma, address);
+       }
+@@ -2223,7 +2223,7 @@ int hugetlb_reserve_pages(struct inode *inode,
+        * to reserve the full area even if read-only as mprotect() may be
+        * called to make the mapping read-write. Assume !vma is a shm mapping
+        */
+-      if (!vma || vma->vm_flags & VM_SHARED)
++      if (!vma || vma->vm_flags & VM_MAYSHARE)
+               chg = region_chg(&inode->i_mapping->private_list, from, to);
+       else {
+               struct resv_map *resv_map = resv_map_alloc();
+@@ -2246,7 +2246,7 @@ int hugetlb_reserve_pages(struct inode *inode,
+               hugetlb_put_quota(inode->i_mapping, chg);
+               return ret;
+       }
+-      if (!vma || vma->vm_flags & VM_SHARED)
++      if (!vma || vma->vm_flags & VM_MAYSHARE)
+               region_add(&inode->i_mapping->private_list, from, to);
+       return 0;
+ }
+diff --git a/net/core/pktgen.c b/net/core/pktgen.c
+index a756847..86714d1 100644
+--- a/net/core/pktgen.c
++++ b/net/core/pktgen.c
+@@ -2449,7 +2449,7 @@ static inline void free_SAs(struct pktgen_dev *pkt_dev)
+       if (pkt_dev->cflows) {
+               /* let go of the SAs if we have them */
+               int i = 0;
+-              for (;  i < pkt_dev->nflows; i++){
++              for (;  i < pkt_dev->cflows; i++) {
+                       struct xfrm_state *x = pkt_dev->flows[i].x;
+                       if (x) {
+                               xfrm_state_put(x);
+diff --git a/net/core/skbuff.c b/net/core/skbuff.c
+index 0675991..7832287 100644
+--- a/net/core/skbuff.c
++++ b/net/core/skbuff.c
+@@ -1992,7 +1992,7 @@ unsigned int skb_seq_read(unsigned int consumed, const u8 **data,
+ next_skb:
+       block_limit = skb_headlen(st->cur_skb) + st->stepped_offset;
+-      if (abs_offset < block_limit) {
++      if (abs_offset < block_limit && !st->frag_data) {
+               *data = st->cur_skb->data + (abs_offset - st->stepped_offset);
+               return block_limit - abs_offset;
+       }
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 7abc6b8..4eca4d3 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -931,6 +931,8 @@ static void tcp_init_metrics(struct sock *sk)
+       tcp_bound_rto(sk);
+       if (inet_csk(sk)->icsk_rto < TCP_TIMEOUT_INIT && !tp->rx_opt.saw_tstamp)
+               goto reset;
++
++cwnd:
+       tp->snd_cwnd = tcp_init_cwnd(tp, dst);
+       tp->snd_cwnd_stamp = tcp_time_stamp;
+       return;
+@@ -945,6 +947,7 @@ reset:
+               tp->mdev = tp->mdev_max = tp->rttvar = TCP_TIMEOUT_INIT;
+               inet_csk(sk)->icsk_rto = TCP_TIMEOUT_INIT;
+       }
++      goto cwnd;
+ }
+ static void tcp_update_reordering(struct sock *sk, const int metric,
+diff --git a/net/mac80211/rc80211_pid_algo.c b/net/mac80211/rc80211_pid_algo.c
+index a914ba7..4077676 100644
+--- a/net/mac80211/rc80211_pid_algo.c
++++ b/net/mac80211/rc80211_pid_algo.c
+@@ -367,8 +367,40 @@ static void rate_control_pid_rate_init(void *priv, void *priv_sta,
+        * Until that method is implemented, we will use the lowest supported
+        * rate as a workaround. */
+       struct ieee80211_supported_band *sband;
++      struct rc_pid_info *pinfo = priv;
++      struct rc_pid_rateinfo *rinfo = pinfo->rinfo;
++      int i, j, tmp;
++      bool s;
+       sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
++
++      /* Sort the rates. This is optimized for the most common case (i.e.
++       * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed
++       * mapping too. */
++      for (i = 0; i < sband->n_bitrates; i++) {
++              rinfo[i].index = i;
++              rinfo[i].rev_index = i;
++              if (RC_PID_FAST_START)
++                      rinfo[i].diff = 0;
++              else
++                      rinfo[i].diff = i * pinfo->norm_offset;
++      }
++      for (i = 1; i < sband->n_bitrates; i++) {
++              s = 0;
++              for (j = 0; j < sband->n_bitrates - i; j++)
++                      if (unlikely(sband->bitrates[rinfo[j].index].bitrate >
++                                   sband->bitrates[rinfo[j + 1].index].bitrate)) {
++                              tmp = rinfo[j].index;
++                              rinfo[j].index = rinfo[j + 1].index;
++                              rinfo[j + 1].index = tmp;
++                              rinfo[rinfo[j].index].rev_index = j;
++                              rinfo[rinfo[j + 1].index].rev_index = j + 1;
++                              s = 1;
++                      }
++              if (!s)
++                      break;
++      }
++
+       sta->txrate_idx = rate_lowest_index(local, sband, sta);
+       sta->fail_avg = 0;
+ }
+@@ -378,21 +410,23 @@ static void *rate_control_pid_alloc(struct ieee80211_local *local)
+       struct rc_pid_info *pinfo;
+       struct rc_pid_rateinfo *rinfo;
+       struct ieee80211_supported_band *sband;
+-      int i, j, tmp;
+-      bool s;
++      int i, max_rates = 0;
+ #ifdef CONFIG_MAC80211_DEBUGFS
+       struct rc_pid_debugfs_entries *de;
+ #endif
+-      sband = local->hw.wiphy->bands[local->hw.conf.channel->band];
+-
+       pinfo = kmalloc(sizeof(*pinfo), GFP_ATOMIC);
+       if (!pinfo)
+               return NULL;
++      for (i = 0; i < IEEE80211_NUM_BANDS; i++) {
++              sband = local->hw.wiphy->bands[i];
++              if (sband && sband->n_bitrates > max_rates)
++                      max_rates = sband->n_bitrates;
++      }
+       /* We can safely assume that sband won't change unless we get
+        * reinitialized. */
+-      rinfo = kmalloc(sizeof(*rinfo) * sband->n_bitrates, GFP_ATOMIC);
++      rinfo = kmalloc(sizeof(*rinfo) * max_rates, GFP_ATOMIC);
+       if (!rinfo) {
+               kfree(pinfo);
+               return NULL;
+@@ -410,33 +444,6 @@ static void *rate_control_pid_alloc(struct ieee80211_local *local)
+       pinfo->rinfo = rinfo;
+       pinfo->oldrate = 0;
+-      /* Sort the rates. This is optimized for the most common case (i.e.
+-       * almost-sorted CCK+OFDM rates). Kind of bubble-sort with reversed
+-       * mapping too. */
+-      for (i = 0; i < sband->n_bitrates; i++) {
+-              rinfo[i].index = i;
+-              rinfo[i].rev_index = i;
+-              if (RC_PID_FAST_START)
+-                      rinfo[i].diff = 0;
+-              else
+-                      rinfo[i].diff = i * pinfo->norm_offset;
+-      }
+-      for (i = 1; i < sband->n_bitrates; i++) {
+-              s = 0;
+-              for (j = 0; j < sband->n_bitrates - i; j++)
+-                      if (unlikely(sband->bitrates[rinfo[j].index].bitrate >
+-                                   sband->bitrates[rinfo[j + 1].index].bitrate)) {
+-                              tmp = rinfo[j].index;
+-                              rinfo[j].index = rinfo[j + 1].index;
+-                              rinfo[j + 1].index = tmp;
+-                              rinfo[rinfo[j].index].rev_index = j;
+-                              rinfo[rinfo[j + 1].index].rev_index = j + 1;
+-                              s = 1;
+-                      }
+-              if (!s)
+-                      break;
+-      }
+-
+ #ifdef CONFIG_MAC80211_DEBUGFS
+       de = &pinfo->dentries;
+       de->dir = debugfs_create_dir("rc80211_pid",
+diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
+index f028f70..e2d25da 100644
+--- a/security/selinux/hooks.c
++++ b/security/selinux/hooks.c
+@@ -4477,7 +4477,7 @@ static int selinux_ip_postroute_iptables_compat(struct sock *sk,
+       if (err)
+               return err;
+-      if (send_perm != 0)
++      if (!send_perm)
+               return 0;
+       err = sel_netport_sid(sk->sk_protocol,
+diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
+index 1710623..c10e476 100644
+--- a/sound/usb/usbaudio.c
++++ b/sound/usb/usbaudio.c
+@@ -3367,7 +3367,7 @@ static int snd_usb_create_quirk(struct snd_usb_audio *chip,
+               [QUIRK_MIDI_YAMAHA] = snd_usb_create_midi_interface,
+               [QUIRK_MIDI_MIDIMAN] = snd_usb_create_midi_interface,
+               [QUIRK_MIDI_NOVATION] = snd_usb_create_midi_interface,
+-              [QUIRK_MIDI_RAW] = snd_usb_create_midi_interface,
++              [QUIRK_MIDI_FASTLANE] = snd_usb_create_midi_interface,
+               [QUIRK_MIDI_EMAGIC] = snd_usb_create_midi_interface,
+               [QUIRK_MIDI_CME] = snd_usb_create_midi_interface,
+               [QUIRK_AUDIO_STANDARD_INTERFACE] = create_standard_audio_quirk,
+diff --git a/sound/usb/usbaudio.h b/sound/usb/usbaudio.h
+index 7cf18c3..7191d82 100644
+--- a/sound/usb/usbaudio.h
++++ b/sound/usb/usbaudio.h
+@@ -153,7 +153,7 @@ enum quirk_type {
+       QUIRK_MIDI_YAMAHA,
+       QUIRK_MIDI_MIDIMAN,
+       QUIRK_MIDI_NOVATION,
+-      QUIRK_MIDI_RAW,
++      QUIRK_MIDI_FASTLANE,
+       QUIRK_MIDI_EMAGIC,
+       QUIRK_MIDI_CME,
+       QUIRK_AUDIO_STANDARD_INTERFACE,
+diff --git a/sound/usb/usbmidi.c b/sound/usb/usbmidi.c
+index 940ae5a..cd2b622 100644
+--- a/sound/usb/usbmidi.c
++++ b/sound/usb/usbmidi.c
+@@ -1733,8 +1733,18 @@ int snd_usb_create_midi_interface(struct snd_usb_audio* chip,
+               umidi->usb_protocol_ops = &snd_usbmidi_novation_ops;
+               err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
+               break;
+-      case QUIRK_MIDI_RAW:
++      case QUIRK_MIDI_FASTLANE:
+               umidi->usb_protocol_ops = &snd_usbmidi_raw_ops;
++              /*
++               * Interface 1 contains isochronous endpoints, but with the same
++               * numbers as in interface 0.  Since it is interface 1 that the
++               * USB core has most recently seen, these descriptors are now
++               * associated with the endpoint numbers.  This will foul up our
++               * attempts to submit bulk/interrupt URBs to the endpoints in
++               * interface 0, so we have to make sure that the USB core looks
++               * again at interface 0 by calling usb_set_interface() on it.
++               */
++              usb_set_interface(umidi->chip->dev, 0, 0);
+               err = snd_usbmidi_detect_per_port_endpoints(umidi, endpoints);
+               break;
+       case QUIRK_MIDI_EMAGIC:
+diff --git a/sound/usb/usbquirks.h b/sound/usb/usbquirks.h
+index 9ea726c..076ca4c 100644
+--- a/sound/usb/usbquirks.h
++++ b/sound/usb/usbquirks.h
+@@ -1756,7 +1756,7 @@ YAMAHA_DEVICE(0x7010, "UB99"),
+               .data = & (const struct snd_usb_audio_quirk[]) {
+                       {
+                               .ifnum = 0,
+-                              .type = QUIRK_MIDI_RAW
++                              .type = QUIRK_MIDI_FASTLANE
+                       },
+                       {
+                               .ifnum = 1,
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.25-26 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.25-26
new file mode 100644 (file)
index 0000000..5fd8cb8
--- /dev/null
@@ -0,0 +1,1123 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Upstream 2.6.27.26 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 1314692..90764ee 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .25
++EXTRAVERSION = .26
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/kernel/reboot.c b/arch/x86/kernel/reboot.c
+index dfaa343..1177f10 100644
+--- a/arch/x86/kernel/reboot.c
++++ b/arch/x86/kernel/reboot.c
+@@ -169,6 +169,24 @@ static struct dmi_system_id __initdata reboot_dmi_table[] = {
+                       DMI_MATCH(DMI_BOARD_NAME, "0KW626"),
+               },
+       },
++      {   /* Handle problems with rebooting on Dell Optiplex 360 with 0T656F */
++              .callback = set_bios_reboot,
++              .ident = "Dell OptiPlex 360",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 360"),
++                      DMI_MATCH(DMI_BOARD_NAME, "0T656F"),
++              },
++      },
++      {   /* Handle problems with rebooting on Dell Optiplex 330 with 0KP561 */
++              .callback = set_bios_reboot,
++              .ident = "Dell OptiPlex 330",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 330"),
++                      DMI_MATCH(DMI_BOARD_NAME, "0KP561"),
++              },
++      },
+       {       /* Handle problems with rebooting on Dell 2400's */
+               .callback = set_bios_reboot,
+               .ident = "Dell PowerEdge 2400",
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 2781331..f0b164b 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -250,15 +250,13 @@ static inline void copy_edd(void)
+ #ifdef CONFIG_BLK_DEV_INITRD
+-#ifdef CONFIG_X86_32
+-
+ #define MAX_MAP_CHUNK (NR_FIX_BTMAPS << PAGE_SHIFT)
+ static void __init relocate_initrd(void)
+ {
+       u64 ramdisk_image = boot_params.hdr.ramdisk_image;
+       u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
+-      u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
++      u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
+       u64 ramdisk_here;
+       unsigned long slop, clen, mapaddr;
+       char *p, *q;
+@@ -314,14 +312,13 @@ static void __init relocate_initrd(void)
+               ramdisk_image, ramdisk_image + ramdisk_size - 1,
+               ramdisk_here, ramdisk_here + ramdisk_size - 1);
+ }
+-#endif
+ static void __init reserve_initrd(void)
+ {
+       u64 ramdisk_image = boot_params.hdr.ramdisk_image;
+       u64 ramdisk_size  = boot_params.hdr.ramdisk_size;
+       u64 ramdisk_end   = ramdisk_image + ramdisk_size;
+-      u64 end_of_lowmem = max_low_pfn << PAGE_SHIFT;
++      u64 end_of_lowmem = max_low_pfn_mapped << PAGE_SHIFT;
+       if (!boot_params.hdr.type_of_loader ||
+           !ramdisk_image || !ramdisk_size)
+@@ -351,14 +348,8 @@ static void __init reserve_initrd(void)
+               return;
+       }
+-#ifdef CONFIG_X86_32
+       relocate_initrd();
+-#else
+-      printk(KERN_ERR "initrd extends beyond end of memory "
+-             "(0x%08llx > 0x%08llx)\ndisabling initrd\n",
+-             ramdisk_end, end_of_lowmem);
+-      initrd_start = 0;
+-#endif
++
+       free_early(ramdisk_image, ramdisk_end);
+ }
+ #else
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 395f8ea..615fcd3 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -177,6 +177,7 @@ static int print_unex = 1;
+ #include <linux/interrupt.h>
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
++#include <linux/mod_devicetable.h>
+ #include <linux/buffer_head.h>        /* for invalidate_buffers() */
+ #include <linux/mutex.h>
+@@ -551,6 +552,8 @@ static void process_fd_request(void);
+ static void recalibrate_floppy(void);
+ static void floppy_shutdown(unsigned long);
++static int floppy_request_regions(int);
++static void floppy_release_regions(int);
+ static int floppy_grab_irq_and_dma(void);
+ static void floppy_release_irq_and_dma(void);
+@@ -4273,8 +4276,7 @@ static int __init floppy_init(void)
+               FDCS->rawcmd = 2;
+               if (user_reset_fdc(-1, FD_RESET_ALWAYS, 0)) {
+                       /* free ioports reserved by floppy_grab_irq_and_dma() */
+-                      release_region(FDCS->address + 2, 4);
+-                      release_region(FDCS->address + 7, 1);
++                      floppy_release_regions(fdc);
+                       FDCS->address = -1;
+                       FDCS->version = FDC_NONE;
+                       continue;
+@@ -4283,8 +4285,7 @@ static int __init floppy_init(void)
+               FDCS->version = get_fdc_version();
+               if (FDCS->version == FDC_NONE) {
+                       /* free ioports reserved by floppy_grab_irq_and_dma() */
+-                      release_region(FDCS->address + 2, 4);
+-                      release_region(FDCS->address + 7, 1);
++                      floppy_release_regions(fdc);
+                       FDCS->address = -1;
+                       continue;
+               }
+@@ -4357,6 +4358,47 @@ out_put_disk:
+ static DEFINE_SPINLOCK(floppy_usage_lock);
++static const struct io_region {
++      int offset;
++      int size;
++} io_regions[] = {
++      { 2, 1 },
++      /* address + 3 is sometimes reserved by pnp bios for motherboard */
++      { 4, 2 },
++      /* address + 6 is reserved, and may be taken by IDE.
++       * Unfortunately, Adaptec doesn't know this :-(, */
++      { 7, 1 },
++};
++
++static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
++{
++      while (p != io_regions) {
++              p--;
++              release_region(FDCS->address + p->offset, p->size);
++      }
++}
++
++#define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
++
++static int floppy_request_regions(int fdc)
++{
++      const struct io_region *p;
++
++      for (p = io_regions; p < ARRAY_END(io_regions); p++) {
++              if (!request_region(FDCS->address + p->offset, p->size, "floppy")) {
++                      DPRINT("Floppy io-port 0x%04lx in use\n", FDCS->address + p->offset);
++                      floppy_release_allocated_regions(fdc, p);
++                      return -EBUSY;
++              }
++      }
++      return 0;
++}
++
++static void floppy_release_regions(int fdc)
++{
++      floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
++}
++
+ static int floppy_grab_irq_and_dma(void)
+ {
+       unsigned long flags;
+@@ -4398,18 +4440,8 @@ static int floppy_grab_irq_and_dma(void)
+       for (fdc = 0; fdc < N_FDC; fdc++) {
+               if (FDCS->address != -1) {
+-                      if (!request_region(FDCS->address + 2, 4, "floppy")) {
+-                              DPRINT("Floppy io-port 0x%04lx in use\n",
+-                                     FDCS->address + 2);
+-                              goto cleanup1;
+-                      }
+-                      if (!request_region(FDCS->address + 7, 1, "floppy DIR")) {
+-                              DPRINT("Floppy io-port 0x%04lx in use\n",
+-                                     FDCS->address + 7);
+-                              goto cleanup2;
+-                      }
+-                      /* address + 6 is reserved, and may be taken by IDE.
+-                       * Unfortunately, Adaptec doesn't know this :-(, */
++                      if (floppy_request_regions(fdc))
++                              goto cleanup;
+               }
+       }
+       for (fdc = 0; fdc < N_FDC; fdc++) {
+@@ -4431,15 +4463,11 @@ static int floppy_grab_irq_and_dma(void)
+       fdc = 0;
+       irqdma_allocated = 1;
+       return 0;
+-cleanup2:
+-      release_region(FDCS->address + 2, 4);
+-cleanup1:
++cleanup:
+       fd_free_irq();
+       fd_free_dma();
+-      while (--fdc >= 0) {
+-              release_region(FDCS->address + 2, 4);
+-              release_region(FDCS->address + 7, 1);
+-      }
++      while (--fdc >= 0)
++              floppy_release_regions(fdc);
+       spin_lock_irqsave(&floppy_usage_lock, flags);
+       usage_count--;
+       spin_unlock_irqrestore(&floppy_usage_lock, flags);
+@@ -4500,10 +4528,8 @@ static void floppy_release_irq_and_dma(void)
+ #endif
+       old_fdc = fdc;
+       for (fdc = 0; fdc < N_FDC; fdc++)
+-              if (FDCS->address != -1) {
+-                      release_region(FDCS->address + 2, 4);
+-                      release_region(FDCS->address + 7, 1);
+-              }
++              if (FDCS->address != -1)
++                      floppy_release_regions(fdc);
+       fdc = old_fdc;
+ }
+@@ -4572,6 +4598,13 @@ MODULE_AUTHOR("Alain L. Knaff");
+ MODULE_SUPPORTED_DEVICE("fd");
+ MODULE_LICENSE("GPL");
++/* This doesn't actually get used other than for module information */
++static const struct pnp_device_id floppy_pnpids[] = {
++      { "PNP0700", 0 },
++      { }
++};
++MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
++
+ #else
+ __setup("floppy=", floppy_setup);
+diff --git a/drivers/char/moxa.c b/drivers/char/moxa.c
+index d3d7864..729be5e 100644
+--- a/drivers/char/moxa.c
++++ b/drivers/char/moxa.c
+@@ -1158,6 +1158,11 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
+               return -ENODEV;
+       }
++      if (port % MAX_PORTS_PER_BOARD >= brd->numPorts) {
++              retval = -ENODEV;
++              goto out_unlock;
++      }
++
+       ch = &brd->ports[port % MAX_PORTS_PER_BOARD];
+       ch->port.count++;
+       tty->driver_data = ch;
+@@ -1182,8 +1187,8 @@ static int moxa_open(struct tty_struct *tty, struct file *filp)
+                               moxa_close_port(ch);
+       } else
+               ch->port.flags |= ASYNC_NORMAL_ACTIVE;
++out_unlock:
+       mutex_unlock(&moxa_openlock);
+-
+       return retval;
+ }
+diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
+index b638403..ebda9a8 100644
+--- a/drivers/char/mxser.c
++++ b/drivers/char/mxser.c
+@@ -2790,7 +2790,7 @@ static int __init mxser_module_init(void)
+                       continue;
+               brd = &mxser_boards[m];
+-              retval = mxser_get_ISA_conf(!ioaddr[b], brd);
++              retval = mxser_get_ISA_conf(ioaddr[b], brd);
+               if (retval <= 0) {
+                       brd->info = NULL;
+                       continue;
+diff --git a/drivers/char/pcmcia/cm4000_cs.c b/drivers/char/pcmcia/cm4000_cs.c
+index f070ae7..0b255b9 100644
+--- a/drivers/char/pcmcia/cm4000_cs.c
++++ b/drivers/char/pcmcia/cm4000_cs.c
+@@ -1575,7 +1575,8 @@ static long cmm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+               clear_bit(LOCK_IO, &dev->flags);
+               wake_up_interruptible(&dev->ioq);
+-              return 0;
++              rc = 0;
++              break;
+       case CM_IOCSPTS:
+               {
+                       struct ptsreq krnptsreq;
+diff --git a/drivers/firmware/memmap.c b/drivers/firmware/memmap.c
+index 3bf8ee1..a36e9aa 100644
+--- a/drivers/firmware/memmap.c
++++ b/drivers/firmware/memmap.c
+@@ -31,8 +31,12 @@
+  * information is necessary as for the resource tree.
+  */
+ struct firmware_map_entry {
+-      resource_size_t         start;  /* start of the memory range */
+-      resource_size_t         end;    /* end of the memory range (incl.) */
++      /*
++       * start and end must be u64 rather than resource_size_t, because e820
++       * resources can lie at addresses above 4G.
++       */
++      u64                     start;  /* start of the memory range */
++      u64                     end;    /* end of the memory range (incl.) */
+       const char              *type;  /* type of the memory range */
+       struct list_head        list;   /* entry for the linked list */
+       struct kobject          kobj;   /* kobject for each entry */
+@@ -101,7 +105,7 @@ static LIST_HEAD(map_entries);
+  * Common implementation of firmware_map_add() and firmware_map_add_early()
+  * which expects a pre-allocated struct firmware_map_entry.
+  **/
+-static int firmware_map_add_entry(resource_size_t start, resource_size_t end,
++static int firmware_map_add_entry(u64 start, u64 end,
+                                 const char *type,
+                                 struct firmware_map_entry *entry)
+ {
+@@ -132,8 +136,7 @@ static int firmware_map_add_entry(resource_size_t start, resource_size_t end,
+  *
+  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
+  **/
+-int firmware_map_add(resource_size_t start, resource_size_t end,
+-                   const char *type)
++int firmware_map_add(u64 start, u64 end, const char *type)
+ {
+       struct firmware_map_entry *entry;
+@@ -157,8 +160,7 @@ int firmware_map_add(resource_size_t start, resource_size_t end,
+  *
+  * Returns 0 on success, or -ENOMEM if no memory could be allocated.
+  **/
+-int __init firmware_map_add_early(resource_size_t start, resource_size_t end,
+-                                const char *type)
++int __init firmware_map_add_early(u64 start, u64 end, const char *type)
+ {
+       struct firmware_map_entry *entry;
+diff --git a/drivers/infiniband/hw/mlx4/qp.c b/drivers/infiniband/hw/mlx4/qp.c
+index 9559248..8c844a1 100644
+--- a/drivers/infiniband/hw/mlx4/qp.c
++++ b/drivers/infiniband/hw/mlx4/qp.c
+@@ -1563,12 +1563,16 @@ int mlx4_ib_post_send(struct ib_qp *ibqp, struct ib_send_wr *wr,
+                               break;
+                       case IB_WR_LOCAL_INV:
++                              ctrl->srcrb_flags |=
++                                      cpu_to_be32(MLX4_WQE_CTRL_STRONG_ORDER);
+                               set_local_inv_seg(wqe, wr->ex.invalidate_rkey);
+                               wqe  += sizeof (struct mlx4_wqe_local_inval_seg);
+                               size += sizeof (struct mlx4_wqe_local_inval_seg) / 16;
+                               break;
+                       case IB_WR_FAST_REG_MR:
++                              ctrl->srcrb_flags |=
++                                      cpu_to_be32(MLX4_WQE_CTRL_STRONG_ORDER);
+                               set_fmr_seg(wqe, wr);
+                               wqe  += sizeof (struct mlx4_wqe_fmr_seg);
+                               size += sizeof (struct mlx4_wqe_fmr_seg) / 16;
+diff --git a/drivers/isdn/hisax/hfc_pci.c b/drivers/isdn/hisax/hfc_pci.c
+index f126566..3d337d9 100644
+--- a/drivers/isdn/hisax/hfc_pci.c
++++ b/drivers/isdn/hisax/hfc_pci.c
+@@ -82,8 +82,9 @@ release_io_hfcpci(struct IsdnCardState *cs)
+       Write_hfc(cs, HFCPCI_INT_M2, cs->hw.hfcpci.int_m2);
+       pci_write_config_word(cs->hw.hfcpci.dev, PCI_COMMAND, 0);       /* disable memory mapped ports + busmaster */
+       del_timer(&cs->hw.hfcpci.timer);
+-      kfree(cs->hw.hfcpci.share_start);
+-      cs->hw.hfcpci.share_start = NULL;
++      pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
++              cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
++      cs->hw.hfcpci.fifos = NULL;
+       iounmap((void *)cs->hw.hfcpci.pci_io);
+ }
+@@ -1663,8 +1664,19 @@ setup_hfcpci(struct IsdnCard *card)
+                                            dev_hfcpci);
+               i++;
+               if (tmp_hfcpci) {
++                      dma_addr_t      dma_mask = DMA_BIT_MASK(32) & ~0x7fffUL;
+                       if (pci_enable_device(tmp_hfcpci))
+                               continue;
++                      if (pci_set_dma_mask(tmp_hfcpci, dma_mask)) {
++                              printk(KERN_WARNING
++                                      "HiSax hfc_pci: No suitable DMA available.\n");
++                              continue;
++                      }
++                      if (pci_set_consistent_dma_mask(tmp_hfcpci, dma_mask)) {
++                              printk(KERN_WARNING
++                                      "HiSax hfc_pci: No suitable consistent DMA available.\n");
++                              continue;
++                      }
+                       pci_set_master(tmp_hfcpci);
+                       if ((card->para[0]) && (card->para[0] != (tmp_hfcpci->resource[ 0].start & PCI_BASE_ADDRESS_IO_MASK)))
+                               continue;
+@@ -1693,22 +1705,29 @@ setup_hfcpci(struct IsdnCard *card)
+               printk(KERN_WARNING "HFC-PCI: No IO-Mem for PCI card found\n");
+               return (0);
+       }
++
+       /* Allocate memory for FIFOS */
+-      /* Because the HFC-PCI needs a 32K physical alignment, we */
+-      /* need to allocate the double mem and align the address */
+-      if (!(cs->hw.hfcpci.share_start = kmalloc(65536, GFP_KERNEL))) {
+-              printk(KERN_WARNING "HFC-PCI: Error allocating memory for FIFO!\n");
++      cs->hw.hfcpci.fifos = pci_alloc_consistent(cs->hw.hfcpci.dev,
++                                      0x8000, &cs->hw.hfcpci.dma);
++      if (!cs->hw.hfcpci.fifos) {
++              printk(KERN_WARNING "HFC-PCI: Error allocating FIFO memory!\n");
++              return 0;
++      }
++      if (cs->hw.hfcpci.dma & 0x7fff) {
++              printk(KERN_WARNING
++                  "HFC-PCI: Error DMA memory not on 32K boundary (%lx)\n",
++                  (u_long)cs->hw.hfcpci.dma);
++              pci_free_consistent(cs->hw.hfcpci.dev, 0x8000,
++                      cs->hw.hfcpci.fifos, cs->hw.hfcpci.dma);
+               return 0;
+       }
+-      cs->hw.hfcpci.fifos = (void *)
+-          (((ulong) cs->hw.hfcpci.share_start) & ~0x7FFF) + 0x8000;
+-      pci_write_config_dword(cs->hw.hfcpci.dev, 0x80, (u_int) virt_to_bus(cs->hw.hfcpci.fifos));
++      pci_write_config_dword(cs->hw.hfcpci.dev, 0x80, (u32)cs->hw.hfcpci.dma);
+       cs->hw.hfcpci.pci_io = ioremap((ulong) cs->hw.hfcpci.pci_io, 256);
+       printk(KERN_INFO
+-             "HFC-PCI: defined at mem %p fifo %p(%#x) IRQ %d HZ %d\n",
++             "HFC-PCI: defined at mem %p fifo %p(%lx) IRQ %d HZ %d\n",
+              cs->hw.hfcpci.pci_io,
+              cs->hw.hfcpci.fifos,
+-             (u_int) virt_to_bus(cs->hw.hfcpci.fifos),
++             (u_long)cs->hw.hfcpci.dma,
+              cs->irq, HZ);
+       spin_lock_irqsave(&cs->lock, flags);
+diff --git a/drivers/isdn/hisax/hisax.h b/drivers/isdn/hisax/hisax.h
+index e8d429f..f1a828b 100644
+--- a/drivers/isdn/hisax/hisax.h
++++ b/drivers/isdn/hisax/hisax.h
+@@ -694,7 +694,7 @@ struct hfcPCI_hw {
+         int nt_timer;
+         struct pci_dev *dev;
+         unsigned char *pci_io; /* start of PCI IO memory */
+-        void *share_start; /* shared memory for Fifos start */
++      dma_addr_t dma; /* dma handle for Fifos */
+         void *fifos; /* FIFO memory */ 
+         int last_bfifo_cnt[2]; /* marker saving last b-fifo frame count */
+       struct timer_list timer;
+diff --git a/drivers/md/dm-mpath.c b/drivers/md/dm-mpath.c
+index 61f5753..7830b01 100644
+--- a/drivers/md/dm-mpath.c
++++ b/drivers/md/dm-mpath.c
+@@ -540,6 +540,12 @@ static int parse_path_selector(struct arg_set *as, struct priority_group *pg,
+               return -EINVAL;
+       }
++      if (ps_argc > as->argc) {
++              dm_put_path_selector(pst);
++              ti->error = "not enough arguments for path selector";
++              return -EINVAL;
++      }
++
+       r = pst->create(&pg->ps, ps_argc, as->argv);
+       if (r) {
+               dm_put_path_selector(pst);
+@@ -684,6 +690,11 @@ static int parse_hw_handler(struct arg_set *as, struct multipath *m)
+       if (!hw_argc)
+               return 0;
++      if (hw_argc > as->argc) {
++              ti->error = "not enough arguments for hardware handler";
++              return -EINVAL;
++      }
++
+       m->hw_handler_name = kstrdup(shift(as), GFP_KERNEL);
+       request_module("scsi_dh_%s", m->hw_handler_name);
+       if (scsi_dh_handler_exist(m->hw_handler_name) == 0) {
+diff --git a/drivers/md/dm.c b/drivers/md/dm.c
+index ace998c..925efaf 100644
+--- a/drivers/md/dm.c
++++ b/drivers/md/dm.c
+@@ -265,6 +265,10 @@ static int dm_blk_open(struct inode *inode, struct file *file)
+               goto out;
+       }
++      if (test_bit(DMF_FREEING, &md->flags) ||
++          test_bit(DMF_DELETING, &md->flags))
++              return NULL;
++
+       dm_get(md);
+       atomic_inc(&md->open_count);
+diff --git a/drivers/md/raid5.c b/drivers/md/raid5.c
+index 224de02..562ab63 100644
+--- a/drivers/md/raid5.c
++++ b/drivers/md/raid5.c
+@@ -3431,6 +3431,7 @@ static int make_request(struct request_queue *q, struct bio * bi)
+                               spin_unlock_irq(&conf->device_lock);
+                               if (must_retry) {
+                                       release_stripe(sh);
++                                      schedule();
+                                       goto retry;
+                               }
+                       }
+diff --git a/drivers/net/bonding/bond_sysfs.c b/drivers/net/bonding/bond_sysfs.c
+index 3bdb473..f164239 100644
+--- a/drivers/net/bonding/bond_sysfs.c
++++ b/drivers/net/bonding/bond_sysfs.c
+@@ -1464,6 +1464,7 @@ int bond_create_sysfs(void)
+                       printk(KERN_ERR
+                              "network device named %s already exists in sysfs",
+                              class_attr_bonding_masters.attr.name);
++              ret = 0;
+       }
+       return ret;
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index a98d31a..5952522 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -65,7 +65,6 @@ static const int multicast_filter_limit = 32;
+ #define RX_DMA_BURST  6       /* Maximum PCI burst, '6' is 1024 */
+ #define TX_DMA_BURST  6       /* Maximum PCI burst, '6' is 1024 */
+ #define EarlyTxThld   0x3F    /* 0x3F means NO early transmit */
+-#define RxPacketMaxSize       0x3FE8  /* 16K - 1 - ETH_HLEN - VLAN - CRC... */
+ #define SafeMtu               0x1c20  /* ... actually life sucks beyond ~7k */
+ #define InterFrameGap 0x03    /* 3 means InterFrameGap = the shortest one */
+@@ -1976,10 +1975,10 @@ static u16 rtl_rw_cpluscmd(void __iomem *ioaddr)
+       return cmd;
+ }
+-static void rtl_set_rx_max_size(void __iomem *ioaddr)
++static void rtl_set_rx_max_size(void __iomem *ioaddr, unsigned int rx_buf_sz)
+ {
+       /* Low hurts. Let's disable the filtering. */
+-      RTL_W16(RxMaxSize, 16383);
++      RTL_W16(RxMaxSize, rx_buf_sz);
+ }
+ static void rtl8169_set_magic_reg(void __iomem *ioaddr, unsigned mac_version)
+@@ -2026,7 +2025,7 @@ static void rtl_hw_start_8169(struct net_device *dev)
+       RTL_W8(EarlyTxThres, EarlyTxThld);
+-      rtl_set_rx_max_size(ioaddr);
++      rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
+       if ((tp->mac_version == RTL_GIGA_MAC_VER_01) ||
+           (tp->mac_version == RTL_GIGA_MAC_VER_02) ||
+@@ -2090,7 +2089,7 @@ static void rtl_hw_start_8168(struct net_device *dev)
+       RTL_W8(EarlyTxThres, EarlyTxThld);
+-      rtl_set_rx_max_size(ioaddr);
++      rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
+       rtl_set_rx_tx_config_registers(tp);
+@@ -2142,7 +2141,7 @@ static void rtl_hw_start_8101(struct net_device *dev)
+       RTL_W8(EarlyTxThres, EarlyTxThld);
+-      rtl_set_rx_max_size(ioaddr);
++      rtl_set_rx_max_size(ioaddr, tp->rx_buf_sz);
+       tp->cp_cmd |= rtl_rw_cpluscmd(ioaddr) | PCIMulRW;
+diff --git a/drivers/parport/parport_pc.c b/drivers/parport/parport_pc.c
+index 8a846ad..7f0c60c 100644
+--- a/drivers/parport/parport_pc.c
++++ b/drivers/parport/parport_pc.c
+@@ -1413,11 +1413,13 @@ static void __devinit decode_smsc(int efer, int key, int devid, int devrev)
+ static void __devinit winbond_check(int io, int key)
+ {
+-      int devid,devrev,oldid,x_devid,x_devrev,x_oldid;
++      int origval, devid, devrev, oldid, x_devid, x_devrev, x_oldid;
+       if (!request_region(io, 3, __func__))
+               return;
++      origval = inb(io); /* Save original value */
++
+       /* First probe without key */
+       outb(0x20,io);
+       x_devid=inb(io+1);
+@@ -1437,6 +1439,8 @@ static void __devinit winbond_check(int io, int key)
+       oldid=inb(io+1);
+       outb(0xaa,io);    /* Magic Seal */
++      outb(origval, io); /* in case we poked some entirely different hardware */
++
+       if ((x_devid == devid) && (x_devrev == devrev) && (x_oldid == oldid))
+               goto out; /* protection against false positives */
+@@ -1447,11 +1451,15 @@ out:
+ static void __devinit winbond_check2(int io,int key)
+ {
+-        int devid,devrev,oldid,x_devid,x_devrev,x_oldid;
++      int origval[3], devid, devrev, oldid, x_devid, x_devrev, x_oldid;
+       if (!request_region(io, 3, __func__))
+               return;
++      origval[0] = inb(io); /* Save original values */
++      origval[1] = inb(io + 1);
++      origval[2] = inb(io + 2);
++
+       /* First probe without the key */
+       outb(0x20,io+2);
+       x_devid=inb(io+2);
+@@ -1470,6 +1478,10 @@ static void __devinit winbond_check2(int io,int key)
+         oldid=inb(io+2);
+         outb(0xaa,io);    /* Magic Seal */
++      outb(origval[0], io); /* in case we poked some entirely different hardware */
++      outb(origval[1], io + 1);
++      outb(origval[2], io + 2);
++
+       if ((x_devid == devid) && (x_devrev == devrev) && (x_oldid == oldid))
+               goto out; /* protection against false positives */
+@@ -1480,11 +1492,13 @@ out:
+ static void __devinit smsc_check(int io, int key)
+ {
+-        int id,rev,oldid,oldrev,x_id,x_rev,x_oldid,x_oldrev;
++      int origval, id, rev, oldid, oldrev, x_id, x_rev, x_oldid, x_oldrev;
+       if (!request_region(io, 3, __func__))
+               return;
++      origval = inb(io); /* Save original value */
++
+       /* First probe without the key */
+       outb(0x0d,io);
+       x_oldid=inb(io+1);
+@@ -1508,6 +1522,8 @@ static void __devinit smsc_check(int io, int key)
+       rev=inb(io+1);
+         outb(0xaa,io);    /* Magic Seal */
++      outb(origval, io); /* in case we poked some entirely different hardware */
++
+       if ((x_id == id) && (x_oldrev == oldrev) &&
+           (x_oldid == oldid) && (x_rev == rev))
+               goto out; /* protection against false positives */
+@@ -1544,11 +1560,12 @@ static void __devinit detect_and_report_smsc (void)
+ static void __devinit detect_and_report_it87(void)
+ {
+       u16 dev;
+-      u8 r;
++      u8 origval, r;
+       if (verbose_probing)
+               printk(KERN_DEBUG "IT8705 Super-IO detection, now testing port 2E ...\n");
+-      if (!request_region(0x2e, 1, __func__))
++      if (!request_region(0x2e, 2, __func__))
+               return;
++      origval = inb(0x2e);            /* Save original value */
+       outb(0x87, 0x2e);
+       outb(0x01, 0x2e);
+       outb(0x55, 0x2e);
+@@ -1568,8 +1585,10 @@ static void __devinit detect_and_report_it87(void)
+               outb(r | 8, 0x2F);
+               outb(0x02, 0x2E);       /* Lock */
+               outb(0x02, 0x2F);
++      } else {
++              outb(origval, 0x2e);    /* Oops, sorry to disturb */
+       }
+-      release_region(0x2e, 1);
++      release_region(0x2e, 2);
+ }
+ #endif /* CONFIG_PARPORT_PC_SUPERIO */
+@@ -2192,6 +2211,9 @@ struct parport *parport_pc_probe_port (unsigned long int base,
+               if (IS_ERR(pdev))
+                       return NULL;
+               dev = &pdev->dev;
++
++              dev->coherent_dma_mask = DMA_BIT_MASK(24);
++              dev->dma_mask = &dev->coherent_dma_mask;
+       }
+       ops = kmalloc(sizeof (struct parport_operations), GFP_KERNEL);
+diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c
+index 032db81..f349211 100644
+--- a/drivers/parport/parport_serial.c
++++ b/drivers/parport/parport_serial.c
+@@ -30,6 +30,7 @@ enum parport_pc_pci_cards {
+       titan_210l,
+       netmos_9xx5_combo,
+       netmos_9855,
++      netmos_9855_2p,
+       avlab_1s1p,
+       avlab_1s2p,
+       avlab_2s1p,
+@@ -62,7 +63,7 @@ struct parport_pc_pci {
+                               struct parport_pc_pci *card, int failed);
+ };
+-static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *card, int autoirq, int autodma)
++static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc_pci *par, int autoirq, int autodma)
+ {
+       /* the rule described below doesn't hold for this device */
+       if (dev->device == PCI_DEVICE_ID_NETMOS_9835 &&
+@@ -74,9 +75,17 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc
+        * and serial ports.  The form is 0x00PS, where <P> is the number of
+        * parallel ports and <S> is the number of serial ports.
+        */
+-      card->numports = (dev->subsystem_device & 0xf0) >> 4;
+-      if (card->numports > ARRAY_SIZE(card->addr))
+-              card->numports = ARRAY_SIZE(card->addr);
++      par->numports = (dev->subsystem_device & 0xf0) >> 4;
++      if (par->numports > ARRAY_SIZE(par->addr))
++              par->numports = ARRAY_SIZE(par->addr);
++      /*
++       * This function is currently only called for cards with up to
++       * one parallel port.
++       * Parallel port BAR is either before or after serial ports BARS;
++       * hence, lo should be either 0 or equal to the number of serial ports.
++       */
++      if (par->addr[0].lo != 0)
++              par->addr[0].lo = dev->subsystem_device & 0xf;
+       return 0;
+ }
+@@ -84,7 +93,8 @@ static struct parport_pc_pci cards[] __devinitdata = {
+       /* titan_110l */                { 1, { { 3, -1 }, } },
+       /* titan_210l */                { 1, { { 3, -1 }, } },
+       /* netmos_9xx5_combo */         { 1, { { 2, -1 }, }, netmos_parallel_init },
+-      /* netmos_9855 */               { 1, { { 2, -1 }, }, netmos_parallel_init },
++      /* netmos_9855 */               { 1, { { 0, -1 }, }, netmos_parallel_init },
++      /* netmos_9855_2p */            { 2, { { 0, -1 }, { 2, -1 }, } },
+       /* avlab_1s1p     */            { 1, { { 1, 2}, } },
+       /* avlab_1s2p     */            { 2, { { 1, 2}, { 3, 4 },} },
+       /* avlab_2s1p     */            { 1, { { 2, 3}, } },
+@@ -110,6 +120,10 @@ static struct pci_device_id parport_serial_pci_tbl[] = {
+       { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9845,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9xx5_combo },
+       { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
++        0x1000, 0x0020, 0, 0, netmos_9855_2p },
++      { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
++        0x1000, 0x0022, 0, 0, netmos_9855_2p },
++      { PCI_VENDOR_ID_NETMOS, PCI_DEVICE_ID_NETMOS_9855,
+         PCI_ANY_ID, PCI_ANY_ID, 0, 0, netmos_9855 },
+       /* PCI_VENDOR_ID_AVLAB/Intek21 has another bunch of cards ...*/
+       { PCI_VENDOR_ID_AFAVLAB, 0x2110,
+@@ -192,6 +206,12 @@ static struct pciserial_board pci_parport_serial_boards[] __devinitdata = {
+               .uart_offset    = 8,
+       },
+       [netmos_9855] = {
++              .flags          = FL_BASE2 | FL_BASE_BARS,
++              .num_ports      = 1,
++              .base_baud      = 115200,
++              .uart_offset    = 8,
++      },
++      [netmos_9855_2p] = {
+               .flags          = FL_BASE4 | FL_BASE_BARS,
+               .num_ports      = 1,
+               .base_baud      = 115200,
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 409e00e..33cc148 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -473,6 +473,8 @@ pci_raw_set_power_state(struct pci_dev *dev, pci_power_t state)
+               pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
+               pmcsr |= state;
+               break;
++      case PCI_D3hot:
++      case PCI_D3cold:
+       case PCI_UNKNOWN: /* Boot-up */
+               if ((pmcsr & PCI_PM_CTRL_STATE_MASK) == PCI_D3hot
+                && !(pmcsr & PCI_PM_CTRL_NO_SOFT_RESET))
+@@ -1184,15 +1186,14 @@ pci_power_t pci_target_state(struct pci_dev *dev)
+               default:
+                       target_state = state;
+               }
++      } else if (!dev->pm_cap) {
++              target_state = PCI_D0;
+       } else if (device_may_wakeup(&dev->dev)) {
+               /*
+                * Find the deepest state from which the device can generate
+                * wake-up events, make it the target state and enable device
+                * to generate PME#.
+                */
+-              if (!dev->pm_cap)
+-                      return PCI_POWER_ERROR;
+-
+               if (dev->pme_support) {
+                       while (target_state
+                             && !(dev->pme_support & (1 << target_state)))
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index e4df84b..def3398 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -633,6 +633,10 @@ void pcie_aspm_init_link_state(struct pci_dev *pdev)
+       if (pdev->pcie_type != PCI_EXP_TYPE_ROOT_PORT &&
+               pdev->pcie_type != PCI_EXP_TYPE_DOWNSTREAM)
+               return;
++      /* VIA has a strange chipset, root port is under a bridge */
++      if (pdev->pcie_type == PCI_EXP_TYPE_ROOT_PORT &&
++              pdev->bus->self)
++              return;
+       down_read(&pci_bus_sem);
+       if (list_empty(&pdev->subordinate->devices))
+               goto out;
+diff --git a/drivers/video/atmel_lcdfb.c b/drivers/video/atmel_lcdfb.c
+index 75dac57..3105bdc 100644
+--- a/drivers/video/atmel_lcdfb.c
++++ b/drivers/video/atmel_lcdfb.c
+@@ -29,14 +29,8 @@
+ /* configurable parameters */
+ #define ATMEL_LCDC_CVAL_DEFAULT               0xc8
+-#define ATMEL_LCDC_DMA_BURST_LEN      8
+-
+-#if defined(CONFIG_ARCH_AT91SAM9263) || defined(CONFIG_ARCH_AT91CAP9) || \
+-      defined(CONFIG_ARCH_AT91SAM9RL)
+-#define ATMEL_LCDC_FIFO_SIZE          2048
+-#else
+-#define ATMEL_LCDC_FIFO_SIZE          512
+-#endif
++#define ATMEL_LCDC_DMA_BURST_LEN      8       /* words */
++#define ATMEL_LCDC_FIFO_SIZE          512     /* words */
+ #if defined(CONFIG_ARCH_AT91)
+ #define       ATMEL_LCDFB_FBINFO_DEFAULT      (FBINFO_DEFAULT \
+diff --git a/fs/jbd/commit.c b/fs/jbd/commit.c
+index ae08c05..558088d 100644
+--- a/fs/jbd/commit.c
++++ b/fs/jbd/commit.c
+@@ -238,7 +238,7 @@ write_out_data:
+                       spin_lock(&journal->j_list_lock);
+               }
+               /* Someone already cleaned up the buffer? */
+-              if (!buffer_jbd(bh)
++              if (!buffer_jbd(bh) || bh2jh(bh) != jh
+                       || jh->b_transaction != commit_transaction
+                       || jh->b_jlist != BJ_SyncData) {
+                       jbd_unlock_bh_state(bh);
+@@ -463,7 +463,9 @@ void journal_commit_transaction(journal_t *journal)
+                       spin_lock(&journal->j_list_lock);
+                       continue;
+               }
+-              if (buffer_jbd(bh) && jh->b_jlist == BJ_Locked) {
++              if (buffer_jbd(bh) && bh2jh(bh) == jh &&
++                  jh->b_transaction == commit_transaction &&
++                  jh->b_jlist == BJ_Locked) {
+                       __journal_unfile_buffer(jh);
+                       jbd_unlock_bh_state(bh);
+                       journal_remove_journal_head(bh);
+diff --git a/include/linux/firmware-map.h b/include/linux/firmware-map.h
+index 6e199c8..67e88a6 100644
+--- a/include/linux/firmware-map.h
++++ b/include/linux/firmware-map.h
+@@ -24,21 +24,17 @@
+  */
+ #ifdef CONFIG_FIRMWARE_MEMMAP
+-int firmware_map_add(resource_size_t start, resource_size_t end,
+-                   const char *type);
+-int firmware_map_add_early(resource_size_t start, resource_size_t end,
+-                         const char *type);
++int firmware_map_add(u64 start, u64 end, const char *type);
++int firmware_map_add_early(u64 start, u64 end, const char *type);
+ #else /* CONFIG_FIRMWARE_MEMMAP */
+-static inline int firmware_map_add(resource_size_t start, resource_size_t end,
+-                                 const char *type)
++static inline int firmware_map_add(u64 start, u64 end, const char *type)
+ {
+       return 0;
+ }
+-static inline int firmware_map_add_early(resource_size_t start,
+-                                       resource_size_t end, const char *type)
++static inline int firmware_map_add_early(u64 start, u64 end, const char *type)
+ {
+       return 0;
+ }
+diff --git a/include/linux/mlx4/qp.h b/include/linux/mlx4/qp.h
+index bf8f119..9f29d86 100644
+--- a/include/linux/mlx4/qp.h
++++ b/include/linux/mlx4/qp.h
+@@ -165,6 +165,7 @@ enum {
+       MLX4_WQE_CTRL_IP_CSUM           = 1 << 4,
+       MLX4_WQE_CTRL_TCP_UDP_CSUM      = 1 << 5,
+       MLX4_WQE_CTRL_INS_VLAN          = 1 << 6,
++      MLX4_WQE_CTRL_STRONG_ORDER      = 1 << 7,
+ };
+ struct mlx4_wqe_ctrl_seg {
+diff --git a/kernel/acct.c b/kernel/acct.c
+index a272f53..2dac228 100644
+--- a/kernel/acct.c
++++ b/kernel/acct.c
+@@ -215,6 +215,7 @@ static void acct_file_reopen(struct bsd_acct_struct *acct, struct file *file,
+ static int acct_on(char *name)
+ {
+       struct file *file;
++      struct vfsmount *mnt;
+       int error;
+       struct pid_namespace *ns;
+       struct bsd_acct_struct *acct = NULL;
+@@ -256,11 +257,12 @@ static int acct_on(char *name)
+               acct = NULL;
+       }
+-      mnt_pin(file->f_path.mnt);
++      mnt = file->f_path.mnt;
++      mnt_pin(mnt);
+       acct_file_reopen(ns->bacct, file, ns);
+       spin_unlock(&acct_lock);
+-      mntput(file->f_path.mnt); /* it's pinned, now give up active reference */
++      mntput(mnt); /* it's pinned, now give up active reference */
+       kfree(acct);
+       return 0;
+diff --git a/lib/Kconfig.debug b/lib/Kconfig.debug
+index 0b50481..d3dce7c 100644
+--- a/lib/Kconfig.debug
++++ b/lib/Kconfig.debug
+@@ -394,7 +394,7 @@ config LOCKDEP
+       bool
+       depends on DEBUG_KERNEL && TRACE_IRQFLAGS_SUPPORT && STACKTRACE_SUPPORT && LOCKDEP_SUPPORT
+       select STACKTRACE
+-      select FRAME_POINTER if !X86 && !MIPS && !PPC
++      select FRAME_POINTER if !MIPS && !PPC
+       select KALLSYMS
+       select KALLSYMS_ALL
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 4205f7f..85799e8 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -2764,7 +2764,7 @@ bad:
+               if (dzone == zone)
+                       break;
+               kfree(zone_pcp(dzone, cpu));
+-              zone_pcp(dzone, cpu) = NULL;
++              zone_pcp(dzone, cpu) = &boot_pageset[cpu];
+       }
+       return -ENOMEM;
+ }
+@@ -2779,7 +2779,7 @@ static inline void free_zone_pagesets(int cpu)
+               /* Free per_cpu_pageset if it is slab allocated */
+               if (pset != &boot_pageset[cpu])
+                       kfree(pset);
+-              zone_pcp(zone, cpu) = NULL;
++              zone_pcp(zone, cpu) = &boot_pageset[cpu];
+       }
+ }
+@@ -4409,6 +4409,8 @@ int percpu_pagelist_fraction_sysctl_handler(ctl_table *table, int write,
+       if (!write || (ret == -EINVAL))
+               return ret;
+       for_each_zone(zone) {
++              if (!populated_zone(zone))
++                      continue;
+               for_each_online_cpu(cpu) {
+                       unsigned long  high;
+                       high = zone->present_pages / percpu_pagelist_fraction;
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index 011478e..0b3c404 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -1364,6 +1364,10 @@ struct sock *tcp_v4_syn_recv_sock(struct sock *sk, struct sk_buff *skb,
+       tcp_mtup_init(newsk);
+       tcp_sync_mss(newsk, dst_mtu(dst));
+       newtp->advmss = dst_metric(dst, RTAX_ADVMSS);
++      if (tcp_sk(sk)->rx_opt.user_mss &&
++          tcp_sk(sk)->rx_opt.user_mss < newtp->advmss)
++              newtp->advmss = tcp_sk(sk)->rx_opt.user_mss;
++
+       tcp_initialize_rcv_mss(newsk);
+ #ifdef CONFIG_TCP_MD5SIG
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index d083f9a..c89cd75 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -2252,6 +2252,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
+       struct sk_buff *skb;
+       struct tcp_md5sig_key *md5;
+       __u8 *md5_hash_location;
++      int mss;
+       skb = sock_wmalloc(sk, MAX_TCP_HEADER + 15, 1, GFP_ATOMIC);
+       if (skb == NULL)
+@@ -2262,13 +2263,17 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
+       skb->dst = dst_clone(dst);
++      mss = dst_metric(dst, RTAX_ADVMSS);
++      if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < mss)
++              mss = tp->rx_opt.user_mss;
++
+       if (req->rcv_wnd == 0) { /* ignored for retransmitted syns */
+               __u8 rcv_wscale;
+               /* Set this up on the first call only */
+               req->window_clamp = tp->window_clamp ? : dst_metric(dst, RTAX_WINDOW);
+               /* tcp_full_space because it is guaranteed to be the first packet */
+               tcp_select_initial_window(tcp_full_space(sk),
+-                      dst_metric(dst, RTAX_ADVMSS) - (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
++                      mss - (ireq->tstamp_ok ? TCPOLEN_TSTAMP_ALIGNED : 0),
+                       &req->rcv_wnd,
+                       &req->window_clamp,
+                       ireq->wscale_ok,
+@@ -2283,8 +2288,7 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
+       else
+ #endif
+       TCP_SKB_CB(skb)->when = tcp_time_stamp;
+-      tcp_header_size = tcp_synack_options(sk, req,
+-                                           dst_metric(dst, RTAX_ADVMSS),
++      tcp_header_size = tcp_synack_options(sk, req, mss,
+                                            skb, &opts, &md5) +
+                         sizeof(struct tcphdr);
+@@ -2353,6 +2357,9 @@ static void tcp_connect_init(struct sock *sk)
+       if (!tp->window_clamp)
+               tp->window_clamp = dst_metric(dst, RTAX_WINDOW);
+       tp->advmss = dst_metric(dst, RTAX_ADVMSS);
++      if (tp->rx_opt.user_mss && tp->rx_opt.user_mss < tp->advmss)
++              tp->advmss = tp->rx_opt.user_mss;
++
+       tcp_initialize_rcv_mss(sk);
+       tcp_select_initial_window(tcp_full_space(sk),
+diff --git a/scripts/unifdef.c b/scripts/unifdef.c
+index 552025e..05a31a6 100644
+--- a/scripts/unifdef.c
++++ b/scripts/unifdef.c
+@@ -206,7 +206,7 @@ static void             done(void);
+ static void             error(const char *);
+ static int              findsym(const char *);
+ static void             flushline(bool);
+-static Linetype         getline(void);
++static Linetype         get_line(void);
+ static Linetype         ifeval(const char **);
+ static void             ignoreoff(void);
+ static void             ignoreon(void);
+@@ -512,7 +512,7 @@ process(void)
+       for (;;) {
+               linenum++;
+-              lineval = getline();
++              lineval = get_line();
+               trans_table[ifstate[depth]][lineval]();
+               debug("process %s -> %s depth %d",
+                   linetype_name[lineval],
+@@ -526,7 +526,7 @@ process(void)
+  * help from skipcomment().
+  */
+ static Linetype
+-getline(void)
++get_line(void)
+ {
+       const char *cp;
+       int cursym;
+diff --git a/sound/core/seq/seq_midi_event.c b/sound/core/seq/seq_midi_event.c
+index 8284f17..b5d6ea4 100644
+--- a/sound/core/seq/seq_midi_event.c
++++ b/sound/core/seq/seq_midi_event.c
+@@ -504,10 +504,10 @@ static int extra_decode_xrpn(struct snd_midi_event *dev, unsigned char *buf,
+       if (dev->nostat && count < 12)
+               return -ENOMEM;
+       cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f);
+-      bytes[0] = ev->data.control.param & 0x007f;
+-      bytes[1] = (ev->data.control.param & 0x3f80) >> 7;
+-      bytes[2] = ev->data.control.value & 0x007f;
+-      bytes[3] = (ev->data.control.value & 0x3f80) >> 7;
++      bytes[0] = (ev->data.control.param & 0x3f80) >> 7;
++      bytes[1] = ev->data.control.param & 0x007f;
++      bytes[2] = (ev->data.control.value & 0x3f80) >> 7;
++      bytes[3] = ev->data.control.value & 0x007f;
+       if (cmd != dev->lastcmd && !dev->nostat) {
+               if (count < 9)
+                       return -ENOMEM;
+diff --git a/sound/pci/ca0106/ca0106_mixer.c b/sound/pci/ca0106/ca0106_mixer.c
+index 3025ed1..c0f4718 100644
+--- a/sound/pci/ca0106/ca0106_mixer.c
++++ b/sound/pci/ca0106/ca0106_mixer.c
+@@ -761,6 +761,9 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
+                                             snd_ca0106_master_db_scale);
+       if (!vmaster)
+               return -ENOMEM;
++      err = snd_ctl_add(card, vmaster);
++      if (err < 0)
++              return err;
+       add_slaves(card, vmaster, slave_vols);
+       if (emu->details->spi_dac == 1) {
+@@ -768,6 +771,9 @@ int __devinit snd_ca0106_mixer(struct snd_ca0106 *emu)
+                                                     NULL);
+               if (!vmaster)
+                       return -ENOMEM;
++              err = snd_ctl_add(card, vmaster);
++              if (err < 0)
++                      return err;
+               add_slaves(card, vmaster, slave_sws);
+       }
+         return 0;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.26-27 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.26-27
new file mode 100644 (file)
index 0000000..154d348
--- /dev/null
@@ -0,0 +1,476 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.27
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 90764ee..387a5fd 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .26
++EXTRAVERSION = .27
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+@@ -340,7 +340,8 @@ KBUILD_CPPFLAGS := -D__KERNEL__ $(LINUXINCLUDE)
+ KBUILD_CFLAGS   := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
+                  -fno-strict-aliasing -fno-common \
+-                 -Werror-implicit-function-declaration
++                 -Werror-implicit-function-declaration \
++                 -fno-delete-null-pointer-checks
+ KBUILD_AFLAGS   := -D__ASSEMBLY__
+ # Read KERNELRELEASE from include/config/kernel.release (if it exists)
+@@ -556,7 +557,7 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
+ KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
+ # disable invalid "can't wrap" optimzations for signed / pointers
+-KBUILD_CFLAGS += $(call cc-option,-fwrapv)
++KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
+ # Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
+ # But warn user when we do so
+diff --git a/drivers/block/floppy.c b/drivers/block/floppy.c
+index 615fcd3..5900f76 100644
+--- a/drivers/block/floppy.c
++++ b/drivers/block/floppy.c
+@@ -3320,7 +3320,10 @@ static inline int set_geometry(unsigned int cmd, struct floppy_struct *g,
+               if (!capable(CAP_SYS_ADMIN))
+                       return -EPERM;
+               mutex_lock(&open_lock);
+-              LOCK_FDC(drive, 1);
++              if (lock_fdc(drive, 1)) {
++                      mutex_unlock(&open_lock);
++                      return -EINTR;
++              }
+               floppy_type[type] = *g;
+               floppy_type[type].name = "user format";
+               for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
+diff --git a/drivers/md/dm.c b/drivers/md/dm.c
+index 925efaf..ace998c 100644
+--- a/drivers/md/dm.c
++++ b/drivers/md/dm.c
+@@ -265,10 +265,6 @@ static int dm_blk_open(struct inode *inode, struct file *file)
+               goto out;
+       }
+-      if (test_bit(DMF_FREEING, &md->flags) ||
+-          test_bit(DMF_DELETING, &md->flags))
+-              return NULL;
+-
+       dm_get(md);
+       atomic_inc(&md->open_count);
+diff --git a/drivers/net/tulip/interrupt.c b/drivers/net/tulip/interrupt.c
+index c6bad98..7faf84f 100644
+--- a/drivers/net/tulip/interrupt.c
++++ b/drivers/net/tulip/interrupt.c
+@@ -140,6 +140,7 @@ int tulip_poll(struct napi_struct *napi, int budget)
+                /* If we own the next entry, it is a new packet. Send it up. */
+                while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
+                        s32 status = le32_to_cpu(tp->rx_ring[entry].status);
++                     short pkt_len;
+                        if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx)
+                                break;
+@@ -151,8 +152,28 @@ int tulip_poll(struct napi_struct *napi, int budget)
+                      if (++work_done >= budget)
+                                goto not_done;
+-                       if ((status & 0x38008300) != 0x0300) {
+-                               if ((status & 0x38000300) != 0x0300) {
++                     /*
++                      * Omit the four octet CRC from the length.
++                      * (May not be considered valid until we have
++                      * checked status for RxLengthOver2047 bits)
++                      */
++                     pkt_len = ((status >> 16) & 0x7ff) - 4;
++
++                     /*
++                      * Maximum pkt_len is 1518 (1514 + vlan header)
++                      * Anything higher than this is always invalid
++                      * regardless of RxLengthOver2047 bits
++                      */
++
++                     if ((status & (RxLengthOver2047 |
++                                    RxDescCRCError |
++                                    RxDescCollisionSeen |
++                                    RxDescRunt |
++                                    RxDescDescErr |
++                                    RxWholePkt)) != RxWholePkt
++                         || pkt_len > 1518) {
++                             if ((status & (RxLengthOver2047 |
++                                            RxWholePkt)) != RxWholePkt) {
+                                 /* Ingore earlier buffers. */
+                                        if ((status & 0xffff) != 0x7fff) {
+                                                if (tulip_debug > 1)
+@@ -161,30 +182,23 @@ int tulip_poll(struct napi_struct *napi, int budget)
+                                                               dev->name, status);
+                                                tp->stats.rx_length_errors++;
+                                        }
+-                               } else if (status & RxDescFatalErr) {
++                             } else {
+                                 /* There was a fatal error. */
+                                        if (tulip_debug > 2)
+                                                printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
+                                                       dev->name, status);
+                                        tp->stats.rx_errors++; /* end of a packet.*/
+-                                       if (status & 0x0890) tp->stats.rx_length_errors++;
++                                     if (pkt_len > 1518 ||
++                                         (status & RxDescRunt))
++                                             tp->stats.rx_length_errors++;
++
+                                        if (status & 0x0004) tp->stats.rx_frame_errors++;
+                                        if (status & 0x0002) tp->stats.rx_crc_errors++;
+                                        if (status & 0x0001) tp->stats.rx_fifo_errors++;
+                                }
+                        } else {
+-                               /* Omit the four octet CRC from the length. */
+-                               short pkt_len = ((status >> 16) & 0x7ff) - 4;
+                                struct sk_buff *skb;
+-#ifndef final_version
+-                               if (pkt_len > 1518) {
+-                                       printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n",
+-                                              dev->name, pkt_len, pkt_len);
+-                                       pkt_len = 1518;
+-                                       tp->stats.rx_length_errors++;
+-                               }
+-#endif
+                                /* Check if the packet is long enough to accept without copying
+                                   to a minimally-sized skbuff. */
+                                if (pkt_len < tulip_rx_copybreak
+@@ -357,14 +371,35 @@ static int tulip_rx(struct net_device *dev)
+       /* If we own the next entry, it is a new packet. Send it up. */
+       while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
+               s32 status = le32_to_cpu(tp->rx_ring[entry].status);
++              short pkt_len;
+               if (tulip_debug > 5)
+                       printk(KERN_DEBUG "%s: In tulip_rx(), entry %d %8.8x.\n",
+                                  dev->name, entry, status);
+               if (--rx_work_limit < 0)
+                       break;
+-              if ((status & 0x38008300) != 0x0300) {
+-                      if ((status & 0x38000300) != 0x0300) {
++
++              /*
++                Omit the four octet CRC from the length.
++                (May not be considered valid until we have
++                checked status for RxLengthOver2047 bits)
++              */
++              pkt_len = ((status >> 16) & 0x7ff) - 4;
++              /*
++                Maximum pkt_len is 1518 (1514 + vlan header)
++                Anything higher than this is always invalid
++                regardless of RxLengthOver2047 bits
++              */
++
++              if ((status & (RxLengthOver2047 |
++                             RxDescCRCError |
++                             RxDescCollisionSeen |
++                             RxDescRunt |
++                             RxDescDescErr |
++                             RxWholePkt))        != RxWholePkt
++                   || pkt_len > 1518) {
++                      if ((status & (RxLengthOver2047 |
++                           RxWholePkt))         != RxWholePkt) {
+                               /* Ingore earlier buffers. */
+                               if ((status & 0xffff) != 0x7fff) {
+                                       if (tulip_debug > 1)
+@@ -373,31 +408,22 @@ static int tulip_rx(struct net_device *dev)
+                                                          dev->name, status);
+                                       tp->stats.rx_length_errors++;
+                               }
+-                      } else if (status & RxDescFatalErr) {
++                      } else {
+                               /* There was a fatal error. */
+                               if (tulip_debug > 2)
+                                       printk(KERN_DEBUG "%s: Receive error, Rx status %8.8x.\n",
+                                                  dev->name, status);
+                               tp->stats.rx_errors++; /* end of a packet.*/
+-                              if (status & 0x0890) tp->stats.rx_length_errors++;
++                              if (pkt_len > 1518 ||
++                                  (status & RxDescRunt))
++                                      tp->stats.rx_length_errors++;
+                               if (status & 0x0004) tp->stats.rx_frame_errors++;
+                               if (status & 0x0002) tp->stats.rx_crc_errors++;
+                               if (status & 0x0001) tp->stats.rx_fifo_errors++;
+                       }
+               } else {
+-                      /* Omit the four octet CRC from the length. */
+-                      short pkt_len = ((status >> 16) & 0x7ff) - 4;
+                       struct sk_buff *skb;
+-#ifndef final_version
+-                      if (pkt_len > 1518) {
+-                              printk(KERN_WARNING "%s: Bogus packet size of %d (%#x).\n",
+-                                         dev->name, pkt_len, pkt_len);
+-                              pkt_len = 1518;
+-                              tp->stats.rx_length_errors++;
+-                      }
+-#endif
+-
+                       /* Check if the packet is long enough to accept without copying
+                          to a minimally-sized skbuff. */
+                       if (pkt_len < tulip_rx_copybreak
+diff --git a/drivers/net/tulip/tulip.h b/drivers/net/tulip/tulip.h
+index 19abbc3..0afa2d4 100644
+--- a/drivers/net/tulip/tulip.h
++++ b/drivers/net/tulip/tulip.h
+@@ -201,8 +201,38 @@ enum desc_status_bits {
+       DescStartPkt = 0x20000000,
+       DescEndRing  = 0x02000000,
+       DescUseLink  = 0x01000000,
+-      RxDescFatalErr = 0x008000,
++
++      /*
++       * Error summary flag is logical or of 'CRC Error', 'Collision Seen',
++       * 'Frame Too Long', 'Runt' and 'Descriptor Error' flags generated
++       * within tulip chip.
++       */
++      RxDescErrorSummary = 0x8000,
++      RxDescCRCError = 0x0002,
++      RxDescCollisionSeen = 0x0040,
++
++      /*
++       * 'Frame Too Long' flag is set if packet length including CRC exceeds
++       * 1518.  However, a full sized VLAN tagged frame is 1522 bytes
++       * including CRC.
++       *
++       * The tulip chip does not block oversized frames, and if this flag is
++       * set on a receive descriptor it does not indicate the frame has been
++       * truncated.  The receive descriptor also includes the actual length.
++       * Therefore we can safety ignore this flag and check the length
++       * ourselves.
++       */
++      RxDescFrameTooLong = 0x0080,
++      RxDescRunt = 0x0800,
++      RxDescDescErr = 0x4000,
+       RxWholePkt   = 0x00000300,
++      /*
++       * Top three bits of 14 bit frame length (status bits 27-29) should
++       * never be set as that would make frame over 2047 bytes. The Receive
++       * Watchdog flag (bit 4) may indicate the length is over 2048 and the
++       * length field is invalid.
++       */
++      RxLengthOver2047 = 0x38000010
+ };
+diff --git a/drivers/pci/iova.c b/drivers/pci/iova.c
+index 3ef4ac0..078bf8b 100644
+--- a/drivers/pci/iova.c
++++ b/drivers/pci/iova.c
+@@ -1,9 +1,19 @@
+ /*
+- * Copyright (c) 2006, Intel Corporation.
++ * Copyright © 2006-2009, Intel Corporation.
+  *
+- * This file is released under the GPLv2.
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms and conditions of the GNU General Public License,
++ * version 2, as published by the Free Software Foundation.
++ *
++ * This program is distributed in the hope it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
++ * Place - Suite 330, Boston, MA 02111-1307 USA.
+  *
+- * Copyright (C) 2006-2008 Intel Corporation
+  * Author: Anil S Keshavamurthy <anil.s.keshavamurthy@intel.com>
+  */
+@@ -123,7 +133,15 @@ move_left:
+       /* Insert the new_iova into domain rbtree by holding writer lock */
+       /* Add new node and rebalance tree. */
+       {
+-              struct rb_node **entry = &((prev)), *parent = NULL;
++              struct rb_node **entry, *parent = NULL;
++
++              /* If we have 'prev', it's a valid place to start the
++                 insertion. Otherwise, start from the root. */
++              if (prev)
++                      entry = &prev;
++              else
++                      entry = &iovad->rbroot.rb_node;
++
+               /* Figure out where to put new node */
+               while (*entry) {
+                       struct iova *this = container_of(*entry,
+diff --git a/include/linux/mm.h b/include/linux/mm.h
+index ae9775d..eeb7e56 100644
+--- a/include/linux/mm.h
++++ b/include/linux/mm.h
+@@ -572,12 +572,10 @@ static inline void set_page_links(struct page *page, enum zone_type zone,
+  */
+ static inline unsigned long round_hint_to_min(unsigned long hint)
+ {
+-#ifdef CONFIG_SECURITY
+       hint &= PAGE_MASK;
+       if (((void *)hint != NULL) &&
+           (hint < mmap_min_addr))
+               return PAGE_ALIGN(mmap_min_addr);
+-#endif
+       return hint;
+ }
+diff --git a/include/linux/personality.h b/include/linux/personality.h
+index a84e9ff..1261208 100644
+--- a/include/linux/personality.h
++++ b/include/linux/personality.h
+@@ -40,7 +40,10 @@ enum {
+  * Security-relevant compatibility flags that must be
+  * cleared upon setuid or setgid exec:
+  */
+-#define PER_CLEAR_ON_SETID (READ_IMPLIES_EXEC|ADDR_NO_RANDOMIZE)
++#define PER_CLEAR_ON_SETID (READ_IMPLIES_EXEC  | \
++                          ADDR_NO_RANDOMIZE  | \
++                          ADDR_COMPAT_LAYOUT | \
++                          MMAP_PAGE_ZERO)
+ /*
+  * Personality types.
+diff --git a/include/linux/security.h b/include/linux/security.h
+index 80c4d00..1638afd 100644
+--- a/include/linux/security.h
++++ b/include/linux/security.h
+@@ -2134,6 +2134,8 @@ static inline int security_file_mmap(struct file *file, unsigned long reqprot,
+                                    unsigned long addr,
+                                    unsigned long addr_only)
+ {
++      if ((addr < mmap_min_addr) && !capable(CAP_SYS_RAWIO))
++              return -EACCES;
+       return 0;
+ }
+diff --git a/kernel/resource.c b/kernel/resource.c
+index 03d796c..87f675a 100644
+--- a/kernel/resource.c
++++ b/kernel/resource.c
+@@ -741,7 +741,7 @@ static int __init reserve_setup(char *str)
+       static struct resource reserve[MAXRESERVE];
+       for (;;) {
+-              int io_start, io_num;
++              unsigned int io_start, io_num;
+               int x = reserved;
+               if (get_option (&str, &io_start) != 2)
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 6816e6d..1228d65 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -1132,7 +1132,6 @@ static struct ctl_table vm_table[] = {
+               .strategy       = &sysctl_jiffies,
+       },
+ #endif
+-#ifdef CONFIG_SECURITY
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+               .procname       = "mmap_min_addr",
+@@ -1141,7 +1140,6 @@ static struct ctl_table vm_table[] = {
+               .mode           = 0644,
+               .proc_handler   = &proc_doulongvec_minmax,
+       },
+-#endif
+ #ifdef CONFIG_NUMA
+       {
+               .ctl_name       = CTL_UNNUMBERED,
+diff --git a/mm/Kconfig b/mm/Kconfig
+index 0bd9c2d..07b4ec4 100644
+--- a/mm/Kconfig
++++ b/mm/Kconfig
+@@ -208,3 +208,21 @@ config VIRT_TO_BUS
+ config MMU_NOTIFIER
+       bool
++
++config DEFAULT_MMAP_MIN_ADDR
++        int "Low address space to protect from user allocation"
++        default 4096
++        help
++        This is the portion of low virtual memory which should be protected
++        from userspace allocation.  Keeping a user from writing to low pages
++        can help reduce the impact of kernel NULL pointer bugs.
++
++        For most ia64, ppc64 and x86 users with lots of address space
++        a value of 65536 is reasonable and should cause no problems.
++        On arm and other archs it should not be higher than 32768.
++        Programs which use vm86 functionality would either need additional
++        permissions from either the LSM or the capabilities module or have
++        this protection disabled.
++
++        This value can be changed after boot using the
++        /proc/sys/vm/mmap_min_addr tunable.
+diff --git a/mm/mmap.c b/mm/mmap.c
+index 2ae093e..d330758 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -86,6 +86,9 @@ int sysctl_overcommit_ratio = 50;    /* default is 50% */
+ int sysctl_max_map_count __read_mostly = DEFAULT_MAX_MAP_COUNT;
+ atomic_long_t vm_committed_space = ATOMIC_LONG_INIT(0);
++/* amount of vm to protect from userspace access */
++unsigned long mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR;
++
+ /*
+  * Check that a process has enough memory to allocate a new virtual
+  * mapping. 0 means there is enough memory for the allocation to
+diff --git a/security/Kconfig b/security/Kconfig
+index 5592939..38411dd 100644
+--- a/security/Kconfig
++++ b/security/Kconfig
+@@ -92,28 +92,8 @@ config SECURITY_ROOTPLUG
+         See <http://www.linuxjournal.com/article.php?sid=6279> for
+         more information about this module.
+-        
+-        If you are unsure how to answer this question, answer N.
+-
+-config SECURITY_DEFAULT_MMAP_MIN_ADDR
+-        int "Low address space to protect from user allocation"
+-        depends on SECURITY
+-        default 0
+-        help
+-        This is the portion of low virtual memory which should be protected
+-        from userspace allocation.  Keeping a user from writing to low pages
+-        can help reduce the impact of kernel NULL pointer bugs.
+-
+-        For most ia64, ppc64 and x86 users with lots of address space
+-        a value of 65536 is reasonable and should cause no problems.
+-        On arm and other archs it should not be higher than 32768.
+-        Programs which use vm86 functionality would either need additional
+-        permissions from either the LSM or the capabilities module or have
+-        this protection disabled.
+-
+-        This value can be changed after boot using the
+-        /proc/sys/vm/mmap_min_addr tunable.
++        If you are unsure how to answer this question, answer N.
+ source security/selinux/Kconfig
+ source security/smack/Kconfig
+diff --git a/security/security.c b/security/security.c
+index 3a4b4f5..27a315d 100644
+--- a/security/security.c
++++ b/security/security.c
+@@ -26,9 +26,6 @@ extern void security_fixup_ops(struct security_operations *ops);
+ struct security_operations *security_ops;     /* Initialized to NULL */
+-/* amount of vm to protect from userspace access */
+-unsigned long mmap_min_addr = CONFIG_SECURITY_DEFAULT_MMAP_MIN_ADDR;
+-
+ static inline int verify(struct security_operations *ops)
+ {
+       /* verify the security_operations structure exists */
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.27-28 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.27-28
new file mode 100644 (file)
index 0000000..cc6ec12
--- /dev/null
@@ -0,0 +1,33 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.28
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 387a5fd..7598325 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .27
++EXTRAVERSION = .28
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/video/fbmon.c b/drivers/video/fbmon.c
+index 6a0aa18..839b0bf 100644
+--- a/drivers/video/fbmon.c
++++ b/drivers/video/fbmon.c
+@@ -256,8 +256,8 @@ static void fix_edid(unsigned char *edid, int fix)
+ static int edid_checksum(unsigned char *edid)
+ {
+-      unsigned char i, csum = 0, all_null = 0;
+-      int err = 0, fix = check_edid(edid);
++      unsigned char csum = 0, all_null = 0;
++      int i, err = 0, fix = check_edid(edid);
+       if (fix)
+               fix_edid(edid, fix);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.28-29 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.28-29
new file mode 100644 (file)
index 0000000..5fd3f6c
--- /dev/null
@@ -0,0 +1,1630 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.29
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 7598325..47d46f4 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .28
++EXTRAVERSION = .29
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/mm/gup.c b/arch/x86/mm/gup.c
+index 007bb06..73e6ce1 100644
+--- a/arch/x86/mm/gup.c
++++ b/arch/x86/mm/gup.c
+@@ -231,10 +231,15 @@ int get_user_pages_fast(unsigned long start, int nr_pages, int write,
+       start &= PAGE_MASK;
+       addr = start;
+       len = (unsigned long) nr_pages << PAGE_SHIFT;
++
+       end = start + len;
+-      if (unlikely(!access_ok(write ? VERIFY_WRITE : VERIFY_READ,
+-                                      start, len)))
++      if (end < start)
++              goto slow_irqon;
++
++#ifdef CONFIG_X86_64
++      if (end >> 47)
+               goto slow_irqon;
++#endif
+       /*
+        * XXX: batch / limit 'nr', to avoid large irq off latency
+diff --git a/arch/x86/mm/srat_64.c b/arch/x86/mm/srat_64.c
+index 1b4763e..e353618 100644
+--- a/arch/x86/mm/srat_64.c
++++ b/arch/x86/mm/srat_64.c
+@@ -87,8 +87,10 @@ static __init void bad_srat(void)
+       found_add_area = 0;
+       for (i = 0; i < MAX_LOCAL_APIC; i++)
+               apicid_to_node[i] = NUMA_NO_NODE;
+-      for (i = 0; i < MAX_NUMNODES; i++)
+-              nodes_add[i].start = nodes[i].end = 0;
++      for (i = 0; i < MAX_NUMNODES; i++) {
++              nodes[i].start = nodes[i].end = 0;
++              nodes_add[i].start = nodes_add[i].end = 0;
++      }
+       remove_all_active_ranges();
+ }
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index e618cbe..e6b3c7e 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -1013,7 +1013,8 @@ int __init acpi_ec_ecdt_probe(void)
+        * which needs it, has fake EC._INI method, so use it as flag.
+        * Keep boot_ec struct as it will be needed soon.
+        */
+-      if (ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &dummy)))
++      if (!dmi_name_in_vendors("ASUS") ||
++          ACPI_FAILURE(acpi_get_handle(boot_ec->handle, "_INI", &dummy)))
+               return -ENODEV;
+ install:
+       if (!ec_install_handlers(boot_ec)) {
+diff --git a/drivers/hid/usbhid/hiddev.c b/drivers/hid/usbhid/hiddev.c
+index 842e9ed..993772c 100644
+--- a/drivers/hid/usbhid/hiddev.c
++++ b/drivers/hid/usbhid/hiddev.c
+@@ -484,8 +484,10 @@ static noinline int hiddev_ioctl_usage(struct hiddev *hiddev, unsigned int cmd,
+                       goto goodreturn;
+               case HIDIOCGCOLLECTIONINDEX:
++                      i = field->usage[uref->usage_index].collection_index;
++                      unlock_kernel();
+                       kfree(uref_multi);
+-                      return field->usage[uref->usage_index].collection_index;
++                      return i;
+               case HIDIOCGUSAGES:
+                       for (i = 0; i < uref_multi->num_values; i++)
+                               uref_multi->values[i] =
+diff --git a/drivers/hwmon/max6650.c b/drivers/hwmon/max6650.c
+index f27af6a..65cf25f 100644
+--- a/drivers/hwmon/max6650.c
++++ b/drivers/hwmon/max6650.c
+@@ -407,6 +407,7 @@ static ssize_t set_div(struct device *dev, struct device_attribute *devattr,
+               data->count = 3;
+               break;
+       default:
++              mutex_unlock(&data->update_lock);
+               dev_err(&client->dev,
+                       "illegal value for fan divider (%d)\n", div);
+               return -EINVAL;
+diff --git a/drivers/input/misc/wistron_btns.c b/drivers/input/misc/wistron_btns.c
+index fe268be..2dacc3e 100644
+--- a/drivers/input/misc/wistron_btns.c
++++ b/drivers/input/misc/wistron_btns.c
+@@ -627,6 +627,15 @@ static struct dmi_system_id dmi_ids[] __initdata = {
+       },
+       {
+               .callback = dmi_matched,
++              .ident = "Maxdata Pro 7000 DX",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "MAXDATA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Pro 7000"),
++              },
++              .driver_data = keymap_fs_amilo_pro_v2000
++      },
++      {
++              .callback = dmi_matched,
+               .ident = "Fujitsu N3510",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "FUJITSU"),
+diff --git a/drivers/isdn/gigaset/ev-layer.c b/drivers/isdn/gigaset/ev-layer.c
+index 5cbf64d..c712bcc 100644
+--- a/drivers/isdn/gigaset/ev-layer.c
++++ b/drivers/isdn/gigaset/ev-layer.c
+@@ -307,32 +307,33 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */
+       {RSP_OK,      604,604, -1,                605, 5, {ACT_CMD+AT_MSN}},
+       {RSP_OK,      605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},
+       {RSP_NULL,    605,605, -1,                606, 5, {ACT_CMD+AT_ISO}},
+-      {RSP_OK,      606,606, -1,                607, 5, {0},             "+VLS=17\r"}, /* set "Endgeraetemodus" */
++      {RSP_OK,      606,606, -1,                607, 5, {0}, "+VLS=17\r"},
+       {RSP_OK,      607,607, -1,                608,-1},
+-      //{RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    608, 0, {ACT_ERROR}},//DELETE
+       {RSP_ZSAU,    608,608,ZSAU_PROCEEDING,    609, 5, {ACT_CMD+AT_DIAL}},
+       {RSP_OK,      609,609, -1,                650, 0, {ACT_DIALING}},
+-      {RSP_ZVLS,    608,608, 17,                 -1,-1, {ACT_DEBUG}},
+-      {RSP_ZCTP,    609,609, -1,                 -1,-1, {ACT_DEBUG}},
+-      {RSP_ZCPN,    609,609, -1,                 -1,-1, {ACT_DEBUG}},
+       {RSP_ERROR,   601,609, -1,                  0, 0, {ACT_ABORTDIAL}},
+       {EV_TIMEOUT,  601,609, -1,                  0, 0, {ACT_ABORTDIAL}},
+-      /* dialing */
+-      {RSP_ZCTP,    650,650, -1,                 -1,-1, {ACT_DEBUG}},
+-      {RSP_ZCPN,    650,650, -1,                 -1,-1, {ACT_DEBUG}},
+-      {RSP_ZSAU,    650,650,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}}, /* some devices don't send this */
+-
+-      /* connection established  */
+-      {RSP_ZSAU,    650,650,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
+-      {RSP_ZSAU,    750,750,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}}, //FIXME -> DLE1
+-
+-      {EV_BC_OPEN,  800,800, -1,                800,-1, {ACT_NOTIFY_BC_UP}}, //FIXME new constate + timeout
++      /* optional dialing responses */
++      {EV_BC_OPEN,  650,650, -1,                651,-1},
++      {RSP_ZVLS,    608,651, 17,                 -1,-1, {ACT_DEBUG}},
++      {RSP_ZCTP,    609,651, -1,                 -1,-1, {ACT_DEBUG}},
++      {RSP_ZCPN,    609,651, -1,                 -1,-1, {ACT_DEBUG}},
++      {RSP_ZSAU,    650,651,ZSAU_CALL_DELIVERED, -1,-1, {ACT_DEBUG}},
++
++      /* connect */
++      {RSP_ZSAU,    650,650,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}},
++      {RSP_ZSAU,    651,651,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT,
++                                                         ACT_NOTIFY_BC_UP}},
++      {RSP_ZSAU,    750,750,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT}},
++      {RSP_ZSAU,    751,751,ZSAU_ACTIVE,        800,-1, {ACT_CONNECT,
++                                                         ACT_NOTIFY_BC_UP}},
++      {EV_BC_OPEN,  800,800, -1,                800,-1, {ACT_NOTIFY_BC_UP}},
+       /* remote hangup */
+-      {RSP_ZSAU,    650,650,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEREJECT}},
+-      {RSP_ZSAU,    750,750,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},
++      {RSP_ZSAU,    650,651,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEREJECT}},
++      {RSP_ZSAU,    750,751,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},
+       {RSP_ZSAU,    800,800,ZSAU_DISCONNECT_IND,  0, 0, {ACT_REMOTEHUP}},
+       /* hangup */
+@@ -371,7 +372,8 @@ struct reply_t gigaset_tab_cid_m10x[] = /* for M10x */
+       {RSP_ZSAU,    700,729,ZSAU_ACTIVE,          0, 0, {ACT_ABORTACCEPT}},
+       {RSP_ZSAU,    700,729,ZSAU_DISCONNECT_IND,  0, 0, {ACT_ABORTACCEPT}},
+-      {EV_TIMEOUT,  750,750, -1,                  0, 0, {ACT_CONNTIMEOUT}},
++      {EV_BC_OPEN,  750,750, -1,                751,-1},
++      {EV_TIMEOUT,  750,751, -1,                  0, 0, {ACT_CONNTIMEOUT}},
+       /* B channel closed (general case) */
+       {EV_BC_CLOSED, -1, -1, -1,                 -1,-1, {ACT_NOTIFY_BC_DOWN}}, //FIXME
+@@ -914,12 +916,6 @@ static void bchannel_down(struct bc_state *bcs)
+ static void bchannel_up(struct bc_state *bcs)
+ {
+-      if (!(bcs->chstate & CHS_D_UP)) {
+-              dev_notice(bcs->cs->dev, "%s: D channel not up\n", __func__);
+-              bcs->chstate |= CHS_D_UP;
+-              gigaset_i4l_channel_cmd(bcs, ISDN_STAT_DCONN);
+-      }
+-
+       if (bcs->chstate & CHS_B_UP) {
+               dev_notice(bcs->cs->dev, "%s: B channel already up\n",
+                          __func__);
+diff --git a/drivers/md/md.c b/drivers/md/md.c
+index ebbc3bb..b60d328 100644
+--- a/drivers/md/md.c
++++ b/drivers/md/md.c
+@@ -3281,7 +3281,8 @@ suspend_lo_store(mddev_t *mddev, const char *buf, size_t len)
+       char *e;
+       unsigned long long new = simple_strtoull(buf, &e, 10);
+-      if (mddev->pers->quiesce == NULL)
++      if (mddev->pers == NULL ||
++          mddev->pers->quiesce == NULL)
+               return -EINVAL;
+       if (buf == e || (*e && *e != '\n'))
+               return -EINVAL;
+@@ -3309,7 +3310,8 @@ suspend_hi_store(mddev_t *mddev, const char *buf, size_t len)
+       char *e;
+       unsigned long long new = simple_strtoull(buf, &e, 10);
+-      if (mddev->pers->quiesce == NULL)
++      if (mddev->pers == NULL ||
++          mddev->pers->quiesce == NULL)
+               return -EINVAL;
+       if (buf == e || (*e && *e != '\n'))
+               return -EINVAL;
+diff --git a/drivers/net/e100.c b/drivers/net/e100.c
+index 5cf78d6..d991167 100644
+--- a/drivers/net/e100.c
++++ b/drivers/net/e100.c
+@@ -1840,6 +1840,9 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
+                       if (ioread8(&nic->csr->scb.status) & rus_no_res)
+                               nic->ru_running = RU_SUSPENDED;
++              pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
++                                             sizeof(struct rfd),
++                                             PCI_DMA_BIDIRECTIONAL);
+               return -ENODATA;
+       }
+diff --git a/drivers/net/hamradio/6pack.c b/drivers/net/hamradio/6pack.c
+index 0f501d2..91e4232 100644
+--- a/drivers/net/hamradio/6pack.c
++++ b/drivers/net/hamradio/6pack.c
+@@ -397,13 +397,14 @@ static DEFINE_RWLOCK(disc_data_lock);
+                                                                                 
+ static struct sixpack *sp_get(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct sixpack *sp;
+-      read_lock(&disc_data_lock);
++      read_lock_irqsave(&disc_data_lock, flags);
+       sp = tty->disc_data;
+       if (sp)
+               atomic_inc(&sp->refcnt);
+-      read_unlock(&disc_data_lock);
++      read_unlock_irqrestore(&disc_data_lock, flags);
+       return sp;
+ }
+@@ -687,12 +688,13 @@ out:
+  */
+ static void sixpack_close(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct sixpack *sp;
+-      write_lock(&disc_data_lock);
++      write_lock_irqsave(&disc_data_lock, flags);
+       sp = tty->disc_data;
+       tty->disc_data = NULL;
+-      write_unlock(&disc_data_lock);
++      write_unlock_irqrestore(&disc_data_lock, flags);
+       if (!sp)
+               return;
+diff --git a/drivers/net/hamradio/mkiss.c b/drivers/net/hamradio/mkiss.c
+index b8e25c4..2a9adcc 100644
+--- a/drivers/net/hamradio/mkiss.c
++++ b/drivers/net/hamradio/mkiss.c
+@@ -246,15 +246,16 @@ static int kiss_esc_crc(unsigned char *s, unsigned char *d, unsigned short crc,
+ /* Send one completely decapsulated AX.25 packet to the AX.25 layer. */
+ static void ax_bump(struct mkiss *ax)
+ {
++      unsigned long flags;
+       struct sk_buff *skb;
+       int count;
+-      spin_lock_bh(&ax->buflock);
++      spin_lock_irqsave(&ax->buflock, flags);
+       if (ax->rbuff[0] > 0x0f) {
+               if (ax->rbuff[0] & 0x80) {
+                       if (check_crc_16(ax->rbuff, ax->rcount) < 0) {
+                               ax->stats.rx_errors++;
+-                              spin_unlock_bh(&ax->buflock);
++                              spin_unlock_irqrestore(&ax->buflock, flags);
+                               return;
+                       }
+@@ -269,7 +270,7 @@ static void ax_bump(struct mkiss *ax)
+               } else if (ax->rbuff[0] & 0x20)  {
+                       if (check_crc_flex(ax->rbuff, ax->rcount) < 0) {
+                               ax->stats.rx_errors++;
+-                              spin_unlock_bh(&ax->buflock);
++                              spin_unlock_irqrestore(&ax->buflock, flags);
+                               return;
+                       }
+                       if (ax->crcmode != CRC_MODE_FLEX && ax->crcauto) {
+@@ -296,7 +297,7 @@ static void ax_bump(struct mkiss *ax)
+               printk(KERN_ERR "mkiss: %s: memory squeeze, dropping packet.\n",
+                      ax->dev->name);
+               ax->stats.rx_dropped++;
+-              spin_unlock_bh(&ax->buflock);
++              spin_unlock_irqrestore(&ax->buflock, flags);
+               return;
+       }
+@@ -306,11 +307,13 @@ static void ax_bump(struct mkiss *ax)
+       ax->dev->last_rx = jiffies;
+       ax->stats.rx_packets++;
+       ax->stats.rx_bytes += count;
+-      spin_unlock_bh(&ax->buflock);
++      spin_unlock_irqrestore(&ax->buflock, flags);
+ }
+ static void kiss_unesc(struct mkiss *ax, unsigned char s)
+ {
++      unsigned long flags;
++
+       switch (s) {
+       case END:
+               /* drop keeptest bit = VSV */
+@@ -337,18 +340,18 @@ static void kiss_unesc(struct mkiss *ax, unsigned char s)
+               break;
+       }
+-      spin_lock_bh(&ax->buflock);
++      spin_lock_irqsave(&ax->buflock, flags);
+       if (!test_bit(AXF_ERROR, &ax->flags)) {
+               if (ax->rcount < ax->buffsize) {
+                       ax->rbuff[ax->rcount++] = s;
+-                      spin_unlock_bh(&ax->buflock);
++                      spin_unlock_irqrestore(&ax->buflock, flags);
+                       return;
+               }
+               ax->stats.rx_over_errors++;
+               set_bit(AXF_ERROR, &ax->flags);
+       }
+-      spin_unlock_bh(&ax->buflock);
++      spin_unlock_irqrestore(&ax->buflock, flags);
+ }
+ static int ax_set_mac_address(struct net_device *dev, void *addr)
+@@ -370,6 +373,7 @@ static void ax_changedmtu(struct mkiss *ax)
+ {
+       struct net_device *dev = ax->dev;
+       unsigned char *xbuff, *rbuff, *oxbuff, *orbuff;
++      unsigned long flags;
+       int len;
+       len = dev->mtu * 2;
+@@ -395,7 +399,7 @@ static void ax_changedmtu(struct mkiss *ax)
+               return;
+       }
+-      spin_lock_bh(&ax->buflock);
++      spin_lock_irqsave(&ax->buflock, flags);
+       oxbuff    = ax->xbuff;
+       ax->xbuff = xbuff;
+@@ -426,7 +430,7 @@ static void ax_changedmtu(struct mkiss *ax)
+       ax->mtu      = dev->mtu + 73;
+       ax->buffsize = len;
+-      spin_unlock_bh(&ax->buflock);
++      spin_unlock_irqrestore(&ax->buflock, flags);
+       kfree(oxbuff);
+       kfree(orbuff);
+@@ -436,6 +440,7 @@ static void ax_changedmtu(struct mkiss *ax)
+ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
+ {
+       struct mkiss *ax = netdev_priv(dev);
++      unsigned long flags;
+       unsigned char *p;
+       int actual, count;
+@@ -452,7 +457,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
+       p = icp;
+-      spin_lock_bh(&ax->buflock);
++      spin_lock_irqsave(&ax->buflock, flags);
+       if ((*p & 0x0f) != 0) {
+               /* Configuration Command (kissparms(1).
+                * Protocol spec says: never append CRC.
+@@ -482,7 +487,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
+                               ax->crcauto = (cmd ? 0 : 1);
+                               printk(KERN_INFO "mkiss: %s: crc mode %s %d\n", ax->dev->name, (len) ? "set to" : "is", cmd);
+                       }
+-                      spin_unlock_bh(&ax->buflock);
++                      spin_unlock_irqrestore(&ax->buflock, flags);
+                       netif_start_queue(dev);
+                       return;
+@@ -515,7 +520,7 @@ static void ax_encaps(struct net_device *dev, unsigned char *icp, int len)
+                       count = kiss_esc(p, (unsigned char *)ax->xbuff, len);
+               }
+       }
+-      spin_unlock_bh(&ax->buflock);
++      spin_unlock_irqrestore(&ax->buflock, flags);
+       set_bit(TTY_DO_WRITE_WAKEUP, &ax->tty->flags);
+       actual = ax->tty->ops->write(ax->tty, ax->xbuff, count);
+@@ -711,13 +716,14 @@ static DEFINE_RWLOCK(disc_data_lock);
+ static struct mkiss *mkiss_get(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct mkiss *ax;
+-      read_lock(&disc_data_lock);
++      read_lock_irqsave(&disc_data_lock, flags);
+       ax = tty->disc_data;
+       if (ax)
+               atomic_inc(&ax->refcnt);
+-      read_unlock(&disc_data_lock);
++      read_unlock_irqrestore(&disc_data_lock, flags);
+       return ax;
+ }
+@@ -816,12 +822,13 @@ out:
+ static void mkiss_close(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct mkiss *ax;
+-      write_lock(&disc_data_lock);
++      write_lock_irqsave(&disc_data_lock, flags);
+       ax = tty->disc_data;
+       tty->disc_data = NULL;
+-      write_unlock(&disc_data_lock);
++      write_unlock_irqrestore(&disc_data_lock, flags);
+       if (!ax)
+               return;
+diff --git a/drivers/net/ppp_async.c b/drivers/net/ppp_async.c
+index 451bdb5..7dac631 100644
+--- a/drivers/net/ppp_async.c
++++ b/drivers/net/ppp_async.c
+@@ -132,13 +132,15 @@ static DEFINE_RWLOCK(disc_data_lock);
+ static struct asyncppp *ap_get(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct asyncppp *ap;
+-      read_lock(&disc_data_lock);
++      read_lock_irqsave(&disc_data_lock, flags);
+       ap = tty->disc_data;
+       if (ap != NULL)
+               atomic_inc(&ap->refcnt);
+-      read_unlock(&disc_data_lock);
++      read_unlock_irqrestore(&disc_data_lock, flags);
++
+       return ap;
+ }
+@@ -212,12 +214,13 @@ ppp_asynctty_open(struct tty_struct *tty)
+ static void
+ ppp_asynctty_close(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct asyncppp *ap;
+-      write_lock_irq(&disc_data_lock);
++      write_lock_irqsave(&disc_data_lock, flags);
+       ap = tty->disc_data;
+       tty->disc_data = NULL;
+-      write_unlock_irq(&disc_data_lock);
++      write_unlock_irqrestore(&disc_data_lock, flags);
+       if (!ap)
+               return;
+diff --git a/drivers/net/ppp_synctty.c b/drivers/net/ppp_synctty.c
+index 801d8f9..13cc986 100644
+--- a/drivers/net/ppp_synctty.c
++++ b/drivers/net/ppp_synctty.c
+@@ -182,13 +182,15 @@ static DEFINE_RWLOCK(disc_data_lock);
+ static struct syncppp *sp_get(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct syncppp *ap;
+-      read_lock(&disc_data_lock);
++      read_lock_irqsave(&disc_data_lock, flags);
+       ap = tty->disc_data;
+       if (ap != NULL)
+               atomic_inc(&ap->refcnt);
+-      read_unlock(&disc_data_lock);
++      read_unlock_irqrestore(&disc_data_lock, flags);
++
+       return ap;
+ }
+@@ -259,12 +261,13 @@ ppp_sync_open(struct tty_struct *tty)
+ static void
+ ppp_sync_close(struct tty_struct *tty)
+ {
++      unsigned long flags;
+       struct syncppp *ap;
+-      write_lock_irq(&disc_data_lock);
++      write_lock_irqsave(&disc_data_lock, flags);
+       ap = tty->disc_data;
+       tty->disc_data = NULL;
+-      write_unlock_irq(&disc_data_lock);
++      write_unlock_irqrestore(&disc_data_lock, flags);
+       if (!ap)
+               return;
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 5952522..f718215 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -2850,54 +2850,64 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance)
+       int handled = 0;
+       int status;
++      /* loop handling interrupts until we have no new ones or
++       * we hit a invalid/hotplug case.
++       */
+       status = RTL_R16(IntrStatus);
++      while (status && status != 0xffff) {
++              handled = 1;
+-      /* hotplug/major error/no more work/shared irq */
+-      if ((status == 0xffff) || !status)
+-              goto out;
+-
+-      handled = 1;
++              /* Handle all of the error cases first. These will reset
++               * the chip, so just exit the loop.
++               */
++              if (unlikely(!netif_running(dev))) {
++                      rtl8169_asic_down(ioaddr);
++                      break;
++              }
+-      if (unlikely(!netif_running(dev))) {
+-              rtl8169_asic_down(ioaddr);
+-              goto out;
+-      }
++              /* Work around for rx fifo overflow */
++              if (unlikely(status & RxFIFOOver) &&
++              (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
++                      netif_stop_queue(dev);
++                      rtl8169_tx_timeout(dev);
++                      break;
++              }
+-      status &= tp->intr_mask;
+-      RTL_W16(IntrStatus,
+-              (status & RxFIFOOver) ? (status | RxOverflow) : status);
++              if (unlikely(status & SYSErr)) {
++                      rtl8169_pcierr_interrupt(dev);
++                      break;
++              }
+-      if (!(status & tp->intr_event))
+-              goto out;
++              if (status & LinkChg)
++                      rtl8169_check_link_status(dev, tp, ioaddr);
+-      /* Work around for rx fifo overflow */
+-      if (unlikely(status & RxFIFOOver) &&
+-          (tp->mac_version == RTL_GIGA_MAC_VER_11)) {
+-              netif_stop_queue(dev);
+-              rtl8169_tx_timeout(dev);
+-              goto out;
+-      }
++              /* We need to see the lastest version of tp->intr_mask to
++               * avoid ignoring an MSI interrupt and having to wait for
++               * another event which may never come.
++               */
++              smp_rmb();
++              if (status & tp->intr_mask & tp->napi_event) {
++                      RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
++                      tp->intr_mask = ~tp->napi_event;
++
++                      if (likely(napi_schedule_prep(&tp->napi)))
++                              __napi_schedule(&tp->napi);
++                      else if (netif_msg_intr(tp)) {
++                              printk(KERN_INFO "%s: interrupt %04x in poll\n",
++                              dev->name, status);
++                      }
++              }
+-      if (unlikely(status & SYSErr)) {
+-              rtl8169_pcierr_interrupt(dev);
+-              goto out;
++              /* We only get a new MSI interrupt when all active irq
++               * sources on the chip have been acknowledged. So, ack
++               * everything we've seen and check if new sources have become
++               * active to avoid blocking all interrupts from the chip.
++               */
++              RTL_W16(IntrStatus,
++                      (status & RxFIFOOver) ? (status | RxOverflow) : status);
++              status = RTL_R16(IntrStatus);
+       }
+-      if (status & LinkChg)
+-              rtl8169_check_link_status(dev, tp, ioaddr);
+-
+-      if (status & tp->napi_event) {
+-              RTL_W16(IntrMask, tp->intr_event & ~tp->napi_event);
+-              tp->intr_mask = ~tp->napi_event;
+-
+-              if (likely(netif_rx_schedule_prep(dev, &tp->napi)))
+-                      __netif_rx_schedule(dev, &tp->napi);
+-              else if (netif_msg_intr(tp)) {
+-                      printk(KERN_INFO "%s: interrupt %04x in poll\n",
+-                             dev->name, status);
+-              }
+-      }
+-out:
+       return IRQ_RETVAL(handled);
+ }
+@@ -2913,13 +2923,15 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
+       if (work_done < budget) {
+               netif_rx_complete(dev, napi);
+-              tp->intr_mask = 0xffff;
+-              /*
+-               * 20040426: the barrier is not strictly required but the
+-               * behavior of the irq handler could be less predictable
+-               * without it. Btw, the lack of flush for the posted pci
+-               * write is safe - FR
++
++              /* We need for force the visibility of tp->intr_mask
++               * for other CPUs, as we can loose an MSI interrupt
++               * and potentially wait for a retransmit timeout if we don't.
++               * The posted write to IntrMask is safe, as it will
++               * eventually make it to the chip and we won't loose anything
++               * until it does.
+                */
++              tp->intr_mask = 0xffff;
+               smp_wmb();
+               RTL_W16(IntrMask, tp->intr_event);
+       }
+diff --git a/drivers/net/sky2.c b/drivers/net/sky2.c
+index b68bc39..42963a9 100644
+--- a/drivers/net/sky2.c
++++ b/drivers/net/sky2.c
+@@ -2393,7 +2393,7 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx)
+                       if (likely(status >> 16 == (status & 0xffff))) {
+                               skb = sky2->rx_ring[sky2->rx_next].skb;
+                               skb->ip_summed = CHECKSUM_COMPLETE;
+-                              skb->csum = status & 0xffff;
++                              skb->csum = le16_to_cpu(status);
+                       } else {
+                               printk(KERN_NOTICE PFX "%s: hardware receive "
+                                      "checksum problem (status = %#x)\n",
+diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c
+index c66b9c3..ca39ace 100644
+--- a/drivers/net/usb/cdc_subset.c
++++ b/drivers/net/usb/cdc_subset.c
+@@ -307,9 +307,10 @@ static const struct usb_device_id products [] = {
+       USB_DEVICE (0x1286, 0x8001),    // "blob" bootloader
+       .driver_info =  (unsigned long) &blob_info,
+ }, {
+-      // Linux Ethernet/RNDIS gadget on pxa210/25x/26x, second config
+-      // e.g. Gumstix, current OpenZaurus, ...
+-      USB_DEVICE_VER (0x0525, 0xa4a2, 0x0203, 0x0203),
++      // Linux Ethernet/RNDIS gadget, mostly on PXA, second config
++      // e.g. Gumstix, current OpenZaurus, ... or anything else
++      // that just enables this gadget option.
++      USB_DEVICE (0x0525, 0xa4a2),
+       .driver_info =  (unsigned long) &linuxdev_info,
+ },
+ #endif
+diff --git a/drivers/net/usb/pegasus.c b/drivers/net/usb/pegasus.c
+index 8c19307..a04a8b0 100644
+--- a/drivers/net/usb/pegasus.c
++++ b/drivers/net/usb/pegasus.c
+@@ -295,7 +295,7 @@ static int update_eth_regs_async(pegasus_t * pegasus)
+       pegasus->dr.bRequestType = PEGASUS_REQT_WRITE;
+       pegasus->dr.bRequest = PEGASUS_REQ_SET_REGS;
+-      pegasus->dr.wValue = 0;
++      pegasus->dr.wValue = cpu_to_le16(0);
+       pegasus->dr.wIndex = cpu_to_le16(EthCtrl0);
+       pegasus->dr.wLength = cpu_to_le16(3);
+       pegasus->ctrl_urb->transfer_buffer_length = 3;
+@@ -444,11 +444,12 @@ static int write_eprom_word(pegasus_t * pegasus, __u8 index, __u16 data)
+       int i;
+       __u8 tmp, d[4] = { 0x3f, 0, 0, EPROM_WRITE };
+       int ret;
++      __le16 le_data = cpu_to_le16(data);
+       set_registers(pegasus, EpromOffset, 4, d);
+       enable_eprom_write(pegasus);
+       set_register(pegasus, EpromOffset, index);
+-      set_registers(pegasus, EpromData, 2, &data);
++      set_registers(pegasus, EpromData, 2, &le_data);
+       set_register(pegasus, EpromCtrl, EPROM_WRITE);
+       for (i = 0; i < REG_TIMEOUT; i++) {
+@@ -918,29 +919,32 @@ static struct net_device_stats *pegasus_netdev_stats(struct net_device *dev)
+ static inline void disable_net_traffic(pegasus_t * pegasus)
+ {
+-      int tmp = 0;
++      __le16 tmp = cpu_to_le16(0);
+-      set_registers(pegasus, EthCtrl0, 2, &tmp);
++      set_registers(pegasus, EthCtrl0, sizeof(tmp), &tmp);
+ }
+ static inline void get_interrupt_interval(pegasus_t * pegasus)
+ {
+-      __u8 data[2];
++      u16 data;
++      u8 interval;
+-      read_eprom_word(pegasus, 4, (__u16 *) data);
++      read_eprom_word(pegasus, 4, &data);
++      interval = data >> 8;
+       if (pegasus->usb->speed != USB_SPEED_HIGH) {
+-              if (data[1] < 0x80) {
++              if (interval < 0x80) {
+                       if (netif_msg_timer(pegasus))
+                               dev_info(&pegasus->intf->dev, "intr interval "
+                                       "changed from %ums to %ums\n",
+-                                      data[1], 0x80);
+-                      data[1] = 0x80;
++                                      interval, 0x80);
++                      interval = 0x80;
++                      data = (data & 0x00FF) | ((u16)interval << 8);
+ #ifdef PEGASUS_WRITE_EEPROM
+-                      write_eprom_word(pegasus, 4, *(__u16 *) data);
++                      write_eprom_word(pegasus, 4, data);
+ #endif
+               }
+       }
+-      pegasus->intr_interval = data[1];
++      pegasus->intr_interval = interval;
+ }
+ static void set_carrier(struct net_device *net)
+@@ -1293,7 +1297,8 @@ static int pegasus_blacklisted(struct usb_device *udev)
+       /* Special quirk to keep the driver from handling the Belkin Bluetooth
+        * dongle which happens to have the same ID.
+        */
+-      if ((udd->idVendor == VENDOR_BELKIN && udd->idProduct == 0x0121) &&
++      if ((udd->idVendor == cpu_to_le16(VENDOR_BELKIN)) &&
++          (udd->idProduct == cpu_to_le16(0x0121)) &&
+           (udd->bDeviceClass == USB_CLASS_WIRELESS_CONTROLLER) &&
+           (udd->bDeviceProtocol == 1))
+               return 1;
+diff --git a/drivers/net/wireless/strip.c b/drivers/net/wireless/strip.c
+index 417e9e6..1e26ddc 100644
+--- a/drivers/net/wireless/strip.c
++++ b/drivers/net/wireless/strip.c
+@@ -856,6 +856,7 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
+       unsigned char *orbuff = strip_info->rx_buff;
+       unsigned char *osbuff = strip_info->sx_buff;
+       unsigned char *otbuff = strip_info->tx_buff;
++      unsigned long flags;
+       if (new_mtu > MAX_SEND_MTU) {
+               printk(KERN_ERR
+@@ -864,11 +865,11 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
+               return -EINVAL;
+       }
+-      spin_lock_bh(&strip_lock);
++      spin_lock_irqsave(&strip_lock, flags);
+       if (!allocate_buffers(strip_info, new_mtu)) {
+               printk(KERN_ERR "%s: unable to grow strip buffers, MTU change cancelled.\n",
+                      strip_info->dev->name);
+-              spin_unlock_bh(&strip_lock);
++              spin_unlock_irqrestore(&strip_lock, flags);
+               return -ENOMEM;
+       }
+@@ -892,7 +893,7 @@ static int strip_change_mtu(struct net_device *dev, int new_mtu)
+               }
+       }
+       strip_info->tx_head = strip_info->tx_buff;
+-      spin_unlock_bh(&strip_lock);
++      spin_unlock_irqrestore(&strip_lock, flags);
+       printk(KERN_NOTICE "%s: strip MTU changed fom %d to %d.\n",
+              strip_info->dev->name, old_mtu, strip_info->mtu);
+@@ -981,10 +982,13 @@ static void strip_seq_neighbours(struct seq_file *seq,
+                          const MetricomNodeTable * table,
+                          const char *title)
+ {
+-      /* We wrap this in a do/while loop, so if the table changes */
+-      /* while we're reading it, we just go around and try again. */
++      unsigned long flags;
+       struct timeval t;
++      /*
++       * We wrap this in a do/while loop, so if the table changes
++       * while we're reading it, we just go around and try again.
++       */
+       do {
+               int i;
+               t = table->timestamp;
+@@ -993,9 +997,9 @@ static void strip_seq_neighbours(struct seq_file *seq,
+               for (i = 0; i < table->num_nodes; i++) {
+                       MetricomNode node;
+-                      spin_lock_bh(&strip_lock);
++                      spin_lock_irqsave(&strip_lock, flags);
+                       node = table->node[i];
+-                      spin_unlock_bh(&strip_lock);
++                      spin_unlock_irqrestore(&strip_lock, flags);
+                       seq_printf(seq, "  %s\n", node.c);
+               }
+       } while (table->timestamp.tv_sec != t.tv_sec
+@@ -1535,6 +1539,7 @@ static void strip_send(struct strip *strip_info, struct sk_buff *skb)
+ static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
+ {
+       struct strip *strip_info = netdev_priv(dev);
++      unsigned long flags;
+       if (!netif_running(dev)) {
+               printk(KERN_ERR "%s: xmit call when iface is down\n",
+@@ -1573,11 +1578,11 @@ static int strip_xmit(struct sk_buff *skb, struct net_device *dev)
+                              strip_info->dev->name, sx_pps_count / 8);
+       }
+-      spin_lock_bh(&strip_lock);
++      spin_lock_irqsave(&strip_lock, flags);
+       strip_send(strip_info, skb);
+-      spin_unlock_bh(&strip_lock);
++      spin_unlock_irqrestore(&strip_lock, flags);
+       if (skb)
+               dev_kfree_skb(skb);
+@@ -2263,12 +2268,13 @@ static void strip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
+ {
+       struct strip *strip_info = (struct strip *) tty->disc_data;
+       const unsigned char *end = cp + count;
++      unsigned long flags;
+       if (!strip_info || strip_info->magic != STRIP_MAGIC
+           || !netif_running(strip_info->dev))
+               return;
+-      spin_lock_bh(&strip_lock);
++      spin_lock_irqsave(&strip_lock, flags);
+ #if 0
+       {
+               struct timeval tv;
+@@ -2335,7 +2341,7 @@ static void strip_receive_buf(struct tty_struct *tty, const unsigned char *cp,
+               }
+               cp++;
+       }
+-      spin_unlock_bh(&strip_lock);
++      spin_unlock_irqrestore(&strip_lock, flags);
+ }
+@@ -2525,9 +2531,11 @@ static void strip_dev_setup(struct net_device *dev)
+ static void strip_free(struct strip *strip_info)
+ {
+-      spin_lock_bh(&strip_lock);
++      unsigned long flags;
++
++      spin_lock_irqsave(&strip_lock, flags);
+       list_del_rcu(&strip_info->list);
+-      spin_unlock_bh(&strip_lock);
++      spin_unlock_irqrestore(&strip_lock, flags);
+       strip_info->magic = 0;
+@@ -2541,6 +2549,7 @@ static void strip_free(struct strip *strip_info)
+ static struct strip *strip_alloc(void)
+ {
+       struct list_head *n;
++      unsigned long flags;
+       struct net_device *dev;
+       struct strip *strip_info;
+@@ -2564,7 +2573,7 @@ static struct strip *strip_alloc(void)
+       strip_info->idle_timer.function = strip_IdleTask;
+-      spin_lock_bh(&strip_lock);
++      spin_lock_irqsave(&strip_lock, flags);
+  rescan:
+       /*
+        * Search the list to find where to put our new entry
+@@ -2583,7 +2592,7 @@ static struct strip *strip_alloc(void)
+       sprintf(dev->name, "st%ld", dev->base_addr);
+       list_add_tail_rcu(&strip_info->list, &strip_list);
+-      spin_unlock_bh(&strip_lock);
++      spin_unlock_irqrestore(&strip_lock, flags);
+       return strip_info;
+ }
+diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
+index 98b9df7..c193540 100644
+--- a/drivers/pnp/pnpacpi/core.c
++++ b/drivers/pnp/pnpacpi/core.c
+@@ -84,7 +84,6 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
+       acpi_handle handle = dev->data;
+       struct acpi_buffer buffer;
+       int ret;
+-      acpi_status status;
+       dev_dbg(&dev->dev, "set resources\n");
+       ret = pnpacpi_build_resource_template(dev, &buffer);
+@@ -95,21 +94,29 @@ static int pnpacpi_set_resources(struct pnp_dev *dev)
+               kfree(buffer.pointer);
+               return ret;
+       }
+-      status = acpi_set_current_resources(handle, &buffer);
+-      if (ACPI_FAILURE(status))
++      if (ACPI_FAILURE(acpi_set_current_resources(handle, &buffer)))
+               ret = -EINVAL;
++      else if (acpi_bus_power_manageable(handle))
++              ret = acpi_bus_set_power(handle, ACPI_STATE_D0);
+       kfree(buffer.pointer);
+       return ret;
+ }
+ static int pnpacpi_disable_resources(struct pnp_dev *dev)
+ {
+-      acpi_status status;
++      acpi_handle handle = dev->data;
++      int ret;
++
++      dev_dbg(&dev->dev, "disable resources\n");
+       /* acpi_unregister_gsi(pnp_irq(dev, 0)); */
+-      status = acpi_evaluate_object((acpi_handle) dev->data,
+-                                    "_DIS", NULL, NULL);
+-      return ACPI_FAILURE(status) ? -ENODEV : 0;
++      ret = 0;
++      if (acpi_bus_power_manageable(handle))
++              acpi_bus_set_power(handle, ACPI_STATE_D3);
++              /* continue even if acpi_bus_set_power() fails */
++      if (ACPI_FAILURE(acpi_evaluate_object(handle, "_DIS", NULL, NULL)))
++              ret = -ENODEV;
++      return ret;
+ }
+ #ifdef CONFIG_ACPI_SLEEP
+diff --git a/drivers/scsi/zalon.c b/drivers/scsi/zalon.c
+index 3c4a300..b8171de 100644
+--- a/drivers/scsi/zalon.c
++++ b/drivers/scsi/zalon.c
+@@ -134,7 +134,7 @@ zalon_probe(struct parisc_device *dev)
+       host = ncr_attach(&zalon7xx_template, unit, &device);
+       if (!host)
+-              goto fail;
++              return -ENODEV;
+       if (request_irq(dev->irq, ncr53c8xx_intr, IRQF_SHARED, "zalon", host)) {
+               printk(KERN_ERR "%s: irq problem with %d, detaching\n ",
+diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
+index 8d2d79e..1ff88af 100644
+--- a/drivers/usb/core/devio.c
++++ b/drivers/usb/core/devio.c
+@@ -976,7 +976,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+                               USBDEVFS_URB_ZERO_PACKET |
+                               USBDEVFS_URB_NO_INTERRUPT))
+               return -EINVAL;
+-      if (!uurb->buffer)
++      if (uurb->buffer_length > 0 && !uurb->buffer)
+               return -EINVAL;
+       if (uurb->signr != 0 && (uurb->signr < SIGRTMIN ||
+                                uurb->signr > SIGRTMAX))
+@@ -1035,11 +1035,6 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+                       is_in = 0;
+                       uurb->endpoint &= ~USB_DIR_IN;
+               }
+-              if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
+-                              uurb->buffer, uurb->buffer_length)) {
+-                      kfree(dr);
+-                      return -EFAULT;
+-              }
+               snoop(&ps->dev->dev, "control urb: bRequest=%02x "
+                       "bRrequestType=%02x wValue=%04x "
+                       "wIndex=%04x wLength=%04x\n",
+@@ -1059,9 +1054,6 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+               uurb->number_of_packets = 0;
+               if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
+                       return -EINVAL;
+-              if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
+-                              uurb->buffer, uurb->buffer_length))
+-                      return -EFAULT;
+               snoop(&ps->dev->dev, "bulk urb\n");
+               break;
+@@ -1103,28 +1095,35 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+                       return -EINVAL;
+               if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
+                       return -EINVAL;
+-              if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
+-                              uurb->buffer, uurb->buffer_length))
+-                      return -EFAULT;
+               snoop(&ps->dev->dev, "interrupt urb\n");
+               break;
+       default:
+               return -EINVAL;
+       }
+-      as = alloc_async(uurb->number_of_packets);
+-      if (!as) {
++      if (uurb->buffer_length > 0 &&
++                      !access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
++                              uurb->buffer, uurb->buffer_length)) {
+               kfree(isopkt);
+               kfree(dr);
+-              return -ENOMEM;
++              return -EFAULT;
+       }
+-      as->urb->transfer_buffer = kmalloc(uurb->buffer_length, GFP_KERNEL);
+-      if (!as->urb->transfer_buffer) {
++      as = alloc_async(uurb->number_of_packets);
++      if (!as) {
+               kfree(isopkt);
+               kfree(dr);
+-              free_async(as);
+               return -ENOMEM;
+       }
++      if (uurb->buffer_length > 0) {
++              as->urb->transfer_buffer = kmalloc(uurb->buffer_length,
++                              GFP_KERNEL);
++              if (!as->urb->transfer_buffer) {
++                      kfree(isopkt);
++                      kfree(dr);
++                      free_async(as);
++                      return -ENOMEM;
++              }
++      }
+       as->urb->dev = ps->dev;
+       as->urb->pipe = (uurb->type << 30) |
+                       __create_pipe(ps->dev, uurb->endpoint & 0xf) |
+@@ -1166,7 +1165,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+       kfree(isopkt);
+       as->ps = ps;
+       as->userurb = arg;
+-      if (uurb->endpoint & USB_DIR_IN)
++      if (is_in && uurb->buffer_length > 0)
+               as->userbuffer = uurb->buffer;
+       else
+               as->userbuffer = NULL;
+@@ -1176,9 +1175,9 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
+       as->uid = current->uid;
+       as->euid = current->euid;
+       security_task_getsecid(current, &as->secid);
+-      if (!is_in) {
++      if (!is_in && uurb->buffer_length > 0) {
+               if (copy_from_user(as->urb->transfer_buffer, uurb->buffer,
+-                              as->urb->transfer_buffer_length)) {
++                              uurb->buffer_length)) {
+                       free_async(as);
+                       return -EFAULT;
+               }
+@@ -1228,22 +1227,22 @@ static int processcompl(struct async *as, void __user * __user *arg)
+       if (as->userbuffer)
+               if (copy_to_user(as->userbuffer, urb->transfer_buffer,
+                                urb->transfer_buffer_length))
+-                      return -EFAULT;
++                      goto err_out;
+       if (put_user(as->status, &userurb->status))
+-              return -EFAULT;
++              goto err_out;
+       if (put_user(urb->actual_length, &userurb->actual_length))
+-              return -EFAULT;
++              goto err_out;
+       if (put_user(urb->error_count, &userurb->error_count))
+-              return -EFAULT;
++              goto err_out;
+       if (usb_endpoint_xfer_isoc(&urb->ep->desc)) {
+               for (i = 0; i < urb->number_of_packets; i++) {
+                       if (put_user(urb->iso_frame_desc[i].actual_length,
+                                    &userurb->iso_frame_desc[i].actual_length))
+-                              return -EFAULT;
++                              goto err_out;
+                       if (put_user(urb->iso_frame_desc[i].status,
+                                    &userurb->iso_frame_desc[i].status))
+-                              return -EFAULT;
++                              goto err_out;
+               }
+       }
+@@ -1252,6 +1251,10 @@ static int processcompl(struct async *as, void __user * __user *arg)
+       if (put_user(addr, (void __user * __user *)arg))
+               return -EFAULT;
+       return 0;
++
++err_out:
++      free_async(as);
++      return -EFAULT;
+ }
+ static struct async *reap_as(struct dev_state *ps)
+diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c
+index bcac2e6..c5d6765 100644
+--- a/drivers/usb/gadget/ether.c
++++ b/drivers/usb/gadget/ether.c
+@@ -273,15 +273,16 @@ static int __init eth_bind(struct usb_composite_dev *cdev)
+               /* CDC Subset */
+               eth_config_driver.label = "CDC Subset/SAFE";
+-              device_desc.idVendor = cpu_to_le16(SIMPLE_VENDOR_NUM),
+-              device_desc.idProduct = cpu_to_le16(SIMPLE_PRODUCT_NUM),
+-              device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
++              device_desc.idVendor = cpu_to_le16(SIMPLE_VENDOR_NUM);
++              device_desc.idProduct = cpu_to_le16(SIMPLE_PRODUCT_NUM);
++              if (!has_rndis())
++                      device_desc.bDeviceClass = USB_CLASS_VENDOR_SPEC;
+       }
+       if (has_rndis()) {
+               /* RNDIS plus ECM-or-Subset */
+-              device_desc.idVendor = cpu_to_le16(RNDIS_VENDOR_NUM),
+-              device_desc.idProduct = cpu_to_le16(RNDIS_PRODUCT_NUM),
++              device_desc.idVendor = cpu_to_le16(RNDIS_VENDOR_NUM);
++              device_desc.idProduct = cpu_to_le16(RNDIS_PRODUCT_NUM);
+               device_desc.bNumConfigurations = 2;
+       }
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index 1d0b49e..18e8741 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -1617,11 +1617,14 @@ itd_complete (
+                               desc->status = -EPROTO;
+                       /* HC need not update length with this error */
+-                      if (!(t & EHCI_ISOC_BABBLE))
+-                              desc->actual_length = EHCI_ITD_LENGTH (t);
++                      if (!(t & EHCI_ISOC_BABBLE)) {
++                              desc->actual_length = EHCI_ITD_LENGTH(t);
++                              urb->actual_length += desc->actual_length;
++                      }
+               } else if (likely ((t & EHCI_ISOC_ACTIVE) == 0)) {
+                       desc->status = 0;
+-                      desc->actual_length = EHCI_ITD_LENGTH (t);
++                      desc->actual_length = EHCI_ITD_LENGTH(t);
++                      urb->actual_length += desc->actual_length;
+               } else {
+                       /* URB was too late */
+                       desc->status = -EXDEV;
+@@ -2012,7 +2015,8 @@ sitd_complete (
+                       desc->status = -EPROTO;
+       } else {
+               desc->status = 0;
+-              desc->actual_length = desc->length - SITD_LENGTH (t);
++              desc->actual_length = desc->length - SITD_LENGTH(t);
++              urb->actual_length += desc->actual_length;
+       }
+       stream->depth -= stream->interval << 3;
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
+index d8c41ae..bc5e905 100644
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -240,7 +240,6 @@ static struct usb_device_id ti_id_table_5052[5+TI_EXTRA_VID_PID_COUNT+1] = {
+       { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) },
+       { USB_DEVICE(TI_VENDOR_ID, TI_5052_FIRMWARE_PRODUCT_ID) },
+-      { USB_DEVICE(IBM_VENDOR_ID, IBM_4543_PRODUCT_ID) },
+ };
+ static struct usb_device_id ti_id_table_combined[14+2*TI_EXTRA_VID_PID_COUNT+1] = {
+@@ -1703,7 +1702,7 @@ static int ti_do_download(struct usb_device *dev, int pipe,
+       u8 cs = 0;
+       int done;
+       struct ti_firmware_header *header;
+-      int status;
++      int status = 0;
+       int len;
+       for (pos = sizeof(struct ti_firmware_header); pos < size; pos++)
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index e57df48..a6f8b8f 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -1517,11 +1517,11 @@ static int fill_note_info(struct elfhdr *elf, int phdrs,
+       info->thread = NULL;
+       psinfo = kmalloc(sizeof(*psinfo), GFP_KERNEL);
+-      fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
+-
+       if (psinfo == NULL)
+               return 0;
++      fill_note(&info->psinfo, "CORE", NT_PRPSINFO, sizeof(*psinfo), psinfo);
++
+       /*
+        * Figure out how many notes we're going to need for each thread.
+        */
+diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c
+index 59b9833..247c0d4 100644
+--- a/fs/ecryptfs/keystore.c
++++ b/fs/ecryptfs/keystore.c
+@@ -730,6 +730,13 @@ parse_tag_3_packet(struct ecryptfs_crypt_stat *crypt_stat,
+       }
+       (*new_auth_tok)->session_key.encrypted_key_size =
+               (body_size - (ECRYPTFS_SALT_SIZE + 5));
++      if ((*new_auth_tok)->session_key.encrypted_key_size
++          > ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES) {
++              printk(KERN_WARNING "Tag 3 packet contains key larger "
++                     "than ECRYPTFS_MAX_ENCRYPTED_KEY_BYTES\n");
++              rc = -EINVAL;
++              goto out_free;
++      }
+       if (unlikely(data[(*packet_size)++] != 0x04)) {
+               printk(KERN_WARNING "Unknown version number [%d]\n",
+                      data[(*packet_size) - 1]);
+@@ -876,6 +883,12 @@ parse_tag_11_packet(unsigned char *data, unsigned char *contents,
+               rc = -EINVAL;
+               goto out;
+       }
++      if (unlikely((*tag_11_contents_size) > max_contents_bytes)) {
++              printk(KERN_ERR "Literal data section in tag 11 packet exceeds "
++                     "expected size\n");
++              rc = -EINVAL;
++              goto out;
++      }
+       if (data[(*packet_size)++] != 0x62) {
+               printk(KERN_WARNING "Unrecognizable packet\n");
+               rc = -EINVAL;
+diff --git a/include/net/x25.h b/include/net/x25.h
+index fc3f03d..2cda040 100644
+--- a/include/net/x25.h
++++ b/include/net/x25.h
+@@ -187,7 +187,7 @@ extern int  x25_addr_ntoa(unsigned char *, struct x25_address *,
+ extern int  x25_addr_aton(unsigned char *, struct x25_address *,
+                         struct x25_address *);
+ extern struct sock *x25_find_socket(unsigned int, struct x25_neigh *);
+-extern void x25_destroy_socket(struct sock *);
++extern void x25_destroy_socket_from_timer(struct sock *);
+ extern int  x25_rx_call_request(struct sk_buff *, struct x25_neigh *, unsigned int);
+ extern void x25_kill_by_neigh(struct x25_neigh *);
+diff --git a/mm/filemap.c b/mm/filemap.c
+index 8a477d3..bff0b00 100644
+--- a/mm/filemap.c
++++ b/mm/filemap.c
+@@ -2441,6 +2441,7 @@ again:
+               pagefault_enable();
+               flush_dcache_page(page);
++              mark_page_accessed(page);
+               status = a_ops->write_end(file, mapping, pos, bytes, copied,
+                                               page, fsdata);
+               if (unlikely(status < 0))
+diff --git a/mm/slab.c b/mm/slab.c
+index e76eee4..600e864 100644
+--- a/mm/slab.c
++++ b/mm/slab.c
+@@ -2580,7 +2580,7 @@ void kmem_cache_destroy(struct kmem_cache *cachep)
+       }
+       if (unlikely(cachep->flags & SLAB_DESTROY_BY_RCU))
+-              synchronize_rcu();
++              rcu_barrier();
+       __kmem_cache_destroy(cachep);
+       mutex_unlock(&cache_chain_mutex);
+diff --git a/mm/slob.c b/mm/slob.c
+index cb675d1..ed04252 100644
+--- a/mm/slob.c
++++ b/mm/slob.c
+@@ -561,6 +561,8 @@ EXPORT_SYMBOL(kmem_cache_create);
+ void kmem_cache_destroy(struct kmem_cache *c)
+ {
++      if (c->flags & SLAB_DESTROY_BY_RCU)
++              rcu_barrier();
+       slob_free(c, sizeof(struct kmem_cache));
+ }
+ EXPORT_SYMBOL(kmem_cache_destroy);
+diff --git a/mm/slub.c b/mm/slub.c
+index 0c83e6a..f0175b4 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -2447,6 +2447,8 @@ static inline int kmem_cache_close(struct kmem_cache *s)
+  */
+ void kmem_cache_destroy(struct kmem_cache *s)
+ {
++      if (s->flags & SLAB_DESTROY_BY_RCU)
++              rcu_barrier();
+       down_write(&slub_lock);
+       s->refcount--;
+       if (!s->refcount) {
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index 76739e9..66cfe88 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -1089,14 +1089,24 @@ static void
+ call_transmit_status(struct rpc_task *task)
+ {
+       task->tk_action = call_status;
+-      /*
+-       * Special case: if we've been waiting on the socket's write_space()
+-       * callback, then don't call xprt_end_transmit().
+-       */
+-      if (task->tk_status == -EAGAIN)
+-              return;
+-      xprt_end_transmit(task);
+-      rpc_task_force_reencode(task);
++      switch (task->tk_status) {
++      case -EAGAIN:
++              break;
++      default:
++              xprt_end_transmit(task);
++              /*
++               * Special cases: if we've been waiting on the
++               * socket's write_space() callback, or if the
++               * socket just returned a connection error,
++               * then hold onto the transport lock.
++               */
++      case -ECONNREFUSED:
++      case -ENOTCONN:
++      case -EHOSTDOWN:
++      case -EHOSTUNREACH:
++      case -ENETUNREACH:
++              rpc_task_force_reencode(task);
++      }
+ }
+ /*
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 4486c59..8f9295d 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -1150,7 +1150,6 @@ static void xs_tcp_state_change(struct sock *sk)
+               break;
+       case TCP_CLOSE_WAIT:
+               /* The server initiated a shutdown of the socket */
+-              set_bit(XPRT_CLOSING, &xprt->state);
+               xprt_force_disconnect(xprt);
+       case TCP_SYN_SENT:
+               xprt->connect_cookie++;
+@@ -1163,6 +1162,7 @@ static void xs_tcp_state_change(struct sock *sk)
+                       xprt->reestablish_timeout = XS_TCP_INIT_REEST_TO;
+               break;
+       case TCP_LAST_ACK:
++              set_bit(XPRT_CLOSING, &xprt->state);
+               smp_mb__before_clear_bit();
+               clear_bit(XPRT_CONNECTED, &xprt->state);
+               smp_mb__after_clear_bit();
+@@ -1560,10 +1560,9 @@ out:
+  * We need to preserve the port number so the reply cache on the server can
+  * find our cached RPC replies when we get around to reconnecting.
+  */
+-static void xs_tcp_reuse_connection(struct rpc_xprt *xprt)
++static void xs_abort_connection(struct rpc_xprt *xprt, struct sock_xprt *transport)
+ {
+       int result;
+-      struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
+       struct sockaddr any;
+       dprintk("RPC:       disconnecting xprt %p to reuse port\n", xprt);
+@@ -1580,6 +1579,17 @@ static void xs_tcp_reuse_connection(struct rpc_xprt *xprt)
+                               result);
+ }
++static void xs_tcp_reuse_connection(struct rpc_xprt *xprt, struct sock_xprt *transport)
++{
++      unsigned int state = transport->inet->sk_state;
++
++      if (state == TCP_CLOSE && transport->sock->state == SS_UNCONNECTED)
++              return;
++      if ((1 << state) & (TCPF_ESTABLISHED|TCPF_SYN_SENT))
++              return;
++      xs_abort_connection(xprt, transport);
++}
++
+ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock)
+ {
+       struct sock_xprt *transport = container_of(xprt, struct sock_xprt, xprt);
+@@ -1650,7 +1660,7 @@ static void xs_tcp_connect_worker4(struct work_struct *work)
+               }
+       } else
+               /* "close" the socket, preserving the local port */
+-              xs_tcp_reuse_connection(xprt);
++              xs_tcp_reuse_connection(xprt, transport);
+       dprintk("RPC:       worker connecting xprt %p to address: %s\n",
+                       xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
+@@ -1710,7 +1720,7 @@ static void xs_tcp_connect_worker6(struct work_struct *work)
+               }
+       } else
+               /* "close" the socket, preserving the local port */
+-              xs_tcp_reuse_connection(xprt);
++              xs_tcp_reuse_connection(xprt, transport);
+       dprintk("RPC:       worker connecting xprt %p to address: %s\n",
+                       xprt, xprt->address_strings[RPC_DISPLAY_ALL]);
+@@ -1780,9 +1790,6 @@ static void xs_tcp_connect(struct rpc_task *task)
+ {
+       struct rpc_xprt *xprt = task->tk_xprt;
+-      /* Initiate graceful shutdown of the socket if not already done */
+-      if (test_bit(XPRT_CONNECTED, &xprt->state))
+-              xs_tcp_shutdown(xprt);
+       /* Exit if we need to wait for socket shutdown to complete */
+       if (test_bit(XPRT_CLOSING, &xprt->state))
+               return;
+diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
+index 88d80f5..220a5e3 100644
+--- a/net/x25/af_x25.c
++++ b/net/x25/af_x25.c
+@@ -332,14 +332,14 @@ static unsigned int x25_new_lci(struct x25_neigh *nb)
+ /*
+  *    Deferred destroy.
+  */
+-void x25_destroy_socket(struct sock *);
++static void __x25_destroy_socket(struct sock *);
+ /*
+  *    handler for deferred kills.
+  */
+ static void x25_destroy_timer(unsigned long data)
+ {
+-      x25_destroy_socket((struct sock *)data);
++      x25_destroy_socket_from_timer((struct sock *)data);
+ }
+ /*
+@@ -349,12 +349,10 @@ static void x25_destroy_timer(unsigned long data)
+  *    will touch it and we are (fairly 8-) ) safe.
+  *    Not static as it's used by the timer
+  */
+-void x25_destroy_socket(struct sock *sk)
++static void __x25_destroy_socket(struct sock *sk)
+ {
+       struct sk_buff *skb;
+-      sock_hold(sk);
+-      lock_sock(sk);
+       x25_stop_heartbeat(sk);
+       x25_stop_timer(sk);
+@@ -385,7 +383,22 @@ void x25_destroy_socket(struct sock *sk)
+               /* drop last reference so sock_put will free */
+               __sock_put(sk);
+       }
++}
++void x25_destroy_socket_from_timer(struct sock *sk)
++{
++      sock_hold(sk);
++      bh_lock_sock(sk);
++      __x25_destroy_socket(sk);
++      bh_unlock_sock(sk);
++      sock_put(sk);
++}
++
++static void x25_destroy_socket(struct sock *sk)
++{
++      sock_hold(sk);
++      lock_sock(sk);
++      __x25_destroy_socket(sk);
+       release_sock(sk);
+       sock_put(sk);
+ }
+diff --git a/net/x25/x25_timer.c b/net/x25/x25_timer.c
+index d3e3e54..5c5db1a 100644
+--- a/net/x25/x25_timer.c
++++ b/net/x25/x25_timer.c
+@@ -113,7 +113,7 @@ static void x25_heartbeat_expiry(unsigned long param)
+                           (sk->sk_state == TCP_LISTEN &&
+                            sock_flag(sk, SOCK_DEAD))) {
+                               bh_unlock_sock(sk);
+-                              x25_destroy_socket(sk);
++                              x25_destroy_socket_from_timer(sk);
+                               return;
+                       }
+                       break;
+diff --git a/net/xfrm/xfrm_algo.c b/net/xfrm/xfrm_algo.c
+index 96036cf..79d78f4 100644
+--- a/net/xfrm/xfrm_algo.c
++++ b/net/xfrm/xfrm_algo.c
+@@ -292,8 +292,8 @@ static struct xfrm_algo_desc ealg_list[] = {
+       }
+ },
+ {
+-      .name = "cbc(cast128)",
+-      .compat = "cast128",
++      .name = "cbc(cast5)",
++      .compat = "cast5",
+       .uinfo = {
+               .encr = {
+diff --git a/sound/pci/ca0106/ca0106_main.c b/sound/pci/ca0106/ca0106_main.c
+index 6abe8a3..2b8b1ed 100644
+--- a/sound/pci/ca0106/ca0106_main.c
++++ b/sound/pci/ca0106/ca0106_main.c
+@@ -311,9 +311,9 @@ static struct snd_pcm_hardware snd_ca0106_capture_hw = {
+       .rate_max =             192000,
+       .channels_min =         2,
+       .channels_max =         2,
+-      .buffer_bytes_max =     ((65536 - 64) * 8),
++      .buffer_bytes_max =     65536 - 128,
+       .period_bytes_min =     64,
+-      .period_bytes_max =     (65536 - 64),
++      .period_bytes_max =     32768 - 64,
+       .periods_min =          2,
+       .periods_max =          2,
+       .fifo_size =            0,
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 3b5c6c2..07f8dcc 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -9214,6 +9214,18 @@ static void alc262_lenovo_3000_unsol_event(struct hda_codec *codec,
+       alc262_lenovo_3000_automute(codec, 1);
+ }
++static int amp_stereo_mute_update(struct hda_codec *codec, hda_nid_t nid,
++                                int dir, int idx, long *valp)
++{
++      int i, change = 0;
++
++      for (i = 0; i < 2; i++, valp++)
++              change |= snd_hda_codec_amp_update(codec, nid, i, dir, idx,
++                                                 HDA_AMP_MUTE,
++                                                 *valp ? 0 : HDA_AMP_MUTE);
++      return change;
++}
++
+ /* bind hp and internal speaker mute (with plug check) */
+ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
+                                        struct snd_ctl_elem_value *ucontrol)
+@@ -9222,13 +9234,8 @@ static int alc262_fujitsu_master_sw_put(struct snd_kcontrol *kcontrol,
+       long *valp = ucontrol->value.integer.value;
+       int change;
+-      change = snd_hda_codec_amp_stereo(codec, 0x14, HDA_OUTPUT, 0,
+-                                               HDA_AMP_MUTE,
+-                                               valp ? 0 : HDA_AMP_MUTE);
+-      change |= snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
+-                                               HDA_AMP_MUTE,
+-                                               valp ? 0 : HDA_AMP_MUTE);
+-
++      change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
++      change |= amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
+       if (change)
+               alc262_fujitsu_automute(codec, 0);
+       return change;
+@@ -9265,10 +9272,7 @@ static int alc262_lenovo_3000_master_sw_put(struct snd_kcontrol *kcontrol,
+       long *valp = ucontrol->value.integer.value;
+       int change;
+-      change = snd_hda_codec_amp_stereo(codec, 0x1b, HDA_OUTPUT, 0,
+-                                               HDA_AMP_MUTE,
+-                                               valp ? 0 : HDA_AMP_MUTE);
+-
++      change = amp_stereo_mute_update(codec, 0x1b, HDA_OUTPUT, 0, valp);
+       if (change)
+               alc262_lenovo_3000_automute(codec, 0);
+       return change;
+@@ -10280,12 +10284,7 @@ static int alc268_acer_master_sw_put(struct snd_kcontrol *kcontrol,
+       long *valp = ucontrol->value.integer.value;
+       int change;
+-      change = snd_hda_codec_amp_update(codec, 0x14, 0, HDA_OUTPUT, 0,
+-                                        HDA_AMP_MUTE,
+-                                        valp[0] ? 0 : HDA_AMP_MUTE);
+-      change |= snd_hda_codec_amp_update(codec, 0x14, 1, HDA_OUTPUT, 0,
+-                                         HDA_AMP_MUTE,
+-                                         valp[1] ? 0 : HDA_AMP_MUTE);
++      change = amp_stereo_mute_update(codec, 0x14, HDA_OUTPUT, 0, valp);
+       if (change)
+               alc268_acer_automute(codec, 0);
+       return change;
+diff --git a/sound/pci/oxygen/virtuoso.c b/sound/pci/oxygen/virtuoso.c
+index 01d7b75..d1773f6 100644
+--- a/sound/pci/oxygen/virtuoso.c
++++ b/sound/pci/oxygen/virtuoso.c
+@@ -376,6 +376,8 @@ static void xonar_d2_resume(struct oxygen *chip)
+ static void xonar_d1_resume(struct oxygen *chip)
+ {
++      oxygen_set_bits8(chip, OXYGEN_FUNCTION, OXYGEN_FUNCTION_RESET_CODEC);
++      msleep(1);
+       cs43xx_init(chip);
+       xonar_enable_output(chip);
+ }
+diff --git a/sound/usb/usbaudio.c b/sound/usb/usbaudio.c
+index c10e476..915a131 100644
+--- a/sound/usb/usbaudio.c
++++ b/sound/usb/usbaudio.c
+@@ -2674,7 +2674,7 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
+       struct usb_interface_descriptor *altsd;
+       int i, altno, err, stream;
+       int format;
+-      struct audioformat *fp;
++      struct audioformat *fp = NULL;
+       unsigned char *fmt, *csep;
+       int num;
+@@ -2747,6 +2747,18 @@ static int parse_audio_endpoints(struct snd_usb_audio *chip, int iface_no)
+                       continue;
+               }
++              /*
++               * Blue Microphones workaround: The last altsetting is identical
++               * with the previous one, except for a larger packet size, but
++               * is actually a mislabeled two-channel setting; ignore it.
++               */
++              if (fmt[4] == 1 && fmt[5] == 2 && altno == 2 && num == 3 &&
++                  fp && fp->altsetting == 1 && fp->channels == 1 &&
++                  fp->format == SNDRV_PCM_FORMAT_S16_LE &&
++                  le16_to_cpu(get_endpoint(alts, 0)->wMaxPacketSize) ==
++                                                      fp->maxpacksize * 2)
++                      continue;
++
+               csep = snd_usb_find_desc(alts->endpoint[0].extra, alts->endpoint[0].extralen, NULL, USB_DT_CS_ENDPOINT);
+               /* Creamware Noah has this descriptor after the 2nd endpoint */
+               if (!csep && altsd->bNumEndpoints >= 2)
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.29-30 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.29-30
new file mode 100644 (file)
index 0000000..bf72562
--- /dev/null
@@ -0,0 +1,983 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.30
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 47d46f4..0eef388 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .29
++EXTRAVERSION = .30
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c
+index 5259d8c..5d8fa67 100644
+--- a/arch/parisc/kernel/cache.c
++++ b/arch/parisc/kernel/cache.c
+@@ -398,12 +398,13 @@ EXPORT_SYMBOL(flush_kernel_icache_range_asm);
+ void clear_user_page_asm(void *page, unsigned long vaddr)
+ {
++      unsigned long flags;
+       /* This function is implemented in assembly in pacache.S */
+       extern void __clear_user_page_asm(void *page, unsigned long vaddr);
+-      purge_tlb_start();
++      purge_tlb_start(flags);
+       __clear_user_page_asm(page, vaddr);
+-      purge_tlb_end();
++      purge_tlb_end(flags);
+ }
+ #define FLUSH_THRESHOLD 0x80000 /* 0.5MB */
+@@ -444,20 +445,24 @@ extern void clear_user_page_asm(void *page, unsigned long vaddr);
+ void clear_user_page(void *page, unsigned long vaddr, struct page *pg)
+ {
++      unsigned long flags;
++
+       purge_kernel_dcache_page((unsigned long)page);
+-      purge_tlb_start();
++      purge_tlb_start(flags);
+       pdtlb_kernel(page);
+-      purge_tlb_end();
++      purge_tlb_end(flags);
+       clear_user_page_asm(page, vaddr);
+ }
+ EXPORT_SYMBOL(clear_user_page);
+ void flush_kernel_dcache_page_addr(void *addr)
+ {
++      unsigned long flags;
++
+       flush_kernel_dcache_page_asm(addr);
+-      purge_tlb_start();
++      purge_tlb_start(flags);
+       pdtlb_kernel(addr);
+-      purge_tlb_end();
++      purge_tlb_end(flags);
+ }
+ EXPORT_SYMBOL(flush_kernel_dcache_page_addr);
+@@ -490,8 +495,10 @@ void __flush_tlb_range(unsigned long sid, unsigned long start,
+       if (npages >= 512)  /* 2MB of space: arbitrary, should be tuned */
+               flush_tlb_all();
+       else {
++              unsigned long flags;
++
+               mtsp(sid, 1);
+-              purge_tlb_start();
++              purge_tlb_start(flags);
+               if (split_tlb) {
+                       while (npages--) {
+                               pdtlb(start);
+@@ -504,7 +511,7 @@ void __flush_tlb_range(unsigned long sid, unsigned long start,
+                               start += PAGE_SIZE;
+                       }
+               }
+-              purge_tlb_end();
++              purge_tlb_end(flags);
+       }
+ }
+diff --git a/arch/parisc/kernel/pci-dma.c b/arch/parisc/kernel/pci-dma.c
+index ccd61b9..6cc0be1 100644
+--- a/arch/parisc/kernel/pci-dma.c
++++ b/arch/parisc/kernel/pci-dma.c
+@@ -90,12 +90,14 @@ static inline int map_pte_uncached(pte_t * pte,
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
++              unsigned long flags;
++
+               if (!pte_none(*pte))
+                       printk(KERN_ERR "map_pte_uncached: page already exists\n");
+               set_pte(pte, __mk_pte(*paddr_ptr, PAGE_KERNEL_UNC));
+-              purge_tlb_start();
++              purge_tlb_start(flags);
+               pdtlb_kernel(orig_vaddr);
+-              purge_tlb_end();
++              purge_tlb_end(flags);
+               vaddr += PAGE_SIZE;
+               orig_vaddr += PAGE_SIZE;
+               (*paddr_ptr) += PAGE_SIZE;
+@@ -168,11 +170,13 @@ static inline void unmap_uncached_pte(pmd_t * pmd, unsigned long vaddr,
+       if (end > PMD_SIZE)
+               end = PMD_SIZE;
+       do {
++              unsigned long flags;
++
+               pte_t page = *pte;
+               pte_clear(&init_mm, vaddr, pte);
+-              purge_tlb_start();
++              purge_tlb_start(flags);
+               pdtlb_kernel(orig_vaddr);
+-              purge_tlb_end();
++              purge_tlb_end(flags);
+               vaddr += PAGE_SIZE;
+               orig_vaddr += PAGE_SIZE;
+               pte++;
+diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
+index be33a54..eed133e 100644
+--- a/arch/x86/kernel/pci-gart_64.c
++++ b/arch/x86/kernel/pci-gart_64.c
+@@ -658,8 +658,6 @@ static __init int init_k8_gatt(struct agp_kern_info *info)
+       memset(gatt, 0, gatt_size);
+       agp_gatt_table = gatt;
+-      enable_gart_translations();
+-
+       error = sysdev_class_register(&gart_sysdev_class);
+       if (!error)
+               error = sysdev_register(&device_gart);
+@@ -828,6 +826,14 @@ void __init gart_iommu_init(void)
+       wbinvd();
+       /*
++       * Now all caches are flushed and we can safely enable
++       * GART hardware.  Doing it early leaves the possibility
++       * of stale cache entries that can lead to GART PTE
++       * errors.
++       */
++      enable_gart_translations();
++
++      /*
+        * Try to workaround a bug (thanks to BenH):
+        * Set unmapped entries to a scratch page instead of 0.
+        * Any prefetches that hit unmapped entries won't get an bus abort
+diff --git a/block/Kconfig b/block/Kconfig
+index 1ab7c15..150e21d 100644
+--- a/block/Kconfig
++++ b/block/Kconfig
+@@ -67,9 +67,9 @@ config LSF
+         If unsure, say Y.
+ config BLK_DEV_BSG
+-      bool "Block layer SG support v4 (EXPERIMENTAL)"
+-      depends on EXPERIMENTAL
+-      ---help---
++      bool "Block layer SG support v4"
++      default y
++      help
+         Saying Y here will enable generic SG (SCSI generic) v4 support
+         for any block device.
+@@ -79,7 +79,10 @@ config BLK_DEV_BSG
+         protocols (e.g. Task Management Functions and SMP in Serial
+         Attached SCSI).
+-        If unsure, say N.
++        This option is required by recent UDEV versions to properly
++        access device serial numbers, etc.
++
++        If unsure, say Y.
+ config BLK_DEV_INTEGRITY
+       bool "Block layer data integrity support"
+diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
+index 716370c..e56f805 100644
+--- a/drivers/firewire/fw-sbp2.c
++++ b/drivers/firewire/fw-sbp2.c
+@@ -188,6 +188,12 @@ struct sbp2_target {
+ #define SBP2_RETRY_LIMIT              0xf             /* 15 retries */
+ #define SBP2_CYCLE_LIMIT              (0xc8 << 12)    /* 200 125us cycles */
++/*
++ * There is no transport protocol limit to the CDB length,  but we implement
++ * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
++ */
++#define SBP2_MAX_CDB_SIZE             16
++
+ /* Unit directory keys */
+ #define SBP2_CSR_UNIT_CHARACTERISTICS 0x3a
+ #define SBP2_CSR_FIRMWARE_REVISION    0x3c
+@@ -293,7 +299,7 @@ struct sbp2_command_orb {
+               struct sbp2_pointer next;
+               struct sbp2_pointer data_descriptor;
+               __be32 misc;
+-              u8 command_block[12];
++              u8 command_block[SBP2_MAX_CDB_SIZE];
+       } request;
+       struct scsi_cmnd *cmd;
+       scsi_done_fn_t done;
+@@ -1159,6 +1165,8 @@ static int sbp2_probe(struct device *dev)
+       if (fw_device_enable_phys_dma(device) < 0)
+               goto fail_shost_put;
++      shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
++
+       if (scsi_add_host(shost, &unit->device) < 0)
+               goto fail_shost_put;
+diff --git a/drivers/hwmon/smsc47m1.c b/drivers/hwmon/smsc47m1.c
+index d1b4985..fa72f5f 100644
+--- a/drivers/hwmon/smsc47m1.c
++++ b/drivers/hwmon/smsc47m1.c
+@@ -85,6 +85,7 @@ superio_exit(void)
+ #define SUPERIO_REG_ACT               0x30
+ #define SUPERIO_REG_BASE      0x60
+ #define SUPERIO_REG_DEVID     0x20
++#define SUPERIO_REG_DEVREV    0x21
+ /* Logical device registers */
+@@ -428,6 +429,9 @@ static int __init smsc47m1_find(unsigned short *addr,
+        * The LPC47M292 (device id 0x6B) is somewhat compatible, but it
+        * supports a 3rd fan, and the pin configuration registers are
+        * unfortunately different.
++       * The LPC47M233 has the same device id (0x6B) but is not compatible.
++       * We check the high bit of the device revision register to
++       * differentiate them.
+        */
+       switch (val) {
+       case 0x51:
+@@ -447,6 +451,13 @@ static int __init smsc47m1_find(unsigned short *addr,
+               sio_data->type = smsc47m1;
+               break;
+       case 0x6B:
++              if (superio_inb(SUPERIO_REG_DEVREV) & 0x80) {
++                      pr_debug(DRVNAME ": "
++                               "Found SMSC LPC47M233, unsupported\n");
++                      superio_exit();
++                      return -ENODEV;
++              }
++
+               pr_info(DRVNAME ": Found SMSC LPC47M292\n");
+               sio_data->type = smsc47m2;
+               break;
+diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c
+index 1a9cc13..b96f302 100644
+--- a/drivers/i2c/chips/tsl2550.c
++++ b/drivers/i2c/chips/tsl2550.c
+@@ -27,7 +27,7 @@
+ #include <linux/delay.h>
+ #define TSL2550_DRV_NAME      "tsl2550"
+-#define DRIVER_VERSION                "1.1.1"
++#define DRIVER_VERSION                "1.1.2"
+ /*
+  * Defines
+@@ -189,13 +189,16 @@ static int tsl2550_calculate_lux(u8 ch0, u8 ch1)
+       u8 r = 128;
+       /* Avoid division by 0 and count 1 cannot be greater than count 0 */
+-      if (c0 && (c1 <= c0))
+-              r = c1 * 128 / c0;
++      if (c1 <= c0)
++              if (c0) {
++                      r = c1 * 128 / c0;
++
++                      /* Calculate LUX */
++                      lux = ((c0 - c1) * ratio_lut[r]) / 256;
++              } else
++                      lux = 0;
+       else
+-              return -1;
+-
+-      /* Calculate LUX */
+-      lux = ((c0 - c1) * ratio_lut[r]) / 256;
++              return -EAGAIN;
+       /* LUX range check */
+       return lux > TSL2550_MAX_LUX ? TSL2550_MAX_LUX : lux;
+diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
+index 0c0fdbb..e21c2d5 100644
+--- a/drivers/ieee1394/sbp2.c
++++ b/drivers/ieee1394/sbp2.c
+@@ -874,6 +874,7 @@ static struct sbp2_lu *sbp2_alloc_device(struct unit_directory *ud)
+       }
+       shost->hostdata[0] = (unsigned long)lu;
++      shost->max_cmd_len = SBP2_MAX_CDB_SIZE;
+       if (!scsi_add_host(shost, &ud->device)) {
+               lu->shost = shost;
+diff --git a/drivers/ieee1394/sbp2.h b/drivers/ieee1394/sbp2.h
+index 875428b..e547b16 100644
+--- a/drivers/ieee1394/sbp2.h
++++ b/drivers/ieee1394/sbp2.h
+@@ -25,6 +25,12 @@
+ #define SBP2_DEVICE_NAME              "sbp2"
+ /*
++ * There is no transport protocol limit to the CDB length,  but we implement
++ * a fixed length only.  16 bytes is enough for disks larger than 2 TB.
++ */
++#define SBP2_MAX_CDB_SIZE             16
++
++/*
+  * SBP-2 specific definitions
+  */
+@@ -51,7 +57,7 @@ struct sbp2_command_orb {
+       u32 data_descriptor_hi;
+       u32 data_descriptor_lo;
+       u32 misc;
+-      u8 cdb[12];
++      u8 cdb[SBP2_MAX_CDB_SIZE];
+ } __attribute__((packed));
+ #define SBP2_LOGIN_REQUEST            0x0
+diff --git a/drivers/misc/Kconfig b/drivers/misc/Kconfig
+index a726f3b..52174d9 100644
+--- a/drivers/misc/Kconfig
++++ b/drivers/misc/Kconfig
+@@ -321,6 +321,7 @@ config THINKPAD_ACPI_DOCK
+       bool "Legacy Docking Station Support"
+       depends on THINKPAD_ACPI
+       depends on ACPI_DOCK=n
++      depends on BROKEN
+       default n
+       ---help---
+         Allows the thinkpad_acpi driver to handle docking station events.
+@@ -334,7 +335,8 @@ config THINKPAD_ACPI_DOCK
+ config THINKPAD_ACPI_BAY
+       bool "Legacy Removable Bay Support"
+       depends on THINKPAD_ACPI
+-      default y
++      depends on BROKEN
++      default n
+       ---help---
+         Allows the thinkpad_acpi driver to handle removable bays.  It will
+         electrically disable the device in the bay, and also generate
+diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c
+index 375a0bd..ec4204a 100644
+--- a/drivers/net/usb/asix.c
++++ b/drivers/net/usb/asix.c
+@@ -1456,6 +1456,14 @@ static const struct usb_device_id       products [] = {
+       // ASIX 88772a
+       USB_DEVICE(0x0db0, 0xa877),
+       .driver_info = (unsigned long) &ax88772_info,
++}, {
++      // ABOCOM for pci
++      USB_DEVICE(0x14ea, 0xab11),
++      .driver_info = (unsigned long) &ax88178_info,
++}, {
++      // ASIX 88772a
++      USB_DEVICE(0x0db0, 0xa877),
++      .driver_info = (unsigned long) &ax88772_info,
+ },
+       { },            // END
+ };
+diff --git a/drivers/scsi/libsas/sas_port.c b/drivers/scsi/libsas/sas_port.c
+index 139935a..ad02d57 100644
+--- a/drivers/scsi/libsas/sas_port.c
++++ b/drivers/scsi/libsas/sas_port.c
+@@ -56,7 +56,7 @@ static void sas_form_port(struct asd_sas_phy *phy)
+               }
+       }
+-      /* find a port */
++      /* see if the phy should be part of a wide port */
+       spin_lock_irqsave(&sas_ha->phy_port_lock, flags);
+       for (i = 0; i < sas_ha->num_phys; i++) {
+               port = sas_ha->sas_port[i];
+@@ -69,12 +69,23 @@ static void sas_form_port(struct asd_sas_phy *phy)
+                       SAS_DPRINTK("phy%d matched wide port%d\n", phy->id,
+                                   port->id);
+                       break;
+-              } else if (*(u64 *) port->sas_addr == 0 && port->num_phys==0) {
+-                      memcpy(port->sas_addr, phy->sas_addr, SAS_ADDR_SIZE);
+-                      break;
+               }
+               spin_unlock(&port->phy_list_lock);
+       }
++      /* The phy does not match any existing port, create a new one */
++      if (i == sas_ha->num_phys) {
++              for (i = 0; i < sas_ha->num_phys; i++) {
++                      port = sas_ha->sas_port[i];
++                      spin_lock(&port->phy_list_lock);
++                      if (*(u64 *)port->sas_addr == 0
++                              && port->num_phys == 0) {
++                              memcpy(port->sas_addr, phy->sas_addr,
++                                      SAS_ADDR_SIZE);
++                              break;
++                      }
++                      spin_unlock(&port->phy_list_lock);
++              }
++      }
+       if (i >= sas_ha->num_phys) {
+               printk(KERN_NOTICE "%s: couldn't find a free port, bug?\n",
+diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
+index 1ff88af..33b2935 100644
+--- a/drivers/usb/core/devio.c
++++ b/drivers/usb/core/devio.c
+@@ -579,7 +579,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
+       if (!ps)
+               goto out;
+-      ret = -ENOENT;
++      ret = -ENODEV;
+       /* usbdev device-node */
+       if (imajor(inode) == USB_DEVICE_MAJOR)
+@@ -1305,7 +1305,8 @@ static int get_urb32(struct usbdevfs_urb *kurb,
+                    struct usbdevfs_urb32 __user *uurb)
+ {
+       __u32  uptr;
+-      if (get_user(kurb->type, &uurb->type) ||
++      if (!access_ok(VERIFY_READ, uurb, sizeof(*uurb)) ||
++          __get_user(kurb->type, &uurb->type) ||
+           __get_user(kurb->endpoint, &uurb->endpoint) ||
+           __get_user(kurb->status, &uurb->status) ||
+           __get_user(kurb->flags, &uurb->flags) ||
+@@ -1522,8 +1523,9 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
+       u32 udata;
+       uioc = compat_ptr((long)arg);
+-      if (get_user(ctrl.ifno, &uioc->ifno) ||
+-          get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
++      if (!access_ok(VERIFY_READ, uioc, sizeof(*uioc)) ||
++          __get_user(ctrl.ifno, &uioc->ifno) ||
++          __get_user(ctrl.ioctl_code, &uioc->ioctl_code) ||
+           __get_user(udata, &uioc->data))
+               return -EFAULT;
+       ctrl.data = compat_ptr(udata);
+diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c
+index 13b34bc..c3089c9 100644
+--- a/drivers/usb/serial/ftdi_sio.c
++++ b/drivers/usb/serial/ftdi_sio.c
+@@ -663,6 +663,9 @@ static struct usb_device_id id_table_combined [] = {
+       { USB_DEVICE(ADI_VID, ADI_GNICE_PID),
+               .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { USB_DEVICE(JETI_VID, JETI_SPC1201_PID) },
++      { USB_DEVICE(BAYER_VID, BAYER_CONTOUR_CABLE_PID) },
++      { USB_DEVICE(FTDI_VID, MARVELL_OPENRD_PID),
++              .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk },
+       { },                                    /* Optional parameter entry */
+       { }                                     /* Terminating entry */
+ };
+diff --git a/drivers/usb/serial/ftdi_sio.h b/drivers/usb/serial/ftdi_sio.h
+index 3425122..c1a6be7 100644
+--- a/drivers/usb/serial/ftdi_sio.h
++++ b/drivers/usb/serial/ftdi_sio.h
+@@ -897,6 +897,20 @@
+ #define JETI_SPC1201_PID      0x04b2
+ /*
++ * Bayer Ascensia Contour blood glucose meter USB-converter cable.
++ * http://winglucofacts.com/cables/
++ */
++#define BAYER_VID                      0x1A79
++#define BAYER_CONTOUR_CABLE_PID        0x6001
++
++/*
++ * Marvell OpenRD Base, Client
++ * http://www.open-rd.org
++ * OpenRD Base, Client use VID 0x0403
++ */
++#define MARVELL_OPENRD_PID    0x9e90
++
++/*
+  *   BmRequestType:  1100 0000b
+  *   bRequest:       FTDI_E2_READ
+  *   wValue:         0
+diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c
+index 861e308..5d4f9d6 100644
+--- a/drivers/usb/storage/transport.c
++++ b/drivers/usb/storage/transport.c
+@@ -961,7 +961,7 @@ int usb_stor_Bulk_max_lun(struct us_data *us)
+                                US_BULK_GET_MAX_LUN, 
+                                USB_DIR_IN | USB_TYPE_CLASS | 
+                                USB_RECIP_INTERFACE,
+-                               0, us->ifnum, us->iobuf, 1, HZ);
++                               0, us->ifnum, us->iobuf, 1, 10*HZ);
+       US_DEBUGP("GetMaxLUN command result is %d, data is %d\n", 
+                 result, us->iobuf[0]);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 65115a5..17e9626 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -989,6 +989,13 @@ UNUSUAL_DEV( 0x066f, 0x8000, 0x0001, 0x0001,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
++/* Reported by Rogerio Brito <rbrito@ime.usp.br> */
++UNUSUAL_DEV( 0x067b, 0x2317, 0x0001, 0x001,
++              "Prolific Technology, Inc.",
++              "Mass Storage Device",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_NOT_LOCKABLE ),
++
+ /* Reported by Richard -=[]=- <micro_flyer@hotmail.com> */
+ /* Change to bcdDeviceMin (0x0100 to 0x0001) reported by
+  * Thomas Bartosik <tbartdev@gmx-topmail.de> */
+diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
+index dfc0197..25200e6 100644
+--- a/fs/binfmt_flat.c
++++ b/fs/binfmt_flat.c
+@@ -824,15 +824,22 @@ static int load_flat_shared_library(int id, struct lib_info *libs)
+       if (IS_ERR(bprm.file))
+               return res;
++      bprm.cred = prepare_exec_creds();
++      res = -ENOMEM;
++      if (!bprm.cred)
++              goto out;
++
+       res = prepare_binprm(&bprm);
+       if (res <= (unsigned long)-4096)
+               res = load_flat_file(&bprm, libs, id, NULL);
+-      if (bprm.file) {
+-              allow_write_access(bprm.file);
+-              fput(bprm.file);
+-              bprm.file = NULL;
+-      }
++
++      abort_creds(bprm.cred);
++
++out:
++      allow_write_access(bprm.file);
++      fput(bprm.file);
++
+       return(res);
+ }
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index 61cb48f..994ca87 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -1910,6 +1910,7 @@ COMPATIBLE_IOCTL(FIONCLEX)
+ COMPATIBLE_IOCTL(FIOASYNC)
+ COMPATIBLE_IOCTL(FIONBIO)
+ COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
++COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
+ /* 0x00 */
+ COMPATIBLE_IOCTL(FIBMAP)
+ COMPATIBLE_IOCTL(FIGETBSZ)
+diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
+index 08f6b04..630feb3 100644
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -255,7 +255,7 @@ static void nfs_direct_read_release(void *calldata)
+       if (put_dreq(dreq))
+               nfs_direct_complete(dreq);
+-      nfs_readdata_release(calldata);
++      nfs_readdata_free(data);
+ }
+ static const struct rpc_call_ops nfs_read_direct_ops = {
+@@ -311,14 +311,14 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
+                                       data->npages, 1, 0, data->pagevec, NULL);
+               up_read(&current->mm->mmap_sem);
+               if (result < 0) {
+-                      nfs_readdata_release(data);
++                      nfs_readdata_free(data);
+                       break;
+               }
+               if ((unsigned)result < data->npages) {
+                       bytes = result * PAGE_SIZE;
+                       if (bytes <= pgbase) {
+                               nfs_direct_release_pages(data->pagevec, result);
+-                              nfs_readdata_release(data);
++                              nfs_readdata_free(data);
+                               break;
+                       }
+                       bytes -= pgbase;
+@@ -331,7 +331,7 @@ static ssize_t nfs_direct_read_schedule_segment(struct nfs_direct_req *dreq,
+               data->inode = inode;
+               data->cred = msg.rpc_cred;
+               data->args.fh = NFS_FH(inode);
+-              data->args.context = get_nfs_open_context(ctx);
++              data->args.context = ctx;
+               data->args.offset = pos;
+               data->args.pgbase = pgbase;
+               data->args.pages = data->pagevec;
+@@ -438,7 +438,7 @@ static void nfs_direct_free_writedata(struct nfs_direct_req *dreq)
+               struct nfs_write_data *data = list_entry(dreq->rewrite_list.next, struct nfs_write_data, pages);
+               list_del(&data->pages);
+               nfs_direct_release_pages(data->pagevec, data->npages);
+-              nfs_writedata_release(data);
++              nfs_writedata_free(data);
+       }
+ }
+@@ -531,7 +531,7 @@ static void nfs_direct_commit_release(void *calldata)
+       dprintk("NFS: %5u commit returned %d\n", data->task.tk_pid, status);
+       nfs_direct_write_complete(dreq, data->inode);
+-      nfs_commitdata_release(calldata);
++      nfs_commit_free(data);
+ }
+ static const struct rpc_call_ops nfs_commit_direct_ops = {
+@@ -564,7 +564,7 @@ static void nfs_direct_commit_schedule(struct nfs_direct_req *dreq)
+       data->args.fh = NFS_FH(data->inode);
+       data->args.offset = 0;
+       data->args.count = 0;
+-      data->args.context = get_nfs_open_context(dreq->ctx);
++      data->args.context = dreq->ctx;
+       data->res.count = 0;
+       data->res.fattr = &data->fattr;
+       data->res.verf = &data->verf;
+@@ -725,14 +725,14 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
+                                       data->npages, 0, 0, data->pagevec, NULL);
+               up_read(&current->mm->mmap_sem);
+               if (result < 0) {
+-                      nfs_writedata_release(data);
++                      nfs_writedata_free(data);
+                       break;
+               }
+               if ((unsigned)result < data->npages) {
+                       bytes = result * PAGE_SIZE;
+                       if (bytes <= pgbase) {
+                               nfs_direct_release_pages(data->pagevec, result);
+-                              nfs_writedata_release(data);
++                              nfs_writedata_free(data);
+                               break;
+                       }
+                       bytes -= pgbase;
+@@ -747,7 +747,7 @@ static ssize_t nfs_direct_write_schedule_segment(struct nfs_direct_req *dreq,
+               data->inode = inode;
+               data->cred = msg.rpc_cred;
+               data->args.fh = NFS_FH(inode);
+-              data->args.context = get_nfs_open_context(ctx);
++              data->args.context = ctx;
+               data->args.offset = pos;
+               data->args.pgbase = pgbase;
+               data->args.pages = data->pagevec;
+diff --git a/fs/nfs/read.c b/fs/nfs/read.c
+index f856004..ff41222 100644
+--- a/fs/nfs/read.c
++++ b/fs/nfs/read.c
+@@ -58,17 +58,15 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
+       return p;
+ }
+-static void nfs_readdata_free(struct nfs_read_data *p)
++void nfs_readdata_free(struct nfs_read_data *p)
+ {
+       if (p && (p->pagevec != &p->page_array[0]))
+               kfree(p->pagevec);
+       mempool_free(p, nfs_rdata_mempool);
+ }
+-void nfs_readdata_release(void *data)
++static void nfs_readdata_release(struct nfs_read_data *rdata)
+ {
+-      struct nfs_read_data *rdata = data;
+-
+       put_nfs_open_context(rdata->args.context);
+       nfs_readdata_free(rdata);
+ }
+diff --git a/fs/nfs/write.c b/fs/nfs/write.c
+index 3229e21..84f4e75 100644
+--- a/fs/nfs/write.c
++++ b/fs/nfs/write.c
+@@ -84,17 +84,15 @@ struct nfs_write_data *nfs_writedata_alloc(unsigned int pagecount)
+       return p;
+ }
+-static void nfs_writedata_free(struct nfs_write_data *p)
++void nfs_writedata_free(struct nfs_write_data *p)
+ {
+       if (p && (p->pagevec != &p->page_array[0]))
+               kfree(p->pagevec);
+       mempool_free(p, nfs_wdata_mempool);
+ }
+-void nfs_writedata_release(void *data)
++static void nfs_writedata_release(struct nfs_write_data *wdata)
+ {
+-      struct nfs_write_data *wdata = data;
+-
+       put_nfs_open_context(wdata->args.context);
+       nfs_writedata_free(wdata);
+ }
+diff --git a/fs/proc/base.c b/fs/proc/base.c
+index a488f61..76f9ffc 100644
+--- a/fs/proc/base.c
++++ b/fs/proc/base.c
+@@ -240,22 +240,19 @@ static int check_mem_permission(struct task_struct *task)
+ struct mm_struct *mm_for_maps(struct task_struct *task)
+ {
+       struct mm_struct *mm = get_task_mm(task);
+-      if (!mm)
+-              return NULL;
+-      down_read(&mm->mmap_sem);
+-      task_lock(task);
+-      if (task->mm != mm)
+-              goto out;
+-      if (task->mm != current->mm &&
+-          __ptrace_may_access(task, PTRACE_MODE_READ) < 0)
+-              goto out;
+-      task_unlock(task);
++
++      if (mm && mm != current->mm) {
++              /*
++               * task->mm can be changed before security check,
++               * in that case we must notice the change after.
++               */
++              if (!ptrace_may_access(task, PTRACE_MODE_READ) ||
++                  mm != task->mm) {
++                      mmput(mm);
++                      mm = NULL;
++              }
++      }
+       return mm;
+-out:
+-      task_unlock(task);
+-      up_read(&mm->mmap_sem);
+-      mmput(mm);
+-      return NULL;
+ }
+ static int proc_pid_cmdline(struct task_struct *task, char * buffer)
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index c7f64a9..d8be92a 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -119,6 +119,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
+       mm = mm_for_maps(priv->task);
+       if (!mm)
+               return NULL;
++      down_read(&mm->mmap_sem);
+       tail_vma = get_gate_vma(priv->task);
+       priv->tail_vma = tail_vma;
+diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c
+index 5d84e71..737d219 100644
+--- a/fs/proc/task_nommu.c
++++ b/fs/proc/task_nommu.c
+@@ -137,6 +137,7 @@ static void *m_start(struct seq_file *m, loff_t *pos)
+               priv->task = NULL;
+               return NULL;
+       }
++      down_read(&mm->mmap_sem);
+       /* start from the Nth VMA */
+       for (vml = mm->context.vmlist; vml; vml = vml->next)
+diff --git a/fs/sysfs/dir.c b/fs/sysfs/dir.c
+index aedaeba..6def64c 100644
+--- a/fs/sysfs/dir.c
++++ b/fs/sysfs/dir.c
+@@ -914,8 +914,10 @@ again:
+       /* Remove from old parent's list and insert into new parent's list. */
+       sysfs_unlink_sibling(sd);
+       sysfs_get(new_parent_sd);
++      drop_nlink(old_parent->d_inode);
+       sysfs_put(sd->s_parent);
+       sd->s_parent = new_parent_sd;
++      inc_nlink(new_parent->d_inode);
+       sysfs_link_sibling(sd);
+  out_unlock:
+diff --git a/include/asm-parisc/tlbflush.h b/include/asm-parisc/tlbflush.h
+index 1f6fd4f..9c5d646 100644
+--- a/include/asm-parisc/tlbflush.h
++++ b/include/asm-parisc/tlbflush.h
+@@ -12,14 +12,12 @@
+  * N class systems, only one PxTLB inter processor broadcast can be
+  * active at any one time on the Merced bus.  This tlb purge
+  * synchronisation is fairly lightweight and harmless so we activate
+- * it on all SMP systems not just the N class.  We also need to have
+- * preemption disabled on uniprocessor machines, and spin_lock does that
+- * nicely.
++ * it on all systems not just the N class.
+  */
+ extern spinlock_t pa_tlb_lock;
+-#define purge_tlb_start(x) spin_lock(&pa_tlb_lock)
+-#define purge_tlb_end(x) spin_unlock(&pa_tlb_lock)
++#define purge_tlb_start(flags)        spin_lock_irqsave(&pa_tlb_lock, flags)
++#define purge_tlb_end(flags)  spin_unlock_irqrestore(&pa_tlb_lock, flags)
+ extern void flush_tlb_all(void);
+ extern void flush_tlb_all_local(void *);
+@@ -63,14 +61,15 @@ static inline void flush_tlb_mm(struct mm_struct *mm)
+ static inline void flush_tlb_page(struct vm_area_struct *vma,
+       unsigned long addr)
+ {
++      unsigned long flags;
+       /* For one page, it's not worth testing the split_tlb variable */
+       mb();
+       mtsp(vma->vm_mm->context,1);
+-      purge_tlb_start();
++      purge_tlb_start(flags);
+       pdtlb(addr);
+       pitlb(addr);
+-      purge_tlb_end();
++      purge_tlb_end(flags);
+ }
+ void __flush_tlb_range(unsigned long sid,
+diff --git a/include/asm-x86/irqflags.h b/include/asm-x86/irqflags.h
+index 424acb4..f57f2fb 100644
+--- a/include/asm-x86/irqflags.h
++++ b/include/asm-x86/irqflags.h
+@@ -12,9 +12,15 @@ static inline unsigned long native_save_fl(void)
+ {
+       unsigned long flags;
++      /*
++       * Note: this needs to be "=r" not "=rm", because we have the
++       * stack offset from what gcc expects at the time the "pop" is
++       * executed, and so a memory reference with respect to the stack
++       * would end up using the wrong address.
++       */
+       asm volatile("# __raw_save_flags\n\t"
+                    "pushf ; pop %0"
+-                   : "=g" (flags)
++                   : "=r" (flags)
+                    : /* no input */
+                    : "memory");
+diff --git a/include/linux/nfs_fs.h b/include/linux/nfs_fs.h
+index 78a5922..0dee17c 100644
+--- a/include/linux/nfs_fs.h
++++ b/include/linux/nfs_fs.h
+@@ -461,7 +461,6 @@ extern int  nfs_writepages(struct address_space *, struct writeback_control *);
+ extern int  nfs_flush_incompatible(struct file *file, struct page *page);
+ extern int  nfs_updatepage(struct file *, struct page *, unsigned int, unsigned int);
+ extern int nfs_writeback_done(struct rpc_task *, struct nfs_write_data *);
+-extern void nfs_writedata_release(void *);
+ /*
+  * Try to write back everything synchronously (but check the
+@@ -476,7 +475,6 @@ extern int nfs_wb_page_cancel(struct inode *inode, struct page* page);
+ extern int  nfs_commit_inode(struct inode *, int);
+ extern struct nfs_write_data *nfs_commitdata_alloc(void);
+ extern void nfs_commit_free(struct nfs_write_data *wdata);
+-extern void nfs_commitdata_release(void *wdata);
+ #else
+ static inline int
+ nfs_commit_inode(struct inode *inode, int how)
+@@ -495,6 +493,7 @@ nfs_have_writebacks(struct inode *inode)
+  * Allocate nfs_write_data structures
+  */
+ extern struct nfs_write_data *nfs_writedata_alloc(unsigned int npages);
++extern void nfs_writedata_free(struct nfs_write_data *);
+ /*
+  * linux/fs/nfs/read.c
+@@ -503,12 +502,12 @@ extern int  nfs_readpage(struct file *, struct page *);
+ extern int  nfs_readpages(struct file *, struct address_space *,
+               struct list_head *, unsigned);
+ extern int  nfs_readpage_result(struct rpc_task *, struct nfs_read_data *);
+-extern void nfs_readdata_release(void *data);
+ /*
+  * Allocate nfs_read_data structures
+  */
+ extern struct nfs_read_data *nfs_readdata_alloc(unsigned int npages);
++extern void nfs_readdata_free(struct nfs_read_data *);
+ /*
+  * linux/fs/nfs3proc.c
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 843ce75..fcbd28c 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -536,18 +536,18 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)
+        * the value intact in a core dump, and to save the unnecessary
+        * trouble otherwise.  Userland only wants this done for a sys_exit.
+        */
+-      if (tsk->clear_child_tid
+-          && !(tsk->flags & PF_SIGNALED)
+-          && atomic_read(&mm->mm_users) > 1) {
+-              u32 __user * tidptr = tsk->clear_child_tid;
++      if (tsk->clear_child_tid) {
++              if (!(tsk->flags & PF_SIGNALED) &&
++                  atomic_read(&mm->mm_users) > 1) {
++                      /*
++                       * We don't check the error code - if userspace has
++                       * not set up a proper pointer then tough luck.
++                       */
++                      put_user(0, tsk->clear_child_tid);
++                      sys_futex(tsk->clear_child_tid, FUTEX_WAKE,
++                                      1, NULL, NULL, 0);
++              }
+               tsk->clear_child_tid = NULL;
+-
+-              /*
+-               * We don't check the error code - if userspace has
+-               * not set up a proper pointer then tough luck.
+-               */
+-              put_user(0, tidptr);
+-              sys_futex(tidptr, FUTEX_WAKE, 1, NULL, NULL, 0);
+       }
+ }
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 1ecbcf6..2885674 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -2257,7 +2257,7 @@ void hugetlb_unreserve_pages(struct inode *inode, long offset, long freed)
+       long chg = region_truncate(&inode->i_mapping->private_list, offset);
+       spin_lock(&inode->i_lock);
+-      inode->i_blocks -= blocks_per_huge_page(h);
++      inode->i_blocks -= (blocks_per_huge_page(h) * freed);
+       spin_unlock(&inode->i_lock);
+       hugetlb_put_quota(inode->i_mapping, (chg - freed));
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 85799e8..c6ecf87 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -846,7 +846,7 @@ static struct page *__rmqueue(struct zone *zone, unsigned int order,
+  */
+ static int rmqueue_bulk(struct zone *zone, unsigned int order, 
+                       unsigned long count, struct list_head *list,
+-                      int migratetype)
++                      int migratetype, int cold)
+ {
+       int i;
+       
+@@ -865,7 +865,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,
+                * merge IO requests if the physical pages are ordered
+                * properly.
+                */
+-              list_add(&page->lru, list);
++              if (likely(cold == 0))
++                      list_add(&page->lru, list);
++              else
++                      list_add_tail(&page->lru, list);
+               set_page_private(page, migratetype);
+               list = &page->lru;
+       }
+@@ -1068,7 +1071,8 @@ again:
+               local_irq_save(flags);
+               if (!pcp->count) {
+                       pcp->count = rmqueue_bulk(zone, 0,
+-                                      pcp->batch, &pcp->list, migratetype);
++                                      pcp->batch, &pcp->list,
++                                      migratetype, cold);
+                       if (unlikely(!pcp->count))
+                               goto failed;
+               }
+@@ -1087,7 +1091,8 @@ again:
+               /* Allocate more to the pcp list if necessary */
+               if (unlikely(&page->lru == &pcp->list)) {
+                       pcp->count += rmqueue_bulk(zone, 0,
+-                                      pcp->batch, &pcp->list, migratetype);
++                                      pcp->batch, &pcp->list,
++                                      migratetype, cold);
+                       page = list_entry(pcp->list.next, struct page, lru);
+               }
+diff --git a/net/socket.c b/net/socket.c
+index 3e2859c..058d965 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -695,7 +695,7 @@ static ssize_t sock_sendpage(struct file *file, struct page *page,
+       if (more)
+               flags |= MSG_MORE;
+-      return sock->ops->sendpage(sock, page, offset, size, flags);
++      return kernel_sendpage(sock, page, offset, size, flags);
+ }
+ static ssize_t sock_splice_read(struct file *file, loff_t *ppos,
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.3-4 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.3-4
new file mode 100644 (file)
index 0000000..67a85c2
--- /dev/null
@@ -0,0 +1,875 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.4
+
+Upstream 2.6.27.4 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index e4b635a..7529a72 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .3
++EXTRAVERSION = .4
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/kernel/acpi/sleep.c b/arch/x86/kernel/acpi/sleep.c
+index 426e5d9..c44cd6d 100644
+--- a/arch/x86/kernel/acpi/sleep.c
++++ b/arch/x86/kernel/acpi/sleep.c
+@@ -10,6 +10,7 @@
+ #include <linux/dmi.h>
+ #include <linux/cpumask.h>
+ #include <asm/segment.h>
++#include <asm/desc.h>
+ #include "realmode/wakeup.h"
+ #include "sleep.h"
+@@ -98,6 +99,8 @@ int acpi_save_state_mem(void)
+       header->trampoline_segment = setup_trampoline() >> 4;
+ #ifdef CONFIG_SMP
+       stack_start.sp = temp_stack + 4096;
++      early_gdt_descr.address =
++                      (unsigned long)get_cpu_gdt_table(smp_processor_id());
+ #endif
+       initial_code = (unsigned long)wakeup_long64;
+       saved_magic = 0x123456789abcdef0;
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
+index a69cc0f..bccd0ef 100644
+--- a/arch/x86/kernel/amd_iommu_init.c
++++ b/arch/x86/kernel/amd_iommu_init.c
+@@ -210,7 +210,7 @@ static void __init iommu_set_exclusion_range(struct amd_iommu *iommu)
+ /* Programs the physical address of the device table into the IOMMU hardware */
+ static void __init iommu_set_device_table(struct amd_iommu *iommu)
+ {
+-      u32 entry;
++      u64 entry;
+       BUG_ON(iommu->mmio_base == NULL);
+diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
+index dba3cfb..ecb6ace 100644
+--- a/drivers/acpi/hardware/hwsleep.c
++++ b/drivers/acpi/hardware/hwsleep.c
+@@ -78,19 +78,17 @@ acpi_set_firmware_waking_vector(acpi_physical_address physical_address)
+               return_ACPI_STATUS(status);
+       }
+-      /* Set the vector */
++      /*
++       * According to the ACPI specification 2.0c and later, the 64-bit
++       * waking vector should be cleared and the 32-bit waking vector should
++       * be used, unless we want the wake-up code to be called by the BIOS in
++       * Protected Mode.  Some systems (for example HP dv5-1004nr) are known
++       * to fail to resume if the 64-bit vector is used.
++       */
++      if (facs->version >= 1)
++              facs->xfirmware_waking_vector = 0;
+-      if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
+-              /*
+-               * ACPI 1.0 FACS or short table or optional X_ field is zero
+-               */
+-              facs->firmware_waking_vector = (u32) physical_address;
+-      } else {
+-              /*
+-               * ACPI 2.0 FACS with valid X_ field
+-               */
+-              facs->xfirmware_waking_vector = physical_address;
+-      }
++      facs->firmware_waking_vector = (u32)physical_address;
+       return_ACPI_STATUS(AE_OK);
+ }
+@@ -134,20 +132,7 @@ acpi_get_firmware_waking_vector(acpi_physical_address * physical_address)
+       }
+       /* Get the vector */
+-
+-      if ((facs->length < 32) || (!(facs->xfirmware_waking_vector))) {
+-              /*
+-               * ACPI 1.0 FACS or short table or optional X_ field is zero
+-               */
+-              *physical_address =
+-                  (acpi_physical_address) facs->firmware_waking_vector;
+-      } else {
+-              /*
+-               * ACPI 2.0 FACS with valid X_ field
+-               */
+-              *physical_address =
+-                  (acpi_physical_address) facs->xfirmware_waking_vector;
+-      }
++      *physical_address = (acpi_physical_address)facs->firmware_waking_vector;
+       return_ACPI_STATUS(AE_OK);
+ }
+diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
+index d13194a..4751909 100644
+--- a/drivers/acpi/sleep/main.c
++++ b/drivers/acpi/sleep/main.c
+@@ -200,6 +200,8 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
+               break;
+       }
++      /* If ACPI is not enabled by the BIOS, we need to enable it here. */
++      acpi_enable();
+       /* Reprogram control registers and execute _BFS */
+       acpi_leave_sleep_state_prep(acpi_state);
+@@ -296,6 +298,14 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+               DMI_MATCH(DMI_BOARD_NAME, "KN9 Series(NF-CK804)"),
+               },
+       },
++      {
++      .callback = init_old_suspend_ordering,
++      .ident = "HP xw4600 Workstation",
++      .matches = {
++              DMI_MATCH(DMI_SYS_VENDOR, "Hewlett-Packard"),
++              DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
++              },
++      },
+       {},
+ };
+ #endif /* CONFIG_SUSPEND */
+diff --git a/drivers/char/hvc_console.c b/drivers/char/hvc_console.c
+index fd64137..f2e4caf 100644
+--- a/drivers/char/hvc_console.c
++++ b/drivers/char/hvc_console.c
+@@ -367,13 +367,13 @@ static void hvc_close(struct tty_struct *tty, struct file * filp)
+       spin_lock_irqsave(&hp->lock, flags);
+       if (--hp->count == 0) {
+-              if (hp->ops->notifier_del)
+-                      hp->ops->notifier_del(hp, hp->data);
+-
+               /* We are done with the tty pointer now. */
+               hp->tty = NULL;
+               spin_unlock_irqrestore(&hp->lock, flags);
++              if (hp->ops->notifier_del)
++                      hp->ops->notifier_del(hp, hp->data);
++
+               /*
+                * Chain calls chars_in_buffer() and returns immediately if
+                * there is no buffered data otherwise sleeps on a wait queue
+@@ -416,11 +416,11 @@ static void hvc_hangup(struct tty_struct *tty)
+       hp->n_outbuf = 0;
+       hp->tty = NULL;
++      spin_unlock_irqrestore(&hp->lock, flags);
++
+       if (hp->ops->notifier_del)
+                       hp->ops->notifier_del(hp, hp->data);
+-      spin_unlock_irqrestore(&hp->lock, flags);
+-
+       while(temp_open_count) {
+               --temp_open_count;
+               kref_put(&hp->kref, destroy_hvc_struct);
+diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
+index 0e024fe..887072f 100644
+--- a/drivers/edac/cell_edac.c
++++ b/drivers/edac/cell_edac.c
+@@ -142,7 +142,7 @@ static void __devinit cell_edac_init_csrows(struct mem_ctl_info *mci)
+               csrow->nr_pages = (r.end - r.start + 1) >> PAGE_SHIFT;
+               csrow->last_page = csrow->first_page + csrow->nr_pages - 1;
+               csrow->mtype = MEM_XDR;
+-              csrow->edac_mode = EDAC_FLAG_EC | EDAC_FLAG_SECDED;
++              csrow->edac_mode = EDAC_SECDED;
+               dev_dbg(mci->dev,
+                       "Initialized on node %d, chanmask=0x%x,"
+                       " first_page=0x%lx, nr_pages=0x%x\n",
+diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
+index 8d29405..59f6ad8 100644
+--- a/drivers/gpio/gpiolib.c
++++ b/drivers/gpio/gpiolib.c
+@@ -1020,7 +1020,7 @@ int gpio_get_value_cansleep(unsigned gpio)
+       might_sleep_if(extra_checks);
+       chip = gpio_to_chip(gpio);
+-      return chip->get(chip, gpio - chip->base);
++      return chip->get ? chip->get(chip, gpio - chip->base) : 0;
+ }
+ EXPORT_SYMBOL_GPL(gpio_get_value_cansleep);
+diff --git a/drivers/md/dm-kcopyd.c b/drivers/md/dm-kcopyd.c
+index 996802b..8f15353 100644
+--- a/drivers/md/dm-kcopyd.c
++++ b/drivers/md/dm-kcopyd.c
+@@ -268,6 +268,17 @@ static void push(struct list_head *jobs, struct kcopyd_job *job)
+       spin_unlock_irqrestore(&kc->job_lock, flags);
+ }
++
++static void push_head(struct list_head *jobs, struct kcopyd_job *job)
++{
++      unsigned long flags;
++      struct dm_kcopyd_client *kc = job->kc;
++
++      spin_lock_irqsave(&kc->job_lock, flags);
++      list_add(&job->list, jobs);
++      spin_unlock_irqrestore(&kc->job_lock, flags);
++}
++
+ /*
+  * These three functions process 1 item from the corresponding
+  * job list.
+@@ -398,7 +409,7 @@ static int process_jobs(struct list_head *jobs, struct dm_kcopyd_client *kc,
+                        * We couldn't service this job ATM, so
+                        * push this job back onto the list.
+                        */
+-                      push(jobs, job);
++                      push_head(jobs, job);
+                       break;
+               }
+diff --git a/drivers/md/dm-snap.c b/drivers/md/dm-snap.c
+index 6e5528a..4ed9b7a 100644
+--- a/drivers/md/dm-snap.c
++++ b/drivers/md/dm-snap.c
+@@ -824,8 +824,10 @@ static struct bio *put_pending_exception(struct dm_snap_pending_exception *pe)
+        * the bios for the original write to the origin.
+        */
+       if (primary_pe &&
+-          atomic_dec_and_test(&primary_pe->ref_count))
++          atomic_dec_and_test(&primary_pe->ref_count)) {
+               origin_bios = bio_list_get(&primary_pe->origin_bios);
++              free_pending_exception(primary_pe);
++      }
+       /*
+        * Free the pe if it's not linked to an origin write or if
+@@ -834,12 +836,6 @@ static struct bio *put_pending_exception(struct dm_snap_pending_exception *pe)
+       if (!primary_pe || primary_pe != pe)
+               free_pending_exception(pe);
+-      /*
+-       * Free the primary pe if nothing references it.
+-       */
+-      if (primary_pe && !atomic_read(&primary_pe->ref_count))
+-              free_pending_exception(primary_pe);
+-
+       return origin_bios;
+ }
+diff --git a/drivers/media/video/pvrusb2/pvrusb2-hdw.c b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+index f051c6a..7412258 100644
+--- a/drivers/media/video/pvrusb2/pvrusb2-hdw.c
++++ b/drivers/media/video/pvrusb2/pvrusb2-hdw.c
+@@ -60,7 +60,6 @@ static struct pvr2_hdw *unit_pointers[PVR_NUM] = {[ 0 ... PVR_NUM-1 ] = NULL};
+ static DEFINE_MUTEX(pvr2_unit_mtx);
+ static int ctlchg;
+-static int initusbreset = 1;
+ static int procreload;
+ static int tuner[PVR_NUM] = { [0 ... PVR_NUM-1] = -1 };
+ static int tolerance[PVR_NUM] = { [0 ... PVR_NUM-1] = 0 };
+@@ -71,8 +70,6 @@ module_param(ctlchg, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(ctlchg, "0=optimize ctl change 1=always accept new ctl value");
+ module_param(init_pause_msec, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(init_pause_msec, "hardware initialization settling delay");
+-module_param(initusbreset, int, S_IRUGO|S_IWUSR);
+-MODULE_PARM_DESC(initusbreset, "Do USB reset device on probe");
+ module_param(procreload, int, S_IRUGO|S_IWUSR);
+ MODULE_PARM_DESC(procreload,
+                "Attempt init failure recovery with firmware reload");
+@@ -1698,9 +1695,6 @@ static void pvr2_hdw_setup_low(struct pvr2_hdw *hdw)
+       }
+       hdw->fw1_state = FW1_STATE_OK;
+-      if (initusbreset) {
+-              pvr2_hdw_device_reset(hdw);
+-      }
+       if (!pvr2_hdw_dev_ok(hdw)) return;
+       for (idx = 0; idx < hdw->hdw_desc->client_modules.cnt; idx++) {
+diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c
+index 54defec..87a68d2 100644
+--- a/drivers/pci/hotplug/cpqphp_core.c
++++ b/drivers/pci/hotplug/cpqphp_core.c
+@@ -435,7 +435,7 @@ static int ctrl_slot_setup(struct controller *ctrl,
+                               slot->number, ctrl->slot_device_offset,
+                               slot_number);
+               result = pci_hp_register(hotplug_slot,
+-                                       ctrl->pci_dev->subordinate,
++                                       ctrl->pci_dev->bus,
+                                        slot->device);
+               if (result) {
+                       err("pci_hp_register failed with error %d\n", result);
+diff --git a/drivers/scsi/device_handler/scsi_dh_rdac.c b/drivers/scsi/device_handler/scsi_dh_rdac.c
+index 6e2f130..d576d4c 100644
+--- a/drivers/scsi/device_handler/scsi_dh_rdac.c
++++ b/drivers/scsi/device_handler/scsi_dh_rdac.c
+@@ -590,6 +590,8 @@ static const struct scsi_dh_devlist rdac_dev_list[] = {
+       {"STK", "OPENstorage D280"},
+       {"SUN", "CSM200_R"},
+       {"SUN", "LCSM100_F"},
++      {"DELL", "MD3000"},
++      {"DELL", "MD3000i"},
+       {NULL, NULL},
+ };
+diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c
+index 76fce44..3e86240 100644
+--- a/drivers/usb/atm/speedtch.c
++++ b/drivers/usb/atm/speedtch.c
+@@ -722,6 +722,16 @@ static void speedtch_atm_stop(struct usbatm_data *usbatm, struct atm_dev *atm_de
+       flush_scheduled_work();
+ }
++static int speedtch_pre_reset(struct usb_interface *intf)
++{
++      return 0;
++}
++
++static int speedtch_post_reset(struct usb_interface *intf)
++{
++      return 0;
++}
++
+ /**********
+ **  USB  **
+@@ -740,6 +750,8 @@ static struct usb_driver speedtch_usb_driver = {
+       .name           = speedtch_driver_name,
+       .probe          = speedtch_usb_probe,
+       .disconnect     = usbatm_usb_disconnect,
++      .pre_reset      = speedtch_pre_reset,
++      .post_reset     = speedtch_post_reset,
+       .id_table       = speedtch_usb_ids
+ };
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index c257453..d996a61 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -849,9 +849,10 @@ static void acm_write_buffers_free(struct acm *acm)
+ {
+       int i;
+       struct acm_wb *wb;
++      struct usb_device *usb_dev = interface_to_usbdev(acm->control);
+       for (wb = &acm->wb[0], i = 0; i < ACM_NW; i++, wb++) {
+-              usb_buffer_free(acm->dev, acm->writesize, wb->buf, wb->dmah);
++              usb_buffer_free(usb_dev, acm->writesize, wb->buf, wb->dmah);
+       }
+ }
+diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c
+index 7e8e123..023a4e9 100644
+--- a/drivers/usb/class/cdc-wdm.c
++++ b/drivers/usb/class/cdc-wdm.c
+@@ -42,6 +42,8 @@ static struct usb_device_id wdm_ids[] = {
+       { }
+ };
++MODULE_DEVICE_TABLE (usb, wdm_ids);
++
+ #define WDM_MINOR_BASE        176
+diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c
+index 5a7fa6f..9f42cb8 100644
+--- a/drivers/usb/core/driver.c
++++ b/drivers/usb/core/driver.c
+@@ -1609,7 +1609,8 @@ int usb_external_resume_device(struct usb_device *udev)
+       status = usb_resume_both(udev);
+       udev->last_busy = jiffies;
+       usb_pm_unlock(udev);
+-      do_unbind_rebind(udev, DO_REBIND);
++      if (status == 0)
++              do_unbind_rebind(udev, DO_REBIND);
+       /* Now that the device is awake, we can start trying to autosuspend
+        * it again. */
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index d999638..875de9a 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -3424,7 +3424,7 @@ int usb_reset_device(struct usb_device *udev)
+                                               USB_INTERFACE_BOUND)
+                                       rebind = 1;
+                       }
+-                      if (rebind)
++                      if (ret == 0 && rebind)
+                               usb_rebind_intf(cintf);
+               }
+       }
+diff --git a/fs/cifs/readdir.c b/fs/cifs/readdir.c
+index 765adf1..58d5729 100644
+--- a/fs/cifs/readdir.c
++++ b/fs/cifs/readdir.c
+@@ -762,14 +762,15 @@ static int find_cifs_entry(const int xid, struct cifsTconInfo *pTcon,
+                                rc));
+                       return rc;
+               }
++              cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
+       }
+       while ((index_to_find >= cifsFile->srch_inf.index_of_last_entry) &&
+             (rc == 0) && !cifsFile->srch_inf.endOfSearch) {
+               cFYI(1, ("calling findnext2"));
+-              cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
+               rc = CIFSFindNext(xid, pTcon, cifsFile->netfid,
+                                 &cifsFile->srch_inf);
++              cifs_save_resume_key(cifsFile->srch_inf.last_entry, cifsFile);
+               if (rc)
+                       return -ENOENT;
+       }
+diff --git a/fs/ext2/dir.c b/fs/ext2/dir.c
+index a78c6b4..11a49ce 100644
+--- a/fs/ext2/dir.c
++++ b/fs/ext2/dir.c
+@@ -103,7 +103,7 @@ static int ext2_commit_chunk(struct page *page, loff_t pos, unsigned len)
+       return err;
+ }
+-static void ext2_check_page(struct page *page)
++static void ext2_check_page(struct page *page, int quiet)
+ {
+       struct inode *dir = page->mapping->host;
+       struct super_block *sb = dir->i_sb;
+@@ -146,10 +146,10 @@ out:
+       /* Too bad, we had an error */
+ Ebadsize:
+-      ext2_error(sb, "ext2_check_page",
+-              "size of directory #%lu is not a multiple of chunk size",
+-              dir->i_ino
+-      );
++      if (!quiet)
++              ext2_error(sb, __func__,
++                      "size of directory #%lu is not a multiple "
++                      "of chunk size", dir->i_ino);
+       goto fail;
+ Eshort:
+       error = "rec_len is smaller than minimal";
+@@ -166,32 +166,36 @@ Espan:
+ Einumber:
+       error = "inode out of bounds";
+ bad_entry:
+-      ext2_error (sb, "ext2_check_page", "bad entry in directory #%lu: %s - "
+-              "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
+-              dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
+-              (unsigned long) le32_to_cpu(p->inode),
+-              rec_len, p->name_len);
++      if (!quiet)
++              ext2_error(sb, __func__, "bad entry in directory #%lu: : %s - "
++                      "offset=%lu, inode=%lu, rec_len=%d, name_len=%d",
++                      dir->i_ino, error, (page->index<<PAGE_CACHE_SHIFT)+offs,
++                      (unsigned long) le32_to_cpu(p->inode),
++                      rec_len, p->name_len);
+       goto fail;
+ Eend:
+-      p = (ext2_dirent *)(kaddr + offs);
+-      ext2_error (sb, "ext2_check_page",
+-              "entry in directory #%lu spans the page boundary"
+-              "offset=%lu, inode=%lu",
+-              dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
+-              (unsigned long) le32_to_cpu(p->inode));
++      if (!quiet) {
++              p = (ext2_dirent *)(kaddr + offs);
++              ext2_error(sb, "ext2_check_page",
++                      "entry in directory #%lu spans the page boundary"
++                      "offset=%lu, inode=%lu",
++                      dir->i_ino, (page->index<<PAGE_CACHE_SHIFT)+offs,
++                      (unsigned long) le32_to_cpu(p->inode));
++      }
+ fail:
+       SetPageChecked(page);
+       SetPageError(page);
+ }
+-static struct page * ext2_get_page(struct inode *dir, unsigned long n)
++static struct page * ext2_get_page(struct inode *dir, unsigned long n,
++                                 int quiet)
+ {
+       struct address_space *mapping = dir->i_mapping;
+       struct page *page = read_mapping_page(mapping, n, NULL);
+       if (!IS_ERR(page)) {
+               kmap(page);
+               if (!PageChecked(page))
+-                      ext2_check_page(page);
++                      ext2_check_page(page, quiet);
+               if (PageError(page))
+                       goto fail;
+       }
+@@ -292,7 +296,7 @@ ext2_readdir (struct file * filp, void * dirent, filldir_t filldir)
+       for ( ; n < npages; n++, offset = 0) {
+               char *kaddr, *limit;
+               ext2_dirent *de;
+-              struct page *page = ext2_get_page(inode, n);
++              struct page *page = ext2_get_page(inode, n, 0);
+               if (IS_ERR(page)) {
+                       ext2_error(sb, __func__,
+@@ -361,6 +365,7 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
+       struct page *page = NULL;
+       struct ext2_inode_info *ei = EXT2_I(dir);
+       ext2_dirent * de;
++      int dir_has_error = 0;
+       if (npages == 0)
+               goto out;
+@@ -374,7 +379,7 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
+       n = start;
+       do {
+               char *kaddr;
+-              page = ext2_get_page(dir, n);
++              page = ext2_get_page(dir, n, dir_has_error);
+               if (!IS_ERR(page)) {
+                       kaddr = page_address(page);
+                       de = (ext2_dirent *) kaddr;
+@@ -391,7 +396,9 @@ struct ext2_dir_entry_2 * ext2_find_entry (struct inode * dir,
+                               de = ext2_next_entry(de);
+                       }
+                       ext2_put_page(page);
+-              }
++              } else
++                      dir_has_error = 1;
++
+               if (++n >= npages)
+                       n = 0;
+               /* next page is past the blocks we've got */
+@@ -414,7 +421,7 @@ found:
+ struct ext2_dir_entry_2 * ext2_dotdot (struct inode *dir, struct page **p)
+ {
+-      struct page *page = ext2_get_page(dir, 0);
++      struct page *page = ext2_get_page(dir, 0, 0);
+       ext2_dirent *de = NULL;
+       if (!IS_ERR(page)) {
+@@ -487,7 +494,7 @@ int ext2_add_link (struct dentry *dentry, struct inode *inode)
+       for (n = 0; n <= npages; n++) {
+               char *dir_end;
+-              page = ext2_get_page(dir, n);
++              page = ext2_get_page(dir, n, 0);
+               err = PTR_ERR(page);
+               if (IS_ERR(page))
+                       goto out;
+@@ -655,14 +662,17 @@ int ext2_empty_dir (struct inode * inode)
+ {
+       struct page *page = NULL;
+       unsigned long i, npages = dir_pages(inode);
++      int dir_has_error = 0;
+       for (i = 0; i < npages; i++) {
+               char *kaddr;
+               ext2_dirent * de;
+-              page = ext2_get_page(inode, i);
++              page = ext2_get_page(inode, i, dir_has_error);
+-              if (IS_ERR(page))
++              if (IS_ERR(page)) {
++                      dir_has_error = 1;
+                       continue;
++              }
+               kaddr = page_address(page);
+               de = (ext2_dirent *)kaddr;
+diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c
+index 2eea96e..1b80f1c 100644
+--- a/fs/ext3/dir.c
++++ b/fs/ext3/dir.c
+@@ -102,6 +102,7 @@ static int ext3_readdir(struct file * filp,
+       int err;
+       struct inode *inode = filp->f_path.dentry->d_inode;
+       int ret = 0;
++      int dir_has_error = 0;
+       sb = inode->i_sb;
+@@ -148,9 +149,12 @@ static int ext3_readdir(struct file * filp,
+                * of recovering data when there's a bad sector
+                */
+               if (!bh) {
+-                      ext3_error (sb, "ext3_readdir",
+-                              "directory #%lu contains a hole at offset %lu",
+-                              inode->i_ino, (unsigned long)filp->f_pos);
++                      if (!dir_has_error) {
++                              ext3_error(sb, __func__, "directory #%lu "
++                                      "contains a hole at offset %lld",
++                                      inode->i_ino, filp->f_pos);
++                              dir_has_error = 1;
++                      }
+                       /* corrupt size?  Maybe no more blocks to read */
+                       if (filp->f_pos > inode->i_blocks << 9)
+                               break;
+diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
+index ec8e33b..d1d6487 100644
+--- a/fs/ext4/dir.c
++++ b/fs/ext4/dir.c
+@@ -102,6 +102,7 @@ static int ext4_readdir(struct file * filp,
+       int err;
+       struct inode *inode = filp->f_path.dentry->d_inode;
+       int ret = 0;
++      int dir_has_error = 0;
+       sb = inode->i_sb;
+@@ -148,9 +149,13 @@ static int ext4_readdir(struct file * filp,
+                * of recovering data when there's a bad sector
+                */
+               if (!bh) {
+-                      ext4_error (sb, "ext4_readdir",
+-                              "directory #%lu contains a hole at offset %lu",
+-                              inode->i_ino, (unsigned long)filp->f_pos);
++                      if (!dir_has_error) {
++                              ext4_error(sb, __func__, "directory #%lu "
++                                         "contains a hole at offset %Lu",
++                                         inode->i_ino,
++                                         (unsigned long long) filp->f_pos);
++                              dir_has_error = 1;
++                      }
+                       /* corrupt size?  Maybe no more blocks to read */
+                       if (filp->f_pos > inode->i_blocks << 9)
+                               break;
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 73d1891..f3ada04 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -198,11 +198,8 @@ static int do_maps_open(struct inode *inode, struct file *file,
+       return ret;
+ }
+-static int show_map(struct seq_file *m, void *v)
++static void show_map_vma(struct seq_file *m, struct vm_area_struct *vma)
+ {
+-      struct proc_maps_private *priv = m->private;
+-      struct task_struct *task = priv->task;
+-      struct vm_area_struct *vma = v;
+       struct mm_struct *mm = vma->vm_mm;
+       struct file *file = vma->vm_file;
+       int flags = vma->vm_flags;
+@@ -210,9 +207,6 @@ static int show_map(struct seq_file *m, void *v)
+       dev_t dev = 0;
+       int len;
+-      if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
+-              return -EACCES;
+-
+       if (file) {
+               struct inode *inode = vma->vm_file->f_path.dentry->d_inode;
+               dev = inode->i_sb->s_dev;
+@@ -257,6 +251,18 @@ static int show_map(struct seq_file *m, void *v)
+               }
+       }
+       seq_putc(m, '\n');
++}
++
++static int show_map(struct seq_file *m, void *v)
++{
++      struct vm_area_struct *vma = v;
++      struct proc_maps_private *priv = m->private;
++      struct task_struct *task = priv->task;
++
++      if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
++              return -EACCES;
++
++      show_map_vma(m, vma);
+       if (m->count < m->size)  /* vma is copied successfully */
+               m->version = (vma != get_gate_vma(task))? vma->vm_start: 0;
+@@ -367,23 +373,25 @@ static int smaps_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end,
+ static int show_smap(struct seq_file *m, void *v)
+ {
++      struct proc_maps_private *priv = m->private;
++      struct task_struct *task = priv->task;
+       struct vm_area_struct *vma = v;
+       struct mem_size_stats mss;
+-      int ret;
+       struct mm_walk smaps_walk = {
+               .pmd_entry = smaps_pte_range,
+               .mm = vma->vm_mm,
+               .private = &mss,
+       };
++      if (maps_protect && !ptrace_may_access(task, PTRACE_MODE_READ))
++              return -EACCES;
++
+       memset(&mss, 0, sizeof mss);
+       mss.vma = vma;
+       if (vma->vm_mm && !is_vm_hugetlb_page(vma))
+               walk_page_range(vma->vm_start, vma->vm_end, &smaps_walk);
+-      ret = show_map(m, v);
+-      if (ret)
+-              return ret;
++      show_map_vma(m, vma);
+       seq_printf(m,
+                  "Size:           %8lu kB\n"
+@@ -405,7 +413,9 @@ static int show_smap(struct seq_file *m, void *v)
+                  mss.referenced >> 10,
+                  mss.swap >> 10);
+-      return ret;
++      if (m->count < m->size)  /* vma is copied successfully */
++              m->version = (vma != get_gate_vma(task)) ? vma->vm_start : 0;
++      return 0;
+ }
+ static const struct seq_operations proc_pid_smaps_op = {
+diff --git a/kernel/sched_stats.h b/kernel/sched_stats.h
+index 8385d43..81365b3 100644
+--- a/kernel/sched_stats.h
++++ b/kernel/sched_stats.h
+@@ -9,7 +9,7 @@
+ static int show_schedstat(struct seq_file *seq, void *v)
+ {
+       int cpu;
+-      int mask_len = NR_CPUS/32 * 9;
++      int mask_len = (NR_CPUS/32 + 1) * 9;
+       char *mask_str = kmalloc(mask_len, GFP_KERNEL);
+       if (mask_str == NULL)
+diff --git a/mm/rmap.c b/mm/rmap.c
+index 0383acf..e8d639b 100644
+--- a/mm/rmap.c
++++ b/mm/rmap.c
+@@ -55,7 +55,33 @@
+ struct kmem_cache *anon_vma_cachep;
+-/* This must be called under the mmap_sem. */
++/**
++ * anon_vma_prepare - attach an anon_vma to a memory region
++ * @vma: the memory region in question
++ *
++ * This makes sure the memory mapping described by 'vma' has
++ * an 'anon_vma' attached to it, so that we can associate the
++ * anonymous pages mapped into it with that anon_vma.
++ *
++ * The common case will be that we already have one, but if
++ * if not we either need to find an adjacent mapping that we
++ * can re-use the anon_vma from (very common when the only
++ * reason for splitting a vma has been mprotect()), or we
++ * allocate a new one.
++ *
++ * Anon-vma allocations are very subtle, because we may have
++ * optimistically looked up an anon_vma in page_lock_anon_vma()
++ * and that may actually touch the spinlock even in the newly
++ * allocated vma (it depends on RCU to make sure that the
++ * anon_vma isn't actually destroyed).
++ *
++ * As a result, we need to do proper anon_vma locking even
++ * for the new allocation. At the same time, we do not want
++ * to do any locking for the common case of already having
++ * an anon_vma.
++ *
++ * This must be called with the mmap_sem held for reading.
++ */
+ int anon_vma_prepare(struct vm_area_struct *vma)
+ {
+       struct anon_vma *anon_vma = vma->anon_vma;
+@@ -63,20 +89,17 @@ int anon_vma_prepare(struct vm_area_struct *vma)
+       might_sleep();
+       if (unlikely(!anon_vma)) {
+               struct mm_struct *mm = vma->vm_mm;
+-              struct anon_vma *allocated, *locked;
++              struct anon_vma *allocated;
+               anon_vma = find_mergeable_anon_vma(vma);
+-              if (anon_vma) {
+-                      allocated = NULL;
+-                      locked = anon_vma;
+-                      spin_lock(&locked->lock);
+-              } else {
++              allocated = NULL;
++              if (!anon_vma) {
+                       anon_vma = anon_vma_alloc();
+                       if (unlikely(!anon_vma))
+                               return -ENOMEM;
+                       allocated = anon_vma;
+-                      locked = NULL;
+               }
++              spin_lock(&anon_vma->lock);
+               /* page_table_lock to protect against threads */
+               spin_lock(&mm->page_table_lock);
+@@ -87,8 +110,7 @@ int anon_vma_prepare(struct vm_area_struct *vma)
+               }
+               spin_unlock(&mm->page_table_lock);
+-              if (locked)
+-                      spin_unlock(&locked->lock);
++              spin_unlock(&anon_vma->lock);
+               if (unlikely(allocated))
+                       anon_vma_free(allocated);
+       }
+diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
+index 5a955c4..7eb0b61 100644
+--- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
++++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c
+@@ -150,10 +150,12 @@ static unsigned int ipv4_conntrack_defrag(unsigned int hooknum,
+                                         const struct net_device *out,
+                                         int (*okfn)(struct sk_buff *))
+ {
++#if !defined(CONFIG_NF_NAT) && !defined(CONFIG_NF_NAT_MODULE)
+       /* Previously seen (loopback)?  Ignore.  Do this before
+          fragment check. */
+       if (skb->nfct)
+               return NF_ACCEPT;
++#endif
+       /* Gather fragments. */
+       if (ip_hdr(skb)->frag_off & htons(IP_MF | IP_OFFSET)) {
+diff --git a/net/ipv4/netfilter/nf_nat_snmp_basic.c b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+index ffeaffc..8303e4b 100644
+--- a/net/ipv4/netfilter/nf_nat_snmp_basic.c
++++ b/net/ipv4/netfilter/nf_nat_snmp_basic.c
+@@ -742,6 +742,7 @@ static unsigned char snmp_object_decode(struct asn1_ctx *ctx,
+                       *obj = kmalloc(sizeof(struct snmp_object) + len,
+                                      GFP_ATOMIC);
+                       if (*obj == NULL) {
++                              kfree(p);
+                               kfree(id);
+                               if (net_ratelimit())
+                                       printk("OOM in bsalg (%d)\n", __LINE__);
+diff --git a/net/netfilter/xt_iprange.c b/net/netfilter/xt_iprange.c
+index c63e933..4b5741b 100644
+--- a/net/netfilter/xt_iprange.c
++++ b/net/netfilter/xt_iprange.c
+@@ -67,7 +67,7 @@ iprange_mt4(const struct sk_buff *skb, const struct net_device *in,
+       if (info->flags & IPRANGE_SRC) {
+               m  = ntohl(iph->saddr) < ntohl(info->src_min.ip);
+               m |= ntohl(iph->saddr) > ntohl(info->src_max.ip);
+-              m ^= info->flags & IPRANGE_SRC_INV;
++              m ^= !!(info->flags & IPRANGE_SRC_INV);
+               if (m) {
+                       pr_debug("src IP " NIPQUAD_FMT " NOT in range %s"
+                                NIPQUAD_FMT "-" NIPQUAD_FMT "\n",
+@@ -81,7 +81,7 @@ iprange_mt4(const struct sk_buff *skb, const struct net_device *in,
+       if (info->flags & IPRANGE_DST) {
+               m  = ntohl(iph->daddr) < ntohl(info->dst_min.ip);
+               m |= ntohl(iph->daddr) > ntohl(info->dst_max.ip);
+-              m ^= info->flags & IPRANGE_DST_INV;
++              m ^= !!(info->flags & IPRANGE_DST_INV);
+               if (m) {
+                       pr_debug("dst IP " NIPQUAD_FMT " NOT in range %s"
+                                NIPQUAD_FMT "-" NIPQUAD_FMT "\n",
+@@ -123,14 +123,14 @@ iprange_mt6(const struct sk_buff *skb, const struct net_device *in,
+       if (info->flags & IPRANGE_SRC) {
+               m  = iprange_ipv6_sub(&iph->saddr, &info->src_min.in6) < 0;
+               m |= iprange_ipv6_sub(&iph->saddr, &info->src_max.in6) > 0;
+-              m ^= info->flags & IPRANGE_SRC_INV;
++              m ^= !!(info->flags & IPRANGE_SRC_INV);
+               if (m)
+                       return false;
+       }
+       if (info->flags & IPRANGE_DST) {
+               m  = iprange_ipv6_sub(&iph->daddr, &info->dst_min.in6) < 0;
+               m |= iprange_ipv6_sub(&iph->daddr, &info->dst_max.in6) > 0;
+-              m ^= info->flags & IPRANGE_DST_INV;
++              m ^= !!(info->flags & IPRANGE_DST_INV);
+               if (m)
+                       return false;
+       }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.30-31 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.30-31
new file mode 100644 (file)
index 0000000..d0c86d8
--- /dev/null
@@ -0,0 +1,30 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.31
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 0eef388..fa0d21e 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .30
++EXTRAVERSION = .31
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/fs/compat_ioctl.c b/fs/compat_ioctl.c
+index 994ca87..61cb48f 100644
+--- a/fs/compat_ioctl.c
++++ b/fs/compat_ioctl.c
+@@ -1910,7 +1910,6 @@ COMPATIBLE_IOCTL(FIONCLEX)
+ COMPATIBLE_IOCTL(FIOASYNC)
+ COMPATIBLE_IOCTL(FIONBIO)
+ COMPATIBLE_IOCTL(FIONREAD)  /* This is also TIOCINQ */
+-COMPATIBLE_IOCTL(FS_IOC_FIEMAP)
+ /* 0x00 */
+ COMPATIBLE_IOCTL(FIBMAP)
+ COMPATIBLE_IOCTL(FIGETBSZ)
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.31-32 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.31-32
new file mode 100644 (file)
index 0000000..7173528
--- /dev/null
@@ -0,0 +1,1923 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.32
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index fa0d21e..00dc0ee 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .31
++EXTRAVERSION = .32
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/kvm/mmu.c b/arch/x86/kvm/mmu.c
+index 3da2508..95c65e3 100644
+--- a/arch/x86/kvm/mmu.c
++++ b/arch/x86/kvm/mmu.c
+@@ -135,13 +135,6 @@ module_param(dbg, bool, 0644);
+ #define ACC_USER_MASK    PT_USER_MASK
+ #define ACC_ALL          (ACC_EXEC_MASK | ACC_WRITE_MASK | ACC_USER_MASK)
+-struct kvm_pv_mmu_op_buffer {
+-      void *ptr;
+-      unsigned len;
+-      unsigned processed;
+-      char buf[512] __aligned(sizeof(long));
+-};
+-
+ struct kvm_rmap_desc {
+       u64 *shadow_ptes[RMAP_EXT];
+       struct kvm_rmap_desc *more;
+@@ -305,7 +298,7 @@ static int mmu_topup_memory_caches(struct kvm_vcpu *vcpu)
+       if (r)
+               goto out;
+       r = mmu_topup_memory_cache(&vcpu->arch.mmu_rmap_desc_cache,
+-                                 rmap_desc_cache, 1);
++                                 rmap_desc_cache, 4);
+       if (r)
+               goto out;
+       r = mmu_topup_memory_cache_page(&vcpu->arch.mmu_page_cache, 8);
+@@ -1162,7 +1155,7 @@ static void mmu_set_spte(struct kvm_vcpu *vcpu, u64 *shadow_pte,
+        */
+       spte = shadow_base_present_pte | shadow_dirty_mask;
+       if (!speculative)
+-              pte_access |= PT_ACCESSED_MASK;
++              spte |= shadow_accessed_mask;
+       if (!dirty)
+               pte_access &= ~ACC_WRITE_MASK;
+       if (pte_access & ACC_EXEC_MASK)
+@@ -1357,7 +1350,19 @@ static void mmu_free_roots(struct kvm_vcpu *vcpu)
+       vcpu->arch.mmu.root_hpa = INVALID_PAGE;
+ }
+-static void mmu_alloc_roots(struct kvm_vcpu *vcpu)
++static int mmu_check_root(struct kvm_vcpu *vcpu, gfn_t root_gfn)
++{
++      int ret = 0;
++
++      if (!kvm_is_visible_gfn(vcpu->kvm, root_gfn)) {
++              set_bit(KVM_REQ_TRIPLE_FAULT, &vcpu->requests);
++              ret = 1;
++      }
++
++      return ret;
++}
++
++static int mmu_alloc_roots(struct kvm_vcpu *vcpu)
+ {
+       int i;
+       gfn_t root_gfn;
+@@ -1372,13 +1377,15 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu)
+               ASSERT(!VALID_PAGE(root));
+               if (tdp_enabled)
+                       metaphysical = 1;
++              if (mmu_check_root(vcpu, root_gfn))
++                      return 1;
+               sp = kvm_mmu_get_page(vcpu, root_gfn, 0,
+                                     PT64_ROOT_LEVEL, metaphysical,
+                                     ACC_ALL, NULL);
+               root = __pa(sp->spt);
+               ++sp->root_count;
+               vcpu->arch.mmu.root_hpa = root;
+-              return;
++              return 0;
+       }
+       metaphysical = !is_paging(vcpu);
+       if (tdp_enabled)
+@@ -1395,6 +1402,8 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu)
+                       root_gfn = vcpu->arch.pdptrs[i] >> PAGE_SHIFT;
+               } else if (vcpu->arch.mmu.root_level == 0)
+                       root_gfn = 0;
++              if (mmu_check_root(vcpu, root_gfn))
++                      return 1;
+               sp = kvm_mmu_get_page(vcpu, root_gfn, i << 30,
+                                     PT32_ROOT_LEVEL, metaphysical,
+                                     ACC_ALL, NULL);
+@@ -1403,6 +1412,7 @@ static void mmu_alloc_roots(struct kvm_vcpu *vcpu)
+               vcpu->arch.mmu.pae_root[i] = root | PT_PRESENT_MASK;
+       }
+       vcpu->arch.mmu.root_hpa = __pa(vcpu->arch.mmu.pae_root);
++      return 0;
+ }
+ static gpa_t nonpaging_gva_to_gpa(struct kvm_vcpu *vcpu, gva_t vaddr)
+@@ -1646,8 +1656,10 @@ int kvm_mmu_load(struct kvm_vcpu *vcpu)
+               goto out;
+       spin_lock(&vcpu->kvm->mmu_lock);
+       kvm_mmu_free_some_pages(vcpu);
+-      mmu_alloc_roots(vcpu);
++      r = mmu_alloc_roots(vcpu);
+       spin_unlock(&vcpu->kvm->mmu_lock);
++      if (r)
++              goto out;
+       kvm_x86_ops->set_cr3(vcpu, vcpu->arch.mmu.root_hpa);
+       kvm_mmu_flush_tlb(vcpu);
+ out:
+@@ -1983,14 +1995,6 @@ EXPORT_SYMBOL_GPL(kvm_disable_tdp);
+ static void free_mmu_pages(struct kvm_vcpu *vcpu)
+ {
+-      struct kvm_mmu_page *sp;
+-
+-      while (!list_empty(&vcpu->kvm->arch.active_mmu_pages)) {
+-              sp = container_of(vcpu->kvm->arch.active_mmu_pages.next,
+-                                struct kvm_mmu_page, link);
+-              kvm_mmu_zap_page(vcpu->kvm, sp);
+-              cond_resched();
+-      }
+       free_page((unsigned long)vcpu->arch.mmu.pae_root);
+ }
+@@ -2068,6 +2072,7 @@ void kvm_mmu_slot_remove_write_access(struct kvm *kvm, int slot)
+                       if (pt[i] & PT_WRITABLE_MASK)
+                               pt[i] &= ~PT_WRITABLE_MASK;
+       }
++      kvm_flush_remote_tlbs(kvm);
+ }
+ void kvm_mmu_zap_all(struct kvm *kvm)
+@@ -2237,7 +2242,7 @@ static int kvm_pv_mmu_write(struct kvm_vcpu *vcpu,
+ static int kvm_pv_mmu_flush_tlb(struct kvm_vcpu *vcpu)
+ {
+-      kvm_x86_ops->tlb_flush(vcpu);
++      kvm_set_cr3(vcpu, vcpu->arch.cr3);
+       return 1;
+ }
+@@ -2291,18 +2296,18 @@ int kvm_pv_mmu_op(struct kvm_vcpu *vcpu, unsigned long bytes,
+                 gpa_t addr, unsigned long *ret)
+ {
+       int r;
+-      struct kvm_pv_mmu_op_buffer buffer;
++      struct kvm_pv_mmu_op_buffer *buffer = &vcpu->arch.mmu_op_buffer;
+-      buffer.ptr = buffer.buf;
+-      buffer.len = min_t(unsigned long, bytes, sizeof buffer.buf);
+-      buffer.processed = 0;
++      buffer->ptr = buffer->buf;
++      buffer->len = min_t(unsigned long, bytes, sizeof buffer->buf);
++      buffer->processed = 0;
+-      r = kvm_read_guest(vcpu->kvm, addr, buffer.buf, buffer.len);
++      r = kvm_read_guest(vcpu->kvm, addr, buffer->buf, buffer->len);
+       if (r)
+               goto out;
+-      while (buffer.len) {
+-              r = kvm_pv_mmu_op_one(vcpu, &buffer);
++      while (buffer->len) {
++              r = kvm_pv_mmu_op_one(vcpu, buffer);
+               if (r < 0)
+                       goto out;
+               if (r == 0)
+@@ -2311,7 +2316,7 @@ int kvm_pv_mmu_op(struct kvm_vcpu *vcpu, unsigned long bytes,
+       r = 1;
+ out:
+-      *ret = buffer.processed;
++      *ret = buffer->processed;
+       return r;
+ }
+diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
+index 8233b86..77cae01 100644
+--- a/arch/x86/kvm/svm.c
++++ b/arch/x86/kvm/svm.c
+@@ -429,7 +429,6 @@ static __init int svm_hardware_setup(void)
+       iopm_va = page_address(iopm_pages);
+       memset(iopm_va, 0xff, PAGE_SIZE * (1 << IOPM_ALLOC_ORDER));
+-      clear_bit(0x80, iopm_va); /* allow direct access to PC debug port */
+       iopm_base = page_to_pfn(iopm_pages) << PAGE_SHIFT;
+       if (boot_cpu_has(X86_FEATURE_NX))
+diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
+index 7041cc5..4cee61a 100644
+--- a/arch/x86/kvm/vmx.c
++++ b/arch/x86/kvm/vmx.c
+@@ -898,11 +898,11 @@ static int vmx_set_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 data)
+       int ret = 0;
+       switch (msr_index) {
+-#ifdef CONFIG_X86_64
+       case MSR_EFER:
+               vmx_load_host_state(vmx);
+               ret = kvm_set_msr_common(vcpu, msr_index, data);
+               break;
++#ifdef CONFIG_X86_64
+       case MSR_FS_BASE:
+               vmcs_writel(GUEST_FS_BASE, data);
+               break;
+@@ -1789,7 +1789,7 @@ static void seg_setup(int seg)
+       vmcs_write16(sf->selector, 0);
+       vmcs_writel(sf->base, 0);
+       vmcs_write32(sf->limit, 0xffff);
+-      vmcs_write32(sf->ar_bytes, 0x93);
++      vmcs_write32(sf->ar_bytes, 0xf3);
+ }
+ static int alloc_apic_access_page(struct kvm *kvm)
+@@ -2036,6 +2036,7 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
+       fx_init(&vmx->vcpu);
++      seg_setup(VCPU_SREG_CS);
+       /*
+        * GUEST_CS_BASE should really be 0xffff0000, but VT vm86 mode
+        * insists on having GUEST_CS_BASE == GUEST_CS_SELECTOR << 4.  Sigh.
+@@ -2047,8 +2048,6 @@ static int vmx_vcpu_reset(struct kvm_vcpu *vcpu)
+               vmcs_write16(GUEST_CS_SELECTOR, vmx->vcpu.arch.sipi_vector << 8);
+               vmcs_writel(GUEST_CS_BASE, vmx->vcpu.arch.sipi_vector << 12);
+       }
+-      vmcs_write32(GUEST_CS_LIMIT, 0xffff);
+-      vmcs_write32(GUEST_CS_AR_BYTES, 0x9b);
+       seg_setup(VCPU_SREG_DS);
+       seg_setup(VCPU_SREG_ES);
+@@ -2583,6 +2582,12 @@ static int handle_vmcall(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+       return 1;
+ }
++static int handle_vmx_insn(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
++{
++      kvm_queue_exception(vcpu, UD_VECTOR);
++      return 1;
++}
++
+ static int handle_wbinvd(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+ {
+       skip_emulated_instruction(vcpu);
+@@ -2715,6 +2720,15 @@ static int (*kvm_vmx_exit_handlers[])(struct kvm_vcpu *vcpu,
+       [EXIT_REASON_PENDING_INTERRUPT]       = handle_interrupt_window,
+       [EXIT_REASON_HLT]                     = handle_halt,
+       [EXIT_REASON_VMCALL]                  = handle_vmcall,
++      [EXIT_REASON_VMCLEAR]                 = handle_vmx_insn,
++      [EXIT_REASON_VMLAUNCH]                = handle_vmx_insn,
++      [EXIT_REASON_VMPTRLD]                 = handle_vmx_insn,
++      [EXIT_REASON_VMPTRST]                 = handle_vmx_insn,
++      [EXIT_REASON_VMREAD]                  = handle_vmx_insn,
++      [EXIT_REASON_VMRESUME]                = handle_vmx_insn,
++      [EXIT_REASON_VMWRITE]                 = handle_vmx_insn,
++      [EXIT_REASON_VMOFF]                   = handle_vmx_insn,
++      [EXIT_REASON_VMON]                    = handle_vmx_insn,
+       [EXIT_REASON_TPR_BELOW_THRESHOLD]     = handle_tpr_below_threshold,
+       [EXIT_REASON_APIC_ACCESS]             = handle_apic_access,
+       [EXIT_REASON_WBINVD]                  = handle_wbinvd,
+@@ -3300,7 +3314,8 @@ static int __init vmx_init(void)
+               bypass_guest_pf = 0;
+               kvm_mmu_set_base_ptes(VMX_EPT_READABLE_MASK |
+                       VMX_EPT_WRITABLE_MASK |
+-                      VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT);
++                      VMX_EPT_DEFAULT_MT << VMX_EPT_MT_EPTE_SHIFT |
++                      VMX_EPT_IGMT_BIT);
+               kvm_mmu_set_mask_ptes(0ull, 0ull, 0ull, 0ull,
+                               VMX_EPT_EXECUTABLE_MASK);
+               kvm_enable_tdp();
+diff --git a/arch/x86/kvm/vmx.h b/arch/x86/kvm/vmx.h
+index 23e8373..198cdf3 100644
+--- a/arch/x86/kvm/vmx.h
++++ b/arch/x86/kvm/vmx.h
+@@ -370,6 +370,7 @@ enum vmcs_field {
+ #define VMX_EPT_READABLE_MASK                 0x1ull
+ #define VMX_EPT_WRITABLE_MASK                 0x2ull
+ #define VMX_EPT_EXECUTABLE_MASK                       0x4ull
++#define VMX_EPT_IGMT_BIT                      (1ull << 6)
+ #define VMX_EPT_IDENTITY_PAGETABLE_ADDR               0xfffbc000ul
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 0d682fc..f7c7142 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -318,6 +318,9 @@ EXPORT_SYMBOL_GPL(kvm_lmsw);
+ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
+ {
++      unsigned long old_cr4 = vcpu->arch.cr4;
++      unsigned long pdptr_bits = X86_CR4_PGE | X86_CR4_PSE | X86_CR4_PAE;
++
+       if (cr4 & CR4_RESERVED_BITS) {
+               printk(KERN_DEBUG "set_cr4: #GP, reserved bits\n");
+               kvm_inject_gp(vcpu, 0);
+@@ -331,7 +334,8 @@ void kvm_set_cr4(struct kvm_vcpu *vcpu, unsigned long cr4)
+                       kvm_inject_gp(vcpu, 0);
+                       return;
+               }
+-      } else if (is_paging(vcpu) && !is_pae(vcpu) && (cr4 & X86_CR4_PAE)
++      } else if (is_paging(vcpu) && (cr4 & X86_CR4_PAE)
++                 && ((cr4 ^ old_cr4) & pdptr_bits)
+                  && !load_pdptrs(vcpu, vcpu->arch.cr3)) {
+               printk(KERN_DEBUG "set_cr4: #GP, pdptrs reserved bits\n");
+               kvm_inject_gp(vcpu, 0);
+@@ -752,6 +756,7 @@ int kvm_get_msr_common(struct kvm_vcpu *vcpu, u32 msr, u64 *pdata)
+       case MSR_IA32_MC0_MISC+8:
+       case MSR_IA32_MC0_MISC+12:
+       case MSR_IA32_MC0_MISC+16:
++      case MSR_IA32_MC0_MISC+20:
+       case MSR_IA32_UCODE_REV:
+       case MSR_IA32_EBL_CR_POWERON:
+               data = 0;
+@@ -982,9 +987,9 @@ void kvm_arch_vcpu_put(struct kvm_vcpu *vcpu)
+ static int is_efer_nx(void)
+ {
+-      u64 efer;
++      unsigned long long efer = 0;
+-      rdmsrl(MSR_EFER, efer);
++      rdmsrl_safe(MSR_EFER, &efer);
+       return efer & EFER_NX;
+ }
+@@ -1303,28 +1308,33 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
+       struct kvm_vcpu *vcpu = filp->private_data;
+       void __user *argp = (void __user *)arg;
+       int r;
++      struct kvm_lapic_state *lapic = NULL;
+       switch (ioctl) {
+       case KVM_GET_LAPIC: {
+-              struct kvm_lapic_state lapic;
++              lapic = kzalloc(sizeof(struct kvm_lapic_state), GFP_KERNEL);
+-              memset(&lapic, 0, sizeof lapic);
+-              r = kvm_vcpu_ioctl_get_lapic(vcpu, &lapic);
++              r = -ENOMEM;
++              if (!lapic)
++                      goto out;
++              r = kvm_vcpu_ioctl_get_lapic(vcpu, lapic);
+               if (r)
+                       goto out;
+               r = -EFAULT;
+-              if (copy_to_user(argp, &lapic, sizeof lapic))
++              if (copy_to_user(argp, lapic, sizeof(struct kvm_lapic_state)))
+                       goto out;
+               r = 0;
+               break;
+       }
+       case KVM_SET_LAPIC: {
+-              struct kvm_lapic_state lapic;
+-
++              lapic = kmalloc(sizeof(struct kvm_lapic_state), GFP_KERNEL);
++              r = -ENOMEM;
++              if (!lapic)
++                      goto out;
+               r = -EFAULT;
+-              if (copy_from_user(&lapic, argp, sizeof lapic))
++              if (copy_from_user(lapic, argp, sizeof(struct kvm_lapic_state)))
+                       goto out;
+-              r = kvm_vcpu_ioctl_set_lapic(vcpu, &lapic);;
++              r = kvm_vcpu_ioctl_set_lapic(vcpu, lapic);
+               if (r)
+                       goto out;
+               r = 0;
+@@ -1422,6 +1432,8 @@ long kvm_arch_vcpu_ioctl(struct file *filp,
+               r = -EINVAL;
+       }
+ out:
++      if (lapic)
++              kfree(lapic);
+       return r;
+ }
+@@ -1442,10 +1454,12 @@ static int kvm_vm_ioctl_set_nr_mmu_pages(struct kvm *kvm,
+               return -EINVAL;
+       down_write(&kvm->slots_lock);
++      spin_lock(&kvm->mmu_lock);
+       kvm_mmu_change_mmu_pages(kvm, kvm_nr_mmu_pages);
+       kvm->arch.n_requested_mmu_pages = kvm_nr_mmu_pages;
++      spin_unlock(&kvm->mmu_lock);
+       up_write(&kvm->slots_lock);
+       return 0;
+ }
+@@ -1612,7 +1626,9 @@ int kvm_vm_ioctl_get_dirty_log(struct kvm *kvm,
+       /* If nothing is dirty, don't bother messing with page tables. */
+       if (is_dirty) {
++              spin_lock(&kvm->mmu_lock);
+               kvm_mmu_slot_remove_write_access(kvm, log->slot);
++              spin_unlock(&kvm->mmu_lock);
+               kvm_flush_remote_tlbs(kvm);
+               memslot = &kvm->memslots[log->slot];
+               n = ALIGN(memslot->npages, BITS_PER_LONG) / 8;
+@@ -1630,6 +1646,15 @@ long kvm_arch_vm_ioctl(struct file *filp,
+       struct kvm *kvm = filp->private_data;
+       void __user *argp = (void __user *)arg;
+       int r = -EINVAL;
++      /*
++       * This union makes it completely explicit to gcc-3.x
++       * that these two variables' stack usage should be
++       * combined, not added together.
++       */
++      union {
++              struct kvm_pit_state ps;
++              struct kvm_memory_alias alias;
++      } u;
+       switch (ioctl) {
+       case KVM_SET_TSS_ADDR:
+@@ -1661,17 +1686,14 @@ long kvm_arch_vm_ioctl(struct file *filp,
+       case KVM_GET_NR_MMU_PAGES:
+               r = kvm_vm_ioctl_get_nr_mmu_pages(kvm);
+               break;
+-      case KVM_SET_MEMORY_ALIAS: {
+-              struct kvm_memory_alias alias;
+-
++      case KVM_SET_MEMORY_ALIAS:
+               r = -EFAULT;
+-              if (copy_from_user(&alias, argp, sizeof alias))
++              if (copy_from_user(&u.alias, argp, sizeof(struct kvm_memory_alias)))
+                       goto out;
+-              r = kvm_vm_ioctl_set_memory_alias(kvm, &alias);
++              r = kvm_vm_ioctl_set_memory_alias(kvm, &u.alias);
+               if (r)
+                       goto out;
+               break;
+-      }
+       case KVM_CREATE_IRQCHIP:
+               r = -ENOMEM;
+               kvm->arch.vpic = kvm_create_pic(kvm);
+@@ -1713,65 +1735,77 @@ long kvm_arch_vm_ioctl(struct file *filp,
+       }
+       case KVM_GET_IRQCHIP: {
+               /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+-              struct kvm_irqchip chip;
++              struct kvm_irqchip *chip = kmalloc(sizeof(*chip), GFP_KERNEL);
+-              r = -EFAULT;
+-              if (copy_from_user(&chip, argp, sizeof chip))
++              r = -ENOMEM;
++              if (!chip)
+                       goto out;
++              r = -EFAULT;
++              if (copy_from_user(chip, argp, sizeof *chip))
++                      goto get_irqchip_out;
+               r = -ENXIO;
+               if (!irqchip_in_kernel(kvm))
+-                      goto out;
+-              r = kvm_vm_ioctl_get_irqchip(kvm, &chip);
++                      goto get_irqchip_out;
++              r = kvm_vm_ioctl_get_irqchip(kvm, chip);
+               if (r)
+-                      goto out;
++                      goto get_irqchip_out;
+               r = -EFAULT;
+-              if (copy_to_user(argp, &chip, sizeof chip))
+-                      goto out;
++              if (copy_to_user(argp, chip, sizeof *chip))
++                      goto get_irqchip_out;
+               r = 0;
++      get_irqchip_out:
++              kfree(chip);
++              if (r)
++                      goto out;
+               break;
+       }
+       case KVM_SET_IRQCHIP: {
+               /* 0: PIC master, 1: PIC slave, 2: IOAPIC */
+-              struct kvm_irqchip chip;
++              struct kvm_irqchip *chip = kmalloc(sizeof(*chip), GFP_KERNEL);
+-              r = -EFAULT;
+-              if (copy_from_user(&chip, argp, sizeof chip))
++              r = -ENOMEM;
++              if (!chip)
+                       goto out;
++              r = -EFAULT;
++              if (copy_from_user(chip, argp, sizeof *chip))
++                      goto set_irqchip_out;
+               r = -ENXIO;
+               if (!irqchip_in_kernel(kvm))
+-                      goto out;
+-              r = kvm_vm_ioctl_set_irqchip(kvm, &chip);
++                      goto set_irqchip_out;
++              r = kvm_vm_ioctl_set_irqchip(kvm, chip);
+               if (r)
+-                      goto out;
++                      goto set_irqchip_out;
+               r = 0;
++      set_irqchip_out:
++              kfree(chip);
++              if (r)
++                      goto out;
+               break;
+       }
+       case KVM_GET_PIT: {
+-              struct kvm_pit_state ps;
+               r = -EFAULT;
+-              if (copy_from_user(&ps, argp, sizeof ps))
++              if (copy_from_user(&u.ps, argp, sizeof(struct kvm_pit_state)))
+                       goto out;
+               r = -ENXIO;
+               if (!kvm->arch.vpit)
+                       goto out;
+-              r = kvm_vm_ioctl_get_pit(kvm, &ps);
++              r = kvm_vm_ioctl_get_pit(kvm, &u.ps);
+               if (r)
+                       goto out;
+               r = -EFAULT;
+-              if (copy_to_user(argp, &ps, sizeof ps))
++              if (copy_to_user(argp, &u.ps, sizeof(struct kvm_pit_state)))
+                       goto out;
+               r = 0;
+               break;
+       }
+       case KVM_SET_PIT: {
+-              struct kvm_pit_state ps;
+               r = -EFAULT;
+-              if (copy_from_user(&ps, argp, sizeof ps))
++              if (copy_from_user(&u.ps, argp, sizeof u.ps))
+                       goto out;
+               r = -ENXIO;
+               if (!kvm->arch.vpit)
+                       goto out;
+-              r = kvm_vm_ioctl_set_pit(kvm, &ps);
++              r = kvm_vm_ioctl_set_pit(kvm, &u.ps);
+               if (r)
+                       goto out;
+               r = 0;
+@@ -2813,10 +2847,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
+       down_read(&vcpu->kvm->slots_lock);
+       vapic_enter(vcpu);
+-preempted:
+-      if (vcpu->guest_debug.enabled)
+-              kvm_x86_ops->guest_debug_pre(vcpu);
+-
+ again:
+       if (vcpu->requests)
+               if (test_and_clear_bit(KVM_REQ_MMU_RELOAD, &vcpu->requests))
+@@ -2870,6 +2900,9 @@ again:
+               goto out;
+       }
++      if (vcpu->guest_debug.enabled)
++              kvm_x86_ops->guest_debug_pre(vcpu);
++
+       vcpu->guest_mode = 1;
+       /*
+        * Make sure that guest_mode assignment won't happen after
+@@ -2944,7 +2977,7 @@ out:
+       if (r > 0) {
+               kvm_resched(vcpu);
+               down_read(&vcpu->kvm->slots_lock);
+-              goto preempted;
++              goto again;
+       }
+       post_kvm_run_save(vcpu, kvm_run);
+@@ -3294,11 +3327,33 @@ static int load_segment_descriptor_to_kvm_desct(struct kvm_vcpu *vcpu,
+       return 0;
+ }
++int kvm_load_realmode_segment(struct kvm_vcpu *vcpu, u16 selector, int seg)
++{
++      struct kvm_segment segvar = {
++              .base = selector << 4,
++              .limit = 0xffff,
++              .selector = selector,
++              .type = 3,
++              .present = 1,
++              .dpl = 3,
++              .db = 0,
++              .s = 1,
++              .l = 0,
++              .g = 0,
++              .avl = 0,
++              .unusable = 0,
++      };
++      kvm_x86_ops->set_segment(vcpu, &segvar, seg);
++      return 0;
++}
++
+ int kvm_load_segment_descriptor(struct kvm_vcpu *vcpu, u16 selector,
+                               int type_bits, int seg)
+ {
+       struct kvm_segment kvm_seg;
++      if (!(vcpu->arch.cr0 & X86_CR0_PE))
++              return kvm_load_realmode_segment(vcpu, selector, seg);
+       if (load_segment_descriptor_to_kvm_desct(vcpu, selector, &kvm_seg))
+               return 1;
+       kvm_seg.type |= type_bits;
+@@ -3981,7 +4036,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+                       userspace_addr = do_mmap(NULL, 0,
+                                                npages * PAGE_SIZE,
+                                                PROT_READ | PROT_WRITE,
+-                                               MAP_SHARED | MAP_ANONYMOUS,
++                                               MAP_PRIVATE | MAP_ANONYMOUS,
+                                                0);
+                       up_write(&current->mm->mmap_sem);
+@@ -4008,12 +4063,14 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+               }
+       }
++      spin_lock(&kvm->mmu_lock);
+       if (!kvm->arch.n_requested_mmu_pages) {
+               unsigned int nr_mmu_pages = kvm_mmu_calculate_mmu_pages(kvm);
+               kvm_mmu_change_mmu_pages(kvm, nr_mmu_pages);
+       }
+       kvm_mmu_slot_remove_write_access(kvm, mem->slot);
++      spin_unlock(&kvm->mmu_lock);
+       kvm_flush_remote_tlbs(kvm);
+       return 0;
+@@ -4022,6 +4079,7 @@ int kvm_arch_set_memory_region(struct kvm *kvm,
+ void kvm_arch_flush_shadow(struct kvm *kvm)
+ {
+       kvm_mmu_zap_all(kvm);
++      kvm_reload_remote_mmus(kvm);
+ }
+ int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu)
+diff --git a/drivers/char/mxser.c b/drivers/char/mxser.c
+index ebda9a8..3340c62 100644
+--- a/drivers/char/mxser.c
++++ b/drivers/char/mxser.c
+@@ -1099,8 +1099,6 @@ static int mxser_open(struct tty_struct *tty, struct file *filp)
+       if (retval)
+               return retval;
+-      /* unmark here for very high baud rate (ex. 921600 bps) used */
+-      tty->low_latency = 1;
+       return 0;
+ }
+diff --git a/drivers/char/nozomi.c b/drivers/char/nozomi.c
+index 66a0f93..4dfb5a1 100644
+--- a/drivers/char/nozomi.c
++++ b/drivers/char/nozomi.c
+@@ -1584,7 +1584,6 @@ static int ntty_open(struct tty_struct *tty, struct file *file)
+       /* Enable interrupt downlink for channel */
+       if (port->tty_open_count == 1) {
+-              tty->low_latency = 1;
+               tty->driver_data = port;
+               port->tty = tty;
+               DBG1("open: %d", port->token_dl);
+diff --git a/drivers/net/ehea/ehea_main.c b/drivers/net/ehea/ehea_main.c
+index a6e730f..682f411 100644
+--- a/drivers/net/ehea/ehea_main.c
++++ b/drivers/net/ehea/ehea_main.c
+@@ -1530,6 +1530,9 @@ static int ehea_clean_portres(struct ehea_port *port, struct ehea_port_res *pr)
+ {
+       int ret, i;
++      if (pr->qp)
++              netif_napi_del(&pr->napi);
++
+       ret = ehea_destroy_qp(pr->qp);
+       if (!ret) {
+diff --git a/drivers/parport/share.c b/drivers/parport/share.c
+index a8a62bb..a592f29 100644
+--- a/drivers/parport/share.c
++++ b/drivers/parport/share.c
+@@ -614,7 +614,10 @@ parport_register_device(struct parport *port, const char *name,
+        * pardevice fields. -arca
+        */
+       port->ops->init_state(tmp, tmp->state);
+-      parport_device_proc_register(tmp);
++      if (!test_and_set_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags)) {
++              port->proc_device = tmp;
++              parport_device_proc_register(tmp);
++      }
+       return tmp;
+  out_free_all:
+@@ -646,10 +649,14 @@ void parport_unregister_device(struct pardevice *dev)
+       }
+ #endif
+-      parport_device_proc_unregister(dev);
+-
+       port = dev->port->physport;
++      if (port->proc_device == dev) {
++              port->proc_device = NULL;
++              clear_bit(PARPORT_DEVPROC_REGISTERED, &port->devflags);
++              parport_device_proc_unregister(dev);
++      }
++
+       if (port->cad == dev) {
+               printk(KERN_DEBUG "%s: %s forgot to release port\n",
+                      port->name, dev->name);
+diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c
+index ae87d08..25f2008 100644
+--- a/drivers/scsi/sr_ioctl.c
++++ b/drivers/scsi/sr_ioctl.c
+@@ -309,6 +309,11 @@ int sr_drive_status(struct cdrom_device_info *cdi, int slot)
+       if (0 == sr_test_unit_ready(cd->device, &sshdr))
+               return CDS_DISC_OK;
++      /* SK/ASC/ASCQ of 2/4/1 means "unit is becoming ready" */
++      if (scsi_sense_valid(&sshdr) && sshdr.sense_key == NOT_READY
++                      && sshdr.asc == 0x04 && sshdr.ascq == 0x01)
++              return CDS_DRIVE_NOT_READY;
++
+       if (!cdrom_get_media_event(cdi, &med)) {
+               if (med.media_present)
+                       return CDS_DISC_OK;
+diff --git a/drivers/usb/serial/cyberjack.c b/drivers/usb/serial/cyberjack.c
+index b4d7235..7b3df8e 100644
+--- a/drivers/usb/serial/cyberjack.c
++++ b/drivers/usb/serial/cyberjack.c
+@@ -174,13 +174,6 @@ static int  cyberjack_open(struct tty_struct *tty,
+       dbg("%s - usb_clear_halt", __func__);
+       usb_clear_halt(port->serial->dev, port->write_urb->pipe);
+-      /* force low_latency on so that our tty_push actually forces
+-       * the data through, otherwise it is scheduled, and with high
+-       * data rates (like with OHCI) data can get lost.
+-       */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       priv = usb_get_serial_port_data(port);
+       spin_lock_irqsave(&priv->lock, flags);
+       priv->rdtodo = 0;
+diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c
+index 22837a3..7eb473b 100644
+--- a/drivers/usb/serial/cypress_m8.c
++++ b/drivers/usb/serial/cypress_m8.c
+@@ -655,10 +655,6 @@ static int cypress_open(struct tty_struct *tty,
+       priv->rx_flags = 0;
+       spin_unlock_irqrestore(&priv->lock, flags);
+-      /* setting to zero could cause data loss */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* raise both lines and set termios */
+       spin_lock_irqsave(&priv->lock, flags);
+       priv->line_control = CONTROL_DTR | CONTROL_RTS;
+diff --git a/drivers/usb/serial/empeg.c b/drivers/usb/serial/empeg.c
+index a6ab5b5..28ee28c 100644
+--- a/drivers/usb/serial/empeg.c
++++ b/drivers/usb/serial/empeg.c
+@@ -478,12 +478,6 @@ static void empeg_set_termios(struct tty_struct *tty,
+       termios->c_cflag
+               |= CS8;         /* character size 8 bits */
+-      /*
+-       * Force low_latency on; otherwise the pushes are scheduled;
+-       * this is bad as it opens up the possibility of dropping bytes
+-       * on the floor.  We don't want to drop bytes on the floor. :)
+-       */
+-      tty->low_latency = 1;
+       tty_encode_baud_rate(tty, 115200, 115200);
+ }
+diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c
+index d953820..d860071 100644
+--- a/drivers/usb/serial/garmin_gps.c
++++ b/drivers/usb/serial/garmin_gps.c
+@@ -972,14 +972,6 @@ static int garmin_open(struct tty_struct *tty,
+       dbg("%s - port %d", __func__, port->number);
+-      /*
+-       * Force low_latency on so that our tty_push actually forces the data
+-       * through, otherwise it is scheduled, and with high data rates (like
+-       * with OHCI) data can get lost.
+-       */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       spin_lock_irqsave(&garmin_data_p->lock, flags);
+       garmin_data_p->mode  = initial_mode;
+       garmin_data_p->count = 0;
+diff --git a/drivers/usb/serial/generic.c b/drivers/usb/serial/generic.c
+index fe84c88..aa7f08b 100644
+--- a/drivers/usb/serial/generic.c
++++ b/drivers/usb/serial/generic.c
+@@ -122,12 +122,6 @@ int usb_serial_generic_open(struct tty_struct *tty,
+       dbg("%s - port %d", __func__, port->number);
+-      /* force low_latency on so that our tty_push actually forces the data
+-         through, otherwise it is scheduled, and with high data rates (like
+-         with OHCI) data can get lost. */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* clear the throttle flags */
+       spin_lock_irqsave(&port->lock, flags);
+       port->throttled = 0;
+diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c
+index bfa508d..183045a 100644
+--- a/drivers/usb/serial/io_edgeport.c
++++ b/drivers/usb/serial/io_edgeport.c
+@@ -193,8 +193,6 @@ static const struct divisor_table_entry divisor_table[] = {
+ /* local variables */
+ static int debug;
+-static int low_latency = 1;   /* tty low latency flag, on by default */
+-
+ static atomic_t CmdUrbs;      /* Number of outstanding Command Write Urbs */
+@@ -861,9 +859,6 @@ static int edge_open(struct tty_struct *tty,
+       if (edge_port == NULL)
+               return -ENODEV;
+-      if (tty)
+-              tty->low_latency = low_latency;
+-
+       /* see if we've set up our endpoint info yet (can't set it up
+          in edge_startup as the structures were not set up at that time.) */
+       serial = port->serial;
+@@ -3281,6 +3276,3 @@ MODULE_FIRMWARE("edgeport/down2.fw");
+ module_param(debug, bool, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(debug, "Debug enabled or not");
+-
+-module_param(low_latency, bool, S_IRUGO | S_IWUSR);
+-MODULE_PARM_DESC(low_latency, "Low latency enabled or not");
+diff --git a/drivers/usb/serial/io_ti.c b/drivers/usb/serial/io_ti.c
+index cb4c543..0d744f0 100644
+--- a/drivers/usb/serial/io_ti.c
++++ b/drivers/usb/serial/io_ti.c
+@@ -76,7 +76,6 @@ struct edgeport_uart_buf_desc {
+ #define EDGE_READ_URB_STOPPING        1
+ #define EDGE_READ_URB_STOPPED 2
+-#define EDGE_LOW_LATENCY      1
+ #define EDGE_CLOSING_WAIT     4000    /* in .01 sec */
+ #define EDGE_OUT_BUF_SIZE     1024
+@@ -232,7 +231,6 @@ static unsigned short OperationalBuildNumber;
+ static int debug;
+-static int low_latency = EDGE_LOW_LATENCY;
+ static int closing_wait = EDGE_CLOSING_WAIT;
+ static int ignore_cpu_rev;
+ static int default_uart_mode;         /* RS232 */
+@@ -1838,9 +1836,6 @@ static int edge_open(struct tty_struct *tty,
+       if (edge_port == NULL)
+               return -ENODEV;
+-      if (tty)
+-              tty->low_latency = low_latency;
+-
+       port_number = port->number - port->serial->minor;
+       switch (port_number) {
+       case 0:
+@@ -2995,9 +2990,6 @@ MODULE_FIRMWARE("edgeport/down3.bin");
+ module_param(debug, bool, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(debug, "Debug enabled or not");
+-module_param(low_latency, bool, S_IRUGO | S_IWUSR);
+-MODULE_PARM_DESC(low_latency, "Low latency enabled or not");
+-
+ module_param(closing_wait, int, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(closing_wait, "Maximum wait for data to drain, in .01 secs");
+diff --git a/drivers/usb/serial/ipaq.c b/drivers/usb/serial/ipaq.c
+index cd9a2e1..ae0b0ff 100644
+--- a/drivers/usb/serial/ipaq.c
++++ b/drivers/usb/serial/ipaq.c
+@@ -635,13 +635,7 @@ static int ipaq_open(struct tty_struct *tty,
+               priv->free_len += PACKET_SIZE;
+       }
+-      /*
+-       * Force low latency on. This will immediately push data to the line
+-       * discipline instead of queueing.
+-       */
+-
+       if (tty) {
+-              tty->low_latency = 1;
+               /* FIXME: These two are bogus */
+               tty->raw = 1;
+               tty->real_raw = 1;
+diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c
+index a842025..b1c0c9a 100644
+--- a/drivers/usb/serial/ipw.c
++++ b/drivers/usb/serial/ipw.c
+@@ -206,9 +206,6 @@ static int ipw_open(struct tty_struct *tty,
+       if (!buf_flow_init)
+               return -ENOMEM;
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* --1: Tell the modem to initialize (we think) From sniffs this is
+        *      always the first thing that gets sent to the modem during
+        *      opening of the device */
+diff --git a/drivers/usb/serial/iuu_phoenix.c b/drivers/usb/serial/iuu_phoenix.c
+index ddff37f..d6da4c9 100644
+--- a/drivers/usb/serial/iuu_phoenix.c
++++ b/drivers/usb/serial/iuu_phoenix.c
+@@ -1046,7 +1046,6 @@ static int iuu_open(struct tty_struct *tty,
+               tty->termios->c_oflag = 0;
+               tty->termios->c_iflag = 0;
+               priv->termios_initialized = 1;
+-              tty->low_latency = 1;
+               priv->poll = 0;
+        }
+       spin_unlock_irqrestore(&priv->lock, flags);
+diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c
+index deba28e..5326c59 100644
+--- a/drivers/usb/serial/kobil_sct.c
++++ b/drivers/usb/serial/kobil_sct.c
+@@ -231,13 +231,7 @@ static int kobil_open(struct tty_struct *tty,
+       /* someone sets the dev to 0 if the close method has been called */
+       port->interrupt_in_urb->dev = port->serial->dev;
+-
+-      /* force low_latency on so that our tty_push actually forces
+-       * the data through, otherwise it is scheduled, and with high
+-       * data rates (like with OHCI) data can get lost.
+-       */
+       if (tty) {
+-              tty->low_latency = 1;
+               /* Default to echo off and other sane device settings */
+               tty->termios->c_lflag = 0;
+diff --git a/drivers/usb/serial/mos7720.c b/drivers/usb/serial/mos7720.c
+index 7c4917d..1c2402d 100644
+--- a/drivers/usb/serial/mos7720.c
++++ b/drivers/usb/serial/mos7720.c
+@@ -442,13 +442,6 @@ static int mos7720_open(struct tty_struct *tty,
+       data = 0x0c;
+       send_mos_cmd(serial, MOS_WRITE, port_number, 0x01, &data);
+-      /* force low_latency on so that our tty_push actually forces *
+-       * the data through,otherwise it is scheduled, and with      *
+-       * high data rates (like with OHCI) data can get lost.       */
+-
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* see if we've set up our endpoint info yet   *
+        * (can't set it up in mos7720_startup as the  *
+        * structures were not set up at that time.)   */
+diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c
+index 09d8206..8befcbb 100644
+--- a/drivers/usb/serial/mos7840.c
++++ b/drivers/usb/serial/mos7840.c
+@@ -990,12 +990,6 @@ static int mos7840_open(struct tty_struct *tty,
+       status = mos7840_set_reg_sync(port, mos7840_port->ControlRegOffset,
+                                                                       Data);
+-      /* force low_latency on so that our tty_push actually forces *
+-       * the data through,otherwise it is scheduled, and with      *
+-       * high data rates (like with OHCI) data can get lost.       */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* Check to see if we've set up our endpoint info yet    *
+        * (can't set it up in mos7840_startup as the structures *
+        * were not set up at that time.)                        */
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 211cd61..faa30ad 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -914,9 +914,6 @@ static int option_open(struct tty_struct *tty,
+                               usb_pipeout(urb->pipe), 0); */
+       }
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       option_send_setup(tty, port);
+       return 0;
+diff --git a/drivers/usb/serial/sierra.c b/drivers/usb/serial/sierra.c
+index ea1a103..639328b 100644
+--- a/drivers/usb/serial/sierra.c
++++ b/drivers/usb/serial/sierra.c
+@@ -576,9 +576,6 @@ static int sierra_open(struct tty_struct *tty,
+               }
+       }
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       sierra_send_setup(tty, port);
+       /* start up the interrupt endpoint if we have one */
+diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c
+index bc5e905..55b9d67 100644
+--- a/drivers/usb/serial/ti_usb_3410_5052.c
++++ b/drivers/usb/serial/ti_usb_3410_5052.c
+@@ -101,11 +101,10 @@
+ #define TI_TRANSFER_TIMEOUT   2
+-#define TI_DEFAULT_LOW_LATENCY        0
+ #define TI_DEFAULT_CLOSING_WAIT       4000            /* in .01 secs */
+ /* supported setserial flags */
+-#define TI_SET_SERIAL_FLAGS   (ASYNC_LOW_LATENCY)
++#define TI_SET_SERIAL_FLAGS   0
+ /* read urb states */
+ #define TI_READ_URB_RUNNING   0
+@@ -212,7 +211,6 @@ static int ti_buf_get(struct circ_buf *cb, char *buf, int count);
+ /* module parameters */
+ static int debug;
+-static int low_latency = TI_DEFAULT_LOW_LATENCY;
+ static int closing_wait = TI_DEFAULT_CLOSING_WAIT;
+ static ushort vendor_3410[TI_EXTRA_VID_PID_COUNT];
+ static unsigned int vendor_3410_count;
+@@ -333,10 +331,6 @@ MODULE_FIRMWARE("ti_5052.fw");
+ module_param(debug, bool, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(debug, "Enable debugging, 0=no, 1=yes");
+-module_param(low_latency, bool, S_IRUGO | S_IWUSR);
+-MODULE_PARM_DESC(low_latency,
+-              "TTY low_latency flag, 0=off, 1=on, default is off");
+-
+ module_param(closing_wait, int, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(closing_wait,
+     "Maximum wait for data to drain in close, in .01 secs, default is 4000");
+@@ -480,7 +474,6 @@ static int ti_startup(struct usb_serial *serial)
+               spin_lock_init(&tport->tp_lock);
+               tport->tp_uart_base_addr = (i == 0 ?
+                               TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR);
+-              tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0;
+               tport->tp_closing_wait = closing_wait;
+               init_waitqueue_head(&tport->tp_msr_wait);
+               init_waitqueue_head(&tport->tp_write_wait);
+@@ -560,10 +553,6 @@ static int ti_open(struct tty_struct *tty,
+       if (mutex_lock_interruptible(&tdev->td_open_close_lock))
+               return -ERESTARTSYS;
+-      if (tty)
+-              tty->low_latency =
+-                              (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+-
+       port_number = port->number - port->serial->minor;
+       memset(&(tport->tp_icount), 0x00, sizeof(tport->tp_icount));
+@@ -1480,10 +1469,6 @@ static int ti_set_serial_info(struct ti_port *tport,
+               return -EFAULT;
+       tport->tp_flags = new_serial.flags & TI_SET_SERIAL_FLAGS;
+-      /* FIXME */
+-      if (port->port.tty)
+-              port->port.tty->low_latency =
+-                      (tport->tp_flags & ASYNC_LOW_LATENCY) ? 1 : 0;
+       tport->tp_closing_wait = new_serial.closing_wait;
+       return 0;
+diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c
+index cf8924f..ec33fa5 100644
+--- a/drivers/usb/serial/visor.c
++++ b/drivers/usb/serial/visor.c
+@@ -296,14 +296,6 @@ static int visor_open(struct tty_struct *tty, struct usb_serial_port *port,
+       priv->throttled = 0;
+       spin_unlock_irqrestore(&priv->lock, flags);
+-      /*
+-       * Force low_latency on so that our tty_push actually forces the data
+-       * through, otherwise it is scheduled, and with high data rates (like
+-       * with OHCI) data can get lost.
+-       */
+-      if (tty)
+-              tty->low_latency = 1;
+-
+       /* Start reading from the device */
+       usb_fill_bulk_urb(port->read_urb, serial->dev,
+                          usb_rcvbulkpipe(serial->dev,
+diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
+index a53da14..0f04b70 100644
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
+@@ -908,18 +908,17 @@ struct ocfs2_write_cluster_desc {
+        */
+       unsigned        c_new;
+       unsigned        c_unwritten;
++      unsigned        c_needs_zero;
+ };
+-static inline int ocfs2_should_zero_cluster(struct ocfs2_write_cluster_desc *d)
+-{
+-      return d->c_new || d->c_unwritten;
+-}
+-
+ struct ocfs2_write_ctxt {
+       /* Logical cluster position / len of write */
+       u32                             w_cpos;
+       u32                             w_clen;
++      /* First cluster allocated in a nonsparse extend */
++      u32                             w_first_new_cpos;
++
+       struct ocfs2_write_cluster_desc w_desc[OCFS2_MAX_CLUSTERS_PER_PAGE];
+       /*
+@@ -997,6 +996,7 @@ static int ocfs2_alloc_write_ctxt(struct ocfs2_write_ctxt **wcp,
+               return -ENOMEM;
+       wc->w_cpos = pos >> osb->s_clustersize_bits;
++      wc->w_first_new_cpos = UINT_MAX;
+       cend = (pos + len - 1) >> osb->s_clustersize_bits;
+       wc->w_clen = cend - wc->w_cpos + 1;
+       get_bh(di_bh);
+@@ -1239,13 +1239,11 @@ static int ocfs2_write_cluster(struct address_space *mapping,
+                              struct ocfs2_write_ctxt *wc, u32 cpos,
+                              loff_t user_pos, unsigned user_len)
+ {
+-      int ret, i, new, should_zero = 0;
++      int ret, i, new;
+       u64 v_blkno, p_blkno;
+       struct inode *inode = mapping->host;
+       new = phys == 0 ? 1 : 0;
+-      if (new || unwritten)
+-              should_zero = 1;
+       if (new) {
+               u32 tmp_pos;
+@@ -1356,7 +1354,9 @@ static int ocfs2_write_cluster_by_desc(struct address_space *mapping,
+                       local_len = osb->s_clustersize - cluster_off;
+               ret = ocfs2_write_cluster(mapping, desc->c_phys,
+-                                        desc->c_unwritten, data_ac, meta_ac,
++                                        desc->c_unwritten,
++                                        desc->c_needs_zero,
++                                        data_ac, meta_ac,
+                                         wc, desc->c_cpos, pos, local_len);
+               if (ret) {
+                       mlog_errno(ret);
+@@ -1406,14 +1406,14 @@ static void ocfs2_set_target_boundaries(struct ocfs2_super *osb,
+                * newly allocated cluster.
+                */
+               desc = &wc->w_desc[0];
+-              if (ocfs2_should_zero_cluster(desc))
++              if (desc->c_needs_zero)
+                       ocfs2_figure_cluster_boundaries(osb,
+                                                       desc->c_cpos,
+                                                       &wc->w_target_from,
+                                                       NULL);
+               desc = &wc->w_desc[wc->w_clen - 1];
+-              if (ocfs2_should_zero_cluster(desc))
++              if (desc->c_needs_zero)
+                       ocfs2_figure_cluster_boundaries(osb,
+                                                       desc->c_cpos,
+                                                       NULL,
+@@ -1481,13 +1481,28 @@ static int ocfs2_populate_write_desc(struct inode *inode,
+                       phys++;
+               }
++              /*
++               * If w_first_new_cpos is < UINT_MAX, we have a non-sparse
++               * file that got extended.  w_first_new_cpos tells us
++               * where the newly allocated clusters are so we can
++               * zero them.
++               */
++              if (desc->c_cpos >= wc->w_first_new_cpos) {
++                      BUG_ON(phys == 0);
++                      desc->c_needs_zero = 1;
++              }
++
+               desc->c_phys = phys;
+               if (phys == 0) {
+                       desc->c_new = 1;
++                      desc->c_needs_zero = 1;
+                       *clusters_to_alloc = *clusters_to_alloc + 1;
+               }
+-              if (ext_flags & OCFS2_EXT_UNWRITTEN)
++
++              if (ext_flags & OCFS2_EXT_UNWRITTEN) {
+                       desc->c_unwritten = 1;
++                      desc->c_needs_zero = 1;
++              }
+               num_clusters--;
+       }
+@@ -1644,10 +1659,13 @@ static int ocfs2_expand_nonsparse_inode(struct inode *inode, loff_t pos,
+       if (newsize <= i_size_read(inode))
+               return 0;
+-      ret = ocfs2_extend_no_holes(inode, newsize, newsize - len);
++      ret = ocfs2_extend_no_holes(inode, newsize, pos);
+       if (ret)
+               mlog_errno(ret);
++      wc->w_first_new_cpos =
++              ocfs2_clusters_for_bytes(inode->i_sb, i_size_read(inode));
++
+       return ret;
+ }
+@@ -1656,7 +1674,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
+                            struct page **pagep, void **fsdata,
+                            struct buffer_head *di_bh, struct page *mmap_page)
+ {
+-      int ret, credits = OCFS2_INODE_UPDATE_CREDITS;
++      int ret, cluster_of_pages, credits = OCFS2_INODE_UPDATE_CREDITS;
+       unsigned int clusters_to_alloc, extents_to_split;
+       struct ocfs2_write_ctxt *wc;
+       struct inode *inode = mapping->host;
+@@ -1724,8 +1742,19 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
+       }
+-      ocfs2_set_target_boundaries(osb, wc, pos, len,
+-                                  clusters_to_alloc + extents_to_split);
++      /*
++       * We have to zero sparse allocated clusters, unwritten extent clusters,
++       * and non-sparse clusters we just extended.  For non-sparse writes,
++       * we know zeros will only be needed in the first and/or last cluster.
++       */
++      if (clusters_to_alloc || extents_to_split ||
++          (wc->w_clen && (wc->w_desc[0].c_needs_zero ||
++                          wc->w_desc[wc->w_clen - 1].c_needs_zero)))
++              cluster_of_pages = 1;
++      else
++              cluster_of_pages = 0;
++
++      ocfs2_set_target_boundaries(osb, wc, pos, len, cluster_of_pages);
+       handle = ocfs2_start_trans(osb, credits);
+       if (IS_ERR(handle)) {
+@@ -1753,8 +1782,7 @@ int ocfs2_write_begin_nolock(struct address_space *mapping,
+        * extent.
+        */
+       ret = ocfs2_grab_pages_for_write(mapping, wc, wc->w_cpos, pos,
+-                                       clusters_to_alloc + extents_to_split,
+-                                       mmap_page);
++                                       cluster_of_pages, mmap_page);
+       if (ret) {
+               mlog_errno(ret);
+               goto out_commit;
+diff --git a/include/asm-x86/kvm_host.h b/include/asm-x86/kvm_host.h
+index c2e34c2..cf7c887 100644
+--- a/include/asm-x86/kvm_host.h
++++ b/include/asm-x86/kvm_host.h
+@@ -195,6 +195,13 @@ struct kvm_mmu_page {
+       };
+ };
++struct kvm_pv_mmu_op_buffer {
++      void *ptr;
++      unsigned len;
++      unsigned processed;
++      char buf[512] __aligned(sizeof(long));
++};
++
+ /*
+  * x86 supports 3 paging modes (4-level 64-bit, 3-level 64-bit, and 2-level
+  * 32-bit).  The kvm_mmu structure abstracts the details of the current mmu
+@@ -237,6 +244,9 @@ struct kvm_vcpu_arch {
+       bool tpr_access_reporting;
+       struct kvm_mmu mmu;
++      /* only needed in kvm_pv_mmu_op() path, but it's hot so
++       * put it here to avoid allocation */
++      struct kvm_pv_mmu_op_buffer mmu_op_buffer;
+       struct kvm_mmu_memory_cache mmu_pte_chain_cache;
+       struct kvm_mmu_memory_cache mmu_rmap_desc_cache;
+diff --git a/include/linux/parport.h b/include/linux/parport.h
+index 6a0d7cd..986252e 100644
+--- a/include/linux/parport.h
++++ b/include/linux/parport.h
+@@ -326,6 +326,10 @@ struct parport {
+       int spintime;
+       atomic_t ref_count;
++      unsigned long devflags;
++#define PARPORT_DEVPROC_REGISTERED    0
++      struct pardevice *proc_device;  /* Currently register proc device */
++
+       struct list_head full_list;
+       struct parport *slaves[3];
+ };
+diff --git a/include/linux/sunrpc/xprt.h b/include/linux/sunrpc/xprt.h
+index 4d80a11..75a87fe 100644
+--- a/include/linux/sunrpc/xprt.h
++++ b/include/linux/sunrpc/xprt.h
+@@ -260,6 +260,7 @@ void                       xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
+ #define XPRT_BOUND            (4)
+ #define XPRT_BINDING          (5)
+ #define XPRT_CLOSING          (6)
++#define XPRT_CONNECTION_CLOSE (8)
+ static inline void xprt_set_connected(struct rpc_xprt *xprt)
+ {
+diff --git a/kernel/fork.c b/kernel/fork.c
+index fcbd28c..3fdf3d5 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -767,11 +767,9 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)
+       struct signal_struct *sig;
+       int ret;
+-      if (clone_flags & CLONE_THREAD) {
+-              atomic_inc(&current->signal->count);
+-              atomic_inc(&current->signal->live);
++      if (clone_flags & CLONE_THREAD)
+               return 0;
+-      }
++
+       sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);
+       tsk->signal = sig;
+       if (!sig)
+@@ -844,16 +842,6 @@ void __cleanup_signal(struct signal_struct *sig)
+       kmem_cache_free(signal_cachep, sig);
+ }
+-static void cleanup_signal(struct task_struct *tsk)
+-{
+-      struct signal_struct *sig = tsk->signal;
+-
+-      atomic_dec(&sig->live);
+-
+-      if (atomic_dec_and_test(&sig->count))
+-              __cleanup_signal(sig);
+-}
+-
+ static void copy_flags(unsigned long clone_flags, struct task_struct *p)
+ {
+       unsigned long new_flags = p->flags;
+@@ -1201,6 +1189,8 @@ static struct task_struct *copy_process(unsigned long clone_flags,
+       }
+       if (clone_flags & CLONE_THREAD) {
++              atomic_inc(&current->signal->count);
++              atomic_inc(&current->signal->live);
+               p->group_leader = current->group_leader;
+               list_add_tail_rcu(&p->thread_group, &p->group_leader->thread_group);
+@@ -1261,7 +1251,8 @@ bad_fork_cleanup_mm:
+       if (p->mm)
+               mmput(p->mm);
+ bad_fork_cleanup_signal:
+-      cleanup_signal(p);
++      if (!(clone_flags & CLONE_THREAD))
++              __cleanup_signal(p->signal);
+ bad_fork_cleanup_sighand:
+       __cleanup_sighand(p->sighand);
+ bad_fork_cleanup_fs:
+diff --git a/kernel/kthread.c b/kernel/kthread.c
+index 96cff2f..9548d52 100644
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -213,12 +213,12 @@ int kthread_stop(struct task_struct *k)
+       /* Now set kthread_should_stop() to true, and wake it up. */
+       kthread_stop_info.k = k;
+       wake_up_process(k);
+-      put_task_struct(k);
+       /* Once it dies, reset stop ptr, gather result and we're done. */
+       wait_for_completion(&kthread_stop_info.done);
+       kthread_stop_info.k = NULL;
+       ret = kthread_stop_info.err;
++      put_task_struct(k);
+       mutex_unlock(&kthread_stop_lock);
+       return ret;
+diff --git a/kernel/signal.c b/kernel/signal.c
+index 7d0a222..de2b649 100644
+--- a/kernel/signal.c
++++ b/kernel/signal.c
+@@ -2353,11 +2353,9 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
+       stack_t oss;
+       int error;
+-      if (uoss) {
+-              oss.ss_sp = (void __user *) current->sas_ss_sp;
+-              oss.ss_size = current->sas_ss_size;
+-              oss.ss_flags = sas_ss_flags(sp);
+-      }
++      oss.ss_sp = (void __user *) current->sas_ss_sp;
++      oss.ss_size = current->sas_ss_size;
++      oss.ss_flags = sas_ss_flags(sp);
+       if (uss) {
+               void __user *ss_sp;
+@@ -2400,13 +2398,16 @@ do_sigaltstack (const stack_t __user *uss, stack_t __user *uoss, unsigned long s
+               current->sas_ss_size = ss_size;
+       }
++      error = 0;
+       if (uoss) {
+               error = -EFAULT;
+-              if (copy_to_user(uoss, &oss, sizeof(oss)))
++              if (!access_ok(VERIFY_WRITE, uoss, sizeof(*uoss)))
+                       goto out;
++              error = __put_user(oss.ss_sp, &uoss->ss_sp) |
++                      __put_user(oss.ss_size, &uoss->ss_size) |
++                      __put_user(oss.ss_flags, &uoss->ss_flags);
+       }
+-      error = 0;
+ out:
+       return error;
+ }
+diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
+index 0c85042..8067dc7 100644
+--- a/net/appletalk/ddp.c
++++ b/net/appletalk/ddp.c
+@@ -1245,6 +1245,7 @@ static int atalk_getname(struct socket *sock, struct sockaddr *uaddr,
+                       return -ENOBUFS;
+       *uaddr_len = sizeof(struct sockaddr_at);
++      memset(&sat.sat_zero, 0, sizeof(sat.sat_zero));
+       if (peer) {
+               if (sk->sk_state != TCP_ESTABLISHED)
+diff --git a/net/can/raw.c b/net/can/raw.c
+index 6e0663f..08f31d4 100644
+--- a/net/can/raw.c
++++ b/net/can/raw.c
+@@ -396,6 +396,7 @@ static int raw_getname(struct socket *sock, struct sockaddr *uaddr,
+       if (peer)
+               return -EOPNOTSUPP;
++      memset(addr, 0, sizeof(*addr));
+       addr->can_family  = AF_CAN;
+       addr->can_ifindex = ro->ifindex;
+diff --git a/net/econet/af_econet.c b/net/econet/af_econet.c
+index 8789d2b..9aae86f 100644
+--- a/net/econet/af_econet.c
++++ b/net/econet/af_econet.c
+@@ -520,6 +520,7 @@ static int econet_getname(struct socket *sock, struct sockaddr *uaddr,
+       if (peer)
+               return -EOPNOTSUPP;
++      memset(sec, 0, sizeof(*sec));
+       mutex_lock(&econet_mutex);
+       sk = sock->sk;
+diff --git a/net/irda/af_irda.c b/net/irda/af_irda.c
+index 3eb5bcc..b28409c 100644
+--- a/net/irda/af_irda.c
++++ b/net/irda/af_irda.c
+@@ -714,6 +714,7 @@ static int irda_getname(struct socket *sock, struct sockaddr *uaddr,
+       struct sock *sk = sock->sk;
+       struct irda_sock *self = irda_sk(sk);
++      memset(&saddr, 0, sizeof(saddr));
+       if (peer) {
+               if (sk->sk_state != TCP_ESTABLISHED)
+                       return -ENOTCONN;
+diff --git a/net/llc/af_llc.c b/net/llc/af_llc.c
+index 5bcc452..90a55b1 100644
+--- a/net/llc/af_llc.c
++++ b/net/llc/af_llc.c
+@@ -915,6 +915,7 @@ static int llc_ui_getname(struct socket *sock, struct sockaddr *uaddr,
+       struct llc_sock *llc = llc_sk(sk);
+       int rc = 0;
++      memset(&sllc, 0, sizeof(sllc));
+       lock_sock(sk);
+       if (sock_flag(sk, SOCK_ZAPPED))
+               goto out;
+diff --git a/net/netrom/af_netrom.c b/net/netrom/af_netrom.c
+index db9e263..ad72bde 100644
+--- a/net/netrom/af_netrom.c
++++ b/net/netrom/af_netrom.c
+@@ -848,6 +848,7 @@ static int nr_getname(struct socket *sock, struct sockaddr *uaddr,
+               sax->fsa_ax25.sax25_family = AF_NETROM;
+               sax->fsa_ax25.sax25_ndigis = 1;
+               sax->fsa_ax25.sax25_call   = nr->user_addr;
++              memset(sax->fsa_digipeater, 0, sizeof(sax->fsa_digipeater));
+               sax->fsa_digipeater[0]     = nr->dest_addr;
+               *uaddr_len = sizeof(struct full_sockaddr_ax25);
+       } else {
+diff --git a/net/rose/af_rose.c b/net/rose/af_rose.c
+index c062361..f132243 100644
+--- a/net/rose/af_rose.c
++++ b/net/rose/af_rose.c
+@@ -957,6 +957,7 @@ static int rose_getname(struct socket *sock, struct sockaddr *uaddr,
+       struct rose_sock *rose = rose_sk(sk);
+       int n;
++      memset(srose, 0, sizeof(*srose));
+       if (peer != 0) {
+               if (sk->sk_state != TCP_ESTABLISHED)
+                       return -ENOTCONN;
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index 66cfe88..860b1d4 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -860,6 +860,7 @@ static inline void
+ rpc_task_force_reencode(struct rpc_task *task)
+ {
+       task->tk_rqstp->rq_snd_buf.len = 0;
++      task->tk_rqstp->rq_bytes_sent = 0;
+ }
+ static inline void
+diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
+index 99a52aa..b66be67 100644
+--- a/net/sunrpc/xprt.c
++++ b/net/sunrpc/xprt.c
+@@ -645,10 +645,8 @@ xprt_init_autodisconnect(unsigned long data)
+       if (test_and_set_bit(XPRT_LOCKED, &xprt->state))
+               goto out_abort;
+       spin_unlock(&xprt->transport_lock);
+-      if (xprt_connecting(xprt))
+-              xprt_release_write(xprt, NULL);
+-      else
+-              queue_work(rpciod_workqueue, &xprt->task_cleanup);
++      set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
++      queue_work(rpciod_workqueue, &xprt->task_cleanup);
+       return;
+ out_abort:
+       spin_unlock(&xprt->transport_lock);
+diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c
+index 8f9295d..a283304 100644
+--- a/net/sunrpc/xprtsock.c
++++ b/net/sunrpc/xprtsock.c
+@@ -748,6 +748,9 @@ out_release:
+  *
+  * This is used when all requests are complete; ie, no DRC state remains
+  * on the server we want to save.
++ *
++ * The caller _must_ be holding XPRT_LOCKED in order to avoid issues with
++ * xs_reset_transport() zeroing the socket from underneath a writer.
+  */
+ static void xs_close(struct rpc_xprt *xprt)
+ {
+@@ -781,6 +784,14 @@ clear_close_wait:
+       xprt_disconnect_done(xprt);
+ }
++static void xs_tcp_close(struct rpc_xprt *xprt)
++{
++      if (test_and_clear_bit(XPRT_CONNECTION_CLOSE, &xprt->state))
++              xs_close(xprt);
++      else
++              xs_tcp_shutdown(xprt);
++}
++
+ /**
+  * xs_destroy - prepare to shutdown a transport
+  * @xprt: doomed transport
+@@ -1676,11 +1687,21 @@ static void xs_tcp_connect_worker4(struct work_struct *work)
+                               goto out_clear;
+                       case -ECONNREFUSED:
+                       case -ECONNRESET:
++                      case -ENETUNREACH:
+                               /* retry with existing socket, after a delay */
+-                              break;
++                              goto out_clear;
+                       default:
+                               /* get rid of existing socket, and retry */
+                               xs_tcp_shutdown(xprt);
++                              printk("%s: connect returned unhandled error %d\n",
++                                              __func__, status);
++                      case -EADDRNOTAVAIL:
++                              /* We're probably in TIME_WAIT. Get rid of existing socket,
++                               * and retry
++                               */
++                              set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
++                              xprt_force_disconnect(xprt);
++                              status = -EAGAIN;
+               }
+       }
+ out:
+@@ -1735,11 +1756,21 @@ static void xs_tcp_connect_worker6(struct work_struct *work)
+                               goto out_clear;
+                       case -ECONNREFUSED:
+                       case -ECONNRESET:
++                      case -ENETUNREACH:
+                               /* retry with existing socket, after a delay */
+-                              break;
++                              goto out_clear;
+                       default:
+                               /* get rid of existing socket, and retry */
+                               xs_tcp_shutdown(xprt);
++                              printk("%s: connect returned unhandled error %d\n",
++                                              __func__, status);
++                      case -EADDRNOTAVAIL:
++                              /* We're probably in TIME_WAIT. Get rid of existing socket,
++                               * and retry
++                               */
++                              set_bit(XPRT_CONNECTION_CLOSE, &xprt->state);
++                              xprt_force_disconnect(xprt);
++                              status = -EAGAIN;
+               }
+       }
+ out:
+@@ -1871,7 +1902,7 @@ static struct rpc_xprt_ops xs_tcp_ops = {
+       .buf_free               = rpc_free,
+       .send_request           = xs_tcp_send_request,
+       .set_retrans_timeout    = xprt_set_retrans_timeout_def,
+-      .close                  = xs_tcp_shutdown,
++      .close                  = xs_tcp_close,
+       .destroy                = xs_destroy,
+       .print_stats            = xs_tcp_print_stats,
+ };
+diff --git a/sound/core/pcm_lib.c b/sound/core/pcm_lib.c
+index 1533f03..4cfbd79 100644
+--- a/sound/core/pcm_lib.c
++++ b/sound/core/pcm_lib.c
+@@ -779,47 +779,24 @@ static int snd_interval_ratden(struct snd_interval *i,
+ int snd_interval_list(struct snd_interval *i, unsigned int count, unsigned int *list, unsigned int mask)
+ {
+         unsigned int k;
+-      int changed = 0;
++      struct snd_interval list_range;
+       if (!count) {
+               i->empty = 1;
+               return -EINVAL;
+       }
++      snd_interval_any(&list_range);
++      list_range.min = UINT_MAX;
++      list_range.max = 0;
+         for (k = 0; k < count; k++) {
+               if (mask && !(mask & (1 << k)))
+                       continue;
+-                if (i->min == list[k] && !i->openmin)
+-                        goto _l1;
+-                if (i->min < list[k]) {
+-                        i->min = list[k];
+-                      i->openmin = 0;
+-                      changed = 1;
+-                        goto _l1;
+-                }
+-        }
+-        i->empty = 1;
+-        return -EINVAL;
+- _l1:
+-        for (k = count; k-- > 0;) {
+-              if (mask && !(mask & (1 << k)))
++              if (!snd_interval_test(i, list[k]))
+                       continue;
+-                if (i->max == list[k] && !i->openmax)
+-                        goto _l2;
+-                if (i->max > list[k]) {
+-                        i->max = list[k];
+-                      i->openmax = 0;
+-                      changed = 1;
+-                        goto _l2;
+-                }
++              list_range.min = min(list_range.min, list[k]);
++              list_range.max = max(list_range.max, list[k]);
+         }
+-        i->empty = 1;
+-        return -EINVAL;
+- _l2:
+-      if (snd_interval_checkempty(i)) {
+-              i->empty = 1;
+-              return -EINVAL;
+-      }
+-        return changed;
++      return snd_interval_refine(i, &list_range);
+ }
+ EXPORT_SYMBOL(snd_interval_list);
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 07f8dcc..2581b8c 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -5580,9 +5580,9 @@ static struct hda_verb alc885_mbp_ch2_init[] = {
+ };
+ /*
+- * 6ch mode
++ * 4ch mode
+  */
+-static struct hda_verb alc885_mbp_ch6_init[] = {
++static struct hda_verb alc885_mbp_ch4_init[] = {
+       { 0x1a, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
+       { 0x1a, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       { 0x1a, AC_VERB_SET_CONNECT_SEL, 0x01 },
+@@ -5591,9 +5591,9 @@ static struct hda_verb alc885_mbp_ch6_init[] = {
+       { } /* end */
+ };
+-static struct hda_channel_mode alc885_mbp_6ch_modes[2] = {
++static struct hda_channel_mode alc885_mbp_4ch_modes[2] = {
+       { 2, alc885_mbp_ch2_init },
+-      { 6, alc885_mbp_ch6_init },
++      { 4, alc885_mbp_ch4_init },
+ };
+@@ -5628,10 +5628,11 @@ static struct snd_kcontrol_new alc882_base_mixer[] = {
+ };
+ static struct snd_kcontrol_new alc885_mbp3_mixer[] = {
+-      HDA_CODEC_VOLUME("Front Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
+-      HDA_BIND_MUTE   ("Front Playback Switch", 0x0c, 0x02, HDA_INPUT),
+-      HDA_CODEC_MUTE  ("Speaker Playback Switch", 0x14, 0x00, HDA_OUTPUT),
+-      HDA_CODEC_VOLUME("Line-Out Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
++      HDA_CODEC_VOLUME("Speaker Playback Volume", 0x0c, 0x00, HDA_OUTPUT),
++      HDA_BIND_MUTE   ("Speaker Playback Switch", 0x0c, 0x02, HDA_INPUT),
++      HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0e, 0x00, HDA_OUTPUT),
++      HDA_BIND_MUTE   ("Headphone Playback Switch", 0x0e, 0x02, HDA_INPUT),
++      HDA_CODEC_VOLUME("Surround Playback Volume", 0x0d, 0x00, HDA_OUTPUT),
+       HDA_CODEC_VOLUME("Line Playback Volume", 0x0b, 0x02, HDA_INPUT),
+       HDA_CODEC_MUTE  ("Line Playback Switch", 0x0b, 0x02, HDA_INPUT),
+       HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x00, HDA_INPUT),
+@@ -5879,14 +5880,18 @@ static struct hda_verb alc885_mbp3_init_verbs[] = {
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
+       {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
++      /* HP mixer */
++      {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_ZERO},
++      {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(0)},
++      {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_MUTE(1)},
+       /* Front Pin: output 0 (0x0c) */
+       {0x14, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
+       {0x14, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
+       {0x14, AC_VERB_SET_CONNECT_SEL, 0x00},
+-      /* HP Pin: output 0 (0x0d) */
++      /* HP Pin: output 0 (0x0e) */
+       {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, 0xc4},
+-      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_MUTE},
+-      {0x15, AC_VERB_SET_CONNECT_SEL, 0x00},
++      {0x15, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
++      {0x15, AC_VERB_SET_CONNECT_SEL, 0x02},
+       {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, ALC880_HP_EVENT | AC_USRSP_EN},
+       /* Mic (rear) pin: input vref at 80% */
+       {0x18, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_VREF80},
+@@ -6326,10 +6331,11 @@ static struct alc_config_preset alc882_presets[] = {
+               .mixers = { alc885_mbp3_mixer, alc882_chmode_mixer },
+               .init_verbs = { alc885_mbp3_init_verbs,
+                               alc880_gpio1_init_verbs },
+-              .num_dacs = ARRAY_SIZE(alc882_dac_nids),
++              .num_dacs = 2,
+               .dac_nids = alc882_dac_nids,
+-              .channel_mode = alc885_mbp_6ch_modes,
+-              .num_channel_mode = ARRAY_SIZE(alc885_mbp_6ch_modes),
++              .hp_nid = 0x04,
++              .channel_mode = alc885_mbp_4ch_modes,
++              .num_channel_mode = ARRAY_SIZE(alc885_mbp_4ch_modes),
+               .input_mux = &alc882_capture_source,
+               .dig_out_nid = ALC882_DIGOUT_NID,
+               .dig_in_nid = ALC882_DIGIN_NID,
+@@ -11634,6 +11640,8 @@ static int patch_alc269(struct hda_codec *codec)
+       spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
+       spec->capsrc_nids = alc269_capsrc_nids;
++      spec->vmaster_nid = 0x02;
++
+       codec->patch_ops = alc_patch_ops;
+       if (board_config == ALC269_AUTO)
+               spec->init_hook = alc269_auto_init;
+diff --git a/virt/kvm/kvm_main.c b/virt/kvm/kvm_main.c
+index 7dd9b0b..db062b5 100644
+--- a/virt/kvm/kvm_main.c
++++ b/virt/kvm/kvm_main.c
+@@ -406,6 +406,8 @@ static void kvm_destroy_vm(struct kvm *kvm)
+ #endif
+ #if defined(CONFIG_MMU_NOTIFIER) && defined(KVM_ARCH_WANT_MMU_NOTIFIER)
+       mmu_notifier_unregister(&kvm->mmu_notifier, kvm->mm);
++#else
++      kvm_arch_flush_shadow(kvm);
+ #endif
+       kvm_arch_destroy_vm(kvm);
+       mmdrop(mm);
+@@ -548,6 +550,8 @@ int __kvm_set_memory_region(struct kvm *kvm,
+               if (!new.dirty_bitmap)
+                       goto out_free;
+               memset(new.dirty_bitmap, 0, dirty_bytes);
++              if (old.npages)
++                      kvm_arch_flush_shadow(kvm);
+       }
+ #endif /* not defined CONFIG_S390 */
+@@ -726,7 +730,7 @@ pfn_t gfn_to_pfn(struct kvm *kvm, gfn_t gfn)
+               return page_to_pfn(bad_page);
+       }
+-      npages = get_user_pages(current, current->mm, addr, 1, 1, 1, page,
++      npages = get_user_pages(current, current->mm, addr, 1, 1, 0, page,
+                               NULL);
+       if (unlikely(npages != 1)) {
+@@ -1074,12 +1078,11 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, int n)
+       r = kvm_arch_vcpu_setup(vcpu);
+       if (r)
+-              goto vcpu_destroy;
++              return r;
+       mutex_lock(&kvm->lock);
+       if (kvm->vcpus[n]) {
+               r = -EEXIST;
+-              mutex_unlock(&kvm->lock);
+               goto vcpu_destroy;
+       }
+       kvm->vcpus[n] = vcpu;
+@@ -1095,8 +1098,8 @@ static int kvm_vm_ioctl_create_vcpu(struct kvm *kvm, int n)
+ unlink:
+       mutex_lock(&kvm->lock);
+       kvm->vcpus[n] = NULL;
+-      mutex_unlock(&kvm->lock);
+ vcpu_destroy:
++      mutex_unlock(&kvm->lock);
+       kvm_arch_vcpu_destroy(vcpu);
+       return r;
+ }
+@@ -1118,6 +1121,8 @@ static long kvm_vcpu_ioctl(struct file *filp,
+       struct kvm_vcpu *vcpu = filp->private_data;
+       void __user *argp = (void __user *)arg;
+       int r;
++      struct kvm_fpu *fpu = NULL;
++      struct kvm_sregs *kvm_sregs = NULL;
+       if (vcpu->kvm->mm != current->mm)
+               return -EIO;
+@@ -1165,25 +1170,28 @@ out_free2:
+               break;
+       }
+       case KVM_GET_SREGS: {
+-              struct kvm_sregs kvm_sregs;
+-
+-              memset(&kvm_sregs, 0, sizeof kvm_sregs);
+-              r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, &kvm_sregs);
++              kvm_sregs = kzalloc(sizeof(struct kvm_sregs), GFP_KERNEL);
++              r = -ENOMEM;
++              if (!kvm_sregs)
++                      goto out;
++              r = kvm_arch_vcpu_ioctl_get_sregs(vcpu, kvm_sregs);
+               if (r)
+                       goto out;
+               r = -EFAULT;
+-              if (copy_to_user(argp, &kvm_sregs, sizeof kvm_sregs))
++              if (copy_to_user(argp, kvm_sregs, sizeof(struct kvm_sregs)))
+                       goto out;
+               r = 0;
+               break;
+       }
+       case KVM_SET_SREGS: {
+-              struct kvm_sregs kvm_sregs;
+-
++              kvm_sregs = kmalloc(sizeof(struct kvm_sregs), GFP_KERNEL);
++              r = -ENOMEM;
++              if (!kvm_sregs)
++                      goto out;
+               r = -EFAULT;
+-              if (copy_from_user(&kvm_sregs, argp, sizeof kvm_sregs))
++              if (copy_from_user(kvm_sregs, argp, sizeof(struct kvm_sregs)))
+                       goto out;
+-              r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, &kvm_sregs);
++              r = kvm_arch_vcpu_ioctl_set_sregs(vcpu, kvm_sregs);
+               if (r)
+                       goto out;
+               r = 0;
+@@ -1264,25 +1272,28 @@ out_free2:
+               break;
+       }
+       case KVM_GET_FPU: {
+-              struct kvm_fpu fpu;
+-
+-              memset(&fpu, 0, sizeof fpu);
+-              r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, &fpu);
++              fpu = kzalloc(sizeof(struct kvm_fpu), GFP_KERNEL);
++              r = -ENOMEM;
++              if (!fpu)
++                      goto out;
++              r = kvm_arch_vcpu_ioctl_get_fpu(vcpu, fpu);
+               if (r)
+                       goto out;
+               r = -EFAULT;
+-              if (copy_to_user(argp, &fpu, sizeof fpu))
++              if (copy_to_user(argp, fpu, sizeof(struct kvm_fpu)))
+                       goto out;
+               r = 0;
+               break;
+       }
+       case KVM_SET_FPU: {
+-              struct kvm_fpu fpu;
+-
++              fpu = kmalloc(sizeof(struct kvm_fpu), GFP_KERNEL);
++              r = -ENOMEM;
++              if (!fpu)
++                      goto out;
+               r = -EFAULT;
+-              if (copy_from_user(&fpu, argp, sizeof fpu))
++              if (copy_from_user(fpu, argp, sizeof(struct kvm_fpu)))
+                       goto out;
+-              r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, &fpu);
++              r = kvm_arch_vcpu_ioctl_set_fpu(vcpu, fpu);
+               if (r)
+                       goto out;
+               r = 0;
+@@ -1292,6 +1303,8 @@ out_free2:
+               r = kvm_arch_vcpu_ioctl(filp, ioctl, arg);
+       }
+ out:
++      kfree(fpu);
++      kfree(kvm_sregs);
+       return r;
+ }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.32-33 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.32-33
new file mode 100644 (file)
index 0000000..b215005
--- /dev/null
@@ -0,0 +1,30 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.33
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 00dc0ee..1b2c0fb 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .32
++EXTRAVERSION = .33
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/fs/ocfs2/aops.c b/fs/ocfs2/aops.c
+index 0f04b70..4039637 100644
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
+@@ -1234,6 +1234,7 @@ out:
+  */
+ static int ocfs2_write_cluster(struct address_space *mapping,
+                              u32 phys, unsigned int unwritten,
++                             unsigned int should_zero,
+                              struct ocfs2_alloc_context *data_ac,
+                              struct ocfs2_alloc_context *meta_ac,
+                              struct ocfs2_write_ctxt *wc, u32 cpos,
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.33-34 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.33-34
new file mode 100644 (file)
index 0000000..d61550b
--- /dev/null
@@ -0,0 +1,91 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.34
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 1b2c0fb..1debf9a 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .33
++EXTRAVERSION = .34
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/net/e100.c b/drivers/net/e100.c
+index d991167..c68c57b 100644
+--- a/drivers/net/e100.c
++++ b/drivers/net/e100.c
+@@ -1842,7 +1842,7 @@ static int e100_rx_indicate(struct nic *nic, struct rx *rx,
+                               nic->ru_running = RU_SUSPENDED;
+               pci_dma_sync_single_for_device(nic->pdev, rx->dma_addr,
+                                              sizeof(struct rfd),
+-                                             PCI_DMA_BIDIRECTIONAL);
++                                             PCI_DMA_FROMDEVICE);
+               return -ENODATA;
+       }
+diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c
+index 0e78b00..4d89e5f 100644
+--- a/fs/jffs2/wbuf.c
++++ b/fs/jffs2/wbuf.c
+@@ -1271,10 +1271,20 @@ int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) {
+       if (!c->wbuf)
+               return -ENOMEM;
++#ifdef CONFIG_JFFS2_FS_WBUF_VERIFY
++      c->wbuf_verify = kmalloc(c->wbuf_pagesize, GFP_KERNEL);
++      if (!c->wbuf_verify) {
++              kfree(c->wbuf);
++              return -ENOMEM;
++      }
++#endif
+       return 0;
+ }
+ void jffs2_nor_wbuf_flash_cleanup(struct jffs2_sb_info *c) {
++#ifdef CONFIG_JFFS2_FS_WBUF_VERIFY
++      kfree(c->wbuf_verify);
++#endif
+       kfree(c->wbuf);
+ }
+diff --git a/mm/slub.c b/mm/slub.c
+index f0175b4..cbf856b 100644
+--- a/mm/slub.c
++++ b/mm/slub.c
+@@ -2447,8 +2447,6 @@ static inline int kmem_cache_close(struct kmem_cache *s)
+  */
+ void kmem_cache_destroy(struct kmem_cache *s)
+ {
+-      if (s->flags & SLAB_DESTROY_BY_RCU)
+-              rcu_barrier();
+       down_write(&slub_lock);
+       s->refcount--;
+       if (!s->refcount) {
+@@ -2459,6 +2457,8 @@ void kmem_cache_destroy(struct kmem_cache *s)
+                               "still has objects.\n", s->name, __func__);
+                       dump_stack();
+               }
++              if (s->flags & SLAB_DESTROY_BY_RCU)
++                      rcu_barrier();
+               sysfs_slab_remove(s);
+       } else
+               up_write(&slub_lock);
+diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
+index 7c52fe2..656f6fb 100644
+--- a/net/core/net_namespace.c
++++ b/net/core/net_namespace.c
+@@ -446,7 +446,7 @@ int net_assign_generic(struct net *net, int id, void *data)
+       ng->len = id;
+       INIT_RCU_HEAD(&ng->rcu);
+-      memcpy(&ng->ptr, &old_ng->ptr, old_ng->len);
++      memcpy(&ng->ptr, &old_ng->ptr, old_ng->len * sizeof(void*));
+       rcu_assign_pointer(net->gen, ng);
+       call_rcu(&old_ng->rcu, net_generic_release);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.34-35 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.34-35
new file mode 100644 (file)
index 0000000..a021a0e
--- /dev/null
@@ -0,0 +1,541 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.35
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 1debf9a..5768979 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .34
++EXTRAVERSION = .35
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/include/asm/mmu-hash64.h b/arch/powerpc/include/asm/mmu-hash64.h
+index c2df53c..cd1f704 100644
+--- a/arch/powerpc/include/asm/mmu-hash64.h
++++ b/arch/powerpc/include/asm/mmu-hash64.h
+@@ -41,6 +41,7 @@ extern char initial_stab[];
+ #define SLB_NUM_BOLTED                3
+ #define SLB_CACHE_ENTRIES     8
++#define SLB_MIN_SIZE          32
+ /* Bits in the SLB ESID word */
+ #define SLB_ESID_V            ASM_CONST(0x0000000008000000) /* valid */
+@@ -299,6 +300,7 @@ extern void slb_flush_and_rebolt(void);
+ extern void stab_initialize(unsigned long stab);
+ extern void slb_vmalloc_update(void);
++extern void slb_set_size(u16 size);
+ #endif /* __ASSEMBLY__ */
+ /*
+diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c
+index b3eef30..c729910 100644
+--- a/arch/powerpc/kernel/lparcfg.c
++++ b/arch/powerpc/kernel/lparcfg.c
+@@ -35,6 +35,7 @@
+ #include <asm/prom.h>
+ #include <asm/vdso_datapage.h>
+ #include <asm/vio.h>
++#include <asm/mmu.h>
+ #define MODULE_VERS "1.8"
+ #define MODULE_NAME "lparcfg"
+@@ -485,6 +486,8 @@ static int pseries_lparcfg_data(struct seq_file *m, void *v)
+       seq_printf(m, "shared_processor_mode=%d\n", lppaca[0].shared_proc);
++      seq_printf(m, "slb_size=%d\n", mmu_slb_size);
++
+       return 0;
+ }
+diff --git a/arch/powerpc/kernel/rtas.c b/arch/powerpc/kernel/rtas.c
+index 1f8505c..49e6d91 100644
+--- a/arch/powerpc/kernel/rtas.c
++++ b/arch/powerpc/kernel/rtas.c
+@@ -38,6 +38,7 @@
+ #include <asm/syscalls.h>
+ #include <asm/smp.h>
+ #include <asm/atomic.h>
++#include <asm/mmu.h>
+ struct rtas_t rtas = {
+       .lock = SPIN_LOCK_UNLOCKED
+@@ -665,6 +666,7 @@ static void rtas_percpu_suspend_me(void *info)
+ {
+       long rc;
+       unsigned long msr_save;
++      u16 slb_size = mmu_slb_size;
+       int cpu;
+       struct rtas_suspend_me_data *data =
+               (struct rtas_suspend_me_data *)info;
+@@ -686,13 +688,16 @@ static void rtas_percpu_suspend_me(void *info)
+               /* All other cpus are in H_JOIN, this cpu does
+                * the suspend.
+                */
++              slb_set_size(SLB_MIN_SIZE);
+               printk(KERN_DEBUG "calling ibm,suspend-me on cpu %i\n",
+                      smp_processor_id());
+               data->error = rtas_call(data->token, 0, 1, NULL);
+-              if (data->error)
++              if (data->error) {
+                       printk(KERN_DEBUG "ibm,suspend-me returned %d\n",
+                              data->error);
++                      slb_set_size(slb_size);
++              }
+       } else {
+               printk(KERN_ERR "H_JOIN on cpu %i failed with rc = %ld\n",
+                      smp_processor_id(), rc);
+diff --git a/arch/powerpc/mm/slb.c b/arch/powerpc/mm/slb.c
+index 89497fb..4d73765 100644
+--- a/arch/powerpc/mm/slb.c
++++ b/arch/powerpc/mm/slb.c
+@@ -247,14 +247,22 @@ void switch_slb(struct task_struct *tsk, struct mm_struct *mm)
+ static inline void patch_slb_encoding(unsigned int *insn_addr,
+                                     unsigned int immed)
+ {
+-      /* Assume the instruction had a "0" immediate value, just
+-       * "or" in the new value
+-       */
+-      *insn_addr |= immed;
++      *insn_addr = (*insn_addr & 0xffff0000) | immed;
+       flush_icache_range((unsigned long)insn_addr, 4+
+                          (unsigned long)insn_addr);
+ }
++void slb_set_size(u16 size)
++{
++      extern unsigned int *slb_compare_rr_to_size;
++
++      if (mmu_slb_size == size)
++              return;
++
++      mmu_slb_size = size;
++      patch_slb_encoding(slb_compare_rr_to_size, mmu_slb_size);
++}
++
+ void slb_initialize(void)
+ {
+       unsigned long linear_llp, vmalloc_llp, io_llp;
+diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c
+index 7637bd3..e67e18d 100644
+--- a/arch/powerpc/platforms/pseries/reconfig.c
++++ b/arch/powerpc/platforms/pseries/reconfig.c
+@@ -20,6 +20,7 @@
+ #include <asm/machdep.h>
+ #include <asm/uaccess.h>
+ #include <asm/pSeries_reconfig.h>
++#include <asm/mmu.h>
+@@ -439,9 +440,15 @@ static int do_update_property(char *buf, size_t bufsize)
+       if (!newprop)
+               return -ENOMEM;
++      if (!strcmp(name, "slb-size") || !strcmp(name, "ibm,slb-size"))
++              slb_set_size(*(int *)value);
++
+       oldprop = of_find_property(np, name,NULL);
+-      if (!oldprop)
++      if (!oldprop) {
++              if (strlen(name))
++                      return prom_add_property(np, newprop);
+               return -ENODEV;
++      }
+       rc = prom_update_property(np, newprop, oldprop);
+       if (rc)
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 2bcf350..5cdd821 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -565,7 +565,13 @@ u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
+               head = tf->device & 0xf;
+               sect = tf->lbal;
+-              block = (cyl * dev->heads + head) * dev->sectors + sect;
++              if (!sect) {
++                      ata_dev_printk(dev, KERN_WARNING, "device reported "
++                                     "invalid CHS sector 0\n");
++                      sect = 1; /* oh well */
++              }
++
++              block = (cyl * dev->heads + head) * dev->sectors + sect - 1;
+       }
+       return block;
+diff --git a/drivers/char/tpm/tpm_tis.c b/drivers/char/tpm/tpm_tis.c
+index ed1879c..4180b55 100644
+--- a/drivers/char/tpm/tpm_tis.c
++++ b/drivers/char/tpm/tpm_tis.c
+@@ -450,6 +450,12 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
+               goto out_err;
+       }
++      /* Default timeouts */
++      chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
++      chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
++      chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
++      chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
++
+       if (request_locality(chip, 0) != 0) {
+               rc = -ENODEV;
+               goto out_err;
+@@ -457,12 +463,6 @@ static int tpm_tis_init(struct device *dev, resource_size_t start,
+       vendor = ioread32(chip->vendor.iobase + TPM_DID_VID(0));
+-      /* Default timeouts */
+-      chip->vendor.timeout_a = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+-      chip->vendor.timeout_b = msecs_to_jiffies(TIS_LONG_TIMEOUT);
+-      chip->vendor.timeout_c = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+-      chip->vendor.timeout_d = msecs_to_jiffies(TIS_SHORT_TIMEOUT);
+-
+       dev_info(dev,
+                "1.2 TPM (device-id 0x%X, rev-id %d)\n",
+                vendor >> 16, ioread8(chip->vendor.iobase + TPM_RID(0)));
+diff --git a/drivers/ps3/ps3stor_lib.c b/drivers/ps3/ps3stor_lib.c
+index 55955f1..40169a1 100644
+--- a/drivers/ps3/ps3stor_lib.c
++++ b/drivers/ps3/ps3stor_lib.c
+@@ -23,6 +23,65 @@
+ #include <asm/lv1call.h>
+ #include <asm/ps3stor.h>
++/*
++ * A workaround for flash memory I/O errors when the internal hard disk
++ * has not been formatted for OtherOS use.  Delay disk close until flash
++ * memory is closed.
++ */
++
++static struct ps3_flash_workaround {
++      int flash_open;
++      int disk_open;
++      struct ps3_system_bus_device *disk_sbd;
++} ps3_flash_workaround;
++
++static int ps3stor_open_hv_device(struct ps3_system_bus_device *sbd)
++{
++      int error = ps3_open_hv_device(sbd);
++
++      if (error)
++              return error;
++
++      if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH)
++              ps3_flash_workaround.flash_open = 1;
++
++      if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
++              ps3_flash_workaround.disk_open = 1;
++
++      return 0;
++}
++
++static int ps3stor_close_hv_device(struct ps3_system_bus_device *sbd)
++{
++      int error;
++
++      if (sbd->match_id == PS3_MATCH_ID_STOR_DISK
++              && ps3_flash_workaround.disk_open
++              && ps3_flash_workaround.flash_open) {
++              ps3_flash_workaround.disk_sbd = sbd;
++              return 0;
++      }
++
++      error = ps3_close_hv_device(sbd);
++
++      if (error)
++              return error;
++
++      if (sbd->match_id == PS3_MATCH_ID_STOR_DISK)
++              ps3_flash_workaround.disk_open = 0;
++
++      if (sbd->match_id == PS3_MATCH_ID_STOR_FLASH) {
++              ps3_flash_workaround.flash_open = 0;
++
++              if (ps3_flash_workaround.disk_sbd) {
++                      ps3_close_hv_device(ps3_flash_workaround.disk_sbd);
++                      ps3_flash_workaround.disk_open = 0;
++                      ps3_flash_workaround.disk_sbd = NULL;
++              }
++      }
++
++      return 0;
++}
+ static int ps3stor_probe_access(struct ps3_storage_device *dev)
+ {
+@@ -90,7 +149,7 @@ int ps3stor_setup(struct ps3_storage_device *dev, irq_handler_t handler)
+       int error, res, alignment;
+       enum ps3_dma_page_size page_size;
+-      error = ps3_open_hv_device(&dev->sbd);
++      error = ps3stor_open_hv_device(&dev->sbd);
+       if (error) {
+               dev_err(&dev->sbd.core,
+                       "%s:%u: ps3_open_hv_device failed %d\n", __func__,
+@@ -166,7 +225,7 @@ fail_free_irq:
+ fail_sb_event_receive_port_destroy:
+       ps3_sb_event_receive_port_destroy(&dev->sbd, dev->irq);
+ fail_close_device:
+-      ps3_close_hv_device(&dev->sbd);
++      ps3stor_close_hv_device(&dev->sbd);
+ fail:
+       return error;
+ }
+@@ -193,7 +252,7 @@ void ps3stor_teardown(struct ps3_storage_device *dev)
+                       "%s:%u: destroy event receive port failed %d\n",
+                       __func__, __LINE__, error);
+-      error = ps3_close_hv_device(&dev->sbd);
++      error = ps3stor_close_hv_device(&dev->sbd);
+       if (error)
+               dev_err(&dev->sbd.core,
+                       "%s:%u: ps3_close_hv_device failed %d\n", __func__,
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index a6f8b8f..e012475 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -496,22 +496,22 @@ static unsigned long load_elf_interp(struct elfhdr *interp_elf_ex,
+               }
+       }
+-      /*
+-       * Now fill out the bss section.  First pad the last page up
+-       * to the page boundary, and then perform a mmap to make sure
+-       * that there are zero-mapped pages up to and including the 
+-       * last bss page.
+-       */
+-      if (padzero(elf_bss)) {
+-              error = -EFAULT;
+-              goto out_close;
+-      }
++      if (last_bss > elf_bss) {
++              /*
++               * Now fill out the bss section.  First pad the last page up
++               * to the page boundary, and then perform a mmap to make sure
++               * that there are zero-mapped pages up to and including the
++               * last bss page.
++               */
++              if (padzero(elf_bss)) {
++                      error = -EFAULT;
++                      goto out_close;
++              }
+-      /* What we have mapped so far */
+-      elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
++              /* What we have mapped so far */
++              elf_bss = ELF_PAGESTART(elf_bss + ELF_MIN_ALIGN - 1);
+-      /* Map the last of the bss segment */
+-      if (last_bss > elf_bss) {
++              /* Map the last of the bss segment */
+               down_write(&current->mm->mmap_sem);
+               error = do_brk(elf_bss, last_bss - elf_bss);
+               up_write(&current->mm->mmap_sem);
+diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c
+index 4d617ea..988530d 100644
+--- a/fs/nfsd/nfs3proc.c
++++ b/fs/nfsd/nfs3proc.c
+@@ -201,6 +201,7 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
+                                        struct nfsd3_writeres  *resp)
+ {
+       __be32  nfserr;
++      unsigned long cnt = argp->len;
+       dprintk("nfsd: WRITE(3)    %s %d bytes at %ld%s\n",
+                               SVCFH_fmt(&argp->fh),
+@@ -213,9 +214,9 @@ nfsd3_proc_write(struct svc_rqst *rqstp, struct nfsd3_writeargs *argp,
+       nfserr = nfsd_write(rqstp, &resp->fh, NULL,
+                                  argp->offset,
+                                  rqstp->rq_vec, argp->vlen,
+-                                 argp->len,
++                                 &cnt,
+                                  &resp->committed);
+-      resp->count = argp->count;
++      resp->count = cnt;
+       RETURN_STATUS(nfserr);
+ }
+diff --git a/fs/nfsd/nfs4proc.c b/fs/nfsd/nfs4proc.c
+index e5b51ff..fddc656 100644
+--- a/fs/nfsd/nfs4proc.c
++++ b/fs/nfsd/nfs4proc.c
+@@ -685,6 +685,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+       struct file *filp = NULL;
+       u32 *p;
+       __be32 status = nfs_ok;
++      unsigned long cnt;
+       /* no need to check permission - this will be done in nfsd_write() */
+@@ -703,7 +704,7 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+               return status;
+       }
+-      write->wr_bytes_written = write->wr_buflen;
++      cnt = write->wr_buflen;
+       write->wr_how_written = write->wr_stable_how;
+       p = (u32 *)write->wr_verifier.data;
+       *p++ = nfssvc_boot.tv_sec;
+@@ -711,10 +712,12 @@ nfsd4_write(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,
+       status =  nfsd_write(rqstp, &cstate->current_fh, filp,
+                            write->wr_offset, rqstp->rq_vec, write->wr_vlen,
+-                           write->wr_buflen, &write->wr_how_written);
++                           &cnt, &write->wr_how_written);
+       if (filp)
+               fput(filp);
++      write->wr_bytes_written = cnt;
++
+       if (status == nfserr_symlink)
+               status = nfserr_inval;
+       return status;
+diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c
+index 0766f95..20c63b2 100644
+--- a/fs/nfsd/nfsproc.c
++++ b/fs/nfsd/nfsproc.c
+@@ -179,6 +179,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
+ {
+       __be32  nfserr;
+       int     stable = 1;
++      unsigned long cnt = argp->len;
+       dprintk("nfsd: WRITE    %s %d bytes at %d\n",
+               SVCFH_fmt(&argp->fh),
+@@ -187,7 +188,7 @@ nfsd_proc_write(struct svc_rqst *rqstp, struct nfsd_writeargs *argp,
+       nfserr = nfsd_write(rqstp, fh_copy(&resp->fh, &argp->fh), NULL,
+                                  argp->offset,
+                                  rqstp->rq_vec, argp->vlen,
+-                                 argp->len,
++                                 &cnt,
+                                  &stable);
+       return nfsd_return_attrs(nfserr, resp);
+ }
+diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c
+index 18060be..ac31e0c 100644
+--- a/fs/nfsd/vfs.c
++++ b/fs/nfsd/vfs.c
+@@ -957,7 +957,7 @@ static void kill_suid(struct dentry *dentry)
+ static __be32
+ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+                               loff_t offset, struct kvec *vec, int vlen,
+-                              unsigned long cnt, int *stablep)
++                              unsigned long *cnt, int *stablep)
+ {
+       struct svc_export       *exp;
+       struct dentry           *dentry;
+@@ -971,7 +971,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+       err = nfserr_perm;
+       if ((fhp->fh_export->ex_flags & NFSEXP_MSNFS) &&
+-              (!lock_may_write(file->f_path.dentry->d_inode, offset, cnt)))
++              (!lock_may_write(file->f_path.dentry->d_inode, offset, *cnt)))
+               goto out;
+ #endif
+@@ -1003,7 +1003,8 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+       host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
+       set_fs(oldfs);
+       if (host_err >= 0) {
+-              nfsdstats.io_write += cnt;
++              *cnt = host_err;
++              nfsdstats.io_write += host_err;
+               fsnotify_modify(file->f_path.dentry);
+       }
+@@ -1050,7 +1051,7 @@ nfsd_vfs_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+       dprintk("nfsd: write complete host_err=%d\n", host_err);
+       if (host_err >= 0)
+               err = 0;
+-      else 
++      else
+               err = nfserrno(host_err);
+ out:
+       return err;
+@@ -1092,7 +1093,7 @@ out:
+  */
+ __be32
+ nfsd_write(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file *file,
+-              loff_t offset, struct kvec *vec, int vlen, unsigned long cnt,
++              loff_t offset, struct kvec *vec, int vlen, unsigned long *cnt,
+               int *stablep)
+ {
+       __be32                  err = 0;
+diff --git a/fs/udf/lowlevel.c b/fs/udf/lowlevel.c
+index 703843f..1b88fd5 100644
+--- a/fs/udf/lowlevel.c
++++ b/fs/udf/lowlevel.c
+@@ -56,7 +56,12 @@ unsigned long udf_get_last_block(struct super_block *sb)
+       struct block_device *bdev = sb->s_bdev;
+       unsigned long lblock = 0;
+-      if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock))
++      /*
++       * ioctl failed or returned obviously bogus value?
++       * Try using the device size...
++       */
++      if (ioctl_by_bdev(bdev, CDROM_LAST_WRITTEN, (unsigned long) &lblock) ||
++          lblock == 0)
+               lblock = bdev->bd_inode->i_size >> sb->s_blocksize_bits;
+       if (lblock)
+diff --git a/include/linux/nfsd/nfsd.h b/include/linux/nfsd/nfsd.h
+index 108f47e..9af9bca 100644
+--- a/include/linux/nfsd/nfsd.h
++++ b/include/linux/nfsd/nfsd.h
+@@ -105,7 +105,7 @@ void               nfsd_close(struct file *);
+ __be32                nfsd_read(struct svc_rqst *, struct svc_fh *, struct file *,
+                               loff_t, struct kvec *, int, unsigned long *);
+ __be32                nfsd_write(struct svc_rqst *, struct svc_fh *,struct file *,
+-                              loff_t, struct kvec *,int, unsigned long, int *);
++                              loff_t, struct kvec *,int, unsigned long *, int *);
+ __be32                nfsd_readlink(struct svc_rqst *, struct svc_fh *,
+                               char *, int *);
+ __be32                nfsd_symlink(struct svc_rqst *, struct svc_fh *,
+diff --git a/sound/pci/cs46xx/cs46xx_lib.h b/sound/pci/cs46xx/cs46xx_lib.h
+index 018a7de..ba12825 100644
+--- a/sound/pci/cs46xx/cs46xx_lib.h
++++ b/sound/pci/cs46xx/cs46xx_lib.h
+@@ -35,7 +35,7 @@
+ #ifdef CONFIG_SND_CS46XX_NEW_DSP
+-#define CS46XX_MIN_PERIOD_SIZE 1
++#define CS46XX_MIN_PERIOD_SIZE 64
+ #define CS46XX_MAX_PERIOD_SIZE 1024*1024
+ #else
+ #define CS46XX_MIN_PERIOD_SIZE 2048
+diff --git a/sound/pci/oxygen/oxygen_io.c b/sound/pci/oxygen/oxygen_io.c
+index 83f135f..6ebd2f3 100644
+--- a/sound/pci/oxygen/oxygen_io.c
++++ b/sound/pci/oxygen/oxygen_io.c
+@@ -214,17 +214,8 @@ EXPORT_SYMBOL(oxygen_write_spi);
+ void oxygen_write_i2c(struct oxygen *chip, u8 device, u8 map, u8 data)
+ {
+-      unsigned long timeout;
+-
+       /* should not need more than about 300 us */
+-      timeout = jiffies + msecs_to_jiffies(1);
+-      do {
+-              if (!(oxygen_read16(chip, OXYGEN_2WIRE_BUS_STATUS)
+-                    & OXYGEN_2WIRE_BUSY))
+-                      break;
+-              udelay(1);
+-              cond_resched();
+-      } while (time_after_eq(timeout, jiffies));
++      msleep(1);
+       oxygen_write8(chip, OXYGEN_2WIRE_MAP, map);
+       oxygen_write8(chip, OXYGEN_2WIRE_DATA, data);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.35-36 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.35-36
new file mode 100644 (file)
index 0000000..0b751a4
--- /dev/null
@@ -0,0 +1,224 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.36
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 5768979..e7046ea 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .35
++EXTRAVERSION = .36
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/isdn/gigaset/bas-gigaset.c b/drivers/isdn/gigaset/bas-gigaset.c
+index fcec2df..3990eae 100644
+--- a/drivers/isdn/gigaset/bas-gigaset.c
++++ b/drivers/isdn/gigaset/bas-gigaset.c
+@@ -2140,8 +2140,16 @@ static int gigaset_initcshw(struct cardstate *cs)
+       struct bas_cardstate *ucs;
+       cs->hw.bas = ucs = kmalloc(sizeof *ucs, GFP_KERNEL);
+-      if (!ucs)
++      if (!ucs) {
++              pr_err("out of memory\n");
++              return 0;
++      }
++      ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL);
++      if (!ucs->int_in_buf) {
++              kfree(ucs);
++              pr_err("out of memory\n");
+               return 0;
++      }
+       ucs->urb_cmd_in = NULL;
+       ucs->urb_cmd_out = NULL;
+@@ -2236,12 +2244,6 @@ static int gigaset_probe(struct usb_interface *interface,
+               }
+               hostif = interface->cur_altsetting;
+       }
+-      ucs->int_in_buf = kmalloc(IP_MSGSIZE, GFP_KERNEL);
+-      if (!ucs->int_in_buf) {
+-              kfree(ucs);
+-              pr_err("out of memory\n");
+-              return 0;
+-      }
+       /* Reject application specific interfaces
+        */
+diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
+index aa0bf6e..49fc60d 100644
+--- a/drivers/net/enc28j60.c
++++ b/drivers/net/enc28j60.c
+@@ -919,7 +919,7 @@ static void enc28j60_hw_rx(struct net_device *ndev)
+       if (netif_msg_rx_status(priv))
+               enc28j60_dump_rsv(priv, __FUNCTION__, next_packet, len, rxstat);
+-      if (!RSV_GETBIT(rxstat, RSV_RXOK)) {
++      if (!RSV_GETBIT(rxstat, RSV_RXOK) || len > MAX_FRAMELEN) {
+               if (netif_msg_rx_err(priv))
+                       dev_err(&ndev->dev, "Rx Error (%04x)\n", rxstat);
+               ndev->stats.rx_errors++;
+@@ -927,6 +927,8 @@ static void enc28j60_hw_rx(struct net_device *ndev)
+                       ndev->stats.rx_crc_errors++;
+               if (RSV_GETBIT(rxstat, RSV_LENCHECKERR))
+                       ndev->stats.rx_frame_errors++;
++              if (len > MAX_FRAMELEN)
++                      ndev->stats.rx_over_errors++;
+       } else {
+               skb = dev_alloc_skb(len + NET_IP_ALIGN);
+               if (!skb) {
+diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
+index 7d6cf02..b429a0f 100644
+--- a/drivers/net/pcmcia/pcnet_cs.c
++++ b/drivers/net/pcmcia/pcnet_cs.c
+@@ -591,7 +591,7 @@ static int pcnet_config(struct pcmcia_device *link)
+     }
+     if ((link->conf.ConfigBase == 0x03c0)
+-      && (link->manf_id == 0x149) && (link->card_id = 0xc1ab)) {
++      && (link->manf_id == 0x149) && (link->card_id == 0xc1ab)) {
+       printk(KERN_INFO "pcnet_cs: this is an AX88190 card!\n");
+       printk(KERN_INFO "pcnet_cs: use axnet_cs instead.\n");
+       goto failed;
+diff --git a/drivers/net/wireless/p54/p54usb.c b/drivers/net/wireless/p54/p54usb.c
+index bfff6b5..b97a1c9 100644
+--- a/drivers/net/wireless/p54/p54usb.c
++++ b/drivers/net/wireless/p54/p54usb.c
+@@ -63,6 +63,7 @@ static struct usb_device_id p54u_table[] __devinitdata = {
+       {USB_DEVICE(0x0bf8, 0x1009)},   /* FUJITSU E-5400 USB D1700*/
+       {USB_DEVICE(0x0cde, 0x0006)},   /* Medion MD40900 */
+       {USB_DEVICE(0x0cde, 0x0008)},   /* Sagem XG703A */
++      {USB_DEVICE(0x0cde, 0x0015)},   /* Zcomax XG-705A */
+       {USB_DEVICE(0x0d8e, 0x3762)},   /* DLink DWL-G120 Cohiba */
+       {USB_DEVICE(0x09aa, 0x1000)},   /* Spinnaker Proto board */
+       {USB_DEVICE(0x124a, 0x4025)},   /* IOGear GWU513 (GW3887IK chip) */
+diff --git a/fs/inode.c b/fs/inode.c
+index 7b2acc1..79777d9 100644
+--- a/fs/inode.c
++++ b/fs/inode.c
+@@ -590,13 +590,15 @@ void unlock_new_inode(struct inode *inode)
+       }
+ #endif
+       /*
+-       * This is special!  We do not need the spinlock
+-       * when clearing I_LOCK, because we're guaranteed
+-       * that nobody else tries to do anything about the
+-       * state of the inode when it is locked, as we
+-       * just created it (so there can be no old holders
+-       * that haven't tested I_LOCK).
++       * This is special!  We do not need the spinlock when clearing I_LOCK,
++       * because we're guaranteed that nobody else tries to do anything about
++       * the state of the inode when it is locked, as we just created it (so
++       * there can be no old holders that haven't tested I_LOCK).
++       * However we must emit the memory barrier so that other CPUs reliably
++       * see the clearing of I_LOCK after the other inode initialisation has
++       * completed.
+        */
++      smp_mb();
+       WARN_ON((inode->i_state & (I_LOCK|I_NEW)) != (I_LOCK|I_NEW));
+       inode->i_state &= ~(I_LOCK|I_NEW);
+       wake_up_inode(inode);
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 2885674..3a08c5a 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -983,6 +983,7 @@ __attribute__((weak)) int alloc_bootmem_huge_page(struct hstate *h)
+                               NODE_DATA(h->hugetlb_next_nid),
+                               huge_page_size(h), huge_page_size(h), 0);
++              hstate_next_node(h);
+               if (addr) {
+                       /*
+                        * Use the beginning of the huge page to store the
+@@ -993,7 +994,6 @@ __attribute__((weak)) int alloc_bootmem_huge_page(struct hstate *h)
+                       if (m)
+                               goto found;
+               }
+-              hstate_next_node(h);
+               nr_nodes--;
+       }
+       return 0;
+diff --git a/mm/memory.c b/mm/memory.c
+index 3856c36..1300b70 100644
+--- a/mm/memory.c
++++ b/mm/memory.c
+@@ -2422,7 +2422,8 @@ static int do_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
+               goto oom_free_page;
+       entry = mk_pte(page, vma->vm_page_prot);
+-      entry = maybe_mkwrite(pte_mkdirty(entry), vma);
++      if (vma->vm_flags & VM_WRITE)
++              entry = pte_mkwrite(pte_mkdirty(entry));
+       page_table = pte_offset_map_lock(mm, pmd, address, &ptl);
+       if (!pte_none(*page_table))
+diff --git a/mm/mmap.c b/mm/mmap.c
+index d330758..8b5aa8e 100644
+--- a/mm/mmap.c
++++ b/mm/mmap.c
+@@ -575,9 +575,9 @@ again:                     remove_next = 1 + (end > next->vm_end);
+       /*
+        * When changing only vma->vm_end, we don't really need
+-       * anon_vma lock: but is that case worth optimizing out?
++       * anon_vma lock.
+        */
+-      if (vma->anon_vma)
++      if (vma->anon_vma && (insert || importer || start != vma->vm_start))
+               anon_vma = vma->anon_vma;
+       if (anon_vma) {
+               spin_lock(&anon_vma->lock);
+diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c
+index 28c7157..cd9d526 100644
+--- a/net/ax25/af_ax25.c
++++ b/net/ax25/af_ax25.c
+@@ -539,7 +539,7 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname,
+       if (level != SOL_AX25)
+               return -ENOPROTOOPT;
+-      if (optlen < sizeof(int))
++      if (optlen < (int)sizeof(int))
+               return -EINVAL;
+       if (get_user(opt, (int __user *)optval))
+diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
+index 9abd450..f908d68 100644
+--- a/net/bridge/br_netfilter.c
++++ b/net/bridge/br_netfilter.c
+@@ -358,7 +358,7 @@ static int br_nf_pre_routing_finish(struct sk_buff *skb)
+                               },
+                               .proto = 0,
+                       };
+-                      struct in_device *in_dev = in_dev_get(dev);
++                      struct in_device *in_dev = __in_dev_get_rcu(dev);
+                       /* If err equals -EHOSTUNREACH the error is due to a
+                        * martian destination or due to the fact that
+diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
+index 4b50878..ade1ebd 100644
+--- a/net/packet/af_packet.c
++++ b/net/packet/af_packet.c
+@@ -1500,7 +1500,7 @@ packet_setsockopt(struct socket *sock, int level, int optname, char __user *optv
+ static int packet_getsockopt(struct socket *sock, int level, int optname,
+                            char __user *optval, int __user *optlen)
+ {
+-      int len;
++      unsigned int len;
+       int val;
+       struct sock *sk = sock->sk;
+       struct packet_sock *po = pkt_sk(sk);
+@@ -1513,7 +1513,7 @@ static int packet_getsockopt(struct socket *sock, int level, int optname,
+       if (get_user(len, optlen))
+               return -EFAULT;
+-      if (len < 0)
++      if ((int)len < 0)
+               return -EINVAL;
+       switch(optname) {
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.36-37 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.36-37
new file mode 100644 (file)
index 0000000..078e932
--- /dev/null
@@ -0,0 +1,393 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.37
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index e7046ea..e063536 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .36
++EXTRAVERSION = .37
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
+index 5e65290..09b59b2 100644
+--- a/arch/x86/ia32/ia32entry.S
++++ b/arch/x86/ia32/ia32entry.S
+@@ -21,8 +21,8 @@
+ #define __AUDIT_ARCH_LE          0x40000000
+ #ifndef CONFIG_AUDITSYSCALL
+-#define sysexit_audit int_ret_from_sys_call
+-#define sysretl_audit int_ret_from_sys_call
++#define sysexit_audit ia32_ret_from_sys_call
++#define sysretl_audit ia32_ret_from_sys_call
+ #endif
+ #define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)
+@@ -39,12 +39,12 @@
+       .endm 
+       /* clobbers %eax */     
+-      .macro  CLEAR_RREGS
++      .macro  CLEAR_RREGS offset=0, _r9=rax
+       xorl    %eax,%eax
+-      movq    %rax,R11(%rsp)
+-      movq    %rax,R10(%rsp)
+-      movq    %rax,R9(%rsp)
+-      movq    %rax,R8(%rsp)
++      movq    %rax,\offset+R11(%rsp)
++      movq    %rax,\offset+R10(%rsp)
++      movq    %\_r9,\offset+R9(%rsp)
++      movq    %rax,\offset+R8(%rsp)
+       .endm
+       /*
+@@ -52,11 +52,10 @@
+        * We don't reload %eax because syscall_trace_enter() returned
+        * the value it wants us to use in the table lookup.
+        */
+-      .macro LOAD_ARGS32 offset
+-      movl \offset(%rsp),%r11d
+-      movl \offset+8(%rsp),%r10d
++      .macro LOAD_ARGS32 offset, _r9=0
++      .if \_r9
+       movl \offset+16(%rsp),%r9d
+-      movl \offset+24(%rsp),%r8d
++      .endif
+       movl \offset+40(%rsp),%ecx
+       movl \offset+48(%rsp),%edx
+       movl \offset+56(%rsp),%esi
+@@ -145,7 +144,7 @@ ENTRY(ia32_sysenter_target)
+       SAVE_ARGS 0,0,1
+       /* no need to do an access_ok check here because rbp has been
+          32bit zero extended */ 
+-1:    movl    (%rbp),%r9d
++1:    movl    (%rbp),%ebp
+       .section __ex_table,"a"
+       .quad 1b,ia32_badarg
+       .previous       
+@@ -157,7 +156,7 @@ ENTRY(ia32_sysenter_target)
+       cmpl    $(IA32_NR_syscalls-1),%eax
+       ja      ia32_badsys
+ sysenter_do_call:
+-      IA32_ARG_FIXUP 1
++      IA32_ARG_FIXUP
+ sysenter_dispatch:
+       call    *ia32_sys_call_table(,%rax,8)
+       movq    %rax,RAX-ARGOFFSET(%rsp)
+@@ -173,6 +172,10 @@ sysexit_from_sys_call:
+       movl    RIP-R11(%rsp),%edx              /* User %eip */
+       CFI_REGISTER rip,rdx
+       RESTORE_ARGS 1,24,1,1,1,1
++      xorq    %r8,%r8
++      xorq    %r9,%r9
++      xorq    %r10,%r10
++      xorq    %r11,%r11
+       popfq
+       CFI_ADJUST_CFA_OFFSET -8
+       /*CFI_RESTORE rflags*/
+@@ -203,7 +206,7 @@ sysexit_from_sys_call:
+       .macro auditsys_exit exit,ebpsave=RBP
+       testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+-      jnz int_ret_from_sys_call
++      jnz ia32_ret_from_sys_call
+       TRACE_IRQS_ON
+       sti
+       movl %eax,%esi          /* second arg, syscall return value */
+@@ -219,8 +222,9 @@ sysexit_from_sys_call:
+       cli
+       TRACE_IRQS_OFF
+       testl %edi,TI_flags(%r10)
+-      jnz int_with_check
+-      jmp \exit
++      jz \exit
++      CLEAR_RREGS -ARGOFFSET
++      jmp int_with_check
+       .endm
+ sysenter_auditsys:
+@@ -234,20 +238,17 @@ sysexit_audit:
+ #endif
+ sysenter_tracesys:
+-      xchgl   %r9d,%ebp
+ #ifdef CONFIG_AUDITSYSCALL
+       testl   $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+       jz      sysenter_auditsys
+ #endif
+       SAVE_REST
+       CLEAR_RREGS
+-      movq    %r9,R9(%rsp)
+       movq    $-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */
+       movq    %rsp,%rdi        /* &pt_regs -> arg1 */
+       call    syscall_trace_enter
+       LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
+       RESTORE_REST
+-      xchgl   %ebp,%r9d
+       cmpl    $(IA32_NR_syscalls-1),%eax
+       ja      int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
+       jmp     sysenter_do_call
+@@ -314,9 +315,9 @@ ENTRY(ia32_cstar_target)
+       testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
+       CFI_REMEMBER_STATE
+       jnz   cstar_tracesys
+-cstar_do_call:        
+       cmpl $IA32_NR_syscalls-1,%eax
+       ja  ia32_badsys
++cstar_do_call:
+       IA32_ARG_FIXUP 1
+ cstar_dispatch:
+       call *ia32_sys_call_table(,%rax,8)
+@@ -333,6 +334,9 @@ sysretl_from_sys_call:
+       CFI_REGISTER rip,rcx
+       movl EFLAGS-ARGOFFSET(%rsp),%r11d       
+       /*CFI_REGISTER rflags,r11*/
++      xorq    %r10,%r10
++      xorq    %r9,%r9
++      xorq    %r8,%r8
+       TRACE_IRQS_ON
+       movl RSP-ARGOFFSET(%rsp),%esp
+       CFI_RESTORE rsp
+@@ -357,15 +361,13 @@ cstar_tracesys:
+ #endif
+       xchgl %r9d,%ebp
+       SAVE_REST
+-      CLEAR_RREGS
+-      movq %r9,R9(%rsp)
++      CLEAR_RREGS 0, r9
+       movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
+       movq %rsp,%rdi        /* &pt_regs -> arg1 */
+       call syscall_trace_enter
+-      LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
++      LOAD_ARGS32 ARGOFFSET, 1  /* reload args from stack in case ptrace changed it */
+       RESTORE_REST
+       xchgl %ebp,%r9d
+-      movl RSP-ARGOFFSET(%rsp), %r8d
+       cmpl $(IA32_NR_syscalls-1),%eax
+       ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
+       jmp cstar_do_call
+@@ -431,6 +433,8 @@ ia32_do_call:
+       call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
+ ia32_sysret:
+       movq %rax,RAX-ARGOFFSET(%rsp)
++ia32_ret_from_sys_call:
++      CLEAR_RREGS -ARGOFFSET
+       jmp int_ret_from_sys_call 
+ ia32_tracesys:                         
+@@ -448,8 +452,8 @@ END(ia32_syscall)
+ ia32_badsys:
+       movq $0,ORIG_RAX-ARGOFFSET(%rsp)
+-      movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
+-      jmp int_ret_from_sys_call
++      movq $-ENOSYS,%rax
++      jmp ia32_sysret
+ quiet_ni_syscall:
+       movq $-ENOSYS,%rax
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index f7c7142..60ebfd7 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -2571,6 +2571,11 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
+               a3 &= 0xFFFFFFFF;
+       }
++      if (kvm_x86_ops->get_cpl(vcpu) != 0) {
++              ret = -KVM_EPERM;
++              goto out;
++      }
++
+       switch (nr) {
+       case KVM_HC_VAPIC_POLL_IRQ:
+               ret = 0;
+@@ -2582,6 +2587,7 @@ int kvm_emulate_hypercall(struct kvm_vcpu *vcpu)
+               ret = -KVM_ENOSYS;
+               break;
+       }
++out:
+       vcpu->arch.regs[VCPU_REGS_RAX] = ret;
+       kvm_x86_ops->decache_regs(vcpu);
+       ++vcpu->stat.hypercalls;
+diff --git a/arch/x86/mm/mmap.c b/arch/x86/mm/mmap.c
+index 56fe712..47dd8f5 100644
+--- a/arch/x86/mm/mmap.c
++++ b/arch/x86/mm/mmap.c
+@@ -29,13 +29,26 @@
+ #include <linux/random.h>
+ #include <linux/limits.h>
+ #include <linux/sched.h>
++#include <asm/elf.h>
++
++static unsigned int stack_maxrandom_size(void)
++{
++      unsigned int max = 0;
++      if ((current->flags & PF_RANDOMIZE) &&
++              !(current->personality & ADDR_NO_RANDOMIZE)) {
++              max = ((-1U) & STACK_RND_MASK) << PAGE_SHIFT;
++      }
++
++      return max;
++}
++
+ /*
+  * Top of mmap area (just below the process stack).
+  *
+- * Leave an at least ~128 MB hole.
++ * Leave an at least ~128 MB hole with possible stack randomization.
+  */
+-#define MIN_GAP (128*1024*1024)
++#define MIN_GAP (128*1024*1024UL + stack_maxrandom_size())
+ #define MAX_GAP (TASK_SIZE/6*5)
+ /*
+diff --git a/drivers/net/iseries_veth.c b/drivers/net/iseries_veth.c
+index c46864d..e1db78a 100644
+--- a/drivers/net/iseries_veth.c
++++ b/drivers/net/iseries_veth.c
+@@ -495,7 +495,7 @@ static void veth_take_cap_ack(struct veth_lpar_connection *cnx,
+                          cnx->remote_lp);
+       } else {
+               memcpy(&cnx->cap_ack_event, event,
+-                     sizeof(&cnx->cap_ack_event));
++                     sizeof(cnx->cap_ack_event));
+               cnx->state |= VETH_STATE_GOTCAPACK;
+               veth_kick_statemachine(cnx);
+       }
+diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c
+index 763c1ea..dad4fe6 100644
+--- a/drivers/watchdog/hpwdt.c
++++ b/drivers/watchdog/hpwdt.c
+@@ -47,6 +47,7 @@
+ #define PCI_BIOS32_PARAGRAPH_LEN      16
+ #define PCI_ROM_BASE1                 0x000F0000
+ #define ROM_SIZE                      0x10000
++#define HPWDT_VERSION                 "1.01"
+ struct bios32_service_dir {
+       u32 signature;
+@@ -130,12 +131,8 @@ static void *cru_rom_addr;
+ static struct cmn_registers cmn_regs;
+ static struct pci_device_id hpwdt_devices[] = {
+-      {
+-       .vendor = PCI_VENDOR_ID_COMPAQ,
+-       .device = 0xB203,
+-       .subvendor = PCI_ANY_ID,
+-       .subdevice = PCI_ANY_ID,
+-      },
++      { PCI_DEVICE(PCI_VENDOR_ID_COMPAQ, 0xB203) },
++      { PCI_DEVICE(PCI_VENDOR_ID_HP, 0x3306) },
+       {0},                    /* terminate list */
+ };
+ MODULE_DEVICE_TABLE(pci, hpwdt_devices);
+@@ -704,10 +701,11 @@ static int __devinit hpwdt_init_one(struct pci_dev *dev,
+       }
+       printk(KERN_INFO
+-              "hp Watchdog Timer Driver: 1.00"
++              "hp Watchdog Timer Driver: %s"
+               ", timer margin: %d seconds (nowayout=%d)"
+               ", allow kernel dump: %s (default = 0/OFF).\n",
+-              soft_margin, nowayout, (allow_kdump == 0) ? "OFF" : "ON");
++              HPWDT_VERSION, soft_margin, nowayout,
++              (allow_kdump == 0) ? "OFF" : "ON");
+       return 0;
+@@ -757,6 +755,7 @@ static int __init hpwdt_init(void)
+ MODULE_AUTHOR("Tom Mingarelli");
+ MODULE_DESCRIPTION("hp watchdog driver");
+ MODULE_LICENSE("GPL");
++MODULE_VERSION(HPWDT_VERSION);
+ MODULE_ALIAS_MISCDEV(WATCHDOG_MINOR);
+ module_param(soft_margin, int, 0);
+diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c
+index 5e78fc1..1c1220e 100644
+--- a/fs/ecryptfs/inode.c
++++ b/fs/ecryptfs/inode.c
+@@ -443,6 +443,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
+       struct inode *lower_dir_inode = ecryptfs_inode_to_lower(dir);
+       struct dentry *lower_dir_dentry;
++      dget(lower_dentry);
+       lower_dir_dentry = lock_parent(lower_dentry);
+       rc = vfs_unlink(lower_dir_inode, lower_dentry);
+       if (rc) {
+@@ -456,6 +457,7 @@ static int ecryptfs_unlink(struct inode *dir, struct dentry *dentry)
+       d_drop(dentry);
+ out_unlock:
+       unlock_dir(lower_dir_dentry);
++      dput(lower_dentry);
+       return rc;
+ }
+diff --git a/include/asm-x86/elf.h b/include/asm-x86/elf.h
+index 7be4733..36343b6 100644
+--- a/include/asm-x86/elf.h
++++ b/include/asm-x86/elf.h
+@@ -287,6 +287,8 @@ do {                                                                       \
+ #ifdef CONFIG_X86_32
++#define STACK_RND_MASK (0x7ff)
++
+ #define VDSO_HIGH_BASE                (__fix_to_virt(FIX_VDSO))
+ #define ARCH_DLINFO           ARCH_DLINFO_IA32(vdso_enabled)
+diff --git a/include/linux/kvm_para.h b/include/linux/kvm_para.h
+index 3ddce03..d731092 100644
+--- a/include/linux/kvm_para.h
++++ b/include/linux/kvm_para.h
+@@ -13,6 +13,7 @@
+ #define KVM_ENOSYS            1000
+ #define KVM_EFAULT            EFAULT
+ #define KVM_E2BIG             E2BIG
++#define KVM_EPERM             EPERM
+ #define KVM_HC_VAPIC_POLL_IRQ         1
+ #define KVM_HC_MMU_OP                 2
+diff --git a/kernel/time/timekeeping.c b/kernel/time/timekeeping.c
+index 521960b..6e22c16 100644
+--- a/kernel/time/timekeeping.c
++++ b/kernel/time/timekeeping.c
+@@ -477,6 +477,28 @@ void update_wall_time(void)
+       /* correct the clock when NTP error is too big */
+       clocksource_adjust(offset);
++      /*
++       * Since in the loop above, we accumulate any amount of time
++       * in xtime_nsec over a second into xtime.tv_sec, its possible for
++       * xtime_nsec to be fairly small after the loop. Further, if we're
++       * slightly speeding the clocksource up in clocksource_adjust(),
++       * its possible the required corrective factor to xtime_nsec could
++       * cause it to underflow.
++       *
++       * Now, we cannot simply roll the accumulated second back, since
++       * the NTP subsystem has been notified via second_overflow. So
++       * instead we push xtime_nsec forward by the amount we underflowed,
++       * and add that amount into the error.
++       *
++       * We'll correct this error next time through this function, when
++       * xtime_nsec is not as small.
++       */
++      if (unlikely((s64)clock->xtime_nsec < 0)) {
++              s64 neg = -(s64)clock->xtime_nsec;
++              clock->xtime_nsec = 0;
++              clock->error += neg << (NTP_SCALE_SHIFT - clock->shift);
++      }
++
+       /* store full nanoseconds into xtime */
+       xtime.tv_nsec = (s64)clock->xtime_nsec >> clock->shift;
+       clock->xtime_nsec -= (s64)xtime.tv_nsec << clock->shift;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.37-38 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.37-38
new file mode 100644 (file)
index 0000000..d7798ed
--- /dev/null
@@ -0,0 +1,87 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.38
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index e063536..3be1470 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .37
++EXTRAVERSION = .38
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
+index ee6be59..5f76f55 100644
+--- a/drivers/scsi/scsi.c
++++ b/drivers/scsi/scsi.c
+@@ -243,10 +243,7 @@ scsi_host_alloc_command(struct Scsi_Host *shost, gfp_t gfp_mask)
+  */
+ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
+ {
+-      struct scsi_cmnd *cmd;
+-      unsigned char *buf;
+-
+-      cmd = scsi_host_alloc_command(shost, gfp_mask);
++      struct scsi_cmnd *cmd = scsi_host_alloc_command(shost, gfp_mask);
+       if (unlikely(!cmd)) {
+               unsigned long flags;
+@@ -260,9 +257,15 @@ struct scsi_cmnd *__scsi_get_command(struct Scsi_Host *shost, gfp_t gfp_mask)
+               spin_unlock_irqrestore(&shost->free_list_lock, flags);
+               if (cmd) {
++                      void *buf, *prot;
++
+                       buf = cmd->sense_buffer;
++                      prot = cmd->prot_sdb;
++
+                       memset(cmd, 0, sizeof(*cmd));
++
+                       cmd->sense_buffer = buf;
++                      cmd->prot_sdb = prot;
+               }
+       }
+diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c
+index 240aad1..657fc25 100644
+--- a/drivers/usb/serial/digi_acceleport.c
++++ b/drivers/usb/serial/digi_acceleport.c
+@@ -892,16 +892,16 @@ static void digi_rx_unthrottle(struct tty_struct *tty)
+       spin_lock_irqsave(&priv->dp_port_lock, flags);
+-      /* turn throttle off */
+-      priv->dp_throttled = 0;
+-      priv->dp_throttle_restart = 0;
+-
+       /* restart read chain */
+       if (priv->dp_throttle_restart) {
+               port->read_urb->dev = port->serial->dev;
+               ret = usb_submit_urb(port->read_urb, GFP_ATOMIC);
+       }
++      /* turn throttle off */
++      priv->dp_throttled = 0;
++      priv->dp_throttle_restart = 0;
++
+       spin_unlock_irqrestore(&priv->dp_port_lock, flags);
+       if (ret)
+diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c
+index 9fcc272..579796a 100644
+--- a/drivers/usb/serial/usb-serial.c
++++ b/drivers/usb/serial/usb-serial.c
+@@ -973,6 +973,7 @@ int usb_serial_probe(struct usb_interface *interface,
+               if (retval > 0) {
+                       /* quietly accept this device, but don't bind to a
+                          serial port as it's about to disappear */
++                      serial->num_ports = 0;
+                       goto exit;
+               }
+       }
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.38-39 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.38-39
new file mode 100644 (file)
index 0000000..3f812a5
--- /dev/null
@@ -0,0 +1,923 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.39
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 3be1470..2361e50 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .38
++EXTRAVERSION = .39
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/m68k/Kconfig b/arch/m68k/Kconfig
+index 8c5e1de..5b1ccc2 100644
+--- a/arch/m68k/Kconfig
++++ b/arch/m68k/Kconfig
+@@ -572,7 +572,7 @@ config HPAPCI
+ config MVME147_SCC
+       bool "SCC support for MVME147 serial ports"
+-      depends on MVME147
++      depends on MVME147 && BROKEN
+       help
+         This is the driver for the serial ports on the Motorola MVME147
+         boards.  Everyone using one of these boards should say Y here.
+@@ -587,14 +587,14 @@ config SERIAL167
+ config MVME162_SCC
+       bool "SCC support for MVME162 serial ports"
+-      depends on MVME16x
++      depends on MVME16x && BROKEN
+       help
+         This is the driver for the serial ports on the Motorola MVME162 and
+         172 boards.  Everyone using one of these boards should say Y here.
+ config BVME6000_SCC
+       bool "SCC support for BVME6000 serial ports"
+-      depends on BVME6000
++      depends on BVME6000 && BROKEN
+       help
+         This is the driver for the serial ports on the BVME4000 and BVME6000
+         boards from BVM Ltd.  Everyone using one of these boards should say
+diff --git a/arch/x86/ia32/ia32entry.S b/arch/x86/ia32/ia32entry.S
+index 09b59b2..5d7f4af 100644
+--- a/arch/x86/ia32/ia32entry.S
++++ b/arch/x86/ia32/ia32entry.S
+@@ -204,7 +204,7 @@ sysexit_from_sys_call:
+       movl RDI-ARGOFFSET(%rsp),%r8d   /* reload 5th syscall arg */
+       .endm
+-      .macro auditsys_exit exit,ebpsave=RBP
++      .macro auditsys_exit exit
+       testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+       jnz ia32_ret_from_sys_call
+       TRACE_IRQS_ON
+@@ -217,7 +217,6 @@ sysexit_from_sys_call:
+       call audit_syscall_exit
+       GET_THREAD_INFO(%r10)
+       movl RAX-ARGOFFSET(%rsp),%eax   /* reload syscall return value */
+-      movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */
+       movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
+       cli
+       TRACE_IRQS_OFF
+@@ -351,7 +350,7 @@ cstar_auditsys:
+       jmp cstar_dispatch
+ sysretl_audit:
+-      auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */
++      auditsys_exit sysretl_from_sys_call
+ #endif
+ cstar_tracesys:
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
+index 923e682..7d58f32 100644
+--- a/arch/x86/kernel/amd_iommu_init.c
++++ b/arch/x86/kernel/amd_iommu_init.c
+@@ -230,7 +230,7 @@ static void __init iommu_feature_enable(struct amd_iommu *iommu, u8 bit)
+       writel(ctrl, iommu->mmio_base + MMIO_CONTROL_OFFSET);
+ }
+-static void __init iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
++static void iommu_feature_disable(struct amd_iommu *iommu, u8 bit)
+ {
+       u32 ctrl;
+@@ -430,6 +430,27 @@ static void set_dev_entry_bit(u16 devid, u8 bit)
+       amd_iommu_dev_table[devid].data[i] |= (1 << _bit);
+ }
++static int get_dev_entry_bit(u16 devid, u8 bit)
++{
++      int i = (bit >> 5) & 0x07;
++      int _bit = bit & 0x1f;
++
++      return (amd_iommu_dev_table[devid].data[i] & (1 << _bit)) >> _bit;
++}
++
++
++void amd_iommu_apply_erratum_63(u16 devid)
++{
++      int sysmgt;
++
++      sysmgt = get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT1) |
++              (get_dev_entry_bit(devid, DEV_ENTRY_SYSMGT2) << 1);
++
++      if (sysmgt == 0x01)
++              set_dev_entry_bit(devid, DEV_ENTRY_IW);
++}
++
++
+ /* Writes the specific IOMMU for a device into the rlookup table */
+ static void __init set_iommu_for_device(struct amd_iommu *iommu, u16 devid)
+ {
+@@ -458,6 +479,8 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,
+       if (flags & ACPI_DEVFLAG_LINT1)
+               set_dev_entry_bit(devid, DEV_ENTRY_LINT1_PASS);
++      amd_iommu_apply_erratum_63(devid);
++
+       set_iommu_for_device(iommu, devid);
+ }
+diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c
+index 60ebfd7..bf872f2 100644
+--- a/arch/x86/kvm/x86.c
++++ b/arch/x86/kvm/x86.c
+@@ -1223,6 +1223,8 @@ static int kvm_dev_ioctl_get_supported_cpuid(struct kvm_cpuid2 *cpuid,
+       if (cpuid->nent < 1)
+               goto out;
++      if (cpuid->nent > KVM_MAX_CPUID_ENTRIES)
++              cpuid->nent = KVM_MAX_CPUID_ENTRIES;
+       r = -ENOMEM;
+       cpuid_entries = vmalloc(sizeof(struct kvm_cpuid_entry2) * cpuid->nent);
+       if (!cpuid_entries)
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index afa66f4..0450761 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -1262,16 +1262,6 @@ acpi_add_single_object(struct acpi_device **child,
+       acpi_device_set_id(device, parent, handle, type);
+       /*
+-       * The ACPI device is attached to acpi handle before getting
+-       * the power/wakeup/peformance flags. Otherwise OS can't get
+-       * the corresponding ACPI device by the acpi handle in the course
+-       * of getting the power/wakeup/performance flags.
+-       */
+-      result = acpi_device_set_context(device, type);
+-      if (result)
+-              goto end;
+-
+-      /*
+        * Power Management
+        * ----------------
+        */
+@@ -1301,6 +1291,8 @@ acpi_add_single_object(struct acpi_device **child,
+                       goto end;
+       }
++      if ((result = acpi_device_set_context(device, type)))
++              goto end;
+       result = acpi_device_register(device, parent);
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 5cdd821..8afc274 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -4747,12 +4747,14 @@ void ata_qc_complete(struct ata_queued_cmd *qc)
+                       qc->flags |= ATA_QCFLAG_FAILED;
+               if (unlikely(qc->flags & ATA_QCFLAG_FAILED)) {
+-                      if (!ata_tag_internal(qc->tag)) {
+-                              /* always fill result TF for failed qc */
+-                              fill_result_tf(qc);
++                      /* always fill result TF for failed qc */
++                      fill_result_tf(qc);
++
++                      if (!ata_tag_internal(qc->tag))
+                               ata_qc_schedule_eh(qc);
+-                              return;
+-                      }
++                      else
++                              __ata_qc_complete(qc);
++                      return;
+               }
+               /* read result TF if requested */
+diff --git a/drivers/base/driver.c b/drivers/base/driver.c
+index 1e2bda7..296d833 100644
+--- a/drivers/base/driver.c
++++ b/drivers/base/driver.c
+@@ -227,7 +227,7 @@ int driver_register(struct device_driver *drv)
+               put_driver(other);
+               printk(KERN_ERR "Error: Driver '%s' is already registered, "
+                       "aborting...\n", drv->name);
+-              return -EEXIST;
++              return -EBUSY;
+       }
+       ret = bus_add_driver(drv);
+diff --git a/drivers/char/Kconfig b/drivers/char/Kconfig
+index caff851..8b91700 100644
+--- a/drivers/char/Kconfig
++++ b/drivers/char/Kconfig
+@@ -310,7 +310,7 @@ config SPECIALIX
+ config SX
+       tristate "Specialix SX (and SI) card support"
+-      depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA)
++      depends on SERIAL_NONSTANDARD && (PCI || EISA || ISA) && BROKEN
+       help
+         This is a driver for the SX and SI multiport serial cards.
+         Please read the file <file:Documentation/sx.txt> for details.
+@@ -321,7 +321,7 @@ config SX
+ config RIO
+       tristate "Specialix RIO system support"
+-      depends on SERIAL_NONSTANDARD
++      depends on SERIAL_NONSTANDARD && BROKEN
+       help
+         This is a driver for the Specialix RIO, a smart serial card which
+         drives an outboard box that can support up to 128 ports.  Product
+@@ -382,7 +382,7 @@ config NOZOMI
+ config A2232
+       tristate "Commodore A2232 serial support (EXPERIMENTAL)"
+-      depends on EXPERIMENTAL && ZORRO && BROKEN_ON_SMP
++      depends on EXPERIMENTAL && ZORRO && BROKEN
+       ---help---
+         This option supports the 2232 7-port serial card shipped with the
+         Amiga 2000 and other Zorro-bus machines, dating from 1989.  At
+diff --git a/drivers/input/mouse/synaptics.c b/drivers/input/mouse/synaptics.c
+index d349c4a..6bb5157 100644
+--- a/drivers/input/mouse/synaptics.c
++++ b/drivers/input/mouse/synaptics.c
+@@ -623,6 +623,16 @@ static const struct dmi_system_id toshiba_dmi_table[] = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
+                       DMI_MATCH(DMI_PRODUCT_NAME, "PORTEGE M300"),
+               },
++
++      },
++      {
++              .ident = "Toshiba Portege M300",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "Portable PC"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "Version 1.0"),
++              },
++
+       },
+       { }
+ };
+diff --git a/drivers/net/appletalk/ipddp.c b/drivers/net/appletalk/ipddp.c
+index 1071144..6d0107c 100644
+--- a/drivers/net/appletalk/ipddp.c
++++ b/drivers/net/appletalk/ipddp.c
+@@ -173,8 +173,7 @@ static int ipddp_xmit(struct sk_buff *skb, struct net_device *dev)
+       ((struct net_device_stats *) dev->priv)->tx_packets++;
+         ((struct net_device_stats *) dev->priv)->tx_bytes+=skb->len;
+-        if(aarp_send_ddp(rt->dev, skb, &rt->at, NULL) < 0)
+-                dev_kfree_skb(skb);
++      aarp_send_ddp(rt->dev, skb, &rt->at, NULL);
+         return 0;
+ }
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index f9f29c9..5a07b50 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -686,7 +686,7 @@ static int bond_update_speed_duplex(struct slave *slave)
+  */
+ static int bond_check_dev_link(struct bonding *bond, struct net_device *slave_dev, int reporting)
+ {
+-      static int (* ioctl)(struct net_device *, struct ifreq *, int);
++      int (* ioctl)(struct net_device *, struct ifreq *, int);
+       struct ifreq ifr;
+       struct mii_ioctl_data *mii;
+diff --git a/drivers/net/wireless/b43/rfkill.c b/drivers/net/wireless/b43/rfkill.c
+index 34ae125..f9c355e 100644
+--- a/drivers/net/wireless/b43/rfkill.c
++++ b/drivers/net/wireless/b43/rfkill.c
+@@ -36,7 +36,8 @@ static bool b43_is_hw_radio_enabled(struct b43_wldev *dev)
+                     & B43_MMIO_RADIO_HWENABLED_HI_MASK))
+                       return 1;
+       } else {
+-              if (b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO)
++              if (b43_status(dev) >= B43_STAT_STARTED &&
++                  b43_read16(dev, B43_MMIO_RADIO_HWENABLED_LO)
+                   & B43_MMIO_RADIO_HWENABLED_LO_MASK)
+                       return 1;
+       }
+diff --git a/drivers/net/wireless/libertas/if_usb.c b/drivers/net/wireless/libertas/if_usb.c
+index 632c291..5e37c2f 100644
+--- a/drivers/net/wireless/libertas/if_usb.c
++++ b/drivers/net/wireless/libertas/if_usb.c
+@@ -443,7 +443,7 @@ static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
+       /* Fill the receive configuration URB and initialise the Rx call back */
+       usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
+                         usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
+-                        (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
++                        skb->data + IPFIELD_ALIGN_OFFSET,
+                         MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
+                         cardp);
+diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
+index 963960d..eef4e86 100644
+--- a/drivers/net/wireless/ray_cs.c
++++ b/drivers/net/wireless/ray_cs.c
+@@ -2758,7 +2758,7 @@ static void raycs_write(const char *name, write_proc_t *w, void *data)
+ static int write_essid(struct file *file, const char __user *buffer, unsigned long count, void *data)
+ {
+       static char proc_essid[33];
+-      int len = count;
++      unsigned int len = count;
+       if (len > 32)
+               len = 32;
+diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
+index 7716145..b38fe67 100644
+--- a/drivers/scsi/dpt_i2o.c
++++ b/drivers/scsi/dpt_i2o.c
+@@ -1918,6 +1918,10 @@ static int adpt_i2o_passthru(adpt_hba* pHba, u32 __user *arg)
+               }
+               size = size>>16;
+               size *= 4;
++              if (size > MAX_MESSAGE_SIZE) {
++                      rcode = -EINVAL;
++                      goto cleanup;
++              }
+               /* Copy in the user's I2O command */
+               if (copy_from_user (msg, user_msg, size)) {
+                       rcode = -EFAULT;
+diff --git a/drivers/serial/8250_pci.c b/drivers/serial/8250_pci.c
+index 9f72ad7..3a56f92 100644
+--- a/drivers/serial/8250_pci.c
++++ b/drivers/serial/8250_pci.c
+@@ -1218,6 +1218,7 @@ enum pci_board_num_t {
+       pbn_exar_XR17C152,
+       pbn_exar_XR17C154,
+       pbn_exar_XR17C158,
++      pbn_exar_ibm_saturn,
+       pbn_pasemi_1682M,
+ };
+@@ -1746,6 +1747,13 @@ static struct pciserial_board pci_boards[] __devinitdata = {
+               .base_baud      = 921600,
+               .uart_offset    = 0x200,
+       },
++      [pbn_exar_ibm_saturn] = {
++              .flags          = FL_BASE0,
++              .num_ports      = 1,
++              .base_baud      = 921600,
++              .uart_offset    = 0x200,
++      },
++
+       /*
+        * PA Semi PWRficient PA6T-1682M on-chip UART
+        */
+@@ -2217,6 +2225,9 @@ static struct pci_device_id serial_pci_tbl[] = {
+               PCI_SUBVENDOR_ID_CONNECT_TECH,
+               PCI_SUBDEVICE_ID_CONNECT_TECH_PCI_UART_8_485, 0, 0,
+               pbn_b0_8_1843200_200 },
++      {       PCI_VENDOR_ID_EXAR, PCI_DEVICE_ID_EXAR_XR17C152,
++              PCI_VENDOR_ID_IBM, PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT,
++              0, 0, pbn_exar_ibm_saturn },
+       {       PCI_VENDOR_ID_SEALEVEL, PCI_DEVICE_ID_SEALEVEL_U530,
+               PCI_ANY_ID, PCI_ANY_ID, 0, 0,
+diff --git a/fs/hfsplus/wrapper.c b/fs/hfsplus/wrapper.c
+index 175d08e..bed78ac 100644
+--- a/fs/hfsplus/wrapper.c
++++ b/fs/hfsplus/wrapper.c
+@@ -99,6 +99,10 @@ int hfsplus_read_wrapper(struct super_block *sb)
+       if (hfsplus_get_last_session(sb, &part_start, &part_size))
+               return -EINVAL;
++      if ((u64)part_start + part_size > 0x100000000ULL) {
++              pr_err("hfs: volumes larger than 2TB are not supported yet\n");
++              return -EINVAL;
++      }
+       while (1) {
+               bh = sb_bread512(sb, part_start + HFSPLUS_VOLHEAD_SECTOR, vhdr);
+               if (!bh)
+diff --git a/fs/nfs/client.c b/fs/nfs/client.c
+index 5ee23e7..9d6a0e4 100644
+--- a/fs/nfs/client.c
++++ b/fs/nfs/client.c
+@@ -983,7 +983,7 @@ static int nfs4_init_client(struct nfs_client *clp,
+                                       RPC_CLNT_CREATE_DISCRTRY);
+       if (error < 0)
+               goto error;
+-      memcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
++      strlcpy(clp->cl_ipaddr, ip_addr, sizeof(clp->cl_ipaddr));
+       error = nfs_idmap_new(clp);
+       if (error < 0) {
+diff --git a/fs/nfs/dir.c b/fs/nfs/dir.c
+index c3fe156..e195f67 100644
+--- a/fs/nfs/dir.c
++++ b/fs/nfs/dir.c
+@@ -1014,12 +1014,12 @@ static struct dentry *nfs_atomic_lookup(struct inode *dir, struct dentry *dentry
+                               res = NULL;
+                               goto out;
+                       /* This turned out not to be a regular file */
+-                      case -EISDIR:
+                       case -ENOTDIR:
+                               goto no_open;
+                       case -ELOOP:
+                               if (!(nd->intent.open.flags & O_NOFOLLOW))
+                                       goto no_open;
++                      /* case -EISDIR: */
+                       /* case -EINVAL: */
+                       default:
+                               goto out;
+@@ -1526,6 +1526,8 @@ nfs_link(struct dentry *old_dentry, struct inode *dir, struct dentry *dentry)
+               old_dentry->d_parent->d_name.name, old_dentry->d_name.name,
+               dentry->d_parent->d_name.name, dentry->d_name.name);
++      nfs_inode_return_delegation(inode);
++
+       d_drop(dentry);
+       error = NFS_PROTO(dir)->link(inode, dir, &dentry->d_name);
+       if (error == 0) {
+diff --git a/fs/nfs/direct.c b/fs/nfs/direct.c
+index 630feb3..8a5c1d5 100644
+--- a/fs/nfs/direct.c
++++ b/fs/nfs/direct.c
+@@ -454,6 +454,7 @@ static void nfs_direct_write_reschedule(struct nfs_direct_req *dreq)
+       };
+       struct rpc_task_setup task_setup_data = {
+               .rpc_client = NFS_CLIENT(inode),
++              .rpc_message = &msg,
+               .callback_ops = &nfs_write_direct_ops,
+               .workqueue = nfsiod_workqueue,
+               .flags = RPC_TASK_ASYNC,
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index c910413..ad4e800 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -71,12 +71,17 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
+ /* Prevent leaks of NFSv4 errors into userland */
+ int nfs4_map_errors(int err)
+ {
+-      if (err < -1000) {
++      if (err >= -1000)
++              return err;
++      switch (err) {
++      case -NFS4ERR_RESOURCE:
++              return -EREMOTEIO;
++      default:
+               dprintk("%s could not handle NFSv4 error %d\n",
+                               __func__, -err);
+-              return -EIO;
++              break;
+       }
+-      return err;
++      return -EIO;
+ }
+ /*
+@@ -3550,15 +3555,23 @@ nfs4_proc_lock(struct file *filp, int cmd, struct file_lock *request)
+       if (request->fl_start < 0 || request->fl_end < 0)
+               return -EINVAL;
+-      if (IS_GETLK(cmd))
+-              return nfs4_proc_getlk(state, F_GETLK, request);
++      if (IS_GETLK(cmd)) {
++              if (state != NULL)
++                      return nfs4_proc_getlk(state, F_GETLK, request);
++              return 0;
++      }
+       if (!(IS_SETLK(cmd) || IS_SETLKW(cmd)))
+               return -EINVAL;
+-      if (request->fl_type == F_UNLCK)
+-              return nfs4_proc_unlck(state, cmd, request);
++      if (request->fl_type == F_UNLCK) {
++              if (state != NULL)
++                      return nfs4_proc_unlck(state, cmd, request);
++              return 0;
++      }
++      if (state == NULL)
++              return -ENOLCK;
+       do {
+               status = nfs4_proc_setlk(state, cmd, request);
+               if ((status != -EAGAIN) || IS_SETLK(cmd))
+diff --git a/fs/nfs/nfs4renewd.c b/fs/nfs/nfs4renewd.c
+index 3305acb..6ede673 100644
+--- a/fs/nfs/nfs4renewd.c
++++ b/fs/nfs/nfs4renewd.c
+@@ -125,12 +125,6 @@ nfs4_schedule_state_renewal(struct nfs_client *clp)
+ }
+ void
+-nfs4_renewd_prepare_shutdown(struct nfs_server *server)
+-{
+-      cancel_delayed_work(&server->nfs_client->cl_renewd);
+-}
+-
+-void
+ nfs4_kill_renewd(struct nfs_client *clp)
+ {
+       cancel_delayed_work_sync(&clp->cl_renewd);
+diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
+index b916297..5e26759 100644
+--- a/fs/nfs/nfs4xdr.c
++++ b/fs/nfs/nfs4xdr.c
+@@ -4671,7 +4671,6 @@ static struct {
+       { NFS4ERR_SERVERFAULT,  -ESERVERFAULT   },
+       { NFS4ERR_BADTYPE,      -EBADTYPE       },
+       { NFS4ERR_LOCKED,       -EAGAIN         },
+-      { NFS4ERR_RESOURCE,     -EREMOTEIO      },
+       { NFS4ERR_SYMLINK,      -ELOOP          },
+       { NFS4ERR_OP_ILLEGAL,   -EOPNOTSUPP     },
+       { NFS4ERR_DEADLOCK,     -EDEADLK        },
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index e9b2017..3da0fa5 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -2398,7 +2398,6 @@ static void nfs4_kill_super(struct super_block *sb)
+       nfs_return_all_delegations(sb);
+       kill_anon_super(sb);
+-      nfs4_renewd_prepare_shutdown(server);
+       nfs_free_server(server);
+ }
+diff --git a/fs/pipe.c b/fs/pipe.c
+index 35d2cbb..f91375f 100644
+--- a/fs/pipe.c
++++ b/fs/pipe.c
+@@ -742,36 +742,55 @@ pipe_rdwr_release(struct inode *inode, struct file *filp)
+ static int
+ pipe_read_open(struct inode *inode, struct file *filp)
+ {
+-      /* We could have perhaps used atomic_t, but this and friends
+-         below are the only places.  So it doesn't seem worthwhile.  */
++      int ret = -ENOENT;
++
+       mutex_lock(&inode->i_mutex);
+-      inode->i_pipe->readers++;
++
++      if (inode->i_pipe) {
++              ret = 0;
++              inode->i_pipe->readers++;
++      }
++
+       mutex_unlock(&inode->i_mutex);
+-      return 0;
++      return ret;
+ }
+ static int
+ pipe_write_open(struct inode *inode, struct file *filp)
+ {
++      int ret = -ENOENT;
++
+       mutex_lock(&inode->i_mutex);
+-      inode->i_pipe->writers++;
++
++      if (inode->i_pipe) {
++              ret = 0;
++              inode->i_pipe->writers++;
++      }
++
+       mutex_unlock(&inode->i_mutex);
+-      return 0;
++      return ret;
+ }
+ static int
+ pipe_rdwr_open(struct inode *inode, struct file *filp)
+ {
++      int ret = -ENOENT;
++
+       mutex_lock(&inode->i_mutex);
+-      if (filp->f_mode & FMODE_READ)
+-              inode->i_pipe->readers++;
+-      if (filp->f_mode & FMODE_WRITE)
+-              inode->i_pipe->writers++;
++
++      if (inode->i_pipe) {
++              ret = 0;
++              if (filp->f_mode & FMODE_READ)
++                      inode->i_pipe->readers++;
++              if (filp->f_mode & FMODE_WRITE)
++                      inode->i_pipe->writers++;
++      }
++
+       mutex_unlock(&inode->i_mutex);
+-      return 0;
++      return ret;
+ }
+ /*
+diff --git a/include/linux/kernel.h b/include/linux/kernel.h
+index 2651f80..cd85f00 100644
+--- a/include/linux/kernel.h
++++ b/include/linux/kernel.h
+@@ -200,6 +200,8 @@ extern struct ratelimit_state printk_ratelimit_state;
+ extern int printk_ratelimit(void);
+ extern bool printk_timed_ratelimit(unsigned long *caller_jiffies,
+                                  unsigned int interval_msec);
++extern void printk_tick(void);
++extern int printk_needs_cpu(int);
+ #else
+ static inline int vprintk(const char *s, va_list args)
+       __attribute__ ((format (printf, 1, 0)));
+@@ -211,6 +213,8 @@ static inline int printk_ratelimit(void) { return 0; }
+ static inline bool printk_timed_ratelimit(unsigned long *caller_jiffies, \
+                                         unsigned int interval_msec)   \
+               { return false; }
++static inline void printk_tick(void) { }
++static inline int printk_needs_cpu(int) { return 0; }
+ #endif
+ extern void asmlinkage __attribute__((format(printf, 1, 2)))
+diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
+index ba91fe1..c869aee 100644
+--- a/include/linux/pci_ids.h
++++ b/include/linux/pci_ids.h
+@@ -478,6 +478,9 @@
+ #define PCI_DEVICE_ID_IBM_ICOM_V2_ONE_PORT_RVX_ONE_PORT_MDM_PCIE 0x0361
+ #define PCI_DEVICE_ID_IBM_ICOM_FOUR_PORT_MODEL        0x252
++#define PCI_SUBVENDOR_ID_IBM          0x1014
++#define PCI_SUBDEVICE_ID_IBM_SATURN_SERIAL_ONE_PORT   0x03d4
++
+ #define PCI_VENDOR_ID_UNISYS          0x1018
+ #define PCI_DEVICE_ID_UNISYS_DMA_DIRECTOR 0x001C
+diff --git a/include/net/irda/irda_device.h b/include/net/irda/irda_device.h
+index 3025ae1..94c852d 100644
+--- a/include/net/irda/irda_device.h
++++ b/include/net/irda/irda_device.h
+@@ -135,9 +135,11 @@ struct dongle_reg {
+ /* 
+  * Per-packet information we need to hide inside sk_buff 
+- * (must not exceed 48 bytes, check with struct sk_buff) 
++ * (must not exceed 48 bytes, check with struct sk_buff)
++ * The default_qdisc_pad field is a temporary hack.
+  */
+ struct irda_skb_cb {
++      unsigned int default_qdisc_pad;
+       magic_t magic;       /* Be sure that we can trust the information */
+       __u32   next_speed;  /* The Speed to be set *after* this frame */
+       __u16   mtt;         /* Minimum turn around time */
+diff --git a/kernel/printk.c b/kernel/printk.c
+index 0084812..204660d 100644
+--- a/kernel/printk.c
++++ b/kernel/printk.c
+@@ -977,10 +977,25 @@ int is_console_locked(void)
+       return console_locked;
+ }
+-void wake_up_klogd(void)
++static DEFINE_PER_CPU(int, printk_pending);
++
++void printk_tick(void)
+ {
+-      if (!oops_in_progress && waitqueue_active(&log_wait))
++      if (__get_cpu_var(printk_pending)) {
++              __get_cpu_var(printk_pending) = 0;
+               wake_up_interruptible(&log_wait);
++      }
++}
++
++int printk_needs_cpu(int cpu)
++{
++      return per_cpu(printk_pending, cpu);
++}
++
++void wake_up_klogd(void)
++{
++      if (waitqueue_active(&log_wait))
++              __get_cpu_var(printk_pending) = 1;
+ }
+ /**
+diff --git a/kernel/time/tick-sched.c b/kernel/time/tick-sched.c
+index cb02324..a7cb616 100644
+--- a/kernel/time/tick-sched.c
++++ b/kernel/time/tick-sched.c
+@@ -261,7 +261,7 @@ void tick_nohz_stop_sched_tick(int inidle)
+       next_jiffies = get_next_timer_interrupt(last_jiffies);
+       delta_jiffies = next_jiffies - last_jiffies;
+-      if (rcu_needs_cpu(cpu))
++      if (rcu_needs_cpu(cpu) || printk_needs_cpu(cpu))
+               delta_jiffies = 1;
+       /*
+        * Do not stop the tick, if we are only one off
+diff --git a/kernel/timer.c b/kernel/timer.c
+index e9a0195..7acda56 100644
+--- a/kernel/timer.c
++++ b/kernel/timer.c
+@@ -978,6 +978,7 @@ void update_process_times(int user_tick)
+       run_local_timers();
+       if (rcu_pending(cpu))
+               rcu_check_callbacks(cpu, user_tick);
++      printk_tick();
+       scheduler_tick();
+       run_posix_cpu_timers(p);
+ }
+diff --git a/mm/mempolicy.c b/mm/mempolicy.c
+index 83bea4f..7acf81c 100644
+--- a/mm/mempolicy.c
++++ b/mm/mempolicy.c
+@@ -985,7 +985,8 @@ static long do_mbind(unsigned long start, unsigned long len,
+               if (!err && nr_failed && (flags & MPOL_MF_STRICT))
+                       err = -EIO;
+-      }
++      } else
++              putback_lru_pages(&pagelist);
+       up_write(&mm->mmap_sem);
+       mpol_put(new);
+diff --git a/net/appletalk/aarp.c b/net/appletalk/aarp.c
+index b25c1e9..dd076ea 100644
+--- a/net/appletalk/aarp.c
++++ b/net/appletalk/aarp.c
+@@ -598,7 +598,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
+       /* Non ELAP we cannot do. */
+       if (dev->type != ARPHRD_ETHER)
+-              return -1;
++              goto free_it;
+       skb->dev = dev;
+       skb->protocol = htons(ETH_P_ATALK);
+@@ -633,7 +633,7 @@ int aarp_send_ddp(struct net_device *dev, struct sk_buff *skb,
+       if (!a) {
+               /* Whoops slipped... good job it's an unreliable protocol 8) */
+               write_unlock_bh(&aarp_lock);
+-              return -1;
++              goto free_it;
+       }
+       /* Set up the queue */
+@@ -662,15 +662,21 @@ out_unlock:
+       write_unlock_bh(&aarp_lock);
+       /* Tell the ddp layer we have taken over for this frame. */
+-      return 0;
++      goto sent;
+ sendit:
+       if (skb->sk)
+               skb->priority = skb->sk->sk_priority;
+-      dev_queue_xmit(skb);
++      if (dev_queue_xmit(skb))
++              goto drop;
+ sent:
+-      return 1;
++      return NET_XMIT_SUCCESS;
++free_it:
++      kfree_skb(skb);
++drop:
++      return NET_XMIT_DROP;
+ }
++EXPORT_SYMBOL(aarp_send_ddp);
+ /*
+  *    An entry in the aarp unresolved queue has become resolved. Send
+diff --git a/net/appletalk/ddp.c b/net/appletalk/ddp.c
+index 8067dc7..e99d337 100644
+--- a/net/appletalk/ddp.c
++++ b/net/appletalk/ddp.c
+@@ -1277,8 +1277,10 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
+       struct net_device_stats *stats;
+       /* This needs to be able to handle ipddp"N" devices */
+-      if (!dev)
+-              return -ENODEV;
++      if (!dev) {
++              kfree_skb(skb);
++              return NET_RX_DROP;
++      }
+       skb->protocol = htons(ETH_P_IP);
+       skb_pull(skb, 13);
+@@ -1288,8 +1290,7 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
+       stats = dev->priv;
+       stats->rx_packets++;
+       stats->rx_bytes += skb->len + 13;
+-      netif_rx(skb);  /* Send the SKB up to a higher place. */
+-      return 0;
++      return netif_rx(skb);  /* Send the SKB up to a higher place. */
+ }
+ #else
+ /* make it easy for gcc to optimize this test out, i.e. kill the code */
+@@ -1297,9 +1298,8 @@ static int handle_ip_over_ddp(struct sk_buff *skb)
+ #define handle_ip_over_ddp(skb) 0
+ #endif
+-static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
+-                             struct ddpehdr *ddp, __u16 len_hops,
+-                             int origlen)
++static int atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
++                            struct ddpehdr *ddp, __u16 len_hops, int origlen)
+ {
+       struct atalk_route *rt;
+       struct atalk_addr ta;
+@@ -1366,8 +1366,6 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
+               /* 22 bytes - 12 ether, 2 len, 3 802.2 5 snap */
+               struct sk_buff *nskb = skb_realloc_headroom(skb, 32);
+               kfree_skb(skb);
+-              if (!nskb)
+-                      goto out;
+               skb = nskb;
+       } else
+               skb = skb_unshare(skb, GFP_ATOMIC);
+@@ -1376,12 +1374,16 @@ static void atalk_route_packet(struct sk_buff *skb, struct net_device *dev,
+        * If the buffer didn't vanish into the lack of space bitbucket we can
+        * send it.
+        */
+-      if (skb && aarp_send_ddp(rt->dev, skb, &ta, NULL) == -1)
+-              goto free_it;
+-out:
+-      return;
++      if (skb == NULL)
++              goto drop;
++
++      if (aarp_send_ddp(rt->dev, skb, &ta, NULL) == NET_XMIT_DROP)
++              return NET_RX_DROP;
++      return NET_XMIT_SUCCESS;
+ free_it:
+       kfree_skb(skb);
++drop:
++      return NET_RX_DROP;
+ }
+ /**
+@@ -1455,8 +1457,7 @@ static int atalk_rcv(struct sk_buff *skb, struct net_device *dev,
+               /* Not ours, so we route the packet via the correct
+                * AppleTalk iface
+                */
+-              atalk_route_packet(skb, dev, ddp, len_hops, origlen);
+-              goto out;
++              return atalk_route_packet(skb, dev, ddp, len_hops, origlen);
+       }
+       /* if IP over DDP is not selected this code will be optimized out */
+@@ -1663,10 +1664,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
+               if (skb2) {
+                       loopback = 1;
+                       SOCK_DEBUG(sk, "SK %p: send out(copy).\n", sk);
+-                      if (aarp_send_ddp(dev, skb2,
+-                                        &usat->sat_addr, NULL) == -1)
+-                              kfree_skb(skb2);
+-                              /* else queued/sent above in the aarp queue */
++                      /*
++                       * If it fails it is queued/sent above in the aarp queue
++                       */
++                      aarp_send_ddp(dev, skb2, &usat->sat_addr, NULL);
+               }
+       }
+@@ -1696,9 +1697,10 @@ static int atalk_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr
+                   usat = &gsat;
+               }
+-              if (aarp_send_ddp(dev, skb, &usat->sat_addr, NULL) == -1)
+-                      kfree_skb(skb);
+-              /* else queued/sent above in the aarp queue */
++              /*
++               * If it fails it is queued/sent above in the aarp queue
++               */
++              aarp_send_ddp(dev, skb, &usat->sat_addr, NULL);
+       }
+       SOCK_DEBUG(sk, "SK %p: Done write (%Zd).\n", sk, len);
+@@ -1877,7 +1879,6 @@ static struct packet_type ppptalk_packet_type = {
+ static unsigned char ddp_snap_id[] = { 0x08, 0x00, 0x07, 0x80, 0x9B };
+ /* Export symbols for use by drivers when AppleTalk is a module */
+-EXPORT_SYMBOL(aarp_send_ddp);
+ EXPORT_SYMBOL(atrtr_get_dev);
+ EXPORT_SYMBOL(atalk_find_dev_addr);
+diff --git a/net/sched/cls_api.c b/net/sched/cls_api.c
+index 8eb79e9..5b66371 100644
+--- a/net/sched/cls_api.c
++++ b/net/sched/cls_api.c
+@@ -337,7 +337,7 @@ static int tcf_fill_node(struct sk_buff *skb, struct tcf_proto *tp,
+       tcm = NLMSG_DATA(nlh);
+       tcm->tcm_family = AF_UNSPEC;
+       tcm->tcm__pad1 = 0;
+-      tcm->tcm__pad1 = 0;
++      tcm->tcm__pad2 = 0;
+       tcm->tcm_ifindex = qdisc_dev(tp->q)->ifindex;
+       tcm->tcm_parent = tp->classid;
+       tcm->tcm_info = TC_H_MAKE(tp->prio, tp->protocol);
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index 8e66fe0..facdaa9 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -1061,6 +1061,8 @@ restart:
+       err = -ECONNREFUSED;
+       if (other->sk_state != TCP_LISTEN)
+               goto out_unlock;
++      if (other->sk_shutdown & RCV_SHUTDOWN)
++              goto out_unlock;
+       if (unix_recvq_full(other)) {
+               err = -EAGAIN;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.4-5 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.4-5
new file mode 100644 (file)
index 0000000..8f8f80b
--- /dev/null
@@ -0,0 +1,2563 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.5
+
+Upstream 2.6.27.5 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/i2c/busses/i2c-sis96x b/Documentation/i2c/busses/i2c-sis96x
+index 266481f..70e6a0c 100644
+--- a/Documentation/i2c/busses/i2c-sis96x
++++ b/Documentation/i2c/busses/i2c-sis96x
+@@ -42,7 +42,7 @@ I suspect that this driver could be made to work for the following SiS
+ chipsets as well: 635, and 635T. If anyone owns a board with those chips
+ AND is willing to risk crashing & burning an otherwise well-behaved kernel
+ in the name of progress... please contact me at <mhoffman@lightlink.com> or
+-via the project's mailing list: <i2c@lm-sensors.org>.  Please send bug
++via the linux-i2c mailing list: <linux-i2c@vger.kernel.org>.  Please send bug
+ reports and/or success stories as well.
+diff --git a/MAINTAINERS b/MAINTAINERS
+index 8dae455..ff24d01 100644
+--- a/MAINTAINERS
++++ b/MAINTAINERS
+@@ -360,7 +360,7 @@ S: Maintained
+ ALI1563 I2C DRIVER
+ P:    Rudolf Marek
+ M:    r.marek@assembler.cz
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ ALPHA PORT
+@@ -1681,7 +1681,7 @@ FREESCALE I2C CPM DRIVER
+ P:    Jochen Friedrich
+ M:    jochen@scram.de
+ L:    linuxppc-dev@ozlabs.org
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ FREESCALE SOC FS_ENET DRIVER
+@@ -1982,7 +1982,7 @@ S:       Maintained
+ I2C/SMBUS STUB DRIVER
+ P:    Mark M. Hoffman
+ M:    mhoffman@lightlink.com
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ I2C SUBSYSTEM
+@@ -1990,14 +1990,14 @@ P:     Jean Delvare (PC drivers, core)
+ M:    khali@linux-fr.org
+ P:    Ben Dooks (embedded platforms)
+ M:    ben-linux@fluff.org
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ T:    quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
+ S:    Maintained
+ I2C-TINY-USB DRIVER
+ P:    Till Harbaum
+ M:    till@harbaum.org
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ T:    http://www.harbaum.org/till/i2c_tiny_usb
+ S:    Maintained
+@@ -3070,7 +3070,7 @@ S:       Maintained
+ OPENCORES I2C BUS DRIVER
+ P:    Peter Korsgaard
+ M:    jacmet@sunsite.dk
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ ORACLE CLUSTER FILESYSTEM 2 (OCFS2)
+@@ -3144,7 +3144,7 @@ S:       Maintained
+ PA SEMI SMBUS DRIVER
+ P:    Olof Johansson
+ M:    olof@lixom.net
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ PARALLEL PORT SUPPORT
+@@ -3280,7 +3280,7 @@ S:       Maintained
+ PNXxxxx I2C DRIVER
+ P:    Vitaly Wool
+ M:    vitalywool@gmail.com
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ PPP PROTOCOL DRIVERS AND COMPRESSORS
+@@ -3725,7 +3725,7 @@ S:       Maintained
+ SIS 96X I2C/SMBUS DRIVER
+ P:    Mark M. Hoffman
+ M:    mhoffman@lightlink.com
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ SIS FRAMEBUFFER DRIVER
+@@ -4445,7 +4445,7 @@ S:       Maintained
+ VIAPRO SMBUS DRIVER
+ P:    Jean Delvare
+ M:    khali@linux-fr.org
+-L:    i2c@lm-sensors.org
++L:    linux-i2c@vger.kernel.org
+ S:    Maintained
+ VIA VELOCITY NETWORK DRIVER
+diff --git a/Makefile b/Makefile
+index 7529a72..4ea7b3c 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .4
++EXTRAVERSION = .5
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/configs/linkstation_defconfig b/arch/powerpc/configs/linkstation_defconfig
+index 6fc4c21..d0846ec 100644
+--- a/arch/powerpc/configs/linkstation_defconfig
++++ b/arch/powerpc/configs/linkstation_defconfig
+@@ -1,7 +1,7 @@
+ #
+ # Automatically generated make config: don't edit
+-# Linux kernel version: 2.6.27-rc4
+-# Thu Aug 21 00:52:05 2008
++# Linux kernel version: 2.6.27
++# Fri Oct 24 00:42:39 2008
+ #
+ # CONFIG_PPC64 is not set
+@@ -934,7 +934,7 @@ CONFIG_SERIAL_8250_RUNTIME_UARTS=4
+ CONFIG_SERIAL_CORE=y
+ CONFIG_SERIAL_CORE_CONSOLE=y
+ # CONFIG_SERIAL_JSM is not set
+-CONFIG_SERIAL_OF_PLATFORM=y
++# CONFIG_SERIAL_OF_PLATFORM is not set
+ CONFIG_UNIX98_PTYS=y
+ CONFIG_LEGACY_PTYS=y
+ CONFIG_LEGACY_PTY_COUNT=256
+@@ -1211,7 +1211,6 @@ CONFIG_USB_STORAGE=m
+ # CONFIG_USB_STORAGE_ALAUDA is not set
+ # CONFIG_USB_STORAGE_ONETOUCH is not set
+ # CONFIG_USB_STORAGE_KARMA is not set
+-# CONFIG_USB_STORAGE_SIERRA is not set
+ # CONFIG_USB_STORAGE_CYPRESS_ATACB is not set
+ # CONFIG_USB_LIBUSUAL is not set
+diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c
+index 8920eea..16319a5 100644
+--- a/arch/powerpc/mm/hash_utils_64.c
++++ b/arch/powerpc/mm/hash_utils_64.c
+@@ -381,8 +381,10 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node,
+       printk(KERN_INFO "Huge page(16GB) memory: "
+                       "addr = 0x%lX size = 0x%lX pages = %d\n",
+                       phys_addr, block_size, expected_pages);
+-      lmb_reserve(phys_addr, block_size * expected_pages);
+-      add_gpage(phys_addr, block_size, expected_pages);
++      if (phys_addr + (16 * GB) <= lmb_end_of_DRAM()) {
++              lmb_reserve(phys_addr, block_size * expected_pages);
++              add_gpage(phys_addr, block_size, expected_pages);
++      }
+       return 0;
+ }
+diff --git a/arch/powerpc/mm/numa.c b/arch/powerpc/mm/numa.c
+index d9a1813..b5ae97e 100644
+--- a/arch/powerpc/mm/numa.c
++++ b/arch/powerpc/mm/numa.c
+@@ -89,6 +89,48 @@ static int __cpuinit fake_numa_create_new_node(unsigned long end_pfn,
+       return 0;
+ }
++/*
++ * get_active_region_work_fn - A helper function for get_node_active_region
++ *    Returns datax set to the start_pfn and end_pfn if they contain
++ *    the initial value of datax->start_pfn between them
++ * @start_pfn: start page(inclusive) of region to check
++ * @end_pfn: end page(exclusive) of region to check
++ * @datax: comes in with ->start_pfn set to value to search for and
++ *    goes out with active range if it contains it
++ * Returns 1 if search value is in range else 0
++ */
++static int __init get_active_region_work_fn(unsigned long start_pfn,
++                                      unsigned long end_pfn, void *datax)
++{
++      struct node_active_region *data;
++      data = (struct node_active_region *)datax;
++
++      if (start_pfn <= data->start_pfn && end_pfn > data->start_pfn) {
++              data->start_pfn = start_pfn;
++              data->end_pfn = end_pfn;
++              return 1;
++      }
++      return 0;
++
++}
++
++/*
++ * get_node_active_region - Return active region containing start_pfn
++ * Active range returned is empty if none found.
++ * @start_pfn: The page to return the region for.
++ * @node_ar: Returned set to the active region containing start_pfn
++ */
++static void __init get_node_active_region(unsigned long start_pfn,
++                     struct node_active_region *node_ar)
++{
++      int nid = early_pfn_to_nid(start_pfn);
++
++      node_ar->nid = nid;
++      node_ar->start_pfn = start_pfn;
++      node_ar->end_pfn = start_pfn;
++      work_with_active_regions(nid, get_active_region_work_fn, node_ar);
++}
++
+ static void __cpuinit map_cpu_to_node(int cpu, int node)
+ {
+       numa_cpu_lookup_table[cpu] = node;
+@@ -837,38 +879,53 @@ void __init do_init_bootmem(void)
+                                 start_pfn, end_pfn);
+               free_bootmem_with_active_regions(nid, end_pfn);
++      }
+-              /* Mark reserved regions on this node */
+-              for (i = 0; i < lmb.reserved.cnt; i++) {
+-                      unsigned long physbase = lmb.reserved.region[i].base;
+-                      unsigned long size = lmb.reserved.region[i].size;
+-                      unsigned long start_paddr = start_pfn << PAGE_SHIFT;
+-                      unsigned long end_paddr = end_pfn << PAGE_SHIFT;
+-
+-                      if (early_pfn_to_nid(physbase >> PAGE_SHIFT) != nid &&
+-                          early_pfn_to_nid((physbase+size-1) >> PAGE_SHIFT) != nid)
+-                              continue;
+-
+-                      if (physbase < end_paddr &&
+-                          (physbase+size) > start_paddr) {
+-                              /* overlaps */
+-                              if (physbase < start_paddr) {
+-                                      size -= start_paddr - physbase;
+-                                      physbase = start_paddr;
+-                              }
+-
+-                              if (size > end_paddr - physbase)
+-                                      size = end_paddr - physbase;
+-
+-                              dbg("reserve_bootmem %lx %lx\n", physbase,
+-                                  size);
+-                              reserve_bootmem_node(NODE_DATA(nid), physbase,
+-                                                   size, BOOTMEM_DEFAULT);
+-                      }
++      /* Mark reserved regions */
++      for (i = 0; i < lmb.reserved.cnt; i++) {
++              unsigned long physbase = lmb.reserved.region[i].base;
++              unsigned long size = lmb.reserved.region[i].size;
++              unsigned long start_pfn = physbase >> PAGE_SHIFT;
++              unsigned long end_pfn = ((physbase + size) >> PAGE_SHIFT);
++              struct node_active_region node_ar;
++
++              get_node_active_region(start_pfn, &node_ar);
++              while (start_pfn < end_pfn &&
++                      node_ar.start_pfn < node_ar.end_pfn) {
++                      unsigned long reserve_size = size;
++                      /*
++                       * if reserved region extends past active region
++                       * then trim size to active region
++                       */
++                      if (end_pfn > node_ar.end_pfn)
++                              reserve_size = (node_ar.end_pfn << PAGE_SHIFT)
++                                      - (start_pfn << PAGE_SHIFT);
++                      dbg("reserve_bootmem %lx %lx nid=%d\n", physbase,
++                              reserve_size, node_ar.nid);
++                      reserve_bootmem_node(NODE_DATA(node_ar.nid), physbase,
++                                              reserve_size, BOOTMEM_DEFAULT);
++                      /*
++                       * if reserved region is contained in the active region
++                       * then done.
++                       */
++                      if (end_pfn <= node_ar.end_pfn)
++                              break;
++
++                      /*
++                       * reserved region extends past the active region
++                       *   get next active region that contains this
++                       *   reserved region
++                       */
++                      start_pfn = node_ar.end_pfn;
++                      physbase = start_pfn << PAGE_SHIFT;
++                      size = size - reserve_size;
++                      get_node_active_region(start_pfn, &node_ar);
+               }
+-              sparse_memory_present_with_active_regions(nid);
+       }
++
++      for_each_online_node(nid)
++              sparse_memory_present_with_active_regions(nid);
+ }
+ void __init paging_init(void)
+diff --git a/arch/powerpc/platforms/embedded6xx/linkstation.c b/arch/powerpc/platforms/embedded6xx/linkstation.c
+index eb5d74e..2ca7be6 100644
+--- a/arch/powerpc/platforms/embedded6xx/linkstation.c
++++ b/arch/powerpc/platforms/embedded6xx/linkstation.c
+@@ -13,6 +13,7 @@
+ #include <linux/kernel.h>
+ #include <linux/initrd.h>
+ #include <linux/mtd/physmap.h>
++#include <linux/of_platform.h>
+ #include <asm/time.h>
+ #include <asm/prom.h>
+@@ -54,6 +55,19 @@ static struct mtd_partition linkstation_physmap_partitions[] = {
+       },
+ };
++static __initdata struct of_device_id of_bus_ids[] = {
++      { .type = "soc", },
++      { .compatible = "simple-bus", },
++      {},
++};
++
++static int __init declare_of_platform_devices(void)
++{
++      of_platform_bus_probe(NULL, of_bus_ids, NULL);
++      return 0;
++}
++machine_device_initcall(linkstation, declare_of_platform_devices);
++
+ static int __init linkstation_add_bridge(struct device_node *dev)
+ {
+ #ifdef CONFIG_PCI
+diff --git a/arch/s390/kernel/smp.c b/arch/s390/kernel/smp.c
+index 00b9b4d..fdfca4f 100644
+--- a/arch/s390/kernel/smp.c
++++ b/arch/s390/kernel/smp.c
+@@ -1117,9 +1117,7 @@ out:
+       return rc;
+ }
+-static ssize_t __ref rescan_store(struct sys_device *dev,
+-                                struct sysdev_attribute *attr,
+-                                const char *buf,
++static ssize_t __ref rescan_store(struct sysdev_class *class, const char *buf,
+                                 size_t count)
+ {
+       int rc;
+@@ -1127,12 +1125,10 @@ static ssize_t __ref rescan_store(struct sys_device *dev,
+       rc = smp_rescan_cpus();
+       return rc ? rc : count;
+ }
+-static SYSDEV_ATTR(rescan, 0200, NULL, rescan_store);
++static SYSDEV_CLASS_ATTR(rescan, 0200, NULL, rescan_store);
+ #endif /* CONFIG_HOTPLUG_CPU */
+-static ssize_t dispatching_show(struct sys_device *dev,
+-                              struct sysdev_attribute *attr,
+-                              char *buf)
++static ssize_t dispatching_show(struct sysdev_class *class, char *buf)
+ {
+       ssize_t count;
+@@ -1142,9 +1138,8 @@ static ssize_t dispatching_show(struct sys_device *dev,
+       return count;
+ }
+-static ssize_t dispatching_store(struct sys_device *dev,
+-                               struct sysdev_attribute *attr,
+-                               const char *buf, size_t count)
++static ssize_t dispatching_store(struct sysdev_class *dev, const char *buf,
++                               size_t count)
+ {
+       int val, rc;
+       char delim;
+@@ -1166,7 +1161,8 @@ out:
+       put_online_cpus();
+       return rc ? rc : count;
+ }
+-static SYSDEV_ATTR(dispatching, 0644, dispatching_show, dispatching_store);
++static SYSDEV_CLASS_ATTR(dispatching, 0644, dispatching_show,
++                       dispatching_store);
+ static int __init topology_init(void)
+ {
+@@ -1176,13 +1172,11 @@ static int __init topology_init(void)
+       register_cpu_notifier(&smp_cpu_nb);
+ #ifdef CONFIG_HOTPLUG_CPU
+-      rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
+-                             &attr_rescan.attr);
++      rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_rescan);
+       if (rc)
+               return rc;
+ #endif
+-      rc = sysfs_create_file(&cpu_sysdev_class.kset.kobj,
+-                             &attr_dispatching.attr);
++      rc = sysdev_class_create_file(&cpu_sysdev_class, &attr_dispatching);
+       if (rc)
+               return rc;
+       for_each_present_cpu(cpu) {
+diff --git a/arch/sparc64/kernel/trampoline.S b/arch/sparc64/kernel/trampoline.S
+index 704a3af..83abd5a 100644
+--- a/arch/sparc64/kernel/trampoline.S
++++ b/arch/sparc64/kernel/trampoline.S
+@@ -328,6 +328,12 @@ after_lock_tlb:
+       wrpr            %g0, 0, %wstate
++      sethi           %hi(prom_entry_lock), %g2
++1:    ldstub          [%g2 + %lo(prom_entry_lock)], %g1
++      membar          #StoreLoad | #StoreStore
++      brnz,pn         %g1, 1b
++       nop
++
+       /* As a hack, put &init_thread_union into %g6.
+        * prom_world() loads from here to restore the %asi
+        * register.
+@@ -337,7 +343,7 @@ after_lock_tlb:
+       sethi           %hi(is_sun4v), %o0
+       lduw            [%o0 + %lo(is_sun4v)], %o0
+-      brz,pt          %o0, 1f
++      brz,pt          %o0, 2f
+        nop
+       TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
+@@ -369,10 +375,10 @@ after_lock_tlb:
+       call            %o1
+        add            %sp, (2047 + 128), %o0
+-      ba,pt           %xcc, 2f
++      ba,pt           %xcc, 3f
+        nop
+-1:    sethi           %hi(sparc64_ttable_tl0), %o0
++2:    sethi           %hi(sparc64_ttable_tl0), %o0
+       set             prom_set_trap_table_name, %g2
+       stx             %g2, [%sp + 2047 + 128 + 0x00]
+       mov             1, %g2
+@@ -386,7 +392,11 @@ after_lock_tlb:
+       call            %o1
+        add            %sp, (2047 + 128), %o0
+-2:    ldx             [%l0], %g6
++3:    sethi           %hi(prom_entry_lock), %g2
++      stb             %g0, [%g2 + %lo(prom_entry_lock)]
++      membar          #StoreStore | #StoreLoad
++
++      ldx             [%l0], %g6
+       ldx             [%g6 + TI_TASK], %g4
+       mov             1, %g5
+diff --git a/arch/x86/kernel/process_64.c b/arch/x86/kernel/process_64.c
+index e12e0e4..5a7c539 100644
+--- a/arch/x86/kernel/process_64.c
++++ b/arch/x86/kernel/process_64.c
+@@ -729,12 +729,12 @@ unsigned long get_wchan(struct task_struct *p)
+       if (!p || p == current || p->state==TASK_RUNNING)
+               return 0; 
+       stack = (unsigned long)task_stack_page(p);
+-      if (p->thread.sp < stack || p->thread.sp > stack+THREAD_SIZE)
++      if (p->thread.sp < stack || p->thread.sp >= stack+THREAD_SIZE)
+               return 0;
+       fp = *(u64 *)(p->thread.sp);
+       do { 
+               if (fp < (unsigned long)stack ||
+-                  fp > (unsigned long)stack+THREAD_SIZE)
++                  fp >= (unsigned long)stack+THREAD_SIZE)
+                       return 0; 
+               ip = *(u64 *)(fp+8);
+               if (!in_sched_functions(ip))
+diff --git a/arch/x86/kernel/rtc.c b/arch/x86/kernel/rtc.c
+index 05191bb..0a23b57 100644
+--- a/arch/x86/kernel/rtc.c
++++ b/arch/x86/kernel/rtc.c
+@@ -223,11 +223,25 @@ static struct platform_device rtc_device = {
+ static __init int add_rtc_cmos(void)
+ {
+ #ifdef CONFIG_PNP
+-      if (!pnp_platform_devices)
+-              platform_device_register(&rtc_device);
+-#else
++      static const char *ids[] __initconst =
++          { "PNP0b00", "PNP0b01", "PNP0b02", };
++      struct pnp_dev *dev;
++      struct pnp_id *id;
++      int i;
++
++      pnp_for_each_dev(dev) {
++              for (id = dev->id; id; id = id->next) {
++                      for (i = 0; i < ARRAY_SIZE(ids); i++) {
++                              if (compare_pnp_id(id, ids[i]) != 0)
++                                      return 0;
++                      }
++              }
++      }
++#endif
++
+       platform_device_register(&rtc_device);
+-#endif /* CONFIG_PNP */
++      dev_info(&rtc_device.dev,
++               "registered platform RTC device (no PNP device found)\n");
+       return 0;
+ }
+ device_initcall(add_rtc_cmos);
+diff --git a/arch/x86/mm/pat.c b/arch/x86/mm/pat.c
+index 2a50e0f..ac144c2 100644
+--- a/arch/x86/mm/pat.c
++++ b/arch/x86/mm/pat.c
+@@ -403,12 +403,16 @@ static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+       return 1;
+ }
+ #else
++/* This check is needed to avoid cache aliasing when PAT is enabled */
+ static inline int range_is_allowed(unsigned long pfn, unsigned long size)
+ {
+       u64 from = ((u64)pfn) << PAGE_SHIFT;
+       u64 to = from + size;
+       u64 cursor = from;
++      if (!pat_enabled)
++              return 1;
++
+       while (cursor < to) {
+               if (!devmem_is_allowed(pfn)) {
+                       printk(KERN_INFO
+diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
+index 1dfec41..59352d9 100644
+--- a/drivers/acpi/button.c
++++ b/drivers/acpi/button.c
+@@ -262,6 +262,7 @@ static int acpi_lid_send_state(struct acpi_button *button)
+               return -ENODEV;
+       /* input layer checks if event is redundant */
+       input_report_switch(button->input, SW_LID, !state);
++      input_sync(button->input);
+       return 0;
+ }
+@@ -285,8 +286,8 @@ static void acpi_button_notify(acpi_handle handle, u32 event, void *data)
+                       input_report_key(input, keycode, 1);
+                       input_sync(input);
+                       input_report_key(input, keycode, 0);
++                      input_sync(input);
+               }
+-              input_sync(input);
+               acpi_bus_generate_proc_event(button->device, event,
+                                       ++button->pushed);
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 13593f9..444cd9e 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -1,7 +1,7 @@
+ /*
+- *  ec.c - ACPI Embedded Controller Driver (v2.0)
++ *  ec.c - ACPI Embedded Controller Driver (v2.1)
+  *
+- *  Copyright (C) 2006, 2007 Alexey Starikovskiy <alexey.y.starikovskiy@intel.com>
++ *  Copyright (C) 2006-2008 Alexey Starikovskiy <astarikovskiy@suse.de>
+  *  Copyright (C) 2006 Denis Sadykov <denis.m.sadykov@intel.com>
+  *  Copyright (C) 2004 Luming Yu <luming.yu@intel.com>
+  *  Copyright (C) 2001, 2002 Andy Grover <andrew.grover@intel.com>
+@@ -26,7 +26,7 @@
+  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+  */
+-/* Uncomment next line to get verbose print outs*/
++/* Uncomment next line to get verbose printout */
+ /* #define DEBUG */
+ #include <linux/kernel.h>
+@@ -38,6 +38,7 @@
+ #include <linux/seq_file.h>
+ #include <linux/interrupt.h>
+ #include <linux/list.h>
++#include <linux/spinlock.h>
+ #include <asm/io.h>
+ #include <acpi/acpi_bus.h>
+ #include <acpi/acpi_drivers.h>
+@@ -65,22 +66,21 @@ enum ec_command {
+       ACPI_EC_COMMAND_QUERY = 0x84,
+ };
+-/* EC events */
+-enum ec_event {
+-      ACPI_EC_EVENT_OBF_1 = 1,        /* Output buffer full */
+-      ACPI_EC_EVENT_IBF_0,            /* Input buffer empty */
+-};
+-
+ #define ACPI_EC_DELAY         500     /* Wait 500ms max. during EC ops */
+ #define ACPI_EC_UDELAY_GLK    1000    /* Wait 1ms max. to get global lock */
+ #define ACPI_EC_UDELAY                100     /* Wait 100us before polling EC again */
++#define ACPI_EC_STORM_THRESHOLD 20    /* number of false interrupts
++                                         per one transaction */
++
+ enum {
+-      EC_FLAGS_WAIT_GPE = 0,          /* Don't check status until GPE arrives */
+       EC_FLAGS_QUERY_PENDING,         /* Query is pending */
+-      EC_FLAGS_GPE_MODE,              /* Expect GPE to be sent for status change */
++      EC_FLAGS_GPE_MODE,              /* Expect GPE to be sent
++                                       * for status change */
+       EC_FLAGS_NO_GPE,                /* Don't use GPE mode */
+-      EC_FLAGS_RESCHEDULE_POLL        /* Re-schedule poll */
++      EC_FLAGS_GPE_STORM,             /* GPE storm detected */
++      EC_FLAGS_HANDLERS_INSTALLED     /* Handlers for GPE and
++                                       * OpReg are installed */
+ };
+ /* If we find an EC via the ECDT, we need to keep a ptr to its context */
+@@ -95,6 +95,15 @@ struct acpi_ec_query_handler {
+       u8 query_bit;
+ };
++struct transaction {
++      const u8 *wdata;
++      u8 *rdata;
++      unsigned short irq_count;
++      u8 command;
++      u8 wlen;
++      u8 rlen;
++};
++
+ static struct acpi_ec {
+       acpi_handle handle;
+       unsigned long gpe;
+@@ -105,9 +114,8 @@ static struct acpi_ec {
+       struct mutex lock;
+       wait_queue_head_t wait;
+       struct list_head list;
+-      struct delayed_work work;
+-      atomic_t irq_count;
+-      u8 handlers_installed;
++      struct transaction *curr;
++      spinlock_t curr_lock;
+ } *boot_ec, *first_ec;
+ /* 
+@@ -150,7 +158,7 @@ static inline u8 acpi_ec_read_data(struct acpi_ec *ec)
+ {
+       u8 x = inb(ec->data_addr);
+       pr_debug(PREFIX "---> data = 0x%2.2x\n", x);
+-      return inb(ec->data_addr);
++      return x;
+ }
+ static inline void acpi_ec_write_cmd(struct acpi_ec *ec, u8 command)
+@@ -165,158 +173,172 @@ static inline void acpi_ec_write_data(struct acpi_ec *ec, u8 data)
+       outb(data, ec->data_addr);
+ }
+-static inline int acpi_ec_check_status(struct acpi_ec *ec, enum ec_event event)
++static int ec_transaction_done(struct acpi_ec *ec)
+ {
+-      if (test_bit(EC_FLAGS_WAIT_GPE, &ec->flags))
+-              return 0;
+-      if (event == ACPI_EC_EVENT_OBF_1) {
+-              if (acpi_ec_read_status(ec) & ACPI_EC_FLAG_OBF)
+-                      return 1;
+-      } else if (event == ACPI_EC_EVENT_IBF_0) {
+-              if (!(acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF))
+-                      return 1;
+-      }
+-
+-      return 0;
++      unsigned long flags;
++      int ret = 0;
++      spin_lock_irqsave(&ec->curr_lock, flags);
++      if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen))
++              ret = 1;
++      spin_unlock_irqrestore(&ec->curr_lock, flags);
++      return ret;
+ }
+-static void ec_schedule_ec_poll(struct acpi_ec *ec)
++static void gpe_transaction(struct acpi_ec *ec, u8 status)
+ {
+-      if (test_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags))
+-              schedule_delayed_work(&ec->work,
+-                                    msecs_to_jiffies(ACPI_EC_DELAY));
++      unsigned long flags;
++      spin_lock_irqsave(&ec->curr_lock, flags);
++      if (!ec->curr)
++              goto unlock;
++      if (ec->curr->wlen > 0) {
++              if ((status & ACPI_EC_FLAG_IBF) == 0) {
++                      acpi_ec_write_data(ec, *(ec->curr->wdata++));
++                      --ec->curr->wlen;
++              } else
++                      /* false interrupt, state didn't change */
++                      ++ec->curr->irq_count;
++
++      } else if (ec->curr->rlen > 0) {
++              if ((status & ACPI_EC_FLAG_OBF) == 1) {
++                      *(ec->curr->rdata++) = acpi_ec_read_data(ec);
++                      --ec->curr->rlen;
++              } else
++                      /* false interrupt, state didn't change */
++                      ++ec->curr->irq_count;
++      }
++unlock:
++      spin_unlock_irqrestore(&ec->curr_lock, flags);
+ }
+-static void ec_switch_to_poll_mode(struct acpi_ec *ec)
++static int acpi_ec_wait(struct acpi_ec *ec)
+ {
++      if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
++                             msecs_to_jiffies(ACPI_EC_DELAY)))
++              return 0;
++      /* missing GPEs, switch back to poll mode */
++      if (printk_ratelimit())
++              pr_info(PREFIX "missing confirmations, "
++                              "switch off interrupt mode.\n");
+       set_bit(EC_FLAGS_NO_GPE, &ec->flags);
+       clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+-      acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
+-      set_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
++      return 1;
+ }
+-static int acpi_ec_wait(struct acpi_ec *ec, enum ec_event event, int force_poll)
++static void acpi_ec_gpe_query(void *ec_cxt);
++
++static int ec_check_sci(struct acpi_ec *ec, u8 state)
+ {
+-      atomic_set(&ec->irq_count, 0);
+-      if (likely(test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) &&
+-          likely(!force_poll)) {
+-              if (wait_event_timeout(ec->wait, acpi_ec_check_status(ec, event),
+-                                     msecs_to_jiffies(ACPI_EC_DELAY)))
+-                      return 0;
+-              clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+-              if (acpi_ec_check_status(ec, event)) {
+-                      /* missing GPEs, switch back to poll mode */
+-                      if (printk_ratelimit())
+-                              pr_info(PREFIX "missing confirmations, "
+-                                              "switch off interrupt mode.\n");
+-                      ec_switch_to_poll_mode(ec);
+-                      ec_schedule_ec_poll(ec);
+-                      return 0;
+-              }
+-      } else {
+-              unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
+-              clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+-              while (time_before(jiffies, delay)) {
+-                      if (acpi_ec_check_status(ec, event))
+-                              return 0;
+-                      msleep(1);
+-              }
+-              if (acpi_ec_check_status(ec,event))
++      if (state & ACPI_EC_FLAG_SCI) {
++              if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
++                      return acpi_os_execute(OSL_EC_BURST_HANDLER,
++                              acpi_ec_gpe_query, ec);
++      }
++      return 0;
++}
++
++static int ec_poll(struct acpi_ec *ec)
++{
++      unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
++      msleep(1);
++      while (time_before(jiffies, delay)) {
++              gpe_transaction(ec, acpi_ec_read_status(ec));
++              msleep(1);
++              if (ec_transaction_done(ec))
+                       return 0;
+       }
+-      pr_err(PREFIX "acpi_ec_wait timeout, status = 0x%2.2x, event = %s\n",
+-              acpi_ec_read_status(ec),
+-              (event == ACPI_EC_EVENT_OBF_1) ? "\"b0=1\"" : "\"b1=0\"");
+       return -ETIME;
+ }
+-static int acpi_ec_transaction_unlocked(struct acpi_ec *ec, u8 command,
+-                                      const u8 * wdata, unsigned wdata_len,
+-                                      u8 * rdata, unsigned rdata_len,
++static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
++                                      struct transaction *t,
+                                       int force_poll)
+ {
+-      int result = 0;
+-      set_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
++      unsigned long tmp;
++      int ret = 0;
+       pr_debug(PREFIX "transaction start\n");
+-      acpi_ec_write_cmd(ec, command);
+-      for (; wdata_len > 0; --wdata_len) {
+-              result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll);
+-              if (result) {
+-                      pr_err(PREFIX
+-                             "write_cmd timeout, command = %d\n", command);
+-                      goto end;
+-              }
+-              set_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+-              acpi_ec_write_data(ec, *(wdata++));
++      /* disable GPE during transaction if storm is detected */
++      if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
++              clear_bit(EC_FLAGS_GPE_MODE, &ec->flags);
++              acpi_disable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
+       }
+-
+-      if (!rdata_len) {
+-              result = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, force_poll);
+-              if (result) {
+-                      pr_err(PREFIX
+-                             "finish-write timeout, command = %d\n", command);
+-                      goto end;
+-              }
+-      } else if (command == ACPI_EC_COMMAND_QUERY)
++      /* start transaction */
++      spin_lock_irqsave(&ec->curr_lock, tmp);
++      /* following two actions should be kept atomic */
++      t->irq_count = 0;
++      ec->curr = t;
++      acpi_ec_write_cmd(ec, ec->curr->command);
++      if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
+               clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+-
+-      for (; rdata_len > 0; --rdata_len) {
+-              result = acpi_ec_wait(ec, ACPI_EC_EVENT_OBF_1, force_poll);
+-              if (result) {
+-                      pr_err(PREFIX "read timeout, command = %d\n", command);
+-                      goto end;
+-              }
+-              /* Don't expect GPE after last read */
+-              if (rdata_len > 1)
+-                      set_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+-              *(rdata++) = acpi_ec_read_data(ec);
+-      }
+-      end:
++      spin_unlock_irqrestore(&ec->curr_lock, tmp);
++      /* if we selected poll mode or failed in GPE-mode do a poll loop */
++      if (force_poll ||
++          !test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ||
++          acpi_ec_wait(ec))
++              ret = ec_poll(ec);
+       pr_debug(PREFIX "transaction end\n");
+-      return result;
++      spin_lock_irqsave(&ec->curr_lock, tmp);
++      ec->curr = NULL;
++      spin_unlock_irqrestore(&ec->curr_lock, tmp);
++      if (test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
++              /* check if we received SCI during transaction */
++              ec_check_sci(ec, acpi_ec_read_status(ec));
++              /* it is safe to enable GPE outside of transaction */
++              acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
++      } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
++                 t->irq_count > ACPI_EC_STORM_THRESHOLD) {
++              pr_debug(PREFIX "GPE storm detected\n");
++              set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
++      }
++      return ret;
++}
++
++static int ec_check_ibf0(struct acpi_ec *ec)
++{
++      u8 status = acpi_ec_read_status(ec);
++      return (status & ACPI_EC_FLAG_IBF) == 0;
+ }
+-static int acpi_ec_transaction(struct acpi_ec *ec, u8 command,
+-                             const u8 * wdata, unsigned wdata_len,
+-                             u8 * rdata, unsigned rdata_len,
++static int ec_wait_ibf0(struct acpi_ec *ec)
++{
++      unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
++      /* interrupt wait manually if GPE mode is not active */
++      unsigned long timeout = test_bit(EC_FLAGS_GPE_MODE, &ec->flags) ?
++              msecs_to_jiffies(ACPI_EC_DELAY) : msecs_to_jiffies(1);
++      while (time_before(jiffies, delay))
++              if (wait_event_timeout(ec->wait, ec_check_ibf0(ec), timeout))
++                      return 0;
++      return -ETIME;
++}
++
++static int acpi_ec_transaction(struct acpi_ec *ec, struct transaction *t,
+                              int force_poll)
+ {
+       int status;
+       u32 glk;
+-
+-      if (!ec || (wdata_len && !wdata) || (rdata_len && !rdata))
++      if (!ec || (!t) || (t->wlen && !t->wdata) || (t->rlen && !t->rdata))
+               return -EINVAL;
+-
+-      if (rdata)
+-              memset(rdata, 0, rdata_len);
+-
++      if (t->rdata)
++              memset(t->rdata, 0, t->rlen);
+       mutex_lock(&ec->lock);
+       if (ec->global_lock) {
+               status = acpi_acquire_global_lock(ACPI_EC_UDELAY_GLK, &glk);
+               if (ACPI_FAILURE(status)) {
+-                      mutex_unlock(&ec->lock);
+-                      return -ENODEV;
++                      status = -ENODEV;
++                      goto unlock;
+               }
+       }
+-
+-      status = acpi_ec_wait(ec, ACPI_EC_EVENT_IBF_0, 0);
+-      if (status) {
++      if (ec_wait_ibf0(ec)) {
+               pr_err(PREFIX "input buffer is not empty, "
+                               "aborting transaction\n");
++              status = -ETIME;
+               goto end;
+       }
+-
+-      status = acpi_ec_transaction_unlocked(ec, command,
+-                                            wdata, wdata_len,
+-                                            rdata, rdata_len,
+-                                            force_poll);
+-
+-      end:
+-
++      status = acpi_ec_transaction_unlocked(ec, t, force_poll);
++end:
+       if (ec->global_lock)
+               acpi_release_global_lock(glk);
++unlock:
+       mutex_unlock(&ec->lock);
+-
+       return status;
+ }
+@@ -327,21 +349,32 @@ static int acpi_ec_transaction(struct acpi_ec *ec, u8 command,
+ int acpi_ec_burst_enable(struct acpi_ec *ec)
+ {
+       u8 d;
+-      return acpi_ec_transaction(ec, ACPI_EC_BURST_ENABLE, NULL, 0, &d, 1, 0);
++      struct transaction t = {.command = ACPI_EC_BURST_ENABLE,
++                              .wdata = NULL, .rdata = &d,
++                              .wlen = 0, .rlen = 1};
++
++      return acpi_ec_transaction(ec, &t, 0);
+ }
+ int acpi_ec_burst_disable(struct acpi_ec *ec)
+ {
+-      return acpi_ec_transaction(ec, ACPI_EC_BURST_DISABLE, NULL, 0, NULL, 0, 0);
++      struct transaction t = {.command = ACPI_EC_BURST_DISABLE,
++                              .wdata = NULL, .rdata = NULL,
++                              .wlen = 0, .rlen = 0};
++
++      return (acpi_ec_read_status(ec) & ACPI_EC_FLAG_BURST) ?
++                              acpi_ec_transaction(ec, &t, 0) : 0;
+ }
+ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
+ {
+       int result;
+       u8 d;
++      struct transaction t = {.command = ACPI_EC_COMMAND_READ,
++                              .wdata = &address, .rdata = &d,
++                              .wlen = 1, .rlen = 1};
+-      result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_READ,
+-                                   &address, 1, &d, 1, 0);
++      result = acpi_ec_transaction(ec, &t, 0);
+       *data = d;
+       return result;
+ }
+@@ -349,8 +382,11 @@ static int acpi_ec_read(struct acpi_ec *ec, u8 address, u8 * data)
+ static int acpi_ec_write(struct acpi_ec *ec, u8 address, u8 data)
+ {
+       u8 wdata[2] = { address, data };
+-      return acpi_ec_transaction(ec, ACPI_EC_COMMAND_WRITE,
+-                                 wdata, 2, NULL, 0, 0);
++      struct transaction t = {.command = ACPI_EC_COMMAND_WRITE,
++                              .wdata = wdata, .rdata = NULL,
++                              .wlen = 2, .rlen = 0};
++
++      return acpi_ec_transaction(ec, &t, 0);
+ }
+ /*
+@@ -412,12 +448,13 @@ int ec_transaction(u8 command,
+                  u8 * rdata, unsigned rdata_len,
+                  int force_poll)
+ {
++      struct transaction t = {.command = command,
++                              .wdata = wdata, .rdata = rdata,
++                              .wlen = wdata_len, .rlen = rdata_len};
+       if (!first_ec)
+               return -ENODEV;
+-      return acpi_ec_transaction(first_ec, command, wdata,
+-                                 wdata_len, rdata, rdata_len,
+-                                 force_poll);
++      return acpi_ec_transaction(first_ec, &t, force_poll);
+ }
+ EXPORT_SYMBOL(ec_transaction);
+@@ -426,7 +463,9 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
+ {
+       int result;
+       u8 d;
+-
++      struct transaction t = {.command = ACPI_EC_COMMAND_QUERY,
++                              .wdata = NULL, .rdata = &d,
++                              .wlen = 0, .rlen = 1};
+       if (!ec || !data)
+               return -EINVAL;
+@@ -436,7 +475,7 @@ static int acpi_ec_query(struct acpi_ec *ec, u8 * data)
+        * bit to be cleared (and thus clearing the interrupt source).
+        */
+-      result = acpi_ec_transaction(ec, ACPI_EC_COMMAND_QUERY, NULL, 0, &d, 1, 0);
++      result = acpi_ec_transaction(ec, &t, 0);
+       if (result)
+               return result;
+@@ -513,46 +552,26 @@ static void acpi_ec_gpe_query(void *ec_cxt)
+ static u32 acpi_ec_gpe_handler(void *data)
+ {
+-      acpi_status status = AE_OK;
+       struct acpi_ec *ec = data;
+-      u8 state = acpi_ec_read_status(ec);
++      u8 status;
+       pr_debug(PREFIX "~~~> interrupt\n");
+-      atomic_inc(&ec->irq_count);
+-      if (atomic_read(&ec->irq_count) > 5) {
+-              pr_err(PREFIX "GPE storm detected, disabling EC GPE\n");
+-              ec_switch_to_poll_mode(ec);
+-              goto end;
+-      }
+-      clear_bit(EC_FLAGS_WAIT_GPE, &ec->flags);
+-      if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags))
++      status = acpi_ec_read_status(ec);
++
++      gpe_transaction(ec, status);
++      if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0)
+               wake_up(&ec->wait);
+-      if (state & ACPI_EC_FLAG_SCI) {
+-              if (!test_and_set_bit(EC_FLAGS_QUERY_PENDING, &ec->flags))
+-                      status = acpi_os_execute(OSL_EC_BURST_HANDLER,
+-                              acpi_ec_gpe_query, ec);
+-      } else if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
+-                 !test_bit(EC_FLAGS_NO_GPE, &ec->flags) &&
+-                 in_interrupt()) {
++      ec_check_sci(ec, status);
++      if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
++          !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
+               /* this is non-query, must be confirmation */
+               if (printk_ratelimit())
+                       pr_info(PREFIX "non-query interrupt received,"
+                               " switching to interrupt mode\n");
+               set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+-              clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
+       }
+-end:
+-      ec_schedule_ec_poll(ec);
+-      return ACPI_SUCCESS(status) ?
+-          ACPI_INTERRUPT_HANDLED : ACPI_INTERRUPT_NOT_HANDLED;
+-}
+-
+-static void do_ec_poll(struct work_struct *work)
+-{
+-      struct acpi_ec *ec = container_of(work, struct acpi_ec, work.work);
+-      atomic_set(&ec->irq_count, 0);
+-      (void)acpi_ec_gpe_handler(ec);
++      return ACPI_INTERRUPT_HANDLED;
+ }
+ /* --------------------------------------------------------------------------
+@@ -696,8 +715,7 @@ static struct acpi_ec *make_acpi_ec(void)
+       mutex_init(&ec->lock);
+       init_waitqueue_head(&ec->wait);
+       INIT_LIST_HEAD(&ec->list);
+-      INIT_DELAYED_WORK_DEFERRABLE(&ec->work, do_ec_poll);
+-      atomic_set(&ec->irq_count, 0);
++      spin_lock_init(&ec->curr_lock);
+       return ec;
+ }
+@@ -736,22 +754,15 @@ ec_parse_device(acpi_handle handle, u32 Level, void *context, void **retval)
+       return AE_CTRL_TERMINATE;
+ }
+-static void ec_poll_stop(struct acpi_ec *ec)
+-{
+-      clear_bit(EC_FLAGS_RESCHEDULE_POLL, &ec->flags);
+-      cancel_delayed_work(&ec->work);
+-}
+-
+ static void ec_remove_handlers(struct acpi_ec *ec)
+ {
+-      ec_poll_stop(ec);
+       if (ACPI_FAILURE(acpi_remove_address_space_handler(ec->handle,
+                               ACPI_ADR_SPACE_EC, &acpi_ec_space_handler)))
+               pr_err(PREFIX "failed to remove space handler\n");
+       if (ACPI_FAILURE(acpi_remove_gpe_handler(NULL, ec->gpe,
+                               &acpi_ec_gpe_handler)))
+               pr_err(PREFIX "failed to remove gpe handler\n");
+-      ec->handlers_installed = 0;
++      clear_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
+ }
+ static int acpi_ec_add(struct acpi_device *device)
+@@ -846,17 +857,15 @@ ec_parse_io_ports(struct acpi_resource *resource, void *context)
+ static int ec_install_handlers(struct acpi_ec *ec)
+ {
+       acpi_status status;
+-      if (ec->handlers_installed)
++      if (test_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags))
+               return 0;
+       status = acpi_install_gpe_handler(NULL, ec->gpe,
+-                                        ACPI_GPE_EDGE_TRIGGERED,
+-                                        &acpi_ec_gpe_handler, ec);
++                                ACPI_GPE_EDGE_TRIGGERED,
++                                &acpi_ec_gpe_handler, ec);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
+-
+       acpi_set_gpe_type(NULL, ec->gpe, ACPI_GPE_TYPE_RUNTIME);
+       acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
+-
+       status = acpi_install_address_space_handler(ec->handle,
+                                                   ACPI_ADR_SPACE_EC,
+                                                   &acpi_ec_space_handler,
+@@ -866,7 +875,7 @@ static int ec_install_handlers(struct acpi_ec *ec)
+               return -ENODEV;
+       }
+-      ec->handlers_installed = 1;
++      set_bit(EC_FLAGS_HANDLERS_INSTALLED, &ec->flags);
+       return 0;
+ }
+@@ -887,7 +896,6 @@ static int acpi_ec_start(struct acpi_device *device)
+       /* EC is fully operational, allow queries */
+       clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+-      ec_schedule_ec_poll(ec);
+       return ret;
+ }
+@@ -906,7 +914,7 @@ static int acpi_ec_stop(struct acpi_device *device, int type)
+ int __init acpi_boot_ec_enable(void)
+ {
+-      if (!boot_ec || boot_ec->handlers_installed)
++      if (!boot_ec || test_bit(EC_FLAGS_HANDLERS_INSTALLED, &boot_ec->flags))
+               return 0;
+       if (!ec_install_handlers(boot_ec)) {
+               first_ec = boot_ec;
+diff --git a/drivers/acpi/hardware/hwsleep.c b/drivers/acpi/hardware/hwsleep.c
+index ecb6ace..25dccdf 100644
+--- a/drivers/acpi/hardware/hwsleep.c
++++ b/drivers/acpi/hardware/hwsleep.c
+@@ -612,6 +612,13 @@ acpi_status acpi_leave_sleep_state(u8 sleep_state)
+       }
+       /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
++      /*
++       * Some BIOSes assume that WAK_STS will be cleared on resume and use
++       * it to determine whether the system is rebooting or resuming. Clear
++       * it for compatibility.
++       */
++      acpi_set_register(ACPI_BITREG_WAKE_STATUS, 1);
++
+       acpi_gbl_system_awake_and_running = TRUE;
+       /* Enable power button */
+diff --git a/drivers/acpi/reboot.c b/drivers/acpi/reboot.c
+index a6b662c..755baf2 100644
+--- a/drivers/acpi/reboot.c
++++ b/drivers/acpi/reboot.c
+@@ -15,9 +15,28 @@ void acpi_reboot(void)
+       rr = &acpi_gbl_FADT.reset_register;
+-      /* Is the reset register supported? */
+-      if (!(acpi_gbl_FADT.flags & ACPI_FADT_RESET_REGISTER) ||
+-          rr->bit_width != 8 || rr->bit_offset != 0)
++      /*
++       * Is the ACPI reset register supported?
++       *
++       * According to ACPI 3.0, FADT.flags.RESET_REG_SUP indicates
++       * whether the ACPI reset mechanism is supported.
++       *
++       * However, some boxes have this bit clear, yet a valid
++       * ACPI_RESET_REG & RESET_VALUE, and ACPI reboot is the only
++       * mechanism that works for them after S3.
++       *
++       * This suggests that other operating systems may not be checking
++       * the RESET_REG_SUP bit, and are using other means to decide
++       * whether to use the ACPI reboot mechanism or not.
++       *
++       * So when acpi reboot is requested,
++       * only the reset_register is checked. If the following
++       * conditions are met, it indicates that the reset register is supported.
++       *      a. reset_register is not zero
++       *      b. the access width is eight
++       *      c. the bit_offset is zero
++       */
++      if (!(rr->address) || rr->bit_width != 8 || rr->bit_offset != 0)
+               return;
+       reset_value = acpi_gbl_FADT.reset_value;
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 79e3a8e..8228ae3 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -5259,6 +5259,8 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
+ #ifdef CONFIG_ATA_SFF
+       INIT_DELAYED_WORK(&ap->port_task, ata_pio_task);
++#else
++      INIT_DELAYED_WORK(&ap->port_task, NULL);
+ #endif
+       INIT_DELAYED_WORK(&ap->hotplug_task, ata_scsi_hotplug);
+       INIT_WORK(&ap->scsi_rescan_task, ata_scsi_dev_rescan);
+diff --git a/drivers/ata/pata_it821x.c b/drivers/ata/pata_it821x.c
+index 0221c9a..35fd67d 100644
+--- a/drivers/ata/pata_it821x.c
++++ b/drivers/ata/pata_it821x.c
+@@ -557,9 +557,8 @@ static unsigned int it821x_read_id(struct ata_device *adev,
+       if (strstr(model_num, "Integrated Technology Express")) {
+               /* Set feature bits the firmware neglects */
+               id[49] |= 0x0300;       /* LBA, DMA */
+-              id[82] |= 0x0400;       /* LBA48 */
+               id[83] &= 0x7FFF;
+-              id[83] |= 0x4000;       /* Word 83 is valid */
++              id[83] |= 0x4400;       /* Word 83 is valid and LBA48 */
+               id[86] |= 0x0400;       /* LBA48 on */
+               id[ATA_ID_MAJOR_VER] |= 0x1F;
+       }
+diff --git a/drivers/ata/sata_nv.c b/drivers/ata/sata_nv.c
+index 14601dc..8714c36 100644
+--- a/drivers/ata/sata_nv.c
++++ b/drivers/ata/sata_nv.c
+@@ -307,10 +307,10 @@ static int nv_scr_write(struct ata_port *ap, unsigned int sc_reg, u32 val);
+ static void nv_nf2_freeze(struct ata_port *ap);
+ static void nv_nf2_thaw(struct ata_port *ap);
++static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
++                          unsigned long deadline);
+ static void nv_ck804_freeze(struct ata_port *ap);
+ static void nv_ck804_thaw(struct ata_port *ap);
+-static int nv_hardreset(struct ata_link *link, unsigned int *class,
+-                      unsigned long deadline);
+ static int nv_adma_slave_config(struct scsi_device *sdev);
+ static int nv_adma_check_atapi_dma(struct ata_queued_cmd *qc);
+ static void nv_adma_qc_prep(struct ata_queued_cmd *qc);
+@@ -405,17 +405,8 @@ static struct scsi_host_template nv_swncq_sht = {
+       .slave_configure        = nv_swncq_slave_config,
+ };
+-/* OSDL bz3352 reports that some nv controllers can't determine device
+- * signature reliably and nv_hardreset is implemented to work around
+- * the problem.  This was reported on nf3 and it's unclear whether any
+- * other controllers are affected.  However, the workaround has been
+- * applied to all variants and there isn't much to gain by trying to
+- * find out exactly which ones are affected at this point especially
+- * because NV has moved over to ahci for newer controllers.
+- */
+ static struct ata_port_operations nv_common_ops = {
+       .inherits               = &ata_bmdma_port_ops,
+-      .hardreset              = nv_hardreset,
+       .scr_read               = nv_scr_read,
+       .scr_write              = nv_scr_write,
+ };
+@@ -429,12 +420,22 @@ static struct ata_port_operations nv_generic_ops = {
+       .hardreset              = ATA_OP_NULL,
+ };
++/* OSDL bz3352 reports that nf2/3 controllers can't determine device
++ * signature reliably.  Also, the following thread reports detection
++ * failure on cold boot with the standard debouncing timing.
++ *
++ * http://thread.gmane.org/gmane.linux.ide/34098
++ *
++ * Debounce with hotplug timing and request follow-up SRST.
++ */
+ static struct ata_port_operations nv_nf2_ops = {
+       .inherits               = &nv_common_ops,
+       .freeze                 = nv_nf2_freeze,
+       .thaw                   = nv_nf2_thaw,
++      .hardreset              = nv_nf2_hardreset,
+ };
++/* CK804 finally gets hardreset right */
+ static struct ata_port_operations nv_ck804_ops = {
+       .inherits               = &nv_common_ops,
+       .freeze                 = nv_ck804_freeze,
+@@ -443,7 +444,7 @@ static struct ata_port_operations nv_ck804_ops = {
+ };
+ static struct ata_port_operations nv_adma_ops = {
+-      .inherits               = &nv_common_ops,
++      .inherits               = &nv_ck804_ops,
+       .check_atapi_dma        = nv_adma_check_atapi_dma,
+       .sff_tf_read            = nv_adma_tf_read,
+@@ -467,7 +468,7 @@ static struct ata_port_operations nv_adma_ops = {
+ };
+ static struct ata_port_operations nv_swncq_ops = {
+-      .inherits               = &nv_common_ops,
++      .inherits               = &nv_generic_ops,
+       .qc_defer               = ata_std_qc_defer,
+       .qc_prep                = nv_swncq_qc_prep,
+@@ -1553,6 +1554,17 @@ static void nv_nf2_thaw(struct ata_port *ap)
+       iowrite8(mask, scr_addr + NV_INT_ENABLE);
+ }
++static int nv_nf2_hardreset(struct ata_link *link, unsigned int *class,
++                          unsigned long deadline)
++{
++      bool online;
++      int rc;
++
++      rc = sata_link_hardreset(link, sata_deb_timing_hotplug, deadline,
++                               &online, NULL);
++      return online ? -EAGAIN : rc;
++}
++
+ static void nv_ck804_freeze(struct ata_port *ap)
+ {
+       void __iomem *mmio_base = ap->host->iomap[NV_MMIO_BAR];
+@@ -1605,21 +1617,6 @@ static void nv_mcp55_thaw(struct ata_port *ap)
+       ata_sff_thaw(ap);
+ }
+-static int nv_hardreset(struct ata_link *link, unsigned int *class,
+-                      unsigned long deadline)
+-{
+-      int rc;
+-
+-      /* SATA hardreset fails to retrieve proper device signature on
+-       * some controllers.  Request follow up SRST.  For more info,
+-       * see http://bugzilla.kernel.org/show_bug.cgi?id=3352
+-       */
+-      rc = sata_sff_hardreset(link, class, deadline);
+-      if (rc)
+-              return rc;
+-      return -EAGAIN;
+-}
+-
+ static void nv_adma_error_handler(struct ata_port *ap)
+ {
+       struct nv_adma_port_priv *pp = ap->private_data;
+diff --git a/drivers/ata/sata_promise.c b/drivers/ata/sata_promise.c
+index 030665b..b26885f 100644
+--- a/drivers/ata/sata_promise.c
++++ b/drivers/ata/sata_promise.c
+@@ -153,6 +153,10 @@ static void pdc_freeze(struct ata_port *ap);
+ static void pdc_sata_freeze(struct ata_port *ap);
+ static void pdc_thaw(struct ata_port *ap);
+ static void pdc_sata_thaw(struct ata_port *ap);
++static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
++                            unsigned long deadline);
++static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
++                            unsigned long deadline);
+ static void pdc_error_handler(struct ata_port *ap);
+ static void pdc_post_internal_cmd(struct ata_queued_cmd *qc);
+ static int pdc_pata_cable_detect(struct ata_port *ap);
+@@ -186,6 +190,7 @@ static struct ata_port_operations pdc_sata_ops = {
+       .scr_read               = pdc_sata_scr_read,
+       .scr_write              = pdc_sata_scr_write,
+       .port_start             = pdc_sata_port_start,
++      .hardreset              = pdc_sata_hardreset,
+ };
+ /* First-generation chips need a more restrictive ->check_atapi_dma op */
+@@ -200,6 +205,7 @@ static struct ata_port_operations pdc_pata_ops = {
+       .freeze                 = pdc_freeze,
+       .thaw                   = pdc_thaw,
+       .port_start             = pdc_common_port_start,
++      .softreset              = pdc_pata_softreset,
+ };
+ static const struct ata_port_info pdc_port_info[] = {
+@@ -691,6 +697,20 @@ static void pdc_sata_thaw(struct ata_port *ap)
+       readl(host_mmio + hotplug_offset); /* flush */
+ }
++static int pdc_pata_softreset(struct ata_link *link, unsigned int *class,
++                            unsigned long deadline)
++{
++      pdc_reset_port(link->ap);
++      return ata_sff_softreset(link, class, deadline);
++}
++
++static int pdc_sata_hardreset(struct ata_link *link, unsigned int *class,
++                            unsigned long deadline)
++{
++      pdc_reset_port(link->ap);
++      return sata_sff_hardreset(link, class, deadline);
++}
++
+ static void pdc_error_handler(struct ata_port *ap)
+ {
+       if (!(ap->pflags & ATA_PFLAG_FROZEN))
+diff --git a/drivers/base/sys.c b/drivers/base/sys.c
+index 75dd6e2..70499cb 100644
+--- a/drivers/base/sys.c
++++ b/drivers/base/sys.c
+@@ -488,7 +488,8 @@ ssize_t sysdev_store_ulong(struct sys_device *sysdev,
+       if (end == buf)
+               return -EINVAL;
+       *(unsigned long *)(ea->var) = new;
+-      return end - buf;
++      /* Always return full write size even if we didn't consume all */
++      return size;
+ }
+ EXPORT_SYMBOL_GPL(sysdev_store_ulong);
+@@ -511,7 +512,8 @@ ssize_t sysdev_store_int(struct sys_device *sysdev,
+       if (end == buf || new > INT_MAX || new < INT_MIN)
+               return -EINVAL;
+       *(int *)(ea->var) = new;
+-      return end - buf;
++      /* Always return full write size even if we didn't consume all */
++      return size;
+ }
+ EXPORT_SYMBOL_GPL(sysdev_store_int);
+diff --git a/drivers/char/agp/intel-agp.c b/drivers/char/agp/intel-agp.c
+index 016fdf0..f1fe749 100644
+--- a/drivers/char/agp/intel-agp.c
++++ b/drivers/char/agp/intel-agp.c
+@@ -54,8 +54,7 @@
+                agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965Q_HB || \
+                agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965G_HB || \
+                agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GM_HB || \
+-               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB || \
+-               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB)
++               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_82965GME_HB)
+ #define IS_G33 (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G33_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q35_HB || \
+@@ -63,7 +62,8 @@
+ #define IS_G4X (agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_IGD_E_HB || \
+               agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_Q45_HB || \
+-              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB)
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_G45_HB || \
++              agp_bridge->dev->device == PCI_DEVICE_ID_INTEL_GM45_HB)
+ extern int agp_memory_reserved;
+@@ -525,8 +525,10 @@ static void intel_i830_init_gtt_entries(void)
+               size += 4;
+       } else if (IS_G4X) {
+               /* On 4 series hardware, GTT stolen is separate from graphics
+-               * stolen, ignore it in stolen gtt entries counting */
+-              size = 0;
++               * stolen, ignore it in stolen gtt entries counting.  However,
++               * 4KB of the stolen memory doesn't get mapped to the GTT.
++               */
++              size = 4;
+       } else {
+               /* On previous hardware, the GTT size was just what was
+                * required to map the aperture.
+diff --git a/drivers/char/ipmi/ipmi_devintf.c b/drivers/char/ipmi/ipmi_devintf.c
+index 64e1c16..ecaf369 100644
+--- a/drivers/char/ipmi/ipmi_devintf.c
++++ b/drivers/char/ipmi/ipmi_devintf.c
+@@ -957,3 +957,4 @@ module_exit(cleanup_ipmi);
+ MODULE_LICENSE("GPL");
+ MODULE_AUTHOR("Corey Minyard <minyard@mvista.com>");
+ MODULE_DESCRIPTION("Linux device interface for the IPMI message handler.");
++MODULE_ALIAS("platform:ipmi_si");
+diff --git a/drivers/firewire/fw-cdev.c b/drivers/firewire/fw-cdev.c
+index 2e6d584..ed03234 100644
+--- a/drivers/firewire/fw-cdev.c
++++ b/drivers/firewire/fw-cdev.c
+@@ -720,8 +720,8 @@ static int ioctl_create_iso_context(struct client *client, void *buffer)
+ #define GET_PAYLOAD_LENGTH(v) ((v) & 0xffff)
+ #define GET_INTERRUPT(v)      (((v) >> 16) & 0x01)
+ #define GET_SKIP(v)           (((v) >> 17) & 0x01)
+-#define GET_TAG(v)            (((v) >> 18) & 0x02)
+-#define GET_SY(v)             (((v) >> 20) & 0x04)
++#define GET_TAG(v)            (((v) >> 18) & 0x03)
++#define GET_SY(v)             (((v) >> 20) & 0x0f)
+ #define GET_HEADER_LENGTH(v)  (((v) >> 24) & 0xff)
+ static int ioctl_queue_iso(struct client *client, void *buffer)
+@@ -913,7 +913,7 @@ dispatch_ioctl(struct client *client, unsigned int cmd, void __user *arg)
+                       return -EFAULT;
+       }
+-      return 0;
++      return retval;
+ }
+ static long
+diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
+index aaff50e..4f73537 100644
+--- a/drivers/firewire/fw-sbp2.c
++++ b/drivers/firewire/fw-sbp2.c
+@@ -172,6 +172,9 @@ struct sbp2_target {
+       int blocked;    /* ditto */
+ };
++/* Impossible login_id, to detect logout attempt before successful login */
++#define INVALID_LOGIN_ID 0x10000
++
+ /*
+  * Per section 7.4.8 of the SBP-2 spec, a mgt_ORB_timeout value can be
+  * provided in the config rom. Most devices do provide a value, which
+@@ -791,9 +794,20 @@ static void sbp2_release_target(struct kref *kref)
+                       scsi_remove_device(sdev);
+                       scsi_device_put(sdev);
+               }
+-              sbp2_send_management_orb(lu, tgt->node_id, lu->generation,
+-                              SBP2_LOGOUT_REQUEST, lu->login_id, NULL);
+-
++              if (lu->login_id != INVALID_LOGIN_ID) {
++                      int generation, node_id;
++                      /*
++                       * tgt->node_id may be obsolete here if we failed
++                       * during initial login or after a bus reset where
++                       * the topology changed.
++                       */
++                      generation = device->generation;
++                      smp_rmb(); /* node_id vs. generation */
++                      node_id    = device->node_id;
++                      sbp2_send_management_orb(lu, node_id, generation,
++                                               SBP2_LOGOUT_REQUEST,
++                                               lu->login_id, NULL);
++              }
+               fw_core_remove_address_handler(&lu->address_handler);
+               list_del(&lu->link);
+               kfree(lu);
+@@ -808,19 +822,20 @@ static void sbp2_release_target(struct kref *kref)
+ static struct workqueue_struct *sbp2_wq;
++static void sbp2_target_put(struct sbp2_target *tgt)
++{
++      kref_put(&tgt->kref, sbp2_release_target);
++}
++
+ /*
+  * Always get the target's kref when scheduling work on one its units.
+  * Each workqueue job is responsible to call sbp2_target_put() upon return.
+  */
+ static void sbp2_queue_work(struct sbp2_logical_unit *lu, unsigned long delay)
+ {
+-      if (queue_delayed_work(sbp2_wq, &lu->work, delay))
+-              kref_get(&lu->tgt->kref);
+-}
+-
+-static void sbp2_target_put(struct sbp2_target *tgt)
+-{
+-      kref_put(&tgt->kref, sbp2_release_target);
++      kref_get(&lu->tgt->kref);
++      if (!queue_delayed_work(sbp2_wq, &lu->work, delay))
++              sbp2_target_put(lu->tgt);
+ }
+ static void
+@@ -993,6 +1008,7 @@ static int sbp2_add_logical_unit(struct sbp2_target *tgt, int lun_entry)
+       lu->tgt      = tgt;
+       lu->lun      = lun_entry & 0xffff;
++      lu->login_id = INVALID_LOGIN_ID;
+       lu->retries  = 0;
+       lu->has_sdev = false;
+       lu->blocked  = false;
+@@ -1158,7 +1174,7 @@ static int sbp2_probe(struct device *dev)
+       /* Do the login in a workqueue so we can easily reschedule retries. */
+       list_for_each_entry(lu, &tgt->lu_list, link)
+-              sbp2_queue_work(lu, 0);
++              sbp2_queue_work(lu, DIV_ROUND_UP(HZ, 5));
+       return 0;
+  fail_tgt_put:
+diff --git a/drivers/firewire/fw-topology.c b/drivers/firewire/fw-topology.c
+index c1b8107..5e20471 100644
+--- a/drivers/firewire/fw-topology.c
++++ b/drivers/firewire/fw-topology.c
+@@ -413,7 +413,7 @@ static void
+ update_tree(struct fw_card *card, struct fw_node *root)
+ {
+       struct list_head list0, list1;
+-      struct fw_node *node0, *node1;
++      struct fw_node *node0, *node1, *next1;
+       int i, event;
+       INIT_LIST_HEAD(&list0);
+@@ -485,7 +485,9 @@ update_tree(struct fw_card *card, struct fw_node *root)
+               }
+               node0 = fw_node(node0->link.next);
+-              node1 = fw_node(node1->link.next);
++              next1 = fw_node(node1->link.next);
++              fw_node_put(node1);
++              node1 = next1;
+       }
+ }
+diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
+index 2ae1b0d..81b15ba 100644
+--- a/drivers/firewire/fw-transaction.h
++++ b/drivers/firewire/fw-transaction.h
+@@ -248,7 +248,7 @@ struct fw_card {
+       struct fw_node *local_node;
+       struct fw_node *root_node;
+       struct fw_node *irm_node;
+-      int color;
++      u8 color; /* must be u8 to match the definition in struct fw_node */
+       int gap_count;
+       bool beta_repeaters_present;
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index b15f882..49144cb 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -247,8 +247,6 @@
+ #define USB_DEVICE_ID_LD_MACHINETEST  0x2040
+ #define USB_VENDOR_ID_LOGITECH                0x046d
+-#define USB_DEVICE_ID_LOGITECH_LX3    0xc044
+-#define USB_DEVICE_ID_LOGITECH_V150   0xc047
+ #define USB_DEVICE_ID_LOGITECH_RECEIVER       0xc101
+ #define USB_DEVICE_ID_LOGITECH_HARMONY  0xc110
+ #define USB_DEVICE_ID_LOGITECH_HARMONY_2 0xc111
+@@ -603,8 +601,6 @@ static const struct hid_blacklist {
+       { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_ELITE_KBD, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
+       { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_CORDLESS_DESKTOP_LX500, HID_QUIRK_LOGITECH_IGNORE_DOUBLED_WHEEL | HID_QUIRK_LOGITECH_EXPANDED_KEYMAP },
+-      { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_LX3, HID_QUIRK_INVERT_HWHEEL },
+-      { USB_VENDOR_ID_LOGITECH, USB_DEVICE_ID_LOGITECH_V150, HID_QUIRK_INVERT_HWHEEL },
+       { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_NE4K, HID_QUIRK_MICROSOFT_KEYS },
+       { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_LK6K, HID_QUIRK_MICROSOFT_KEYS },
+diff --git a/drivers/i2c/busses/scx200_i2c.c b/drivers/i2c/busses/scx200_i2c.c
+index c3022a0..e4c9853 100644
+--- a/drivers/i2c/busses/scx200_i2c.c
++++ b/drivers/i2c/busses/scx200_i2c.c
+@@ -81,6 +81,7 @@ static struct i2c_algo_bit_data scx200_i2c_data = {
+ static struct i2c_adapter scx200_i2c_ops = {
+       .owner             = THIS_MODULE,
++      .class             = I2C_CLASS_HWMON | I2C_CLASS_SPD,
+       .id                = I2C_HW_B_SCX200,
+       .algo_data         = &scx200_i2c_data,
+       .name   = "NatSemi SCx200 I2C",
+diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
+index b1ce10f..e32c24d 100644
+--- a/drivers/input/keyboard/atkbd.c
++++ b/drivers/input/keyboard/atkbd.c
+@@ -834,10 +834,10 @@ static void atkbd_disconnect(struct serio *serio)
+ }
+ /*
+- * Most special keys (Fn+F?) on Dell Latitudes do not generate release
++ * Most special keys (Fn+F?) on Dell laptops do not generate release
+  * events so we have to do it ourselves.
+  */
+-static void atkbd_latitude_keymap_fixup(struct atkbd *atkbd)
++static void atkbd_dell_laptop_keymap_fixup(struct atkbd *atkbd)
+ {
+       const unsigned int forced_release_keys[] = {
+               0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8f, 0x93,
+@@ -1461,13 +1461,13 @@ static int __init atkbd_setup_fixup(const struct dmi_system_id *id)
+ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
+       {
+-              .ident = "Dell Latitude series",
++              .ident = "Dell Laptop",
+               .matches = {
+                       DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
+-                      DMI_MATCH(DMI_PRODUCT_NAME, "Latitude"),
++                      DMI_MATCH(DMI_CHASSIS_TYPE, "8"), /* Portable */
+               },
+               .callback = atkbd_setup_fixup,
+-              .driver_data = atkbd_latitude_keymap_fixup,
++              .driver_data = atkbd_dell_laptop_keymap_fixup,
+       },
+       {
+               .ident = "HP 2133",
+diff --git a/drivers/media/dvb/frontends/s5h1411.c b/drivers/media/dvb/frontends/s5h1411.c
+index 2da1a37..a92ee16 100644
+--- a/drivers/media/dvb/frontends/s5h1411.c
++++ b/drivers/media/dvb/frontends/s5h1411.c
+@@ -471,6 +471,20 @@ static int s5h1411_set_spectralinversion(struct dvb_frontend *fe, int inversion)
+       return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0x24, val);
+ }
++static int s5h1411_set_serialmode(struct dvb_frontend *fe, int serial)
++{
++      struct s5h1411_state *state = fe->demodulator_priv;
++      u16 val;
++
++      dprintk("%s(%d)\n", __func__, serial);
++      val = s5h1411_readreg(state, S5H1411_I2C_TOP_ADDR, 0xbd) & ~0x100;
++
++      if (serial == 1)
++              val |= 0x100;
++
++      return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, val);
++}
++
+ static int s5h1411_enable_modulation(struct dvb_frontend *fe,
+                                    fe_modulation_t m)
+ {
+@@ -535,7 +549,7 @@ static int s5h1411_set_gpio(struct dvb_frontend *fe, int enable)
+               return s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xe0, val);
+ }
+-static int s5h1411_sleep(struct dvb_frontend *fe, int enable)
++static int s5h1411_set_powerstate(struct dvb_frontend *fe, int enable)
+ {
+       struct s5h1411_state *state = fe->demodulator_priv;
+@@ -551,6 +565,11 @@ static int s5h1411_sleep(struct dvb_frontend *fe, int enable)
+       return 0;
+ }
++static int s5h1411_sleep(struct dvb_frontend *fe)
++{
++      return s5h1411_set_powerstate(fe, 1);
++}
++
+ static int s5h1411_register_reset(struct dvb_frontend *fe)
+ {
+       struct s5h1411_state *state = fe->demodulator_priv;
+@@ -574,9 +593,6 @@ static int s5h1411_set_frontend(struct dvb_frontend *fe,
+       s5h1411_enable_modulation(fe, p->u.vsb.modulation);
+-      /* Allow the demod to settle */
+-      msleep(100);
+-
+       if (fe->ops.tuner_ops.set_params) {
+               if (fe->ops.i2c_gate_ctrl)
+                       fe->ops.i2c_gate_ctrl(fe, 1);
+@@ -587,6 +603,10 @@ static int s5h1411_set_frontend(struct dvb_frontend *fe,
+                       fe->ops.i2c_gate_ctrl(fe, 0);
+       }
++      /* Issue a reset to the demod so it knows to resync against the
++         newly tuned frequency */
++      s5h1411_softreset(fe);
++
+       return 0;
+ }
+@@ -599,7 +619,7 @@ static int s5h1411_init(struct dvb_frontend *fe)
+       dprintk("%s()\n", __func__);
+-      s5h1411_sleep(fe, 0);
++      s5h1411_set_powerstate(fe, 0);
+       s5h1411_register_reset(fe);
+       for (i = 0; i < ARRAY_SIZE(init_tab); i++)
+@@ -612,10 +632,10 @@ static int s5h1411_init(struct dvb_frontend *fe)
+       if (state->config->output_mode == S5H1411_SERIAL_OUTPUT)
+               /* Serial */
+-              s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1101);
++              s5h1411_set_serialmode(fe, 1);
+       else
+               /* Parallel */
+-              s5h1411_writereg(state, S5H1411_I2C_TOP_ADDR, 0xbd, 0x1001);
++              s5h1411_set_serialmode(fe, 0);
+       s5h1411_set_spectralinversion(fe, state->config->inversion);
+       s5h1411_set_if_freq(fe, state->config->vsb_if);
+@@ -863,6 +883,7 @@ static struct dvb_frontend_ops s5h1411_ops = {
+       },
+       .init                 = s5h1411_init,
++      .sleep                = s5h1411_sleep,
+       .i2c_gate_ctrl        = s5h1411_i2c_gate_ctrl,
+       .set_frontend         = s5h1411_set_frontend,
+       .get_frontend         = s5h1411_get_frontend,
+diff --git a/drivers/media/video/pvrusb2/pvrusb2-encoder.c b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+index a1252d6..273d2a1 100644
+--- a/drivers/media/video/pvrusb2/pvrusb2-encoder.c
++++ b/drivers/media/video/pvrusb2/pvrusb2-encoder.c
+@@ -402,6 +402,10 @@ static int pvr2_encoder_prep_config(struct pvr2_hdw *hdw)
+       ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4, 0,3,0,0);
+       ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC,4,15,0,0,0);
++      /* prevent the PTSs from slowly drifting away in the generated
++         MPEG stream */
++      ret |= pvr2_encoder_vcmd(hdw, CX2341X_ENC_MISC, 2, 4, 1);
++
+       return ret;
+ }
+diff --git a/drivers/net/atlx/atl1.c b/drivers/net/atlx/atl1.c
+index e23ce77..b46e599 100644
+--- a/drivers/net/atlx/atl1.c
++++ b/drivers/net/atlx/atl1.c
+@@ -2317,7 +2317,8 @@ static void atl1_tx_queue(struct atl1_adapter *adapter, u16 count,
+               if (tpd != ptpd)
+                       memcpy(tpd, ptpd, sizeof(struct tx_packet_desc));
+               tpd->buffer_addr = cpu_to_le64(buffer_info->dma);
+-              tpd->word2 = (cpu_to_le16(buffer_info->length) &
++              tpd->word2 &= ~(TPD_BUFLEN_MASK << TPD_BUFLEN_SHIFT);
++              tpd->word2 |= (cpu_to_le16(buffer_info->length) &
+                       TPD_BUFLEN_MASK) << TPD_BUFLEN_SHIFT;
+               /*
+@@ -2426,8 +2427,8 @@ static int atl1_xmit_frame(struct sk_buff *skb, struct net_device *netdev)
+               vlan_tag = (vlan_tag << 4) | (vlan_tag >> 13) |
+                       ((vlan_tag >> 9) & 0x8);
+               ptpd->word3 |= 1 << TPD_INS_VL_TAG_SHIFT;
+-              ptpd->word3 |= (vlan_tag & TPD_VL_TAGGED_MASK) <<
+-                      TPD_VL_TAGGED_SHIFT;
++              ptpd->word2 |= (vlan_tag & TPD_VLANTAG_MASK) <<
++                      TPD_VLANTAG_SHIFT;
+       }
+       tso = atl1_tso(adapter, skb, ptpd);
+diff --git a/drivers/net/atlx/atl1.h b/drivers/net/atlx/atl1.h
+index a5015b1..ffa73fc 100644
+--- a/drivers/net/atlx/atl1.h
++++ b/drivers/net/atlx/atl1.h
+@@ -504,7 +504,7 @@ struct rx_free_desc {
+ #define TPD_PKTNT_MASK                0x0001
+ #define TPD_PKTINT_SHIFT      15
+ #define TPD_VLANTAG_MASK      0xFFFF
+-#define TPD_VLAN_SHIFT                16
++#define TPD_VLANTAG_SHIFT     16
+ /* tpd word 3 bits 0:13 */
+ #define TPD_EOP_MASK          0x0001
+diff --git a/drivers/net/bonding/bond_alb.c b/drivers/net/bonding/bond_alb.c
+index b211486..4489e58 100644
+--- a/drivers/net/bonding/bond_alb.c
++++ b/drivers/net/bonding/bond_alb.c
+@@ -167,11 +167,14 @@ static void tlb_clear_slave(struct bonding *bond, struct slave *slave, int save_
+       /* clear slave from tx_hashtbl */
+       tx_hash_table = BOND_ALB_INFO(bond).tx_hashtbl;
+-      index = SLAVE_TLB_INFO(slave).head;
+-      while (index != TLB_NULL_INDEX) {
+-              u32 next_index = tx_hash_table[index].next;
+-              tlb_init_table_entry(&tx_hash_table[index], save_load);
+-              index = next_index;
++      /* skip this if we've already freed the tx hash table */
++      if (tx_hash_table) {
++              index = SLAVE_TLB_INFO(slave).head;
++              while (index != TLB_NULL_INDEX) {
++                      u32 next_index = tx_hash_table[index].next;
++                      tlb_init_table_entry(&tx_hash_table[index], save_load);
++                      index = next_index;
++              }
+       }
+       tlb_init_slave(slave);
+diff --git a/drivers/net/wireless/libertas/scan.c b/drivers/net/wireless/libertas/scan.c
+index 4b27456..50927ea 100644
+--- a/drivers/net/wireless/libertas/scan.c
++++ b/drivers/net/wireless/libertas/scan.c
+@@ -598,8 +598,8 @@ static int lbs_process_bss(struct bss_descriptor *bss,
+               switch (elem->id) {
+               case MFIE_TYPE_SSID:
+-                      bss->ssid_len = elem->len;
+-                      memcpy(bss->ssid, elem->data, elem->len);
++                      bss->ssid_len = min_t(int, 32, elem->len);
++                      memcpy(bss->ssid, elem->data, bss->ssid_len);
+                       lbs_deb_scan("got SSID IE: '%s', len %u\n",
+                                    escape_essid(bss->ssid, bss->ssid_len),
+                                    bss->ssid_len);
+diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
+index 36698e5..bcafbd6 100644
+--- a/drivers/pci/probe.c
++++ b/drivers/pci/probe.c
+@@ -219,7 +219,7 @@ static inline enum pci_bar_type decode_bar(struct resource *res, u32 bar)
+       res->flags = bar & ~PCI_BASE_ADDRESS_MEM_MASK;
+-      if (res->flags == PCI_BASE_ADDRESS_MEM_TYPE_64)
++      if (res->flags & PCI_BASE_ADDRESS_MEM_TYPE_64)
+               return pci_bar_mem64;
+       return pci_bar_mem32;
+ }
+diff --git a/drivers/rtc/rtc-cmos.c b/drivers/rtc/rtc-cmos.c
+index b184367..6ad46d7 100644
+--- a/drivers/rtc/rtc-cmos.c
++++ b/drivers/rtc/rtc-cmos.c
+@@ -1030,29 +1030,32 @@ static struct platform_driver cmos_platform_driver = {
+ static int __init cmos_init(void)
+ {
++      int retval = 0;
++
+ #ifdef        CONFIG_PNP
+-      if (pnp_platform_devices)
+-              return pnp_register_driver(&cmos_pnp_driver);
+-      else
+-              return platform_driver_probe(&cmos_platform_driver,
+-                      cmos_platform_probe);
+-#else
+-      return platform_driver_probe(&cmos_platform_driver,
+-                      cmos_platform_probe);
+-#endif /* CONFIG_PNP */
++      pnp_register_driver(&cmos_pnp_driver);
++#endif
++
++      if (!cmos_rtc.dev)
++              retval = platform_driver_probe(&cmos_platform_driver,
++                                             cmos_platform_probe);
++
++      if (retval == 0)
++              return 0;
++
++#ifdef        CONFIG_PNP
++      pnp_unregister_driver(&cmos_pnp_driver);
++#endif
++      return retval;
+ }
+ module_init(cmos_init);
+ static void __exit cmos_exit(void)
+ {
+ #ifdef        CONFIG_PNP
+-      if (pnp_platform_devices)
+-              pnp_unregister_driver(&cmos_pnp_driver);
+-      else
+-              platform_driver_unregister(&cmos_platform_driver);
+-#else
++      pnp_unregister_driver(&cmos_pnp_driver);
++#endif
+       platform_driver_unregister(&cmos_platform_driver);
+-#endif /* CONFIG_PNP */
+ }
+ module_exit(cmos_exit);
+diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
+index e5e7d78..b7ea69c 100644
+--- a/drivers/scsi/sd.c
++++ b/drivers/scsi/sd.c
+@@ -1047,7 +1047,6 @@ static int sd_done(struct scsi_cmnd *SCpnt)
+               good_bytes = sd_completed_bytes(SCpnt);
+               break;
+       case RECOVERED_ERROR:
+-      case NO_SENSE:
+               /* Inform the user, but make sure that it's not treated
+                * as a hard error.
+                */
+@@ -1056,6 +1055,15 @@ static int sd_done(struct scsi_cmnd *SCpnt)
+               memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
+               good_bytes = scsi_bufflen(SCpnt);
+               break;
++      case NO_SENSE:
++              /* This indicates a false check condition, so ignore it.  An
++               * unknown amount of data was transferred so treat it as an
++               * error.
++               */
++              scsi_print_sense("sd", SCpnt);
++              SCpnt->result = 0;
++              memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
++              break;
+       case ABORTED_COMMAND:
+               if (sshdr.asc == 0x10) { /* DIF: Disk detected corruption */
+                       scsi_print_result(SCpnt);
+diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
+index 706f3e6..7a4ccf5 100644
+--- a/drivers/usb/core/hcd.c
++++ b/drivers/usb/core/hcd.c
+@@ -106,6 +106,9 @@ static DEFINE_SPINLOCK(hcd_root_hub_lock);
+ /* used when updating an endpoint's URB list */
+ static DEFINE_SPINLOCK(hcd_urb_list_lock);
++/* used to protect against unlinking URBs after the device is gone */
++static DEFINE_SPINLOCK(hcd_urb_unlink_lock);
++
+ /* wait queue for synchronous unlinks */
+ DECLARE_WAIT_QUEUE_HEAD(usb_kill_urb_queue);
+@@ -1377,10 +1380,25 @@ static int unlink1(struct usb_hcd *hcd, struct urb *urb, int status)
+ int usb_hcd_unlink_urb (struct urb *urb, int status)
+ {
+       struct usb_hcd          *hcd;
+-      int                     retval;
++      int                     retval = -EIDRM;
++      unsigned long           flags;
+-      hcd = bus_to_hcd(urb->dev->bus);
+-      retval = unlink1(hcd, urb, status);
++      /* Prevent the device and bus from going away while
++       * the unlink is carried out.  If they are already gone
++       * then urb->use_count must be 0, since disconnected
++       * devices can't have any active URBs.
++       */
++      spin_lock_irqsave(&hcd_urb_unlink_lock, flags);
++      if (atomic_read(&urb->use_count) > 0) {
++              retval = 0;
++              usb_get_dev(urb->dev);
++      }
++      spin_unlock_irqrestore(&hcd_urb_unlink_lock, flags);
++      if (retval == 0) {
++              hcd = bus_to_hcd(urb->dev->bus);
++              retval = unlink1(hcd, urb, status);
++              usb_put_dev(urb->dev);
++      }
+       if (retval == 0)
+               retval = -EINPROGRESS;
+@@ -1529,6 +1547,17 @@ void usb_hcd_disable_endpoint(struct usb_device *udev,
+               hcd->driver->endpoint_disable(hcd, ep);
+ }
++/* Protect against drivers that try to unlink URBs after the device
++ * is gone, by waiting until all unlinks for @udev are finished.
++ * Since we don't currently track URBs by device, simply wait until
++ * nothing is running in the locked region of usb_hcd_unlink_urb().
++ */
++void usb_hcd_synchronize_unlinks(struct usb_device *udev)
++{
++      spin_lock_irq(&hcd_urb_unlink_lock);
++      spin_unlock_irq(&hcd_urb_unlink_lock);
++}
++
+ /*-------------------------------------------------------------------------*/
+ /* called in any context */
+diff --git a/drivers/usb/core/hcd.h b/drivers/usb/core/hcd.h
+index 2dcde61..9465e70 100644
+--- a/drivers/usb/core/hcd.h
++++ b/drivers/usb/core/hcd.h
+@@ -232,6 +232,7 @@ extern void usb_hcd_flush_endpoint(struct usb_device *udev,
+               struct usb_host_endpoint *ep);
+ extern void usb_hcd_disable_endpoint(struct usb_device *udev,
+               struct usb_host_endpoint *ep);
++extern void usb_hcd_synchronize_unlinks(struct usb_device *udev);
+ extern int usb_hcd_get_frame_number(struct usb_device *udev);
+ extern struct usb_hcd *usb_create_hcd(const struct hc_driver *driver,
+diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
+index 875de9a..769f80f 100644
+--- a/drivers/usb/core/hub.c
++++ b/drivers/usb/core/hub.c
+@@ -1349,6 +1349,7 @@ void usb_disconnect(struct usb_device **pdev)
+        */
+       dev_dbg (&udev->dev, "unregistering device\n");
+       usb_disable_device(udev, 0);
++      usb_hcd_synchronize_unlinks(udev);
+       usb_unlock_device(udev);
+diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
+index 47111e8..db72269 100644
+--- a/drivers/usb/core/urb.c
++++ b/drivers/usb/core/urb.c
+@@ -465,6 +465,12 @@ EXPORT_SYMBOL_GPL(usb_submit_urb);
+  * indicating that the request has been canceled (rather than any other
+  * code).
+  *
++ * Drivers should not call this routine or related routines, such as
++ * usb_kill_urb() or usb_unlink_anchored_urbs(), after their disconnect
++ * method has returned.  The disconnect function should synchronize with
++ * a driver's I/O routines to insure that all URB-related activity has
++ * completed before it returns.
++ *
+  * This request is always asynchronous.  Success is indicated by
+  * returning -EINPROGRESS, at which time the URB will probably not yet
+  * have been given back to the device driver.  When it is eventually
+@@ -541,6 +547,9 @@ EXPORT_SYMBOL_GPL(usb_unlink_urb);
+  * This routine may not be used in an interrupt context (such as a bottom
+  * half or a completion handler), or when holding a spinlock, or in other
+  * situations where the caller can't schedule().
++ *
++ * This routine should not be called by a driver after its disconnect
++ * method has returned.
+  */
+ void usb_kill_urb(struct urb *urb)
+ {
+@@ -568,6 +577,9 @@ EXPORT_SYMBOL_GPL(usb_kill_urb);
+  *
+  * this allows all outstanding URBs to be killed starting
+  * from the back of the queue
++ *
++ * This routine should not be called by a driver after its disconnect
++ * method has returned.
+  */
+ void usb_kill_anchored_urbs(struct usb_anchor *anchor)
+ {
+@@ -597,6 +609,9 @@ EXPORT_SYMBOL_GPL(usb_kill_anchored_urbs);
+  * from the back of the queue. This function is asynchronous.
+  * The unlinking is just tiggered. It may happen after this
+  * function has returned.
++ *
++ * This routine should not be called by a driver after its disconnect
++ * method has returned.
+  */
+ void usb_unlink_anchored_urbs(struct usb_anchor *anchor)
+ {
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index cd15547..061df9b 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1745,6 +1745,15 @@ UNUSUAL_DEV(  0x14cd, 0x6600, 0x0201, 0x0201,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_IGNORE_RESIDUE ),
++/* Reported by Alexandre Oliva <oliva@lsd.ic.unicamp.br>
++ * JMicron responds to USN and several other SCSI ioctls with a
++ * residue that causes subsequent I/O requests to fail.  */
++UNUSUAL_DEV(  0x152d, 0x2329, 0x0100, 0x0100,
++              "JMicron",
++              "USB to ATA/ATAPI Bridge",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_IGNORE_RESIDUE ),
++
+ /* Reported by Robert Schedel <r.schedel@yahoo.de>
+  * Note: this is a 'super top' device like the above 14cd/6600 device */
+ UNUSUAL_DEV(  0x1652, 0x6600, 0x0201, 0x0201,
+diff --git a/fs/hfsplus/bitmap.c b/fs/hfsplus/bitmap.c
+index d128a25..ea30afc 100644
+--- a/fs/hfsplus/bitmap.c
++++ b/fs/hfsplus/bitmap.c
+@@ -32,6 +32,10 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size, u32 offset, u32 *ma
+       mutex_lock(&HFSPLUS_SB(sb).alloc_file->i_mutex);
+       mapping = HFSPLUS_SB(sb).alloc_file->i_mapping;
+       page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS, NULL);
++      if (IS_ERR(page)) {
++              start = size;
++              goto out;
++      }
+       pptr = kmap(page);
+       curr = pptr + (offset & (PAGE_CACHE_BITS - 1)) / 32;
+       i = offset % 32;
+@@ -73,6 +77,10 @@ int hfsplus_block_allocate(struct super_block *sb, u32 size, u32 offset, u32 *ma
+                       break;
+               page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS,
+                                        NULL);
++              if (IS_ERR(page)) {
++                      start = size;
++                      goto out;
++              }
+               curr = pptr = kmap(page);
+               if ((size ^ offset) / PAGE_CACHE_BITS)
+                       end = pptr + PAGE_CACHE_BITS / 32;
+@@ -120,6 +128,10 @@ found:
+               offset += PAGE_CACHE_BITS;
+               page = read_mapping_page(mapping, offset / PAGE_CACHE_BITS,
+                                        NULL);
++              if (IS_ERR(page)) {
++                      start = size;
++                      goto out;
++              }
+               pptr = kmap(page);
+               curr = pptr;
+               end = pptr + PAGE_CACHE_BITS / 32;
+diff --git a/fs/hfsplus/catalog.c b/fs/hfsplus/catalog.c
+index ba117c4..f6874ac 100644
+--- a/fs/hfsplus/catalog.c
++++ b/fs/hfsplus/catalog.c
+@@ -168,6 +168,11 @@ int hfsplus_find_cat(struct super_block *sb, u32 cnid,
+               return -EIO;
+       }
++      if (be16_to_cpu(tmp.thread.nodeName.length) > 255) {
++              printk(KERN_ERR "hfs: catalog name length corrupted\n");
++              return -EIO;
++      }
++
+       hfsplus_cat_build_key_uni(fd->search_key, be32_to_cpu(tmp.thread.parentID),
+                                &tmp.thread.nodeName);
+       return hfs_brec_find(fd);
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 3d9120c..6bfb849 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -1286,7 +1286,9 @@ struct task_struct {
+       atomic_t fs_excl;       /* holding fs exclusive resources */
+       struct rcu_head rcu;
+-      /*
++      struct list_head        *scm_work_list;
++
++/*
+        * cache last used pipe for splice
+        */
+       struct pipe_inode_info *splice_pipe;
+diff --git a/include/math-emu/op-common.h b/include/math-emu/op-common.h
+index bb46e76..408f743 100644
+--- a/include/math-emu/op-common.h
++++ b/include/math-emu/op-common.h
+@@ -139,18 +139,27 @@ do {                                                             \
+       if (X##_e <= _FP_WFRACBITS_##fs)                        \
+         {                                                     \
+           _FP_FRAC_SRS_##wc(X, X##_e, _FP_WFRACBITS_##fs);    \
+-          _FP_ROUND(wc, X);                                   \
+           if (_FP_FRAC_HIGH_##fs(X)                           \
+               & (_FP_OVERFLOW_##fs >> 1))                     \
+             {                                                 \
+               X##_e = 1;                                      \
+               _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);        \
+-              FP_SET_EXCEPTION(FP_EX_INEXACT);                \
+             }                                                 \
+           else                                                \
+             {                                                 \
+-              X##_e = 0;                                      \
+-              _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);             \
++              _FP_ROUND(wc, X);                               \
++              if (_FP_FRAC_HIGH_##fs(X)                       \
++                 & (_FP_OVERFLOW_##fs >> 1))                  \
++                {                                             \
++                  X##_e = 1;                                  \
++                  _FP_FRAC_SET_##wc(X, _FP_ZEROFRAC_##wc);    \
++                  FP_SET_EXCEPTION(FP_EX_INEXACT);            \
++                }                                             \
++              else                                            \
++                {                                             \
++                  X##_e = 0;                                  \
++                  _FP_FRAC_SRL_##wc(X, _FP_WORKBITS);         \
++                }                                             \
+             }                                                 \
+           if ((FP_CUR_EXCEPTIONS & FP_EX_INEXACT) ||          \
+               (FP_TRAPPING_EXCEPTIONS & FP_EX_UNDERFLOW))     \
+diff --git a/include/net/scm.h b/include/net/scm.h
+index 06df126..33e9986 100644
+--- a/include/net/scm.h
++++ b/include/net/scm.h
+@@ -14,8 +14,9 @@
+ struct scm_fp_list
+ {
+-      int             count;
+-      struct file     *fp[SCM_MAX_FD];
++      struct list_head        list;
++      int                     count;
++      struct file             *fp[SCM_MAX_FD];
+ };
+ struct scm_cookie
+diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
+index e8ab096..8178724 100644
+--- a/kernel/sched_clock.c
++++ b/kernel/sched_clock.c
+@@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now)
+       /*
+        * scd->clock = clamp(scd->tick_gtod + delta,
+-       *                    max(scd->tick_gtod, scd->clock),
+-       *                    scd->tick_gtod + TICK_NSEC);
++       *                    max(scd->tick_gtod, scd->clock),
++       *                    max(scd->clock, scd->tick_gtod + TICK_NSEC));
+        */
+       clock = scd->tick_gtod + delta;
+       min_clock = wrap_max(scd->tick_gtod, scd->clock);
+-      max_clock = scd->tick_gtod + TICK_NSEC;
++      max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC);
+       clock = wrap_max(clock, min_clock);
+       clock = wrap_min(clock, max_clock);
+diff --git a/kernel/sched_features.h b/kernel/sched_features.h
+index 9353ca7..c4c88ae 100644
+--- a/kernel/sched_features.h
++++ b/kernel/sched_features.h
+@@ -5,7 +5,7 @@ SCHED_FEAT(START_DEBIT, 1)
+ SCHED_FEAT(AFFINE_WAKEUPS, 1)
+ SCHED_FEAT(CACHE_HOT_BUDDY, 1)
+ SCHED_FEAT(SYNC_WAKEUPS, 1)
+-SCHED_FEAT(HRTICK, 1)
++SCHED_FEAT(HRTICK, 0)
+ SCHED_FEAT(DOUBLE_TICK, 0)
+ SCHED_FEAT(ASYM_GRAN, 1)
+ SCHED_FEAT(LB_BIAS, 1)
+diff --git a/net/core/scm.c b/net/core/scm.c
+index 10f5c65..ab242cc 100644
+--- a/net/core/scm.c
++++ b/net/core/scm.c
+@@ -75,6 +75,7 @@ static int scm_fp_copy(struct cmsghdr *cmsg, struct scm_fp_list **fplp)
+               if (!fpl)
+                       return -ENOMEM;
+               *fplp = fpl;
++              INIT_LIST_HEAD(&fpl->list);
+               fpl->count = 0;
+       }
+       fpp = &fpl->fp[fpl->count];
+@@ -106,9 +107,25 @@ void __scm_destroy(struct scm_cookie *scm)
+       if (fpl) {
+               scm->fp = NULL;
+-              for (i=fpl->count-1; i>=0; i--)
+-                      fput(fpl->fp[i]);
+-              kfree(fpl);
++              if (current->scm_work_list) {
++                      list_add_tail(&fpl->list, current->scm_work_list);
++              } else {
++                      LIST_HEAD(work_list);
++
++                      current->scm_work_list = &work_list;
++
++                      list_add(&fpl->list, &work_list);
++                      while (!list_empty(&work_list)) {
++                              fpl = list_first_entry(&work_list, struct scm_fp_list, list);
++
++                              list_del(&fpl->list);
++                              for (i=fpl->count-1; i>=0; i--)
++                                      fput(fpl->fp[i]);
++                              kfree(fpl);
++                      }
++
++                      current->scm_work_list = NULL;
++              }
+       }
+ }
+@@ -284,6 +301,7 @@ struct scm_fp_list *scm_fp_dup(struct scm_fp_list *fpl)
+       new_fpl = kmalloc(sizeof(*fpl), GFP_KERNEL);
+       if (new_fpl) {
++              INIT_LIST_HEAD(&new_fpl->list);
+               for (i=fpl->count-1; i>=0; i--)
+                       get_file(fpl->fp[i]);
+               memcpy(new_fpl, fpl, sizeof(*fpl));
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 8165f5a..d083f9a 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -357,6 +357,17 @@ struct tcp_out_options {
+       __u32 tsval, tsecr;     /* need to include OPTION_TS */
+ };
++/* Beware: Something in the Internet is very sensitive to the ordering of
++ * TCP options, we learned this through the hard way, so be careful here.
++ * Luckily we can at least blame others for their non-compliance but from
++ * inter-operatibility perspective it seems that we're somewhat stuck with
++ * the ordering which we have been using if we want to keep working with
++ * those broken things (not that it currently hurts anybody as there isn't
++ * particular reason why the ordering would need to be changed).
++ *
++ * At least SACK_PERM as the first option is known to lead to a disaster
++ * (but it may well be that other scenarios fail similarly).
++ */
+ static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
+                             const struct tcp_out_options *opts,
+                             __u8 **md5_hash) {
+@@ -371,6 +382,12 @@ static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
+               *md5_hash = NULL;
+       }
++      if (unlikely(opts->mss)) {
++              *ptr++ = htonl((TCPOPT_MSS << 24) |
++                             (TCPOLEN_MSS << 16) |
++                             opts->mss);
++      }
++
+       if (likely(OPTION_TS & opts->options)) {
+               if (unlikely(OPTION_SACK_ADVERTISE & opts->options)) {
+                       *ptr++ = htonl((TCPOPT_SACK_PERM << 24) |
+@@ -387,12 +404,6 @@ static void tcp_options_write(__be32 *ptr, struct tcp_sock *tp,
+               *ptr++ = htonl(opts->tsecr);
+       }
+-      if (unlikely(opts->mss)) {
+-              *ptr++ = htonl((TCPOPT_MSS << 24) |
+-                             (TCPOLEN_MSS << 16) |
+-                             opts->mss);
+-      }
+-
+       if (unlikely(OPTION_SACK_ADVERTISE & opts->options &&
+                    !(OPTION_TS & opts->options))) {
+               *ptr++ = htonl((TCPOPT_NOP << 24) |
+@@ -2266,6 +2277,11 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
+       }
+       memset(&opts, 0, sizeof(opts));
++#ifdef CONFIG_SYN_COOKIES
++      if (unlikely(req->cookie_ts))
++              TCP_SKB_CB(skb)->when = cookie_init_timestamp(req);
++      else
++#endif
+       TCP_SKB_CB(skb)->when = tcp_time_stamp;
+       tcp_header_size = tcp_synack_options(sk, req,
+                                            dst_metric(dst, RTAX_ADVMSS),
+@@ -2292,11 +2308,6 @@ struct sk_buff *tcp_make_synack(struct sock *sk, struct dst_entry *dst,
+       /* RFC1323: The window in SYN & SYN/ACK segments is never scaled. */
+       th->window = htons(min(req->rcv_wnd, 65535U));
+-#ifdef CONFIG_SYN_COOKIES
+-      if (unlikely(req->cookie_ts))
+-              TCP_SKB_CB(skb)->when = cookie_init_timestamp(req);
+-      else
+-#endif
+       tcp_options_write((__be32 *)(th + 1), tp, &opts, &md5_hash_location);
+       th->doff = (tcp_header_size >> 2);
+       TCP_INC_STATS(sock_net(sk), TCP_MIB_OUTSEGS);
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index 10e22fd..245cbc5 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -1087,7 +1087,7 @@ static void tcp_v6_send_ack(struct sk_buff *skb, u32 seq, u32 ack, u32 win, u32
+               *topt++ = htonl((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |
+                               (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP);
+               *topt++ = htonl(tcp_time_stamp);
+-              *topt = htonl(ts);
++              *topt++ = htonl(ts);
+       }
+ #ifdef CONFIG_TCP_MD5SIG
+diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
+index ec0a083..700ae9e 100644
+--- a/net/sched/sch_generic.c
++++ b/net/sched/sch_generic.c
+@@ -319,6 +319,7 @@ struct Qdisc_ops noop_qdisc_ops __read_mostly = {
+ static struct netdev_queue noop_netdev_queue = {
+       .qdisc          =       &noop_qdisc,
++      .qdisc_sleeping =       &noop_qdisc,
+ };
+ struct Qdisc noop_qdisc = {
+@@ -344,6 +345,7 @@ static struct Qdisc_ops noqueue_qdisc_ops __read_mostly = {
+ static struct Qdisc noqueue_qdisc;
+ static struct netdev_queue noqueue_netdev_queue = {
+       .qdisc          =       &noqueue_qdisc,
++      .qdisc_sleeping =       &noqueue_qdisc,
+ };
+ static struct Qdisc noqueue_qdisc = {
+diff --git a/scripts/package/mkspec b/scripts/package/mkspec
+index ffd61fe..62c5ffd 100755
+--- a/scripts/package/mkspec
++++ b/scripts/package/mkspec
+@@ -64,8 +64,10 @@ fi
+ echo "%install"
+ echo "%ifarch ia64"
+ echo 'mkdir -p $RPM_BUILD_ROOT/boot/efi $RPM_BUILD_ROOT/lib/modules'
++echo 'mkdir -p $RPM_BUILD_ROOT/lib/firmware'
+ echo "%else"
+ echo 'mkdir -p $RPM_BUILD_ROOT/boot $RPM_BUILD_ROOT/lib/modules'
++echo 'mkdir -p $RPM_BUILD_ROOT/lib/firmware'
+ echo "%endif"
+ echo 'INSTALL_MOD_PATH=$RPM_BUILD_ROOT make %{_smp_mflags} modules_install'
+@@ -92,5 +94,6 @@ echo "%files"
+ echo '%defattr (-, root, root)'
+ echo "%dir /lib/modules"
+ echo "/lib/modules/$KERNELRELEASE"
++echo "/lib/firmware"
+ echo "/boot/*"
+ echo ""
+diff --git a/security/commoncap.c b/security/commoncap.c
+index e4c4b3f..378172b 100644
+--- a/security/commoncap.c
++++ b/security/commoncap.c
+@@ -279,10 +279,10 @@ static int get_file_caps(struct linux_binprm *bprm)
+       struct vfs_cap_data vcaps;
+       struct inode *inode;
+-      if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID) {
+-              bprm_clear_caps(bprm);
++      bprm_clear_caps(bprm);
++
++      if (bprm->file->f_vfsmnt->mnt_flags & MNT_NOSUID)
+               return 0;
+-      }
+       dentry = dget(bprm->file->f_dentry);
+       inode = dentry->d_inode;
+diff --git a/sound/core/control.c b/sound/core/control.c
+index 281b2e2..236bbb1 100644
+--- a/sound/core/control.c
++++ b/sound/core/control.c
+@@ -1427,12 +1427,12 @@ static int snd_ctl_dev_disconnect(struct snd_device *device)
+       cardnum = card->number;
+       snd_assert(cardnum >= 0 && cardnum < SNDRV_CARDS, return -ENXIO);
+-      down_read(&card->controls_rwsem);
++      read_lock(&card->ctl_files_rwlock);
+       list_for_each_entry(ctl, &card->ctl_files, list) {
+               wake_up(&ctl->change_sleep);
+               kill_fasync(&ctl->fasync, SIGIO, POLL_ERR);
+       }
+-      up_read(&card->controls_rwsem);
++      read_unlock(&card->ctl_files_rwlock);
+       if ((err = snd_unregister_device(SNDRV_DEVICE_TYPE_CONTROL,
+                                        card, -1)) < 0)
+diff --git a/sound/pci/hda/hda_intel.c b/sound/pci/hda/hda_intel.c
+index 1c53e33..0f014b1 100644
+--- a/sound/pci/hda/hda_intel.c
++++ b/sound/pci/hda/hda_intel.c
+@@ -45,6 +45,7 @@
+ #include <linux/slab.h>
+ #include <linux/pci.h>
+ #include <linux/mutex.h>
++#include <linux/reboot.h>
+ #include <sound/core.h>
+ #include <sound/initval.h>
+ #include "hda_codec.h"
+@@ -385,6 +386,9 @@ struct azx {
+       /* for pending irqs */
+       struct work_struct irq_pending_work;
++
++      /* reboot notifier (for mysterious hangup problem at power-down) */
++      struct notifier_block reboot_notifier;
+ };
+ /* driver types */
+@@ -1890,12 +1894,36 @@ static int azx_resume(struct pci_dev *pci)
+ /*
++ * reboot notifier for hang-up problem at power-down
++ */
++static int azx_halt(struct notifier_block *nb, unsigned long event, void *buf)
++{
++      struct azx *chip = container_of(nb, struct azx, reboot_notifier);
++      azx_stop_chip(chip);
++      return NOTIFY_OK;
++}
++
++static void azx_notifier_register(struct azx *chip)
++{
++      chip->reboot_notifier.notifier_call = azx_halt;
++      register_reboot_notifier(&chip->reboot_notifier);
++}
++
++static void azx_notifier_unregister(struct azx *chip)
++{
++      if (chip->reboot_notifier.notifier_call)
++              unregister_reboot_notifier(&chip->reboot_notifier);
++}
++
++/*
+  * destructor
+  */
+ static int azx_free(struct azx *chip)
+ {
+       int i;
++      azx_notifier_unregister(chip);
++
+       if (chip->initialized) {
+               azx_clear_irq_pending(chip);
+               for (i = 0; i < chip->num_streams; i++)
+@@ -2250,6 +2278,7 @@ static int __devinit azx_probe(struct pci_dev *pci,
+       pci_set_drvdata(pci, card);
+       chip->running = 1;
+       power_down_all_codecs(chip);
++      azx_notifier_register(chip);
+       dev++;
+       return err;
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.5-6 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.5-6
new file mode 100644 (file)
index 0000000..d119216
--- /dev/null
@@ -0,0 +1,2240 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.6
+
+Upstream 2.6.27.6 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/cciss.txt b/Documentation/cciss.txt
+index 8244c64..48d80d9 100644
+--- a/Documentation/cciss.txt
++++ b/Documentation/cciss.txt
+@@ -26,6 +26,8 @@ This driver is known to work with the following cards:
+       * SA P410i
+       * SA P411
+       * SA P812
++      * SA P712m
++      * SA P711m
+ Detecting drive failures:
+ -------------------------
+diff --git a/Makefile b/Makefile
+index 4ea7b3c..1ea4453 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .5
++EXTRAVERSION = .6
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/arm/mach-pxa/include/mach/reset.h b/arch/arm/mach-pxa/include/mach/reset.h
+index 9489a48..7b8842c 100644
+--- a/arch/arm/mach-pxa/include/mach/reset.h
++++ b/arch/arm/mach-pxa/include/mach/reset.h
+@@ -10,9 +10,12 @@
+ extern unsigned int reset_status;
+ extern void clear_reset_status(unsigned int mask);
+-/*
+- * register GPIO as reset generator
++/**
++ * init_gpio_reset() - register GPIO as reset generator
++ *
++ * @gpio - gpio nr
++ * @output - set gpio as out/low instead of input during normal work
+  */
+-extern int init_gpio_reset(int gpio);
++extern int init_gpio_reset(int gpio, int output);
+ #endif /* __ASM_ARCH_RESET_H */
+diff --git a/arch/arm/mach-pxa/reset.c b/arch/arm/mach-pxa/reset.c
+index 9996c61..1b236a6 100644
+--- a/arch/arm/mach-pxa/reset.c
++++ b/arch/arm/mach-pxa/reset.c
+@@ -20,7 +20,7 @@ static void do_hw_reset(void);
+ static int reset_gpio = -1;
+-int init_gpio_reset(int gpio)
++int init_gpio_reset(int gpio, int output)
+ {
+       int rc;
+@@ -30,9 +30,12 @@ int init_gpio_reset(int gpio)
+               goto out;
+       }
+-      rc = gpio_direction_input(gpio);
++      if (output)
++              rc = gpio_direction_output(gpio, 0);
++      else
++              rc = gpio_direction_input(gpio);
+       if (rc) {
+-              printk(KERN_ERR "Can't configure reset_gpio for input\n");
++              printk(KERN_ERR "Can't configure reset_gpio\n");
+               gpio_free(gpio);
+               goto out;
+       }
+diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
+index b569f3b..32cee4c 100644
+--- a/arch/arm/mach-pxa/spitz.c
++++ b/arch/arm/mach-pxa/spitz.c
+@@ -548,7 +548,7 @@ static void spitz_restart(char mode)
+ static void __init common_init(void)
+ {
+-      init_gpio_reset(SPITZ_GPIO_ON_RESET);
++      init_gpio_reset(SPITZ_GPIO_ON_RESET, 1);
+       pm_power_off = spitz_poweroff;
+       arm_pm_restart = spitz_restart;
+diff --git a/arch/arm/mach-pxa/tosa.c b/arch/arm/mach-pxa/tosa.c
+index 9f3ef9e..130e37e 100644
+--- a/arch/arm/mach-pxa/tosa.c
++++ b/arch/arm/mach-pxa/tosa.c
+@@ -781,7 +781,7 @@ static void __init tosa_init(void)
+       gpio_set_wake(MFP_PIN_GPIO1, 1);
+       /* We can't pass to gpio-keys since it will drop the Reset altfunc */
+-      init_gpio_reset(TOSA_GPIO_ON_RESET);
++      init_gpio_reset(TOSA_GPIO_ON_RESET, 0);
+       pm_power_off = tosa_poweroff;
+       arm_pm_restart = tosa_restart;
+diff --git a/arch/arm/mm/cache-xsc3l2.c b/arch/arm/mm/cache-xsc3l2.c
+index 158bd96..99ec030 100644
+--- a/arch/arm/mm/cache-xsc3l2.c
++++ b/arch/arm/mm/cache-xsc3l2.c
+@@ -97,7 +97,7 @@ static void xsc3_l2_inv_range(unsigned long start, unsigned long end)
+       /*
+        * Clean and invalidate partial last cache line.
+        */
+-      if (end & (CACHE_LINE_SIZE - 1)) {
++      if (start < end && (end & (CACHE_LINE_SIZE - 1))) {
+               xsc3_l2_clean_pa(end & ~(CACHE_LINE_SIZE - 1));
+               xsc3_l2_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
+               end &= ~(CACHE_LINE_SIZE - 1);
+@@ -106,7 +106,7 @@ static void xsc3_l2_inv_range(unsigned long start, unsigned long end)
+       /*
+        * Invalidate all full cache lines between 'start' and 'end'.
+        */
+-      while (start != end) {
++      while (start < end) {
+               xsc3_l2_inv_pa(start);
+               start += CACHE_LINE_SIZE;
+       }
+diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
+index ed92864..552d2b7 100644
+--- a/arch/x86/Kconfig
++++ b/arch/x86/Kconfig
+@@ -1059,6 +1059,26 @@ config HIGHPTE
+         low memory.  Setting this option will put user-space page table
+         entries in high memory.
++config X86_RESERVE_LOW_64K
++        bool "Reserve low 64K of RAM on AMI/Phoenix BIOSen"
++      default y
++      help
++       Reserve the first 64K of physical RAM on BIOSes that are known
++       to potentially corrupt that memory range. A numbers of BIOSes are
++       known to utilize this area during suspend/resume, so it must not
++       be used by the kernel.
++
++       Set this to N if you are absolutely sure that you trust the BIOS
++       to get all its memory reservations and usages right.
++
++       If you have doubts about the BIOS (e.g. suspend/resume does not
++       work or there's kernel crashes after certain hardware hotplug
++       events) and it's not AMI or Phoenix, then you might want to enable
++       X86_CHECK_BIOS_CORRUPTION=y to allow the kernel to check typical
++       corruption patterns.
++
++       Say Y if unsure.
++
+ config MATH_EMULATION
+       bool
+       prompt "Math emulation" if X86_32
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 9838f25..64b5c42 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -578,6 +578,39 @@ static struct x86_quirks default_x86_quirks __initdata;
+ struct x86_quirks *x86_quirks __initdata = &default_x86_quirks;
++static int __init dmi_low_memory_corruption(const struct dmi_system_id *d)
++{
++      printk(KERN_NOTICE
++              "%s detected: BIOS may corrupt low RAM, working it around.\n",
++              d->ident);
++
++      e820_update_range(0, 0x10000, E820_RAM, E820_RESERVED);
++      sanitize_e820_map(e820.map, ARRAY_SIZE(e820.map), &e820.nr_map);
++
++      return 0;
++}
++
++/* List of systems that have known low memory corruption BIOS problems */
++static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
++#ifdef CONFIG_X86_RESERVE_LOW_64K
++      {
++              .callback = dmi_low_memory_corruption,
++              .ident = "AMI BIOS",
++              .matches = {
++                      DMI_MATCH(DMI_BIOS_VENDOR, "American Megatrends Inc."),
++              },
++      },
++      {
++              .callback = dmi_low_memory_corruption,
++              .ident = "Phoenix BIOS",
++              .matches = {
++                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
++              },
++      },
++#endif
++      {}
++};
++
+ /*
+  * Determine if we were loaded by an EFI loader.  If so, then we have also been
+  * passed the efi memmap, systab, etc., so we should use these data structures
+@@ -699,6 +732,10 @@ void __init setup_arch(char **cmdline_p)
+       finish_e820_parsing();
++      dmi_scan_machine();
++
++      dmi_check_system(bad_bios_dmi_table);
++
+ #ifdef CONFIG_X86_32
+       probe_roms();
+ #endif
+@@ -781,8 +818,6 @@ void __init setup_arch(char **cmdline_p)
+       vsmp_init();
+ #endif
+-      dmi_scan_machine();
+-
+       io_delay_init();
+       /*
+@@ -885,3 +920,5 @@ void __init setup_arch(char **cmdline_p)
+ #endif
+ #endif
+ }
++
++
+diff --git a/arch/x86/kernel/tsc.c b/arch/x86/kernel/tsc.c
+index 8f98e9d..de850e9 100644
+--- a/arch/x86/kernel/tsc.c
++++ b/arch/x86/kernel/tsc.c
+@@ -639,10 +639,6 @@ void __init tsc_init(void)
+               cpu_khz = calibrate_cpu();
+ #endif
+-      lpj = ((u64)tsc_khz * 1000);
+-      do_div(lpj, HZ);
+-      lpj_fine = lpj;
+-
+       printk("Detected %lu.%03lu MHz processor.\n",
+                       (unsigned long)cpu_khz / 1000,
+                       (unsigned long)cpu_khz % 1000);
+@@ -662,6 +658,10 @@ void __init tsc_init(void)
+       /* now allow native_sched_clock() to use rdtsc */
+       tsc_disabled = 0;
++      lpj = ((u64)tsc_khz * 1000);
++      do_div(lpj, HZ);
++      lpj_fine = lpj;
++
+       use_tsc_delay();
+       /* Check and install the TSC clocksource */
+       dmi_check_system(bad_tsc_dmi_table);
+diff --git a/drivers/acpi/dock.c b/drivers/acpi/dock.c
+index 7d2edf1..25d2161 100644
+--- a/drivers/acpi/dock.c
++++ b/drivers/acpi/dock.c
+@@ -604,14 +604,17 @@ static int handle_eject_request(struct dock_station *ds, u32 event)
+ static void dock_notify(acpi_handle handle, u32 event, void *data)
+ {
+       struct dock_station *ds = data;
++      struct acpi_device *tmp;
+       switch (event) {
+       case ACPI_NOTIFY_BUS_CHECK:
+-              if (!dock_in_progress(ds) && dock_present(ds)) {
++              if (!dock_in_progress(ds) && acpi_bus_get_device(ds->handle,
++                 &tmp)) {
+                       begin_dock(ds);
+                       dock(ds);
+                       if (!dock_present(ds)) {
+                               printk(KERN_ERR PREFIX "Unable to dock!\n");
++                              complete_dock(ds);
+                               break;
+                       }
+                       atomic_notifier_call_chain(&dock_notifier_list,
+diff --git a/drivers/ata/libata-eh.c b/drivers/ata/libata-eh.c
+index c1db2f2..2c4ccec 100644
+--- a/drivers/ata/libata-eh.c
++++ b/drivers/ata/libata-eh.c
+@@ -604,9 +604,6 @@ void ata_scsi_error(struct Scsi_Host *host)
+                               if (ata_ncq_enabled(dev))
+                                       ehc->saved_ncq_enabled |= 1 << devno;
+                       }
+-
+-                      /* set last reset timestamp to some time in the past */
+-                      ehc->last_reset = jiffies - 60 * HZ;
+               }
+               ap->pflags |= ATA_PFLAG_EH_IN_PROGRESS;
+@@ -2209,17 +2206,21 @@ int ata_eh_reset(struct ata_link *link, int classify,
+       if (link->flags & ATA_LFLAG_NO_SRST)
+               softreset = NULL;
+-      now = jiffies;
+-      deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN);
+-      if (time_before(now, deadline))
+-              schedule_timeout_uninterruptible(deadline - now);
++      /* make sure each reset attemp is at least COOL_DOWN apart */
++      if (ehc->i.flags & ATA_EHI_DID_RESET) {
++              now = jiffies;
++              WARN_ON(time_after(ehc->last_reset, now));
++              deadline = ata_deadline(ehc->last_reset,
++                                      ATA_EH_RESET_COOL_DOWN);
++              if (time_before(now, deadline))
++                      schedule_timeout_uninterruptible(deadline - now);
++      }
+       spin_lock_irqsave(ap->lock, flags);
+       ap->pflags |= ATA_PFLAG_RESETTING;
+       spin_unlock_irqrestore(ap->lock, flags);
+       ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
+-      ehc->last_reset = jiffies;
+       ata_link_for_each_dev(dev, link) {
+               /* If we issue an SRST then an ATA drive (not ATAPI)
+@@ -2285,7 +2286,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
+       /*
+        * Perform reset
+        */
+-      ehc->last_reset = jiffies;
+       if (ata_is_host_link(link))
+               ata_eh_freeze_port(ap);
+@@ -2297,6 +2297,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
+                                       reset == softreset ? "soft" : "hard");
+               /* mark that this EH session started with reset */
++              ehc->last_reset = jiffies;
+               if (reset == hardreset)
+                       ehc->i.flags |= ATA_EHI_DID_HARDRESET;
+               else
+@@ -2404,7 +2405,7 @@ int ata_eh_reset(struct ata_link *link, int classify,
+       /* reset successful, schedule revalidation */
+       ata_eh_done(link, NULL, ATA_EH_RESET);
+-      ehc->last_reset = jiffies;
++      ehc->last_reset = jiffies;      /* update to completion time */
+       ehc->i.action |= ATA_EH_REVALIDATE;
+       rc = 0;
+diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
+index b73116e..2ac91b8 100644
+--- a/drivers/block/cciss.c
++++ b/drivers/block/cciss.c
+@@ -96,6 +96,8 @@ static const struct pci_device_id cciss_pci_device_id[] = {
+       {PCI_VENDOR_ID_HP,     PCI_DEVICE_ID_HP_CISSE,     0x103C, 0x3245},
+       {PCI_VENDOR_ID_HP,     PCI_DEVICE_ID_HP_CISSE,     0x103C, 0x3247},
+       {PCI_VENDOR_ID_HP,     PCI_DEVICE_ID_HP_CISSE,     0x103C, 0x3249},
++      {PCI_VENDOR_ID_HP,     PCI_DEVICE_ID_HP_CISSE,     0x103C, 0x324A},
++      {PCI_VENDOR_ID_HP,     PCI_DEVICE_ID_HP_CISSE,     0x103C, 0x324B},
+       {PCI_VENDOR_ID_HP,     PCI_ANY_ID,      PCI_ANY_ID, PCI_ANY_ID,
+               PCI_CLASS_STORAGE_RAID << 8, 0xffff << 8, 0},
+       {0,}
+@@ -133,6 +135,8 @@ static struct board_type products[] = {
+       {0x3245103C, "Smart Array P410i", &SA5_access},
+       {0x3247103C, "Smart Array P411", &SA5_access},
+       {0x3249103C, "Smart Array P812", &SA5_access},
++      {0x324A103C, "Smart Array P712m", &SA5_access},
++      {0x324B103C, "Smart Array P711m", &SA5_access},
+       {0xFFFF103C, "Unknown Smart Array", &SA5_access},
+ };
+@@ -1365,6 +1369,7 @@ static void cciss_add_disk(ctlr_info_t *h, struct gendisk *disk,
+       disk->first_minor = drv_index << NWD_SHIFT;
+       disk->fops = &cciss_fops;
+       disk->private_data = &h->drv[drv_index];
++      disk->driverfs_dev = &h->pdev->dev;
+       /* Set up queue information */
+       blk_queue_bounce_limit(disk->queue, h->pdev->dma_mask);
+@@ -3403,7 +3408,8 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
+       int i;
+       int j = 0;
+       int rc;
+-      int dac;
++      int dac, return_code;
++      InquiryData_struct *inq_buff = NULL;
+       i = alloc_cciss_hba();
+       if (i < 0)
+@@ -3509,6 +3515,25 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
+       /* Turn the interrupts on so we can service requests */
+       hba[i]->access.set_intr_mask(hba[i], CCISS_INTR_ON);
++      /* Get the firmware version */
++      inq_buff = kzalloc(sizeof(InquiryData_struct), GFP_KERNEL);
++      if (inq_buff == NULL) {
++              printk(KERN_ERR "cciss: out of memory\n");
++              goto clean4;
++      }
++
++      return_code = sendcmd_withirq(CISS_INQUIRY, i, inq_buff,
++              sizeof(InquiryData_struct), 0, 0 , 0, TYPE_CMD);
++      if (return_code == IO_OK) {
++              hba[i]->firm_ver[0] = inq_buff->data_byte[32];
++              hba[i]->firm_ver[1] = inq_buff->data_byte[33];
++              hba[i]->firm_ver[2] = inq_buff->data_byte[34];
++              hba[i]->firm_ver[3] = inq_buff->data_byte[35];
++      } else {         /* send command failed */
++              printk(KERN_WARNING "cciss: unable to determine firmware"
++                      " version of controller\n");
++      }
++
+       cciss_procinit(i);
+       hba[i]->cciss_max_sectors = 2048;
+@@ -3519,6 +3544,7 @@ static int __devinit cciss_init_one(struct pci_dev *pdev,
+       return 1;
+ clean4:
++      kfree(inq_buff);
+ #ifdef CONFIG_CISS_SCSI_TAPE
+       kfree(hba[i]->scsi_rejects.complete);
+ #endif
+diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
+index 09c1434..f5d2e54 100644
+--- a/drivers/block/cpqarray.c
++++ b/drivers/block/cpqarray.c
+@@ -567,7 +567,12 @@ static int __init cpqarray_init(void)
+                       num_cntlrs_reg++;
+       }
+-      return(num_cntlrs_reg);
++      if (num_cntlrs_reg)
++              return 0;
++      else {
++              pci_unregister_driver(&cpqarray_pci_driver);
++              return -ENODEV;
++      }
+ }
+ /* Function to find the first free pointer into our hba[] array */
+diff --git a/drivers/dca/dca-core.c b/drivers/dca/dca-core.c
+index ec249d2..d883e1b 100644
+--- a/drivers/dca/dca-core.c
++++ b/drivers/dca/dca-core.c
+@@ -270,6 +270,6 @@ static void __exit dca_exit(void)
+       dca_sysfs_exit();
+ }
+-module_init(dca_init);
++subsys_initcall(dca_init);
+ module_exit(dca_exit);
+diff --git a/drivers/dma/ioat_dma.c b/drivers/dma/ioat_dma.c
+index bc8c6e3..3f4db54 100644
+--- a/drivers/dma/ioat_dma.c
++++ b/drivers/dma/ioat_dma.c
+@@ -519,7 +519,7 @@ static dma_cookie_t ioat1_tx_submit(struct dma_async_tx_descriptor *tx)
+       }
+       hw->ctl = IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
+-      if (new->async_tx.callback) {
++      if (first->async_tx.callback) {
+               hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;
+               if (first != new) {
+                       /* move callback into to last desc */
+@@ -611,7 +611,7 @@ static dma_cookie_t ioat2_tx_submit(struct dma_async_tx_descriptor *tx)
+       }
+       hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_CP_STS;
+-      if (new->async_tx.callback) {
++      if (first->async_tx.callback) {
+               hw->ctl |= IOAT_DMA_DESCRIPTOR_CTL_INT_GN;
+               if (first != new) {
+                       /* move callback into to last desc */
+@@ -801,6 +801,12 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
+       struct ioat_desc_sw *desc, *_desc;
+       int in_use_descs = 0;
++      /* Before freeing channel resources first check
++       * if they have been previously allocated for this channel.
++       */
++      if (ioat_chan->desccount == 0)
++              return;
++
+       tasklet_disable(&ioat_chan->cleanup_task);
+       ioat_dma_memcpy_cleanup(ioat_chan);
+@@ -863,6 +869,7 @@ static void ioat_dma_free_chan_resources(struct dma_chan *chan)
+       ioat_chan->last_completion = ioat_chan->completion_addr = 0;
+       ioat_chan->pending = 0;
+       ioat_chan->dmacount = 0;
++      ioat_chan->desccount = 0;
+       ioat_chan->watchdog_completion = 0;
+       ioat_chan->last_compl_desc_addr_hw = 0;
+       ioat_chan->watchdog_tcp_cookie =
+diff --git a/drivers/dma/iovlock.c b/drivers/dma/iovlock.c
+index e763d72..9f6fe46 100644
+--- a/drivers/dma/iovlock.c
++++ b/drivers/dma/iovlock.c
+@@ -55,7 +55,6 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
+       int nr_iovecs = 0;
+       int iovec_len_used = 0;
+       int iovec_pages_used = 0;
+-      long err;
+       /* don't pin down non-user-based iovecs */
+       if (segment_eq(get_fs(), KERNEL_DS))
+@@ -72,23 +71,21 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
+       local_list = kmalloc(sizeof(*local_list)
+               + (nr_iovecs * sizeof (struct dma_page_list))
+               + (iovec_pages_used * sizeof (struct page*)), GFP_KERNEL);
+-      if (!local_list) {
+-              err = -ENOMEM;
++      if (!local_list)
+               goto out;
+-      }
+       /* list of pages starts right after the page list array */
+       pages = (struct page **) &local_list->page_list[nr_iovecs];
++      local_list->nr_iovecs = 0;
++
+       for (i = 0; i < nr_iovecs; i++) {
+               struct dma_page_list *page_list = &local_list->page_list[i];
+               len -= iov[i].iov_len;
+-              if (!access_ok(VERIFY_WRITE, iov[i].iov_base, iov[i].iov_len)) {
+-                      err = -EFAULT;
++              if (!access_ok(VERIFY_WRITE, iov[i].iov_base, iov[i].iov_len))
+                       goto unpin;
+-              }
+               page_list->nr_pages = num_pages_spanned(&iov[i]);
+               page_list->base_address = iov[i].iov_base;
+@@ -109,10 +106,8 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
+                       NULL);
+               up_read(&current->mm->mmap_sem);
+-              if (ret != page_list->nr_pages) {
+-                      err = -ENOMEM;
++              if (ret != page_list->nr_pages)
+                       goto unpin;
+-              }
+               local_list->nr_iovecs = i + 1;
+       }
+@@ -122,7 +117,7 @@ struct dma_pinned_list *dma_pin_iovec_pages(struct iovec *iov, size_t len)
+ unpin:
+       dma_unpin_iovec_pages(local_list);
+ out:
+-      return ERR_PTR(err);
++      return NULL;
+ }
+ void dma_unpin_iovec_pages(struct dma_pinned_list *pinned_list)
+diff --git a/drivers/hid/hidraw.c b/drivers/hid/hidraw.c
+index c40f040..8c030d9 100644
+--- a/drivers/hid/hidraw.c
++++ b/drivers/hid/hidraw.c
+@@ -113,7 +113,7 @@ static ssize_t hidraw_write(struct file *file, const char __user *buffer, size_t
+       if (!dev->hid_output_raw_report)
+               return -ENODEV;
+-      if (count > HID_MIN_BUFFER_SIZE) {
++      if (count > HID_MAX_BUFFER_SIZE) {
+               printk(KERN_WARNING "hidraw: pid %d passed too large report\n",
+                               task_pid_nr(current));
+               return -EINVAL;
+diff --git a/drivers/md/linear.c b/drivers/md/linear.c
+index b1eebf8..a58a19e 100644
+--- a/drivers/md/linear.c
++++ b/drivers/md/linear.c
+@@ -157,6 +157,8 @@ static linear_conf_t *linear_conf(mddev_t *mddev, int raid_disks)
+       min_spacing = conf->array_sectors / 2;
+       sector_div(min_spacing, PAGE_SIZE/sizeof(struct dev_info *));
++      if (min_spacing == 0)
++              min_spacing = 1;
+       /* min_spacing is the minimum spacing that will fit the hash
+        * table in one PAGE.  This may be much smaller than needed.
+diff --git a/drivers/md/raid10.c b/drivers/md/raid10.c
+index e34cd0e..941576d 100644
+--- a/drivers/md/raid10.c
++++ b/drivers/md/raid10.c
+@@ -1132,7 +1132,7 @@ static int raid10_add_disk(mddev_t *mddev, mdk_rdev_t *rdev)
+       if (!enough(conf))
+               return -EINVAL;
+-      if (rdev->raid_disk)
++      if (rdev->raid_disk >= 0)
+               first = last = rdev->raid_disk;
+       if (rdev->saved_raid_disk >= 0 &&
+diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
+index 044d84e..f7284b9 100644
+--- a/drivers/mmc/core/core.c
++++ b/drivers/mmc/core/core.c
+@@ -280,7 +280,11 @@ void mmc_set_data_timeout(struct mmc_data *data, const struct mmc_card *card)
+                       (card->host->ios.clock / 1000);
+               if (data->flags & MMC_DATA_WRITE)
+-                      limit_us = 250000;
++                      /*
++                       * The limit is really 250 ms, but that is
++                       * insufficient for some crappy cards.
++                       */
++                      limit_us = 300000;
+               else
+                       limit_us = 100000;
+diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
+index a972cc6..9e7a236 100644
+--- a/drivers/mtd/chips/cfi_cmdset_0002.c
++++ b/drivers/mtd/chips/cfi_cmdset_0002.c
+@@ -362,19 +362,6 @@ struct mtd_info *cfi_cmdset_0002(struct map_info *map, int primary)
+               /* Set the default CFI lock/unlock addresses */
+               cfi->addr_unlock1 = 0x555;
+               cfi->addr_unlock2 = 0x2aa;
+-              /* Modify the unlock address if we are in compatibility mode */
+-              if (    /* x16 in x8 mode */
+-                      ((cfi->device_type == CFI_DEVICETYPE_X8) &&
+-                              (cfi->cfiq->InterfaceDesc ==
+-                                      CFI_INTERFACE_X8_BY_X16_ASYNC)) ||
+-                      /* x32 in x16 mode */
+-                      ((cfi->device_type == CFI_DEVICETYPE_X16) &&
+-                              (cfi->cfiq->InterfaceDesc ==
+-                                      CFI_INTERFACE_X16_BY_X32_ASYNC)))
+-              {
+-                      cfi->addr_unlock1 = 0xaaa;
+-                      cfi->addr_unlock2 = 0x555;
+-              }
+       } /* CFI mode */
+       else if (cfi->cfi_mode == CFI_MODE_JEDEC) {
+diff --git a/drivers/mtd/chips/jedec_probe.c b/drivers/mtd/chips/jedec_probe.c
+index f84ab61..2f3f2f7 100644
+--- a/drivers/mtd/chips/jedec_probe.c
++++ b/drivers/mtd/chips/jedec_probe.c
+@@ -1808,9 +1808,7 @@ static inline u32 jedec_read_mfr(struct map_info *map, uint32_t base,
+        * several first banks can contain 0x7f instead of actual ID
+        */
+       do {
+-              uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8),
+-                                                cfi_interleave(cfi),
+-                                                cfi->device_type);
++              uint32_t ofs = cfi_build_cmd_addr(0 + (bank << 8), map, cfi);
+               mask = (1 << (cfi->device_type * 8)) - 1;
+               result = map_read(map, base + ofs);
+               bank++;
+@@ -1824,7 +1822,7 @@ static inline u32 jedec_read_id(struct map_info *map, uint32_t base,
+ {
+       map_word result;
+       unsigned long mask;
+-      u32 ofs = cfi_build_cmd_addr(1, cfi_interleave(cfi), cfi->device_type);
++      u32 ofs = cfi_build_cmd_addr(1, map, cfi);
+       mask = (1 << (cfi->device_type * 8)) -1;
+       result = map_read(map, base + ofs);
+       return result.x[0] & mask;
+@@ -2067,8 +2065,8 @@ static int jedec_probe_chip(struct map_info *map, __u32 base,
+       }
+       /* Ensure the unlock addresses we try stay inside the map */
+-      probe_offset1 = cfi_build_cmd_addr(cfi->addr_unlock1, cfi_interleave(cfi), cfi->device_type);
+-      probe_offset2 = cfi_build_cmd_addr(cfi->addr_unlock2, cfi_interleave(cfi), cfi->device_type);
++      probe_offset1 = cfi_build_cmd_addr(cfi->addr_unlock1, map, cfi);
++      probe_offset2 = cfi_build_cmd_addr(cfi->addr_unlock2, map, cfi);
+       if (    ((base + probe_offset1 + map_bankwidth(map)) >= map->size) ||
+               ((base + probe_offset2 + map_bankwidth(map)) >= map->size))
+               goto retry;
+diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c
+index 0f6f974..39c17bb 100644
+--- a/drivers/net/r8169.c
++++ b/drivers/net/r8169.c
+@@ -370,8 +370,9 @@ struct ring_info {
+ };
+ enum features {
+-      RTL_FEATURE_WOL = (1 << 0),
+-      RTL_FEATURE_MSI = (1 << 1),
++      RTL_FEATURE_WOL         = (1 << 0),
++      RTL_FEATURE_MSI         = (1 << 1),
++      RTL_FEATURE_GMII        = (1 << 2),
+ };
+ struct rtl8169_private {
+@@ -406,13 +407,15 @@ struct rtl8169_private {
+       struct vlan_group *vlgrp;
+ #endif
+       int (*set_speed)(struct net_device *, u8 autoneg, u16 speed, u8 duplex);
+-      void (*get_settings)(struct net_device *, struct ethtool_cmd *);
++      int (*get_settings)(struct net_device *, struct ethtool_cmd *);
+       void (*phy_reset_enable)(void __iomem *);
+       void (*hw_start)(struct net_device *);
+       unsigned int (*phy_reset_pending)(void __iomem *);
+       unsigned int (*link_ok)(void __iomem *);
+       struct delayed_work task;
+       unsigned features;
++
++      struct mii_if_info mii;
+ };
+ MODULE_AUTHOR("Realtek and the Linux r8169 crew <netdev@vger.kernel.org>");
+@@ -482,6 +485,23 @@ static int mdio_read(void __iomem *ioaddr, int reg_addr)
+       return value;
+ }
++static void rtl_mdio_write(struct net_device *dev, int phy_id, int location,
++                         int val)
++{
++      struct rtl8169_private *tp = netdev_priv(dev);
++      void __iomem *ioaddr = tp->mmio_addr;
++
++      mdio_write(ioaddr, location, val);
++}
++
++static int rtl_mdio_read(struct net_device *dev, int phy_id, int location)
++{
++      struct rtl8169_private *tp = netdev_priv(dev);
++      void __iomem *ioaddr = tp->mmio_addr;
++
++      return mdio_read(ioaddr, location);
++}
++
+ static void rtl8169_irq_mask_and_ack(void __iomem *ioaddr)
+ {
+       RTL_W16(IntrMask, 0x0000);
+@@ -720,9 +740,13 @@ static int rtl8169_set_speed_xmii(struct net_device *dev,
+       auto_nego |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
+-      if ((tp->mac_version == RTL_GIGA_MAC_VER_12) ||
+-          (tp->mac_version == RTL_GIGA_MAC_VER_17)) {
+-              /* Vendor specific (0x1f) and reserved (0x0e) MII registers. */
++      if ((tp->mac_version == RTL_GIGA_MAC_VER_11) ||
++          (tp->mac_version == RTL_GIGA_MAC_VER_12) ||
++          (tp->mac_version >= RTL_GIGA_MAC_VER_17)) {
++              /*
++               * Wake up the PHY.
++               * Vendor specific (0x1f) and reserved (0x0e) MII registers.
++               */
+               mdio_write(ioaddr, 0x1f, 0x0000);
+               mdio_write(ioaddr, 0x0e, 0x0000);
+       }
+@@ -850,7 +874,7 @@ static int rtl8169_rx_vlan_skb(struct rtl8169_private *tp, struct RxDesc *desc,
+ #endif
+-static void rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
++static int rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+       struct rtl8169_private *tp = netdev_priv(dev);
+       void __iomem *ioaddr = tp->mmio_addr;
+@@ -867,65 +891,29 @@ static void rtl8169_gset_tbi(struct net_device *dev, struct ethtool_cmd *cmd)
+       cmd->speed = SPEED_1000;
+       cmd->duplex = DUPLEX_FULL; /* Always set */
++
++      return 0;
+ }
+-static void rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
++static int rtl8169_gset_xmii(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+       struct rtl8169_private *tp = netdev_priv(dev);
+-      void __iomem *ioaddr = tp->mmio_addr;
+-      u8 status;
+-
+-      cmd->supported = SUPPORTED_10baseT_Half |
+-                       SUPPORTED_10baseT_Full |
+-                       SUPPORTED_100baseT_Half |
+-                       SUPPORTED_100baseT_Full |
+-                       SUPPORTED_1000baseT_Full |
+-                       SUPPORTED_Autoneg |
+-                       SUPPORTED_TP;
+-
+-      cmd->autoneg = 1;
+-      cmd->advertising = ADVERTISED_TP | ADVERTISED_Autoneg;
+-
+-      if (tp->phy_auto_nego_reg & ADVERTISE_10HALF)
+-              cmd->advertising |= ADVERTISED_10baseT_Half;
+-      if (tp->phy_auto_nego_reg & ADVERTISE_10FULL)
+-              cmd->advertising |= ADVERTISED_10baseT_Full;
+-      if (tp->phy_auto_nego_reg & ADVERTISE_100HALF)
+-              cmd->advertising |= ADVERTISED_100baseT_Half;
+-      if (tp->phy_auto_nego_reg & ADVERTISE_100FULL)
+-              cmd->advertising |= ADVERTISED_100baseT_Full;
+-      if (tp->phy_1000_ctrl_reg & ADVERTISE_1000FULL)
+-              cmd->advertising |= ADVERTISED_1000baseT_Full;
+-
+-      status = RTL_R8(PHYstatus);
+-
+-      if (status & _1000bpsF)
+-              cmd->speed = SPEED_1000;
+-      else if (status & _100bps)
+-              cmd->speed = SPEED_100;
+-      else if (status & _10bps)
+-              cmd->speed = SPEED_10;
+-
+-      if (status & TxFlowCtrl)
+-              cmd->advertising |= ADVERTISED_Asym_Pause;
+-      if (status & RxFlowCtrl)
+-              cmd->advertising |= ADVERTISED_Pause;
+-
+-      cmd->duplex = ((status & _1000bpsF) || (status & FullDup)) ?
+-                    DUPLEX_FULL : DUPLEX_HALF;
++
++      return mii_ethtool_gset(&tp->mii, cmd);
+ }
+ static int rtl8169_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
+ {
+       struct rtl8169_private *tp = netdev_priv(dev);
+       unsigned long flags;
++      int rc;
+       spin_lock_irqsave(&tp->lock, flags);
+-      tp->get_settings(dev, cmd);
++      rc = tp->get_settings(dev, cmd);
+       spin_unlock_irqrestore(&tp->lock, flags);
+-      return 0;
++      return rc;
+ }
+ static void rtl8169_get_regs(struct net_device *dev, struct ethtool_regs *regs,
+@@ -1513,7 +1501,7 @@ static const struct rtl_cfg_info {
+       unsigned int align;
+       u16 intr_event;
+       u16 napi_event;
+-      unsigned msi;
++      unsigned features;
+ } rtl_cfg_infos [] = {
+       [RTL_CFG_0] = {
+               .hw_start       = rtl_hw_start_8169,
+@@ -1522,7 +1510,7 @@ static const struct rtl_cfg_info {
+               .intr_event     = SYSErr | LinkChg | RxOverflow |
+                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
+               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
+-              .msi            = 0
++              .features       = RTL_FEATURE_GMII
+       },
+       [RTL_CFG_1] = {
+               .hw_start       = rtl_hw_start_8168,
+@@ -1531,7 +1519,7 @@ static const struct rtl_cfg_info {
+               .intr_event     = SYSErr | LinkChg | RxOverflow |
+                                 TxErr | TxOK | RxOK | RxErr,
+               .napi_event     = TxErr | TxOK | RxOK | RxOverflow,
+-              .msi            = RTL_FEATURE_MSI
++              .features       = RTL_FEATURE_GMII | RTL_FEATURE_MSI
+       },
+       [RTL_CFG_2] = {
+               .hw_start       = rtl_hw_start_8101,
+@@ -1540,7 +1528,7 @@ static const struct rtl_cfg_info {
+               .intr_event     = SYSErr | LinkChg | RxOverflow | PCSTimeout |
+                                 RxFIFOOver | TxErr | TxOK | RxOK | RxErr,
+               .napi_event     = RxFIFOOver | TxErr | TxOK | RxOK | RxOverflow,
+-              .msi            = RTL_FEATURE_MSI
++              .features       = RTL_FEATURE_MSI
+       }
+ };
+@@ -1552,7 +1540,7 @@ static unsigned rtl_try_msi(struct pci_dev *pdev, void __iomem *ioaddr,
+       u8 cfg2;
+       cfg2 = RTL_R8(Config2) & ~MSIEnable;
+-      if (cfg->msi) {
++      if (cfg->features & RTL_FEATURE_MSI) {
+               if (pci_enable_msi(pdev)) {
+                       dev_info(&pdev->dev, "no MSI. Back to INTx.\n");
+               } else {
+@@ -1578,6 +1566,7 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+       const struct rtl_cfg_info *cfg = rtl_cfg_infos + ent->driver_data;
+       const unsigned int region = cfg->region;
+       struct rtl8169_private *tp;
++      struct mii_if_info *mii;
+       struct net_device *dev;
+       void __iomem *ioaddr;
+       unsigned int i;
+@@ -1602,6 +1591,14 @@ rtl8169_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
+       tp->pci_dev = pdev;
+       tp->msg_enable = netif_msg_init(debug.msg_enable, R8169_MSG_DEFAULT);
++      mii = &tp->mii;
++      mii->dev = dev;
++      mii->mdio_read = rtl_mdio_read;
++      mii->mdio_write = rtl_mdio_write;
++      mii->phy_id_mask = 0x1f;
++      mii->reg_num_mask = 0x1f;
++      mii->supports_gmii = !!(cfg->features & RTL_FEATURE_GMII);
++
+       /* enable device (incl. PCI PM wakeup and hotplug setup) */
+       rc = pci_enable_device(pdev);
+       if (rc < 0) {
+@@ -2099,8 +2096,6 @@ static void rtl_hw_start_8168(struct net_device *dev)
+       RTL_R8(IntrMask);
+-      RTL_W32(RxMissed, 0);
+-
+       rtl_set_rx_mode(dev);
+       RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+@@ -2143,8 +2138,6 @@ static void rtl_hw_start_8101(struct net_device *dev)
+       RTL_R8(IntrMask);
+-      RTL_W32(RxMissed, 0);
+-
+       rtl_set_rx_mode(dev);
+       RTL_W8(ChipCmd, CmdTxEnb | CmdRxEnb);
+@@ -2922,6 +2915,17 @@ static int rtl8169_poll(struct napi_struct *napi, int budget)
+       return work_done;
+ }
++static void rtl8169_rx_missed(struct net_device *dev, void __iomem *ioaddr)
++{
++      struct rtl8169_private *tp = netdev_priv(dev);
++
++      if (tp->mac_version > RTL_GIGA_MAC_VER_06)
++              return;
++
++      dev->stats.rx_missed_errors += (RTL_R32(RxMissed) & 0xffffff);
++      RTL_W32(RxMissed, 0);
++}
++
+ static void rtl8169_down(struct net_device *dev)
+ {
+       struct rtl8169_private *tp = netdev_priv(dev);
+@@ -2939,9 +2943,7 @@ core_down:
+       rtl8169_asic_down(ioaddr);
+-      /* Update the error counts. */
+-      dev->stats.rx_missed_errors += RTL_R32(RxMissed);
+-      RTL_W32(RxMissed, 0);
++      rtl8169_rx_missed(dev, ioaddr);
+       spin_unlock_irq(&tp->lock);
+@@ -3063,8 +3065,7 @@ static struct net_device_stats *rtl8169_get_stats(struct net_device *dev)
+       if (netif_running(dev)) {
+               spin_lock_irqsave(&tp->lock, flags);
+-              dev->stats.rx_missed_errors += RTL_R32(RxMissed);
+-              RTL_W32(RxMissed, 0);
++              rtl8169_rx_missed(dev, ioaddr);
+               spin_unlock_irqrestore(&tp->lock, flags);
+       }
+@@ -3089,8 +3090,7 @@ static int rtl8169_suspend(struct pci_dev *pdev, pm_message_t state)
+       rtl8169_asic_down(ioaddr);
+-      dev->stats.rx_missed_errors += RTL_R32(RxMissed);
+-      RTL_W32(RxMissed, 0);
++      rtl8169_rx_missed(dev, ioaddr);
+       spin_unlock_irq(&tp->lock);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-5000-hw.h b/drivers/net/wireless/iwlwifi/iwl-5000-hw.h
+index 17d4f31..c479ee2 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-5000-hw.h
++++ b/drivers/net/wireless/iwlwifi/iwl-5000-hw.h
+@@ -129,6 +129,13 @@ struct iwl5000_shared {
+       __le32 padding2;
+ } __attribute__ ((packed));
++/* calibrations defined for 5000 */
++/* defines the order in which results should be sent to the runtime uCode */
++enum iwl5000_calib {
++      IWL5000_CALIB_LO,
++      IWL5000_CALIB_TX_IQ,
++      IWL5000_CALIB_TX_IQ_PERD,
++};
+ #endif /* __iwl_5000_hw_h__ */
+diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c
+index b08036a..79ff288 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-5000.c
++++ b/drivers/net/wireless/iwlwifi/iwl-5000.c
+@@ -445,48 +445,6 @@ static int iwl5000_send_Xtal_calib(struct iwl_priv *priv)
+                               sizeof(cal_cmd), &cal_cmd);
+ }
+-static int iwl5000_send_calib_results(struct iwl_priv *priv)
+-{
+-      int ret = 0;
+-
+-      struct iwl_host_cmd hcmd = {
+-              .id = REPLY_PHY_CALIBRATION_CMD,
+-              .meta.flags = CMD_SIZE_HUGE,
+-      };
+-
+-      if (priv->calib_results.lo_res) {
+-              hcmd.len = priv->calib_results.lo_res_len;
+-              hcmd.data = priv->calib_results.lo_res;
+-              ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+-              if (ret)
+-                      goto err;
+-      }
+-
+-      if (priv->calib_results.tx_iq_res) {
+-              hcmd.len = priv->calib_results.tx_iq_res_len;
+-              hcmd.data = priv->calib_results.tx_iq_res;
+-              ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+-              if (ret)
+-                      goto err;
+-      }
+-
+-      if (priv->calib_results.tx_iq_perd_res) {
+-              hcmd.len = priv->calib_results.tx_iq_perd_res_len;
+-              hcmd.data = priv->calib_results.tx_iq_perd_res;
+-              ret = iwl_send_cmd_sync(priv, &hcmd);
+-
+-              if (ret)
+-                      goto err;
+-      }
+-
+-      return 0;
+-err:
+-      IWL_ERROR("Error %d\n", ret);
+-      return ret;
+-}
+-
+ static int iwl5000_send_calib_cfg(struct iwl_priv *priv)
+ {
+       struct iwl5000_calib_cfg_cmd calib_cfg_cmd;
+@@ -511,33 +469,30 @@ static void iwl5000_rx_calib_result(struct iwl_priv *priv,
+       struct iwl_rx_packet *pkt = (void *)rxb->skb->data;
+       struct iwl5000_calib_hdr *hdr = (struct iwl5000_calib_hdr *)pkt->u.raw;
+       int len = le32_to_cpu(pkt->len) & FH_RSCSR_FRAME_SIZE_MSK;
+-
+-      iwl_free_calib_results(priv);
++      int index;
+       /* reduce the size of the length field itself */
+       len -= 4;
++      /* Define the order in which the results will be sent to the runtime
++       * uCode. iwl_send_calib_results sends them in a row according to their
++       * index. We sort them here */
+       switch (hdr->op_code) {
+       case IWL5000_PHY_CALIBRATE_LO_CMD:
+-              priv->calib_results.lo_res = kzalloc(len, GFP_ATOMIC);
+-              priv->calib_results.lo_res_len = len;
+-              memcpy(priv->calib_results.lo_res, pkt->u.raw, len);
++              index = IWL5000_CALIB_LO;
+               break;
+       case IWL5000_PHY_CALIBRATE_TX_IQ_CMD:
+-              priv->calib_results.tx_iq_res = kzalloc(len, GFP_ATOMIC);
+-              priv->calib_results.tx_iq_res_len = len;
+-              memcpy(priv->calib_results.tx_iq_res, pkt->u.raw, len);
++              index = IWL5000_CALIB_TX_IQ;
+               break;
+       case IWL5000_PHY_CALIBRATE_TX_IQ_PERD_CMD:
+-              priv->calib_results.tx_iq_perd_res = kzalloc(len, GFP_ATOMIC);
+-              priv->calib_results.tx_iq_perd_res_len = len;
+-              memcpy(priv->calib_results.tx_iq_perd_res, pkt->u.raw, len);
++              index = IWL5000_CALIB_TX_IQ_PERD;
+               break;
+       default:
+               IWL_ERROR("Unknown calibration notification %d\n",
+                         hdr->op_code);
+               return;
+       }
++      iwl_calib_set(&priv->calib_results[index], pkt->u.raw, len);
+ }
+ static void iwl5000_rx_calib_complete(struct iwl_priv *priv,
+@@ -832,7 +787,7 @@ static int iwl5000_alive_notify(struct iwl_priv *priv)
+       iwl5000_send_Xtal_calib(priv);
+       if (priv->ucode_type == UCODE_RT)
+-              iwl5000_send_calib_results(priv);
++              iwl_send_calib_results(priv);
+       return 0;
+ }
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index e01f048..72a6743 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -2090,7 +2090,6 @@ static void iwl_alive_start(struct iwl_priv *priv)
+               iwl4965_error_recovery(priv);
+       iwl_power_update_mode(priv, 1);
+-      ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+       if (test_and_clear_bit(STATUS_MODE_PENDING, &priv->status))
+               iwl4965_set_mode(priv, priv->iw_mode);
+@@ -2342,6 +2341,7 @@ static void iwl_bg_alive_start(struct work_struct *data)
+       mutex_lock(&priv->mutex);
+       iwl_alive_start(priv);
+       mutex_unlock(&priv->mutex);
++      ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+ }
+ static void iwl4965_bg_rf_kill(struct work_struct *work)
+@@ -2486,6 +2486,7 @@ static void iwl4965_post_associate(struct iwl_priv *priv)
+       if (!priv->vif || !priv->is_open)
+               return;
++      iwl_power_cancel_timeout(priv);
+       iwl_scan_cancel_timeout(priv, 200);
+       conf = ieee80211_get_hw_conf(priv->hw);
+@@ -2503,8 +2504,7 @@ static void iwl4965_post_associate(struct iwl_priv *priv)
+       priv->staging_rxon.filter_flags |= RXON_FILTER_ASSOC_MSK;
+-      if (priv->current_ht_config.is_ht)
+-              iwl_set_rxon_ht(priv, &priv->current_ht_config);
++      iwl_set_rxon_ht(priv, &priv->current_ht_config);
+       iwl_set_rxon_chain(priv);
+       priv->staging_rxon.assoc_id = cpu_to_le16(priv->assoc_id);
+@@ -2550,10 +2550,6 @@ static void iwl4965_post_associate(struct iwl_priv *priv)
+               break;
+       }
+-      /* Enable Rx differential gain and sensitivity calibrations */
+-      iwl_chain_noise_reset(priv);
+-      priv->start_calib = 1;
+-
+       if (priv->iw_mode == IEEE80211_IF_TYPE_IBSS)
+               priv->assoc_station_added = 1;
+@@ -2561,7 +2557,12 @@ static void iwl4965_post_associate(struct iwl_priv *priv)
+       iwl_activate_qos(priv, 0);
+       spin_unlock_irqrestore(&priv->lock, flags);
+-      iwl_power_update_mode(priv, 0);
++      iwl_power_enable_management(priv);
++
++      /* Enable Rx differential gain and sensitivity calibrations */
++      iwl_chain_noise_reset(priv);
++      priv->start_calib = 1;
++
+       /* we have just associated, don't start scan too early */
+       priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN;
+ }
+@@ -3212,18 +3213,26 @@ static int iwl4965_mac_hw_scan(struct ieee80211_hw *hw, u8 *ssid, size_t len)
+               goto out_unlock;
+       }
+-      /* we don't schedule scan within next_scan_jiffies period */
++      /* We don't schedule scan within next_scan_jiffies period.
++       * Avoid scanning during possible EAPOL exchange, return
++       * success immediately.
++       */
+       if (priv->next_scan_jiffies &&
+-                      time_after(priv->next_scan_jiffies, jiffies)) {
+-              rc = -EAGAIN;
++          time_after(priv->next_scan_jiffies, jiffies)) {
++              IWL_DEBUG_SCAN("scan rejected: within next scan period\n");
++              queue_work(priv->workqueue, &priv->scan_completed);
++              rc = 0;
+               goto out_unlock;
+       }
+       /* if we just finished scan ask for delay */
+-      if (priv->last_scan_jiffies && time_after(priv->last_scan_jiffies +
+-                              IWL_DELAY_NEXT_SCAN, jiffies)) {
+-              rc = -EAGAIN;
++      if (iwl_is_associated(priv) && priv->last_scan_jiffies &&
++          time_after(priv->last_scan_jiffies + IWL_DELAY_NEXT_SCAN, jiffies)) {
++              IWL_DEBUG_SCAN("scan rejected: within previous scan period\n");
++              queue_work(priv->workqueue, &priv->scan_completed);
++              rc = 0;
+               goto out_unlock;
+       }
++
+       if (len) {
+               IWL_DEBUG_SCAN("direct scan for %s [%d]\n ",
+                              iwl_escape_essid(ssid, len), (int)len);
+@@ -3546,6 +3555,16 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw)
+       /* Per mac80211.h: This is only used in IBSS mode... */
+       if (priv->iw_mode != IEEE80211_IF_TYPE_IBSS) {
++              /* switch to CAM during association period.
++               * the ucode will block any association/authentication
++               * frome during assiciation period if it can not hear
++               * the AP because of PM. the timer enable PM back is
++               * association do not complete
++               */
++              if (priv->hw->conf.channel->flags & (IEEE80211_CHAN_PASSIVE_SCAN |
++                                                   IEEE80211_CHAN_RADAR))
++                              iwl_power_disable_management(priv, 3000);
++
+               IWL_DEBUG_MAC80211("leave - not in IBSS\n");
+               mutex_unlock(&priv->mutex);
+               return;
+@@ -4083,6 +4102,7 @@ static void iwl_setup_deferred_work(struct iwl_priv *priv)
+       /* FIXME : remove when resolved PENDING */
+       INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed);
+       iwl_setup_scan_deferred_work(priv);
++      iwl_setup_power_deferred_work(priv);
+       if (priv->cfg->ops->lib->setup_deferred_work)
+               priv->cfg->ops->lib->setup_deferred_work(priv);
+@@ -4102,6 +4122,7 @@ static void iwl_cancel_deferred_work(struct iwl_priv *priv)
+       cancel_delayed_work_sync(&priv->init_alive_start);
+       cancel_delayed_work(&priv->scan_check);
++      cancel_delayed_work_sync(&priv->set_power_save);
+       cancel_delayed_work(&priv->alive_start);
+       cancel_work_sync(&priv->beacon_update);
+       del_timer_sync(&priv->statistics_periodic);
+@@ -4204,13 +4225,13 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e
+       pci_set_master(pdev);
+-      err = pci_set_dma_mask(pdev, DMA_64BIT_MASK);
++      err = pci_set_dma_mask(pdev, DMA_BIT_MASK(36));
+       if (!err)
+-              err = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK);
++              err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(36));
+       if (err) {
+-              err = pci_set_dma_mask(pdev, DMA_32BIT_MASK);
++              err = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
+               if (!err)
+-                      err = pci_set_consistent_dma_mask(pdev, DMA_32BIT_MASK);
++                      err = pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32));
+               /* both attempts failed: */
+               if (err) {
+                       printk(KERN_WARNING "%s: No suitable DMA available.\n",
+diff --git a/drivers/net/wireless/iwlwifi/iwl-calib.c b/drivers/net/wireless/iwlwifi/iwl-calib.c
+index ef49440..35fb4a4 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-calib.c
++++ b/drivers/net/wireless/iwlwifi/iwl-calib.c
+@@ -66,6 +66,66 @@
+ #include "iwl-core.h"
+ #include "iwl-calib.h"
++/*****************************************************************************
++ * INIT calibrations framework
++ *****************************************************************************/
++
++ int iwl_send_calib_results(struct iwl_priv *priv)
++{
++      int ret = 0;
++      int i = 0;
++
++      struct iwl_host_cmd hcmd = {
++              .id = REPLY_PHY_CALIBRATION_CMD,
++              .meta.flags = CMD_SIZE_HUGE,
++      };
++
++      for (i = 0; i < IWL_CALIB_MAX; i++)
++              if (priv->calib_results[i].buf) {
++                      hcmd.len = priv->calib_results[i].buf_len;
++                      hcmd.data = priv->calib_results[i].buf;
++                      ret = iwl_send_cmd_sync(priv, &hcmd);
++                      if (ret)
++                              goto err;
++              }
++
++      return 0;
++err:
++      IWL_ERROR("Error %d iteration %d\n", ret, i);
++      return ret;
++}
++EXPORT_SYMBOL(iwl_send_calib_results);
++
++int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len)
++{
++      if (res->buf_len != len) {
++              kfree(res->buf);
++              res->buf = kzalloc(len, GFP_ATOMIC);
++      }
++      if (unlikely(res->buf == NULL))
++              return -ENOMEM;
++
++      res->buf_len = len;
++      memcpy(res->buf, buf, len);
++      return 0;
++}
++EXPORT_SYMBOL(iwl_calib_set);
++
++void iwl_calib_free_results(struct iwl_priv *priv)
++{
++      int i;
++
++      for (i = 0; i < IWL_CALIB_MAX; i++) {
++              kfree(priv->calib_results[i].buf);
++              priv->calib_results[i].buf = NULL;
++              priv->calib_results[i].buf_len = 0;
++      }
++}
++
++/*****************************************************************************
++ * RUNTIME calibrations framework
++ *****************************************************************************/
++
+ /* "false alarms" are signals that our DSP tries to lock onto,
+  *   but then determines that they are either noise, or transmissions
+  *   from a distant wireless network (also "noise", really) that get
+diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
+index 80f2f84..1383fd1 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -646,8 +646,14 @@ void iwl_set_rxon_ht(struct iwl_priv *priv, struct iwl_ht_info *ht_info)
+       struct iwl_rxon_cmd *rxon = &priv->staging_rxon;
+       u32 val;
+-      if (!ht_info->is_ht)
++      if (!ht_info->is_ht) {
++              rxon->flags &= ~(RXON_FLG_CHANNEL_MODE_MIXED_MSK |
++                      RXON_FLG_CHANNEL_MODE_PURE_40_MSK |
++                      RXON_FLG_CTRL_CHANNEL_LOC_HI_MSK |
++                      RXON_FLG_FAT_PROT_MSK |
++                      RXON_FLG_HT_PROT_MSK);
+               return;
++      }
+       /* Set up channel bandwidth:  20 MHz only, or 20/40 mixed if fat ok */
+       if (iwl_is_fat_tx_allowed(priv, NULL))
+@@ -950,22 +956,6 @@ err:
+ }
+ EXPORT_SYMBOL(iwl_init_drv);
+-void iwl_free_calib_results(struct iwl_priv *priv)
+-{
+-      kfree(priv->calib_results.lo_res);
+-      priv->calib_results.lo_res = NULL;
+-      priv->calib_results.lo_res_len = 0;
+-
+-      kfree(priv->calib_results.tx_iq_res);
+-      priv->calib_results.tx_iq_res = NULL;
+-      priv->calib_results.tx_iq_res_len = 0;
+-
+-      kfree(priv->calib_results.tx_iq_perd_res);
+-      priv->calib_results.tx_iq_perd_res = NULL;
+-      priv->calib_results.tx_iq_perd_res_len = 0;
+-}
+-EXPORT_SYMBOL(iwl_free_calib_results);
+-
+ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
+ {
+       int ret = 0;
+@@ -993,10 +983,9 @@ int iwl_set_tx_power(struct iwl_priv *priv, s8 tx_power, bool force)
+ }
+ EXPORT_SYMBOL(iwl_set_tx_power);
+-
+ void iwl_uninit_drv(struct iwl_priv *priv)
+ {
+-      iwl_free_calib_results(priv);
++      iwl_calib_free_results(priv);
+       iwlcore_free_geos(priv);
+       iwl_free_channel_map(priv);
+       kfree(priv->scan);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h
+index 64f139e..51b36b1 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-core.h
++++ b/drivers/net/wireless/iwlwifi/iwl-core.h
+@@ -186,7 +186,6 @@ struct ieee80211_hw *iwl_alloc_all(struct iwl_cfg *cfg,
+ void iwl_hw_detect(struct iwl_priv *priv);
+ void iwl_clear_stations_table(struct iwl_priv *priv);
+-void iwl_free_calib_results(struct iwl_priv *priv);
+ void iwl_reset_qos(struct iwl_priv *priv);
+ void iwl_set_rxon_chain(struct iwl_priv *priv);
+ int iwl_set_rxon_channel(struct iwl_priv *priv,
+@@ -291,6 +290,13 @@ int iwl_scan_initiate(struct iwl_priv *priv);
+ void iwl_setup_rx_scan_handlers(struct iwl_priv *priv);
+ void iwl_setup_scan_deferred_work(struct iwl_priv *priv);
++/*******************************************************************************
++ * Calibrations - implemented in iwl-calib.c
++ ******************************************************************************/
++int iwl_send_calib_results(struct iwl_priv *priv);
++int iwl_calib_set(struct iwl_calib_result *res, const u8 *buf, int len);
++void iwl_calib_free_results(struct iwl_priv *priv);
++
+ /*****************************************************
+  *   S e n d i n g     H o s t     C o m m a n d s   *
+  *****************************************************/
+diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
+index cdfb343..09bdf8e 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
+@@ -745,13 +745,10 @@ struct statistics_general_data {
+       u32 beacon_energy_c;
+ };
+-struct iwl_calib_results {
+-      void *tx_iq_res;
+-      void *tx_iq_perd_res;
+-      void *lo_res;
+-      u32 tx_iq_res_len;
+-      u32 tx_iq_perd_res_len;
+-      u32 lo_res_len;
++/* Opaque calibration results */
++struct iwl_calib_result {
++      void *buf;
++      size_t buf_len;
+ };
+ enum ucode_type {
+@@ -813,6 +810,7 @@ enum {
+ #define IWL_MAX_NUM_QUEUES    20 /* FIXME: do dynamic allocation */
++#define IWL_CALIB_MAX  3
+ struct iwl_priv {
+@@ -857,7 +855,7 @@ struct iwl_priv {
+       s32 last_temperature;
+       /* init calibration results */
+-      struct iwl_calib_results calib_results;
++      struct iwl_calib_result calib_results[IWL_CALIB_MAX];
+       /* Scan related variables */
+       unsigned long last_scan_jiffies;
+@@ -1047,6 +1045,7 @@ struct iwl_priv {
+       struct tasklet_struct irq_tasklet;
++      struct delayed_work set_power_save;
+       struct delayed_work init_alive_start;
+       struct delayed_work alive_start;
+       struct delayed_work scan_check;
+diff --git a/drivers/net/wireless/iwlwifi/iwl-power.c b/drivers/net/wireless/iwlwifi/iwl-power.c
+index a099c9e..ae60bfd 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-power.c
++++ b/drivers/net/wireless/iwlwifi/iwl-power.c
+@@ -324,7 +324,7 @@ EXPORT_SYMBOL(iwl_power_update_mode);
+  * this will be usefull for rate scale to disable PM during heavy
+  * Tx/Rx activities
+  */
+-int iwl_power_disable_management(struct iwl_priv *priv)
++int iwl_power_disable_management(struct iwl_priv *priv, u32 ms)
+ {
+       u16 prev_mode;
+       int ret = 0;
+@@ -337,6 +337,11 @@ int iwl_power_disable_management(struct iwl_priv *priv)
+       ret = iwl_power_update_mode(priv, 0);
+       priv->power_data.power_disabled = 1;
+       priv->power_data.user_power_setting = prev_mode;
++      cancel_delayed_work(&priv->set_power_save);
++      if (ms)
++              queue_delayed_work(priv->workqueue, &priv->set_power_save,
++                                 msecs_to_jiffies(ms));
++
+       return ret;
+ }
+@@ -431,3 +436,35 @@ int iwl_power_temperature_change(struct iwl_priv *priv)
+       return ret;
+ }
+ EXPORT_SYMBOL(iwl_power_temperature_change);
++
++static void iwl_bg_set_power_save(struct work_struct *work)
++{
++      struct iwl_priv *priv = container_of(work,
++                              struct iwl_priv, set_power_save.work);
++      IWL_DEBUG(IWL_DL_STATE, "update power\n");
++
++      if (test_bit(STATUS_EXIT_PENDING, &priv->status))
++              return;
++
++      mutex_lock(&priv->mutex);
++
++      /* on starting association we disable power managment
++       * until association, if association failed then this
++       * timer will expire and enable PM again.
++       */
++      if (!iwl_is_associated(priv))
++              iwl_power_enable_management(priv);
++
++      mutex_unlock(&priv->mutex);
++}
++void iwl_setup_power_deferred_work(struct iwl_priv *priv)
++{
++      INIT_DELAYED_WORK(&priv->set_power_save, iwl_bg_set_power_save);
++}
++EXPORT_SYMBOL(iwl_setup_power_deferred_work);
++
++void iwl_power_cancel_timeout(struct iwl_priv *priv)
++{
++      cancel_delayed_work(&priv->set_power_save);
++}
++EXPORT_SYMBOL(iwl_power_cancel_timeout);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-power.h b/drivers/net/wireless/iwlwifi/iwl-power.h
+index abcbbf9..aa99f36 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-power.h
++++ b/drivers/net/wireless/iwlwifi/iwl-power.h
+@@ -78,8 +78,10 @@ struct iwl_power_mgr {
+       u8 power_disabled; /* flag to disable using power saving level */
+ };
++void iwl_setup_power_deferred_work(struct iwl_priv *priv);
++void iwl_power_cancel_timeout(struct iwl_priv *priv);
+ int iwl_power_update_mode(struct iwl_priv *priv, u8 refresh);
+-int iwl_power_disable_management(struct iwl_priv *priv);
++int iwl_power_disable_management(struct iwl_priv *priv, u32 ms);
+ int iwl_power_enable_management(struct iwl_priv *priv);
+ int iwl_power_set_user_mode(struct iwl_priv *priv, u16 mode);
+ int iwl_power_set_system_mode(struct iwl_priv *priv, u16 mode);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c
+index 6c8ac3a..3a90a67 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-scan.c
++++ b/drivers/net/wireless/iwlwifi/iwl-scan.c
+@@ -464,11 +464,6 @@ void iwl_init_scan_params(struct iwl_priv *priv)
+ int iwl_scan_initiate(struct iwl_priv *priv)
+ {
+-      if (priv->iw_mode == IEEE80211_IF_TYPE_AP) {
+-              IWL_ERROR("APs don't scan.\n");
+-              return 0;
+-      }
+-
+       if (!iwl_is_ready_rf(priv)) {
+               IWL_DEBUG_SCAN("Aborting scan due to not ready.\n");
+               return -EIO;
+@@ -480,8 +475,7 @@ int iwl_scan_initiate(struct iwl_priv *priv)
+       }
+       if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) {
+-              IWL_DEBUG_SCAN("Scan request while abort pending.  "
+-                             "Queuing.\n");
++              IWL_DEBUG_SCAN("Scan request while abort pending\n");
+               return -EAGAIN;
+       }
+diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+index b775d5b..752e7f8 100644
+--- a/drivers/net/wireless/iwlwifi/iwl3945-base.c
++++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c
+@@ -5761,7 +5761,6 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv)
+       if (priv->error_recovering)
+               iwl3945_error_recovery(priv);
+-      ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+       return;
+  restart:
+@@ -6006,6 +6005,7 @@ static void iwl3945_bg_alive_start(struct work_struct *data)
+       mutex_lock(&priv->mutex);
+       iwl3945_alive_start(priv);
+       mutex_unlock(&priv->mutex);
++      ieee80211_notify_mac(priv->hw, IEEE80211_NOTIFY_RE_ASSOC);
+ }
+ static void iwl3945_bg_rf_kill(struct work_struct *work)
+@@ -6259,6 +6259,11 @@ static void iwl3945_bg_request_scan(struct work_struct *data)
+                               direct_mask,
+                               (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]);
++      if (scan->channel_count == 0) {
++              IWL_DEBUG_SCAN("channel count %d\n", scan->channel_count);
++              goto done;
++      }
++
+       cmd.len += le16_to_cpu(scan->tx_cmd.len) +
+           scan->channel_count * sizeof(struct iwl3945_scan_channel);
+       cmd.data = scan;
+diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c
+index a60ae86..a3ccd8c 100644
+--- a/drivers/net/wireless/zd1211rw/zd_usb.c
++++ b/drivers/net/wireless/zd1211rw/zd_usb.c
+@@ -61,6 +61,7 @@ static struct usb_device_id usb_ids[] = {
+       { USB_DEVICE(0x0105, 0x145f), .driver_info = DEVICE_ZD1211 },
+       /* ZD1211B */
+       { USB_DEVICE(0x0ace, 0x1215), .driver_info = DEVICE_ZD1211B },
++      { USB_DEVICE(0x0ace, 0xb215), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x157e, 0x300d), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x079b, 0x0062), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x1582, 0x6003), .driver_info = DEVICE_ZD1211B },
+@@ -82,6 +83,7 @@ static struct usb_device_id usb_ids[] = {
+       { USB_DEVICE(0x0cde, 0x001a), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0586, 0x340a), .driver_info = DEVICE_ZD1211B },
+       { USB_DEVICE(0x0471, 0x1237), .driver_info = DEVICE_ZD1211B },
++      { USB_DEVICE(0x07fa, 0x1196), .driver_info = DEVICE_ZD1211B },
+       /* "Driverless" devices that need ejecting */
+       { USB_DEVICE(0x0ace, 0x2011), .driver_info = DEVICE_INSTALLER },
+       { USB_DEVICE(0x0ace, 0x20ff), .driver_info = DEVICE_INSTALLER },
+diff --git a/fs/ext3/super.c b/fs/ext3/super.c
+index f38a5af..810bf7c 100644
+--- a/fs/ext3/super.c
++++ b/fs/ext3/super.c
+@@ -2365,13 +2365,12 @@ static void ext3_write_super (struct super_block * sb)
+ static int ext3_sync_fs(struct super_block *sb, int wait)
+ {
+-      tid_t target;
+-
+       sb->s_dirt = 0;
+-      if (journal_start_commit(EXT3_SB(sb)->s_journal, &target)) {
+-              if (wait)
+-                      log_wait_commit(EXT3_SB(sb)->s_journal, target);
+-      }
++      if (wait)
++              ext3_force_commit(sb);
++      else
++              journal_start_commit(EXT3_SB(sb)->s_journal, NULL);
++
+       return 0;
+ }
+diff --git a/fs/hfs/catalog.c b/fs/hfs/catalog.c
+index ba85157..6d98f11 100644
+--- a/fs/hfs/catalog.c
++++ b/fs/hfs/catalog.c
+@@ -190,6 +190,10 @@ int hfs_cat_find_brec(struct super_block *sb, u32 cnid,
+       fd->search_key->cat.ParID = rec.thread.ParID;
+       len = fd->search_key->cat.CName.len = rec.thread.CName.len;
++      if (len > HFS_NAMELEN) {
++              printk(KERN_ERR "hfs: bad catalog namelength\n");
++              return -EIO;
++      }
+       memcpy(fd->search_key->cat.CName.name, rec.thread.CName.name, len);
+       return hfs_brec_find(fd);
+ }
+diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c
+index 8adebd3..0fd792b 100644
+--- a/fs/jffs2/background.c
++++ b/fs/jffs2/background.c
+@@ -85,15 +85,15 @@ static int jffs2_garbage_collect_thread(void *_c)
+       for (;;) {
+               allow_signal(SIGHUP);
+       again:
++              spin_lock(&c->erase_completion_lock);
+               if (!jffs2_thread_should_wake(c)) {
+                       set_current_state (TASK_INTERRUPTIBLE);
++                      spin_unlock(&c->erase_completion_lock);
+                       D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread sleeping...\n"));
+-                      /* Yes, there's a race here; we checked jffs2_thread_should_wake()
+-                         before setting current->state to TASK_INTERRUPTIBLE. But it doesn't
+-                         matter - We don't care if we miss a wakeup, because the GC thread
+-                         is only an optimisation anyway. */
+                       schedule();
+-              }
++              } else
++                      spin_unlock(&c->erase_completion_lock);
++
+               /* This thread is purely an optimisation. But if it runs when
+                  other things could be running, it actually makes things a
+diff --git a/fs/jffs2/compr_lzo.c b/fs/jffs2/compr_lzo.c
+index 47b0457..90cb60d 100644
+--- a/fs/jffs2/compr_lzo.c
++++ b/fs/jffs2/compr_lzo.c
+@@ -19,7 +19,7 @@
+ static void *lzo_mem;
+ static void *lzo_compress_buf;
+-static DEFINE_MUTEX(deflate_mutex);
++static DEFINE_MUTEX(deflate_mutex);   /* for lzo_mem and lzo_compress_buf */
+ static void free_workspace(void)
+ {
+@@ -49,18 +49,21 @@ static int jffs2_lzo_compress(unsigned char *data_in, unsigned char *cpage_out,
+       mutex_lock(&deflate_mutex);
+       ret = lzo1x_1_compress(data_in, *sourcelen, lzo_compress_buf, &compress_size, lzo_mem);
+-      mutex_unlock(&deflate_mutex);
+-
+       if (ret != LZO_E_OK)
+-              return -1;
++              goto fail;
+       if (compress_size > *dstlen)
+-              return -1;
++              goto fail;
+       memcpy(cpage_out, lzo_compress_buf, compress_size);
+-      *dstlen = compress_size;
++      mutex_unlock(&deflate_mutex);
++      *dstlen = compress_size;
+       return 0;
++
++ fail:
++      mutex_unlock(&deflate_mutex);
++      return -1;
+ }
+ static int jffs2_lzo_decompress(unsigned char *data_in, unsigned char *cpage_out,
+diff --git a/include/asm-generic/memory_model.h b/include/asm-generic/memory_model.h
+index ae060c6..18546d8 100644
+--- a/include/asm-generic/memory_model.h
++++ b/include/asm-generic/memory_model.h
+@@ -34,7 +34,7 @@
+ #define __pfn_to_page(pfn)                    \
+ ({    unsigned long __pfn = (pfn);            \
+-      unsigned long __nid = arch_pfn_to_nid(pfn);  \
++      unsigned long __nid = arch_pfn_to_nid(__pfn);  \
+       NODE_DATA(__nid)->node_mem_map + arch_local_page_offset(__pfn, __nid);\
+ })
+diff --git a/include/linux/mtd/cfi.h b/include/linux/mtd/cfi.h
+index d6fb115..3a16bea 100644
+--- a/include/linux/mtd/cfi.h
++++ b/include/linux/mtd/cfi.h
+@@ -281,9 +281,25 @@ struct cfi_private {
+ /*
+  * Returns the command address according to the given geometry.
+  */
+-static inline uint32_t cfi_build_cmd_addr(uint32_t cmd_ofs, int interleave, int type)
++static inline uint32_t cfi_build_cmd_addr(uint32_t cmd_ofs,
++                              struct map_info *map, struct cfi_private *cfi)
+ {
+-      return (cmd_ofs * type) * interleave;
++      unsigned bankwidth = map_bankwidth(map);
++      unsigned interleave = cfi_interleave(cfi);
++      unsigned type = cfi->device_type;
++      uint32_t addr;
++
++      addr = (cmd_ofs * type) * interleave;
++
++      /* Modify the unlock address if we are in compatiblity mode.
++       * For 16bit devices on 8 bit busses
++       * and 32bit devices on 16 bit busses
++       * set the low bit of the alternating bit sequence of the address.
++       */
++      if (((type * interleave) > bankwidth) && ((uint8_t)cmd_ofs == 0xaa))
++              addr |= (type >> 1)*interleave;
++
++      return  addr;
+ }
+ /*
+@@ -429,7 +445,7 @@ static inline uint32_t cfi_send_gen_cmd(u_char cmd, uint32_t cmd_addr, uint32_t
+                               int type, map_word *prev_val)
+ {
+       map_word val;
+-      uint32_t addr = base + cfi_build_cmd_addr(cmd_addr, cfi_interleave(cfi), type);
++      uint32_t addr = base + cfi_build_cmd_addr(cmd_addr, map, cfi);
+       val = cfi_build_cmd(cmd, map, cfi);
+diff --git a/include/net/af_unix.h b/include/net/af_unix.h
+index 7dd29b7..c29ff1d 100644
+--- a/include/net/af_unix.h
++++ b/include/net/af_unix.h
+@@ -54,6 +54,7 @@ struct unix_sock {
+         atomic_long_t           inflight;
+         spinlock_t            lock;
+       unsigned int            gc_candidate : 1;
++      unsigned int            gc_maybe_cycle : 1;
+         wait_queue_head_t       peer_wait;
+ };
+ #define unix_sk(__sk) ((struct unix_sock *)__sk)
+diff --git a/kernel/cgroup.c b/kernel/cgroup.c
+index a0123d7..d68bf2b 100644
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -2443,7 +2443,6 @@ static int cgroup_rmdir(struct inode *unused_dir, struct dentry *dentry)
+       list_del(&cgrp->sibling);
+       spin_lock(&cgrp->dentry->d_lock);
+       d = dget(cgrp->dentry);
+-      cgrp->dentry = NULL;
+       spin_unlock(&d->d_lock);
+       cgroup_d_remove_dir(d);
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 67a7119..77427c8 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -353,11 +353,26 @@ static int vma_has_reserves(struct vm_area_struct *vma)
+       return 0;
+ }
++static void clear_gigantic_page(struct page *page,
++                      unsigned long addr, unsigned long sz)
++{
++      int i;
++      struct page *p = page;
++
++      might_sleep();
++      for (i = 0; i < sz/PAGE_SIZE; i++, p = mem_map_next(p, page, i)) {
++              cond_resched();
++              clear_user_highpage(p, addr + i * PAGE_SIZE);
++      }
++}
+ static void clear_huge_page(struct page *page,
+                       unsigned long addr, unsigned long sz)
+ {
+       int i;
++      if (unlikely(sz > MAX_ORDER_NR_PAGES))
++              return clear_gigantic_page(page, addr, sz);
++
+       might_sleep();
+       for (i = 0; i < sz/PAGE_SIZE; i++) {
+               cond_resched();
+@@ -365,12 +380,32 @@ static void clear_huge_page(struct page *page,
+       }
+ }
++static void copy_gigantic_page(struct page *dst, struct page *src,
++                         unsigned long addr, struct vm_area_struct *vma)
++{
++      int i;
++      struct hstate *h = hstate_vma(vma);
++      struct page *dst_base = dst;
++      struct page *src_base = src;
++      might_sleep();
++      for (i = 0; i < pages_per_huge_page(h); ) {
++              cond_resched();
++              copy_user_highpage(dst, src, addr + i*PAGE_SIZE, vma);
++
++              i++;
++              dst = mem_map_next(dst, dst_base, i);
++              src = mem_map_next(src, src_base, i);
++      }
++}
+ static void copy_huge_page(struct page *dst, struct page *src,
+                          unsigned long addr, struct vm_area_struct *vma)
+ {
+       int i;
+       struct hstate *h = hstate_vma(vma);
++      if (unlikely(pages_per_huge_page(h) > MAX_ORDER_NR_PAGES))
++              return copy_gigantic_page(dst, src, addr, vma);
++
+       might_sleep();
+       for (i = 0; i < pages_per_huge_page(h); i++) {
+               cond_resched();
+@@ -455,6 +490,8 @@ static void update_and_free_page(struct hstate *h, struct page *page)
+ {
+       int i;
++      VM_BUG_ON(h->order >= MAX_ORDER);
++
+       h->nr_huge_pages--;
+       h->nr_huge_pages_node[page_to_nid(page)]--;
+       for (i = 0; i < pages_per_huge_page(h); i++) {
+@@ -969,6 +1006,14 @@ found:
+       return 1;
+ }
++static void prep_compound_huge_page(struct page *page, int order)
++{
++      if (unlikely(order > (MAX_ORDER - 1)))
++              prep_compound_gigantic_page(page, order);
++      else
++              prep_compound_page(page, order);
++}
++
+ /* Put bootmem huge pages into the standard lists after mem_map is up */
+ static void __init gather_bootmem_prealloc(void)
+ {
+@@ -979,7 +1024,7 @@ static void __init gather_bootmem_prealloc(void)
+               struct hstate *h = m->hstate;
+               __ClearPageReserved(page);
+               WARN_ON(page_count(page) != 1);
+-              prep_compound_page(page, h->order);
++              prep_compound_huge_page(page, h->order);
+               prep_new_huge_page(h, page, page_to_nid(page));
+       }
+ }
+@@ -2103,7 +2148,7 @@ int follow_hugetlb_page(struct mm_struct *mm, struct vm_area_struct *vma,
+ same_page:
+               if (pages) {
+                       get_page(page);
+-                      pages[i] = page + pfn_offset;
++                      pages[i] = mem_map_offset(page, pfn_offset);
+               }
+               if (vmas)
+diff --git a/mm/internal.h b/mm/internal.h
+index 1f43f74..92729ea 100644
+--- a/mm/internal.h
++++ b/mm/internal.h
+@@ -17,6 +17,7 @@ void free_pgtables(struct mmu_gather *tlb, struct vm_area_struct *start_vma,
+               unsigned long floor, unsigned long ceiling);
+ extern void prep_compound_page(struct page *page, unsigned long order);
++extern void prep_compound_gigantic_page(struct page *page, unsigned long order);
+ static inline void set_page_count(struct page *page, int v)
+ {
+@@ -53,6 +54,34 @@ static inline unsigned long page_order(struct page *page)
+ }
+ /*
++ * Return the mem_map entry representing the 'offset' subpage within
++ * the maximally aligned gigantic page 'base'.  Handle any discontiguity
++ * in the mem_map at MAX_ORDER_NR_PAGES boundaries.
++ */
++static inline struct page *mem_map_offset(struct page *base, int offset)
++{
++      if (unlikely(offset >= MAX_ORDER_NR_PAGES))
++              return pfn_to_page(page_to_pfn(base) + offset);
++      return base + offset;
++}
++
++/*
++ * Iterator over all subpages withing the maximally aligned gigantic
++ * page 'base'.  Handle any discontiguity in the mem_map.
++ */
++static inline struct page *mem_map_next(struct page *iter,
++                                              struct page *base, int offset)
++{
++      if (unlikely((offset & (MAX_ORDER_NR_PAGES - 1)) == 0)) {
++              unsigned long pfn = page_to_pfn(base) + offset;
++              if (!pfn_valid(pfn))
++                      return NULL;
++              return pfn_to_page(pfn);
++      }
++      return iter + 1;
++}
++
++/*
+  * FLATMEM and DISCONTIGMEM configurations use alloc_bootmem_node,
+  * so all functions starting at paging_init should be marked __init
+  * in those cases. SPARSEMEM, however, allows for memory hotplug,
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index 27b8681..ed5cdae 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -268,24 +268,39 @@ void prep_compound_page(struct page *page, unsigned long order)
+ {
+       int i;
+       int nr_pages = 1 << order;
++
++      set_compound_page_dtor(page, free_compound_page);
++      set_compound_order(page, order);
++      __SetPageHead(page);
++      for (i = 1; i < nr_pages; i++) {
++              struct page *p = page + i;
++
++              __SetPageTail(p);
++              p->first_page = page;
++      }
++}
++
++#ifdef CONFIG_HUGETLBFS
++void prep_compound_gigantic_page(struct page *page, unsigned long order)
++{
++      int i;
++      int nr_pages = 1 << order;
+       struct page *p = page + 1;
+       set_compound_page_dtor(page, free_compound_page);
+       set_compound_order(page, order);
+       __SetPageHead(page);
+-      for (i = 1; i < nr_pages; i++, p++) {
+-              if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0))
+-                      p = pfn_to_page(page_to_pfn(page) + i);
++      for (i = 1; i < nr_pages; i++, p = mem_map_next(p, page, i)) {
+               __SetPageTail(p);
+               p->first_page = page;
+       }
+ }
++#endif
+ static void destroy_compound_page(struct page *page, unsigned long order)
+ {
+       int i;
+       int nr_pages = 1 << order;
+-      struct page *p = page + 1;
+       if (unlikely(compound_order(page) != order))
+               bad_page(page);
+@@ -293,9 +308,8 @@ static void destroy_compound_page(struct page *page, unsigned long order)
+       if (unlikely(!PageHead(page)))
+                       bad_page(page);
+       __ClearPageHead(page);
+-      for (i = 1; i < nr_pages; i++, p++) {
+-              if (unlikely((i & (MAX_ORDER_NR_PAGES - 1)) == 0))
+-                      p = pfn_to_page(page_to_pfn(page) + i);
++      for (i = 1; i < nr_pages; i++) {
++              struct page *p = page + i;
+               if (unlikely(!PageTail(p) |
+                               (p->first_page != page)))
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index 015606b..8bde9bf 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -1300,14 +1300,23 @@ static void unix_destruct_fds(struct sk_buff *skb)
+       sock_wfree(skb);
+ }
+-static void unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
++static int unix_attach_fds(struct scm_cookie *scm, struct sk_buff *skb)
+ {
+       int i;
++
++      /*
++       * Need to duplicate file references for the sake of garbage
++       * collection.  Otherwise a socket in the fps might become a
++       * candidate for GC while the skb is not yet queued.
++       */
++      UNIXCB(skb).fp = scm_fp_dup(scm->fp);
++      if (!UNIXCB(skb).fp)
++              return -ENOMEM;
++
+       for (i=scm->fp->count-1; i>=0; i--)
+               unix_inflight(scm->fp->fp[i]);
+-      UNIXCB(skb).fp = scm->fp;
+       skb->destructor = unix_destruct_fds;
+-      scm->fp = NULL;
++      return 0;
+ }
+ /*
+@@ -1366,8 +1375,11 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
+               goto out;
+       memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
+-      if (siocb->scm->fp)
+-              unix_attach_fds(siocb->scm, skb);
++      if (siocb->scm->fp) {
++              err = unix_attach_fds(siocb->scm, skb);
++              if (err)
++                      goto out_free;
++      }
+       unix_get_secdata(siocb->scm, skb);
+       skb_reset_transport_header(skb);
+@@ -1536,8 +1548,13 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
+               size = min_t(int, size, skb_tailroom(skb));
+               memcpy(UNIXCREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
+-              if (siocb->scm->fp)
+-                      unix_attach_fds(siocb->scm, skb);
++              if (siocb->scm->fp) {
++                      err = unix_attach_fds(siocb->scm, skb);
++                      if (err) {
++                              kfree_skb(skb);
++                              goto out_err;
++                      }
++              }
+               if ((err = memcpy_fromiovec(skb_put(skb,size), msg->msg_iov, size)) != 0) {
+                       kfree_skb(skb);
+diff --git a/net/unix/garbage.c b/net/unix/garbage.c
+index 2a27b84..6d4a9a8 100644
+--- a/net/unix/garbage.c
++++ b/net/unix/garbage.c
+@@ -186,8 +186,17 @@ static void scan_inflight(struct sock *x, void (*func)(struct unix_sock *),
+                                */
+                               struct sock *sk = unix_get_socket(*fp++);
+                               if (sk) {
+-                                      hit = true;
+-                                      func(unix_sk(sk));
++                                      struct unix_sock *u = unix_sk(sk);
++
++                                      /*
++                                       * Ignore non-candidates, they could
++                                       * have been added to the queues after
++                                       * starting the garbage collection
++                                       */
++                                      if (u->gc_candidate) {
++                                              hit = true;
++                                              func(u);
++                                      }
+                               }
+                       }
+                       if (hit && hitlist != NULL) {
+@@ -249,11 +258,11 @@ static void inc_inflight_move_tail(struct unix_sock *u)
+ {
+       atomic_long_inc(&u->inflight);
+       /*
+-       * If this is still a candidate, move it to the end of the
+-       * list, so that it's checked even if it was already passed
+-       * over
++       * If this still might be part of a cycle, move it to the end
++       * of the list, so that it's checked even if it was already
++       * passed over
+        */
+-      if (u->gc_candidate)
++      if (u->gc_maybe_cycle)
+               list_move_tail(&u->link, &gc_candidates);
+ }
+@@ -267,6 +276,7 @@ void unix_gc(void)
+       struct unix_sock *next;
+       struct sk_buff_head hitlist;
+       struct list_head cursor;
++      LIST_HEAD(not_cycle_list);
+       spin_lock(&unix_gc_lock);
+@@ -282,10 +292,14 @@ void unix_gc(void)
+        *
+        * Holding unix_gc_lock will protect these candidates from
+        * being detached, and hence from gaining an external
+-       * reference.  This also means, that since there are no
+-       * possible receivers, the receive queues of these sockets are
+-       * static during the GC, even though the dequeue is done
+-       * before the detach without atomicity guarantees.
++       * reference.  Since there are no possible receivers, all
++       * buffers currently on the candidates' queues stay there
++       * during the garbage collection.
++       *
++       * We also know that no new candidate can be added onto the
++       * receive queues.  Other, non candidate sockets _can_ be
++       * added to queue, so we must make sure only to touch
++       * candidates.
+        */
+       list_for_each_entry_safe(u, next, &gc_inflight_list, link) {
+               long total_refs;
+@@ -299,6 +313,7 @@ void unix_gc(void)
+               if (total_refs == inflight_refs) {
+                       list_move_tail(&u->link, &gc_candidates);
+                       u->gc_candidate = 1;
++                      u->gc_maybe_cycle = 1;
+               }
+       }
+@@ -325,14 +340,24 @@ void unix_gc(void)
+               list_move(&cursor, &u->link);
+               if (atomic_long_read(&u->inflight) > 0) {
+-                      list_move_tail(&u->link, &gc_inflight_list);
+-                      u->gc_candidate = 0;
++                      list_move_tail(&u->link, &not_cycle_list);
++                      u->gc_maybe_cycle = 0;
+                       scan_children(&u->sk, inc_inflight_move_tail, NULL);
+               }
+       }
+       list_del(&cursor);
+       /*
++       * not_cycle_list contains those sockets which do not make up a
++       * cycle.  Restore these to the inflight list.
++       */
++      while (!list_empty(&not_cycle_list)) {
++              u = list_entry(not_cycle_list.next, struct unix_sock, link);
++              u->gc_candidate = 0;
++              list_move_tail(&u->link, &gc_inflight_list);
++      }
++
++      /*
+        * Now gc_candidates contains only garbage.  Restore original
+        * inflight counters for these as well, and remove the skbuffs
+        * which are creating the cycle(s).
+diff --git a/security/keys/internal.h b/security/keys/internal.h
+index b39f5c2..239098f 100644
+--- a/security/keys/internal.h
++++ b/security/keys/internal.h
+@@ -107,6 +107,7 @@ extern key_ref_t search_process_keyrings(struct key_type *type,
+ extern struct key *find_keyring_by_name(const char *name, bool skip_perm_check);
++extern int install_user_keyrings(struct task_struct *tsk);
+ extern int install_thread_keyring(struct task_struct *tsk);
+ extern int install_process_keyring(struct task_struct *tsk);
+diff --git a/security/keys/process_keys.c b/security/keys/process_keys.c
+index 5be6d01..45b240a 100644
+--- a/security/keys/process_keys.c
++++ b/security/keys/process_keys.c
+@@ -40,7 +40,7 @@ struct key_user root_key_user = {
+ /*
+  * install user and user session keyrings for a particular UID
+  */
+-static int install_user_keyrings(struct task_struct *tsk)
++int install_user_keyrings(struct task_struct *tsk)
+ {
+       struct user_struct *user = tsk->user;
+       struct key *uid_keyring, *session_keyring;
+diff --git a/security/keys/request_key.c b/security/keys/request_key.c
+index ba32ca6..abea08f 100644
+--- a/security/keys/request_key.c
++++ b/security/keys/request_key.c
+@@ -74,6 +74,10 @@ static int call_sbin_request_key(struct key_construction *cons,
+       kenter("{%d},{%d},%s", key->serial, authkey->serial, op);
++      ret = install_user_keyrings(tsk);
++      if (ret < 0)
++              goto error_alloc;
++
+       /* allocate a new session keyring */
+       sprintf(desc, "_req.%u", key->serial);
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index f3da621..732ce13 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -67,6 +67,7 @@ enum {
+ enum {
+       STAC_92HD73XX_REF,
+       STAC_DELL_M6,
++      STAC_DELL_EQ,
+       STAC_92HD73XX_MODELS
+ };
+@@ -560,9 +561,7 @@ static struct hda_verb dell_eq_core_init[] = {
+ };
+ static struct hda_verb dell_m6_core_init[] = {
+-      /* set master volume to max value without distortion
+-       * and direct control */
+-      { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
++      { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xff},
+       /* setup audio connections */
+       { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
+       { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
+@@ -1297,11 +1296,13 @@ static unsigned int dell_m6_pin_configs[13] = {
+ static unsigned int *stac92hd73xx_brd_tbl[STAC_92HD73XX_MODELS] = {
+       [STAC_92HD73XX_REF]     = ref92hd73xx_pin_configs,
+       [STAC_DELL_M6]  = dell_m6_pin_configs,
++      [STAC_DELL_EQ]  = dell_m6_pin_configs,
+ };
+ static const char *stac92hd73xx_models[STAC_92HD73XX_MODELS] = {
+       [STAC_92HD73XX_REF] = "ref",
+       [STAC_DELL_M6] = "dell-m6",
++      [STAC_DELL_EQ] = "dell-eq",
+ };
+ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+@@ -3560,8 +3561,12 @@ again:
+       spec->gpio_data = 0x01;
+       switch (spec->board_config) {
+-      case STAC_DELL_M6:
++      case STAC_DELL_EQ:
+               spec->init = dell_eq_core_init;
++              /* fallthru */
++      case STAC_DELL_M6:
++              if (!spec->init)
++                      spec->init = dell_m6_core_init;
+               switch (codec->subsystem_id) {
+               case 0x1028025e: /* Analog Mics */
+               case 0x1028025f:
+@@ -3570,8 +3575,6 @@ again:
+                       break;
+               case 0x10280271: /* Digital Mics */
+               case 0x10280272:
+-                      spec->init = dell_m6_core_init;
+-                      /* fall-through */
+               case 0x10280254:
+               case 0x10280255:
+                       stac92xx_set_config_reg(codec, 0x13, 0x90A60160);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.6-7 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.6-7
new file mode 100644 (file)
index 0000000..a915f5c
--- /dev/null
@@ -0,0 +1,2011 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.7
+
+Upstream 2.6.27.7 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index 1ea4453..b5f52f3 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .6
++EXTRAVERSION = .7
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/arm/mm/cache-feroceon-l2.c b/arch/arm/mm/cache-feroceon-l2.c
+index 7b5a25d..4f6cf46 100644
+--- a/arch/arm/mm/cache-feroceon-l2.c
++++ b/arch/arm/mm/cache-feroceon-l2.c
+@@ -148,7 +148,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
+       /*
+        * Clean and invalidate partial last cache line.
+        */
+-      if (end & (CACHE_LINE_SIZE - 1)) {
++      if (start < end && end & (CACHE_LINE_SIZE - 1)) {
+               l2_clean_inv_pa(end & ~(CACHE_LINE_SIZE - 1));
+               end &= ~(CACHE_LINE_SIZE - 1);
+       }
+@@ -156,7 +156,7 @@ static void feroceon_l2_inv_range(unsigned long start, unsigned long end)
+       /*
+        * Invalidate all full cache lines between 'start' and 'end'.
+        */
+-      while (start != end) {
++      while (start < end) {
+               unsigned long range_end = calc_range_end(start, end);
+               l2_inv_pa_range(start, range_end - CACHE_LINE_SIZE);
+               start = range_end;
+diff --git a/arch/m68k/kernel/ints.c b/arch/m68k/kernel/ints.c
+index ded7dd2..c4460bf 100644
+--- a/arch/m68k/kernel/ints.c
++++ b/arch/m68k/kernel/ints.c
+@@ -133,7 +133,7 @@ void __init m68k_setup_user_interrupt(unsigned int vec, unsigned int cnt,
+ {
+       int i;
+-      BUG_ON(IRQ_USER + cnt >= NR_IRQS);
++      BUG_ON(IRQ_USER + cnt > NR_IRQS);
+       m68k_first_user_vec = vec;
+       for (i = 0; i < cnt; i++)
+               irq_controller[IRQ_USER + i] = &user_irq_controller;
+diff --git a/arch/powerpc/include/asm/mpic.h b/arch/powerpc/include/asm/mpic.h
+index fe566a3..eb685ed 100644
+--- a/arch/powerpc/include/asm/mpic.h
++++ b/arch/powerpc/include/asm/mpic.h
+@@ -355,6 +355,8 @@ struct mpic
+ #define MPIC_NO_BIAS                  0x00000400
+ /* Ignore NIRQS as reported by FRR */
+ #define MPIC_BROKEN_FRR_NIRQS         0x00000800
++/* Destination only supports a single CPU at a time */
++#define MPIC_SINGLE_DEST_CPU          0x00001000
+ /* MPIC HW modification ID */
+ #define MPIC_REGSET_MASK              0xf0000000
+diff --git a/arch/powerpc/platforms/85xx/mpc85xx_ds.c b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
+index 483b65c..613bf8c 100644
+--- a/arch/powerpc/platforms/85xx/mpc85xx_ds.c
++++ b/arch/powerpc/platforms/85xx/mpc85xx_ds.c
+@@ -78,7 +78,8 @@ void __init mpc85xx_ds_pic_init(void)
+       mpic = mpic_alloc(np, r.start,
+                         MPIC_PRIMARY | MPIC_WANTS_RESET |
+-                        MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS,
++                        MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
++                        MPIC_SINGLE_DEST_CPU,
+                       0, 256, " OpenPIC  ");
+       BUG_ON(mpic == NULL);
+       of_node_put(np);
+diff --git a/arch/powerpc/platforms/86xx/pic.c b/arch/powerpc/platforms/86xx/pic.c
+index 8881c5d..668275d 100644
+--- a/arch/powerpc/platforms/86xx/pic.c
++++ b/arch/powerpc/platforms/86xx/pic.c
+@@ -44,7 +44,8 @@ void __init mpc86xx_init_irq(void)
+       mpic = mpic_alloc(np, res.start,
+                       MPIC_PRIMARY | MPIC_WANTS_RESET |
+-                      MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS,
++                      MPIC_BIG_ENDIAN | MPIC_BROKEN_FRR_NIRQS |
++                      MPIC_SINGLE_DEST_CPU,
+                       0, 256, " MPIC     ");
+       of_node_put(np);
+       BUG_ON(mpic == NULL);
+diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
+index 8e3478c..f6299cc 100644
+--- a/arch/powerpc/sysdev/mpic.c
++++ b/arch/powerpc/sysdev/mpic.c
+@@ -563,6 +563,51 @@ static void __init mpic_scan_ht_pics(struct mpic *mpic)
+ #endif /* CONFIG_MPIC_U3_HT_IRQS */
++#ifdef CONFIG_SMP
++static int irq_choose_cpu(unsigned int virt_irq)
++{
++      cpumask_t mask = irq_desc[virt_irq].affinity;
++      int cpuid;
++
++      if (cpus_equal(mask, CPU_MASK_ALL)) {
++              static int irq_rover;
++              static DEFINE_SPINLOCK(irq_rover_lock);
++              unsigned long flags;
++
++              /* Round-robin distribution... */
++      do_round_robin:
++              spin_lock_irqsave(&irq_rover_lock, flags);
++
++              while (!cpu_online(irq_rover)) {
++                      if (++irq_rover >= NR_CPUS)
++                              irq_rover = 0;
++              }
++              cpuid = irq_rover;
++              do {
++                      if (++irq_rover >= NR_CPUS)
++                              irq_rover = 0;
++              } while (!cpu_online(irq_rover));
++
++              spin_unlock_irqrestore(&irq_rover_lock, flags);
++      } else {
++              cpumask_t tmp;
++
++              cpus_and(tmp, cpu_online_map, mask);
++
++              if (cpus_empty(tmp))
++                      goto do_round_robin;
++
++              cpuid = first_cpu(tmp);
++      }
++
++      return cpuid;
++}
++#else
++static int irq_choose_cpu(unsigned int virt_irq)
++{
++      return hard_smp_processor_id();
++}
++#endif
+ #define mpic_irq_to_hw(virq)  ((unsigned int)irq_map[virq].hwirq)
+@@ -777,12 +822,18 @@ void mpic_set_affinity(unsigned int irq, cpumask_t cpumask)
+       struct mpic *mpic = mpic_from_irq(irq);
+       unsigned int src = mpic_irq_to_hw(irq);
+-      cpumask_t tmp;
++      if (mpic->flags & MPIC_SINGLE_DEST_CPU) {
++              int cpuid = irq_choose_cpu(irq);
+-      cpus_and(tmp, cpumask, cpu_online_map);
++              mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION), 1 << cpuid);
++      } else {
++              cpumask_t tmp;
+-      mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION),
+-                     mpic_physmask(cpus_addr(tmp)[0]));       
++              cpus_and(tmp, cpumask, cpu_online_map);
++
++              mpic_irq_write(src, MPIC_INFO(IRQ_DESTINATION),
++                             mpic_physmask(cpus_addr(tmp)[0]));
++      }
+ }
+ static unsigned int mpic_type_to_vecpri(struct mpic *mpic, unsigned int type)
+diff --git a/arch/s390/kernel/topology.c b/arch/s390/kernel/topology.c
+index 632b13e..a947899 100644
+--- a/arch/s390/kernel/topology.c
++++ b/arch/s390/kernel/topology.c
+@@ -65,18 +65,21 @@ static int machine_has_topology_irq;
+ static struct timer_list topology_timer;
+ static void set_topology_timer(void);
+ static DECLARE_WORK(topology_work, topology_work_fn);
++/* topology_lock protects the core linked list */
++static DEFINE_SPINLOCK(topology_lock);
+ cpumask_t cpu_core_map[NR_CPUS];
+ cpumask_t cpu_coregroup_map(unsigned int cpu)
+ {
+       struct core_info *core = &core_info;
++      unsigned long flags;
+       cpumask_t mask;
+       cpus_clear(mask);
+       if (!machine_has_topology)
+               return cpu_present_map;
+-      mutex_lock(&smp_cpu_state_mutex);
++      spin_lock_irqsave(&topology_lock, flags);
+       while (core) {
+               if (cpu_isset(cpu, core->mask)) {
+                       mask = core->mask;
+@@ -84,7 +87,7 @@ cpumask_t cpu_coregroup_map(unsigned int cpu)
+               }
+               core = core->next;
+       }
+-      mutex_unlock(&smp_cpu_state_mutex);
++      spin_unlock_irqrestore(&topology_lock, flags);
+       if (cpus_empty(mask))
+               mask = cpumask_of_cpu(cpu);
+       return mask;
+@@ -133,7 +136,7 @@ static void tl_to_cores(struct tl_info *info)
+       union tl_entry *tle, *end;
+       struct core_info *core = &core_info;
+-      mutex_lock(&smp_cpu_state_mutex);
++      spin_lock_irq(&topology_lock);
+       clear_cores();
+       tle = info->tle;
+       end = (union tl_entry *)((unsigned long)info + info->length);
+@@ -157,7 +160,7 @@ static void tl_to_cores(struct tl_info *info)
+               }
+               tle = next_tle(tle);
+       }
+-      mutex_unlock(&smp_cpu_state_mutex);
++      spin_unlock_irq(&topology_lock);
+ }
+ static void topology_update_polarization_simple(void)
+diff --git a/block/blk-merge.c b/block/blk-merge.c
+index 5efc9e7..857dce7 100644
+--- a/block/blk-merge.c
++++ b/block/blk-merge.c
+@@ -95,6 +95,9 @@ new_hw_segment:
+                       nr_hw_segs++;
+               }
++              if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
++                      rq->bio->bi_seg_front_size = seg_size;
++
+               nr_phys_segs++;
+               bvprv = bv;
+               seg_size = bv->bv_len;
+@@ -106,6 +109,10 @@ new_hw_segment:
+               rq->bio->bi_hw_front_size = hw_seg_size;
+       if (hw_seg_size > rq->biotail->bi_hw_back_size)
+               rq->biotail->bi_hw_back_size = hw_seg_size;
++      if (nr_phys_segs == 1 && seg_size > rq->bio->bi_seg_front_size)
++              rq->bio->bi_seg_front_size = seg_size;
++      if (seg_size > rq->biotail->bi_seg_back_size)
++              rq->biotail->bi_seg_back_size = seg_size;
+       rq->nr_phys_segments = nr_phys_segs;
+       rq->nr_hw_segments = nr_hw_segs;
+ }
+@@ -133,7 +140,8 @@ static int blk_phys_contig_segment(struct request_queue *q, struct bio *bio,
+       if (!BIOVEC_PHYS_MERGEABLE(__BVEC_END(bio), __BVEC_START(nxt)))
+               return 0;
+-      if (bio->bi_size + nxt->bi_size > q->max_segment_size)
++      if (bio->bi_seg_back_size + nxt->bi_seg_front_size >
++          q->max_segment_size)
+               return 0;
+       /*
+@@ -377,6 +385,8 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
+ {
+       int total_phys_segments;
+       int total_hw_segments;
++      unsigned int seg_size =
++              req->biotail->bi_seg_back_size + next->bio->bi_seg_front_size;
+       /*
+        * First check if the either of the requests are re-queued
+@@ -392,8 +402,13 @@ static int ll_merge_requests_fn(struct request_queue *q, struct request *req,
+               return 0;
+       total_phys_segments = req->nr_phys_segments + next->nr_phys_segments;
+-      if (blk_phys_contig_segment(q, req->biotail, next->bio))
++      if (blk_phys_contig_segment(q, req->biotail, next->bio)) {
++              if (req->nr_phys_segments == 1)
++                      req->bio->bi_seg_front_size = seg_size;
++              if (next->nr_phys_segments == 1)
++                      next->biotail->bi_seg_back_size = seg_size;
+               total_phys_segments--;
++      }
+       if (total_phys_segments > q->max_phys_segments)
+               return 0;
+diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
+index ccae305..c54f38e 100644
+--- a/drivers/acpi/bus.c
++++ b/drivers/acpi/bus.c
+@@ -95,21 +95,21 @@ int acpi_bus_get_status(struct acpi_device *device)
+       }
+       /*
+-       * Otherwise we assume the status of our parent (unless we don't
+-       * have one, in which case status is implied).
++       * According to ACPI spec some device can be present and functional
++       * even if the parent is not present but functional.
++       * In such conditions the child device should not inherit the status
++       * from the parent.
+        */
+-      else if (device->parent)
+-              device->status = device->parent->status;
+       else
+               STRUCT_TO_INT(device->status) =
+                   ACPI_STA_DEVICE_PRESENT | ACPI_STA_DEVICE_ENABLED |
+                   ACPI_STA_DEVICE_UI      | ACPI_STA_DEVICE_FUNCTIONING;
+       if (device->status.functional && !device->status.present) {
+-              printk(KERN_WARNING PREFIX "Device [%s] status [%08x]: "
+-                     "functional but not present; setting present\n",
+-                     device->pnp.bus_id, (u32) STRUCT_TO_INT(device->status));
+-              device->status.present = 1;
++              ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]: "
++                     "functional but not present;\n",
++                      device->pnp.bus_id,
++                      (u32) STRUCT_TO_INT(device->status)));
+       }
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Device [%s] status [%08x]\n",
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 444cd9e..41b8e7c 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -70,7 +70,7 @@ enum ec_command {
+ #define ACPI_EC_UDELAY_GLK    1000    /* Wait 1ms max. to get global lock */
+ #define ACPI_EC_UDELAY                100     /* Wait 100us before polling EC again */
+-#define ACPI_EC_STORM_THRESHOLD 20    /* number of false interrupts
++#define ACPI_EC_STORM_THRESHOLD 8     /* number of false interrupts
+                                          per one transaction */
+ enum {
+@@ -100,8 +100,11 @@ struct transaction {
+       u8 *rdata;
+       unsigned short irq_count;
+       u8 command;
++      u8 wi;
++      u8 ri;
+       u8 wlen;
+       u8 rlen;
++      bool done;
+ };
+ static struct acpi_ec {
+@@ -178,34 +181,45 @@ static int ec_transaction_done(struct acpi_ec *ec)
+       unsigned long flags;
+       int ret = 0;
+       spin_lock_irqsave(&ec->curr_lock, flags);
+-      if (!ec->curr || (!ec->curr->wlen && !ec->curr->rlen))
++      if (!ec->curr || ec->curr->done)
+               ret = 1;
+       spin_unlock_irqrestore(&ec->curr_lock, flags);
+       return ret;
+ }
++static void start_transaction(struct acpi_ec *ec)
++{
++      ec->curr->irq_count = ec->curr->wi = ec->curr->ri = 0;
++      ec->curr->done = false;
++      acpi_ec_write_cmd(ec, ec->curr->command);
++}
++
+ static void gpe_transaction(struct acpi_ec *ec, u8 status)
+ {
+       unsigned long flags;
+       spin_lock_irqsave(&ec->curr_lock, flags);
+       if (!ec->curr)
+               goto unlock;
+-      if (ec->curr->wlen > 0) {
+-              if ((status & ACPI_EC_FLAG_IBF) == 0) {
+-                      acpi_ec_write_data(ec, *(ec->curr->wdata++));
+-                      --ec->curr->wlen;
+-              } else
+-                      /* false interrupt, state didn't change */
+-                      ++ec->curr->irq_count;
+-
+-      } else if (ec->curr->rlen > 0) {
++      if (ec->curr->wlen > ec->curr->wi) {
++              if ((status & ACPI_EC_FLAG_IBF) == 0)
++                      acpi_ec_write_data(ec,
++                              ec->curr->wdata[ec->curr->wi++]);
++              else
++                      goto err;
++      } else if (ec->curr->rlen > ec->curr->ri) {
+               if ((status & ACPI_EC_FLAG_OBF) == 1) {
+-                      *(ec->curr->rdata++) = acpi_ec_read_data(ec);
+-                      --ec->curr->rlen;
++                      ec->curr->rdata[ec->curr->ri++] = acpi_ec_read_data(ec);
++                      if (ec->curr->rlen == ec->curr->ri)
++                              ec->curr->done = true;
+               } else
+-                      /* false interrupt, state didn't change */
+-                      ++ec->curr->irq_count;
+-      }
++                      goto err;
++      } else if (ec->curr->wlen == ec->curr->wi &&
++                 (status & ACPI_EC_FLAG_IBF) == 0)
++              ec->curr->done = true;
++      goto unlock;
++err:
++      /* false interrupt, state didn't change */
++      ++ec->curr->irq_count;
+ unlock:
+       spin_unlock_irqrestore(&ec->curr_lock, flags);
+ }
+@@ -215,6 +229,15 @@ static int acpi_ec_wait(struct acpi_ec *ec)
+       if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
+                              msecs_to_jiffies(ACPI_EC_DELAY)))
+               return 0;
++      /* try restart command if we get any false interrupts */
++      if (ec->curr->irq_count &&
++          (acpi_ec_read_status(ec) & ACPI_EC_FLAG_IBF) == 0) {
++              pr_debug(PREFIX "controller reset, restart transaction\n");
++              start_transaction(ec);
++              if (wait_event_timeout(ec->wait, ec_transaction_done(ec),
++                                      msecs_to_jiffies(ACPI_EC_DELAY)))
++                      return 0;
++      }
+       /* missing GPEs, switch back to poll mode */
+       if (printk_ratelimit())
+               pr_info(PREFIX "missing confirmations, "
+@@ -239,10 +262,10 @@ static int ec_check_sci(struct acpi_ec *ec, u8 state)
+ static int ec_poll(struct acpi_ec *ec)
+ {
+       unsigned long delay = jiffies + msecs_to_jiffies(ACPI_EC_DELAY);
+-      msleep(1);
++      udelay(ACPI_EC_UDELAY);
+       while (time_before(jiffies, delay)) {
+               gpe_transaction(ec, acpi_ec_read_status(ec));
+-              msleep(1);
++              udelay(ACPI_EC_UDELAY);
+               if (ec_transaction_done(ec))
+                       return 0;
+       }
+@@ -264,9 +287,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
+       /* start transaction */
+       spin_lock_irqsave(&ec->curr_lock, tmp);
+       /* following two actions should be kept atomic */
+-      t->irq_count = 0;
+       ec->curr = t;
+-      acpi_ec_write_cmd(ec, ec->curr->command);
++      start_transaction(ec);
+       if (ec->curr->command == ACPI_EC_COMMAND_QUERY)
+               clear_bit(EC_FLAGS_QUERY_PENDING, &ec->flags);
+       spin_unlock_irqrestore(&ec->curr_lock, tmp);
+@@ -286,7 +308,8 @@ static int acpi_ec_transaction_unlocked(struct acpi_ec *ec,
+               acpi_enable_gpe(NULL, ec->gpe, ACPI_NOT_ISR);
+       } else if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
+                  t->irq_count > ACPI_EC_STORM_THRESHOLD) {
+-              pr_debug(PREFIX "GPE storm detected\n");
++              pr_info(PREFIX "GPE storm detected, "
++                      "transactions will use polling mode\n");
+               set_bit(EC_FLAGS_GPE_STORM, &ec->flags);
+       }
+       return ret;
+@@ -558,17 +581,26 @@ static u32 acpi_ec_gpe_handler(void *data)
+       pr_debug(PREFIX "~~~> interrupt\n");
+       status = acpi_ec_read_status(ec);
+-      gpe_transaction(ec, status);
+-      if (ec_transaction_done(ec) && (status & ACPI_EC_FLAG_IBF) == 0)
+-              wake_up(&ec->wait);
++      if (test_bit(EC_FLAGS_GPE_MODE, &ec->flags)) {
++              gpe_transaction(ec, status);
++              if (ec_transaction_done(ec) &&
++                  (status & ACPI_EC_FLAG_IBF) == 0)
++                      wake_up(&ec->wait);
++      }
+       ec_check_sci(ec, status);
+       if (!test_bit(EC_FLAGS_GPE_MODE, &ec->flags) &&
+           !test_bit(EC_FLAGS_NO_GPE, &ec->flags)) {
+               /* this is non-query, must be confirmation */
+-              if (printk_ratelimit())
+-                      pr_info(PREFIX "non-query interrupt received,"
++              if (!test_bit(EC_FLAGS_GPE_STORM, &ec->flags)) {
++                      if (printk_ratelimit())
++                              pr_info(PREFIX "non-query interrupt received,"
++                                      " switching to interrupt mode\n");
++              } else {
++                      /* hush, STORM switches the mode every transaction */
++                      pr_debug(PREFIX "non-query interrupt received,"
+                               " switching to interrupt mode\n");
++              }
+               set_bit(EC_FLAGS_GPE_MODE, &ec->flags);
+       }
+       return ACPI_INTERRUPT_HANDLED;
+diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
+index f6f52c1..0450761 100644
+--- a/drivers/acpi/scan.c
++++ b/drivers/acpi/scan.c
+@@ -276,6 +276,13 @@ int acpi_match_device_ids(struct acpi_device *device,
+ {
+       const struct acpi_device_id *id;
++      /*
++       * If the device is not present, it is unnecessary to load device
++       * driver for it.
++       */
++      if (!device->status.present)
++              return -ENODEV;
++
+       if (device->flags.hardware_id) {
+               for (id = ids; id->id[0]; id++) {
+                       if (!strcmp((char*)id->id, device->pnp.hardware_id))
+@@ -1221,15 +1228,18 @@ acpi_add_single_object(struct acpi_device **child,
+                       result = -ENODEV;
+                       goto end;
+               }
+-              if (!device->status.present) {
+-                      /* Bay and dock should be handled even if absent */
+-                      if (!ACPI_SUCCESS(
+-                           acpi_is_child_device(device, acpi_bay_match)) &&
+-                          !ACPI_SUCCESS(
+-                           acpi_is_child_device(device, acpi_dock_match))) {
+-                                      result = -ENODEV;
+-                                      goto end;
+-                      }
++              /*
++               * When the device is neither present nor functional, the
++               * device should not be added to Linux ACPI device tree.
++               * When the status of the device is not present but functinal,
++               * it should be added to Linux ACPI tree. For example : bay
++               * device , dock device.
++               * In such conditions it is unncessary to check whether it is
++               * bay device or dock device.
++               */
++              if (!device->status.present && !device->status.functional) {
++                      result = -ENODEV;
++                      goto end;
+               }
+               break;
+       default:
+@@ -1402,7 +1412,12 @@ static int acpi_bus_scan(struct acpi_device *start, struct acpi_bus_ops *ops)
+                * TBD: Need notifications and other detection mechanisms
+                *      in place before we can fully implement this.
+                */
+-              if (child->status.present) {
++               /*
++               * When the device is not present but functional, it is also
++               * necessary to scan the children of this device.
++               */
++              if (child->status.present || (!child->status.present &&
++                                      child->status.functional)) {
+                       status = acpi_get_next_object(ACPI_TYPE_ANY, chandle,
+                                                     NULL, NULL);
+                       if (ACPI_SUCCESS(status)) {
+diff --git a/drivers/acpi/system.c b/drivers/acpi/system.c
+index 91dec44..4745792 100644
+--- a/drivers/acpi/system.c
++++ b/drivers/acpi/system.c
+@@ -78,9 +78,15 @@ static ssize_t acpi_table_show(struct kobject *kobj,
+           container_of(bin_attr, struct acpi_table_attr, attr);
+       struct acpi_table_header *table_header = NULL;
+       acpi_status status;
++      char name[ACPI_NAME_SIZE];
++
++      if (strncmp(table_attr->name, "NULL", 4))
++              memcpy(name, table_attr->name, ACPI_NAME_SIZE);
++      else
++              memcpy(name, "\0\0\0\0", 4);
+       status =
+-          acpi_get_table(table_attr->name, table_attr->instance,
++          acpi_get_table(name, table_attr->instance,
+                          &table_header);
+       if (ACPI_FAILURE(status))
+               return -ENODEV;
+@@ -95,21 +101,24 @@ static void acpi_table_attr_init(struct acpi_table_attr *table_attr,
+       struct acpi_table_header *header = NULL;
+       struct acpi_table_attr *attr = NULL;
+-      memcpy(table_attr->name, table_header->signature, ACPI_NAME_SIZE);
++      if (table_header->signature[0] != '\0')
++              memcpy(table_attr->name, table_header->signature,
++                      ACPI_NAME_SIZE);
++      else
++              memcpy(table_attr->name, "NULL", 4);
+       list_for_each_entry(attr, &acpi_table_attr_list, node) {
+-              if (!memcmp(table_header->signature, attr->name,
+-                          ACPI_NAME_SIZE))
++              if (!memcmp(table_attr->name, attr->name, ACPI_NAME_SIZE))
+                       if (table_attr->instance < attr->instance)
+                               table_attr->instance = attr->instance;
+       }
+       table_attr->instance++;
+       if (table_attr->instance > 1 || (table_attr->instance == 1 &&
+-                                       !acpi_get_table(table_header->
+-                                                       signature, 2,
+-                                                       &header)))
+-              sprintf(table_attr->name + 4, "%d", table_attr->instance);
++                                      !acpi_get_table
++                                      (table_header->signature, 2, &header)))
++              sprintf(table_attr->name + ACPI_NAME_SIZE, "%d",
++                      table_attr->instance);
+       table_attr->attr.size = 0;
+       table_attr->attr.read = acpi_table_show;
+diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
+index 8a59aaa..7a88dfd 100644
+--- a/drivers/char/ipmi/ipmi_msghandler.c
++++ b/drivers/char/ipmi/ipmi_msghandler.c
+@@ -422,9 +422,11 @@ struct ipmi_smi {
+ /**
+  * The driver model view of the IPMI messaging driver.
+  */
+-static struct device_driver ipmidriver = {
+-      .name = "ipmi",
+-      .bus = &platform_bus_type
++static struct platform_driver ipmidriver = {
++      .driver = {
++              .name = "ipmi",
++              .bus = &platform_bus_type
++      }
+ };
+ static DEFINE_MUTEX(ipmidriver_mutex);
+@@ -2384,9 +2386,9 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum,
+        * representing the interfaced BMC already
+        */
+       if (bmc->guid_set)
+-              old_bmc = ipmi_find_bmc_guid(&ipmidriver, bmc->guid);
++              old_bmc = ipmi_find_bmc_guid(&ipmidriver.driver, bmc->guid);
+       else
+-              old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver,
++              old_bmc = ipmi_find_bmc_prod_dev_id(&ipmidriver.driver,
+                                                   bmc->id.product_id,
+                                                   bmc->id.device_id);
+@@ -2416,7 +2418,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum,
+               snprintf(name, sizeof(name),
+                        "ipmi_bmc.%4.4x", bmc->id.product_id);
+-              while (ipmi_find_bmc_prod_dev_id(&ipmidriver,
++              while (ipmi_find_bmc_prod_dev_id(&ipmidriver.driver,
+                                                bmc->id.product_id,
+                                                bmc->id.device_id)) {
+                       if (!warn_printed) {
+@@ -2446,7 +2448,7 @@ static int ipmi_bmc_register(ipmi_smi_t intf, int ifnum,
+                              " Unable to allocate platform device\n");
+                       return -ENOMEM;
+               }
+-              bmc->dev->dev.driver = &ipmidriver;
++              bmc->dev->dev.driver = &ipmidriver.driver;
+               dev_set_drvdata(&bmc->dev->dev, bmc);
+               kref_init(&bmc->refcount);
+@@ -4247,7 +4249,7 @@ static int ipmi_init_msghandler(void)
+       if (initialized)
+               return 0;
+-      rv = driver_register(&ipmidriver);
++      rv = driver_register(&ipmidriver.driver);
+       if (rv) {
+               printk(KERN_ERR PFX "Could not register IPMI driver\n");
+               return rv;
+@@ -4308,7 +4310,7 @@ static __exit void cleanup_ipmi(void)
+       remove_proc_entry(proc_ipmi_root->name, NULL);
+ #endif /* CONFIG_PROC_FS */
+-      driver_unregister(&ipmidriver);
++      driver_unregister(&ipmidriver.driver);
+       initialized = 0;
+diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
+index 8e8afb6..7e860da 100644
+--- a/drivers/char/ipmi/ipmi_si_intf.c
++++ b/drivers/char/ipmi/ipmi_si_intf.c
+@@ -114,9 +114,11 @@ static char *si_to_str[] = { "kcs", "smic", "bt" };
+ #define DEVICE_NAME "ipmi_si"
+-static struct device_driver ipmi_driver = {
+-      .name = DEVICE_NAME,
+-      .bus = &platform_bus_type
++static struct platform_driver ipmi_driver = {
++      .driver = {
++              .name = DEVICE_NAME,
++              .bus = &platform_bus_type
++      }
+ };
+@@ -2868,7 +2870,7 @@ static int try_smi_init(struct smi_info *new_smi)
+                       goto out_err;
+               }
+               new_smi->dev = &new_smi->pdev->dev;
+-              new_smi->dev->driver = &ipmi_driver;
++              new_smi->dev->driver = &ipmi_driver.driver;
+               rv = platform_device_add(new_smi->pdev);
+               if (rv) {
+@@ -2983,7 +2985,7 @@ static __devinit int init_ipmi_si(void)
+       initialized = 1;
+       /* Register the device drivers. */
+-      rv = driver_register(&ipmi_driver);
++      rv = driver_register(&ipmi_driver.driver);
+       if (rv) {
+               printk(KERN_ERR
+                      "init_ipmi_si: Unable to register driver: %d\n",
+@@ -3052,7 +3054,7 @@ static __devinit int init_ipmi_si(void)
+ #ifdef CONFIG_PPC_OF
+               of_unregister_platform_driver(&ipmi_of_platform_driver);
+ #endif
+-              driver_unregister(&ipmi_driver);
++              driver_unregister(&ipmi_driver.driver);
+               printk(KERN_WARNING
+                      "ipmi_si: Unable to find any System Interface(s)\n");
+               return -ENODEV;
+@@ -3151,7 +3153,7 @@ static __exit void cleanup_ipmi_si(void)
+               cleanup_one_si(e);
+       mutex_unlock(&smi_infos_lock);
+-      driver_unregister(&ipmi_driver);
++      driver_unregister(&ipmi_driver.driver);
+ }
+ module_exit(cleanup_ipmi_si);
+diff --git a/drivers/hwmon/ibmaem.c b/drivers/hwmon/ibmaem.c
+index 0f70dc2..7e909e8 100644
+--- a/drivers/hwmon/ibmaem.c
++++ b/drivers/hwmon/ibmaem.c
+@@ -88,9 +88,11 @@
+ static DEFINE_IDR(aem_idr);
+ static DEFINE_SPINLOCK(aem_idr_lock);
+-static struct device_driver aem_driver = {
+-      .name = DRVNAME,
+-      .bus = &platform_bus_type,
++static struct platform_driver aem_driver = {
++      .driver = {
++              .name = DRVNAME,
++              .bus = &platform_bus_type,
++      }
+ };
+ struct aem_ipmi_data {
+@@ -583,7 +585,7 @@ static int aem_init_aem1_inst(struct aem_ipmi_data *probe, u8 module_handle)
+       data->pdev = platform_device_alloc(DRVNAME, data->id);
+       if (!data->pdev)
+               goto dev_err;
+-      data->pdev->dev.driver = &aem_driver;
++      data->pdev->dev.driver = &aem_driver.driver;
+       res = platform_device_add(data->pdev);
+       if (res)
+@@ -716,7 +718,7 @@ static int aem_init_aem2_inst(struct aem_ipmi_data *probe,
+       data->pdev = platform_device_alloc(DRVNAME, data->id);
+       if (!data->pdev)
+               goto dev_err;
+-      data->pdev->dev.driver = &aem_driver;
++      data->pdev->dev.driver = &aem_driver.driver;
+       res = platform_device_add(data->pdev);
+       if (res)
+@@ -1085,7 +1087,7 @@ static int __init aem_init(void)
+ {
+       int res;
+-      res = driver_register(&aem_driver);
++      res = driver_register(&aem_driver.driver);
+       if (res) {
+               printk(KERN_ERR "Can't register aem driver\n");
+               return res;
+@@ -1097,7 +1099,7 @@ static int __init aem_init(void)
+       return 0;
+ ipmi_reg_err:
+-      driver_unregister(&aem_driver);
++      driver_unregister(&aem_driver.driver);
+       return res;
+ }
+@@ -1107,7 +1109,7 @@ static void __exit aem_exit(void)
+       struct aem_data *p1, *next1;
+       ipmi_smi_watcher_unregister(&driver_data.bmc_events);
+-      driver_unregister(&aem_driver);
++      driver_unregister(&aem_driver.driver);
+       list_for_each_entry_safe(p1, next1, &driver_data.aem_devices, list)
+               aem_delete(p1);
+ }
+diff --git a/drivers/input/mouse/alps.c b/drivers/input/mouse/alps.c
+index 385e32b..cbedf95 100644
+--- a/drivers/input/mouse/alps.c
++++ b/drivers/input/mouse/alps.c
+@@ -54,6 +54,7 @@ static const struct alps_model_info alps_model_data[] = {
+       { { 0x20, 0x02, 0x0e }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT }, /* XXX */
+       { { 0x22, 0x02, 0x0a }, 0xf8, 0xf8, ALPS_PASS | ALPS_DUALPOINT },
+       { { 0x22, 0x02, 0x14 }, 0xff, 0xff, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude D600 */
++      { { 0x62, 0x02, 0x14 }, 0xcf, 0xcf, ALPS_PASS | ALPS_DUALPOINT }, /* Dell Latitude E6500 */
+       { { 0x73, 0x02, 0x50 }, 0xcf, 0xcf, ALPS_FW_BK_1 } /* Dell Vostro 1400 */
+ };
+diff --git a/drivers/md/dm-raid1.c b/drivers/md/dm-raid1.c
+index ff05fe8..97ef945 100644
+--- a/drivers/md/dm-raid1.c
++++ b/drivers/md/dm-raid1.c
+@@ -1598,6 +1598,7 @@ static void mirror_dtr(struct dm_target *ti)
+       del_timer_sync(&ms->timer);
+       flush_workqueue(ms->kmirrord_wq);
++      flush_scheduled_work();
+       dm_kcopyd_client_destroy(ms->kcopyd_client);
+       destroy_workqueue(ms->kmirrord_wq);
+       free_context(ms, ti, ms->nr_mirrors);
+diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
+index b59e472..d74df58 100644
+--- a/drivers/media/video/tvaudio.c
++++ b/drivers/media/video/tvaudio.c
+@@ -1576,13 +1576,13 @@ static int tvaudio_get_ctrl(struct CHIPSTATE *chip,
+               return 0;
+       }
+       case V4L2_CID_AUDIO_BASS:
+-              if (desc->flags & CHIP_HAS_BASSTREBLE)
++              if (!(desc->flags & CHIP_HAS_BASSTREBLE))
+                       break;
+               ctrl->value = chip->bass;
+               return 0;
+       case V4L2_CID_AUDIO_TREBLE:
+-              if (desc->flags & CHIP_HAS_BASSTREBLE)
+-                      return -EINVAL;
++              if (!(desc->flags & CHIP_HAS_BASSTREBLE))
++                      break;
+               ctrl->value = chip->treble;
+               return 0;
+       }
+@@ -1642,16 +1642,15 @@ static int tvaudio_set_ctrl(struct CHIPSTATE *chip,
+               return 0;
+       }
+       case V4L2_CID_AUDIO_BASS:
+-              if (desc->flags & CHIP_HAS_BASSTREBLE)
++              if (!(desc->flags & CHIP_HAS_BASSTREBLE))
+                       break;
+               chip->bass = ctrl->value;
+               chip_write(chip,desc->bassreg,desc->bassfunc(chip->bass));
+               return 0;
+       case V4L2_CID_AUDIO_TREBLE:
+-              if (desc->flags & CHIP_HAS_BASSTREBLE)
+-                      return -EINVAL;
+-
++              if (!(desc->flags & CHIP_HAS_BASSTREBLE))
++                      break;
+               chip->treble = ctrl->value;
+               chip_write(chip,desc->treblereg,desc->treblefunc(chip->treble));
+@@ -1695,7 +1694,7 @@ static int chip_command(struct i2c_client *client,
+                               break;
+                       case V4L2_CID_AUDIO_BASS:
+                       case V4L2_CID_AUDIO_TREBLE:
+-                              if (desc->flags & CHIP_HAS_BASSTREBLE)
++                              if (!(desc->flags & CHIP_HAS_BASSTREBLE))
+                                       return -EINVAL;
+                               break;
+                       default:
+diff --git a/drivers/misc/sony-laptop.c b/drivers/misc/sony-laptop.c
+index 60775be..b35eb92 100644
+--- a/drivers/misc/sony-laptop.c
++++ b/drivers/misc/sony-laptop.c
+@@ -2315,8 +2315,10 @@ end:
+  */
+ static int sony_pic_disable(struct acpi_device *device)
+ {
+-      if (ACPI_FAILURE(acpi_evaluate_object(device->handle,
+-                      "_DIS", NULL, NULL)))
++      acpi_status ret = acpi_evaluate_object(device->handle, "_DIS", NULL,
++                                             NULL);
++
++      if (ACPI_FAILURE(ret) && ret != AE_NOT_FOUND)
+               return -ENXIO;
+       dprintk("Device disabled\n");
+diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
+index 4a11296..60a0453 100644
+--- a/drivers/net/Kconfig
++++ b/drivers/net/Kconfig
+@@ -2046,6 +2046,7 @@ config R8169
+       tristate "Realtek 8169 gigabit ethernet support"
+       depends on PCI
+       select CRC32
++      select MII
+       ---help---
+         Say Y here if you have a Realtek 8169 PCI Gigabit Ethernet adapter.
+diff --git a/drivers/net/bnx2x_init.h b/drivers/net/bnx2x_init.h
+index 130927c..a6c0b3a 100644
+--- a/drivers/net/bnx2x_init.h
++++ b/drivers/net/bnx2x_init.h
+@@ -564,14 +564,15 @@ static const struct arb_line write_arb_addr[NUM_WR_Q-1] = {
+ static void bnx2x_init_pxp(struct bnx2x *bp)
+ {
++      u16 devctl;
+       int r_order, w_order;
+       u32 val, i;
+       pci_read_config_word(bp->pdev,
+-                           bp->pcie_cap + PCI_EXP_DEVCTL, (u16 *)&val);
+-      DP(NETIF_MSG_HW, "read 0x%x from devctl\n", (u16)val);
+-      w_order = ((val & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
+-      r_order = ((val & PCI_EXP_DEVCTL_READRQ) >> 12);
++                           bp->pcie_cap + PCI_EXP_DEVCTL, &devctl);
++      DP(NETIF_MSG_HW, "read 0x%x from devctl\n", devctl);
++      w_order = ((devctl & PCI_EXP_DEVCTL_PAYLOAD) >> 5);
++      r_order = ((devctl & PCI_EXP_DEVCTL_READRQ) >> 12);
+       if (r_order > MAX_RD_ORD) {
+               DP(NETIF_MSG_HW, "read order of %d  order adjusted to %d\n",
+diff --git a/drivers/net/bnx2x_main.c b/drivers/net/bnx2x_main.c
+index a8eb3c4..53459db 100644
+--- a/drivers/net/bnx2x_main.c
++++ b/drivers/net/bnx2x_main.c
+@@ -6480,6 +6480,7 @@ load_int_disable:
+       bnx2x_free_irq(bp);
+ load_error:
+       bnx2x_free_mem(bp);
++      bp->port.pmf = 0;
+       /* TBD we really need to reset the chip
+          if we want to recover from this */
+@@ -6790,6 +6791,7 @@ unload_error:
+       /* Report UNLOAD_DONE to MCP */
+       if (!BP_NOMCP(bp))
+               bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE);
++      bp->port.pmf = 0;
+       /* Free SKBs, SGEs, TPA pool and driver internals */
+       bnx2x_free_skbs(bp);
+@@ -10203,8 +10205,6 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,
+               return -ENOMEM;
+       }
+-      netif_carrier_off(dev);
+-
+       bp = netdev_priv(dev);
+       bp->msglevel = debug;
+@@ -10228,6 +10228,8 @@ static int __devinit bnx2x_init_one(struct pci_dev *pdev,
+               goto init_one_exit;
+       }
++      netif_carrier_off(dev);
++
+       bp->common.name = board_info[ent->driver_data].name;
+       printk(KERN_INFO "%s: %s (%c%d) PCI-E x%d %s found at mem %lx,"
+              " IRQ %d, ", dev->name, bp->common.name,
+diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c
+index 0676c6d..a225827 100644
+--- a/drivers/net/wireless/ath5k/base.c
++++ b/drivers/net/wireless/ath5k/base.c
+@@ -294,9 +294,9 @@ static inline u64 ath5k_extend_tsf(struct ath5k_hw *ah, u32 rstamp)
+ }
+ /* Interrupt handling */
+-static int    ath5k_init(struct ath5k_softc *sc);
++static int    ath5k_init(struct ath5k_softc *sc, bool is_resume);
+ static int    ath5k_stop_locked(struct ath5k_softc *sc);
+-static int    ath5k_stop_hw(struct ath5k_softc *sc);
++static int    ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend);
+ static irqreturn_t ath5k_intr(int irq, void *dev_id);
+ static void   ath5k_tasklet_reset(unsigned long data);
+@@ -584,7 +584,7 @@ ath5k_pci_suspend(struct pci_dev *pdev, pm_message_t state)
+       ath5k_led_off(sc);
+-      ath5k_stop_hw(sc);
++      ath5k_stop_hw(sc, true);
+       free_irq(pdev->irq, sc);
+       pci_save_state(pdev);
+@@ -599,8 +599,7 @@ ath5k_pci_resume(struct pci_dev *pdev)
+ {
+       struct ieee80211_hw *hw = pci_get_drvdata(pdev);
+       struct ath5k_softc *sc = hw->priv;
+-      struct ath5k_hw *ah = sc->ah;
+-      int i, err;
++      int err;
+       pci_restore_state(pdev);
+@@ -621,21 +620,11 @@ ath5k_pci_resume(struct pci_dev *pdev)
+               goto err_no_irq;
+       }
+-      err = ath5k_init(sc);
++      err = ath5k_init(sc, true);
+       if (err)
+               goto err_irq;
+       ath5k_led_enable(sc);
+-      /*
+-       * Reset the key cache since some parts do not
+-       * reset the contents on initial power up or resume.
+-       *
+-       * FIXME: This may need to be revisited when mac80211 becomes
+-       *        aware of suspend/resume.
+-       */
+-      for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
+-              ath5k_hw_reset_key(ah, i);
+-
+       return 0;
+ err_irq:
+       free_irq(pdev->irq, sc);
+@@ -657,7 +646,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
+       struct ath5k_softc *sc = hw->priv;
+       struct ath5k_hw *ah = sc->ah;
+       u8 mac[ETH_ALEN];
+-      unsigned int i;
+       int ret;
+       ATH5K_DBG(sc, ATH5K_DEBUG_ANY, "devid 0x%x\n", pdev->device);
+@@ -676,13 +664,6 @@ ath5k_attach(struct pci_dev *pdev, struct ieee80211_hw *hw)
+               __set_bit(ATH_STAT_MRRETRY, sc->status);
+       /*
+-       * Reset the key cache since some parts do not
+-       * reset the contents on initial power up.
+-       */
+-      for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
+-              ath5k_hw_reset_key(ah, i);
+-
+-      /*
+        * Collect the channel list.  The 802.11 layer
+        * is resposible for filtering this list based
+        * on settings like the phy mode and regulatory
+@@ -2197,12 +2178,18 @@ ath5k_beacon_config(struct ath5k_softc *sc)
+ \********************/
+ static int
+-ath5k_init(struct ath5k_softc *sc)
++ath5k_init(struct ath5k_softc *sc, bool is_resume)
+ {
+-      int ret;
++      struct ath5k_hw *ah = sc->ah;
++      int ret, i;
+       mutex_lock(&sc->lock);
++      if (is_resume && !test_bit(ATH_STAT_STARTED, sc->status))
++              goto out_ok;
++
++      __clear_bit(ATH_STAT_STARTED, sc->status);
++
+       ATH5K_DBG(sc, ATH5K_DEBUG_RESET, "mode %d\n", sc->opmode);
+       /*
+@@ -2220,7 +2207,7 @@ ath5k_init(struct ath5k_softc *sc)
+        */
+       sc->curchan = sc->hw->conf.channel;
+       sc->curband = &sc->sbands[sc->curchan->band];
+-      ret = ath5k_hw_reset(sc->ah, sc->opmode, sc->curchan, false);
++      ret = ath5k_hw_reset(ah, sc->opmode, sc->curchan, false);
+       if (ret) {
+               ATH5K_ERR(sc, "unable to reset hardware: %d\n", ret);
+               goto done;
+@@ -2229,7 +2216,14 @@ ath5k_init(struct ath5k_softc *sc)
+        * This is needed only to setup initial state
+        * but it's best done after a reset.
+        */
+-      ath5k_hw_set_txpower_limit(sc->ah, 0);
++      ath5k_hw_set_txpower_limit(ah, 0);
++
++      /*
++       * Reset the key cache since some parts do not reset the
++       * contents on initial power up or resume from suspend.
++       */
++      for (i = 0; i < AR5K_KEYTABLE_SIZE; i++)
++              ath5k_hw_reset_key(ah, i);
+       /*
+        * Setup the hardware after reset: the key cache
+@@ -2249,13 +2243,17 @@ ath5k_init(struct ath5k_softc *sc)
+               AR5K_INT_RXORN | AR5K_INT_FATAL | AR5K_INT_GLOBAL |
+               AR5K_INT_MIB;
+-      ath5k_hw_set_intr(sc->ah, sc->imask);
++      ath5k_hw_set_intr(ah, sc->imask);
++
++      __set_bit(ATH_STAT_STARTED, sc->status);
++
+       /* Set ack to be sent at low bit-rates */
+-      ath5k_hw_set_ack_bitrate_high(sc->ah, false);
++      ath5k_hw_set_ack_bitrate_high(ah, false);
+       mod_timer(&sc->calib_tim, round_jiffies(jiffies +
+                       msecs_to_jiffies(ath5k_calinterval * 1000)));
++out_ok:
+       ret = 0;
+ done:
+       mmiowb();
+@@ -2310,7 +2308,7 @@ ath5k_stop_locked(struct ath5k_softc *sc)
+  * stop is preempted).
+  */
+ static int
+-ath5k_stop_hw(struct ath5k_softc *sc)
++ath5k_stop_hw(struct ath5k_softc *sc, bool is_suspend)
+ {
+       int ret;
+@@ -2341,6 +2339,9 @@ ath5k_stop_hw(struct ath5k_softc *sc)
+               }
+       }
+       ath5k_txbuf_free(sc, sc->bbuf);
++      if (!is_suspend)
++              __clear_bit(ATH_STAT_STARTED, sc->status);
++
+       mmiowb();
+       mutex_unlock(&sc->lock);
+@@ -2719,12 +2720,12 @@ err:
+ static int ath5k_start(struct ieee80211_hw *hw)
+ {
+-      return ath5k_init(hw->priv);
++      return ath5k_init(hw->priv, false);
+ }
+ static void ath5k_stop(struct ieee80211_hw *hw)
+ {
+-      ath5k_stop_hw(hw->priv);
++      ath5k_stop_hw(hw->priv, false);
+ }
+ static int ath5k_add_interface(struct ieee80211_hw *hw,
+diff --git a/drivers/net/wireless/ath5k/base.h b/drivers/net/wireless/ath5k/base.h
+index 7ec2f37..214a565 100644
+--- a/drivers/net/wireless/ath5k/base.h
++++ b/drivers/net/wireless/ath5k/base.h
+@@ -132,11 +132,12 @@ struct ath5k_softc {
+       size_t                  desc_len;       /* size of TX/RX descriptors */
+       u16                     cachelsz;       /* cache line size */
+-      DECLARE_BITMAP(status, 4);
++      DECLARE_BITMAP(status, 5);
+ #define ATH_STAT_INVALID      0               /* disable hardware accesses */
+ #define ATH_STAT_MRRETRY      1               /* multi-rate retry support */
+ #define ATH_STAT_PROMISC      2
+ #define ATH_STAT_LEDSOFT      3               /* enable LED gpio status */
++#define ATH_STAT_STARTED      4               /* opened & irqs enabled */
+       unsigned int            filter_flags;   /* HW flags, AR5K_RX_FILTER_* */
+       unsigned int            curmode;        /* current phy mode */
+diff --git a/drivers/net/wireless/ath5k/hw.c b/drivers/net/wireless/ath5k/hw.c
+index ad1a5b4..9b40cbe 100644
+--- a/drivers/net/wireless/ath5k/hw.c
++++ b/drivers/net/wireless/ath5k/hw.c
+@@ -826,9 +826,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode,
+               mdelay(1);
+               /*
+-               * Write some more initial register settings
++               * Write some more initial register settings for revised chips
+                */
+-              if (ah->ah_version == AR5K_AR5212) {
++              if (ah->ah_version == AR5K_AR5212 &&
++                  ah->ah_phy_revision > 0x41) {
+                       ath5k_hw_reg_write(ah, 0x0002a002, 0x982c);
+                       if (channel->hw_value == CHANNEL_G)
+@@ -847,19 +848,10 @@ int ath5k_hw_reset(struct ath5k_hw *ah, enum ieee80211_if_types op_mode,
+                       else
+                               ath5k_hw_reg_write(ah, 0x00000000, 0x994c);
+-                      /* Some bits are disabled here, we know nothing about
+-                       * register 0xa228 yet, most of the times this ends up
+-                       * with a value 0x9b5 -haven't seen any dump with
+-                       * a different value- */
+-                      /* Got this from decompiling binary HAL */
+-                      data = ath5k_hw_reg_read(ah, 0xa228);
+-                      data &= 0xfffffdff;
+-                      ath5k_hw_reg_write(ah, data, 0xa228);
+-
+-                      data = ath5k_hw_reg_read(ah, 0xa228);
+-                      data &= 0xfffe03ff;
+-                      ath5k_hw_reg_write(ah, data, 0xa228);
+-                      data = 0;
++                      /* Got this from legacy-hal */
++                      AR5K_REG_DISABLE_BITS(ah, 0xa228, 0x200);
++
++                      AR5K_REG_MASKED_BITS(ah, 0xa228, 2 << 10, ~0x1fc00);
+                       /* Just write 0x9b5 ? */
+                       /* ath5k_hw_reg_write(ah, 0x000009b5, 0xa228); */
+diff --git a/drivers/net/wireless/ath5k/initvals.c b/drivers/net/wireless/ath5k/initvals.c
+index 2806b21..cf7ebd1 100644
+--- a/drivers/net/wireless/ath5k/initvals.c
++++ b/drivers/net/wireless/ath5k/initvals.c
+@@ -810,6 +810,8 @@ static const struct ath5k_ini_mode ar5212_rf5111_ini_mode_end[] = {
+               { 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 } },
+       { AR5K_PHY(642),
+               { 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788, 0xd03e6788 } },
++      { 0xa228,
++              { 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5, 0x000001b5 } },
+       { 0xa23c,
+               { 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af, 0x13c889af } },
+ };
+diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
+index ffdf487..a68f97c 100644
+--- a/drivers/net/wireless/hostap/hostap_wlan.h
++++ b/drivers/net/wireless/hostap/hostap_wlan.h
+@@ -918,9 +918,12 @@ struct hostap_interface {
+ /*
+  * TX meta data - stored in skb->cb buffer, so this must not be increased over
+- * the 40-byte limit
++ * the 48-byte limit.
++ * THE PADDING THIS STARTS WITH IS A HORRIBLE HACK THAT SHOULD NOT LIVE
++ * TO SEE THE DAY.
+  */
+ struct hostap_skb_tx_data {
++      unsigned int __padding_for_default_qdiscs;
+       u32 magic; /* HOSTAP_SKB_TX_DATA_MAGIC */
+       u8 rate; /* transmit rate */
+ #define HOSTAP_TX_FLAGS_WDS BIT(0)
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index 72a6743..cf7056e 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -3275,7 +3275,11 @@ static void iwl4965_mac_update_tkip_key(struct ieee80211_hw *hw,
+               return;
+       }
+-      iwl_scan_cancel_timeout(priv, 100);
++      if (iwl_scan_cancel(priv)) {
++              /* cancel scan failed, just live w/ bad key and rely
++                 briefly on SW decryption */
++              return;
++      }
+       key_flags |= (STA_KEY_FLG_TKIP | STA_KEY_FLG_MAP_KEY_MSK);
+       key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
+diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
+index ca5deb6..0cebbc4 100644
+--- a/drivers/net/wireless/rtl8187_dev.c
++++ b/drivers/net/wireless/rtl8187_dev.c
+@@ -45,6 +45,9 @@ static struct usb_device_id rtl8187_table[] __devinitdata = {
+       {USB_DEVICE(0x03f0, 0xca02), .driver_info = DEVICE_RTL8187},
+       /* Sitecom */
+       {USB_DEVICE(0x0df6, 0x000d), .driver_info = DEVICE_RTL8187},
++      {USB_DEVICE(0x0df6, 0x0028), .driver_info = DEVICE_RTL8187B},
++      /* Abocom */
++      {USB_DEVICE(0x13d1, 0xabe6), .driver_info = DEVICE_RTL8187},
+       {}
+ };
+diff --git a/drivers/pnp/pnpacpi/core.c b/drivers/pnp/pnpacpi/core.c
+index c1b9ea3..98b9df7 100644
+--- a/drivers/pnp/pnpacpi/core.c
++++ b/drivers/pnp/pnpacpi/core.c
+@@ -148,9 +148,13 @@ static int __init pnpacpi_add_device(struct acpi_device *device)
+       acpi_status status;
+       struct pnp_dev *dev;
++      /*
++       * If a PnPacpi device is not present , the device
++       * driver should not be loaded.
++       */
+       status = acpi_get_handle(device->handle, "_CRS", &temp);
+       if (ACPI_FAILURE(status) || !ispnpidacpi(acpi_device_hid(device)) ||
+-          is_exclusive_device(device))
++          is_exclusive_device(device) || (!device->status.present))
+               return 0;
+       dev = pnp_alloc_dev(&pnpacpi_protocol, num, acpi_device_hid(device));
+diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
+index 1fe0901..7716145 100644
+--- a/drivers/scsi/dpt_i2o.c
++++ b/drivers/scsi/dpt_i2o.c
+@@ -2445,7 +2445,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
+       hba_status = detailed_status >> 8;
+       // calculate resid for sg 
+-      scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+5));
++      scsi_set_resid(cmd, scsi_bufflen(cmd) - readl(reply+20));
+       pHba = (adpt_hba*) cmd->device->host->hostdata[0];
+@@ -2456,7 +2456,7 @@ static s32 adpt_i2o_to_scsi(void __iomem *reply, struct scsi_cmnd* cmd)
+               case I2O_SCSI_DSC_SUCCESS:
+                       cmd->result = (DID_OK << 16);
+                       // handle underflow
+-                      if(readl(reply+5) < cmd->underflow ) {
++                      if (readl(reply+20) < cmd->underflow) {
+                               cmd->result = (DID_ERROR <<16);
+                               printk(KERN_WARNING"%s: SCSI CMD underflow\n",pHba->name);
+                       }
+diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
+index 94a720e..00f6780 100644
+--- a/drivers/scsi/qla2xxx/qla_def.h
++++ b/drivers/scsi/qla2xxx/qla_def.h
+@@ -2546,7 +2546,6 @@ typedef struct scsi_qla_host {
+       uint8_t         fcode_revision[16];
+       uint32_t        fw_revision[4];
+-      uint16_t        fdt_odd_index;
+       uint32_t        fdt_wrt_disable;
+       uint32_t        fdt_erase_cmd;
+       uint32_t        fdt_block_size;
+diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
+index ee89ddd..3a0a178 100644
+--- a/drivers/scsi/qla2xxx/qla_init.c
++++ b/drivers/scsi/qla2xxx/qla_init.c
+@@ -974,7 +974,6 @@ qla2x00_setup_chip(scsi_qla_host_t *ha)
+                                   &ha->fw_minor_version,
+                                   &ha->fw_subminor_version,
+                                   &ha->fw_attributes, &ha->fw_memory_size);
+-                              qla2x00_resize_request_q(ha);
+                               ha->flags.npiv_supported = 0;
+                               if ((IS_QLA24XX(ha) || IS_QLA25XX(ha) ||
+                                    IS_QLA84XX(ha)) &&
+@@ -986,6 +985,7 @@ qla2x00_setup_chip(scsi_qla_host_t *ha)
+                                               ha->max_npiv_vports =
+                                                   MIN_MULTI_ID_FABRIC - 1;
+                               }
++                              qla2x00_resize_request_q(ha);
+                               if (ql2xallocfwdump)
+                                       qla2x00_alloc_fw_dump(ha);
+diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
+index 813bc77..c07e879 100644
+--- a/drivers/scsi/qla2xxx/qla_mbx.c
++++ b/drivers/scsi/qla2xxx/qla_mbx.c
+@@ -1964,7 +1964,7 @@ qla2x00_get_resource_cnts(scsi_qla_host_t *ha, uint16_t *cur_xchg_cnt,
+                       *cur_iocb_cnt = mcp->mb[7];
+               if (orig_iocb_cnt)
+                       *orig_iocb_cnt = mcp->mb[10];
+-              if (max_npiv_vports)
++              if (ha->flags.npiv_supported && max_npiv_vports)
+                       *max_npiv_vports = mcp->mb[11];
+       }
+diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
+index 6d0f0e5..86e143c 100644
+--- a/drivers/scsi/qla2xxx/qla_os.c
++++ b/drivers/scsi/qla2xxx/qla_os.c
+@@ -730,6 +730,7 @@ qla2xxx_eh_abort(struct scsi_cmnd *cmd)
+               if (ha->isp_ops->abort_command(ha, sp)) {
+                       DEBUG2(printk("%s(%ld): abort_command "
+                           "mbx failed.\n", __func__, ha->host_no));
++                      ret = FAILED;
+               } else {
+                       DEBUG3(printk("%s(%ld): abort_command "
+                           "mbx success.\n", __func__, ha->host_no));
+diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c
+index 1bca744..910c3b3 100644
+--- a/drivers/scsi/qla2xxx/qla_sup.c
++++ b/drivers/scsi/qla2xxx/qla_sup.c
+@@ -546,6 +546,7 @@ qla24xx_get_flash_manufacturer(scsi_qla_host_t *ha, uint8_t *man_id,
+ void
+ qla2xxx_get_flash_info(scsi_qla_host_t *ha)
+ {
++#define FLASH_BLK_SIZE_4K     0x1000
+ #define FLASH_BLK_SIZE_32K    0x8000
+ #define FLASH_BLK_SIZE_64K    0x10000
+       uint16_t cnt, chksum;
+@@ -577,7 +578,6 @@ qla2xxx_get_flash_info(scsi_qla_host_t *ha)
+               goto no_flash_data;
+       }
+-      ha->fdt_odd_index = le16_to_cpu(fdt->man_id) == 0x1f;
+       ha->fdt_wrt_disable = fdt->wrt_disable_bits;
+       ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0300 | fdt->erase_cmd);
+       ha->fdt_block_size = le32_to_cpu(fdt->block_size);
+@@ -590,10 +590,10 @@ qla2xxx_get_flash_info(scsi_qla_host_t *ha)
+       }
+       DEBUG2(qla_printk(KERN_DEBUG, ha, "Flash[FDT]: (0x%x/0x%x) erase=0x%x "
+-          "pro=%x upro=%x idx=%d wrtd=0x%x blk=0x%x.\n",
++          "pro=%x upro=%x wrtd=0x%x blk=0x%x.\n",
+           le16_to_cpu(fdt->man_id), le16_to_cpu(fdt->id), ha->fdt_erase_cmd,
+           ha->fdt_protect_sec_cmd, ha->fdt_unprotect_sec_cmd,
+-          ha->fdt_odd_index, ha->fdt_wrt_disable, ha->fdt_block_size));
++          ha->fdt_wrt_disable, ha->fdt_block_size));
+       return;
+ no_flash_data:
+@@ -614,8 +614,7 @@ no_flash_data:
+               ha->fdt_block_size = FLASH_BLK_SIZE_64K;
+               break;
+       case 0x1f: /* Atmel 26DF081A. */
+-              ha->fdt_odd_index = 1;
+-              ha->fdt_block_size = FLASH_BLK_SIZE_64K;
++              ha->fdt_block_size = FLASH_BLK_SIZE_4K;
+               ha->fdt_erase_cmd = flash_conf_to_access_addr(0x0320);
+               ha->fdt_unprotect_sec_cmd = flash_conf_to_access_addr(0x0339);
+               ha->fdt_protect_sec_cmd = flash_conf_to_access_addr(0x0336);
+@@ -627,9 +626,9 @@ no_flash_data:
+       }
+       DEBUG2(qla_printk(KERN_DEBUG, ha, "Flash[MID]: (0x%x/0x%x) erase=0x%x "
+-          "pro=%x upro=%x idx=%d wrtd=0x%x blk=0x%x.\n", man_id, flash_id,
++          "pro=%x upro=%x wrtd=0x%x blk=0x%x.\n", man_id, flash_id,
+           ha->fdt_erase_cmd, ha->fdt_protect_sec_cmd,
+-          ha->fdt_unprotect_sec_cmd, ha->fdt_odd_index, ha->fdt_wrt_disable,
++          ha->fdt_unprotect_sec_cmd, ha->fdt_wrt_disable,
+           ha->fdt_block_size));
+ }
+@@ -710,13 +709,9 @@ qla24xx_write_flash_data(scsi_qla_host_t *ha, uint32_t *dwptr, uint32_t faddr,
+       qla24xx_unprotect_flash(ha);
+       for (liter = 0; liter < dwords; liter++, faddr++, dwptr++) {
+-              if (ha->fdt_odd_index) {
+-                      findex = faddr << 2;
+-                      fdata = findex & sec_mask;
+-              } else {
+-                      findex = faddr;
+-                      fdata = (findex & sec_mask) << 2;
+-              }
++
++              findex = faddr;
++              fdata = (findex & sec_mask) << 2;
+               /* Are we at the beginning of a sector? */
+               if ((findex & rest_addr) == 0) {
+diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c
+index d996a61..61524fc 100644
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -158,16 +158,12 @@ static int acm_wb_is_avail(struct acm *acm)
+ }
+ /*
+- * Finish write.
++ * Finish write. Caller must hold acm->write_lock
+  */
+ static void acm_write_done(struct acm *acm, struct acm_wb *wb)
+ {
+-      unsigned long flags;
+-
+-      spin_lock_irqsave(&acm->write_lock, flags);
+       wb->use = 0;
+       acm->transmitting--;
+-      spin_unlock_irqrestore(&acm->write_lock, flags);
+ }
+ /*
+@@ -482,6 +478,7 @@ static void acm_write_bulk(struct urb *urb)
+ {
+       struct acm_wb *wb = urb->context;
+       struct acm *acm = wb->instance;
++      unsigned long flags;
+       if (verbose || urb->status
+                       || (urb->actual_length != urb->transfer_buffer_length))
+@@ -490,7 +487,9 @@ static void acm_write_bulk(struct urb *urb)
+                       urb->transfer_buffer_length,
+                       urb->status);
++      spin_lock_irqsave(&acm->write_lock, flags);
+       acm_write_done(acm, wb);
++      spin_unlock_irqrestore(&acm->write_lock, flags);
+       if (ACM_READY(acm))
+               schedule_work(&acm->work);
+       else
+diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
+index 286b443..9cfa366 100644
+--- a/drivers/usb/core/message.c
++++ b/drivers/usb/core/message.c
+@@ -1091,6 +1091,7 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
+                               continue;
+                       dev_dbg(&dev->dev, "unregistering interface %s\n",
+                               dev_name(&interface->dev));
++                      interface->unregistering = 1;
+                       usb_remove_sysfs_intf_files(interface);
+                       device_del(&interface->dev);
+               }
+diff --git a/drivers/usb/core/sysfs.c b/drivers/usb/core/sysfs.c
+index 5e1f5d5..668a6d6 100644
+--- a/drivers/usb/core/sysfs.c
++++ b/drivers/usb/core/sysfs.c
+@@ -816,7 +816,7 @@ int usb_create_sysfs_intf_files(struct usb_interface *intf)
+       struct usb_host_interface *alt = intf->cur_altsetting;
+       int retval;
+-      if (intf->sysfs_files_created)
++      if (intf->sysfs_files_created || intf->unregistering)
+               return 0;
+       /* The interface string may be present in some altsettings
+diff --git a/drivers/usb/gadget/f_acm.c b/drivers/usb/gadget/f_acm.c
+index 5ee1590..c1d34df 100644
+--- a/drivers/usb/gadget/f_acm.c
++++ b/drivers/usb/gadget/f_acm.c
+@@ -463,7 +463,11 @@ static int acm_cdc_notify(struct f_acm *acm, u8 type, u16 value,
+       notify->wLength = cpu_to_le16(length);
+       memcpy(buf, data, length);
++      /* ep_queue() can complete immediately if it fills the fifo... */
++      spin_unlock(&acm->lock);
+       status = usb_ep_queue(ep, req, GFP_ATOMIC);
++      spin_lock(&acm->lock);
++
+       if (status < 0) {
+               ERROR(acm->port.func.config->cdev,
+                               "acm ttyGS%d can't notify serial state, %d\n",
+diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig
+index 228797e..a657c94 100644
+--- a/drivers/usb/host/Kconfig
++++ b/drivers/usb/host/Kconfig
+@@ -110,29 +110,18 @@ config USB_ISP116X_HCD
+ config USB_ISP1760_HCD
+       tristate "ISP 1760 HCD support"
+-      depends on USB && EXPERIMENTAL
++      depends on USB && EXPERIMENTAL && (PCI || PPC_OF)
+       ---help---
+         The ISP1760 chip is a USB 2.0 host controller.
+         This driver does not support isochronous transfers or OTG.
++        This USB controller is usually attached to a non-DMA-Master
++        capable bus. NXP's eval kit brings this chip on PCI card
++        where the chip itself is behind a PLB to simulate such
++        a bus.
+         To compile this driver as a module, choose M here: the
+-        module will be called isp1760-hcd.
+-
+-config USB_ISP1760_PCI
+-      bool "Support for the PCI bus"
+-      depends on USB_ISP1760_HCD && PCI
+-      ---help---
+-        Enables support for the device present on the PCI bus.
+-        This should only be required if you happen to have the eval kit from
+-        NXP and you are going to test it.
+-
+-config USB_ISP1760_OF
+-      bool "Support for the OF platform bus"
+-      depends on USB_ISP1760_HCD && PPC_OF
+-      ---help---
+-        Enables support for the device present on the PowerPC
+-        OpenFirmware platform bus.
++        module will be called isp1760.
+ config USB_OHCI_HCD
+       tristate "OHCI HCD support"
+diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
+index 86e38b0..dc21ade 100644
+--- a/drivers/usb/host/ehci-hcd.c
++++ b/drivers/usb/host/ehci-hcd.c
+@@ -643,7 +643,7 @@ static int ehci_run (struct usb_hcd *hcd)
+ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
+ {
+       struct ehci_hcd         *ehci = hcd_to_ehci (hcd);
+-      u32                     status, pcd_status = 0, cmd;
++      u32                     status, masked_status, pcd_status = 0, cmd;
+       int                     bh;
+       spin_lock (&ehci->lock);
+@@ -656,14 +656,14 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
+               goto dead;
+       }
+-      status &= INTR_MASK;
+-      if (!status) {                  /* irq sharing? */
++      masked_status = status & INTR_MASK;
++      if (!masked_status) {           /* irq sharing? */
+               spin_unlock(&ehci->lock);
+               return IRQ_NONE;
+       }
+       /* clear (just) interrupts */
+-      ehci_writel(ehci, status, &ehci->regs->status);
++      ehci_writel(ehci, masked_status, &ehci->regs->status);
+       cmd = ehci_readl(ehci, &ehci->regs->command);
+       bh = 0;
+@@ -731,19 +731,18 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd)
+       /* PCI errors [4.15.2.4] */
+       if (unlikely ((status & STS_FATAL) != 0)) {
++              ehci_err(ehci, "fatal error\n");
+               dbg_cmd (ehci, "fatal", ehci_readl(ehci,
+                                                  &ehci->regs->command));
+               dbg_status (ehci, "fatal", status);
+-              if (status & STS_HALT) {
+-                      ehci_err (ehci, "fatal error\n");
++              ehci_halt(ehci);
+ dead:
+-                      ehci_reset (ehci);
+-                      ehci_writel(ehci, 0, &ehci->regs->configured_flag);
+-                      /* generic layer kills/unlinks all urbs, then
+-                       * uses ehci_stop to clean up the rest
+-                       */
+-                      bh = 1;
+-              }
++              ehci_reset(ehci);
++              ehci_writel(ehci, 0, &ehci->regs->configured_flag);
++              /* generic layer kills/unlinks all urbs, then
++               * uses ehci_stop to clean up the rest
++               */
++              bh = 1;
+       }
+       if (bh)
+diff --git a/drivers/usb/host/ehci-ps3.c b/drivers/usb/host/ehci-ps3.c
+index 0eba894..9c9da35 100644
+--- a/drivers/usb/host/ehci-ps3.c
++++ b/drivers/usb/host/ehci-ps3.c
+@@ -205,6 +205,7 @@ static int ps3_ehci_remove(struct ps3_system_bus_device *dev)
+       tmp = hcd->irq;
++      ehci_shutdown(hcd);
+       usb_remove_hcd(hcd);
+       ps3_system_bus_set_driver_data(dev, NULL);
+diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
+index 4a0c5a7..a081ee6 100644
+--- a/drivers/usb/host/ehci-sched.c
++++ b/drivers/usb/host/ehci-sched.c
+@@ -918,7 +918,7 @@ iso_stream_init (
+                */
+               stream->usecs = HS_USECS_ISO (maxp);
+               bandwidth = stream->usecs * 8;
+-              bandwidth /= 1 << (interval - 1);
++              bandwidth /= interval;
+       } else {
+               u32             addr;
+@@ -951,7 +951,7 @@ iso_stream_init (
+               } else
+                       stream->raw_mask = smask_out [hs_transfers - 1];
+               bandwidth = stream->usecs + stream->c_usecs;
+-              bandwidth /= 1 << (interval + 2);
++              bandwidth /= interval << 3;
+               /* stream->splits gets created from raw_mask later */
+               stream->address = cpu_to_hc32(ehci, addr);
+diff --git a/drivers/usb/host/isp1760-if.c b/drivers/usb/host/isp1760-if.c
+index 051ef7b..78b8aaa 100644
+--- a/drivers/usb/host/isp1760-if.c
++++ b/drivers/usb/host/isp1760-if.c
+@@ -14,16 +14,16 @@
+ #include "../core/hcd.h"
+ #include "isp1760-hcd.h"
+-#ifdef CONFIG_USB_ISP1760_OF
++#ifdef CONFIG_PPC_OF
+ #include <linux/of.h>
+ #include <linux/of_platform.h>
+ #endif
+-#ifdef CONFIG_USB_ISP1760_PCI
++#ifdef CONFIG_PCI
+ #include <linux/pci.h>
+ #endif
+-#ifdef CONFIG_USB_ISP1760_OF
++#ifdef CONFIG_PPC_OF
+ static int of_isp1760_probe(struct of_device *dev,
+               const struct of_device_id *match)
+ {
+@@ -128,7 +128,7 @@ static struct of_platform_driver isp1760_of_driver = {
+ };
+ #endif
+-#ifdef CONFIG_USB_ISP1760_PCI
++#ifdef CONFIG_PCI
+ static u32 nxp_pci_io_base;
+ static u32 iolength;
+ static u32 pci_mem_phy0;
+@@ -287,28 +287,28 @@ static struct pci_driver isp1761_pci_driver = {
+ static int __init isp1760_init(void)
+ {
+-      int ret = -ENODEV;
++      int ret;
+       init_kmem_once();
+-#ifdef CONFIG_USB_ISP1760_OF
++#ifdef CONFIG_PPC_OF
+       ret = of_register_platform_driver(&isp1760_of_driver);
+       if (ret) {
+               deinit_kmem_cache();
+               return ret;
+       }
+ #endif
+-#ifdef CONFIG_USB_ISP1760_PCI
++#ifdef CONFIG_PCI
+       ret = pci_register_driver(&isp1761_pci_driver);
+       if (ret)
+               goto unreg_of;
+ #endif
+       return ret;
+-#ifdef CONFIG_USB_ISP1760_PCI
++#ifdef CONFIG_PCI
+ unreg_of:
+ #endif
+-#ifdef CONFIG_USB_ISP1760_OF
++#ifdef CONFIG_PPC_OF
+       of_unregister_platform_driver(&isp1760_of_driver);
+ #endif
+       deinit_kmem_cache();
+@@ -318,10 +318,10 @@ module_init(isp1760_init);
+ static void __exit isp1760_exit(void)
+ {
+-#ifdef CONFIG_USB_ISP1760_OF
++#ifdef CONFIG_PPC_OF
+       of_unregister_platform_driver(&isp1760_of_driver);
+ #endif
+-#ifdef CONFIG_USB_ISP1760_PCI
++#ifdef CONFIG_PCI
+       pci_unregister_driver(&isp1761_pci_driver);
+ #endif
+       deinit_kmem_cache();
+diff --git a/drivers/usb/host/ohci-ps3.c b/drivers/usb/host/ohci-ps3.c
+index 2089d8a..3c1a3b5 100644
+--- a/drivers/usb/host/ohci-ps3.c
++++ b/drivers/usb/host/ohci-ps3.c
+@@ -192,7 +192,7 @@ fail_start:
+       return result;
+ }
+-static int ps3_ohci_remove (struct ps3_system_bus_device *dev)
++static int ps3_ohci_remove(struct ps3_system_bus_device *dev)
+ {
+       unsigned int tmp;
+       struct usb_hcd *hcd =
+@@ -205,6 +205,7 @@ static int ps3_ohci_remove (struct ps3_system_bus_device *dev)
+       tmp = hcd->irq;
++      ohci_shutdown(hcd);
+       usb_remove_hcd(hcd);
+       ps3_system_bus_set_driver_data(dev, NULL);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index 061df9b..ccebf89 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -1251,6 +1251,13 @@ UNUSUAL_DEV( 0x0839, 0x000a, 0x0001, 0x0001,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_INQUIRY),
++/* Reported by Luciano Rocha <luciano@eurotux.com> */
++UNUSUAL_DEV( 0x0840, 0x0082, 0x0001, 0x0001,
++              "Argosy",
++              "Storage",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY),
++
+ /* Entry and supporting patch by Theodore Kilgore <kilgota@auburn.edu>.
+  * Flag will support Bulk devices which use a standards-violating 32-byte
+  * Command Block Wrapper. Here, the "DC2MEGA" cameras (several brands) with
+diff --git a/fs/namespace.c b/fs/namespace.c
+index 6e283c9..1bd5ba2 100644
+--- a/fs/namespace.c
++++ b/fs/namespace.c
+@@ -1553,8 +1553,13 @@ static noinline int do_remount(struct nameidata *nd, int flags, int mnt_flags,
+       if (!err)
+               nd->path.mnt->mnt_flags = mnt_flags;
+       up_write(&sb->s_umount);
+-      if (!err)
++      if (!err) {
+               security_sb_post_remount(nd->path.mnt, flags, data);
++
++              spin_lock(&vfsmount_lock);
++              touch_mnt_namespace(nd->path.mnt->mnt_ns);
++              spin_unlock(&vfsmount_lock);
++      }
+       return err;
+ }
+diff --git a/fs/proc/proc_sysctl.c b/fs/proc/proc_sysctl.c
+index f9a8b89..7a510a6 100644
+--- a/fs/proc/proc_sysctl.c
++++ b/fs/proc/proc_sysctl.c
+@@ -31,6 +31,7 @@ static struct inode *proc_sys_make_inode(struct super_block *sb,
+       inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
+       inode->i_flags |= S_PRIVATE; /* tell selinux to ignore this inode */
+       inode->i_mode = table->mode;
++      inode->i_uid = inode->i_gid = 0;
+       if (!table->child) {
+               inode->i_mode |= S_IFREG;
+               inode->i_op = &proc_sys_inode_operations;
+diff --git a/include/linux/bio.h b/include/linux/bio.h
+index 0933a14..3d83947 100644
+--- a/include/linux/bio.h
++++ b/include/linux/bio.h
+@@ -98,6 +98,13 @@ struct bio {
+       unsigned int            bi_size;        /* residual I/O count */
+       /*
++       * To keep track of the max segment size, we account for the
++       * sizes of the first and last mergeable segments in this bio.
++       */
++      unsigned int            bi_seg_front_size;
++      unsigned int            bi_seg_back_size;
++
++      /*
+        * To keep track of the max hw size, we account for the
+        * sizes of the first and last virtually mergeable segments
+        * in this bio
+diff --git a/include/linux/usb.h b/include/linux/usb.h
+index 94ac74a..2e434dc 100644
+--- a/include/linux/usb.h
++++ b/include/linux/usb.h
+@@ -108,6 +108,7 @@ enum usb_interface_condition {
+  *    (in probe()), bound to a driver, or unbinding (in disconnect())
+  * @is_active: flag set when the interface is bound and not suspended.
+  * @sysfs_files_created: sysfs attributes exist
++ * @unregistering: flag set when the interface is being unregistered
+  * @needs_remote_wakeup: flag set when the driver requires remote-wakeup
+  *    capability during autosuspend.
+  * @needs_altsetting0: flag set when a set-interface request for altsetting 0
+@@ -163,6 +164,7 @@ struct usb_interface {
+       enum usb_interface_condition condition;         /* state of binding */
+       unsigned is_active:1;           /* the interface is not suspended */
+       unsigned sysfs_files_created:1; /* the sysfs attributes exist */
++      unsigned unregistering:1;       /* unregistration is in progress */
+       unsigned needs_remote_wakeup:1; /* driver requires remote wakeup */
+       unsigned needs_altsetting0:1;   /* switch to altsetting 0 is pending */
+       unsigned needs_binding:1;       /* needs delayed unbind/rebind */
+diff --git a/mm/hugetlb.c b/mm/hugetlb.c
+index 77427c8..81e9a82 100644
+--- a/mm/hugetlb.c
++++ b/mm/hugetlb.c
+@@ -1797,6 +1797,7 @@ int unmap_ref_private(struct mm_struct *mm,
+                                       struct page *page,
+                                       unsigned long address)
+ {
++      struct hstate *h = hstate_vma(vma);
+       struct vm_area_struct *iter_vma;
+       struct address_space *mapping;
+       struct prio_tree_iter iter;
+@@ -1806,7 +1807,7 @@ int unmap_ref_private(struct mm_struct *mm,
+        * vm_pgoff is in PAGE_SIZE units, hence the different calculation
+        * from page cache lookup which is in HPAGE_SIZE units.
+        */
+-      address = address & huge_page_mask(hstate_vma(vma));
++      address = address & huge_page_mask(h);
+       pgoff = ((address - vma->vm_start) >> PAGE_SHIFT)
+               + (vma->vm_pgoff >> PAGE_SHIFT);
+       mapping = (struct address_space *)page_private(page);
+@@ -1825,7 +1826,7 @@ int unmap_ref_private(struct mm_struct *mm,
+                */
+               if (!is_vma_resv_set(iter_vma, HPAGE_RESV_OWNER))
+                       unmap_hugepage_range(iter_vma,
+-                              address, address + HPAGE_SIZE,
++                              address, address + huge_page_size(h),
+                               page);
+       }
+diff --git a/mm/page_isolation.c b/mm/page_isolation.c
+index b70a7fe..5e0ffd9 100644
+--- a/mm/page_isolation.c
++++ b/mm/page_isolation.c
+@@ -130,10 +130,11 @@ int test_pages_isolated(unsigned long start_pfn, unsigned long end_pfn)
+               if (page && get_pageblock_migratetype(page) != MIGRATE_ISOLATE)
+                       break;
+       }
+-      if (pfn < end_pfn)
++      page = __first_valid_page(start_pfn, end_pfn - start_pfn);
++      if ((pfn < end_pfn) || !page)
+               return -EBUSY;
+       /* Check all pages are free or Marked as ISOLATED */
+-      zone = page_zone(pfn_to_page(pfn));
++      zone = page_zone(page);
+       spin_lock_irqsave(&zone->lock, flags);
+       ret = __test_page_isolated_in_pageblock(start_pfn, end_pfn);
+       spin_unlock_irqrestore(&zone->lock, flags);
+diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c
+index 8f5a403..a631a1f 100644
+--- a/net/ipv4/proc.c
++++ b/net/ipv4/proc.c
+@@ -237,43 +237,45 @@ static const struct snmp_mib snmp4_net_list[] = {
+       SNMP_MIB_SENTINEL
+ };
++static void icmpmsg_put_line(struct seq_file *seq, unsigned long *vals,
++                           unsigned short *type, int count)
++{
++      int j;
++
++      if (count) {
++              seq_printf(seq, "\nIcmpMsg:");
++              for (j = 0; j < count; ++j)
++                      seq_printf(seq, " %sType%u",
++                              type[j] & 0x100 ? "Out" : "In",
++                              type[j] & 0xff);
++              seq_printf(seq, "\nIcmpMsg:");
++              for (j = 0; j < count; ++j)
++                      seq_printf(seq, " %lu", vals[j]);
++      }
++}
++
+ static void icmpmsg_put(struct seq_file *seq)
+ {
+ #define PERLINE       16
+-      int j, i, count;
+-      static int out[PERLINE];
++      int i, count;
++      unsigned short type[PERLINE];
++      unsigned long vals[PERLINE], val;
+       struct net *net = seq->private;
+       count = 0;
+       for (i = 0; i < ICMPMSG_MIB_MAX; i++) {
+-
+-              if (snmp_fold_field((void **) net->mib.icmpmsg_statistics, i))
+-                      out[count++] = i;
+-              if (count < PERLINE)
+-                      continue;
+-
+-              seq_printf(seq, "\nIcmpMsg:");
+-              for (j = 0; j < PERLINE; ++j)
+-                      seq_printf(seq, " %sType%u", i & 0x100 ? "Out" : "In",
+-                                      i & 0xff);
+-              seq_printf(seq, "\nIcmpMsg: ");
+-              for (j = 0; j < PERLINE; ++j)
+-                      seq_printf(seq, " %lu",
+-                              snmp_fold_field((void **) net->mib.icmpmsg_statistics,
+-                              out[j]));
+-              seq_putc(seq, '\n');
+-      }
+-      if (count) {
+-              seq_printf(seq, "\nIcmpMsg:");
+-              for (j = 0; j < count; ++j)
+-                      seq_printf(seq, " %sType%u", out[j] & 0x100 ? "Out" :
+-                              "In", out[j] & 0xff);
+-              seq_printf(seq, "\nIcmpMsg:");
+-              for (j = 0; j < count; ++j)
+-                      seq_printf(seq, " %lu", snmp_fold_field((void **)
+-                              net->mib.icmpmsg_statistics, out[j]));
++              val = snmp_fold_field((void **) net->mib.icmpmsg_statistics, i);
++              if (val) {
++                      type[count] = i;
++                      vals[count++] = val;
++              }
++              if (count == PERLINE) {
++                      icmpmsg_put_line(seq, vals, type, count);
++                      count = 0;
++              }
+       }
++      icmpmsg_put_line(seq, vals, type, count);
+ #undef PERLINE
+ }
+diff --git a/scripts/package/builddeb b/scripts/package/builddeb
+index ba6bf5d..1264b8e 100644
+--- a/scripts/package/builddeb
++++ b/scripts/package/builddeb
+@@ -15,15 +15,18 @@ set -e
+ version=$KERNELRELEASE
+ revision=`cat .version`
+ tmpdir="$objtree/debian/tmp"
++fwdir="$objtree/debian/fwtmp"
+ packagename=linux-$version
++fwpackagename=linux-firmware-image
+ if [ "$ARCH" == "um" ] ; then
+       packagename=user-mode-linux-$version
+ fi
+ # Setup the directory structure
+-rm -rf "$tmpdir"
++rm -rf "$tmpdir" "$fwdir"
+ mkdir -p "$tmpdir/DEBIAN" "$tmpdir/lib" "$tmpdir/boot"
++mkdir -p "$fwdir/DEBIAN" "$fwdir/lib"
+ if [ "$ARCH" == "um" ] ; then
+       mkdir -p "$tmpdir/usr/lib/uml/modules/$version" "$tmpdir/usr/share/doc/$packagename" "$tmpdir/usr/bin"
+ fi
+@@ -107,6 +110,7 @@ Standards-Version: 3.6.1
+ Package: $packagename
+ Provides: kernel-image-$version, linux-image-$version
++Suggests: $fwpackagename
+ Architecture: any
+ Description: Linux kernel, version $version
+  This package contains the Linux kernel, modules and corresponding other
+@@ -118,8 +122,24 @@ fi
+ chown -R root:root "$tmpdir"
+ chmod -R go-w "$tmpdir"
++# Do we have firmware? Move it out of the way and build it into a package.
++if [ -e "$tmpdir/lib/firmware" ]; then
++      mv "$tmpdir/lib/firmware" "$fwdir/lib/"
++
++      cat <<EOF >> debian/control
++
++Package: $fwpackagename
++Architecture: all
++Description: Linux kernel firmware, version $version
++ This package contains firmware from the Linux kernel, version $version
++EOF
++
++      dpkg-gencontrol -isp -p$fwpackagename -P"$fwdir"
++      dpkg --build "$fwdir" ..
++fi
++
+ # Perform the final magic
+-dpkg-gencontrol -isp
++dpkg-gencontrol -isp -p$packagename
+ dpkg --build "$tmpdir" ..
+ exit 0
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.7-8 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.7-8
new file mode 100644 (file)
index 0000000..0843b82
--- /dev/null
@@ -0,0 +1,7579 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.8
+
+Upstream 2.6.27.8 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/filesystems/proc.txt b/Documentation/filesystems/proc.txt
+index f566ad9..23f3edc 100644
+--- a/Documentation/filesystems/proc.txt
++++ b/Documentation/filesystems/proc.txt
+@@ -44,6 +44,7 @@ Table of Contents
+   2.14        /proc/<pid>/io - Display the IO accounting fields
+   2.15        /proc/<pid>/coredump_filter - Core dump filtering settings
+   2.16        /proc/<pid>/mountinfo - Information about mounts
++  2.17        /proc/sys/fs/epoll - Configuration options for the epoll interface
+ ------------------------------------------------------------------------------
+ Preface
+@@ -2471,4 +2472,30 @@ For more information on mount propagation see:
+   Documentation/filesystems/sharedsubtree.txt
++2.17  /proc/sys/fs/epoll - Configuration options for the epoll interface
++--------------------------------------------------------
++
++This directory contains configuration options for the epoll(7) interface.
++
++max_user_instances
++------------------
++
++This is the maximum number of epoll file descriptors that a single user can
++have open at a given time. The default value is 128, and should be enough
++for normal users.
++
++max_user_watches
++----------------
++
++Every epoll file descriptor can store a number of files to be monitored
++for event readiness. Each one of these monitored files constitutes a "watch".
++This configuration option sets the maximum number of "watches" that are
++allowed for each user.
++Each "watch" costs roughly 90 bytes on a 32bit kernel, and roughly 160 bytes
++on a 64bit one.
++The current default value for  max_user_watches  is the 1/32 of the available
++low memory, divided for the "watch" cost in bytes.
++
++
+ ------------------------------------------------------------------------------
++
+diff --git a/Makefile b/Makefile
+index b5f52f3..a629d7f 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .7
++EXTRAVERSION = .8
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/ia64/kernel/acpi.c b/arch/ia64/kernel/acpi.c
+index 5d1eb7e..8a7e508 100644
+--- a/arch/ia64/kernel/acpi.c
++++ b/arch/ia64/kernel/acpi.c
+@@ -656,6 +656,30 @@ static int __init acpi_parse_fadt(struct acpi_table_header *table)
+       return 0;
+ }
++int __init early_acpi_boot_init(void)
++{
++      int ret;
++
++      /*
++       * do a partial walk of MADT to determine how many CPUs
++       * we have including offline CPUs
++       */
++      if (acpi_table_parse(ACPI_SIG_MADT, acpi_parse_madt)) {
++              printk(KERN_ERR PREFIX "Can't find MADT\n");
++              return 0;
++      }
++
++      ret = acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC,
++              acpi_parse_lsapic, NR_CPUS);
++      if (ret < 1)
++              printk(KERN_ERR PREFIX
++                     "Error parsing MADT - no LAPIC entries\n");
++
++      return 0;
++}
++
++
++
+ int __init acpi_boot_init(void)
+ {
+@@ -679,11 +703,6 @@ int __init acpi_boot_init(void)
+               printk(KERN_ERR PREFIX
+                      "Error parsing LAPIC address override entry\n");
+-      if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_SAPIC, acpi_parse_lsapic, NR_CPUS)
+-          < 1)
+-              printk(KERN_ERR PREFIX
+-                     "Error parsing MADT - no LAPIC entries\n");
+-
+       if (acpi_table_parse_madt(ACPI_MADT_TYPE_LOCAL_APIC_NMI, acpi_parse_lapic_nmi, 0)
+           < 0)
+               printk(KERN_ERR PREFIX "Error parsing LAPIC NMI entry\n");
+diff --git a/arch/ia64/kernel/setup.c b/arch/ia64/kernel/setup.c
+index de636b2..6030236 100644
+--- a/arch/ia64/kernel/setup.c
++++ b/arch/ia64/kernel/setup.c
+@@ -549,8 +549,12 @@ setup_arch (char **cmdline_p)
+ #ifdef CONFIG_ACPI
+       /* Initialize the ACPI boot-time table parser */
+       acpi_table_init();
++      early_acpi_boot_init();
+ # ifdef CONFIG_ACPI_NUMA
+       acpi_numa_init();
++#ifdef CONFIG_ACPI_HOTPLUG_CPU
++      prefill_possible_map();
++#endif
+       per_cpu_scan_finalize((cpus_weight(early_cpu_possible_map) == 0 ?
+               32 : cpus_weight(early_cpu_possible_map)),
+               additional_cpus > 0 ? additional_cpus : 0);
+@@ -841,9 +845,6 @@ void __init
+ setup_per_cpu_areas (void)
+ {
+       /* start_kernel() requires this... */
+-#ifdef CONFIG_ACPI_HOTPLUG_CPU
+-      prefill_possible_map();
+-#endif
+ }
+ /*
+diff --git a/arch/parisc/kernel/traps.c b/arch/parisc/kernel/traps.c
+index 675f1d0..4c771cd 100644
+--- a/arch/parisc/kernel/traps.c
++++ b/arch/parisc/kernel/traps.c
+@@ -24,7 +24,6 @@
+ #include <linux/init.h>
+ #include <linux/interrupt.h>
+ #include <linux/console.h>
+-#include <linux/kallsyms.h>
+ #include <linux/bug.h>
+ #include <asm/assembly.h>
+@@ -51,7 +50,7 @@
+ DEFINE_SPINLOCK(pa_dbit_lock);
+ #endif
+-void parisc_show_stack(struct task_struct *t, unsigned long *sp,
++static void parisc_show_stack(struct task_struct *task, unsigned long *sp,
+       struct pt_regs *regs);
+ static int printbinary(char *buf, unsigned long x, int nbits)
+@@ -121,18 +120,19 @@ static void print_fr(char *level, struct pt_regs *regs)
+ void show_regs(struct pt_regs *regs)
+ {
+-      int i;
++      int i, user;
+       char *level;
+       unsigned long cr30, cr31;
+-      level = user_mode(regs) ? KERN_DEBUG : KERN_CRIT;
++      user = user_mode(regs);
++      level = user ? KERN_DEBUG : KERN_CRIT;
+       print_gr(level, regs);
+       for (i = 0; i < 8; i += 4)
+               PRINTREGS(level, regs->sr, "sr", RFMT, i);
+-      if (user_mode(regs))
++      if (user)
+               print_fr(level, regs);
+       cr30 = mfctl(30);
+@@ -145,14 +145,18 @@ void show_regs(struct pt_regs *regs)
+       printk("%s CPU: %8d   CR30: " RFMT " CR31: " RFMT "\n",
+              level, current_thread_info()->cpu, cr30, cr31);
+       printk("%s ORIG_R28: " RFMT "\n", level, regs->orig_r28);
+-      printk(level);
+-      print_symbol(" IAOQ[0]: %s\n", regs->iaoq[0]);
+-      printk(level);
+-      print_symbol(" IAOQ[1]: %s\n", regs->iaoq[1]);
+-      printk(level);
+-      print_symbol(" RP(r2): %s\n", regs->gr[2]);
+-
+-      parisc_show_stack(current, NULL, regs);
++
++      if (user) {
++              printk("%s IAOQ[0]: " RFMT "\n", level, regs->iaoq[0]);
++              printk("%s IAOQ[1]: " RFMT "\n", level, regs->iaoq[1]);
++              printk("%s RP(r2): " RFMT "\n", level, regs->gr[2]);
++      } else {
++              printk("%s IAOQ[0]: %pS\n", level, (void *) regs->iaoq[0]);
++              printk("%s IAOQ[1]: %pS\n", level, (void *) regs->iaoq[1]);
++              printk("%s RP(r2): %pS\n", level, (void *) regs->gr[2]);
++
++              parisc_show_stack(current, NULL, regs);
++      }
+ }
+@@ -173,20 +177,15 @@ static void do_show_stack(struct unwind_frame_info *info)
+                       break;
+               if (__kernel_text_address(info->ip)) {
+-                      printk("%s [<" RFMT ">] ", (i&0x3)==1 ? KERN_CRIT : "", info->ip);
+-#ifdef CONFIG_KALLSYMS
+-                      print_symbol("%s\n", info->ip);
+-#else
+-                      if ((i & 0x03) == 0)
+-                              printk("\n");
+-#endif
++                      printk(KERN_CRIT " [<" RFMT ">] %pS\n",
++                              info->ip, (void *) info->ip);
+                       i++;
+               }
+       }
+-      printk("\n");
++      printk(KERN_CRIT "\n");
+ }
+-void parisc_show_stack(struct task_struct *task, unsigned long *sp,
++static void parisc_show_stack(struct task_struct *task, unsigned long *sp,
+       struct pt_regs *regs)
+ {
+       struct unwind_frame_info info;
+diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c
+index 010a51f..d5c3b45 100644
+--- a/arch/powerpc/platforms/cell/spufs/file.c
++++ b/arch/powerpc/platforms/cell/spufs/file.c
+@@ -390,6 +390,9 @@ static int spufs_ps_fault(struct vm_area_struct *vma,
+       if (offset >= ps_size)
+               return VM_FAULT_SIGBUS;
++      if (fatal_signal_pending(current))
++              return VM_FAULT_SIGBUS;
++
+       /*
+        * Because we release the mmap_sem, the context may be destroyed while
+        * we're in spu_wait. Grab an extra reference so it isn't destroyed
+diff --git a/arch/powerpc/platforms/cell/spufs/inode.c b/arch/powerpc/platforms/cell/spufs/inode.c
+index 690ca7b..5c73b62 100644
+--- a/arch/powerpc/platforms/cell/spufs/inode.c
++++ b/arch/powerpc/platforms/cell/spufs/inode.c
+@@ -496,6 +496,8 @@ spufs_create_context(struct inode *inode, struct dentry *dentry,
+       ret = spufs_context_open(dget(dentry), mntget(mnt));
+       if (ret < 0) {
+               WARN_ON(spufs_rmdir(inode, dentry));
++              if (affinity)
++                      mutex_unlock(&gang->aff_mutex);
+               mutex_unlock(&inode->i_mutex);
+               spu_forget(SPUFS_I(dentry->d_inode)->i_ctx);
+               goto out;
+diff --git a/arch/x86/kernel/acpi/boot.c b/arch/x86/kernel/acpi/boot.c
+index c102af8..7d58e7f 100644
+--- a/arch/x86/kernel/acpi/boot.c
++++ b/arch/x86/kernel/acpi/boot.c
+@@ -1593,6 +1593,11 @@ static struct dmi_system_id __initdata acpi_dmi_table[] = {
+                    DMI_MATCH(DMI_PRODUCT_NAME, "TravelMate 360"),
+                    },
+        },
++      {}
++};
++
++/* second table for DMI checks that should run after early-quirks */
++static struct dmi_system_id __initdata acpi_dmi_table_late[] = {
+       /*
+        * HP laptops which use a DSDT reporting as HP/SB400/10000,
+        * which includes some code which overrides all temperature
+@@ -1721,6 +1726,9 @@ int __init early_acpi_boot_init(void)
+ int __init acpi_boot_init(void)
+ {
++      /* those are executed after early-quirks are executed */
++      dmi_check_system(acpi_dmi_table_late);
++
+       /*
+        * If acpi_disabled, bail out
+        * One exception: acpi=ht continues far enough to enumerate LAPICs
+diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+index 84bb395..20bda8c 100644
+--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
++++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.c
+@@ -116,9 +116,20 @@ static int query_current_values_with_pending_wait(struct powernow_k8_data *data)
+       u32 i = 0;
+       if (cpu_family == CPU_HW_PSTATE) {
+-              rdmsr(MSR_PSTATE_STATUS, lo, hi);
+-              i = lo & HW_PSTATE_MASK;
+-              data->currpstate = i;
++              if (data->currpstate == HW_PSTATE_INVALID) {
++                      /* read (initial) hw pstate if not yet set */
++                      rdmsr(MSR_PSTATE_STATUS, lo, hi);
++                      i = lo & HW_PSTATE_MASK;
++
++                      /*
++                       * a workaround for family 11h erratum 311 might cause
++                       * an "out-of-range Pstate if the core is in Pstate-0
++                       */
++                      if (i >= data->numps)
++                              data->currpstate = HW_PSTATE_0;
++                      else
++                              data->currpstate = i;
++              }
+               return 0;
+       }
+       do {
+@@ -1117,6 +1128,7 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
+       }
+       data->cpu = pol->cpu;
++      data->currpstate = HW_PSTATE_INVALID;
+       if (powernow_k8_cpu_init_acpi(data)) {
+               /*
+diff --git a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
+index ab48cfe..65cfb5d 100644
+--- a/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
++++ b/arch/x86/kernel/cpu/cpufreq/powernow-k8.h
+@@ -5,6 +5,19 @@
+  *  http://www.gnu.org/licenses/gpl.html
+  */
++
++enum pstate {
++      HW_PSTATE_INVALID = 0xff,
++      HW_PSTATE_0 = 0,
++      HW_PSTATE_1 = 1,
++      HW_PSTATE_2 = 2,
++      HW_PSTATE_3 = 3,
++      HW_PSTATE_4 = 4,
++      HW_PSTATE_5 = 5,
++      HW_PSTATE_6 = 6,
++      HW_PSTATE_7 = 7,
++};
++
+ struct powernow_k8_data {
+       unsigned int cpu;
+@@ -23,7 +36,9 @@ struct powernow_k8_data {
+         u32 exttype; /* extended interface = 1 */
+       /* keep track of the current fid / vid or pstate */
+-      u32 currvid, currfid, currpstate;
++      u32 currvid;
++      u32 currfid;
++      enum pstate currpstate;
+       /* the powernow_table includes all frequency and vid/fid pairings:
+        * fid are the lower 8 bits of the index, vid are the upper 8 bits.
+diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c
+index 6b839b1..1b894b7 100644
+--- a/arch/x86/kernel/early-quirks.c
++++ b/arch/x86/kernel/early-quirks.c
+@@ -95,7 +95,8 @@ static void __init nvidia_bugs(int num, int slot, int func)
+ }
+-static u32 ati_ixp4x0_rev(int num, int slot, int func)
++#if defined(CONFIG_ACPI) && defined(CONFIG_X86_IO_APIC)
++static u32 __init ati_ixp4x0_rev(int num, int slot, int func)
+ {
+       u32 d;
+       u8  b;
+@@ -115,7 +116,6 @@ static u32 ati_ixp4x0_rev(int num, int slot, int func)
+ static void __init ati_bugs(int num, int slot, int func)
+ {
+-#if defined(CONFIG_ACPI) && defined (CONFIG_X86_IO_APIC)
+       u32 d;
+       u8  b;
+@@ -138,9 +138,56 @@ static void __init ati_bugs(int num, int slot, int func)
+               printk(KERN_INFO "If you got timer trouble "
+                      "try acpi_use_timer_override\n");
+       }
+-#endif
+ }
++static u32 __init ati_sbx00_rev(int num, int slot, int func)
++{
++      u32 old, d;
++
++      d = read_pci_config(num, slot, func, 0x70);
++      old = d;
++      d &= ~(1<<8);
++      write_pci_config(num, slot, func, 0x70, d);
++      d = read_pci_config(num, slot, func, 0x8);
++      d &= 0xff;
++      write_pci_config(num, slot, func, 0x70, old);
++
++      return d;
++}
++
++static void __init ati_bugs_contd(int num, int slot, int func)
++{
++      u32 d, rev;
++
++      if (acpi_use_timer_override)
++              return;
++
++      rev = ati_sbx00_rev(num, slot, func);
++      if (rev > 0x13)
++              return;
++
++      /* check for IRQ0 interrupt swap */
++      d = read_pci_config(num, slot, func, 0x64);
++      if (!(d & (1<<14)))
++              acpi_skip_timer_override = 1;
++
++      if (acpi_skip_timer_override) {
++              printk(KERN_INFO "SB600 revision 0x%x\n", rev);
++              printk(KERN_INFO "Ignoring ACPI timer override.\n");
++              printk(KERN_INFO "If you got timer trouble "
++                     "try acpi_use_timer_override\n");
++      }
++}
++#else
++static void __init ati_bugs(int num, int slot, int func)
++{
++}
++
++static void __init ati_bugs_contd(int num, int slot, int func)
++{
++}
++#endif
++
+ #define QFLAG_APPLY_ONCE      0x1
+ #define QFLAG_APPLIED         0x2
+ #define QFLAG_DONE            (QFLAG_APPLY_ONCE|QFLAG_APPLIED)
+@@ -162,6 +209,8 @@ static struct chipset early_qrk[] __initdata = {
+         PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config },
+       { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_IXP400_SMBUS,
+         PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs },
++      { PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_SBX00_SMBUS,
++        PCI_CLASS_SERIAL_SMBUS, PCI_ANY_ID, 0, ati_bugs_contd },
+       {}
+ };
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 64b5c42..7667443 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -604,7 +604,7 @@ static struct dmi_system_id __initdata bad_bios_dmi_table[] = {
+               .callback = dmi_low_memory_corruption,
+               .ident = "Phoenix BIOS",
+               .matches = {
+-                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies, LTD"),
++                      DMI_MATCH(DMI_BIOS_VENDOR, "Phoenix Technologies"),
+               },
+       },
+ #endif
+diff --git a/arch/x86/mm/discontig_32.c b/arch/x86/mm/discontig_32.c
+index 62fa440..62aec7e 100644
+--- a/arch/x86/mm/discontig_32.c
++++ b/arch/x86/mm/discontig_32.c
+@@ -222,6 +222,41 @@ static void __init remap_numa_kva(void)
+       }
+ }
++#ifdef CONFIG_HIBERNATION
++/**
++ * resume_map_numa_kva - add KVA mapping to the temporary page tables created
++ *                       during resume from hibernation
++ * @pgd_base - temporary resume page directory
++ */
++void resume_map_numa_kva(pgd_t *pgd_base)
++{
++      int node;
++
++      for_each_online_node(node) {
++              unsigned long start_va, start_pfn, size, pfn;
++
++              start_va = (unsigned long)node_remap_start_vaddr[node];
++              start_pfn = node_remap_start_pfn[node];
++              size = node_remap_size[node];
++
++              printk(KERN_DEBUG "%s: node %d\n", __FUNCTION__, node);
++
++              for (pfn = 0; pfn < size; pfn += PTRS_PER_PTE) {
++                      unsigned long vaddr = start_va + (pfn << PAGE_SHIFT);
++                      pgd_t *pgd = pgd_base + pgd_index(vaddr);
++                      pud_t *pud = pud_offset(pgd, vaddr);
++                      pmd_t *pmd = pmd_offset(pud, vaddr);
++
++                      set_pmd(pmd, pfn_pmd(start_pfn + pfn,
++                                              PAGE_KERNEL_LARGE_EXEC));
++
++                      printk(KERN_DEBUG "%s: %08lx -> pfn %08lx\n",
++                              __FUNCTION__, vaddr, start_pfn + pfn);
++              }
++      }
++}
++#endif
++
+ static unsigned long calculate_numa_remap_pages(void)
+ {
+       int nid;
+diff --git a/arch/x86/power/hibernate_32.c b/arch/x86/power/hibernate_32.c
+index f2b6e3f..81197c6 100644
+--- a/arch/x86/power/hibernate_32.c
++++ b/arch/x86/power/hibernate_32.c
+@@ -12,6 +12,7 @@
+ #include <asm/system.h>
+ #include <asm/page.h>
+ #include <asm/pgtable.h>
++#include <asm/mmzone.h>
+ /* Defined in hibernate_asm_32.S */
+ extern int restore_image(void);
+@@ -127,6 +128,9 @@ static int resume_physical_mapping_init(pgd_t *pgd_base)
+                       }
+               }
+       }
++
++      resume_map_numa_kva(pgd_base);
++
+       return 0;
+ }
+diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c
+index a4e201b..6bbcf8a 100644
+--- a/arch/x86/xen/enlighten.c
++++ b/arch/x86/xen/enlighten.c
+@@ -1413,7 +1413,7 @@ static void __init xen_reserve_top(void)
+       if (HYPERVISOR_xen_version(XENVER_platform_parameters, &pp) == 0)
+               top = pp.virt_start;
+-      reserve_top_address(-top + 2 * PAGE_SIZE);
++      reserve_top_address(-top);
+ #endif        /* CONFIG_X86_32 */
+ }
+diff --git a/drivers/acpi/ec.c b/drivers/acpi/ec.c
+index 41b8e7c..9ab3fb9 100644
+--- a/drivers/acpi/ec.c
++++ b/drivers/acpi/ec.c
+@@ -219,7 +219,8 @@ static void gpe_transaction(struct acpi_ec *ec, u8 status)
+       goto unlock;
+ err:
+       /* false interrupt, state didn't change */
+-      ++ec->curr->irq_count;
++      if (in_interrupt())
++              ++ec->curr->irq_count;
+ unlock:
+       spin_unlock_irqrestore(&ec->curr_lock, flags);
+ }
+diff --git a/drivers/acpi/pci_slot.c b/drivers/acpi/pci_slot.c
+index d5b4ef8..8d4a568 100644
+--- a/drivers/acpi/pci_slot.c
++++ b/drivers/acpi/pci_slot.c
+@@ -150,7 +150,7 @@ register_slot(acpi_handle handle, u32 lvl, void *context, void **rv)
+       }
+       snprintf(name, sizeof(name), "%u", (u32)sun);
+-      pci_slot = pci_create_slot(pci_bus, device, name);
++      pci_slot = pci_create_slot(pci_bus, device, name, NULL);
+       if (IS_ERR(pci_slot)) {
+               err("pci_create_slot returned %ld\n", PTR_ERR(pci_slot));
+               kfree(slot);
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index 8228ae3..b551cda 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -551,7 +551,7 @@ u64 ata_tf_read_block(struct ata_taskfile *tf, struct ata_device *dev)
+               if (tf->flags & ATA_TFLAG_LBA48) {
+                       block |= (u64)tf->hob_lbah << 40;
+                       block |= (u64)tf->hob_lbam << 32;
+-                      block |= tf->hob_lbal << 24;
++                      block |= (u64)tf->hob_lbal << 24;
+               } else
+                       block |= (tf->device & 0xf) << 24;
+@@ -1207,7 +1207,7 @@ u64 ata_tf_to_lba48(const struct ata_taskfile *tf)
+       sectors |= ((u64)(tf->hob_lbah & 0xff)) << 40;
+       sectors |= ((u64)(tf->hob_lbam & 0xff)) << 32;
+-      sectors |= (tf->hob_lbal & 0xff) << 24;
++      sectors |= ((u64)(tf->hob_lbal & 0xff)) << 24;
+       sectors |= (tf->lbah & 0xff) << 16;
+       sectors |= (tf->lbam & 0xff) << 8;
+       sectors |= (tf->lbal & 0xff);
+@@ -2428,6 +2428,13 @@ int ata_dev_configure(struct ata_device *dev)
+               }
+       }
++      if ((dev->horkage & ATA_HORKAGE_FIRMWARE_WARN) && print_info) {
++              ata_dev_printk(dev, KERN_WARNING, "WARNING: device requires "
++                             "firmware update to be fully functional.\n");
++              ata_dev_printk(dev, KERN_WARNING, "         contact the vendor "
++                             "or visit http://ata.wiki.kernel.org.\n");
++      }
++
+       return 0;
+ err_out_nosup:
+@@ -3971,6 +3978,20 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+       { "ST380817AS",         "3.42",         ATA_HORKAGE_NONCQ },
+       { "ST3160023AS",        "3.42",         ATA_HORKAGE_NONCQ },
++      /* Seagate NCQ + FLUSH CACHE firmware bug */
++      { "ST31500341AS",       "9JU138",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST31000333AS",       "9FZ136",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640623AS",        "9FZ164",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640323AS",        "9FZ134",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320813AS",        "9FZ182",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320613AS",        "9FZ162",       ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++
+       /* Blacklist entries taken from Silicon Image 3124/3132
+          Windows driver .inf file - also several Linux problem reports */
+       { "HTS541060G9SA00",    "MB3OC60D",     ATA_HORKAGE_NONCQ, },
+diff --git a/drivers/firewire/fw-sbp2.c b/drivers/firewire/fw-sbp2.c
+index 4f73537..64142c1 100644
+--- a/drivers/firewire/fw-sbp2.c
++++ b/drivers/firewire/fw-sbp2.c
+@@ -365,6 +365,11 @@ static const struct {
+       },
+       /* iPod mini */ {
+               .firmware_revision      = 0x0a2700,
++              .model                  = 0x000022,
++              .workarounds            = SBP2_WORKAROUND_FIX_CAPACITY,
++      },
++      /* iPod mini */ {
++              .firmware_revision      = 0x0a2700,
+               .model                  = 0x000023,
+               .workarounds            = SBP2_WORKAROUND_FIX_CAPACITY,
+       },
+diff --git a/drivers/gpio/gpiolib.c b/drivers/gpio/gpiolib.c
+index 59f6ad8..9ed5947 100644
+--- a/drivers/gpio/gpiolib.c
++++ b/drivers/gpio/gpiolib.c
+@@ -1049,7 +1049,7 @@ static void gpiolib_dbg_show(struct seq_file *s, struct gpio_chip *chip)
+                       continue;
+               is_out = test_bit(FLAG_IS_OUT, &gdesc->flags);
+-              seq_printf(s, " gpio-%-3d (%-12s) %s %s",
++              seq_printf(s, " gpio-%-3d (%-20.20s) %s %s",
+                       gpio, gdesc->label,
+                       is_out ? "out" : "in ",
+                       chip->get
+diff --git a/drivers/ieee1394/sbp2.c b/drivers/ieee1394/sbp2.c
+index 1d6ad34..bad46ea 100644
+--- a/drivers/ieee1394/sbp2.c
++++ b/drivers/ieee1394/sbp2.c
+@@ -402,6 +402,11 @@ static const struct {
+       },
+       /* iPod mini */ {
+               .firmware_revision      = 0x0a2700,
++              .model_id               = 0x000022,
++              .workarounds            = SBP2_WORKAROUND_FIX_CAPACITY,
++      },
++      /* iPod mini */ {
++              .firmware_revision      = 0x0a2700,
+               .model_id               = 0x000023,
+               .workarounds            = SBP2_WORKAROUND_FIX_CAPACITY,
+       },
+diff --git a/drivers/infiniband/hw/mlx4/cq.c b/drivers/infiniband/hw/mlx4/cq.c
+index d0866a3..1830849 100644
+--- a/drivers/infiniband/hw/mlx4/cq.c
++++ b/drivers/infiniband/hw/mlx4/cq.c
+@@ -343,6 +343,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
+ {
+       struct mlx4_ib_dev *dev = to_mdev(ibcq->device);
+       struct mlx4_ib_cq *cq = to_mcq(ibcq);
++      struct mlx4_mtt mtt;
+       int outst_cqe;
+       int err;
+@@ -376,10 +377,13 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
+                       goto out;
+       }
++      mtt = cq->buf.mtt;
++
+       err = mlx4_cq_resize(dev->dev, &cq->mcq, entries, &cq->resize_buf->buf.mtt);
+       if (err)
+               goto err_buf;
++      mlx4_mtt_cleanup(dev->dev, &mtt);
+       if (ibcq->uobject) {
+               cq->buf      = cq->resize_buf->buf;
+               cq->ibcq.cqe = cq->resize_buf->cqe;
+@@ -406,6 +410,7 @@ int mlx4_ib_resize_cq(struct ib_cq *ibcq, int entries, struct ib_udata *udata)
+       goto out;
+ err_buf:
++      mlx4_mtt_cleanup(dev->dev, &cq->resize_buf->buf.mtt);
+       if (!ibcq->uobject)
+               mlx4_ib_free_cq_buf(dev, &cq->resize_buf->buf,
+                                   cq->resize_buf->cqe);
+diff --git a/drivers/input/keyboard/atkbd.c b/drivers/input/keyboard/atkbd.c
+index e32c24d..c694eaa 100644
+--- a/drivers/input/keyboard/atkbd.c
++++ b/drivers/input/keyboard/atkbd.c
+@@ -868,6 +868,22 @@ static void atkbd_hp_keymap_fixup(struct atkbd *atkbd)
+ }
+ /*
++ * Inventec system with broken key release on volume keys
++ */
++static void atkbd_inventec_keymap_fixup(struct atkbd *atkbd)
++{
++      const unsigned int forced_release_keys[] = {
++              0xae, 0xb0,
++      };
++      int i;
++
++      if (atkbd->set == 2)
++              for (i = 0; i < ARRAY_SIZE(forced_release_keys); i++)
++                      __set_bit(forced_release_keys[i],
++                                atkbd->force_release_mask);
++}
++
++/*
+  * atkbd_set_keycode_table() initializes keyboard's keycode table
+  * according to the selected scancode set
+  */
+@@ -1478,6 +1494,15 @@ static struct dmi_system_id atkbd_dmi_quirk_table[] __initdata = {
+               .callback = atkbd_setup_fixup,
+               .driver_data = atkbd_hp_keymap_fixup,
+       },
++      {
++              .ident = "Inventec Symphony",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "INVENTEC"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "SYMPHONY 6.0/7.0"),
++              },
++              .callback = atkbd_setup_fixup,
++              .driver_data = atkbd_inventec_keymap_fixup,
++      },
+       { }
+ };
+diff --git a/drivers/media/video/compat_ioctl32.c b/drivers/media/video/compat_ioctl32.c
+index bd5d9de..e6ca401 100644
+--- a/drivers/media/video/compat_ioctl32.c
++++ b/drivers/media/video/compat_ioctl32.c
+@@ -867,6 +867,7 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
+       case VIDIOC_STREAMON32:
+       case VIDIOC_STREAMOFF32:
+       case VIDIOC_G_PARM:
++      case VIDIOC_S_PARM:
+       case VIDIOC_G_STD:
+       case VIDIOC_S_STD:
+       case VIDIOC_G_TUNER:
+@@ -885,6 +886,8 @@ long v4l_compat_ioctl32(struct file *file, unsigned int cmd, unsigned long arg)
+       case VIDIOC_S_INPUT32:
+       case VIDIOC_TRY_FMT32:
+       case VIDIOC_S_HW_FREQ_SEEK:
++      case VIDIOC_ENUM_FRAMESIZES:
++      case VIDIOC_ENUM_FRAMEINTERVALS:
+               ret = do_video_ioctl(file, cmd, arg);
+               break;
+diff --git a/drivers/net/atl1e/atl1e_hw.c b/drivers/net/atl1e/atl1e_hw.c
+index 949e753..c0d5f7c 100644
+--- a/drivers/net/atl1e/atl1e_hw.c
++++ b/drivers/net/atl1e/atl1e_hw.c
+@@ -163,9 +163,6 @@ int atl1e_read_mac_addr(struct atl1e_hw *hw)
+  * atl1e_hash_mc_addr
+  *  purpose
+  *      set hash value for a multicast address
+- *      hash calcu processing :
+- *          1. calcu 32bit CRC for multicast address
+- *          2. reverse crc with MSB to LSB
+  */
+ u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr)
+ {
+@@ -174,7 +171,6 @@ u32 atl1e_hash_mc_addr(struct atl1e_hw *hw, u8 *mc_addr)
+       int i;
+       crc32 = ether_crc_le(6, mc_addr);
+-      crc32 = ~crc32;
+       for (i = 0; i < 32; i++)
+               value |= (((crc32 >> i) & 1) << (31 - i));
+diff --git a/drivers/net/e1000/e1000_ethtool.c b/drivers/net/e1000/e1000_ethtool.c
+index 6a3893a..c854c96 100644
+--- a/drivers/net/e1000/e1000_ethtool.c
++++ b/drivers/net/e1000/e1000_ethtool.c
+@@ -1774,7 +1774,8 @@ static void e1000_get_wol(struct net_device *netdev,
+       /* this function will set ->supported = 0 and return 1 if wol is not
+        * supported by this hardware */
+-      if (e1000_wol_exclusion(adapter, wol))
++      if (e1000_wol_exclusion(adapter, wol) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return;
+       /* apply any specific unsupported masks here */
+@@ -1811,7 +1812,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+       if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
+               return -EOPNOTSUPP;
+-      if (e1000_wol_exclusion(adapter, wol))
++      if (e1000_wol_exclusion(adapter, wol) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return wol->wolopts ? -EOPNOTSUPP : 0;
+       switch (hw->device_id) {
+@@ -1838,6 +1840,8 @@ static int e1000_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+       if (wol->wolopts & WAKE_MAGIC)
+               adapter->wol |= E1000_WUFC_MAG;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
++
+       return 0;
+ }
+diff --git a/drivers/net/e1000/e1000_main.c b/drivers/net/e1000/e1000_main.c
+index ad6da7b..872ea58 100644
+--- a/drivers/net/e1000/e1000_main.c
++++ b/drivers/net/e1000/e1000_main.c
+@@ -1180,6 +1180,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+       /* initialize the wol settings based on the eeprom settings */
+       adapter->wol = adapter->eeprom_wol;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
+       /* print bus type/speed/width info */
+       DPRINTK(PROBE, INFO, "(PCI%s:%s:%s) ",
+diff --git a/drivers/net/e1000e/ethtool.c b/drivers/net/e1000e/ethtool.c
+index 33a3ff1..e2a30dd 100644
+--- a/drivers/net/e1000e/ethtool.c
++++ b/drivers/net/e1000e/ethtool.c
+@@ -1681,7 +1681,8 @@ static void e1000_get_wol(struct net_device *netdev,
+       wol->supported = 0;
+       wol->wolopts = 0;
+-      if (!(adapter->flags & FLAG_HAS_WOL))
++      if (!(adapter->flags & FLAG_HAS_WOL) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return;
+       wol->supported = WAKE_UCAST | WAKE_MCAST |
+@@ -1719,7 +1720,8 @@ static int e1000_set_wol(struct net_device *netdev,
+       if (wol->wolopts & WAKE_MAGICSECURE)
+               return -EOPNOTSUPP;
+-      if (!(adapter->flags & FLAG_HAS_WOL))
++      if (!(adapter->flags & FLAG_HAS_WOL) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return wol->wolopts ? -EOPNOTSUPP : 0;
+       /* these settings will always override what we currently have */
+@@ -1738,6 +1740,8 @@ static int e1000_set_wol(struct net_device *netdev,
+       if (wol->wolopts & WAKE_ARP)
+               adapter->wol |= E1000_WUFC_ARP;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
++
+       return 0;
+ }
+diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c
+index b81c423..660c85a 100644
+--- a/drivers/net/e1000e/netdev.c
++++ b/drivers/net/e1000e/netdev.c
+@@ -4616,6 +4616,7 @@ static int __devinit e1000_probe(struct pci_dev *pdev,
+       /* initialize the wol settings based on the eeprom settings */
+       adapter->wol = adapter->eeprom_wol;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
+       /* reset the hardware with the new settings */
+       e1000e_reset(adapter);
+diff --git a/drivers/net/igb/igb_ethtool.c b/drivers/net/igb/igb_ethtool.c
+index 58906c9..89964fa 100644
+--- a/drivers/net/igb/igb_ethtool.c
++++ b/drivers/net/igb/igb_ethtool.c
+@@ -1776,7 +1776,8 @@ static void igb_get_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+       /* this function will set ->supported = 0 and return 1 if wol is not
+        * supported by this hardware */
+-      if (igb_wol_exclusion(adapter, wol))
++      if (igb_wol_exclusion(adapter, wol) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return;
+       /* apply any specific unsupported masks here */
+@@ -1805,7 +1806,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+       if (wol->wolopts & (WAKE_PHY | WAKE_ARP | WAKE_MAGICSECURE))
+               return -EOPNOTSUPP;
+-      if (igb_wol_exclusion(adapter, wol))
++      if (igb_wol_exclusion(adapter, wol) ||
++          !device_can_wakeup(&adapter->pdev->dev))
+               return wol->wolopts ? -EOPNOTSUPP : 0;
+       switch (hw->device_id) {
+@@ -1825,6 +1827,8 @@ static int igb_set_wol(struct net_device *netdev, struct ethtool_wolinfo *wol)
+       if (wol->wolopts & WAKE_MAGIC)
+               adapter->wol |= E1000_WUFC_MAG;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
++
+       return 0;
+ }
+diff --git a/drivers/net/igb/igb_main.c b/drivers/net/igb/igb_main.c
+index 634c4c9..11b5df3 100644
+--- a/drivers/net/igb/igb_main.c
++++ b/drivers/net/igb/igb_main.c
+@@ -1220,6 +1220,7 @@ static int __devinit igb_probe(struct pci_dev *pdev,
+       /* initialize the wol settings based on the eeprom settings */
+       adapter->wol = adapter->eeprom_wol;
++      device_set_wakeup_enable(&adapter->pdev->dev, adapter->wol);
+       /* reset the hardware with the new settings */
+       igb_reset(adapter);
+diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c
+index 52bf11b..2f68295 100644
+--- a/drivers/net/pcmcia/axnet_cs.c
++++ b/drivers/net/pcmcia/axnet_cs.c
+@@ -787,6 +787,7 @@ static struct pcmcia_device_id axnet_ids[] = {
+       PCMCIA_DEVICE_PROD_ID12("IO DATA", "ETXPCM", 0x547e66dc, 0x233adac2),
+       PCMCIA_DEVICE_PROD_ID12("Linksys", "EtherFast 10/100 PC Card (PCMPC100 V3)", 0x0733cc81, 0x232019a8),
+       PCMCIA_DEVICE_PROD_ID12("MELCO", "LPC3-TX", 0x481e0094, 0xf91af609),
++      PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA411", 0x9aa79dc3, 0x40fad875),
+       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "100BASE", 0x281f1c5d, 0x7c2add04),
+       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FastEtherCard", 0x281f1c5d, 0x7ef26116),
+       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "FEP501", 0x281f1c5d, 0x2e272058),
+diff --git a/drivers/net/pcmcia/pcnet_cs.c b/drivers/net/pcmcia/pcnet_cs.c
+index ebc1ae6..7d6cf02 100644
+--- a/drivers/net/pcmcia/pcnet_cs.c
++++ b/drivers/net/pcmcia/pcnet_cs.c
+@@ -1697,7 +1697,6 @@ static struct pcmcia_device_id pcnet_ids[] = {
+       PCMCIA_DEVICE_PROD_ID12("National Semiconductor", "InfoMover NE4100", 0x36e1191f, 0xa6617ec8),
+       PCMCIA_DEVICE_PROD_ID12("NEC", "PC-9801N-J12", 0x18df0ba0, 0xbc912d76),
+       PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA410TX", 0x9aa79dc3, 0x60e5bc0e),
+-      PCMCIA_DEVICE_PROD_ID12("NETGEAR", "FA411", 0x9aa79dc3, 0x40fad875),
+       PCMCIA_DEVICE_PROD_ID12("Network Everywhere", "Fast Ethernet 10/100 PC Card", 0x820a67b6, 0x31ed1a5f),
+       PCMCIA_DEVICE_PROD_ID12("NextCom K.K.", "Next Hawk", 0xaedaec74, 0xad050ef1),
+       PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100Mbps Ethernet Card", 0x281f1c5d, 0x6e41773b),
+diff --git a/drivers/net/wireless/ath9k/recv.c b/drivers/net/wireless/ath9k/recv.c
+index 20ddb7a..0941589 100644
+--- a/drivers/net/wireless/ath9k/recv.c
++++ b/drivers/net/wireless/ath9k/recv.c
+@@ -52,7 +52,7 @@ static void ath_rx_buf_link(struct ath_softc *sc, struct ath_buf *bf)
+       /* setup rx descriptors */
+       ath9k_hw_setuprxdesc(ah,
+                            ds,
+-                           skb_tailroom(skb),   /* buffer size */
++                           sc->sc_rxbufsize,
+                            0);
+       if (sc->sc_rxlink == NULL)
+@@ -1011,7 +1011,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush)
+               pci_dma_sync_single_for_cpu(sc->pdev,
+                                           bf->bf_buf_addr,
+-                                          skb_tailroom(skb),
++                                          sc->sc_rxbufsize,
+                                           PCI_DMA_FROMDEVICE);
+               pci_unmap_single(sc->pdev,
+                                bf->bf_buf_addr,
+@@ -1303,8 +1303,7 @@ dma_addr_t ath_skb_map_single(struct ath_softc *sc,
+        * NB: do NOT use skb->len, which is 0 on initialization.
+        * Use skb's entire data area instead.
+        */
+-      *pa = pci_map_single(sc->pdev, skb->data,
+-              skb_end_pointer(skb) - skb->head, direction);
++      *pa = pci_map_single(sc->pdev, skb->data, sc->sc_rxbufsize, direction);
+       return *pa;
+ }
+@@ -1314,6 +1313,5 @@ void ath_skb_unmap_single(struct ath_softc *sc,
+                         dma_addr_t *pa)
+ {
+       /* Unmap skb's entire data area */
+-      pci_unmap_single(sc->pdev, *pa,
+-              skb_end_pointer(skb) - skb->head, direction);
++      pci_unmap_single(sc->pdev, *pa, sc->sc_rxbufsize, direction);
+ }
+diff --git a/drivers/net/wireless/rtl8187_dev.c b/drivers/net/wireless/rtl8187_dev.c
+index 0cebbc4..1640096 100644
+--- a/drivers/net/wireless/rtl8187_dev.c
++++ b/drivers/net/wireless/rtl8187_dev.c
+@@ -33,10 +33,13 @@ MODULE_LICENSE("GPL");
+ static struct usb_device_id rtl8187_table[] __devinitdata = {
+       /* Asus */
+       {USB_DEVICE(0x0b05, 0x171d), .driver_info = DEVICE_RTL8187},
++      /* Belkin */
++      {USB_DEVICE(0x050d, 0x705e), .driver_info = DEVICE_RTL8187B},
+       /* Realtek */
+       {USB_DEVICE(0x0bda, 0x8187), .driver_info = DEVICE_RTL8187},
+       {USB_DEVICE(0x0bda, 0x8189), .driver_info = DEVICE_RTL8187B},
+       {USB_DEVICE(0x0bda, 0x8197), .driver_info = DEVICE_RTL8187B},
++      {USB_DEVICE(0x0bda, 0x8198), .driver_info = DEVICE_RTL8187B},
+       /* Netgear */
+       {USB_DEVICE(0x0846, 0x6100), .driver_info = DEVICE_RTL8187},
+       {USB_DEVICE(0x0846, 0x6a00), .driver_info = DEVICE_RTL8187},
+diff --git a/drivers/parport/parport_serial.c b/drivers/parport/parport_serial.c
+index e2e95b3..101ed49 100644
+--- a/drivers/parport/parport_serial.c
++++ b/drivers/parport/parport_serial.c
+@@ -70,6 +70,8 @@ static int __devinit netmos_parallel_init(struct pci_dev *dev, struct parport_pc
+        * parallel ports and <S> is the number of serial ports.
+        */
+       card->numports = (dev->subsystem_device & 0xf0) >> 4;
++      if (card->numports > ARRAY_SIZE(card->addr))
++              card->numports = ARRAY_SIZE(card->addr);
+       return 0;
+ }
+diff --git a/drivers/pci/hotplug/acpiphp.h b/drivers/pci/hotplug/acpiphp.h
+index 5a58b07..f9e244d 100644
+--- a/drivers/pci/hotplug/acpiphp.h
++++ b/drivers/pci/hotplug/acpiphp.h
+@@ -50,9 +50,6 @@
+ #define info(format, arg...) printk(KERN_INFO "%s: " format, MY_NAME , ## arg)
+ #define warn(format, arg...) printk(KERN_WARNING "%s: " format, MY_NAME , ## arg)
+-/* name size which is used for entries in pcihpfs */
+-#define SLOT_NAME_SIZE        20              /* {_SUN} */
+-
+ struct acpiphp_bridge;
+ struct acpiphp_slot;
+@@ -63,9 +60,13 @@ struct slot {
+       struct hotplug_slot     *hotplug_slot;
+       struct acpiphp_slot     *acpi_slot;
+       struct hotplug_slot_info info;
+-      char name[SLOT_NAME_SIZE];
+ };
++static inline const char *slot_name(struct slot *slot)
++{
++      return hotplug_slot_name(slot->hotplug_slot);
++}
++
+ /*
+  * struct acpiphp_bridge - PCI bridge information
+  *
+diff --git a/drivers/pci/hotplug/acpiphp_core.c b/drivers/pci/hotplug/acpiphp_core.c
+index 0e496e8..95b536a 100644
+--- a/drivers/pci/hotplug/acpiphp_core.c
++++ b/drivers/pci/hotplug/acpiphp_core.c
+@@ -44,6 +44,9 @@
+ #define MY_NAME       "acpiphp"
++/* name size which is used for entries in pcihpfs */
++#define SLOT_NAME_SIZE  21              /* {_SUN} */
++
+ static int debug;
+ int acpiphp_debug;
+@@ -84,7 +87,6 @@ static struct hotplug_slot_ops acpi_hotplug_slot_ops = {
+       .get_adapter_status     = get_adapter_status,
+ };
+-
+ /**
+  * acpiphp_register_attention - set attention LED callback
+  * @info: must be completely filled with LED callbacks
+@@ -136,7 +138,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       /* enable the specified slot */
+       return acpiphp_enable_slot(slot->acpi_slot);
+@@ -154,7 +156,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       /* disable the specified slot */
+       retval = acpiphp_disable_slot(slot->acpi_slot);
+@@ -177,7 +179,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
+  {
+       int retval = -ENODEV;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot_name(hotplug_slot));
+  
+       if (attention_info && try_module_get(attention_info->owner)) {
+               retval = attention_info->set_attn(hotplug_slot, status);
+@@ -200,7 +202,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = acpiphp_get_power_status(slot->acpi_slot);
+@@ -222,7 +224,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
+ {
+       int retval = -EINVAL;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot_name(hotplug_slot));
+       if (attention_info && try_module_get(attention_info->owner)) {
+               retval = attention_info->get_attn(hotplug_slot, value);
+@@ -245,7 +247,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = acpiphp_get_latch_status(slot->acpi_slot);
+@@ -265,7 +267,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = acpiphp_get_adapter_status(slot->acpi_slot);
+@@ -299,7 +301,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       kfree(slot->hotplug_slot);
+       kfree(slot);
+@@ -310,6 +312,7 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
+ {
+       struct slot *slot;
+       int retval = -ENOMEM;
++      char name[SLOT_NAME_SIZE];
+       slot = kzalloc(sizeof(*slot), GFP_KERNEL);
+       if (!slot)
+@@ -321,8 +324,6 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
+       slot->hotplug_slot->info = &slot->info;
+-      slot->hotplug_slot->name = slot->name;
+-
+       slot->hotplug_slot->private = slot;
+       slot->hotplug_slot->release = &release_slot;
+       slot->hotplug_slot->ops = &acpi_hotplug_slot_ops;
+@@ -336,11 +337,12 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
+       slot->hotplug_slot->info->cur_bus_speed = PCI_SPEED_UNKNOWN;
+       acpiphp_slot->slot = slot;
+-      snprintf(slot->name, sizeof(slot->name), "%u", slot->acpi_slot->sun);
++      snprintf(name, SLOT_NAME_SIZE, "%u", slot->acpi_slot->sun);
+       retval = pci_hp_register(slot->hotplug_slot,
+                                       acpiphp_slot->bridge->pci_bus,
+-                                      acpiphp_slot->device);
++                                      acpiphp_slot->device,
++                                      name);
+       if (retval == -EBUSY)
+               goto error_hpslot;
+       if (retval) {
+@@ -348,7 +350,7 @@ int acpiphp_register_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
+               goto error_hpslot;
+       }
+-      info("Slot [%s] registered\n", slot->hotplug_slot->name);
++      info("Slot [%s] registered\n", slot_name(slot));
+       return 0;
+ error_hpslot:
+@@ -365,7 +367,7 @@ void acpiphp_unregister_hotplug_slot(struct acpiphp_slot *acpiphp_slot)
+       struct slot *slot = acpiphp_slot->slot;
+       int retval = 0;
+-      info ("Slot [%s] unregistered\n", slot->hotplug_slot->name);
++      info("Slot [%s] unregistered\n", slot_name(slot));
+       retval = pci_hp_deregister(slot->hotplug_slot);
+       if (retval)
+diff --git a/drivers/pci/hotplug/cpci_hotplug.h b/drivers/pci/hotplug/cpci_hotplug.h
+index d9769b3..9fff878 100644
+--- a/drivers/pci/hotplug/cpci_hotplug.h
++++ b/drivers/pci/hotplug/cpci_hotplug.h
+@@ -30,6 +30,7 @@
+ #include <linux/types.h>
+ #include <linux/pci.h>
++#include <linux/pci_hotplug.h>
+ /* PICMG 2.1 R2.0 HS CSR bits: */
+ #define HS_CSR_INS    0x0080
+@@ -69,6 +70,11 @@ struct cpci_hp_controller {
+       struct cpci_hp_controller_ops *ops;
+ };
++static inline const char *slot_name(struct slot *slot)
++{
++      return hotplug_slot_name(slot->hotplug_slot);
++}
++
+ extern int cpci_hp_register_controller(struct cpci_hp_controller *controller);
+ extern int cpci_hp_unregister_controller(struct cpci_hp_controller *controller);
+ extern int cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last);
+diff --git a/drivers/pci/hotplug/cpci_hotplug_core.c b/drivers/pci/hotplug/cpci_hotplug_core.c
+index 9359479..de94f4f 100644
+--- a/drivers/pci/hotplug/cpci_hotplug_core.c
++++ b/drivers/pci/hotplug/cpci_hotplug_core.c
+@@ -108,7 +108,7 @@ enable_slot(struct hotplug_slot *hotplug_slot)
+       struct slot *slot = hotplug_slot->private;
+       int retval = 0;
+-      dbg("%s - physical_slot = %s", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s", __func__, slot_name(slot));
+       if (controller->ops->set_power)
+               retval = controller->ops->set_power(slot, 1);
+@@ -121,25 +121,23 @@ disable_slot(struct hotplug_slot *hotplug_slot)
+       struct slot *slot = hotplug_slot->private;
+       int retval = 0;
+-      dbg("%s - physical_slot = %s", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s", __func__, slot_name(slot));
+       down_write(&list_rwsem);
+       /* Unconfigure device */
+-      dbg("%s - unconfiguring slot %s",
+-          __func__, slot->hotplug_slot->name);
++      dbg("%s - unconfiguring slot %s", __func__, slot_name(slot));
+       if ((retval = cpci_unconfigure_slot(slot))) {
+               err("%s - could not unconfigure slot %s",
+-                  __func__, slot->hotplug_slot->name);
++                  __func__, slot_name(slot));
+               goto disable_error;
+       }
+-      dbg("%s - finished unconfiguring slot %s",
+-          __func__, slot->hotplug_slot->name);
++      dbg("%s - finished unconfiguring slot %s", __func__, slot_name(slot));
+       /* Clear EXT (by setting it) */
+       if (cpci_clear_ext(slot)) {
+               err("%s - could not clear EXT for slot %s",
+-                  __func__, slot->hotplug_slot->name);
++                  __func__, slot_name(slot));
+               retval = -ENODEV;
+               goto disable_error;
+       }
+@@ -214,7 +212,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+       struct slot *slot = hotplug_slot->private;
+       kfree(slot->hotplug_slot->info);
+-      kfree(slot->hotplug_slot->name);
+       kfree(slot->hotplug_slot);
+       if (slot->dev)
+               pci_dev_put(slot->dev);
+@@ -222,12 +219,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+ }
+ #define SLOT_NAME_SIZE        6
+-static void
+-make_slot_name(struct slot *slot)
+-{
+-      snprintf(slot->hotplug_slot->name,
+-               SLOT_NAME_SIZE, "%02x:%02x", slot->bus->number, slot->number);
+-}
+ int
+ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
+@@ -235,7 +226,7 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
+       struct slot *slot;
+       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot_info *info;
+-      char *name;
++      char name[SLOT_NAME_SIZE];
+       int status = -ENOMEM;
+       int i;
+@@ -262,34 +253,31 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
+                       goto error_hpslot;
+               hotplug_slot->info = info;
+-              name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL);
+-              if (!name)
+-                      goto error_info;
+-              hotplug_slot->name = name;
+-
+               slot->bus = bus;
+               slot->number = i;
+               slot->devfn = PCI_DEVFN(i, 0);
++              snprintf(name, SLOT_NAME_SIZE, "%02x:%02x", bus->number, i);
++
+               hotplug_slot->private = slot;
+               hotplug_slot->release = &release_slot;
+-              make_slot_name(slot);
+               hotplug_slot->ops = &cpci_hotplug_slot_ops;
+               /*
+                * Initialize the slot info structure with some known
+                * good values.
+                */
+-              dbg("initializing slot %s", slot->hotplug_slot->name);
++              dbg("initializing slot %s", name);
+               info->power_status = cpci_get_power_status(slot);
+               info->attention_status = cpci_get_attention_status(slot);
+-              dbg("registering slot %s", slot->hotplug_slot->name);
+-              status = pci_hp_register(slot->hotplug_slot, bus, i);
++              dbg("registering slot %s", name);
++              status = pci_hp_register(slot->hotplug_slot, bus, i, name);
+               if (status) {
+                       err("pci_hp_register failed with error %d", status);
+-                      goto error_name;
++                      goto error_info;
+               }
++              dbg("slot registered with name: %s", slot_name(slot));
+               /* Add slot to our internal list */
+               down_write(&list_rwsem);
+@@ -298,8 +286,6 @@ cpci_hp_register_bus(struct pci_bus *bus, u8 first, u8 last)
+               up_write(&list_rwsem);
+       }
+       return 0;
+-error_name:
+-      kfree(name);
+ error_info:
+       kfree(info);
+ error_hpslot:
+@@ -327,7 +313,7 @@ cpci_hp_unregister_bus(struct pci_bus *bus)
+                       list_del(&slot->slot_list);
+                       slots--;
+-                      dbg("deregistering slot %s", slot->hotplug_slot->name);
++                      dbg("deregistering slot %s", slot_name(slot));
+                       status = pci_hp_deregister(slot->hotplug_slot);
+                       if (status) {
+                               err("pci_hp_deregister failed with error %d",
+@@ -379,11 +365,10 @@ init_slots(int clear_ins)
+               return -1;
+       }
+       list_for_each_entry(slot, &slot_list, slot_list) {
+-              dbg("%s - looking at slot %s",
+-                  __func__, slot->hotplug_slot->name);
++              dbg("%s - looking at slot %s", __func__, slot_name(slot));
+               if (clear_ins && cpci_check_and_clear_ins(slot))
+                       dbg("%s - cleared INS for slot %s",
+-                          __func__, slot->hotplug_slot->name);
++                          __func__, slot_name(slot));
+               dev = pci_get_slot(slot->bus, PCI_DEVFN(slot->number, 0));
+               if (dev) {
+                       if (update_adapter_status(slot->hotplug_slot, 1))
+@@ -414,8 +399,7 @@ check_slots(void)
+       }
+       extracted = inserted = 0;
+       list_for_each_entry(slot, &slot_list, slot_list) {
+-              dbg("%s - looking at slot %s",
+-                  __func__, slot->hotplug_slot->name);
++              dbg("%s - looking at slot %s", __func__, slot_name(slot));
+               if (cpci_check_and_clear_ins(slot)) {
+                       /*
+                        * Some broken hardware (e.g. PLX 9054AB) asserts
+@@ -423,35 +407,34 @@ check_slots(void)
+                        */
+                       if (slot->dev) {
+                               warn("slot %s already inserted",
+-                                   slot->hotplug_slot->name);
++                                   slot_name(slot));
+                               inserted++;
+                               continue;
+                       }
+                       /* Process insertion */
+-                      dbg("%s - slot %s inserted",
+-                          __func__, slot->hotplug_slot->name);
++                      dbg("%s - slot %s inserted", __func__, slot_name(slot));
+                       /* GSM, debug */
+                       hs_csr = cpci_get_hs_csr(slot);
+                       dbg("%s - slot %s HS_CSR (1) = %04x",
+-                          __func__, slot->hotplug_slot->name, hs_csr);
++                          __func__, slot_name(slot), hs_csr);
+                       /* Configure device */
+                       dbg("%s - configuring slot %s",
+-                          __func__, slot->hotplug_slot->name);
++                          __func__, slot_name(slot));
+                       if (cpci_configure_slot(slot)) {
+                               err("%s - could not configure slot %s",
+-                                  __func__, slot->hotplug_slot->name);
++                                  __func__, slot_name(slot));
+                               continue;
+                       }
+                       dbg("%s - finished configuring slot %s",
+-                          __func__, slot->hotplug_slot->name);
++                          __func__, slot_name(slot));
+                       /* GSM, debug */
+                       hs_csr = cpci_get_hs_csr(slot);
+                       dbg("%s - slot %s HS_CSR (2) = %04x",
+-                          __func__, slot->hotplug_slot->name, hs_csr);
++                          __func__, slot_name(slot), hs_csr);
+                       if (update_latch_status(slot->hotplug_slot, 1))
+                               warn("failure to update latch file");
+@@ -464,18 +447,18 @@ check_slots(void)
+                       /* GSM, debug */
+                       hs_csr = cpci_get_hs_csr(slot);
+                       dbg("%s - slot %s HS_CSR (3) = %04x",
+-                          __func__, slot->hotplug_slot->name, hs_csr);
++                          __func__, slot_name(slot), hs_csr);
+                       inserted++;
+               } else if (cpci_check_ext(slot)) {
+                       /* Process extraction request */
+                       dbg("%s - slot %s extracted",
+-                          __func__, slot->hotplug_slot->name);
++                          __func__, slot_name(slot));
+                       /* GSM, debug */
+                       hs_csr = cpci_get_hs_csr(slot);
+                       dbg("%s - slot %s HS_CSR = %04x",
+-                          __func__, slot->hotplug_slot->name, hs_csr);
++                          __func__, slot_name(slot), hs_csr);
+                       if (!slot->extracting) {
+                               if (update_latch_status(slot->hotplug_slot, 0)) {
+@@ -493,7 +476,7 @@ check_slots(void)
+                                * bother trying to tell the driver or not?
+                                */
+                               err("card in slot %s was improperly removed",
+-                                  slot->hotplug_slot->name);
++                                  slot_name(slot));
+                               if (update_adapter_status(slot->hotplug_slot, 0))
+                                       warn("failure to update adapter file");
+                               slot->extracting = 0;
+diff --git a/drivers/pci/hotplug/cpci_hotplug_pci.c b/drivers/pci/hotplug/cpci_hotplug_pci.c
+index df82b95..829c327 100644
+--- a/drivers/pci/hotplug/cpci_hotplug_pci.c
++++ b/drivers/pci/hotplug/cpci_hotplug_pci.c
+@@ -209,7 +209,7 @@ int cpci_led_on(struct slot* slot)
+                                             hs_cap + 2,
+                                             hs_csr)) {
+                       err("Could not set LOO for slot %s",
+-                          slot->hotplug_slot->name);
++                          hotplug_slot_name(slot->hotplug_slot));
+                       return -ENODEV;
+               }
+       }
+@@ -238,7 +238,7 @@ int cpci_led_off(struct slot* slot)
+                                             hs_cap + 2,
+                                             hs_csr)) {
+                       err("Could not clear LOO for slot %s",
+-                          slot->hotplug_slot->name);
++                          hotplug_slot_name(slot->hotplug_slot));
+                       return -ENODEV;
+               }
+       }
+diff --git a/drivers/pci/hotplug/cpqphp.h b/drivers/pci/hotplug/cpqphp.h
+index b1decfa..afaf8f6 100644
+--- a/drivers/pci/hotplug/cpqphp.h
++++ b/drivers/pci/hotplug/cpqphp.h
+@@ -449,6 +449,11 @@ extern u8 cpqhp_disk_irq;
+ /* inline functions */
++static inline char *slot_name(struct slot *slot)
++{
++      return hotplug_slot_name(slot->hotplug_slot);
++}
++
+ /*
+  * return_resource
+  *
+@@ -696,14 +701,6 @@ static inline int get_presence_status(struct controller *ctrl, struct slot *slot
+       return presence_save;
+ }
+-#define SLOT_NAME_SIZE 10
+-
+-static inline void make_slot_name(char *buffer, int buffer_size, struct slot *slot)
+-{
+-      snprintf(buffer, buffer_size, "%d", slot->number);
+-}
+-
+-
+ static inline int wait_for_ctrl_irq(struct controller *ctrl)
+ {
+         DECLARE_WAITQUEUE(wait, current);
+diff --git a/drivers/pci/hotplug/cpqphp_core.c b/drivers/pci/hotplug/cpqphp_core.c
+index 87a68d2..8514c3a 100644
+--- a/drivers/pci/hotplug/cpqphp_core.c
++++ b/drivers/pci/hotplug/cpqphp_core.c
+@@ -315,14 +315,15 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       kfree(slot->hotplug_slot->info);
+-      kfree(slot->hotplug_slot->name);
+       kfree(slot->hotplug_slot);
+       kfree(slot);
+ }
++#define SLOT_NAME_SIZE 10
++
+ static int ctrl_slot_setup(struct controller *ctrl,
+                       void __iomem *smbios_start,
+                       void __iomem *smbios_table)
+@@ -335,6 +336,7 @@ static int ctrl_slot_setup(struct controller *ctrl,
+       u8 slot_number;
+       u8 ctrl_slot;
+       u32 tempdword;
++      char name[SLOT_NAME_SIZE];
+       void __iomem *slot_entry= NULL;
+       int result = -ENOMEM;
+@@ -363,16 +365,12 @@ static int ctrl_slot_setup(struct controller *ctrl,
+               if (!hotplug_slot->info)
+                       goto error_hpslot;
+               hotplug_slot_info = hotplug_slot->info;
+-              hotplug_slot->name = kmalloc(SLOT_NAME_SIZE, GFP_KERNEL);
+-
+-              if (!hotplug_slot->name)
+-                      goto error_info;
+               slot->ctrl = ctrl;
+               slot->bus = ctrl->bus;
+               slot->device = slot_device;
+               slot->number = slot_number;
+-              dbg("slot->number = %d\n", slot->number);
++              dbg("slot->number = %u\n", slot->number);
+               slot_entry = get_SMBIOS_entry(smbios_start, smbios_table, 9,
+                                       slot_entry);
+@@ -418,9 +416,9 @@ static int ctrl_slot_setup(struct controller *ctrl,
+               /* register this slot with the hotplug pci core */
+               hotplug_slot->release = &release_slot;
+               hotplug_slot->private = slot;
+-              make_slot_name(hotplug_slot->name, SLOT_NAME_SIZE, slot);
++              snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
+               hotplug_slot->ops = &cpqphp_hotplug_slot_ops;
+-              
++
+               hotplug_slot_info->power_status = get_slot_enabled(ctrl, slot);
+               hotplug_slot_info->attention_status =
+                       cpq_get_attention_status(ctrl, slot);
+@@ -436,10 +434,11 @@ static int ctrl_slot_setup(struct controller *ctrl,
+                               slot_number);
+               result = pci_hp_register(hotplug_slot,
+                                        ctrl->pci_dev->bus,
+-                                       slot->device);
++                                       slot->device,
++                                       name);
+               if (result) {
+                       err("pci_hp_register failed with error %d\n", result);
+-                      goto error_name;
++                      goto error_info;
+               }
+               
+               slot->next = ctrl->slot;
+@@ -451,8 +450,6 @@ static int ctrl_slot_setup(struct controller *ctrl,
+       }
+       return 0;
+-error_name:
+-      kfree(hotplug_slot->name);
+ error_info:
+       kfree(hotplug_slot_info);
+ error_hpslot:
+@@ -638,7 +635,7 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status)
+       u8 device;
+       u8 function;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
+               return -ENODEV;
+@@ -665,7 +662,7 @@ static int process_SI(struct hotplug_slot *hotplug_slot)
+       u8 device;
+       u8 function;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
+               return -ENODEV;
+@@ -697,7 +694,7 @@ static int process_SS(struct hotplug_slot *hotplug_slot)
+       u8 device;
+       u8 function;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       if (cpqhp_get_bus_dev(ctrl, &bus, &devfn, slot->number) == -1)
+               return -ENODEV;
+@@ -720,7 +717,7 @@ static int hardware_test(struct hotplug_slot *hotplug_slot, u32 value)
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       return cpqhp_hardware_test(ctrl, value);        
+ }
+@@ -731,7 +728,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = get_slot_enabled(ctrl, slot);
+       return 0;
+@@ -742,7 +739,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+       
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = cpq_get_attention_status(ctrl, slot);
+       return 0;
+@@ -753,7 +750,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = cpq_get_latch_status(ctrl, slot);
+@@ -765,7 +762,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = get_presence_status(ctrl, slot);
+@@ -777,7 +774,7 @@ static int get_max_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = ctrl->speed_capability;
+@@ -789,7 +786,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
+       struct slot *slot = hotplug_slot->private;
+       struct controller *ctrl = slot->ctrl;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       *value = ctrl->speed;
+diff --git a/drivers/pci/hotplug/fakephp.c b/drivers/pci/hotplug/fakephp.c
+index 146ca9c..24dcbf1 100644
+--- a/drivers/pci/hotplug/fakephp.c
++++ b/drivers/pci/hotplug/fakephp.c
+@@ -66,7 +66,6 @@ struct dummy_slot {
+       struct pci_dev *dev;
+       struct work_struct remove_work;
+       unsigned long removed;
+-      char name[8];
+ };
+ static int debug;
+@@ -96,10 +95,13 @@ static void dummy_release(struct hotplug_slot *slot)
+       kfree(dslot);
+ }
++#define SLOT_NAME_SIZE        8
++
+ static int add_slot(struct pci_dev *dev)
+ {
+       struct dummy_slot *dslot;
+       struct hotplug_slot *slot;
++      char name[SLOT_NAME_SIZE];
+       int retval = -ENOMEM;
+       static int count = 1;
+@@ -119,19 +121,18 @@ static int add_slot(struct pci_dev *dev)
+       if (!dslot)
+               goto error_info;
+-      slot->name = dslot->name;
+-      snprintf(slot->name, sizeof(dslot->name), "fake%d", count++);
+-      dbg("slot->name = %s\n", slot->name);
++      snprintf(name, SLOT_NAME_SIZE, "fake%d", count++);
+       slot->ops = &dummy_hotplug_slot_ops;
+       slot->release = &dummy_release;
+       slot->private = dslot;
+-      retval = pci_hp_register(slot, dev->bus, PCI_SLOT(dev->devfn));
++      retval = pci_hp_register(slot, dev->bus, PCI_SLOT(dev->devfn), name);
+       if (retval) {
+               err("pci_hp_register failed with error %d\n", retval);
+               goto error_dslot;
+       }
++      dbg("slot->name = %s\n", hotplug_slot_name(slot));
+       dslot->slot = slot;
+       dslot->dev = pci_dev_get(dev);
+       list_add (&dslot->node, &slot_list);
+@@ -167,10 +168,11 @@ static void remove_slot(struct dummy_slot *dslot)
+ {
+       int retval;
+-      dbg("removing slot %s\n", dslot->slot->name);
++      dbg("removing slot %s\n", hotplug_slot_name(dslot->slot));
+       retval = pci_hp_deregister(dslot->slot);
+       if (retval)
+-              err("Problem unregistering a slot %s\n", dslot->slot->name);
++              err("Problem unregistering a slot %s\n",
++                      hotplug_slot_name(dslot->slot));
+ }
+ /* called from the single-threaded workqueue handler to remove a slot */
+@@ -308,7 +310,7 @@ static int disable_slot(struct hotplug_slot *slot)
+               return -ENODEV;
+       dslot = slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot_name(slot));
+       for (func = 7; func >= 0; func--) {
+               dev = pci_get_slot(dslot->dev->bus, dslot->dev->devfn + func);
+diff --git a/drivers/pci/hotplug/ibmphp.h b/drivers/pci/hotplug/ibmphp.h
+index 612d963..a8d391a 100644
+--- a/drivers/pci/hotplug/ibmphp.h
++++ b/drivers/pci/hotplug/ibmphp.h
+@@ -707,17 +707,16 @@ struct slot {
+       u8 device;
+       u8 number;
+       u8 real_physical_slot_num;
+-      char name[100];
+       u32 capabilities;
+       u8 supported_speed;
+       u8 supported_bus_mode;
++      u8 flag;                /* this is for disable slot and polling */
++      u8 ctlr_index;
+       struct hotplug_slot *hotplug_slot;
+       struct controller *ctrl;
+       struct pci_func *func;
+       u8 irq[4];
+-      u8 flag;                /* this is for disable slot and polling */
+       int bit_mode;           /* 0 = 32, 1 = 64 */
+-      u8 ctlr_index;
+       struct bus_info *bus_on;
+       struct list_head ibm_slot_list;
+       u8 status;
+diff --git a/drivers/pci/hotplug/ibmphp_ebda.c b/drivers/pci/hotplug/ibmphp_ebda.c
+index 8467d02..8431246 100644
+--- a/drivers/pci/hotplug/ibmphp_ebda.c
++++ b/drivers/pci/hotplug/ibmphp_ebda.c
+@@ -620,11 +620,14 @@ static u8 calculate_first_slot (u8 slot_num)
+       return first_slot + 1;
+ }
++
++#define SLOT_NAME_SIZE 30
++
+ static char *create_file_name (struct slot * slot_cur)
+ {
+       struct opt_rio *opt_vg_ptr = NULL;
+       struct opt_rio_lo *opt_lo_ptr = NULL;
+-      static char str[30];
++      static char str[SLOT_NAME_SIZE];
+       int which = 0; /* rxe = 1, chassis = 0 */
+       u8 number = 1; /* either chassis or rxe # */
+       u8 first_slot = 1;
+@@ -736,7 +739,6 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+       slot = hotplug_slot->private;
+       kfree(slot->hotplug_slot->info);
+-      kfree(slot->hotplug_slot->name);
+       kfree(slot->hotplug_slot);
+       slot->ctrl = NULL;
+       slot->bus_on = NULL;
+@@ -768,6 +770,7 @@ static int __init ebda_rsrc_controller (void)
+       int rc;
+       struct slot *tmp_slot;
+       struct list_head *list;
++      char name[SLOT_NAME_SIZE];
+       addr = hpc_list_ptr->phys_addr;
+       for (ctlr = 0; ctlr < hpc_list_ptr->num_ctlrs; ctlr++) {
+@@ -931,12 +934,6 @@ static int __init ebda_rsrc_controller (void)
+                               goto error_no_hp_info;
+                       }
+-                      hp_slot_ptr->name = kmalloc(30, GFP_KERNEL);
+-                      if (!hp_slot_ptr->name) {
+-                              rc = -ENOMEM;
+-                              goto error_no_hp_name;
+-                      }
+-
+                       tmp_slot = kzalloc(sizeof(*tmp_slot), GFP_KERNEL);
+                       if (!tmp_slot) {
+                               rc = -ENOMEM;
+@@ -1000,9 +997,9 @@ static int __init ebda_rsrc_controller (void)
+       list_for_each (list, &ibmphp_slot_head) {
+               tmp_slot = list_entry (list, struct slot, ibm_slot_list);
+-              snprintf (tmp_slot->hotplug_slot->name, 30, "%s", create_file_name (tmp_slot));
++              snprintf(name, SLOT_NAME_SIZE, "%s", create_file_name(tmp_slot));
+               pci_hp_register(tmp_slot->hotplug_slot,
+-                      pci_find_bus(0, tmp_slot->bus), tmp_slot->device);
++                      pci_find_bus(0, tmp_slot->bus), tmp_slot->device, name);
+       }
+       print_ebda_hpc ();
+@@ -1012,8 +1009,6 @@ static int __init ebda_rsrc_controller (void)
+ error:
+       kfree (hp_slot_ptr->private);
+ error_no_slot:
+-      kfree (hp_slot_ptr->name);
+-error_no_hp_name:
+       kfree (hp_slot_ptr->info);
+ error_no_hp_info:
+       kfree (hp_slot_ptr);
+diff --git a/drivers/pci/hotplug/pci_hotplug_core.c b/drivers/pci/hotplug/pci_hotplug_core.c
+index 5f85b1b..4871b96 100644
+--- a/drivers/pci/hotplug/pci_hotplug_core.c
++++ b/drivers/pci/hotplug/pci_hotplug_core.c
+@@ -37,6 +37,7 @@
+ #include <linux/init.h>
+ #include <linux/mount.h>
+ #include <linux/namei.h>
++#include <linux/mutex.h>
+ #include <linux/pci.h>
+ #include <linux/pci_hotplug.h>
+ #include <asm/uaccess.h>
+@@ -61,7 +62,7 @@ static int debug;
+ //////////////////////////////////////////////////////////////////
+ static LIST_HEAD(pci_hotplug_slot_list);
+-static DEFINE_SPINLOCK(pci_hotplug_slot_list_lock);
++static DEFINE_MUTEX(pci_hp_mutex);
+ /* these strings match up with the values in pci_bus_speed */
+ static char *pci_bus_speed_strings[] = {
+@@ -530,16 +531,12 @@ static struct hotplug_slot *get_slot_from_name (const char *name)
+       struct hotplug_slot *slot;
+       struct list_head *tmp;
+-      spin_lock(&pci_hotplug_slot_list_lock);
+       list_for_each (tmp, &pci_hotplug_slot_list) {
+               slot = list_entry (tmp, struct hotplug_slot, slot_list);
+-              if (strcmp(slot->name, name) == 0)
+-                      goto out;
++              if (strcmp(hotplug_slot_name(slot), name) == 0)
++                      return slot;
+       }
+-      slot = NULL;
+-out:
+-      spin_unlock(&pci_hotplug_slot_list_lock);
+-      return slot;
++      return NULL;
+ }
+ /**
+@@ -547,13 +544,15 @@ out:
+  * @bus: bus this slot is on
+  * @slot: pointer to the &struct hotplug_slot to register
+  * @slot_nr: slot number
++ * @name: name registered with kobject core
+  *
+  * Registers a hotplug slot with the pci hotplug subsystem, which will allow
+  * userspace interaction to the slot.
+  *
+  * Returns 0 if successful, anything else for an error.
+  */
+-int pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int slot_nr)
++int pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int slot_nr,
++                      const char *name)
+ {
+       int result;
+       struct pci_slot *pci_slot;
+@@ -568,48 +567,29 @@ int pci_hp_register(struct hotplug_slot *slot, struct pci_bus *bus, int slot_nr)
+               return -EINVAL;
+       }
+-      /* Check if we have already registered a slot with the same name. */
+-      if (get_slot_from_name(slot->name))
+-              return -EEXIST;
++      mutex_lock(&pci_hp_mutex);
+       /*
+        * No problems if we call this interface from both ACPI_PCI_SLOT
+        * driver and call it here again. If we've already created the
+        * pci_slot, the interface will simply bump the refcount.
+        */
+-      pci_slot = pci_create_slot(bus, slot_nr, slot->name);
+-      if (IS_ERR(pci_slot))
+-              return PTR_ERR(pci_slot);
+-
+-      if (pci_slot->hotplug) {
+-              dbg("%s: already claimed\n", __func__);
+-              pci_destroy_slot(pci_slot);
+-              return -EBUSY;
++      pci_slot = pci_create_slot(bus, slot_nr, name, slot);
++      if (IS_ERR(pci_slot)) {
++              result = PTR_ERR(pci_slot);
++              goto out;
+       }
+       slot->pci_slot = pci_slot;
+       pci_slot->hotplug = slot;
+-      /*
+-       * Allow pcihp drivers to override the ACPI_PCI_SLOT name.
+-       */
+-      if (strcmp(kobject_name(&pci_slot->kobj), slot->name)) {
+-              result = kobject_rename(&pci_slot->kobj, slot->name);
+-              if (result) {
+-                      pci_destroy_slot(pci_slot);
+-                      return result;
+-              }
+-      }
+-
+-      spin_lock(&pci_hotplug_slot_list_lock);
+       list_add(&slot->slot_list, &pci_hotplug_slot_list);
+-      spin_unlock(&pci_hotplug_slot_list_lock);
+       result = fs_add_slot(pci_slot);
+       kobject_uevent(&pci_slot->kobj, KOBJ_ADD);
+-      dbg("Added slot %s to the list\n", slot->name);
+-
+-
++      dbg("Added slot %s to the list\n", name);
++out:
++      mutex_unlock(&pci_hp_mutex);
+       return result;
+ }
+@@ -630,21 +610,23 @@ int pci_hp_deregister(struct hotplug_slot *hotplug)
+       if (!hotplug)
+               return -ENODEV;
+-      temp = get_slot_from_name(hotplug->name);
+-      if (temp != hotplug)
++      mutex_lock(&pci_hp_mutex);
++      temp = get_slot_from_name(hotplug_slot_name(hotplug));
++      if (temp != hotplug) {
++              mutex_unlock(&pci_hp_mutex);
+               return -ENODEV;
++      }
+-      spin_lock(&pci_hotplug_slot_list_lock);
+       list_del(&hotplug->slot_list);
+-      spin_unlock(&pci_hotplug_slot_list_lock);
+       slot = hotplug->pci_slot;
+       fs_remove_slot(slot);
+-      dbg("Removed slot %s from the list\n", hotplug->name);
++      dbg("Removed slot %s from the list\n", hotplug_slot_name(hotplug));
+       hotplug->release(hotplug);
+       slot->hotplug = NULL;
+       pci_destroy_slot(slot);
++      mutex_unlock(&pci_hp_mutex);
+       return 0;
+ }
+diff --git a/drivers/pci/hotplug/pciehp.h b/drivers/pci/hotplug/pciehp.h
+index 9e6cec6..0187af7 100644
+--- a/drivers/pci/hotplug/pciehp.h
++++ b/drivers/pci/hotplug/pciehp.h
+@@ -61,15 +61,13 @@ extern struct workqueue_struct *pciehp_wq;
+ struct slot {
+       u8 bus;
+       u8 device;
+-      u32 number;
+       u8 state;
+-      struct timer_list task_event;
+       u8 hp_slot;
++      u32 number;
+       struct controller *ctrl;
+       struct hpc_ops *hpc_ops;
+       struct hotplug_slot *hotplug_slot;
+       struct list_head        slot_list;
+-      char name[SLOT_NAME_SIZE];
+       unsigned long last_emi_toggle;
+       struct delayed_work work;       /* work for button event */
+       struct mutex lock;
+@@ -161,6 +159,11 @@ int pciehp_enable_slot(struct slot *p_slot);
+ int pciehp_disable_slot(struct slot *p_slot);
+ int pcie_enable_notification(struct controller *ctrl);
++static inline const char *slot_name(struct slot *slot)
++{
++      return hotplug_slot_name(slot->hotplug_slot);
++}
++
+ static inline struct slot *pciehp_find_slot(struct controller *ctrl, u8 device)
+ {
+       struct slot *slot;
+diff --git a/drivers/pci/hotplug/pciehp_core.c b/drivers/pci/hotplug/pciehp_core.c
+index 4fd5355..6e18736 100644
+--- a/drivers/pci/hotplug/pciehp_core.c
++++ b/drivers/pci/hotplug/pciehp_core.c
+@@ -180,7 +180,8 @@ static struct hotplug_slot_attribute hotplug_slot_attr_lock = {
+  */
+ static void release_slot(struct hotplug_slot *hotplug_slot)
+ {
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__,
++          hotplug_slot_name(hotplug_slot));
+       kfree(hotplug_slot->info);
+       kfree(hotplug_slot);
+@@ -191,7 +192,7 @@ static int init_slots(struct controller *ctrl)
+       struct slot *slot;
+       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot_info *info;
+-      int len, dup = 1;
++      char name[SLOT_NAME_SIZE];
+       int retval = -ENOMEM;
+       list_for_each_entry(slot, &ctrl->slot_list, slot_list) {
+@@ -205,39 +206,27 @@ static int init_slots(struct controller *ctrl)
+               /* register this slot with the hotplug pci core */
+               hotplug_slot->info = info;
+-              hotplug_slot->name = slot->name;
+               hotplug_slot->private = slot;
+               hotplug_slot->release = &release_slot;
+               hotplug_slot->ops = &pciehp_hotplug_slot_ops;
+-              get_power_status(hotplug_slot, &info->power_status);
+-              get_attention_status(hotplug_slot, &info->attention_status);
+-              get_latch_status(hotplug_slot, &info->latch_status);
+-              get_adapter_status(hotplug_slot, &info->adapter_status);
+               slot->hotplug_slot = hotplug_slot;
++              snprintf(name, SLOT_NAME_SIZE, "%u", slot->number);
+               dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
+                   "slot_device_offset=%x\n", slot->bus, slot->device,
+                   slot->hp_slot, slot->number, ctrl->slot_device_offset);
+-duplicate_name:
+               retval = pci_hp_register(hotplug_slot,
+                                        ctrl->pci_dev->subordinate,
+-                                       slot->device);
++                                       slot->device,
++                                       name);
+               if (retval) {
+-                      /*
+-                       * If slot N already exists, we'll try to create
+-                       * slot N-1, N-2 ... N-M, until we overflow.
+-                       */
+-                      if (retval == -EEXIST) {
+-                              len = snprintf(slot->name, SLOT_NAME_SIZE,
+-                                             "%d-%d", slot->number, dup++);
+-                              if (len < SLOT_NAME_SIZE)
+-                                      goto duplicate_name;
+-                              else
+-                                      err("duplicate slot name overflow\n");
+-                      }
+                       err("pci_hp_register failed with error %d\n", retval);
+                       goto error_info;
+               }
++              get_power_status(hotplug_slot, &info->power_status);
++              get_attention_status(hotplug_slot, &info->attention_status);
++              get_latch_status(hotplug_slot, &info->latch_status);
++              get_adapter_status(hotplug_slot, &info->adapter_status);
+               /* create additional sysfs entries */
+               if (EMI(ctrl)) {
+                       retval = sysfs_create_file(&hotplug_slot->pci_slot->kobj,
+@@ -278,7 +267,7 @@ static int set_attention_status(struct hotplug_slot *hotplug_slot, u8 status)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       hotplug_slot->info->attention_status = status;
+@@ -293,7 +282,7 @@ static int enable_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       return pciehp_sysfs_enable_slot(slot);
+ }
+@@ -303,7 +292,7 @@ static int disable_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       return pciehp_sysfs_disable_slot(slot);
+ }
+@@ -313,7 +302,7 @@ static int get_power_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_power_status(slot, value);
+       if (retval < 0)
+@@ -327,7 +316,7 @@ static int get_attention_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_attention_status(slot, value);
+       if (retval < 0)
+@@ -341,7 +330,7 @@ static int get_latch_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_latch_status(slot, value);
+       if (retval < 0)
+@@ -355,7 +344,7 @@ static int get_adapter_status(struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_adapter_status(slot, value);
+       if (retval < 0)
+@@ -370,7 +359,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot,
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_max_bus_speed(slot, value);
+       if (retval < 0)
+@@ -384,7 +373,7 @@ static int get_cur_bus_speed(struct hotplug_slot *hotplug_slot, enum pci_bus_spe
+       struct slot *slot = hotplug_slot->private;
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_cur_bus_speed(slot, value);
+       if (retval < 0)
+diff --git a/drivers/pci/hotplug/pciehp_ctrl.c b/drivers/pci/hotplug/pciehp_ctrl.c
+index 96a5d55..7266fbd 100644
+--- a/drivers/pci/hotplug/pciehp_ctrl.c
++++ b/drivers/pci/hotplug/pciehp_ctrl.c
+@@ -65,7 +65,7 @@ u8 pciehp_handle_attention_button(struct slot *p_slot)
+       /*
+        *  Button pressed - See if need to TAKE ACTION!!!
+        */
+-      info("Button pressed on Slot(%s)\n", p_slot->name);
++      info("Button pressed on Slot(%s)\n", slot_name(p_slot));
+       event_type = INT_BUTTON_PRESS;
+       queue_interrupt_event(p_slot, event_type);
+@@ -86,13 +86,13 @@ u8 pciehp_handle_switch_change(struct slot *p_slot)
+               /*
+                * Switch opened
+                */
+-              info("Latch open on Slot(%s)\n", p_slot->name);
++              info("Latch open on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_SWITCH_OPEN;
+       } else {
+               /*
+                *  Switch closed
+                */
+-              info("Latch close on Slot(%s)\n", p_slot->name);
++              info("Latch close on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_SWITCH_CLOSE;
+       }
+@@ -117,13 +117,13 @@ u8 pciehp_handle_presence_change(struct slot *p_slot)
+               /*
+                * Card Present
+                */
+-              info("Card present on Slot(%s)\n", p_slot->name);
++              info("Card present on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_PRESENCE_ON;
+       } else {
+               /*
+                * Not Present
+                */
+-              info("Card not present on Slot(%s)\n", p_slot->name);
++              info("Card not present on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_PRESENCE_OFF;
+       }
+@@ -143,13 +143,13 @@ u8 pciehp_handle_power_fault(struct slot *p_slot)
+               /*
+                * power fault Cleared
+                */
+-              info("Power fault cleared on Slot(%s)\n", p_slot->name);
++              info("Power fault cleared on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_POWER_FAULT_CLEAR;
+       } else {
+               /*
+                *   power fault
+                */
+-              info("Power fault on Slot(%s)\n", p_slot->name);
++              info("Power fault on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_POWER_FAULT;
+               info("power fault bit %x set\n", 0);
+       }
+@@ -404,11 +404,11 @@ static void handle_button_press_event(struct slot *p_slot)
+               if (getstatus) {
+                       p_slot->state = BLINKINGOFF_STATE;
+                       info("PCI slot #%s - powering off due to button "
+-                           "press.\n", p_slot->name);
++                           "press.\n", slot_name(p_slot));
+               } else {
+                       p_slot->state = BLINKINGON_STATE;
+                       info("PCI slot #%s - powering on due to button "
+-                           "press.\n", p_slot->name);
++                           "press.\n", slot_name(p_slot));
+               }
+               /* blink green LED and turn off amber */
+               if (PWR_LED(ctrl))
+@@ -425,7 +425,7 @@ static void handle_button_press_event(struct slot *p_slot)
+                * press the attention again before the 5 sec. limit
+                * expires to cancel hot-add or hot-remove
+                */
+-              info("Button cancel on Slot(%s)\n", p_slot->name);
++              info("Button cancel on Slot(%s)\n", slot_name(p_slot));
+               dbg("%s: button cancel\n", __func__);
+               cancel_delayed_work(&p_slot->work);
+               if (p_slot->state == BLINKINGOFF_STATE) {
+@@ -438,7 +438,7 @@ static void handle_button_press_event(struct slot *p_slot)
+               if (ATTN_LED(ctrl))
+                       p_slot->hpc_ops->set_attention_status(p_slot, 0);
+               info("PCI slot #%s - action canceled due to button press\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               p_slot->state = STATIC_STATE;
+               break;
+       case POWEROFF_STATE:
+@@ -448,7 +448,7 @@ static void handle_button_press_event(struct slot *p_slot)
+                * this means that the previous attention button action
+                * to hot-add or hot-remove is undergoing
+                */
+-              info("Button ignore on Slot(%s)\n", p_slot->name);
++              info("Button ignore on Slot(%s)\n", slot_name(p_slot));
+               update_slot_info(p_slot);
+               break;
+       default:
+@@ -529,7 +529,7 @@ int pciehp_enable_slot(struct slot *p_slot)
+       rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
+       if (rc || !getstatus) {
+               info("%s: no adapter on slot(%s)\n", __func__,
+-                   p_slot->name);
++                   slot_name(p_slot));
+               mutex_unlock(&p_slot->ctrl->crit_sect);
+               return -ENODEV;
+       }
+@@ -537,7 +537,7 @@ int pciehp_enable_slot(struct slot *p_slot)
+               rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
+               if (rc || getstatus) {
+                       info("%s: latch open on slot(%s)\n", __func__,
+-                           p_slot->name);
++                           slot_name(p_slot));
+                       mutex_unlock(&p_slot->ctrl->crit_sect);
+                       return -ENODEV;
+               }
+@@ -547,7 +547,7 @@ int pciehp_enable_slot(struct slot *p_slot)
+               rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
+               if (rc || getstatus) {
+                       info("%s: already enabled on slot(%s)\n", __func__,
+-                           p_slot->name);
++                           slot_name(p_slot));
+                       mutex_unlock(&p_slot->ctrl->crit_sect);
+                       return -EINVAL;
+               }
+@@ -582,7 +582,7 @@ int pciehp_disable_slot(struct slot *p_slot)
+               ret = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
+               if (ret || !getstatus) {
+                       info("%s: no adapter on slot(%s)\n", __func__,
+-                           p_slot->name);
++                           slot_name(p_slot));
+                       mutex_unlock(&p_slot->ctrl->crit_sect);
+                       return -ENODEV;
+               }
+@@ -592,7 +592,7 @@ int pciehp_disable_slot(struct slot *p_slot)
+               ret = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
+               if (ret || getstatus) {
+                       info("%s: latch open on slot(%s)\n", __func__,
+-                           p_slot->name);
++                           slot_name(p_slot));
+                       mutex_unlock(&p_slot->ctrl->crit_sect);
+                       return -ENODEV;
+               }
+@@ -602,7 +602,7 @@ int pciehp_disable_slot(struct slot *p_slot)
+               ret = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
+               if (ret || !getstatus) {
+                       info("%s: already disabled slot(%s)\n", __func__,
+-                           p_slot->name);
++                           slot_name(p_slot));
+                       mutex_unlock(&p_slot->ctrl->crit_sect);
+                       return -EINVAL;
+               }
+@@ -632,14 +632,14 @@ int pciehp_sysfs_enable_slot(struct slot *p_slot)
+               break;
+       case POWERON_STATE:
+               info("Slot %s is already in powering on state\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               break;
+       case BLINKINGOFF_STATE:
+       case POWEROFF_STATE:
+-              info("Already enabled on slot %s\n", p_slot->name);
++              info("Already enabled on slot %s\n", slot_name(p_slot));
+               break;
+       default:
+-              err("Not a valid state on slot %s\n", p_slot->name);
++              err("Not a valid state on slot %s\n", slot_name(p_slot));
+               break;
+       }
+       mutex_unlock(&p_slot->lock);
+@@ -664,14 +664,14 @@ int pciehp_sysfs_disable_slot(struct slot *p_slot)
+               break;
+       case POWEROFF_STATE:
+               info("Slot %s is already in powering off state\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               break;
+       case BLINKINGON_STATE:
+       case POWERON_STATE:
+-              info("Already disabled on slot %s\n", p_slot->name);
++              info("Already disabled on slot %s\n", slot_name(p_slot));
+               break;
+       default:
+-              err("Not a valid state on slot %s\n", p_slot->name);
++              err("Not a valid state on slot %s\n", slot_name(p_slot));
+               break;
+       }
+       mutex_unlock(&p_slot->lock);
+diff --git a/drivers/pci/hotplug/pciehp_hpc.c b/drivers/pci/hotplug/pciehp_hpc.c
+index 9d934dd..d3cf6f9 100644
+--- a/drivers/pci/hotplug/pciehp_hpc.c
++++ b/drivers/pci/hotplug/pciehp_hpc.c
+@@ -1044,7 +1044,6 @@ static int pcie_init_slot(struct controller *ctrl)
+       slot->device = ctrl->slot_device_offset + slot->hp_slot;
+       slot->hpc_ops = ctrl->hpc_ops;
+       slot->number = ctrl->first_slot;
+-      snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
+       mutex_init(&slot->lock);
+       INIT_DELAYED_WORK(&slot->work, pciehp_queue_pushbutton_work);
+       list_add(&slot->slot_list, &ctrl->slot_list);
+diff --git a/drivers/pci/hotplug/rpaphp_slot.c b/drivers/pci/hotplug/rpaphp_slot.c
+index 9b714ea..23be8a2 100644
+--- a/drivers/pci/hotplug/rpaphp_slot.c
++++ b/drivers/pci/hotplug/rpaphp_slot.c
+@@ -43,7 +43,7 @@ static void rpaphp_release_slot(struct hotplug_slot *hotplug_slot)
+ void dealloc_slot_struct(struct slot *slot)
+ {
+       kfree(slot->hotplug_slot->info);
+-      kfree(slot->hotplug_slot->name);
++      kfree(slot->name);
+       kfree(slot->hotplug_slot);
+       kfree(slot);
+ }
+@@ -63,11 +63,9 @@ struct slot *alloc_slot_struct(struct device_node *dn,
+                                          GFP_KERNEL);
+       if (!slot->hotplug_slot->info)
+               goto error_hpslot;
+-      slot->hotplug_slot->name = kmalloc(strlen(drc_name) + 1, GFP_KERNEL);
+-      if (!slot->hotplug_slot->name)
++      slot->name = kstrdup(drc_name, GFP_KERNEL);
++      if (!slot->name)
+               goto error_info;        
+-      slot->name = slot->hotplug_slot->name;
+-      strcpy(slot->name, drc_name);
+       slot->dn = dn;
+       slot->index = drc_index;
+       slot->power_domain = power_domain;
+@@ -137,7 +135,7 @@ int rpaphp_register_slot(struct slot *slot)
+               slotno = PCI_SLOT(PCI_DN(slot->dn->child)->devfn);
+       else
+               slotno = -1;
+-      retval = pci_hp_register(php_slot, slot->bus, slotno);
++      retval = pci_hp_register(php_slot, slot->bus, slotno, slot->name);
+       if (retval) {
+               err("pci_hp_register failed with error %d\n", retval);
+               return retval;
+diff --git a/drivers/pci/hotplug/sgi_hotplug.c b/drivers/pci/hotplug/sgi_hotplug.c
+index 410fe03..d748698 100644
+--- a/drivers/pci/hotplug/sgi_hotplug.c
++++ b/drivers/pci/hotplug/sgi_hotplug.c
+@@ -161,7 +161,8 @@ static int sn_pci_bus_valid(struct pci_bus *pci_bus)
+ }
+ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
+-                                  struct pci_bus *pci_bus, int device)
++                                  struct pci_bus *pci_bus, int device,
++                                  char *name)
+ {
+       struct pcibus_info *pcibus_info;
+       struct slot *slot;
+@@ -173,15 +174,9 @@ static int sn_hp_slot_private_alloc(struct hotplug_slot *bss_hotplug_slot,
+               return -ENOMEM;
+       bss_hotplug_slot->private = slot;
+-      bss_hotplug_slot->name = kmalloc(SN_SLOT_NAME_SIZE, GFP_KERNEL);
+-      if (!bss_hotplug_slot->name) {
+-              kfree(bss_hotplug_slot->private);
+-              return -ENOMEM;
+-      }
+-
+       slot->device_num = device;
+       slot->pci_bus = pci_bus;
+-      sprintf(bss_hotplug_slot->name, "%04x:%02x:%02x",
++      sprintf(name, "%04x:%02x:%02x",
+               pci_domain_nr(pci_bus),
+               ((u16)pcibus_info->pbi_buscommon.bs_persist_busnum),
+               device + 1);
+@@ -608,7 +603,6 @@ static inline int get_power_status(struct hotplug_slot *bss_hotplug_slot,
+ static void sn_release_slot(struct hotplug_slot *bss_hotplug_slot)
+ {
+       kfree(bss_hotplug_slot->info);
+-      kfree(bss_hotplug_slot->name);
+       kfree(bss_hotplug_slot->private);
+       kfree(bss_hotplug_slot);
+ }
+@@ -618,6 +612,7 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
+       int device;
+       struct pci_slot *pci_slot;
+       struct hotplug_slot *bss_hotplug_slot;
++      char name[SN_SLOT_NAME_SIZE];
+       int rc = 0;
+       /*
+@@ -645,15 +640,14 @@ static int sn_hotplug_slot_register(struct pci_bus *pci_bus)
+               }
+               if (sn_hp_slot_private_alloc(bss_hotplug_slot,
+-                                           pci_bus, device)) {
++                                           pci_bus, device, name)) {
+                       rc = -ENOMEM;
+                       goto alloc_err;
+               }
+-
+               bss_hotplug_slot->ops = &sn_hotplug_slot_ops;
+               bss_hotplug_slot->release = &sn_release_slot;
+-              rc = pci_hp_register(bss_hotplug_slot, pci_bus, device);
++              rc = pci_hp_register(bss_hotplug_slot, pci_bus, device, name);
+               if (rc)
+                       goto register_err;
+diff --git a/drivers/pci/hotplug/shpchp.h b/drivers/pci/hotplug/shpchp.h
+index 8a026f7..4d9fed0 100644
+--- a/drivers/pci/hotplug/shpchp.h
++++ b/drivers/pci/hotplug/shpchp.h
+@@ -69,15 +69,13 @@ struct slot {
+       u8 state;
+       u8 presence_save;
+       u8 pwr_save;
+-      struct timer_list task_event;
+-      u8 hp_slot;
+       struct controller *ctrl;
+       struct hpc_ops *hpc_ops;
+       struct hotplug_slot *hotplug_slot;
+       struct list_head        slot_list;
+-      char name[SLOT_NAME_SIZE];
+       struct delayed_work work;       /* work for button event */
+       struct mutex lock;
++      u8 hp_slot;
+ };
+ struct event_info {
+@@ -169,6 +167,11 @@ extern void cleanup_slots(struct controller *ctrl);
+ extern void shpchp_queue_pushbutton_work(struct work_struct *work);
+ extern int shpc_init( struct controller *ctrl, struct pci_dev *pdev);
++static inline const char *slot_name(struct slot *slot)
++{
++      return hotplug_slot_name(slot->hotplug_slot);
++}
++
+ #ifdef CONFIG_ACPI
+ #include <linux/pci-acpi.h>
+ static inline int get_hp_params_from_firmware(struct pci_dev *dev,
+diff --git a/drivers/pci/hotplug/shpchp_core.c b/drivers/pci/hotplug/shpchp_core.c
+index cc38615..7af9191 100644
+--- a/drivers/pci/hotplug/shpchp_core.c
++++ b/drivers/pci/hotplug/shpchp_core.c
+@@ -89,7 +89,7 @@ static void release_slot(struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = hotplug_slot->private;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       kfree(slot->hotplug_slot->info);
+       kfree(slot->hotplug_slot);
+@@ -101,8 +101,9 @@ static int init_slots(struct controller *ctrl)
+       struct slot *slot;
+       struct hotplug_slot *hotplug_slot;
+       struct hotplug_slot_info *info;
++      char name[SLOT_NAME_SIZE];
+       int retval = -ENOMEM;
+-      int i, len, dup = 1;
++      int i;
+       for (i = 0; i < ctrl->num_slots; i++) {
+               slot = kzalloc(sizeof(*slot), GFP_KERNEL);
+@@ -119,8 +120,6 @@ static int init_slots(struct controller *ctrl)
+                       goto error_hpslot;
+               hotplug_slot->info = info;
+-              hotplug_slot->name = slot->name;
+-
+               slot->hp_slot = i;
+               slot->ctrl = ctrl;
+               slot->bus = ctrl->pci_dev->subordinate->number;
+@@ -133,37 +132,24 @@ static int init_slots(struct controller *ctrl)
+               /* register this slot with the hotplug pci core */
+               hotplug_slot->private = slot;
+               hotplug_slot->release = &release_slot;
+-              snprintf(slot->name, SLOT_NAME_SIZE, "%d", slot->number);
++              snprintf(name, SLOT_NAME_SIZE, "%d", slot->number);
+               hotplug_slot->ops = &shpchp_hotplug_slot_ops;
+-              get_power_status(hotplug_slot, &info->power_status);
+-              get_attention_status(hotplug_slot, &info->attention_status);
+-              get_latch_status(hotplug_slot, &info->latch_status);
+-              get_adapter_status(hotplug_slot, &info->adapter_status);
+-
+               dbg("Registering bus=%x dev=%x hp_slot=%x sun=%x "
+                   "slot_device_offset=%x\n", slot->bus, slot->device,
+                   slot->hp_slot, slot->number, ctrl->slot_device_offset);
+-duplicate_name:
+               retval = pci_hp_register(slot->hotplug_slot,
+-                              ctrl->pci_dev->subordinate, slot->device);
++                              ctrl->pci_dev->subordinate, slot->device, name);
+               if (retval) {
+-                      /*
+-                       * If slot N already exists, we'll try to create
+-                       * slot N-1, N-2 ... N-M, until we overflow.
+-                       */
+-                      if (retval == -EEXIST) {
+-                              len = snprintf(slot->name, SLOT_NAME_SIZE,
+-                                             "%d-%d", slot->number, dup++);
+-                              if (len < SLOT_NAME_SIZE)
+-                                      goto duplicate_name;
+-                              else
+-                                      err("duplicate slot name overflow\n");
+-                      }
+                       err("pci_hp_register failed with error %d\n", retval);
+                       goto error_info;
+               }
++              get_power_status(hotplug_slot, &info->power_status);
++              get_attention_status(hotplug_slot, &info->attention_status);
++              get_latch_status(hotplug_slot, &info->latch_status);
++              get_adapter_status(hotplug_slot, &info->adapter_status);
++
+               list_add(&slot->slot_list, &ctrl->slot_list);
+       }
+@@ -201,7 +187,7 @@ static int set_attention_status (struct hotplug_slot *hotplug_slot, u8 status)
+ {
+       struct slot *slot = get_slot(hotplug_slot);
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       hotplug_slot->info->attention_status = status;
+       slot->hpc_ops->set_attention_status(slot, status);
+@@ -213,7 +199,7 @@ static int enable_slot (struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = get_slot(hotplug_slot);
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       return shpchp_sysfs_enable_slot(slot);
+ }
+@@ -222,7 +208,7 @@ static int disable_slot (struct hotplug_slot *hotplug_slot)
+ {
+       struct slot *slot = get_slot(hotplug_slot);
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       return shpchp_sysfs_disable_slot(slot);
+ }
+@@ -232,7 +218,7 @@ static int get_power_status (struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_power_status(slot, value);
+       if (retval < 0)
+@@ -246,7 +232,7 @@ static int get_attention_status (struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_attention_status(slot, value);
+       if (retval < 0)
+@@ -260,7 +246,7 @@ static int get_latch_status (struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_latch_status(slot, value);
+       if (retval < 0)
+@@ -274,7 +260,7 @@ static int get_adapter_status (struct hotplug_slot *hotplug_slot, u8 *value)
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_adapter_status(slot, value);
+       if (retval < 0)
+@@ -289,7 +275,7 @@ static int get_max_bus_speed(struct hotplug_slot *hotplug_slot,
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_max_bus_speed(slot, value);
+       if (retval < 0)
+@@ -303,7 +289,7 @@ static int get_cur_bus_speed (struct hotplug_slot *hotplug_slot, enum pci_bus_sp
+       struct slot *slot = get_slot(hotplug_slot);
+       int retval;
+-      dbg("%s - physical_slot = %s\n", __func__, hotplug_slot->name);
++      dbg("%s - physical_slot = %s\n", __func__, slot_name(slot));
+       retval = slot->hpc_ops->get_cur_bus_speed(slot, value);
+       if (retval < 0)
+diff --git a/drivers/pci/hotplug/shpchp_ctrl.c b/drivers/pci/hotplug/shpchp_ctrl.c
+index dfb5393..919b1ee 100644
+--- a/drivers/pci/hotplug/shpchp_ctrl.c
++++ b/drivers/pci/hotplug/shpchp_ctrl.c
+@@ -70,7 +70,7 @@ u8 shpchp_handle_attention_button(u8 hp_slot, struct controller *ctrl)
+       /*
+        *  Button pressed - See if need to TAKE ACTION!!!
+        */
+-      info("Button pressed on Slot(%s)\n", p_slot->name);
++      info("Button pressed on Slot(%s)\n", slot_name(p_slot));
+       event_type = INT_BUTTON_PRESS;
+       queue_interrupt_event(p_slot, event_type);
+@@ -98,7 +98,7 @@ u8 shpchp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
+               /*
+                * Switch opened
+                */
+-              info("Latch open on Slot(%s)\n", p_slot->name);
++              info("Latch open on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_SWITCH_OPEN;
+               if (p_slot->pwr_save && p_slot->presence_save) {
+                       event_type = INT_POWER_FAULT;
+@@ -108,7 +108,7 @@ u8 shpchp_handle_switch_change(u8 hp_slot, struct controller *ctrl)
+               /*
+                *  Switch closed
+                */
+-              info("Latch close on Slot(%s)\n", p_slot->name);
++              info("Latch close on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_SWITCH_CLOSE;
+       }
+@@ -135,13 +135,13 @@ u8 shpchp_handle_presence_change(u8 hp_slot, struct controller *ctrl)
+               /*
+                * Card Present
+                */
+-              info("Card present on Slot(%s)\n", p_slot->name);
++              info("Card present on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_PRESENCE_ON;
+       } else {
+               /*
+                * Not Present
+                */
+-              info("Card not present on Slot(%s)\n", p_slot->name);
++              info("Card not present on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_PRESENCE_OFF;
+       }
+@@ -164,14 +164,14 @@ u8 shpchp_handle_power_fault(u8 hp_slot, struct controller *ctrl)
+               /*
+                * Power fault Cleared
+                */
+-              info("Power fault cleared on Slot(%s)\n", p_slot->name);
++              info("Power fault cleared on Slot(%s)\n", slot_name(p_slot));
+               p_slot->status = 0x00;
+               event_type = INT_POWER_FAULT_CLEAR;
+       } else {
+               /*
+                *   Power fault
+                */
+-              info("Power fault on Slot(%s)\n", p_slot->name);
++              info("Power fault on Slot(%s)\n", slot_name(p_slot));
+               event_type = INT_POWER_FAULT;
+               /* set power fault status for this board */
+               p_slot->status = 0xFF;
+@@ -493,11 +493,11 @@ static void handle_button_press_event(struct slot *p_slot)
+               if (getstatus) {
+                       p_slot->state = BLINKINGOFF_STATE;
+                       info("PCI slot #%s - powering off due to button "
+-                           "press.\n", p_slot->name);
++                           "press.\n", slot_name(p_slot));
+               } else {
+                       p_slot->state = BLINKINGON_STATE;
+                       info("PCI slot #%s - powering on due to button "
+-                           "press.\n", p_slot->name);
++                           "press.\n", slot_name(p_slot));
+               }
+               /* blink green LED and turn off amber */
+               p_slot->hpc_ops->green_led_blink(p_slot);
+@@ -512,7 +512,7 @@ static void handle_button_press_event(struct slot *p_slot)
+                * press the attention again before the 5 sec. limit
+                * expires to cancel hot-add or hot-remove
+                */
+-              info("Button cancel on Slot(%s)\n", p_slot->name);
++              info("Button cancel on Slot(%s)\n", slot_name(p_slot));
+               dbg("%s: button cancel\n", __func__);
+               cancel_delayed_work(&p_slot->work);
+               if (p_slot->state == BLINKINGOFF_STATE)
+@@ -521,7 +521,7 @@ static void handle_button_press_event(struct slot *p_slot)
+                       p_slot->hpc_ops->green_led_off(p_slot);
+               p_slot->hpc_ops->set_attention_status(p_slot, 0);
+               info("PCI slot #%s - action canceled due to button press\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               p_slot->state = STATIC_STATE;
+               break;
+       case POWEROFF_STATE:
+@@ -531,7 +531,7 @@ static void handle_button_press_event(struct slot *p_slot)
+                * this means that the previous attention button action
+                * to hot-add or hot-remove is undergoing
+                */
+-              info("Button ignore on Slot(%s)\n", p_slot->name);
++              info("Button ignore on Slot(%s)\n", slot_name(p_slot));
+               update_slot_info(p_slot);
+               break;
+       default:
+@@ -574,17 +574,17 @@ static int shpchp_enable_slot (struct slot *p_slot)
+       mutex_lock(&p_slot->ctrl->crit_sect);
+       rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
+       if (rc || !getstatus) {
+-              info("No adapter on slot(%s)\n", p_slot->name);
++              info("No adapter on slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+       rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
+       if (rc || getstatus) {
+-              info("Latch open on slot(%s)\n", p_slot->name);
++              info("Latch open on slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+       rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
+       if (rc || getstatus) {
+-              info("Already enabled on slot(%s)\n", p_slot->name);
++              info("Already enabled on slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+@@ -633,17 +633,17 @@ static int shpchp_disable_slot (struct slot *p_slot)
+       rc = p_slot->hpc_ops->get_adapter_status(p_slot, &getstatus);
+       if (rc || !getstatus) {
+-              info("No adapter on slot(%s)\n", p_slot->name);
++              info("No adapter on slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+       rc = p_slot->hpc_ops->get_latch_status(p_slot, &getstatus);
+       if (rc || getstatus) {
+-              info("Latch open on slot(%s)\n", p_slot->name);
++              info("Latch open on slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+       rc = p_slot->hpc_ops->get_power_status(p_slot, &getstatus);
+       if (rc || !getstatus) {
+-              info("Already disabled slot(%s)\n", p_slot->name);
++              info("Already disabled slot(%s)\n", slot_name(p_slot));
+               goto out;
+       }
+@@ -671,14 +671,14 @@ int shpchp_sysfs_enable_slot(struct slot *p_slot)
+               break;
+       case POWERON_STATE:
+               info("Slot %s is already in powering on state\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               break;
+       case BLINKINGOFF_STATE:
+       case POWEROFF_STATE:
+-              info("Already enabled on slot %s\n", p_slot->name);
++              info("Already enabled on slot %s\n", slot_name(p_slot));
+               break;
+       default:
+-              err("Not a valid state on slot %s\n", p_slot->name);
++              err("Not a valid state on slot %s\n", slot_name(p_slot));
+               break;
+       }
+       mutex_unlock(&p_slot->lock);
+@@ -703,14 +703,14 @@ int shpchp_sysfs_disable_slot(struct slot *p_slot)
+               break;
+       case POWEROFF_STATE:
+               info("Slot %s is already in powering off state\n",
+-                   p_slot->name);
++                   slot_name(p_slot));
+               break;
+       case BLINKINGON_STATE:
+       case POWERON_STATE:
+-              info("Already disabled on slot %s\n", p_slot->name);
++              info("Already disabled on slot %s\n", slot_name(p_slot));
+               break;
+       default:
+-              err("Not a valid state on slot %s\n", p_slot->name);
++              err("Not a valid state on slot %s\n", slot_name(p_slot));
+               break;
+       }
+       mutex_unlock(&p_slot->lock);
+diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c
+index 7e5b85c..b703b09 100644
+--- a/drivers/pci/slot.c
++++ b/drivers/pci/slot.c
+@@ -73,18 +73,100 @@ static struct kobj_type pci_slot_ktype = {
+       .default_attrs = pci_slot_default_attrs,
+ };
++static char *make_slot_name(const char *name)
++{
++      char *new_name;
++      int len, max, dup;
++
++      new_name = kstrdup(name, GFP_KERNEL);
++      if (!new_name)
++              return NULL;
++
++      /*
++       * Make sure we hit the realloc case the first time through the
++       * loop.  'len' will be strlen(name) + 3 at that point which is
++       * enough space for "name-X" and the trailing NUL.
++       */
++      len = strlen(name) + 2;
++      max = 1;
++      dup = 1;
++
++      for (;;) {
++              struct kobject *dup_slot;
++              dup_slot = kset_find_obj(pci_slots_kset, new_name);
++              if (!dup_slot)
++                      break;
++              kobject_put(dup_slot);
++              if (dup == max) {
++                      len++;
++                      max *= 10;
++                      kfree(new_name);
++                      new_name = kmalloc(len, GFP_KERNEL);
++                      if (!new_name)
++                              break;
++              }
++              sprintf(new_name, "%s-%d", name, dup++);
++      }
++
++      return new_name;
++}
++
++static int rename_slot(struct pci_slot *slot, const char *name)
++{
++      int result = 0;
++      char *slot_name;
++
++      if (strcmp(pci_slot_name(slot), name) == 0)
++              return result;
++
++      slot_name = make_slot_name(name);
++      if (!slot_name)
++              return -ENOMEM;
++
++      result = kobject_rename(&slot->kobj, slot_name);
++      kfree(slot_name);
++
++      return result;
++}
++
++static struct pci_slot *get_slot(struct pci_bus *parent, int slot_nr)
++{
++      struct pci_slot *slot;
++      /*
++       * We already hold pci_bus_sem so don't worry
++       */
++      list_for_each_entry(slot, &parent->slots, list)
++              if (slot->number == slot_nr) {
++                      kobject_get(&slot->kobj);
++                      return slot;
++              }
++
++      return NULL;
++}
++
+ /**
+  * pci_create_slot - create or increment refcount for physical PCI slot
+  * @parent: struct pci_bus of parent bridge
+  * @slot_nr: PCI_SLOT(pci_dev->devfn) or -1 for placeholder
+  * @name: user visible string presented in /sys/bus/pci/slots/<name>
++ * @hotplug: set if caller is hotplug driver, NULL otherwise
+  *
+  * PCI slots have first class attributes such as address, speed, width,
+  * and a &struct pci_slot is used to manage them. This interface will
+  * either return a new &struct pci_slot to the caller, or if the pci_slot
+  * already exists, its refcount will be incremented.
+  *
+- * Slots are uniquely identified by a @pci_bus, @slot_nr, @name tuple.
++ * Slots are uniquely identified by a @pci_bus, @slot_nr tuple.
++ *
++ * There are known platforms with broken firmware that assign the same
++ * name to multiple slots. Workaround these broken platforms by renaming
++ * the slots on behalf of the caller. If firmware assigns name N to
++ * multiple slots:
++ *
++ * The first slot is assigned N
++ * The second slot is assigned N-1
++ * The third slot is assigned N-2
++ * etc.
+  *
+  * Placeholder slots:
+  * In most cases, @pci_bus, @slot_nr will be sufficient to uniquely identify
+@@ -93,12 +175,8 @@ static struct kobj_type pci_slot_ktype = {
+  * the slot. In this scenario, the caller may pass -1 for @slot_nr.
+  *
+  * The following semantics are imposed when the caller passes @slot_nr ==
+- * -1. First, the check for existing %struct pci_slot is skipped, as the
+- * caller may know about several unpopulated slots on a given %struct
+- * pci_bus, and each slot would have a @slot_nr of -1.  Uniqueness for
+- * these slots is then determined by the @name parameter. We expect
+- * kobject_init_and_add() to warn us if the caller attempts to create
+- * multiple slots with the same name. The other change in semantics is
++ * -1. First, we no longer check for an existing %struct pci_slot, as there
++ * may be many slots with @slot_nr of -1.  The other change in semantics is
+  * user-visible, which is the 'address' parameter presented in sysfs will
+  * consist solely of a dddd:bb tuple, where dddd is the PCI domain of the
+  * %struct pci_bus and bb is the bus number. In other words, the devfn of
+@@ -106,47 +184,57 @@ static struct kobj_type pci_slot_ktype = {
+  */
+ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
+-                               const char *name)
++                               const char *name,
++                               struct hotplug_slot *hotplug)
+ {
+       struct pci_slot *slot;
+-      int err;
++      int err = 0;
++      char *slot_name = NULL;
+       down_write(&pci_bus_sem);
+       if (slot_nr == -1)
+               goto placeholder;
+-      /* If we've already created this slot, bump refcount and return. */
+-      list_for_each_entry(slot, &parent->slots, list) {
+-              if (slot->number == slot_nr) {
+-                      kobject_get(&slot->kobj);
+-                      pr_debug("%s: inc refcount to %d on %04x:%02x:%02x\n",
+-                               __func__,
+-                               atomic_read(&slot->kobj.kref.refcount),
+-                               pci_domain_nr(parent), parent->number,
+-                               slot_nr);
+-                      goto out;
++      /*
++       * Hotplug drivers are allowed to rename an existing slot,
++       * but only if not already claimed.
++       */
++      slot = get_slot(parent, slot_nr);
++      if (slot) {
++              if (hotplug) {
++                      if ((err = slot->hotplug ? -EBUSY : 0)
++                           || (err = rename_slot(slot, name))) {
++                              kobject_put(&slot->kobj);
++                              slot = NULL;
++                              goto err;
++                      }
+               }
++              goto out;
+       }
+ placeholder:
+       slot = kzalloc(sizeof(*slot), GFP_KERNEL);
+       if (!slot) {
+-              slot = ERR_PTR(-ENOMEM);
+-              goto out;
++              err = -ENOMEM;
++              goto err;
+       }
+       slot->bus = parent;
+       slot->number = slot_nr;
+       slot->kobj.kset = pci_slots_kset;
+-      err = kobject_init_and_add(&slot->kobj, &pci_slot_ktype, NULL,
+-                                 "%s", name);
+-      if (err) {
+-              printk(KERN_ERR "Unable to register kobject %s\n", name);
++      slot_name = make_slot_name(name);
++      if (!slot_name) {
++              err = -ENOMEM;
+               goto err;
+       }
++      err = kobject_init_and_add(&slot->kobj, &pci_slot_ktype, NULL,
++                                 "%s", slot_name);
++      if (err)
++              goto err;
++
+       INIT_LIST_HEAD(&slot->list);
+       list_add(&slot->list, &parent->slots);
+@@ -154,10 +242,10 @@ placeholder:
+       pr_debug("%s: created pci_slot on %04x:%02x:%02x\n",
+                __func__, pci_domain_nr(parent), parent->number, slot_nr);
+- out:
++out:
+       up_write(&pci_bus_sem);
+       return slot;
+- err:
++err:
+       kfree(slot);
+       slot = ERR_PTR(err);
+       goto out;
+@@ -203,7 +291,6 @@ EXPORT_SYMBOL_GPL(pci_update_slot_number);
+  * just call kobject_put on its kobj and let our release methods do the
+  * rest.
+  */
+-
+ void pci_destroy_slot(struct pci_slot *slot)
+ {
+       pr_debug("%s: dec refcount to %d on %04x:%02x:%02x\n", __func__,
+diff --git a/drivers/spi/pxa2xx_spi.c b/drivers/spi/pxa2xx_spi.c
+index d47d363..b5fc978 100644
+--- a/drivers/spi/pxa2xx_spi.c
++++ b/drivers/spi/pxa2xx_spi.c
+@@ -348,21 +348,21 @@ static int map_dma_buffers(struct driver_data *drv_data)
+       } else
+               drv_data->tx_map_len = drv_data->len;
+-      /* Stream map the rx buffer */
+-      drv_data->rx_dma = dma_map_single(dev, drv_data->rx,
+-                                              drv_data->rx_map_len,
+-                                              DMA_FROM_DEVICE);
+-      if (dma_mapping_error(dev, drv_data->rx_dma))
+-              return 0;
+-
+-      /* Stream map the tx buffer */
++      /* Stream map the tx buffer. Always do DMA_TO_DEVICE first
++       * so we flush the cache *before* invalidating it, in case
++       * the tx and rx buffers overlap.
++       */
+       drv_data->tx_dma = dma_map_single(dev, drv_data->tx,
+-                                              drv_data->tx_map_len,
+-                                              DMA_TO_DEVICE);
++                                      drv_data->tx_map_len, DMA_TO_DEVICE);
++      if (dma_mapping_error(dev, drv_data->tx_dma))
++              return 0;
+-      if (dma_mapping_error(dev, drv_data->tx_dma)) {
+-              dma_unmap_single(dev, drv_data->rx_dma,
++      /* Stream map the rx buffer */
++      drv_data->rx_dma = dma_map_single(dev, drv_data->rx,
+                                       drv_data->rx_map_len, DMA_FROM_DEVICE);
++      if (dma_mapping_error(dev, drv_data->rx_dma)) {
++              dma_unmap_single(dev, drv_data->tx_dma,
++                                      drv_data->tx_map_len, DMA_TO_DEVICE);
+               return 0;
+       }
+diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c
+index 659b3d9..428b599 100644
+--- a/drivers/usb/gadget/f_rndis.c
++++ b/drivers/usb/gadget/f_rndis.c
+@@ -172,7 +172,6 @@ static struct usb_interface_descriptor rndis_data_intf __initdata = {
+       .bDescriptorType =      USB_DT_INTERFACE,
+       /* .bInterfaceNumber = DYNAMIC */
+-      .bAlternateSetting =    1,
+       .bNumEndpoints =        2,
+       .bInterfaceClass =      USB_CLASS_CDC_DATA,
+       .bInterfaceSubClass =   0,
+@@ -303,7 +302,7 @@ static void rndis_response_available(void *_rndis)
+       __le32                          *data = req->buf;
+       int                             status;
+-      if (atomic_inc_return(&rndis->notify_count))
++      if (atomic_inc_return(&rndis->notify_count) != 1)
+               return;
+       /* Send RNDIS RESPONSE_AVAILABLE notification; a
+diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
+index c46a58f..36864f9 100644
+--- a/drivers/usb/host/ehci-pci.c
++++ b/drivers/usb/host/ehci-pci.c
+@@ -66,6 +66,8 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
+ {
+       struct ehci_hcd         *ehci = hcd_to_ehci(hcd);
+       struct pci_dev          *pdev = to_pci_dev(hcd->self.controller);
++      struct pci_dev          *p_smbus;
++      u8                      rev;
+       u32                     temp;
+       int                     retval;
+@@ -166,6 +168,28 @@ static int ehci_pci_setup(struct usb_hcd *hcd)
+                       pci_write_config_byte(pdev, 0x4b, tmp | 0x20);
+               }
+               break;
++      case PCI_VENDOR_ID_ATI:
++              /* SB600 and old version of SB700 have a bug in EHCI controller,
++               * which causes usb devices lose response in some cases.
++               */
++              if ((pdev->device == 0x4386) || (pdev->device == 0x4396)) {
++                      p_smbus = pci_get_device(PCI_VENDOR_ID_ATI,
++                                               PCI_DEVICE_ID_ATI_SBX00_SMBUS,
++                                               NULL);
++                      if (!p_smbus)
++                              break;
++                      rev = p_smbus->revision;
++                      if ((pdev->device == 0x4386) || (rev == 0x3a)
++                          || (rev == 0x3b)) {
++                              u8 tmp;
++                              ehci_info(ehci, "applying AMD SB600/SB700 USB "
++                                      "freeze workaround\n");
++                              pci_read_config_byte(pdev, 0x53, &tmp);
++                              pci_write_config_byte(pdev, 0x53, tmp | (1<<3));
++                      }
++                      pci_dev_put(p_smbus);
++              }
++              break;
+       }
+       ehci_reset(ehci);
+diff --git a/drivers/usb/mon/mon_bin.c b/drivers/usb/mon/mon_bin.c
+index 6566fc0..0ada0fc 100644
+--- a/drivers/usb/mon/mon_bin.c
++++ b/drivers/usb/mon/mon_bin.c
+@@ -687,7 +687,10 @@ static ssize_t mon_bin_read(struct file *file, char __user *buf,
+       }
+       if (rp->b_read >= sizeof(struct mon_bin_hdr)) {
+-              step_len = min(nbytes, (size_t)ep->len_cap);
++              step_len = ep->len_cap;
++              step_len -= rp->b_read - sizeof(struct mon_bin_hdr);
++              if (step_len > nbytes)
++                      step_len = nbytes;
+               offset = rp->b_out + PKT_SIZE;
+               offset += rp->b_read - sizeof(struct mon_bin_hdr);
+               if (offset >= rp->b_size)
+diff --git a/drivers/video/fbmem.c b/drivers/video/fbmem.c
+index 98843c2..3f050e2 100644
+--- a/drivers/video/fbmem.c
++++ b/drivers/video/fbmem.c
+@@ -232,7 +232,7 @@ static void fb_set_logo_directpalette(struct fb_info *info,
+       greenshift = info->var.green.offset;
+       blueshift = info->var.blue.offset;
+-      for (i = 32; i < logo->clutsize; i++)
++      for (i = 32; i < 32 + logo->clutsize; i++)
+               palette[i] = i << redshift | i << greenshift | i << blueshift;
+ }
+diff --git a/drivers/watchdog/hpwdt.c b/drivers/watchdog/hpwdt.c
+index a3765e0..763c1ea 100644
+--- a/drivers/watchdog/hpwdt.c
++++ b/drivers/watchdog/hpwdt.c
+@@ -40,6 +40,7 @@
+ #include <linux/bootmem.h>
+ #include <linux/slab.h>
+ #include <asm/desc.h>
++#include <asm/cacheflush.h>
+ #define PCI_BIOS32_SD_VALUE           0x5F32335F      /* "_32_" */
+ #define CRU_BIOS_SIGNATURE_VALUE      0x55524324
+@@ -394,6 +395,8 @@ static void __devinit dmi_find_cru(const struct dmi_header *dm)
+                               smbios_cru64_ptr->double_offset;
+                       cru_rom_addr = ioremap(cru_physical_address,
+                               smbios_cru64_ptr->double_length);
++                      set_memory_x((unsigned long)cru_rom_addr & PAGE_MASK,
++                              smbios_cru64_ptr->double_length >> PAGE_SHIFT);
+               }
+       }
+ }
+@@ -482,7 +485,7 @@ static int hpwdt_pretimeout(struct notifier_block *nb, unsigned long ulReason,
+                       "Management Log for details.\n");
+       }
+-      return NOTIFY_STOP;
++      return NOTIFY_OK;
+ }
+ /*
+diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
+index 69a12aa..490e34b 100644
+--- a/fs/cifs/cifs_debug.c
++++ b/fs/cifs/cifs_debug.c
+@@ -107,12 +107,13 @@ void cifs_dump_mids(struct TCP_Server_Info *server)
+ #ifdef CONFIG_PROC_FS
+ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
+ {
+-      struct list_head *tmp;
+-      struct list_head *tmp1;
++      struct list_head *tmp1, *tmp2, *tmp3;
+       struct mid_q_entry *mid_entry;
++      struct TCP_Server_Info *server;
+       struct cifsSesInfo *ses;
+       struct cifsTconInfo *tcon;
+-      int i;
++      int i, j;
++      __u32 dev_type;
+       seq_puts(m,
+                   "Display Internal CIFS Data Structures for Debugging\n"
+@@ -122,46 +123,78 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
+       seq_printf(m, "Servers:");
+       i = 0;
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalSMBSessionList) {
++      read_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp1, &cifs_tcp_ses_list) {
++              server = list_entry(tmp1, struct TCP_Server_Info,
++                                  tcp_ses_list);
+               i++;
+-              ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);
+-              if ((ses->serverDomain == NULL) || (ses->serverOS == NULL) ||
+-                 (ses->serverNOS == NULL)) {
+-                      seq_printf(m, "\nentry for %s not fully "
+-                                      "displayed\n\t", ses->serverName);
+-              } else {
+-                      seq_printf(m,
+-                                  "\n%d) Name: %s  Domain: %s Mounts: %d OS:"
+-                                  " %s  \n\tNOS: %s\tCapability: 0x%x\n\tSMB"
++              list_for_each(tmp2, &server->smb_ses_list) {
++                      ses = list_entry(tmp2, struct cifsSesInfo,
++                                       smb_ses_list);
++                      if ((ses->serverDomain == NULL) ||
++                              (ses->serverOS == NULL) ||
++                              (ses->serverNOS == NULL)) {
++                              seq_printf(m, "\n%d) entry for %s not fully "
++                                         "displayed\n\t", i, ses->serverName);
++                      } else {
++                              seq_printf(m,
++                                  "\n%d) Name: %s  Domain: %s Uses: %d OS:"
++                                  " %s\n\tNOS: %s\tCapability: 0x%x\n\tSMB"
+                                   " session status: %d\t",
+                               i, ses->serverName, ses->serverDomain,
+-                              atomic_read(&ses->inUse),
+-                              ses->serverOS, ses->serverNOS,
++                              ses->ses_count, ses->serverOS, ses->serverNOS,
+                               ses->capabilities, ses->status);
+-              }
+-              if (ses->server) {
++                      }
+                       seq_printf(m, "TCP status: %d\n\tLocal Users To "
+-                                  "Server: %d SecMode: 0x%x Req On Wire: %d",
+-                              ses->server->tcpStatus,
+-                              atomic_read(&ses->server->socketUseCount),
+-                              ses->server->secMode,
+-                              atomic_read(&ses->server->inFlight));
++                                 "Server: %d SecMode: 0x%x Req On Wire: %d",
++                                 server->tcpStatus, server->srv_count,
++                                 server->secMode,
++                                 atomic_read(&server->inFlight));
+ #ifdef CONFIG_CIFS_STATS2
+                       seq_printf(m, " In Send: %d In MaxReq Wait: %d",
+-                              atomic_read(&ses->server->inSend),
+-                              atomic_read(&ses->server->num_waiters));
++                              atomic_read(&server->inSend),
++                              atomic_read(&server->num_waiters));
+ #endif
+-                      seq_puts(m, "\nMIDs:\n");
++                      seq_puts(m, "\n\tShares:");
++                      j = 0;
++                      list_for_each(tmp3, &ses->tcon_list) {
++                              tcon = list_entry(tmp3, struct cifsTconInfo,
++                                                tcon_list);
++                              ++j;
++                              dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
++                              seq_printf(m, "\n\t%d) %s Mounts: %d ", j,
++                                         tcon->treeName, tcon->tc_count);
++                              if (tcon->nativeFileSystem) {
++                                      seq_printf(m, "Type: %s ",
++                                                 tcon->nativeFileSystem);
++                              }
++                              seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x"
++                                      "\nPathComponentMax: %d Status: 0x%d",
++                                      le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
++                                      le32_to_cpu(tcon->fsAttrInfo.Attributes),
++                                      le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
++                                      tcon->tidStatus);
++                              if (dev_type == FILE_DEVICE_DISK)
++                                      seq_puts(m, " type: DISK ");
++                              else if (dev_type == FILE_DEVICE_CD_ROM)
++                                      seq_puts(m, " type: CDROM ");
++                              else
++                                      seq_printf(m, " type: %d ", dev_type);
++
++                              if (tcon->need_reconnect)
++                                      seq_puts(m, "\tDISCONNECTED ");
++                              seq_putc(m, '\n');
++                      }
++
++                      seq_puts(m, "\n\tMIDs:\n");
+                       spin_lock(&GlobalMid_Lock);
+-                      list_for_each(tmp1, &ses->server->pending_mid_q) {
+-                              mid_entry = list_entry(tmp1, struct
+-                                      mid_q_entry,
++                      list_for_each(tmp3, &server->pending_mid_q) {
++                              mid_entry = list_entry(tmp3, struct mid_q_entry,
+                                       qhead);
+-                              seq_printf(m, "State: %d com: %d pid:"
++                              seq_printf(m, "\tState: %d com: %d pid:"
+                                               " %d tsk: %p mid %d\n",
+                                               mid_entry->midState,
+                                               (int)mid_entry->command,
+@@ -171,44 +204,8 @@ static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
+                       }
+                       spin_unlock(&GlobalMid_Lock);
+               }
+-
+-      }
+-      read_unlock(&GlobalSMBSeslock);
+-      seq_putc(m, '\n');
+-
+-      seq_puts(m, "Shares:");
+-
+-      i = 0;
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalTreeConnectionList) {
+-              __u32 dev_type;
+-              i++;
+-              tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
+-              dev_type = le32_to_cpu(tcon->fsDevInfo.DeviceType);
+-              seq_printf(m, "\n%d) %s Uses: %d ", i,
+-                               tcon->treeName, atomic_read(&tcon->useCount));
+-              if (tcon->nativeFileSystem) {
+-                      seq_printf(m, "Type: %s ",
+-                                       tcon->nativeFileSystem);
+-              }
+-              seq_printf(m, "DevInfo: 0x%x Attributes: 0x%x"
+-                               "\nPathComponentMax: %d Status: %d",
+-                          le32_to_cpu(tcon->fsDevInfo.DeviceCharacteristics),
+-                          le32_to_cpu(tcon->fsAttrInfo.Attributes),
+-                          le32_to_cpu(tcon->fsAttrInfo.MaxPathNameComponentLength),
+-                          tcon->tidStatus);
+-              if (dev_type == FILE_DEVICE_DISK)
+-                      seq_puts(m, " type: DISK ");
+-              else if (dev_type == FILE_DEVICE_CD_ROM)
+-                      seq_puts(m, " type: CDROM ");
+-              else
+-                      seq_printf(m, " type: %d ", dev_type);
+-
+-              if (tcon->tidStatus == CifsNeedReconnect)
+-                      seq_puts(m, "\tDISCONNECTED ");
+       }
+-      read_unlock(&GlobalSMBSeslock);
+-
++      read_unlock(&cifs_tcp_ses_lock);
+       seq_putc(m, '\n');
+       /* BB add code to dump additional info such as TCP session info now */
+@@ -234,7 +231,9 @@ static ssize_t cifs_stats_proc_write(struct file *file,
+ {
+       char c;
+       int rc;
+-      struct list_head *tmp;
++      struct list_head *tmp1, *tmp2, *tmp3;
++      struct TCP_Server_Info *server;
++      struct cifsSesInfo *ses;
+       struct cifsTconInfo *tcon;
+       rc = get_user(c, buffer);
+@@ -242,33 +241,42 @@ static ssize_t cifs_stats_proc_write(struct file *file,
+               return rc;
+       if (c == '1' || c == 'y' || c == 'Y' || c == '0') {
+-              read_lock(&GlobalSMBSeslock);
+ #ifdef CONFIG_CIFS_STATS2
+               atomic_set(&totBufAllocCount, 0);
+               atomic_set(&totSmBufAllocCount, 0);
+ #endif /* CONFIG_CIFS_STATS2 */
+-              list_for_each(tmp, &GlobalTreeConnectionList) {
+-                      tcon = list_entry(tmp, struct cifsTconInfo,
+-                                      cifsConnectionList);
+-                      atomic_set(&tcon->num_smbs_sent, 0);
+-                      atomic_set(&tcon->num_writes, 0);
+-                      atomic_set(&tcon->num_reads, 0);
+-                      atomic_set(&tcon->num_oplock_brks, 0);
+-                      atomic_set(&tcon->num_opens, 0);
+-                      atomic_set(&tcon->num_closes, 0);
+-                      atomic_set(&tcon->num_deletes, 0);
+-                      atomic_set(&tcon->num_mkdirs, 0);
+-                      atomic_set(&tcon->num_rmdirs, 0);
+-                      atomic_set(&tcon->num_renames, 0);
+-                      atomic_set(&tcon->num_t2renames, 0);
+-                      atomic_set(&tcon->num_ffirst, 0);
+-                      atomic_set(&tcon->num_fnext, 0);
+-                      atomic_set(&tcon->num_fclose, 0);
+-                      atomic_set(&tcon->num_hardlinks, 0);
+-                      atomic_set(&tcon->num_symlinks, 0);
+-                      atomic_set(&tcon->num_locks, 0);
++              read_lock(&cifs_tcp_ses_lock);
++              list_for_each(tmp1, &cifs_tcp_ses_list) {
++                      server = list_entry(tmp1, struct TCP_Server_Info,
++                                          tcp_ses_list);
++                      list_for_each(tmp2, &server->smb_ses_list) {
++                              ses = list_entry(tmp2, struct cifsSesInfo,
++                                               smb_ses_list);
++                              list_for_each(tmp3, &ses->tcon_list) {
++                                      tcon = list_entry(tmp3,
++                                                        struct cifsTconInfo,
++                                                        tcon_list);
++                                      atomic_set(&tcon->num_smbs_sent, 0);
++                                      atomic_set(&tcon->num_writes, 0);
++                                      atomic_set(&tcon->num_reads, 0);
++                                      atomic_set(&tcon->num_oplock_brks, 0);
++                                      atomic_set(&tcon->num_opens, 0);
++                                      atomic_set(&tcon->num_closes, 0);
++                                      atomic_set(&tcon->num_deletes, 0);
++                                      atomic_set(&tcon->num_mkdirs, 0);
++                                      atomic_set(&tcon->num_rmdirs, 0);
++                                      atomic_set(&tcon->num_renames, 0);
++                                      atomic_set(&tcon->num_t2renames, 0);
++                                      atomic_set(&tcon->num_ffirst, 0);
++                                      atomic_set(&tcon->num_fnext, 0);
++                                      atomic_set(&tcon->num_fclose, 0);
++                                      atomic_set(&tcon->num_hardlinks, 0);
++                                      atomic_set(&tcon->num_symlinks, 0);
++                                      atomic_set(&tcon->num_locks, 0);
++                              }
++                      }
+               }
+-              read_unlock(&GlobalSMBSeslock);
++              read_unlock(&cifs_tcp_ses_lock);
+       }
+       return count;
+@@ -277,7 +285,9 @@ static ssize_t cifs_stats_proc_write(struct file *file,
+ static int cifs_stats_proc_show(struct seq_file *m, void *v)
+ {
+       int i;
+-      struct list_head *tmp;
++      struct list_head *tmp1, *tmp2, *tmp3;
++      struct TCP_Server_Info *server;
++      struct cifsSesInfo *ses;
+       struct cifsTconInfo *tcon;
+       seq_printf(m,
+@@ -306,44 +316,55 @@ static int cifs_stats_proc_show(struct seq_file *m, void *v)
+               GlobalCurrentXid, GlobalMaxActiveXid);
+       i = 0;
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalTreeConnectionList) {
+-              i++;
+-              tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
+-              seq_printf(m, "\n%d) %s", i, tcon->treeName);
+-              if (tcon->tidStatus == CifsNeedReconnect)
+-                      seq_puts(m, "\tDISCONNECTED ");
+-              seq_printf(m, "\nSMBs: %d Oplock Breaks: %d",
+-                      atomic_read(&tcon->num_smbs_sent),
+-                      atomic_read(&tcon->num_oplock_brks));
+-              seq_printf(m, "\nReads:  %d Bytes: %lld",
+-                      atomic_read(&tcon->num_reads),
+-                      (long long)(tcon->bytes_read));
+-              seq_printf(m, "\nWrites: %d Bytes: %lld",
+-                      atomic_read(&tcon->num_writes),
+-                      (long long)(tcon->bytes_written));
+-              seq_printf(m,
+-                      "\nLocks: %d HardLinks: %d Symlinks: %d",
+-                      atomic_read(&tcon->num_locks),
+-                      atomic_read(&tcon->num_hardlinks),
+-                      atomic_read(&tcon->num_symlinks));
+-
+-              seq_printf(m, "\nOpens: %d Closes: %d Deletes: %d",
+-                      atomic_read(&tcon->num_opens),
+-                      atomic_read(&tcon->num_closes),
+-                      atomic_read(&tcon->num_deletes));
+-              seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
+-                      atomic_read(&tcon->num_mkdirs),
+-                      atomic_read(&tcon->num_rmdirs));
+-              seq_printf(m, "\nRenames: %d T2 Renames %d",
+-                      atomic_read(&tcon->num_renames),
+-                      atomic_read(&tcon->num_t2renames));
+-              seq_printf(m, "\nFindFirst: %d FNext %d FClose %d",
+-                      atomic_read(&tcon->num_ffirst),
+-                      atomic_read(&tcon->num_fnext),
+-                      atomic_read(&tcon->num_fclose));
++      read_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp1, &cifs_tcp_ses_list) {
++              server = list_entry(tmp1, struct TCP_Server_Info,
++                                  tcp_ses_list);
++              list_for_each(tmp2, &server->smb_ses_list) {
++                      ses = list_entry(tmp2, struct cifsSesInfo,
++                                       smb_ses_list);
++                      list_for_each(tmp3, &ses->tcon_list) {
++                              tcon = list_entry(tmp3,
++                                                struct cifsTconInfo,
++                                                tcon_list);
++                              i++;
++                              seq_printf(m, "\n%d) %s", i, tcon->treeName);
++                              if (tcon->need_reconnect)
++                                      seq_puts(m, "\tDISCONNECTED ");
++                              seq_printf(m, "\nSMBs: %d Oplock Breaks: %d",
++                                      atomic_read(&tcon->num_smbs_sent),
++                                      atomic_read(&tcon->num_oplock_brks));
++                              seq_printf(m, "\nReads:  %d Bytes: %lld",
++                                      atomic_read(&tcon->num_reads),
++                                      (long long)(tcon->bytes_read));
++                              seq_printf(m, "\nWrites: %d Bytes: %lld",
++                                      atomic_read(&tcon->num_writes),
++                                      (long long)(tcon->bytes_written));
++                              seq_printf(m, "\nLocks: %d HardLinks: %d "
++                                            "Symlinks: %d",
++                                      atomic_read(&tcon->num_locks),
++                                      atomic_read(&tcon->num_hardlinks),
++                                      atomic_read(&tcon->num_symlinks));
++                              seq_printf(m, "\nOpens: %d Closes: %d"
++                                            "Deletes: %d",
++                                      atomic_read(&tcon->num_opens),
++                                      atomic_read(&tcon->num_closes),
++                                      atomic_read(&tcon->num_deletes));
++                              seq_printf(m, "\nMkdirs: %d Rmdirs: %d",
++                                      atomic_read(&tcon->num_mkdirs),
++                                      atomic_read(&tcon->num_rmdirs));
++                              seq_printf(m, "\nRenames: %d T2 Renames %d",
++                                      atomic_read(&tcon->num_renames),
++                                      atomic_read(&tcon->num_t2renames));
++                              seq_printf(m, "\nFindFirst: %d FNext %d "
++                                            "FClose %d",
++                                      atomic_read(&tcon->num_ffirst),
++                                      atomic_read(&tcon->num_fnext),
++                                      atomic_read(&tcon->num_fclose));
++                      }
++              }
+       }
+-      read_unlock(&GlobalSMBSeslock);
++      read_unlock(&cifs_tcp_ses_lock);
+       seq_putc(m, '\n');
+       return 0;
+diff --git a/fs/cifs/cifs_spnego.c b/fs/cifs/cifs_spnego.c
+index 117ef4b..d0758b2 100644
+--- a/fs/cifs/cifs_spnego.c
++++ b/fs/cifs/cifs_spnego.c
+@@ -70,7 +70,8 @@ struct key_type cifs_spnego_key_type = {
+                               strlen("ver=0xFF") */
+ #define MAX_MECH_STR_LEN 13 /* length of longest security mechanism name, eg
+                              in future could have strlen(";sec=ntlmsspi") */
+-#define MAX_IPV6_ADDR_LEN 42 /* eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/60 */
++/* max possible addr len eg FEDC:BA98:7654:3210:FEDC:BA98:7654:3210/128 */
++#define MAX_IPV6_ADDR_LEN     43
+ /* get a key struct with a SPNEGO security blob, suitable for session setup */
+ struct key *
+ cifs_get_spnego_key(struct cifsSesInfo *sesInfo)
+diff --git a/fs/cifs/cifsfs.c b/fs/cifs/cifsfs.c
+index 25ecbd5..2fcc66c 100644
+--- a/fs/cifs/cifsfs.c
++++ b/fs/cifs/cifsfs.c
+@@ -510,10 +510,11 @@ static void cifs_umount_begin(struct super_block *sb)
+       tcon = cifs_sb->tcon;
+       if (tcon == NULL)
+               return;
+-      down(&tcon->tconSem);
+-      if (atomic_read(&tcon->useCount) == 1)
++
++      read_lock(&cifs_tcp_ses_lock);
++      if (tcon->tc_count == 1)
+               tcon->tidStatus = CifsExiting;
+-      up(&tcon->tconSem);
++      read_unlock(&cifs_tcp_ses_lock);
+       /* cancel_brl_requests(tcon); */ /* BB mark all brl mids as exiting */
+       /* cancel_notify_requests(tcon); */
+@@ -967,7 +968,7 @@ static int cifs_oplock_thread(void *dummyarg)
+                               not bother sending an oplock release if session
+                               to server still is disconnected since oplock
+                               already released by the server in that case */
+-                      if (pTcon->tidStatus != CifsNeedReconnect) {
++                      if (!pTcon->need_reconnect) {
+                               rc = CIFSSMBLock(0, pTcon, netfid,
+                                               0 /* len */ , 0 /* offset */, 0,
+                                               0, LOCKING_ANDX_OPLOCK_RELEASE,
+@@ -985,24 +986,24 @@ static int cifs_oplock_thread(void *dummyarg)
+ static int cifs_dnotify_thread(void *dummyarg)
+ {
+       struct list_head *tmp;
+-      struct cifsSesInfo *ses;
++      struct TCP_Server_Info *server;
+       do {
+               if (try_to_freeze())
+                       continue;
+               set_current_state(TASK_INTERRUPTIBLE);
+               schedule_timeout(15*HZ);
+-              read_lock(&GlobalSMBSeslock);
+               /* check if any stuck requests that need
+                  to be woken up and wakeq so the
+                  thread can wake up and error out */
+-              list_for_each(tmp, &GlobalSMBSessionList) {
+-                      ses = list_entry(tmp, struct cifsSesInfo,
+-                              cifsSessionList);
+-                      if (ses->server && atomic_read(&ses->server->inFlight))
+-                              wake_up_all(&ses->server->response_q);
++              read_lock(&cifs_tcp_ses_lock);
++              list_for_each(tmp, &cifs_tcp_ses_list) {
++                      server = list_entry(tmp, struct TCP_Server_Info,
++                                       tcp_ses_list);
++                      if (atomic_read(&server->inFlight))
++                              wake_up_all(&server->response_q);
+               }
+-              read_unlock(&GlobalSMBSeslock);
++              read_unlock(&cifs_tcp_ses_lock);
+       } while (!kthread_should_stop());
+       return 0;
+@@ -1013,9 +1014,7 @@ init_cifs(void)
+ {
+       int rc = 0;
+       cifs_proc_init();
+-/*    INIT_LIST_HEAD(&GlobalServerList);*/    /* BB not implemented yet */
+-      INIT_LIST_HEAD(&GlobalSMBSessionList);
+-      INIT_LIST_HEAD(&GlobalTreeConnectionList);
++      INIT_LIST_HEAD(&cifs_tcp_ses_list);
+       INIT_LIST_HEAD(&GlobalOplock_Q);
+ #ifdef CONFIG_CIFS_EXPERIMENTAL
+       INIT_LIST_HEAD(&GlobalDnotifyReqList);
+@@ -1043,6 +1042,7 @@ init_cifs(void)
+       GlobalMaxActiveXid = 0;
+       memset(Local_System_Name, 0, 15);
+       rwlock_init(&GlobalSMBSeslock);
++      rwlock_init(&cifs_tcp_ses_lock);
+       spin_lock_init(&GlobalMid_Lock);
+       if (cifs_max_pending < 2) {
+diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
+index 0d22479..1ae6314 100644
+--- a/fs/cifs/cifsglob.h
++++ b/fs/cifs/cifsglob.h
+@@ -85,8 +85,7 @@ enum securityEnum {
+ };
+ enum protocolEnum {
+-      IPV4 = 0,
+-      IPV6,
++      TCP = 0,
+       SCTP
+       /* Netbios frames protocol not supported at this time */
+ };
+@@ -122,6 +121,9 @@ struct cifs_cred {
+  */
+ struct TCP_Server_Info {
++      struct list_head tcp_ses_list;
++      struct list_head smb_ses_list;
++      int srv_count; /* reference counter */
+       /* 15 character server name + 0x20 16th byte indicating type = srv */
+       char server_RFC1001_name[SERVER_NAME_LEN_WITH_NULL];
+       char unicode_server_Name[SERVER_NAME_LEN_WITH_NULL * 2];
+@@ -141,7 +143,8 @@ struct TCP_Server_Info {
+       char versionMajor;
+       char versionMinor;
+       bool svlocal:1;                 /* local server or remote */
+-      atomic_t socketUseCount; /* number of open cifs sessions on socket */
++      bool noblocksnd;                /* use blocking sendmsg */
++      bool noautotune;                /* do not autotune send buf sizes */
+       atomic_t inFlight;  /* number of requests on the wire to server */
+ #ifdef CONFIG_CIFS_STATS2
+       atomic_t inSend; /* requests trying to send */
+@@ -192,13 +195,14 @@ struct cifsUidInfo {
+  * Session structure.  One of these for each uid session with a particular host
+  */
+ struct cifsSesInfo {
+-      struct list_head cifsSessionList;
++      struct list_head smb_ses_list;
++      struct list_head tcon_list;
+       struct semaphore sesSem;
+ #if 0
+       struct cifsUidInfo *uidInfo;    /* pointer to user info */
+ #endif
+       struct TCP_Server_Info *server; /* pointer to server info */
+-      atomic_t inUse; /* # of mounts (tree connections) on this ses */
++      int ses_count;          /* reference counter */
+       enum statusEnum status;
+       unsigned overrideSecFlg;  /* if non-zero override global sec flags */
+       __u16 ipc_tid;          /* special tid for connection to IPC share */
+@@ -214,6 +218,7 @@ struct cifsSesInfo {
+       char userName[MAX_USERNAME_SIZE + 1];
+       char *domainName;
+       char *password;
++      bool need_reconnect:1; /* connection reset, uid now invalid */
+ };
+ /* no more than one of the following three session flags may be set */
+ #define CIFS_SES_NT4 1
+@@ -228,16 +233,15 @@ struct cifsSesInfo {
+  * session
+  */
+ struct cifsTconInfo {
+-      struct list_head cifsConnectionList;
++      struct list_head tcon_list;
++      int tc_count;
+       struct list_head openFileList;
+-      struct semaphore tconSem;
+       struct cifsSesInfo *ses;        /* pointer to session associated with */
+       char treeName[MAX_TREE_SIZE + 1]; /* UNC name of resource in ASCII */
+       char *nativeFileSystem;
+       __u16 tid;              /* The 2 byte tree id */
+       __u16 Flags;            /* optional support bits */
+       enum statusEnum tidStatus;
+-      atomic_t useCount;      /* how many explicit/implicit mounts to share */
+ #ifdef CONFIG_CIFS_STATS
+       atomic_t num_smbs_sent;
+       atomic_t num_writes;
+@@ -285,6 +289,7 @@ struct cifsTconInfo {
+       bool seal:1;      /* transport encryption for this mounted share */
+       bool unix_ext:1;  /* if false disable Linux extensions to CIFS protocol
+                               for this mount even if server would support */
++      bool need_reconnect:1; /* connection reset, tid now invalid */
+       /* BB add field for back pointer to sb struct(s)? */
+ };
+@@ -584,21 +589,21 @@ require use of the stronger protocol */
+ #endif
+ /*
+- * The list of servers that did not respond with NT LM 0.12.
+- * This list helps improve performance and eliminate the messages indicating
+- * that we had a communications error talking to the server in this list.
++ * the list of TCP_Server_Info structures, ie each of the sockets
++ * connecting our client to a distinct server (ip address), is
++ * chained together by cifs_tcp_ses_list. The list of all our SMB
++ * sessions (and from that the tree connections) can be found
++ * by iterating over cifs_tcp_ses_list
+  */
+-/* Feature not supported */
+-/* GLOBAL_EXTERN struct servers_not_supported *NotSuppList; */
++GLOBAL_EXTERN struct list_head                cifs_tcp_ses_list;
+ /*
+- * The following is a hash table of all the users we know about.
++ * This lock protects the cifs_tcp_ses_list, the list of smb sessions per
++ * tcp session, and the list of tcon's per smb session. It also protects
++ * the reference counters for the server, smb session, and tcon. Finally,
++ * changes to the tcon->tidStatus should be done while holding this lock.
+  */
+-GLOBAL_EXTERN struct smbUidInfo *GlobalUidList[UID_HASH];
+-
+-/* GLOBAL_EXTERN struct list_head GlobalServerList; BB not implemented yet */
+-GLOBAL_EXTERN struct list_head GlobalSMBSessionList;
+-GLOBAL_EXTERN struct list_head GlobalTreeConnectionList;
++GLOBAL_EXTERN rwlock_t                cifs_tcp_ses_lock;
+ GLOBAL_EXTERN rwlock_t GlobalSMBSeslock;  /* protects list inserts on 3 above */
+ GLOBAL_EXTERN struct list_head GlobalOplock_Q;
+diff --git a/fs/cifs/cifsproto.h b/fs/cifs/cifsproto.h
+index a729d08..ca91f16 100644
+--- a/fs/cifs/cifsproto.h
++++ b/fs/cifs/cifsproto.h
+@@ -36,7 +36,7 @@ extern void cifs_buf_release(void *);
+ extern struct smb_hdr *cifs_small_buf_get(void);
+ extern void cifs_small_buf_release(void *);
+ extern int smb_send(struct socket *, struct smb_hdr *,
+-                      unsigned int /* length */ , struct sockaddr *);
++                      unsigned int /* length */ , struct sockaddr *, bool);
+ extern unsigned int _GetXid(void);
+ extern void _FreeXid(unsigned int);
+ #define GetXid() (int)_GetXid(); cFYI(1,("CIFS VFS: in %s as Xid: %d with uid: %d",__func__, xid,current->fsuid));
+diff --git a/fs/cifs/cifssmb.c b/fs/cifs/cifssmb.c
+index 77a0d1f..8f0f86d 100644
+--- a/fs/cifs/cifssmb.c
++++ b/fs/cifs/cifssmb.c
+@@ -190,10 +190,10 @@ small_smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
+               /* need to prevent multiple threads trying to
+               simultaneously reconnect the same SMB session */
+                       down(&tcon->ses->sesSem);
+-                      if (tcon->ses->status == CifsNeedReconnect)
++                      if (tcon->ses->need_reconnect)
+                               rc = cifs_setup_session(0, tcon->ses,
+                                                       nls_codepage);
+-                      if (!rc && (tcon->tidStatus == CifsNeedReconnect)) {
++                      if (!rc && (tcon->need_reconnect)) {
+                               mark_open_files_invalid(tcon);
+                               rc = CIFSTCon(0, tcon->ses, tcon->treeName,
+                                             tcon, nls_codepage);
+@@ -337,10 +337,10 @@ smb_init(int smb_command, int wct, struct cifsTconInfo *tcon,
+               /* need to prevent multiple threads trying to
+               simultaneously reconnect the same SMB session */
+                       down(&tcon->ses->sesSem);
+-                      if (tcon->ses->status == CifsNeedReconnect)
++                      if (tcon->ses->need_reconnect)
+                               rc = cifs_setup_session(0, tcon->ses,
+                                                       nls_codepage);
+-                      if (!rc && (tcon->tidStatus == CifsNeedReconnect)) {
++                      if (!rc && (tcon->need_reconnect)) {
+                               mark_open_files_invalid(tcon);
+                               rc = CIFSTCon(0, tcon->ses, tcon->treeName,
+                                             tcon, nls_codepage);
+@@ -664,8 +664,9 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
+                       rc = -EIO;
+                       goto neg_err_exit;
+               }
+-
+-              if (server->socketUseCount.counter > 1) {
++              read_lock(&cifs_tcp_ses_lock);
++              if (server->srv_count > 1) {
++                      read_unlock(&cifs_tcp_ses_lock);
+                       if (memcmp(server->server_GUID,
+                                  pSMBr->u.extended_response.
+                                  GUID, 16) != 0) {
+@@ -674,9 +675,11 @@ CIFSSMBNegotiate(unsigned int xid, struct cifsSesInfo *ses)
+                                       pSMBr->u.extended_response.GUID,
+                                       16);
+                       }
+-              } else
++              } else {
++                      read_unlock(&cifs_tcp_ses_lock);
+                       memcpy(server->server_GUID,
+                              pSMBr->u.extended_response.GUID, 16);
++              }
+               if (count == 16) {
+                       server->secType = RawNTLMSSP;
+@@ -739,50 +742,31 @@ CIFSSMBTDis(const int xid, struct cifsTconInfo *tcon)
+       int rc = 0;
+       cFYI(1, ("In tree disconnect"));
+-      /*
+-       *  If last user of the connection and
+-       *  connection alive - disconnect it
+-       *  If this is the last connection on the server session disconnect it
+-       *  (and inside session disconnect we should check if tcp socket needs
+-       *  to be freed and kernel thread woken up).
+-       */
+-      if (tcon)
+-              down(&tcon->tconSem);
+-      else
+-              return -EIO;
+-      atomic_dec(&tcon->useCount);
+-      if (atomic_read(&tcon->useCount) > 0) {
+-              up(&tcon->tconSem);
+-              return -EBUSY;
+-      }
++      /* BB: do we need to check this? These should never be NULL. */
++      if ((tcon->ses == NULL) || (tcon->ses->server == NULL))
++              return -EIO;
+-      /* No need to return error on this operation if tid invalidated and
+-      closed on server already e.g. due to tcp session crashing */
+-      if (tcon->tidStatus == CifsNeedReconnect) {
+-              up(&tcon->tconSem);
++      /*
++       * No need to return error on this operation if tid invalidated and
++       * closed on server already e.g. due to tcp session crashing. Also,
++       * the tcon is no longer on the list, so no need to take lock before
++       * checking this.
++       */
++      if (tcon->need_reconnect)
+               return 0;
+-      }
+-      if ((tcon->ses == NULL) || (tcon->ses->server == NULL)) {
+-              up(&tcon->tconSem);
+-              return -EIO;
+-      }
+       rc = small_smb_init(SMB_COM_TREE_DISCONNECT, 0, tcon,
+                           (void **)&smb_buffer);
+-      if (rc) {
+-              up(&tcon->tconSem);
++      if (rc)
+               return rc;
+-      }
+       rc = SendReceiveNoRsp(xid, tcon->ses, smb_buffer, 0);
+       if (rc)
+               cFYI(1, ("Tree disconnect failed %d", rc));
+-      up(&tcon->tconSem);
+-
+       /* No need to return error on this operation if tid invalidated and
+-      closed on server already e.g. due to tcp session crashing */
++         closed on server already e.g. due to tcp session crashing */
+       if (rc == -EAGAIN)
+               rc = 0;
+@@ -796,43 +780,36 @@ CIFSSMBLogoff(const int xid, struct cifsSesInfo *ses)
+       int rc = 0;
+       cFYI(1, ("In SMBLogoff for session disconnect"));
+-      if (ses)
+-              down(&ses->sesSem);
+-      else
++
++      /*
++       * BB: do we need to check validity of ses and server? They should
++       * always be valid since we have an active reference. If not, that
++       * should probably be a BUG()
++       */
++      if (!ses || !ses->server)
+               return -EIO;
+-      atomic_dec(&ses->inUse);
+-      if (atomic_read(&ses->inUse) > 0) {
+-              up(&ses->sesSem);
+-              return -EBUSY;
+-      }
++      down(&ses->sesSem);
++      if (ses->need_reconnect)
++              goto session_already_dead; /* no need to send SMBlogoff if uid
++                                            already closed due to reconnect */
+       rc = small_smb_init(SMB_COM_LOGOFF_ANDX, 2, NULL, (void **)&pSMB);
+       if (rc) {
+               up(&ses->sesSem);
+               return rc;
+       }
+-      if (ses->server) {
+-              pSMB->hdr.Mid = GetNextMid(ses->server);
++      pSMB->hdr.Mid = GetNextMid(ses->server);
+-              if (ses->server->secMode &
++      if (ses->server->secMode &
+                  (SECMODE_SIGN_REQUIRED | SECMODE_SIGN_ENABLED))
+                       pSMB->hdr.Flags2 |= SMBFLG2_SECURITY_SIGNATURE;
+-      }
+       pSMB->hdr.Uid = ses->Suid;
+       pSMB->AndXCommand = 0xFF;
+       rc = SendReceiveNoRsp(xid, ses, (struct smb_hdr *) pSMB, 0);
+-      if (ses->server) {
+-              atomic_dec(&ses->server->socketUseCount);
+-              if (atomic_read(&ses->server->socketUseCount) == 0) {
+-                      spin_lock(&GlobalMid_Lock);
+-                      ses->server->tcpStatus = CifsExiting;
+-                      spin_unlock(&GlobalMid_Lock);
+-                      rc = -ESHUTDOWN;
+-              }
+-      }
++session_already_dead:
+       up(&ses->sesSem);
+       /* if session dead then we do not need to do ulogoff,
+@@ -1534,7 +1511,7 @@ CIFSSMBWrite(const int xid, struct cifsTconInfo *tcon,
+       __u32 bytes_sent;
+       __u16 byte_count;
+-      /* cFYI(1,("write at %lld %d bytes",offset,count));*/
++      /* cFYI(1, ("write at %lld %d bytes",offset,count));*/
+       if (tcon->ses == NULL)
+               return -ECONNABORTED;
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 4c13bcd..6e2be4a 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -90,6 +90,8 @@ struct smb_vol {
+       bool nocase:1;     /* request case insensitive filenames */
+       bool nobrl:1;      /* disable sending byte range locks to srv */
+       bool seal:1;       /* request transport encryption on share */
++      bool noblocksnd:1;
++      bool noautotune:1;
+       unsigned int rsize;
+       unsigned int wsize;
+       unsigned int sockopt;
+@@ -100,9 +102,11 @@ struct smb_vol {
+ static int ipv4_connect(struct sockaddr_in *psin_server,
+                       struct socket **csocket,
+                       char *netb_name,
+-                      char *server_netb_name);
++                      char *server_netb_name,
++                      bool noblocksnd,
++                      bool nosndbuf); /* ipv6 never set sndbuf size */
+ static int ipv6_connect(struct sockaddr_in6 *psin_server,
+-                      struct socket **csocket);
++                      struct socket **csocket, bool noblocksnd);
+       /*
+@@ -118,7 +122,7 @@ static int
+ cifs_reconnect(struct TCP_Server_Info *server)
+ {
+       int rc = 0;
+-      struct list_head *tmp;
++      struct list_head *tmp, *tmp2;
+       struct cifsSesInfo *ses;
+       struct cifsTconInfo *tcon;
+       struct mid_q_entry *mid_entry;
+@@ -138,23 +142,17 @@ cifs_reconnect(struct TCP_Server_Info *server)
+       /* before reconnecting the tcp session, mark the smb session (uid)
+               and the tid bad so they are not used until reconnected */
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalSMBSessionList) {
+-              ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);
+-              if (ses->server) {
+-                      if (ses->server == server) {
+-                              ses->status = CifsNeedReconnect;
+-                              ses->ipc_tid = 0;
+-                      }
++      read_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &server->smb_ses_list) {
++              ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
++              ses->need_reconnect = true;
++              ses->ipc_tid = 0;
++              list_for_each(tmp2, &ses->tcon_list) {
++                      tcon = list_entry(tmp2, struct cifsTconInfo, tcon_list);
++                      tcon->need_reconnect = true;
+               }
+-              /* else tcp and smb sessions need reconnection */
+-      }
+-      list_for_each(tmp, &GlobalTreeConnectionList) {
+-              tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
+-              if ((tcon->ses) && (tcon->ses->server == server))
+-                      tcon->tidStatus = CifsNeedReconnect;
+       }
+-      read_unlock(&GlobalSMBSeslock);
++      read_unlock(&cifs_tcp_ses_lock);
+       /* do not want to be sending data on a socket we are freeing */
+       down(&server->tcpSem);
+       if (server->ssocket) {
+@@ -186,14 +184,15 @@ cifs_reconnect(struct TCP_Server_Info *server)
+       while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) {
+               try_to_freeze();
+-              if (server->protocolType == IPV6) {
++              if (server->addr.sockAddr6.sin6_family == AF_INET6) {
+                       rc = ipv6_connect(&server->addr.sockAddr6,
+-                                        &server->ssocket);
++                                        &server->ssocket, server->noautotune);
+               } else {
+                       rc = ipv4_connect(&server->addr.sockAddr,
+                                       &server->ssocket,
+                                       server->workstation_RFC1001_name,
+-                                      server->server_RFC1001_name);
++                                      server->server_RFC1001_name,
++                                      server->noblocksnd, server->noautotune);
+               }
+               if (rc) {
+                       cFYI(1, ("reconnect error %d", rc));
+@@ -409,8 +408,14 @@ incomplete_rcv:
+                       msleep(1); /* minimum sleep to prevent looping
+                               allowing socket to clear and app threads to set
+                               tcpStatus CifsNeedReconnect if server hung */
+-                      if (pdu_length < 4)
++                      if (pdu_length < 4) {
++                              iov.iov_base = (4 - pdu_length) +
++                                              (char *)smb_buffer;
++                              iov.iov_len = pdu_length;
++                              smb_msg.msg_control = NULL;
++                              smb_msg.msg_controllen = 0;
+                               goto incomplete_rcv;
++                      }
+                       else
+                               continue;
+               } else if (length <= 0) {
+@@ -646,6 +651,11 @@ multi_t2_fnd:
+               }
+       } /* end while !EXITING */
++      /* take it off the list, if it's not already */
++      write_lock(&cifs_tcp_ses_lock);
++      list_del_init(&server->tcp_ses_list);
++      write_unlock(&cifs_tcp_ses_lock);
++
+       spin_lock(&GlobalMid_Lock);
+       server->tcpStatus = CifsExiting;
+       spin_unlock(&GlobalMid_Lock);
+@@ -686,29 +696,29 @@ multi_t2_fnd:
+       if (smallbuf) /* no sense logging a debug message if NULL */
+               cifs_small_buf_release(smallbuf);
+-      read_lock(&GlobalSMBSeslock);
++      /*
++       * BB: we shouldn't have to do any of this. It shouldn't be
++       * possible to exit from the thread with active SMB sessions
++       */
++      read_lock(&cifs_tcp_ses_lock);
+       if (list_empty(&server->pending_mid_q)) {
+               /* loop through server session structures attached to this and
+                   mark them dead */
+-              list_for_each(tmp, &GlobalSMBSessionList) {
+-                      ses =
+-                          list_entry(tmp, struct cifsSesInfo,
+-                                     cifsSessionList);
+-                      if (ses->server == server) {
+-                              ses->status = CifsExiting;
+-                              ses->server = NULL;
+-                      }
++              list_for_each(tmp, &server->smb_ses_list) {
++                      ses = list_entry(tmp, struct cifsSesInfo,
++                                       smb_ses_list);
++                      ses->status = CifsExiting;
++                      ses->server = NULL;
+               }
+-              read_unlock(&GlobalSMBSeslock);
++              read_unlock(&cifs_tcp_ses_lock);
+       } else {
+               /* although we can not zero the server struct pointer yet,
+               since there are active requests which may depnd on them,
+               mark the corresponding SMB sessions as exiting too */
+-              list_for_each(tmp, &GlobalSMBSessionList) {
++              list_for_each(tmp, &server->smb_ses_list) {
+                       ses = list_entry(tmp, struct cifsSesInfo,
+-                                       cifsSessionList);
+-                      if (ses->server == server)
+-                              ses->status = CifsExiting;
++                                       smb_ses_list);
++                      ses->status = CifsExiting;
+               }
+               spin_lock(&GlobalMid_Lock);
+@@ -723,7 +733,7 @@ multi_t2_fnd:
+                       }
+               }
+               spin_unlock(&GlobalMid_Lock);
+-              read_unlock(&GlobalSMBSeslock);
++              read_unlock(&cifs_tcp_ses_lock);
+               /* 1/8th of sec is more than enough time for them to exit */
+               msleep(125);
+       }
+@@ -745,14 +755,13 @@ multi_t2_fnd:
+       if there are any pointing to this (e.g
+       if a crazy root user tried to kill cifsd
+       kernel thread explicitly this might happen) */
+-      write_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalSMBSessionList) {
+-              ses = list_entry(tmp, struct cifsSesInfo,
+-                              cifsSessionList);
+-              if (ses->server == server)
+-                      ses->server = NULL;
++      /* BB: This shouldn't be necessary, see above */
++      read_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &server->smb_ses_list) {
++              ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
++              ses->server = NULL;
+       }
+-      write_unlock(&GlobalSMBSeslock);
++      read_unlock(&cifs_tcp_ses_lock);
+       kfree(server->hostname);
+       kfree(server);
+@@ -1186,6 +1195,10 @@ cifs_parse_mount_options(char *options, const char *devname,
+                       /* ignore */
+               } else if (strnicmp(data, "rw", 2) == 0) {
+                       vol->rw = true;
++              } else if (strnicmp(data, "noblocksnd", 11) == 0) {
++                      vol->noblocksnd = true;
++              } else if (strnicmp(data, "noautotune", 10) == 0) {
++                      vol->noautotune = true;
+               } else if ((strnicmp(data, "suid", 4) == 0) ||
+                                  (strnicmp(data, "nosuid", 6) == 0) ||
+                                  (strnicmp(data, "exec", 4) == 0) ||
+@@ -1331,94 +1344,158 @@ cifs_parse_mount_options(char *options, const char *devname,
+       return 0;
+ }
+-static struct cifsSesInfo *
+-cifs_find_tcp_session(struct in_addr *target_ip_addr,
+-                    struct in6_addr *target_ip6_addr,
+-                    char *userName, struct TCP_Server_Info **psrvTcp)
++static struct TCP_Server_Info *
++cifs_find_tcp_session(struct sockaddr *addr)
+ {
+       struct list_head *tmp;
+-      struct cifsSesInfo *ses;
+-
+-      *psrvTcp = NULL;
++      struct TCP_Server_Info *server;
++      struct sockaddr_in *addr4 = (struct sockaddr_in *) addr;
++      struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *) addr;
++
++      write_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &cifs_tcp_ses_list) {
++              server = list_entry(tmp, struct TCP_Server_Info,
++                                  tcp_ses_list);
++              /*
++               * the demux thread can exit on its own while still in CifsNew
++               * so don't accept any sockets in that state. Since the
++               * tcpStatus never changes back to CifsNew it's safe to check
++               * for this without a lock.
++               */
++              if (server->tcpStatus == CifsNew)
++                      continue;
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalSMBSessionList) {
+-              ses = list_entry(tmp, struct cifsSesInfo, cifsSessionList);
+-              if (!ses->server)
++              if (addr->sa_family == AF_INET &&
++                  (addr4->sin_addr.s_addr !=
++                   server->addr.sockAddr.sin_addr.s_addr))
++                      continue;
++              else if (addr->sa_family == AF_INET6 &&
++                       memcmp(&server->addr.sockAddr6.sin6_addr,
++                              &addr6->sin6_addr, sizeof(addr6->sin6_addr)))
+                       continue;
+-              if (target_ip_addr &&
+-                  ses->server->addr.sockAddr.sin_addr.s_addr != target_ip_addr->s_addr)
+-                              continue;
+-              else if (target_ip6_addr &&
+-                       memcmp(&ses->server->addr.sockAddr6.sin6_addr,
+-                              target_ip6_addr, sizeof(*target_ip6_addr)))
+-                              continue;
+-              /* BB lock server and tcp session; increment use count here?? */
++              ++server->srv_count;
++              write_unlock(&cifs_tcp_ses_lock);
++              cFYI(1, ("Existing tcp session with server found"));
++              return server;
++      }
++      write_unlock(&cifs_tcp_ses_lock);
++      return NULL;
++}
+-              /* found a match on the TCP session */
+-              *psrvTcp = ses->server;
++static void
++cifs_put_tcp_session(struct TCP_Server_Info *server)
++{
++      struct task_struct *task;
+-              /* BB check if reconnection needed */
+-              if (strncmp(ses->userName, userName, MAX_USERNAME_SIZE) == 0) {
+-                      read_unlock(&GlobalSMBSeslock);
+-                      /* Found exact match on both TCP and
+-                         SMB sessions */
+-                      return ses;
+-              }
+-              /* else tcp and smb sessions need reconnection */
++      write_lock(&cifs_tcp_ses_lock);
++      if (--server->srv_count > 0) {
++              write_unlock(&cifs_tcp_ses_lock);
++              return;
+       }
+-      read_unlock(&GlobalSMBSeslock);
+-      return NULL;
++      list_del_init(&server->tcp_ses_list);
++      write_unlock(&cifs_tcp_ses_lock);
++
++      spin_lock(&GlobalMid_Lock);
++      server->tcpStatus = CifsExiting;
++      spin_unlock(&GlobalMid_Lock);
++
++      task = xchg(&server->tsk, NULL);
++      if (task)
++              force_sig(SIGKILL, task);
+ }
+-static struct cifsTconInfo *
+-find_unc(__be32 new_target_ip_addr, char *uncName, char *userName)
++static struct cifsSesInfo *
++cifs_find_smb_ses(struct TCP_Server_Info *server, char *username)
+ {
+       struct list_head *tmp;
+-      struct cifsTconInfo *tcon;
+-      __be32 old_ip;
+-
+-      read_lock(&GlobalSMBSeslock);
++      struct cifsSesInfo *ses;
+-      list_for_each(tmp, &GlobalTreeConnectionList) {
+-              cFYI(1, ("Next tcon"));
+-              tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
+-              if (!tcon->ses || !tcon->ses->server)
++      write_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &server->smb_ses_list) {
++              ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
++              if (strncmp(ses->userName, username, MAX_USERNAME_SIZE))
+                       continue;
+-              old_ip = tcon->ses->server->addr.sockAddr.sin_addr.s_addr;
+-              cFYI(1, ("old ip addr: %x == new ip %x ?",
+-                      old_ip, new_target_ip_addr));
++              ++ses->ses_count;
++              write_unlock(&cifs_tcp_ses_lock);
++              return ses;
++      }
++      write_unlock(&cifs_tcp_ses_lock);
++      return NULL;
++}
+-              if (old_ip != new_target_ip_addr)
+-                      continue;
++static void
++cifs_put_smb_ses(struct cifsSesInfo *ses)
++{
++      int xid;
++      struct TCP_Server_Info *server = ses->server;
+-              /* BB lock tcon, server, tcp session and increment use count? */
+-              /* found a match on the TCP session */
+-              /* BB check if reconnection needed */
+-              cFYI(1, ("IP match, old UNC: %s new: %s",
+-                      tcon->treeName, uncName));
++      write_lock(&cifs_tcp_ses_lock);
++      if (--ses->ses_count > 0) {
++              write_unlock(&cifs_tcp_ses_lock);
++              return;
++      }
+-              if (strncmp(tcon->treeName, uncName, MAX_TREE_SIZE))
+-                      continue;
++      list_del_init(&ses->smb_ses_list);
++      write_unlock(&cifs_tcp_ses_lock);
++
++      if (ses->status == CifsGood) {
++              xid = GetXid();
++              CIFSSMBLogoff(xid, ses);
++              _FreeXid(xid);
++      }
++      sesInfoFree(ses);
++      cifs_put_tcp_session(server);
++}
+-              cFYI(1, ("and old usr: %s new: %s",
+-                      tcon->treeName, uncName));
++static struct cifsTconInfo *
++cifs_find_tcon(struct cifsSesInfo *ses, const char *unc)
++{
++      struct list_head *tmp;
++      struct cifsTconInfo *tcon;
+-              if (strncmp(tcon->ses->userName, userName, MAX_USERNAME_SIZE))
++      write_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &ses->tcon_list) {
++              tcon = list_entry(tmp, struct cifsTconInfo, tcon_list);
++              if (tcon->tidStatus == CifsExiting)
++                      continue;
++              if (strncmp(tcon->treeName, unc, MAX_TREE_SIZE))
+                       continue;
+-              /* matched smb session (user name) */
+-              read_unlock(&GlobalSMBSeslock);
++              ++tcon->tc_count;
++              write_unlock(&cifs_tcp_ses_lock);
+               return tcon;
+       }
+-
+-      read_unlock(&GlobalSMBSeslock);
++      write_unlock(&cifs_tcp_ses_lock);
+       return NULL;
+ }
++static void
++cifs_put_tcon(struct cifsTconInfo *tcon)
++{
++      int xid;
++      struct cifsSesInfo *ses = tcon->ses;
++
++      write_lock(&cifs_tcp_ses_lock);
++      if (--tcon->tc_count > 0) {
++              write_unlock(&cifs_tcp_ses_lock);
++              return;
++      }
++
++      list_del_init(&tcon->tcon_list);
++      write_unlock(&cifs_tcp_ses_lock);
++
++      xid = GetXid();
++      CIFSSMBTDis(xid, tcon);
++      _FreeXid(xid);
++
++      DeleteTconOplockQEntries(tcon);
++      tconInfoFree(tcon);
++      cifs_put_smb_ses(ses);
++}
++
+ int
+ get_dfs_path(int xid, struct cifsSesInfo *pSesInfo, const char *old_path,
+            const struct nls_table *nls_codepage, unsigned int *pnum_referrals,
+@@ -1506,7 +1583,8 @@ static void rfc1002mangle(char *target, char *source, unsigned int length)
+ static int
+ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
+-           char *netbios_name, char *target_name)
++              char *netbios_name, char *target_name,
++              bool noblocksnd, bool noautotune)
+ {
+       int rc = 0;
+       int connected = 0;
+@@ -1578,11 +1656,15 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
+                (*csocket)->sk->sk_sndbuf,
+                (*csocket)->sk->sk_rcvbuf, (*csocket)->sk->sk_rcvtimeo));
+       (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
++      if (!noblocksnd)
++              (*csocket)->sk->sk_sndtimeo = 3 * HZ;
+       /* make the bufsizes depend on wsize/rsize and max requests */
+-      if ((*csocket)->sk->sk_sndbuf < (200 * 1024))
+-              (*csocket)->sk->sk_sndbuf = 200 * 1024;
+-      if ((*csocket)->sk->sk_rcvbuf < (140 * 1024))
+-              (*csocket)->sk->sk_rcvbuf = 140 * 1024;
++      if (noautotune) {
++              if ((*csocket)->sk->sk_sndbuf < (200 * 1024))
++                      (*csocket)->sk->sk_sndbuf = 200 * 1024;
++              if ((*csocket)->sk->sk_rcvbuf < (140 * 1024))
++                      (*csocket)->sk->sk_rcvbuf = 140 * 1024;
++      }
+       /* send RFC1001 sessinit */
+       if (psin_server->sin_port == htons(RFC1001_PORT)) {
+@@ -1619,7 +1701,7 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
+                       /* sizeof RFC1002_SESSION_REQUEST with no scope */
+                       smb_buf->smb_buf_length = 0x81000044;
+                       rc = smb_send(*csocket, smb_buf, 0x44,
+-                              (struct sockaddr *)psin_server);
++                              (struct sockaddr *)psin_server, noblocksnd);
+                       kfree(ses_init_buf);
+                       msleep(1); /* RFC1001 layer in at least one server
+                                     requires very short break before negprot
+@@ -1639,7 +1721,8 @@ ipv4_connect(struct sockaddr_in *psin_server, struct socket **csocket,
+ }
+ static int
+-ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
++ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket,
++              bool noblocksnd)
+ {
+       int rc = 0;
+       int connected = 0;
+@@ -1708,6 +1791,8 @@ ipv6_connect(struct sockaddr_in6 *psin_server, struct socket **csocket)
+               the default. sock_setsockopt not used because it expects
+               user space buffer */
+       (*csocket)->sk->sk_rcvtimeo = 7 * HZ;
++      if (!noblocksnd)
++              (*csocket)->sk->sk_sndtimeo = 3 * HZ;
+       return rc;
+ }
+@@ -1845,19 +1930,104 @@ convert_delimiter(char *path, char delim)
+       }
+ }
++static void setup_cifs_sb(struct smb_vol *pvolume_info,
++                        struct cifs_sb_info *cifs_sb)
++{
++      if (pvolume_info->rsize > CIFSMaxBufSize) {
++              cERROR(1, ("rsize %d too large, using MaxBufSize",
++                      pvolume_info->rsize));
++              cifs_sb->rsize = CIFSMaxBufSize;
++      } else if ((pvolume_info->rsize) &&
++                      (pvolume_info->rsize <= CIFSMaxBufSize))
++              cifs_sb->rsize = pvolume_info->rsize;
++      else /* default */
++              cifs_sb->rsize = CIFSMaxBufSize;
++
++      if (pvolume_info->wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
++              cERROR(1, ("wsize %d too large, using 4096 instead",
++                        pvolume_info->wsize));
++              cifs_sb->wsize = 4096;
++      } else if (pvolume_info->wsize)
++              cifs_sb->wsize = pvolume_info->wsize;
++      else
++              cifs_sb->wsize = min_t(const int,
++                                      PAGEVEC_SIZE * PAGE_CACHE_SIZE,
++                                      127*1024);
++              /* old default of CIFSMaxBufSize was too small now
++                 that SMB Write2 can send multiple pages in kvec.
++                 RFC1001 does not describe what happens when frame
++                 bigger than 128K is sent so use that as max in
++                 conjunction with 52K kvec constraint on arch with 4K
++                 page size  */
++
++      if (cifs_sb->rsize < 2048) {
++              cifs_sb->rsize = 2048;
++              /* Windows ME may prefer this */
++              cFYI(1, ("readsize set to minimum: 2048"));
++      }
++      /* calculate prepath */
++      cifs_sb->prepath = pvolume_info->prepath;
++      if (cifs_sb->prepath) {
++              cifs_sb->prepathlen = strlen(cifs_sb->prepath);
++              /* we can not convert the / to \ in the path
++              separators in the prefixpath yet because we do not
++              know (until reset_cifs_unix_caps is called later)
++              whether POSIX PATH CAP is available. We normalize
++              the / to \ after reset_cifs_unix_caps is called */
++              pvolume_info->prepath = NULL;
++      } else
++              cifs_sb->prepathlen = 0;
++      cifs_sb->mnt_uid = pvolume_info->linux_uid;
++      cifs_sb->mnt_gid = pvolume_info->linux_gid;
++      cifs_sb->mnt_file_mode = pvolume_info->file_mode;
++      cifs_sb->mnt_dir_mode = pvolume_info->dir_mode;
++      cFYI(1, ("file mode: 0x%x  dir mode: 0x%x",
++              cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode));
++
++      if (pvolume_info->noperm)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
++      if (pvolume_info->setuids)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
++      if (pvolume_info->server_ino)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
++      if (pvolume_info->remap)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
++      if (pvolume_info->no_xattr)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
++      if (pvolume_info->sfu_emul)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
++      if (pvolume_info->nobrl)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
++      if (pvolume_info->cifs_acl)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
++      if (pvolume_info->override_uid)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
++      if (pvolume_info->override_gid)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
++      if (pvolume_info->dynperm)
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
++      if (pvolume_info->direct_io) {
++              cFYI(1, ("mounting share using direct i/o"));
++              cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
++      }
++
++      if ((pvolume_info->cifs_acl) && (pvolume_info->dynperm))
++              cERROR(1, ("mount option dynperm ignored if cifsacl "
++                         "mount option supported"));
++}
++
+ int
+ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+          char *mount_data, const char *devname)
+ {
+       int rc = 0;
+       int xid;
+-      int address_type = AF_INET;
+       struct socket *csocket = NULL;
+-      struct sockaddr_in sin_server;
+-      struct sockaddr_in6 sin_server6;
++      struct sockaddr addr;
++      struct sockaddr_in *sin_server = (struct sockaddr_in *) &addr;
++      struct sockaddr_in6 *sin_server6 = (struct sockaddr_in6 *) &addr;
+       struct smb_vol volume_info;
+       struct cifsSesInfo *pSesInfo = NULL;
+-      struct cifsSesInfo *existingCifsSes = NULL;
+       struct cifsTconInfo *tcon = NULL;
+       struct TCP_Server_Info *srvTcp = NULL;
+@@ -1865,6 +2035,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+ /* cFYI(1, ("Entering cifs_mount. Xid: %d with: %s", xid, mount_data)); */
++      memset(&addr, 0, sizeof(struct sockaddr));
+       memset(&volume_info, 0, sizeof(struct smb_vol));
+       if (cifs_parse_mount_options(mount_data, devname, &volume_info)) {
+               rc = -EINVAL;
+@@ -1887,16 +2058,16 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       if (volume_info.UNCip && volume_info.UNC) {
+               rc = cifs_inet_pton(AF_INET, volume_info.UNCip,
+-                                  &sin_server.sin_addr.s_addr);
++                                  &sin_server->sin_addr.s_addr);
+               if (rc <= 0) {
+                       /* not ipv4 address, try ipv6 */
+                       rc = cifs_inet_pton(AF_INET6, volume_info.UNCip,
+-                                          &sin_server6.sin6_addr.in6_u);
++                                          &sin_server6->sin6_addr.in6_u);
+                       if (rc > 0)
+-                              address_type = AF_INET6;
++                              addr.sa_family = AF_INET6;
+               } else {
+-                      address_type = AF_INET;
++                      addr.sa_family = AF_INET;
+               }
+               if (rc <= 0) {
+@@ -1936,38 +2107,25 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+               }
+       }
+-      if (address_type == AF_INET)
+-              existingCifsSes = cifs_find_tcp_session(&sin_server.sin_addr,
+-                      NULL /* no ipv6 addr */,
+-                      volume_info.username, &srvTcp);
+-      else if (address_type == AF_INET6) {
+-              cFYI(1, ("looking for ipv6 address"));
+-              existingCifsSes = cifs_find_tcp_session(NULL /* no ipv4 addr */,
+-                      &sin_server6.sin6_addr,
+-                      volume_info.username, &srvTcp);
+-      } else {
+-              rc = -EINVAL;
+-              goto out;
+-      }
+-
+-      if (srvTcp) {
+-              cFYI(1, ("Existing tcp session with server found"));
+-      } else {        /* create socket */
+-              if (volume_info.port)
+-                      sin_server.sin_port = htons(volume_info.port);
+-              else
+-                      sin_server.sin_port = 0;
+-              if (address_type == AF_INET6) {
++      srvTcp = cifs_find_tcp_session(&addr);
++      if (!srvTcp) { /* create socket */
++              if (addr.sa_family == AF_INET6) {
+                       cFYI(1, ("attempting ipv6 connect"));
+                       /* BB should we allow ipv6 on port 139? */
+                       /* other OS never observed in Wild doing 139 with v6 */
+-                      rc = ipv6_connect(&sin_server6, &csocket);
+-              } else
+-                      rc = ipv4_connect(&sin_server, &csocket,
+-                                volume_info.source_rfc1001_name,
+-                                volume_info.target_rfc1001_name);
++                      sin_server6->sin6_port = htons(volume_info.port);
++                      rc = ipv6_connect(sin_server6, &csocket,
++                                      volume_info.noblocksnd);
++              } else {
++                      sin_server->sin_port = htons(volume_info.port);
++                      rc = ipv4_connect(sin_server, &csocket,
++                                      volume_info.source_rfc1001_name,
++                                      volume_info.target_rfc1001_name,
++                                      volume_info.noblocksnd,
++                                      volume_info.noautotune);
++              }
+               if (rc < 0) {
+-                      cERROR(1, ("Error connecting to IPv4 socket. "
++                      cERROR(1, ("Error connecting to socket. "
+                                  "Aborting operation"));
+                       if (csocket != NULL)
+                               sock_release(csocket);
+@@ -1980,12 +2138,17 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+                       sock_release(csocket);
+                       goto out;
+               } else {
+-                      memcpy(&srvTcp->addr.sockAddr, &sin_server,
+-                              sizeof(struct sockaddr_in));
++                      srvTcp->noblocksnd = volume_info.noblocksnd;
++                      srvTcp->noautotune = volume_info.noautotune;
++                      if (addr.sa_family == AF_INET6)
++                              memcpy(&srvTcp->addr.sockAddr6, sin_server6,
++                                      sizeof(struct sockaddr_in6));
++                      else
++                              memcpy(&srvTcp->addr.sockAddr, sin_server,
++                                      sizeof(struct sockaddr_in));
+                       atomic_set(&srvTcp->inFlight, 0);
+                       /* BB Add code for ipv6 case too */
+                       srvTcp->ssocket = csocket;
+-                      srvTcp->protocolType = IPV4;
+                       srvTcp->hostname = extract_hostname(volume_info.UNC);
+                       if (IS_ERR(srvTcp->hostname)) {
+                               rc = PTR_ERR(srvTcp->hostname);
+@@ -2015,15 +2178,28 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+                       memcpy(srvTcp->server_RFC1001_name,
+                               volume_info.target_rfc1001_name, 16);
+                       srvTcp->sequence_number = 0;
++                      INIT_LIST_HEAD(&srvTcp->tcp_ses_list);
++                      INIT_LIST_HEAD(&srvTcp->smb_ses_list);
++                      ++srvTcp->srv_count;
++                      write_lock(&cifs_tcp_ses_lock);
++                      list_add(&srvTcp->tcp_ses_list,
++                               &cifs_tcp_ses_list);
++                      write_unlock(&cifs_tcp_ses_lock);
+               }
+       }
+-      if (existingCifsSes) {
+-              pSesInfo = existingCifsSes;
++      pSesInfo = cifs_find_smb_ses(srvTcp, volume_info.username);
++      if (pSesInfo) {
+               cFYI(1, ("Existing smb sess found (status=%d)",
+                       pSesInfo->status));
++              /*
++               * The existing SMB session already has a reference to srvTcp,
++               * so we can put back the extra one we got before
++               */
++              cifs_put_tcp_session(srvTcp);
++
+               down(&pSesInfo->sesSem);
+-              if (pSesInfo->status == CifsNeedReconnect) {
++              if (pSesInfo->need_reconnect) {
+                       cFYI(1, ("Session needs reconnect"));
+                       rc = cifs_setup_session(xid, pSesInfo,
+                                               cifs_sb->local_nls);
+@@ -2032,180 +2208,94 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       } else if (!rc) {
+               cFYI(1, ("Existing smb sess not found"));
+               pSesInfo = sesInfoAlloc();
+-              if (pSesInfo == NULL)
++              if (pSesInfo == NULL) {
+                       rc = -ENOMEM;
+-              else {
+-                      pSesInfo->server = srvTcp;
+-                      sprintf(pSesInfo->serverName, "%u.%u.%u.%u",
+-                              NIPQUAD(sin_server.sin_addr.s_addr));
+-              }
++                      goto mount_fail_check;
++              }
++
++              /* new SMB session uses our srvTcp ref */
++              pSesInfo->server = srvTcp;
++              sprintf(pSesInfo->serverName, "%u.%u.%u.%u",
++                      NIPQUAD(sin_server->sin_addr.s_addr));
++
++              write_lock(&cifs_tcp_ses_lock);
++              list_add(&pSesInfo->smb_ses_list, &srvTcp->smb_ses_list);
++              write_unlock(&cifs_tcp_ses_lock);
++
++              /* volume_info.password freed at unmount */
++              if (volume_info.password) {
++                      pSesInfo->password = volume_info.password;
++                      /* set to NULL to prevent freeing on exit */
++                      volume_info.password = NULL;
++              }
++              if (volume_info.username)
++                      strncpy(pSesInfo->userName, volume_info.username,
++                              MAX_USERNAME_SIZE);
++              if (volume_info.domainname) {
++                      int len = strlen(volume_info.domainname);
++                      pSesInfo->domainName = kmalloc(len + 1, GFP_KERNEL);
++                      if (pSesInfo->domainName)
++                              strcpy(pSesInfo->domainName,
++                                      volume_info.domainname);
++              }
++              pSesInfo->linux_uid = volume_info.linux_uid;
++              pSesInfo->overrideSecFlg = volume_info.secFlg;
++              down(&pSesInfo->sesSem);
+-              if (!rc) {
+-                      /* volume_info.password freed at unmount */
+-                      if (volume_info.password) {
+-                              pSesInfo->password = volume_info.password;
+-                              /* set to NULL to prevent freeing on exit */
+-                              volume_info.password = NULL;
+-                      }
+-                      if (volume_info.username)
+-                              strncpy(pSesInfo->userName,
+-                                      volume_info.username,
+-                                      MAX_USERNAME_SIZE);
+-                      if (volume_info.domainname) {
+-                              int len = strlen(volume_info.domainname);
+-                              pSesInfo->domainName =
+-                                      kmalloc(len + 1, GFP_KERNEL);
+-                              if (pSesInfo->domainName)
+-                                      strcpy(pSesInfo->domainName,
+-                                              volume_info.domainname);
+-                      }
+-                      pSesInfo->linux_uid = volume_info.linux_uid;
+-                      pSesInfo->overrideSecFlg = volume_info.secFlg;
+-                      down(&pSesInfo->sesSem);
+-                      /* BB FIXME need to pass vol->secFlgs BB */
+-                      rc = cifs_setup_session(xid, pSesInfo,
+-                                              cifs_sb->local_nls);
+-                      up(&pSesInfo->sesSem);
+-                      if (!rc)
+-                              atomic_inc(&srvTcp->socketUseCount);
+-              }
++              /* BB FIXME need to pass vol->secFlgs BB */
++              rc = cifs_setup_session(xid, pSesInfo,
++                                      cifs_sb->local_nls);
++              up(&pSesInfo->sesSem);
+       }
+       /* search for existing tcon to this server share */
+       if (!rc) {
+-              if (volume_info.rsize > CIFSMaxBufSize) {
+-                      cERROR(1, ("rsize %d too large, using MaxBufSize",
+-                              volume_info.rsize));
+-                      cifs_sb->rsize = CIFSMaxBufSize;
+-              } else if ((volume_info.rsize) &&
+-                              (volume_info.rsize <= CIFSMaxBufSize))
+-                      cifs_sb->rsize = volume_info.rsize;
+-              else /* default */
+-                      cifs_sb->rsize = CIFSMaxBufSize;
+-
+-              if (volume_info.wsize > PAGEVEC_SIZE * PAGE_CACHE_SIZE) {
+-                      cERROR(1, ("wsize %d too large, using 4096 instead",
+-                                volume_info.wsize));
+-                      cifs_sb->wsize = 4096;
+-              } else if (volume_info.wsize)
+-                      cifs_sb->wsize = volume_info.wsize;
+-              else
+-                      cifs_sb->wsize =
+-                              min_t(const int, PAGEVEC_SIZE * PAGE_CACHE_SIZE,
+-                                      127*1024);
+-                      /* old default of CIFSMaxBufSize was too small now
+-                         that SMB Write2 can send multiple pages in kvec.
+-                         RFC1001 does not describe what happens when frame
+-                         bigger than 128K is sent so use that as max in
+-                         conjunction with 52K kvec constraint on arch with 4K
+-                         page size  */
+-
+-              if (cifs_sb->rsize < 2048) {
+-                      cifs_sb->rsize = 2048;
+-                      /* Windows ME may prefer this */
+-                      cFYI(1, ("readsize set to minimum: 2048"));
+-              }
+-              /* calculate prepath */
+-              cifs_sb->prepath = volume_info.prepath;
+-              if (cifs_sb->prepath) {
+-                      cifs_sb->prepathlen = strlen(cifs_sb->prepath);
+-                      /* we can not convert the / to \ in the path
+-                      separators in the prefixpath yet because we do not
+-                      know (until reset_cifs_unix_caps is called later)
+-                      whether POSIX PATH CAP is available. We normalize
+-                      the / to \ after reset_cifs_unix_caps is called */
+-                      volume_info.prepath = NULL;
+-              } else
+-                      cifs_sb->prepathlen = 0;
+-              cifs_sb->mnt_uid = volume_info.linux_uid;
+-              cifs_sb->mnt_gid = volume_info.linux_gid;
+-              cifs_sb->mnt_file_mode = volume_info.file_mode;
+-              cifs_sb->mnt_dir_mode = volume_info.dir_mode;
+-              cFYI(1, ("file mode: 0x%x  dir mode: 0x%x",
+-                      cifs_sb->mnt_file_mode, cifs_sb->mnt_dir_mode));
+-
+-              if (volume_info.noperm)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_PERM;
+-              if (volume_info.setuids)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SET_UID;
+-              if (volume_info.server_ino)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_SERVER_INUM;
+-              if (volume_info.remap)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_MAP_SPECIAL_CHR;
+-              if (volume_info.no_xattr)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_XATTR;
+-              if (volume_info.sfu_emul)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_UNX_EMUL;
+-              if (volume_info.nobrl)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_NO_BRL;
+-              if (volume_info.cifs_acl)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_CIFS_ACL;
+-              if (volume_info.override_uid)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_UID;
+-              if (volume_info.override_gid)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_OVERR_GID;
+-              if (volume_info.dynperm)
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DYNPERM;
+-              if (volume_info.direct_io) {
+-                      cFYI(1, ("mounting share using direct i/o"));
+-                      cifs_sb->mnt_cifs_flags |= CIFS_MOUNT_DIRECT_IO;
+-              }
+-
+-              if ((volume_info.cifs_acl) && (volume_info.dynperm))
+-                      cERROR(1, ("mount option dynperm ignored if cifsacl "
+-                                 "mount option supported"));
+-
+-              tcon =
+-                  find_unc(sin_server.sin_addr.s_addr, volume_info.UNC,
+-                           volume_info.username);
++              setup_cifs_sb(&volume_info, cifs_sb);
++              tcon = cifs_find_tcon(pSesInfo, volume_info.UNC);
+               if (tcon) {
+                       cFYI(1, ("Found match on UNC path"));
+-                      /* we can have only one retry value for a connection
+-                         to a share so for resources mounted more than once
+-                         to the same server share the last value passed in
+-                         for the retry flag is used */
+-                      tcon->retry = volume_info.retry;
+-                      tcon->nocase = volume_info.nocase;
++                      /* existing tcon already has a reference */
++                      cifs_put_smb_ses(pSesInfo);
+                       if (tcon->seal != volume_info.seal)
+                               cERROR(1, ("transport encryption setting "
+                                          "conflicts with existing tid"));
+               } else {
+                       tcon = tconInfoAlloc();
+-                      if (tcon == NULL)
++                      if (tcon == NULL) {
+                               rc = -ENOMEM;
+-                      else {
+-                              /* check for null share name ie connecting to
+-                               * dfs root */
+-
+-                              /* BB check if this works for exactly length
+-                               * three strings */
+-                              if ((strchr(volume_info.UNC + 3, '\\') == NULL)
+-                                  && (strchr(volume_info.UNC + 3, '/') ==
+-                                      NULL)) {
+-/*                                    rc = connect_to_dfs_path(xid, pSesInfo,
+-                                              "", cifs_sb->local_nls,
+-                                              cifs_sb->mnt_cifs_flags &
+-                                                CIFS_MOUNT_MAP_SPECIAL_CHR);*/
+-                                      cFYI(1, ("DFS root not supported"));
+-                                      rc = -ENODEV;
+-                                      goto out;
+-                              } else {
+-                                      /* BB Do we need to wrap sesSem around
+-                                       * this TCon call and Unix SetFS as
+-                                       * we do on SessSetup and reconnect? */
+-                                      rc = CIFSTCon(xid, pSesInfo,
+-                                              volume_info.UNC,
+-                                              tcon, cifs_sb->local_nls);
+-                                      cFYI(1, ("CIFS Tcon rc = %d", rc));
+-                              }
+-                              if (!rc) {
+-                                      atomic_inc(&pSesInfo->inUse);
+-                                      tcon->retry = volume_info.retry;
+-                                      tcon->nocase = volume_info.nocase;
+-                                      tcon->seal = volume_info.seal;
+-                              }
++                              goto mount_fail_check;
++                      }
++                      tcon->ses = pSesInfo;
++
++                      /* check for null share name ie connect to dfs root */
++                      if ((strchr(volume_info.UNC + 3, '\\') == NULL)
++                          && (strchr(volume_info.UNC + 3, '/') == NULL)) {
++                              /* rc = connect_to_dfs_path(...) */
++                              cFYI(1, ("DFS root not supported"));
++                              rc = -ENODEV;
++                              goto mount_fail_check;
++                      } else {
++                              /* BB Do we need to wrap sesSem around
++                               * this TCon call and Unix SetFS as
++                               * we do on SessSetup and reconnect? */
++                              rc = CIFSTCon(xid, pSesInfo, volume_info.UNC,
++                                            tcon, cifs_sb->local_nls);
++                              cFYI(1, ("CIFS Tcon rc = %d", rc));
+                       }
++                      if (rc)
++                              goto mount_fail_check;
++                      tcon->seal = volume_info.seal;
++                      write_lock(&cifs_tcp_ses_lock);
++                      list_add(&tcon->tcon_list, &pSesInfo->tcon_list);
++                      write_unlock(&cifs_tcp_ses_lock);
+               }
++
++              /* we can have only one retry value for a connection
++                 to a share so for resources mounted more than once
++                 to the same server share the last value passed in
++                 for the retry flag is used */
++              tcon->retry = volume_info.retry;
++              tcon->nocase = volume_info.nocase;
+       }
+       if (pSesInfo) {
+               if (pSesInfo->capabilities & CAP_LARGE_FILES) {
+@@ -2217,91 +2307,49 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       /* BB FIXME fix time_gran to be larger for LANMAN sessions */
+       sb->s_time_gran = 100;
+-/* on error free sesinfo and tcon struct if needed */
++      /* on error free sesinfo and tcon struct if needed */
++mount_fail_check:
+       if (rc) {
+-              /* if session setup failed, use count is zero but
+-              we still need to free cifsd thread */
+-              if (atomic_read(&srvTcp->socketUseCount) == 0) {
+-                      spin_lock(&GlobalMid_Lock);
+-                      srvTcp->tcpStatus = CifsExiting;
+-                      spin_unlock(&GlobalMid_Lock);
+-                      if (srvTcp->tsk) {
+-                              /* If we could verify that kthread_stop would
+-                                 always wake up processes blocked in
+-                                 tcp in recv_mesg then we could remove the
+-                                 send_sig call */
+-                              force_sig(SIGKILL, srvTcp->tsk);
+-                              kthread_stop(srvTcp->tsk);
+-                      }
+-              }
+                /* If find_unc succeeded then rc == 0 so we can not end */
+-              if (tcon)  /* up accidently freeing someone elses tcon struct */
+-                      tconInfoFree(tcon);
+-              if (existingCifsSes == NULL) {
+-                      if (pSesInfo) {
+-                              if ((pSesInfo->server) &&
+-                                  (pSesInfo->status == CifsGood)) {
+-                                      int temp_rc;
+-                                      temp_rc = CIFSSMBLogoff(xid, pSesInfo);
+-                                      /* if the socketUseCount is now zero */
+-                                      if ((temp_rc == -ESHUTDOWN) &&
+-                                          (pSesInfo->server) &&
+-                                          (pSesInfo->server->tsk)) {
+-                                              force_sig(SIGKILL,
+-                                                      pSesInfo->server->tsk);
+-                                              kthread_stop(pSesInfo->server->tsk);
+-                                      }
+-                              } else {
+-                                      cFYI(1, ("No session or bad tcon"));
+-                                      if ((pSesInfo->server) &&
+-                                          (pSesInfo->server->tsk)) {
+-                                              force_sig(SIGKILL,
+-                                                      pSesInfo->server->tsk);
+-                                              kthread_stop(pSesInfo->server->tsk);
+-                                      }
+-                              }
+-                              sesInfoFree(pSesInfo);
+-                              /* pSesInfo = NULL; */
+-                      }
+-              }
+-      } else {
+-              atomic_inc(&tcon->useCount);
+-              cifs_sb->tcon = tcon;
+-              tcon->ses = pSesInfo;
+-
+-              /* do not care if following two calls succeed - informational */
+-              if (!tcon->ipc) {
+-                      CIFSSMBQFSDeviceInfo(xid, tcon);
+-                      CIFSSMBQFSAttributeInfo(xid, tcon);
+-              }
+-
+-              /* tell server which Unix caps we support */
+-              if (tcon->ses->capabilities & CAP_UNIX)
+-                      /* reset of caps checks mount to see if unix extensions
+-                         disabled for just this mount */
+-                      reset_cifs_unix_caps(xid, tcon, sb, &volume_info);
++              /* up accidently freeing someone elses tcon struct */
++              if (tcon)
++                      cifs_put_tcon(tcon);
++              else if (pSesInfo)
++                      cifs_put_smb_ses(pSesInfo);
+               else
+-                      tcon->unix_ext = 0; /* server does not support them */
++                      cifs_put_tcp_session(srvTcp);
++              goto out;
++      }
++      cifs_sb->tcon = tcon;
+-              /* convert forward to back slashes in prepath here if needed */
+-              if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
+-                      convert_delimiter(cifs_sb->prepath,
+-                                        CIFS_DIR_SEP(cifs_sb));
++      /* do not care if following two calls succeed - informational */
++      if (!tcon->ipc) {
++              CIFSSMBQFSDeviceInfo(xid, tcon);
++              CIFSSMBQFSAttributeInfo(xid, tcon);
++      }
+-              if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
+-                      cifs_sb->rsize = 1024 * 127;
+-                      cFYI(DBG2,
+-                              ("no very large read support, rsize now 127K"));
+-              }
+-              if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
+-                      cifs_sb->wsize = min(cifs_sb->wsize,
+-                                           (tcon->ses->server->maxBuf -
+-                                            MAX_CIFS_HDR_SIZE));
+-              if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
+-                      cifs_sb->rsize = min(cifs_sb->rsize,
+-                                           (tcon->ses->server->maxBuf -
+-                                            MAX_CIFS_HDR_SIZE));
++      /* tell server which Unix caps we support */
++      if (tcon->ses->capabilities & CAP_UNIX)
++              /* reset of caps checks mount to see if unix extensions
++                 disabled for just this mount */
++              reset_cifs_unix_caps(xid, tcon, sb, &volume_info);
++      else
++              tcon->unix_ext = 0; /* server does not support them */
++
++      /* convert forward to back slashes in prepath here if needed */
++      if ((cifs_sb->mnt_cifs_flags & CIFS_MOUNT_POSIX_PATHS) == 0)
++              convert_delimiter(cifs_sb->prepath, CIFS_DIR_SEP(cifs_sb));
++
++      if ((tcon->unix_ext == 0) && (cifs_sb->rsize > (1024 * 127))) {
++              cifs_sb->rsize = 1024 * 127;
++              cFYI(DBG2, ("no very large read support, rsize now 127K"));
+       }
++      if (!(tcon->ses->capabilities & CAP_LARGE_WRITE_X))
++              cifs_sb->wsize = min(cifs_sb->wsize,
++                             (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
++      if (!(tcon->ses->capabilities & CAP_LARGE_READ_X))
++              cifs_sb->rsize = min(cifs_sb->rsize,
++                             (tcon->ses->server->maxBuf - MAX_CIFS_HDR_SIZE));
+       /* volume_info.password is freed above when existing session found
+       (in which case it is not needed anymore) but when new sesion is created
+@@ -3471,6 +3519,7 @@ CIFSTCon(unsigned int xid, struct cifsSesInfo *ses,
+       /* above now done in SendReceive */
+       if ((rc == 0) && (tcon != NULL)) {
+               tcon->tidStatus = CifsGood;
++              tcon->need_reconnect = false;
+               tcon->tid = smb_buffer_response->Tid;
+               bcc_ptr = pByteArea(smb_buffer_response);
+               length = strnlen(bcc_ptr, BCC(smb_buffer_response) - 2);
+@@ -3542,52 +3591,17 @@ int
+ cifs_umount(struct super_block *sb, struct cifs_sb_info *cifs_sb)
+ {
+       int rc = 0;
+-      int xid;
+-      struct cifsSesInfo *ses = NULL;
+-      struct task_struct *cifsd_task;
+       char *tmp;
+-      xid = GetXid();
+-
+-      if (cifs_sb->tcon) {
+-              ses = cifs_sb->tcon->ses; /* save ptr to ses before delete tcon!*/
+-              rc = CIFSSMBTDis(xid, cifs_sb->tcon);
+-              if (rc == -EBUSY) {
+-                      FreeXid(xid);
+-                      return 0;
+-              }
+-              DeleteTconOplockQEntries(cifs_sb->tcon);
+-              tconInfoFree(cifs_sb->tcon);
+-              if ((ses) && (ses->server)) {
+-                      /* save off task so we do not refer to ses later */
+-                      cifsd_task = ses->server->tsk;
+-                      cFYI(1, ("About to do SMBLogoff "));
+-                      rc = CIFSSMBLogoff(xid, ses);
+-                      if (rc == -EBUSY) {
+-                              FreeXid(xid);
+-                              return 0;
+-                      } else if (rc == -ESHUTDOWN) {
+-                              cFYI(1, ("Waking up socket by sending signal"));
+-                              if (cifsd_task) {
+-                                      force_sig(SIGKILL, cifsd_task);
+-                                      kthread_stop(cifsd_task);
+-                              }
+-                              rc = 0;
+-                      } /* else - we have an smb session
+-                              left on this socket do not kill cifsd */
+-              } else
+-                      cFYI(1, ("No session or bad tcon"));
+-      }
++      if (cifs_sb->tcon)
++              cifs_put_tcon(cifs_sb->tcon);
+       cifs_sb->tcon = NULL;
+       tmp = cifs_sb->prepath;
+       cifs_sb->prepathlen = 0;
+       cifs_sb->prepath = NULL;
+       kfree(tmp);
+-      if (ses)
+-              sesInfoFree(ses);
+-      FreeXid(xid);
+       return rc;
+ }
+@@ -3702,6 +3716,7 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
+       } else {
+               cFYI(1, ("CIFS Session Established successfully"));
+                       pSesInfo->status = CifsGood;
++                      pSesInfo->need_reconnect = false;
+       }
+ ss_err_exit:
+diff --git a/fs/cifs/file.c b/fs/cifs/file.c
+index cbefe1f..042b122 100644
+--- a/fs/cifs/file.c
++++ b/fs/cifs/file.c
+@@ -493,7 +493,7 @@ int cifs_close(struct inode *inode, struct file *file)
+               if (pTcon) {
+                       /* no sense reconnecting to close a file that is
+                          already closed */
+-                      if (pTcon->tidStatus != CifsNeedReconnect) {
++                      if (!pTcon->need_reconnect) {
+                               timeout = 2;
+                               while ((atomic_read(&pSMBFile->wrtPending) != 0)
+                                       && (timeout <= 2048)) {
+@@ -1396,7 +1396,10 @@ retry:
+                       if ((wbc->nr_to_write -= n_iov) <= 0)
+                               done = 1;
+                       index = next;
+-              }
++              } else
++                      /* Need to re-find the pages we skipped */
++                      index = pvec.pages[0]->index + 1;
++
+               pagevec_release(&pvec);
+       }
+       if (!scanned && !done) {
+@@ -1813,7 +1816,7 @@ static int cifs_readpages(struct file *file, struct address_space *mapping,
+       pTcon = cifs_sb->tcon;
+       pagevec_init(&lru_pvec, 0);
+-              cFYI(DBG2, ("rpages: num pages %d", num_pages));
++      cFYI(DBG2, ("rpages: num pages %d", num_pages));
+       for (i = 0; i < num_pages; ) {
+               unsigned contig_pages;
+               struct page *tmp_page;
+diff --git a/fs/cifs/misc.c b/fs/cifs/misc.c
+index 4b17f8f..b891553 100644
+--- a/fs/cifs/misc.c
++++ b/fs/cifs/misc.c
+@@ -75,12 +75,12 @@ sesInfoAlloc(void)
+       ret_buf = kzalloc(sizeof(struct cifsSesInfo), GFP_KERNEL);
+       if (ret_buf) {
+-              write_lock(&GlobalSMBSeslock);
+               atomic_inc(&sesInfoAllocCount);
+               ret_buf->status = CifsNew;
+-              list_add(&ret_buf->cifsSessionList, &GlobalSMBSessionList);
++              ++ret_buf->ses_count;
++              INIT_LIST_HEAD(&ret_buf->smb_ses_list);
++              INIT_LIST_HEAD(&ret_buf->tcon_list);
+               init_MUTEX(&ret_buf->sesSem);
+-              write_unlock(&GlobalSMBSeslock);
+       }
+       return ret_buf;
+ }
+@@ -93,10 +93,7 @@ sesInfoFree(struct cifsSesInfo *buf_to_free)
+               return;
+       }
+-      write_lock(&GlobalSMBSeslock);
+       atomic_dec(&sesInfoAllocCount);
+-      list_del(&buf_to_free->cifsSessionList);
+-      write_unlock(&GlobalSMBSeslock);
+       kfree(buf_to_free->serverOS);
+       kfree(buf_to_free->serverDomain);
+       kfree(buf_to_free->serverNOS);
+@@ -111,17 +108,14 @@ tconInfoAlloc(void)
+       struct cifsTconInfo *ret_buf;
+       ret_buf = kzalloc(sizeof(struct cifsTconInfo), GFP_KERNEL);
+       if (ret_buf) {
+-              write_lock(&GlobalSMBSeslock);
+               atomic_inc(&tconInfoAllocCount);
+-              list_add(&ret_buf->cifsConnectionList,
+-                       &GlobalTreeConnectionList);
+               ret_buf->tidStatus = CifsNew;
++              ++ret_buf->tc_count;
+               INIT_LIST_HEAD(&ret_buf->openFileList);
+-              init_MUTEX(&ret_buf->tconSem);
++              INIT_LIST_HEAD(&ret_buf->tcon_list);
+ #ifdef CONFIG_CIFS_STATS
+               spin_lock_init(&ret_buf->stat_lock);
+ #endif
+-              write_unlock(&GlobalSMBSeslock);
+       }
+       return ret_buf;
+ }
+@@ -133,10 +127,7 @@ tconInfoFree(struct cifsTconInfo *buf_to_free)
+               cFYI(1, ("Null buffer passed to tconInfoFree"));
+               return;
+       }
+-      write_lock(&GlobalSMBSeslock);
+       atomic_dec(&tconInfoAllocCount);
+-      list_del(&buf_to_free->cifsConnectionList);
+-      write_unlock(&GlobalSMBSeslock);
+       kfree(buf_to_free->nativeFileSystem);
+       kfree(buf_to_free);
+ }
+@@ -354,9 +345,9 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
+                               if (current->fsuid != treeCon->ses->linux_uid) {
+                                       cFYI(1, ("Multiuser mode and UID "
+                                                "did not match tcon uid"));
+-                                      read_lock(&GlobalSMBSeslock);
+-                                      list_for_each(temp_item, &GlobalSMBSessionList) {
+-                                              ses = list_entry(temp_item, struct cifsSesInfo, cifsSessionList);
++                                      read_lock(&cifs_tcp_ses_lock);
++                                      list_for_each(temp_item, &treeCon->ses->server->smb_ses_list) {
++                                              ses = list_entry(temp_item, struct cifsSesInfo, smb_ses_list);
+                                               if (ses->linux_uid == current->fsuid) {
+                                                       if (ses->server == treeCon->ses->server) {
+                                                               cFYI(1, ("found matching uid substitute right smb_uid"));
+@@ -368,7 +359,7 @@ header_assemble(struct smb_hdr *buffer, char smb_command /* command */ ,
+                                                       }
+                                               }
+                                       }
+-                                      read_unlock(&GlobalSMBSeslock);
++                                      read_unlock(&cifs_tcp_ses_lock);
+                               }
+                       }
+               }
+@@ -501,9 +492,10 @@ bool
+ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
+ {
+       struct smb_com_lock_req *pSMB = (struct smb_com_lock_req *)buf;
+-      struct list_head *tmp;
+-      struct list_head *tmp1;
++      struct list_head *tmp, *tmp1, *tmp2;
++      struct cifsSesInfo *ses;
+       struct cifsTconInfo *tcon;
++      struct cifsInodeInfo *pCifsInode;
+       struct cifsFileInfo *netfile;
+       cFYI(1, ("Checking for oplock break or dnotify response"));
+@@ -558,42 +550,42 @@ is_valid_oplock_break(struct smb_hdr *buf, struct TCP_Server_Info *srv)
+               return false;
+       /* look up tcon based on tid & uid */
+-      read_lock(&GlobalSMBSeslock);
+-      list_for_each(tmp, &GlobalTreeConnectionList) {
+-              tcon = list_entry(tmp, struct cifsTconInfo, cifsConnectionList);
+-              if ((tcon->tid == buf->Tid) && (srv == tcon->ses->server)) {
++      read_lock(&cifs_tcp_ses_lock);
++      list_for_each(tmp, &srv->smb_ses_list) {
++              ses = list_entry(tmp, struct cifsSesInfo, smb_ses_list);
++              list_for_each(tmp1, &ses->tcon_list) {
++                      tcon = list_entry(tmp1, struct cifsTconInfo, tcon_list);
++                      if (tcon->tid != buf->Tid)
++                              continue;
++
+                       cifs_stats_inc(&tcon->num_oplock_brks);
+-                      list_for_each(tmp1, &tcon->openFileList) {
+-                              netfile = list_entry(tmp1, struct cifsFileInfo,
++                      list_for_each(tmp2, &tcon->openFileList) {
++                              netfile = list_entry(tmp2, struct cifsFileInfo,
+                                                    tlist);
+-                              if (pSMB->Fid == netfile->netfid) {
+-                                      struct cifsInodeInfo *pCifsInode;
+-                                      read_unlock(&GlobalSMBSeslock);
+-                                      cFYI(1,
+-                                          ("file id match, oplock break"));
+-                                      pCifsInode =
+-                                              CIFS_I(netfile->pInode);
+-                                      pCifsInode->clientCanCacheAll = false;
+-                                      if (pSMB->OplockLevel == 0)
+-                                              pCifsInode->clientCanCacheRead
+-                                                      = false;
+-                                      pCifsInode->oplockPending = true;
+-                                      AllocOplockQEntry(netfile->pInode,
+-                                                        netfile->netfid,
+-                                                        tcon);
+-                                      cFYI(1,
+-                                          ("about to wake up oplock thread"));
+-                                      if (oplockThread)
+-                                          wake_up_process(oplockThread);
+-                                      return true;
+-                              }
++                              if (pSMB->Fid != netfile->netfid)
++                                      continue;
++
++                              read_unlock(&cifs_tcp_ses_lock);
++                              cFYI(1, ("file id match, oplock break"));
++                              pCifsInode = CIFS_I(netfile->pInode);
++                              pCifsInode->clientCanCacheAll = false;
++                              if (pSMB->OplockLevel == 0)
++                                      pCifsInode->clientCanCacheRead = false;
++                              pCifsInode->oplockPending = true;
++                              AllocOplockQEntry(netfile->pInode,
++                                                netfile->netfid, tcon);
++                              cFYI(1, ("about to wake up oplock thread"));
++                              if (oplockThread)
++                                      wake_up_process(oplockThread);
++
++                              return true;
+                       }
+-                      read_unlock(&GlobalSMBSeslock);
++                      read_unlock(&cifs_tcp_ses_lock);
+                       cFYI(1, ("No matching file for oplock break"));
+                       return true;
+               }
+       }
+-      read_unlock(&GlobalSMBSeslock);
++      read_unlock(&cifs_tcp_ses_lock);
+       cFYI(1, ("Can not process oplock break for non-existent connection"));
+       return true;
+ }
+diff --git a/fs/cifs/transport.c b/fs/cifs/transport.c
+index e286db9..bb0f329 100644
+--- a/fs/cifs/transport.c
++++ b/fs/cifs/transport.c
+@@ -162,7 +162,7 @@ void DeleteTconOplockQEntries(struct cifsTconInfo *tcon)
+ int
+ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
+-       unsigned int smb_buf_length, struct sockaddr *sin)
++       unsigned int smb_buf_length, struct sockaddr *sin, bool noblocksnd)
+ {
+       int rc = 0;
+       int i = 0;
+@@ -179,7 +179,10 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
+       smb_msg.msg_namelen = sizeof(struct sockaddr);
+       smb_msg.msg_control = NULL;
+       smb_msg.msg_controllen = 0;
+-      smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; /* BB add more flags?*/
++      if (noblocksnd)
++              smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
++      else
++              smb_msg.msg_flags = MSG_NOSIGNAL;
+       /* smb header is converted in header_assemble. bcc and rest of SMB word
+          area, and byte area if necessary, is converted to littleendian in
+@@ -230,8 +233,8 @@ smb_send(struct socket *ssocket, struct smb_hdr *smb_buffer,
+ }
+ static int
+-smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
+-        struct sockaddr *sin)
++smb_send2(struct TCP_Server_Info *server, struct kvec *iov, int n_vec,
++        struct sockaddr *sin, bool noblocksnd)
+ {
+       int rc = 0;
+       int i = 0;
+@@ -241,6 +244,7 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
+       unsigned int total_len;
+       int first_vec = 0;
+       unsigned int smb_buf_length = smb_buffer->smb_buf_length;
++      struct socket *ssocket = server->ssocket;
+       if (ssocket == NULL)
+               return -ENOTSOCK; /* BB eventually add reconnect code here */
+@@ -249,7 +253,10 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
+       smb_msg.msg_namelen = sizeof(struct sockaddr);
+       smb_msg.msg_control = NULL;
+       smb_msg.msg_controllen = 0;
+-      smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL; /* BB add more flags?*/
++      if (noblocksnd)
++              smb_msg.msg_flags = MSG_DONTWAIT + MSG_NOSIGNAL;
++      else
++              smb_msg.msg_flags = MSG_NOSIGNAL;
+       /* smb header is converted in header_assemble. bcc and rest of SMB word
+          area, and byte area if necessary, is converted to littleendian in
+@@ -284,8 +291,11 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
+               if (rc < 0)
+                       break;
+-              if (rc >= total_len) {
+-                      WARN_ON(rc > total_len);
++              if (rc == total_len) {
++                      total_len = 0;
++                      break;
++              } else if (rc > total_len) {
++                      cERROR(1, ("sent %d requested %d", rc, total_len));
+                       break;
+               }
+               if (rc == 0) {
+@@ -313,6 +323,16 @@ smb_send2(struct socket *ssocket, struct kvec *iov, int n_vec,
+               i = 0; /* in case we get ENOSPC on the next send */
+       }
++      if ((total_len > 0) && (total_len != smb_buf_length + 4)) {
++              cFYI(1, ("partial send (%d remaining), terminating session",
++                              total_len));
++              /* If we have only sent part of an SMB then the next SMB
++                 could be taken as the remainder of this one.  We need
++                 to kill the socket so the server throws away the partial
++                 SMB */
++              server->tcpStatus = CifsNeedReconnect;
++      }
++
+       if (rc < 0) {
+               cERROR(1, ("Error %d sending data on socket to server", rc));
+       } else
+@@ -519,8 +539,9 @@ SendReceive2(const unsigned int xid, struct cifsSesInfo *ses,
+ #ifdef CONFIG_CIFS_STATS2
+       atomic_inc(&ses->server->inSend);
+ #endif
+-      rc = smb_send2(ses->server->ssocket, iov, n_vec,
+-                    (struct sockaddr *) &(ses->server->addr.sockAddr));
++      rc = smb_send2(ses->server, iov, n_vec,
++                      (struct sockaddr *) &(ses->server->addr.sockAddr),
++                      ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+       atomic_dec(&ses->server->inSend);
+       midQ->when_sent = jiffies;
+@@ -712,7 +733,8 @@ SendReceive(const unsigned int xid, struct cifsSesInfo *ses,
+       atomic_inc(&ses->server->inSend);
+ #endif
+       rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
+-                    (struct sockaddr *) &(ses->server->addr.sockAddr));
++                      (struct sockaddr *) &(ses->server->addr.sockAddr),
++                      ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+       atomic_dec(&ses->server->inSend);
+       midQ->when_sent = jiffies;
+@@ -852,7 +874,8 @@ send_nt_cancel(struct cifsTconInfo *tcon, struct smb_hdr *in_buf,
+               return rc;
+       }
+       rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
+-            (struct sockaddr *) &(ses->server->addr.sockAddr));
++              (struct sockaddr *) &(ses->server->addr.sockAddr),
++              ses->server->noblocksnd);
+       up(&ses->server->tcpSem);
+       return rc;
+ }
+@@ -942,7 +965,8 @@ SendReceiveBlockingLock(const unsigned int xid, struct cifsTconInfo *tcon,
+       atomic_inc(&ses->server->inSend);
+ #endif
+       rc = smb_send(ses->server->ssocket, in_buf, in_buf->smb_buf_length,
+-                    (struct sockaddr *) &(ses->server->addr.sockAddr));
++                      (struct sockaddr *) &(ses->server->addr.sockAddr),
++                      ses->server->noblocksnd);
+ #ifdef CONFIG_CIFS_STATS2
+       atomic_dec(&ses->server->inSend);
+       midQ->when_sent = jiffies;
+diff --git a/fs/ecryptfs/keystore.c b/fs/ecryptfs/keystore.c
+index f5b76a3..59b9833 100644
+--- a/fs/ecryptfs/keystore.c
++++ b/fs/ecryptfs/keystore.c
+@@ -1037,17 +1037,14 @@ static int
+ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
+                                        struct ecryptfs_crypt_stat *crypt_stat)
+ {
+-      struct scatterlist dst_sg;
+-      struct scatterlist src_sg;
++      struct scatterlist dst_sg[2];
++      struct scatterlist src_sg[2];
+       struct mutex *tfm_mutex;
+       struct blkcipher_desc desc = {
+               .flags = CRYPTO_TFM_REQ_MAY_SLEEP
+       };
+       int rc = 0;
+-      sg_init_table(&dst_sg, 1);
+-      sg_init_table(&src_sg, 1);
+-
+       if (unlikely(ecryptfs_verbosity > 0)) {
+               ecryptfs_printk(
+                       KERN_DEBUG, "Session key encryption key (size [%d]):\n",
+@@ -1066,8 +1063,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
+       }
+       rc = virt_to_scatterlist(auth_tok->session_key.encrypted_key,
+                                auth_tok->session_key.encrypted_key_size,
+-                               &src_sg, 1);
+-      if (rc != 1) {
++                               src_sg, 2);
++      if (rc < 1 || rc > 2) {
+               printk(KERN_ERR "Internal error whilst attempting to convert "
+                       "auth_tok->session_key.encrypted_key to scatterlist; "
+                       "expected rc = 1; got rc = [%d]. "
+@@ -1079,8 +1076,8 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
+               auth_tok->session_key.encrypted_key_size;
+       rc = virt_to_scatterlist(auth_tok->session_key.decrypted_key,
+                                auth_tok->session_key.decrypted_key_size,
+-                               &dst_sg, 1);
+-      if (rc != 1) {
++                               dst_sg, 2);
++      if (rc < 1 || rc > 2) {
+               printk(KERN_ERR "Internal error whilst attempting to convert "
+                       "auth_tok->session_key.decrypted_key to scatterlist; "
+                       "expected rc = 1; got rc = [%d]\n", rc);
+@@ -1096,7 +1093,7 @@ decrypt_passphrase_encrypted_session_key(struct ecryptfs_auth_tok *auth_tok,
+               rc = -EINVAL;
+               goto out;
+       }
+-      rc = crypto_blkcipher_decrypt(&desc, &dst_sg, &src_sg,
++      rc = crypto_blkcipher_decrypt(&desc, dst_sg, src_sg,
+                                     auth_tok->session_key.encrypted_key_size);
+       mutex_unlock(tfm_mutex);
+       if (unlikely(rc)) {
+@@ -1541,8 +1538,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
+       size_t i;
+       size_t encrypted_session_key_valid = 0;
+       char session_key_encryption_key[ECRYPTFS_MAX_KEY_BYTES];
+-      struct scatterlist dst_sg;
+-      struct scatterlist src_sg;
++      struct scatterlist dst_sg[2];
++      struct scatterlist src_sg[2];
+       struct mutex *tfm_mutex = NULL;
+       u8 cipher_code;
+       size_t packet_size_length;
+@@ -1621,8 +1618,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
+               ecryptfs_dump_hex(session_key_encryption_key, 16);
+       }
+       rc = virt_to_scatterlist(crypt_stat->key, key_rec->enc_key_size,
+-                               &src_sg, 1);
+-      if (rc != 1) {
++                               src_sg, 2);
++      if (rc < 1 || rc > 2) {
+               ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
+                               "for crypt_stat session key; expected rc = 1; "
+                               "got rc = [%d]. key_rec->enc_key_size = [%d]\n",
+@@ -1631,8 +1628,8 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
+               goto out;
+       }
+       rc = virt_to_scatterlist(key_rec->enc_key, key_rec->enc_key_size,
+-                               &dst_sg, 1);
+-      if (rc != 1) {
++                               dst_sg, 2);
++      if (rc < 1 || rc > 2) {
+               ecryptfs_printk(KERN_ERR, "Error generating scatterlist "
+                               "for crypt_stat encrypted session key; "
+                               "expected rc = 1; got rc = [%d]. "
+@@ -1653,7 +1650,7 @@ write_tag_3_packet(char *dest, size_t *remaining_bytes,
+       rc = 0;
+       ecryptfs_printk(KERN_DEBUG, "Encrypting [%d] bytes of the key\n",
+                       crypt_stat->key_size);
+-      rc = crypto_blkcipher_encrypt(&desc, &dst_sg, &src_sg,
++      rc = crypto_blkcipher_encrypt(&desc, dst_sg, src_sg,
+                                     (*key_rec).enc_key_size);
+       mutex_unlock(tfm_mutex);
+       if (rc) {
+diff --git a/fs/eventpoll.c b/fs/eventpoll.c
+index 7cc0eb7..c8cec49 100644
+--- a/fs/eventpoll.c
++++ b/fs/eventpoll.c
+@@ -102,6 +102,8 @@
+ #define EP_UNACTIVE_PTR ((void *) -1L)
++#define EP_ITEM_COST (sizeof(struct epitem) + sizeof(struct eppoll_entry))
++
+ struct epoll_filefd {
+       struct file *file;
+       int fd;
+@@ -200,6 +202,9 @@ struct eventpoll {
+        * holding ->lock.
+        */
+       struct epitem *ovflist;
++
++      /* The user that created the eventpoll descriptor */
++      struct user_struct *user;
+ };
+ /* Wait structure used by the poll hooks */
+@@ -227,9 +232,17 @@ struct ep_pqueue {
+ };
+ /*
++ * Configuration options available inside /proc/sys/fs/epoll/
++ */
++/* Maximum number of epoll devices, per user */
++static int max_user_instances __read_mostly;
++/* Maximum number of epoll watched descriptors, per user */
++static int max_user_watches __read_mostly;
++
++/*
+  * This mutex is used to serialize ep_free() and eventpoll_release_file().
+  */
+-static struct mutex epmutex;
++static DEFINE_MUTEX(epmutex);
+ /* Safe wake up implementation */
+ static struct poll_safewake psw;
+@@ -240,6 +253,33 @@ static struct kmem_cache *epi_cache __read_mostly;
+ /* Slab cache used to allocate "struct eppoll_entry" */
+ static struct kmem_cache *pwq_cache __read_mostly;
++#ifdef CONFIG_SYSCTL
++
++#include <linux/sysctl.h>
++
++static int zero;
++
++ctl_table epoll_table[] = {
++      {
++              .procname       = "max_user_instances",
++              .data           = &max_user_instances,
++              .maxlen         = sizeof(int),
++              .mode           = 0644,
++              .proc_handler   = &proc_dointvec_minmax,
++              .extra1         = &zero,
++      },
++      {
++              .procname       = "max_user_watches",
++              .data           = &max_user_watches,
++              .maxlen         = sizeof(int),
++              .mode           = 0644,
++              .proc_handler   = &proc_dointvec_minmax,
++              .extra1         = &zero,
++      },
++      { .ctl_name = 0 }
++};
++#endif /* CONFIG_SYSCTL */
++
+ /* Setup the structure that is used as key for the RB tree */
+ static inline void ep_set_ffd(struct epoll_filefd *ffd,
+@@ -402,6 +442,8 @@ static int ep_remove(struct eventpoll *ep, struct epitem *epi)
+       /* At this point it is safe to free the eventpoll item */
+       kmem_cache_free(epi_cache, epi);
++      atomic_dec(&ep->user->epoll_watches);
++
+       DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_remove(%p, %p)\n",
+                    current, ep, file));
+@@ -449,6 +491,8 @@ static void ep_free(struct eventpoll *ep)
+       mutex_unlock(&epmutex);
+       mutex_destroy(&ep->mtx);
++      atomic_dec(&ep->user->epoll_devs);
++      free_uid(ep->user);
+       kfree(ep);
+ }
+@@ -532,10 +576,19 @@ void eventpoll_release_file(struct file *file)
+ static int ep_alloc(struct eventpoll **pep)
+ {
+-      struct eventpoll *ep = kzalloc(sizeof(*ep), GFP_KERNEL);
++      int error;
++      struct user_struct *user;
++      struct eventpoll *ep;
+-      if (!ep)
+-              return -ENOMEM;
++      user = get_current_user();
++      error = -EMFILE;
++      if (unlikely(atomic_read(&user->epoll_devs) >=
++                      max_user_instances))
++              goto free_uid;
++      error = -ENOMEM;
++      ep = kzalloc(sizeof(*ep), GFP_KERNEL);
++      if (unlikely(!ep))
++              goto free_uid;
+       spin_lock_init(&ep->lock);
+       mutex_init(&ep->mtx);
+@@ -544,12 +597,17 @@ static int ep_alloc(struct eventpoll **pep)
+       INIT_LIST_HEAD(&ep->rdllist);
+       ep->rbr = RB_ROOT;
+       ep->ovflist = EP_UNACTIVE_PTR;
++      ep->user = user;
+       *pep = ep;
+       DNPRINTK(3, (KERN_INFO "[%p] eventpoll: ep_alloc() ep=%p\n",
+                    current, ep));
+       return 0;
++
++free_uid:
++      free_uid(user);
++      return error;
+ }
+ /*
+@@ -703,9 +761,11 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event,
+       struct epitem *epi;
+       struct ep_pqueue epq;
+-      error = -ENOMEM;
++      if (unlikely(atomic_read(&ep->user->epoll_watches) >=
++                   max_user_watches))
++              return -ENOSPC;
+       if (!(epi = kmem_cache_alloc(epi_cache, GFP_KERNEL)))
+-              goto error_return;
++              return -ENOMEM;
+       /* Item initialization follow here ... */
+       INIT_LIST_HEAD(&epi->rdllink);
+@@ -735,6 +795,7 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event,
+        * install process. Namely an allocation for a wait queue failed due
+        * high memory pressure.
+        */
++      error = -ENOMEM;
+       if (epi->nwait < 0)
+               goto error_unregister;
+@@ -765,6 +826,8 @@ static int ep_insert(struct eventpoll *ep, struct epoll_event *event,
+       spin_unlock_irqrestore(&ep->lock, flags);
++      atomic_inc(&ep->user->epoll_watches);
++
+       /* We have to call this outside the lock */
+       if (pwake)
+               ep_poll_safewake(&psw, &ep->poll_wait);
+@@ -789,7 +852,7 @@ error_unregister:
+       spin_unlock_irqrestore(&ep->lock, flags);
+       kmem_cache_free(epi_cache, epi);
+-error_return:
++
+       return error;
+ }
+@@ -1074,6 +1137,7 @@ asmlinkage long sys_epoll_create1(int flags)
+                             flags & O_CLOEXEC);
+       if (fd < 0)
+               ep_free(ep);
++      atomic_inc(&ep->user->epoll_devs);
+ error_return:
+       DNPRINTK(3, (KERN_INFO "[%p] eventpoll: sys_epoll_create(%d) = %d\n",
+@@ -1295,7 +1359,12 @@ asmlinkage long sys_epoll_pwait(int epfd, struct epoll_event __user *events,
+ static int __init eventpoll_init(void)
+ {
+-      mutex_init(&epmutex);
++      struct sysinfo si;
++
++      si_meminfo(&si);
++      max_user_instances = 128;
++      max_user_watches = (((si.totalram - si.totalhigh) / 32) << PAGE_SHIFT) /
++              EP_ITEM_COST;
+       /* Initialize the structure used to perform safe poll wait head wake ups */
+       ep_poll_safewake_init(&psw);
+diff --git a/fs/ext2/balloc.c b/fs/ext2/balloc.c
+index 10bb02c..6dac7ba 100644
+--- a/fs/ext2/balloc.c
++++ b/fs/ext2/balloc.c
+@@ -1295,6 +1295,7 @@ retry_alloc:
+        * turn off reservation for this allocation
+        */
+       if (my_rsv && (free_blocks < windowsz)
++              && (free_blocks > 0)
+               && (rsv_is_empty(&my_rsv->rsv_window)))
+               my_rsv = NULL;
+@@ -1332,7 +1333,7 @@ retry_alloc:
+                * free blocks is less than half of the reservation
+                * window size.
+                */
+-              if (free_blocks <= (windowsz/2))
++              if (my_rsv && (free_blocks <= (windowsz/2)))
+                       continue;
+               brelse(bitmap_bh);
+diff --git a/fs/ext3/balloc.c b/fs/ext3/balloc.c
+index 92fd033..f5b57a2 100644
+--- a/fs/ext3/balloc.c
++++ b/fs/ext3/balloc.c
+@@ -1547,6 +1547,7 @@ retry_alloc:
+        * turn off reservation for this allocation
+        */
+       if (my_rsv && (free_blocks < windowsz)
++              && (free_blocks > 0)
+               && (rsv_is_empty(&my_rsv->rsv_window)))
+               my_rsv = NULL;
+@@ -1585,7 +1586,7 @@ retry_alloc:
+                * free blocks is less than half of the reservation
+                * window size.
+                */
+-              if (free_blocks <= (windowsz/2))
++              if (my_rsv && (free_blocks <= (windowsz/2)))
+                       continue;
+               brelse(bitmap_bh);
+diff --git a/fs/ext3/dir.c b/fs/ext3/dir.c
+index 1b80f1c..5853f44 100644
+--- a/fs/ext3/dir.c
++++ b/fs/ext3/dir.c
+@@ -414,7 +414,7 @@ static int call_filldir(struct file * filp, void * dirent,
+                               get_dtype(sb, fname->file_type));
+               if (error) {
+                       filp->f_pos = curr_pos;
+-                      info->extra_fname = fname->next;
++                      info->extra_fname = fname;
+                       return error;
+               }
+               fname = fname->next;
+@@ -453,11 +453,12 @@ static int ext3_dx_readdir(struct file * filp,
+        * If there are any leftover names on the hash collision
+        * chain, return them first.
+        */
+-      if (info->extra_fname &&
+-          call_filldir(filp, dirent, filldir, info->extra_fname))
+-              goto finished;
+-
+-      if (!info->curr_node)
++      if (info->extra_fname) {
++              if (call_filldir(filp, dirent, filldir, info->extra_fname))
++                      goto finished;
++              info->extra_fname = NULL;
++              goto next_node;
++      } else if (!info->curr_node)
+               info->curr_node = rb_first(&info->root);
+       while (1) {
+@@ -488,9 +489,14 @@ static int ext3_dx_readdir(struct file * filp,
+               info->curr_minor_hash = fname->minor_hash;
+               if (call_filldir(filp, dirent, filldir, fname))
+                       break;
+-
++      next_node:
+               info->curr_node = rb_next(info->curr_node);
+-              if (!info->curr_node) {
++              if (info->curr_node) {
++                      fname = rb_entry(info->curr_node, struct fname,
++                                       rb_hash);
++                      info->curr_hash = fname->hash;
++                      info->curr_minor_hash = fname->minor_hash;
++              } else {
+                       if (info->next_hash == ~0) {
+                               filp->f_pos = EXT3_HTREE_EOF;
+                               break;
+diff --git a/fs/ext3/resize.c b/fs/ext3/resize.c
+index 77278e9..78fdf38 100644
+--- a/fs/ext3/resize.c
++++ b/fs/ext3/resize.c
+@@ -790,7 +790,8 @@ int ext3_group_add(struct super_block *sb, struct ext3_new_group_data *input)
+       if (reserved_gdb || gdb_off == 0) {
+               if (!EXT3_HAS_COMPAT_FEATURE(sb,
+-                                           EXT3_FEATURE_COMPAT_RESIZE_INODE)){
++                                           EXT3_FEATURE_COMPAT_RESIZE_INODE)
++                  || !le16_to_cpu(es->s_reserved_gdt_blocks)) {
+                       ext3_warning(sb, __func__,
+                                    "No reserved GDT blocks, can't resize");
+                       return -EPERM;
+diff --git a/fs/ext4/dir.c b/fs/ext4/dir.c
+index d1d6487..e45d086 100644
+--- a/fs/ext4/dir.c
++++ b/fs/ext4/dir.c
+@@ -458,17 +458,8 @@ static int ext4_dx_readdir(struct file * filp,
+       if (info->extra_fname) {
+               if (call_filldir(filp, dirent, filldir, info->extra_fname))
+                       goto finished;
+-
+               info->extra_fname = NULL;
+-              info->curr_node = rb_next(info->curr_node);
+-              if (!info->curr_node) {
+-                      if (info->next_hash == ~0) {
+-                              filp->f_pos = EXT4_HTREE_EOF;
+-                              goto finished;
+-                      }
+-                      info->curr_hash = info->next_hash;
+-                      info->curr_minor_hash = 0;
+-              }
++              goto next_node;
+       } else if (!info->curr_node)
+               info->curr_node = rb_first(&info->root);
+@@ -500,9 +491,14 @@ static int ext4_dx_readdir(struct file * filp,
+               info->curr_minor_hash = fname->minor_hash;
+               if (call_filldir(filp, dirent, filldir, fname))
+                       break;
+-
++      next_node:
+               info->curr_node = rb_next(info->curr_node);
+-              if (!info->curr_node) {
++              if (info->curr_node) {
++                      fname = rb_entry(info->curr_node, struct fname,
++                                       rb_hash);
++                      info->curr_hash = fname->hash;
++                      info->curr_minor_hash = fname->minor_hash;
++              } else {
+                       if (info->next_hash == ~0) {
+                               filp->f_pos = EXT4_HTREE_EOF;
+                               break;
+diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h
+index 2950032..4829dac 100644
+--- a/fs/ext4/ext4.h
++++ b/fs/ext4/ext4.h
+@@ -291,8 +291,6 @@ struct ext4_new_group_data {
+ #define       EXT4_IOC_SETFLAGS               FS_IOC_SETFLAGS
+ #define       EXT4_IOC_GETVERSION             _IOR('f', 3, long)
+ #define       EXT4_IOC_SETVERSION             _IOW('f', 4, long)
+-#define EXT4_IOC_GROUP_EXTEND         _IOW('f', 7, unsigned long)
+-#define EXT4_IOC_GROUP_ADD            _IOW('f', 8,struct ext4_new_group_input)
+ #define       EXT4_IOC_GETVERSION_OLD         FS_IOC_GETVERSION
+ #define       EXT4_IOC_SETVERSION_OLD         FS_IOC_SETVERSION
+ #ifdef CONFIG_JBD2_DEBUG
+@@ -300,7 +298,10 @@ struct ext4_new_group_data {
+ #endif
+ #define EXT4_IOC_GETRSVSZ             _IOR('f', 5, long)
+ #define EXT4_IOC_SETRSVSZ             _IOW('f', 6, long)
+-#define EXT4_IOC_MIGRATE              _IO('f', 7)
++#define EXT4_IOC_GROUP_EXTEND         _IOW('f', 7, unsigned long)
++#define EXT4_IOC_GROUP_ADD            _IOW('f', 8, struct ext4_new_group_input)
++#define EXT4_IOC_MIGRATE              _IO('f', 9)
++ /* note ioctl 11 reserved for filesystem-independent FIEMAP ioctl */
+ /*
+  * ioctl commands in 32 bit emulation
+@@ -1083,8 +1084,7 @@ extern long ext4_ioctl(struct file *, unsigned int, unsigned long);
+ extern long ext4_compat_ioctl (struct file *, unsigned int, unsigned long);
+ /* migrate.c */
+-extern int ext4_ext_migrate(struct inode *, struct file *, unsigned int,
+-                     unsigned long);
++extern int ext4_ext_migrate(struct inode *);
+ /* namei.c */
+ extern int ext4_orphan_add(handle_t *, struct inode *);
+ extern int ext4_orphan_del(handle_t *, struct inode *);
+diff --git a/fs/ext4/ialloc.c b/fs/ext4/ialloc.c
+index f344834..9805924 100644
+--- a/fs/ext4/ialloc.c
++++ b/fs/ext4/ialloc.c
+@@ -715,6 +715,8 @@ got:
+                       gdp->bg_flags &= cpu_to_le16(~EXT4_BG_BLOCK_UNINIT);
+                       free = ext4_free_blocks_after_init(sb, group, gdp);
+                       gdp->bg_free_blocks_count = cpu_to_le16(free);
++                      gdp->bg_checksum = ext4_group_desc_csum(sbi, group,
++                                                              gdp);
+               }
+               spin_unlock(sb_bgl_lock(sbi, group));
+diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c
+index 7e91913..846a790 100644
+--- a/fs/ext4/inode.c
++++ b/fs/ext4/inode.c
+@@ -2242,6 +2242,8 @@ static int ext4_da_writepage(struct page *page,
+                       unlock_page(page);
+                       return 0;
+               }
++              /* now mark the buffer_heads as dirty and uptodate */
++              block_commit_write(page, 0, PAGE_CACHE_SIZE);
+       }
+       if (test_opt(inode->i_sb, NOBH) && ext4_should_writeback_data(inode))
+@@ -4444,9 +4446,10 @@ static int ext4_indirect_trans_blocks(struct inode *inode, int nrblocks,
+ static int ext4_index_trans_blocks(struct inode *inode, int nrblocks, int chunk)
+ {
+       if (!(EXT4_I(inode)->i_flags & EXT4_EXTENTS_FL))
+-              return ext4_indirect_trans_blocks(inode, nrblocks, 0);
+-      return ext4_ext_index_trans_blocks(inode, nrblocks, 0);
++              return ext4_indirect_trans_blocks(inode, nrblocks, chunk);
++      return ext4_ext_index_trans_blocks(inode, nrblocks, chunk);
+ }
++
+ /*
+  * Account for index blocks, block groups bitmaps and block group
+  * descriptor blocks if modify datablocks and index blocks
+diff --git a/fs/ext4/ioctl.c b/fs/ext4/ioctl.c
+index 7a6c2f1..306bfd4 100644
+--- a/fs/ext4/ioctl.c
++++ b/fs/ext4/ioctl.c
+@@ -267,7 +267,26 @@ setversion_out:
+       }
+       case EXT4_IOC_MIGRATE:
+-              return ext4_ext_migrate(inode, filp, cmd, arg);
++      {
++              int err;
++              if (!is_owner_or_cap(inode))
++                      return -EACCES;
++
++              err = mnt_want_write(filp->f_path.mnt);
++              if (err)
++                      return err;
++              /*
++               * inode_mutex prevent write and truncate on the file.
++               * Read still goes through. We take i_data_sem in
++               * ext4_ext_swap_inode_data before we switch the
++               * inode format to prevent read.
++               */
++              mutex_lock(&(inode->i_mutex));
++              err = ext4_ext_migrate(inode);
++              mutex_unlock(&(inode->i_mutex));
++              mnt_drop_write(filp->f_path.mnt);
++              return err;
++      }
+       default:
+               return -ENOTTY;
+diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
+index e0e3a5e..ba86b56 100644
+--- a/fs/ext4/mballoc.c
++++ b/fs/ext4/mballoc.c
+@@ -2575,7 +2575,7 @@ static void ext4_mb_cleanup_pa(struct ext4_group_info *grp)
+               pa = list_entry(cur, struct ext4_prealloc_space, pa_group_list);
+               list_del(&pa->pa_group_list);
+               count++;
+-              kfree(pa);
++              kmem_cache_free(ext4_pspace_cachep, pa);
+       }
+       if (count)
+               mb_debug("mballoc: %u PAs left\n", count);
+@@ -2785,14 +2785,20 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)
+       mode_t mode = S_IFREG | S_IRUGO | S_IWUSR;
+       struct ext4_sb_info *sbi = EXT4_SB(sb);
+       struct proc_dir_entry *proc;
+-      char devname[64];
++      char devname[BDEVNAME_SIZE], *p;
+       if (proc_root_ext4 == NULL) {
+               sbi->s_mb_proc = NULL;
+               return -EINVAL;
+       }
+       bdevname(sb->s_bdev, devname);
++      p = devname;
++      while ((p = strchr(p, '/')))
++              *p = '!';
++
+       sbi->s_mb_proc = proc_mkdir(devname, proc_root_ext4);
++      if (!sbi->s_mb_proc)
++              goto err_create_dir;
+       MB_PROC_HANDLER(EXT4_MB_STATS_NAME, stats);
+       MB_PROC_HANDLER(EXT4_MB_MAX_TO_SCAN_NAME, max_to_scan);
+@@ -2804,7 +2810,6 @@ static int ext4_mb_init_per_dev_proc(struct super_block *sb)
+       return 0;
+ err_out:
+-      printk(KERN_ERR "EXT4-fs: Unable to create %s\n", devname);
+       remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc);
+       remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc);
+       remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc);
+@@ -2813,6 +2818,8 @@ err_out:
+       remove_proc_entry(EXT4_MB_STATS_NAME, sbi->s_mb_proc);
+       remove_proc_entry(devname, proc_root_ext4);
+       sbi->s_mb_proc = NULL;
++err_create_dir:
++      printk(KERN_ERR "EXT4-fs: Unable to create %s\n", devname);
+       return -ENOMEM;
+ }
+@@ -2820,12 +2827,15 @@ err_out:
+ static int ext4_mb_destroy_per_dev_proc(struct super_block *sb)
+ {
+       struct ext4_sb_info *sbi = EXT4_SB(sb);
+-      char devname[64];
++      char devname[BDEVNAME_SIZE], *p;
+       if (sbi->s_mb_proc == NULL)
+               return -EINVAL;
+       bdevname(sb->s_bdev, devname);
++      p = devname;
++      while ((p = strchr(p, '/')))
++              *p = '!';
+       remove_proc_entry(EXT4_MB_GROUP_PREALLOC, sbi->s_mb_proc);
+       remove_proc_entry(EXT4_MB_STREAM_REQ, sbi->s_mb_proc);
+       remove_proc_entry(EXT4_MB_ORDER2_REQ, sbi->s_mb_proc);
+diff --git a/fs/ext4/migrate.c b/fs/ext4/migrate.c
+index 46fc0b5..f2a9cf4 100644
+--- a/fs/ext4/migrate.c
++++ b/fs/ext4/migrate.c
+@@ -447,8 +447,7 @@ static int free_ext_block(handle_t *handle, struct inode *inode)
+ }
+-int ext4_ext_migrate(struct inode *inode, struct file *filp,
+-                              unsigned int cmd, unsigned long arg)
++int ext4_ext_migrate(struct inode *inode)
+ {
+       handle_t *handle;
+       int retval = 0, i;
+@@ -516,12 +515,6 @@ int ext4_ext_migrate(struct inode *inode, struct file *filp,
+        * when we add extents we extent the journal
+        */
+       /*
+-       * inode_mutex prevent write and truncate on the file. Read still goes
+-       * through. We take i_data_sem in ext4_ext_swap_inode_data before we
+-       * switch the inode format to prevent read.
+-       */
+-      mutex_lock(&(inode->i_mutex));
+-      /*
+        * Even though we take i_mutex we can still cause block allocation
+        * via mmap write to holes. If we have allocated new blocks we fail
+        * migrate.  New block allocation will clear EXT4_EXT_MIGRATE flag.
+@@ -623,7 +616,6 @@ err_out:
+       tmp_inode->i_nlink = 0;
+       ext4_journal_stop(handle);
+-      mutex_unlock(&(inode->i_mutex));
+       if (tmp_inode)
+               iput(tmp_inode);
+diff --git a/fs/ext4/resize.c b/fs/ext4/resize.c
+index b3d3560..3922a8b 100644
+--- a/fs/ext4/resize.c
++++ b/fs/ext4/resize.c
+@@ -929,6 +929,15 @@ int ext4_group_add(struct super_block *sb, struct ext4_new_group_data *input)
+       percpu_counter_add(&sbi->s_freeinodes_counter,
+                          EXT4_INODES_PER_GROUP(sb));
++      if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_FLEX_BG)) {
++              ext4_group_t flex_group;
++              flex_group = ext4_flex_group(sbi, input->group);
++              sbi->s_flex_groups[flex_group].free_blocks +=
++                      input->free_blocks_count;
++              sbi->s_flex_groups[flex_group].free_inodes +=
++                      EXT4_INODES_PER_GROUP(sb);
++      }
++
+       ext4_journal_dirty_metadata(handle, sbi->s_sbh);
+       sb->s_dirt = 1;
+diff --git a/fs/ext4/super.c b/fs/ext4/super.c
+index 566344b..7726e8e 100644
+--- a/fs/ext4/super.c
++++ b/fs/ext4/super.c
+@@ -1504,8 +1504,10 @@ static int ext4_fill_flex_info(struct super_block *sb)
+       sbi->s_log_groups_per_flex = sbi->s_es->s_log_groups_per_flex;
+       groups_per_flex = 1 << sbi->s_log_groups_per_flex;
+-      flex_group_count = (sbi->s_groups_count + groups_per_flex - 1) /
+-              groups_per_flex;
++      /* We allocate both existing and potentially added groups */
++      flex_group_count = ((sbi->s_groups_count + groups_per_flex - 1) +
++                      ((le16_to_cpu(sbi->s_es->s_reserved_gdt_blocks) + 1) <<
++                            EXT4_DESC_PER_BLOCK_BITS(sb))) / groups_per_flex;
+       sbi->s_flex_groups = kzalloc(flex_group_count *
+                                    sizeof(struct flex_groups), GFP_KERNEL);
+       if (sbi->s_flex_groups == NULL) {
+@@ -1623,8 +1625,10 @@ static int ext4_check_descriptors(struct super_block *sb)
+                              "Checksum for group %lu failed (%u!=%u)\n",
+                              i, le16_to_cpu(ext4_group_desc_csum(sbi, i,
+                              gdp)), le16_to_cpu(gdp->bg_checksum));
+-                      if (!(sb->s_flags & MS_RDONLY))
++                      if (!(sb->s_flags & MS_RDONLY)) {
++                              spin_unlock(sb_bgl_lock(sbi, i));
+                               return 0;
++                      }
+               }
+               spin_unlock(sb_bgl_lock(sbi, i));
+               if (!flexbg_flag)
+@@ -2444,6 +2448,21 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+                       "available.\n");
+       }
++      if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
++              printk(KERN_WARNING "EXT4-fs: Ignoring delalloc option - "
++                              "requested data journaling mode\n");
++              clear_opt(sbi->s_mount_opt, DELALLOC);
++      } else if (test_opt(sb, DELALLOC))
++              printk(KERN_INFO "EXT4-fs: delayed allocation enabled\n");
++
++      ext4_ext_init(sb);
++      err = ext4_mb_init(sb, needs_recovery);
++      if (err) {
++              printk(KERN_ERR "EXT4-fs: failed to initalize mballoc (%d)\n",
++                     err);
++              goto failed_mount4;
++      }
++
+       /*
+        * akpm: core read_super() calls in here with the superblock locked.
+        * That deadlocks, because orphan cleanup needs to lock the superblock
+@@ -2463,16 +2482,6 @@ static int ext4_fill_super(struct super_block *sb, void *data, int silent)
+              test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_ORDERED_DATA ? "ordered":
+              "writeback");
+-      if (test_opt(sb, DATA_FLAGS) == EXT4_MOUNT_JOURNAL_DATA) {
+-              printk(KERN_WARNING "EXT4-fs: Ignoring delalloc option - "
+-                              "requested data journaling mode\n");
+-              clear_opt(sbi->s_mount_opt, DELALLOC);
+-      } else if (test_opt(sb, DELALLOC))
+-              printk(KERN_INFO "EXT4-fs: delayed allocation enabled\n");
+-
+-      ext4_ext_init(sb);
+-      ext4_mb_init(sb, needs_recovery);
+-
+       lock_kernel();
+       return 0;
+@@ -2799,13 +2808,34 @@ static void ext4_commit_super(struct super_block *sb,
+       if (!sbh)
+               return;
++      if (buffer_write_io_error(sbh)) {
++              /*
++               * Oh, dear.  A previous attempt to write the
++               * superblock failed.  This could happen because the
++               * USB device was yanked out.  Or it could happen to
++               * be a transient write error and maybe the block will
++               * be remapped.  Nothing we can do but to retry the
++               * write and hope for the best.
++               */
++              printk(KERN_ERR "ext4: previous I/O error to "
++                     "superblock detected for %s.\n", sb->s_id);
++              clear_buffer_write_io_error(sbh);
++              set_buffer_uptodate(sbh);
++      }
+       es->s_wtime = cpu_to_le32(get_seconds());
+       ext4_free_blocks_count_set(es, ext4_count_free_blocks(sb));
+       es->s_free_inodes_count = cpu_to_le32(ext4_count_free_inodes(sb));
+       BUFFER_TRACE(sbh, "marking dirty");
+       mark_buffer_dirty(sbh);
+-      if (sync)
++      if (sync) {
+               sync_dirty_buffer(sbh);
++              if (buffer_write_io_error(sbh)) {
++                      printk(KERN_ERR "ext4: I/O error while writing "
++                             "superblock for %s.\n", sb->s_id);
++                      clear_buffer_write_io_error(sbh);
++                      set_buffer_uptodate(sbh);
++              }
++      }
+ }
+@@ -2890,12 +2920,9 @@ int ext4_force_commit(struct super_block *sb)
+ /*
+  * Ext4 always journals updates to the superblock itself, so we don't
+  * have to propagate any other updates to the superblock on disk at this
+- * point.  Just start an async writeback to get the buffers on their way
+- * to the disk.
+- *
+- * This implicitly triggers the writebehind on sync().
++ * point.  (We can probably nuke this function altogether, and remove
++ * any mention to sb->s_dirt in all of fs/ext4; eventual cleanup...)
+  */
+-
+ static void ext4_write_super(struct super_block *sb)
+ {
+       if (mutex_trylock(&sb->s_lock) != 0)
+@@ -2905,14 +2932,14 @@ static void ext4_write_super(struct super_block *sb)
+ static int ext4_sync_fs(struct super_block *sb, int wait)
+ {
+-      tid_t target;
++      int ret = 0;
+       sb->s_dirt = 0;
+-      if (jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, &target)) {
+-              if (wait)
+-                      jbd2_log_wait_commit(EXT4_SB(sb)->s_journal, target);
+-      }
+-      return 0;
++      if (wait)
++              ret = ext4_force_commit(sb);
++      else
++              jbd2_journal_start_commit(EXT4_SB(sb)->s_journal, NULL);
++      return ret;
+ }
+ /*
+diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+index 8954208..362b0ed 100644
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -959,6 +959,7 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
+       struct ext4_xattr_block_find bs = {
+               .s = { .not_found = -ENODATA, },
+       };
++      unsigned long no_expand;
+       int error;
+       if (!name)
+@@ -966,6 +967,9 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
+       if (strlen(name) > 255)
+               return -ERANGE;
+       down_write(&EXT4_I(inode)->xattr_sem);
++      no_expand = EXT4_I(inode)->i_state & EXT4_STATE_NO_EXPAND;
++      EXT4_I(inode)->i_state |= EXT4_STATE_NO_EXPAND;
++
+       error = ext4_get_inode_loc(inode, &is.iloc);
+       if (error)
+               goto cleanup;
+@@ -1042,6 +1046,8 @@ ext4_xattr_set_handle(handle_t *handle, struct inode *inode, int name_index,
+ cleanup:
+       brelse(is.iloc.bh);
+       brelse(bs.bh);
++      if (no_expand == 0)
++              EXT4_I(inode)->i_state &= ~EXT4_STATE_NO_EXPAND;
+       up_write(&EXT4_I(inode)->xattr_sem);
+       return error;
+ }
+diff --git a/fs/inotify.c b/fs/inotify.c
+index 690e725..7bbed1b 100644
+--- a/fs/inotify.c
++++ b/fs/inotify.c
+@@ -106,6 +106,20 @@ void get_inotify_watch(struct inotify_watch *watch)
+ }
+ EXPORT_SYMBOL_GPL(get_inotify_watch);
++int pin_inotify_watch(struct inotify_watch *watch)
++{
++      struct super_block *sb = watch->inode->i_sb;
++      spin_lock(&sb_lock);
++      if (sb->s_count >= S_BIAS) {
++              atomic_inc(&sb->s_active);
++              spin_unlock(&sb_lock);
++              atomic_inc(&watch->count);
++              return 1;
++      }
++      spin_unlock(&sb_lock);
++      return 0;
++}
++
+ /**
+  * put_inotify_watch - decrements the ref count on a given watch.  cleans up
+  * watch references if the count reaches zero.  inotify_watch is freed by
+@@ -124,6 +138,13 @@ void put_inotify_watch(struct inotify_watch *watch)
+ }
+ EXPORT_SYMBOL_GPL(put_inotify_watch);
++void unpin_inotify_watch(struct inotify_watch *watch)
++{
++      struct super_block *sb = watch->inode->i_sb;
++      put_inotify_watch(watch);
++      deactivate_super(sb);
++}
++
+ /*
+  * inotify_handle_get_wd - returns the next WD for use by the given handle
+  *
+@@ -479,6 +500,112 @@ void inotify_init_watch(struct inotify_watch *watch)
+ }
+ EXPORT_SYMBOL_GPL(inotify_init_watch);
++/*
++ * Watch removals suck violently.  To kick the watch out we need (in this
++ * order) inode->inotify_mutex and ih->mutex.  That's fine if we have
++ * a hold on inode; however, for all other cases we need to make damn sure
++ * we don't race with umount.  We can *NOT* just grab a reference to a
++ * watch - inotify_unmount_inodes() will happily sail past it and we'll end
++ * with reference to inode potentially outliving its superblock.  Ideally
++ * we just want to grab an active reference to superblock if we can; that
++ * will make sure we won't go into inotify_umount_inodes() until we are
++ * done.  Cleanup is just deactivate_super().  However, that leaves a messy
++ * case - what if we *are* racing with umount() and active references to
++ * superblock can't be acquired anymore?  We can bump ->s_count, grab
++ * ->s_umount, which will almost certainly wait until the superblock is shut
++ * down and the watch in question is pining for fjords.  That's fine, but
++ * there is a problem - we might have hit the window between ->s_active
++ * getting to 0 / ->s_count - below S_BIAS (i.e. the moment when superblock
++ * is past the point of no return and is heading for shutdown) and the
++ * moment when deactivate_super() acquires ->s_umount.  We could just do
++ * drop_super() yield() and retry, but that's rather antisocial and this
++ * stuff is luser-triggerable.  OTOH, having grabbed ->s_umount and having
++ * found that we'd got there first (i.e. that ->s_root is non-NULL) we know
++ * that we won't race with inotify_umount_inodes().  So we could grab a
++ * reference to watch and do the rest as above, just with drop_super() instead
++ * of deactivate_super(), right?  Wrong.  We had to drop ih->mutex before we
++ * could grab ->s_umount.  So the watch could've been gone already.
++ *
++ * That still can be dealt with - we need to save watch->wd, do idr_find()
++ * and compare its result with our pointer.  If they match, we either have
++ * the damn thing still alive or we'd lost not one but two races at once,
++ * the watch had been killed and a new one got created with the same ->wd
++ * at the same address.  That couldn't have happened in inotify_destroy(),
++ * but inotify_rm_wd() could run into that.  Still, "new one got created"
++ * is not a problem - we have every right to kill it or leave it alone,
++ * whatever's more convenient.
++ *
++ * So we can use idr_find(...) == watch && watch->inode->i_sb == sb as
++ * "grab it and kill it" check.  If it's been our original watch, we are
++ * fine, if it's a newcomer - nevermind, just pretend that we'd won the
++ * race and kill the fscker anyway; we are safe since we know that its
++ * superblock won't be going away.
++ *
++ * And yes, this is far beyond mere "not very pretty"; so's the entire
++ * concept of inotify to start with.
++ */
++
++/**
++ * pin_to_kill - pin the watch down for removal
++ * @ih: inotify handle
++ * @watch: watch to kill
++ *
++ * Called with ih->mutex held, drops it.  Possible return values:
++ * 0 - nothing to do, it has died
++ * 1 - remove it, drop the reference and deactivate_super()
++ * 2 - remove it, drop the reference and drop_super(); we tried hard to avoid
++ * that variant, since it involved a lot of PITA, but that's the best that
++ * could've been done.
++ */
++static int pin_to_kill(struct inotify_handle *ih, struct inotify_watch *watch)
++{
++      struct super_block *sb = watch->inode->i_sb;
++      s32 wd = watch->wd;
++
++      spin_lock(&sb_lock);
++      if (sb->s_count >= S_BIAS) {
++              atomic_inc(&sb->s_active);
++              spin_unlock(&sb_lock);
++              get_inotify_watch(watch);
++              mutex_unlock(&ih->mutex);
++              return 1;       /* the best outcome */
++      }
++      sb->s_count++;
++      spin_unlock(&sb_lock);
++      mutex_unlock(&ih->mutex); /* can't grab ->s_umount under it */
++      down_read(&sb->s_umount);
++      if (likely(!sb->s_root)) {
++              /* fs is already shut down; the watch is dead */
++              drop_super(sb);
++              return 0;
++      }
++      /* raced with the final deactivate_super() */
++      mutex_lock(&ih->mutex);
++      if (idr_find(&ih->idr, wd) != watch || watch->inode->i_sb != sb) {
++              /* the watch is dead */
++              mutex_unlock(&ih->mutex);
++              drop_super(sb);
++              return 0;
++      }
++      /* still alive or freed and reused with the same sb and wd; kill */
++      get_inotify_watch(watch);
++      mutex_unlock(&ih->mutex);
++      return 2;
++}
++
++static void unpin_and_kill(struct inotify_watch *watch, int how)
++{
++      struct super_block *sb = watch->inode->i_sb;
++      put_inotify_watch(watch);
++      switch (how) {
++      case 1:
++              deactivate_super(sb);
++              break;
++      case 2:
++              drop_super(sb);
++      }
++}
++
+ /**
+  * inotify_destroy - clean up and destroy an inotify instance
+  * @ih: inotify handle
+@@ -490,11 +617,15 @@ void inotify_destroy(struct inotify_handle *ih)
+        * pretty.  We cannot do a simple iteration over the list, because we
+        * do not know the inode until we iterate to the watch.  But we need to
+        * hold inode->inotify_mutex before ih->mutex.  The following works.
++       *
++       * AV: it had to become even uglier to start working ;-/
+        */
+       while (1) {
+               struct inotify_watch *watch;
+               struct list_head *watches;
++              struct super_block *sb;
+               struct inode *inode;
++              int how;
+               mutex_lock(&ih->mutex);
+               watches = &ih->watches;
+@@ -503,8 +634,10 @@ void inotify_destroy(struct inotify_handle *ih)
+                       break;
+               }
+               watch = list_first_entry(watches, struct inotify_watch, h_list);
+-              get_inotify_watch(watch);
+-              mutex_unlock(&ih->mutex);
++              sb = watch->inode->i_sb;
++              how = pin_to_kill(ih, watch);
++              if (!how)
++                      continue;
+               inode = watch->inode;
+               mutex_lock(&inode->inotify_mutex);
+@@ -518,7 +651,7 @@ void inotify_destroy(struct inotify_handle *ih)
+               mutex_unlock(&ih->mutex);
+               mutex_unlock(&inode->inotify_mutex);
+-              put_inotify_watch(watch);
++              unpin_and_kill(watch, how);
+       }
+       /* free this handle: the put matching the get in inotify_init() */
+@@ -719,7 +852,9 @@ void inotify_evict_watch(struct inotify_watch *watch)
+ int inotify_rm_wd(struct inotify_handle *ih, u32 wd)
+ {
+       struct inotify_watch *watch;
++      struct super_block *sb;
+       struct inode *inode;
++      int how;
+       mutex_lock(&ih->mutex);
+       watch = idr_find(&ih->idr, wd);
+@@ -727,9 +862,12 @@ int inotify_rm_wd(struct inotify_handle *ih, u32 wd)
+               mutex_unlock(&ih->mutex);
+               return -EINVAL;
+       }
+-      get_inotify_watch(watch);
++      sb = watch->inode->i_sb;
++      how = pin_to_kill(ih, watch);
++      if (!how)
++              return 0;
++
+       inode = watch->inode;
+-      mutex_unlock(&ih->mutex);
+       mutex_lock(&inode->inotify_mutex);
+       mutex_lock(&ih->mutex);
+@@ -740,7 +878,7 @@ int inotify_rm_wd(struct inotify_handle *ih, u32 wd)
+       mutex_unlock(&ih->mutex);
+       mutex_unlock(&inode->inotify_mutex);
+-      put_inotify_watch(watch);
++      unpin_and_kill(watch, how);
+       return 0;
+ }
+diff --git a/fs/jbd/transaction.c b/fs/jbd/transaction.c
+index 0540ca2..d15cd6e 100644
+--- a/fs/jbd/transaction.c
++++ b/fs/jbd/transaction.c
+@@ -954,9 +954,10 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
+       journal_t *journal = handle->h_transaction->t_journal;
+       int need_brelse = 0;
+       struct journal_head *jh;
++      int ret = 0;
+       if (is_handle_aborted(handle))
+-              return 0;
++              return ret;
+       jh = journal_add_journal_head(bh);
+       JBUFFER_TRACE(jh, "entry");
+@@ -1067,7 +1068,16 @@ int journal_dirty_data(handle_t *handle, struct buffer_head *bh)
+                                  time if it is redirtied */
+                       }
+-                      /* journal_clean_data_list() may have got there first */
++                      /*
++                       * We cannot remove the buffer with io error from the
++                       * committing transaction, because otherwise it would
++                       * miss the error and the commit would not abort.
++                       */
++                      if (unlikely(!buffer_uptodate(bh))) {
++                              ret = -EIO;
++                              goto no_journal;
++                      }
++
+                       if (jh->b_transaction != NULL) {
+                               JBUFFER_TRACE(jh, "unfile from commit");
+                               __journal_temp_unlink_buffer(jh);
+@@ -1108,7 +1118,7 @@ no_journal:
+       }
+       JBUFFER_TRACE(jh, "exit");
+       journal_put_journal_head(jh);
+-      return 0;
++      return ret;
+ }
+ /**
+diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c
+index 91389c8..77255a3 100644
+--- a/fs/jbd2/checkpoint.c
++++ b/fs/jbd2/checkpoint.c
+@@ -114,7 +114,7 @@ static int __try_to_free_cp_buf(struct journal_head *jh)
+  */
+ void __jbd2_log_wait_for_space(journal_t *journal)
+ {
+-      int nblocks;
++      int nblocks, space_left;
+       assert_spin_locked(&journal->j_state_lock);
+       nblocks = jbd_space_needed(journal);
+@@ -126,14 +126,47 @@ void __jbd2_log_wait_for_space(journal_t *journal)
+               /*
+                * Test again, another process may have checkpointed while we
+-               * were waiting for the checkpoint lock
++               * were waiting for the checkpoint lock. If there are no
++               * transactions ready to be checkpointed, try to recover
++               * journal space by calling cleanup_journal_tail(), and if
++               * that doesn't work, by waiting for the currently committing
++               * transaction to complete.  If there is absolutely no way
++               * to make progress, this is either a BUG or corrupted
++               * filesystem, so abort the journal and leave a stack
++               * trace for forensic evidence.
+                */
+               spin_lock(&journal->j_state_lock);
++              spin_lock(&journal->j_list_lock);
+               nblocks = jbd_space_needed(journal);
+-              if (__jbd2_log_space_left(journal) < nblocks) {
++              space_left = __jbd2_log_space_left(journal);
++              if (space_left < nblocks) {
++                      int chkpt = journal->j_checkpoint_transactions != NULL;
++                      tid_t tid = 0;
++
++                      if (journal->j_committing_transaction)
++                              tid = journal->j_committing_transaction->t_tid;
++                      spin_unlock(&journal->j_list_lock);
+                       spin_unlock(&journal->j_state_lock);
+-                      jbd2_log_do_checkpoint(journal);
++                      if (chkpt) {
++                              jbd2_log_do_checkpoint(journal);
++                      } else if (jbd2_cleanup_journal_tail(journal) == 0) {
++                              /* We were able to recover space; yay! */
++                              ;
++                      } else if (tid) {
++                              jbd2_log_wait_commit(journal, tid);
++                      } else {
++                              printk(KERN_ERR "%s: needed %d blocks and "
++                                     "only had %d space available\n",
++                                     __func__, nblocks, space_left);
++                              printk(KERN_ERR "%s: no way to get more "
++                                     "journal space in %s\n", __func__,
++                                     journal->j_devname);
++                              WARN_ON(1);
++                              jbd2_journal_abort(journal, 0);
++                      }
+                       spin_lock(&journal->j_state_lock);
++              } else {
++                      spin_unlock(&journal->j_list_lock);
+               }
+               mutex_unlock(&journal->j_checkpoint_mutex);
+       }
+diff --git a/fs/jbd2/commit.c b/fs/jbd2/commit.c
+index f2ad061..6caf22d 100644
+--- a/fs/jbd2/commit.c
++++ b/fs/jbd2/commit.c
+@@ -126,8 +126,7 @@ static int journal_submit_commit_record(journal_t *journal,
+       JBUFFER_TRACE(descriptor, "submit commit block");
+       lock_buffer(bh);
+-      get_bh(bh);
+-      set_buffer_dirty(bh);
++      clear_buffer_dirty(bh);
+       set_buffer_uptodate(bh);
+       bh->b_end_io = journal_end_buffer_io_sync;
+@@ -160,7 +159,7 @@ static int journal_submit_commit_record(journal_t *journal,
+               /* And try again, without the barrier */
+               lock_buffer(bh);
+               set_buffer_uptodate(bh);
+-              set_buffer_dirty(bh);
++              clear_buffer_dirty(bh);
+               ret = submit_bh(WRITE, bh);
+       }
+       *cbh = bh;
+diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
+index 8207a01..52d2bee 100644
+--- a/fs/jbd2/journal.c
++++ b/fs/jbd2/journal.c
+@@ -901,10 +901,7 @@ static struct proc_dir_entry *proc_jbd2_stats;
+ static void jbd2_stats_proc_init(journal_t *journal)
+ {
+-      char name[BDEVNAME_SIZE];
+-
+-      bdevname(journal->j_dev, name);
+-      journal->j_proc_entry = proc_mkdir(name, proc_jbd2_stats);
++      journal->j_proc_entry = proc_mkdir(journal->j_devname, proc_jbd2_stats);
+       if (journal->j_proc_entry) {
+               proc_create_data("history", S_IRUGO, journal->j_proc_entry,
+                                &jbd2_seq_history_fops, journal);
+@@ -915,12 +912,9 @@ static void jbd2_stats_proc_init(journal_t *journal)
+ static void jbd2_stats_proc_exit(journal_t *journal)
+ {
+-      char name[BDEVNAME_SIZE];
+-
+-      bdevname(journal->j_dev, name);
+       remove_proc_entry("info", journal->j_proc_entry);
+       remove_proc_entry("history", journal->j_proc_entry);
+-      remove_proc_entry(name, proc_jbd2_stats);
++      remove_proc_entry(journal->j_devname, proc_jbd2_stats);
+ }
+ static void journal_init_stats(journal_t *journal)
+@@ -1018,6 +1012,7 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
+ {
+       journal_t *journal = journal_init_common();
+       struct buffer_head *bh;
++      char *p;
+       int n;
+       if (!journal)
+@@ -1039,6 +1034,10 @@ journal_t * jbd2_journal_init_dev(struct block_device *bdev,
+       journal->j_fs_dev = fs_dev;
+       journal->j_blk_offset = start;
+       journal->j_maxlen = len;
++      bdevname(journal->j_dev, journal->j_devname);
++      p = journal->j_devname;
++      while ((p = strchr(p, '/')))
++              *p = '!';
+       jbd2_stats_proc_init(journal);
+       bh = __getblk(journal->j_dev, start, journal->j_blocksize);
+@@ -1061,6 +1060,7 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
+ {
+       struct buffer_head *bh;
+       journal_t *journal = journal_init_common();
++      char *p;
+       int err;
+       int n;
+       unsigned long long blocknr;
+@@ -1070,6 +1070,12 @@ journal_t * jbd2_journal_init_inode (struct inode *inode)
+       journal->j_dev = journal->j_fs_dev = inode->i_sb->s_bdev;
+       journal->j_inode = inode;
++      bdevname(journal->j_dev, journal->j_devname);
++      p = journal->j_devname;
++      while ((p = strchr(p, '/')))
++              *p = '!';
++      p = journal->j_devname + strlen(journal->j_devname);
++      sprintf(p, ":%lu", journal->j_inode->i_ino);
+       jbd_debug(1,
+                 "journal %p: inode %s/%ld, size %Ld, bits %d, blksize %ld\n",
+                 journal, inode->i_sb->s_id, inode->i_ino,
+@@ -1253,6 +1259,22 @@ void jbd2_journal_update_superblock(journal_t *journal, int wait)
+               goto out;
+       }
++      if (buffer_write_io_error(bh)) {
++              /*
++               * Oh, dear.  A previous attempt to write the journal
++               * superblock failed.  This could happen because the
++               * USB device was yanked out.  Or it could happen to
++               * be a transient write error and maybe the block will
++               * be remapped.  Nothing we can do but to retry the
++               * write and hope for the best.
++               */
++              printk(KERN_ERR "JBD2: previous I/O error detected "
++                     "for journal superblock update for %s.\n",
++                     journal->j_devname);
++              clear_buffer_write_io_error(bh);
++              set_buffer_uptodate(bh);
++      }
++
+       spin_lock(&journal->j_state_lock);
+       jbd_debug(1,"JBD: updating superblock (start %ld, seq %d, errno %d)\n",
+                 journal->j_tail, journal->j_tail_sequence, journal->j_errno);
+@@ -1264,9 +1286,16 @@ void jbd2_journal_update_superblock(journal_t *journal, int wait)
+       BUFFER_TRACE(bh, "marking dirty");
+       mark_buffer_dirty(bh);
+-      if (wait)
++      if (wait) {
+               sync_dirty_buffer(bh);
+-      else
++              if (buffer_write_io_error(bh)) {
++                      printk(KERN_ERR "JBD2: I/O error detected "
++                             "when updating journal superblock for %s.\n",
++                             journal->j_devname);
++                      clear_buffer_write_io_error(bh);
++                      set_buffer_uptodate(bh);
++              }
++      } else
+               ll_rw_block(SWRITE, 1, &bh);
+ out:
+diff --git a/include/asm-x86/mmzone_32.h b/include/asm-x86/mmzone_32.h
+index 5862e64..eb77583 100644
+--- a/include/asm-x86/mmzone_32.h
++++ b/include/asm-x86/mmzone_32.h
+@@ -34,10 +34,14 @@ static inline void get_memcfg_numa(void)
+ extern int early_pfn_to_nid(unsigned long pfn);
++extern void resume_map_numa_kva(pgd_t *pgd);
++
+ #else /* !CONFIG_NUMA */
+ #define get_memcfg_numa get_memcfg_numa_flat
++static inline void resume_map_numa_kva(pgd_t *pgd) {}
++
+ #endif /* CONFIG_NUMA */
+ #ifdef CONFIG_DISCONTIGMEM
+diff --git a/include/asm-x86/pci_64.h b/include/asm-x86/pci_64.h
+index f330234..50d3df5 100644
+--- a/include/asm-x86/pci_64.h
++++ b/include/asm-x86/pci_64.h
+@@ -34,8 +34,6 @@ extern void pci_iommu_alloc(void);
+  */
+ #define PCI_DMA_BUS_IS_PHYS (dma_ops->is_phys)
+-#if defined(CONFIG_GART_IOMMU) || defined(CONFIG_CALGARY_IOMMU)
+-
+ #define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)     \
+       dma_addr_t ADDR_NAME;
+ #define DECLARE_PCI_UNMAP_LEN(LEN_NAME)               \
+@@ -49,18 +47,6 @@ extern void pci_iommu_alloc(void);
+ #define pci_unmap_len_set(PTR, LEN_NAME, VAL)         \
+       (((PTR)->LEN_NAME) = (VAL))
+-#else
+-/* No IOMMU */
+-
+-#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
+-#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
+-#define pci_unmap_addr(PTR, ADDR_NAME)                (0)
+-#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL)       do { } while (0)
+-#define pci_unmap_len(PTR, LEN_NAME)          (0)
+-#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do { } while (0)
+-
+-#endif
+-
+ #endif /* __KERNEL__ */
+ #endif /* __x8664_PCI_H */
+diff --git a/include/linux/idr.h b/include/linux/idr.h
+index fa035f9..dd846df 100644
+--- a/include/linux/idr.h
++++ b/include/linux/idr.h
+@@ -52,13 +52,14 @@ struct idr_layer {
+       unsigned long            bitmap; /* A zero bit means "space here" */
+       struct idr_layer        *ary[1<<IDR_BITS];
+       int                      count;  /* When zero, we can release it */
++      int                      layer;  /* distance from leaf */
+       struct rcu_head          rcu_head;
+ };
+ struct idr {
+       struct idr_layer *top;
+       struct idr_layer *id_free;
+-      int               layers;
++      int               layers; /* only valid without concurrent changes */
+       int               id_free_cnt;
+       spinlock_t        lock;
+ };
+diff --git a/include/linux/inotify.h b/include/linux/inotify.h
+index bd57857..37ea289 100644
+--- a/include/linux/inotify.h
++++ b/include/linux/inotify.h
+@@ -134,6 +134,8 @@ extern void inotify_remove_watch_locked(struct inotify_handle *,
+                                       struct inotify_watch *);
+ extern void get_inotify_watch(struct inotify_watch *);
+ extern void put_inotify_watch(struct inotify_watch *);
++extern int pin_inotify_watch(struct inotify_watch *);
++extern void unpin_inotify_watch(struct inotify_watch *);
+ #else
+@@ -228,6 +230,15 @@ static inline void put_inotify_watch(struct inotify_watch *watch)
+ {
+ }
++extern inline int pin_inotify_watch(struct inotify_watch *watch)
++{
++      return 0;
++}
++
++extern inline void unpin_inotify_watch(struct inotify_watch *watch)
++{
++}
++
+ #endif        /* CONFIG_INOTIFY */
+ #endif        /* __KERNEL __ */
+diff --git a/include/linux/jbd2.h b/include/linux/jbd2.h
+index 3dd2090..66c3499 100644
+--- a/include/linux/jbd2.h
++++ b/include/linux/jbd2.h
+@@ -850,7 +850,8 @@ struct journal_s
+        */
+       struct block_device     *j_dev;
+       int                     j_blocksize;
+-      unsigned long long              j_blk_offset;
++      unsigned long long      j_blk_offset;
++      char                    j_devname[BDEVNAME_SIZE+24];
+       /*
+        * Device which holds the client fs.  For internal journal this will be
+diff --git a/include/linux/libata.h b/include/linux/libata.h
+index 225bfc5..25062ac 100644
+--- a/include/linux/libata.h
++++ b/include/linux/libata.h
+@@ -364,6 +364,7 @@ enum {
+       ATA_HORKAGE_IPM         = (1 << 7),     /* Link PM problems */
+       ATA_HORKAGE_IVB         = (1 << 8),     /* cbl det validity bit bugs */
+       ATA_HORKAGE_STUCK_ERR   = (1 << 9),     /* stuck ERR on next PACKET */
++      ATA_HORKAGE_FIRMWARE_WARN = (1 << 12),  /* firwmare update warning */
+        /* DMA mask for user DMA control: User visible values; DO NOT
+           renumber */
+diff --git a/include/linux/pci.h b/include/linux/pci.h
+index 98dc624..426e029 100644
+--- a/include/linux/pci.h
++++ b/include/linux/pci.h
+@@ -64,6 +64,11 @@ struct pci_slot {
+       struct kobject kobj;
+ };
++static inline const char *pci_slot_name(const struct pci_slot *slot)
++{
++      return kobject_name(&slot->kobj);
++}
++
+ /* File state for mmap()s on /proc/bus/pci/X/Y */
+ enum pci_mmap_state {
+       pci_mmap_io,
+@@ -509,7 +514,8 @@ struct pci_bus *pci_create_bus(struct device *parent, int bus,
+ struct pci_bus *pci_add_new_bus(struct pci_bus *parent, struct pci_dev *dev,
+                               int busnr);
+ struct pci_slot *pci_create_slot(struct pci_bus *parent, int slot_nr,
+-                               const char *name);
++                               const char *name,
++                               struct hotplug_slot *hotplug);
+ void pci_destroy_slot(struct pci_slot *slot);
+ void pci_update_slot_number(struct pci_slot *slot, int slot_nr);
+ int pci_scan_slot(struct pci_bus *bus, int devfn);
+diff --git a/include/linux/pci_hotplug.h b/include/linux/pci_hotplug.h
+index a08cd06..a00bd1a 100644
+--- a/include/linux/pci_hotplug.h
++++ b/include/linux/pci_hotplug.h
+@@ -142,8 +142,6 @@ struct hotplug_slot_info {
+ /**
+  * struct hotplug_slot - used to register a physical slot with the hotplug pci core
+- * @name: the name of the slot being registered.  This string must
+- * be unique amoung slots registered on this system.
+  * @ops: pointer to the &struct hotplug_slot_ops to be used for this slot
+  * @info: pointer to the &struct hotplug_slot_info for the initial values for
+  * this slot.
+@@ -153,7 +151,6 @@ struct hotplug_slot_info {
+  * needs.
+  */
+ struct hotplug_slot {
+-      char                            *name;
+       struct hotplug_slot_ops         *ops;
+       struct hotplug_slot_info        *info;
+       void (*release) (struct hotplug_slot *slot);
+@@ -165,7 +162,13 @@ struct hotplug_slot {
+ };
+ #define to_hotplug_slot(n) container_of(n, struct hotplug_slot, kobj)
+-extern int pci_hp_register(struct hotplug_slot *, struct pci_bus *, int nr);
++static inline const char *hotplug_slot_name(const struct hotplug_slot *slot)
++{
++      return pci_slot_name(slot->pci_slot);
++}
++
++extern int pci_hp_register(struct hotplug_slot *, struct pci_bus *, int nr,
++                         const char *name);
+ extern int pci_hp_deregister(struct hotplug_slot *slot);
+ extern int __must_check pci_hp_change_slot_info       (struct hotplug_slot *slot,
+                                                struct hotplug_slot_info *info);
+diff --git a/include/linux/sched.h b/include/linux/sched.h
+index 6bfb849..086f5e1 100644
+--- a/include/linux/sched.h
++++ b/include/linux/sched.h
+@@ -587,6 +587,10 @@ struct user_struct {
+       atomic_t inotify_watches; /* How many inotify watches does this user have? */
+       atomic_t inotify_devs;  /* How many inotify devs does this user have opened? */
+ #endif
++#ifdef CONFIG_EPOLL
++      atomic_t epoll_devs;    /* The number of epoll descriptors currently open */
++      atomic_t epoll_watches; /* The number of file descriptors currently watched */
++#endif
+ #ifdef CONFIG_POSIX_MQUEUE
+       /* protected by mq_lock */
+       unsigned long mq_bytes; /* How many bytes can be allocated to mqueue? */
+diff --git a/include/net/af_unix.h b/include/net/af_unix.h
+index c29ff1d..1614d78 100644
+--- a/include/net/af_unix.h
++++ b/include/net/af_unix.h
+@@ -9,6 +9,7 @@
+ extern void unix_inflight(struct file *fp);
+ extern void unix_notinflight(struct file *fp);
+ extern void unix_gc(void);
++extern void wait_for_unix_gc(void);
+ #define UNIX_HASH_SIZE        256
+diff --git a/ipc/util.c b/ipc/util.c
+index 49b3ea6..361fd1c 100644
+--- a/ipc/util.c
++++ b/ipc/util.c
+@@ -266,9 +266,17 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
+       if (ids->in_use >= size)
+               return -ENOSPC;
++      spin_lock_init(&new->lock);
++      new->deleted = 0;
++      rcu_read_lock();
++      spin_lock(&new->lock);
++
+       err = idr_get_new(&ids->ipcs_idr, new, &id);
+-      if (err)
++      if (err) {
++              spin_unlock(&new->lock);
++              rcu_read_unlock();
+               return err;
++      }
+       ids->in_use++;
+@@ -280,10 +288,6 @@ int ipc_addid(struct ipc_ids* ids, struct kern_ipc_perm* new, int size)
+               ids->seq = 0;
+       new->id = ipc_buildid(id, new->seq);
+-      spin_lock_init(&new->lock);
+-      new->deleted = 0;
+-      rcu_read_lock();
+-      spin_lock(&new->lock);
+       return id;
+ }
+diff --git a/kernel/Makefile b/kernel/Makefile
+index 4e1d7df..143e8b6 100644
+--- a/kernel/Makefile
++++ b/kernel/Makefile
+@@ -11,8 +11,6 @@ obj-y     = sched.o fork.o exec_domain.o panic.o printk.o \
+           hrtimer.o rwsem.o nsproxy.o srcu.o semaphore.o \
+           notifier.o ksysfs.o pm_qos_params.o sched_clock.o
+-CFLAGS_REMOVE_sched.o = -mno-spe
+-
+ ifdef CONFIG_FTRACE
+ # Do not trace debug files and internal ftrace files
+ CFLAGS_REMOVE_lockdep.o = -pg
+@@ -21,7 +19,7 @@ CFLAGS_REMOVE_mutex-debug.o = -pg
+ CFLAGS_REMOVE_rtmutex-debug.o = -pg
+ CFLAGS_REMOVE_cgroup-debug.o = -pg
+ CFLAGS_REMOVE_sched_clock.o = -pg
+-CFLAGS_REMOVE_sched.o = -mno-spe -pg
++CFLAGS_REMOVE_sched.o = -pg
+ endif
+ obj-$(CONFIG_PROFILING) += profile.o
+diff --git a/kernel/audit_tree.c b/kernel/audit_tree.c
+index f7921a2..894b599 100644
+--- a/kernel/audit_tree.c
++++ b/kernel/audit_tree.c
+@@ -24,6 +24,7 @@ struct audit_chunk {
+       struct list_head trees;         /* with root here */
+       int dead;
+       int count;
++      atomic_long_t refs;
+       struct rcu_head head;
+       struct node {
+               struct list_head list;
+@@ -56,7 +57,8 @@ static LIST_HEAD(prune_list);
+  * tree is refcounted; one reference for "some rules on rules_list refer to
+  * it", one for each chunk with pointer to it.
+  *
+- * chunk is refcounted by embedded inotify_watch.
++ * chunk is refcounted by embedded inotify_watch + .refs (non-zero refcount
++ * of watch contributes 1 to .refs).
+  *
+  * node.index allows to get from node.list to containing chunk.
+  * MSB of that sucker is stolen to mark taggings that we might have to
+@@ -121,6 +123,7 @@ static struct audit_chunk *alloc_chunk(int count)
+       INIT_LIST_HEAD(&chunk->hash);
+       INIT_LIST_HEAD(&chunk->trees);
+       chunk->count = count;
++      atomic_long_set(&chunk->refs, 1);
+       for (i = 0; i < count; i++) {
+               INIT_LIST_HEAD(&chunk->owners[i].list);
+               chunk->owners[i].index = i;
+@@ -129,9 +132,8 @@ static struct audit_chunk *alloc_chunk(int count)
+       return chunk;
+ }
+-static void __free_chunk(struct rcu_head *rcu)
++static void free_chunk(struct audit_chunk *chunk)
+ {
+-      struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head);
+       int i;
+       for (i = 0; i < chunk->count; i++) {
+@@ -141,14 +143,16 @@ static void __free_chunk(struct rcu_head *rcu)
+       kfree(chunk);
+ }
+-static inline void free_chunk(struct audit_chunk *chunk)
++void audit_put_chunk(struct audit_chunk *chunk)
+ {
+-      call_rcu(&chunk->head, __free_chunk);
++      if (atomic_long_dec_and_test(&chunk->refs))
++              free_chunk(chunk);
+ }
+-void audit_put_chunk(struct audit_chunk *chunk)
++static void __put_chunk(struct rcu_head *rcu)
+ {
+-      put_inotify_watch(&chunk->watch);
++      struct audit_chunk *chunk = container_of(rcu, struct audit_chunk, head);
++      audit_put_chunk(chunk);
+ }
+ enum {HASH_SIZE = 128};
+@@ -176,7 +180,7 @@ struct audit_chunk *audit_tree_lookup(const struct inode *inode)
+       list_for_each_entry_rcu(p, list, hash) {
+               if (p->watch.inode == inode) {
+-                      get_inotify_watch(&p->watch);
++                      atomic_long_inc(&p->refs);
+                       return p;
+               }
+       }
+@@ -194,17 +198,49 @@ int audit_tree_match(struct audit_chunk *chunk, struct audit_tree *tree)
+ /* tagging and untagging inodes with trees */
+-static void untag_chunk(struct audit_chunk *chunk, struct node *p)
++static struct audit_chunk *find_chunk(struct node *p)
++{
++      int index = p->index & ~(1U<<31);
++      p -= index;
++      return container_of(p, struct audit_chunk, owners[0]);
++}
++
++static void untag_chunk(struct node *p)
+ {
++      struct audit_chunk *chunk = find_chunk(p);
+       struct audit_chunk *new;
+       struct audit_tree *owner;
+       int size = chunk->count - 1;
+       int i, j;
++      if (!pin_inotify_watch(&chunk->watch)) {
++              /*
++               * Filesystem is shutting down; all watches are getting
++               * evicted, just take it off the node list for this
++               * tree and let the eviction logics take care of the
++               * rest.
++               */
++              owner = p->owner;
++              if (owner->root == chunk) {
++                      list_del_init(&owner->same_root);
++                      owner->root = NULL;
++              }
++              list_del_init(&p->list);
++              p->owner = NULL;
++              put_tree(owner);
++              return;
++      }
++
++      spin_unlock(&hash_lock);
++
++      /*
++       * pin_inotify_watch() succeeded, so the watch won't go away
++       * from under us.
++       */
+       mutex_lock(&chunk->watch.inode->inotify_mutex);
+       if (chunk->dead) {
+               mutex_unlock(&chunk->watch.inode->inotify_mutex);
+-              return;
++              goto out;
+       }
+       owner = p->owner;
+@@ -221,7 +257,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct node *p)
+               inotify_evict_watch(&chunk->watch);
+               mutex_unlock(&chunk->watch.inode->inotify_mutex);
+               put_inotify_watch(&chunk->watch);
+-              return;
++              goto out;
+       }
+       new = alloc_chunk(size);
+@@ -263,7 +299,7 @@ static void untag_chunk(struct audit_chunk *chunk, struct node *p)
+       inotify_evict_watch(&chunk->watch);
+       mutex_unlock(&chunk->watch.inode->inotify_mutex);
+       put_inotify_watch(&chunk->watch);
+-      return;
++      goto out;
+ Fallback:
+       // do the best we can
+@@ -277,6 +313,9 @@ Fallback:
+       put_tree(owner);
+       spin_unlock(&hash_lock);
+       mutex_unlock(&chunk->watch.inode->inotify_mutex);
++out:
++      unpin_inotify_watch(&chunk->watch);
++      spin_lock(&hash_lock);
+ }
+ static int create_chunk(struct inode *inode, struct audit_tree *tree)
+@@ -387,13 +426,6 @@ static int tag_chunk(struct inode *inode, struct audit_tree *tree)
+       return 0;
+ }
+-static struct audit_chunk *find_chunk(struct node *p)
+-{
+-      int index = p->index & ~(1U<<31);
+-      p -= index;
+-      return container_of(p, struct audit_chunk, owners[0]);
+-}
+-
+ static void kill_rules(struct audit_tree *tree)
+ {
+       struct audit_krule *rule, *next;
+@@ -431,17 +463,10 @@ static void prune_one(struct audit_tree *victim)
+       spin_lock(&hash_lock);
+       while (!list_empty(&victim->chunks)) {
+               struct node *p;
+-              struct audit_chunk *chunk;
+               p = list_entry(victim->chunks.next, struct node, list);
+-              chunk = find_chunk(p);
+-              get_inotify_watch(&chunk->watch);
+-              spin_unlock(&hash_lock);
+-
+-              untag_chunk(chunk, p);
+-              put_inotify_watch(&chunk->watch);
+-              spin_lock(&hash_lock);
++              untag_chunk(p);
+       }
+       spin_unlock(&hash_lock);
+       put_tree(victim);
+@@ -469,7 +494,6 @@ static void trim_marked(struct audit_tree *tree)
+       while (!list_empty(&tree->chunks)) {
+               struct node *node;
+-              struct audit_chunk *chunk;
+               node = list_entry(tree->chunks.next, struct node, list);
+@@ -477,14 +501,7 @@ static void trim_marked(struct audit_tree *tree)
+               if (!(node->index & (1U<<31)))
+                       break;
+-              chunk = find_chunk(node);
+-              get_inotify_watch(&chunk->watch);
+-              spin_unlock(&hash_lock);
+-
+-              untag_chunk(chunk, node);
+-
+-              put_inotify_watch(&chunk->watch);
+-              spin_lock(&hash_lock);
++              untag_chunk(node);
+       }
+       if (!tree->root && !tree->goner) {
+               tree->goner = 1;
+@@ -878,7 +895,7 @@ static void handle_event(struct inotify_watch *watch, u32 wd, u32 mask,
+ static void destroy_watch(struct inotify_watch *watch)
+ {
+       struct audit_chunk *chunk = container_of(watch, struct audit_chunk, watch);
+-      free_chunk(chunk);
++      call_rcu(&chunk->head, __put_chunk);
+ }
+ static const struct inotify_operations rtree_inotify_ops = {
+diff --git a/kernel/auditfilter.c b/kernel/auditfilter.c
+index b7d354e..9fd85a4 100644
+--- a/kernel/auditfilter.c
++++ b/kernel/auditfilter.c
+@@ -1094,8 +1094,8 @@ static void audit_inotify_unregister(struct list_head *in_list)
+       list_for_each_entry_safe(p, n, in_list, ilist) {
+               list_del(&p->ilist);
+               inotify_rm_watch(audit_ih, &p->wdata);
+-              /* the put matching the get in audit_do_del_rule() */
+-              put_inotify_watch(&p->wdata);
++              /* the unpin matching the pin in audit_do_del_rule() */
++              unpin_inotify_watch(&p->wdata);
+       }
+ }
+@@ -1389,9 +1389,13 @@ static inline int audit_del_rule(struct audit_entry *entry,
+                               /* Put parent on the inotify un-registration
+                                * list.  Grab a reference before releasing
+                                * audit_filter_mutex, to be released in
+-                               * audit_inotify_unregister(). */
+-                              list_add(&parent->ilist, &inotify_list);
+-                              get_inotify_watch(&parent->wdata);
++                               * audit_inotify_unregister().
++                               * If filesystem is going away, just leave
++                               * the sucker alone, eviction will take
++                               * care of it.
++                               */
++                              if (pin_inotify_watch(&parent->wdata))
++                                      list_add(&parent->ilist, &inotify_list);
+                       }
+               }
+       }
+diff --git a/kernel/cgroup.c b/kernel/cgroup.c
+index d68bf2b..0ba3a5a 100644
+--- a/kernel/cgroup.c
++++ b/kernel/cgroup.c
+@@ -2045,10 +2045,13 @@ int cgroupstats_build(struct cgroupstats *stats, struct dentry *dentry)
+       struct cgroup *cgrp;
+       struct cgroup_iter it;
+       struct task_struct *tsk;
++
+       /*
+-       * Validate dentry by checking the superblock operations
++       * Validate dentry by checking the superblock operations,
++       * and make sure it's a directory.
+        */
+-      if (dentry->d_sb->s_op != &cgroup_ops)
++      if (dentry->d_sb->s_op != &cgroup_ops ||
++          !S_ISDIR(dentry->d_inode->i_mode))
+                goto err;
+       ret = 0;
+diff --git a/kernel/cpuset.c b/kernel/cpuset.c
+index 827cd9a..fbda85d 100644
+--- a/kernel/cpuset.c
++++ b/kernel/cpuset.c
+@@ -587,7 +587,6 @@ static int generate_sched_domains(cpumask_t **domains,
+       int ndoms;              /* number of sched domains in result */
+       int nslot;              /* next empty doms[] cpumask_t slot */
+-      ndoms = 0;
+       doms = NULL;
+       dattr = NULL;
+       csa = NULL;
+@@ -674,10 +673,8 @@ restart:
+        * Convert <csn, csa> to <ndoms, doms> and populate cpu masks.
+        */
+       doms = kmalloc(ndoms * sizeof(cpumask_t), GFP_KERNEL);
+-      if (!doms) {
+-              ndoms = 0;
++      if (!doms)
+               goto done;
+-      }
+       /*
+        * The rest of the code, including the scheduler, can deal with
+@@ -732,6 +729,13 @@ restart:
+ done:
+       kfree(csa);
++      /*
++       * Fallback to the default domain if kmalloc() failed.
++       * See comments in partition_sched_domains().
++       */
++      if (doms == NULL)
++              ndoms = 1;
++
+       *domains    = doms;
+       *attributes = dattr;
+       return ndoms;
+diff --git a/kernel/sched.c b/kernel/sched.c
+index ad1962d..a992cbe 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -7692,13 +7692,14 @@ static int dattrs_equal(struct sched_domain_attr *cur, int idx_cur,
+  *
+  * The passed in 'doms_new' should be kmalloc'd. This routine takes
+  * ownership of it and will kfree it when done with it. If the caller
+- * failed the kmalloc call, then it can pass in doms_new == NULL,
+- * and partition_sched_domains() will fallback to the single partition
+- * 'fallback_doms', it also forces the domains to be rebuilt.
++ * failed the kmalloc call, then it can pass in doms_new == NULL &&
++ * ndoms_new == 1, and partition_sched_domains() will fallback to
++ * the single partition 'fallback_doms', it also forces the domains
++ * to be rebuilt.
+  *
+- * If doms_new==NULL it will be replaced with cpu_online_map.
+- * ndoms_new==0 is a special case for destroying existing domains.
+- * It will not create the default domain.
++ * If doms_new == NULL it will be replaced with cpu_online_map.
++ * ndoms_new == 0 is a special case for destroying existing domains,
++ * and it will not create the default domain.
+  *
+  * Call with hotplug lock held
+  */
+diff --git a/kernel/sysctl.c b/kernel/sysctl.c
+index 50ec088..6ffbed2 100644
+--- a/kernel/sysctl.c
++++ b/kernel/sysctl.c
+@@ -179,6 +179,9 @@ extern struct ctl_table random_table[];
+ #ifdef CONFIG_INOTIFY_USER
+ extern struct ctl_table inotify_table[];
+ #endif
++#ifdef CONFIG_EPOLL
++extern struct ctl_table epoll_table[];
++#endif
+ #ifdef HAVE_ARCH_PICK_MMAP_LAYOUT
+ int sysctl_legacy_va_layout;
+@@ -1313,6 +1316,13 @@ static struct ctl_table fs_table[] = {
+               .child          = inotify_table,
+       },
+ #endif        
++#ifdef CONFIG_EPOLL
++      {
++              .procname       = "epoll",
++              .mode           = 0555,
++              .child          = epoll_table,
++      },
++#endif
+ #endif
+       {
+               .ctl_name       = KERN_SETUID_DUMPABLE,
+diff --git a/lib/idr.c b/lib/idr.c
+index e728c7f..7a785a0 100644
+--- a/lib/idr.c
++++ b/lib/idr.c
+@@ -185,6 +185,7 @@ static int sub_alloc(struct idr *idp, int *starting_id, struct idr_layer **pa)
+                       new = get_from_free_list(idp);
+                       if (!new)
+                               return -1;
++                      new->layer = l-1;
+                       rcu_assign_pointer(p->ary[m], new);
+                       p->count++;
+               }
+@@ -210,6 +211,7 @@ build_up:
+       if (unlikely(!p)) {
+               if (!(p = get_from_free_list(idp)))
+                       return -1;
++              p->layer = 0;
+               layers = 1;
+       }
+       /*
+@@ -237,6 +239,7 @@ build_up:
+               }
+               new->ary[0] = p;
+               new->count = 1;
++              new->layer = layers-1;
+               if (p->bitmap == IDR_FULL)
+                       __set_bit(0, &new->bitmap);
+               p = new;
+@@ -493,17 +496,21 @@ void *idr_find(struct idr *idp, int id)
+       int n;
+       struct idr_layer *p;
+-      n = idp->layers * IDR_BITS;
+       p = rcu_dereference(idp->top);
++      if (!p)
++              return NULL;
++      n = (p->layer+1) * IDR_BITS;
+       /* Mask off upper bits we don't use for the search. */
+       id &= MAX_ID_MASK;
+       if (id >= (1 << n))
+               return NULL;
++      BUG_ON(n == 0);
+       while (n > 0 && p) {
+               n -= IDR_BITS;
++              BUG_ON(n != p->layer*IDR_BITS);
+               p = rcu_dereference(p->ary[(id >> n) & IDR_MASK]);
+       }
+       return((void *)p);
+@@ -582,8 +589,11 @@ void *idr_replace(struct idr *idp, void *ptr, int id)
+       int n;
+       struct idr_layer *p, *old_p;
+-      n = idp->layers * IDR_BITS;
+       p = idp->top;
++      if (!p)
++              return ERR_PTR(-EINVAL);
++
++      n = (p->layer+1) * IDR_BITS;
+       id &= MAX_ID_MASK;
+diff --git a/lib/scatterlist.c b/lib/scatterlist.c
+index 8d2688f..b7b449d 100644
+--- a/lib/scatterlist.c
++++ b/lib/scatterlist.c
+@@ -395,7 +395,7 @@ void sg_miter_stop(struct sg_mapping_iter *miter)
+                       WARN_ON(!irqs_disabled());
+                       kunmap_atomic(miter->addr, KM_BIO_SRC_IRQ);
+               } else
+-                      kunmap(miter->addr);
++                      kunmap(miter->page);
+               miter->page = NULL;
+               miter->addr = NULL;
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index 8bde9bf..b0785ef 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -1341,6 +1341,7 @@ static int unix_dgram_sendmsg(struct kiocb *kiocb, struct socket *sock,
+       if (NULL == siocb->scm)
+               siocb->scm = &tmp_scm;
++      wait_for_unix_gc();
+       err = scm_send(sock, msg, siocb->scm);
+       if (err < 0)
+               return err;
+@@ -1491,6 +1492,7 @@ static int unix_stream_sendmsg(struct kiocb *kiocb, struct socket *sock,
+       if (NULL == siocb->scm)
+               siocb->scm = &tmp_scm;
++      wait_for_unix_gc();
+       err = scm_send(sock, msg, siocb->scm);
+       if (err < 0)
+               return err;
+diff --git a/net/unix/garbage.c b/net/unix/garbage.c
+index 6d4a9a8..abb3ab3 100644
+--- a/net/unix/garbage.c
++++ b/net/unix/garbage.c
+@@ -80,6 +80,7 @@
+ #include <linux/file.h>
+ #include <linux/proc_fs.h>
+ #include <linux/mutex.h>
++#include <linux/wait.h>
+ #include <net/sock.h>
+ #include <net/af_unix.h>
+@@ -91,6 +92,7 @@
+ static LIST_HEAD(gc_inflight_list);
+ static LIST_HEAD(gc_candidates);
+ static DEFINE_SPINLOCK(unix_gc_lock);
++static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait);
+ unsigned int unix_tot_inflight;
+@@ -266,12 +268,16 @@ static void inc_inflight_move_tail(struct unix_sock *u)
+               list_move_tail(&u->link, &gc_candidates);
+ }
+-/* The external entry point: unix_gc() */
++static bool gc_in_progress = false;
+-void unix_gc(void)
++void wait_for_unix_gc(void)
+ {
+-      static bool gc_in_progress = false;
++      wait_event(unix_gc_wait, gc_in_progress == false);
++}
++/* The external entry point: unix_gc() */
++void unix_gc(void)
++{
+       struct unix_sock *u;
+       struct unix_sock *next;
+       struct sk_buff_head hitlist;
+@@ -376,6 +382,7 @@ void unix_gc(void)
+       /* All candidates should have been detached by now. */
+       BUG_ON(!list_empty(&gc_candidates));
+       gc_in_progress = false;
++      wake_up(&unix_gc_wait);
+  out:
+       spin_unlock(&unix_gc_lock);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.8-9 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.8-9
new file mode 100644 (file)
index 0000000..425c3be
--- /dev/null
@@ -0,0 +1,3038 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.9
+
+Upstream 2.6.27.9 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Makefile b/Makefile
+index a629d7f..cb93e2b 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .8
++EXTRAVERSION = .9
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/powerpc/kernel/cpu_setup_44x.S b/arch/powerpc/kernel/cpu_setup_44x.S
+index 80cac98..f812452 100644
+--- a/arch/powerpc/kernel/cpu_setup_44x.S
++++ b/arch/powerpc/kernel/cpu_setup_44x.S
+@@ -35,6 +35,7 @@ _GLOBAL(__setup_cpu_440grx)
+ _GLOBAL(__setup_cpu_460ex)
+ _GLOBAL(__setup_cpu_460gt)
+       b       __init_fpu_44x
++_GLOBAL(__setup_cpu_440x5)
+ _GLOBAL(__setup_cpu_440gx)
+ _GLOBAL(__setup_cpu_440spe)
+       b       __fixup_440A_mcheck
+diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c
+index 25c273c..2b88cae 100644
+--- a/arch/powerpc/kernel/cputable.c
++++ b/arch/powerpc/kernel/cputable.c
+@@ -39,6 +39,7 @@ extern void __setup_cpu_440epx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440gx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440grx(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_440spe(unsigned long offset, struct cpu_spec* spec);
++extern void __setup_cpu_440x5(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_460ex(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_460gt(unsigned long offset, struct cpu_spec* spec);
+ extern void __setup_cpu_603(unsigned long offset, struct cpu_spec* spec);
+@@ -1463,6 +1464,8 @@ static struct cpu_spec __initdata cpu_specs[] = {
+               .cpu_user_features      = COMMON_USER_BOOKE,
+               .icache_bsize           = 32,
+               .dcache_bsize           = 32,
++              .cpu_setup              = __setup_cpu_440x5,
++              .machine_check          = machine_check_440A,
+               .platform               = "ppc440",
+       },
+       { /* 460EX */
+diff --git a/arch/powerpc/platforms/cell/smp.c b/arch/powerpc/platforms/cell/smp.c
+index efb3964..c0d86e1 100644
+--- a/arch/powerpc/platforms/cell/smp.c
++++ b/arch/powerpc/platforms/cell/smp.c
+@@ -54,8 +54,8 @@
+ #endif
+ /*
+- * The primary thread of each non-boot processor is recorded here before
+- * smp init.
++ * The Primary thread of each non-boot processor was started from the OF client
++ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
+  */
+ static cpumask_t of_spin_map;
+@@ -208,11 +208,7 @@ void __init smp_init_cell(void)
+       /* Mark threads which are still spinning in hold loops. */
+       if (cpu_has_feature(CPU_FTR_SMT)) {
+               for_each_present_cpu(i) {
+-                      if (i % 2 == 0)
+-                              /*
+-                               * Even-numbered logical cpus correspond to
+-                               * primary threads.
+-                               */
++                      if (cpu_thread_in_core(i) == 0)
+                               cpu_set(i, of_spin_map);
+               }
+       } else {
+diff --git a/arch/powerpc/platforms/pseries/smp.c b/arch/powerpc/platforms/pseries/smp.c
+index 9d8f8c8..c9337c7 100644
+--- a/arch/powerpc/platforms/pseries/smp.c
++++ b/arch/powerpc/platforms/pseries/smp.c
+@@ -52,8 +52,8 @@
+ /*
+- * The primary thread of each non-boot processor is recorded here before
+- * smp init.
++ * The Primary thread of each non-boot processor was started from the OF client
++ * interface by prom_hold_cpus and is spinning on secondary_hold_spinloop.
+  */
+ static cpumask_t of_spin_map;
+@@ -191,8 +191,7 @@ static void __devinit smp_pSeries_kick_cpu(int nr)
+ static int smp_pSeries_cpu_bootable(unsigned int nr)
+ {
+       /* Special case - we inhibit secondary thread startup
+-       * during boot if the user requests it.  Odd-numbered
+-       * cpus are assumed to be secondary threads.
++       * during boot if the user requests it.
+        */
+       if (system_state < SYSTEM_RUNNING &&
+           cpu_has_feature(CPU_FTR_SMT) &&
+@@ -229,11 +228,7 @@ static void __init smp_init_pseries(void)
+       /* Mark threads which are still spinning in hold loops. */
+       if (cpu_has_feature(CPU_FTR_SMT)) {
+               for_each_present_cpu(i) { 
+-                      if (i % 2 == 0)
+-                              /*
+-                               * Even-numbered logical cpus correspond to
+-                               * primary threads.
+-                               */
++                      if (cpu_thread_in_core(i) == 0)
+                               cpu_set(i, of_spin_map);
+               }
+       } else {
+diff --git a/arch/powerpc/sysdev/mpic.c b/arch/powerpc/sysdev/mpic.c
+index f6299cc..b24e1d0 100644
+--- a/arch/powerpc/sysdev/mpic.c
++++ b/arch/powerpc/sysdev/mpic.c
+@@ -1271,6 +1271,7 @@ void __init mpic_set_default_senses(struct mpic *mpic, u8 *senses, int count)
+ void __init mpic_init(struct mpic *mpic)
+ {
+       int i;
++      int cpu;
+       BUG_ON(mpic->num_sources == 0);
+@@ -1313,6 +1314,11 @@ void __init mpic_init(struct mpic *mpic)
+       mpic_pasemi_msi_init(mpic);
++      if (mpic->flags & MPIC_PRIMARY)
++              cpu = hard_smp_processor_id();
++      else
++              cpu = 0;
++
+       for (i = 0; i < mpic->num_sources; i++) {
+               /* start with vector = source number, and masked */
+               u32 vecpri = MPIC_VECPRI_MASK | i |
+@@ -1323,8 +1329,7 @@ void __init mpic_init(struct mpic *mpic)
+                       continue;
+               /* init hw */
+               mpic_irq_write(i, MPIC_INFO(IRQ_VECTOR_PRI), vecpri);
+-              mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION),
+-                             1 << hard_smp_processor_id());
++              mpic_irq_write(i, MPIC_INFO(IRQ_DESTINATION), 1 << cpu);
+       }
+       
+       /* Init spurious vector */
+diff --git a/arch/sparc/include/asm/uaccess_64.h b/arch/sparc/include/asm/uaccess_64.h
+index 296ef30..c64e767 100644
+--- a/arch/sparc/include/asm/uaccess_64.h
++++ b/arch/sparc/include/asm/uaccess_64.h
+@@ -265,8 +265,8 @@ extern long __strnlen_user(const char __user *, long len);
+ #define strlen_user __strlen_user
+ #define strnlen_user __strnlen_user
+-#define __copy_to_user_inatomic __copy_to_user
+-#define __copy_from_user_inatomic __copy_from_user
++#define __copy_to_user_inatomic ___copy_to_user
++#define __copy_from_user_inatomic ___copy_from_user
+ #endif  /* __ASSEMBLY__ */
+diff --git a/arch/sparc64/kernel/pci.c b/arch/sparc64/kernel/pci.c
+index 80dad76..83b4725 100644
+--- a/arch/sparc64/kernel/pci.c
++++ b/arch/sparc64/kernel/pci.c
+@@ -1017,6 +1017,7 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
+       for (i = 0; i <= PCI_ROM_RESOURCE; i++) {
+               struct resource *rp = &pdev->resource[i];
++              resource_size_t aligned_end;
+               /* Active? */
+               if (!rp->flags)
+@@ -1034,8 +1035,15 @@ static int __pci_mmap_make_offset(struct pci_dev *pdev,
+                               continue;
+               }
++              /* Align the resource end to the next page address.
++               * PAGE_SIZE intentionally added instead of (PAGE_SIZE - 1),
++               * because actually we need the address of the next byte
++               * after rp->end.
++               */
++              aligned_end = (rp->end + PAGE_SIZE) & PAGE_MASK;
++
+               if ((rp->start <= user_paddr) &&
+-                  (user_paddr + user_size) <= (rp->end + 1UL))
++                  (user_paddr + user_size) <= aligned_end)
+                       break;
+       }
+diff --git a/arch/sparc64/kernel/ptrace.c b/arch/sparc64/kernel/ptrace.c
+index 10306e4..2df5b9b 100644
+--- a/arch/sparc64/kernel/ptrace.c
++++ b/arch/sparc64/kernel/ptrace.c
+@@ -1014,7 +1014,7 @@ long arch_ptrace(struct task_struct *child, long request, long addr, long data)
+               break;
+       case PTRACE_SETFPREGS64:
+-              ret = copy_regset_to_user(child, view, REGSET_FP,
++              ret = copy_regset_from_user(child, view, REGSET_FP,
+                                         0 * sizeof(u64),
+                                         33 * sizeof(u64),
+                                         fps);
+diff --git a/arch/sparc64/kernel/visemul.c b/arch/sparc64/kernel/visemul.c
+index c3fd647..a4428fd 100644
+--- a/arch/sparc64/kernel/visemul.c
++++ b/arch/sparc64/kernel/visemul.c
+@@ -131,7 +131,7 @@
+ #define VIS_OPF_SHIFT 5
+ #define VIS_OPF_MASK  (0x1ff << VIS_OPF_SHIFT)
+-#define RS1(INSN)     (((INSN) >> 24) & 0x1f)
++#define RS1(INSN)     (((INSN) >> 14) & 0x1f)
+ #define RS2(INSN)     (((INSN) >>  0) & 0x1f)
+ #define RD(INSN)      (((INSN) >> 25) & 0x1f)
+@@ -445,7 +445,7 @@ static void pdist(struct pt_regs *regs, unsigned int insn)
+       unsigned long i;
+       rs1 = fpd_regval(f, RS1(insn));
+-      rs2 = fpd_regval(f, RS1(insn));
++      rs2 = fpd_regval(f, RS2(insn));
+       rd = fpd_regaddr(f, RD(insn));
+       rd_val = *rd;
+@@ -807,6 +807,8 @@ int vis_emul(struct pt_regs *regs, unsigned int insn)
+       if (get_user(insn, (u32 __user *) pc))
+               return -EFAULT;
++      save_and_clear_fpu();
++
+       opf = (insn & VIS_OPF_MASK) >> VIS_OPF_SHIFT;
+       switch (opf) {
+       default:
+diff --git a/arch/sparc64/lib/user_fixup.c b/arch/sparc64/lib/user_fixup.c
+index 19d1fdb..05a361b 100644
+--- a/arch/sparc64/lib/user_fixup.c
++++ b/arch/sparc64/lib/user_fixup.c
+@@ -24,7 +24,7 @@ static unsigned long compute_size(unsigned long start, unsigned long size, unsig
+       if (fault_addr < start || fault_addr >= end) {
+               *offset = 0;
+       } else {
+-              *offset = start - fault_addr;
++              *offset = fault_addr - start;
+               size = end - fault_addr;
+       }
+       return size;
+diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
+index 19d579d..8f44ebb 100644
+--- a/arch/um/drivers/mconsole_kern.c
++++ b/arch/um/drivers/mconsole_kern.c
+@@ -16,6 +16,8 @@
+ #include <linux/slab.h>
+ #include <linux/syscalls.h>
+ #include <linux/utsname.h>
++#include <linux/socket.h>
++#include <linux/un.h>
+ #include <linux/workqueue.h>
+ #include <linux/mutex.h>
+ #include <asm/uaccess.h>
+@@ -785,7 +787,7 @@ static int __init mconsole_init(void)
+       /* long to avoid size mismatch warnings from gcc */
+       long sock;
+       int err;
+-      char file[256];
++      char file[UNIX_PATH_MAX];
+       if (umid_file_name("mconsole", file, sizeof(file)))
+               return -1;
+diff --git a/arch/x86/kernel/hpet.c b/arch/x86/kernel/hpet.c
+index 73deaff..759e8da 100644
+--- a/arch/x86/kernel/hpet.c
++++ b/arch/x86/kernel/hpet.c
+@@ -283,7 +283,7 @@ static int hpet_legacy_next_event(unsigned long delta,
+        * what we wrote hit the chip before we compare it to the
+        * counter.
+        */
+-      WARN_ON((u32)hpet_readl(HPET_T0_CMP) != cnt);
++      WARN_ON_ONCE((u32)hpet_readl(HPET_T0_CMP) != cnt);
+       return (s32)((u32)hpet_readl(HPET_COUNTER) - cnt) >= 0 ? -ETIME : 0;
+ }
+diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
+index d3746ef..1adbb3e 100644
+--- a/arch/x86/mm/init_64.c
++++ b/arch/x86/mm/init_64.c
+@@ -721,12 +721,12 @@ int arch_add_memory(int nid, u64 start, u64 size)
+       unsigned long nr_pages = size >> PAGE_SHIFT;
+       int ret;
+-      last_mapped_pfn = init_memory_mapping(start, start + size-1);
++      last_mapped_pfn = init_memory_mapping(start, start + size);
+       if (last_mapped_pfn > max_pfn_mapped)
+               max_pfn_mapped = last_mapped_pfn;
+       ret = __add_pages(zone, start_pfn, nr_pages);
+-      WARN_ON(1);
++      WARN_ON_ONCE(ret);
+       return ret;
+ }
+diff --git a/block/bsg.c b/block/bsg.c
+index 0aae8d7..9cfbea8 100644
+--- a/block/bsg.c
++++ b/block/bsg.c
+@@ -202,6 +202,8 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq,
+               rq->timeout = q->sg_timeout;
+       if (!rq->timeout)
+               rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
++      if (rq->timeout < BLK_MIN_SG_TIMEOUT)
++              rq->timeout = BLK_MIN_SG_TIMEOUT;
+       return 0;
+ }
+diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
+index ec4b7f2..dd3281a 100644
+--- a/block/scsi_ioctl.c
++++ b/block/scsi_ioctl.c
+@@ -208,6 +208,8 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq,
+               rq->timeout = q->sg_timeout;
+       if (!rq->timeout)
+               rq->timeout = BLK_DEFAULT_SG_TIMEOUT;
++      if (rq->timeout < BLK_MIN_SG_TIMEOUT)
++              rq->timeout = BLK_MIN_SG_TIMEOUT;
+       return 0;
+ }
+diff --git a/drivers/acpi/osl.c b/drivers/acpi/osl.c
+index 235a138..b0d40aa 100644
+--- a/drivers/acpi/osl.c
++++ b/drivers/acpi/osl.c
+@@ -1261,34 +1261,6 @@ acpi_status acpi_os_release_object(acpi_cache_t * cache, void *object)
+       return (AE_OK);
+ }
+-/**
+- *    acpi_dmi_dump - dump DMI slots needed for blacklist entry
+- *
+- *    Returns 0 on success
+- */
+-static int acpi_dmi_dump(void)
+-{
+-
+-      if (!dmi_available)
+-              return -1;
+-
+-      printk(KERN_NOTICE PREFIX "DMI System Vendor: %s\n",
+-              dmi_get_system_info(DMI_SYS_VENDOR));
+-      printk(KERN_NOTICE PREFIX "DMI Product Name: %s\n",
+-              dmi_get_system_info(DMI_PRODUCT_NAME));
+-      printk(KERN_NOTICE PREFIX "DMI Product Version: %s\n",
+-              dmi_get_system_info(DMI_PRODUCT_VERSION));
+-      printk(KERN_NOTICE PREFIX "DMI Board Name: %s\n",
+-              dmi_get_system_info(DMI_BOARD_NAME));
+-      printk(KERN_NOTICE PREFIX "DMI BIOS Vendor: %s\n",
+-              dmi_get_system_info(DMI_BIOS_VENDOR));
+-      printk(KERN_NOTICE PREFIX "DMI BIOS Date: %s\n",
+-              dmi_get_system_info(DMI_BIOS_DATE));
+-
+-      return 0;
+-}
+-
+-
+ /******************************************************************************
+  *
+  * FUNCTION:    acpi_os_validate_interface
+@@ -1315,14 +1287,6 @@ acpi_os_validate_interface (char *interface)
+                       osi_linux.cmdline ? " via cmdline" :
+                       osi_linux.dmi ? " via DMI" : "");
+-              if (!osi_linux.dmi) {
+-                      if (acpi_dmi_dump())
+-                              printk(KERN_NOTICE PREFIX
+-                                      "[please extract dmidecode output]\n");
+-                      printk(KERN_NOTICE PREFIX
+-                              "Please send DMI info above to "
+-                              "linux-acpi@vger.kernel.org\n");
+-              }
+               if (!osi_linux.known && !osi_linux.cmdline) {
+                       printk(KERN_NOTICE PREFIX
+                               "If \"acpi_osi=%sLinux\" works better, "
+diff --git a/drivers/acpi/sleep/main.c b/drivers/acpi/sleep/main.c
+index 4751909..3706469 100644
+--- a/drivers/acpi/sleep/main.c
++++ b/drivers/acpi/sleep/main.c
+@@ -60,6 +60,18 @@ void __init acpi_old_suspend_ordering(void)
+       old_suspend_ordering = true;
+ }
++/*
++ * According to the ACPI specification the BIOS should make sure that ACPI is
++ * enabled and SCI_EN bit is set on wake-up from S1 - S3 sleep states.  Still,
++ * some BIOSes don't do that and therefore we use acpi_enable() to enable ACPI
++ * on such systems during resume.  Unfortunately that doesn't help in
++ * particularly pathological cases in which SCI_EN has to be set directly on
++ * resume, although the specification states very clearly that this flag is
++ * owned by the hardware.  The set_sci_en_on_resume variable will be set in such
++ * cases.
++ */
++static bool set_sci_en_on_resume;
++
+ /**
+  *    acpi_pm_disable_gpes - Disable the GPEs.
+  */
+@@ -201,7 +213,11 @@ static int acpi_suspend_enter(suspend_state_t pm_state)
+       }
+       /* If ACPI is not enabled by the BIOS, we need to enable it here. */
+-      acpi_enable();
++      if (set_sci_en_on_resume)
++              acpi_set_register(ACPI_BITREG_SCI_ENABLE, 1);
++      else
++              acpi_enable();
++
+       /* Reprogram control registers and execute _BFS */
+       acpi_leave_sleep_state_prep(acpi_state);
+@@ -289,6 +305,12 @@ static int __init init_old_suspend_ordering(const struct dmi_system_id *d)
+       return 0;
+ }
++static int __init init_set_sci_en_on_resume(const struct dmi_system_id *d)
++{
++      set_sci_en_on_resume = true;
++      return 0;
++}
++
+ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+       {
+       .callback = init_old_suspend_ordering,
+@@ -306,6 +328,22 @@ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+               DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
+               },
+       },
++      {
++      .callback = init_set_sci_en_on_resume,
++      .ident = "Apple MacBook 1,1",
++      .matches = {
++              DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
++              DMI_MATCH(DMI_PRODUCT_NAME, "MacBook1,1"),
++              },
++      },
++      {
++      .callback = init_set_sci_en_on_resume,
++      .ident = "Apple MacMini 1,1",
++      .matches = {
++              DMI_MATCH(DMI_SYS_VENDOR, "Apple Computer, Inc."),
++              DMI_MATCH(DMI_PRODUCT_NAME, "Macmini1,1"),
++              },
++      },
+       {},
+ };
+ #endif /* CONFIG_SUSPEND */
+diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
+index 2a4c516..bb26a26 100644
+--- a/drivers/ata/libata-sff.c
++++ b/drivers/ata/libata-sff.c
+@@ -1227,10 +1227,19 @@ fsm_start:
+                       /* ATA PIO protocol */
+                       if (unlikely((status & ATA_DRQ) == 0)) {
+                               /* handle BSY=0, DRQ=0 as error */
+-                              if (likely(status & (ATA_ERR | ATA_DF)))
++                              if (likely(status & (ATA_ERR | ATA_DF))) {
+                                       /* device stops HSM for abort/error */
+                                       qc->err_mask |= AC_ERR_DEV;
+-                              else {
++
++                                      /* If diagnostic failed and this is
++                                       * IDENTIFY, it's likely a phantom
++                                       * device.  Mark hint.
++                                       */
++                                      if (qc->dev->horkage &
++                                          ATA_HORKAGE_DIAGNOSTIC)
++                                              qc->err_mask |=
++                                                      AC_ERR_NODEV_HINT;
++                              } else {
+                                       /* HSM violation. Let EH handle this.
+                                        * Phantom devices also trigger this
+                                        * condition.  Mark hint.
+diff --git a/drivers/char/applicom.c b/drivers/char/applicom.c
+index 31d08b6..b899d91 100644
+--- a/drivers/char/applicom.c
++++ b/drivers/char/applicom.c
+@@ -712,8 +712,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
+       
+       IndexCard = adgl->num_card-1;
+        
+-      if(cmd != 0 && cmd != 6 &&
+-         ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
++      if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
+               static int warncount = 10;
+               if (warncount) {
+                       printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1);
+@@ -832,8 +831,7 @@ static int ac_ioctl(struct inode *inode, struct file *file, unsigned int cmd, un
+               }
+               break;
+       default:
+-              printk(KERN_INFO "APPLICOM driver ioctl, unknown function code %d\n",cmd) ;
+-              ret = -EINVAL;
++              ret = -ENOTTY;
+               break;
+       }
+       Dummy = readb(apbs[IndexCard].RamIO + VERS);
+diff --git a/drivers/edac/cell_edac.c b/drivers/edac/cell_edac.c
+index 887072f..cd2e3b8 100644
+--- a/drivers/edac/cell_edac.c
++++ b/drivers/edac/cell_edac.c
+@@ -9,6 +9,7 @@
+  */
+ #undef DEBUG
++#include <linux/edac.h>
+ #include <linux/module.h>
+ #include <linux/init.h>
+ #include <linux/platform_device.h>
+@@ -164,6 +165,8 @@ static int __devinit cell_edac_probe(struct platform_device *pdev)
+       if (regs == NULL)
+               return -ENODEV;
++      edac_op_state = EDAC_OPSTATE_POLL;
++
+       /* Get channel population */
+       reg = in_be64(&regs->mic_mnt_cfg);
+       dev_dbg(&pdev->dev, "MIC_MNT_CFG = 0x%016lx\n", reg);
+diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c
+index 49144cb..e87956a 100644
+--- a/drivers/hid/usbhid/hid-quirks.c
++++ b/drivers/hid/usbhid/hid-quirks.c
+@@ -83,6 +83,7 @@
+ #define USB_DEVICE_ID_APPLE_WELLSPRING2_JIS   0x0232
+ #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY  0x030a
+ #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY   0x030b
++#define USB_DEVICE_ID_APPLE_ATV_IRCONTROL     0x8241
+ #define USB_DEVICE_ID_APPLE_IRCONTROL4        0x8242
+ #define USB_VENDOR_ID_ASUS            0x0b05
+@@ -458,6 +459,7 @@ static const struct hid_blacklist {
+       { USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016, HID_QUIRK_FULLSPEED_INTERVAL },
+       { USB_VENDOR_ID_BELKIN, USB_DEVICE_ID_FLIP_KVM, HID_QUIRK_HIDDEV },
++      { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_ATV_IRCONTROL, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+       { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IRCONTROL4, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+       { USB_VENDOR_ID_SAMSUNG, USB_DEVICE_ID_SAMSUNG_IR_REMOTE, HID_QUIRK_HIDDEV | HID_QUIRK_IGNORE_HIDINPUT },
+       { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_SIDEWINDER_GV, HID_QUIRK_HIDINPUT },
+diff --git a/drivers/input/serio/i8042-x86ia64io.h b/drivers/input/serio/i8042-x86ia64io.h
+index 5aafe24..29e6863 100644
+--- a/drivers/input/serio/i8042-x86ia64io.h
++++ b/drivers/input/serio/i8042-x86ia64io.h
+@@ -135,6 +135,14 @@ static struct dmi_system_id __initdata i8042_dmi_noloop_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_VERSION, "5a"),
+               },
+       },
++      {
++              .ident = "Blue FB5601",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "blue"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "FB5601"),
++                      DMI_MATCH(DMI_PRODUCT_VERSION, "M606"),
++              },
++      },
+       { }
+ };
+@@ -322,6 +330,27 @@ static struct dmi_system_id __initdata i8042_dmi_nomux_table[] = {
+                       DMI_MATCH(DMI_PRODUCT_NAME, "N34AS6"),
+               },
+       },
++      {
++              .ident = "IBM 2656",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "2656"),
++              },
++      },
++      {
++              .ident = "Dell XPS M1530",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "XPS M1530"),
++              },
++      },
++      {
++              .ident = "Compal HEL80I",
++              .matches = {
++                      DMI_MATCH(DMI_SYS_VENDOR, "COMPAL"),
++                      DMI_MATCH(DMI_PRODUCT_NAME, "HEL80I"),
++              },
++      },
+       { }
+ };
+diff --git a/drivers/net/cxgb3/adapter.h b/drivers/net/cxgb3/adapter.h
+index 2711404..b1a694b 100644
+--- a/drivers/net/cxgb3/adapter.h
++++ b/drivers/net/cxgb3/adapter.h
+@@ -285,6 +285,7 @@ void t3_os_link_changed(struct adapter *adapter, int port_id, int link_status,
+ void t3_sge_start(struct adapter *adap);
+ void t3_sge_stop(struct adapter *adap);
++void t3_stop_sge_timers(struct adapter *adap);
+ void t3_free_sge_resources(struct adapter *adap);
+ void t3_sge_err_intr_handler(struct adapter *adapter);
+ irq_handler_t t3_intr_handler(struct adapter *adap, int polling);
+diff --git a/drivers/net/cxgb3/cxgb3_main.c b/drivers/net/cxgb3/cxgb3_main.c
+index 5447f3e..d355c82 100644
+--- a/drivers/net/cxgb3/cxgb3_main.c
++++ b/drivers/net/cxgb3/cxgb3_main.c
+@@ -479,6 +479,7 @@ static int setup_sge_qsets(struct adapter *adap)
+                                                            irq_idx,
+                               &adap->params.sge.qset[qset_idx], ntxq, dev);
+                       if (err) {
++                              t3_stop_sge_timers(adap);
+                               t3_free_sge_resources(adap);
+                               return err;
+                       }
+@@ -2449,6 +2450,9 @@ static pci_ers_result_t t3_io_error_detected(struct pci_dev *pdev,
+           test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map))
+               offload_close(&adapter->tdev);
++      /* Stop SGE timers */
++      t3_stop_sge_timers(adapter);
++
+       adapter->flags &= ~FULL_INIT_DONE;
+       pci_disable_device(pdev);
+@@ -2801,6 +2805,7 @@ static void __devexit remove_one(struct pci_dev *pdev)
+                   if (test_bit(i, &adapter->registered_device_map))
+                       unregister_netdev(adapter->port[i]);
++              t3_stop_sge_timers(adapter);
+               t3_free_sge_resources(adapter);
+               cxgb_disable_msi(adapter);
+diff --git a/drivers/net/cxgb3/sge.c b/drivers/net/cxgb3/sge.c
+index 1b0861d..52f4138 100644
+--- a/drivers/net/cxgb3/sge.c
++++ b/drivers/net/cxgb3/sge.c
+@@ -603,9 +603,6 @@ static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
+       int i;
+       struct pci_dev *pdev = adapter->pdev;
+-      if (q->tx_reclaim_timer.function)
+-              del_timer_sync(&q->tx_reclaim_timer);
+-
+       for (i = 0; i < SGE_RXQ_PER_SET; ++i)
+               if (q->fl[i].desc) {
+                       spin_lock_irq(&adapter->sge.reg_lock);
+@@ -1937,38 +1934,6 @@ static inline int lro_frame_ok(const struct cpl_rx_pkt *p)
+               eh->h_proto == htons(ETH_P_IP) && ih->ihl == (sizeof(*ih) >> 2);
+ }
+-#define TCP_FLAG_MASK (TCP_FLAG_CWR | TCP_FLAG_ECE | TCP_FLAG_URG |\
+-                       TCP_FLAG_ACK | TCP_FLAG_PSH | TCP_FLAG_RST |\
+-                                     TCP_FLAG_SYN | TCP_FLAG_FIN)
+-#define TSTAMP_WORD ((TCPOPT_NOP << 24) | (TCPOPT_NOP << 16) |\
+-                     (TCPOPT_TIMESTAMP << 8) | TCPOLEN_TIMESTAMP)
+-
+-/**
+- *    lro_segment_ok - check if a TCP segment is eligible for LRO
+- *    @tcph: the TCP header of the packet
+- *
+- *    Returns true if a TCP packet is eligible for LRO.  This requires that
+- *    the packet have only the ACK flag set and no TCP options besides
+- *    time stamps.
+- */
+-static inline int lro_segment_ok(const struct tcphdr *tcph)
+-{
+-      int optlen;
+-
+-      if (unlikely((tcp_flag_word(tcph) & TCP_FLAG_MASK) != TCP_FLAG_ACK))
+-              return 0;
+-
+-      optlen = (tcph->doff << 2) - sizeof(*tcph);
+-      if (optlen) {
+-              const u32 *opt = (const u32 *)(tcph + 1);
+-
+-              if (optlen != TCPOLEN_TSTAMP_ALIGNED ||
+-                  *opt != htonl(TSTAMP_WORD) || !opt[2])
+-                      return 0;
+-      }
+-      return 1;
+-}
+-
+ static int t3_get_lro_header(void **eh,  void **iph, void **tcph,
+                            u64 *hdr_flags, void *priv)
+ {
+@@ -1981,9 +1946,6 @@ static int t3_get_lro_header(void **eh,  void **iph, void **tcph,
+       *iph = (struct iphdr *)((struct ethhdr *)*eh + 1);
+       *tcph = (struct tcphdr *)((struct iphdr *)*iph + 1);
+-       if (!lro_segment_ok(*tcph))
+-              return -1;
+-
+       *hdr_flags = LRO_IPV4 | LRO_TCP;
+       return 0;
+ }
+@@ -3043,6 +3005,24 @@ err:
+ }
+ /**
++ *    t3_stop_sge_timers - stop SGE timer call backs
++ *    @adap: the adapter
++ *
++ *    Stops each SGE queue set's timer call back
++ */
++void t3_stop_sge_timers(struct adapter *adap)
++{
++      int i;
++
++      for (i = 0; i < SGE_QSETS; ++i) {
++              struct sge_qset *q = &adap->sge.qs[i];
++
++              if (q->tx_reclaim_timer.function)
++                      del_timer_sync(&q->tx_reclaim_timer);
++      }
++}
++
++/**
+  *    t3_free_sge_resources - free SGE resources
+  *    @adap: the adapter
+  *
+diff --git a/drivers/net/niu.c b/drivers/net/niu.c
+index e3be81e..6f9809e 100644
+--- a/drivers/net/niu.c
++++ b/drivers/net/niu.c
+@@ -51,8 +51,7 @@ MODULE_VERSION(DRV_MODULE_VERSION);
+ #ifndef readq
+ static u64 readq(void __iomem *reg)
+ {
+-      return (((u64)readl(reg + 0x4UL) << 32) |
+-              (u64)readl(reg));
++      return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
+ }
+ static void writeq(u64 val, void __iomem *reg)
+diff --git a/drivers/net/pppol2tp.c b/drivers/net/pppol2tp.c
+index ff175e8..de80ba4 100644
+--- a/drivers/net/pppol2tp.c
++++ b/drivers/net/pppol2tp.c
+@@ -1353,6 +1353,7 @@ static int pppol2tp_release(struct socket *sock)
+                       kfree_skb(skb);
+                       sock_put(sk);
+               }
++              sock_put(sk);
+       }
+       release_sock(sk);
+diff --git a/drivers/pci/pcie/aspm.c b/drivers/pci/pcie/aspm.c
+index 851f5b8..aa6fda1 100644
+--- a/drivers/pci/pcie/aspm.c
++++ b/drivers/pci/pcie/aspm.c
+@@ -16,6 +16,7 @@
+ #include <linux/pm.h>
+ #include <linux/init.h>
+ #include <linux/slab.h>
++#include <linux/jiffies.h>
+ #include <linux/pci-aspm.h>
+ #include "../pci.h"
+@@ -161,11 +162,12 @@ static void pcie_check_clock_pm(struct pci_dev *pdev)
+  */
+ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+ {
+-      int pos, child_pos;
++      int pos, child_pos, i = 0;
+       u16 reg16 = 0;
+       struct pci_dev *child_dev;
+       int same_clock = 1;
+-
++      unsigned long start_jiffies;
++      u16 child_regs[8], parent_reg;
+       /*
+        * all functions of a slot should have the same Slot Clock
+        * Configuration, so just check one function
+@@ -191,16 +193,19 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+               child_pos = pci_find_capability(child_dev, PCI_CAP_ID_EXP);
+               pci_read_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
+                       &reg16);
++              child_regs[i] = reg16;
+               if (same_clock)
+                       reg16 |= PCI_EXP_LNKCTL_CCC;
+               else
+                       reg16 &= ~PCI_EXP_LNKCTL_CCC;
+               pci_write_config_word(child_dev, child_pos + PCI_EXP_LNKCTL,
+                       reg16);
++              i++;
+       }
+       /* Configure upstream component */
+       pci_read_config_word(pdev, pos + PCI_EXP_LNKCTL, &reg16);
++      parent_reg = reg16;
+       if (same_clock)
+               reg16 |= PCI_EXP_LNKCTL_CCC;
+       else
+@@ -212,12 +217,30 @@ static void pcie_aspm_configure_common_clock(struct pci_dev *pdev)
+       pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, reg16);
+       /* Wait for link training end */
+-      while (1) {
++      /* break out after waiting for 1 second */
++      start_jiffies = jiffies;
++      while ((jiffies - start_jiffies) < HZ) {
+               pci_read_config_word(pdev, pos + PCI_EXP_LNKSTA, &reg16);
+               if (!(reg16 & PCI_EXP_LNKSTA_LT))
+                       break;
+               cpu_relax();
+       }
++      /* training failed -> recover */
++      if ((jiffies - start_jiffies) >= HZ) {
++              dev_printk (KERN_ERR, &pdev->dev, "ASPM: Could not configure"
++                          " common clock\n");
++              i = 0;
++              list_for_each_entry(child_dev, &pdev->subordinate->devices,
++                                  bus_list) {
++                      child_pos = pci_find_capability(child_dev,
++                                                      PCI_CAP_ID_EXP);
++                      pci_write_config_word(child_dev,
++                                            child_pos + PCI_EXP_LNKCTL,
++                                            child_regs[i]);
++                      i++;
++              }
++              pci_write_config_word(pdev, pos + PCI_EXP_LNKCTL, parent_reg);
++      }
+ }
+ /*
+diff --git a/drivers/pci/slot.c b/drivers/pci/slot.c
+index b703b09..e423fd9 100644
+--- a/drivers/pci/slot.c
++++ b/drivers/pci/slot.c
+@@ -243,6 +243,7 @@ placeholder:
+                __func__, pci_domain_nr(parent), parent->number, slot_nr);
+ out:
++      kfree(slot_name);
+       up_write(&pci_bus_sem);
+       return slot;
+ err:
+diff --git a/drivers/pnp/base.h b/drivers/pnp/base.h
+index 9fd7bb9..7cc7bf5 100644
+--- a/drivers/pnp/base.h
++++ b/drivers/pnp/base.h
+@@ -147,7 +147,7 @@ char *pnp_resource_type_name(struct resource *res);
+ void dbg_pnp_show_resources(struct pnp_dev *dev, char *desc);
+ void pnp_free_resources(struct pnp_dev *dev);
+-int pnp_resource_type(struct resource *res);
++unsigned long pnp_resource_type(struct resource *res);
+ struct pnp_resource {
+       struct list_head list;
+diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
+index 0bdf9b8..d15e2b7 100644
+--- a/drivers/pnp/quirks.c
++++ b/drivers/pnp/quirks.c
+@@ -245,7 +245,7 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
+        */
+       for_each_pci_dev(pdev) {
+               for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
+-                      unsigned int type;
++                      unsigned long type;
+                       type = pci_resource_flags(pdev, i) &
+                                       (IORESOURCE_IO | IORESOURCE_MEM);
+diff --git a/drivers/pnp/resource.c b/drivers/pnp/resource.c
+index 4cfe3a1..dbae23a 100644
+--- a/drivers/pnp/resource.c
++++ b/drivers/pnp/resource.c
+@@ -467,14 +467,14 @@ int pnp_check_dma(struct pnp_dev *dev, struct resource *res)
+ #endif
+ }
+-int pnp_resource_type(struct resource *res)
++unsigned long pnp_resource_type(struct resource *res)
+ {
+       return res->flags & (IORESOURCE_IO  | IORESOURCE_MEM |
+                            IORESOURCE_IRQ | IORESOURCE_DMA);
+ }
+ struct resource *pnp_get_resource(struct pnp_dev *dev,
+-                                unsigned int type, unsigned int num)
++                                unsigned long type, unsigned int num)
+ {
+       struct pnp_resource *pnp_res;
+       struct resource *res;
+diff --git a/drivers/spi/spidev.c b/drivers/spi/spidev.c
+index e5e0cfe..bdc4d4e 100644
+--- a/drivers/spi/spidev.c
++++ b/drivers/spi/spidev.c
+@@ -598,7 +598,9 @@ static int spidev_probe(struct spi_device *spi)
+       }
+       mutex_unlock(&device_list_lock);
+-      if (status != 0)
++      if (status == 0)
++              spi_set_drvdata(spi, spidev);
++      else
+               kfree(spidev);
+       return status;
+diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c
+index 73f8277..b205311 100644
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -79,38 +79,36 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define OPTION_PRODUCT_VIPER                  0x6600
+ #define OPTION_PRODUCT_VIPER_BUS              0x6601
+ #define OPTION_PRODUCT_GT_MAX_READY           0x6701
+-#define OPTION_PRODUCT_GT_MAX                 0x6711
+ #define OPTION_PRODUCT_FUJI_MODEM_LIGHT               0x6721
+ #define OPTION_PRODUCT_FUJI_MODEM_GT          0x6741
+ #define OPTION_PRODUCT_FUJI_MODEM_EX          0x6761
+-#define OPTION_PRODUCT_FUJI_NETWORK_LIGHT     0x6731
+-#define OPTION_PRODUCT_FUJI_NETWORK_GT                0x6751
+-#define OPTION_PRODUCT_FUJI_NETWORK_EX                0x6771
+ #define OPTION_PRODUCT_KOI_MODEM              0x6800
+-#define OPTION_PRODUCT_KOI_NETWORK            0x6811
+ #define OPTION_PRODUCT_SCORPION_MODEM         0x6901
+-#define OPTION_PRODUCT_SCORPION_NETWORK               0x6911
+ #define OPTION_PRODUCT_ETNA_MODEM             0x7001
+-#define OPTION_PRODUCT_ETNA_NETWORK           0x7011
+ #define OPTION_PRODUCT_ETNA_MODEM_LITE                0x7021
+ #define OPTION_PRODUCT_ETNA_MODEM_GT          0x7041
+ #define OPTION_PRODUCT_ETNA_MODEM_EX          0x7061
+-#define OPTION_PRODUCT_ETNA_NETWORK_LITE      0x7031
+-#define OPTION_PRODUCT_ETNA_NETWORK_GT                0x7051
+-#define OPTION_PRODUCT_ETNA_NETWORK_EX                0x7071
+ #define OPTION_PRODUCT_ETNA_KOI_MODEM         0x7100
+-#define OPTION_PRODUCT_ETNA_KOI_NETWORK               0x7111
+ #define HUAWEI_VENDOR_ID                      0x12D1
+ #define HUAWEI_PRODUCT_E600                   0x1001
+ #define HUAWEI_PRODUCT_E220                   0x1003
+ #define HUAWEI_PRODUCT_E220BIS                        0x1004
+ #define HUAWEI_PRODUCT_E1401                  0x1401
++#define HUAWEI_PRODUCT_E1402                  0x1402
+ #define HUAWEI_PRODUCT_E1403                  0x1403
++#define HUAWEI_PRODUCT_E1404                  0x1404
+ #define HUAWEI_PRODUCT_E1405                  0x1405
+ #define HUAWEI_PRODUCT_E1406                  0x1406
++#define HUAWEI_PRODUCT_E1407                  0x1407
+ #define HUAWEI_PRODUCT_E1408                  0x1408
+ #define HUAWEI_PRODUCT_E1409                  0x1409
++#define HUAWEI_PRODUCT_E140A                  0x140A
++#define HUAWEI_PRODUCT_E140B                  0x140B
++#define HUAWEI_PRODUCT_E140C                  0x140C
++#define HUAWEI_PRODUCT_E140D                  0x140D
++#define HUAWEI_PRODUCT_E140E                  0x140E
++#define HUAWEI_PRODUCT_E140F                  0x140F
+ #define HUAWEI_PRODUCT_E1410                  0x1410
+ #define HUAWEI_PRODUCT_E1411                  0x1411
+ #define HUAWEI_PRODUCT_E1412                  0x1412
+@@ -121,9 +119,52 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define HUAWEI_PRODUCT_E1417                  0x1417
+ #define HUAWEI_PRODUCT_E1418                  0x1418
+ #define HUAWEI_PRODUCT_E1419                  0x1419
++#define HUAWEI_PRODUCT_E141A                  0x141A
++#define HUAWEI_PRODUCT_E141B                  0x141B
++#define HUAWEI_PRODUCT_E141C                  0x141C
++#define HUAWEI_PRODUCT_E141D                  0x141D
++#define HUAWEI_PRODUCT_E141E                  0x141E
++#define HUAWEI_PRODUCT_E141F                  0x141F
++#define HUAWEI_PRODUCT_E1420                  0x1420
++#define HUAWEI_PRODUCT_E1421                  0x1421
++#define HUAWEI_PRODUCT_E1422                  0x1422
++#define HUAWEI_PRODUCT_E1423                  0x1423
++#define HUAWEI_PRODUCT_E1424                  0x1424
++#define HUAWEI_PRODUCT_E1425                  0x1425
++#define HUAWEI_PRODUCT_E1426                  0x1426
++#define HUAWEI_PRODUCT_E1427                  0x1427
++#define HUAWEI_PRODUCT_E1428                  0x1428
++#define HUAWEI_PRODUCT_E1429                  0x1429
++#define HUAWEI_PRODUCT_E142A                  0x142A
++#define HUAWEI_PRODUCT_E142B                  0x142B
++#define HUAWEI_PRODUCT_E142C                  0x142C
++#define HUAWEI_PRODUCT_E142D                  0x142D
++#define HUAWEI_PRODUCT_E142E                  0x142E
++#define HUAWEI_PRODUCT_E142F                  0x142F
++#define HUAWEI_PRODUCT_E1430                  0x1430
++#define HUAWEI_PRODUCT_E1431                  0x1431
++#define HUAWEI_PRODUCT_E1432                  0x1432
++#define HUAWEI_PRODUCT_E1433                  0x1433
++#define HUAWEI_PRODUCT_E1434                  0x1434
++#define HUAWEI_PRODUCT_E1435                  0x1435
++#define HUAWEI_PRODUCT_E1436                  0x1436
++#define HUAWEI_PRODUCT_E1437                  0x1437
++#define HUAWEI_PRODUCT_E1438                  0x1438
++#define HUAWEI_PRODUCT_E1439                  0x1439
++#define HUAWEI_PRODUCT_E143A                  0x143A
++#define HUAWEI_PRODUCT_E143B                  0x143B
++#define HUAWEI_PRODUCT_E143C                  0x143C
++#define HUAWEI_PRODUCT_E143D                  0x143D
++#define HUAWEI_PRODUCT_E143E                  0x143E
++#define HUAWEI_PRODUCT_E143F                  0x143F
+ #define NOVATELWIRELESS_VENDOR_ID             0x1410
++/* YISO PRODUCTS */
++
++#define YISO_VENDOR_ID                                0x0EAB
++#define YISO_PRODUCT_U893                     0xC893
++
+ /* MERLIN EVDO PRODUCTS */
+ #define NOVATELWIRELESS_PRODUCT_V640          0x1100
+ #define NOVATELWIRELESS_PRODUCT_V620          0x1110
+@@ -183,6 +224,7 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ #define ONDA_VENDOR_ID                                0x19d2
+ #define ONDA_PRODUCT_MSA501HS                 0x0001
+ #define ONDA_PRODUCT_ET502HS                  0x0002
++#define ONDA_PRODUCT_MT503HS                  0x0200
+ #define BANDRICH_VENDOR_ID                    0x1A8D
+ #define BANDRICH_PRODUCT_C100_1                       0x1002
+@@ -218,8 +260,19 @@ static int  option_send_setup(struct tty_struct *tty, struct usb_serial_port *po
+ /* ZTE PRODUCTS */
+ #define ZTE_VENDOR_ID                         0x19d2
+ #define ZTE_PRODUCT_MF628                     0x0015
++#define ZTE_PRODUCT_MF626                     0x0031
+ #define ZTE_PRODUCT_CDMA_TECH                 0xfffe
++/* Ericsson products */
++#define ERICSSON_VENDOR_ID                    0x0bdb
++#define ERICSSON_PRODUCT_F3507G                       0x1900
++
++/* Pantech products */
++#define PANTECH_VENDOR_ID                     0x106c
++#define PANTECH_PRODUCT_PC5740                        0x3701
++#define PANTECH_PRODUCT_PC5750                        0x3702  /* PX-500 */
++#define PANTECH_PRODUCT_UM150                 0x3711
++
+ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COLT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_RICOLA) },
+@@ -235,36 +288,34 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_VIPER_BUS) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX_READY) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GT_MAX) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_LIGHT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_GT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_MODEM_EX) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_LIGHT) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_GT) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUJI_NETWORK_EX) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_MODEM) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_KOI_NETWORK) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_MODEM) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_SCORPION_NETWORK) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_LITE) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_GT) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_MODEM_EX) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_LITE) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_GT) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_NETWORK_EX) },
+       { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_MODEM) },
+-      { USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_ETNA_KOI_NETWORK) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220BIS, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1401, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1402, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1403, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1404, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1405, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1406, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1407, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1408, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1409, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140A, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140B, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140C, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140D, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140E, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E140F, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1410, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1411, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1412, 0xff, 0xff, 0xff) },
+@@ -275,6 +326,44 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1417, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1418, 0xff, 0xff, 0xff) },
+       { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1419, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141A, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141B, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141C, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141D, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141E, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E141F, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1420, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1421, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1422, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1423, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1424, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1425, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1426, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1427, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1428, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1429, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142A, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142B, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142C, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142D, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142E, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E142F, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1430, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1431, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1432, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1433, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1434, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1435, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1436, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1437, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1438, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E1439, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143A, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143B, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143C, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143D, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143E, 0xff, 0xff, 0xff) },
++      { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E143F, 0xff, 0xff, 0xff) },
+       { USB_DEVICE(AMOI_VENDOR_ID, AMOI_PRODUCT_9508) },
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, /* Novatel Merlin V640/XV620 */
+       { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, /* Novatel Merlin V620/S620 */
+@@ -318,12 +407,48 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8136) }, /* Dell Wireless HSDPA 5520 == Novatel Expedite EU860D */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8137) }, /* Dell Wireless HSDPA 5520 */
+       { USB_DEVICE(DELL_VENDOR_ID, 0x8138) }, /* Dell Wireless 5520 Voda I Mobile Broadband (3G HSDPA) Minicard */
+-      { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },
++      { USB_DEVICE(DELL_VENDOR_ID, 0x8147) }, /* Dell Wireless 5530 Mobile Broadband (3G HSPA) Mini-Card */
++      { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_E100A) },   /* ADU-E100, ADU-310 */
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_500A) },
+       { USB_DEVICE(ANYDATA_VENDOR_ID, ANYDATA_PRODUCT_ADU_620UW) },
+       { USB_DEVICE(AXESSTEL_VENDOR_ID, AXESSTEL_PRODUCT_MV110H) },
+       { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MSA501HS) },
+       { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_ET502HS) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0003) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0004) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0005) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0006) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0007) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0008) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0009) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000a) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000b) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000c) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000d) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000e) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x000f) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0010) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0011) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0012) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0013) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0014) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0015) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0016) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0017) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0018) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0019) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0020) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0021) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0022) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0023) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0024) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0025) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0026) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0027) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0028) },
++      { USB_DEVICE(ONDA_VENDOR_ID, 0x0029) },
++      { USB_DEVICE(ONDA_VENDOR_ID, ONDA_PRODUCT_MT503HS) },
++      { USB_DEVICE(YISO_VENDOR_ID, YISO_PRODUCT_U893) },
+       { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_1) },
+       { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_C100_2) },
+       { USB_DEVICE(BANDRICH_VENDOR_ID, BANDRICH_PRODUCT_1004) },
+@@ -347,8 +472,13 @@ static struct usb_device_id option_ids[] = {
+       { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */
+       { USB_DEVICE(MAXON_VENDOR_ID, 0x6280) }, /* BP3-USB & BP3-EXT HSDPA */
+       { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) },
++      { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF626) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_MF628) },
+       { USB_DEVICE(ZTE_VENDOR_ID, ZTE_PRODUCT_CDMA_TECH) },
++      { USB_DEVICE(ERICSSON_VENDOR_ID, ERICSSON_PRODUCT_F3507G) },
++      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5740) },
++      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_PC5750) },
++      { USB_DEVICE(PANTECH_VENDOR_ID, PANTECH_PRODUCT_UM150) },
+       { } /* Terminating entry */
+ };
+ MODULE_DEVICE_TABLE(usb, option_ids);
+diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h
+index ccebf89..e61f2bf 100644
+--- a/drivers/usb/storage/unusual_devs.h
++++ b/drivers/usb/storage/unusual_devs.h
+@@ -167,6 +167,13 @@ UNUSUAL_DEV(  0x0421, 0x005d, 0x0001, 0x0600,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
++/* Patch for Nokia 5310 capacity */
++UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
++              "Nokia",
++              "5310",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY ),
++
+ /* Reported by Mario Rettig <mariorettig@web.de> */
+ UNUSUAL_DEV(  0x0421, 0x042e, 0x0100, 0x0100,
+               "Nokia",
+@@ -233,14 +240,14 @@ UNUSUAL_DEV(  0x0421, 0x0495, 0x0370, 0x0370,
+               US_FL_MAX_SECTORS_64 ),
+ /* Reported by Cedric Godin <cedric@belbone.be> */
+-UNUSUAL_DEV(  0x0421, 0x04b9, 0x0551, 0x0551,
++UNUSUAL_DEV(  0x0421, 0x04b9, 0x0500, 0x0551,
+               "Nokia",
+               "5300",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
+ /* Reported by Richard Nauber <RichardNauber@web.de> */
+-UNUSUAL_DEV(  0x0421, 0x04fa, 0x0601, 0x0601,
++UNUSUAL_DEV(  0x0421, 0x04fa, 0x0550, 0x0660,
+               "Nokia",
+               "6300",
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+@@ -253,6 +260,14 @@ UNUSUAL_DEV(  0x0421, 0x006a, 0x0000, 0x0591,
+       US_SC_DEVICE, US_PR_DEVICE, NULL,
+       US_FL_FIX_CAPACITY ),
++/* Submitted by Ricky Wong Yung Fei <evilbladewarrior@gmail.com> */
++/* Nokia 7610 Supernova - Too many sectors reported in usb storage mode */
++UNUSUAL_DEV(  0x0421, 0x00f5, 0x0000, 0x0470,
++      "Nokia",
++      "7610 Supernova",
++      US_SC_DEVICE, US_PR_DEVICE, NULL,
++      US_FL_FIX_CAPACITY ),
++
+ /* Reported by Olaf Hering <olh@suse.de> from novell bug #105878 */
+ UNUSUAL_DEV(  0x0424, 0x0fdc, 0x0210, 0x0210,
+               "SMSC",
+@@ -303,6 +318,18 @@ UNUSUAL_DEV(  0x045a, 0x5210, 0x0101, 0x0101,
+               US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
+ #endif
++/* Reported by Tamas Kerecsen <kerecsen@bigfoot.com>
++ * Obviously the PROM has not been customized by the VAR;
++ * the Vendor and Product string descriptors are:
++ *    Generic Mass Storage (PROTOTYPE--Remember to change idVendor)
++ *    Generic Manufacturer (PROTOTYPE--Remember to change idVendor)
++ */
++UNUSUAL_DEV(  0x045e, 0xffff, 0x0000, 0x0000,
++              "Mitac",
++              "GPS",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_MAX_SECTORS_64 ),
++
+ /*
+  * This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.)
+  * Reported by Pete Zaitcev <zaitcev@redhat.com>
+@@ -333,6 +360,13 @@ UNUSUAL_DEV(  0x0482, 0x0103, 0x0100, 0x0100,
+               "Finecam S5",
+               US_SC_DEVICE, US_PR_DEVICE, NULL, US_FL_FIX_INQUIRY),
++/* Patch submitted by Jens Taprogge <jens.taprogge@taprogge.org> */
++UNUSUAL_DEV(  0x0482, 0x0107, 0x0100, 0x0100,
++              "Kyocera",
++              "CONTAX SL300R T*",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY | US_FL_NOT_LOCKABLE),
++
+ /* Reported by Paul Stewart <stewart@wetlogic.net>
+  * This entry is needed because the device reports Sub=ff */
+ UNUSUAL_DEV(  0x04a4, 0x0004, 0x0001, 0x0001,
+@@ -355,6 +389,13 @@ UNUSUAL_DEV(  0x04b0, 0x0401, 0x0200, 0x0200,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY),
++/* Reported by Tobias Kunze Briseno <t-linux@fictive.com> */
++UNUSUAL_DEV(  0x04b0, 0x0403, 0x0200, 0x0200,
++              "NIKON",
++              "NIKON DSC D2H",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY),
++
+ /* Reported by Milinevsky Dmitry <niam.niam@gmail.com> */
+ UNUSUAL_DEV(  0x04b0, 0x0409, 0x0100, 0x0100,
+               "NIKON",
+@@ -411,6 +452,13 @@ UNUSUAL_DEV(  0x04b0, 0x0417, 0x0100, 0x0100,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY),
++/* Reported by paul ready <lxtwin@homecall.co.uk> */
++UNUSUAL_DEV(  0x04b0, 0x0419, 0x0100, 0x0200,
++              "NIKON",
++              "NIKON DSC D300",
++              US_SC_DEVICE, US_PR_DEVICE, NULL,
++              US_FL_FIX_CAPACITY),
++
+ /* Reported by Doug Maxey (dwm@austin.ibm.com) */
+ UNUSUAL_DEV(  0x04b3, 0x4001, 0x0110, 0x0110,
+               "IBM",
+@@ -1635,97 +1683,332 @@ UNUSUAL_DEV(  0x1210, 0x0003, 0x0100, 0x0100,
+ /* Reported by fangxiaozhi <huananhu@huawei.com>
+  * This brings the HUAWEI data card devices into multi-port mode
+  */
+-UNUSUAL_DEV( 0x12d1, 0x1001, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1001, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1003, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1004, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1401, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1402, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1403, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1404, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1405, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1406, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1407, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1408, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1409, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140A, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140B, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140C, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140D, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140E, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x140F, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1410, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1411, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1412, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1413, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1414, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1415, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1416, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1417, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1418, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1419, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141A, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141B, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141C, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141D, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141E, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x141F, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1420, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1421, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1422, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1423, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1424, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1425, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1426, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x1427, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1003, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1428, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1004, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1429, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1401, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142A, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1403, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142B, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1405, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142C, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1406, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142D, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1408, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142E, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1409, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x142F, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1410, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1430, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1411, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1431, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1412, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1432, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1413, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1433, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1414, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1434, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1415, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1435, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1416, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1436, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1417, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1437, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1418, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1438, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+               0),
+-UNUSUAL_DEV( 0x12d1, 0x1419, 0x0000, 0x0000,
++UNUSUAL_DEV(  0x12d1, 0x1439, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143A, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143B, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143C, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143D, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143E, 0x0000, 0x0000,
++              "HUAWEI MOBILE",
++              "Mass Storage",
++              US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
++              0),
++UNUSUAL_DEV(  0x12d1, 0x143F, 0x0000, 0x0000,
+               "HUAWEI MOBILE",
+               "Mass Storage",
+               US_SC_DEVICE, US_PR_DEVICE, usb_stor_huawei_e220_init,
+@@ -1834,6 +2117,15 @@ UNUSUAL_DEV(  0x2770, 0x915d, 0x0010, 0x0010,
+               US_SC_DEVICE, US_PR_DEVICE, NULL,
+               US_FL_FIX_CAPACITY ),
++/* Reported by Frederic Marchal <frederic.marchal@wowcompany.com>
++ * Mio Moov 330
++ */
++UNUSUAL_DEV(  0x3340, 0xffff, 0x0000, 0x0000,
++              "Mitac",
++              "Mio DigiWalker USB Sync",
++              US_SC_DEVICE,US_PR_DEVICE,NULL,
++              US_FL_MAX_SECTORS_64 ),
++
+ /* Reported by Andrey Rahmatullin <wrar@altlinux.org> */
+ UNUSUAL_DEV(  0x4102, 0x1020, 0x0100,  0x0100,
+               "iRiver",
+diff --git a/drivers/watchdog/ib700wdt.c b/drivers/watchdog/ib700wdt.c
+index 05a2810..8782ec1 100644
+--- a/drivers/watchdog/ib700wdt.c
++++ b/drivers/watchdog/ib700wdt.c
+@@ -154,7 +154,7 @@ static int ibwdt_set_heartbeat(int t)
+               return -EINVAL;
+       for (i = 0x0F; i > -1; i--)
+-              if (wd_times[i] > t)
++              if (wd_times[i] >= t)
+                       break;
+       wd_margin = i;
+       return 0;
+diff --git a/fs/binfmt_em86.c b/fs/binfmt_em86.c
+index f9c88d0..32fb00b 100644
+--- a/fs/binfmt_em86.c
++++ b/fs/binfmt_em86.c
+@@ -43,7 +43,7 @@ static int load_em86(struct linux_binprm *bprm,struct pt_regs *regs)
+                       return -ENOEXEC;
+       }
+-      bprm->sh_bang = 1;      /* Well, the bang-shell is implicit... */
++      bprm->recursion_depth++; /* Well, the bang-shell is implicit... */
+       allow_write_access(bprm->file);
+       fput(bprm->file);
+       bprm->file = NULL;
+diff --git a/fs/binfmt_misc.c b/fs/binfmt_misc.c
+index 8d7e88e..f2744ab 100644
+--- a/fs/binfmt_misc.c
++++ b/fs/binfmt_misc.c
+@@ -117,7 +117,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+               goto _ret;
+       retval = -ENOEXEC;
+-      if (bprm->misc_bang)
++      if (bprm->recursion_depth > BINPRM_MAX_RECURSION)
+               goto _ret;
+       /* to keep locking time low, we copy the interpreter string */
+@@ -197,7 +197,7 @@ static int load_misc_binary(struct linux_binprm *bprm, struct pt_regs *regs)
+       if (retval < 0)
+               goto _error;
+-      bprm->misc_bang = 1;
++      bprm->recursion_depth++;
+       retval = search_binary_handler (bprm, regs);
+       if (retval < 0)
+diff --git a/fs/binfmt_script.c b/fs/binfmt_script.c
+index 9e3963f..0834350 100644
+--- a/fs/binfmt_script.c
++++ b/fs/binfmt_script.c
+@@ -22,14 +22,15 @@ static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
+       char interp[BINPRM_BUF_SIZE];
+       int retval;
+-      if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') || (bprm->sh_bang)) 
++      if ((bprm->buf[0] != '#') || (bprm->buf[1] != '!') ||
++          (bprm->recursion_depth > BINPRM_MAX_RECURSION))
+               return -ENOEXEC;
+       /*
+        * This section does the #! interpretation.
+        * Sorta complicated, but hopefully it will work.  -TYT
+        */
+-      bprm->sh_bang = 1;
++      bprm->recursion_depth++;
+       allow_write_access(bprm->file);
+       fput(bprm->file);
+       bprm->file = NULL;
+diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
+index 6e2be4a..223647f 100644
+--- a/fs/cifs/connect.c
++++ b/fs/cifs/connect.c
+@@ -128,7 +128,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
+       struct mid_q_entry *mid_entry;
+       spin_lock(&GlobalMid_Lock);
+-      if (kthread_should_stop()) {
++      if (server->tcpStatus == CifsExiting) {
+               /* the demux thread will exit normally
+               next time through the loop */
+               spin_unlock(&GlobalMid_Lock);
+@@ -182,7 +182,8 @@ cifs_reconnect(struct TCP_Server_Info *server)
+       spin_unlock(&GlobalMid_Lock);
+       up(&server->tcpSem);
+-      while ((!kthread_should_stop()) && (server->tcpStatus != CifsGood)) {
++      while ((server->tcpStatus != CifsExiting) &&
++             (server->tcpStatus != CifsGood)) {
+               try_to_freeze();
+               if (server->addr.sockAddr6.sin6_family == AF_INET6) {
+                       rc = ipv6_connect(&server->addr.sockAddr6,
+@@ -200,7 +201,7 @@ cifs_reconnect(struct TCP_Server_Info *server)
+               } else {
+                       atomic_inc(&tcpSesReconnectCount);
+                       spin_lock(&GlobalMid_Lock);
+-                      if (!kthread_should_stop())
++                      if (server->tcpStatus != CifsExiting)
+                               server->tcpStatus = CifsGood;
+                       server->sequence_number = 0;
+                       spin_unlock(&GlobalMid_Lock);
+@@ -355,7 +356,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
+                               GFP_KERNEL);
+       set_freezable();
+-      while (!kthread_should_stop()) {
++      while (server->tcpStatus != CifsExiting) {
+               if (try_to_freeze())
+                       continue;
+               if (bigbuf == NULL) {
+@@ -396,7 +397,7 @@ incomplete_rcv:
+                   kernel_recvmsg(csocket, &smb_msg,
+                               &iov, 1, pdu_length, 0 /* BB other flags? */);
+-              if (kthread_should_stop()) {
++              if (server->tcpStatus == CifsExiting) {
+                       break;
+               } else if (server->tcpStatus == CifsNeedReconnect) {
+                       cFYI(1, ("Reconnect after server stopped responding"));
+@@ -527,7 +528,7 @@ incomplete_rcv:
+                    total_read += length) {
+                       length = kernel_recvmsg(csocket, &smb_msg, &iov, 1,
+                                               pdu_length - total_read, 0);
+-                      if (kthread_should_stop() ||
++                      if ((server->tcpStatus == CifsExiting) ||
+                           (length == -EINTR)) {
+                               /* then will exit */
+                               reconnect = 2;
+@@ -661,14 +662,6 @@ multi_t2_fnd:
+       spin_unlock(&GlobalMid_Lock);
+       wake_up_all(&server->response_q);
+-      /* don't exit until kthread_stop is called */
+-      set_current_state(TASK_UNINTERRUPTIBLE);
+-      while (!kthread_should_stop()) {
+-              schedule();
+-              set_current_state(TASK_UNINTERRUPTIBLE);
+-      }
+-      set_current_state(TASK_RUNNING);
+-
+       /* check if we have blocked requests that need to free */
+       /* Note that cifs_max_pending is normally 50, but
+       can be set at module install time to as little as two */
+@@ -764,6 +757,7 @@ multi_t2_fnd:
+       read_unlock(&cifs_tcp_ses_lock);
+       kfree(server->hostname);
++      task_to_wake = xchg(&server->tsk, NULL);
+       kfree(server);
+       length = atomic_dec_return(&tcpSesAllocCount);
+@@ -771,6 +765,16 @@ multi_t2_fnd:
+               mempool_resize(cifs_req_poolp, length + cifs_min_rcv,
+                               GFP_KERNEL);
++      /* if server->tsk was NULL then wait for a signal before exiting */
++      if (!task_to_wake) {
++              set_current_state(TASK_INTERRUPTIBLE);
++              while (!signal_pending(current)) {
++                      schedule();
++                      set_current_state(TASK_INTERRUPTIBLE);
++              }
++              set_current_state(TASK_RUNNING);
++      }
++
+       return 0;
+ }
+@@ -2310,7 +2314,7 @@ cifs_mount(struct super_block *sb, struct cifs_sb_info *cifs_sb,
+       /* on error free sesinfo and tcon struct if needed */
+ mount_fail_check:
+       if (rc) {
+-               /* If find_unc succeeded then rc == 0 so we can not end */
++              /* If find_unc succeeded then rc == 0 so we can not end */
+               /* up accidently freeing someone elses tcon struct */
+               if (tcon)
+                       cifs_put_tcon(tcon);
+@@ -3715,8 +3719,10 @@ int cifs_setup_session(unsigned int xid, struct cifsSesInfo *pSesInfo,
+               cERROR(1, ("Send error in SessSetup = %d", rc));
+       } else {
+               cFYI(1, ("CIFS Session Established successfully"));
++                      spin_lock(&GlobalMid_Lock);
+                       pSesInfo->status = CifsGood;
+                       pSesInfo->need_reconnect = false;
++                      spin_unlock(&GlobalMid_Lock);
+       }
+ ss_err_exit:
+diff --git a/fs/exec.c b/fs/exec.c
+index cecee50..b266ace 100644
+--- a/fs/exec.c
++++ b/fs/exec.c
+@@ -1164,6 +1164,7 @@ EXPORT_SYMBOL(remove_arg_zero);
+  */
+ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+ {
++      unsigned int depth = bprm->recursion_depth;
+       int try,retval;
+       struct linux_binfmt *fmt;
+ #ifdef __alpha__
+@@ -1224,8 +1225,15 @@ int search_binary_handler(struct linux_binprm *bprm,struct pt_regs *regs)
+                               continue;
+                       read_unlock(&binfmt_lock);
+                       retval = fn(bprm, regs);
++                      /*
++                       * Restore the depth counter to its starting value
++                       * in this call, so we don't have to rely on every
++                       * load_binary function to restore it on return.
++                       */
++                      bprm->recursion_depth = depth;
+                       if (retval >= 0) {
+-                              tracehook_report_exec(fmt, bprm, regs);
++                              if (depth == 0)
++                                      tracehook_report_exec(fmt, bprm, regs);
+                               put_binfmt(fmt);
+                               allow_write_access(bprm->file);
+                               if (bprm->file)
+diff --git a/fs/fcntl.c b/fs/fcntl.c
+index ac4f7db..549daf8 100644
+--- a/fs/fcntl.c
++++ b/fs/fcntl.c
+@@ -19,6 +19,7 @@
+ #include <linux/signal.h>
+ #include <linux/rcupdate.h>
+ #include <linux/pid_namespace.h>
++#include <linux/smp_lock.h>
+ #include <asm/poll.h>
+ #include <asm/siginfo.h>
+@@ -175,6 +176,11 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+       if (error)
+               return error;
++      /*
++       * We still need a lock here for now to keep multiple FASYNC calls
++       * from racing with each other.
++       */
++      lock_kernel();
+       if ((arg ^ filp->f_flags) & FASYNC) {
+               if (filp->f_op && filp->f_op->fasync) {
+                       error = filp->f_op->fasync(fd, filp, (arg & FASYNC) != 0);
+@@ -185,6 +191,7 @@ static int setfl(int fd, struct file * filp, unsigned long arg)
+       filp->f_flags = (arg & SETFL_MASK) | (filp->f_flags & ~SETFL_MASK);
+  out:
++      unlock_kernel();
+       return error;
+ }
+diff --git a/fs/ioctl.c b/fs/ioctl.c
+index 7db32b3..612e0b2 100644
+--- a/fs/ioctl.c
++++ b/fs/ioctl.c
+@@ -123,11 +123,9 @@ static int ioctl_fioasync(unsigned int fd, struct file *filp,
+       /* Did FASYNC state change ? */
+       if ((flag ^ filp->f_flags) & FASYNC) {
+-              if (filp->f_op && filp->f_op->fasync) {
+-                      lock_kernel();
++              if (filp->f_op && filp->f_op->fasync)
+                       error = filp->f_op->fasync(fd, filp, on);
+-                      unlock_kernel();
+-              } else
++              else
+                       error = -ENOTTY;
+       }
+       if (error)
+@@ -163,11 +161,17 @@ int do_vfs_ioctl(struct file *filp, unsigned int fd, unsigned int cmd,
+               break;
+       case FIONBIO:
++              /* BKL needed to avoid races tweaking f_flags */
++              lock_kernel();
+               error = ioctl_fionbio(filp, argp);
++              unlock_kernel();
+               break;
+       case FIOASYNC:
++              /* BKL needed to avoid races tweaking f_flags */
++              lock_kernel();
+               error = ioctl_fioasync(fd, filp, argp);
++              unlock_kernel();
+               break;
+       case FIOQSIZE:
+diff --git a/fs/jbd/checkpoint.c b/fs/jbd/checkpoint.c
+index a5432bb..fe85219 100644
+--- a/fs/jbd/checkpoint.c
++++ b/fs/jbd/checkpoint.c
+@@ -93,7 +93,8 @@ static int __try_to_free_cp_buf(struct journal_head *jh)
+       int ret = 0;
+       struct buffer_head *bh = jh2bh(jh);
+-      if (jh->b_jlist == BJ_None && !buffer_locked(bh) && !buffer_dirty(bh)) {
++      if (jh->b_jlist == BJ_None && !buffer_locked(bh) &&
++          !buffer_dirty(bh) && !buffer_write_io_error(bh)) {
+               JBUFFER_TRACE(jh, "remove from checkpoint list");
+               ret = __journal_remove_checkpoint(jh) + 1;
+               jbd_unlock_bh_state(bh);
+@@ -160,21 +161,25 @@ static void jbd_sync_bh(journal_t *journal, struct buffer_head *bh)
+  * buffers. Note that we take the buffers in the opposite ordering
+  * from the one in which they were submitted for IO.
+  *
++ * Return 0 on success, and return <0 if some buffers have failed
++ * to be written out.
++ *
+  * Called with j_list_lock held.
+  */
+-static void __wait_cp_io(journal_t *journal, transaction_t *transaction)
++static int __wait_cp_io(journal_t *journal, transaction_t *transaction)
+ {
+       struct journal_head *jh;
+       struct buffer_head *bh;
+       tid_t this_tid;
+       int released = 0;
++      int ret = 0;
+       this_tid = transaction->t_tid;
+ restart:
+       /* Did somebody clean up the transaction in the meanwhile? */
+       if (journal->j_checkpoint_transactions != transaction ||
+                       transaction->t_tid != this_tid)
+-              return;
++              return ret;
+       while (!released && transaction->t_checkpoint_io_list) {
+               jh = transaction->t_checkpoint_io_list;
+               bh = jh2bh(jh);
+@@ -194,6 +199,9 @@ restart:
+                       spin_lock(&journal->j_list_lock);
+                       goto restart;
+               }
++              if (unlikely(buffer_write_io_error(bh)))
++                      ret = -EIO;
++
+               /*
+                * Now in whatever state the buffer currently is, we know that
+                * it has been written out and so we can drop it from the list
+@@ -203,6 +211,8 @@ restart:
+               journal_remove_journal_head(bh);
+               __brelse(bh);
+       }
++
++      return ret;
+ }
+ #define NR_BATCH      64
+@@ -226,7 +236,8 @@ __flush_batch(journal_t *journal, struct buffer_head **bhs, int *batch_count)
+  * Try to flush one buffer from the checkpoint list to disk.
+  *
+  * Return 1 if something happened which requires us to abort the current
+- * scan of the checkpoint list.
++ * scan of the checkpoint list.  Return <0 if the buffer has failed to
++ * be written out.
+  *
+  * Called with j_list_lock held and drops it if 1 is returned
+  * Called under jbd_lock_bh_state(jh2bh(jh)), and drops it
+@@ -256,6 +267,9 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+               log_wait_commit(journal, tid);
+               ret = 1;
+       } else if (!buffer_dirty(bh)) {
++              ret = 1;
++              if (unlikely(buffer_write_io_error(bh)))
++                      ret = -EIO;
+               J_ASSERT_JH(jh, !buffer_jbddirty(bh));
+               BUFFER_TRACE(bh, "remove from checkpoint");
+               __journal_remove_checkpoint(jh);
+@@ -263,7 +277,6 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+               jbd_unlock_bh_state(bh);
+               journal_remove_journal_head(bh);
+               __brelse(bh);
+-              ret = 1;
+       } else {
+               /*
+                * Important: we are about to write the buffer, and
+@@ -295,6 +308,7 @@ static int __process_buffer(journal_t *journal, struct journal_head *jh,
+  * to disk. We submit larger chunks of data at once.
+  *
+  * The journal should be locked before calling this function.
++ * Called with j_checkpoint_mutex held.
+  */
+ int log_do_checkpoint(journal_t *journal)
+ {
+@@ -318,6 +332,7 @@ int log_do_checkpoint(journal_t *journal)
+        * OK, we need to start writing disk blocks.  Take one transaction
+        * and write it.
+        */
++      result = 0;
+       spin_lock(&journal->j_list_lock);
+       if (!journal->j_checkpoint_transactions)
+               goto out;
+@@ -334,7 +349,7 @@ restart:
+               int batch_count = 0;
+               struct buffer_head *bhs[NR_BATCH];
+               struct journal_head *jh;
+-              int retry = 0;
++              int retry = 0, err;
+               while (!retry && transaction->t_checkpoint_list) {
+                       struct buffer_head *bh;
+@@ -347,6 +362,8 @@ restart:
+                               break;
+                       }
+                       retry = __process_buffer(journal, jh, bhs,&batch_count);
++                      if (retry < 0 && !result)
++                              result = retry;
+                       if (!retry && (need_resched() ||
+                               spin_needbreak(&journal->j_list_lock))) {
+                               spin_unlock(&journal->j_list_lock);
+@@ -371,14 +388,18 @@ restart:
+                * Now we have cleaned up the first transaction's checkpoint
+                * list. Let's clean up the second one
+                */
+-              __wait_cp_io(journal, transaction);
++              err = __wait_cp_io(journal, transaction);
++              if (!result)
++                      result = err;
+       }
+ out:
+       spin_unlock(&journal->j_list_lock);
+-      result = cleanup_journal_tail(journal);
+       if (result < 0)
+-              return result;
+-      return 0;
++              journal_abort(journal, result);
++      else
++              result = cleanup_journal_tail(journal);
++
++      return (result < 0) ? result : 0;
+ }
+ /*
+@@ -394,8 +415,9 @@ out:
+  * This is the only part of the journaling code which really needs to be
+  * aware of transaction aborts.  Checkpointing involves writing to the
+  * main filesystem area rather than to the journal, so it can proceed
+- * even in abort state, but we must not update the journal superblock if
+- * we have an abort error outstanding.
++ * even in abort state, but we must not update the super block if
++ * checkpointing may have failed.  Otherwise, we would lose some metadata
++ * buffers which should be written-back to the filesystem.
+  */
+ int cleanup_journal_tail(journal_t *journal)
+@@ -404,6 +426,9 @@ int cleanup_journal_tail(journal_t *journal)
+       tid_t           first_tid;
+       unsigned long   blocknr, freed;
++      if (is_journal_aborted(journal))
++              return 1;
++
+       /* OK, work out the oldest transaction remaining in the log, and
+        * the log block it starts at.
+        *
+diff --git a/fs/jbd/journal.c b/fs/jbd/journal.c
+index aa7143a..9e4fa52 100644
+--- a/fs/jbd/journal.c
++++ b/fs/jbd/journal.c
+@@ -1121,9 +1121,12 @@ recovery_error:
+  *
+  * Release a journal_t structure once it is no longer in use by the
+  * journaled object.
++ * Return <0 if we couldn't clean up the journal.
+  */
+-void journal_destroy(journal_t *journal)
++int journal_destroy(journal_t *journal)
+ {
++      int err = 0;
++
+       /* Wait for the commit thread to wake up and die. */
+       journal_kill_thread(journal);
+@@ -1146,11 +1149,16 @@ void journal_destroy(journal_t *journal)
+       J_ASSERT(journal->j_checkpoint_transactions == NULL);
+       spin_unlock(&journal->j_list_lock);
+-      /* We can now mark the journal as empty. */
+-      journal->j_tail = 0;
+-      journal->j_tail_sequence = ++journal->j_transaction_sequence;
+       if (journal->j_sb_buffer) {
+-              journal_update_superblock(journal, 1);
++              if (!is_journal_aborted(journal)) {
++                      /* We can now mark the journal as empty. */
++                      journal->j_tail = 0;
++                      journal->j_tail_sequence =
++                              ++journal->j_transaction_sequence;
++                      journal_update_superblock(journal, 1);
++              } else {
++                      err = -EIO;
++              }
+               brelse(journal->j_sb_buffer);
+       }
+@@ -1160,6 +1168,8 @@ void journal_destroy(journal_t *journal)
+               journal_destroy_revoke(journal);
+       kfree(journal->j_wbuf);
+       kfree(journal);
++
++      return err;
+ }
+@@ -1359,10 +1369,16 @@ int journal_flush(journal_t *journal)
+       spin_lock(&journal->j_list_lock);
+       while (!err && journal->j_checkpoint_transactions != NULL) {
+               spin_unlock(&journal->j_list_lock);
++              mutex_lock(&journal->j_checkpoint_mutex);
+               err = log_do_checkpoint(journal);
++              mutex_unlock(&journal->j_checkpoint_mutex);
+               spin_lock(&journal->j_list_lock);
+       }
+       spin_unlock(&journal->j_list_lock);
++
++      if (is_journal_aborted(journal))
++              return -EIO;
++
+       cleanup_journal_tail(journal);
+       /* Finally, mark the journal as really needing no recovery.
+@@ -1384,7 +1400,7 @@ int journal_flush(journal_t *journal)
+       J_ASSERT(journal->j_head == journal->j_tail);
+       J_ASSERT(journal->j_tail_sequence == journal->j_transaction_sequence);
+       spin_unlock(&journal->j_state_lock);
+-      return err;
++      return 0;
+ }
+ /**
+diff --git a/fs/jbd/recovery.c b/fs/jbd/recovery.c
+index 43bc5e5..db5e982 100644
+--- a/fs/jbd/recovery.c
++++ b/fs/jbd/recovery.c
+@@ -223,7 +223,7 @@ do {                                                                       \
+  */
+ int journal_recover(journal_t *journal)
+ {
+-      int                     err;
++      int                     err, err2;
+       journal_superblock_t *  sb;
+       struct recovery_info    info;
+@@ -261,7 +261,10 @@ int journal_recover(journal_t *journal)
+       journal->j_transaction_sequence = ++info.end_transaction;
+       journal_clear_revoke(journal);
+-      sync_blockdev(journal->j_fs_dev);
++      err2 = sync_blockdev(journal->j_fs_dev);
++      if (!err)
++              err = err2;
++
+       return err;
+ }
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index f3ada04..8b84227 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -563,9 +563,9 @@ static u64 swap_pte_to_pagemap_entry(pte_t pte)
+       return swp_type(e) | (swp_offset(e) << MAX_SWAPFILES_SHIFT);
+ }
+-static unsigned long pte_to_pagemap_entry(pte_t pte)
++static u64 pte_to_pagemap_entry(pte_t pte)
+ {
+-      unsigned long pme = 0;
++      u64 pme = 0;
+       if (is_swap_pte(pte))
+               pme = PM_PFRAME(swap_pte_to_pagemap_entry(pte))
+                       | PM_PSHIFT(PAGE_SHIFT) | PM_SWAP;
+diff --git a/fs/xfs/xfs_rename.c b/fs/xfs/xfs_rename.c
+index d700dac..c903130 100644
+--- a/fs/xfs/xfs_rename.c
++++ b/fs/xfs/xfs_rename.c
+@@ -212,7 +212,7 @@ xfs_rename(
+       if (unlikely((target_dp->i_d.di_flags & XFS_DIFLAG_PROJINHERIT) &&
+                    (target_dp->i_d.di_projid != src_ip->i_d.di_projid))) {
+               error = XFS_ERROR(EXDEV);
+-              xfs_rename_unlock4(inodes, XFS_ILOCK_SHARED);
++              xfs_rename_unlock4(inodes, XFS_ILOCK_EXCL);
+               xfs_trans_cancel(tp, cancel_flags);
+               goto std_return;
+       }
+diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
+index 826f623..12413a1 100644
+--- a/include/linux/binfmts.h
++++ b/include/linux/binfmts.h
+@@ -36,6 +36,7 @@ struct linux_binprm{
+       unsigned long p; /* current top of mem */
+       unsigned int sh_bang:1,
+                    misc_bang:1;
++      unsigned int recursion_depth;
+       struct file * file;
+       int e_uid, e_gid;
+       kernel_cap_t cap_post_exec_permitted;
+@@ -58,6 +59,7 @@ struct linux_binprm{
+ #define BINPRM_FLAGS_EXECFD_BIT 1
+ #define BINPRM_FLAGS_EXECFD (1 << BINPRM_FLAGS_EXECFD_BIT)
++#define BINPRM_MAX_RECURSION 4
+ /*
+  * This structure defines the functions that are used to load the binary formats that
+diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
+index 53ea933..73f4532 100644
+--- a/include/linux/blkdev.h
++++ b/include/linux/blkdev.h
+@@ -623,6 +623,7 @@ extern unsigned long blk_max_low_pfn, blk_max_pfn;
+  * default timeout for SG_IO if none specified
+  */
+ #define BLK_DEFAULT_SG_TIMEOUT        (60 * HZ)
++#define BLK_MIN_SG_TIMEOUT    (7 * HZ)
+ #ifdef CONFIG_BOUNCE
+ extern int init_emergency_isa_pool(void);
+diff --git a/include/linux/jbd.h b/include/linux/jbd.h
+index 07a9b52..0be86be 100644
+--- a/include/linux/jbd.h
++++ b/include/linux/jbd.h
+@@ -908,7 +908,7 @@ extern int    journal_set_features
+                  (journal_t *, unsigned long, unsigned long, unsigned long);
+ extern int       journal_create     (journal_t *);
+ extern int       journal_load       (journal_t *journal);
+-extern void      journal_destroy    (journal_t *);
++extern int       journal_destroy    (journal_t *);
+ extern int       journal_recover    (journal_t *journal);
+ extern int       journal_wipe       (journal_t *, int);
+ extern int       journal_skip_recovery        (journal_t *);
+diff --git a/include/linux/pnp.h b/include/linux/pnp.h
+index be764e5..53b70fd 100644
+--- a/include/linux/pnp.h
++++ b/include/linux/pnp.h
+@@ -22,9 +22,11 @@ struct pnp_dev;
+  * Resource Management
+  */
+ #ifdef CONFIG_PNP
+-struct resource *pnp_get_resource(struct pnp_dev *, unsigned int, unsigned int);
++struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned long type,
++                              unsigned int num);
+ #else
+-static inline struct resource *pnp_get_resource(struct pnp_dev *dev, unsigned int type, unsigned int num)
++static inline struct resource *pnp_get_resource(struct pnp_dev *dev,
++                      unsigned long type, unsigned int num)
+ {
+       return NULL;
+ }
+diff --git a/kernel/fork.c b/kernel/fork.c
+index 7ce2ebe..d8ad2c6 100644
+--- a/kernel/fork.c
++++ b/kernel/fork.c
+@@ -313,17 +313,20 @@ static int dup_mmap(struct mm_struct *mm, struct mm_struct *oldmm)
+               file = tmp->vm_file;
+               if (file) {
+                       struct inode *inode = file->f_path.dentry->d_inode;
++                      struct address_space *mapping = file->f_mapping;
++
+                       get_file(file);
+                       if (tmp->vm_flags & VM_DENYWRITE)
+                               atomic_dec(&inode->i_writecount);
+-
+-                      /* insert tmp into the share list, just after mpnt */
+-                      spin_lock(&file->f_mapping->i_mmap_lock);
++                      spin_lock(&mapping->i_mmap_lock);
++                      if (tmp->vm_flags & VM_SHARED)
++                              mapping->i_mmap_writable++;
+                       tmp->vm_truncate_count = mpnt->vm_truncate_count;
+-                      flush_dcache_mmap_lock(file->f_mapping);
++                      flush_dcache_mmap_lock(mapping);
++                      /* insert tmp into the share list, just after mpnt */
+                       vma_prio_tree_add(tmp, mpnt);
+-                      flush_dcache_mmap_unlock(file->f_mapping);
+-                      spin_unlock(&file->f_mapping->i_mmap_lock);
++                      flush_dcache_mmap_unlock(mapping);
++                      spin_unlock(&mapping->i_mmap_lock);
+               }
+               /*
+diff --git a/kernel/sched.c b/kernel/sched.c
+index a992cbe..92c0a70 100644
+--- a/kernel/sched.c
++++ b/kernel/sched.c
+@@ -6500,7 +6500,9 @@ migration_call(struct notifier_block *nfb, unsigned long action, void *hcpu)
+                       req = list_entry(rq->migration_queue.next,
+                                        struct migration_req, list);
+                       list_del_init(&req->list);
++                      spin_unlock_irq(&rq->lock);
+                       complete(&req->done);
++                      spin_lock_irq(&rq->lock);
+               }
+               spin_unlock_irq(&rq->lock);
+               break;
+@@ -6802,15 +6804,17 @@ cpu_attach_domain(struct sched_domain *sd, struct root_domain *rd, int cpu)
+       struct sched_domain *tmp;
+       /* Remove the sched domains which do not contribute to scheduling. */
+-      for (tmp = sd; tmp; tmp = tmp->parent) {
++      for (tmp = sd; tmp; ) {
+               struct sched_domain *parent = tmp->parent;
+               if (!parent)
+                       break;
++
+               if (sd_parent_degenerate(tmp, parent)) {
+                       tmp->parent = parent->parent;
+                       if (parent->parent)
+                               parent->parent->child = tmp;
+-              }
++              } else
++                      tmp = tmp->parent;
+       }
+       if (sd && sd_degenerate(sd)) {
+diff --git a/net/atm/svc.c b/net/atm/svc.c
+index de1e4f2..8fb54dc 100644
+--- a/net/atm/svc.c
++++ b/net/atm/svc.c
+@@ -293,7 +293,10 @@ static int svc_listen(struct socket *sock,int backlog)
+               error = -EINVAL;
+               goto out;
+       }
+-      vcc_insert_socket(sk);
++      if (test_bit(ATM_VF_LISTEN, &vcc->flags)) {
++              error = -EADDRINUSE;
++              goto out;
++        }
+       set_bit(ATM_VF_WAITING, &vcc->flags);
+       prepare_to_wait(sk->sk_sleep, &wait, TASK_UNINTERRUPTIBLE);
+       sigd_enq(vcc,as_listen,NULL,NULL,&vcc->local);
+@@ -307,6 +310,7 @@ static int svc_listen(struct socket *sock,int backlog)
+               goto out;
+       }
+       set_bit(ATM_VF_LISTEN,&vcc->flags);
++      vcc_insert_socket(sk);
+       sk->sk_max_ack_backlog = backlog > 0 ? backlog : ATM_BACKLOG_DEFAULT;
+       error = -sk->sk_err;
+ out:
+diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
+index 57e26fa..915e6b7 100644
+--- a/net/ipv4/udp.c
++++ b/net/ipv4/udp.c
+@@ -302,7 +302,7 @@ static struct sock *__udp4_lib_lookup(struct net *net, __be32 saddr,
+       return result;
+ }
+-static inline struct sock *udp_v4_mcast_next(struct sock *sk,
++static inline struct sock *udp_v4_mcast_next(struct net *net, struct sock *sk,
+                                            __be16 loc_port, __be32 loc_addr,
+                                            __be16 rmt_port, __be32 rmt_addr,
+                                            int dif)
+@@ -314,7 +314,8 @@ static inline struct sock *udp_v4_mcast_next(struct sock *sk,
+       sk_for_each_from(s, node) {
+               struct inet_sock *inet = inet_sk(s);
+-              if (s->sk_hash != hnum                                  ||
++              if (!net_eq(sock_net(s), net)                           ||
++                  s->sk_hash != hnum                                  ||
+                   (inet->daddr && inet->daddr != rmt_addr)            ||
+                   (inet->dport != rmt_port && inet->dport)            ||
+                   (inet->rcv_saddr && inet->rcv_saddr != loc_addr)    ||
+@@ -1097,15 +1098,16 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
+       read_lock(&udp_hash_lock);
+       sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
+       dif = skb->dev->ifindex;
+-      sk = udp_v4_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
++      sk = udp_v4_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
+       if (sk) {
+               struct sock *sknext = NULL;
+               do {
+                       struct sk_buff *skb1 = skb;
+-                      sknext = udp_v4_mcast_next(sk_next(sk), uh->dest, daddr,
+-                                                 uh->source, saddr, dif);
++                      sknext = udp_v4_mcast_next(net, sk_next(sk), uh->dest,
++                                                 daddr, uh->source, saddr,
++                                                 dif);
+                       if (sknext)
+                               skb1 = skb_clone(skb, GFP_ATOMIC);
+diff --git a/net/ipv6/udp.c b/net/ipv6/udp.c
+index a6aecf7..e53d101 100644
+--- a/net/ipv6/udp.c
++++ b/net/ipv6/udp.c
+@@ -313,7 +313,7 @@ drop:
+       return -1;
+ }
+-static struct sock *udp_v6_mcast_next(struct sock *sk,
++static struct sock *udp_v6_mcast_next(struct net *net, struct sock *sk,
+                                     __be16 loc_port, struct in6_addr *loc_addr,
+                                     __be16 rmt_port, struct in6_addr *rmt_addr,
+                                     int dif)
+@@ -325,7 +325,7 @@ static struct sock *udp_v6_mcast_next(struct sock *sk,
+       sk_for_each_from(s, node) {
+               struct inet_sock *inet = inet_sk(s);
+-              if (sock_net(s) != sock_net(sk))
++              if (!net_eq(sock_net(s), net))
+                       continue;
+               if (s->sk_hash == num && s->sk_family == PF_INET6) {
+@@ -368,14 +368,14 @@ static int __udp6_lib_mcast_deliver(struct net *net, struct sk_buff *skb,
+       read_lock(&udp_hash_lock);
+       sk = sk_head(&udptable[udp_hashfn(net, ntohs(uh->dest))]);
+       dif = inet6_iif(skb);
+-      sk = udp_v6_mcast_next(sk, uh->dest, daddr, uh->source, saddr, dif);
++      sk = udp_v6_mcast_next(net, sk, uh->dest, daddr, uh->source, saddr, dif);
+       if (!sk) {
+               kfree_skb(skb);
+               goto out;
+       }
+       sk2 = sk;
+-      while ((sk2 = udp_v6_mcast_next(sk_next(sk2), uh->dest, daddr,
++      while ((sk2 = udp_v6_mcast_next(net, sk_next(sk2), uh->dest, daddr,
+                                       uh->source, saddr, dif))) {
+               struct sk_buff *buff = skb_clone(skb, GFP_ATOMIC);
+               if (buff) {
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index b0785ef..8e66fe0 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -2230,7 +2230,7 @@ static int unix_net_init(struct net *net)
+ #endif
+       error = 0;
+ out:
+-      return 0;
++      return error;
+ }
+ static void unix_net_exit(struct net *net)
+diff --git a/sound/pci/emu10k1/emu10k1_main.c b/sound/pci/emu10k1/emu10k1_main.c
+index 2f283ea..de5ee8f 100644
+--- a/sound/pci/emu10k1/emu10k1_main.c
++++ b/sound/pci/emu10k1/emu10k1_main.c
+@@ -1464,6 +1464,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+        .ca0151_chip = 1,
+        .spk71 = 1,
+        .spdif_bug = 1,
++       .invert_shared_spdif = 1,      /* digital/analog switch swapped */
+        .ac97_chip = 1} ,
+       {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20021102,
+        .driver = "Audigy2", .name = "Audigy 2 ZS [SB0350]", 
+@@ -1473,6 +1474,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+        .ca0151_chip = 1,
+        .spk71 = 1,
+        .spdif_bug = 1,
++       .invert_shared_spdif = 1,      /* digital/analog switch swapped */
+        .ac97_chip = 1} ,
+       {.vendor = 0x1102, .device = 0x0004, .subsystem = 0x20011102,
+        .driver = "Audigy2", .name = "Audigy 2 ZS [2001]", 
+@@ -1482,6 +1484,7 @@ static struct snd_emu_chip_details emu_chip_details[] = {
+        .ca0151_chip = 1,
+        .spk71 = 1,
+        .spdif_bug = 1,
++       .invert_shared_spdif = 1,      /* digital/analog switch swapped */
+        .ac97_chip = 1} ,
+       /* Audigy 2 */
+       /* Tested by James@superbug.co.uk 3rd July 2005 */
+diff --git a/sound/pci/hda/hda_proc.c b/sound/pci/hda/hda_proc.c
+index 1e5aff5..2fe4ea1 100644
+--- a/sound/pci/hda/hda_proc.c
++++ b/sound/pci/hda/hda_proc.c
+@@ -216,7 +216,7 @@ static void print_pin_caps(struct snd_info_buffer *buffer,
+       unsigned int caps, val;
+       caps = snd_hda_param_read(codec, nid, AC_PAR_PIN_CAP);
+-      snd_iprintf(buffer, "  Pincap 0x08%x:", caps);
++      snd_iprintf(buffer, "  Pincap 0x%08x:", caps);
+       if (caps & AC_PINCAP_IN)
+               snd_iprintf(buffer, " IN");
+       if (caps & AC_PINCAP_OUT)
+diff --git a/sound/pci/hda/patch_analog.c b/sound/pci/hda/patch_analog.c
+index e8003d9..cb13307 100644
+--- a/sound/pci/hda/patch_analog.c
++++ b/sound/pci/hda/patch_analog.c
+@@ -2247,8 +2247,12 @@ static struct hda_verb ad1988_spdif_init_verbs[] = {
+ /* AD1989 has no ADC -> SPDIF route */
+ static struct hda_verb ad1989_spdif_init_verbs[] = {
+-      /* SPDIF out pin */
++      /* SPDIF-1 out pin */
++      {0x1b, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
+       {0x1b, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
++      /* SPDIF-2/HDMI out pin */
++      {0x1d, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT },
++      {0x1d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE | 0x27}, /* 0dB */
+       { }
+ };
+@@ -2868,6 +2872,7 @@ static struct snd_pci_quirk ad1988_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1043, 0x81ec, "Asus P5B-DLX", AD1988_6STACK_DIG),
+       SND_PCI_QUIRK(0x1043, 0x81f6, "Asus M2N-SLI", AD1988_6STACK_DIG),
+       SND_PCI_QUIRK(0x1043, 0x8277, "Asus P5K-E/WIFI-AP", AD1988_6STACK_DIG),
++      SND_PCI_QUIRK(0x1043, 0x8311, "Asus P5Q-Premium/Pro", AD1988_6STACK_DIG),
+       {}
+ };
+@@ -3842,6 +3847,9 @@ static const char *ad1884a_models[AD1884A_MODELS] = {
+ static struct snd_pci_quirk ad1884a_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x103c, 0x3030, "HP", AD1884A_MOBILE),
++      SND_PCI_QUIRK(0x103c, 0x3056, "HP", AD1884A_MOBILE),
++      SND_PCI_QUIRK(0x103c, 0x30e7, "HP EliteBook 8530p", AD1884A_LAPTOP),
++      SND_PCI_QUIRK(0x103c, 0x3614, "HP 6730s", AD1884A_LAPTOP),
+       SND_PCI_QUIRK(0x17aa, 0x20ac, "Thinkpad X300", AD1884A_THINKPAD),
+       {}
+ };
+diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
+index 6602516..a1a3a34 100644
+--- a/sound/pci/hda/patch_realtek.c
++++ b/sound/pci/hda/patch_realtek.c
+@@ -100,6 +100,7 @@ enum {
+       ALC262_BENQ_T31,
+       ALC262_ULTRA,
+       ALC262_LENOVO_3000,
++      ALC262_NEC,
+       ALC262_AUTO,
+       ALC262_MODEL_LAST /* last tag */
+ };
+@@ -291,6 +292,13 @@ struct alc_spec {
+       /* for PLL fix */
+       hda_nid_t pll_nid;
+       unsigned int pll_coef_idx, pll_coef_bit;
++
++#ifdef SND_HDA_NEEDS_RESUME
++#define ALC_MAX_PINS  16
++      unsigned int num_pins;
++      hda_nid_t pin_nids[ALC_MAX_PINS];
++      unsigned int pin_cfgs[ALC_MAX_PINS];
++#endif
+ };
+ /*
+@@ -2722,6 +2730,64 @@ static void alc_free(struct hda_codec *codec)
+       codec->spec = NULL; /* to be sure */
+ }
++#ifdef SND_HDA_NEEDS_RESUME
++static void store_pin_configs(struct hda_codec *codec)
++{
++      struct alc_spec *spec = codec->spec;
++      hda_nid_t nid, end_nid;
++
++      end_nid = codec->start_nid + codec->num_nodes;
++      for (nid = codec->start_nid; nid < end_nid; nid++) {
++              unsigned int wid_caps = get_wcaps(codec, nid);
++              unsigned int wid_type =
++                      (wid_caps & AC_WCAP_TYPE) >> AC_WCAP_TYPE_SHIFT;
++              if (wid_type != AC_WID_PIN)
++                      continue;
++              if (spec->num_pins >= ARRAY_SIZE(spec->pin_nids))
++                      break;
++              spec->pin_nids[spec->num_pins] = nid;
++              spec->pin_cfgs[spec->num_pins] =
++                      snd_hda_codec_read(codec, nid, 0,
++                                         AC_VERB_GET_CONFIG_DEFAULT, 0);
++              spec->num_pins++;
++      }
++}
++
++static void resume_pin_configs(struct hda_codec *codec)
++{
++      struct alc_spec *spec = codec->spec;
++      int i;
++
++      for (i = 0; i < spec->num_pins; i++) {
++              hda_nid_t pin_nid = spec->pin_nids[i];
++              unsigned int pin_config = spec->pin_cfgs[i];
++              snd_hda_codec_write(codec, pin_nid, 0,
++                                  AC_VERB_SET_CONFIG_DEFAULT_BYTES_0,
++                                  pin_config & 0x000000ff);
++              snd_hda_codec_write(codec, pin_nid, 0,
++                                  AC_VERB_SET_CONFIG_DEFAULT_BYTES_1,
++                                  (pin_config & 0x0000ff00) >> 8);
++              snd_hda_codec_write(codec, pin_nid, 0,
++                                  AC_VERB_SET_CONFIG_DEFAULT_BYTES_2,
++                                  (pin_config & 0x00ff0000) >> 16);
++              snd_hda_codec_write(codec, pin_nid, 0,
++                                  AC_VERB_SET_CONFIG_DEFAULT_BYTES_3,
++                                  pin_config >> 24);
++      }
++}
++
++static int alc_resume(struct hda_codec *codec)
++{
++      resume_pin_configs(codec);
++      codec->patch_ops.init(codec);
++      snd_hda_codec_resume_amp(codec);
++      snd_hda_codec_resume_cache(codec);
++      return 0;
++}
++#else
++#define store_pin_configs(codec)
++#endif
++
+ /*
+  */
+ static struct hda_codec_ops alc_patch_ops = {
+@@ -2730,6 +2796,9 @@ static struct hda_codec_ops alc_patch_ops = {
+       .init = alc_init,
+       .free = alc_free,
+       .unsol_event = alc_unsol_event,
++#ifdef SND_HDA_NEEDS_RESUME
++      .resume = alc_resume,
++#endif
+ #ifdef CONFIG_SND_HDA_POWER_SAVE
+       .check_power_status = alc_check_power_status,
+ #endif
+@@ -3776,6 +3845,7 @@ static int alc880_parse_auto_config(struct hda_codec *codec)
+       spec->num_mux_defs = 1;
+       spec->input_mux = &spec->private_imux;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -5124,6 +5194,7 @@ static int alc260_parse_auto_config(struct hda_codec *codec)
+       }
+       spec->num_mixers++;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -6554,6 +6625,7 @@ static int patch_alc882(struct hda_codec *codec)
+                       board_config = ALC885_MACPRO;
+                       break;
+               case 0x106b1000: /* iMac 24 */
++              case 0x106b2800: /* AppleTV */
+                       board_config = ALC885_IMAC24;
+                       break;
+               case 0x106b00a1: /* Macbook (might be wrong - PCI SSID?) */
+@@ -6563,7 +6635,8 @@ static int patch_alc882(struct hda_codec *codec)
+                       break;
+               default:
+                       /* ALC889A is handled better as ALC888-compatible */
+-                      if (codec->revision_id == 0x100103) {
++                      if (codec->revision_id == 0x100101 ||
++                          codec->revision_id == 0x100103) {
+                               alc_free(codec);
+                               return patch_alc883(codec);
+                       }
+@@ -7940,6 +8013,7 @@ static const char *alc883_models[ALC883_MODEL_LAST] = {
+ static struct snd_pci_quirk alc883_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1019, 0x6668, "ECS", ALC883_3ST_6ch_DIG),
+       SND_PCI_QUIRK(0x1025, 0x006c, "Acer Aspire 9810", ALC883_ACER_ASPIRE),
++      SND_PCI_QUIRK(0x1025, 0x0090, "Acer Aspire", ALC883_ACER_ASPIRE),
+       SND_PCI_QUIRK(0x1025, 0x0110, "Acer Aspire", ALC883_ACER_ASPIRE),
+       SND_PCI_QUIRK(0x1025, 0x0112, "Acer Aspire 9303", ALC883_ACER_ASPIRE),
+       SND_PCI_QUIRK(0x1025, 0x0121, "Acer Aspire 5920G", ALC883_ACER_ASPIRE), 
+@@ -7990,6 +8064,7 @@ static struct snd_pci_quirk alc883_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x17aa, 0x3bfc, "Lenovo NB0763", ALC883_LENOVO_NB0763),
+       SND_PCI_QUIRK(0x17aa, 0x3bfd, "Lenovo NB0763", ALC883_LENOVO_NB0763),
+       SND_PCI_QUIRK(0x17c0, 0x4071, "MEDION MD2", ALC883_MEDION_MD2),
++      SND_PCI_QUIRK(0x17c0, 0x4085, "MEDION MD96630", ALC888_LENOVO_MS7195_DIG),
+       SND_PCI_QUIRK(0x17f2, 0x5000, "Albatron KI690-AM2", ALC883_6ST_DIG),
+       SND_PCI_QUIRK(0x1991, 0x5625, "Haier W66", ALC883_HAIER_W66),
+       SND_PCI_QUIRK(0x8086, 0x0001, "DG33BUC", ALC883_3ST_6ch_INTEL),
+@@ -8948,6 +9023,41 @@ static void alc262_hippo1_unsol_event(struct hda_codec *codec,
+ }
+ /*
++ * nec model
++ *  0x15 = headphone
++ *  0x16 = internal speaker
++ *  0x18 = external mic
++ */
++
++static struct snd_kcontrol_new alc262_nec_mixer[] = {
++      HDA_CODEC_VOLUME_MONO("Speaker Playback Volume", 0x0e, 1, 0x0, HDA_OUTPUT),
++      HDA_CODEC_MUTE_MONO("Speaker Playback Switch", 0x16, 0, 0x0, HDA_OUTPUT),
++
++      HDA_CODEC_VOLUME("Mic Playback Volume", 0x0b, 0x0, HDA_INPUT),
++      HDA_CODEC_MUTE("Mic Playback Switch", 0x0b, 0x0, HDA_INPUT),
++      HDA_CODEC_VOLUME("Mic Boost", 0x18, 0, HDA_INPUT),
++
++      HDA_CODEC_VOLUME("Headphone Playback Volume", 0x0d, 0x0, HDA_OUTPUT),
++      HDA_CODEC_MUTE("Headphone Playback Switch", 0x15, 0x0, HDA_OUTPUT),
++      { } /* end */
++};
++
++static struct hda_verb alc262_nec_verbs[] = {
++      /* Unmute Speaker */
++      {0x16, AC_VERB_SET_AMP_GAIN_MUTE, AMP_OUT_UNMUTE},
++
++      /* Headphone */
++      {0x15, AC_VERB_SET_UNSOLICITED_ENABLE, AC_USRSP_EN | ALC880_HP_EVENT},
++      {0x15, AC_VERB_SET_PIN_WIDGET_CONTROL, PIN_OUT},
++
++      /* External mic to headphone */
++      {0x0d, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
++      /* External mic to speaker */
++      {0x0e, AC_VERB_SET_AMP_GAIN_MUTE, AMP_IN_UNMUTE(1)},
++      {}
++};
++
++/*
+  * fujitsu model
+  *  0x14 = headphone/spdif-out, 0x15 = internal speaker,
+  *  0x1b = port replicator headphone out
+@@ -9693,6 +9803,7 @@ static int alc262_parse_auto_config(struct hda_codec *codec)
+       if (err < 0)
+               return err;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -9731,11 +9842,13 @@ static const char *alc262_models[ALC262_MODEL_LAST] = {
+       [ALC262_SONY_ASSAMD]    = "sony-assamd",
+       [ALC262_ULTRA]          = "ultra",
+       [ALC262_LENOVO_3000]    = "lenovo-3000",
++      [ALC262_NEC]            = "nec",
+       [ALC262_AUTO]           = "auto",
+ };
+ static struct snd_pci_quirk alc262_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1002, 0x437b, "Hippo", ALC262_HIPPO),
++      SND_PCI_QUIRK(0x1033, 0x8895, "NEC Versa S9100", ALC262_NEC),
+       SND_PCI_QUIRK(0x103c, 0x12fe, "HP xw9400", ALC262_HP_BPC),
+       SND_PCI_QUIRK(0x103c, 0x12ff, "HP xw4550", ALC262_HP_BPC),
+       SND_PCI_QUIRK(0x103c, 0x1306, "HP xw8600", ALC262_HP_BPC),
+@@ -9946,6 +10059,16 @@ static struct alc_config_preset alc262_presets[] = {
+               .input_mux = &alc262_fujitsu_capture_source,
+               .unsol_event = alc262_lenovo_3000_unsol_event,
+       },
++      [ALC262_NEC] = {
++              .mixers = { alc262_nec_mixer },
++              .init_verbs = { alc262_nec_verbs },
++              .num_dacs = ARRAY_SIZE(alc262_dac_nids),
++              .dac_nids = alc262_dac_nids,
++              .hp_nid = 0x03,
++              .num_channel_mode = ARRAY_SIZE(alc262_modes),
++              .channel_mode = alc262_modes,
++              .input_mux = &alc262_capture_source,
++      },
+ };
+ static int patch_alc262(struct hda_codec *codec)
+@@ -10712,6 +10835,7 @@ static int alc268_parse_auto_config(struct hda_codec *codec)
+       if (err < 0)
+               return err;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -10758,6 +10882,7 @@ static struct snd_pci_quirk alc268_cfg_tbl[] = {
+       SND_PCI_QUIRK(0x1043, 0x1205, "ASUS W7J", ALC268_3ST),
+       SND_PCI_QUIRK(0x1179, 0xff10, "TOSHIBA A205", ALC268_TOSHIBA),
+       SND_PCI_QUIRK(0x1179, 0xff50, "TOSHIBA A305", ALC268_TOSHIBA),
++      SND_PCI_QUIRK(0x1179, 0xff64, "TOSHIBA L305", ALC268_TOSHIBA),
+       SND_PCI_QUIRK(0x14c0, 0x0025, "COMPAL IFL90/JFL-92", ALC268_TOSHIBA),
+       SND_PCI_QUIRK(0x152d, 0x0763, "Diverse (CPR2000)", ALC268_ACER),
+       SND_PCI_QUIRK(0x152d, 0x0771, "Quanta IL1", ALC267_QUANTA_IL1),
+@@ -10990,6 +11115,14 @@ static hda_nid_t alc269_adc_nids[1] = {
+       0x08,
+ };
++static hda_nid_t alc269_capsrc_nids[1] = {
++      0x23,
++};
++
++/* NOTE: ADC2 (0x07) is connected from a recording *MIXER* (0x24),
++ *       not a mux!
++ */
++
+ static struct hda_input_mux alc269_eeepc_dmic_capture_source = {
+       .num_items = 2,
+       .items = {
+@@ -11356,6 +11489,10 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
+       spec->init_verbs[spec->num_init_verbs++] = alc269_init_verbs;
+       spec->num_mux_defs = 1;
+       spec->input_mux = &spec->private_imux;
++      /* set default input source */
++      snd_hda_codec_write_cache(codec, alc269_capsrc_nids[0],
++                                0, AC_VERB_SET_CONNECT_SEL,
++                                spec->input_mux->items[0].index);
+       err = alc_auto_add_mic_boost(codec);
+       if (err < 0)
+@@ -11364,6 +11501,7 @@ static int alc269_parse_auto_config(struct hda_codec *codec)
+       spec->mixers[spec->num_mixers] = alc269_capture_mixer;
+       spec->num_mixers++;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -11488,6 +11626,7 @@ static int patch_alc269(struct hda_codec *codec)
+       spec->adc_nids = alc269_adc_nids;
+       spec->num_adc_nids = ARRAY_SIZE(alc269_adc_nids);
++      spec->capsrc_nids = alc269_capsrc_nids;
+       codec->patch_ops = alc_patch_ops;
+       if (board_config == ALC269_AUTO)
+@@ -12431,6 +12570,7 @@ static int alc861_parse_auto_config(struct hda_codec *codec)
+       spec->mixers[spec->num_mixers] = alc861_capture_mixer;
+       spec->num_mixers++;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -13542,6 +13682,7 @@ static int alc861vd_parse_auto_config(struct hda_codec *codec)
+       if (err < 0)
+               return err;
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -14789,6 +14930,8 @@ static int alc662_parse_auto_config(struct hda_codec *codec)
+       spec->mixers[spec->num_mixers] = alc662_capture_mixer;
+       spec->num_mixers++;
++
++      store_pin_configs(codec);
+       return 1;
+ }
+@@ -14846,6 +14989,9 @@ static int patch_alc662(struct hda_codec *codec)
+       if (codec->vendor_id == 0x10ec0663) {
+               spec->stream_name_analog = "ALC663 Analog";
+               spec->stream_name_digital = "ALC663 Digital";
++      } else if (codec->vendor_id == 0x10ec0272) {
++              spec->stream_name_analog = "ALC272 Analog";
++              spec->stream_name_digital = "ALC272 Digital";
+       } else {
+               spec->stream_name_analog = "ALC662 Analog";
+               spec->stream_name_digital = "ALC662 Digital";
+@@ -14883,6 +15029,7 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
+       { .id = 0x10ec0267, .name = "ALC267", .patch = patch_alc268 },
+       { .id = 0x10ec0268, .name = "ALC268", .patch = patch_alc268 },
+       { .id = 0x10ec0269, .name = "ALC269", .patch = patch_alc269 },
++      { .id = 0x10ec0272, .name = "ALC272", .patch = patch_alc662 },
+       { .id = 0x10ec0861, .rev = 0x100340, .name = "ALC660",
+         .patch = patch_alc861 },
+       { .id = 0x10ec0660, .name = "ALC660-VD", .patch = patch_alc861vd },
+@@ -14896,9 +15043,12 @@ struct hda_codec_preset snd_hda_preset_realtek[] = {
+       { .id = 0x10ec0880, .name = "ALC880", .patch = patch_alc880 },
+       { .id = 0x10ec0882, .name = "ALC882", .patch = patch_alc882 },
+       { .id = 0x10ec0883, .name = "ALC883", .patch = patch_alc883 },
++      { .id = 0x10ec0885, .rev = 0x100101, .name = "ALC889A",
++        .patch = patch_alc882 }, /* should be patch_alc883() in future */
+       { .id = 0x10ec0885, .rev = 0x100103, .name = "ALC889A",
+         .patch = patch_alc882 }, /* should be patch_alc883() in future */
+       { .id = 0x10ec0885, .name = "ALC885", .patch = patch_alc882 },
++      { .id = 0x10ec0887, .name = "ALC887", .patch = patch_alc883 },
+       { .id = 0x10ec0888, .name = "ALC888", .patch = patch_alc883 },
+       { .id = 0x10ec0889, .name = "ALC889", .patch = patch_alc883 },
+       {} /* terminator */
+diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
+index 732ce13..1d96aed 100644
+--- a/sound/pci/hda/patch_sigmatel.c
++++ b/sound/pci/hda/patch_sigmatel.c
+@@ -105,6 +105,7 @@ enum {
+       STAC_MACBOOK_PRO_V2,
+       STAC_IMAC_INTEL,
+       STAC_IMAC_INTEL_20,
++      STAC_ECS_202,
+       STAC_922X_DELL_D81,
+       STAC_922X_DELL_D82,
+       STAC_922X_DELL_M81,
+@@ -547,8 +548,8 @@ static struct hda_verb dell_eq_core_init[] = {
+       { 0x1f, AC_VERB_SET_VOLUME_KNOB_CONTROL, 0xec},
+       /* setup audio connections */
+       { 0x0d, AC_VERB_SET_CONNECT_SEL, 0x00},
+-      { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x01},
+-      { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x02},
++      { 0x0a, AC_VERB_SET_CONNECT_SEL, 0x02},
++      { 0x0f, AC_VERB_SET_CONNECT_SEL, 0x01},
+       /* setup adcs to point to mixer */
+       { 0x20, AC_VERB_SET_CONNECT_SEL, 0x0b},
+       { 0x21, AC_VERB_SET_CONNECT_SEL, 0x0b},
+@@ -1310,7 +1311,7 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+       SND_PCI_QUIRK(PCI_VENDOR_ID_INTEL, 0x2668,
+                               "DFI LanParty", STAC_92HD73XX_REF),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0254,
+-                              "unknown Dell", STAC_DELL_M6),
++                              "Dell Studio 1535", STAC_DELL_M6),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0255,
+                               "unknown Dell", STAC_DELL_M6),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0256,
+@@ -1323,6 +1324,8 @@ static struct snd_pci_quirk stac92hd73xx_cfg_tbl[] = {
+                               "unknown Dell", STAC_DELL_M6),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x0271,
+                               "unknown Dell", STAC_DELL_M6),
++      SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x029f,
++                              "Dell Studio 15", STAC_DELL_M6),
+       {} /* terminator */
+ };
+@@ -1478,6 +1481,11 @@ static unsigned int intel_mac_v5_pin_configs[10] = {
+       0x400000fc, 0x400000fb,
+ };
++static unsigned int ecs202_pin_configs[10] = {
++      0x0221401f, 0x02a19020, 0x01a19020, 0x01114010,
++      0x408000f0, 0x01813022, 0x074510a0, 0x40c400f1,
++      0x9037012e, 0x40e000f2,
++};
+ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
+       [STAC_D945_REF] = ref922x_pin_configs,
+@@ -1496,6 +1504,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
+       [STAC_MACBOOK_PRO_V2] = intel_mac_v3_pin_configs,
+       [STAC_IMAC_INTEL] = intel_mac_v2_pin_configs,
+       [STAC_IMAC_INTEL_20] = intel_mac_v3_pin_configs,
++      [STAC_ECS_202] = ecs202_pin_configs,
+       [STAC_922X_DELL_D81] = dell_922x_d81_pin_configs,
+       [STAC_922X_DELL_D82] = dell_922x_d82_pin_configs,       
+       [STAC_922X_DELL_M81] = dell_922x_m81_pin_configs,
+@@ -1519,6 +1528,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
+       [STAC_MACBOOK_PRO_V2]   = "macbook-pro",
+       [STAC_IMAC_INTEL] = "imac-intel",
+       [STAC_IMAC_INTEL_20] = "imac-intel-20",
++      [STAC_ECS_202] = "ecs202",
+       [STAC_922X_DELL_D81] = "dell-d81",
+       [STAC_922X_DELL_D82] = "dell-d82",
+       [STAC_922X_DELL_M81] = "dell-m81",
+@@ -1605,6 +1615,33 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
+                     "unknown Dell", STAC_922X_DELL_D81),
+       SND_PCI_QUIRK(PCI_VENDOR_ID_DELL, 0x01d7,
+                     "Dell XPS M1210", STAC_922X_DELL_M82),
++      /* ECS/PC Chips boards */
++      SND_PCI_QUIRK(0x1019, 0x2144,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2608,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2633,
++                    "ECS/PC chips P17G/1333", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2811,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2812,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2813,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2814,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2815,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2816,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2817,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2818,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2819,
++                    "ECS/PC chips", STAC_ECS_202),
++      SND_PCI_QUIRK(0x1019, 0x2820,
++                    "ECS/PC chips", STAC_ECS_202),
+       {} /* terminator */
+ };
+@@ -2468,7 +2505,7 @@ static int stac92xx_auto_create_multi_out_ctls(struct hda_codec *codec,
+               }
+       }
+-      if (cfg->hp_outs > 1) {
++      if (cfg->hp_outs > 1 && cfg->line_out_type == AUTO_PIN_LINE_OUT) {
+               err = stac92xx_add_control(spec,
+                       STAC_CTL_WIDGET_HP_SWITCH,
+                       "Headphone as Line Out Switch", 0);
diff --git a/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.9-10 b/src/patches/suse-2.6.27.39/patches.kernel.org/patch-2.6.27.9-10
new file mode 100644 (file)
index 0000000..4282610
--- /dev/null
@@ -0,0 +1,1276 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.10
+
+Upstream 2.6.27.10 release from kernel.org
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
+index 1150444..792be86 100644
+--- a/Documentation/kernel-parameters.txt
++++ b/Documentation/kernel-parameters.txt
+@@ -283,7 +283,7 @@ and is between 256 and 4096 characters. It is defined in the file
+                       Possible values are:
+                       isolate - enable device isolation (each device, as far
+                                 as possible, will get its own protection
+-                                domain)
++                                domain) [default]
+       amd_iommu_size= [HW,X86-64]
+                       Define the size of the aperture for the AMD IOMMU
+                       driver. Possible values are:
+diff --git a/Makefile b/Makefile
+index cb93e2b..24f4804 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ VERSION = 2
+ PATCHLEVEL = 6
+ SUBLEVEL = 27
+-EXTRAVERSION = .9
++EXTRAVERSION = .10
+ NAME = Trembling Tortoise
+ # *DOCUMENTATION*
+diff --git a/arch/x86/kernel/amd_iommu_init.c b/arch/x86/kernel/amd_iommu_init.c
+index bccd0ef..a1378c4 100644
+--- a/arch/x86/kernel/amd_iommu_init.c
++++ b/arch/x86/kernel/amd_iommu_init.c
+@@ -120,7 +120,7 @@ u16 amd_iommu_last_bdf;                    /* largest PCI device id we have
+ LIST_HEAD(amd_iommu_unity_map);               /* a list of required unity mappings
+                                          we find in ACPI */
+ unsigned amd_iommu_aperture_order = 26; /* size of aperture in power of 2 */
+-int amd_iommu_isolate;                        /* if 1, device isolation is enabled */
++int amd_iommu_isolate = 1;            /* if 1, device isolation is enabled */
+ LIST_HEAD(amd_iommu_list);            /* list of all AMD IOMMUs in the
+                                          system */
+diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c
+index 7667443..6d5a3c4 100644
+--- a/arch/x86/kernel/setup.c
++++ b/arch/x86/kernel/setup.c
+@@ -634,6 +634,9 @@ void __init setup_arch(char **cmdline_p)
+       printk(KERN_INFO "Command line: %s\n", boot_command_line);
+ #endif
++      /* VMI may relocate the fixmap; do this before touching ioremap area */
++      vmi_init();
++
+       early_cpu_init();
+       early_ioremap_init();
+@@ -707,13 +710,8 @@ void __init setup_arch(char **cmdline_p)
+       check_efer();
+ #endif
+-#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
+-      /*
+-       * Must be before kernel pagetables are setup
+-       * or fixmap area is touched.
+-       */
+-      vmi_init();
+-#endif
++      /* Must be before kernel pagetables are setup */
++      vmi_activate();
+       /* after early param, so could get panic from serial */
+       reserve_early_setup_data();
+diff --git a/arch/x86/kernel/smpboot.c b/arch/x86/kernel/smpboot.c
+index 7985c5b..259569f 100644
+--- a/arch/x86/kernel/smpboot.c
++++ b/arch/x86/kernel/smpboot.c
+@@ -289,9 +289,7 @@ static void __cpuinit start_secondary(void *unused)
+        * fragile that we want to limit the things done here to the
+        * most necessary things.
+        */
+-#ifdef CONFIG_VMI
+       vmi_bringup();
+-#endif
+       cpu_init();
+       preempt_disable();
+       smp_callin();
+diff --git a/arch/x86/kernel/vmi_32.c b/arch/x86/kernel/vmi_32.c
+index edfb09f..f370d38 100644
+--- a/arch/x86/kernel/vmi_32.c
++++ b/arch/x86/kernel/vmi_32.c
+@@ -960,8 +960,6 @@ static inline int __init activate_vmi(void)
+ void __init vmi_init(void)
+ {
+-      unsigned long flags;
+-
+       if (!vmi_rom)
+               probe_vmi_rom();
+       else
+@@ -973,13 +971,21 @@ void __init vmi_init(void)
+       reserve_top_address(-vmi_rom->virtual_top);
+-      local_irq_save(flags);
+-      activate_vmi();
+-
+ #ifdef CONFIG_X86_IO_APIC
+       /* This is virtual hardware; timer routing is wired correctly */
+       no_timer_check = 1;
+ #endif
++}
++
++void vmi_activate(void)
++{
++      unsigned long flags;
++
++      if (!vmi_rom)
++              return;
++
++      local_irq_save(flags);
++      activate_vmi();
+       local_irq_restore(flags & X86_EFLAGS_IF);
+ }
+diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c
+index b551cda..f38e2af 100644
+--- a/drivers/ata/libata-core.c
++++ b/drivers/ata/libata-core.c
+@@ -3979,17 +3979,70 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
+       { "ST3160023AS",        "3.42",         ATA_HORKAGE_NONCQ },
+       /* Seagate NCQ + FLUSH CACHE firmware bug */
+-      { "ST31500341AS",       "9JU138",       ATA_HORKAGE_NONCQ |
++      { "ST31500341AS",       "SD15",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+-      { "ST31000333AS",       "9FZ136",       ATA_HORKAGE_NONCQ |
++      { "ST31500341AS",       "SD16",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+-      { "ST3640623AS",        "9FZ164",       ATA_HORKAGE_NONCQ |
++      { "ST31500341AS",       "SD17",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+-      { "ST3640323AS",        "9FZ134",       ATA_HORKAGE_NONCQ |
++      { "ST31500341AS",       "SD18",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+-      { "ST3320813AS",        "9FZ182",       ATA_HORKAGE_NONCQ |
++      { "ST31500341AS",       "SD19",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+-      { "ST3320613AS",        "9FZ162",       ATA_HORKAGE_NONCQ |
++
++      { "ST31000333AS",       "SD15",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST31000333AS",       "SD16",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST31000333AS",       "SD17",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST31000333AS",       "SD18",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST31000333AS",       "SD19",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++
++      { "ST3640623AS",        "SD15",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640623AS",        "SD16",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640623AS",        "SD17",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640623AS",        "SD18",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640623AS",        "SD19",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++
++      { "ST3640323AS",        "SD15",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640323AS",        "SD16",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640323AS",        "SD17",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640323AS",        "SD18",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3640323AS",        "SD19",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++
++      { "ST3320813AS",        "SD15",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320813AS",        "SD16",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320813AS",        "SD17",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320813AS",        "SD18",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320813AS",        "SD19",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++
++      { "ST3320613AS",        "SD15",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320613AS",        "SD16",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320613AS",        "SD17",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320613AS",        "SD18",         ATA_HORKAGE_NONCQ |
++                                              ATA_HORKAGE_FIRMWARE_WARN },
++      { "ST3320613AS",        "SD19",         ATA_HORKAGE_NONCQ |
+                                               ATA_HORKAGE_FIRMWARE_WARN },
+       /* Blacklist entries taken from Silicon Image 3124/3132
+diff --git a/drivers/char/cp437.uni b/drivers/char/cp437.uni
+index 1f06889..bc61634 100644
+--- a/drivers/char/cp437.uni
++++ b/drivers/char/cp437.uni
+@@ -27,7 +27,7 @@
+ 0x0c  U+2640
+ 0x0d  U+266a
+ 0x0e  U+266b
+-0x0f  U+263c
++0x0f  U+263c U+00a4
+ 0x10  U+25b6 U+25ba
+ 0x11  U+25c0 U+25c4
+ 0x12  U+2195
+@@ -55,7 +55,7 @@
+ 0x24  U+0024
+ 0x25  U+0025
+ 0x26  U+0026
+-0x27  U+0027
++0x27  U+0027 U+00b4
+ 0x28  U+0028
+ 0x29  U+0029
+ 0x2a  U+002a
+@@ -84,7 +84,7 @@
+ 0x41  U+0041 U+00c0 U+00c1 U+00c2 U+00c3
+ 0x42  U+0042
+ 0x43  U+0043 U+00a9
+-0x44  U+0044
++0x44  U+0044 U+00d0
+ 0x45  U+0045 U+00c8 U+00ca U+00cb
+ 0x46  U+0046
+ 0x47  U+0047
+@@ -140,7 +140,7 @@
+ 0x79  U+0079 U+00fd
+ 0x7a  U+007a
+ 0x7b  U+007b
+-0x7c  U+007c U+00a5
++0x7c  U+007c U+00a6
+ 0x7d  U+007d
+ 0x7e  U+007e
+ #
+@@ -263,10 +263,10 @@
+ 0xe8  U+03a6 U+00d8
+ 0xe9  U+0398
+ 0xea  U+03a9 U+2126
+-0xeb  U+03b4
++0xeb  U+03b4 U+00f0
+ 0xec  U+221e
+ 0xed  U+03c6 U+00f8
+-0xee  U+03b5
++0xee  U+03b5 U+2208
+ 0xef  U+2229
+ 0xf0  U+2261
+ 0xf1  U+00b1
+diff --git a/drivers/char/vt.c b/drivers/char/vt.c
+index 60359c3..d429499 100644
+--- a/drivers/char/vt.c
++++ b/drivers/char/vt.c
+@@ -2287,7 +2287,7 @@ rescan_last_byte:
+                                   continue; /* nothing to display */
+                               }
+                               /* Glyph not found */
+-                              if ((!(vc->vc_utf && !vc->vc_disp_ctrl) || c < 128) && !(c & ~charmask)) {
++                              if ((!(vc->vc_utf && !vc->vc_disp_ctrl) && c < 128) && !(c & ~charmask)) {
+                                   /* In legacy mode use the glyph we get by a 1:1 mapping.
+                                      This would make absolutely no sense with Unicode in mind,
+                                      but do this for ASCII characters since a font may lack
+diff --git a/drivers/char/xilinx_hwicap/buffer_icap.c b/drivers/char/xilinx_hwicap/buffer_icap.c
+index aa7f796..05d8977 100644
+--- a/drivers/char/xilinx_hwicap/buffer_icap.c
++++ b/drivers/char/xilinx_hwicap/buffer_icap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/buffer_icap.h b/drivers/char/xilinx_hwicap/buffer_icap.h
+index 8b0252b..d4f419e 100644
+--- a/drivers/char/xilinx_hwicap/buffer_icap.h
++++ b/drivers/char/xilinx_hwicap/buffer_icap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/fifo_icap.c b/drivers/char/xilinx_hwicap/fifo_icap.c
+index 776b505..02225eb 100644
+--- a/drivers/char/xilinx_hwicap/fifo_icap.c
++++ b/drivers/char/xilinx_hwicap/fifo_icap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/fifo_icap.h b/drivers/char/xilinx_hwicap/fifo_icap.h
+index 62bda45..4c9dd9a 100644
+--- a/drivers/char/xilinx_hwicap/fifo_icap.h
++++ b/drivers/char/xilinx_hwicap/fifo_icap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.c b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
+index 278c985..15ead99 100644
+--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.c
++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.c
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2002 Xilinx Inc., Systems Engineering Group
+  *     (c) Copyright 2004 Xilinx Inc., Systems Engineering Group
+  *     (c) Copyright 2007-2008 Xilinx Inc.
+diff --git a/drivers/char/xilinx_hwicap/xilinx_hwicap.h b/drivers/char/xilinx_hwicap/xilinx_hwicap.h
+index 24d0d9b..8cca119 100644
+--- a/drivers/char/xilinx_hwicap/xilinx_hwicap.h
++++ b/drivers/char/xilinx_hwicap/xilinx_hwicap.h
+@@ -21,9 +21,6 @@
+  *     INFRINGEMENT, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+  *     FOR A PARTICULAR PURPOSE.
+  *
+- *     Xilinx products are not intended for use in life support appliances,
+- *     devices, or systems. Use in such applications is expressly prohibited.
+- *
+  *     (c) Copyright 2003-2007 Xilinx Inc.
+  *     All rights reserved.
+  *
+diff --git a/drivers/firewire/fw-ohci.c b/drivers/firewire/fw-ohci.c
+index 251416f..595759c 100644
+--- a/drivers/firewire/fw-ohci.c
++++ b/drivers/firewire/fw-ohci.c
+@@ -958,6 +958,7 @@ at_context_queue_packet(struct context *ctx, struct fw_packet *packet)
+                       packet->ack = RCODE_SEND_ERROR;
+                       return -1;
+               }
++              packet->payload_bus = payload_bus;
+               d[2].req_count    = cpu_to_le16(packet->payload_length);
+               d[2].data_address = cpu_to_le32(payload_bus);
+@@ -1009,7 +1010,6 @@ static int handle_at_packet(struct context *context,
+       struct driver_data *driver_data;
+       struct fw_packet *packet;
+       struct fw_ohci *ohci = context->ohci;
+-      dma_addr_t payload_bus;
+       int evt;
+       if (last->transfer_status == 0)
+@@ -1022,9 +1022,8 @@ static int handle_at_packet(struct context *context,
+               /* This packet was cancelled, just continue. */
+               return 1;
+-      payload_bus = le32_to_cpu(last->data_address);
+-      if (payload_bus != 0)
+-              dma_unmap_single(ohci->card.device, payload_bus,
++      if (packet->payload_bus)
++              dma_unmap_single(ohci->card.device, packet->payload_bus,
+                                packet->payload_length, DMA_TO_DEVICE);
+       evt = le16_to_cpu(last->transfer_status) & 0x1f;
+@@ -1681,6 +1680,10 @@ static int ohci_cancel_packet(struct fw_card *card, struct fw_packet *packet)
+       if (packet->ack != 0)
+               goto out;
++      if (packet->payload_bus)
++              dma_unmap_single(ohci->card.device, packet->payload_bus,
++                               packet->payload_length, DMA_TO_DEVICE);
++
+       log_ar_at_event('T', packet->speed, packet->header, 0x20);
+       driver_data->packet = NULL;
+       packet->ack = RCODE_CANCELLED;
+diff --git a/drivers/firewire/fw-transaction.c b/drivers/firewire/fw-transaction.c
+index e5d1a0b..27f7c7e 100644
+--- a/drivers/firewire/fw-transaction.c
++++ b/drivers/firewire/fw-transaction.c
+@@ -207,6 +207,7 @@ fw_fill_request(struct fw_packet *packet, int tcode, int tlabel,
+       packet->speed = speed;
+       packet->generation = generation;
+       packet->ack = 0;
++      packet->payload_bus = 0;
+ }
+ /**
+@@ -541,6 +542,8 @@ fw_fill_response(struct fw_packet *response, u32 *request_header,
+               BUG();
+               return;
+       }
++
++      response->payload_bus = 0;
+ }
+ EXPORT_SYMBOL(fw_fill_response);
+diff --git a/drivers/firewire/fw-transaction.h b/drivers/firewire/fw-transaction.h
+index 81b15ba..04cc9b0 100644
+--- a/drivers/firewire/fw-transaction.h
++++ b/drivers/firewire/fw-transaction.h
+@@ -27,6 +27,7 @@
+ #include <linux/list.h>
+ #include <linux/spinlock_types.h>
+ #include <linux/timer.h>
++#include <linux/types.h>
+ #include <linux/workqueue.h>
+ #define TCODE_IS_READ_REQUEST(tcode)  (((tcode) & ~1) == 4)
+@@ -153,6 +154,7 @@ struct fw_packet {
+       size_t header_length;
+       void *payload;
+       size_t payload_length;
++      dma_addr_t payload_bus;
+       u32 timestamp;
+       /*
+diff --git a/drivers/ieee1394/nodemgr.c b/drivers/ieee1394/nodemgr.c
+index 16240a7..3d3c3bc 100644
+--- a/drivers/ieee1394/nodemgr.c
++++ b/drivers/ieee1394/nodemgr.c
+@@ -115,8 +115,14 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length,
+       return error;
+ }
++#define OUI_FREECOM_TECHNOLOGIES_GMBH 0x0001db
++
+ static int nodemgr_get_max_rom(quadlet_t *bus_info_data, void *__ci)
+ {
++      /* Freecom FireWire Hard Drive firmware bug */
++      if (be32_to_cpu(bus_info_data[3]) >> 8 == OUI_FREECOM_TECHNOLOGIES_GMBH)
++              return 0;
++
+       return (be32_to_cpu(bus_info_data[2]) >> 8) & 0x3;
+ }
+diff --git a/drivers/isdn/hardware/avm/b1isa.c b/drivers/isdn/hardware/avm/b1isa.c
+index 1e288ee..6461a32 100644
+--- a/drivers/isdn/hardware/avm/b1isa.c
++++ b/drivers/isdn/hardware/avm/b1isa.c
+@@ -233,10 +233,8 @@ static void __exit b1isa_exit(void)
+       int i;
+       for (i = 0; i < MAX_CARDS; i++) {
+-              if (!io[i])
+-                      break;
+-
+-              b1isa_remove(&isa_dev[i]);
++              if (isa_dev[i].resource[0].start)
++                      b1isa_remove(&isa_dev[i]);
+       }
+       unregister_capi_driver(&capi_driver_b1isa);
+ }
+diff --git a/drivers/media/video/tvaudio.c b/drivers/media/video/tvaudio.c
+index d74df58..bec489e 100644
+--- a/drivers/media/video/tvaudio.c
++++ b/drivers/media/video/tvaudio.c
+@@ -152,7 +152,7 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+ {
+       unsigned char buffer[2];
+-      if (-1 == subaddr) {
++      if (subaddr < 0) {
+               v4l_dbg(1, debug, chip->c, "%s: chip_write: 0x%x\n",
+                       chip->c->name, val);
+               chip->shadow.bytes[1] = val;
+@@ -163,6 +163,13 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+                       return -1;
+               }
+       } else {
++              if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++                      v4l_info(chip->c,
++                              "Tried to access a non-existent register: %d\n",
++                              subaddr);
++                      return -EINVAL;
++              }
++
+               v4l_dbg(1, debug, chip->c, "%s: chip_write: reg%d=0x%x\n",
+                       chip->c->name, subaddr, val);
+               chip->shadow.bytes[subaddr+1] = val;
+@@ -177,12 +184,20 @@ static int chip_write(struct CHIPSTATE *chip, int subaddr, int val)
+       return 0;
+ }
+-static int chip_write_masked(struct CHIPSTATE *chip, int subaddr, int val, int mask)
++static int chip_write_masked(struct CHIPSTATE *chip,
++                           int subaddr, int val, int mask)
+ {
+       if (mask != 0) {
+-              if (-1 == subaddr) {
++              if (subaddr < 0) {
+                       val = (chip->shadow.bytes[1] & ~mask) | (val & mask);
+               } else {
++                      if (subaddr + 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++                              v4l_info(chip->c,
++                                      "Tried to access a non-existent register: %d\n",
++                                      subaddr);
++                              return -EINVAL;
++                      }
++
+                       val = (chip->shadow.bytes[subaddr+1] & ~mask) | (val & mask);
+               }
+       }
+@@ -228,6 +243,15 @@ static int chip_cmd(struct CHIPSTATE *chip, char *name, audiocmd *cmd)
+       if (0 == cmd->count)
+               return 0;
++      if (cmd->count + cmd->bytes[0] - 1 >= ARRAY_SIZE(chip->shadow.bytes)) {
++              v4l_info(chip->c,
++                       "Tried to access a non-existent register range: %d to %d\n",
++                       cmd->bytes[0] + 1, cmd->bytes[0] + cmd->count - 1);
++              return -EINVAL;
++      }
++
++      /* FIXME: it seems that the shadow bytes are wrong bellow !*/
++
+       /* update our shadow register set; print bytes if (debug > 0) */
+       v4l_dbg(1, debug, chip->c, "%s: chip_cmd(%s): reg=%d, data:",
+               chip->c->name, name,cmd->bytes[0]);
+diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
+index c792138..1b9c4dc 100644
+--- a/drivers/net/bonding/bond_main.c
++++ b/drivers/net/bonding/bond_main.c
+@@ -2370,6 +2370,9 @@ static void bond_miimon_commit(struct bonding *bond)
+                       continue;
+               case BOND_LINK_DOWN:
++                      if (slave->link_failure_count < UINT_MAX)
++                              slave->link_failure_count++;
++
+                       slave->link = BOND_LINK_DOWN;
+                       if (bond->params.mode == BOND_MODE_ACTIVEBACKUP ||
+diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c
+index bcd2bc4..79be768 100644
+--- a/drivers/net/e1000e/ich8lan.c
++++ b/drivers/net/e1000e/ich8lan.c
+@@ -1791,12 +1791,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw)
+               ctrl |= E1000_CTRL_PHY_RST;
+       }
+       ret_val = e1000_acquire_swflag_ich8lan(hw);
++      /* Whether or not the swflag was acquired, we need to reset the part */
+       hw_dbg(hw, "Issuing a global reset to ich8lan");
+       ew32(CTRL, (ctrl | E1000_CTRL_RST));
+       msleep(20);
+-      /* release the swflag because it is not reset by hardware reset */
+-      e1000_release_swflag_ich8lan(hw);
++      if (!ret_val) {
++              /* release the swflag because it is not reset by
++               * hardware reset
++               */
++              e1000_release_swflag_ich8lan(hw);
++      }
+       ret_val = e1000e_get_auto_rd_done(hw);
+       if (ret_val) {
+diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c
+index cf7056e..79b7ae3 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-agn.c
++++ b/drivers/net/wireless/iwlwifi/iwl-agn.c
+@@ -1384,7 +1384,7 @@ void iwl_rx_handle(struct iwl_priv *priv)
+               rxq->queue[i] = NULL;
+-              pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->dma_addr,
++              pci_dma_sync_single_for_cpu(priv->pci_dev, rxb->aligned_dma_addr,
+                                           priv->hw_params.rx_buf_size,
+                                           PCI_DMA_FROMDEVICE);
+               pkt = (struct iwl_rx_packet *)rxb->skb->data;
+@@ -1436,8 +1436,8 @@ void iwl_rx_handle(struct iwl_priv *priv)
+                       rxb->skb = NULL;
+               }
+-              pci_unmap_single(priv->pci_dev, rxb->dma_addr,
+-                               priv->hw_params.rx_buf_size,
++              pci_unmap_single(priv->pci_dev, rxb->real_dma_addr,
++                               priv->hw_params.rx_buf_size + 256,
+                                PCI_DMA_FROMDEVICE);
+               spin_lock_irqsave(&rxq->lock, flags);
+               list_add_tail(&rxb->list, &priv->rxq.rx_used);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c
+index 1383fd1..b346268 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-core.c
++++ b/drivers/net/wireless/iwlwifi/iwl-core.c
+@@ -290,6 +290,9 @@ void iwl_clear_stations_table(struct iwl_priv *priv)
+       priv->num_stations = 0;
+       memset(priv->stations, 0, sizeof(priv->stations));
++      /* clean ucode key table bit map */
++      priv->ucode_key_table = 0;
++
+       spin_unlock_irqrestore(&priv->sta_lock, flags);
+ }
+ EXPORT_SYMBOL(iwl_clear_stations_table);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h
+index 09bdf8e..cf7757f 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-dev.h
++++ b/drivers/net/wireless/iwlwifi/iwl-dev.h
+@@ -89,7 +89,8 @@ extern struct iwl_cfg iwl5100_abg_cfg;
+ #define       DEFAULT_LONG_RETRY_LIMIT  4U
+ struct iwl_rx_mem_buffer {
+-      dma_addr_t dma_addr;
++      dma_addr_t real_dma_addr;
++      dma_addr_t aligned_dma_addr;
+       struct sk_buff *skb;
+       struct list_head list;
+ };
+diff --git a/drivers/net/wireless/iwlwifi/iwl-rx.c b/drivers/net/wireless/iwlwifi/iwl-rx.c
+index e81bfc4..ce25379 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-rx.c
++++ b/drivers/net/wireless/iwlwifi/iwl-rx.c
+@@ -204,7 +204,7 @@ int iwl_rx_queue_restock(struct iwl_priv *priv)
+               list_del(element);
+               /* Point to Rx buffer via next RBD in circular buffer */
+-              rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->dma_addr);
++              rxq->bd[rxq->write] = iwl_dma_addr2rbd_ptr(priv, rxb->aligned_dma_addr);
+               rxq->queue[rxq->write] = rxb;
+               rxq->write = (rxq->write + 1) & RX_QUEUE_MASK;
+               rxq->free_count--;
+@@ -251,7 +251,7 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+               rxb = list_entry(element, struct iwl_rx_mem_buffer, list);
+               /* Alloc a new receive buffer */
+-              rxb->skb = alloc_skb(priv->hw_params.rx_buf_size,
++              rxb->skb = alloc_skb(priv->hw_params.rx_buf_size + 256,
+                               __GFP_NOWARN | GFP_ATOMIC);
+               if (!rxb->skb) {
+                       if (net_ratelimit())
+@@ -266,9 +266,17 @@ void iwl_rx_allocate(struct iwl_priv *priv)
+               list_del(element);
+               /* Get physical address of RB/SKB */
+-              rxb->dma_addr =
+-                  pci_map_single(priv->pci_dev, rxb->skb->data,
+-                         priv->hw_params.rx_buf_size, PCI_DMA_FROMDEVICE);
++              rxb->real_dma_addr = pci_map_single(
++                                      priv->pci_dev,
++                                      rxb->skb->data,
++                                      priv->hw_params.rx_buf_size + 256,
++                                      PCI_DMA_FROMDEVICE);
++              /* dma address must be no more than 36 bits */
++              BUG_ON(rxb->real_dma_addr & ~DMA_BIT_MASK(36));
++              /* and also 256 byte aligned! */
++              rxb->aligned_dma_addr = ALIGN(rxb->real_dma_addr, 256);
++              skb_reserve(rxb->skb, rxb->aligned_dma_addr - rxb->real_dma_addr);
++
+               list_add_tail(&rxb->list, &rxq->rx_free);
+               rxq->free_count++;
+       }
+@@ -300,8 +308,8 @@ void iwl_rx_queue_free(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
+       for (i = 0; i < RX_QUEUE_SIZE + RX_FREE_BUFFERS; i++) {
+               if (rxq->pool[i].skb != NULL) {
+                       pci_unmap_single(priv->pci_dev,
+-                                       rxq->pool[i].dma_addr,
+-                                       priv->hw_params.rx_buf_size,
++                                       rxq->pool[i].real_dma_addr,
++                                       priv->hw_params.rx_buf_size + 256,
+                                        PCI_DMA_FROMDEVICE);
+                       dev_kfree_skb(rxq->pool[i].skb);
+               }
+@@ -354,8 +362,8 @@ void iwl_rx_queue_reset(struct iwl_priv *priv, struct iwl_rx_queue *rxq)
+                * to an SKB, so we need to unmap and free potential storage */
+               if (rxq->pool[i].skb != NULL) {
+                       pci_unmap_single(priv->pci_dev,
+-                                       rxq->pool[i].dma_addr,
+-                                       priv->hw_params.rx_buf_size,
++                                       rxq->pool[i].real_dma_addr,
++                                       priv->hw_params.rx_buf_size + 256,
+                                        PCI_DMA_FROMDEVICE);
+                       priv->alloc_rxb_skb--;
+                       dev_kfree_skb(rxq->pool[i].skb);
+diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c
+index 6283a3a..f2d473c 100644
+--- a/drivers/net/wireless/iwlwifi/iwl-sta.c
++++ b/drivers/net/wireless/iwlwifi/iwl-sta.c
+@@ -475,7 +475,7 @@ static int iwl_get_free_ucode_key_index(struct iwl_priv *priv)
+               if (!test_and_set_bit(i, &priv->ucode_key_table))
+                       return i;
+-      return -1;
++      return WEP_INVALID_OFFSET;
+ }
+ int iwl_send_static_wepkey_cmd(struct iwl_priv *priv, u8 send_if_empty)
+@@ -620,6 +620,9 @@ static int iwl_set_wep_dynamic_key_info(struct iwl_priv *priv,
+       /* else, we are overriding an existing key => no need to allocated room
+        * in uCode. */
++      WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++              "no space for new kew");
++
+       priv->stations[sta_id].sta.key.key_flags = key_flags;
+       priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
+       priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
+@@ -637,6 +640,7 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
+ {
+       unsigned long flags;
+       __le16 key_flags = 0;
++      int ret;
+       key_flags |= (STA_KEY_FLG_CCMP | STA_KEY_FLG_MAP_KEY_MSK);
+       key_flags |= cpu_to_le16(keyconf->keyidx << STA_KEY_FLG_KEYID_POS);
+@@ -664,14 +668,18 @@ static int iwl_set_ccmp_dynamic_key_info(struct iwl_priv *priv,
+       /* else, we are overriding an existing key => no need to allocated room
+        * in uCode. */
++      WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++              "no space for new kew");
++
+       priv->stations[sta_id].sta.key.key_flags = key_flags;
+       priv->stations[sta_id].sta.sta.modify_mask = STA_MODIFY_KEY_MASK;
+       priv->stations[sta_id].sta.mode = STA_CONTROL_MODIFY_MSK;
++      ret = iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
++
+       spin_unlock_irqrestore(&priv->sta_lock, flags);
+-      IWL_DEBUG_INFO("hwcrypto: modify ucode station key info\n");
+-      return iwl_send_add_sta(priv, &priv->stations[sta_id].sta, CMD_ASYNC);
++      return ret;
+ }
+ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
+@@ -696,6 +704,9 @@ static int iwl_set_tkip_dynamic_key_info(struct iwl_priv *priv,
+       /* else, we are overriding an existing key => no need to allocated room
+        * in uCode. */
++      WARN(priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET,
++              "no space for new kew");
++
+       /* This copy is acutally not needed: we get the key with each TX */
+       memcpy(priv->stations[sta_id].keyinfo.key, keyconf->key, 16);
+@@ -734,6 +745,13 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
+               return 0;
+       }
++      if (priv->stations[sta_id].sta.key.key_offset == WEP_INVALID_OFFSET) {
++              IWL_WARNING("Removing wrong key %d 0x%x\n",
++                          keyconf->keyidx, key_flags);
++              spin_unlock_irqrestore(&priv->sta_lock, flags);
++              return 0;
++      }
++
+       if (!test_and_clear_bit(priv->stations[sta_id].sta.key.key_offset,
+               &priv->ucode_key_table))
+               IWL_ERROR("index %d not used in uCode key table.\n",
+diff --git a/drivers/video/macfb.c b/drivers/video/macfb.c
+index b790ddf..ee380d5 100644
+--- a/drivers/video/macfb.c
++++ b/drivers/video/macfb.c
+@@ -164,7 +164,6 @@ static struct fb_var_screeninfo macfb_defined = {
+ };
+ static struct fb_fix_screeninfo macfb_fix = {
+-      .id     = "Macintosh ",
+       .type   = FB_TYPE_PACKED_PIXELS,
+       .accel  = FB_ACCEL_NONE,
+ };
+@@ -760,22 +759,22 @@ static int __init macfb_init(void)
+               switch(ndev->dr_hw) {
+               case NUBUS_DRHW_APPLE_MDC:
+-                      strcat( macfb_fix.id, "Display Card" );
++                      strcpy(macfb_fix.id, "Mac Disp. Card");
+                       macfb_setpalette = mdc_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       break;
+               case NUBUS_DRHW_APPLE_TFB:
+-                      strcat( macfb_fix.id, "Toby" );
++                      strcpy(macfb_fix.id, "Toby");
+                       macfb_setpalette = toby_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       break;
+               case NUBUS_DRHW_APPLE_JET:
+-                      strcat( macfb_fix.id, "Jet");
++                      strcpy(macfb_fix.id, "Jet");
+                       macfb_setpalette = jet_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       break;                  
+               default:
+-                      strcat( macfb_fix.id, "Generic NuBus" );
++                      strcpy(macfb_fix.id, "Generic NuBus");
+                       break;
+               }
+       }
+@@ -786,21 +785,11 @@ static int __init macfb_init(void)
+       if (!video_is_nubus)
+               switch( mac_bi_data.id )
+               {
+-                      /* These don't have onboard video.  Eventually, we may
+-                         be able to write separate framebuffer drivers for
+-                         them (tobyfb.c, hiresfb.c, etc, etc) */
+-              case MAC_MODEL_II:
+-              case MAC_MODEL_IIX:
+-              case MAC_MODEL_IICX:
+-              case MAC_MODEL_IIFX:
+-                      strcat( macfb_fix.id, "Generic NuBus" );
+-                      break;
+-
+                       /* Valkyrie Quadras */
+               case MAC_MODEL_Q630:
+                       /* I'm not sure about this one */
+               case MAC_MODEL_P588:
+-                      strcat( macfb_fix.id, "Valkyrie built-in" );
++                      strcpy(macfb_fix.id, "Valkyrie");
+                       macfb_setpalette = valkyrie_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       valkyrie_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -823,7 +812,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_Q700:
+               case MAC_MODEL_Q900:
+               case MAC_MODEL_Q950:
+-                      strcat( macfb_fix.id, "DAFB built-in" );
++                      strcpy(macfb_fix.id, "DAFB");
+                       macfb_setpalette = dafb_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       dafb_cmap_regs = ioremap(DAFB_BASE, 0x1000);
+@@ -831,7 +820,7 @@ static int __init macfb_init(void)
+                       /* LC II uses the V8 framebuffer */
+               case MAC_MODEL_LCII:
+-                      strcat( macfb_fix.id, "V8 built-in" );
++                      strcpy(macfb_fix.id, "V8");
+                       macfb_setpalette = v8_brazil_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -843,7 +832,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_IIVI:
+               case MAC_MODEL_IIVX:
+               case MAC_MODEL_P600:
+-                      strcat( macfb_fix.id, "Brazil built-in" );
++                      strcpy(macfb_fix.id, "Brazil");
+                       macfb_setpalette = v8_brazil_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+                       v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+@@ -860,7 +849,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_P460:
+                       macfb_setpalette = v8_brazil_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+-                      strcat( macfb_fix.id, "Sonora built-in" );
++                      strcpy(macfb_fix.id, "Sonora");
+                       v8_brazil_cmap_regs = ioremap(DAC_BASE, 0x1000);
+                       break;
+@@ -871,7 +860,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_IISI:
+                       macfb_setpalette = rbv_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+-                      strcat( macfb_fix.id, "RBV built-in" );
++                      strcpy(macfb_fix.id, "RBV");
+                       rbv_cmap_regs = ioremap(DAC_BASE, 0x1000);
+                       break;
+@@ -880,7 +869,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_C660:
+                       macfb_setpalette = civic_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+-                      strcat( macfb_fix.id, "Civic built-in" );
++                      strcpy(macfb_fix.id, "Civic");
+                       civic_cmap_regs = ioremap(CIVIC_BASE, 0x1000);
+                       break;
+@@ -901,7 +890,7 @@ static int __init macfb_init(void)
+                               v8_brazil_cmap_regs =
+                                       ioremap(DAC_BASE, 0x1000);
+                       }
+-                      strcat( macfb_fix.id, "LC built-in" );
++                      strcpy(macfb_fix.id, "LC");
+                       break;
+                       /* We think this may be like the LC II */
+               case MAC_MODEL_CCL:
+@@ -911,18 +900,18 @@ static int __init macfb_init(void)
+                               v8_brazil_cmap_regs =
+                                       ioremap(DAC_BASE, 0x1000);
+                       }
+-                      strcat( macfb_fix.id, "Color Classic built-in" );
++                      strcpy(macfb_fix.id, "Color Classic");
+                       break;
+                       /* And we *do* mean "weirdos" */
+               case MAC_MODEL_TV:
+-                      strcat( macfb_fix.id, "Mac TV built-in" );
++                      strcpy(macfb_fix.id, "Mac TV");
+                       break;
+                       /* These don't have colour, so no need to worry */
+               case MAC_MODEL_SE30:
+               case MAC_MODEL_CLII:
+-                      strcat( macfb_fix.id, "Monochrome built-in" );
++                      strcpy(macfb_fix.id, "Monochrome");
+                       break;
+                       /* Powerbooks are particularly difficult.  Many of
+@@ -935,7 +924,7 @@ static int __init macfb_init(void)
+               case MAC_MODEL_PB140:
+               case MAC_MODEL_PB145:
+               case MAC_MODEL_PB170:
+-                      strcat( macfb_fix.id, "DDC built-in" );
++                      strcpy(macfb_fix.id, "DDC");
+                       break;
+                       /* Internal is GSC, External (if present) is ViSC */
+@@ -945,13 +934,13 @@ static int __init macfb_init(void)
+               case MAC_MODEL_PB180:
+               case MAC_MODEL_PB210:
+               case MAC_MODEL_PB230:
+-                      strcat( macfb_fix.id, "GSC built-in" );
++                      strcpy(macfb_fix.id, "GSC");
+                       break;
+                       /* Internal is TIM, External is ViSC */
+               case MAC_MODEL_PB165C:
+               case MAC_MODEL_PB180C:
+-                      strcat( macfb_fix.id, "TIM built-in" );
++                      strcpy(macfb_fix.id, "TIM");
+                       break;
+                       /* Internal is CSC, External is Keystone+Ariel. */
+@@ -963,12 +952,12 @@ static int __init macfb_init(void)
+               case MAC_MODEL_PB280C:
+                       macfb_setpalette = csc_setpalette;
+                       macfb_defined.activate = FB_ACTIVATE_NOW;
+-                      strcat( macfb_fix.id, "CSC built-in" );
++                      strcpy(macfb_fix.id, "CSC");
+                       csc_cmap_regs = ioremap(CSC_BASE, 0x1000);
+                       break;
+               
+               default:
+-                      strcat( macfb_fix.id, "Unknown/Unsupported built-in" );
++                      strcpy(macfb_fix.id, "Unknown");
+                       break;
+               }
+@@ -978,16 +967,23 @@ static int __init macfb_init(void)
+       fb_info.pseudo_palette  = pseudo_palette;
+       fb_info.flags           = FBINFO_DEFAULT;
+-      fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0);
++      err = fb_alloc_cmap(&fb_info.cmap, video_cmap_len, 0);
++      if (err)
++              goto fail_unmap;
+       
+       err = register_framebuffer(&fb_info);
+-      if (!err)
+-              printk("fb%d: %s frame buffer device\n",
+-                     fb_info.node, fb_info.fix.id);
+-      else {
+-              iounmap(fb_info.screen_base);
+-              iounmap_macfb();
+-      }
++      if (err)
++              goto fail_dealloc;
++
++      printk("fb%d: %s frame buffer device\n",
++             fb_info.node, fb_info.fix.id);
++      return 0;
++
++fail_dealloc:
++      fb_dealloc_cmap(&fb_info.cmap);
++fail_unmap:
++      iounmap(fb_info.screen_base);
++      iounmap_macfb();
+       return err;
+ }
+diff --git a/include/asm-x86/vmi.h b/include/asm-x86/vmi.h
+index b7c0dea..61e08c0 100644
+--- a/include/asm-x86/vmi.h
++++ b/include/asm-x86/vmi.h
+@@ -223,9 +223,15 @@ struct pci_header {
+ } __attribute__((packed));
+ /* Function prototypes for bootstrapping */
++#ifdef CONFIG_VMI
+ extern void vmi_init(void);
++extern void vmi_activate(void);
+ extern void vmi_bringup(void);
+-extern void vmi_apply_boot_page_allocations(void);
++#else
++static inline void vmi_init(void) {}
++static inline void vmi_activate(void) {}
++static inline void vmi_bringup(void) {}
++#endif
+ /* State needed to start an application processor in an SMP system. */
+ struct vmi_ap_state {
+diff --git a/include/linux/can/core.h b/include/linux/can/core.h
+index e9ca210..f50785a 100644
+--- a/include/linux/can/core.h
++++ b/include/linux/can/core.h
+@@ -19,7 +19,7 @@
+ #include <linux/skbuff.h>
+ #include <linux/netdevice.h>
+-#define CAN_VERSION "20071116"
++#define CAN_VERSION "20081130"
+ /* increment this number each time you change some user-space interface */
+ #define CAN_ABI_VERSION "8"
+diff --git a/kernel/sched_clock.c b/kernel/sched_clock.c
+index 8178724..e8ab096 100644
+--- a/kernel/sched_clock.c
++++ b/kernel/sched_clock.c
+@@ -118,13 +118,13 @@ static u64 __update_sched_clock(struct sched_clock_data *scd, u64 now)
+       /*
+        * scd->clock = clamp(scd->tick_gtod + delta,
+-       *                    max(scd->tick_gtod, scd->clock),
+-       *                    max(scd->clock, scd->tick_gtod + TICK_NSEC));
++       *                    max(scd->tick_gtod, scd->clock),
++       *                    scd->tick_gtod + TICK_NSEC);
+        */
+       clock = scd->tick_gtod + delta;
+       min_clock = wrap_max(scd->tick_gtod, scd->clock);
+-      max_clock = wrap_max(scd->clock, scd->tick_gtod + TICK_NSEC);
++      max_clock = scd->tick_gtod + TICK_NSEC;
+       clock = wrap_max(clock, min_clock);
+       clock = wrap_min(clock, max_clock);
+diff --git a/lib/idr.c b/lib/idr.c
+index 7a785a0..1c4f928 100644
+--- a/lib/idr.c
++++ b/lib/idr.c
+@@ -220,8 +220,14 @@ build_up:
+        */
+       while ((layers < (MAX_LEVEL - 1)) && (id >= (1 << (layers*IDR_BITS)))) {
+               layers++;
+-              if (!p->count)
++              if (!p->count) {
++                      /* special case: if the tree is currently empty,
++                       * then we grow the tree by moving the top node
++                       * upwards.
++                       */
++                      p->layer++;
+                       continue;
++              }
+               if (!(new = get_from_free_list(idp))) {
+                       /*
+                        * The allocation failed.  If we built part of
+diff --git a/mm/page_alloc.c b/mm/page_alloc.c
+index ed5cdae..51daae5 100644
+--- a/mm/page_alloc.c
++++ b/mm/page_alloc.c
+@@ -4224,7 +4224,7 @@ void setup_per_zone_pages_min(void)
+       for_each_zone(zone) {
+               u64 tmp;
+-              spin_lock_irqsave(&zone->lru_lock, flags);
++              spin_lock_irqsave(&zone->lock, flags);
+               tmp = (u64)pages_min * zone->present_pages;
+               do_div(tmp, lowmem_pages);
+               if (is_highmem(zone)) {
+@@ -4256,7 +4256,7 @@ void setup_per_zone_pages_min(void)
+               zone->pages_low   = zone->pages_min + (tmp >> 2);
+               zone->pages_high  = zone->pages_min + (tmp >> 1);
+               setup_zone_migrate_reserve(zone);
+-              spin_unlock_irqrestore(&zone->lru_lock, flags);
++              spin_unlock_irqrestore(&zone->lock, flags);
+       }
+       /* update totalreserve_pages */
+diff --git a/net/can/af_can.c b/net/can/af_can.c
+index 8035fbf..150f0b2 100644
+--- a/net/can/af_can.c
++++ b/net/can/af_can.c
+@@ -319,23 +319,52 @@ static struct dev_rcv_lists *find_dev_rcv_lists(struct net_device *dev)
+       return n ? d : NULL;
+ }
++/**
++ * find_rcv_list - determine optimal filterlist inside device filter struct
++ * @can_id: pointer to CAN identifier of a given can_filter
++ * @mask: pointer to CAN mask of a given can_filter
++ * @d: pointer to the device filter struct
++ *
++ * Description:
++ *  Returns the optimal filterlist to reduce the filter handling in the
++ *  receive path. This function is called by service functions that need
++ *  to register or unregister a can_filter in the filter lists.
++ *
++ *  A filter matches in general, when
++ *
++ *          <received_can_id> & mask == can_id & mask
++ *
++ *  so every bit set in the mask (even CAN_EFF_FLAG, CAN_RTR_FLAG) describe
++ *  relevant bits for the filter.
++ *
++ *  The filter can be inverted (CAN_INV_FILTER bit set in can_id) or it can
++ *  filter for error frames (CAN_ERR_FLAG bit set in mask). For error frames
++ *  there is a special filterlist and a special rx path filter handling.
++ *
++ * Return:
++ *  Pointer to optimal filterlist for the given can_id/mask pair.
++ *  Constistency checked mask.
++ *  Reduced can_id to have a preprocessed filter compare value.
++ */
+ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
+                                       struct dev_rcv_lists *d)
+ {
+       canid_t inv = *can_id & CAN_INV_FILTER; /* save flag before masking */
+-      /* filter error frames */
++      /* filter for error frames in extra filterlist */
+       if (*mask & CAN_ERR_FLAG) {
+-              /* clear CAN_ERR_FLAG in list entry */
++              /* clear CAN_ERR_FLAG in filter entry */
+               *mask &= CAN_ERR_MASK;
+               return &d->rx[RX_ERR];
+       }
+-      /* ensure valid values in can_mask */
+-      if (*mask & CAN_EFF_FLAG)
+-              *mask &= (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG);
+-      else
+-              *mask &= (CAN_SFF_MASK | CAN_RTR_FLAG);
++      /* with cleared CAN_ERR_FLAG we have a simple mask/value filterpair */
++
++#define CAN_EFF_RTR_FLAGS (CAN_EFF_FLAG | CAN_RTR_FLAG)
++
++      /* ensure valid values in can_mask for 'SFF only' frame filtering */
++      if ((*mask & CAN_EFF_FLAG) && !(*can_id & CAN_EFF_FLAG))
++              *mask &= (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS);
+       /* reduce condition testing at receive time */
+       *can_id &= *mask;
+@@ -348,15 +377,19 @@ static struct hlist_head *find_rcv_list(canid_t *can_id, canid_t *mask,
+       if (!(*mask))
+               return &d->rx[RX_ALL];
+-      /* use extra filterset for the subscription of exactly *ONE* can_id */
+-      if (*can_id & CAN_EFF_FLAG) {
+-              if (*mask == (CAN_EFF_MASK | CAN_EFF_FLAG)) {
+-                      /* RFC: a use-case for hash-tables in the future? */
+-                      return &d->rx[RX_EFF];
++      /* extra filterlists for the subscription of a single non-RTR can_id */
++      if (((*mask & CAN_EFF_RTR_FLAGS) == CAN_EFF_RTR_FLAGS)
++          && !(*can_id & CAN_RTR_FLAG)) {
++
++              if (*can_id & CAN_EFF_FLAG) {
++                      if (*mask == (CAN_EFF_MASK | CAN_EFF_RTR_FLAGS)) {
++                              /* RFC: a future use-case for hash-tables? */
++                              return &d->rx[RX_EFF];
++                      }
++              } else {
++                      if (*mask == (CAN_SFF_MASK | CAN_EFF_RTR_FLAGS))
++                              return &d->rx_sff[*can_id];
+               }
+-      } else {
+-              if (*mask == CAN_SFF_MASK)
+-                      return &d->rx_sff[*can_id];
+       }
+       /* default: filter via can_id/can_mask */
+@@ -589,7 +622,10 @@ static int can_rcv_filter(struct dev_rcv_lists *d, struct sk_buff *skb)
+               }
+       }
+-      /* check CAN_ID specific entries */
++      /* check filterlists for single non-RTR can_ids */
++      if (can_id & CAN_RTR_FLAG)
++              return matches;
++
+       if (can_id & CAN_EFF_FLAG) {
+               hlist_for_each_entry_rcu(r, n, &d->rx[RX_EFF], list) {
+                       if (r->can_id == can_id) {
+diff --git a/net/can/bcm.c b/net/can/bcm.c
+index d0dd382..da0d426 100644
+--- a/net/can/bcm.c
++++ b/net/can/bcm.c
+@@ -64,10 +64,11 @@
+ #define BCM_CAN_DLC_MASK 0x0F /* clean private flags in can_dlc by masking */
+ /* get best masking value for can_rx_register() for a given single can_id */
+-#define REGMASK(id) ((id & CAN_RTR_FLAG) | ((id & CAN_EFF_FLAG) ? \
+-                      (CAN_EFF_MASK | CAN_EFF_FLAG) : CAN_SFF_MASK))
++#define REGMASK(id) ((id & CAN_EFF_FLAG) ? \
++                   (CAN_EFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG) : \
++                   (CAN_SFF_MASK | CAN_EFF_FLAG | CAN_RTR_FLAG))
+-#define CAN_BCM_VERSION "20080415"
++#define CAN_BCM_VERSION CAN_VERSION
+ static __initdata const char banner[] = KERN_INFO
+       "can: broadcast manager protocol (rev " CAN_BCM_VERSION ")\n";
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 0ae08d3..5a25896 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -3990,7 +3990,7 @@ int register_netdevice(struct net_device *dev)
+               dev->features &= ~NETIF_F_TSO;
+       }
+       if (dev->features & NETIF_F_UFO) {
+-              if (!(dev->features & NETIF_F_HW_CSUM)) {
++              if (!(dev->features & NETIF_F_GEN_CSUM)) {
+                       printk(KERN_ERR "%s: Dropping NETIF_F_UFO since no "
+                                       "NETIF_F_HW_CSUM feature.\n",
+                                                       dev->name);
+diff --git a/net/key/af_key.c b/net/key/af_key.c
+index b7f5a1c..ef3b4d5 100644
+--- a/net/key/af_key.c
++++ b/net/key/af_key.c
+@@ -2051,7 +2051,6 @@ static int pfkey_xfrm_policy2msg(struct sk_buff *skb, struct xfrm_policy *xp, in
+                       req_size += socklen * 2;
+               } else {
+                       size -= 2*socklen;
+-                      socklen = 0;
+               }
+               rq = (void*)skb_put(skb, req_size);
+               pol->sadb_x_policy_len += req_size/8;
+diff --git a/net/sunrpc/auth_generic.c b/net/sunrpc/auth_generic.c
+index 744b79f..4028502 100644
+--- a/net/sunrpc/auth_generic.c
++++ b/net/sunrpc/auth_generic.c
+@@ -133,13 +133,29 @@ static int
+ generic_match(struct auth_cred *acred, struct rpc_cred *cred, int flags)
+ {
+       struct generic_cred *gcred = container_of(cred, struct generic_cred, gc_base);
++      int i;
+       if (gcred->acred.uid != acred->uid ||
+           gcred->acred.gid != acred->gid ||
+-          gcred->acred.group_info != acred->group_info ||
+           gcred->acred.machine_cred != acred->machine_cred)
+-              return 0;
++              goto out_nomatch;
++
++      /* Optimisation in the case where pointers are identical... */
++      if (gcred->acred.group_info == acred->group_info)
++              goto out_match;
++
++      /* Slow path... */
++      if (gcred->acred.group_info->ngroups != acred->group_info->ngroups)
++              goto out_nomatch;
++      for (i = 0; i < gcred->acred.group_info->ngroups; i++) {
++              if (GROUP_AT(gcred->acred.group_info, i) !=
++                              GROUP_AT(acred->group_info, i))
++                      goto out_nomatch;
++      }
++out_match:
+       return 1;
++out_nomatch:
++      return 0;
+ }
+ void __init rpc_init_generic_auth(void)
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/bootsplash
rename to src/patches/suse-2.6.27.39/patches.suse/bootsplash
index 661b76c7bedd52d619d2fef6e8a5101dc8572afb..7e327ba571f435de8c28fc9cd4372fb47142a15b 100644 (file)
@@ -857,7 +857,7 @@ Signed-off-by: mls@suse.de
 +                      splash_clear_margins(vc->vc_splash_data, vc, info, 0);
 +              }
 +      } else {
-+              /* Switch bootsplash off */
++              /* Switch bootsplash off */
 +              con_remap_def_color(vc, 0x07);
 +              vc_resize(vc, info->var.xres / vc->vc_font.width, info->var.yres / vc->vc_font.height);
 +      }
@@ -1413,7 +1413,7 @@ Signed-off-by: mls@suse.de
 +
 +int jpeg_check_size(unsigned char *buf, int width, int height)
 +{
-+      datap = buf;
++      datap = buf;
 +      getbyte();
 +      getbyte();
 +      readtables(M_SOF0);
@@ -1933,7 +1933,7 @@ Signed-off-by: mls@suse.de
 +      for (i = 0; i < 8; i++)
 +              for (j = 0; j < 8; j++)
 +                      qout[zig[i * 8 + j]] = qin[zig[i * 8 + j]] *
-+                                              IMULT(aaidct[i], aaidct[j]);
++                                              IMULT(aaidct[i], aaidct[j]);
 +}
 +
 +static void scaleidctqtab(q, sc)
diff --git a/src/patches/suse-2.6.27.39/patches.suse/bug-504646-acpi-enable-root-bridge-to-wakeup.patch b/src/patches/suse-2.6.27.39/patches.suse/bug-504646-acpi-enable-root-bridge-to-wakeup.patch
new file mode 100644 (file)
index 0000000..51fc879
--- /dev/null
@@ -0,0 +1,242 @@
+From: Rafael J. Wysocki <rjw@suse.de>
+Subject: ACPI / PM: Allow PCI root bridges to wake up the system
+References: bnc#504646
+
+Wake-on-LAN with PCI network adapters currently doesn't work if the
+adapter is not directly supported by ACPI.  In particular, it doesn't
+work with add-on PCI (non-PCIe) adapters.
+
+This problem has recently been fixed in the mainline kernel by
+propagating the wake-up enable setting from the device to its
+upstream bridge and, if necessary, further up to the root bridge.
+Then, if one of the bridges on the path from the device to the root
+bridge (or the root bridge itself) is an ACPI wake-up device, a PME
+from the adapter causes the bridge's GPE to generate a wake-up
+event.  Unfortunately, porting this solution into the SLE11 code base
+would break KABI, so for systems that are known to have this problem,
+if PCI root bridge is declared in the ACPI tables as a wake-up
+device, allow it to wake up the system by default (this usually is
+functionally equivalent the upstream solution, but it may cause
+regressions to appear on the systems where this is not the case, so
+use a DMI-based white list of systems that require it).
+
+This allows add-on PCI devices to work as wake-up devices on some
+systems, where PME# asserted by an add-on device causes the root
+bridge GPE to generate a wake-up event, without using
+/proc/acpi/wakeup to change the root bridge wake-up setting.
+
+Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
+---
+ drivers/acpi/glue.c         |   15 +++++++++++++++
+ drivers/acpi/pci_root.c     |    9 +++++++++
+ drivers/acpi/sleep/main.c   |   14 ++++++++++++++
+ drivers/acpi/sleep/proc.c   |   29 +----------------------------
+ drivers/acpi/sleep/sleep.h  |    6 ++++++
+ drivers/acpi/sleep/wakeup.c |   35 +++++++++++++++++++++++++++++++++++
+ include/acpi/acpi_bus.h     |    1 +
+ 7 files changed, 81 insertions(+), 28 deletions(-)
+
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/glue.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/glue.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/glue.c
+@@ -12,6 +12,14 @@
+ #include <linux/rwsem.h>
+ #include <linux/acpi.h>
++#include "sleep/sleep.h"
++
++/*
++ * If set, enable the PCI root bridge to wake-up the system from sleep states
++ * by default.
++ */
++bool acpi_root_bridge_wakeup;
++
+ #define ACPI_GLUE_DEBUG       0
+ #if ACPI_GLUE_DEBUG
+ #define DBG(x...) printk(PREFIX x)
+@@ -207,6 +215,13 @@ static int acpi_bind_one(struct device *
+                               "physical_node");
+               if (acpi_dev->wakeup.flags.valid) {
+                       device_set_wakeup_capable(dev, true);
++                      if (acpi_root_bridge_wakeup
++                          && acpi_dev_is_root_bridge(acpi_dev)) {
++                              spin_lock(&acpi_device_lock);
++                              acpi_dev->wakeup.state.enabled = true;
++                              propagate_enable_wakeup(acpi_dev);
++                              spin_unlock(&acpi_device_lock);
++                      }
+                       device_set_wakeup_enable(dev,
+                                               acpi_dev->wakeup.state.enabled);
+               }
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/pci_root.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/pci_root.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/pci_root.c
+@@ -135,6 +135,15 @@ acpi_handle acpi_get_pci_rootbridge_hand
+ EXPORT_SYMBOL_GPL(acpi_get_pci_rootbridge_handle);
++/**
++ * acpi_dev_is_root_bridge - determine if an ACPI device is a PCI root bridge
++ * @device: ACPI device to check.
++ */
++bool acpi_dev_is_root_bridge(struct acpi_device *device)
++{
++      return !acpi_match_device_ids(device, root_device_ids);
++}
++
+ static acpi_status
+ get_root_bridge_busnr_callback(struct acpi_resource *resource, void *data)
+ {
+Index: linux-2.6.27-SLE11_BRANCH/include/acpi/acpi_bus.h
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/include/acpi/acpi_bus.h
++++ linux-2.6.27-SLE11_BRANCH/include/acpi/acpi_bus.h
+@@ -380,6 +380,7 @@ struct device *acpi_get_physical_pci_dev
+ /* helper */
+ acpi_handle acpi_get_child(acpi_handle, acpi_integer);
++bool acpi_dev_is_root_bridge(struct acpi_device *);
+ acpi_handle acpi_get_pci_rootbridge_handle(unsigned int, unsigned int);
+ #define DEVICE_ACPI_HANDLE(dev) ((acpi_handle)((dev)->archdata.acpi_handle))
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/wakeup.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/sleep/wakeup.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/wakeup.c
+@@ -142,6 +142,41 @@ void acpi_disable_wakeup_device(u8 sleep
+       spin_unlock(&acpi_device_lock);
+ }
++void physical_device_enable_wakeup(struct acpi_device *adev)
++{
++      struct device *dev = acpi_get_physical_device(adev->handle);
++
++      if (dev && device_can_wakeup(dev))
++              device_set_wakeup_enable(dev, adev->wakeup.state.enabled);
++}
++
++void propagate_enable_wakeup(struct acpi_device *wakeup_dev)
++{
++      struct list_head *node, *next;
++
++      list_for_each_safe(node, next, &acpi_wakeup_device_list) {
++              struct acpi_device *dev =
++                      container_of(node, struct acpi_device, wakeup_list);
++
++              if (!dev->wakeup.flags.valid)
++                      continue;
++
++              if (dev == wakeup_dev)
++                      continue;
++
++              if (dev->wakeup.gpe_number != wakeup_dev->wakeup.gpe_number
++                  || dev->wakeup.gpe_device != wakeup_dev->wakeup.gpe_device)
++                      continue;
++
++              printk(KERN_WARNING "ACPI: '%s' and '%s' share a GPE, "
++                      "unable to disable/enable one seperately\n",
++                      dev->pnp.bus_id, wakeup_dev->pnp.bus_id);
++
++              dev->wakeup.state.enabled = wakeup_dev->wakeup.state.enabled;
++              physical_device_enable_wakeup(dev);
++      }
++}
++
+ static int __init acpi_wakeup_device_init(void)
+ {
+       struct list_head *node, *next;
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/proc.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/sleep/proc.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/proc.c
+@@ -377,14 +377,6 @@ acpi_system_wakeup_device_seq_show(struc
+       return 0;
+ }
+-static void physical_device_enable_wakeup(struct acpi_device *adev)
+-{
+-      struct device *dev = acpi_get_physical_device(adev->handle);
+-
+-      if (dev && device_can_wakeup(dev))
+-              device_set_wakeup_enable(dev, adev->wakeup.state.enabled);
+-}
+-
+ static ssize_t
+ acpi_system_write_wakeup_device(struct file *file,
+                               const char __user * buffer,
+@@ -420,26 +412,7 @@ acpi_system_write_wakeup_device(struct f
+       }
+       if (found_dev) {
+               physical_device_enable_wakeup(found_dev);
+-              list_for_each_safe(node, next, &acpi_wakeup_device_list) {
+-                      struct acpi_device *dev = container_of(node,
+-                                                             struct
+-                                                             acpi_device,
+-                                                             wakeup_list);
+-
+-                      if ((dev != found_dev) &&
+-                          (dev->wakeup.gpe_number ==
+-                           found_dev->wakeup.gpe_number)
+-                          && (dev->wakeup.gpe_device ==
+-                              found_dev->wakeup.gpe_device)) {
+-                              printk(KERN_WARNING
+-                                     "ACPI: '%s' and '%s' have the same GPE, "
+-                                     "can't disable/enable one seperately\n",
+-                                     dev->pnp.bus_id, found_dev->pnp.bus_id);
+-                              dev->wakeup.state.enabled =
+-                                  found_dev->wakeup.state.enabled;
+-                              physical_device_enable_wakeup(dev);
+-                      }
+-              }
++              propagate_enable_wakeup(found_dev);
+       }
+       spin_unlock(&acpi_device_lock);
+       return count;
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/sleep.h
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/sleep/sleep.h
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/sleep.h
+@@ -5,3 +5,9 @@ extern int acpi_suspend (u32 state);
+ extern void acpi_enable_wakeup_device_prep(u8 sleep_state);
+ extern void acpi_enable_wakeup_device(u8 sleep_state);
+ extern void acpi_disable_wakeup_device(u8 sleep_state);
++extern void physical_device_enable_wakeup(struct acpi_device *adev);
++extern void propagate_enable_wakeup(struct acpi_device *root_dev);
++
++extern spinlock_t acpi_device_lock;
++
++extern bool acpi_root_bridge_wakeup;
+Index: linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/main.c
+===================================================================
+--- linux-2.6.27-SLE11_BRANCH.orig/drivers/acpi/sleep/main.c
++++ linux-2.6.27-SLE11_BRANCH/drivers/acpi/sleep/main.c
+@@ -320,6 +320,12 @@ static int __init init_set_sci_en_on_res
+       return 0;
+ }
++static int __init init_allow_root_bridge_wakeup(const struct dmi_system_id *d)
++{
++      acpi_root_bridge_wakeup = true;
++      return 0;
++}
++
+ static struct dmi_system_id __initdata acpisleep_dmi_table[] = {
+       {
+       .callback = init_old_suspend_ordering,
+@@ -361,6 +367,14 @@ static struct dmi_system_id __initdata a
+               DMI_MATCH(DMI_PRODUCT_NAME, "HP xw4600 Workstation"),
+               },
+       },
++      {
++      .callback = init_allow_root_bridge_wakeup,
++      .ident = "IBM 4852526",
++      .matches = {
++              DMI_MATCH(DMI_SYS_VENDOR, "IBM CORPORATION"),
++              DMI_MATCH(DMI_PRODUCT_NAME, "4852526"),
++              },
++      },
+       {},
+ };
+ #endif /* CONFIG_SUSPEND */
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/dlm-change-lock-time-stamping.patch
rename to src/patches/suse-2.6.27.39/patches.suse/dlm-change-lock-time-stamping.patch
index 3c0d919937172cab6523a8239730454b23e5e036..3d84996a04f0a3645c3ba99946f30241556c958e 100644 (file)
@@ -112,7 +112,7 @@ index 7b758da..dfc57ae 100644
                list_for_each_entry(lkb, &ls->ls_timeout, lkb_time_list) {
  
 +                      wait_us = ktime_to_us(ktime_sub(ktime_get(),
-+                                                      lkb->lkb_timestamp));
++                                                      lkb->lkb_timestamp));
 +
                        if ((lkb->lkb_exflags & DLM_LKF_TIMEOUT) &&
 -                          time_after_eq(jiffies, lkb->lkb_timestamp +
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/dlm-fix-seq_file-usage-in-debugfs-lock-dump.patch
rename to src/patches/suse-2.6.27.39/patches.suse/dlm-fix-seq_file-usage-in-debugfs-lock-dump.patch
index 8bb27b62ea3b79d65486e010854119926d040029..0e57aafa80c7fa47f84cb11c671948fd988c2b78 100644 (file)
@@ -106,7 +106,7 @@ index 2f107d1..bc4af3e 100644
 -              seq_printf(s, "\"  \nLooking up master (lkid %x)\n",
 -                         res->res_first_lkid);
 +              rv = seq_printf(s, "\"  \nLooking up master (lkid %x)\n",
-+                              res->res_first_lkid);
++                              res->res_first_lkid);
        else
 -              seq_printf(s, "\"  \nInvalid master %d\n", res->res_nodeid);
 +              rv = seq_printf(s, "\"  \nInvalid master %d\n",
@@ -135,7 +135,7 @@ index 2f107d1..bc4af3e 100644
 -                         res->res_flags, res->res_recover_locks_count);
 +              rv = seq_printf(s, "Recovery: root %d recover %d flags %lx "
 +                              "count %d\n", root_list, recover_list,
-+                              res->res_flags, res->res_recover_locks_count);
++                              res->res_flags, res->res_recover_locks_count);
 +              if (rv)
 +                      goto out;
        }
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/mm-devzero-optimisation.patch
rename to src/patches/suse-2.6.27.39/patches.suse/mm-devzero-optimisation.patch
index bd499e7d2f4e34482c10ba2fb232efb40590ddd9..584c7002ffcbf9eb86241cece9aafa2c531e1b68 100644 (file)
@@ -55,7 +55,7 @@ Signed-off-by: Nick Piggin <npiggin@suse.de>
 +                      count = size;
 +
 +              zap_page_range(vma, addr, count, NULL);
-+              if (zeromap_page_range(vma, addr, count, PAGE_COPY))
++              if (zeromap_page_range(vma, addr, count, PAGE_COPY))
 +                      break;
 +
 +              size -= count;
similarity index 90%
rename from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Add-quota-calls-for-allocation-and-freeing-of.patch
rename to src/patches/suse-2.6.27.39/patches.suse/ocfs2-Add-quota-calls-for-allocation-and-freeing-of.patch
index f95388a781213bc9d34f252ba441dfceb5424b55..fca4e50bd6ecc5829a67e6579d8d941ecbfd0af0 100644 (file)
@@ -10,19 +10,18 @@ outside of a transaction.
 
 Signed-off-by: Jan Kara <jack@suse.cz>
 ---
- fs/ocfs2/alloc.c   |   18 ++++++-
- fs/ocfs2/aops.c    |   16 +++++-
- fs/ocfs2/dir.c     |   24 ++++++++-
- fs/ocfs2/file.c    |   70 ++++++++++++++++++++++--
- fs/ocfs2/inode.c   |   10 +++-
- fs/ocfs2/journal.h |   99 ++++++++++++++++++++++++----------
- fs/ocfs2/namei.c   |  151 +++++++++++++++++++++++++++++++++++----------------
- 7 files changed, 296 insertions(+), 92 deletions(-)
+ fs/ocfs2/alloc.c   |   20 +++++++++-
+ fs/ocfs2/aops.c    |   16 ++++++--
+ fs/ocfs2/dir.c     |   24 +++++++++++-
+ fs/ocfs2/file.c    |   68 +++++++++++++++++++++++++++++++++---
+ fs/ocfs2/inode.c   |   10 ++++-
+ fs/ocfs2/journal.h |   99 ++++++++++++++++++++++++++++++++++++-----------------
+ fs/ocfs2/namei.c   |   44 +++++++++++++++++++++--
+ fs/ocfs2/xattr.c   |   12 +++---
+ 8 files changed, 239 insertions(+), 54 deletions(-)
 
-Index: linux-2.6.27-ocfs2/fs/ocfs2/alloc.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/alloc.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/alloc.c
+--- a/fs/ocfs2/alloc.c
++++ b/fs/ocfs2/alloc.c
 @@ -28,6 +28,7 @@
  #include <linux/slab.h>
  #include <linux/highmem.h>
@@ -92,10 +91,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/alloc.c
        ocfs2_commit_trans(osb, handle);
  
  out_unlock:
-Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/aops.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/aops.c
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
 @@ -27,6 +27,7 @@
  #include <linux/swap.h>
  #include <linux/pipe_fs_i.h>
@@ -104,7 +101,7 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
  
  #define MLOG_MASK_PREFIX ML_FILE_IO
  #include <cluster/masklog.h>
-@@ -1750,6 +1751,11 @@ int ocfs2_write_begin_nolock(struct addr
+@@ -1780,6 +1781,11 @@ int ocfs2_write_begin_nolock(struct addr
  
        wc->w_handle = handle;
  
@@ -116,7 +113,7 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
        /*
         * We don't want this to fail in ocfs2_write_end(), so do it
         * here.
-@@ -1758,7 +1764,7 @@ int ocfs2_write_begin_nolock(struct addr
+@@ -1788,7 +1794,7 @@ int ocfs2_write_begin_nolock(struct addr
                                   OCFS2_JOURNAL_ACCESS_WRITE);
        if (ret) {
                mlog_errno(ret);
@@ -125,8 +122,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
        }
  
        /*
-@@ -1771,14 +1777,14 @@ int ocfs2_write_begin_nolock(struct addr
-                                        mmap_page);
+@@ -1800,14 +1806,14 @@ int ocfs2_write_begin_nolock(struct addr
+                                        cluster_of_pages, mmap_page);
        if (ret) {
                mlog_errno(ret);
 -              goto out_commit;
@@ -142,7 +139,7 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
        }
  
        if (data_ac)
-@@ -1790,6 +1796,10 @@ success:
+@@ -1819,6 +1825,10 @@ success:
        *pagep = wc->w_target_page;
        *fsdata = wc;
        return 0;
@@ -153,10 +150,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/aops.c
  out_commit:
        ocfs2_commit_trans(osb, handle);
  
-Index: linux-2.6.27-ocfs2/fs/ocfs2/dir.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/dir.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/dir.c
+--- a/fs/ocfs2/dir.c
++++ b/fs/ocfs2/dir.c
 @@ -40,6 +40,7 @@
  #include <linux/types.h>
  #include <linux/slab.h>
@@ -220,12 +215,12 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/dir.c
        if (extend) {
                u32 offset = OCFS2_I(dir)->ip_clusters;
  
-+              if (vfs_dq_alloc_space_nodirty(dir,
-+                                      ocfs2_clusters_to_bytes(sb, 1))) {
-+                      status = -EDQUOT;
-+                      goto bail;
-+              }
-+              did_quota = 1;
++              if (vfs_dq_alloc_space_nodirty(dir,
++                                      ocfs2_clusters_to_bytes(sb, 1))) {
++                      status = -EDQUOT;
++                      goto bail;
++              }
++              did_quota = 1;
 +
                status = ocfs2_add_inode_data(OCFS2_SB(sb), dir, &offset,
                                              1, 0, parent_fe_bh, handle,
@@ -239,10 +234,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/dir.c
        mlog_exit(status);
        return status;
  }
-Index: linux-2.6.27-ocfs2/fs/ocfs2/file.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/file.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/file.c
+--- a/fs/ocfs2/file.c
++++ b/fs/ocfs2/file.c
 @@ -35,6 +35,7 @@
  #include <linux/mount.h>
  #include <linux/writeback.h>
@@ -367,10 +360,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/file.c
        ocfs2_inode_unlock(inode, 1);
  bail_unlock_rw:
        if (size_change)
-Index: linux-2.6.27-ocfs2/fs/ocfs2/inode.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/inode.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/inode.c
+--- a/fs/ocfs2/inode.c
++++ b/fs/ocfs2/inode.c
 @@ -28,6 +28,7 @@
  #include <linux/slab.h>
  #include <linux/highmem.h>
@@ -409,10 +400,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/inode.c
                mlog(0, "Skipping delete of bad inode\n");
                goto bail;
        }
-Index: linux-2.6.27-ocfs2/fs/ocfs2/journal.h
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/journal.h
-+++ linux-2.6.27-ocfs2/fs/ocfs2/journal.h
+--- a/fs/ocfs2/journal.h
++++ b/fs/ocfs2/journal.h
 @@ -293,6 +293,37 @@ int                  ocfs2_journal_dirty
  /* extended attribute block update */
  #define OCFS2_XATTR_BLOCK_UPDATE_CREDITS 1
@@ -586,10 +575,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/journal.h
        return credits;
  }
  
-Index: linux-2.6.27-ocfs2/fs/ocfs2/namei.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/namei.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/namei.c
+--- a/fs/ocfs2/namei.c
++++ b/fs/ocfs2/namei.c
 @@ -40,6 +40,7 @@
  #include <linux/types.h>
  #include <linux/slab.h>
@@ -725,10 +712,8 @@ Index: linux-2.6.27-ocfs2/fs/ocfs2/namei.c
        if (handle)
                ocfs2_commit_trans(osb, handle);
  
-Index: linux-2.6.27-ocfs2/fs/ocfs2/xattr.c
-===================================================================
---- linux-2.6.27-ocfs2.orig/fs/ocfs2/xattr.c
-+++ linux-2.6.27-ocfs2/fs/ocfs2/xattr.c
+--- a/fs/ocfs2/xattr.c
++++ b/fs/ocfs2/xattr.c
 @@ -1613,7 +1613,7 @@ static int ocfs2_remove_value_outside(st
  
        ocfs2_init_dealloc_ctxt(&ctxt.dealloc);
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Comment-struct-ocfs2_extent_tree_operations.patch
rename to src/patches/suse-2.6.27.39/patches.suse/ocfs2-Comment-struct-ocfs2_extent_tree_operations.patch
index 8dc6cbd97d3dbe8528a56d2d7d51d7cf128806c4..4069413bb1e25aae2283d9868e66c848e7edccf1 100644 (file)
@@ -11,10 +11,8 @@ Signed-off-by: Joel Becker <joel.becker@oracle.com>
 Acked-by: Mark Fasheh <mark.fasheh@suse.com>
 ---
  fs/ocfs2/alloc.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
- 1 files changed, 43 insertions(+), 2 deletions(-)
+ 1 file changed, 43 insertions(+), 2 deletions(-)
 
-diff --git a/fs/ocfs2/alloc.c b/fs/ocfs2/alloc.c
-index d196d40..51c3183 100644
 --- a/fs/ocfs2/alloc.c
 +++ b/fs/ocfs2/alloc.c
 @@ -50,21 +50,62 @@
@@ -82,6 +80,3 @@ index d196d40..51c3183 100644
        void (*eo_fill_max_leaf_clusters)(struct inode *inode,
                                          struct ocfs2_extent_tree *et);
  };
--- 
-1.5.4.5
-
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Make-ocfs2_extent_tree-the-first-class-repres.patch
rename to src/patches/suse-2.6.27.39/patches.suse/ocfs2-Make-ocfs2_extent_tree-the-first-class-repres.patch
index ded6ee26b711951372e7a1d1a6f834551248cabf..10436838ab05ad260fc38bdd2c24fd7b99d688de 100644 (file)
@@ -23,20 +23,18 @@ function.
 Signed-off-by: Joel Becker <joel.becker@oracle.com>
 Acked-by: Mark Fasheh <mark.fasheh@suse.com>
 ---
- fs/ocfs2/alloc.c    |  300 +++++++++++++++-----------------------------------
- fs/ocfs2/alloc.h    |  111 +++++++++++---------
- fs/ocfs2/aops.c     |   16 ++-
- fs/ocfs2/dir.c      |   20 ++--
- fs/ocfs2/file.c     |   36 ++++---
- fs/ocfs2/suballoc.c |   12 +--
- fs/ocfs2/suballoc.h |    6 +-
- fs/ocfs2/xattr.c    |   71 +++++++------
+ fs/ocfs2/alloc.c    |  300 +++++++++++++++-------------------------------------
+ fs/ocfs2/alloc.h    |  111 ++++++++++---------
+ fs/ocfs2/aops.c     |   16 +-
+ fs/ocfs2/dir.c      |   20 ++-
+ fs/ocfs2/file.c     |   36 +++---
+ fs/ocfs2/suballoc.c |   12 --
+ fs/ocfs2/suballoc.h |    6 -
+ fs/ocfs2/xattr.c    |   71 ++++++------
  8 files changed, 240 insertions(+), 332 deletions(-)
 
-Index: linux-2.6.26/fs/ocfs2/alloc.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/alloc.c
-+++ linux-2.6.26/fs/ocfs2/alloc.c
+--- a/fs/ocfs2/alloc.c
++++ b/fs/ocfs2/alloc.c
 @@ -49,20 +49,6 @@
  
  #include "buffer_head_io.h"
@@ -599,10 +597,8 @@ Index: linux-2.6.26/fs/ocfs2/alloc.c
                if (ret) {
                        mlog_errno(ret);
                        goto out_commit;
-Index: linux-2.6.26/fs/ocfs2/alloc.h
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/alloc.h
-+++ linux-2.6.26/fs/ocfs2/alloc.h
+--- a/fs/ocfs2/alloc.h
++++ b/fs/ocfs2/alloc.h
 @@ -26,46 +26,66 @@
  #ifndef OCFS2_ALLOC_H
  #define OCFS2_ALLOC_H
@@ -745,19 +741,17 @@ Index: linux-2.6.26/fs/ocfs2/alloc.h
  
  /*
   * how many new metadata chunks would an allocation need at maximum?
-Index: linux-2.6.26/fs/ocfs2/aops.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/aops.c
-+++ linux-2.6.26/fs/ocfs2/aops.c
-@@ -1242,6 +1242,7 @@ static int ocfs2_write_cluster(struct ad
-       int ret, i, new, should_zero = 0;
+--- a/fs/ocfs2/aops.c
++++ b/fs/ocfs2/aops.c
+@@ -1243,6 +1243,7 @@ static int ocfs2_write_cluster(struct ad
+       int ret, i, new;
        u64 v_blkno, p_blkno;
        struct inode *inode = mapping->host;
 +      struct ocfs2_extent_tree et;
  
        new = phys == 0 ? 1 : 0;
-       if (new || unwritten)
-@@ -1276,10 +1277,11 @@ static int ocfs2_write_cluster(struct ad
+@@ -1275,10 +1276,11 @@ static int ocfs2_write_cluster(struct ad
                        goto out;
                }
        } else if (unwritten) {
@@ -772,7 +766,7 @@ Index: linux-2.6.26/fs/ocfs2/aops.c
                if (ret < 0) {
                        mlog_errno(ret);
                        goto out;
-@@ -1666,6 +1668,7 @@ int ocfs2_write_begin_nolock(struct addr
+@@ -1685,6 +1687,7 @@ int ocfs2_write_begin_nolock(struct addr
        struct ocfs2_alloc_context *data_ac = NULL;
        struct ocfs2_alloc_context *meta_ac = NULL;
        handle_t *handle;
@@ -780,7 +774,7 @@ Index: linux-2.6.26/fs/ocfs2/aops.c
  
        ret = ocfs2_alloc_write_ctxt(&wc, osb, pos, len, di_bh);
        if (ret) {
-@@ -1719,10 +1722,11 @@ int ocfs2_write_begin_nolock(struct addr
+@@ -1738,10 +1741,11 @@ int ocfs2_write_begin_nolock(struct addr
                     (long long)i_size_read(inode), le32_to_cpu(di->i_clusters),
                     clusters_to_alloc, extents_to_split);
  
@@ -795,10 +789,8 @@ Index: linux-2.6.26/fs/ocfs2/aops.c
                if (ret) {
                        mlog_errno(ret);
                        goto out;
-Index: linux-2.6.26/fs/ocfs2/dir.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/dir.c
-+++ linux-2.6.26/fs/ocfs2/dir.c
+--- a/fs/ocfs2/dir.c
++++ b/fs/ocfs2/dir.c
 @@ -1192,6 +1192,9 @@ static int ocfs2_expand_inline_dir(struc
        struct buffer_head *dirdata_bh = NULL;
        struct ocfs2_dinode *di = (struct ocfs2_dinode *)di_bh->b_data;
@@ -861,10 +853,8 @@ Index: linux-2.6.26/fs/ocfs2/dir.c
                if (num_free_extents < 0) {
                        status = num_free_extents;
                        mlog_errno(status);
-Index: linux-2.6.26/fs/ocfs2/file.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/file.c
-+++ linux-2.6.26/fs/ocfs2/file.c
+--- a/fs/ocfs2/file.c
++++ b/fs/ocfs2/file.c
 @@ -509,14 +509,17 @@ int ocfs2_add_inode_data(struct ocfs2_su
                         struct ocfs2_alloc_context *meta_ac,
                         enum ocfs2_alloc_restarted *reason_ret)
@@ -947,10 +937,8 @@ Index: linux-2.6.26/fs/ocfs2/file.c
        return ret;
  }
  
-Index: linux-2.6.26/fs/ocfs2/suballoc.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/suballoc.c
-+++ linux-2.6.26/fs/ocfs2/suballoc.c
+--- a/fs/ocfs2/suballoc.c
++++ b/fs/ocfs2/suballoc.c
 @@ -1911,12 +1911,11 @@ static inline void ocfs2_debug_suballoc_
   * File systems which don't support holes call this from
   * ocfs2_extend_allocation().
@@ -986,10 +974,8 @@ Index: linux-2.6.26/fs/ocfs2/suballoc.c
                if (ret < 0) {
                        if (ret != -ENOSPC)
                                mlog_errno(ret);
-Index: linux-2.6.26/fs/ocfs2/suballoc.h
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/suballoc.h
-+++ linux-2.6.26/fs/ocfs2/suballoc.h
+--- a/fs/ocfs2/suballoc.h
++++ b/fs/ocfs2/suballoc.h
 @@ -164,10 +164,8 @@ u64 ocfs2_which_cluster_group(struct ino
  int ocfs2_check_group_descriptor(struct super_block *sb,
                                 struct ocfs2_dinode *di,
@@ -1003,10 +989,8 @@ Index: linux-2.6.26/fs/ocfs2/suballoc.h
 -                        enum ocfs2_extent_tree_type type, void *private);
 +                        struct ocfs2_alloc_context **meta_ac);
  #endif /* _CHAINALLOC_H_ */
-Index: linux-2.6.26/fs/ocfs2/xattr.c
-===================================================================
---- linux-2.6.26.orig/fs/ocfs2/xattr.c
-+++ linux-2.6.26/fs/ocfs2/xattr.c
+--- a/fs/ocfs2/xattr.c
++++ b/fs/ocfs2/xattr.c
 @@ -222,22 +222,24 @@ static int ocfs2_xattr_extend_allocation
        struct ocfs2_alloc_context *meta_ac = NULL;
        enum ocfs2_alloc_restarted why;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/ocfs2-Take-ocfs2_xattr_bucket-structures-off-of-the.patch
rename to src/patches/suse-2.6.27.39/patches.suse/ocfs2-Take-ocfs2_xattr_bucket-structures-off-of-the.patch
index c00c7d47cb58b054329096e63a921e45c360e603..e03c5c6847cd1c0dace7d4e8ab3b2f431ac539c3 100644 (file)
@@ -535,7 +535,7 @@ index 71d9e7b..766494e 100644
 +              mlog_errno(ret);
 +              goto out;
 +      }
-+  
++
 +      ret = ocfs2_read_xattr_bucket(s_bucket, s_blkno);
        if (ret)
                goto out;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/silent-stack-overflow-2.patch
rename to src/patches/suse-2.6.27.39/patches.suse/silent-stack-overflow-2.patch
index 7683737557e18f13b8c18db5fcea92a745a04374..bfc826dcd624e62e8a3785b8d8ff99600b76be6c 100644 (file)
@@ -424,8 +424,8 @@ Signed-off-by: Nick Piggin <npiggin@suse.de>
                /* remember the largest hole we saw so far */
 -              if (addr + mm->cached_hole_size < vma->vm_start)
 -                      mm->cached_hole_size = vma->vm_start - addr;
-+              if (addr + guard + mm->cached_hole_size < vma->vm_start)
-+                      mm->cached_hole_size = vma->vm_start - (addr + guard);
++              if (addr + guard + mm->cached_hole_size < vma->vm_start)
++                      mm->cached_hole_size = vma->vm_start - (addr + guard);
  
                /* try just below the current vma->vm_start */
 -              addr = vma->vm_start-len;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/squashfs-3.4.patch
rename to src/patches/suse-2.6.27.39/patches.suse/squashfs-3.4.patch
index ae00bc7557eb9791cb5edaf682413eb7f3a54c95..cc2aedcb1e497fe2db8b3983727af3372ba3be11 100644 (file)
@@ -343,8 +343,8 @@ Acked-by: Greg Kroah-Hartman <gregkh@suse.com>
 +              int zlib_err = 0;
 +
 +              /*
-+              * uncompress block
-+              */
++               * uncompress block
++               */
 +
 +              mutex_lock(&msblk->read_data_mutex);
 +
@@ -1223,8 +1223,8 @@ Acked-by: Greg Kroah-Hartman <gregkh@suse.com>
 +      mutex_init(&msblk->meta_index_mutex);
 +
 +      /* sblk->bytes_used is checked in squashfs_read_data to ensure reads are not
-+       * beyond filesystem end.  As we're using squashfs_read_data to read sblk here,
-+       * first set sblk->bytes_used to a useful value */
++       * beyond filesystem end.  As we're using squashfs_read_data to read sblk here,
++       * first set sblk->bytes_used to a useful value */
 +      sblk->bytes_used = sizeof(struct squashfs_super_block);
 +      if (!squashfs_read_data(s, (char *) sblk, SQUASHFS_START,
 +                                      sizeof(struct squashfs_super_block) |
@@ -1726,7 +1726,7 @@ Acked-by: Greg Kroah-Hartman <gregkh@suse.com>
 +      unsigned int bsize, i;
 +      int bytes;
 +      int index = page->index >> (sblk->block_log - PAGE_CACHE_SHIFT);
-+      void *pageaddr;
++      void *pageaddr;
 +      struct squashfs_cache_entry *fragment = NULL;
 +      char *data_ptr = msblk->read_page;
 +
@@ -1803,7 +1803,7 @@ Acked-by: Greg Kroah-Hartman <gregkh@suse.com>
 +              if (PageUptodate(push_page))
 +                      goto skip_page;
 +
-+              pageaddr = kmap_atomic(push_page, KM_USER0);
++              pageaddr = kmap_atomic(push_page, KM_USER0);
 +              memcpy(pageaddr, data_ptr, avail);
 +              memset(pageaddr + avail, 0, PAGE_CACHE_SIZE - avail);
 +              kunmap_atomic(pageaddr, KM_USER0);
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/suse-ppc32-mol.patch
rename to src/patches/suse-2.6.27.39/patches.suse/suse-ppc32-mol.patch
index 8b401f57bca4a05822085eac7e884c39efe6e72e..1354948418d6b437816731c9be324a51e61182aa 100644 (file)
@@ -5143,7 +5143,7 @@ Never modify this patch!  Create new patches for build fixes.
 +              v = (v>>4) & CTX_MASK;
 +
 +              if( v >= MMU.first_mol_context && v <= MMU.last_mol_context ) {
-+                      *pte = 0;
++                      *pte = 0;
 +                      count++;
 +              }
 +      }
@@ -5623,7 +5623,7 @@ Never modify this patch!  Create new patches for build fixes.
 +      ulong ea = (pb->ea & ~0xfff);
 +      mSEGREG segr;
 +      mac_bat_t *bp;
-+              int sv_mode, i, sbits;
++      int sv_mode, i, sbits;
 +      mPTE_t *mpte;
 +
 +      pb->mpte = NULL;
similarity index 99%
rename from src/patches/suse-2.6.27.31/patches.suse/xfs-dmapi-src
rename to src/patches/suse-2.6.27.39/patches.suse/xfs-dmapi-src
index ab7b43349365a85f8e74149ea9cd4e3cd852ed5a..ef4a01975d661f970440e360e90efb80539fe218 100644 (file)
@@ -3749,7 +3749,7 @@ Index: linux-2.6.26/fs/dmapi/dmapi_mountinfo.c
 +      vecrq.count = 0;
 +      vecrq.vecp = NULL;
 +
-+      error = -ENOSYS;
++      error = -ENOSYS;
 +      ASSERT(dmapiops);
 +      if (dmapiops->get_fsys_vector)
 +              error = dmapiops->get_fsys_vector(sb, (caddr_t)&vecrq);
@@ -8451,7 +8451,7 @@ Index: linux-2.6.26/fs/dmapi/dmapi_session.c
 +                      return(error);
 +              }
 +              unlink_session(s);
-+              mutex_spinunlock(&dm_session_lock, lc); 
++              mutex_spinunlock(&dm_session_lock, lc);
 +#ifdef CONFIG_PROC_FS
 +              {
 +              char buf[100];
@@ -8463,7 +8463,7 @@ Index: linux-2.6.26/fs/dmapi/dmapi_session.c
 +      memcpy(s->sn_info, sessinfo, len);
 +      s->sn_info[len-1] = 0;          /* if not NULL, then now 'tis */
 +      s->sn_sessid = sid;
-+      lc = mutex_spinlock(&dm_session_lock); 
++      lc = mutex_spinlock(&dm_session_lock);
 +      link_session(s);
 +      mutex_spinunlock(&dm_session_lock, lc);
 +#ifdef CONFIG_PROC_FS
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.suse/xfs-nfsd-dmapi-aware
rename to src/patches/suse-2.6.27.39/patches.suse/xfs-nfsd-dmapi-aware
index 253bdf2b9e7cfe81aa0fa56d3bc24f4a9db900a0..592ecee327cd5bf47210d33311ca571adc25e9b1 100644 (file)
@@ -139,11 +139,11 @@ Acked-by: Jan Kara <jack@suse.cz>
        /* Write the data. */
        oldfs = get_fs(); set_fs(KERNEL_DS);
        host_err = vfs_writev(file, (struct iovec __user *)vec, vlen, &offset);
-@@ -1050,8 +1074,12 @@ nfsd_vfs_write(struct svc_rqst *rqstp, s
+@@ -1051,8 +1075,12 @@ nfsd_vfs_write(struct svc_rqst *rqstp, s
        dprintk("nfsd: write complete host_err=%d\n", host_err);
        if (host_err >= 0)
                err = 0;
--      else 
+-      else
 +      else {
 +              /* to get NFSERR_JUKEBOX on the wire, need -ETIMEDOUT */
 +              if (host_err == -EAGAIN)
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.trace/lttng-instrumentation-scheduler.patch
rename to src/patches/suse-2.6.27.39/patches.trace/lttng-instrumentation-scheduler.patch
index f79f5a5bc31af03cefd91685442fda5f5bc7c041..07db8f376460523336ffb3f7a1664eeb92a23e32 100644 (file)
@@ -124,7 +124,7 @@ Acked-by: Jan Blunck <jblunck@suse.de>
        exit_sem(tsk);
        exit_files(tsk);
        exit_fs(tsk);
-@@ -1679,6 +1685,8 @@ static long do_wait(enum pid_type type, 
+@@ -1679,6 +1685,8 @@ static long do_wait(enum pid_type type,
        struct task_struct *tsk;
        int retval;
  
@@ -143,7 +143,7 @@ Acked-by: Jan Blunck <jblunck@suse.de>
  
  #include <asm/pgtable.h>
  #include <asm/pgalloc.h>
-@@ -1363,6 +1364,8 @@ long do_fork(unsigned long clone_flags,
+@@ -1354,6 +1355,8 @@ long do_fork(unsigned long clone_flags,
        if (!IS_ERR(p)) {
                struct completion vfork;
  
@@ -172,7 +172,7 @@ Acked-by: Jan Blunck <jblunck@suse.de>
        init_completion(&kthread_stop_info.done);
        smp_wmb();
 @@ -221,6 +224,8 @@ int kthread_stop(struct task_struct *k)
-       ret = kthread_stop_info.err;
+       put_task_struct(k);
        mutex_unlock(&kthread_stop_lock);
  
 +      trace_sched_kthread_stop_ret(ret);
@@ -190,7 +190,7 @@ Acked-by: Jan Blunck <jblunck@suse.de>
  #include <linux/perfmon_kern.h>
  
  #include <asm/tlb.h>
-@@ -1914,6 +1915,7 @@ unsigned long wait_task_inactive(struct 
+@@ -1914,6 +1915,7 @@ unsigned long wait_task_inactive(struct
                 * just go back and repeat.
                 */
                rq = task_rq_lock(p, &flags);
diff --git a/src/patches/suse-2.6.27.39/patches.xen/932-edac.patch b/src/patches/suse-2.6.27.39/patches.xen/932-edac.patch
new file mode 100644 (file)
index 0000000..fa79de3
--- /dev/null
@@ -0,0 +1,24 @@
+From: http://xenbits.xensource.com/linux-2.6.18-xen.hg?rev/eebccbc294da
+# HG changeset patch
+# User Keir Fraser <keir.fraser@citrix.com>
+# Date 1253603019 -3600
+# Node ID eebccbc294dad786b2b14892bf1e60d0034f8f0d
+# Parent  f1a207ccb4934787a18e37458162232fd4ede6d1
+Subject: xen/edac: force proper address translation in EDAC
+Patch-mainline: n/a
+
+Signed-off-by: Jan Beulich <jbeulich@novell.com>
+
+--- sle11-2009-09-18.orig/drivers/edac/edac_mc.c       2008-07-13 23:51:29.000000000 +0200
++++ sle11-2009-09-18/drivers/edac/edac_mc.c    2009-09-18 11:38:11.000000000 +0200
+@@ -580,6 +580,10 @@ static void edac_mc_scrub_block(unsigned
+       debugf3("%s()\n", __func__);
++#ifdef CONFIG_XEN
++      page = mfn_to_local_pfn(page);
++#endif
++
+       /* ECC error page was not in our memory. Ignore it. */
+       if (!pfn_valid(page))
+               return;
diff --git a/src/patches/suse-2.6.27.39/patches.xen/933-usb-mon-dma.patch b/src/patches/suse-2.6.27.39/patches.xen/933-usb-mon-dma.patch
new file mode 100644 (file)
index 0000000..7d9c3b7
--- /dev/null
@@ -0,0 +1,25 @@
+From: http://xenbits.xensource.com/linux-2.6.18-xen.hg?rev/1fcc9557d5ef
+# HG changeset patch
+# User Keir Fraser <keir.fraser@citrix.com>
+# Date 1253603047 -3600
+# Node ID 1fcc9557d5ef55d03b128a04cab4bd7227413aa7
+# Parent  eebccbc294dad786b2b14892bf1e60d0034f8f0d
+Subject: xen/usb: force proper address translation in USB monitor
+Patch-mainline: n/a
+
+Signed-off-by: Jan Beulich <jbeulich@novell.com>
+
+--- sle11-2009-09-18.orig/drivers/usb/mon/mon_dma.c    2007-04-26 05:08:32.000000000 +0200
++++ sle11-2009-09-18/drivers/usb/mon/mon_dma.c 2009-09-18 11:13:41.000000000 +0200
+@@ -19,7 +19,11 @@
+ #if defined(__i386__) || defined(__x86_64__) /* CONFIG_ARCH_I386 doesn't exit */
+ #define MON_HAS_UNMAP 1
++#ifndef CONFIG_XEN
+ #define phys_to_page(phys)    pfn_to_page((phys) >> PAGE_SHIFT)
++#else
++#define phys_to_page(phys)    pfn_to_page(mfn_to_local_pfn((phys) >> PAGE_SHIFT))
++#endif
+ char mon_dmapeek(unsigned char *dst, dma_addr_t dma_addr, int len)
+ {
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen-balloon-accounting b/src/patches/suse-2.6.27.39/patches.xen/xen-balloon-accounting
new file mode 100644 (file)
index 0000000..1a37ab3
--- /dev/null
@@ -0,0 +1,306 @@
+From: jbeulich@novell.com
+Subject: improve interaction with mm's accounting
+References: bnc#509753
+Patch-mainline: obsolete
+
+--- sle11-2009-08-26.orig/arch/x86/kernel/e820-xen.c   2009-08-31 11:47:11.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/e820-xen.c        2009-06-25 14:20:32.000000000 +0200
+@@ -1221,6 +1221,11 @@ int __init e820_find_active_region(const
+ {
+       u64 align = PAGE_SIZE;
++#ifdef CONFIG_XEN
++      if (last_pfn > xen_start_info->nr_pages)
++              last_pfn = xen_start_info->nr_pages;
++#endif
++
+       *ei_startpfn = round_up(ei->addr, align) >> PAGE_SHIFT;
+       *ei_endpfn = round_down(ei->addr + ei->size, align) >> PAGE_SHIFT;
+@@ -1255,6 +1260,10 @@ void __init e820_register_active_regions
+                                           start_pfn, last_pfn,
+                                           &ei_startpfn, &ei_endpfn))
+                       add_active_range(nid, ei_startpfn, ei_endpfn);
++#ifdef CONFIG_XEN
++      BUG_ON(nid);
++      add_active_range(nid, last_pfn, last_pfn);
++#endif
+ }
+ /*
+--- sle11-2009-08-26.orig/arch/x86/mm/init_32-xen.c    2009-08-31 11:47:11.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/init_32-xen.c 2009-08-26 12:11:50.000000000 +0200
+@@ -399,8 +399,7 @@ static void __init add_one_highpage_init
+ {
+       ClearPageReserved(page);
+       init_page_count(page);
+-      if (pfn < xen_start_info->nr_pages)
+-              __free_page(page);
++      __free_page(page);
+       totalhigh_pages++;
+ }
+@@ -450,8 +449,16 @@ void __init add_highpages_with_active_re
+ #ifndef CONFIG_NUMA
+ static void __init set_highmem_pages_init(void)
+ {
++      unsigned long pfn;
++
+       add_highpages_with_active_regions(0, highstart_pfn, highend_pfn);
++      /* XEN: init high-mem pages outside initial allocation. */
++      for (pfn = xen_start_info->nr_pages; pfn < highend_pfn; pfn++) {
++              ClearPageReserved(pfn_to_page(pfn));
++              init_page_count(pfn_to_page(pfn));
++      }
++
+       totalram_pages += totalhigh_pages;
+ }
+ #endif /* !CONFIG_NUMA */
+@@ -1006,11 +1013,10 @@ void __init mem_init(void)
+ #endif
+       /* this will put all low memory onto the freelists */
+       totalram_pages += free_all_bootmem();
+-      /* XEN: init and count low-mem pages outside initial allocation. */
++      /* XEN: init low-mem pages outside initial allocation. */
+       for (pfn = xen_start_info->nr_pages; pfn < max_low_pfn; pfn++) {
+               ClearPageReserved(pfn_to_page(pfn));
+               init_page_count(pfn_to_page(pfn));
+-              totalram_pages++;
+       }
+       reservedpages = 0;
+--- sle11-2009-08-26.orig/arch/x86/mm/init_64-xen.c    2009-08-31 11:47:11.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/init_64-xen.c 2009-08-26 12:11:53.000000000 +0200
+@@ -1085,11 +1085,10 @@ void __init mem_init(void)
+ #else
+       totalram_pages = free_all_bootmem();
+ #endif
+-      /* XEN: init and count pages outside initial allocation. */
++      /* XEN: init pages outside initial allocation. */
+       for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
+               ClearPageReserved(pfn_to_page(pfn));
+               init_page_count(pfn_to_page(pfn));
+-              totalram_pages++;
+       }
+       reservedpages = max_pfn - totalram_pages -
+                                       absent_pages_in_range(0, max_pfn);
+--- sle11-2009-08-26.orig/drivers/xen/balloon/balloon.c        2009-06-29 15:44:49.000000000 +0200
++++ sle11-2009-08-26/drivers/xen/balloon/balloon.c     2009-08-31 11:47:38.000000000 +0200
+@@ -37,6 +37,7 @@
+ #include <linux/sched.h>
+ #include <linux/errno.h>
+ #include <linux/mm.h>
++#include <linux/swap.h>
+ #include <linux/mman.h>
+ #include <linux/smp_lock.h>
+ #include <linux/pagemap.h>
+@@ -81,11 +82,7 @@ struct balloon_stats balloon_stats;
+ /* We increase/decrease in batches which fit in a page */
+ static unsigned long frame_list[PAGE_SIZE / sizeof(unsigned long)];
+-/* VM /proc information for memory */
+-extern unsigned long totalram_pages;
+-
+ #ifdef CONFIG_HIGHMEM
+-extern unsigned long totalhigh_pages;
+ #define inc_totalhigh_pages() (totalhigh_pages++)
+ #define dec_totalhigh_pages() (totalhigh_pages--)
+ #else
+@@ -121,29 +118,44 @@ static struct timer_list balloon_timer;
+       printk(KERN_WARNING "xen_mem: " fmt, ##args)
+ /* balloon_append: add the given page to the balloon. */
+-static void balloon_append(struct page *page)
++static void balloon_append(struct page *page, int account)
+ {
++      unsigned long pfn;
++
+       /* Lowmem is re-populated first, so highmem pages go at list tail. */
+       if (PageHighMem(page)) {
+               list_add_tail(PAGE_TO_LIST(page), &ballooned_pages);
+               bs.balloon_high++;
+-              dec_totalhigh_pages();
++              if (account)
++                      dec_totalhigh_pages();
+       } else {
+               list_add(PAGE_TO_LIST(page), &ballooned_pages);
+               bs.balloon_low++;
+       }
++
++      pfn = page_to_pfn(page);
++      if (account) {
++              SetPageReserved(page);
++              set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
++              page_zone(page)->present_pages--;
++      } else {
++              BUG_ON(!PageReserved(page));
++              WARN_ON_ONCE(phys_to_machine_mapping_valid(pfn));
++      }
+ }
+ /* balloon_retrieve: rescue a page from the balloon, if it is not empty. */
+-static struct page *balloon_retrieve(void)
++static struct page *balloon_retrieve(int *was_empty)
+ {
+       struct page *page;
++      struct zone *zone;
+       if (list_empty(&ballooned_pages))
+               return NULL;
+       page = LIST_TO_PAGE(ballooned_pages.next);
+       UNLIST_PAGE(page);
++      BUG_ON(!PageReserved(page));
+       if (PageHighMem(page)) {
+               bs.balloon_high--;
+@@ -151,6 +163,9 @@ static struct page *balloon_retrieve(voi
+       }
+       else
+               bs.balloon_low--;
++      zone = page_zone(page);
++      *was_empty |= !populated_zone(zone);
++      zone->present_pages++;
+       return page;
+ }
+@@ -236,6 +251,7 @@ static int increase_reservation(unsigned
+       unsigned long  pfn, i, flags;
+       struct page   *page;
+       long           rc;
++      int            need_zonelists_rebuild = 0;
+       struct xen_memory_reservation reservation = {
+               .address_bits = 0,
+               .extent_order = 0,
+@@ -261,7 +277,7 @@ static int increase_reservation(unsigned
+               goto out;
+       for (i = 0; i < rc; i++) {
+-              page = balloon_retrieve();
++              page = balloon_retrieve(&need_zonelists_rebuild);
+               BUG_ON(page == NULL);
+               pfn = page_to_pfn(page);
+@@ -294,6 +310,14 @@ static int increase_reservation(unsigned
+  out:
+       balloon_unlock(flags);
++#ifndef MODULE
++      setup_per_zone_pages_min();
++      if (need_zonelists_rebuild)
++              build_all_zonelists();
++      else
++              vm_total_pages = nr_free_pagecache_pages();
++#endif
++
+       return rc < 0 ? rc : rc != nr_pages;
+ }
+@@ -352,8 +376,7 @@ static int decrease_reservation(unsigned
+       /* No more mappings: invalidate P2M and add to balloon. */
+       for (i = 0; i < nr_pages; i++) {
+               pfn = mfn_to_pfn(frame_list[i]);
+-              set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
+-              balloon_append(pfn_to_page(pfn));
++              balloon_append(pfn_to_page(pfn), 1);
+       }
+       set_xen_guest_handle(reservation.extent_start, frame_list);
+@@ -541,8 +564,11 @@ static int __init balloon_init(void)
+       /* Initialise the balloon with excess memory space. */
+       for (pfn = xen_start_info->nr_pages; pfn < max_pfn; pfn++) {
+               page = pfn_to_page(pfn);
+-              if (!PageReserved(page))
+-                      balloon_append(page);
++              if (!PageReserved(page)) {
++                      SetPageReserved(page);
++                      set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
++                      balloon_append(page, 0);
++              }
+       }
+ #endif
+@@ -577,7 +603,7 @@ void balloon_update_driver_allowance(lon
+ static int dealloc_pte_fn(
+       pte_t *pte, struct page *pmd_page, unsigned long addr, void *data)
+ {
+-      unsigned long mfn = pte_mfn(*pte);
++      unsigned long pfn, mfn = pte_mfn(*pte);
+       int ret;
+       struct xen_memory_reservation reservation = {
+               .nr_extents   = 1,
+@@ -586,7 +612,9 @@ static int dealloc_pte_fn(
+       };
+       set_xen_guest_handle(reservation.extent_start, &mfn);
+       set_pte_at(&init_mm, addr, pte, __pte_ma(0));
+-      set_phys_to_machine(__pa(addr) >> PAGE_SHIFT, INVALID_P2M_ENTRY);
++      pfn = __pa(addr) >> PAGE_SHIFT;
++      set_phys_to_machine(pfn, INVALID_P2M_ENTRY);
++      SetPageReserved(pfn_to_page(pfn));
+       ret = HYPERVISOR_memory_op(XENMEM_decrease_reservation, &reservation);
+       BUG_ON(ret != 1);
+       return 0;
+@@ -644,6 +672,9 @@ struct page **alloc_empty_pages_and_page
+               }
+               totalram_pages = --bs.current_pages;
++              if (PageHighMem(page))
++                      dec_totalhigh_pages();
++              page_zone(page)->present_pages--;
+               balloon_unlock(flags);
+       }
+@@ -658,7 +689,7 @@ struct page **alloc_empty_pages_and_page
+  err:
+       balloon_lock(flags);
+       while (--i >= 0)
+-              balloon_append(pagevec[i]);
++              balloon_append(pagevec[i], 0);
+       balloon_unlock(flags);
+       kfree(pagevec);
+       pagevec = NULL;
+@@ -676,7 +707,7 @@ void free_empty_pages_and_pagevec(struct
+       balloon_lock(flags);
+       for (i = 0; i < nr_pages; i++) {
+               BUG_ON(page_count(pagevec[i]) != 1);
+-              balloon_append(pagevec[i]);
++              balloon_append(pagevec[i], 0);
+       }
+       balloon_unlock(flags);
+@@ -690,7 +721,7 @@ void balloon_release_driver_page(struct 
+       unsigned long flags;
+       balloon_lock(flags);
+-      balloon_append(page);
++      balloon_append(page, 1);
+       bs.driver_pages--;
+       balloon_unlock(flags);
+--- sle11-2009-08-26.orig/mm/page_alloc.c      2009-08-31 11:47:11.000000000 +0200
++++ sle11-2009-08-26/mm/page_alloc.c   2009-07-31 15:14:57.000000000 +0200
+@@ -4343,6 +4343,23 @@ static void __setup_per_zone_pages_min(v
+               spin_unlock_irqrestore(&zone->lock, flags);
+       }
++#ifdef CONFIG_XEN
++      for_each_zone(zone) {
++              unsigned int cpu;
++
++              if (!populated_zone(zone))
++                      continue;
++              for_each_online_cpu(cpu) {
++                      unsigned long high;
++
++                      high = percpu_pagelist_fraction
++                             ? zone->present_pages / percpu_pagelist_fraction
++                             : 5 * zone_batchsize(zone);
++                      setup_pagelist_highmark(zone_pcp(zone, cpu), high);
++              }
++      }
++#endif
++
+       /* update totalreserve_pages */
+       calculate_totalreserve_pages();
+ }
similarity index 77%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-sections
rename to src/patches/suse-2.6.27.39/patches.xen/xen-sections
index 3d90bb8547f70628412104fab62c97457c183458..da9079882de1a9a7a25c6d4e70e16362486d7f56 100644 (file)
@@ -2,8 +2,8 @@ From: jbeulich@novell.com
 Subject: fix placement of some routines/data
 Patch-mainline: obsolete
 
---- sle11-2009-05-14.orig/arch/x86/kernel/e820-xen.c   2009-05-06 10:29:07.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/e820-xen.c        2009-02-17 14:01:20.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820-xen.c   2009-06-25 14:20:32.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/e820-xen.c        2009-02-17 14:01:20.000000000 +0100
 @@ -42,7 +42,7 @@
   * user can e.g. boot the original kernel with mem=1G while still booting the
   * next kernel with full memory.
@@ -13,8 +13,8 @@ Patch-mainline: obsolete
  #ifndef CONFIG_XEN
  struct e820map e820_saved;
  #else
---- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c     2008-10-01 16:20:58.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c  2008-12-01 12:07:15.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2008-10-01 16:20:58.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2008-12-01 12:07:15.000000000 +0100
 @@ -99,7 +99,7 @@ static void cpu_exit_clear(void)
  }
  #endif
@@ -24,8 +24,8 @@ Patch-mainline: obsolete
  {
        idle_task_exit();
        local_irq_disable();
---- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c     2008-10-01 16:20:58.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c  2008-12-01 12:07:15.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2008-10-01 16:20:58.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2008-12-01 12:07:15.000000000 +0100
 @@ -95,7 +95,7 @@ void exit_idle(void)
  }
  
@@ -35,9 +35,9 @@ Patch-mainline: obsolete
  {
        idle_task_exit();
  #ifndef CONFIG_XEN
---- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:13:50.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c     2009-03-24 10:22:14.000000000 +0100
-@@ -702,7 +702,7 @@ int xen_update_persistent_clock(void)
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:58:19.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:59:14.000000000 +0100
+@@ -703,7 +703,7 @@ int xen_update_persistent_clock(void)
  /* Dynamically-mapped IRQ. */
  DEFINE_PER_CPU(int, timer_irq);
  
@@ -46,7 +46,7 @@ Patch-mainline: obsolete
  {
        per_cpu(timer_irq, 0) =
                bind_virq_to_irqhandler(
-@@ -913,7 +913,7 @@ int __cpuinit local_setup_timer(unsigned
+@@ -914,7 +914,7 @@ int __cpuinit local_setup_timer(unsigned
        return 0;
  }
  
@@ -55,8 +55,8 @@ Patch-mainline: obsolete
  {
        BUG_ON(cpu == 0);
        unbind_from_irqhandler(per_cpu(timer_irq, cpu), NULL);
---- sle11-2009-05-14.orig/arch/x86/mm/ioremap-xen.c    2009-01-16 10:45:51.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/ioremap-xen.c 2009-01-07 10:55:24.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap-xen.c    2009-01-16 10:45:51.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap-xen.c 2009-01-07 10:55:24.000000000 +0100
 @@ -201,7 +201,8 @@ int touch_pte_range(struct mm_struct *mm
  
  EXPORT_SYMBOL(touch_pte_range);
@@ -75,8 +75,8 @@ Patch-mainline: obsolete
  
  /*
   * Fix up the linear direct mapping of the kernel to avoid cache attribute
---- sle11-2009-05-14.orig/drivers/xen/core/cpu_hotplug.c       2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/core/cpu_hotplug.c    2008-12-01 12:07:15.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/cpu_hotplug.c       2009-10-28 14:54:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/cpu_hotplug.c    2008-12-01 12:07:15.000000000 +0100
 @@ -24,7 +24,7 @@ static int local_cpu_hotplug_request(voi
        return (current->mm != NULL);
  }
@@ -138,8 +138,8 @@ Patch-mainline: obsolete
  {
        unsigned int cpu;
  
---- sle11-2009-05-14.orig/drivers/xen/core/smpboot.c   2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/smpboot.c        2008-12-01 12:07:15.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2008-12-01 12:07:15.000000000 +0100
 @@ -168,7 +168,7 @@ static int __cpuinit xen_smp_intr_init(u
  }
  
similarity index 87%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-sysdev-suspend
rename to src/patches/suse-2.6.27.39/patches.xen/xen-sysdev-suspend
index 00d5b74db626c2a704d758b1be76141e2adc94d7..42df494b059a79b8212fc30e681ba2c45d986844 100644 (file)
@@ -4,8 +4,8 @@ Patch-mainline: obsolete
 
 ... rather than calling just a few functions explicitly.
 
---- sle11-2009-03-24.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:22:14.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/kernel/time_32-xen.c     2009-03-24 10:22:24.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:59:14.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:59:22.000000000 +0100
 @@ -88,6 +88,10 @@ static DEFINE_PER_CPU(struct vcpu_runsta
  /* Must be signed, as it's compared with s64 quantities which can be -ve. */
  #define NS_PER_TICK (1000000000LL/HZ)
@@ -17,7 +17,7 @@ Patch-mainline: obsolete
  static void __clock_was_set(struct work_struct *unused)
  {
        clock_was_set();
-@@ -597,6 +601,25 @@ void mark_tsc_unstable(char *reason)
+@@ -598,6 +602,25 @@ void mark_tsc_unstable(char *reason)
  }
  EXPORT_SYMBOL_GPL(mark_tsc_unstable);
  
@@ -43,7 +43,7 @@ Patch-mainline: obsolete
  static cycle_t cs_last;
  
  static cycle_t xen_clocksource_read(void)
-@@ -633,11 +656,32 @@ static cycle_t xen_clocksource_read(void
+@@ -634,11 +657,32 @@ static cycle_t xen_clocksource_read(void
  #endif
  }
  
@@ -78,7 +78,7 @@ Patch-mainline: obsolete
        cs_last = local_clock();
  }
  
-@@ -652,25 +696,6 @@ static struct clocksource clocksource_xe
+@@ -653,25 +697,6 @@ static struct clocksource clocksource_xe
        .resume                 = xen_clocksource_resume,
  };
  
@@ -104,7 +104,7 @@ Patch-mainline: obsolete
  unsigned long xen_read_persistent_clock(void)
  {
        const shared_info_t *s = HYPERVISOR_shared_info;
-@@ -715,10 +740,6 @@ static void __init setup_cpu0_timer_irq(
+@@ -716,10 +741,6 @@ static void __init setup_cpu0_timer_irq(
        BUG_ON(per_cpu(timer_irq, 0) < 0);
  }
  
@@ -115,7 +115,7 @@ Patch-mainline: obsolete
  void __init time_init(void)
  {
        init_cpu_khz();
-@@ -842,35 +863,6 @@ void xen_halt(void)
+@@ -843,35 +864,6 @@ void xen_halt(void)
  }
  EXPORT_SYMBOL(xen_halt);
  
@@ -151,8 +151,8 @@ Patch-mainline: obsolete
  #ifdef CONFIG_SMP
  static char timer_name[NR_CPUS][15];
  
---- sle11-2009-03-24.orig/drivers/xen/core/evtchn.c    2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-03-24/drivers/xen/core/evtchn.c 2009-01-14 14:57:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-01-14 14:57:55.000000000 +0100
 @@ -35,6 +35,7 @@
  #include <linux/interrupt.h>
  #include <linux/sched.h>
@@ -216,8 +216,8 @@ Patch-mainline: obsolete
  #endif
  
  #if defined(CONFIG_X86_IO_APIC)
---- sle11-2009-03-24.orig/drivers/xen/core/gnttab.c    2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-03-24/drivers/xen/core/gnttab.c 2008-12-15 11:32:52.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/gnttab.c    2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/gnttab.c 2008-12-15 11:32:52.000000000 +0100
 @@ -35,6 +35,7 @@
  #include <linux/sched.h>
  #include <linux/mm.h>
@@ -286,8 +286,8 @@ Patch-mainline: obsolete
        nr_grant_frames = 1;
        boot_max_nr_grant_frames = __max_nr_grant_frames();
  
---- sle11-2009-03-24.orig/drivers/xen/core/machine_reboot.c    2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-03-24/drivers/xen/core/machine_reboot.c 2009-02-17 12:23:48.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/machine_reboot.c    2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/machine_reboot.c 2009-02-17 12:23:48.000000000 +0100
 @@ -17,6 +17,7 @@
  #include <xen/xencons.h>
  #include <xen/cpu_hotplug.h>
@@ -347,8 +347,8 @@ Patch-mainline: obsolete
  
        if (!suspend->fast_suspend)
                local_irq_enable();
---- sle11-2009-03-24.orig/include/xen/evtchn.h 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-03-24/include/xen/evtchn.h      2008-12-15 11:32:52.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/evtchn.h 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/xen/evtchn.h      2008-12-15 11:32:52.000000000 +0100
 @@ -93,7 +93,9 @@ int bind_ipi_to_irqhandler(
   */
  void unbind_from_irqhandler(unsigned int irq, void *dev_id);
@@ -359,8 +359,8 @@ Patch-mainline: obsolete
  
  /* Entry point for notifications into Linux subsystems. */
  asmlinkage void evtchn_do_upcall(struct pt_regs *regs);
---- sle11-2009-03-24.orig/include/xen/gnttab.h 2009-03-24 10:00:14.000000000 +0100
-+++ sle11-2009-03-24/include/xen/gnttab.h      2008-12-15 11:32:52.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/gnttab.h 2009-10-28 14:54:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/gnttab.h      2008-12-15 11:32:52.000000000 +0100
 @@ -110,8 +110,9 @@ static inline void __gnttab_dma_unmap_pa
  
  void gnttab_reset_grant_page(struct page *page);
similarity index 93%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-virq-per-cpu-irq
rename to src/patches/suse-2.6.27.39/patches.xen/xen-virq-per-cpu-irq
index 93aec46eacf04e1d8790ff54ffdd5b1c47b9bc4e..ddb1714edd1da220a56c78a50d986860c6b5f998 100644 (file)
@@ -2,9 +2,9 @@ From: jbeulich@novell.com
 Subject: fold per-CPU VIRQs onto a single IRQ each
 Patch-mainline: obsolete
 
---- sle11-2009-06-04.orig/arch/x86/kernel/time_32-xen.c        2009-06-04 10:47:20.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/time_32-xen.c     2009-06-04 10:47:28.000000000 +0200
-@@ -725,19 +725,17 @@ int xen_update_persistent_clock(void)
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:59:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:59:30.000000000 +0100
+@@ -726,19 +726,17 @@ int xen_update_persistent_clock(void)
  }
  
  /* Dynamically-mapped IRQ. */
@@ -32,7 +32,7 @@ Patch-mainline: obsolete
  }
  
  void __init time_init(void)
-@@ -864,8 +862,6 @@ void xen_halt(void)
+@@ -865,8 +863,6 @@ void xen_halt(void)
  EXPORT_SYMBOL(xen_halt);
  
  #ifdef CONFIG_SMP
@@ -41,7 +41,7 @@ Patch-mainline: obsolete
  int __cpuinit local_setup_timer(unsigned int cpu)
  {
        int seq, irq;
-@@ -891,16 +887,10 @@ int __cpuinit local_setup_timer(unsigned
+@@ -892,16 +888,10 @@ int __cpuinit local_setup_timer(unsigned
                init_missing_ticks_accounting(cpu);
        } while (read_seqretry(&xtime_lock, seq));
  
@@ -60,7 +60,7 @@ Patch-mainline: obsolete
  
        return 0;
  }
-@@ -908,7 +898,7 @@ int __cpuinit local_setup_timer(unsigned
+@@ -909,7 +899,7 @@ int __cpuinit local_setup_timer(unsigned
  void __cpuinit local_teardown_timer(unsigned int cpu)
  {
        BUG_ON(cpu == 0);
@@ -69,8 +69,8 @@ Patch-mainline: obsolete
  }
  #endif
  
---- sle11-2009-06-04.orig/drivers/xen/core/evtchn.c    2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/core/evtchn.c 2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-06-04 10:47:28.000000000 +0200
 @@ -58,6 +58,23 @@ static DEFINE_SPINLOCK(irq_mapping_updat
  static int evtchn_to_irq[NR_EVENT_CHANNELS] = {
        [0 ...  NR_EVENT_CHANNELS-1] = -1 };
@@ -489,8 +489,8 @@ Patch-mainline: obsolete
        init_evtchn_cpu_bindings();
  
        pirq_needs_eoi = alloc_bootmem_pages(sizeof(unsigned long)
---- sle11-2009-06-04.orig/drivers/xen/core/smpboot.c   2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/core/smpboot.c        2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-06-04 10:47:28.000000000 +0200
 @@ -163,11 +163,11 @@ static int __cpuinit xen_smp_intr_init(u
   fail:
        xen_spinlock_cleanup(cpu);
@@ -519,8 +519,8 @@ Patch-mainline: obsolete
        xen_spinlock_cleanup(cpu);
  }
  #endif
---- sle11-2009-06-04.orig/drivers/xen/core/spinlock.c  2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/core/spinlock.c       2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/spinlock.c  2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/spinlock.c       2009-06-04 10:47:28.000000000 +0200
 @@ -57,7 +57,7 @@ int __cpuinit xen_spinlock_init(unsigned
  
  void __cpuinit xen_spinlock_cleanup(unsigned int cpu)
@@ -530,8 +530,8 @@ Patch-mainline: obsolete
  }
  
  int xen_spin_wait(raw_spinlock_t *lock, unsigned int token)
---- sle11-2009-06-04.orig/drivers/xen/netback/netback.c        2009-06-04 10:20:21.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/netback/netback.c     2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netback/netback.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/netback.c     2009-06-04 10:47:28.000000000 +0200
 @@ -1561,6 +1561,12 @@ static irqreturn_t netif_be_dbg(int irq,
  
        return IRQ_HANDLED;
@@ -561,8 +561,8 @@ Patch-mainline: obsolete
  #endif
  
        return 0;
---- sle11-2009-06-04.orig/drivers/xen/xenoprof/xenoprofile.c   2009-06-04 10:20:39.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/xenoprof/xenoprofile.c        2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenoprof/xenoprofile.c        2009-06-04 10:47:28.000000000 +0200
 @@ -210,6 +210,11 @@ static irqreturn_t xenoprof_ovf_interrup
        return IRQ_HANDLED;
  }
@@ -598,8 +598,8 @@ Patch-mainline: obsolete
  
                if (result < 0) {
                        unbind_virq();
---- sle11-2009-06-04.orig/include/xen/evtchn.h 2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/include/xen/evtchn.h      2009-06-04 10:47:28.000000000 +0200
+--- sle11-2009-10-16.orig/include/xen/evtchn.h 2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-10-16/include/xen/evtchn.h      2009-06-04 10:47:28.000000000 +0200
 @@ -78,6 +78,17 @@ int bind_virq_to_irqhandler(
        unsigned long irqflags,
        const char *devname,
similarity index 70%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-x86-bigmem
rename to src/patches/suse-2.6.27.39/patches.xen/xen-x86-bigmem
index d7fb80544a523d862aad99fd6a06a52516ae35d7..bf29862741e58b685cdc7677db22368ec90a3ba4 100644 (file)
@@ -1,13 +1,11 @@
 From: jbeulich@novell.com
 Subject: fix issues with the assignment of huge amounts of memory
 Patch-mainline: obsolete
+References: bnc#482614, bnc#537435
 
-At the same time remove the non-applicable and broken support for the
-memmap= command line option.
-
---- sle11-2009-07-31.orig/arch/x86/kernel/e820-xen.c   2009-02-17 14:01:20.000000000 +0100
-+++ sle11-2009-07-31/arch/x86/kernel/e820-xen.c        2009-03-13 16:14:19.000000000 +0100
-@@ -1308,6 +1308,26 @@ static int __init parse_memopt(char *p)
+--- sle11-2009-09-18.orig/arch/x86/kernel/e820-xen.c   2009-02-17 14:01:20.000000000 +0100
++++ sle11-2009-09-18/arch/x86/kernel/e820-xen.c        2009-09-18 10:08:03.000000000 +0200
+@@ -1317,6 +1317,26 @@ static int __init parse_memopt(char *p)
  
        i = e820.nr_map - 1;
        current_end = e820.map[i].addr + e820.map[i].size;
@@ -34,23 +32,7 @@ memmap= command line option.
        if (current_end < mem_size) {
                /*
                 * The e820 map ends before our requested size so
-@@ -1367,6 +1387,7 @@ static int __init parse_memmap_opt(char 
-       return *p == '\0' ? 0 : -EINVAL;
- }
- early_param("memmap", parse_memmap_opt);
-+#endif
- void __init finish_e820_parsing(void)
- {
-@@ -1381,7 +1402,6 @@ void __init finish_e820_parsing(void)
-               e820_print_map("user");
-       }
- }
--#endif
- static inline const char *e820_type_to_string(int e820_type)
- {
-@@ -1407,7 +1427,7 @@ void __init e820_reserve_resources(void)
+@@ -1416,7 +1436,7 @@ void __init e820_reserve_resources(void)
        struct resource *res;
        u64 end;
  
@@ -59,8 +41,39 @@ memmap= command line option.
        for (i = 0; i < e820.nr_map; i++) {
                end = e820.map[i].addr + e820.map[i].size - 1;
  #ifndef CONFIG_RESOURCES_64BIT
---- sle11-2009-07-31.orig/arch/x86/kernel/setup-xen.c  2009-07-31 15:14:20.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/setup-xen.c       2009-07-31 15:14:31.000000000 +0200
+@@ -1498,6 +1518,7 @@ char *__init __attribute__((weak)) machi
+ char * __init memory_setup(void)
+ {
+       int rc, nr_map;
++      unsigned long long maxmem;
+       struct xen_memory_map memmap;
+       /*
+        * This is rather large for a stack variable but this early in
+@@ -1527,6 +1548,22 @@ char * __init memory_setup(void)
+               BUG();
+ #ifdef CONFIG_XEN
++      /* See the comment in parse_memopt(). */
++      for (maxmem = rc = 0; rc < e820.nr_map; ++rc)
++              if (e820.map[rc].type == E820_RAM)
++                      maxmem += e820.map[rc].size;
++      if ((maxmem >> (PAGE_SHIFT + 5)) > xen_start_info->nr_pages) {
++              unsigned long long size = (u64)xen_start_info->nr_pages << 5;
++
++              printk(KERN_WARNING "maxmem of %LuM is invalid for an initial"
++                                  " allocation of %luM, using %LuM\n",
++                     maxmem >> 20,
++                     xen_start_info->nr_pages >> (20 - PAGE_SHIFT),
++                     size >> (20 - PAGE_SHIFT));
++              size <<= PAGE_SHIFT;
++              e820_remove_range(size, ULLONG_MAX - size, E820_RAM, 1);
++      }
++
+       if (is_initial_xendomain()) {
+               memmap.nr_entries = E820MAX;
+               set_xen_guest_handle(memmap.buffer, machine_e820.map);
+--- sle11-2009-09-18.orig/arch/x86/kernel/setup-xen.c  2009-07-31 15:14:20.000000000 +0200
++++ sle11-2009-09-18/arch/x86/kernel/setup-xen.c       2009-07-31 15:14:31.000000000 +0200
 @@ -128,12 +128,7 @@ static struct notifier_block xen_panic_b
  unsigned long *phys_to_machine_mapping;
  EXPORT_SYMBOL(phys_to_machine_mapping);
@@ -126,9 +139,9 @@ memmap= command line option.
                                pfn_to_mfn_frame_list[k] =
                                        alloc_bootmem_pages(PAGE_SIZE);
                                pfn_to_mfn_frame_list_list[k] =
---- sle11-2009-07-31.orig/arch/x86/kernel/setup_percpu-xen.c   2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/setup_percpu-xen.c        2009-03-13 16:14:41.000000000 +0100
-@@ -211,7 +211,7 @@ static void __init setup_node_to_cpumask
+--- sle11-2009-09-18.orig/arch/x86/kernel/setup_percpu-xen.c   2009-08-26 12:17:43.000000000 +0200
++++ sle11-2009-09-18/arch/x86/kernel/setup_percpu-xen.c        2009-08-26 12:19:19.000000000 +0200
+@@ -206,7 +206,7 @@ static void __init setup_node_to_cpumask
        }
  
        /* allocate the map */
@@ -137,8 +150,8 @@ memmap= command line option.
  
        pr_debug(KERN_DEBUG "Node to cpumask map at %p for %d nodes\n",
                 map, nr_node_ids);
---- sle11-2009-07-31.orig/drivers/xen/core/machine_kexec.c     2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-07-31/drivers/xen/core/machine_kexec.c  2009-03-13 16:13:15.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/core/machine_kexec.c     2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/core/machine_kexec.c  2009-03-13 16:13:15.000000000 +0100
 @@ -57,7 +57,7 @@ void __init xen_machine_kexec_setup_reso
  
        /* allocate xen_phys_cpus */
@@ -148,8 +161,8 @@ memmap= command line option.
        BUG_ON(xen_phys_cpus == NULL);
  
        /* fill in xen_phys_cpus with per-cpu crash note information */
---- sle11-2009-07-31.orig/drivers/xen/core/machine_reboot.c    2009-02-17 12:23:48.000000000 +0100
-+++ sle11-2009-07-31/drivers/xen/core/machine_reboot.c 2009-02-17 12:25:29.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/core/machine_reboot.c    2009-02-17 12:23:48.000000000 +0100
++++ sle11-2009-09-18/drivers/xen/core/machine_reboot.c 2009-02-17 12:25:29.000000000 +0100
 @@ -76,7 +76,7 @@ static void post_suspend(int suspend_can
        unsigned long shinfo_mfn;
        extern unsigned long max_pfn;
similarity index 83%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-x86-dcr-fallback
rename to src/patches/suse-2.6.27.39/patches.xen/xen-x86-dcr-fallback
index 830acd313fbef50230e8c22e0795bcc3cf15584a..2068d0d7f6ca8c3c45ae32517b576d012dec2dc1 100644 (file)
@@ -6,8 +6,8 @@ References: 181869
 This avoids losing precious special memory in places where any memory can be
 used.
 
---- sle11-2009-06-29.orig/arch/x86/mm/hypervisor.c     2009-03-16 16:17:45.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/hypervisor.c  2009-03-30 12:18:24.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/mm/hypervisor.c     2009-08-31 11:47:04.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/hypervisor.c  2009-03-30 12:18:24.000000000 +0200
 @@ -42,6 +42,7 @@
  #include <xen/interface/memory.h>
  #include <linux/module.h>
@@ -100,9 +100,9 @@ used.
  }
  EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
  
---- sle11-2009-06-29.orig/drivers/xen/balloon/balloon.c        2009-06-29 15:44:49.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/balloon/balloon.c     2009-06-29 15:46:09.000000000 +0200
-@@ -665,7 +665,7 @@ struct page **alloc_empty_pages_and_page
+--- sle11-2009-08-26.orig/drivers/xen/balloon/balloon.c        2009-08-31 11:47:38.000000000 +0200
++++ sle11-2009-08-26/drivers/xen/balloon/balloon.c     2009-08-31 11:48:33.000000000 +0200
+@@ -696,7 +696,7 @@ struct page **alloc_empty_pages_and_page
        goto out;
  }
  
@@ -111,9 +111,12 @@ used.
  {
        unsigned long flags;
        int i;
-@@ -678,13 +678,26 @@ void free_empty_pages_and_pagevec(struct
+@@ -707,15 +707,28 @@ void free_empty_pages_and_pagevec(struct
+       balloon_lock(flags);
+       for (i = 0; i < nr_pages; i++) {
                BUG_ON(page_count(pagevec[i]) != 1);
-               balloon_append(pagevec[i]);
+-              balloon_append(pagevec[i], 0);
++              balloon_append(pagevec[i], !free_vec);
        }
 +      if (!free_vec)
 +              totalram_pages = bs.current_pages -= nr_pages;
@@ -139,8 +142,8 @@ used.
  void balloon_release_driver_page(struct page *page)
  {
        unsigned long flags;
---- sle11-2009-06-29.orig/include/xen/balloon.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/xen/balloon.h     2009-03-16 16:40:33.000000000 +0100
+--- sle11-2009-08-26.orig/include/xen/balloon.h        2009-08-31 11:47:04.000000000 +0200
++++ sle11-2009-08-26/include/xen/balloon.h     2009-03-16 16:40:33.000000000 +0100
 @@ -47,6 +47,10 @@ void balloon_update_driver_allowance(lon
  struct page **alloc_empty_pages_and_pagevec(int nr_pages);
  void free_empty_pages_and_pagevec(struct page **pagevec, int nr_pages);
similarity index 86%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-x86-no-lapic
rename to src/patches/suse-2.6.27.39/patches.xen/xen-x86-no-lapic
index cdf9226362d6bfc4f91f4c7da1592b2592c27803..8ce67202cc5b977325ef55a09303bd2d1f8c2779 100644 (file)
@@ -3,8 +3,8 @@ Subject: Disallow all accesses to the local APIC page
 Patch-mainline: obsolete
 References: 191115
 
---- sle11-2009-06-04.orig/arch/x86/kernel/Makefile     2009-06-04 10:47:37.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/Makefile  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/Makefile     2008-12-08 13:39:19.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/Makefile  2009-06-04 10:47:37.000000000 +0200
 @@ -120,9 +120,11 @@ ifeq ($(CONFIG_X86_64),y)
  
          obj-$(CONFIG_PCI_MMCONFIG)    += mmconf-fam10h_64.o
@@ -20,8 +20,8 @@ References: 191115
 +      genx2apic_%.o hpet.o i8253.o i8259.o irqinit_$(BITS).o \
 +      pci-swiotlb_64.o reboot.o smpboot.o tlb_$(BITS).o tsc.o tsc_sync.o \
 +      uv_%.o vsmp_64.o
---- sle11-2009-06-04.orig/arch/x86/kernel/acpi/boot.c  2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/acpi/boot.c       2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/acpi/boot.c  2009-08-26 12:03:49.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/acpi/boot.c       2009-08-26 12:15:28.000000000 +0200
 @@ -89,7 +89,7 @@ int acpi_sci_override_gsi __initdata;
  int acpi_skip_timer_override __initdata;
  int acpi_use_timer_override __initdata;
@@ -46,7 +46,7 @@ References: 191115
  
        acpi_madt_oem_check(madt->header.oem_id, madt->header.oem_table_id);
  
-@@ -317,6 +319,7 @@ static int __init
+@@ -315,6 +317,7 @@ static int __init
  acpi_parse_lapic_addr_ovr(struct acpi_subtable_header * header,
                          const unsigned long end)
  {
@@ -54,7 +54,7 @@ References: 191115
        struct acpi_madt_local_apic_override *lapic_addr_ovr = NULL;
  
        lapic_addr_ovr = (struct acpi_madt_local_apic_override *)header;
-@@ -325,6 +328,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_su
+@@ -323,6 +326,7 @@ acpi_parse_lapic_addr_ovr(struct acpi_su
                return -EINVAL;
  
        acpi_lapic_addr = lapic_addr_ovr->address;
@@ -62,7 +62,7 @@ References: 191115
  
        return 0;
  }
-@@ -904,10 +908,12 @@ static int mp_find_ioapic(int gsi)
+@@ -902,10 +906,12 @@ static int mp_find_ioapic(int gsi)
  static u8 __init uniq_ioapic_id(u8 id)
  {
  #ifdef CONFIG_X86_32
@@ -75,7 +75,7 @@ References: 191115
                return id;
  #else
        int i;
-@@ -1139,7 +1145,7 @@ int mp_register_gsi(u32 gsi, int trigger
+@@ -1137,7 +1143,7 @@ int mp_register_gsi(u32 gsi, int trigger
  
        ioapic_pin = gsi - mp_ioapic_routing[ioapic].gsi_base;
  
@@ -84,8 +84,8 @@ References: 191115
        if (ioapic_renumber_irq)
                gsi = ioapic_renumber_irq(ioapic, gsi);
  #endif
---- sle11-2009-06-04.orig/arch/x86/kernel/apic_32-xen.c        2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/apic_32-xen.c     2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/apic_32-xen.c        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/apic_32-xen.c     2009-06-04 10:47:37.000000000 +0200
 @@ -1,60 +1,11 @@
  /*
 - *    Local APIC handling, local APIC timers
@@ -198,7 +198,7 @@ References: 191115
        return 0;
  }
 +#endif
---- sle11-2009-06-04.orig/arch/x86/kernel/apic_64-xen.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/apic_64-xen.c        2009-06-04 10:21:39.000000000 +0200
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,188 +0,0 @@
 -/*
@@ -389,8 +389,8 @@ References: 191115
 -              smp_processor_id(), v , v1);
 -      irq_exit();
 -}
---- sle11-2009-06-04.orig/arch/x86/kernel/cpu/common-xen.c     2009-06-04 10:46:36.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/cpu/common-xen.c  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/cpu/common-xen.c     2009-02-16 17:03:24.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/cpu/common-xen.c  2009-06-04 10:47:37.000000000 +0200
 @@ -19,10 +19,6 @@
  #include <asm/mpspec.h>
  #include <asm/apic.h>
@@ -402,8 +402,8 @@ References: 191115
  #endif
  #include <asm/hypervisor.h>
  
---- sle11-2009-06-04.orig/arch/x86/kernel/genapic_64-xen.c     2009-06-04 10:46:28.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/genapic_64-xen.c  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/genapic_64-xen.c     2008-11-04 14:40:00.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/genapic_64-xen.c  2009-06-04 10:47:37.000000000 +0200
 @@ -18,7 +18,6 @@
  #include <linux/hardirq.h>
  
@@ -412,8 +412,8 @@ References: 191115
  #include <asm/genapic.h>
  
  #ifdef CONFIG_ACPI
---- sle11-2009-06-04.orig/arch/x86/kernel/genapic_xen_64.c     2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/genapic_xen_64.c  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/genapic_xen_64.c     2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/genapic_xen_64.c  2009-06-04 10:47:37.000000000 +0200
 @@ -18,7 +18,6 @@
  #include <linux/init.h>
  #ifdef CONFIG_XEN_PRIVILEGED_GUEST
@@ -477,8 +477,8 @@ References: 191115
        .send_IPI_all = xen_send_IPI_all,
        .send_IPI_allbutself = xen_send_IPI_allbutself,
        .send_IPI_mask = xen_send_IPI_mask,
---- sle11-2009-06-04.orig/arch/x86/kernel/io_apic_32-xen.c     2009-06-04 10:46:34.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/io_apic_32-xen.c  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/io_apic_32-xen.c     2008-11-25 14:37:47.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/io_apic_32-xen.c  2009-06-04 10:47:37.000000000 +0200
 @@ -48,7 +48,6 @@
  #include <asm/hypertransport.h>
  
@@ -552,8 +552,8 @@ References: 191115
  
  static int __init parse_noapic(char *arg)
  {
---- sle11-2009-06-04.orig/arch/x86/kernel/io_apic_64-xen.c     2009-06-04 10:46:34.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/io_apic_64-xen.c  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/io_apic_64-xen.c     2008-11-25 14:29:21.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/io_apic_64-xen.c  2009-06-04 10:47:37.000000000 +0200
 @@ -78,10 +78,6 @@ char system_vectors[NR_VECTORS] = { [0 .
  
  int sis_apic_bug; /* not actually supported, dummy for compile */
@@ -614,8 +614,8 @@ References: 191115
  
  /*
   *
---- sle11-2009-06-04.orig/arch/x86/kernel/irq_32-xen.c 2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/irq_32-xen.c      2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/irq_32-xen.c 2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/irq_32-xen.c      2009-06-04 10:47:37.000000000 +0200
 @@ -252,7 +252,9 @@ unsigned int do_IRQ(struct pt_regs *regs
   * Interrupt statistics:
   */
@@ -668,8 +668,8 @@ References: 191115
  }
  
  #ifdef CONFIG_HOTPLUG_CPU
---- sle11-2009-06-04.orig/arch/x86/kernel/irq_64-xen.c 2009-06-04 10:47:21.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/irq_64-xen.c      2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/irq_64-xen.c 2009-06-04 10:47:21.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/irq_64-xen.c      2009-06-04 10:47:37.000000000 +0200
 @@ -18,7 +18,9 @@
  #include <asm/idle.h>
  #include <asm/smp.h>
@@ -737,8 +737,8 @@ References: 191115
  }
  
  /*
---- sle11-2009-06-04.orig/arch/x86/kernel/mpparse-xen.c        2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/mpparse-xen.c     2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/mpparse-xen.c        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/mpparse-xen.c     2009-06-04 10:47:37.000000000 +0200
 @@ -31,7 +31,6 @@
  
  #include <mach_apic.h>
@@ -795,8 +795,25 @@ References: 191115
                        return;
                }
  
---- sle11-2009-06-04.orig/arch/x86/kernel/traps_64-xen.c       2009-06-04 10:47:37.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kernel/traps_64-xen.c    2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/setup_percpu-xen.c   2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/setup_percpu-xen.c        2009-08-26 12:17:43.000000000 +0200
+@@ -17,14 +17,9 @@
+ #ifdef CONFIG_X86_LOCAL_APIC
+ unsigned int num_processors;
+-unsigned disabled_cpus __cpuinitdata;
+ /* Processor that is doing the boot up */
+ unsigned int boot_cpu_physical_apicid = -1U;
+-unsigned int max_physical_apicid;
+ EXPORT_SYMBOL(boot_cpu_physical_apicid);
+-
+-/* Bitmask of physically existing CPUs */
+-physid_mask_t phys_cpu_present_map;
+ #endif
+ /* map cpu index to physical APIC ID */
+--- sle11-2009-08-26.orig/arch/x86/kernel/traps_64-xen.c       2008-12-08 13:39:19.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/traps_64-xen.c    2009-06-04 10:47:37.000000000 +0200
 @@ -1174,15 +1174,15 @@ asmlinkage void do_spurious_interrupt_bu
  {
  }
@@ -815,8 +832,8 @@ References: 191115
  
  /*
   * 'math_state_restore()' saves the current math information in the
---- sle11-2009-06-04.orig/drivers/xen/core/smpboot.c   2009-06-04 10:47:28.000000000 +0200
-+++ sle11-2009-06-04/drivers/xen/core/smpboot.c        2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/drivers/xen/core/smpboot.c   2009-06-04 10:47:28.000000000 +0200
++++ sle11-2009-08-26/drivers/xen/core/smpboot.c        2009-06-04 10:47:37.000000000 +0200
 @@ -346,7 +346,7 @@ void __init smp_prepare_cpus(unsigned in
         * Here we can be sure that there is an IO-APIC in the system. Let's
         * go and set it up:
@@ -826,8 +843,8 @@ References: 191115
                setup_IO_APIC();
  #endif
  }
---- sle11-2009-06-04.orig/include/asm-x86/apic.h       2009-06-04 10:18:34.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/apic.h    2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/apic.h       2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-08-26/include/asm-x86/apic.h    2009-06-04 10:47:37.000000000 +0200
 @@ -5,7 +5,9 @@
  #include <linux/delay.h>
  
@@ -854,8 +871,8 @@ References: 191115
  
  extern int lapic_get_maxlvt(void);
  extern void clear_local_APIC(void);
---- sle11-2009-06-04.orig/include/asm-x86/apicdef.h    2009-06-04 10:17:48.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/apicdef.h 2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/apicdef.h    2009-08-26 11:46:28.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/apicdef.h 2009-06-04 10:47:37.000000000 +0200
 @@ -1,6 +1,8 @@
  #ifndef _ASM_X86_APICDEF_H
  #define _ASM_X86_APICDEF_H
@@ -900,8 +917,8 @@ References: 191115
  #ifdef CONFIG_X86_32
   #define BAD_APICID 0xFFu
  #else
---- sle11-2009-06-04.orig/include/asm-x86/ipi.h        2009-06-04 10:17:48.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/ipi.h     2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/ipi.h        2009-08-26 11:46:28.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/ipi.h     2009-06-04 10:47:37.000000000 +0200
 @@ -1,6 +1,8 @@
  #ifndef __ASM_IPI_H
  #define __ASM_IPI_H
@@ -918,8 +935,8 @@ References: 191115
 +#endif /* CONFIG_XEN */
 +
  #endif /* __ASM_IPI_H */
---- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-06-04 10:47:37.000000000 +0200
 @@ -55,10 +55,10 @@ enum fixed_addresses {
        FIX_VDSO,
        FIX_DBGP_BASE,
@@ -932,8 +949,8 @@ References: 191115
  #ifdef CONFIG_X86_IO_APIC
        FIX_IO_APIC_BASE_0,
        FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
---- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-06-04 10:47:37.000000000 +0200
 @@ -13,7 +13,6 @@
  
  #include <linux/kernel.h>
@@ -954,8 +971,8 @@ References: 191115
        FIX_IO_APIC_BASE_0,
        FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS - 1,
  #endif
---- sle11-2009-06-04.orig/include/asm-x86/mach-xen/asm/smp.h   2009-06-04 10:46:32.000000000 +0200
-+++ sle11-2009-06-04/include/asm-x86/mach-xen/asm/smp.h        2009-06-04 10:47:37.000000000 +0200
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/smp.h   2008-11-04 14:07:28.000000000 +0100
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/smp.h        2009-06-04 10:47:37.000000000 +0200
 @@ -16,7 +16,7 @@
  # endif
  #endif
@@ -975,7 +992,7 @@ References: 191115
  static inline int logical_smp_processor_id(void)
  {
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-04/include/asm-x86/mach-xen/mach_apic.h      2009-06-04 10:47:37.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/mach_apic.h      2009-06-04 10:47:37.000000000 +0200
 @@ -0,0 +1,54 @@
 +#ifndef __ASM_MACH_APIC_H
 +#define __ASM_MACH_APIC_H
similarity index 92%
rename from src/patches/suse-2.6.27.31/patches.xen/xen-x86-pmd-handling
rename to src/patches/suse-2.6.27.39/patches.xen/xen-x86-pmd-handling
index a35f1d58ac6f271acc460f991277a82a67f46c32..9b006dc1e005df2628cb92da0c4e02eff4dbc91a 100644 (file)
@@ -2,8 +2,8 @@ From: jbeulich@novell.com
 Subject: consolidate pmd/pud/pgd entry handling
 Patch-mainline: obsolete
 
---- sle11-2009-04-09.orig/arch/x86/mm/hypervisor.c     2009-03-30 12:18:24.000000000 +0200
-+++ sle11-2009-04-09/arch/x86/mm/hypervisor.c  2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/arch/x86/mm/hypervisor.c     2009-03-30 12:18:24.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/hypervisor.c  2009-03-16 16:40:37.000000000 +0100
 @@ -357,31 +357,91 @@ void xen_l1_entry_update(pte_t *ptr, pte
  }
  EXPORT_SYMBOL_GPL(xen_l1_entry_update);
@@ -103,9 +103,9 @@ Patch-mainline: obsolete
  }
  #endif /* CONFIG_X86_64 */
  
---- sle11-2009-04-09.orig/arch/x86/mm/init_32-xen.c    2009-02-17 18:06:20.000000000 +0100
-+++ sle11-2009-04-09/arch/x86/mm/init_32-xen.c 2009-03-16 17:39:12.000000000 +0100
-@@ -728,6 +728,8 @@ static void __init zone_sizes_init(void)
+--- sle11-2009-08-26.orig/arch/x86/mm/init_32-xen.c    2009-08-26 12:11:50.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/init_32-xen.c 2009-08-26 12:19:09.000000000 +0200
+@@ -735,6 +735,8 @@ static void __init zone_sizes_init(void)
  #endif
  
        free_area_init_nodes(max_zone_pfns);
@@ -114,7 +114,7 @@ Patch-mainline: obsolete
  }
  
  void __init setup_bootmem_allocator(void)
-@@ -1089,8 +1091,6 @@ void __init mem_init(void)
+@@ -1095,8 +1097,6 @@ void __init mem_init(void)
        cpa_init();
        save_pg_dir();
        zap_low_mappings();
@@ -123,8 +123,8 @@ Patch-mainline: obsolete
  }
  
  #ifdef CONFIG_MEMORY_HOTPLUG
---- sle11-2009-04-09.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:39:50.000000000 +0100
-+++ sle11-2009-04-09/arch/x86/mm/init_64-xen.c 2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/arch/x86/mm/init_64-xen.c    2009-08-26 12:11:53.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/init_64-xen.c 2009-03-16 16:40:37.000000000 +0100
 @@ -195,7 +195,10 @@ set_pte_vaddr_pud(pud_t *pud_page, unsig
        if (pud_none(*pud)) {
                pmd = (pmd_t *) spp_getpage();
@@ -170,8 +170,8 @@ Patch-mainline: obsolete
  }
  #endif
  
---- sle11-2009-04-09.orig/arch/x86/mm/pgtable-xen.c    2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-04-09/arch/x86/mm/pgtable-xen.c 2009-04-09 14:54:03.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/mm/pgtable-xen.c    2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/mm/pgtable-xen.c 2009-04-09 14:54:03.000000000 +0200
 @@ -42,16 +42,16 @@ pgtable_t pte_alloc_one(struct mm_struct
  void __pte_free(pgtable_t pte)
  {
@@ -375,8 +375,8 @@ Patch-mainline: obsolete
  
                /* It is safe to poke machine addresses of pmds under the pgd_lock. */
                pud_populate(mm, pud, pmd);
---- sle11-2009-04-09.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-12 16:43:54.000000000 +0100
-+++ sle11-2009-04-09/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-12 16:43:54.000000000 +0100
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-16 16:40:37.000000000 +0100
 @@ -94,10 +94,12 @@ void xen_invlpg(unsigned long ptr);
  void xen_l1_entry_update(pte_t *ptr, pte_t val);
  void xen_l2_entry_update(pmd_t *ptr, pmd_t val);
@@ -410,8 +410,8 @@ Patch-mainline: obsolete
  MULTI_grant_table_op(multicall_entry_t *mcl, unsigned int cmd,
                     void *uop, unsigned int count)
  {
---- sle11-2009-04-09.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-04-09/include/asm-x86/mach-xen/asm/pgalloc.h    2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/pgalloc.h    2009-03-16 16:40:37.000000000 +0100
 @@ -64,20 +64,16 @@ static inline void pmd_populate(struct m
                                struct page *pte)
  {
@@ -491,8 +491,8 @@ Patch-mainline: obsolete
  }
  
  static inline pud_t *pud_alloc_one(struct mm_struct *mm, unsigned long addr)
---- sle11-2009-04-09.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-04-09/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:40:37.000000000 +0100
 @@ -76,12 +76,15 @@ static inline void __xen_pte_clear(pte_t
        ptep->pte_high = 0;
  }
@@ -538,8 +538,8 @@ Patch-mainline: obsolete
                                  pmd_index(address))
  
  #ifdef CONFIG_SMP
---- sle11-2009-04-09.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-04-09/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:40:37.000000000 +0100
+--- sle11-2009-08-26.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:40:37.000000000 +0100
 @@ -110,33 +110,41 @@ static inline void xen_set_pmd(pmd_t *pm
        xen_l2_entry_update(pmdp, pmd);
  }
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen3-acpi_assure_unique_processor_proc_creation.patch b/src/patches/suse-2.6.27.39/patches.xen/xen3-acpi_assure_unique_processor_proc_creation.patch
new file mode 100644 (file)
index 0000000..e536e41
--- /dev/null
@@ -0,0 +1,77 @@
+From: Zhao Yakui <yakui.zhao@intel.com>
+Subject: ACPI: Rename ACPI processor device bus ID
+References: bnc#528769
+Patch-Mainline: yes
+Commit-ID: 7a04b8491a077471a34938b8ca060c37220953be
+
+Signed-off-by: Thomas Renninger <trenn@suse.de>
+
+Some BIOS re-use the same processor bus id
+in different scope:
+
+       \_SB.SCK0.CPU0
+       \_SB.SCK1.CPU0
+
+But the (deprecated) /proc/acpi/ interface
+assumes the bus-id's are unique, resulting in an OOPS
+when the processor driver is loaded:
+
+WARNING: at fs/proc/generic.c:590 proc_register+0x148/0x180()
+Hardware name: Sunrise Ridge
+proc_dir_entry 'processor/CPU0' already registered
+Call Trace:
+ [<ffffffff8023f7ef>] warn_slowpath+0xb1/0xe5
+ [<ffffffff8036243b>] ? ida_get_new_above+0x190/0x1b1
+ [<ffffffff803625a8>] ? idr_pre_get+0x5f/0x75
+ [<ffffffff8030b2f6>] proc_register+0x148/0x180
+ [<ffffffff8030b4ff>] proc_mkdir_mode+0x3d/0x52
+ [<ffffffff8030b525>] proc_mkdir+0x11/0x13
+ [<ffffffffa0014b89>] acpi_processor_start+0x755/0x9bc [processor]
+
+Rename the processor device bus id. And the new bus id will be
+generated as the following format:
+       CPU+ CPU ID
+
+For example: If the cpu ID is 5, then the bus ID will be "CPU5".
+       If the CPU ID is 10, then the bus ID will be "CPUA".
+
+Yes, this will change the directory names seen
+in /proc/acpi/processor/* on some systems.
+Before this patch, those directory names where
+totally arbitrary strings based on the interal AML device strings.
+
+http://bugzilla.kernel.org/show_bug.cgi?id=13612
+
+Signed-off-by: Zhao Yakui <yakui.zhao@intel.com>
+Signed-off-by: Len Brown <len.brown@intel.com>
+
+Automatically created from "patches.fixes/acpi_assure_unique_processor_proc_creation.patch" by xen-port-patches.py
+
+--- sle11-2009-09-18.orig/drivers/acpi/processor_core.c        2009-09-24 11:28:54.000000000 +0200
++++ sle11-2009-09-18/drivers/acpi/processor_core.c     2009-09-21 09:15:34.000000000 +0200
+@@ -634,7 +634,11 @@ static int acpi_processor_get_info(struc
+        * generated as the following format:
+        * CPU+CPU ID.
+        */
+-      sprintf(acpi_device_bid(device), "CPU%X", pr->id);
++      if (pr->id != -1)
++              sprintf(acpi_device_bid(device), "CPU%X", pr->id);
++      else
++              snprintf(acpi_device_bid(device), ACPI_DEVICE_BID_SIZE,
++                       "#%0*X", ACPI_DEVICE_BID_SIZE - 2, pr->acpi_id);
+       ACPI_DEBUG_PRINT((ACPI_DB_INFO, "Processor [%d:%d]\n", pr->id,
+                         pr->acpi_id));
+--- sle11-2009-09-18.orig/include/acpi/acpi_bus.h      2009-09-24 11:28:54.000000000 +0200
++++ sle11-2009-09-18/include/acpi/acpi_bus.h   2009-09-24 11:29:48.000000000 +0200
+@@ -199,6 +199,10 @@ struct acpi_device_pnp {
+       acpi_device_class device_class; /*        "          */
+ };
++#define ACPI_DEVICE_BID_SIZE  \
++      ((unsigned int)(offsetof(struct acpi_device_pnp, bus_address) - \
++                      offsetof(struct acpi_device_pnp, bus_id)))
++
+ #define acpi_device_bid(d)    ((d)->pnp.bus_id)
+ #define acpi_device_adr(d)    ((d)->pnp.bus_address)
+ #define acpi_device_hid(d)    ((d)->pnp.hardware_id)
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen3-add-via-chrome9-drm-support.patch b/src/patches/suse-2.6.27.39/patches.xen/xen3-add-via-chrome9-drm-support.patch
new file mode 100644 (file)
index 0000000..3209347
--- /dev/null
@@ -0,0 +1,52 @@
+From: Bruce Chang<BruceChang@via.com.tw>
+Subject: add Via chrome9 drm support
+
+Signed-off-by: Bruce Chang<BruceChang@via.com.tw>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+Automatically created from "patches.drivers/add-via-chrome9-drm-support.patch" by xen-port-patches.py
+
+--- sle11-2009-10-08.orig/drivers/gpu/drm/via_chrome9/via_chrome9_dma.c        2009-01-16 09:39:39.000000000 +0100
++++ sle11-2009-10-08/drivers/gpu/drm/via_chrome9/via_chrome9_dma.c     2009-10-08 12:19:47.000000000 +0200
+@@ -135,10 +135,17 @@ void via_chrome9_dma_init_inv(struct drm
+                                       0x83c5);
+                       } while (sr6f & 0x80);
+-                      for (i = 0; i < entries; i++)
+-                              writel(page_to_pfn(vmalloc_to_page(
+-                              (void *)addrlinear + PAGE_SIZE * i)) &
+-                              0x3fffffff, pGARTTable + i + alignedoffset);
++                      for (i = 0; i < entries; i++) {
++                              unsigned long pfn;
++
++                              pfn = vmalloc_to_pfn((void *)addrlinear
++                                                   + PAGE_SIZE * i);
++#ifdef CONFIG_XEN
++                              pfn = pfn_to_mfn(pfn);
++#endif
++                              writel(pfn & 0x3fffffff,
++                                     pGARTTable + i + alignedoffset);
++                      }
+                       sr6f |= 0x80;
+                       SetMMIORegisterU8(dev_priv->mmio->handle, 0x83c5, sr6f);
+@@ -270,10 +277,15 @@ AllocAndBindPCIEMemory(struct drm_via_ch
+       while (sr6f & 0x80)
+               ;
+-      for (i = 0; i < entries; i++)
+-              writel(page_to_pfn
+-                     (vmalloc_to_page((void *) addrlinear + PAGE_SIZE * i)) &
+-                     0x3fffffff, pGARTTable + i + alignedoffset);
++      for (i = 0; i < entries; i++) {
++              unsigned long pfn;
++
++              pfn = vmalloc_to_pfn((void *)addrlinear + PAGE_SIZE * i);
++#ifdef CONFIG_XEN
++              pfn = pfn_to_mfn(pfn);
++#endif
++              writel(pfn & 0x3fffffff, pGARTTable + i + alignedoffset);
++      }
+       sr6f |= 0x80;
+       SetMMIORegisterU8(dev_priv->mmio->handle, 0x83c5, sr6f);
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen3-bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch b/src/patches/suse-2.6.27.39/patches.xen/xen3-bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch
new file mode 100644 (file)
index 0000000..105a0ca
--- /dev/null
@@ -0,0 +1,73 @@
+From: Rafael J. Wysocki <rjw@suse.de>
+Subject: x86_64 / PCI: Insert IO-APIC resources before unassigned resources
+References: bnc#531260
+Patch-upstream: Yes
+
+Based on upstream commit 857fdc53a0a90c3ba7fcf5b1fb4c7a62ae03cf82
+(x86/pci: insert ioapic resource before assigning unassigned
+resources) from Yinghai Lu <yinghai@kernel.org>.
+
+It turns out that:
+(1) AMD-based systems have two HT chains.
+(2) BIOS doesn't allocate resources for BAR 6 of devices under 8132
+    etc.
+(3) Multi-peer-root patch will try to split root resources to peer
+    root resources according to PCI conf of NB
+(4) PCI core assigns unassigned resources, but they overlap with BARs
+    that are used by IO-APIC addr of io4 and 8132.
+
+This happens because at that point the IO-APIC resources have not
+been inserted yet.  The solution is to insert IO-APIC resources into
+the tree a bit earlier.
+
+Signed-off-by: Rafael J. Wysocki <rjw@suse.de>
+Automatically created from "patches.arch/bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch" by xen-port-patches.py
+
+--- sle11-2009-10-08.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-24 10:19:57.000000000 +0100
++++ sle11-2009-10-08/arch/x86/kernel/io_apic_64-xen.c  2009-10-08 12:18:42.000000000 +0200
+@@ -2423,7 +2423,7 @@ void __init ioapic_init_mappings(void)
+       }
+ }
+-static int __init ioapic_insert_resources(void)
++void __init ioapic_insert_resources(void)
+ {
+       int i;
+       struct resource *r = ioapic_resources;
+@@ -2431,18 +2431,12 @@ static int __init ioapic_insert_resource
+       if (!r) {
+               printk(KERN_ERR
+                      "IO APIC resources could be not be allocated.\n");
+-              return -1;
++              return;
+       }
+       for (i = 0; i < nr_ioapics; i++) {
+               insert_resource(&iomem_resource, r);
+               r++;
+       }
+-
+-      return 0;
+ }
+-
+-/* Insert the IO APIC resources after PCI initialization has occured to handle
+- * IO APICS that are mapped in on a BAR in PCI space. */
+-late_initcall(ioapic_insert_resources);
+ #endif /* !CONFIG_XEN */
+--- sle11-2009-10-08.orig/arch/x86/pci/i386.c  2009-10-08 12:08:34.000000000 +0200
++++ sle11-2009-10-08/arch/x86/pci/i386.c       2009-10-08 12:19:13.000000000 +0200
+@@ -228,12 +228,14 @@ void __init pcibios_resource_survey(void
+       pcibios_allocate_bus_resources(&pci_root_buses);
+       pcibios_allocate_resources(0);
+       pcibios_allocate_resources(1);
++#ifndef CONFIG_XEN
+       /*
+        * Insert the IO APIC resources after PCI initialization has
+        * occured to handle IO APICS that are mapped in on a BAR in
+        * PCI space, but before trying to assign unassigned pci res.
+        */
+       ioapic_insert_resources();
++#endif
+ }
+ /**
similarity index 53%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-arch-x86
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-arch-x86
index 7a09fb1d458c5a9a23935bd2d0ed5d54133e41e5..c0f89a33e98f02ef78edb7e29b31e99387548889 100644 (file)
@@ -2,8 +2,8 @@ Subject: xen3 x86 build fixes.
 From: jbeulich@novell.com
 Patch-mainline: obsolete
 
---- sle11-2009-06-04.orig/arch/x86/kdb/kdba_bt.c       2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/kdb/kdba_bt.c    2009-06-04 10:19:52.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kdb/kdba_bt.c       2009-10-16 14:48:16.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kdb/kdba_bt.c    2009-06-04 10:19:52.000000000 +0200
 @@ -3196,6 +3196,9 @@ bb_usage_mov(const struct bb_operand *sr
            bb_is_int_reg(dst->base_rc) &&
            full_register_dst) {
@@ -14,15 +14,26 @@ Patch-mainline: obsolete
                /* mov from TSS_sysenter_sp0+offset to esp to fix up the
                 * sysenter stack, it leaves esp well defined.  mov
                 * TSS_ysenter_sp0+offset(%esp),%esp is followed by up to 5
---- sle11-2009-06-04.orig/arch/x86/power/Makefile      2009-06-04 10:17:50.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/power/Makefile   2009-06-04 10:19:52.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/intel_cacheinfo.c        2008-10-10 00:13:53.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/cpu/intel_cacheinfo.c     2009-10-16 14:50:37.000000000 +0200
+@@ -455,7 +455,7 @@ unsigned int __cpuinit init_intel_cachei
+ static DEFINE_PER_CPU(struct _cpuid4_info *, cpuid4_info);
+ #define CPUID4_INFO_IDX(x, y)    (&((per_cpu(cpuid4_info, x))[y]))
+-#ifdef CONFIG_SMP
++#if defined(CONFIG_SMP) && !defined(CONFIG_XEN)
+ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
+ {
+       struct _cpuid4_info     *this_leaf, *sibling_leaf;
+--- sle11-2009-10-16.orig/arch/x86/power/Makefile      2009-10-16 14:48:16.000000000 +0200
++++ sle11-2009-10-16/arch/x86/power/Makefile   2009-06-04 10:19:52.000000000 +0200
 @@ -1,2 +1,4 @@
  obj-$(CONFIG_PM_SLEEP)                += cpu_$(BITS).o
  obj-$(CONFIG_HIBERNATION)     += hibernate_$(BITS).o hibernate_asm_$(BITS).o
 +
 +disabled-obj-$(CONFIG_XEN)    := cpu_$(BITS).o
---- sle11-2009-06-04.orig/arch/x86/power/cpu_64.c      2009-06-04 10:18:37.000000000 +0200
-+++ sle11-2009-06-04/arch/x86/power/cpu_64.c   2009-06-04 10:19:52.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/power/cpu_64.c      2008-11-25 12:35:54.000000000 +0100
++++ sle11-2009-10-16/arch/x86/power/cpu_64.c   2009-06-04 10:19:52.000000000 +0200
 @@ -135,7 +135,6 @@ void restore_processor_state(void)
  
  static void fix_processor_context(void)
similarity index 86%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-common
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-common
index 2504696d304772ada5430100bf066fb7870cb83c..a43c004495957df1e60e638f2ffee17752257d2a 100644 (file)
@@ -2,8 +2,8 @@ Subject: Fix xen build.
 From: jbeulich@novell.com
 Patch-mainline: obsolete
 
---- sle11-2009-06-29.orig/drivers/acpi/hardware/hwsleep.c      2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/acpi/hardware/hwsleep.c   2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/acpi/hardware/hwsleep.c      2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/acpi/hardware/hwsleep.c   2009-02-16 16:01:39.000000000 +0100
 @@ -430,6 +430,7 @@ ACPI_EXPORT_SYMBOL(acpi_enter_sleep_stat
   *              THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
   *
@@ -20,8 +20,8 @@ Patch-mainline: obsolete
  
  /*******************************************************************************
   *
---- sle11-2009-06-29.orig/drivers/base/cpu.c   2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/base/cpu.c        2009-02-17 11:26:03.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/base/cpu.c   2009-08-19 10:05:22.000000000 +0200
++++ sle11-2009-07-31/drivers/base/cpu.c        2009-02-17 11:26:03.000000000 +0100
 @@ -78,7 +78,7 @@ static inline void register_cpu_control(
  }
  #endif /* CONFIG_HOTPLUG_CPU */
@@ -40,8 +40,8 @@ Patch-mainline: obsolete
        if (!error)
                error = sysdev_create_file(&cpu->sysdev, &attr_crash_notes);
  #endif
---- sle11-2009-06-29.orig/drivers/ide/ide-lib.c        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/ide/ide-lib.c     2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/ide/ide-lib.c        2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/ide/ide-lib.c     2009-02-16 16:01:39.000000000 +0100
 @@ -177,6 +177,16 @@ void ide_toggle_bounce(ide_drive_t *driv
  {
        u64 addr = BLK_BOUNCE_HIGH;     /* dma64_addr_t */
@@ -67,8 +67,8 @@ Patch-mainline: obsolete
  
        if (drive->queue)
                blk_queue_bounce_limit(drive->queue, addr);
---- sle11-2009-06-29.orig/drivers/oprofile/buffer_sync.c       2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/oprofile/buffer_sync.c    2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/oprofile/buffer_sync.c       2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/oprofile/buffer_sync.c    2009-02-16 16:01:39.000000000 +0100
 @@ -44,7 +44,9 @@ static cpumask_t marked_cpus = CPU_MASK_
  static DEFINE_SPINLOCK(task_mortuary);
  static void process_task_mortuary(void);
@@ -180,8 +180,8 @@ Patch-mainline: obsolete
  
        mark_done(cpu);
  
---- sle11-2009-06-29.orig/drivers/oprofile/cpu_buffer.c        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/oprofile/cpu_buffer.c     2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/oprofile/cpu_buffer.c        2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/oprofile/cpu_buffer.c     2009-02-16 16:01:39.000000000 +0100
 @@ -38,7 +38,11 @@ static void wq_sync_buffer(struct work_s
  #define DEFAULT_TIMER_EXPIRE (HZ / 10)
  static int work_enabled;
@@ -210,8 +210,8 @@ Patch-mainline: obsolete
  
  /*
   * This serves to avoid cpu buffer overflow, and makes sure
---- sle11-2009-06-29.orig/drivers/oprofile/oprof.c     2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/oprofile/oprof.c  2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/oprofile/oprof.c     2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/oprofile/oprof.c  2009-02-16 16:01:39.000000000 +0100
 @@ -37,6 +37,7 @@ static DEFINE_MUTEX(start_mutex);
   */
  static int timer = 0;
@@ -228,8 +228,8 @@ Patch-mainline: obsolete
  
  int oprofile_setup(void)
  {
---- sle11-2009-06-29.orig/drivers/oprofile/oprofile_files.c    2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/oprofile/oprofile_files.c 2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/drivers/oprofile/oprofile_files.c    2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/drivers/oprofile/oprofile_files.c 2009-02-16 16:01:39.000000000 +0100
 @@ -124,6 +124,8 @@ static const struct file_operations dump
        .write          = dump_write,
  };
@@ -256,9 +256,9 @@ Patch-mainline: obsolete
        oprofilefs_create_file(sb, root, "buffer", &event_buffer_fops);
        oprofilefs_create_ulong(sb, root, "buffer_size", &fs_buffer_size);
        oprofilefs_create_ulong(sb, root, "buffer_watershed", &fs_buffer_watershed);
---- sle11-2009-06-29.orig/include/linux/mm.h   2009-06-29 15:17:31.000000000 +0200
-+++ sle11-2009-06-29/include/linux/mm.h        2009-06-29 15:27:58.000000000 +0200
-@@ -202,10 +202,12 @@ struct vm_operations_struct {
+--- sle11-2009-07-31.orig/include/linux/mm.h   2009-08-19 10:20:34.000000000 +0200
++++ sle11-2009-07-31/include/linux/mm.h        2009-08-19 10:21:35.000000000 +0200
+@@ -203,10 +203,12 @@ struct vm_operations_struct {
        int (*access)(struct vm_area_struct *vma, unsigned long addr,
                      void *buf, int len, int write);
  
@@ -271,8 +271,8 @@ Patch-mainline: obsolete
  #ifdef CONFIG_NUMA
        /*
         * set_policy() op must add a reference to any non-NULL @new mempolicy
---- sle11-2009-06-29.orig/include/linux/oprofile.h     2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/include/linux/oprofile.h  2009-06-29 15:28:01.000000000 +0200
+--- sle11-2009-07-31.orig/include/linux/oprofile.h     2009-06-26 16:58:14.000000000 +0200
++++ sle11-2009-07-31/include/linux/oprofile.h  2009-06-29 15:28:01.000000000 +0200
 @@ -16,8 +16,9 @@
  #include <linux/types.h>
  #include <linux/spinlock.h>
@@ -298,8 +298,8 @@ Patch-mainline: obsolete
        /* Do any necessary interrupt setup. Optional. */
        int (*setup)(void);
        /* Do any necessary interrupt shutdown. Optional. */
---- sle11-2009-06-29.orig/kernel/kexec.c       2008-11-25 13:31:12.000000000 +0100
-+++ sle11-2009-06-29/kernel/kexec.c    2009-02-17 11:27:16.000000000 +0100
+--- sle11-2009-07-31.orig/kernel/kexec.c       2008-11-25 13:31:12.000000000 +0100
++++ sle11-2009-07-31/kernel/kexec.c    2009-02-17 11:27:16.000000000 +0100
 @@ -44,8 +44,10 @@
  #include <linux/kdb.h>
  #endif
@@ -343,8 +343,8 @@ Patch-mainline: obsolete
  #ifdef CONFIG_SYSCTL
        register_sysctl_table(kexec_sys_table);
  #endif
---- sle11-2009-06-29.orig/mm/memory.c  2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/mm/memory.c       2009-02-16 16:01:39.000000000 +0100
+--- sle11-2009-07-31.orig/mm/memory.c  2009-02-16 15:58:14.000000000 +0100
++++ sle11-2009-07-31/mm/memory.c       2009-02-16 16:01:39.000000000 +0100
 @@ -758,10 +758,12 @@ static unsigned long zap_pte_range(struc
                                     page->index > details->last_index))
                                        continue;
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-fixup-xen
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-fixup-xen
index 2781775540f125ba14e895b42a18905f8398bafd..3380e27a4440c772ee6e831b16fc487da34981d1 100644 (file)
@@ -4,10 +4,8 @@ Patch-mainline: obsolete
 
 Acked-by: jbeulich@novell.com
 
-Index: head-2008-11-25/drivers/xen/Makefile
-===================================================================
---- head-2008-11-25.orig/drivers/xen/Makefile  2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/Makefile       2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/Makefile 2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/Makefile      2008-11-25 12:35:56.000000000 +0100
 @@ -1,4 +1,25 @@
 -obj-y += grant-table.o features.o events.o manage.o
 +obj-y += core/
@@ -37,10 +35,8 @@ Index: head-2008-11-25/drivers/xen/Makefile
 +obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_UTIL)               += sfc_netutil/
 +obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_FRONTEND)   += sfc_netfront/
 +obj-$(CONFIG_XEN_NETDEV_ACCEL_SFC_BACKEND)    += sfc_netback/
-Index: head-2008-11-25/drivers/xen/xenbus/Makefile
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/Makefile   2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/Makefile        2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/Makefile  2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/Makefile       2008-11-25 12:35:56.000000000 +0100
 @@ -1,7 +1,9 @@
 -obj-y += xenbus.o
 +obj-y += xenbus_client.o xenbus_comms.o xenbus_xs.o xenbus_probe.o
@@ -57,10 +53,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/Makefile
 +xenbus-$(CONFIG_XEN_BACKEND) += xenbus_probe_backend.o
 +obj-y += $(xenbus-y) $(xenbus-m)
 +obj-$(CONFIG_XEN_XENBUS_DEV) += xenbus_dev.o
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_client.c
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/xenbus_client.c    2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_client.c 2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/xenbus_client.c   2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/xenbus_client.c        2008-11-25 12:35:56.000000000 +0100
 @@ -30,14 +30,18 @@
   * IN THE SOFTWARE.
   */
@@ -528,10 +522,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/xenbus_client.c
  enum xenbus_state xenbus_read_driver_state(const char *path)
  {
        enum xenbus_state result;
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_comms.c
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/xenbus_comms.c     2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_comms.c  2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/xenbus_comms.c    2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/xenbus_comms.c 2008-11-25 12:35:56.000000000 +0100
 @@ -34,19 +34,28 @@
  #include <linux/interrupt.h>
  #include <linux/sched.h>
@@ -626,10 +618,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/xenbus_comms.c
 +
        return 0;
  }
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_probe.c
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/xenbus_probe.c     2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_probe.c  2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/xenbus_probe.c    2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/xenbus_probe.c 2008-11-25 12:35:56.000000000 +0100
 @@ -4,6 +4,7 @@
   * Copyright (C) 2005 Rusty Russell, IBM Corporation
   * Copyright (C) 2005 Mike Wray, Hewlett-Packard
@@ -1372,10 +1362,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/xenbus_probe.c
 +      return bus_for_each_dev(&xenbus_frontend.bus, NULL, arg, fn);
 +}
 +EXPORT_SYMBOL_GPL(xenbus_for_each_frontend);
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_probe.h
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/xenbus_probe.h     2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_probe.h  2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/xenbus_probe.h    2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/xenbus_probe.h 2008-11-25 12:35:56.000000000 +0100
 @@ -34,41 +34,42 @@
  #ifndef _XENBUS_PROBE_H
  #define _XENBUS_PROBE_H
@@ -1428,10 +1416,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/xenbus_probe.h
  
  #endif
 +
-Index: head-2008-11-25/drivers/xen/xenbus/xenbus_xs.c
-===================================================================
---- head-2008-11-25.orig/drivers/xen/xenbus/xenbus_xs.c        2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/drivers/xen/xenbus/xenbus_xs.c     2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/drivers/xen/xenbus/xenbus_xs.c       2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/drivers/xen/xenbus/xenbus_xs.c    2008-11-25 12:35:56.000000000 +0100
 @@ -47,6 +47,14 @@
  #include <xen/xenbus.h>
  #include "xenbus_comms.h"
@@ -1612,10 +1598,8 @@ Index: head-2008-11-25/drivers/xen/xenbus/xenbus_xs.c
        for (;;) {
                err = process_msg();
                if (err)
-Index: head-2008-11-25/include/xen/balloon.h
-===================================================================
---- head-2008-11-25.orig/include/xen/balloon.h 2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/balloon.h      2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/balloon.h        2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/balloon.h     2008-11-25 12:35:56.000000000 +0100
 @@ -31,12 +31,9 @@
   * IN THE SOFTWARE.
   */
@@ -1639,10 +1623,8 @@ Index: head-2008-11-25/include/xen/balloon.h
  
 -#endif /* __XEN_BALLOON_H__ */
 +#endif /* __ASM_BALLOON_H__ */
-Index: head-2008-11-25/include/xen/interface/callback.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/callback.h      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/callback.h   2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/callback.h     2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/callback.h  2008-11-25 12:35:56.000000000 +0100
 @@ -86,6 +86,8 @@ struct callback_register {
        uint16_t flags;
        xen_callback_t address;
@@ -1675,10 +1657,8 @@ Index: head-2008-11-25/include/xen/interface/callback.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/elfnote.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/elfnote.h       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/elfnote.h    2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/elfnote.h      2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/elfnote.h   2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Definitions used for the Xen ELF notes.
@@ -1802,10 +1782,8 @@ Index: head-2008-11-25/include/xen/interface/elfnote.h
  #endif /* __XEN_PUBLIC_ELFNOTE_H__ */
  
  /*
-Index: head-2008-11-25/include/xen/interface/event_channel.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/event_channel.h 2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/event_channel.h      2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/event_channel.h        2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/event_channel.h     2008-11-25 12:35:56.000000000 +0100
 @@ -3,14 +3,39 @@
   *
   * Event channels between domains.
@@ -2144,10 +2122,8 @@ Index: head-2008-11-25/include/xen/interface/event_channel.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/features.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/features.h      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/features.h   2008-11-25 12:22:34.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/features.h     2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/features.h  2008-11-25 12:22:34.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Feature flags, reported by XENVER_get_features.
@@ -2199,10 +2175,8 @@ Index: head-2008-11-25/include/xen/interface/features.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/grant_table.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/grant_table.h   2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/grant_table.h        2008-11-25 12:22:34.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/grant_table.h  2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/grant_table.h       2008-11-25 12:22:34.000000000 +0100
 @@ -100,6 +100,7 @@ struct grant_entry {
       */
      uint32_t frame;
@@ -2414,10 +2388,8 @@ Index: head-2008-11-25/include/xen/interface/grant_table.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/blkif.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/blkif.h      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/blkif.h   2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/blkif.h     2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/blkif.h  2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Unified block-device I/O interface for Xen guest OSes.
@@ -2545,10 +2517,8 @@ Index: head-2008-11-25/include/xen/interface/io/blkif.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/console.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/console.h    2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/console.h 2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/console.h   2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/console.h        2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Console I/O interface for Xen guest OSes.
@@ -2588,10 +2558,8 @@ Index: head-2008-11-25/include/xen/interface/io/console.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/fbif.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/fbif.h       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/fbif.h    2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/fbif.h      2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/fbif.h   2008-11-25 12:35:56.000000000 +0100
 @@ -41,12 +41,13 @@
   */
  #define XENFB_TYPE_UPDATE 2
@@ -2770,10 +2738,8 @@ Index: head-2008-11-25/include/xen/interface/io/fbif.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/kbdif.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/kbdif.h      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/kbdif.h   2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/kbdif.h     2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/kbdif.h  2008-11-25 12:35:56.000000000 +0100
 @@ -45,34 +45,38 @@
   */
  #define XENKBD_TYPE_POS     4
@@ -2891,10 +2857,8 @@ Index: head-2008-11-25/include/xen/interface/io/kbdif.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/netif.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/netif.h      2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/netif.h   2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/netif.h     2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/netif.h  2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Unified network-device I/O interface for Xen guest OSes.
@@ -3094,10 +3058,8 @@ Index: head-2008-11-25/include/xen/interface/io/netif.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/protocols.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/protocols.h  2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/protocols.h       2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/protocols.h 2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/protocols.h      2008-11-25 12:35:56.000000000 +0100
 @@ -1,10 +1,31 @@
 +/******************************************************************************
 + * protocols.h
@@ -3140,10 +3102,8 @@ Index: head-2008-11-25/include/xen/interface/io/protocols.h
  #else
  # error arch fixup needed here
  #endif
-Index: head-2008-11-25/include/xen/interface/io/ring.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/ring.h       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/ring.h    2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/ring.h      2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/ring.h   2008-11-25 12:35:56.000000000 +0100
 @@ -3,16 +3,42 @@
   *
   * Shared producer-consumer ring macros.
@@ -3527,10 +3487,8 @@ Index: head-2008-11-25/include/xen/interface/io/ring.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/io/xenbus.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/xenbus.h     2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/xenbus.h  2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/xenbus.h    2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/xenbus.h 2008-11-25 12:35:56.000000000 +0100
 @@ -3,42 +3,78 @@
   *
   * Xenbus protocol details.
@@ -3634,10 +3592,8 @@ Index: head-2008-11-25/include/xen/interface/io/xenbus.h
 + * indent-tabs-mode: nil
   * End:
   */
-Index: head-2008-11-25/include/xen/interface/io/xs_wire.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/io/xs_wire.h    2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/io/xs_wire.h 2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/io/xs_wire.h   2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/io/xs_wire.h        2008-11-25 12:35:56.000000000 +0100
 @@ -1,6 +1,25 @@
  /*
   * Details of the "wire" protocol between Xen Store Daemon and client
@@ -3711,10 +3667,8 @@ Index: head-2008-11-25/include/xen/interface/io/xs_wire.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/memory.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/memory.h        2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/memory.h     2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/memory.h       2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/memory.h    2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Memory reservation and information.
@@ -4009,10 +3963,8 @@ Index: head-2008-11-25/include/xen/interface/memory.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/physdev.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/physdev.h       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/physdev.h    2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/physdev.h      2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/physdev.h   2008-11-25 12:35:56.000000000 +0100
 @@ -24,7 +24,7 @@
  /*
   * Prototype for this hypercall is:
@@ -4261,10 +4213,8 @@ Index: head-2008-11-25/include/xen/interface/physdev.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/sched.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/sched.h 2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/sched.h      2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/sched.h        2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/sched.h     2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Scheduler state interactions
@@ -4364,10 +4314,8 @@ Index: head-2008-11-25/include/xen/interface/sched.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/vcpu.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/vcpu.h  2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/vcpu.h       2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/vcpu.h 2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/vcpu.h      2008-11-25 12:35:56.000000000 +0100
 @@ -29,9 +29,9 @@
  
  /*
@@ -4584,10 +4532,8 @@ Index: head-2008-11-25/include/xen/interface/vcpu.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/version.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/version.h       2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/version.h    2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/version.h      2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/version.h   2008-11-25 12:35:56.000000000 +0100
 @@ -3,6 +3,24 @@
   *
   * Xen version, type, and compile information.
@@ -4689,10 +4635,8 @@ Index: head-2008-11-25/include/xen/interface/version.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/interface/xen.h
-===================================================================
---- head-2008-11-25.orig/include/xen/interface/xen.h   2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/interface/xen.h        2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/interface/xen.h  2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/interface/xen.h       2008-11-25 12:35:56.000000000 +0100
 @@ -3,35 +3,68 @@
   *
   * Guest OS interface to Xen.
@@ -4861,7 +4805,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  
  /* Architecture-specific VIRQ definitions. */
  #define VIRQ_ARCH_0    16
-@@ -91,6 +158,7 @@
+@@ -91,6 +160,7 @@
  #define VIRQ_ARCH_7    23
  
  #define NR_VIRQS       24
@@ -4869,7 +4813,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  /*
   * MMU-UPDATE REQUESTS
   *
-@@ -166,6 +234,13 @@
+@@ -166,6 +236,13 @@
   * cmd: MMUEXT_SET_LDT
   * linear_addr: Linear address of LDT base (NB. must be page-aligned).
   * nr_ents: Number of entries in LDT.
@@ -4883,7 +4827,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
   */
  #define MMUEXT_PIN_L1_TABLE      0
  #define MMUEXT_PIN_L2_TABLE      1
-@@ -182,24 +257,34 @@
+@@ -182,24 +259,34 @@
  #define MMUEXT_FLUSH_CACHE      12
  #define MMUEXT_SET_LDT          13
  #define MMUEXT_NEW_USER_BASEPTR 15
@@ -4932,7 +4876,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  #endif
  
  /* These are passed as 'flags' to update_va_mapping. They can be ORed. */
-@@ -224,11 +309,24 @@ DEFINE_GUEST_HANDLE_STRUCT(mmuext_op);
+@@ -224,11 +311,24 @@ DEFINE_GUEST_HANDLE_STRUCT(mmuext_op);
   */
  #define VMASST_CMD_enable                0
  #define VMASST_CMD_disable               1
@@ -4958,7 +4902,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  
  #ifndef __ASSEMBLY__
  
-@@ -267,18 +365,19 @@ struct mmu_update {
+@@ -267,18 +367,19 @@ struct mmu_update {
      uint64_t ptr;       /* Machine address of PTE. */
      uint64_t val;       /* New contents of PTE.    */
  };
@@ -4982,7 +4926,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  
  /*
   * Event channel endpoints per domain:
-@@ -287,173 +386,240 @@ DEFINE_GUEST_HANDLE_STRUCT(multicall_ent
+@@ -287,173 +388,240 @@ DEFINE_GUEST_HANDLE_STRUCT(multicall_ent
  #define NR_EVENT_CHANNELS (sizeof(unsigned long) * sizeof(unsigned long) * 64)
  
  struct vcpu_time_info {
@@ -5353,7 +5297,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  
  typedef uint8_t xen_domain_handle_t[16];
  
-@@ -461,6 +627,11 @@ typedef uint8_t xen_domain_handle_t[16];
+@@ -461,6 +629,11 @@ typedef uint8_t xen_domain_handle_t[16];
  #define __mk_unsigned_long(x) x ## UL
  #define mk_unsigned_long(x) __mk_unsigned_long(x)
  
@@ -5365,7 +5309,7 @@ Index: head-2008-11-25/include/xen/interface/xen.h
  #else /* __ASSEMBLY__ */
  
  /* In assembly code we cannot use C numeric constant suffixes. */
-@@ -468,4 +639,24 @@ typedef uint8_t xen_domain_handle_t[16];
+@@ -468,4 +641,24 @@ typedef uint8_t xen_domain_handle_t[16];
  
  #endif /* !__ASSEMBLY__ */
  
@@ -5390,10 +5334,8 @@ Index: head-2008-11-25/include/xen/interface/xen.h
 + * indent-tabs-mode: nil
 + * End:
 + */
-Index: head-2008-11-25/include/xen/xenbus.h
-===================================================================
---- head-2008-11-25.orig/include/xen/xenbus.h  2008-11-25 12:33:06.000000000 +0100
-+++ head-2008-11-25/include/xen/xenbus.h       2008-11-25 12:35:56.000000000 +0100
+--- sle11-2009-09-18.orig/include/xen/xenbus.h 2009-09-18 10:11:48.000000000 +0200
++++ sle11-2009-09-18/include/xen/xenbus.h      2008-11-25 12:35:56.000000000 +0100
 @@ -39,6 +39,7 @@
  #include <linux/mutex.h>
  #include <linux/completion.h>
similarity index 95%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.19
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.19
index 4ba8c96f228b3d482867372d0206c13158e3b1c4..0db90a9e78815df107cc52a9b34cac8999fe0052 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.19" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-05-14.orig/arch/x86/Kconfig     2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/Kconfig  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-03-04 11:28:34.000000000 +0100
 @@ -415,6 +415,7 @@ config SCHED_NO_NO_OMIT_FRAME_POINTER
  
  menuconfig PARAVIRT_GUEST
@@ -16,8 +16,8 @@ Acked-by: jbeulich@novell.com
        help
          Say Y here to get to see options related to running Linux under
          various hypervisors.  This option alone does not add any kernel code.
---- sle11-2009-05-14.orig/arch/x86/kernel/apic_32-xen.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/apic_32-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_32-xen.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_32-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -54,7 +54,6 @@ static cpumask_t timer_bcast_ipi;
  /*
   * Knob to control our willingness to enable the local APIC.
@@ -58,8 +58,8 @@ Acked-by: jbeulich@novell.com
  #endif
        }
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/common-xen.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/common-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -43,7 +43,7 @@ struct cpu_dev * cpu_devs[X86_VENDOR_NUM
  
  extern int disable_pse;
@@ -123,8 +123,8 @@ Acked-by: jbeulich@novell.com
  
        /* Clear all 6 debug registers: */
        set_debugreg(0, 0);
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:01:46.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:07:47.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:01:46.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:07:47.000000000 +0200
 @@ -80,8 +80,12 @@ VM_MASK             = 0x00020000
  NMI_MASK      = 0x80000000
  
@@ -511,8 +511,8 @@ Acked-by: jbeulich@novell.com
  .section .rodata,"a"
  #include "syscall_table.S"
  
---- sle11-2009-05-14.orig/arch/x86/kernel/head_32-xen.S        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/head_32-xen.S     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2009-03-04 11:28:34.000000000 +0100
 @@ -62,7 +62,7 @@ ENTRY(startup_32)
        movl %eax,%gs
        cld                     # gcc2 wants the direction flag cleared at all times
@@ -522,8 +522,8 @@ Acked-by: jbeulich@novell.com
        jmp start_kernel
  
  #define HYPERCALL_PAGE_OFFSET 0x1000
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:13:45.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_32-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:13:45.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -31,6 +31,9 @@
  #include <linux/acpi.h>
  #include <linux/module.h>
@@ -1603,8 +1603,8 @@ Acked-by: jbeulich@novell.com
 +      return 0;
 +}
 +early_param("noapic", parse_noapic);
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_32-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/irq_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -53,8 +53,10 @@ static union irq_ctx *softirq_ctx[NR_CPU
   */
  fastcall unsigned int do_IRQ(struct pt_regs *regs)
@@ -1661,8 +1661,8 @@ Acked-by: jbeulich@novell.com
                seq_printf(p, "  %s", action->name);
  
                for (action=action->next; action; action = action->next)
---- sle11-2009-05-14.orig/arch/x86/kernel/ldt_32-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/ldt_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_32-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -1,5 +1,5 @@
  /*
 - * linux/kernel/ldt.c
@@ -1670,8 +1670,8 @@ Acked-by: jbeulich@novell.com
   *
   * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
   * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
---- sle11-2009-05-14.orig/arch/x86/kernel/microcode-xen.c      2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/microcode-xen.c   2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-03-04 11:28:34.000000000 +0100
 @@ -2,6 +2,7 @@
   *    Intel CPU Microcode Update Driver for Linux
   *
@@ -1807,8 +1807,8 @@ Acked-by: jbeulich@novell.com
  module_init(microcode_init)
  module_exit(microcode_exit)
 -MODULE_ALIAS_MISCDEV(MICROCODE_MINOR);
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_32-xen.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse_32-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -30,6 +30,7 @@
  #include <asm/io_apic.h>
  
@@ -1975,8 +1975,8 @@ Acked-by: jbeulich@novell.com
        /*
         * Mapping between Global System Interrups, which
         * represent all possible interrupts, and IRQs
---- sle11-2009-05-14.orig/arch/x86/kernel/pci-dma-xen.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/pci-dma-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -110,8 +110,7 @@ dma_map_sg(struct device *hwdev, struct 
  {
        int i, rc;
@@ -2035,8 +2035,8 @@ Acked-by: jbeulich@novell.com
        if (swiotlb)
                swiotlb_unmap_single(dev, dma_addr, size, direction);
        else
---- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -37,6 +37,7 @@
  #include <linux/kallsyms.h>
  #include <linux/ptrace.h>
@@ -2126,8 +2126,8 @@ Acked-by: jbeulich@novell.com
                sp -= get_random_int() % 8192;
        return sp & ~0xf;
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_32-xen.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/setup_32-xen.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-03-04 11:28:34.000000000 +0100
 @@ -56,6 +56,7 @@
  #include <asm/apic.h>
  #include <asm/e820.h>
@@ -2700,8 +2700,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_ACPI
        acpi_boot_init();
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_32-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/smp_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -279,8 +279,7 @@ static inline void leave_mm (unsigned lo
   * 2) Leave the mm if we are in the lazy tlb mode.
   */
@@ -2801,8 +2801,8 @@ Acked-by: jbeulich@novell.com
 +      return 0;
 +}
 +EXPORT_SYMBOL(smp_call_function_single);
---- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c        2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c     2009-03-24 10:08:00.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:20.000000000 +0100
 @@ -89,7 +89,6 @@ int pit_latch_buggy;              /* ext
  unsigned long vxtime_hz = PIT_TICK_RATE;
  struct vxtime_data __vxtime __section_vxtime;   /* for vsyscalls */
@@ -2928,7 +2928,7 @@ Acked-by: jbeulich@novell.com
  {
        s64 delta, delta_cpu, stolen, blocked;
        u64 sched_time;
-@@ -692,10 +689,14 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -692,10 +689,15 @@ irqreturn_t timer_interrupt(int irq, voi
        }
  
        /* System-wide jiffy work. */
@@ -2940,6 +2940,7 @@ Acked-by: jbeulich@novell.com
 +              do_div(delta, NS_PER_TICK);
 +              processed_system_time += delta * NS_PER_TICK;
 +              while (delta > HZ) {
++                      clobber_induction_variable(delta);
 +                      do_timer(HZ);
 +                      delta -= HZ;
 +              }
@@ -2947,7 +2948,7 @@ Acked-by: jbeulich@novell.com
        }
  
        if (shadow_tv_version != HYPERVISOR_shared_info->wc_version) {
-@@ -740,7 +741,7 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -740,7 +742,7 @@ irqreturn_t timer_interrupt(int irq, voi
        if (delta_cpu > 0) {
                do_div(delta_cpu, NS_PER_TICK);
                per_cpu(processed_system_time, cpu) += delta_cpu * NS_PER_TICK;
@@ -2956,7 +2957,7 @@ Acked-by: jbeulich@novell.com
                        account_user_time(current, (cputime_t)delta_cpu);
                else
                        account_system_time(current, HARDIRQ_OFFSET,
-@@ -754,10 +755,10 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -754,10 +756,10 @@ irqreturn_t timer_interrupt(int irq, voi
        /* Local timer processing (see update_process_times()). */
        run_local_timers();
        if (rcu_pending(cpu))
@@ -2969,7 +2970,7 @@ Acked-by: jbeulich@novell.com
  
        return IRQ_HANDLED;
  }
-@@ -967,10 +968,11 @@ extern void (*late_time_init)(void);
+@@ -967,10 +969,11 @@ extern void (*late_time_init)(void);
  /* Duplicate of time_init() below, with hpet_enable part added */
  static void __init hpet_time_init(void)
  {
@@ -2985,8 +2986,8 @@ Acked-by: jbeulich@novell.com
  
        if ((hpet_enable() >= 0) && hpet_use_timer) {
                printk("Using HPET for base-timer\n");
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-03-04 11:28:34.000000000 +0100
 @@ -28,6 +28,7 @@
  #include <linux/kprobes.h>
  #include <linux/kexec.h>
@@ -3433,8 +3434,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_KPROBES
  fastcall void __kprobes do_int3(struct pt_regs *regs, long error_code)
  {
---- sle11-2009-05-14.orig/arch/x86/mach-xen/setup.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mach-xen/setup.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mach-xen/setup.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mach-xen/setup.c 2009-03-04 11:28:34.000000000 +0100
 @@ -103,8 +103,10 @@ void __init pre_setup_arch_hook(void)
  
        setup_xen_features();
@@ -3448,8 +3449,8 @@ Acked-by: jbeulich@novell.com
  
        if (HYPERVISOR_memory_op(XENMEM_machphys_mapping, &mapping) == 0) {
                machine_to_phys_mapping = (unsigned long *)mapping.v_start;
---- sle11-2009-05-14.orig/arch/x86/mm/fault_32-xen.c   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/fault_32-xen.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2009-03-04 11:28:34.000000000 +0100
 @@ -27,21 +27,24 @@
  #include <asm/uaccess.h>
  #include <asm/desc.h>
@@ -3536,8 +3537,8 @@ Acked-by: jbeulich@novell.com
                yield();
                down_read(&mm->mmap_sem);
                goto survive;
---- sle11-2009-05-14.orig/arch/x86/mm/highmem_32-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/highmem_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -38,11 +38,9 @@ static void *__kmap_atomic(struct page *
  
        idx = type + KM_TYPE_NR*smp_processor_id();
@@ -3604,8 +3605,8 @@ Acked-by: jbeulich@novell.com
  
        return (void*) vaddr;
  }
---- sle11-2009-05-14.orig/arch/x86/mm/hypervisor.c     2008-12-15 11:13:45.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/hypervisor.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/hypervisor.c     2008-12-15 11:13:45.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/hypervisor.c  2009-03-04 11:28:34.000000000 +0100
 @@ -31,6 +31,7 @@
   */
  
@@ -3943,8 +3944,8 @@ Acked-by: jbeulich@novell.com
                        if (++i == MAX_BATCHED_FULL_PTES) {
                                if ((rc = HYPERVISOR_mmu_update(
                                        &u[0], i, NULL, DOMID_SELF)) != 0)
---- sle11-2009-05-14.orig/arch/x86/mm/init_32-xen.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/init_32-xen.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-03-04 11:28:34.000000000 +0100
 @@ -462,16 +462,22 @@ EXPORT_SYMBOL(__supported_pte_mask);
   * on      Enable
   * off     Disable
@@ -4087,8 +4088,8 @@ Acked-by: jbeulich@novell.com
        unsigned long start_pfn = start >> PAGE_SHIFT;
        unsigned long nr_pages = size >> PAGE_SHIFT;
  
---- sle11-2009-05-14.orig/arch/x86/mm/ioremap_32-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/ioremap_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap_32-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -12,7 +12,7 @@
  #include <linux/init.h>
  #include <linux/slab.h>
@@ -4136,8 +4137,8 @@ Acked-by: jbeulich@novell.com
                vunmap((void __force *) addr);
                return NULL;
        }
---- sle11-2009-05-14.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-01 11:25:57.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pgtable_32-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-01 11:25:57.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -68,7 +68,9 @@ void show_mem(void)
        printk(KERN_INFO "%lu pages writeback\n",
                                        global_page_state(NR_WRITEBACK));
@@ -4193,8 +4194,8 @@ Acked-by: jbeulich@novell.com
  }
  
  pte_t *pte_alloc_one_kernel(struct mm_struct *mm, unsigned long address)
---- sle11-2009-05-14.orig/arch/x86/pci/irq-xen.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/pci/irq-xen.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-03-04 11:28:34.000000000 +0100
 @@ -991,10 +991,6 @@ static void __init pcibios_fixup_irqs(vo
                                                        pci_name(bridge), 'A' + pin, irq);
                                }
@@ -4251,8 +4252,8 @@ Acked-by: jbeulich@novell.com
 -
 -      return count;
 -}
---- sle11-2009-05-14.orig/arch/x86/ia32/ia32entry-xen.S        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/ia32/ia32entry-xen.S     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-03-04 11:28:34.000000000 +0100
 @@ -83,6 +83,7 @@
   */   
  ENTRY(ia32_sysenter_target)
@@ -4302,8 +4303,8 @@ Acked-by: jbeulich@novell.com
        .quad compat_sys_move_pages
 +      .quad sys_getcpu
  ia32_syscall_end:             
---- sle11-2009-05-14.orig/arch/x86/kernel/Makefile     2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/Makefile  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-03-04 11:28:34.000000000 +0100
 @@ -104,9 +104,9 @@ obj-$(CONFIG_X86_XEN)              += fixup.o
  ###
  # 64 bit specific files
@@ -4326,8 +4327,8 @@ Acked-by: jbeulich@novell.com
 +      smpboot_$(BITS).o tsc_$(BITS).o
 +disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
  %/head_$(BITS).o %/head_$(BITS).s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
---- sle11-2009-05-14.orig/arch/x86/kernel/apic_64-xen.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/apic_64-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -43,7 +43,7 @@ int apic_verbosity;
   */
  void ack_bad_irq(unsigned int irq)
@@ -4393,8 +4394,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
        return 1;
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_64-xen.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/e820_64-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -16,6 +16,7 @@
  #include <linux/string.h>
  #include <linux/kexec.h>
@@ -4875,8 +4876,8 @@ Acked-by: jbeulich@novell.com
  }
  
  unsigned long pci_mem_start = 0xaeedbabe;
---- sle11-2009-05-14.orig/arch/x86/kernel/early_printk-xen.c   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/early_printk-xen.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-03-04 11:28:34.000000000 +0100
 @@ -244,20 +244,16 @@ void early_printk(const char *fmt, ...)
  
  static int __initdata keep_early;
@@ -4923,8 +4924,8 @@ Acked-by: jbeulich@novell.com
  }
  
 -__setup("earlyprintk=", setup_early_printk);
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-03-04 11:28:34.000000000 +0100
 @@ -4,9 +4,6 @@
   *  Copyright (C) 1991, 1992  Linus Torvalds
   *  Copyright (C) 2000, 2001, 2002  Andi Kleen SuSE Labs
@@ -5167,8 +5168,8 @@ Acked-by: jbeulich@novell.com
  
  ENTRY(alignment_check)
        errorentry do_alignment_check
---- sle11-2009-05-14.orig/arch/x86/kernel/genapic_xen_64.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/genapic_xen_64.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_xen_64.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_xen_64.c  2009-03-04 11:28:34.000000000 +0100
 @@ -71,6 +71,13 @@ static cpumask_t xen_target_cpus(void)
        return cpu_online_map;
  }
@@ -5193,8 +5194,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_XEN_PRIVILEGED_GUEST
        .apic_id_registered = xen_apic_id_registered,
  #endif
---- sle11-2009-05-14.orig/arch/x86/kernel/head_64-xen.S        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/head_64-xen.S     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_64-xen.S        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_64-xen.S     2009-03-04 11:28:34.000000000 +0100
 @@ -5,9 +5,6 @@
   *  Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
   *  Copyright (C) 2000 Karsten Keil <kkeil@suse.de>
@@ -5214,8 +5215,8 @@ Acked-by: jbeulich@novell.com
  gdt_end:
        /* asm/segment.h:GDT_ENTRIES must match this */
        /* This should be a multiple of the cache line size */
---- sle11-2009-05-14.orig/arch/x86/kernel/head64-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/head64-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -7,6 +7,9 @@
   *    Modified for Xen.
   */
@@ -5307,8 +5308,8 @@ Acked-by: jbeulich@novell.com
 -      setup_boot_cpu_data();
        start_kernel();
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:13:45.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_64-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:13:45.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -26,9 +26,12 @@
  #include <linux/delay.h>
  #include <linux/sched.h>
@@ -7008,8 +7009,8 @@ Acked-by: jbeulich@novell.com
        spin_unlock_irqrestore(&ioapic_lock, flags);
  
        return 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/ioport_64-xen.c      2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/ioport_64-xen.c   2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_64-xen.c      2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport_64-xen.c   2009-03-04 11:28:34.000000000 +0100
 @@ -58,6 +58,7 @@ asmlinkage long sys_ioperm(unsigned long
  
                memset(bitmap, 0xff, IO_BITMAP_BYTES);
@@ -7018,8 +7019,8 @@ Acked-by: jbeulich@novell.com
  
                set_xen_guest_handle(set_iobitmap.bitmap, (char *)bitmap);
                set_iobitmap.nr_ports = IO_BITMAP_BITS;
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_64-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/irq_64-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -20,11 +20,6 @@
  #include <asm/idle.h>
  
@@ -7099,8 +7100,8 @@ Acked-by: jbeulich@novell.com
 +        printk("unexpected IRQ trap at irq %02x\n", irq);
  }
  #endif
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_64-xen.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse_64-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -41,8 +41,7 @@ int acpi_found_madt;
   * Various Linux-internal data structures created from the
   * MP-table.
@@ -7714,8 +7715,8 @@ Acked-by: jbeulich@novell.com
 -
 -#endif /*CONFIG_X86_IO_APIC*/
  #endif /*CONFIG_ACPI*/
---- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-03-04 11:28:34.000000000 +0100
 @@ -89,25 +89,24 @@ void idle_notifier_unregister(struct not
  }
  EXPORT_SYMBOL(idle_notifier_unregister);
@@ -7922,8 +7923,8 @@ Acked-by: jbeulich@novell.com
                sp -= get_random_int() % 8192;
        return sp & ~0xf;
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_64-xen.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/setup_64-xen.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-03-04 11:28:34.000000000 +0100
 @@ -88,9 +88,6 @@ extern struct edid_info edid_info;
  shared_info_t *HYPERVISOR_shared_info = (shared_info_t *)empty_zero_page;
  EXPORT_SYMBOL(HYPERVISOR_shared_info);
@@ -8357,8 +8358,8 @@ Acked-by: jbeulich@novell.com
                NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  
                /* VIA/Cyrix/Centaur-defined */
---- sle11-2009-05-14.orig/arch/x86/kernel/setup64-xen.c        2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/setup64-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -31,7 +31,7 @@
  #include <asm/hypervisor.h>
  #endif
@@ -8452,8 +8453,8 @@ Acked-by: jbeulich@novell.com
                orig_ist->ist[v] = t->ist[v] = (unsigned long)estacks;
        }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_64-xen.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/smp_64-xen.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2009-03-04 11:28:34.000000000 +0100
 @@ -381,9 +381,8 @@ int smp_call_function_single (int cpu, v
        /* prevent preemption and reschedule on another processor */
        int me = get_cpu();
@@ -8515,8 +8516,8 @@ Acked-by: jbeulich@novell.com
 -      return 0; /* Should not happen */
 -#endif
 -}
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_64-xen.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/traps_64-xen.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-03-04 11:28:34.000000000 +0100
 @@ -23,6 +23,7 @@
  #include <linux/delay.h>
  #include <linux/spinlock.h>
@@ -8972,8 +8973,8 @@ Acked-by: jbeulich@novell.com
 -__setup("call_trace=", call_trace_setup);
 +early_param("call_trace", call_trace_setup);
  #endif
---- sle11-2009-05-14.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/vsyscall_64-xen.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-03-04 11:28:34.000000000 +0100
 @@ -26,6 +26,10 @@
  #include <linux/seqlock.h>
  #include <linux/jiffies.h>
@@ -9167,8 +9168,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  
---- sle11-2009-05-14.orig/arch/x86/mm/fault_64-xen.c   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/fault_64-xen.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2009-03-04 11:28:34.000000000 +0100
 @@ -40,8 +40,7 @@
  #define PF_RSVD       (1<<3)
  #define PF_INSTR      (1<<4)
@@ -9306,8 +9307,8 @@ Acked-by: jbeulich@novell.com
                        }
                        spin_unlock(&pgd_lock);
                        set_bit(pgd_index(address), insync);
---- sle11-2009-05-14.orig/arch/x86/mm/init_64-xen.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/mm/init_64-xen.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-03-04 11:28:34.000000000 +0100
 @@ -61,8 +61,6 @@ EXPORT_SYMBOL(__kernel_page_user);
  
  int after_bootmem;
@@ -9613,8 +9614,8 @@ Acked-by: jbeulich@novell.com
  }
  
  int kern_addr_valid(unsigned long addr) 
---- sle11-2009-05-14.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-01 11:25:57.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pageattr_64-xen.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-01 11:25:57.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2009-03-04 11:28:34.000000000 +0100
 @@ -377,8 +377,8 @@ static void revert_page(unsigned long ad
        BUG_ON(pud_none(*pud));
        pmd = pmd_offset(pud, address);
@@ -9679,8 +9680,8 @@ Acked-by: jbeulich@novell.com
                } 
        }       
        up_write(&init_mm.mmap_sem); 
---- sle11-2009-05-14.orig/drivers/char/tpm/tpm_xen.c   2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/drivers/char/tpm/tpm_xen.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/char/tpm/tpm_xen.c   2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/char/tpm/tpm_xen.c        2009-03-04 11:28:34.000000000 +0100
 @@ -85,8 +85,7 @@ static struct tpm_private *my_priv;
  
  /* local function prototypes */
@@ -9700,8 +9701,8 @@ Acked-by: jbeulich@novell.com
  {
        struct tpm_private *tp = tpm_priv;
        unsigned long flags;
---- sle11-2009-05-14.orig/drivers/pci/Kconfig  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/pci/Kconfig       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/Kconfig  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/Kconfig       2009-03-04 11:28:34.000000000 +0100
 @@ -48,7 +48,7 @@ config PCI_DEBUG
  config HT_IRQ
        bool "Interrupts on hypertransport devices"
@@ -9711,8 +9712,8 @@ Acked-by: jbeulich@novell.com
        help
           This allows native hypertransport devices to use interrupts.
  
---- sle11-2009-05-14.orig/drivers/pci/msi-xen.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/pci/msi-xen.c     2009-04-24 13:31:56.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-04-24 13:31:56.000000000 +0200
 @@ -6,6 +6,7 @@
   * Copyright (C) Tom Long Nguyen (tom.l.nguyen@intel.com)
   */
@@ -9942,8 +9943,8 @@ Acked-by: jbeulich@novell.com
   * allocated for this device function, are reclaimed to unused state,
   * which may be used later on.
   **/
---- sle11-2009-05-14.orig/drivers/xen/Kconfig  2008-12-05 08:43:56.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/Kconfig       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/Kconfig  2008-12-05 08:43:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/Kconfig       2009-03-04 11:28:34.000000000 +0100
 @@ -287,6 +287,9 @@ endmenu
  config HAVE_IRQ_IGNORE_UNHANDLED
        def_bool y
@@ -9954,8 +9955,8 @@ Acked-by: jbeulich@novell.com
  config NO_IDLE_HZ
        def_bool y
  
---- sle11-2009-05-14.orig/drivers/xen/balloon/balloon.c        2008-11-25 13:31:07.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/balloon/balloon.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/balloon/balloon.c        2009-06-29 15:24:00.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/balloon/balloon.c     2009-03-04 11:28:34.000000000 +0100
 @@ -84,7 +84,7 @@ static unsigned long frame_list[PAGE_SIZ
  /* VM /proc information for memory */
  extern unsigned long totalram_pages;
@@ -9965,8 +9966,8 @@ Acked-by: jbeulich@novell.com
  extern unsigned long totalhigh_pages;
  #define inc_totalhigh_pages() (totalhigh_pages++)
  #define dec_totalhigh_pages() (totalhigh_pages--)
---- sle11-2009-05-14.orig/drivers/xen/blkback/blkback.c        2008-12-01 11:21:10.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkback/blkback.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/blkback.c        2008-12-01 11:21:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/blkback.c     2009-03-04 11:28:34.000000000 +0100
 @@ -288,7 +288,7 @@ static void blkif_notify_work(blkif_t *b
        wake_up(&blkif->wq);
  }
@@ -9976,8 +9977,8 @@ Acked-by: jbeulich@novell.com
  {
        blkif_notify_work(dev_id);
        return IRQ_HANDLED;
---- sle11-2009-05-14.orig/drivers/xen/blkback/common.h 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blkback/common.h      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/common.h 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/common.h      2009-03-04 11:28:34.000000000 +0100
 @@ -130,7 +130,7 @@ void blkif_interface_init(void);
  
  void blkif_xenbus_init(void);
@@ -9987,8 +9988,8 @@ Acked-by: jbeulich@novell.com
  int blkif_schedule(void *arg);
  
  int blkback_barrier(struct xenbus_transaction xbt,
---- sle11-2009-05-14.orig/drivers/xen/blkfront/blkfront.c      2009-03-05 15:42:00.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:16.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-05 15:42:00.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:16.000000000 +0100
 @@ -70,7 +70,7 @@ static int setup_blkring(struct xenbus_d
  
  static void kick_pending_request_queues(struct blkfront_info *);
@@ -10007,8 +10008,8 @@ Acked-by: jbeulich@novell.com
  {
        struct request *req;
        blkif_response_t *bret;
---- sle11-2009-05-14.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blktap/blktap.c       2009-04-20 11:37:34.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/blktap/blktap.c       2009-04-20 11:37:34.000000000 +0200
 @@ -1222,7 +1222,7 @@ static void blkif_notify_work(blkif_t *b
        wake_up(&blkif->wq);
  }
@@ -10018,8 +10019,8 @@ Acked-by: jbeulich@novell.com
  {
        blkif_notify_work(dev_id);
        return IRQ_HANDLED;
---- sle11-2009-05-14.orig/drivers/xen/blktap/common.h  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blktap/common.h       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blktap/common.h  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blktap/common.h       2009-03-04 11:28:34.000000000 +0100
 @@ -113,7 +113,7 @@ void tap_blkif_interface_init(void);
  
  void tap_blkif_xenbus_init(void);
@@ -10029,8 +10030,8 @@ Acked-by: jbeulich@novell.com
  int tap_blkif_schedule(void *arg);
  
  int dom_to_devid(domid_t domid, int xenbus_id, blkif_t *blkif);
---- sle11-2009-05-14.orig/drivers/xen/console/console.c        2008-12-15 11:13:47.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/console/console.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/console/console.c        2008-12-15 11:13:47.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/console/console.c     2009-03-04 11:28:34.000000000 +0100
 @@ -361,7 +361,7 @@ static struct tty_struct *xencons_tty;
  static int xencons_priv_irq;
  static char x_char;
@@ -10076,8 +10077,8 @@ Acked-by: jbeulich@novell.com
        .open = xencons_open,
        .close = xencons_close,
        .write = xencons_write,
---- sle11-2009-05-14.orig/drivers/xen/console/xencons_ring.c   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/console/xencons_ring.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/console/xencons_ring.c   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/console/xencons_ring.c        2009-03-04 11:28:34.000000000 +0100
 @@ -83,7 +83,7 @@ int xencons_ring_send(const char *data, 
        return sent;
  }
@@ -10096,8 +10097,8 @@ Acked-by: jbeulich@novell.com
                cons++;
        }
  
---- sle11-2009-05-14.orig/drivers/xen/core/evtchn.c    2009-03-16 16:14:12.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/evtchn.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-03-16 16:14:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-03-04 11:28:34.000000000 +0100
 @@ -516,7 +516,7 @@ static void unbind_from_irq(unsigned int
  
  int bind_caller_port_to_irqhandler(
@@ -10278,8 +10279,8 @@ Acked-by: jbeulich@novell.com
 +                                            handle_level_irq, "level");
        }
  }
---- sle11-2009-05-14.orig/drivers/xen/core/reboot.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/core/reboot.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/reboot.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/reboot.c 2009-03-04 11:28:34.000000000 +0100
 @@ -14,6 +14,7 @@
  
  #ifdef HAVE_XEN_PLATFORM_COMPAT_H
@@ -10306,8 +10307,8 @@ Acked-by: jbeulich@novell.com
  {
        switch_shutdown_state(SHUTDOWN_SUSPEND);
        return IRQ_HANDLED;
---- sle11-2009-05-14.orig/drivers/xen/core/smpboot.c   2009-04-28 16:02:07.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/core/smpboot.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-04-28 16:02:07.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-03-04 11:28:34.000000000 +0100
 @@ -25,8 +25,8 @@
  #include <xen/cpu_hotplug.h>
  #include <xen/xenbus.h>
@@ -10328,8 +10329,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  void __init prefill_possible_map(void)
---- sle11-2009-05-14.orig/drivers/xen/fbfront/xenfb.c  2009-02-16 15:59:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/fbfront/xenfb.c       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenfb.c  2009-02-16 15:59:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenfb.c       2009-03-04 11:28:34.000000000 +0100
 @@ -524,8 +524,7 @@ static struct fb_ops xenfb_fb_ops = {
        .fb_set_par     = xenfb_set_par,
  };
@@ -10340,8 +10341,8 @@ Acked-by: jbeulich@novell.com
  {
        /*
         * No in events recognized, simply ignore them all.
---- sle11-2009-05-14.orig/drivers/xen/fbfront/xenkbd.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/fbfront/xenkbd.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenkbd.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenkbd.c      2009-03-04 11:28:34.000000000 +0100
 @@ -46,7 +46,7 @@ static void xenkbd_disconnect_backend(st
   * to do that.
   */
@@ -10351,8 +10352,8 @@ Acked-by: jbeulich@novell.com
  {
        struct xenkbd_info *info = dev_id;
        struct xenkbd_page *page = info->page;
---- sle11-2009-05-14.orig/drivers/xen/gntdev/gntdev.c  2008-12-15 11:13:45.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/gntdev/gntdev.c       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/gntdev/gntdev.c  2008-12-15 11:13:45.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/gntdev/gntdev.c       2009-03-04 11:28:34.000000000 +0100
 @@ -752,9 +752,6 @@ static pte_t gntdev_clear_pte(struct vm_
                BUG();
        }
@@ -10392,8 +10393,8 @@ Acked-by: jbeulich@novell.com
        }
  
        return copy;
---- sle11-2009-05-14.orig/drivers/xen/netback/accel.c  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netback/accel.c       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/accel.c  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/accel.c       2009-03-04 11:28:34.000000000 +0100
 @@ -65,7 +65,7 @@ static int match_accelerator(struct xenb
        
        if (IS_ERR(eth_name)) {
@@ -10403,8 +10404,8 @@ Acked-by: jbeulich@novell.com
                        __FUNCTION__, PTR_ERR(eth_name));
                return 0;
        } else {
---- sle11-2009-05-14.orig/drivers/xen/netback/common.h 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netback/common.h      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/common.h 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/common.h      2009-03-04 11:28:34.000000000 +0100
 @@ -200,7 +200,7 @@ void netif_deschedule_work(netif_t *neti
  
  int netif_be_start_xmit(struct sk_buff *skb, struct net_device *dev);
@@ -10414,8 +10415,8 @@ Acked-by: jbeulich@novell.com
  
  static inline int netbk_can_queue(struct net_device *dev)
  {
---- sle11-2009-05-14.orig/drivers/xen/netback/loopback.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netback/loopback.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/loopback.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/loopback.c    2009-03-04 11:28:34.000000000 +0100
 @@ -151,7 +151,7 @@ static int loopback_start_xmit(struct sk
        np->stats.rx_bytes += skb->len;
        np->stats.rx_packets++;
@@ -10425,8 +10426,8 @@ Acked-by: jbeulich@novell.com
                /* Defer checksum calculation. */
                skb->proto_csum_blank = 1;
                /* Must be a local packet: assert its integrity. */
---- sle11-2009-05-14.orig/drivers/xen/netback/netback.c        2008-12-23 09:31:07.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/netback/netback.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/netback.c        2008-12-23 09:31:07.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/netback.c     2009-03-04 11:28:34.000000000 +0100
 @@ -692,7 +692,7 @@ static void net_rx_action(unsigned long 
                id = meta[npo.meta_cons].id;
                flags = nr_frags ? NETRXF_more_data : 0;
@@ -10454,8 +10455,8 @@ Acked-by: jbeulich@novell.com
  {
        struct list_head *ent;
        netif_t *netif;
---- sle11-2009-05-14.orig/drivers/xen/netfront/netfront.c      2009-04-09 14:41:33.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netfront/netfront.c   2009-03-30 16:34:59.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-04-09 14:41:33.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-03-30 16:34:59.000000000 +0200
 @@ -136,7 +136,7 @@ static inline int netif_needs_gso(struct
  {
          return skb_is_gso(skb) &&
@@ -10492,8 +10493,8 @@ Acked-by: jbeulich@novell.com
  {
        struct net_device *dev = dev_id;
        struct netfront_info *np = netdev_priv(dev);
---- sle11-2009-05-14.orig/drivers/xen/pciback/pciback.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/pciback/pciback.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/pciback.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/pciback.h     2009-03-04 11:28:34.000000000 +0100
 @@ -87,7 +87,7 @@ int pciback_publish_pci_roots(struct pci
  void pciback_release_devices(struct pciback_device *pdev);
  
@@ -10503,8 +10504,8 @@ Acked-by: jbeulich@novell.com
  void pciback_do_op(void *data);
  
  int pciback_xenbus_register(void);
---- sle11-2009-05-14.orig/drivers/xen/pciback/pciback_ops.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/pciback/pciback_ops.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/pciback_ops.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/pciback_ops.c 2009-03-04 11:28:34.000000000 +0100
 @@ -107,7 +107,7 @@ void pciback_do_op(void *data)
        test_and_schedule_op(pdev);
  }
@@ -10514,8 +10515,8 @@ Acked-by: jbeulich@novell.com
  {
        struct pciback_device *pdev = dev_id;
  
---- sle11-2009-05-14.orig/drivers/xen/pcifront/pci_op.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/pcifront/pci_op.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pcifront/pci_op.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pcifront/pci_op.c     2009-03-04 11:28:34.000000000 +0100
 @@ -508,10 +508,16 @@ int __devinit pcifront_rescan_root(struc
  
                d = pci_scan_single_device(b, devfn);
@@ -10534,8 +10535,8 @@ Acked-by: jbeulich@novell.com
                }
        }
  
---- sle11-2009-05-14.orig/drivers/xen/privcmd/compat_privcmd.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/privcmd/compat_privcmd.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/privcmd/compat_privcmd.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/privcmd/compat_privcmd.c      2009-03-04 11:28:34.000000000 +0100
 @@ -18,7 +18,6 @@
   * Authors: Jimi Xenidis <jimix@watson.ibm.com>
   */
@@ -10544,8 +10545,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/compat.h>
  #include <linux/ioctl.h>
  #include <linux/syscalls.h>
---- sle11-2009-05-14.orig/drivers/xen/privcmd/privcmd.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/privcmd/privcmd.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/privcmd/privcmd.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/privcmd/privcmd.c     2009-03-04 11:28:34.000000000 +0100
 @@ -40,7 +40,7 @@ static int privcmd_enforce_singleshot_ma
  static long privcmd_ioctl(struct file *file,
                          unsigned int cmd, unsigned long data)
@@ -10614,8 +10615,8 @@ Acked-by: jbeulich@novell.com
        vma->vm_ops = &privcmd_vm_ops;
        vma->vm_private_data = NULL;
  
---- sle11-2009-05-14.orig/drivers/xen/scsiback/common.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsiback/common.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/common.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/common.h     2009-03-04 11:28:34.000000000 +0100
 @@ -142,7 +142,7 @@ typedef struct {
  #define VSCSIIF_TIMEOUT               (900*HZ)
  
@@ -10625,8 +10626,8 @@ Acked-by: jbeulich@novell.com
  int scsiback_init_sring(struct vscsibk_info *info,
                unsigned long ring_ref, unsigned int evtchn);
  int scsiback_schedule(void *data);
---- sle11-2009-05-14.orig/drivers/xen/scsiback/scsiback.c      2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsiback/scsiback.c   2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/scsiback.c      2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/scsiback.c   2009-03-04 11:28:34.000000000 +0100
 @@ -440,7 +440,7 @@ void scsiback_cmd_exec(pending_req_t *pe
        write = (data_dir == DMA_TO_DEVICE);
        rq = blk_get_request(pending_req->sdev->request_queue, write, GFP_KERNEL);
@@ -10645,8 +10646,8 @@ Acked-by: jbeulich@novell.com
  {
        scsiback_notify_work((struct vscsibk_info *)dev_id);
        return IRQ_HANDLED;
---- sle11-2009-05-14.orig/drivers/xen/scsifront/common.h       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsifront/common.h    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/common.h       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/common.h    2009-03-04 11:28:34.000000000 +0100
 @@ -122,7 +122,7 @@ struct vscsifrnt_info {
  int scsifront_xenbus_init(void);
  void scsifront_xenbus_unregister(void);
@@ -10656,8 +10657,8 @@ Acked-by: jbeulich@novell.com
  int scsifront_cmd_done(struct vscsifrnt_info *info);
  
  
---- sle11-2009-05-14.orig/drivers/xen/scsifront/scsifront.c    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsifront/scsifront.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/scsifront.c    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/scsifront.c 2009-03-04 11:28:34.000000000 +0100
 @@ -100,7 +100,7 @@ static void scsifront_do_request(struct 
                notify_remote_via_irq(irq);
  }
@@ -10667,8 +10668,8 @@ Acked-by: jbeulich@novell.com
  {
        scsifront_notify_work((struct vscsifrnt_info *)dev_id);
        return IRQ_HANDLED;
---- sle11-2009-05-14.orig/drivers/xen/sfc_netback/accel_xenbus.c       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/sfc_netback/accel_xenbus.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel_xenbus.c       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel_xenbus.c    2009-03-04 11:28:34.000000000 +0100
 @@ -68,8 +68,7 @@ static void unlink_bend(struct netback_a
  
  
@@ -10689,8 +10690,8 @@ Acked-by: jbeulich@novell.com
  {
        VPRINTK("netirq %d from device %s\n", irq,
                ((struct xenbus_device *)context)->nodename);
---- sle11-2009-05-14.orig/drivers/xen/sfc_netfront/accel.h     2009-04-09 14:41:38.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/sfc_netfront/accel.h  2009-03-30 16:34:56.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel.h     2009-04-09 14:41:38.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel.h  2009-03-30 16:34:56.000000000 +0200
 @@ -451,10 +451,8 @@ void netfront_accel_msg_tx_fastpath(netf
                                    u32 ip, u16 port, u8 protocol);
  
@@ -10704,8 +10705,8 @@ Acked-by: jbeulich@novell.com
  
  #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
  extern void netfront_accel_msg_from_bend(struct work_struct *context);
---- sle11-2009-05-14.orig/drivers/xen/sfc_netfront/accel_msg.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/sfc_netfront/accel_msg.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_msg.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_msg.c      2009-03-04 11:28:34.000000000 +0100
 @@ -490,8 +490,7 @@ void netfront_accel_msg_from_bend(void *
  }
  
@@ -10726,8 +10727,8 @@ Acked-by: jbeulich@novell.com
  {
        netfront_accel_vnic *vnic = (netfront_accel_vnic *)context;
        struct net_device *net_dev = vnic->net_dev;
---- sle11-2009-05-14.orig/drivers/xen/sfc_netfront/accel_tso.c 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/sfc_netfront/accel_tso.c      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_tso.c 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_tso.c      2009-03-04 11:28:34.000000000 +0100
 @@ -363,7 +363,7 @@ int netfront_accel_enqueue_skb_tso(netfr
  
        tso_check_safe(skb);
@@ -10737,8 +10738,8 @@ Acked-by: jbeulich@novell.com
                EPRINTK("Trying to TSO send a packet without HW checksum\n");
  
        tso_start(&state, skb);
---- sle11-2009-05-14.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-04-09 14:41:38.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:35:11.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-04-09 14:41:38.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:35:11.000000000 +0200
 @@ -461,7 +461,7 @@ netfront_accel_enqueue_skb_multi(netfron
  
        frag_i = -1;
@@ -10757,8 +10758,8 @@ Acked-by: jbeulich@novell.com
                /* Set to zero to encourage falcon to work it out for us */
                *(u16*)(skb->h.raw + skb->csum) = 0;
        }
---- sle11-2009-05-14.orig/drivers/xen/tpmback/common.h 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/tpmback/common.h      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/common.h 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/common.h      2009-03-04 11:28:34.000000000 +0100
 @@ -61,7 +61,7 @@ void tpmif_deschedule_work(tpmif_t * tpm
  void tpmif_xenbus_init(void);
  void tpmif_xenbus_exit(void);
@@ -10768,8 +10769,8 @@ Acked-by: jbeulich@novell.com
  
  long int tpmback_get_instance(struct backend_info *bi);
  
---- sle11-2009-05-14.orig/drivers/xen/tpmback/tpmback.c        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/tpmback/tpmback.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/tpmback.c        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/tpmback.c     2009-03-04 11:28:34.000000000 +0100
 @@ -502,7 +502,7 @@ static ssize_t vtpm_op_read(struct file 
                list_del(&pak->next);
                write_unlock_irqrestore(&dataex.pak_lock, flags);
@@ -10788,8 +10789,8 @@ Acked-by: jbeulich@novell.com
  {
        tpmif_t *tpmif = (tpmif_t *) dev_id;
  
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_comms.c    2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_comms.c 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_comms.c    2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_comms.c 2009-03-04 11:28:34.000000000 +0100
 @@ -55,7 +55,7 @@ static DECLARE_WORK(probe_work, xenbus_p
  
  static DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
@@ -10799,8 +10800,8 @@ Acked-by: jbeulich@novell.com
  {
        if (unlikely(xenstored_ready == 0)) {
                xenstored_ready = 1;
---- sle11-2009-05-14.orig/drivers/xen/xenoprof/xenoprofile.c   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/xenoprof/xenoprofile.c        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenoprof/xenoprofile.c   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenoprof/xenoprofile.c        2009-03-04 11:28:34.000000000 +0100
 @@ -194,8 +194,7 @@ done:
                oprofile_add_domain_switch(COORDINATOR_DOMAIN);
  }
@@ -10811,8 +10812,8 @@ Acked-by: jbeulich@novell.com
  {
        struct xenoprof_buf * buf;
        static unsigned long flag;
---- sle11-2009-05-14.orig/include/asm-generic/pgtable.h        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/include/asm-generic/pgtable.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-generic/pgtable.h        2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/include/asm-generic/pgtable.h     2009-03-04 11:28:34.000000000 +0100
 @@ -100,7 +100,7 @@ static inline void ptep_set_wrprotect(st
  #endif
  
@@ -10822,8 +10823,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  #ifndef __HAVE_ARCH_PTE_SAME
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/desc_32.h    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_32.h    2009-03-04 11:28:34.000000000 +0100
 @@ -32,52 +32,110 @@ static inline struct desc_struct *get_cp
        return (struct desc_struct *)per_cpu(cpu_gdt_descr, cpu).address;
  }
@@ -10984,8 +10985,8 @@ Acked-by: jbeulich@novell.com
  static inline void clear_LDT(void)
  {
        int cpu = get_cpu();
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-04 11:28:34.000000000 +0100
 @@ -55,7 +55,7 @@ enum fixed_addresses {
  #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
@@ -11007,8 +11008,8 @@ Acked-by: jbeulich@novell.com
  
  #define set_fixmap(idx, phys) \
                __set_fixmap(idx, phys, PAGE_KERNEL)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/hypercall_32.h  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/hypercall_32.h       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypercall_32.h  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall_32.h       2009-03-04 11:28:34.000000000 +0100
 @@ -128,6 +128,23 @@
        __res;                                                  \
  })
@@ -11079,8 +11080,8 @@ Acked-by: jbeulich@novell.com
        return _hypercall3(int, grant_table_op, cmd, uop, count);
  }
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/hypercall_64.h  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/hypercall_64.h       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypercall_64.h  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall_64.h       2009-03-04 11:28:34.000000000 +0100
 @@ -134,6 +134,23 @@
        __res;                                                  \
  })
@@ -11150,8 +11151,8 @@ Acked-by: jbeulich@novell.com
        return _hypercall3(int, grant_table_op, cmd, uop, count);
  }
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-04 11:28:34.000000000 +0100
 @@ -43,6 +43,7 @@
  #include <xen/interface/physdev.h>
  #include <xen/interface/sched.h>
@@ -11224,8 +11225,8 @@ Acked-by: jbeulich@novell.com
  static inline int
  HYPERVISOR_yield(
        void)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-04 11:28:34.000000000 +0100
 @@ -53,7 +53,6 @@ static inline int pte_exec_kernel(pte_t 
   * not possible, use pte_get_and_clear to obtain the old pte
   * value and then use set_pte to update it.  -ben
@@ -11282,8 +11283,8 @@ Acked-by: jbeulich@novell.com
  static inline int pte_same(pte_t a, pte_t b)
  {
        return a.pte_low == b.pte_low && a.pte_high == b.pte_high;
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:13:45.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:13:45.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-04 11:28:34.000000000 +0100
 @@ -260,31 +260,89 @@ static inline pte_t pte_mkhuge(pte_t pte
  # include <asm/pgtable-2level.h>
  #endif
@@ -11494,8 +11495,8 @@ Acked-by: jbeulich@novell.com
  #include <asm-generic/pgtable.h>
  
  #endif /* _I386_PGTABLE_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_32.h       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2009-03-04 11:28:34.000000000 +0100
 @@ -146,6 +146,18 @@ static inline void detect_ht(struct cpui
  #define X86_EFLAGS_VIP        0x00100000 /* Virtual Interrupt Pending */
  #define X86_EFLAGS_ID 0x00200000 /* CPUID detection flag */
@@ -11607,8 +11608,8 @@ Acked-by: jbeulich@novell.com
  /* from system description table in BIOS.  Mostly for MCA use, but
  others may find it useful. */
  extern unsigned int machine_id;
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/segment_32.h 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment_32.h 2009-03-04 11:28:34.000000000 +0100
 @@ -61,11 +61,9 @@
  
  #define GDT_ENTRY_KERNEL_CS           (GDT_ENTRY_KERNEL_BASE + 0)
@@ -11650,8 +11651,8 @@ Acked-by: jbeulich@novell.com
 +
 +#define get_kernel_rpl()  (xen_feature(XENFEAT_supervisor_mode_kernel)?0:1)
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-04 11:28:34.000000000 +0100
 @@ -79,25 +79,36 @@ static inline int hard_smp_processor_id(
        return GET_APIC_ID(*(unsigned long *)(APIC_BASE+APIC_ID));
  }
@@ -11696,8 +11697,8 @@ Acked-by: jbeulich@novell.com
 +#endif
 +
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/system_32.h  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_32.h  2009-03-04 11:28:34.000000000 +0100
 @@ -267,6 +267,9 @@ static inline unsigned long __xchg(unsig
  #define cmpxchg(ptr,o,n)\
        ((__typeof__(*(ptr)))__cmpxchg((ptr),(unsigned long)(o),\
@@ -11748,8 +11749,8 @@ Acked-by: jbeulich@novell.com
  #ifndef CONFIG_X86_CMPXCHG
  /*
   * Building a kernel capable running on 80386. It may be necessary to
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-03-04 11:28:34.000000000 +0100
 @@ -8,8 +8,6 @@
  #define __flush_tlb_global() xen_tlb_flush()
  #define __flush_tlb_all() xen_tlb_flush()
@@ -11759,8 +11760,8 @@ Acked-by: jbeulich@novell.com
  #define cpu_has_invlpg        (boot_cpu_data.x86 > 3)
  
  #define __flush_tlb_single(addr) xen_invlpg(addr)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-03-04 11:28:34.000000000 +0100
 @@ -55,13 +55,6 @@ extern dma_addr_t bad_dma_address;
  extern struct dma_mapping_ops* dma_ops;
  extern int iommu_merge;
@@ -11775,8 +11776,8 @@ Acked-by: jbeulich@novell.com
  #if 0
  static inline int dma_mapping_error(dma_addr_t dma_addr)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-04 11:28:34.000000000 +0100
 @@ -41,7 +41,7 @@ enum fixed_addresses {
  #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
@@ -11786,8 +11787,8 @@ Acked-by: jbeulich@novell.com
        FIX_IO_APIC_BASE_0,
        FIX_IO_APIC_BASE_END = FIX_IO_APIC_BASE_0 + MAX_IO_APICS-1,
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-04 11:28:34.000000000 +0100
 @@ -44,12 +44,9 @@ extern unsigned long __supported_pte_mas
  
  #define swapper_pg_dir init_level4_pgt
@@ -11966,8 +11967,8 @@ Acked-by: jbeulich@novell.com
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
  #define __HAVE_ARCH_PTEP_CLEAR_FLUSH
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_64.h       2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_64.h       2009-03-04 11:28:34.000000000 +0100
 @@ -484,6 +484,8 @@ static inline void __mwait(unsigned long
                : :"a" (eax), "c" (ecx));
  }
@@ -11977,8 +11978,8 @@ Acked-by: jbeulich@novell.com
  #define stack_current() \
  ({                                                            \
        struct thread_info *ti;                                 \
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-04 11:28:34.000000000 +0100
 @@ -4,15 +4,12 @@
  /*
   * We need the APIC definitions automatically as part of 'smp.h'
@@ -12084,8 +12085,8 @@ Acked-by: jbeulich@novell.com
 +#endif /* !CONFIG_SMP */
  #endif
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/system_64.h  2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_64.h  2009-03-04 11:28:34.000000000 +0100
 @@ -24,6 +24,7 @@
  #define __EXTRA_CLOBBER  \
        ,"rcx","rbx","rdx","r8","r9","r10","r11","r12","r13","r14","r15"
@@ -12094,8 +12095,8 @@ Acked-by: jbeulich@novell.com
  #define switch_to(prev,next,last) \
        asm volatile(SAVE_CONTEXT                                                   \
                     "movq %%rsp,%P[threadrsp](%[prev])\n\t" /* save RSP */       \
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-03-04 11:28:34.000000000 +0100
 @@ -12,9 +12,6 @@
   */
  #define __flush_tlb_global()  xen_tlb_flush()
@@ -12106,8 +12107,8 @@ Acked-by: jbeulich@novell.com
  #define __flush_tlb_all() __flush_tlb_global()
  
  #define __flush_tlb_one(addr) xen_invlpg((unsigned long)addr)
---- sle11-2009-05-14.orig/include/linux/skbuff.h       2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/include/linux/skbuff.h    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/skbuff.h       2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/include/linux/skbuff.h    2009-03-04 11:28:34.000000000 +0100
 @@ -1771,5 +1771,12 @@ static inline void skb_forward_csum(stru
  }
  
@@ -12121,8 +12122,8 @@ Acked-by: jbeulich@novell.com
 +
  #endif        /* __KERNEL__ */
  #endif        /* _LINUX_SKBUFF_H */
---- sle11-2009-05-14.orig/include/xen/evtchn.h 2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/xen/evtchn.h      2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/evtchn.h 2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/xen/evtchn.h      2009-03-04 11:28:34.000000000 +0100
 @@ -54,34 +54,34 @@
   */
  int bind_caller_port_to_irqhandler(
@@ -12163,8 +12164,8 @@ Acked-by: jbeulich@novell.com
        unsigned long irqflags,
        const char *devname,
        void *dev_id);
---- sle11-2009-05-14.orig/include/xen/xencons.h        2009-05-14 11:02:43.000000000 +0200
-+++ sle11-2009-05-14/include/xen/xencons.h     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/xencons.h        2009-10-28 14:55:12.000000000 +0100
++++ sle11-2009-10-16/include/xen/xencons.h     2009-03-04 11:28:34.000000000 +0100
 @@ -8,7 +8,7 @@ void xencons_force_flush(void);
  void xencons_resume(void);
  
@@ -12174,8 +12175,8 @@ Acked-by: jbeulich@novell.com
  void xencons_tx(void);
  
  int xencons_ring_init(void);
---- sle11-2009-05-14.orig/mm/mprotect.c        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/mm/mprotect.c     2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/mm/mprotect.c        2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/mm/mprotect.c     2009-03-04 11:28:34.000000000 +0100
 @@ -92,7 +92,7 @@ static inline void change_pmd_range(stru
                next = pmd_addr_end(addr, end);
                if (pmd_none_or_clear_bad(pmd))
@@ -12185,8 +12186,8 @@ Acked-by: jbeulich@novell.com
                        continue;
                change_pte_range(mm, pmd, addr, next, newprot, dirty_accountable);
        } while (pmd++, addr = next, addr != end);
---- sle11-2009-05-14.orig/net/core/dev.c       2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/net/core/dev.c    2009-03-04 11:28:34.000000000 +0100
+--- sle11-2009-10-16.orig/net/core/dev.c       2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/net/core/dev.c    2009-03-04 11:28:34.000000000 +0100
 @@ -1765,15 +1765,14 @@ inline int skb_checksum_setup(struct sk_
                }
                if ((skb->h.raw + skb->csum + 2) > skb->tail)
similarity index 94%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.20
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.20
index 88c02c9f09ea9a171734ab7823f78c0c7d538256..394600b55647194fa53365dcb30f4cc86d516a04 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.20" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-06-29.orig/arch/x86/Kconfig     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig  2009-02-05 10:22:19.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-02-05 10:22:19.000000000 +0100
 @@ -1431,7 +1431,7 @@ config PHYSICAL_START
  
  config RELOCATABLE
@@ -17,8 +17,8 @@ Acked-by: jbeulich@novell.com
        help
          This builds a kernel image that retains relocation information
          so it can be loaded someplace besides the default 1MB.
---- sle11-2009-06-29.orig/arch/x86/kernel/asm-offsets_32.c     2008-11-25 12:35:53.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/asm-offsets_32.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/asm-offsets_32.c     2008-11-25 12:35:53.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/asm-offsets_32.c  2008-12-15 11:26:44.000000000 +0100
 @@ -54,6 +54,7 @@ void foo(void)
        OFFSET(TI_exec_domain, thread_info, exec_domain);
        OFFSET(TI_flags, thread_info, flags);
@@ -39,8 +39,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_PARAVIRT
        BLANK();
        OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled);
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/common-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -22,6 +22,7 @@
  #define phys_pkg_id(a,b) a
  #endif
@@ -438,8 +438,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_HOTPLUG_CPU
  void __cpuinit cpu_uninit(void)
  {
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/mtrr/main-xen.c       2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/mtrr/main-xen.c       2008-12-15 11:26:44.000000000 +0100
 @@ -12,7 +12,7 @@
  static DEFINE_MUTEX(mtrr_mutex);
  
@@ -460,7 +460,7 @@ Acked-by: jbeulich@novell.com
        struct xen_platform_op op;
  
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/e820_32-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2008-12-15 11:26:44.000000000 +0100
 @@ -0,0 +1,1015 @@
 +#include <linux/kernel.h>
 +#include <linux/types.h>
@@ -1477,8 +1477,8 @@ Acked-by: jbeulich@novell.com
 +      return 0;
 +}
 +early_param("memmap", parse_memmap);
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:07:47.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:08:06.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:07:47.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:08:06.000000000 +0200
 @@ -30,12 +30,13 @@
   *    18(%esp) - %eax
   *    1C(%esp) - %ds
@@ -2249,8 +2249,8 @@ Acked-by: jbeulich@novell.com
  ENTRY(fixup_4gb_segment)
        RING0_EC_FRAME
        pushl $do_fixup_4gb_segment
---- sle11-2009-06-29.orig/arch/x86/kernel/head_32-xen.S        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head_32-xen.S     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2008-12-15 11:26:44.000000000 +0100
 @@ -9,6 +9,7 @@
  #include <asm/cache.h>
  #include <asm/thread_info.h>
@@ -2367,8 +2367,8 @@ Acked-by: jbeulich@novell.com
        .ascii  ",FEATURES=writable_page_tables"
        .ascii           "|writable_descriptor_tables"
        .ascii           "|auto_translated_physmap"
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_32-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -34,6 +34,7 @@
  #include <linux/pci.h>
  #include <linux/msi.h>
@@ -2561,8 +2561,8 @@ Acked-by: jbeulich@novell.com
        set_native_irq_info(irq, TARGET_CPUS);
        spin_unlock_irqrestore(&ioapic_lock, flags);
  
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ldt_32-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_32-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -177,16 +177,14 @@ static int read_default_ldt(void __user 
  {
        int err;
@@ -2581,8 +2581,8 @@ Acked-by: jbeulich@novell.com
                err = -EFAULT;
  
        return err;
---- sle11-2009-06-29.orig/arch/x86/kernel/microcode-xen.c      2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/microcode-xen.c   2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2008-12-15 11:26:44.000000000 +0100
 @@ -1,7 +1,7 @@
  /*
   *    Intel CPU Microcode Update Driver for Linux
@@ -2610,8 +2610,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_32-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -36,7 +36,7 @@
  
  /* Have we found an MP table */
@@ -2661,8 +2661,8 @@ Acked-by: jbeulich@novell.com
  {
        struct mpc_config_processor processor;
        int boot_cpu = 0;
---- sle11-2009-06-29.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/pci-dma-xen.c     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2008-12-15 11:26:44.000000000 +0100
 @@ -276,7 +276,7 @@ EXPORT_SYMBOL(dma_free_coherent);
  int dma_declare_coherent_memory(struct device *dev, dma_addr_t bus_addr,
                                dma_addr_t device_addr, size_t size, int flags)
@@ -2698,8 +2698,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  EXPORT_SYMBOL(dma_declare_coherent_memory);
---- sle11-2009-06-29.orig/arch/x86/kernel/process_32-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_32-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -60,6 +60,7 @@
  
  #include <asm/tlbflush.h>
@@ -2824,8 +2824,8 @@ Acked-by: jbeulich@novell.com
        return prev_p;
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/quirks-xen.c 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/quirks-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/quirks-xen.c 2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/quirks-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -3,10 +3,12 @@
   */
  #include <linux/pci.h>
@@ -2922,8 +2922,8 @@ Acked-by: jbeulich@novell.com
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,   PCI_DEVICE_ID_INTEL_E7520_MCH,  verify_quirk_intel_irqbalance);
 +
  #endif
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_32-xen.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_32-xen.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2008-12-15 11:26:44.000000000 +0100
 @@ -76,9 +76,6 @@
  #include <xen/interface/kexec.h>
  #endif
@@ -4010,8 +4010,8 @@ Acked-by: jbeulich@novell.com
  
        if (is_initial_xendomain()) {
  #ifdef CONFIG_VT
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_32-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -659,6 +659,10 @@ int smp_call_function_single(int cpu, vo
                put_cpu();
                return -EBUSY;
@@ -4023,8 +4023,8 @@ Acked-by: jbeulich@novell.com
        spin_lock_bh(&call_lock);
        __smp_call_function_single(cpu, func, info, nonatomic, wait);
        spin_unlock_bh(&call_lock);
---- sle11-2009-06-29.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:08:00.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/time_32-xen.c     2009-03-24 10:08:30.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:20.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:31.000000000 +0100
 @@ -61,6 +61,7 @@
  #include <asm/uaccess.h>
  #include <asm/processor.h>
@@ -4059,7 +4059,7 @@ Acked-by: jbeulich@novell.com
        spin_unlock_irqrestore(&rtc_lock, flags);
  
        return retval;
-@@ -873,10 +871,7 @@ unsigned long get_cmos_time(void)
+@@ -874,10 +872,7 @@ unsigned long get_cmos_time(void)
  
        spin_lock_irqsave(&rtc_lock, flags);
  
@@ -4071,7 +4071,7 @@ Acked-by: jbeulich@novell.com
  
        spin_unlock_irqrestore(&rtc_lock, flags);
  
-@@ -978,7 +973,7 @@ static void __init hpet_time_init(void)
+@@ -979,7 +974,7 @@ static void __init hpet_time_init(void)
                printk("Using HPET for base-timer\n");
        }
  
@@ -4080,8 +4080,8 @@ Acked-by: jbeulich@novell.com
  }
  #endif
  
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_32-xen.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_32-xen.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2008-12-15 11:26:44.000000000 +0100
 @@ -29,6 +29,8 @@
  #include <linux/kexec.h>
  #include <linux/unwind.h>
@@ -4418,8 +4418,8 @@ Acked-by: jbeulich@novell.com
 -}
 -__setup("call_trace=", call_trace_setup);
 -#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/vmlinux_32.lds.S     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/vmlinux_32.lds.S  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vmlinux_32.lds.S     2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vmlinux_32.lds.S  2008-12-15 11:26:44.000000000 +0100
 @@ -29,6 +29,12 @@ PHDRS {
  SECTIONS
  {
@@ -4433,8 +4433,8 @@ Acked-by: jbeulich@novell.com
    phys_startup_32 = startup_32 - LOAD_OFFSET;
  
    .text.head : AT(ADDR(.text.head) - LOAD_OFFSET) {
---- sle11-2009-06-29.orig/arch/x86/kvm/Kconfig 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kvm/Kconfig      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kvm/Kconfig 2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kvm/Kconfig      2008-12-15 11:26:44.000000000 +0100
 @@ -7,6 +7,7 @@ config HAVE_KVM
  menuconfig VIRTUALIZATION
        bool "Virtualization"
@@ -4443,8 +4443,8 @@ Acked-by: jbeulich@novell.com
        default y
        ---help---
          Say Y here to get to see options for using your Linux host to run other
---- sle11-2009-06-29.orig/arch/x86/mm/fault_32-xen.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/fault_32-xen.c        2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2008-12-15 11:26:44.000000000 +0100
 @@ -22,9 +22,9 @@
  #include <linux/highmem.h>
  #include <linux/module.h>
@@ -4489,8 +4489,8 @@ Acked-by: jbeulich@novell.com
                                break;
                        prefetch = (instr_lo == 0xF) &&
                                (opcode == 0x0D || opcode == 0x18);
---- sle11-2009-06-29.orig/arch/x86/mm/highmem_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/highmem_32-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -32,7 +32,7 @@ static void *__kmap_atomic(struct page *
        unsigned long vaddr;
  
@@ -4545,8 +4545,8 @@ Acked-by: jbeulich@novell.com
  
        idx = type + KM_TYPE_NR*smp_processor_id();
        vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
---- sle11-2009-06-29.orig/arch/x86/mm/init_32-xen.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_32-xen.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2008-12-15 11:26:44.000000000 +0100
 @@ -233,8 +233,6 @@ static inline int page_kills_ppro(unsign
  
  #endif
@@ -4607,8 +4607,8 @@ Acked-by: jbeulich@novell.com
  
  void __init pgtable_cache_init(void)
  {
---- sle11-2009-06-29.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pgtable_32-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -203,7 +203,7 @@ void pte_free(struct page *pte)
        __free_page(pte);
  }
@@ -4636,8 +4636,8 @@ Acked-by: jbeulich@novell.com
  {
        unsigned long flags; /* can be called from interrupt context */
  
---- sle11-2009-06-29.orig/arch/x86/pci/irq-xen.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/pci/irq-xen.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2008-12-15 11:26:44.000000000 +0100
 @@ -768,7 +768,7 @@ static void __init pirq_find_router(stru
        DBG(KERN_DEBUG "PCI: Attempting to find IRQ router for %04x:%04x\n",
            rt->rtr_vendor, rt->rtr_device);
@@ -4656,8 +4656,8 @@ Acked-by: jbeulich@novell.com
  }
  
  static struct irq_info *pirq_get_info(struct pci_dev *dev)
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_64-xen.S       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_64-xen.S    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2008-12-15 11:26:44.000000000 +0100
 @@ -261,7 +261,6 @@ ENTRY(system_call)
        movq  %rax,ORIG_RAX-ARGOFFSET(%rsp) 
        GET_THREAD_INFO(%rcx)
@@ -4795,8 +4795,8 @@ Acked-by: jbeulich@novell.com
 -      CFI_ENDPROC
 -ENDPROC(arch_unwind_init_running)
 -#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/genapic_64-xen.c     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/genapic_64-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -34,6 +34,7 @@ extern struct genapic apic_physflat;
  
  #ifndef CONFIG_XEN
@@ -4819,8 +4819,8 @@ Acked-by: jbeulich@novell.com
  #if defined(CONFIG_ACPI)
        /*
         * Some x86_64 machines use physical APIC mode regardless of how many
---- sle11-2009-06-29.orig/arch/x86/kernel/head64-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head64-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -104,7 +104,10 @@ void __init x86_64_start_kernel(char * r
                machine_to_phys_order++;
  
@@ -4833,8 +4833,8 @@ Acked-by: jbeulich@novell.com
                set_intr_gate(i, early_idt_handler);
        asm volatile("lidt %0" :: "m" (idt_descr));
  #endif
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_64-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -202,14 +202,20 @@ static struct IO_APIC_route_entry ioapic
   * the interrupt, and we need to make sure the entry is fully populated
   * before that happens.
@@ -5027,8 +5027,8 @@ Acked-by: jbeulich@novell.com
                }
  
        }
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_64-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_64-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -120,7 +120,7 @@ asmlinkage unsigned int do_IRQ(struct pt
  
        if (likely(irq < NR_IRQS))
@@ -5038,8 +5038,8 @@ Acked-by: jbeulich@novell.com
                printk(KERN_EMERG "%s: %d.%d No irq handler for irq\n",
                        __func__, smp_processor_id(), irq);
  
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_64-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -35,8 +35,6 @@
  int smp_found_config;
  unsigned int __initdata maxcpus = NR_CPUS;
@@ -5049,8 +5049,8 @@ Acked-by: jbeulich@novell.com
  /*
   * Various Linux-internal data structures created from the
   * MP-table.
---- sle11-2009-06-29.orig/arch/x86/kernel/process_64-xen.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_64-xen.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2008-12-15 11:26:44.000000000 +0100
 @@ -119,29 +119,23 @@ void exit_idle(void)
  static void poll_idle (void)
  {
@@ -5105,8 +5105,8 @@ Acked-by: jbeulich@novell.com
                        enter_idle();
                        idle();
                        /* In many cases the interrupt that ended idle
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_64-xen.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_64-xen.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2008-12-15 11:26:44.000000000 +0100
 @@ -573,8 +573,7 @@ void __init setup_arch(char **cmdline_p)
        if (LOADER_TYPE && INITRD_START) {
                if (INITRD_START + INITRD_SIZE <= (end_pfn << PAGE_SHIFT)) {
@@ -5159,8 +5159,8 @@ Acked-by: jbeulich@novell.com
        c->x86_max_cores = intel_num_cpu_cores(c);
  
        srat_detect_node();
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_64-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_64-xen.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2008-12-15 11:26:44.000000000 +0100
 @@ -384,12 +384,17 @@ int smp_call_function_single (int cpu, v
                put_cpu();
                return 0;
@@ -5179,8 +5179,8 @@ Acked-by: jbeulich@novell.com
  
  /*
   * this function sends a 'generic call function' IPI to all other CPUs
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_64-xen.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_64-xen.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2008-12-15 11:26:44.000000000 +0100
 @@ -30,9 +30,10 @@
  #include <linux/kprobes.h>
  #include <linux/kexec.h>
@@ -5406,8 +5406,8 @@ Acked-by: jbeulich@novell.com
 -}
 -early_param("call_trace", call_trace_setup);
 -#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/vsyscall_64-xen.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2008-12-15 11:26:44.000000000 +0100
 @@ -42,6 +42,7 @@
  #include <asm/topology.h>
  
@@ -5449,8 +5449,8 @@ Acked-by: jbeulich@novell.com
        __set_fixmap(VSYSCALL_FIRST_PAGE, physaddr_page0, PAGE_KERNEL_VSYSCALL);
  }
  
---- sle11-2009-06-29.orig/arch/x86/mm/fault_64-xen.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/fault_64-xen.c        2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2008-12-15 11:26:44.000000000 +0100
 @@ -23,9 +23,9 @@
  #include <linux/compiler.h>
  #include <linux/module.h>
@@ -5498,8 +5498,8 @@ Acked-by: jbeulich@novell.com
  } 
  
  void dump_pagetable(unsigned long address)
---- sle11-2009-06-29.orig/arch/x86/mm/init_64-xen.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_64-xen.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2008-12-15 11:26:44.000000000 +0100
 @@ -1127,14 +1127,15 @@ static __init int x8664_sysctl_init(void
  __initcall(x8664_sysctl_init);
  #endif
@@ -5519,8 +5519,8 @@ Acked-by: jbeulich@novell.com
  };
  
  struct vm_area_struct *get_gate_vma(struct task_struct *tsk)
---- sle11-2009-06-29.orig/arch/x86/mm/pageattr_64-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pageattr_64-xen.c     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2008-12-15 11:26:44.000000000 +0100
 @@ -330,34 +330,40 @@ static struct page *split_large_page(uns
        return base;
  } 
@@ -5607,8 +5607,8 @@ Acked-by: jbeulich@novell.com
        } 
  } 
  
---- sle11-2009-06-29.orig/drivers/pci/msi-xen.c        2009-04-24 13:31:56.000000000 +0200
-+++ sle11-2009-06-29/drivers/pci/msi-xen.c     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-04-24 13:31:56.000000000 +0200
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2008-12-15 11:26:44.000000000 +0100
 @@ -263,10 +263,8 @@ void disable_msi_mode(struct pci_dev *de
                pci_write_config_word(dev, msi_control_reg(pos), control);
                dev->msix_enabled = 0;
@@ -5635,8 +5635,8 @@ Acked-by: jbeulich@novell.com
  }
  
  #ifdef CONFIG_PM
---- sle11-2009-06-29.orig/drivers/xen/balloon/balloon.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/balloon/balloon.c     2009-06-29 15:28:36.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/balloon/balloon.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/balloon/balloon.c     2009-06-29 15:28:36.000000000 +0200
 @@ -97,8 +97,8 @@ extern unsigned long totalhigh_pages;
  static LIST_HEAD(ballooned_pages);
  
@@ -5657,8 +5657,8 @@ Acked-by: jbeulich@novell.com
  {
        int need_sleep = 0;
        long credit;
---- sle11-2009-06-29.orig/drivers/xen/blkback/blkback.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkback/blkback.c     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/blkback.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/blkback.c     2008-12-15 11:26:44.000000000 +0100
 @@ -37,6 +37,7 @@
  
  #include <linux/spinlock.h>
@@ -5667,8 +5667,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/list.h>
  #include <linux/delay.h>
  #include <xen/balloon.h>
---- sle11-2009-06-29.orig/drivers/xen/blkback/interface.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/blkback/interface.c   2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/interface.c      2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/interface.c   2008-12-15 11:26:44.000000000 +0100
 @@ -34,7 +34,7 @@
  #include <xen/evtchn.h>
  #include <linux/kthread.h>
@@ -5678,8 +5678,8 @@ Acked-by: jbeulich@novell.com
  
  blkif_t *blkif_alloc(domid_t domid)
  {
---- sle11-2009-06-29.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:16.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:27.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:16.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:27.000000000 +0100
 @@ -71,7 +71,7 @@ static int setup_blkring(struct xenbus_d
  static void kick_pending_request_queues(struct blkfront_info *);
  
@@ -5710,8 +5710,8 @@ Acked-by: jbeulich@novell.com
        spin_lock_irq(&blkif_io_lock);
        if (info->connected == BLKIF_STATE_CONNECTED)
                kick_pending_request_queues(info);
---- sle11-2009-06-29.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:37:34.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/blktap/blktap.c       2009-04-20 11:37:50.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:37:34.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/blktap/blktap.c       2009-04-20 11:37:50.000000000 +0200
 @@ -40,6 +40,7 @@
  
  #include <linux/spinlock.h>
@@ -5720,8 +5720,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/list.h>
  #include <asm/hypervisor.h>
  #include "common.h"
---- sle11-2009-06-29.orig/drivers/xen/blktap/interface.c       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/blktap/interface.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blktap/interface.c       2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blktap/interface.c    2008-12-15 11:26:44.000000000 +0100
 @@ -34,7 +34,7 @@
  #include "common.h"
  #include <xen/evtchn.h>
@@ -5731,8 +5731,8 @@ Acked-by: jbeulich@novell.com
  
  blkif_t *tap_alloc_blkif(domid_t domid)
  {
---- sle11-2009-06-29.orig/drivers/xen/char/mem.c       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/char/mem.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/char/mem.c       2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/char/mem.c    2008-12-15 11:26:44.000000000 +0100
 @@ -157,7 +157,7 @@ static loff_t memory_lseek(struct file *
  {
        loff_t ret;
@@ -5751,8 +5751,8 @@ Acked-by: jbeulich@novell.com
        return ret;
  }
  
---- sle11-2009-06-29.orig/drivers/xen/console/console.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/console/console.c     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/console/console.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/console/console.c     2008-12-15 11:26:44.000000000 +0100
 @@ -85,11 +85,6 @@ static int xc_num = -1;
  #define XEN_HVC_MAJOR 229
  #define XEN_HVC_MINOR 0
@@ -5787,8 +5787,8 @@ Acked-by: jbeulich@novell.com
                        if (buf[i] == '\x0f') { /* ^O */
                                if (!sysrq_requested) {
                                        sysrq_requested = jiffies;
---- sle11-2009-06-29.orig/drivers/xen/core/reboot.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/reboot.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/reboot.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/reboot.c 2008-12-15 11:26:44.000000000 +0100
 @@ -34,8 +34,8 @@ static int suspend_cancelled;
  /* Can we leave APs online when we suspend? */
  static int fast_suspend;
@@ -5824,8 +5824,8 @@ Acked-by: jbeulich@novell.com
  {
        int err;
  
---- sle11-2009-06-29.orig/drivers/xen/core/smpboot.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/smpboot.c        2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2008-12-15 11:26:44.000000000 +0100
 @@ -161,7 +161,12 @@ static void xen_smp_intr_exit(unsigned i
  
  void __cpuinit cpu_bringup(void)
@@ -5878,8 +5878,8 @@ Acked-by: jbeulich@novell.com
  #ifdef __x86_64__
                cpu_pda(cpu)->pcurrent = idle;
                cpu_pda(cpu)->cpunumber = cpu;
---- sle11-2009-06-29.orig/drivers/xen/fbfront/xenfb.c  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/fbfront/xenfb.c       2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenfb.c  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenfb.c       2008-12-15 11:26:44.000000000 +0100
 @@ -25,6 +25,7 @@
  #include <linux/vmalloc.h>
  #include <linux/mm.h>
@@ -5888,8 +5888,8 @@ Acked-by: jbeulich@novell.com
  #include <asm/hypervisor.h>
  #include <xen/evtchn.h>
  #include <xen/interface/io/fbif.h>
---- sle11-2009-06-29.orig/drivers/xen/netback/loopback.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/netback/loopback.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/loopback.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/loopback.c    2008-12-15 11:26:44.000000000 +0100
 @@ -54,6 +54,7 @@
  #include <net/dst.h>
  #include <net/xfrm.h>         /* secpath_reset() */
@@ -5898,8 +5898,8 @@ Acked-by: jbeulich@novell.com
  
  static int nloopbacks = -1;
  module_param(nloopbacks, int, 0);
---- sle11-2009-06-29.orig/drivers/xen/pciback/conf_space_header.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/pciback/conf_space_header.c   2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/conf_space_header.c      2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/conf_space_header.c   2008-12-15 11:26:44.000000000 +0100
 @@ -22,14 +22,14 @@ static int command_write(struct pci_dev 
  {
        int err;
@@ -5917,8 +5917,8 @@ Acked-by: jbeulich@novell.com
                if (unlikely(verbose_request))
                        printk(KERN_DEBUG "pciback: %s: disable\n",
                               pci_name(dev));
---- sle11-2009-06-29.orig/drivers/xen/pciback/pciback.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/pciback/pciback.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/pciback.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/pciback.h     2008-12-15 11:26:44.000000000 +0100
 @@ -88,7 +88,7 @@ void pciback_release_devices(struct pcib
  
  /* Handles events from front-end */
@@ -5928,8 +5928,8 @@ Acked-by: jbeulich@novell.com
  
  int pciback_xenbus_register(void);
  void pciback_xenbus_unregister(void);
---- sle11-2009-06-29.orig/drivers/xen/pciback/pciback_ops.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/pciback/pciback_ops.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/pciback_ops.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/pciback_ops.c 2008-12-15 11:26:44.000000000 +0100
 @@ -25,7 +25,7 @@ void pciback_reset_device(struct pci_dev
  
                pci_write_config_word(dev, PCI_COMMAND, 0);
@@ -5951,8 +5951,8 @@ Acked-by: jbeulich@novell.com
        struct pci_dev *dev;
        struct xen_pci_op *op = &pdev->sh_info->op;
  
---- sle11-2009-06-29.orig/drivers/xen/pciback/xenbus.c 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/pciback/xenbus.c      2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/xenbus.c 2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/xenbus.c      2008-12-15 11:26:44.000000000 +0100
 @@ -32,7 +32,7 @@ static struct pciback_device *alloc_pdev
        pdev->evtchn_irq = INVALID_EVTCHN_IRQ;
        pdev->be_watching = 0;
@@ -5970,8 +5970,8 @@ Acked-by: jbeulich@novell.com
        flush_scheduled_work();
  
        if (pdev->sh_info != NULL) {
---- sle11-2009-06-29.orig/drivers/xen/scsiback/interface.c     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/scsiback/interface.c  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/interface.c     2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/interface.c  2008-12-15 11:26:44.000000000 +0100
 @@ -39,7 +39,7 @@
  #include <linux/kthread.h>
  
@@ -5981,8 +5981,8 @@ Acked-by: jbeulich@novell.com
  
  struct vscsibk_info *vscsibk_info_alloc(domid_t domid)
  {
---- sle11-2009-06-29.orig/drivers/xen/scsiback/scsiback.c      2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/scsiback/scsiback.c   2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/scsiback.c      2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/scsiback.c   2008-12-15 11:26:44.000000000 +0100
 @@ -322,13 +322,11 @@ static int scsiback_merge_bio(struct req
  
        if (!rq->bio)
@@ -5998,8 +5998,8 @@ Acked-by: jbeulich@novell.com
        }
  
        return 0;
---- sle11-2009-06-29.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:35:11.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:35:25.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:35:11.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:35:25.000000000 +0200
 @@ -463,7 +463,7 @@ netfront_accel_enqueue_skb_multi(netfron
  
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
@@ -6018,8 +6018,8 @@ Acked-by: jbeulich@novell.com
        }
        NETFRONT_ACCEL_PKTBUFF_FOR_EACH_FRAGMENT
                (skb, idx, frag_data, frag_len, {
---- sle11-2009-06-29.orig/drivers/xen/tpmback/interface.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/tpmback/interface.c   2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/interface.c      2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/interface.c   2008-12-15 11:26:44.000000000 +0100
 @@ -15,7 +15,7 @@
  #include <xen/balloon.h>
  #include <xen/gnttab.h>
@@ -6029,8 +6029,8 @@ Acked-by: jbeulich@novell.com
  int num_frontends = 0;
  
  LIST_HEAD(tpmif_list);
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_comms.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_comms.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_comms.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_comms.c 2008-12-15 11:26:44.000000000 +0100
 @@ -49,9 +49,9 @@
  
  static int xenbus_irq;
@@ -6043,8 +6043,8 @@ Acked-by: jbeulich@novell.com
  
  static DECLARE_WAIT_QUEUE_HEAD(xb_waitq);
  
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_probe.c    2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_probe.c 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2008-12-15 11:26:44.000000000 +0100
 @@ -843,7 +843,7 @@ void unregister_xenstore_notifier(struct
  EXPORT_SYMBOL_GPL(unregister_xenstore_notifier);
  
@@ -6054,8 +6054,8 @@ Acked-by: jbeulich@novell.com
  {
        BUG_ON((xenstored_ready <= 0));
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc_32.h    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_32.h    2008-12-15 11:26:44.000000000 +0100
 @@ -4,8 +4,6 @@
  #include <asm/ldt.h>
  #include <asm/segment.h>
@@ -6241,8 +6241,8 @@ Acked-by: jbeulich@novell.com
  #endif /* !__ASSEMBLY__ */
  
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2008-12-15 11:26:44.000000000 +0100
 @@ -127,10 +127,10 @@ dma_get_cache_alignment(void)
        return (1 << INTERNODE_CACHE_SHIFT);
  }
@@ -6256,8 +6256,8 @@ Acked-by: jbeulich@novell.com
               enum dma_data_direction direction)
  {
        flush_write_buffers();
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap_32.h  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2008-12-15 11:26:44.000000000 +0100
 @@ -13,13 +13,16 @@
  #ifndef _ASM_FIXMAP_H
  #define _ASM_FIXMAP_H
@@ -6276,8 +6276,8 @@ Acked-by: jbeulich@novell.com
  
  #ifndef __ASSEMBLY__
  #include <linux/kernel.h>
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/highmem.h    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2008-12-15 11:26:44.000000000 +0100
 @@ -85,7 +85,7 @@ static inline void clear_user_highpage(s
  
  void copy_highpage(struct page *to, struct page *from);
@@ -6287,8 +6287,8 @@ Acked-by: jbeulich@novell.com
  {
        copy_highpage(to, from);
  }
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypervisor.h 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2008-12-15 11:26:44.000000000 +0100
 @@ -46,15 +46,6 @@
  #include <asm/percpu.h>
  #include <asm/ptrace.h>
@@ -6305,8 +6305,8 @@ Acked-by: jbeulich@novell.com
  
  extern shared_info_t *HYPERVISOR_shared_info;
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags_32.h        2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags_32.h        2008-12-15 11:26:44.000000000 +0100
 @@ -22,9 +22,6 @@
  
  #define __raw_local_save_flags() (current_vcpu_info()->evtchn_upcall_mask)
@@ -6399,8 +6399,8 @@ Acked-by: jbeulich@novell.com
  #endif /* __ASSEMBLY__ */
  
  /*
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context_32.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2008-12-15 11:26:44.000000000 +0100
 @@ -27,14 +27,13 @@ static inline void enter_lazy_tlb(struct
  static inline void __prepare_arch_switch(void)
  {
@@ -6440,8 +6440,8 @@ Acked-by: jbeulich@novell.com
  
  static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
  {
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable-3level.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2008-12-15 11:26:44.000000000 +0100
 @@ -1,8 +1,6 @@
  #ifndef _I386_PGTABLE_3LEVEL_H
  #define _I386_PGTABLE_3LEVEL_H
@@ -6540,8 +6540,8 @@ Acked-by: jbeulich@novell.com
  #define __pte_mfn(_pte) (((_pte).pte_low >> PAGE_SHIFT) | \
                         ((_pte).pte_high << (32-PAGE_SHIFT)))
  #define pte_mfn(_pte) ((_pte).pte_low & _PAGE_PRESENT ? \
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_32.h 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2008-12-15 11:26:44.000000000 +0100
 @@ -38,14 +38,14 @@ struct vm_area_struct;
  #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page))
  extern unsigned long empty_zero_page[1024];
@@ -6590,8 +6590,8 @@ Acked-by: jbeulich@novell.com
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
  #define ptep_get_and_clear_full(mm, addr, ptep, full)                 \
        ((full) ? ({                                                    \
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor_32.h       2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2008-12-15 11:26:44.000000000 +0100
 @@ -20,6 +20,7 @@
  #include <linux/threads.h>
  #include <asm/percpu.h>
@@ -6870,8 +6870,8 @@ Acked-by: jbeulich@novell.com
 +extern void secondary_cpu_init(void);
 +
  #endif /* __ASM_I386_PROCESSOR_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/segment_32.h 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment_32.h 2008-12-15 11:26:44.000000000 +0100
 @@ -39,7 +39,7 @@
   *  25 - APM BIOS support 
   *
@@ -6891,8 +6891,8 @@ Acked-by: jbeulich@novell.com
  #define GDT_ENTRY_DOUBLEFAULT_TSS     31
  
  /*
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_32.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2008-12-15 11:26:44.000000000 +0100
 @@ -8,6 +8,7 @@
  #include <linux/kernel.h>
  #include <linux/threads.h>
@@ -6910,8 +6910,8 @@ Acked-by: jbeulich@novell.com
  
  extern cpumask_t cpu_possible_map;
  #define cpu_callin_map cpu_possible_map
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system_32.h  2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_32.h  2008-12-15 11:26:44.000000000 +0100
 @@ -139,17 +139,17 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t"
  #define write_cr4(x) \
        __asm__ __volatile__("movl %0,%%cr4": :"r" (x))
@@ -6936,8 +6936,8 @@ Acked-by: jbeulich@novell.com
  static inline unsigned long get_limit(unsigned long segment)
  {
        unsigned long __limit;
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc_64.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc_64.h    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_64.h       2009-10-28 14:55:10.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_64.h    2008-12-15 11:26:44.000000000 +0100
 @@ -9,62 +9,11 @@
  
  #include <linux/string.h>
@@ -7002,8 +7002,8 @@ Acked-by: jbeulich@novell.com
  extern struct desc_ptr idt_descr, cpu_gdt_descr[NR_CPUS];
  
  extern struct desc_struct cpu_gdt_table[GDT_ENTRIES];
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2008-12-15 11:26:44.000000000 +0100
 @@ -64,6 +64,9 @@ static inline int dma_mapping_error(dma_
        return (dma_addr == bad_dma_address);
  }
@@ -7030,8 +7030,8 @@ Acked-by: jbeulich@novell.com
  {
        flush_write_buffers();
  }
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_64.h 2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2008-12-15 11:26:44.000000000 +0100
 @@ -237,19 +237,18 @@ extern unsigned int __kernel_page_user;
  
  static inline unsigned long pgd_bad(pgd_t pgd)
@@ -7071,8 +7071,8 @@ Acked-by: jbeulich@novell.com
  #define pfn_pmd(nr,prot) (__pmd(((nr) << PAGE_SHIFT) | pgprot_val(prot)))
  #define pmd_pfn(x)  ((pmd_val(x) & __PHYSICAL_MASK) >> PAGE_SHIFT)
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor_64.h       2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_64.h       2008-12-15 11:26:44.000000000 +0100
 @@ -484,6 +484,14 @@ static inline void __mwait(unsigned long
                : :"a" (eax), "c" (ecx));
  }
@@ -7088,8 +7088,8 @@ Acked-by: jbeulich@novell.com
  extern void mwait_idle_with_hints(unsigned long eax, unsigned long ecx);
  
  #define stack_current() \
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_64.h     2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2008-12-15 11:26:44.000000000 +0100
 @@ -88,11 +88,6 @@ extern u8 x86_cpu_to_log_apicid[NR_CPUS]
  extern u8 bios_cpu_apicid[];
  
@@ -7116,8 +7116,8 @@ Acked-by: jbeulich@novell.com
  #endif /* !CONFIG_SMP */
  #endif
  
---- sle11-2009-06-29.orig/kernel/kexec.c       2009-02-17 11:27:16.000000000 +0100
-+++ sle11-2009-06-29/kernel/kexec.c    2009-02-17 11:34:22.000000000 +0100
+--- sle11-2009-10-16.orig/kernel/kexec.c       2009-02-17 11:27:16.000000000 +0100
++++ sle11-2009-10-16/kernel/kexec.c    2009-02-17 11:34:22.000000000 +0100
 @@ -374,7 +374,7 @@ static struct page *kimage_alloc_pages(g
                if (limit == ~0UL)
                        address_bits = BITS_PER_LONG;
@@ -7127,8 +7127,8 @@ Acked-by: jbeulich@novell.com
  
                if (xen_limit_pages_to_max_mfn(pages, order, address_bits) < 0) {
                        __free_pages(pages, order);
---- sle11-2009-06-29.orig/net/core/dev.c       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/net/core/dev.c    2008-12-15 11:26:44.000000000 +0100
+--- sle11-2009-10-16.orig/net/core/dev.c       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/net/core/dev.c    2008-12-15 11:26:44.000000000 +0100
 @@ -1751,10 +1751,10 @@ inline int skb_checksum_setup(struct sk_
                        goto out;
                switch (skb->nh.iph->protocol) {
similarity index 92%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.21
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.21
index 68a7d4faa3408141e6865c83c31f1ce913225127..889b792688755c88fa0ea045d3c7feb30a9cc91f 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.21" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-05-14.orig/arch/x86/Kconfig     2009-02-05 10:22:19.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/Kconfig  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-02-05 10:22:19.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-03-04 11:25:55.000000000 +0100
 @@ -50,13 +50,15 @@ config GENERIC_CMOS_UPDATE
  
  config CLOCKSOURCE_WATCHDOG
@@ -25,8 +25,8 @@ Acked-by: jbeulich@novell.com
  
  config LOCKDEP_SUPPORT
        def_bool y
---- sle11-2009-05-14.orig/arch/x86/kernel/Makefile     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/Makefile  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-03-04 11:25:55.000000000 +0100
 @@ -124,7 +124,7 @@ ifeq ($(CONFIG_X86_64),y)
        pci-dma_64-$(CONFIG_XEN)        += pci-dma_32.o
  endif
@@ -37,8 +37,8 @@ Acked-by: jbeulich@novell.com
 +      smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
  disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
  %/head_$(BITS).o %/head_$(BITS).s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
---- sle11-2009-05-14.orig/arch/x86/kernel/apic_32-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/apic_32-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_32-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_32-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -25,6 +25,8 @@
  #include <linux/kernel_stat.h>
  #include <linux/sysdev.h>
@@ -135,8 +135,8 @@ Acked-by: jbeulich@novell.com
  int setup_profiling_timer(unsigned int multiplier)
  {
        return -EINVAL;
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/common-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/common-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -610,7 +610,7 @@ void __init early_cpu_init(void)
  struct pt_regs * __devinit idle_regs(struct pt_regs *regs)
  {
@@ -182,8 +182,8 @@ Acked-by: jbeulich@novell.com
  
        /* Clear all 6 debug registers: */
        set_debugreg(0, 0);
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_32-xen.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_32-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -14,6 +14,7 @@
  #include <asm/pgtable.h>
  #include <asm/page.h>
@@ -223,8 +223,8 @@ Acked-by: jbeulich@novell.com
        return sum == 0;
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:08:06.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:09:56.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:08:06.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:09:56.000000000 +0200
 @@ -30,7 +30,7 @@
   *    18(%esp) - %eax
   *    1C(%esp) - %ds
@@ -589,8 +589,8 @@ Acked-by: jbeulich@novell.com
  
  ENTRY(kernel_thread_helper)
        pushl $0                # fake return address for unwinder
---- sle11-2009-05-14.orig/arch/x86/kernel/head_32-xen.S        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head_32-xen.S     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2009-03-04 11:25:55.000000000 +0100
 @@ -27,6 +27,7 @@
  #define X86_CAPABILITY        new_cpu_data+CPUINFO_x86_capability
  #define X86_VENDOR_ID new_cpu_data+CPUINFO_x86_vendor_id
@@ -623,8 +623,8 @@ Acked-by: jbeulich@novell.com
        /* get the PDA pointer */
        movl $boot_pda, %eax
  
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_32-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_32-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -167,7 +167,7 @@ static inline void io_apic_write(unsigne
   */
  static inline void io_apic_modify(unsigned int apic, unsigned int reg, unsigned int value)
@@ -775,8 +775,8 @@ Acked-by: jbeulich@novell.com
        spin_unlock_irqrestore(&ioapic_lock, flags);
  
        return 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/irq_32-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -10,7 +10,6 @@
   * io_apic.c.)
   */
@@ -823,8 +823,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_4KSTACKS
  /*
---- sle11-2009-05-14.orig/arch/x86/kernel/microcode-xen.c      2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/microcode-xen.c   2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-03-04 11:25:55.000000000 +0100
 @@ -108,7 +108,7 @@ static ssize_t microcode_write (struct f
        return ret;
  }
@@ -834,8 +834,8 @@ Acked-by: jbeulich@novell.com
        .owner          = THIS_MODULE,
        .write          = microcode_write,
        .open           = microcode_open,
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_32-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse_32-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -1079,7 +1079,7 @@ int mp_register_gsi(u32 gsi, int trigger
        static int              gsi_to_irq[MAX_GSI_NUM];
  
@@ -854,8 +854,8 @@ Acked-by: jbeulich@novell.com
                                gsi = pci_irq++;
                        gsi_to_irq[irq] = gsi;
                } else {
---- sle11-2009-05-14.orig/arch/x86/kernel/pci-dma-xen.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/pci-dma-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -311,7 +311,7 @@ int dma_declare_coherent_memory(struct d
        return DMA_MEMORY_IO;
  
@@ -865,8 +865,8 @@ Acked-by: jbeulich@novell.com
   out:
        if (mem_base)
                iounmap(mem_base);
---- sle11-2009-05-14.orig/arch/x86/kernel/pcspeaker.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/pcspeaker.c       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pcspeaker.c  2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pcspeaker.c       2009-03-04 11:25:55.000000000 +0100
 @@ -7,6 +7,11 @@ static __init int add_pcspkr(void)
        struct platform_device *pd;
        int ret;
@@ -879,8 +879,8 @@ Acked-by: jbeulich@novell.com
        pd = platform_device_alloc("pcspkr", -1);
        if (!pd)
                return -ENOMEM;
---- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -38,6 +38,7 @@
  #include <linux/ptrace.h>
  #include <linux/random.h>
@@ -993,8 +993,8 @@ Acked-by: jbeulich@novell.com
        return prev_p;
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_32-xen.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_32-xen.c    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-03-04 11:25:55.000000000 +0100
 @@ -33,7 +33,6 @@
  #include <linux/initrd.h>
  #include <linux/bootmem.h>
@@ -1084,8 +1084,8 @@ Acked-by: jbeulich@novell.com
 - * c-basic-offset:8
 - * End:
 - */
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_32-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/smp_32-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -335,8 +335,7 @@ static void flush_tlb_others(cpumask_t c
        /*
         * i'm not happy about this global shared spinlock in the
@@ -1105,8 +1105,8 @@ Acked-by: jbeulich@novell.com
  
        flush_mm = NULL;
        flush_va = 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:08:30.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c     2009-03-24 10:11:08.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:31.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:40.000000000 +0100
 @@ -51,6 +51,7 @@
  #include <linux/kernel_stat.h>
  #include <linux/posix-timers.h>
@@ -1382,7 +1382,7 @@ Acked-by: jbeulich@novell.com
                /* Return address is either directly at stack pointer
                   or above a saved eflags. Eflags has bits 22-31 zero,
                   kernel addresses don't. */
-@@ -761,19 +594,6 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -762,19 +595,6 @@ irqreturn_t timer_interrupt(int irq, voi
        return IRQ_HANDLED;
  }
  
@@ -1402,7 +1402,7 @@ Acked-by: jbeulich@novell.com
  void mark_tsc_unstable(void)
  {
  #ifndef CONFIG_XEN /* XXX Should tell the hypervisor about this fact. */
-@@ -829,21 +649,9 @@ static struct clocksource clocksource_xe
+@@ -830,21 +650,9 @@ static struct clocksource clocksource_xe
        .mask                   = CLOCKSOURCE_MASK(64),
        .mult                   = 1 << XEN_SHIFT,               /* time directly in nanoseconds */
        .shift                  = XEN_SHIFT,
@@ -1425,7 +1425,7 @@ Acked-by: jbeulich@novell.com
  static void init_missing_ticks_accounting(unsigned int cpu)
  {
        struct vcpu_register_runstate_memory_area area;
-@@ -864,7 +672,7 @@ static void init_missing_ticks_accountin
+@@ -865,7 +673,7 @@ static void init_missing_ticks_accountin
  }
  
  /* not static: needed by APM */
@@ -1434,7 +1434,7 @@ Acked-by: jbeulich@novell.com
  {
        unsigned long retval;
        unsigned long flags;
-@@ -877,11 +685,11 @@ unsigned long get_cmos_time(void)
+@@ -878,11 +686,11 @@ unsigned long get_cmos_time(void)
  
        return retval;
  }
@@ -1447,7 +1447,7 @@ Acked-by: jbeulich@novell.com
  
  static void sync_cmos_clock(unsigned long dummy)
  {
-@@ -925,7 +733,8 @@ static void sync_cmos_clock(unsigned lon
+@@ -926,7 +734,8 @@ static void sync_cmos_clock(unsigned lon
  
  void notify_arch_cmos_timer(void)
  {
@@ -1457,7 +1457,7 @@ Acked-by: jbeulich@novell.com
        mod_timer(&sync_xen_wallclock_timer, jiffies + 1);
  }
  
-@@ -958,29 +767,11 @@ static int time_init_device(void)
+@@ -959,29 +768,11 @@ static int time_init_device(void)
  
  device_initcall(time_init_device);
  
@@ -1487,7 +1487,7 @@ Acked-by: jbeulich@novell.com
  static void setup_cpu0_timer_irq(void)
  {
        per_cpu(timer_irq, 0) =
-@@ -988,7 +779,7 @@ static void setup_cpu0_timer_irq(void)
+@@ -989,7 +780,7 @@ static void setup_cpu0_timer_irq(void)
                        VIRQ_TIMER,
                        0,
                        timer_interrupt,
@@ -1496,7 +1496,7 @@ Acked-by: jbeulich@novell.com
                        "timer0",
                        NULL);
        BUG_ON(per_cpu(timer_irq, 0) < 0);
-@@ -1000,16 +791,9 @@ static struct vcpu_set_periodic_timer xe
+@@ -1001,16 +792,9 @@ static struct vcpu_set_periodic_timer xe
  
  void __init time_init(void)
  {
@@ -1516,7 +1516,7 @@ Acked-by: jbeulich@novell.com
  
        switch (HYPERVISOR_vcpu_op(VCPUOP_set_periodic_timer, 0,
                                   &xen_set_periodic_tick)) {
-@@ -1028,18 +812,12 @@ void __init time_init(void)
+@@ -1029,18 +813,12 @@ void __init time_init(void)
        per_cpu(processed_system_time, 0) = processed_system_time;
        init_missing_ticks_accounting(0);
  
@@ -1539,7 +1539,7 @@ Acked-by: jbeulich@novell.com
  #endif
  
        /* Cannot request_irq() until kmem is initialised. */
-@@ -1196,7 +974,7 @@ int __cpuinit local_setup_timer(unsigned
+@@ -1197,7 +975,7 @@ int __cpuinit local_setup_timer(unsigned
        irq = bind_virq_to_irqhandler(VIRQ_TIMER,
                                      cpu,
                                      timer_interrupt,
@@ -1548,7 +1548,7 @@ Acked-by: jbeulich@novell.com
                                      timer_name[cpu],
                                      NULL);
        if (irq < 0)
-@@ -1285,7 +1063,7 @@ static ctl_table xen_table[] = {
+@@ -1286,7 +1064,7 @@ static ctl_table xen_table[] = {
  };
  static int __init xen_sysctl_init(void)
  {
@@ -1557,8 +1557,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  __initcall(xen_sysctl_init);
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-03-04 11:25:55.000000000 +0100
 @@ -100,6 +100,7 @@ asmlinkage void fixup_4gb_segment(void);
  asmlinkage void machine_check(void);
  
@@ -1633,8 +1633,8 @@ Acked-by: jbeulich@novell.com
 +      return 1;
 +}
 +__setup("code_bytes=", code_bytes_setup);
---- sle11-2009-05-14.orig/arch/x86/mm/fault_32-xen.c   2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/fault_32-xen.c        2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2009-03-04 11:25:55.000000000 +0100
 @@ -46,43 +46,17 @@ int unregister_page_fault_notifier(struc
  }
  EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
@@ -1705,8 +1705,8 @@ Acked-by: jbeulich@novell.com
                return;
  
        /* It's safe to allow irq's after cr2 has been saved and the vmalloc
---- sle11-2009-05-14.orig/arch/x86/mm/highmem_32-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/highmem_32-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -33,14 +33,16 @@ static void *__kmap_atomic(struct page *
  
        /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
@@ -1735,8 +1735,8 @@ Acked-by: jbeulich@novell.com
  
        return (void*) vaddr;
  }
---- sle11-2009-05-14.orig/arch/x86/mm/init_32-xen.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_32-xen.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-03-04 11:25:55.000000000 +0100
 @@ -66,6 +66,7 @@ static pmd_t * __init one_md_table_init(
                
  #ifdef CONFIG_X86_PAE
@@ -1753,8 +1753,8 @@ Acked-by: jbeulich@novell.com
                make_lowmem_page_readonly(page_table,
                                          XENFEAT_writable_page_tables);
                set_pmd(pmd, __pmd(__pa(page_table) | _PAGE_TABLE));
---- sle11-2009-05-14.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pgtable_32-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -149,6 +149,8 @@ void __set_fixmap (enum fixed_addresses 
  void __init reserve_top_address(unsigned long reserve)
  {
@@ -1834,8 +1834,8 @@ Acked-by: jbeulich@novell.com
                        kmem_cache_free(pmd_cache, pmd);
                }
  
---- sle11-2009-05-14.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/ia32/ia32entry-xen.S     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-03-04 11:25:55.000000000 +0100
 @@ -465,7 +465,7 @@ ia32_sys_call_table:
        .quad sys32_vm86_warning        /* vm86old */ 
        .quad compat_sys_wait4
@@ -1860,8 +1860,8 @@ Acked-by: jbeulich@novell.com
        .quad sys_getcpu
 +      .quad sys_epoll_pwait
  ia32_syscall_end:             
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/sleep_64-xen.c       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_64-xen.c       2009-03-04 11:25:55.000000000 +0100
 @@ -59,7 +59,7 @@ unsigned long acpi_wakeup_address = 0;
  unsigned long acpi_video_flags;
  extern char wakeup_start, wakeup_end;
@@ -1883,8 +1883,8 @@ Acked-by: jbeulich@novell.com
        local_flush_tlb();
  }
  #endif
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_64-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_64-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -88,6 +88,13 @@ static inline int bad_addr(unsigned long
                return 1;
        }
@@ -1946,8 +1946,8 @@ Acked-by: jbeulich@novell.com
  {
        if (userdef) {
                printk(KERN_INFO "user-defined physical RAM map:\n");
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-03-04 11:25:55.000000000 +0100
 @@ -629,6 +629,9 @@ END(invalidate_interrupt\num)
  ENTRY(call_function_interrupt)
        apicinterrupt CALL_FUNCTION_VECTOR,smp_call_function_interrupt
@@ -1958,8 +1958,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  ENTRY(apic_timer_interrupt)
---- sle11-2009-05-14.orig/arch/x86/kernel/genapic_64-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/genapic_64-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -65,8 +65,8 @@ void __init clustered_apic_check(void)
         * Some x86_64 machines use physical APIC mode regardless of how many
         * procs/clusters are present (x86_64 ES7000 is an example).
@@ -1971,8 +1971,8 @@ Acked-by: jbeulich@novell.com
                        genapic = &apic_cluster;
                        goto print;
                }
---- sle11-2009-05-14.orig/arch/x86/kernel/head64-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head64-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -45,8 +45,6 @@ static void __init clear_bss(void)
  #define OLD_CL_BASE_ADDR        0x90000
  #define OLD_CL_OFFSET           0x90022
@@ -2000,8 +2000,8 @@ Acked-by: jbeulich@novell.com
  #endif
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_64-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_64-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -36,6 +36,7 @@
  #include <acpi/acpi_bus.h>
  #endif
@@ -2816,8 +2816,8 @@ Acked-by: jbeulich@novell.com
                        else
                                set_ioapic_affinity_irq(irq, TARGET_CPUS);
                }
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_64-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/irq_64-xen.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2009-03-04 11:25:55.000000000 +0100
 @@ -18,6 +18,7 @@
  #include <asm/uaccess.h>
  #include <asm/io_apic.h>
@@ -2845,8 +2845,8 @@ Acked-by: jbeulich@novell.com
  
        /*irq_exit();*/
  
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_64-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse_64-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -60,9 +60,9 @@ unsigned long mp_lapic_addr = 0;
  /* Processor that is doing the boot up */
  unsigned int boot_cpu_id = -1U;
@@ -2868,8 +2868,8 @@ Acked-by: jbeulich@novell.com
                return gsi;
  
        ioapic = mp_find_ioapic(gsi);
---- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-03-04 11:25:55.000000000 +0100
 @@ -338,14 +338,17 @@ void load_gs_index(unsigned gs)
  void flush_thread(void)
  {
@@ -2893,8 +2893,8 @@ Acked-by: jbeulich@novell.com
  
        tsk->thread.debugreg0 = 0;
        tsk->thread.debugreg1 = 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_64-xen.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_64-xen.c    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-03-04 11:25:55.000000000 +0100
 @@ -141,7 +141,7 @@ EXPORT_SYMBOL_GPL(edid_info);
  
  extern int root_mountflags;
@@ -3168,8 +3168,8 @@ Acked-by: jbeulich@novell.com
 -}
 -device_initcall(add_pcspkr);
 -#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/vsyscall_64-xen.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/vsyscall_64-xen.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-03-04 11:25:55.000000000 +0100
 @@ -26,6 +26,7 @@
  #include <linux/seqlock.h>
  #include <linux/jiffies.h>
@@ -3387,8 +3387,8 @@ Acked-by: jbeulich@novell.com
  #endif
        on_each_cpu(cpu_vsyscall_init, NULL, 0, 1);
        hotcpu_notifier(cpu_vsyscall_notifier, 0);
---- sle11-2009-05-14.orig/arch/x86/mm/fault_64-xen.c   2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/fault_64-xen.c        2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2009-03-04 11:25:55.000000000 +0100
 @@ -56,38 +56,17 @@ int unregister_page_fault_notifier(struc
  }
  EXPORT_SYMBOL_GPL(unregister_page_fault_notifier);
@@ -3454,8 +3454,8 @@ Acked-by: jbeulich@novell.com
                return;
  
        if (likely(regs->eflags & X86_EFLAGS_IF))
---- sle11-2009-05-14.orig/arch/x86/mm/init_64-xen.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_64-xen.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-03-04 11:25:55.000000000 +0100
 @@ -1108,20 +1108,30 @@ int kern_addr_valid(unsigned long addr) 
  extern int exception_trace, page_fault_trace;
  
@@ -3494,8 +3494,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  __initcall(x8664_sysctl_init);
---- sle11-2009-05-14.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pageattr_64-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -350,8 +350,8 @@ static void flush_kernel_map(void *arg)
                void *adr = page_address(pg);
                if (cpu_has_clflush)
@@ -3524,8 +3524,8 @@ Acked-by: jbeulich@novell.com
        large_pte = pte_mkhuge(large_pte);
        set_pte((pte_t *)pmd, large_pte);
  }      
---- sle11-2009-05-14.orig/drivers/acpi/processor_extcntl.c     2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/drivers/acpi/processor_extcntl.c  2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/acpi/processor_extcntl.c     2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/acpi/processor_extcntl.c  2009-03-04 11:25:55.000000000 +0100
 @@ -32,9 +32,8 @@
  
  #define ACPI_PROCESSOR_COMPONENT        0x01000000
@@ -3566,8 +3566,8 @@ Acked-by: jbeulich@novell.com
        if (ACPI_FAILURE(status)) 
                return status;
  
---- sle11-2009-05-14.orig/drivers/char/tpm/tpm_xen.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/char/tpm/tpm_xen.c        2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/char/tpm/tpm_xen.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/char/tpm/tpm_xen.c        2009-03-04 11:25:55.000000000 +0100
 @@ -481,7 +481,6 @@ static struct xenbus_device_id tpmfront_
  
  static struct xenbus_driver tpmfront = {
@@ -3588,8 +3588,8 @@ Acked-by: jbeulich@novell.com
  }
  
  static int tpmif_allocate_tx_buffers(struct tpm_private *tp)
---- sle11-2009-05-14.orig/drivers/pci/msi-xen.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/pci/msi-xen.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-03-04 11:25:55.000000000 +0100
 @@ -44,6 +44,36 @@ struct msi_pirq_entry {
        int entry_nr;
  };
@@ -3925,8 +3925,8 @@ Acked-by: jbeulich@novell.com
  }
  
  /**
---- sle11-2009-05-14.orig/drivers/xen/balloon/sysfs.c  2008-11-25 13:31:07.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/balloon/sysfs.c       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/balloon/sysfs.c  2009-06-29 15:24:00.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/balloon/sysfs.c       2009-03-04 11:25:55.000000000 +0100
 @@ -34,6 +34,7 @@
  #include <linux/stat.h>
  #include <linux/string.h>
@@ -3935,8 +3935,8 @@ Acked-by: jbeulich@novell.com
  #include "common.h"
  
  #ifdef HAVE_XEN_PLATFORM_COMPAT_H
---- sle11-2009-05-14.orig/drivers/xen/blkback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blkback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/xenbus.c 2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
 @@ -527,7 +527,6 @@ static const struct xenbus_device_id blk
  
  static struct xenbus_driver blkback = {
@@ -3953,8 +3953,8 @@ Acked-by: jbeulich@novell.com
 +      if (xenbus_register_backend(&blkback))
 +              BUG();
  }
---- sle11-2009-05-14.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:27.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:49.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:27.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:08:49.000000000 +0100
 @@ -902,7 +902,6 @@ MODULE_ALIAS("xen:vbd");
  
  static struct xenbus_driver blkfront = {
@@ -3963,8 +3963,8 @@ Acked-by: jbeulich@novell.com
        .ids = blkfront_ids,
        .probe = blkfront_probe,
        .remove = blkfront_remove,
---- sle11-2009-05-14.orig/drivers/xen/blktap/xenbus.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blktap/xenbus.c       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blktap/xenbus.c  2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blktap/xenbus.c       2009-03-04 11:25:55.000000000 +0100
 @@ -465,7 +465,6 @@ static const struct xenbus_device_id blk
  
  static struct xenbus_driver blktap = {
@@ -3981,8 +3981,8 @@ Acked-by: jbeulich@novell.com
 +      if (xenbus_register_backend(&blktap))
 +              BUG();
  }
---- sle11-2009-05-14.orig/drivers/xen/core/evtchn.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/evtchn.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-03-04 11:25:55.000000000 +0100
 @@ -145,7 +145,7 @@ static void bind_evtchn_to_cpu(unsigned 
        BUG_ON(!test_bit(chn, s->evtchn_mask));
  
@@ -4009,8 +4009,8 @@ Acked-by: jbeulich@novell.com
        .mask     = mask_dynirq,
        .unmask   = unmask_dynirq,
        .mask_ack = ack_dynirq,
---- sle11-2009-05-14.orig/drivers/xen/core/smpboot.c   2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/smpboot.c        2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-03-04 11:25:55.000000000 +0100
 @@ -117,7 +117,7 @@ static int __cpuinit xen_smp_intr_init(u
        rc = bind_ipi_to_irqhandler(RESCHEDULE_VECTOR,
                                    cpu,
@@ -4070,8 +4070,8 @@ Acked-by: jbeulich@novell.com
                cpu_data[cpu] = boot_cpu_data;
                cpu_data[cpu].apicid = apicid;
  
---- sle11-2009-05-14.orig/drivers/xen/fbfront/xenfb.c  2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/fbfront/xenfb.c       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenfb.c  2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenfb.c       2009-03-04 11:25:55.000000000 +0100
 @@ -857,7 +857,6 @@ MODULE_ALIAS("xen:vfb");
  
  static struct xenbus_driver xenfb_driver = {
@@ -4080,8 +4080,8 @@ Acked-by: jbeulich@novell.com
        .ids = xenfb_ids,
        .probe = xenfb_probe,
        .remove = xenfb_remove,
---- sle11-2009-05-14.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/fbfront/xenkbd.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenkbd.c      2009-03-04 11:25:55.000000000 +0100
 @@ -323,7 +323,6 @@ MODULE_ALIAS("xen:vkbd");
  
  static struct xenbus_driver xenkbd_driver = {
@@ -4090,8 +4090,8 @@ Acked-by: jbeulich@novell.com
        .ids = xenkbd_ids,
        .probe = xenkbd_probe,
        .remove = xenkbd_remove,
---- sle11-2009-05-14.orig/drivers/xen/netback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/xenbus.c 2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
 @@ -439,7 +439,6 @@ static const struct xenbus_device_id net
  
  static struct xenbus_driver netback = {
@@ -4108,8 +4108,8 @@ Acked-by: jbeulich@novell.com
 +      if (xenbus_register_backend(&netback))
 +              BUG();
  }
---- sle11-2009-05-14.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:34:59.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netfront/netfront.c   2009-03-30 16:35:44.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:34:59.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-03-30 16:35:44.000000000 +0200
 @@ -1892,20 +1892,19 @@ static struct ethtool_ops network_ethtoo
  };
  
@@ -4227,8 +4227,8 @@ Acked-by: jbeulich@novell.com
        .ids = netfront_ids,
        .probe = netfront_probe,
        .remove = __devexit_p(netfront_remove),
---- sle11-2009-05-14.orig/drivers/xen/pciback/xenbus.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/pciback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/xenbus.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
 @@ -682,7 +682,6 @@ static const struct xenbus_device_id xen
  
  static struct xenbus_driver xenbus_pciback_driver = {
@@ -4237,8 +4237,8 @@ Acked-by: jbeulich@novell.com
        .ids                    = xenpci_ids,
        .probe                  = pciback_xenbus_probe,
        .remove                 = pciback_xenbus_remove,
---- sle11-2009-05-14.orig/drivers/xen/pcifront/xenbus.c        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/pcifront/xenbus.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pcifront/xenbus.c        2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pcifront/xenbus.c     2009-03-04 11:25:55.000000000 +0100
 @@ -436,7 +436,6 @@ MODULE_ALIAS("xen:pci");
  
  static struct xenbus_driver xenbus_pcifront_driver = {
@@ -4247,8 +4247,8 @@ Acked-by: jbeulich@novell.com
        .ids                    = xenpci_ids,
        .probe                  = pcifront_xenbus_probe,
        .remove                 = pcifront_xenbus_remove,
---- sle11-2009-05-14.orig/drivers/xen/scsiback/xenbus.c        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsiback/xenbus.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/xenbus.c        2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/xenbus.c     2009-03-04 11:25:55.000000000 +0100
 @@ -350,7 +350,6 @@ static struct xenbus_device_id scsiback_
  
  static struct xenbus_driver scsiback = {
@@ -4257,8 +4257,8 @@ Acked-by: jbeulich@novell.com
        .ids                    = scsiback_ids,
        .probe                  = scsiback_probe,
        .remove                 = scsiback_remove,
---- sle11-2009-05-14.orig/drivers/xen/scsifront/xenbus.c       2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/scsifront/xenbus.c    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/xenbus.c       2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/xenbus.c    2009-03-04 11:25:55.000000000 +0100
 @@ -401,7 +401,6 @@ static struct xenbus_device_id scsifront
  
  static struct xenbus_driver scsifront_driver = {
@@ -4267,8 +4267,8 @@ Acked-by: jbeulich@novell.com
        .ids                    = scsifront_ids,
        .probe                  = scsifront_probe,
        .remove                 = scsifront_remove,
---- sle11-2009-05-14.orig/drivers/xen/tpmback/common.h 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/tpmback/common.h      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/common.h 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/common.h      2009-03-04 11:25:55.000000000 +0100
 @@ -54,11 +54,11 @@ typedef struct tpmif_st {
  
  void tpmif_disconnect_complete(tpmif_t * tpmif);
@@ -4283,8 +4283,8 @@ Acked-by: jbeulich@novell.com
  void tpmif_xenbus_exit(void);
  int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn);
  irqreturn_t tpmif_be_int(int irq, void *dev_id);
---- sle11-2009-05-14.orig/drivers/xen/tpmback/interface.c      2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/tpmback/interface.c   2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/interface.c      2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/interface.c   2009-03-04 11:25:55.000000000 +0100
 @@ -156,13 +156,14 @@ void tpmif_disconnect_complete(tpmif_t *
        free_tpmif(tpmif);
  }
@@ -4302,8 +4302,8 @@ Acked-by: jbeulich@novell.com
  {
        kmem_cache_destroy(tpmif_cachep);
  }
---- sle11-2009-05-14.orig/drivers/xen/tpmback/tpmback.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/tpmback/tpmback.c     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/tpmback.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/tpmback.c     2009-03-04 11:25:55.000000000 +0100
 @@ -923,22 +923,30 @@ static int __init tpmback_init(void)
        spin_lock_init(&tpm_schedule_list_lock);
        INIT_LIST_HEAD(&tpm_schedule_list);
@@ -4339,8 +4339,8 @@ Acked-by: jbeulich@novell.com
 +module_exit(tpmback_exit)
  
  MODULE_LICENSE("Dual BSD/GPL");
---- sle11-2009-05-14.orig/drivers/xen/tpmback/xenbus.c 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/tpmback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/xenbus.c 2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/xenbus.c      2009-03-04 11:25:55.000000000 +0100
 @@ -270,7 +270,6 @@ static const struct xenbus_device_id tpm
  
  static struct xenbus_driver tpmback = {
@@ -4361,8 +4361,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void tpmif_xenbus_exit(void)
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2009-03-04 11:25:55.000000000 +0100
 @@ -365,7 +365,9 @@ static void xenbus_dev_shutdown(struct d
  }
  
@@ -4413,8 +4413,8 @@ Acked-by: jbeulich@novell.com
  
  void xenbus_unregister_driver(struct xenbus_driver *drv)
  {
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.h    2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.h 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.h    2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.h 2009-03-04 11:25:55.000000000 +0100
 @@ -63,7 +63,9 @@ extern int xenbus_match(struct device *_
  extern int xenbus_dev_probe(struct device *_dev);
  extern int xenbus_dev_remove(struct device *_dev);
@@ -4426,8 +4426,8 @@ Acked-by: jbeulich@novell.com
  extern int xenbus_probe_node(struct xen_bus_type *bus,
                             const char *type,
                             const char *nodename);
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe_backend.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe_backend.c 2009-03-04 11:25:55.000000000 +0100
 @@ -172,13 +172,15 @@ static int xenbus_uevent_backend(struct 
        return 0;
  }
@@ -4447,8 +4447,8 @@ Acked-by: jbeulich@novell.com
  
  /* backend/<typename>/<frontend-uuid>/<name> */
  static int xenbus_probe_backend_unit(const char *dir,
---- sle11-2009-05-14.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenoprof/xenoprofile.c        2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenoprof/xenoprofile.c        2009-03-04 11:25:55.000000000 +0100
 @@ -235,7 +235,7 @@ static int bind_virq(void)
                result = bind_virq_to_irqhandler(VIRQ_XENOPROF,
                                                 i,
@@ -4458,8 +4458,8 @@ Acked-by: jbeulich@novell.com
                                                 "xenoprof",
                                                 NULL);
  
---- sle11-2009-05-14.orig/include/asm-x86/i8253.h      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/i8253.h   2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/i8253.h      2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/i8253.h   2009-03-04 11:25:55.000000000 +0100
 @@ -8,10 +8,14 @@
  
  extern spinlock_t i8253_lock;
@@ -4475,8 +4475,8 @@ Acked-by: jbeulich@novell.com
  #define inb_pit               inb_p
  #define outb_pit      outb_p
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/desc_32.h       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/desc_32.h    2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_32.h       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_32.h    2009-03-04 11:25:55.000000000 +0100
 @@ -21,7 +21,7 @@ struct Xgt_desc_struct {
  
  extern struct Xgt_desc_struct idt_descr;
@@ -4486,8 +4486,8 @@ Acked-by: jbeulich@novell.com
  
  static inline struct desc_struct *get_cpu_gdt_table(unsigned int cpu)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-04 11:28:11.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-04 11:28:11.000000000 +0100
 @@ -158,6 +158,19 @@ static inline void arch_leave_lazy_mmu_m
  #define arch_use_lazy_mmu_mode() unlikely(__get_cpu_var(xen_lazy_mmu))
  #endif
@@ -4517,8 +4517,8 @@ Acked-by: jbeulich@novell.com
  HYPERVISOR_shutdown(
        unsigned int reason)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-04 11:25:55.000000000 +0100
 @@ -27,13 +27,13 @@ static inline void enter_lazy_tlb(struct
  static inline void __prepare_arch_switch(void)
  {
@@ -4546,8 +4546,8 @@ Acked-by: jbeulich@novell.com
  
  static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-10-28 14:55:09.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-03-04 11:25:55.000000000 +0100
 @@ -6,12 +6,23 @@
  #include <linux/mm.h>         /* for struct page */
  #include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
@@ -4587,8 +4587,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_X86_PAE
  /*
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-04 11:25:55.000000000 +0100
 @@ -275,6 +275,7 @@ static inline pte_t pte_mkhuge(pte_t pte
   */
  #define pte_update(mm, addr, ptep)            do { } while (0)
@@ -4628,8 +4628,8 @@ Acked-by: jbeulich@novell.com
  #define pte_unmap(pte) kunmap_atomic(pte, KM_PTE0)
  #define pte_unmap_nested(pte) kunmap_atomic(pte, KM_PTE1)
  #else
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_32.h  2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_32.h       2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2009-03-04 11:25:55.000000000 +0100
 @@ -431,7 +431,7 @@ struct thread_struct {
        .vm86_info = NULL,                                              \
        .sysenter_cs = __KERNEL_CS,                                     \
@@ -4650,8 +4650,8 @@ Acked-by: jbeulich@novell.com
        set_fs(USER_DS);                                        \
        regs->xds = __USER_DS;                                  \
        regs->xes = __USER_DS;                                  \
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/segment_32.h    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/segment_32.h 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment_32.h    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment_32.h 2009-03-04 11:25:55.000000000 +0100
 @@ -83,14 +83,8 @@
   * The GDT has 32 entries
   */
@@ -4689,8 +4689,8 @@ Acked-by: jbeulich@novell.com
 +#define SEGMENT_IS_PNP_CODE(x)   (((x) & ~0x0b) == GDT_ENTRY_PNPBIOS_BASE * 8)
 +
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_32.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-04 11:25:55.000000000 +0100
 @@ -52,6 +52,11 @@ extern void cpu_exit_clear(void);
  extern void cpu_uninit(void);
  #endif
@@ -4703,8 +4703,8 @@ Acked-by: jbeulich@novell.com
  /*
   * This function is needed by all SMP systems. It must _always_ be valid
   * from the initial startup. We map APIC_BASE very early in page_setup(),
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-03-04 11:25:55.000000000 +0100
 @@ -9,7 +9,6 @@
  
  #include <asm/scatterlist.h>
@@ -4723,8 +4723,8 @@ Acked-by: jbeulich@novell.com
  extern void *dma_alloc_coherent(struct device *dev, size_t size,
                                dma_addr_t *dma_handle, gfp_t gfp);
  extern void dma_free_coherent(struct device *dev, size_t size, void *vaddr,
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-04 11:25:55.000000000 +0100
 @@ -416,15 +416,6 @@ static inline int pmd_large(pmd_t pte) {
  #define mk_pte(page, pgprot)  pfn_pte(page_to_pfn(page), (pgprot))
  #define mk_pte_huge(entry) (__pte_val(entry) |= _PAGE_PRESENT | _PAGE_PSE)
@@ -4741,8 +4741,8 @@ Acked-by: jbeulich@novell.com
  /* Change flags of a PTE */
  static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
  { 
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_64.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-04 11:25:55.000000000 +0100
 @@ -7,6 +7,7 @@
  #include <linux/threads.h>
  #include <linux/cpumask.h>
@@ -4760,8 +4760,8 @@ Acked-by: jbeulich@novell.com
  
  #define NO_PROC_ID            0xFF            /* No processor magic marker */
  
---- sle11-2009-05-14.orig/include/xen/xenbus.h 2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/xenbus.h      2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/xenbus.h 2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/xenbus.h      2009-03-04 11:25:55.000000000 +0100
 @@ -93,8 +93,7 @@ struct xenbus_device_id
  
  /* A xenbus driver. */
@@ -4800,8 +4800,8 @@ Acked-by: jbeulich@novell.com
  void xenbus_unregister_driver(struct xenbus_driver *drv);
  
  struct xenbus_transaction
---- sle11-2009-05-14.orig/lib/swiotlb-xen.c    2009-03-20 10:00:58.000000000 +0100
-+++ sle11-2009-05-14/lib/swiotlb-xen.c 2009-03-04 11:25:55.000000000 +0100
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-03-20 10:00:58.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-03-04 11:25:55.000000000 +0100
 @@ -135,8 +135,8 @@ __setup("swiotlb=", setup_io_tlb_npages)
   * Statically reserve bounce buffer space and initialize bounce buffer data
   * structures for the software IO TLB used to implement the PCI DMA API.
similarity index 94%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.22
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.22
index 129c8005d04173f5c3eeea292bf2ede65ac9819a..6fcf24f70b994ab686b568b3aa602133271b3329 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.22" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-04-20.orig/arch/x86/Kconfig     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/Kconfig  2009-02-05 10:22:38.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-02-05 10:22:38.000000000 +0100
 @@ -1433,7 +1433,7 @@ config PHYSICAL_START
  
  config RELOCATABLE
@@ -33,16 +33,16 @@ Acked-by: jbeulich@novell.com
        help
          Find out whether you have a PCI motherboard. PCI is the name of a
          bus system, i.e. the way the CPU talks to the other stuff inside
---- sle11-2009-04-20.orig/arch/x86/kernel/Makefile     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/Makefile  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2008-12-15 11:27:22.000000000 +0100
 @@ -127,4 +127,4 @@ endif
  disabled-obj-$(CONFIG_XEN) := early-quirks.o hpet.o i8253.o i8259_$(BITS).o reboot.o \
        smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
  disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
 -%/head_$(BITS).o %/head_$(BITS).s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
 +%/head_64.o %/head_64.s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
---- sle11-2009-04-20.orig/arch/x86/kernel/apic_32-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/apic_32-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_32-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_32-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -19,7 +19,6 @@
  #include <linux/mm.h>
  #include <linux/delay.h>
@@ -51,8 +51,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/interrupt.h>
  #include <linux/mc146818rtc.h>
  #include <linux/kernel_stat.h>
---- sle11-2009-04-20.orig/arch/x86/kernel/asm-offsets_32.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/asm-offsets_32.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/asm-offsets_32.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/asm-offsets_32.c  2008-12-15 11:27:22.000000000 +0100
 @@ -109,11 +109,6 @@ void foo(void)
  
        OFFSET(crypto_tfm_ctx_offset, crypto_tfm, __crt_ctx);
@@ -65,8 +65,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_PARAVIRT
        BLANK();
        OFFSET(PARAVIRT_enabled, pv_info, paravirt_enabled);
---- sle11-2009-04-20.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/cpu/common-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -22,16 +22,40 @@
  #define phys_pkg_id(a,b) a
  #endif
@@ -359,8 +359,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_HOTPLUG_CPU
  void __cpuinit cpu_uninit(void)
  {
---- sle11-2009-04-20.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/cpu/mtrr/main-xen.c       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/mtrr/main-xen.c       2008-12-15 11:27:22.000000000 +0100
 @@ -167,7 +167,7 @@ mtrr_del(int reg, unsigned long base, un
  EXPORT_SYMBOL(mtrr_add);
  EXPORT_SYMBOL(mtrr_del);
@@ -370,8 +370,8 @@ Acked-by: jbeulich@novell.com
  {
  }
  
---- sle11-2009-04-20.orig/arch/x86/kernel/e820_32-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/e820_32-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -162,26 +162,27 @@ static struct resource standard_io_resou
  
  static int __init romsignature(const unsigned char *rom)
@@ -499,8 +499,8 @@ Acked-by: jbeulich@novell.com
                                start = 0x100000ULL;
                                size = end - start;
                        }
---- sle11-2009-04-20.orig/arch/x86/kernel/entry_32-xen.S       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/entry_32-xen.S    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:09:56.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2008-12-15 11:27:22.000000000 +0100
 @@ -15,7 +15,7 @@
   * I changed all the .align's to 4 (16 byte alignment), as that's faster
   * on a 486.
@@ -607,8 +607,8 @@ Acked-by: jbeulich@novell.com
        movl %ecx, %fs
        UNWIND_ESPFIX_STACK
        popl %ecx
---- sle11-2009-04-20.orig/arch/x86/kernel/head_32-xen.S        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/head_32-xen.S     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2008-12-15 11:27:22.000000000 +0100
 @@ -37,7 +37,8 @@ ENTRY(startup_32)
        /* Set up the stack pointer */
        movl $(init_thread_union+THREAD_SIZE),%esp
@@ -736,8 +736,8 @@ Acked-by: jbeulich@novell.com
  #if CONFIG_XEN_COMPAT <= 0x030002
  /*
   * __xen_guest information
---- sle11-2009-04-20.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/io_apic_32-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -25,7 +25,6 @@
  #include <linux/init.h>
  #include <linux/delay.h>
@@ -862,8 +862,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void arch_teardown_msi_irq(unsigned int irq)
---- sle11-2009-04-20.orig/arch/x86/kernel/ioport_32-xen.c      2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/arch/x86/kernel/ioport_32-xen.c   2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_32-xen.c      2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport_32-xen.c   2008-12-15 11:27:22.000000000 +0100
 @@ -12,10 +12,10 @@
  #include <linux/types.h>
  #include <linux/ioport.h>
@@ -876,8 +876,8 @@ Acked-by: jbeulich@novell.com
  #include <xen/interface/physdev.h>
  
  /* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
---- sle11-2009-04-20.orig/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/irq_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -24,6 +24,9 @@
  DEFINE_PER_CPU(irq_cpustat_t, irq_stat) ____cacheline_internodealigned_in_smp;
  EXPORT_PER_CPU_SYMBOL(irq_stat);
@@ -888,8 +888,8 @@ Acked-by: jbeulich@novell.com
  /*
   * 'what should we do if we get a hw irq event on an illegal vector'.
   * each architecture has to answer this themselves.
---- sle11-2009-04-20.orig/arch/x86/kernel/ldt_32-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/ldt_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_32-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -10,7 +10,6 @@
  #include <linux/string.h>
  #include <linux/mm.h>
@@ -898,8 +898,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/vmalloc.h>
  #include <linux/slab.h>
  
---- sle11-2009-04-20.orig/arch/x86/kernel/microcode-xen.c      2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/microcode-xen.c   2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2008-12-15 11:27:22.000000000 +0100
 @@ -135,7 +135,7 @@ static int __init microcode_dev_init (vo
        return 0;
  }
@@ -909,8 +909,8 @@ Acked-by: jbeulich@novell.com
  {
        misc_deregister(&microcode_dev);
  }
---- sle11-2009-04-20.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/mpparse_32-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -18,7 +18,6 @@
  #include <linux/acpi.h>
  #include <linux/delay.h>
@@ -928,8 +928,8 @@ Acked-by: jbeulich@novell.com
        if (!num_processors)
                printk(KERN_ERR "SMP mptable: no processors registered!\n");
        return num_processors;
---- sle11-2009-04-20.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/pci-dma-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -13,6 +13,7 @@
  #include <linux/pci.h>
  #include <linux/module.h>
@@ -980,8 +980,8 @@ Acked-by: jbeulich@novell.com
  dma_addr_t
  dma_map_single(struct device *dev, void *ptr, size_t size,
               enum dma_data_direction direction)
---- sle11-2009-04-20.orig/arch/x86/kernel/process_32-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/process_32-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -21,7 +21,6 @@
  #include <linux/mm.h>
  #include <linux/elfcore.h>
@@ -1079,8 +1079,8 @@ Acked-by: jbeulich@novell.com
  
        return prev_p;
  }
---- sle11-2009-04-20.orig/arch/x86/kernel/quirks-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/quirks-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/quirks-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/quirks-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -3,12 +3,10 @@
   */
  #include <linux/pci.h>
@@ -1173,8 +1173,8 @@ Acked-by: jbeulich@novell.com
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_E7525_MCH,  quirk_intel_irqbalance);
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL,  PCI_DEVICE_ID_INTEL_E7520_MCH,  quirk_intel_irqbalance);
  #endif
---- sle11-2009-04-20.orig/arch/x86/kernel/smp_32-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/smp_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -13,7 +13,6 @@
  #include <linux/mm.h>
  #include <linux/delay.h>
@@ -1495,8 +1495,8 @@ Acked-by: jbeulich@novell.com
 -      return 0;
 -}
 -EXPORT_SYMBOL(smp_call_function_single);
---- sle11-2009-04-20.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:11:08.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/time_32-xen.c     2009-03-24 10:11:31.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:46.000000000 +0100
 @@ -80,7 +80,6 @@
  #include <asm/i8253.h>
  DEFINE_SPINLOCK(i8253_lock);
@@ -1637,7 +1637,7 @@ Acked-by: jbeulich@novell.com
        } while (!time_values_up_to_date(cpu));
  
        if ((unlikely(delta < -(s64)permitted_clock_jitter) ||
-@@ -543,6 +603,9 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -544,6 +604,9 @@ irqreturn_t timer_interrupt(int irq, voi
         * HACK: Passing NULL to account_steal_time()
         * ensures that the ticks are accounted as stolen.
         */
@@ -1647,7 +1647,7 @@ Acked-by: jbeulich@novell.com
        if ((stolen > 0) && (delta_cpu > 0)) {
                delta_cpu -= stolen;
                if (unlikely(delta_cpu < 0))
-@@ -558,6 +621,8 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -559,6 +622,8 @@ irqreturn_t timer_interrupt(int irq, voi
         * HACK: Passing idle_task to account_steal_time()
         * ensures that the ticks are accounted as idle/wait.
         */
@@ -1656,7 +1656,7 @@ Acked-by: jbeulich@novell.com
        if ((blocked > 0) && (delta_cpu > 0)) {
                delta_cpu -= blocked;
                if (unlikely(delta_cpu < 0))
-@@ -594,7 +659,7 @@ irqreturn_t timer_interrupt(int irq, voi
+@@ -595,7 +660,7 @@ irqreturn_t timer_interrupt(int irq, voi
        return IRQ_HANDLED;
  }
  
@@ -1665,7 +1665,7 @@ Acked-by: jbeulich@novell.com
  {
  #ifndef CONFIG_XEN /* XXX Should tell the hypervisor about this fact. */
        tsc_unstable = 1;
-@@ -602,17 +667,13 @@ void mark_tsc_unstable(void)
+@@ -603,17 +668,13 @@ void mark_tsc_unstable(void)
  }
  EXPORT_SYMBOL_GPL(mark_tsc_unstable);
  
@@ -1687,7 +1687,7 @@ Acked-by: jbeulich@novell.com
  
        if (unlikely((s64)(ret - last) < 0)) {
                if (last - ret > permitted_clock_jitter
-@@ -631,17 +692,25 @@ static cycle_t xen_clocksource_read(void
+@@ -632,17 +693,25 @@ static cycle_t xen_clocksource_read(void
        }
  
        for (;;) {
@@ -1715,7 +1715,7 @@ Acked-by: jbeulich@novell.com
  static struct clocksource clocksource_xen = {
        .name                   = "xen",
        .rating                 = 400,
-@@ -650,6 +719,7 @@ static struct clocksource clocksource_xe
+@@ -651,6 +720,7 @@ static struct clocksource clocksource_xe
        .mult                   = 1 << XEN_SHIFT,               /* time directly in nanoseconds */
        .shift                  = XEN_SHIFT,
        .flags                  = CLOCK_SOURCE_IS_CONTINUOUS,
@@ -1723,7 +1723,7 @@ Acked-by: jbeulich@novell.com
  };
  
  static void init_missing_ticks_accounting(unsigned int cpu)
-@@ -738,35 +808,6 @@ void notify_arch_cmos_timer(void)
+@@ -739,35 +809,6 @@ void notify_arch_cmos_timer(void)
        mod_timer(&sync_xen_wallclock_timer, jiffies + 1);
  }
  
@@ -1759,7 +1759,7 @@ Acked-by: jbeulich@novell.com
  extern void (*late_time_init)(void);
  
  /* Dynamically-mapped IRQ. */
-@@ -897,21 +938,21 @@ static void start_hz_timer(void)
+@@ -898,21 +939,21 @@ static void start_hz_timer(void)
        cpu_clear(smp_processor_id(), nohz_cpu_mask);
  }
  
@@ -1785,8 +1785,8 @@ Acked-by: jbeulich@novell.com
  
  /* No locking required. Interrupts are disabled on all CPUs. */
  void time_resume(void)
---- sle11-2009-04-20.orig/arch/x86/kernel/traps_32-xen.c       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/traps_32-xen.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2008-12-15 11:27:22.000000000 +0100
 @@ -52,7 +52,7 @@
  #include <asm/unwind.h>
  #include <asm/smp.h>
@@ -1897,8 +1897,8 @@ Acked-by: jbeulich@novell.com
        unsigned long base = (kesp - uesp) & -THREAD_SIZE;
        unsigned long new_kesp = kesp - base;
        unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT;
---- sle11-2009-04-20.orig/arch/x86/mm/fault_32-xen.c   2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/fault_32-xen.c        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2008-12-15 11:27:22.000000000 +0100
 @@ -14,19 +14,20 @@
  #include <linux/mman.h>
  #include <linux/mm.h>
@@ -2019,8 +2019,8 @@ Acked-by: jbeulich@novell.com
        }
  }
 -#endif
---- sle11-2009-04-20.orig/arch/x86/mm/highmem_32-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/highmem_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -26,7 +26,7 @@ void kunmap(struct page *page)
   * However when holding an atomic kmap is is not legal to sleep, so atomic
   * kmaps are appropriate for short, tight code paths only.
@@ -2063,8 +2063,8 @@ Acked-by: jbeulich@novell.com
  EXPORT_SYMBOL(kunmap_atomic);
  EXPORT_SYMBOL(kmap_atomic_to_page);
  EXPORT_SYMBOL(clear_highpage);
---- sle11-2009-04-20.orig/arch/x86/mm/init_32-xen.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/init_32-xen.c 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2008-12-15 11:27:22.000000000 +0100
 @@ -22,6 +22,7 @@
  #include <linux/init.h>
  #include <linux/highmem.h>
@@ -2336,8 +2336,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void free_initmem(void)
---- sle11-2009-04-20.orig/arch/x86/mm/ioremap_32-xen.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/ioremap_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap_32-xen.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -13,6 +13,7 @@
  #include <linux/slab.h>
  #include <linux/module.h>
@@ -2346,8 +2346,8 @@ Acked-by: jbeulich@novell.com
  #include <asm/fixmap.h>
  #include <asm/cacheflush.h>
  #include <asm/tlbflush.h>
---- sle11-2009-04-20.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/pgtable_32-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -13,6 +13,7 @@
  #include <linux/pagemap.h>
  #include <linux/spinlock.h>
@@ -2671,8 +2671,8 @@ Acked-by: jbeulich@novell.com
  {
        struct task_struct *tsk = current;
  
---- sle11-2009-04-20.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/ia32/ia32entry-xen.S     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2008-12-15 11:27:22.000000000 +0100
 @@ -431,11 +431,7 @@ ia32_sys_call_table:
        .quad sys_symlink
        .quad sys_lstat
@@ -2721,8 +2721,8 @@ Acked-by: jbeulich@novell.com
 +      .quad compat_sys_timerfd
 +      .quad sys_eventfd
 +ia32_syscall_end:
---- sle11-2009-04-20.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/acpi/sleep_64-xen.c       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_64-xen.c       2008-12-15 11:27:22.000000000 +0100
 @@ -60,19 +60,6 @@ unsigned long acpi_video_flags;
  extern char wakeup_start, wakeup_end;
  
@@ -2778,8 +2778,8 @@ Acked-by: jbeulich@novell.com
  #endif
  }
  
---- sle11-2009-04-20.orig/arch/x86/kernel/apic_64-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/apic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -19,7 +19,6 @@
  #include <linux/mm.h>
  #include <linux/delay.h>
@@ -2788,8 +2788,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/interrupt.h>
  #include <linux/mc146818rtc.h>
  #include <linux/kernel_stat.h>
---- sle11-2009-04-20.orig/arch/x86/kernel/e820_64-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/e820_64-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -17,6 +17,8 @@
  #include <linux/kexec.h>
  #include <linux/module.h>
@@ -2849,9 +2849,9 @@ Acked-by: jbeulich@novell.com
  
                if (paddr >= (end_pfn << PAGE_SHIFT))
                        break;
---- sle11-2009-04-20.orig/arch/x86/kernel/early_printk-xen.c   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/early_printk-xen.c        2008-12-15 11:27:22.000000000 +0100
-@@ -11,11 +11,10 @@
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-09-24 10:25:56.000000000 +0200
+@@ -11,13 +11,12 @@
  
  #ifdef __i386__
  #include <asm/setup.h>
@@ -2860,10 +2860,13 @@ Acked-by: jbeulich@novell.com
  #include <asm/bootsetup.h>
 -#define VGABASE               ((void __iomem *)0xffffffff800b8000UL)
  #endif
-+#define VGABASE               (__ISA_IO_base + 0xb8000)
+-
  #ifndef CONFIG_XEN
++#define VGABASE               (__ISA_IO_base + 0xb8000)
++
  static int max_ypos = 25, max_xpos = 80;
+ static int current_ypos = 25, current_xpos = 0; 
 @@ -93,9 +92,9 @@ static int early_serial_putc(unsigned ch
  static void early_serial_write(struct console *con, const char *s, unsigned n)
  {
@@ -2912,8 +2915,8 @@ Acked-by: jbeulich@novell.com
 -      }
 -}
 -
---- sle11-2009-04-20.orig/arch/x86/kernel/entry_64-xen.S       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/entry_64-xen.S    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2008-12-15 11:27:22.000000000 +0100
 @@ -1254,3 +1254,10 @@ ENTRY(call_softirq)
        ret
        CFI_ENDPROC
@@ -2925,8 +2928,8 @@ Acked-by: jbeulich@novell.com
 +      HYPERVISOR_IRET 0
 +      CFI_ENDPROC
 +ENDPROC(ignore_sysret)
---- sle11-2009-04-20.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/genapic_64-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -11,123 +11,57 @@
  #include <linux/threads.h>
  #include <linux/cpumask.h>
@@ -3080,8 +3083,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_XEN
  extern void xen_send_IPI_shortcut(unsigned int shortcut, int vector, unsigned int dest);
---- sle11-2009-04-20.orig/arch/x86/kernel/genapic_xen_64.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/genapic_xen_64.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_xen_64.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_xen_64.c  2008-12-15 11:27:22.000000000 +0100
 @@ -21,9 +21,8 @@
  #include <asm/ipi.h>
  #else
@@ -3093,8 +3096,8 @@ Acked-by: jbeulich@novell.com
  #include <xen/evtchn.h>
  
  DECLARE_PER_CPU(int, ipi_to_irq[NR_IPIS]);
---- sle11-2009-04-20.orig/arch/x86/kernel/head_64-xen.S        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/head_64-xen.S     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_64-xen.S        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_64-xen.S     2008-12-15 11:27:22.000000000 +0100
 @@ -5,6 +5,7 @@
   *  Copyright (C) 2000 Pavel Machek <pavel@suse.cz>
   *  Copyright (C) 2000 Karsten Keil <kkeil@suse.de>
@@ -3189,8 +3192,8 @@ Acked-by: jbeulich@novell.com
  .endm
  
  .section __xen_guest
---- sle11-2009-04-20.orig/arch/x86/kernel/head64-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/head64-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -25,13 +25,21 @@
  #include <asm/setup.h>
  #include <asm/desc.h>
@@ -3272,8 +3275,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_SMP
        cpu_set(0, cpu_online_map);
  #endif
---- sle11-2009-04-20.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/io_apic_64-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -25,7 +25,6 @@
  #include <linux/init.h>
  #include <linux/delay.h>
@@ -3382,8 +3385,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void arch_teardown_msi_irq(unsigned int irq)
---- sle11-2009-04-20.orig/arch/x86/kernel/ioport_64-xen.c      2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/ioport_64-xen.c   2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_64-xen.c      2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport_64-xen.c   2008-12-15 11:27:22.000000000 +0100
 @@ -13,10 +13,10 @@
  #include <linux/ioport.h>
  #include <linux/mm.h>
@@ -3396,8 +3399,8 @@ Acked-by: jbeulich@novell.com
  #include <xen/interface/physdev.h>
  
  /* Set EXTENT bits starting at BASE in BITMAP to value TURN_ON. */
---- sle11-2009-04-20.orig/arch/x86/kernel/irq_64-xen.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/irq_64-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -32,7 +32,7 @@ atomic_t irq_err_count;
   */
  static inline void stack_overflow_check(struct pt_regs *regs)
@@ -3454,8 +3457,8 @@ Acked-by: jbeulich@novell.com
                        printk("Cannot set affinity for irq %i\n", irq);
        }
  
---- sle11-2009-04-20.orig/arch/x86/kernel/ldt_64-xen.c 2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/arch/x86/kernel/ldt_64-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_64-xen.c 2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_64-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -13,7 +13,6 @@
  #include <linux/string.h>
  #include <linux/mm.h>
@@ -3464,8 +3467,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/vmalloc.h>
  #include <linux/slab.h>
  
---- sle11-2009-04-20.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/mpparse_64-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -17,7 +17,6 @@
  #include <linux/init.h>
  #include <linux/delay.h>
@@ -3483,8 +3486,8 @@ Acked-by: jbeulich@novell.com
        if (!num_processors)
                printk(KERN_ERR "MPTABLE: no processors registered!\n");
        return num_processors;
---- sle11-2009-04-20.orig/arch/x86/kernel/process_64-xen.c     2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/process_64-xen.c  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2008-12-15 11:27:22.000000000 +0100
 @@ -39,6 +39,7 @@
  #include <linux/random.h>
  #include <linux/notifier.h>
@@ -3534,8 +3537,8 @@ Acked-by: jbeulich@novell.com
                __save_init_fpu(prev_p); /* _not_ save_init_fpu() */
                mcl->op      = __HYPERVISOR_fpu_taskswitch;
                mcl->args[0] = 1;
---- sle11-2009-04-20.orig/arch/x86/kernel/setup_64-xen.c       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/setup_64-xen.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2008-12-15 11:27:22.000000000 +0100
 @@ -120,6 +120,8 @@ int bootloader_type;
  
  unsigned long saved_video_mode;
@@ -3618,8 +3621,8 @@ Acked-by: jbeulich@novell.com
        };
  
  
---- sle11-2009-04-20.orig/arch/x86/kernel/setup64-xen.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/setup64-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -113,9 +113,9 @@ void __init setup_per_cpu_areas(void)
                if (!NODE_DATA(cpu_to_node(i))) {
                        printk("cpu with no node %d, num_online_nodes %d\n",
@@ -3672,8 +3675,8 @@ Acked-by: jbeulich@novell.com
        }
  #ifndef CONFIG_X86_NO_TSS
        else
---- sle11-2009-04-20.orig/arch/x86/kernel/smp_64-xen.c 2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/smp_64-xen.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2008-12-15 11:27:22.000000000 +0100
 @@ -14,7 +14,6 @@
  #include <linux/mm.h>
  #include <linux/delay.h>
@@ -3737,8 +3740,8 @@ Acked-by: jbeulich@novell.com
  }
  
  /*
---- sle11-2009-04-20.orig/arch/x86/kernel/traps_64-xen.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/traps_64-xen.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2008-12-15 11:27:22.000000000 +0100
 @@ -32,6 +32,7 @@
  #include <linux/unwind.h>
  #include <linux/uaccess.h>
@@ -3873,8 +3876,8 @@ Acked-by: jbeulich@novell.com
                if (notify_die(DIE_GPF, "general protection fault", regs,
                                        error_code, 13, SIGSEGV) == NOTIFY_STOP)
                        return;
---- sle11-2009-04-20.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/kernel/vsyscall_64-xen.c 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2008-12-15 11:27:22.000000000 +0100
 @@ -45,14 +45,34 @@
  
  #define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
@@ -4012,8 +4015,8 @@ Acked-by: jbeulich@novell.com
                smp_call_function_single(cpu, cpu_vsyscall_init, NULL, 0, 1);
        return NOTIFY_DONE;
  }
---- sle11-2009-04-20.orig/arch/x86/mm/fault_64-xen.c   2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/fault_64-xen.c        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2008-12-15 11:27:22.000000000 +0100
 @@ -15,22 +15,22 @@
  #include <linux/mman.h>
  #include <linux/mm.h>
@@ -4071,8 +4074,8 @@ Acked-by: jbeulich@novell.com
                                pgd_t *pgd;
                                pgd = (pgd_t *)page_address(page) + pgd_index(address);
                                if (pgd_none(*pgd))
---- sle11-2009-04-20.orig/arch/x86/mm/init_64-xen.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/init_64-xen.c 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2008-12-15 11:27:22.000000000 +0100
 @@ -25,10 +25,12 @@
  #include <linux/bootmem.h>
  #include <linux/proc_fs.h>
@@ -4306,8 +4309,8 @@ Acked-by: jbeulich@novell.com
 +                      SMP_CACHE_BYTES, (4UL*1024*1024*1024), 0);
 +}
 +#endif
---- sle11-2009-04-20.orig/arch/x86/mm/pageattr_64-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/arch/x86/mm/pageattr_64-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -215,13 +215,13 @@ void mm_pin_all(void)
        preempt_enable();
  }
@@ -4368,8 +4371,8 @@ Acked-by: jbeulich@novell.com
                /* Handle kernel mapping too which aliases part of the
                 * lowmem */
                if (__pa(address) < KERNEL_TEXT_SIZE) {
---- sle11-2009-04-20.orig/drivers/char/tpm/tpm_xen.c   2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/char/tpm/tpm_xen.c        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/char/tpm/tpm_xen.c   2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/char/tpm/tpm_xen.c        2008-12-15 11:27:22.000000000 +0100
 @@ -463,7 +463,7 @@ static int tpmif_connect(struct xenbus_d
        tp->backend_id = domid;
  
@@ -4379,8 +4382,8 @@ Acked-by: jbeulich@novell.com
        if (err <= 0) {
                WPRINTK("bind_listening_port_to_irqhandler failed "
                        "(err=%d)\n", err);
---- sle11-2009-04-20.orig/drivers/pci/msi-xen.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/pci/msi-xen.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2008-12-15 11:27:22.000000000 +0100
 @@ -12,16 +12,15 @@
  #include <linux/interrupt.h>
  #include <linux/init.h>
@@ -4641,8 +4644,8 @@ Acked-by: jbeulich@novell.com
 +      }
 +}
 +#endif
---- sle11-2009-04-20.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:49.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/blkfront/blkfront.c   2009-03-24 10:11:24.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:08:49.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:11:24.000000000 +0100
 @@ -244,7 +244,7 @@ static int setup_blkring(struct xenbus_d
        info->ring_ref = err;
  
@@ -4652,8 +4655,8 @@ Acked-by: jbeulich@novell.com
        if (err <= 0) {
                xenbus_dev_fatal(dev, err,
                                 "bind_listening_port_to_irqhandler");
---- sle11-2009-04-20.orig/drivers/xen/char/mem.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/char/mem.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/char/mem.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/char/mem.c    2008-12-15 11:27:22.000000000 +0100
 @@ -18,7 +18,6 @@
  #include <linux/raw.h>
  #include <linux/tty.h>
@@ -4662,8 +4665,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/ptrace.h>
  #include <linux/device.h>
  #include <asm/pgalloc.h>
---- sle11-2009-04-20.orig/drivers/xen/core/hypervisor_sysfs.c  2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/core/hypervisor_sysfs.c       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/hypervisor_sysfs.c  2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/hypervisor_sysfs.c       2008-12-15 11:27:22.000000000 +0100
 @@ -50,7 +50,7 @@ static int __init hypervisor_subsys_init
        if (!is_running_on_xen())
                return -ENODEV;
@@ -4673,8 +4676,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  
---- sle11-2009-04-20.orig/drivers/xen/core/smpboot.c   2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/core/smpboot.c        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2008-12-15 11:27:22.000000000 +0100
 @@ -161,13 +161,12 @@ static void xen_smp_intr_exit(unsigned i
  
  void __cpuinit cpu_bringup(void)
@@ -4786,8 +4789,8 @@ Acked-by: jbeulich@novell.com
        prefill_possible_map();
  }
  
---- sle11-2009-04-20.orig/drivers/xen/core/xen_sysfs.c 2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/core/xen_sysfs.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/xen_sysfs.c 2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/xen_sysfs.c      2008-12-15 11:27:22.000000000 +0100
 @@ -29,12 +29,12 @@ HYPERVISOR_ATTR_RO(type);
  
  static int __init xen_sysfs_type_init(void)
@@ -4882,8 +4885,8 @@ Acked-by: jbeulich@novell.com
  }
  
  #endif
---- sle11-2009-04-20.orig/drivers/xen/netback/netback.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/netback/netback.c     2008-12-23 09:33:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/netback.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/netback.c     2008-12-23 09:33:22.000000000 +0100
 @@ -195,7 +195,7 @@ static struct sk_buff *netbk_copy_skb(st
                goto err;
  
@@ -4921,8 +4924,8 @@ Acked-by: jbeulich@novell.com
                                      "net-be-dbg",
                                      &netif_be_dbg);
  #endif
---- sle11-2009-04-20.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:35:44.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/netfront/netfront.c   2009-03-30 16:36:30.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:35:44.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-03-30 16:36:30.000000000 +0200
 @@ -513,7 +513,7 @@ static int setup_device(struct xenbus_de
        memcpy(netdev->dev_addr, info->mac, ETH_ALEN);
  
@@ -4932,8 +4935,8 @@ Acked-by: jbeulich@novell.com
                netdev);
        if (err < 0)
                goto fail;
---- sle11-2009-04-20.orig/drivers/xen/pciback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/pciback/xenbus.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/xenbus.c      2008-12-15 11:27:22.000000000 +0100
 @@ -99,7 +99,7 @@ static int pciback_do_attach(struct pcib
  
        err = bind_interdomain_evtchn_to_irqhandler(
@@ -4943,8 +4946,8 @@ Acked-by: jbeulich@novell.com
        if (err < 0) {
                xenbus_dev_fatal(pdev->xdev, err,
                                 "Error binding event channel to IRQ");
---- sle11-2009-04-20.orig/drivers/xen/pcifront/xenbus.c        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/pcifront/xenbus.c     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pcifront/xenbus.c        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pcifront/xenbus.c     2008-12-15 11:27:22.000000000 +0100
 @@ -10,10 +10,6 @@
  #include <xen/gnttab.h>
  #include "pcifront.h"
@@ -4956,8 +4959,8 @@ Acked-by: jbeulich@novell.com
  #define INVALID_GRANT_REF (0)
  #define INVALID_EVTCHN    (-1)
  
---- sle11-2009-04-20.orig/drivers/xen/scsifront/xenbus.c       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/scsifront/xenbus.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/xenbus.c       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/xenbus.c    2008-12-15 11:27:22.000000000 +0100
 @@ -96,7 +96,7 @@ static int scsifront_alloc_ring(struct v
  
        err = bind_listening_port_to_irqhandler(
@@ -4967,8 +4970,8 @@ Acked-by: jbeulich@novell.com
  
        if (err <= 0) {
                xenbus_dev_fatal(dev, err, "bind_listening_port_to_irqhandler");
---- sle11-2009-04-20.orig/drivers/xen/sfc_netback/accel_fwd.c  2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/sfc_netback/accel_fwd.c       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel_fwd.c  2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel_fwd.c       2008-12-15 11:27:22.000000000 +0100
 @@ -308,7 +308,7 @@ static struct netback_accel *for_a_vnic(
  static inline int packet_is_arp_reply(struct sk_buff *skb)
  {
@@ -4994,8 +4997,8 @@ Acked-by: jbeulich@novell.com
  
                DPRINTK("%s: found gratuitous ARP for " MAC_FMT "\n",
                        __FUNCTION__, MAC_ARG(mac));
---- sle11-2009-04-20.orig/drivers/xen/sfc_netback/accel_solarflare.c   2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/sfc_netback/accel_solarflare.c        2009-03-30 16:36:16.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel_solarflare.c   2009-03-30 16:10:59.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel_solarflare.c        2009-03-30 16:36:16.000000000 +0200
 @@ -113,7 +113,7 @@ bend_dl_tx_packet(struct efx_dl_device *
        BUG_ON(port == NULL);
  
@@ -5005,8 +5008,8 @@ Acked-by: jbeulich@novell.com
                netback_accel_tx_packet(skb, port->fwd_priv);
        else {
                DPRINTK("Ignoring packet with missing mac address\n");
---- sle11-2009-04-20.orig/drivers/xen/sfc_netfront/accel_tso.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/drivers/xen/sfc_netfront/accel_tso.c      2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_tso.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_tso.c      2008-12-15 11:27:22.000000000 +0100
 @@ -33,10 +33,9 @@
  
  #include "accel_tso.h"
@@ -5068,8 +5071,8 @@ Acked-by: jbeulich@novell.com
        }
  
        tsoh_iph->tot_len = htons(ip_length);
---- sle11-2009-04-20.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:35:25.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:36:26.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:35:25.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:36:26.000000000 +0200
 @@ -463,7 +463,7 @@ netfront_accel_enqueue_skb_multi(netfron
  
        if (skb->ip_summed == CHECKSUM_PARTIAL) {
@@ -5088,8 +5091,8 @@ Acked-by: jbeulich@novell.com
        }
        NETFRONT_ACCEL_PKTBUFF_FOR_EACH_FRAGMENT
                (skb, idx, frag_data, frag_len, {
---- sle11-2009-04-20.orig/drivers/xen/sfc_netfront/accel_xenbus.c      2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/drivers/xen/sfc_netfront/accel_xenbus.c   2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_xenbus.c      2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_xenbus.c   2008-12-15 11:27:22.000000000 +0100
 @@ -356,7 +356,7 @@ static int vnic_setup_domU_shared_state(
        /* Create xenbus msg event channel */
        err = bind_listening_port_to_irqhandler
@@ -5108,8 +5111,8 @@ Acked-by: jbeulich@novell.com
        if (err < 0) {
                EPRINTK("Couldn't bind net event channel\n");
                goto fail_net_irq;
---- sle11-2009-04-20.orig/fs/aio.c     2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/fs/aio.c  2009-03-24 10:11:37.000000000 +0100
+--- sle11-2009-10-16.orig/fs/aio.c     2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/fs/aio.c  2009-03-24 10:11:37.000000000 +0100
 @@ -38,7 +38,7 @@
  
  #ifdef CONFIG_EPOLL
@@ -5138,8 +5141,8 @@ Acked-by: jbeulich@novell.com
        if (error)
                return error;
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/desc_32.h    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_32.h       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_32.h    2008-12-15 11:27:22.000000000 +0100
 @@ -11,23 +11,24 @@
  
  #include <asm/mmu.h>
@@ -5304,8 +5307,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  #ifndef CONFIG_X86_NO_IDT
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/fixmap_32.h  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2008-12-15 11:27:22.000000000 +0100
 @@ -19,10 +19,8 @@
   * the start of the fixmap.
   */
@@ -5329,8 +5332,8 @@ Acked-by: jbeulich@novell.com
        FIX_SHARED_INFO,
  #define NR_FIX_ISAMAPS        256
        FIX_ISAMAP_END,
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/highmem.h       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/highmem.h    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2008-12-15 11:27:22.000000000 +0100
 @@ -67,12 +67,18 @@ extern void FASTCALL(kunmap_high(struct 
  
  void *kmap(struct page *page);
@@ -5350,8 +5353,8 @@ Acked-by: jbeulich@novell.com
  #define flush_cache_kmaps()   do { } while (0)
  
  void clear_highpage(struct page *);
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/irqflags_32.h        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags_32.h        2008-12-15 11:27:22.000000000 +0100
 @@ -11,6 +11,40 @@
  #define _ASM_IRQFLAGS_H
  
@@ -5454,8 +5457,8 @@ Acked-by: jbeulich@novell.com
  
  /*
   * For spinlocks, etc:
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/mmu_context_32.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2008-12-15 11:27:22.000000000 +0100
 @@ -6,6 +6,20 @@
  #include <asm/pgalloc.h>
  #include <asm/tlbflush.h>
@@ -5505,8 +5508,8 @@ Acked-by: jbeulich@novell.com
 +      } while(0)
  
  #endif
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgalloc_32.h 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_32.h 2008-12-15 11:27:22.000000000 +0100
 @@ -1,7 +1,6 @@
  #ifndef _I386_PGALLOC_H
  #define _I386_PGALLOC_H
@@ -5522,8 +5525,8 @@ Acked-by: jbeulich@novell.com
 -#define check_pgt_cache()     do { } while (0)
 -
  #endif /* _I386_PGALLOC_H */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgtable-3level.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2008-12-15 11:27:22.000000000 +0100
 @@ -52,32 +52,40 @@ static inline int pte_exec_kernel(pte_t 
   * value and then use set_pte to update it.  -ben
   */
@@ -5642,8 +5645,8 @@ Acked-by: jbeulich@novell.com
 -void vmalloc_sync_all(void);
 -
  #endif /* _I386_PGTABLE_3LEVEL_H */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h   2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h   2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level-defs.h        2008-12-15 11:27:22.000000000 +0100
 @@ -1,7 +1,7 @@
  #ifndef _I386_PGTABLE_3LEVEL_DEFS_H
  #define _I386_PGTABLE_3LEVEL_DEFS_H
@@ -5653,8 +5656,8 @@ Acked-by: jbeulich@novell.com
  
  /*
   * PGDIR_SHIFT determines what a top-level page table entry can map
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgtable_32.h 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2008-12-15 11:27:22.000000000 +0100
 @@ -24,11 +24,11 @@
  #include <linux/slab.h>
  #include <linux/list.h>
@@ -5828,8 +5831,8 @@ Acked-by: jbeulich@novell.com
  #include <asm-generic/pgtable.h>
  
  #endif /* _I386_PGTABLE_H */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/processor_32.h       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2008-12-15 11:27:22.000000000 +0100
 @@ -21,6 +21,7 @@
  #include <asm/percpu.h>
  #include <linux/cpumask.h>
@@ -6072,8 +6075,8 @@ Acked-by: jbeulich@novell.com
 +extern int force_mwait;
  
  #endif /* __ASM_I386_PROCESSOR_H */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/segment_32.h 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment_32.h    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment_32.h 2008-12-15 11:27:22.000000000 +0100
 @@ -39,7 +39,7 @@
   *  25 - APM BIOS support 
   *
@@ -6098,8 +6101,8 @@ Acked-by: jbeulich@novell.com
  
  #define GDT_ENTRY_DOUBLEFAULT_TSS     31
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/smp_32.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2008-12-15 11:27:22.000000000 +0100
 @@ -8,19 +8,15 @@
  #include <linux/kernel.h>
  #include <linux/threads.h>
@@ -6264,8 +6267,8 @@ Acked-by: jbeulich@novell.com
  extern u8 apicid_2_node[];
  
  #ifdef CONFIG_X86_LOCAL_APIC
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/system_32.h     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/system_32.h  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_32.h  2008-12-15 11:27:22.000000000 +0100
 @@ -4,7 +4,7 @@
  #include <linux/kernel.h>
  #include <asm/segment.h>
@@ -6651,8 +6654,8 @@ Acked-by: jbeulich@novell.com
  /*
   * Force strict CPU ordering.
   * And yes, this is required on UP too when we're talking
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/tlbflush_32.h        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_32.h        2008-12-15 11:27:22.000000000 +0100
 @@ -29,8 +29,13 @@
   * and page-granular flushes are available only on i486 and up.
   */
@@ -6687,8 +6690,8 @@ Acked-by: jbeulich@novell.com
  
  #define flush_tlb_kernel_range(start, end) flush_tlb_all()
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/desc_64.h       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/desc_64.h    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_64.h       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_64.h    2008-12-15 11:27:22.000000000 +0100
 @@ -127,16 +127,6 @@ static inline void set_ldt_desc(unsigned
                              DESC_LDT, size * 8 - 1);
  }
@@ -6737,8 +6740,8 @@ Acked-by: jbeulich@novell.com
  } 
  
  /*
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2008-12-15 11:27:22.000000000 +0100
 @@ -51,7 +51,7 @@ struct dma_mapping_ops {
  };
  
@@ -6748,8 +6751,8 @@ Acked-by: jbeulich@novell.com
  extern int iommu_merge;
  
  #if 0
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/fixmap_64.h  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2008-12-15 11:27:22.000000000 +0100
 @@ -15,7 +15,6 @@
  #include <asm/apicdef.h>
  #include <asm/page.h>
@@ -6758,8 +6761,8 @@ Acked-by: jbeulich@novell.com
  #include <asm/acpi.h>
  
  /*
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/irqflags_64.h        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags_64.h        2008-12-15 11:27:22.000000000 +0100
 @@ -9,6 +9,7 @@
   */
  #ifndef _ASM_IRQFLAGS_H
@@ -6815,8 +6818,8 @@ Acked-by: jbeulich@novell.com
  
  #else /* __ASSEMBLY__: */
  # ifdef CONFIG_TRACE_IRQFLAGS
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/mmu_context_64.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_64.h     2008-12-15 11:27:22.000000000 +0100
 @@ -9,6 +9,9 @@
  #include <asm/pgtable.h>
  #include <asm/tlbflush.h>
@@ -6827,8 +6830,8 @@ Acked-by: jbeulich@novell.com
  /*
   * possibly do the LDT unload here?
   */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/page_64.h    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2008-12-15 11:27:22.000000000 +0100
 @@ -7,6 +7,7 @@
  #include <linux/types.h>
  #include <asm/bug.h>
@@ -6937,8 +6940,8 @@ Acked-by: jbeulich@novell.com
  
  #define __va(x)                       ((void *)((unsigned long)(x)+PAGE_OFFSET))
  #define __boot_va(x)          __va(x)
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgalloc_64.h 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_64.h 2008-12-15 11:27:22.000000000 +0100
 @@ -1,7 +1,6 @@
  #ifndef _X86_64_PGALLOC_H
  #define _X86_64_PGALLOC_H
@@ -6975,8 +6978,8 @@ Acked-by: jbeulich@novell.com
        spin_unlock(&pgd_lock);
  }
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/pgtable_64.h 2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2008-12-15 11:27:22.000000000 +0100
 @@ -1,12 +1,14 @@
  #ifndef _X86_64_PGTABLE_H
  #define _X86_64_PGTABLE_H
@@ -7187,8 +7190,8 @@ Acked-by: jbeulich@novell.com
 +#endif /* !__ASSEMBLY__ */
  
  #endif /* _X86_64_PGTABLE_H */
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/processor_64.h  2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/processor_64.h       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_64.h       2008-12-15 11:27:22.000000000 +0100
 @@ -20,6 +20,7 @@
  #include <asm/percpu.h>
  #include <linux/personality.h>
@@ -7272,8 +7275,8 @@ Acked-by: jbeulich@novell.com
   *      NSC/Cyrix CPU indexed register access macros
   */
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/smp_64.h     2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2008-12-15 11:27:22.000000000 +0100
 @@ -11,12 +11,11 @@
  extern int disable_apic;
  
@@ -7326,8 +7329,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  /*
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/system_64.h  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_64.h  2008-12-15 11:27:22.000000000 +0100
 @@ -3,7 +3,7 @@
  
  #include <linux/kernel.h>
@@ -7469,8 +7472,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_SMP
  #define smp_mb()      mb()
  #define smp_rmb()     rmb()
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/tlbflush_64.h        2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_64.h        2008-12-15 11:27:22.000000000 +0100
 @@ -2,7 +2,9 @@
  #define _X8664_TLBFLUSH_H
  
@@ -7481,8 +7484,8 @@ Acked-by: jbeulich@novell.com
  
  #define __flush_tlb() xen_tlb_flush()
  
---- sle11-2009-04-20.orig/include/linux/pci.h  2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/include/linux/pci.h       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/pci.h  2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/include/linux/pci.h       2008-12-15 11:27:22.000000000 +0100
 @@ -239,7 +239,7 @@ struct pci_dev {
        int rom_attr_enabled;           /* has display of the rom attribute been enabled? */
        struct bin_attribute *res_attr[DEVICE_COUNT_RESOURCE]; /* sysfs file for resources */
@@ -7492,8 +7495,8 @@ Acked-by: jbeulich@novell.com
        struct list_head msi_list;
  #endif
        struct pci_vpd *vpd;
---- sle11-2009-04-20.orig/lib/swiotlb-xen.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-04-20/lib/swiotlb-xen.c 2009-02-05 11:16:51.000000000 +0100
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-02-05 11:16:51.000000000 +0100
 @@ -723,7 +723,6 @@ swiotlb_dma_supported (struct device *hw
        return (mask >= ((1UL << dma_bits) - 1));
  }
@@ -7502,8 +7505,8 @@ Acked-by: jbeulich@novell.com
  EXPORT_SYMBOL(swiotlb_map_single);
  EXPORT_SYMBOL(swiotlb_unmap_single);
  EXPORT_SYMBOL(swiotlb_map_sg);
---- sle11-2009-04-20.orig/net/core/dev.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-04-20/net/core/dev.c    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/net/core/dev.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/net/core/dev.c    2008-12-15 11:27:22.000000000 +0100
 @@ -1744,12 +1744,17 @@ static struct netdev_queue *dev_pick_tx(
  inline int skb_checksum_setup(struct sk_buff *skb)
  {
@@ -7538,8 +7541,8 @@ Acked-by: jbeulich@novell.com
                        goto out;
                skb->ip_summed = CHECKSUM_PARTIAL;
                skb->proto_csum_blank = 0;
---- sle11-2009-04-20.orig/scripts/Makefile.xen.awk     2009-04-29 08:44:31.000000000 +0200
-+++ sle11-2009-04-20/scripts/Makefile.xen.awk  2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/scripts/Makefile.xen.awk     2009-10-28 14:55:08.000000000 +0100
++++ sle11-2009-10-16/scripts/Makefile.xen.awk  2008-12-15 11:27:22.000000000 +0100
 @@ -13,7 +13,7 @@ BEGIN {
        next
  }
similarity index 90%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.23
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.23
index ea2c556a16a10789ac66ec748e9d6c90913aef59..5fb2436e5e6928264b045f4c2a8c2f100130e1c6 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.23" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-05-14.orig/arch/x86/Makefile    2008-12-01 11:11:08.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/Makefile 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Makefile    2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Makefile 2009-02-16 16:17:21.000000000 +0100
 @@ -148,7 +148,7 @@ libs-y  += arch/x86/lib/
  core-y += $(fcore-y)
  
@@ -17,8 +17,8 @@ Acked-by: jbeulich@novell.com
  
  # lguest paravirtualization support
  core-$(CONFIG_LGUEST_GUEST) += arch/x86/lguest/
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/sleep_32-xen.c       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_32-xen.c       2009-02-16 16:17:21.000000000 +0100
 @@ -15,7 +15,7 @@
  #ifndef CONFIG_ACPI_PV_SLEEP
  /* address in low memory of the wakeup routine. */
@@ -55,8 +55,8 @@ Acked-by: jbeulich@novell.com
        return 0;
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/asm-offsets_32.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/asm-offsets_32.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/asm-offsets_32.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/asm-offsets_32.c  2009-02-16 16:17:21.000000000 +0100
 @@ -19,7 +19,9 @@
  #include <asm/bootparam.h>
  #include <asm/elf.h>
@@ -76,8 +76,8 @@ Acked-by: jbeulich@novell.com
        BLANK();
        OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask);
        OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/common-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/common-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -360,6 +360,8 @@ static void __cpuinit generic_identify(s
                        if ( xlvl >= 0x80000004 )
                                get_model_name(c); /* Default name */
@@ -103,8 +103,8 @@ Acked-by: jbeulich@novell.com
        nexgen_init_cpu();
        umc_init_cpu();
        early_cpu_detect();
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-02-16 16:17:21.000000000 +0100
 @@ -167,7 +167,7 @@ mtrr_del(int reg, unsigned long base, un
  EXPORT_SYMBOL(mtrr_add);
  EXPORT_SYMBOL(mtrr_del);
@@ -114,8 +114,8 @@ Acked-by: jbeulich@novell.com
  {
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_32-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_32-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -10,6 +10,7 @@
  #include <linux/efi.h>
  #include <linux/pfn.h>
@@ -171,8 +171,8 @@ Acked-by: jbeulich@novell.com
                                break;
                }
        }
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32.S   2008-11-25 12:35:53.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32.S        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32.S   2008-11-25 12:35:53.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_32.S        2009-02-16 16:17:21.000000000 +0100
 @@ -1112,7 +1112,7 @@ ENTRY(kernel_thread_helper)
        CFI_ENDPROC
  ENDPROC(kernel_thread_helper)
@@ -191,8 +191,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_FTRACE
  #ifdef CONFIG_DYNAMIC_FTRACE
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-02-16 16:17:21.000000000 +0100
 @@ -452,9 +452,6 @@ restore_nocheck_notrace:
  1:    INTERRUPT_RETURN
  .section .fixup,"ax"
@@ -203,8 +203,8 @@ Acked-by: jbeulich@novell.com
        pushl $0                        # no error code
        pushl $do_iret_error
        jmp error_code
---- sle11-2009-05-14.orig/arch/x86/kernel/head_32-xen.S        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head_32-xen.S     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2009-02-16 16:17:21.000000000 +0100
 @@ -86,7 +86,10 @@ ENTRY(_stext)
  /*
   * BSS section
@@ -259,8 +259,8 @@ Acked-by: jbeulich@novell.com
 -      ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long,  1)
 +      ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz "generic")
 +      ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)
---- sle11-2009-05-14.orig/arch/x86/kernel/init_task-xen.c      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/init_task-xen.c   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/init_task-xen.c      2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/init_task-xen.c   2009-02-16 16:17:21.000000000 +0100
 @@ -46,6 +46,6 @@ EXPORT_SYMBOL(init_task);
   * per-CPU TSS segments. Threads are completely 'soft' on Linux,
   * no more per-task TSS's.
@@ -269,8 +269,8 @@ Acked-by: jbeulich@novell.com
 +DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS;
  #endif
  
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_32-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_32-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -402,14 +402,6 @@ static void set_ioapic_affinity_irq(unsi
  # include <linux/slab.h>              /* kmalloc() */
  # include <linux/timer.h>     /* time_after() */
@@ -384,8 +384,8 @@ Acked-by: jbeulich@novell.com
  {
        unsigned long t1 = jiffies;
  
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/irq_32-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -21,7 +21,7 @@
  #include <asm/apic.h>
  #include <asm/uaccess.h>
@@ -413,8 +413,8 @@ Acked-by: jbeulich@novell.com
  
  /*
   * allocate per-cpu stacks for hardirq and for softirq processing
---- sle11-2009-05-14.orig/arch/x86/kernel/microcode-xen.c      2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/microcode-xen.c   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-02-16 16:17:21.000000000 +0100
 @@ -33,6 +33,7 @@
  #include <linux/miscdevice.h>
  #include <linux/spinlock.h>
@@ -423,8 +423,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/mutex.h>
  #include <linux/cpu.h>
  #include <linux/firmware.h>
---- sle11-2009-05-14.orig/arch/x86/kernel/pci-dma-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/pci-dma-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -24,7 +24,7 @@
  #include <asm/bug.h>
  
@@ -434,8 +434,8 @@ Acked-by: jbeulich@novell.com
  
  int iommu_merge __read_mostly = 0;
  EXPORT_SYMBOL(iommu_merge);
---- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -241,6 +241,7 @@ early_param("idle", idle_setup);
  void show_regs(struct pt_regs * regs)
  {
@@ -551,8 +551,8 @@ Acked-by: jbeulich@novell.com
  
        /*
         * Leave lazy mode, flushing any hypercalls made here.
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_32-xen.c       2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_32-xen.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-02-16 16:17:21.000000000 +0100
 @@ -114,19 +114,10 @@ static unsigned int highmem_pages = -1;
  /*
   * Setup options
@@ -639,8 +639,8 @@ Acked-by: jbeulich@novell.com
  
        if (is_initial_xendomain()) {
  #ifdef CONFIG_VT
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/smp_32-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -22,6 +22,7 @@
  
  #include <asm/mtrr.h>
@@ -665,8 +665,8 @@ Acked-by: jbeulich@novell.com
  {
        if (per_cpu(cpu_tlbstate, cpu).state == TLBSTATE_OK)
                BUG();
---- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:11:31.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c     2009-03-24 10:12:09.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:46.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:53.000000000 +0100
 @@ -76,11 +76,12 @@
  #include <xen/evtchn.h>
  #include <xen/interface/vcpu.h>
@@ -682,7 +682,7 @@ Acked-by: jbeulich@novell.com
  volatile unsigned long __jiffies __section_jiffies = INITIAL_JIFFIES;
  #endif
  
-@@ -756,56 +757,10 @@ unsigned long read_persistent_clock(void
+@@ -757,56 +758,10 @@ unsigned long read_persistent_clock(void
        return retval;
  }
  
@@ -741,8 +741,8 @@ Acked-by: jbeulich@novell.com
  }
  
  extern void (*late_time_init)(void);
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-02-16 16:17:21.000000000 +0100
 @@ -41,6 +41,10 @@
  #include <linux/mca.h>
  #endif
@@ -949,8 +949,8 @@ Acked-by: jbeulich@novell.com
  
  #ifndef CONFIG_MATH_EMULATION
  
---- sle11-2009-05-14.orig/arch/x86/mach-xen/setup.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mach-xen/setup.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mach-xen/setup.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mach-xen/setup.c 2009-02-16 16:17:21.000000000 +0100
 @@ -12,6 +12,7 @@
  #include <asm/e820.h>
  #include <asm/setup.h>
@@ -987,8 +987,8 @@ Acked-by: jbeulich@novell.com
 +              set_pmd(pmd, __pmd(__pa_symbol(swapper_pg_pmd) | _PAGE_TABLE));
 +      }
  }
---- sle11-2009-05-14.orig/arch/x86/mm/fault_32-xen.c   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/fault_32-xen.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2009-02-16 16:17:21.000000000 +0100
 @@ -346,7 +346,10 @@ static inline pmd_t *vmalloc_sync_one(pg
        pmd_k = pmd_offset(pud_k, address);
        if (!pmd_present(*pmd_k))
@@ -1074,8 +1074,8 @@ Acked-by: jbeulich@novell.com
                tsk->thread.cr2 = address;
                /* Kernel addresses are always protection faults */
                tsk->thread.error_code = error_code | (address >= TASK_SIZE);
---- sle11-2009-05-14.orig/arch/x86/mm/highmem_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/highmem_32-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -34,17 +34,16 @@ void *kmap_atomic_prot(struct page *page
        /* even !CONFIG_PREEMPT needs this, for in_atomic in do_page_fault */
        pagefault_disable();
@@ -1097,8 +1097,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void *kmap_atomic(struct page *page, enum km_type type)
---- sle11-2009-05-14.orig/arch/x86/mm/init_32-xen.c    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_32-xen.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-02-16 16:17:21.000000000 +0100
 @@ -96,7 +96,7 @@ static pte_t * __init one_page_table_ini
  #endif
                pte_t *page_table = (pte_t *) alloc_bootmem_low_pages(PAGE_SIZE);
@@ -1161,8 +1161,8 @@ Acked-by: jbeulich@novell.com
                if (!SHARED_KERNEL_PMD) {
                        /* If we're in PAE mode and have a non-shared
                           kernel pmd, then the pgd size must be a
---- sle11-2009-05-14.orig/arch/x86/mm/ioremap_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/ioremap_32-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap_32-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -363,9 +363,8 @@ void iounmap(volatile void __iomem *addr
  
        /* Reset the direct mapping. Can block */
@@ -1174,8 +1174,8 @@ Acked-by: jbeulich@novell.com
                                 PAGE_KERNEL);
                global_flush_tlb();
        } 
---- sle11-2009-05-14.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pgtable_32-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -198,7 +198,7 @@ void pte_free(struct page *pte)
                                va, pfn_pte(pfn, PAGE_KERNEL), 0))
                                BUG();
@@ -1274,8 +1274,8 @@ Acked-by: jbeulich@novell.com
            (atomic_read(&mm->mm_count) == 1) &&
            !mm->context.has_foreign_mappings)
                mm_unpin(mm);
---- sle11-2009-05-14.orig/arch/x86/pci/irq-xen.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/pci/irq-xen.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-02-16 16:17:21.000000000 +0100
 @@ -142,8 +142,9 @@ static void __init pirq_peer_trick(void)
        for(i = 1; i < 256; i++) {
                if (!busmap[i] || pci_find_bus(0, i))
@@ -1296,8 +1296,8 @@ Acked-by: jbeulich@novell.com
                        r->name = "PIIX/ICH";
                        r->get = pirq_piix_get;
                        r->set = pirq_piix_set;
---- sle11-2009-05-14.orig/arch/x86/xen/Kconfig 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/xen/Kconfig      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/xen/Kconfig 2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/arch/x86/xen/Kconfig      2009-02-16 16:17:21.000000000 +0100
 @@ -2,7 +2,7 @@
  # This Kconfig describes xen options
  #
@@ -1307,8 +1307,8 @@ Acked-by: jbeulich@novell.com
        bool "Xen guest support"
        select PARAVIRT
        select PARAVIRT_CLOCK
---- sle11-2009-05-14.orig/arch/x86/xen/xen-head.S      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/xen/xen-head.S   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/xen/xen-head.S      2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/arch/x86/xen/xen-head.S   2009-02-16 16:17:21.000000000 +0100
 @@ -1,7 +1,7 @@
  /* Xen-specific pieces of head.S, intended to be included in the right
        place in head.S */
@@ -1324,8 +1324,8 @@ Acked-by: jbeulich@novell.com
  
 -#endif /*CONFIG_XEN */
 +#endif /* CONFIG_PARAVIRT_XEN */
---- sle11-2009-05-14.orig/arch/x86/ia32/ia32entry-xen.S        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/ia32/ia32entry-xen.S     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-02-16 16:17:21.000000000 +0100
 @@ -105,7 +105,7 @@ ENTRY(ia32_sysenter_target)
        movl    $VSYSCALL32_SYSEXIT,8(%rsp)
        movq    %rax,(%rsp)
@@ -1367,8 +1367,8 @@ Acked-by: jbeulich@novell.com
        .quad sys_eventfd
 +      .quad sys32_fallocate
  ia32_syscall_end:
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/sleep_64-xen.c       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_64-xen.c       2009-02-16 16:17:21.000000000 +0100
 @@ -51,12 +51,10 @@
                                Low-Level Sleep Support
     -------------------------------------------------------------------------- */
@@ -1406,8 +1406,8 @@ Acked-by: jbeulich@novell.com
  void acpi_pci_link_exit(void)
  {
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/apic_64-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/apic_64-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -50,7 +50,7 @@ void ack_bad_irq(unsigned int irq)
         * holds up an irq slot - in excessive cases (when multiple
         * unexpected vectors occur) that might lock up the APIC
@@ -1447,8 +1447,8 @@ Acked-by: jbeulich@novell.com
        irq_exit();
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_64-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_64-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -222,37 +222,6 @@ unsigned long __init e820_end_of_ram(voi
  }
  
@@ -1620,8 +1620,8 @@ Acked-by: jbeulich@novell.com
                        (unsigned long long) e820.map[i].addr,
                        (unsigned long long) (e820.map[i].addr + e820.map[i].size));
                switch (e820.map[i].type) {
---- sle11-2009-05-14.orig/arch/x86/kernel/early_printk-xen.c   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/early_printk-xen.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-09-24 10:25:56.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-02-16 16:17:21.000000000 +0100
 @@ -174,6 +174,7 @@ static __init void early_serial_init(cha
   * mappings. Someone should fix this for domain 0. For now, use fake serial.
   */
@@ -1656,8 +1656,8 @@ Acked-by: jbeulich@novell.com
        }
  
        if (keep_early)
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-02-16 16:17:21.000000000 +0100
 @@ -310,7 +310,7 @@ sysret_signal:
        TRACE_IRQS_ON
  /*    sti */
@@ -1685,8 +1685,8 @@ Acked-by: jbeulich@novell.com
        jz    retint_restore_args
        TRACE_IRQS_ON
          XEN_UNBLOCK_EVENTS(%rsi)
---- sle11-2009-05-14.orig/arch/x86/kernel/head_64-xen.S        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head_64-xen.S     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_64-xen.S        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_64-xen.S     2009-02-16 16:17:21.000000000 +0100
 @@ -23,7 +23,7 @@
  #include <asm/dwarf2.h>
  #include <xen/interface/elfnote.h>
@@ -1749,8 +1749,8 @@ Acked-by: jbeulich@novell.com
 +      ELFNOTE(Xen, XEN_ELFNOTE_FEATURES,       .asciz "writable_page_tables|writable_descriptor_tables|auto_translated_physmap|pae_pgdir_above_4gb|supervisor_mode_kernel")
 +      ELFNOTE(Xen, XEN_ELFNOTE_LOADER,         .asciz "generic")
 +      ELFNOTE(Xen, XEN_ELFNOTE_SUSPEND_CANCEL, .long 1)
---- sle11-2009-05-14.orig/arch/x86/kernel/head64-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head64-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -90,7 +90,7 @@ void __init x86_64_start_kernel(char * r
        unsigned long machine_to_phys_nr_ents;
        int i;
@@ -1760,8 +1760,8 @@ Acked-by: jbeulich@novell.com
  
        xen_start_info = (struct start_info *)real_mode_data;
        if (!xen_feature(XENFEAT_auto_translated_physmap))
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_64-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -165,7 +165,9 @@ static inline void io_apic_write(unsigne
  #endif
  }
@@ -1884,8 +1884,8 @@ Acked-by: jbeulich@novell.com
  }
  
  static struct irq_chip ioapic_chip __read_mostly = {
---- sle11-2009-05-14.orig/arch/x86/kernel/ldt_64-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/ldt_64-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_64-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_64-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -114,6 +114,8 @@ int init_new_context(struct task_struct 
        memset(&mm->context, 0, sizeof(mm->context));
        init_MUTEX(&mm->context.sem);
@@ -1904,8 +1904,8 @@ Acked-by: jbeulich@novell.com
                spin_lock(&mm_unpinned_lock);
                list_del(&mm->context.unpinned);
                spin_unlock(&mm_unpinned_lock);
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_64-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse_64-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -32,7 +32,6 @@
  
  /* Have we found an MP table */
@@ -1962,8 +1962,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void __init
---- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-02-16 16:17:21.000000000 +0100
 @@ -26,6 +26,7 @@
  #include <linux/sched.h>
  #include <linux/kernel.h>
@@ -1995,8 +1995,8 @@ Acked-by: jbeulich@novell.com
  }
  
  void show_regs(struct pt_regs *regs)
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_64-xen.c       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_64-xen.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-02-16 16:17:21.000000000 +0100
 @@ -827,6 +827,8 @@ static void __cpuinit init_amd(struct cp
        level = cpuid_eax(1);
        if (c->x86 == 15 && ((level >= 0x0f48 && level < 0x0f50) || level >= 0x0f58))
@@ -2079,8 +2079,8 @@ Acked-by: jbeulich@novell.com
        };
        static char *x86_power_flags[] = { 
                "ts",   /* temperature sensor */
---- sle11-2009-05-14.orig/arch/x86/kernel/setup64-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup64-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -125,11 +125,14 @@ void __init setup_per_cpu_areas(void)
  } 
  
@@ -2107,8 +2107,8 @@ Acked-by: jbeulich@novell.com
                /* others are initialized in smpboot.c */
                pda->pcurrent = &init_task;
                pda->irqstackptr = boot_cpu_stack; 
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_64-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/smp_64-xen.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2009-02-16 16:17:21.000000000 +0100
 @@ -362,7 +362,7 @@ __smp_call_function_single(int cpu, void
  }
  
@@ -2145,8 +2145,8 @@ Acked-by: jbeulich@novell.com
        put_cpu();
        return 0;
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_64-xen.c       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_64-xen.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-02-16 16:17:21.000000000 +0100
 @@ -34,6 +34,10 @@
  #include <linux/bug.h>
  #include <linux/kdebug.h>
@@ -2217,8 +2217,8 @@ Acked-by: jbeulich@novell.com
        if (panic_on_unrecovered_nmi)
                panic("NMI: Not continuing");
  
---- sle11-2009-05-14.orig/arch/x86/kernel/vsyscall_64-xen.c    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/vsyscall_64-xen.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-02-16 16:17:21.000000000 +0100
 @@ -42,6 +42,7 @@
  #include <asm/segment.h>
  #include <asm/desc.h>
@@ -2264,8 +2264,8 @@ Acked-by: jbeulich@novell.com
        write_sequnlock_irqrestore(&vsyscall_gtod_data.lock, flags);
  }
  
---- sle11-2009-05-14.orig/arch/x86/mm/fault_64-xen.c   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/fault_64-xen.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2009-02-16 16:17:21.000000000 +0100
 @@ -159,7 +159,9 @@ void dump_pagetable(unsigned long addres
        pmd_t *pmd;
        pte_t *pte;
@@ -2387,8 +2387,8 @@ Acked-by: jbeulich@novell.com
        goto no_context;
  
  do_sigbus:
---- sle11-2009-05-14.orig/arch/x86/mm/init_64-xen.c    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_64-xen.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-02-16 16:17:21.000000000 +0100
 @@ -66,6 +66,9 @@ int after_bootmem;
  DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
  extern unsigned long start_pfn;
@@ -2506,8 +2506,8 @@ Acked-by: jbeulich@novell.com
 +              return "[vsyscall]";
 +      return NULL;
 +}
---- sle11-2009-05-14.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pageattr_64-xen.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2009-02-16 16:17:21.000000000 +0100
 @@ -171,7 +171,7 @@ void mm_pin(struct mm_struct *mm)
        mm_walk(mm, PAGE_KERNEL_RO);
        xen_pgd_pin(__pa(mm->pgd)); /* kernel */
@@ -2612,8 +2612,8 @@ Acked-by: jbeulich@novell.com
                ClearPagePrivate(pg);
                __free_page(pg);
        } 
---- sle11-2009-05-14.orig/arch/x86/vdso/vdso32/note.S  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/vdso/vdso32/note.S       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32/note.S  2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32/note.S       2009-02-16 16:17:21.000000000 +0100
 @@ -13,7 +13,7 @@ ELFNOTE_START(Linux, 0, "a")
        .long LINUX_VERSION_CODE
  ELFNOTE_END
@@ -2636,8 +2636,8 @@ Acked-by: jbeulich@novell.com
        .byte VDSO_NOTE_NONEGSEG_BIT; .asciz "nosegneg" /* bit, name */
  ELFNOTE_END
  #endif
---- sle11-2009-05-14.orig/drivers/Makefile     2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/drivers/Makefile  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/Makefile     2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/Makefile  2009-02-16 16:17:21.000000000 +0100
 @@ -16,7 +16,7 @@ obj-$(CONFIG_ACPI)           += acpi/
  obj-$(CONFIG_PNP)             += pnp/
  obj-$(CONFIG_ARM_AMBA)                += amba/
@@ -2647,8 +2647,8 @@ Acked-by: jbeulich@novell.com
  
  # char/ comes before serial/ etc so that the VT console is the boot-time
  # default.
---- sle11-2009-05-14.orig/drivers/block/Kconfig        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/block/Kconfig     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/block/Kconfig        2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/block/Kconfig     2009-02-16 16:17:21.000000000 +0100
 @@ -423,9 +423,9 @@ config XILINX_SYSACE
        help
          Include support for the Xilinx SystemACE CompactFlash interface
@@ -2661,8 +2661,8 @@ Acked-by: jbeulich@novell.com
        default y
        help
          This driver implements the front-end of the Xen virtual
---- sle11-2009-05-14.orig/drivers/block/Makefile       2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/block/Makefile    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/block/Makefile       2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/block/Makefile    2009-02-16 16:17:21.000000000 +0100
 @@ -31,5 +31,5 @@ obj-$(CONFIG_BLK_DEV_SX8)    += sx8.o
  obj-$(CONFIG_BLK_DEV_UB)      += ub.o
  obj-$(CONFIG_BLK_DEV_HD)      += hd.o
@@ -2670,8 +2670,8 @@ Acked-by: jbeulich@novell.com
 -obj-$(CONFIG_XEN_BLKDEV_FRONTEND)     += xen-blkfront.o
 +obj-$(CONFIG_XEN_BLKFRONT)    += xen-blkfront.o
  obj-$(CONFIG_CIPHER_TWOFISH)  += loop_fish2.o
---- sle11-2009-05-14.orig/drivers/block/xen-blkfront.c 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/block/xen-blkfront.c      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/block/xen-blkfront.c 2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/block/xen-blkfront.c      2009-02-16 16:17:21.000000000 +0100
 @@ -1021,7 +1021,6 @@ static struct xenbus_device_id blkfront_
  
  static struct xenbus_driver blkfront = {
@@ -2680,8 +2680,8 @@ Acked-by: jbeulich@novell.com
        .ids = blkfront_ids,
        .probe = blkfront_probe,
        .remove = blkfront_remove,
---- sle11-2009-05-14.orig/drivers/char/Kconfig 2009-02-16 15:58:02.000000000 +0100
-+++ sle11-2009-05-14/drivers/char/Kconfig      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/char/Kconfig 2009-06-04 10:18:21.000000000 +0200
++++ sle11-2009-10-16/drivers/char/Kconfig      2009-02-16 16:17:21.000000000 +0100
 @@ -624,7 +624,7 @@ config HVC_BEAT
  
  config HVC_XEN
@@ -2691,8 +2691,8 @@ Acked-by: jbeulich@novell.com
        select HVC_DRIVER
        select HVC_IRQ
        default y
---- sle11-2009-05-14.orig/drivers/net/Kconfig  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/net/Kconfig       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/net/Kconfig  2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/net/Kconfig       2009-02-16 16:17:21.000000000 +0100
 @@ -2545,9 +2545,9 @@ source "drivers/atm/Kconfig"
  
  source "drivers/s390/net/Kconfig"
@@ -2705,8 +2705,8 @@ Acked-by: jbeulich@novell.com
        default y
        help
          The network device frontend driver allows the kernel to
---- sle11-2009-05-14.orig/drivers/net/Makefile 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/net/Makefile      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/net/Makefile 2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/net/Makefile      2009-02-16 16:17:21.000000000 +0100
 @@ -142,7 +142,7 @@ obj-$(CONFIG_PPPOL2TP) += pppox.o pppol2
  obj-$(CONFIG_SLIP) += slip.o
  obj-$(CONFIG_SLHC) += slhc.o
@@ -2716,8 +2716,8 @@ Acked-by: jbeulich@novell.com
  
  obj-$(CONFIG_DUMMY) += dummy.o
  obj-$(CONFIG_IFB) += ifb.o
---- sle11-2009-05-14.orig/drivers/net/xen-netfront.c   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/net/xen-netfront.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/net/xen-netfront.c   2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/net/xen-netfront.c        2009-02-16 16:17:21.000000000 +0100
 @@ -36,8 +36,6 @@
  #include <linux/skbuff.h>
  #include <linux/ethtool.h>
@@ -2781,8 +2781,8 @@ Acked-by: jbeulich@novell.com
        .ids = netfront_ids,
        .probe = netfront_probe,
        .remove = __devexit_p(xennet_remove),
---- sle11-2009-05-14.orig/drivers/xen/Makefile 2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/Makefile      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/Makefile 2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/Makefile      2009-02-16 16:17:21.000000000 +0100
 @@ -1,10 +1,12 @@
 -obj-y += core/
 -obj-y += console/
@@ -2802,8 +2802,8 @@ Acked-by: jbeulich@novell.com
  obj-$(CONFIG_XEN_BALLOON)             += balloon/
  obj-$(CONFIG_XEN_BLKDEV_BACKEND)      += blkback/
  obj-$(CONFIG_XEN_BLKDEV_TAP)          += blktap/
---- sle11-2009-05-14.orig/drivers/xen/blkback/blkback.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkback/blkback.c     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/blkback.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/blkback.c     2009-02-16 16:17:21.000000000 +0100
 @@ -154,7 +154,7 @@ static void unplug_queue(blkif_t *blkif)
  
  static void plug_queue(blkif_t *blkif, struct block_device *bdev)
@@ -2813,8 +2813,8 @@ Acked-by: jbeulich@novell.com
  
        if (q == blkif->plug)
                return;
---- sle11-2009-05-14.orig/drivers/xen/blkback/common.h 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkback/common.h      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/common.h 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/common.h      2009-02-16 16:17:21.000000000 +0100
 @@ -79,7 +79,7 @@ typedef struct blkif_st {
        wait_queue_head_t   wq;
        struct task_struct  *xenblkd;
@@ -2824,8 +2824,8 @@ Acked-by: jbeulich@novell.com
  
        /* statistics */
        unsigned long       st_print;
---- sle11-2009-05-14.orig/drivers/xen/blkback/interface.c      2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkback/interface.c   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/interface.c      2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/interface.c   2009-02-16 16:17:21.000000000 +0100
 @@ -177,5 +177,5 @@ void blkif_free(blkif_t *blkif)
  void __init blkif_interface_init(void)
  {
@@ -2833,8 +2833,8 @@ Acked-by: jbeulich@novell.com
 -                                       0, 0, NULL, NULL);
 +                                       0, 0, NULL);
  }
---- sle11-2009-05-14.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:11:24.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/blkfront.c   2009-03-24 10:12:03.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:11:24.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:12:03.000000000 +0100
 @@ -662,7 +662,7 @@ static int blkif_queue_request(struct re
   * do_blkif_request
   *  read a block; request is in a request queue
@@ -2844,8 +2844,8 @@ Acked-by: jbeulich@novell.com
  {
        struct blkfront_info *info = NULL;
        struct request *req;
---- sle11-2009-05-14.orig/drivers/xen/blkfront/block.h 2009-03-05 15:42:00.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/block.h      2009-03-24 10:11:58.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/block.h 2009-03-05 15:42:00.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/block.h      2009-03-24 10:11:58.000000000 +0100
 @@ -106,7 +106,7 @@ struct blkfront_info
        struct scatterlist sg[BLKIF_MAX_SEGMENTS_PER_REQUEST];
        unsigned int irq;
@@ -2864,8 +2864,8 @@ Acked-by: jbeulich@novell.com
  
  /* Virtual block-device subsystem. */
  /* Note that xlvbd_add doesn't call add_disk for you: you're expected
---- sle11-2009-05-14.orig/drivers/xen/blkfront/vbd.c   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blkfront/vbd.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/vbd.c   2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/vbd.c        2009-02-16 16:17:21.000000000 +0100
 @@ -211,7 +211,7 @@ xlbd_put_major_info(struct xlbd_major_in
  static int
  xlvbd_init_blk_queue(struct gendisk *gd, u16 sector_size)
@@ -2875,8 +2875,8 @@ Acked-by: jbeulich@novell.com
  
        rq = blk_init_queue(do_blkif_request, &blkif_io_lock);
        if (rq == NULL)
---- sle11-2009-05-14.orig/drivers/xen/blktap/common.h  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blktap/common.h       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blktap/common.h  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blktap/common.h       2009-02-16 16:17:21.000000000 +0100
 @@ -68,7 +68,7 @@ typedef struct blkif_st {
        wait_queue_head_t   wq;
        struct task_struct  *xenblkd;
@@ -2886,8 +2886,8 @@ Acked-by: jbeulich@novell.com
  
        /* statistics */
        unsigned long       st_print;
---- sle11-2009-05-14.orig/drivers/xen/blktap/interface.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blktap/interface.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blktap/interface.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blktap/interface.c    2009-02-16 16:17:21.000000000 +0100
 @@ -177,5 +177,5 @@ void tap_blkif_kmem_cache_free(blkif_t *
  void __init tap_blkif_interface_init(void)
  {
@@ -2895,8 +2895,8 @@ Acked-by: jbeulich@novell.com
 -                                       0, 0, NULL, NULL);
 +                                       0, 0, NULL);
  }
---- sle11-2009-05-14.orig/drivers/xen/core/features.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/core/features.c       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/features.c  2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/features.c       2009-02-16 16:17:21.000000000 +0100
 @@ -19,7 +19,7 @@ u8 xen_features[XENFEAT_NR_SUBMAPS * 32]
  /* Not a GPL symbol: used in ubiquitous macros, so too restrictive. */
  EXPORT_SYMBOL(xen_features);
@@ -2906,8 +2906,8 @@ Acked-by: jbeulich@novell.com
  {
        xen_feature_info_t fi;
        int i, j;
---- sle11-2009-05-14.orig/drivers/xen/core/reboot.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/reboot.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/reboot.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/reboot.c 2009-02-16 16:17:21.000000000 +0100
 @@ -4,6 +4,7 @@
  #include <linux/unistd.h>
  #include <linux/module.h>
@@ -2916,8 +2916,8 @@ Acked-by: jbeulich@novell.com
  #include <linux/sysrq.h>
  #include <asm/hypervisor.h>
  #include <xen/xenbus.h>
---- sle11-2009-05-14.orig/drivers/xen/scsiback/interface.c     2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/scsiback/interface.c  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/interface.c     2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/interface.c  2009-02-16 16:17:21.000000000 +0100
 @@ -167,7 +167,7 @@ void scsiback_free(struct vscsibk_info *
  int __init scsiback_interface_init(void)
  {
@@ -2927,8 +2927,8 @@ Acked-by: jbeulich@novell.com
        if (!scsiback_cachep) {
                printk(KERN_ERR "scsiback: can't init scsi cache\n");
                return -ENOMEM;
---- sle11-2009-05-14.orig/drivers/xen/scsifront/scsifront.c    2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/scsifront/scsifront.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/scsifront.c    2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/scsifront.c 2009-02-16 16:17:21.000000000 +0100
 @@ -147,7 +147,7 @@ static void scsifront_cdb_cmd_done(struc
        add_id_to_freelist(info, id);
  
@@ -2938,8 +2938,8 @@ Acked-by: jbeulich@novell.com
  
        if (ring_res->sense_len > VSCSIIF_SENSE_BUFFERSIZE)
                sense_len = VSCSIIF_SENSE_BUFFERSIZE;
---- sle11-2009-05-14.orig/drivers/xen/tpmback/interface.c      2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/tpmback/interface.c   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/tpmback/interface.c      2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/tpmback/interface.c   2009-02-16 16:17:21.000000000 +0100
 @@ -12,6 +12,7 @@
   */
  
@@ -2957,8 +2957,8 @@ Acked-by: jbeulich@novell.com
        return tpmif_cachep ? 0 : -ENOMEM;
  }
  
---- sle11-2009-05-14.orig/drivers/xen/util.c   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/util.c        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/util.c   2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/util.c        2009-02-16 16:17:21.000000000 +0100
 @@ -1,8 +1,5 @@
 -#include <linux/mm.h>
 +#include <linux/err.h>
@@ -3015,8 +3015,8 @@ Acked-by: jbeulich@novell.com
 -}
 -EXPORT_SYMBOL_GPL(free_vm_area);
 -#endif /* CONFIG_X86 */
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-17 15:27:31.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_client.c        2009-03-24 10:12:22.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-17 15:27:31.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_client.c        2009-03-24 10:12:22.000000000 +0100
 @@ -30,19 +30,26 @@
   * IN THE SOFTWARE.
   */
@@ -3463,8 +3463,8 @@ Acked-by: jbeulich@novell.com
  enum xenbus_state xenbus_read_driver_state(const char *path)
  {
        enum xenbus_state result;
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_comms.c    2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_comms.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_comms.c    2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_comms.c 2009-02-16 16:17:21.000000000 +0100
 @@ -34,12 +34,15 @@
  #include <linux/interrupt.h>
  #include <linux/sched.h>
@@ -3522,8 +3522,8 @@ Acked-by: jbeulich@novell.com
                xen_store_evtchn, wake_waiting,
                0, "xenbus", &xb_waitq);
        if (err <= 0) {
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2009-02-16 16:17:21.000000000 +0100
 @@ -43,12 +43,11 @@
  #include <linux/mm.h>
  #include <linux/notifier.h>
@@ -3820,8 +3820,8 @@ Acked-by: jbeulich@novell.com
  {
        return xenbus_probe_init();
  }
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.h    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.h    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.h 2009-02-16 16:17:21.000000000 +0100
 @@ -56,7 +56,9 @@ struct xen_bus_type
        int (*get_bus_id)(char bus_id[BUS_ID_SIZE], const char *nodename);
        int (*probe)(const char *type, const char *dir);
@@ -3841,8 +3841,8 @@ Acked-by: jbeulich@novell.com
  
  #endif
  
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe_backend.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe_backend.c 2009-02-16 16:17:21.000000000 +0100
 @@ -236,7 +236,7 @@ static void backend_changed(struct xenbu
  {
        DPRINTK("");
@@ -3852,8 +3852,8 @@ Acked-by: jbeulich@novell.com
  }
  
  static struct xenbus_watch be_watch = {
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_xs.c       2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_xs.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_xs.c       2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_xs.c    2009-02-16 16:17:21.000000000 +0100
 @@ -221,7 +221,7 @@ static void *xs_talkv(struct xenbus_tran
        }
  
@@ -3938,8 +3938,8 @@ Acked-by: jbeulich@novell.com
        }
  
        return 0;
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-02-16 16:17:21.000000000 +0100
 @@ -53,6 +53,8 @@ extern unsigned long __FIXADDR_TOP;
  enum fixed_addresses {
        FIX_HOLE,
@@ -3949,8 +3949,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/highmem.h       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/highmem.h    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2009-02-16 16:17:21.000000000 +0100
 @@ -76,8 +76,7 @@ struct page *kmap_atomic_to_page(void *p
  
  #define kmap_atomic_pte(page, type) \
@@ -3961,8 +3961,8 @@ Acked-by: jbeulich@novell.com
  
  #define flush_cache_kmaps()   do { } while (0)
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/maddr_32.h      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/maddr_32.h   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/maddr_32.h      2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/maddr_32.h   2009-02-16 16:17:21.000000000 +0100
 @@ -155,6 +155,7 @@ static inline paddr_t pte_machine_to_phy
  
  #ifdef CONFIG_X86_PAE
@@ -3971,8 +3971,8 @@ Acked-by: jbeulich@novell.com
  static inline pte_t pfn_pte_ma(unsigned long page_nr, pgprot_t pgprot)
  {
        pte_t pte;
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-02-16 16:17:21.000000000 +0100
 @@ -16,7 +16,7 @@ void mm_pin_all(void);
  static inline void xen_activate_mm(struct mm_struct *prev,
                                   struct mm_struct *next)
@@ -4000,8 +4000,8 @@ Acked-by: jbeulich@novell.com
  
                /* stop flush ipis for the previous mm */
                cpu_clear(cpu, prev->cpu_vm_mask);
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pci_32.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci_32.h     2009-02-16 16:17:21.000000000 +0100
 @@ -3,6 +3,14 @@
  
  
@@ -4066,8 +4066,8 @@ Acked-by: jbeulich@novell.com
  #ifdef CONFIG_PCI
  static inline void pci_dma_burst_advice(struct pci_dev *pdev,
                                        enum pci_dma_burst_strategy *strat,
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-02-16 16:17:21.000000000 +0100
 @@ -5,7 +5,7 @@
  #include <linux/mm.h>         /* for struct page */
  #include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
@@ -4096,8 +4096,8 @@ Acked-by: jbeulich@novell.com
                if (!PageHighMem(pte))                                  \
                        BUG_ON(HYPERVISOR_update_va_mapping(            \
                          (unsigned long)__va(pfn << PAGE_SHIFT),       \
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-02-16 16:17:21.000000000 +0100
 @@ -26,9 +26,6 @@
  #include <linux/spinlock.h>
  #include <linux/sched.h>
@@ -4229,8 +4229,8 @@ Acked-by: jbeulich@novell.com
                        xen_l1_entry_update(ptep, __pte(0));            \
                else                                                    \
                        *(ptep) = __pte(0);                             \
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-02-16 16:17:21.000000000 +0100
 @@ -23,26 +23,11 @@
  #define pud_present(pud)                      1
  
@@ -4259,8 +4259,8 @@ Acked-by: jbeulich@novell.com
  }
  
  /* Rules for using set_pte: the pte being assigned *must* be
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_32.h  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_32.h       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2009-02-16 16:17:21.000000000 +0100
 @@ -89,7 +89,6 @@ struct cpuinfo_x86 {
  #define X86_VENDOR_UMC 3
  #define X86_VENDOR_NEXGEN 4
@@ -4306,8 +4306,8 @@ Acked-by: jbeulich@novell.com
  /*
   * Size of io_bitmap.
   */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/system_32.h     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/system_32.h  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_32.h  2009-02-16 16:17:21.000000000 +0100
 @@ -205,11 +205,6 @@ static inline unsigned long get_limit(un
   */
   
@@ -4336,8 +4336,8 @@ Acked-by: jbeulich@novell.com
  extern unsigned long arch_align_stack(unsigned long sp);
  extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-02-16 16:17:21.000000000 +0100
 @@ -91,7 +91,11 @@ struct tlb_state
  DECLARE_PER_CPU(struct tlb_state, cpu_tlbstate);
  #endif        /* SMP */
@@ -4351,8 +4351,8 @@ Acked-by: jbeulich@novell.com
  
  static inline void flush_tlb_pgtables(struct mm_struct *mm,
                                      unsigned long start, unsigned long end)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-02-16 16:17:21.000000000 +0100
 @@ -23,9 +23,9 @@
   * compile time, but to set the physical address only
   * in the boot process.
@@ -4384,8 +4384,8 @@ Acked-by: jbeulich@novell.com
  }
  
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-02-16 16:17:21.000000000 +0100
 @@ -76,7 +76,7 @@ static inline void switch_mm(struct mm_s
  
        if (likely(prev != next)) {
@@ -4404,8 +4404,8 @@ Acked-by: jbeulich@novell.com
                mm_pin(next);
        switch_mm(prev, next, NULL);
  }
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/page_64.h       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/page_64.h    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2009-02-16 16:17:21.000000000 +0100
 @@ -72,7 +72,8 @@ void copy_page(void *, void *);
  #define clear_user_page(page, vaddr, pg)      clear_page(page)
  #define copy_user_page(to, from, vaddr, pg)   copy_page(to, from)
@@ -4416,8 +4416,8 @@ Acked-by: jbeulich@novell.com
  #define __HAVE_ARCH_ALLOC_ZEROED_USER_HIGHPAGE
  
  /*
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-02-16 16:17:21.000000000 +0100
 @@ -21,7 +21,7 @@ static inline void pmd_populate_kernel(s
  
  static inline void pmd_populate(struct mm_struct *mm, pmd_t *pmd, struct page *pte)
@@ -4445,8 +4445,8 @@ Acked-by: jbeulich@novell.com
                BUG_ON(HYPERVISOR_update_va_mapping(
                               (unsigned long)pud,
                               pfn_pte(virt_to_phys(pud)>>PAGE_SHIFT, 
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-02-16 16:17:21.000000000 +0100
 @@ -304,7 +304,7 @@ static inline pte_t ptep_get_and_clear_f
  {
        if (full) {
@@ -4537,8 +4537,8 @@ Acked-by: jbeulich@novell.com
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR
  #define __HAVE_ARCH_PTEP_GET_AND_CLEAR_FULL
  #define __HAVE_ARCH_PTEP_CLEAR_FLUSH
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor_64.h  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor_64.h       2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_64.h       2009-02-16 16:17:21.000000000 +0100
 @@ -83,7 +83,6 @@ struct cpuinfo_x86 {
  #define X86_VENDOR_UMC 3
  #define X86_VENDOR_NEXGEN 4
@@ -4587,8 +4587,8 @@ Acked-by: jbeulich@novell.com
  static inline void serialize_cpu(void)
  {
        __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/system_64.h     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/system_64.h  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_64.h     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_64.h  2009-02-16 16:17:21.000000000 +0100
 @@ -79,12 +79,16 @@ static inline unsigned long read_cr0(voi
        unsigned long cr0;
        asm volatile("movq %%cr0,%0" : "=r" (cr0));
@@ -4649,8 +4649,8 @@ Acked-by: jbeulich@novell.com
  #endif        /* __KERNEL__ */
  
  #define nop() __asm__ __volatile__ ("nop")
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-02-16 16:17:21.000000000 +0100
 @@ -89,7 +89,11 @@ static inline void flush_tlb_range(struc
  
  #endif
@@ -4664,8 +4664,8 @@ Acked-by: jbeulich@novell.com
  
  static inline void flush_tlb_pgtables(struct mm_struct *mm,
                                      unsigned long start, unsigned long end)
---- sle11-2009-05-14.orig/include/asm-x86/thread_info.h        2009-04-20 11:36:10.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/thread_info.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/thread_info.h        2009-04-20 11:36:10.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/thread_info.h     2009-02-16 16:17:21.000000000 +0100
 @@ -150,7 +150,8 @@ struct thread_info {
  #define _TIF_WORK_CTXSW_PREV _TIF_WORK_CTXSW
  #define _TIF_WORK_CTXSW_NEXT (_TIF_WORK_CTXSW|_TIF_DEBUG)
@@ -4676,8 +4676,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  #define PREEMPT_ACTIVE                0x10000000
---- sle11-2009-05-14.orig/include/asm-x86/xen/interface.h      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/xen/interface.h   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/xen/interface.h      2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/xen/interface.h   2009-02-16 16:17:21.000000000 +0100
 @@ -10,17 +10,17 @@
  #define __ASM_X86_XEN_INTERFACE_H
  
@@ -4737,8 +4737,8 @@ Acked-by: jbeulich@novell.com
  #endif        /* !__ASSEMBLY__ */
  
  /*
---- sle11-2009-05-14.orig/include/asm-x86/xen/interface_32.h   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/xen/interface_32.h        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/xen/interface_32.h   2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/xen/interface_32.h        2009-02-16 16:17:21.000000000 +0100
 @@ -62,7 +62,7 @@ struct cpu_user_regs {
      uint16_t fs, _pad4;
      uint16_t gs, _pad5;
@@ -4748,8 +4748,8 @@ Acked-by: jbeulich@novell.com
  
  typedef uint64_t tsc_timestamp_t; /* RDTSC timestamp */
  
---- sle11-2009-05-14.orig/include/linux/elfnote.h      2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/linux/elfnote.h   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/elfnote.h      2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/linux/elfnote.h   2009-02-16 16:17:21.000000000 +0100
 @@ -52,7 +52,7 @@
  4484:.balign 4                                ;       \
  .popsection                           ;
@@ -4759,8 +4759,8 @@ Acked-by: jbeulich@novell.com
        ELFNOTE_START(name, type, "")           \
                desc                    ;       \
        ELFNOTE_END
---- sle11-2009-05-14.orig/include/linux/page-flags.h   2009-01-16 10:20:18.000000000 +0100
-+++ sle11-2009-05-14/include/linux/page-flags.h        2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/page-flags.h   2009-01-16 10:20:18.000000000 +0100
++++ sle11-2009-10-16/include/linux/page-flags.h        2009-02-16 16:17:21.000000000 +0100
 @@ -100,6 +100,10 @@ enum pageflags {
  #endif
  #ifdef CONFIG_XEN
@@ -4772,8 +4772,8 @@ Acked-by: jbeulich@novell.com
  #endif
        __NR_PAGEFLAGS,
  
---- sle11-2009-05-14.orig/include/linux/skbuff.h       2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/include/linux/skbuff.h    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/skbuff.h       2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/linux/skbuff.h    2009-02-16 16:17:21.000000000 +0100
 @@ -1772,7 +1772,7 @@ static inline void skb_forward_csum(stru
  
  bool skb_partial_csum_set(struct sk_buff *skb, u16 start, u16 off);
@@ -4783,8 +4783,8 @@ Acked-by: jbeulich@novell.com
  int skb_checksum_setup(struct sk_buff *skb);
  #else
  static inline int skb_checksum_setup(struct sk_buff *skb) { return 0; }
---- sle11-2009-05-14.orig/include/xen/driver_util.h    2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/xen/driver_util.h 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/driver_util.h    2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/xen/driver_util.h 2009-02-16 16:17:21.000000000 +0100
 @@ -5,10 +5,6 @@
  #include <linux/vmalloc.h>
  #include <linux/device.h>
@@ -4796,8 +4796,8 @@ Acked-by: jbeulich@novell.com
  extern struct class *get_xen_class(void);
  
  #endif /* __ASM_XEN_DRIVER_UTIL_H__ */
---- sle11-2009-05-14.orig/include/xen/features.h       2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/xen/features.h    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/features.h       2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/xen/features.h    2009-02-16 16:17:21.000000000 +0100
 @@ -10,6 +10,7 @@
  #define __XEN_FEATURES_H__
  
@@ -4812,8 +4812,8 @@ Acked-by: jbeulich@novell.com
  
 -#endif /* __ASM_XEN_FEATURES_H__ */
 +#endif /* __XEN_FEATURES_H__ */
---- sle11-2009-05-14.orig/include/xen/interface/arch-x86/xen.h 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/xen/interface/arch-x86/xen.h      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/arch-x86/xen.h 2009-10-28 14:55:07.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/arch-x86/xen.h      2009-02-16 16:17:21.000000000 +0100
 @@ -49,6 +49,9 @@
  #define get_xen_guest_handle(val, hnd)  do { val = (hnd).p; } while (0)
  #endif
@@ -4824,8 +4824,8 @@ Acked-by: jbeulich@novell.com
  #if defined(__i386__)
  #include "xen-x86_32.h"
  #elif defined(__x86_64__)
---- sle11-2009-05-14.orig/include/xen/interface/event_channel.h        2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/event_channel.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/event_channel.h        2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/event_channel.h     2009-02-16 16:17:21.000000000 +0100
 @@ -248,6 +248,7 @@ struct evtchn_op {
          struct evtchn_unmask           unmask;
      } u;
@@ -4834,8 +4834,8 @@ Acked-by: jbeulich@novell.com
  typedef struct evtchn_op evtchn_op_t;
  DEFINE_XEN_GUEST_HANDLE(evtchn_op_t);
  
---- sle11-2009-05-14.orig/include/xen/interface/io/netif.h     2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/io/netif.h  2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/io/netif.h     2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/io/netif.h  2009-02-16 16:17:21.000000000 +0100
 @@ -183,8 +183,22 @@ typedef struct netif_rx_response netif_r
   * Generate netif ring structures and types.
   */
@@ -4859,8 +4859,8 @@ Acked-by: jbeulich@novell.com
  
  #define NETIF_RSP_DROPPED         -2
  #define NETIF_RSP_ERROR           -1
---- sle11-2009-05-14.orig/include/xen/interface/memory.h       2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/memory.h    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/memory.h       2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/memory.h    2009-02-16 16:17:21.000000000 +0100
 @@ -82,6 +82,7 @@ struct xen_memory_reservation {
      domid_t        domid;
  
@@ -4893,8 +4893,8 @@ Acked-by: jbeulich@novell.com
  typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t;
  DEFINE_XEN_GUEST_HANDLE(xen_translate_gpfn_list_t);
  
---- sle11-2009-05-14.orig/include/xen/interface/sched.h        2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/sched.h     2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/sched.h        2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/sched.h     2009-02-16 16:17:21.000000000 +0100
 @@ -67,6 +67,7 @@
  struct sched_shutdown {
      unsigned int reason; /* SHUTDOWN_* */
@@ -4911,8 +4911,8 @@ Acked-by: jbeulich@novell.com
  typedef struct sched_poll sched_poll_t;
  DEFINE_XEN_GUEST_HANDLE(sched_poll_t);
  
---- sle11-2009-05-14.orig/include/xen/interface/version.h      2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/version.h   2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/version.h      2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/version.h   2009-02-16 16:17:21.000000000 +0100
 @@ -36,6 +36,9 @@
  /* arg == xen_extraversion_t. */
  #define XENVER_extraversion 1
@@ -4940,8 +4940,8 @@ Acked-by: jbeulich@novell.com
  #define XEN_CHANGESET_INFO_LEN (sizeof(xen_changeset_info_t))
  
  #define XENVER_platform_parameters 5
---- sle11-2009-05-14.orig/include/xen/interface/xen.h  2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/xen.h       2009-05-14 11:17:48.000000000 +0200
+--- sle11-2009-10-16.orig/include/xen/interface/xen.h  2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/xen.h       2009-05-14 11:17:48.000000000 +0200
 @@ -32,7 +32,9 @@
  #include <asm/pvclock-abi.h>
  #endif
@@ -5004,8 +5004,8 @@ Acked-by: jbeulich@novell.com
  typedef struct multicall_entry multicall_entry_t;
  DEFINE_XEN_GUEST_HANDLE(multicall_entry_t);
  
---- sle11-2009-05-14.orig/include/xen/xenbus.h 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/include/xen/xenbus.h      2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/xenbus.h 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/include/xen/xenbus.h      2009-02-16 16:17:21.000000000 +0100
 @@ -57,16 +57,20 @@ struct xenbus_watch
        void (*callback)(struct xenbus_watch *,
                         const char **vec, unsigned int len);
@@ -5050,8 +5050,8 @@ Acked-by: jbeulich@novell.com
  
  /**
   * Advertise in the store a change of the given driver to the given new_state.
---- sle11-2009-05-14.orig/net/core/dev.c       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/net/core/dev.c    2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/net/core/dev.c       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/net/core/dev.c    2009-02-16 16:17:21.000000000 +0100
 @@ -131,7 +131,7 @@
  
  #include "net-sysfs.h"
similarity index 94%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.24
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.24
index daff2bafa29cb109ccacc951acd4316a0f8e2cd2..aa2756a9b807d4c9b43ab92271069feaf16ee48e 100644 (file)
@@ -6,8 +6,8 @@ Automatically created from "patches.kernel.org/patch-2.6.24" by xen-port-patches
 
 Acked-by: jbeulich@novell.com
 
---- sle11-2009-06-29.orig/arch/x86/Kconfig     2009-02-05 10:22:38.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-02-05 10:22:38.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-02-16 16:18:36.000000000 +0100
 @@ -50,15 +50,16 @@ config GENERIC_CMOS_UPDATE
  
  config CLOCKSOURCE_WATCHDOG
@@ -156,8 +156,8 @@ Acked-by: jbeulich@novell.com
        help
          DMA remapping (DMAR) devices support enables independent address
          translations for Direct Memory Access (DMA) from devices.
---- sle11-2009-06-29.orig/arch/x86/Makefile    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Makefile 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Makefile    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Makefile 2009-02-16 16:18:36.000000000 +0100
 @@ -191,8 +191,8 @@ PHONY += zImage bzImage vmlinuz compress
           zdisk bzdisk fdimage fdimage144 fdimage288 isoimage install
  
@@ -178,8 +178,8 @@ Acked-by: jbeulich@novell.com
  else
  # Default kernel to build
  all: bzImage
---- sle11-2009-06-29.orig/arch/x86/ia32/ia32entry-xen.S        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/ia32/ia32entry-xen.S     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-02-16 16:18:36.000000000 +0100
 @@ -125,20 +125,16 @@ sysenter_do_call:        
        jmp int_ret_from_sys_call
  
@@ -228,16 +228,16 @@ Acked-by: jbeulich@novell.com
        jmp cstar_do_call
  END(ia32_cstar_target)
                                
---- sle11-2009-06-29.orig/arch/x86/kernel/Makefile     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/Makefile  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-02-16 16:18:36.000000000 +0100
 @@ -127,4 +127,4 @@ endif
  disabled-obj-$(CONFIG_XEN) := early-quirks.o hpet.o i8253.o i8259_$(BITS).o reboot.o \
        smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
  disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
 -%/head_64.o %/head_64.s: $(if $(CONFIG_XEN),EXTRA_AFLAGS,dummy) :=
 +%/head_64.o %/head_64.s: asflags-$(CONFIG_XEN) :=
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/sleep_32-xen.c       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_32-xen.c       2009-02-16 16:18:36.000000000 +0100
 @@ -90,7 +90,7 @@ __setup("acpi_sleep=", acpi_sleep_setup)
  
  /* Ouch, we want to delete this. We already have better version in userspace, in
@@ -247,8 +247,8 @@ Acked-by: jbeulich@novell.com
  {
        acpi_realmode_flags |= 2;
        return 0;
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/sleep_64-xen.c       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep_64-xen.c       2009-02-16 16:18:36.000000000 +0100
 @@ -123,6 +123,3 @@ static int __init acpi_sleep_setup(char 
  __setup("acpi_sleep=", acpi_sleep_setup);
  #endif                                /* CONFIG_ACPI_PV_SLEEP */
@@ -256,8 +256,8 @@ Acked-by: jbeulich@novell.com
 -void acpi_pci_link_exit(void)
 -{
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/apic_64-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/apic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -63,22 +63,38 @@ int setup_profiling_timer(unsigned int m
  
  void smp_local_timer_interrupt(void)
@@ -329,8 +329,8 @@ Acked-by: jbeulich@novell.com
        irq_exit();
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/common-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/common-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -214,7 +214,7 @@ static void __cpuinit get_cpu_vendor(str
  
  static int __init x86_fxsr_setup(char * s)
@@ -340,8 +340,8 @@ Acked-by: jbeulich@novell.com
        disable_x86_fxsr = 1;
  
        /*
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_32-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/e820_32-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -52,6 +52,13 @@ struct resource code_resource = {
        .flags  = IORESOURCE_BUSY | IORESOURCE_MEM
  };
@@ -403,8 +403,8 @@ Acked-by: jbeulich@novell.com
         * memory space.
         */
        last = 0x100000000ull;
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_64-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/e820_64-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -24,7 +24,7 @@
  #include <asm/page.h>
  #include <asm/e820.h>
@@ -485,24 +485,26 @@ Acked-by: jbeulich@novell.com
 +              max_pfn << PAGE_SHIFT) - *addr;
 +      return i + 1;
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/early_printk-xen.c   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/early_printk-xen.c        2009-02-16 16:18:36.000000000 +0100
-@@ -6,14 +6,9 @@
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-09-24 10:27:18.000000000 +0200
+@@ -6,15 +6,10 @@
  #include <asm/io.h>
  #include <asm/processor.h>
  #include <asm/fcntl.h>
-+#include <asm/setup.h>
- /* Simple VGA output */
+-
+-/* Simple VGA output */
 -
 -#ifdef __i386__
--#include <asm/setup.h>
+ #include <asm/setup.h>
 -#else
 -#include <asm/bootsetup.h>
 -#endif
++
+ #ifndef CONFIG_XEN
++/* Simple VGA output */
  #define VGABASE               (__ISA_IO_base + 0xb8000)
  
- #ifndef CONFIG_XEN
+ static int max_ypos = 25, max_xpos = 80;
 @@ -264,10 +259,10 @@ static int __init setup_early_printk(cha
                early_console = &early_serial_console;
        } else if (!strncmp(buf, "vga", 3)) {
@@ -518,8 +520,8 @@ Acked-by: jbeulich@novell.com
  #endif
                early_console = &early_vga_console;
        } else if (!strncmp(buf, "simnow", 6)) {
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_32-xen.S       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:18:18.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:18:18.000000000 +0200
 @@ -254,6 +254,7 @@ check_userspace:
        jb resume_kernel                # not returning to v8086 or userspace
  
@@ -569,8 +571,8 @@ Acked-by: jbeulich@novell.com
 +#include "syscall_table_32.S"
  
  syscall_table_size=(.-sys_call_table)
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_64-xen.S       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_64-xen.S    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-02-16 16:18:36.000000000 +0100
 @@ -57,7 +57,7 @@
  #include <xen/interface/arch-x86_64.h>
  #include <xen/interface/features.h>
@@ -644,8 +646,8 @@ Acked-by: jbeulich@novell.com
        call do_exit
        CFI_ENDPROC
  ENDPROC(child_rip)
---- sle11-2009-06-29.orig/arch/x86/kernel/genapic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/genapic_64-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -24,12 +24,21 @@
  #include <acpi/acpi_bus.h>
  #endif
@@ -673,8 +675,8 @@ Acked-by: jbeulich@novell.com
  
  #ifndef CONFIG_XEN
  struct genapic __read_mostly *genapic = &apic_flat;
---- sle11-2009-06-29.orig/arch/x86/kernel/head64-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head64-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -1,5 +1,5 @@
  /*
 - *  linux/arch/x86_64/kernel/head64.c -- prepare to run common code
@@ -731,8 +733,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
        early_printk("Kernel alive\n");
---- sle11-2009-06-29.orig/arch/x86/kernel/init_task-xen.c      2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/init_task-xen.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/init_task-xen.c      2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/init_task-xen.c   2009-02-16 16:18:36.000000000 +0100
 @@ -14,11 +14,11 @@ static struct fs_struct init_fs = INIT_F
  static struct files_struct init_files = INIT_FILES;
  static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
@@ -776,8 +778,8 @@ Acked-by: jbeulich@novell.com
  DEFINE_PER_CPU_SHARED_ALIGNED(struct tss_struct, init_tss) = INIT_TSS;
  #endif
  
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_32-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_32-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -427,7 +427,7 @@ static struct irq_cpu_info {
  
  #define IRQ_ALLOWED(cpu, allowed_mask)        cpu_isset(cpu, allowed_mask)
@@ -945,8 +947,8 @@ Acked-by: jbeulich@novell.com
  #endif /* CONFIG_ACPI */
  
  static int __init parse_disable_timer_pin_1(char *arg)
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_64-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_64-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -31,6 +31,7 @@
  #include <linux/sysdev.h>
  #include <linux/msi.h>
@@ -1190,8 +1192,8 @@ Acked-by: jbeulich@novell.com
  #endif
  #endif /* !CONFIG_XEN */
 +
---- sle11-2009-06-29.orig/arch/x86/kernel/ioport_32-xen.c      2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ioport_32-xen.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_32-xen.c      2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport_32-xen.c   2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *    linux/arch/i386/kernel/ioport.c
@@ -1199,8 +1201,8 @@ Acked-by: jbeulich@novell.com
   * This contains the io-permission bitmap code - written by obz, with changes
   * by Linus.
   */
---- sle11-2009-06-29.orig/arch/x86/kernel/ioport_64-xen.c      2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ioport_64-xen.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_64-xen.c      2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport_64-xen.c   2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *    linux/arch/x86_64/kernel/ioport.c
@@ -1208,8 +1210,8 @@ Acked-by: jbeulich@novell.com
   * This contains the io-permission bitmap code - written by obz, with changes
   * by Linus.
   */
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_32-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_32-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *    linux/arch/i386/kernel/irq.c
@@ -1310,8 +1312,8 @@ Acked-by: jbeulich@novell.com
  #endif
                seq_printf(p, "ERR: %10u\n", atomic_read(&irq_err_count));
  #if defined(CONFIG_X86_IO_APIC)
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_64-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_64-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *    linux/arch/x86_64/kernel/irq.c
@@ -1408,8 +1410,8 @@ Acked-by: jbeulich@novell.com
  
  #ifndef CONFIG_X86_LOCAL_APIC
  /*
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt_32-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ldt_32-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_32-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_32-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - * linux/arch/i386/kernel/ldt.c
@@ -1471,8 +1473,8 @@ Acked-by: jbeulich@novell.com
  out:
        return error;
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt_64-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ldt_64-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_64-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt_64-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - * linux/arch/x86_64/kernel/ldt.c
@@ -1551,8 +1553,8 @@ Acked-by: jbeulich@novell.com
  out:
        return error;
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_32-xen.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_32-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -1023,7 +1023,7 @@ void __init mp_config_acpi_legacy_irqs (
  
        /* 
@@ -1562,8 +1564,8 @@ Acked-by: jbeulich@novell.com
         */
        for (i = 0; i < 16; i++) {
                int idx;
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_64-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_64-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -57,6 +57,8 @@ unsigned long mp_lapic_addr = 0;
  
  /* Processor that is doing the boot up */
@@ -1609,8 +1611,8 @@ Acked-by: jbeulich@novell.com
  {
        num_processors++;
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/pci-dma-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/pci-dma-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -13,14 +13,13 @@
  #include <linux/pci.h>
  #include <linux/module.h>
@@ -1703,8 +1705,8 @@ Acked-by: jbeulich@novell.com
        if (mem && vaddr >= mem->virt_base && vaddr < (mem->virt_base + (mem->size << PAGE_SHIFT))) {
                int page = (vaddr - mem->virt_base) >> PAGE_SHIFT;
  
---- sle11-2009-06-29.orig/arch/x86/kernel/process_32-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_32-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/i386/kernel/process.c
@@ -1831,8 +1833,8 @@ Acked-by: jbeulich@novell.com
        show_trace(NULL, regs, &regs->esp);
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/process_64-xen.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_64-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/x86-64/kernel/process.c
@@ -1899,8 +1901,8 @@ Acked-by: jbeulich@novell.com
  __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
  {
        struct thread_struct *prev = &prev_p->thread,
---- sle11-2009-06-29.orig/arch/x86/kernel/quirks-xen.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/quirks-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/quirks-xen.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/quirks-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -41,7 +41,353 @@ static void __devinit quirk_intel_irqbal
        if (!(config & 0x2))
                pci_write_config_byte(dev, 0xf4, config);
@@ -2258,8 +2260,8 @@ Acked-by: jbeulich@novell.com
 +}
 +
  #endif
---- sle11-2009-06-29.orig/arch/x86/kernel/setup64-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup64-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -15,7 +15,6 @@
  #include <linux/bootmem.h>
  #include <linux/bitops.h>
@@ -2308,8 +2310,8 @@ Acked-by: jbeulich@novell.com
  /*
   * cpu_init() initializes state that is per-CPU. Some data is already
   * initialized (naturally) in the bootstrap process, such as the GDT
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_32-xen.c       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_32-xen.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/i386/kernel/setup.c
@@ -2566,8 +2568,8 @@ Acked-by: jbeulich@novell.com
  #endif
  
  #ifdef CONFIG_ACPI
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_64-xen.c       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_64-xen.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-02-16 16:18:36.000000000 +0100
 @@ -1,10 +1,5 @@
  /*
 - *  linux/arch/x86-64/kernel/setup.c
@@ -2981,8 +2983,8 @@ Acked-by: jbeulich@novell.com
        return c_start(m, pos);
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_32-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_32-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -72,7 +72,7 @@
   *
   *            B stepping CPUs may hang. There are hardware work arounds
@@ -3034,8 +3036,8 @@ Acked-by: jbeulich@novell.com
        irq_exit();
  
        if (wait) {
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_64-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_64-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -167,6 +167,7 @@ asmlinkage void smp_invalidate_interrupt
  out:
        ack_APIC_irq();
@@ -3242,8 +3244,8 @@ Acked-by: jbeulich@novell.com
        irq_exit();
        if (wait) {
                mb();
---- sle11-2009-06-29.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:12:09.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/time_32-xen.c     2009-03-24 10:12:35.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:53.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:57:59.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/i386/kernel/time.c
@@ -3273,7 +3275,7 @@ Acked-by: jbeulich@novell.com
        /*
         * Here we are in the timer irq handler. We just have irqs locally
         * disabled but we don't know if the timer_bh is running on the other
-@@ -994,7 +1000,7 @@ static int time_cpufreq_notifier(struct 
+@@ -995,7 +1001,7 @@ static int time_cpufreq_notifier(struct 
        struct cpufreq_freqs *freq = data;
        struct xen_platform_op op;
  
@@ -3282,7 +3284,7 @@ Acked-by: jbeulich@novell.com
                return 0;
  
        if (val == CPUFREQ_PRECHANGE)
-@@ -1032,30 +1038,33 @@ core_initcall(cpufreq_time_setup);
+@@ -1033,30 +1039,33 @@ core_initcall(cpufreq_time_setup);
   */
  static ctl_table xen_subtable[] = {
        {
@@ -3322,8 +3324,8 @@ Acked-by: jbeulich@novell.com
  };
  static int __init xen_sysctl_init(void)
  {
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_32-xen.c       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_32-xen.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/i386/traps.c
@@ -3566,8 +3568,8 @@ Acked-by: jbeulich@novell.com
  
  /*
   * NB. All these are "trap gates" (i.e. events_mask isn't set) except
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_64-xen.c       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_64-xen.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/x86-64/traps.c
@@ -3720,8 +3722,8 @@ Acked-by: jbeulich@novell.com
        get_debugreg(condition, 6);
  
        if (notify_die(DIE_DEBUG, "debug", regs, condition, error_code,
---- sle11-2009-06-29.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/vsyscall_64-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,4 @@
  /*
 - *  linux/arch/x86_64/kernel/vsyscall.c
@@ -3811,8 +3813,8 @@ Acked-by: jbeulich@novell.com
                write_rdtscp_aux((node << 12) | cpu);
  
        /* Store cpu number in limit so that it can be loaded quickly
---- sle11-2009-06-29.orig/arch/x86/mm/fault_32-xen.c   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/fault_32-xen.c        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_32-xen.c        2009-02-16 16:18:36.000000000 +0100
 @@ -25,6 +25,7 @@
  #include <linux/kprobes.h>
  #include <linux/uaccess.h>
@@ -3994,8 +3996,8 @@ Acked-by: jbeulich@novell.com
        goto no_context;
  
  do_sigbus:
---- sle11-2009-06-29.orig/arch/x86/mm/fault_64-xen.c   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/fault_64-xen.c        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault_64-xen.c        2009-02-16 16:18:36.000000000 +0100
 @@ -25,6 +25,7 @@
  #include <linux/kprobes.h>
  #include <linux/uaccess.h>
@@ -4158,8 +4160,8 @@ Acked-by: jbeulich@novell.com
 -      return 1;
 -}
 -__setup("pagefaulttrace", enable_pagefaulttrace);
---- sle11-2009-06-29.orig/arch/x86/mm/hypervisor.c     2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/hypervisor.c  2009-05-06 10:23:43.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/hypervisor.c     2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/hypervisor.c  2009-05-06 10:23:43.000000000 +0200
 @@ -496,6 +496,9 @@ int xen_create_contiguous_region(
        unsigned long  frame, flags;
        unsigned int   i;
@@ -4238,8 +4240,8 @@ Acked-by: jbeulich@novell.com
        cr_mcl[i - 1].args[MULTI_UVMFLAGS_INDEX] = order
                                                   ? UVMF_TLB_FLUSH|UVMF_ALL
                                                   : UVMF_INVLPG|UVMF_ALL;
---- sle11-2009-06-29.orig/arch/x86/mm/init_32-xen.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_32-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-02-16 16:18:36.000000000 +0100
 @@ -94,7 +94,14 @@ static pte_t * __init one_page_table_ini
  #else
        if (!(__pmd_val(*pmd) & _PAGE_PRESENT)) {
@@ -4322,8 +4324,8 @@ Acked-by: jbeulich@novell.com
  }
  
  /*
---- sle11-2009-06-29.orig/arch/x86/mm/init_64-xen.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_64-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-02-16 16:18:36.000000000 +0100
 @@ -767,7 +767,7 @@ static void xen_finish_init_mapping(void
  /* Setup the direct mapping of the physical memory at PAGE_OFFSET.
     This runs before bootmem is initialized and gets pages directly from the 
@@ -4410,8 +4412,8 @@ Acked-by: jbeulich@novell.com
 +      return 0;
 +}
 +#endif
---- sle11-2009-06-29.orig/arch/x86/mm/pageattr_64-xen.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pageattr_64-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr_64-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -17,9 +17,6 @@
  #include <asm/pgalloc.h>
  #include <asm/mmu_context.h>
@@ -4633,8 +4635,8 @@ Acked-by: jbeulich@novell.com
  
        flush_map(&l);
  
---- sle11-2009-06-29.orig/arch/x86/mm/pgtable_32-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pgtable_32-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-02-16 16:18:36.000000000 +0100
 @@ -6,6 +6,7 @@
  #include <linux/kernel.h>
  #include <linux/errno.h>
@@ -4661,8 +4663,8 @@ Acked-by: jbeulich@novell.com
  {
        memset(pmd, 0, PTRS_PER_PMD*sizeof(pmd_t));
  }
---- sle11-2009-06-29.orig/arch/x86/pci/irq-xen.c       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/pci/irq-xen.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-02-16 16:18:36.000000000 +0100
 @@ -173,7 +173,7 @@ void eisa_set_level_irq(unsigned int irq
  }
  
@@ -4759,8 +4761,8 @@ Acked-by: jbeulich@novell.com
  {
        if (!acer_tm360_irqrouting) {
                acer_tm360_irqrouting = 1;
---- sle11-2009-06-29.orig/drivers/acpi/processor_idle.c        2009-06-29 15:17:44.000000000 +0200
-+++ sle11-2009-06-29/drivers/acpi/processor_idle.c     2009-06-29 15:29:06.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/acpi/processor_idle.c        2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/acpi/processor_idle.c     2009-06-29 15:29:06.000000000 +0200
 @@ -1749,6 +1749,13 @@ int acpi_processor_cst_has_changed(struc
        if (!pr->flags.power_setup_done)
                return -ENODEV;
@@ -4775,8 +4777,8 @@ Acked-by: jbeulich@novell.com
        cpuidle_pause_and_lock();
        cpuidle_disable_device(&pr->power.dev);
        acpi_processor_get_power_info(pr);
---- sle11-2009-06-29.orig/drivers/cpuidle/Kconfig      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/cpuidle/Kconfig   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/cpuidle/Kconfig      2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/cpuidle/Kconfig   2009-02-16 16:18:36.000000000 +0100
 @@ -1,6 +1,7 @@
  
  config CPU_IDLE
@@ -4785,8 +4787,8 @@ Acked-by: jbeulich@novell.com
        default ACPI
        help
          CPU idle is a generic framework for supporting software-controlled
---- sle11-2009-06-29.orig/drivers/oprofile/cpu_buffer.c        2009-02-16 16:01:39.000000000 +0100
-+++ sle11-2009-06-29/drivers/oprofile/cpu_buffer.c     2009-03-12 16:15:32.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/oprofile/cpu_buffer.c        2009-02-16 16:01:39.000000000 +0100
++++ sle11-2009-10-16/drivers/oprofile/cpu_buffer.c     2009-03-12 16:15:32.000000000 +0100
 @@ -308,6 +308,37 @@ void oprofile_add_trace(unsigned long pc
  }
  
@@ -4825,8 +4827,8 @@ Acked-by: jbeulich@novell.com
  int oprofile_add_domain_switch(int32_t domain_id)
  {
        struct oprofile_cpu_buffer * cpu_buf = &cpu_buffer[smp_processor_id()];
---- sle11-2009-06-29.orig/drivers/pci/msi-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/pci/msi-xen.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-02-16 16:18:36.000000000 +0100
 @@ -264,6 +264,12 @@ static int msi_map_vector(struct pci_dev
        return msi_map_pirq_to_vector(dev, -1, entry_nr, table_base);
  }
@@ -4894,8 +4896,8 @@ Acked-by: jbeulich@novell.com
        dev->msix_enabled = 0;
  }
  EXPORT_SYMBOL(pci_disable_msix);
---- sle11-2009-06-29.orig/drivers/xen/blkback/blkback.c        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkback/blkback.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/blkback.c        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/blkback.c     2009-02-16 16:18:36.000000000 +0100
 @@ -269,13 +269,10 @@ static void __end_block_io_op(pending_re
        }
  }
@@ -4911,8 +4913,8 @@ Acked-by: jbeulich@novell.com
  }
  
  
---- sle11-2009-06-29.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:12:03.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkfront/blkfront.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:12:03.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-02-16 16:18:36.000000000 +0100
 @@ -233,7 +233,7 @@ static int setup_blkring(struct xenbus_d
        SHARED_RING_INIT(sring);
        FRONT_RING_INIT(&info->ring, sring, PAGE_SIZE);
@@ -4934,16 +4936,16 @@ Acked-by: jbeulich@novell.com
                        fsect = sg->offset >> 9;
                        lsect = fsect + (sg->length >> 9) - 1;
                        /* install a grant reference. */
---- sle11-2009-06-29.orig/drivers/xen/core/firmware.c  2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/core/firmware.c       2009-03-25 18:10:23.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/firmware.c  2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/firmware.c       2009-03-25 18:10:23.000000000 +0100
 @@ -1,4 +1,5 @@
  #include <linux/kernel.h>
 +#include <linux/string.h>
  #include <linux/errno.h>
  #include <linux/init.h>
  #include <linux/edd.h>
---- sle11-2009-06-29.orig/drivers/xen/core/machine_kexec.c     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/core/machine_kexec.c  2009-02-17 11:46:41.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/machine_kexec.c     2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/machine_kexec.c  2009-02-17 11:46:41.000000000 +0100
 @@ -29,6 +29,10 @@ void __init xen_machine_kexec_setup_reso
        int k = 0;
        int rc;
@@ -4983,8 +4985,8 @@ Acked-by: jbeulich@novell.com
  void machine_shutdown(void)
  {
        /* do nothing */
---- sle11-2009-06-29.orig/drivers/xen/core/smpboot.c   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/smpboot.c        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-02-16 16:18:36.000000000 +0100
 @@ -45,8 +45,8 @@ cpumask_t cpu_possible_map;
  EXPORT_SYMBOL(cpu_possible_map);
  cpumask_t cpu_initialized_map;
@@ -5100,8 +5102,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef __x86_64__
                cpu_pda(cpu)->pcurrent = idle;
---- sle11-2009-06-29.orig/drivers/xen/netback/loopback.c       2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/netback/loopback.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/loopback.c       2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/loopback.c    2009-02-16 16:18:36.000000000 +0100
 @@ -285,9 +285,9 @@ static void __exit clean_loopback(int i)
        char dev_name[IFNAMSIZ];
  
@@ -5114,8 +5116,8 @@ Acked-by: jbeulich@novell.com
        if (dev1 && dev2) {
                unregister_netdev(dev2);
                unregister_netdev(dev1);
---- sle11-2009-06-29.orig/drivers/xen/netback/netback.c        2008-12-23 09:33:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/netback/netback.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/netback.c        2008-12-23 09:33:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/netback.c     2009-02-16 16:18:36.000000000 +0100
 @@ -350,8 +350,8 @@ static void xen_network_done_notify(void
  {
        static struct net_device *eth0_dev = NULL;
@@ -5127,8 +5129,8 @@ Acked-by: jbeulich@novell.com
  }
  /* 
   * Add following to poll() function in NAPI driver (Tigon3 is example):
---- sle11-2009-06-29.orig/drivers/xen/netback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/netback/xenbus.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netback/xenbus.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netback/xenbus.c      2009-02-16 16:18:36.000000000 +0100
 @@ -149,12 +149,10 @@ fail:
   * and vif variables to the environment, for the benefit of the vif-* hotplug
   * scripts.
@@ -5161,8 +5163,8 @@ Acked-by: jbeulich@novell.com
  
        return 0;
  }
---- sle11-2009-06-29.orig/drivers/xen/netfront/accel.c 2009-04-09 14:43:45.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/netfront/accel.c      2009-03-30 16:39:19.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/accel.c 2009-04-09 14:43:45.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/accel.c      2009-03-30 16:39:19.000000000 +0200
 @@ -313,7 +313,7 @@ accelerator_set_vif_state_hooks(struct n
        DPRINTK("%p\n",vif_state);
  
@@ -5199,8 +5201,8 @@ Acked-by: jbeulich@novell.com
  }
  
  
---- sle11-2009-06-29.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:36:30.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/netfront/netfront.c   2009-03-30 16:39:44.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:36:30.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-03-30 16:39:44.000000000 +0200
 @@ -626,6 +626,7 @@ static int network_open(struct net_devic
        struct netfront_info *np = netdev_priv(dev);
  
@@ -5319,8 +5321,8 @@ Acked-by: jbeulich@novell.com
        SET_NETDEV_DEV(netdev, &dev->dev);
  
        np->netdev = netdev;
---- sle11-2009-06-29.orig/drivers/xen/netfront/netfront.h      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/netfront/netfront.h   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.h      2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.h   2009-02-16 16:18:36.000000000 +0100
 @@ -157,6 +157,8 @@ struct netfront_info {
        spinlock_t   tx_lock;
        spinlock_t   rx_lock;
@@ -5330,8 +5332,8 @@ Acked-by: jbeulich@novell.com
        unsigned int irq;
        unsigned int copying_receiver;
        unsigned int carrier;
---- sle11-2009-06-29.orig/drivers/xen/pciback/Makefile 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/pciback/Makefile      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pciback/Makefile 2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pciback/Makefile      2009-02-16 16:18:36.000000000 +0100
 @@ -12,6 +12,4 @@ pciback-$(CONFIG_XEN_PCIDEV_BACKEND_SLOT
  pciback-$(CONFIG_XEN_PCIDEV_BACKEND_PASS) += passthrough.o
  pciback-$(CONFIG_XEN_PCIDEV_BACKEND_CONTROLLER) += controller.o
@@ -5340,8 +5342,8 @@ Acked-by: jbeulich@novell.com
 -EXTRA_CFLAGS += -DDEBUG
 -endif
 +ccflags-$(CONFIG_XEN_PCIDEV_BE_DEBUG) += -DDEBUG
---- sle11-2009-06-29.orig/drivers/xen/pcifront/Makefile        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/pcifront/Makefile     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/pcifront/Makefile        2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/pcifront/Makefile     2009-02-16 16:18:36.000000000 +0100
 @@ -2,6 +2,4 @@ obj-y += pcifront.o
  
  pcifront-y := pci_op.o xenbus.o pci.o
@@ -5350,8 +5352,8 @@ Acked-by: jbeulich@novell.com
 -EXTRA_CFLAGS += -DDEBUG
 -endif
 +ccflags-$(CONFIG_XEN_PCIDEV_FE_DEBUG) += -DDEBUG
---- sle11-2009-06-29.orig/drivers/xen/scsiback/emulate.c       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/scsiback/emulate.c    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/emulate.c       2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/emulate.c    2009-02-16 16:18:36.000000000 +0100
 @@ -104,9 +104,10 @@ static void resp_not_supported_cmd(pendi
  }
  
@@ -5430,8 +5432,8 @@ Acked-by: jbeulich@novell.com
                to += copy_size;
        }
  
---- sle11-2009-06-29.orig/drivers/xen/scsiback/scsiback.c      2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/scsiback/scsiback.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsiback/scsiback.c      2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsiback/scsiback.c   2009-02-16 16:18:36.000000000 +0100
 @@ -247,6 +247,8 @@ static int scsiback_gnttab_data_map(vscs
        write = (data_dir == DMA_TO_DEVICE);
  
@@ -5552,8 +5554,8 @@ Acked-by: jbeulich@novell.com
        }
  
        return err;
---- sle11-2009-06-29.orig/drivers/xen/scsifront/scsifront.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/scsifront/scsifront.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/scsifront.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/scsifront.c 2009-02-16 16:18:36.000000000 +0100
 @@ -246,11 +246,10 @@ static int map_data_for_request(struct v
  {
        grant_ref_t gref_head;
@@ -5616,8 +5618,8 @@ Acked-by: jbeulich@novell.com
                                off = 0;
                                ref_cnt++;
                        }
---- sle11-2009-06-29.orig/drivers/xen/sfc_netback/accel_fwd.c  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/sfc_netback/accel_fwd.c       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel_fwd.c  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel_fwd.c       2009-02-16 16:18:36.000000000 +0100
 @@ -181,10 +181,11 @@ int netback_accel_fwd_add(const __u8 *ma
        unsigned long flags;
        cuckoo_hash_mac_key key = cuckoo_mac_to_key(mac);
@@ -5672,8 +5674,8 @@ Acked-by: jbeulich@novell.com
  
                spin_lock_irqsave(&fwd_set->fwd_lock, flags);
                /*
---- sle11-2009-06-29.orig/drivers/xen/sfc_netback/accel_msg.c  2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netback/accel_msg.c       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel_msg.c  2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel_msg.c       2009-02-16 16:18:36.000000000 +0100
 @@ -57,11 +57,11 @@ static void netback_accel_msg_tx_localma
  {
        unsigned long lock_state;
@@ -5688,8 +5690,8 @@ Acked-by: jbeulich@novell.com
        
        msg = net_accel_msg_start_send(bend->shared_page, &bend->to_domU,
                                       &lock_state);
---- sle11-2009-06-29.orig/drivers/xen/sfc_netfront/accel_msg.c 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/sfc_netfront/accel_msg.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_msg.c 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_msg.c      2009-02-16 16:18:36.000000000 +0100
 @@ -41,11 +41,13 @@ static void vnic_start_interrupts(netfro
        /* Prime our interrupt */
        spin_lock_irqsave(&vnic->irq_enabled_lock, flags);
@@ -5770,8 +5772,8 @@ Acked-by: jbeulich@novell.com
        }
        else {
                spin_unlock_irqrestore(&vnic->irq_enabled_lock, flags);
---- sle11-2009-06-29.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:36:26.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:39:38.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel_vi.c  2009-03-30 16:36:26.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel_vi.c       2009-03-30 16:39:38.000000000 +0200
 @@ -641,8 +641,10 @@ netfront_accel_vi_tx_post(netfront_accel
                                          (cuckoo_hash_key *)(&key), &value);
  
@@ -5798,8 +5800,8 @@ Acked-by: jbeulich@novell.com
  
                if (ip->protocol == IPPROTO_TCP) {
                        struct tcphdr *tcp = (struct tcphdr *)
---- sle11-2009-06-29.orig/drivers/xen/sfc_netutil/accel_util.h 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netutil/accel_util.h      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netutil/accel_util.h 2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/sfc_netutil/accel_util.h      2009-02-16 16:18:36.000000000 +0100
 @@ -63,9 +63,6 @@
                        DPRINTK("%s at %s:%d\n", #exp, __FILE__, __LINE__); \
        } while(0)
@@ -5810,8 +5812,8 @@ Acked-by: jbeulich@novell.com
  #include <xen/xenbus.h>
  
  /*! Map a set of pages from another domain
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_probe.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_probe.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2009-02-16 16:18:36.000000000 +0100
 @@ -174,11 +174,9 @@ static int read_backend_details(struct x
  }
  
@@ -5841,8 +5843,8 @@ Acked-by: jbeulich@novell.com
  
        return 0;
  }
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_probe_backend.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe_backend.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe_backend.c 2009-02-16 16:18:36.000000000 +0100
 @@ -60,8 +60,7 @@
  #include <xen/platform-compat.h>
  #endif
@@ -5900,8 +5902,8 @@ Acked-by: jbeulich@novell.com
        }
  
        return 0;
---- sle11-2009-06-29.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenoprof/xenoprofile.c        2009-03-11 15:39:38.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenoprof/xenoprofile.c        2009-03-11 15:39:38.000000000 +0100
 @@ -29,7 +29,6 @@
  #include <xen/driver_util.h>
  #include <xen/interface/xen.h>
@@ -5920,8 +5922,8 @@ Acked-by: jbeulich@novell.com
                        if (!is_passive)
                                oprofile_samples++;
                        else
---- sle11-2009-06-29.orig/fs/xfs/linux-2.6/xfs_buf.c   2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/fs/xfs/linux-2.6/xfs_buf.c        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/fs/xfs/linux-2.6/xfs_buf.c   2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/fs/xfs/linux-2.6/xfs_buf.c        2009-02-16 16:18:36.000000000 +0100
 @@ -187,7 +187,7 @@ free_address(
  {
        a_list_t        *aentry;
@@ -5931,8 +5933,8 @@ Acked-by: jbeulich@novell.com
        /*
         * Xen needs to be able to make sure it can get an exclusive
         * RO mapping of pages it wants to turn into a pagetable.  If
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/agp.h   2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/agp.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/agp.h   2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/agp.h        2009-02-16 16:18:36.000000000 +0100
 @@ -1,20 +1,22 @@
 -#ifndef AGP_H
 -#define AGP_H 1
@@ -5982,15 +5984,15 @@ Acked-by: jbeulich@novell.com
  
  /* Convert a physical address to an address suitable for the GART. */
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc.h       2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "desc_32.h"
 +#else
 +# include "desc_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc_64.h       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc_64.h    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_64.h       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc_64.h    2009-02-16 16:18:36.000000000 +0100
 @@ -34,6 +34,18 @@ static inline void clear_LDT(void)
        put_cpu();
  }
@@ -6047,15 +6049,15 @@ Acked-by: jbeulich@novell.com
  
  static inline void set_tssldt_descriptor(void *ptr, unsigned long tss, unsigned type, 
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping.h        2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "dma-mapping_32.h"
 +#else
 +# include "dma-mapping_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2009-02-16 16:18:36.000000000 +0100
 @@ -7,9 +7,9 @@
   */
  
@@ -6067,8 +6069,8 @@ Acked-by: jbeulich@novell.com
  #include <asm/swiotlb.h>
  
  static inline int
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_64.h     2009-02-16 16:18:36.000000000 +0100
 @@ -6,8 +6,7 @@
   * documentation.
   */
@@ -6086,7 +6088,7 @@ Acked-by: jbeulich@novell.com
 -#include <asm-i386/mach-xen/asm/dma-mapping.h>
 +#include "dma-mapping_32.h"
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap.h     2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "fixmap_32.h"
@@ -6094,7 +6096,7 @@ Acked-by: jbeulich@novell.com
 +# include "fixmap_64.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypercall.h  2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall.h  2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,404 @@
 +/******************************************************************************
 + * hypercall.h
@@ -6500,8 +6502,8 @@ Acked-by: jbeulich@novell.com
 +}
 +
 +#endif /* __HYPERCALL_H__ */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypercall_32.h  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypercall_32.h       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypercall_32.h  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall_32.h       2009-02-16 16:18:36.000000000 +0100
 @@ -1,191 +1,10 @@
 -/******************************************************************************
 - * hypercall.h
@@ -6937,8 +6939,8 @@ Acked-by: jbeulich@novell.com
 -
 -
 -#endif /* __HYPERCALL_H__ */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypercall_64.h  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypercall_64.h       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypercall_64.h  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall_64.h       2009-02-16 16:18:36.000000000 +0100
 @@ -1,197 +1,10 @@
 -/******************************************************************************
 - * hypercall.h
@@ -7376,8 +7378,8 @@ Acked-by: jbeulich@novell.com
 -}
 -
 -#endif /* __HYPERCALL_H__ */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-04 11:28:11.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypervisor.h 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-04 11:28:11.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-02-16 16:18:36.000000000 +0100
 @@ -194,7 +194,6 @@ static inline void xen_multicall_flush(b
  extern char hypercall_page[PAGE_SIZE];
  #else
@@ -7387,7 +7389,7 @@ Acked-by: jbeulich@novell.com
  #endif
  
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/io.h 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/io.h 2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "io_32.h"
@@ -7395,15 +7397,15 @@ Acked-by: jbeulich@novell.com
 +# include "io_64.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags.h   2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "irqflags_32.h"
 +#else
 +# include "irqflags_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags_32.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags_32.h        2009-02-16 16:18:36.000000000 +0100
 @@ -148,6 +148,23 @@ static inline int raw_irqs_disabled_flag
                                                                        \
        raw_irqs_disabled_flags(flags);                                 \
@@ -7446,8 +7448,8 @@ Acked-by: jbeulich@novell.com
 +#endif
 +
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags_64.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags_64.h        2009-02-16 16:18:36.000000000 +0100
 @@ -116,6 +116,22 @@ static inline int raw_irqs_disabled_flag
  })
  
@@ -7493,7 +7495,7 @@ Acked-by: jbeulich@novell.com
  
  #endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/maddr.h      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/maddr.h      2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "maddr_32.h"
@@ -7501,7 +7503,7 @@ Acked-by: jbeulich@novell.com
 +# include "maddr_64.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context.h        2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "mmu_context_32.h"
@@ -7509,7 +7511,7 @@ Acked-by: jbeulich@novell.com
 +# include "mmu_context_64.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page.h       2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,13 @@
 +#ifdef __KERNEL__
 +# ifdef CONFIG_X86_32
@@ -7524,8 +7526,8 @@ Acked-by: jbeulich@novell.com
 +#  include "page_64.h"
 +# endif
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page_64.h    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2009-02-16 16:18:36.000000000 +0100
 @@ -207,6 +207,7 @@ static inline unsigned long __phys_addr(
         VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
  
@@ -7535,7 +7537,7 @@ Acked-by: jbeulich@novell.com
  #include <asm-generic/memory_model.h>
  #include <asm-generic/page.h>
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pci.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci.h        2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,100 @@
 +#ifndef __x86_PCI_H
 +#define __x86_PCI_H
@@ -7637,8 +7639,8 @@ Acked-by: jbeulich@novell.com
 +
 +
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pci_32.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci_32.h     2009-02-16 16:18:36.000000000 +0100
 @@ -4,52 +4,10 @@
  
  #ifdef __KERNEL__
@@ -7725,15 +7727,15 @@ Acked-by: jbeulich@novell.com
  
  #endif /* __i386_PCI_H */
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgalloc.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc.h    2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "pgalloc_32.h"
 +#else
 +# include "pgalloc_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-02-16 16:18:36.000000000 +0100
 @@ -112,6 +112,8 @@ static inline void pgd_list_del(pgd_t *p
        spin_unlock(&pgd_lock);
  }
@@ -7781,15 +7783,15 @@ Acked-by: jbeulich@novell.com
        free_pages((unsigned long)pgd, 1);
  }
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable.h    2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "pgtable_32.h"
 +#else
 +# include "pgtable_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-02-16 16:18:36.000000000 +0100
 @@ -17,10 +17,7 @@
  #include <asm/fixmap.h>
  #include <linux/threads.h>
@@ -7811,8 +7813,8 @@ Acked-by: jbeulich@novell.com
  void pgtable_cache_init(void);
  void paging_init(void);
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-02-16 16:18:36.000000000 +0100
 @@ -9,7 +9,7 @@
   * the x86-64 page table tree.
   */
@@ -7831,15 +7833,15 @@ Acked-by: jbeulich@novell.com
  #define MODULES_END      _AC(0xfffffffffff00000, UL)
  #define MODULES_LEN   (MODULES_END - MODULES_VADDR)
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor.h  2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor.h  2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "processor_32.h"
 +#else
 +# include "processor_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor_32.h       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_32.h       2009-02-16 16:18:36.000000000 +0100
 @@ -80,6 +80,7 @@ struct cpuinfo_x86 {
        unsigned char booted_cores;     /* number of cores as seen by OS */
        __u8 phys_proc_id;              /* Physical processor id. */
@@ -7932,8 +7934,8 @@ Acked-by: jbeulich@novell.com
  #else
  #define ASM_NOP1 GENERIC_NOP1
  #define ASM_NOP2 GENERIC_NOP2
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor_64.h       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor_64.h       2009-02-16 16:18:36.000000000 +0100
 @@ -74,6 +74,7 @@ struct cpuinfo_x86 {
        __u8    booted_cores;   /* number of cores as seen by OS */
        __u8    phys_proc_id;   /* Physical Processor id. */
@@ -8028,7 +8030,7 @@ Acked-by: jbeulich@novell.com
                unsigned long edx)
  {
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/segment.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment.h    2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "segment_32.h"
@@ -8036,15 +8038,15 @@ Acked-by: jbeulich@novell.com
 +# include "../../segment_64.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp.h        2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "smp_32.h"
 +#else
 +# include "smp_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_32.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_32.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2009-02-16 16:18:36.000000000 +0100
 @@ -11,7 +11,7 @@
  #endif
  
@@ -8079,8 +8081,8 @@ Acked-by: jbeulich@novell.com
  
  #ifdef CONFIG_HOTPLUG_CPU
  extern void cpu_exit_clear(void);
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_64.h        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_64.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2009-02-16 16:18:36.000000000 +0100
 @@ -40,10 +40,19 @@ extern void lock_ipi_call_lock(void);
  extern void unlock_ipi_call_lock(void);
  extern int smp_num_siblings;
@@ -8137,7 +8139,7 @@ Acked-by: jbeulich@novell.com
  #endif /* !CONFIG_SMP */
  #endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/swiotlb.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/swiotlb.h    2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "swiotlb_32.h"
@@ -8145,15 +8147,15 @@ Acked-by: jbeulich@novell.com
 +# include "../../swiotlb.h"
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system.h     2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "system_32.h"
 +#else
 +# include "system_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system_32.h  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_32.h  2009-02-16 16:18:36.000000000 +0100
 @@ -9,6 +9,7 @@
  #include <asm/hypervisor.h>
  
@@ -8226,8 +8228,8 @@ Acked-by: jbeulich@novell.com
 +void __show_registers(struct pt_regs *, int all);
  
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system_64.h  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_64.h  2009-02-16 16:18:36.000000000 +0100
 @@ -11,8 +11,12 @@
  
  #ifdef __KERNEL__
@@ -8296,15 +8298,15 @@ Acked-by: jbeulich@novell.com
  #define set_mb(var, value) do { (void) xchg(&var, value); } while (0)
  
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/tlbflush.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush.h   2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "tlbflush_32.h"
 +#else
 +# include "tlbflush_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_32.h        2009-02-16 16:18:36.000000000 +0100
 @@ -23,7 +23,6 @@
   *  - flush_tlb_page(vma, vmaddr) flushes one page
   *  - flush_tlb_range(vma, start, end) flushes a range of pages
@@ -8324,8 +8326,8 @@ Acked-by: jbeulich@novell.com
 -}
 -
  #endif /* _I386_TLBFLUSH_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush_64.h        2009-02-16 16:18:36.000000000 +0100
 @@ -28,7 +28,6 @@
   *  - flush_tlb_page(vma, vmaddr) flushes one page
   *  - flush_tlb_range(vma, start, end) flushes a range of pages
@@ -8348,15 +8350,15 @@ Acked-by: jbeulich@novell.com
 -
  #endif /* _X8664_TLBFLUSH_H */
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/xor.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/xor.h        2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,5 @@
 +#ifdef CONFIG_X86_32
 +# include "../../xor_32.h"
 +#else
 +# include "xor_64.h"
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mmu.h        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mmu.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mmu.h        2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mmu.h     2009-02-16 16:18:36.000000000 +0100
 @@ -16,6 +16,9 @@ typedef struct {
        rwlock_t ldtlock;
  #endif
@@ -8367,8 +8369,8 @@ Acked-by: jbeulich@novell.com
        struct mutex lock;
        void *vdso;
  } mm_context_t;
---- sle11-2009-06-29.orig/include/linux/kexec.h        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/include/linux/kexec.h     2009-02-17 12:43:57.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/kexec.h        2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/include/linux/kexec.h     2009-02-17 12:43:57.000000000 +0100
 @@ -202,8 +202,15 @@ extern int dump_after_notifier;
  #define VMCOREINFO_BYTES           (4096)
  #define VMCOREINFO_NOTE_NAME       "VMCOREINFO"
@@ -8385,8 +8387,8 @@ Acked-by: jbeulich@novell.com
  
  /* Location of a reserved region to hold the crash kernel.
   */
---- sle11-2009-06-29.orig/include/linux/oprofile.h     2009-06-29 15:28:01.000000000 +0200
-+++ sle11-2009-06-29/include/linux/oprofile.h  2009-06-29 15:28:57.000000000 +0200
+--- sle11-2009-10-16.orig/include/linux/oprofile.h     2009-06-29 15:28:01.000000000 +0200
++++ sle11-2009-10-16/include/linux/oprofile.h  2009-06-29 15:28:57.000000000 +0200
 @@ -119,6 +119,8 @@ void oprofile_add_pc(unsigned long pc, i
  /* add a backtrace entry, to be called from the ->backtrace callback */
  void oprofile_add_trace(unsigned long eip);
@@ -8396,8 +8398,8 @@ Acked-by: jbeulich@novell.com
  /* add a domain switch entry */
  int oprofile_add_domain_switch(int32_t domain_id);
  
---- sle11-2009-06-29.orig/include/linux/sysctl.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/linux/sysctl.h    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/sysctl.h       2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/include/linux/sysctl.h    2009-02-16 16:18:36.000000000 +0100
 @@ -69,6 +69,7 @@ enum
        CTL_BUS=8,              /* Busses */
        CTL_ABI=9,              /* Binary emulation */
@@ -8406,8 +8408,8 @@ Acked-by: jbeulich@novell.com
        CTL_ARLAN=254,          /* arlan wireless driver */
        CTL_S390DBF=5677,       /* s390 debug */
        CTL_SUNRPC=7249,        /* sunrpc debug */
---- sle11-2009-06-29.orig/include/xen/pcifront.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/xen/pcifront.h    2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/pcifront.h       2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/include/xen/pcifront.h    2009-02-16 16:18:36.000000000 +0100
 @@ -12,13 +12,11 @@
  
  #ifndef __ia64__
@@ -8445,7 +8447,7 @@ Acked-by: jbeulich@novell.com
                                                 struct pcifront_sd *sd)
  {
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/xen/sysctl.h      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/xen/sysctl.h      2009-02-16 16:18:36.000000000 +0100
 @@ -0,0 +1,11 @@
 +#ifndef _XEN_SYSCTL_H
 +#define _XEN_SYSCTL_H
@@ -8458,8 +8460,8 @@ Acked-by: jbeulich@novell.com
 +};
 +
 +#endif /* _XEN_SYSCTL_H */
---- sle11-2009-06-29.orig/include/xen/xenbus.h 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/xen/xenbus.h      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/xenbus.h 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/xen/xenbus.h      2009-02-16 16:18:36.000000000 +0100
 @@ -107,7 +107,7 @@ struct xenbus_driver {
        int (*suspend)(struct xenbus_device *dev);
        int (*suspend_cancel)(struct xenbus_device *dev);
@@ -8469,8 +8471,8 @@ Acked-by: jbeulich@novell.com
        struct device_driver driver;
        int (*read_otherend_details)(struct xenbus_device *dev);
        int (*is_ready)(struct xenbus_device *dev);
---- sle11-2009-06-29.orig/kernel/kexec.c       2009-02-17 11:34:22.000000000 +0100
-+++ sle11-2009-06-29/kernel/kexec.c    2009-02-17 12:38:20.000000000 +0100
+--- sle11-2009-10-16.orig/kernel/kexec.c       2009-02-17 11:34:22.000000000 +0100
++++ sle11-2009-10-16/kernel/kexec.c    2009-02-17 12:38:20.000000000 +0100
 @@ -52,7 +52,11 @@ int dump_after_notifier;
  
  /* vmcoreinfo stuff */
@@ -8520,8 +8522,8 @@ Acked-by: jbeulich@novell.com
        VMCOREINFO_SYMBOL(_stext);
  
  #ifndef CONFIG_NEED_MULTIPLE_NODES
---- sle11-2009-06-29.orig/kernel/sysctl_check.c        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/kernel/sysctl_check.c     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/kernel/sysctl_check.c        2009-10-28 14:55:06.000000000 +0100
++++ sle11-2009-10-16/kernel/sysctl_check.c     2009-02-16 16:18:36.000000000 +0100
 @@ -4,6 +4,7 @@
  #include <linux/sunrpc/debug.h>
  #include <linux/string.h>
@@ -8555,8 +8557,8 @@ Acked-by: jbeulich@novell.com
        { CTL_ARLAN,    "arlan",        trans_arlan_table },
        { CTL_S390DBF,  "s390dbf",      trans_s390dbf_table },
        { CTL_SUNRPC,   "sunrpc",       trans_sunrpc_table },
---- sle11-2009-06-29.orig/lib/swiotlb-xen.c    2009-02-05 11:16:51.000000000 +0100
-+++ sle11-2009-06-29/lib/swiotlb-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-02-05 11:16:51.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-02-16 16:18:36.000000000 +0100
 @@ -27,7 +27,7 @@
  #include <asm/uaccess.h>
  #include <xen/gnttab.h>
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.25
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.25
index a1535d8bed842ec22185adb804c1f683b0fb9d4b..89b8c3eba06d6c0345c37197767d6f7710fc4a75 100644 (file)
@@ -6,8 +6,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 
 Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches.py
 
---- sle11-2009-06-29.orig/arch/x86/Kconfig     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-03-16 16:33:40.000000000 +0100
 @@ -27,7 +27,7 @@ config X86
        select HAVE_KRETPROBES
        select HAVE_DYNAMIC_FTRACE
@@ -75,8 +75,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        help
          Enables some debug statements within the PCI Frontend.
  
---- sle11-2009-06-29.orig/arch/x86/Kconfig.debug       2009-02-02 09:40:56.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig.debug    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig.debug       2009-02-02 09:40:56.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig.debug    2009-03-16 16:33:40.000000000 +0100
 @@ -279,6 +279,7 @@ config DEBUG_BOOT_PARAMS
        bool "Debug boot parameters"
        depends on DEBUG_KERNEL
@@ -85,8 +85,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        help
          This option will cause struct boot_params to be exported via debugfs.
  
---- sle11-2009-06-29.orig/arch/x86/ia32/ia32entry-xen.S        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/ia32/ia32entry-xen.S     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-03-16 16:33:40.000000000 +0100
 @@ -12,7 +12,6 @@
  #include <asm/ia32_unistd.h>  
  #include <asm/thread_info.h>  
@@ -130,8 +130,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      .quad compat_sys_timerfd_settime        /* 325 */
 +      .quad compat_sys_timerfd_gettime
  ia32_syscall_end:
---- sle11-2009-06-29.orig/arch/x86/kernel/Makefile     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/Makefile  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-03-16 16:33:40.000000000 +0100
 @@ -120,11 +120,10 @@ ifeq ($(CONFIG_X86_64),y)
  
          obj-$(CONFIG_PCI_MMCONFIG)    += mmconf-fam10h_64.o
@@ -145,8 +145,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
 -disabled-obj-$(CONFIG_XEN_UNPRIVILEGED_GUEST) += mpparse_64.o
 -%/head_64.o %/head_64.s: asflags-$(CONFIG_XEN) :=
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/boot.c  2008-12-01 11:11:08.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/boot.c       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/boot.c  2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/boot.c       2009-03-16 16:33:40.000000000 +0100
 @@ -133,6 +133,9 @@ char *__init __acpi_map_table(unsigned l
  #ifndef CONFIG_XEN
        if (phys+size <= (max_low_pfn_mapped << PAGE_SHIFT))
@@ -158,7 +158,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
        offset = phys & (PAGE_SIZE - 1);
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/sleep-xen.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,95 @@
 +/*
 + * sleep.c - x86-specific ACPI sleep support.
@@ -255,7 +255,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +
 +__setup("acpi_sleep=", acpi_sleep_setup);
 +#endif /* CONFIG_ACPI_PV_SLEEP */
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_32-xen.c  2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,117 +0,0 @@
 -/*
@@ -375,7 +375,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -
 -core_initcall(acpisleep_dmi_init);
 -#endif /* CONFIG_ACPI_PV_SLEEP */
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep_64-xen.c  2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,125 +0,0 @@
 -/*
@@ -503,8 +503,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -__setup("acpi_sleep=", acpi_sleep_setup);
 -#endif                                /* CONFIG_ACPI_PV_SLEEP */
 -
---- sle11-2009-06-29.orig/arch/x86/kernel/apic_32-xen.c        2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/apic_32-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_32-xen.c        2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_32-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -86,7 +86,7 @@ int setup_profiling_timer(unsigned int m
   * This initializes the IO-APIC and APIC hardware if this is
   * a UP kernel.
@@ -514,8 +514,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  {
  #ifdef CONFIG_X86_IO_APIC
        if (smp_found_config)
---- sle11-2009-06-29.orig/arch/x86/kernel/apic_64-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/apic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -34,34 +34,17 @@
  #include <asm/hpet.h>
  #include <asm/idle.h>
@@ -622,8 +622,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -
 -      return 1;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/asm-offsets_32.c     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/asm-offsets_32.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/asm-offsets_32.c     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/asm-offsets_32.c  2009-03-16 16:33:40.000000000 +0100
 @@ -23,8 +23,10 @@
  #include <xen/interface/xen.h>
  #endif
@@ -635,8 +635,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /* workaround for a warning with -Wmissing-prototypes */
  void foo(void);
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/common-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/common-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -27,45 +27,50 @@
  #include "cpu.h"
  
@@ -1038,8 +1038,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
        load_LDT(&init_mm.context);
  
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-03-16 16:33:40.000000000 +0100
 @@ -33,7 +33,7 @@ struct mtrr_ops generic_mtrr_ops = {
  
  struct mtrr_ops *mtrr_if = &generic_mtrr_ops;
@@ -1101,8 +1101,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                op.cmd = XENPF_del_memtype;
                op.u.del_memtype.handle = 0;
                op.u.del_memtype.reg    = reg;
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_32-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/e820_32-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -7,7 +7,6 @@
  #include <linux/kexec.h>
  #include <linux/module.h>
@@ -1473,8 +1473,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      print_memory_map("modified");
 +}
 +#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_64-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/e820_64-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -1,4 +1,4 @@
 -/* 
 +/*
@@ -2271,8 +2271,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  }
  
  int __init arch_get_ram_range(int slot, u64 *addr, u64 *size)
---- sle11-2009-06-29.orig/arch/x86/kernel/early_printk-xen.c   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/early_printk-xen.c        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-09-24 10:27:18.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-03-16 16:33:40.000000000 +0100
 @@ -222,7 +222,7 @@ static struct console simnow_console = {
  };
  
@@ -2282,8 +2282,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  static int early_console_initialized = 0;
  
  void early_printk(const char *fmt, ...)
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:18:18.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:18:32.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:18:18.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:18:32.000000000 +0200
 @@ -59,7 +59,7 @@
   * for paravirtualization.  The following will never clobber any registers:
   *   INTERRUPT_RETURN (aka. "iret")
@@ -2624,8 +2624,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#undef        sys_fork
 +#undef        sys_clone
 +#undef        sys_vfork
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_64-xen.S       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_64-xen.S    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-03-16 16:33:40.000000000 +0100
 @@ -54,17 +54,22 @@
  #include <asm/page.h>
  #include <asm/irqflags.h>
@@ -2939,8 +2939,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        TRACE_IRQS_OFF
        GET_THREAD_INFO(%rcx)
        jmp  retint_restore_args
---- sle11-2009-06-29.orig/arch/x86/kernel/fixup.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/fixup.c   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/fixup.c      2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/fixup.c   2009-03-16 16:33:40.000000000 +0100
 @@ -36,7 +36,7 @@
  
  #define DP(_f, _args...) printk(KERN_ALERT "  " _f "\n" , ## _args )
@@ -2950,8 +2950,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  {
        static unsigned long printed = 0;
        char info[100];
---- sle11-2009-06-29.orig/arch/x86/kernel/genapic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/genapic_64-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -24,20 +24,13 @@
  #include <acpi/acpi_bus.h>
  #endif
@@ -2977,8 +2977,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  EXPORT_PER_CPU_SYMBOL(x86_cpu_to_apicid);
  
  #ifndef CONFIG_XEN
---- sle11-2009-06-29.orig/arch/x86/kernel/head64-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head64-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -16,6 +16,7 @@
  #include <linux/kernel.h>
  #include <linux/string.h>
@@ -3084,8 +3084,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +
        start_kernel();
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/head_32-xen.S        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head_32-xen.S     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2009-03-16 16:33:40.000000000 +0100
 @@ -3,6 +3,7 @@
  .text
  #include <linux/elfnote.h>
@@ -3103,8 +3103,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        .fill 1024,4,0
  ENTRY(empty_zero_page)
        .fill 4096,1,0
---- sle11-2009-06-29.orig/arch/x86/kernel/init_task-xen.c      2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/init_task-xen.c   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/init_task-xen.c      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/init_task-xen.c   2009-03-16 16:33:40.000000000 +0100
 @@ -19,7 +19,7 @@ static struct sighand_struct init_sighan
  #endif
  struct mm_struct init_mm = INIT_MM(init_mm);
@@ -3114,8 +3114,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /*
   * Initial thread structure.
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_32-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_32-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -35,6 +35,7 @@
  #include <linux/htirq.h>
  #include <linux/freezer.h>
@@ -3187,8 +3187,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        .suspend = ioapic_suspend,
        .resume = ioapic_resume,
  };
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_64-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -32,9 +32,11 @@
  #include <linux/msi.h>
  #include <linux/htirq.h>
@@ -3378,7 +3378,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +late_initcall(ioapic_insert_resources);
 +#endif /* !CONFIG_XEN */
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/ioport-xen.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ioport-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,112 @@
 +/*
 + * This contains the io-permission bitmap code - written by obz, with changes
@@ -3492,7 +3492,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +out:
 +      return rc;
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/ioport_32-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_32-xen.c      2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,121 +0,0 @@
 -/*
@@ -3616,7 +3616,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      set_iopl_mask(t->iopl);
 -      return 0;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/ioport_64-xen.c      2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ioport_64-xen.c      2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,99 +0,0 @@
 -/*
@@ -3718,8 +3718,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -
 -      return 0;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_32-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_32-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -66,11 +66,11 @@ static union irq_ctx *softirq_ctx[NR_CPU
   * SMP cross-CPU interrupts have their own specific
   * handlers).
@@ -3776,8 +3776,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                        :  "0" (irq),   "1" (desc),  "2" (isp),
                           "D" (desc->handle_irq)
                        : "memory", "cc"
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_64-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_64-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -20,6 +20,28 @@
  
  atomic_t irq_err_count;
@@ -3848,7 +3848,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -}
 -#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/ldt-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,272 @@
 +/*
 + * Copyright (C) 1992 Krishna Balasubramanian and Linus Torvalds
@@ -4122,7 +4122,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      }
 +      return ret;
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt_32-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_32-xen.c 2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,265 +0,0 @@
 -/*
@@ -4390,7 +4390,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      }
 -      return ret;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt_64-xen.c 2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt_64-xen.c 2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,271 +0,0 @@
 -/*
@@ -4664,8 +4664,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      }
 -      return ret;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/machine_kexec_64.c   2008-11-25 12:35:54.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/machine_kexec_64.c        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/machine_kexec_64.c   2008-11-25 12:35:54.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/machine_kexec_64.c        2009-03-16 16:33:40.000000000 +0100
 @@ -300,7 +300,9 @@ void machine_kexec(struct kimage *image)
  
  void arch_crash_save_vmcoreinfo(void)
@@ -4676,8 +4676,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        VMCOREINFO_SYMBOL(init_level4_pgt);
  
  #ifdef CONFIG_NUMA
---- sle11-2009-06-29.orig/arch/x86/kernel/microcode-xen.c      2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/microcode-xen.c   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-03-16 16:33:40.000000000 +0100
 @@ -167,7 +167,7 @@ static int request_microcode(void)
        }
  
@@ -4687,8 +4687,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        op.u.microcode.length = firmware->size;
        error = HYPERVISOR_platform_op(&op);
  
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_32-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_32-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_32-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -68,7 +68,7 @@ unsigned int def_to_bigsmp = 0;
  /* Processor that is doing the boot up */
  unsigned int boot_cpu_physical_apicid = -1U;
@@ -4817,8 +4817,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                /*
                 * For PCI devices assign IRQs in order, avoiding gaps
                 * due to unused I/O APIC pins.
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse_64-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse_64-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse_64-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -60,14 +60,20 @@ unsigned int boot_cpu_id = -1U;
  EXPORT_SYMBOL(boot_cpu_id);
  
@@ -4876,8 +4876,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  
        cpu_set(cpu, cpu_possible_map);
---- sle11-2009-06-29.orig/arch/x86/kernel/pci-dma-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/pci-dma-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -434,3 +434,23 @@ dma_sync_single_for_device(struct device
                swiotlb_sync_single_for_device(dev, dma_handle, size, direction);
  }
@@ -4902,8 +4902,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      flush_write_buffers();
 +}
 +EXPORT_SYMBOL(dma_sync_sg_for_device);
---- sle11-2009-06-29.orig/arch/x86/kernel/process_32-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_32-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -23,7 +23,6 @@
  #include <linux/slab.h>
  #include <linux/vmalloc.h>
@@ -5599,8 +5599,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      unsigned long range_end = mm->brk + 0x02000000;
 +      return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/process_64-xen.c     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_64-xen.c  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -3,7 +3,7 @@
   *
   *  Pentium III FXSR, SSE support
@@ -6265,8 +6265,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      unsigned long range_end = mm->brk + 0x02000000;
 +      return randomize_range(mm->brk, range_end, 0) ? : mm->brk;
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/quirks-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/quirks-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/quirks-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/quirks-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -9,7 +9,7 @@
  static void __devinit quirk_intel_irqbalance(struct pci_dev *dev)
  {
@@ -6462,8 +6462,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                break;
        }
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/rtc.c        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/rtc.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/rtc.c        2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/rtc.c     2009-03-16 16:33:40.000000000 +0100
 @@ -181,6 +181,10 @@ unsigned long read_persistent_clock(void
  {
        unsigned long retval, flags;
@@ -6486,8 +6486,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        return set_rtc_mmss(now.tv_sec);
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/setup64-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup64-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -31,7 +31,11 @@
  #include <asm/hypervisor.h>
  #endif
@@ -6617,8 +6617,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        /*
         * <= is required because the CPU will access up to
         * 8 bits beyond the end of the IO permission bitmap.
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_32-xen.c       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_32-xen.c    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-03-16 16:33:40.000000000 +0100
 @@ -47,9 +47,12 @@
  #include <linux/crash_dump.h>
  #include <linux/dmi.h>
@@ -7113,8 +7113,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +}
 +
 +subsys_initcall(request_standard_resources);
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_64-xen.c       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup_64-xen.c    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-03-16 16:33:40.000000000 +0100
 @@ -15,7 +15,6 @@
  #include <linux/ptrace.h>
  #include <linux/slab.h>
@@ -8353,8 +8353,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        .next = c_next,
        .stop = c_stop,
        .show = show_cpuinfo,
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_32-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_32-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_32-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -168,7 +168,7 @@ void __send_IPI_shortcut(unsigned int sh
        }
  }
@@ -8380,8 +8380,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /*
   *
---- sle11-2009-06-29.orig/arch/x86/kernel/smp_64-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp_64-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp_64-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -33,7 +33,7 @@
  
  #ifndef CONFIG_XEN
@@ -8634,8 +8634,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  void smp_send_stop(void)
  {
---- sle11-2009-06-29.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:12:35.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/time_32-xen.c     2009-03-24 10:12:48.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:57:59.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:58:05.000000000 +0100
 @@ -28,21 +28,9 @@
   *    serialize accesses to xtime/lost_ticks).
   */
@@ -8830,7 +8830,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                        return sp[0];
                if (sp[1] >> 22)
                        return sp[1];
-@@ -748,25 +671,32 @@ static void init_missing_ticks_accountin
+@@ -749,25 +672,32 @@ static void init_missing_ticks_accountin
                runstate->time[RUNSTATE_offline];
  }
  
@@ -8874,8 +8874,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  }
  
  extern void (*late_time_init)(void);
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_32-xen.c       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_32-xen.c    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-03-16 16:33:40.000000000 +0100
 @@ -79,7 +79,8 @@ char ignore_fpu_irq = 0;
   * F0 0F bug workaround.. We have a special link segment
   * for this.
@@ -9560,8 +9560,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                printk(KERN_INFO "Enabling fast FPU save and restore... ");
                set_in_cr4(X86_CR4_OSFXSR);
                printk("done.\n");
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_64-xen.c       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_64-xen.c    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-03-16 16:33:40.000000000 +0100
 @@ -74,38 +74,41 @@ asmlinkage void alignment_check(void);
  asmlinkage void machine_check(void);
  asmlinkage void spurious_interrupt_bug(void);
@@ -10297,8 +10297,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      return 1;
 +}
 +__setup("code_bytes=", code_bytes_setup);
---- sle11-2009-06-29.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/vsyscall_64-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -43,12 +43,7 @@
  #include <asm/vgtod.h>
  
@@ -10430,7 +10430,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #ifdef CONFIG_XEN
        vsyscall_gtod_data.sysctl_enabled = 0; /* disable vgettimeofay() */
        if (boot_cpu_has(X86_FEATURE_RDTSCP))
---- sle11-2009-06-29.orig/arch/x86/kernel/xen_entry_64.S       2009-06-29 15:14:52.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/xen_entry_64.S       2009-10-28 14:55:04.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,36 +0,0 @@
 -/*
@@ -10469,8 +10469,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -                              XEN_LOCKED_UNBLOCK_EVENTS(reg)          ; \
 -                              XEN_PUT_VCPU_INFO(reg)
 -#define XEN_TEST_PENDING(reg) testb $0xFF,evtchn_upcall_pending(reg)
---- sle11-2009-06-29.orig/arch/x86/mach-xen/setup.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mach-xen/setup.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mach-xen/setup.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mach-xen/setup.c 2009-03-16 16:33:40.000000000 +0100
 @@ -161,15 +161,12 @@ void __init machine_specific_arch_setup(
  
        /* Do an early initialization of the fixmap area */
@@ -10492,7 +10492,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  }
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/mm/fault-xen.c   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault-xen.c   2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,1025 @@
 +/*
 + *  Copyright (C) 1995  Linus Torvalds
@@ -11519,7 +11519,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +                              (__START_KERNEL & PGDIR_MASK)));
 +#endif
 +}
---- sle11-2009-06-29.orig/arch/x86/mm/fault_32-xen.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_32-xen.c   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,757 +0,0 @@
 -/*
@@ -12279,7 +12279,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -                      start = address + (1UL << PMD_SHIFT);
 -      }
 -}
---- sle11-2009-06-29.orig/arch/x86/mm/fault_64-xen.c   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault_64-xen.c   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,686 +0,0 @@
 -/*
@@ -12968,8 +12968,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      BUILD_BUG_ON(!(((MODULES_END - 1) & PGDIR_MASK) == 
 -                              (__START_KERNEL & PGDIR_MASK)));
 -}
---- sle11-2009-06-29.orig/arch/x86/mm/highmem_32-xen.c 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/highmem_32-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -18,6 +18,49 @@ void kunmap(struct page *page)
        kunmap_high(page);
  }
@@ -13029,8 +13029,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        idx = type + KM_TYPE_NR*smp_processor_id();
        vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx);
        BUG_ON(!pte_none(*(kmap_pte-idx)));
---- sle11-2009-06-29.orig/arch/x86/mm/hypervisor.c     2009-05-06 10:23:43.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/mm/hypervisor.c  2009-05-14 11:18:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/hypervisor.c     2009-05-06 10:23:43.000000000 +0200
++++ sle11-2009-10-16/arch/x86/mm/hypervisor.c  2009-05-14 11:18:39.000000000 +0200
 @@ -869,15 +869,11 @@ int xen_limit_pages_to_max_mfn(
  }
  EXPORT_SYMBOL_GPL(xen_limit_pages_to_max_mfn);
@@ -13050,8 +13050,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  #define MAX_BATCHED_FULL_PTES 32
  
---- sle11-2009-06-29.orig/arch/x86/mm/init_32-xen.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_32-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -27,13 +27,13 @@
  #include <linux/bootmem.h>
  #include <linux/slab.h>
@@ -13937,8 +13937,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  }
  #endif
 -
---- sle11-2009-06-29.orig/arch/x86/mm/init_64-xen.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_64-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -46,14 +46,13 @@
  #include <asm/proto.h>
  #include <asm/smp.h>
@@ -14928,7 +14928,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  }
  #endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/mm/ioremap-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,687 @@
 +/*
 + * Re-map IO memory to kernel address space so that we can access it.
@@ -15617,7 +15617,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +{
 +      WARN_ON(1);
 +}
---- sle11-2009-06-29.orig/arch/x86/mm/ioremap_32-xen.c 2009-02-16 16:17:21.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap_32-xen.c 2009-02-16 16:17:21.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,445 +0,0 @@
 -/*
@@ -16066,7 +16066,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      }
 -}
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/mm/pageattr-xen.c        2009-03-16 16:37:14.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr-xen.c        2009-03-16 16:37:14.000000000 +0100
 @@ -0,0 +1,1413 @@
 +/*
 + * Copyright 2002 Andi Kleen, SuSE Labs.
@@ -17481,7 +17481,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#ifdef CONFIG_CPA_DEBUG
 +#include "pageattr-test.c"
 +#endif
---- sle11-2009-06-29.orig/arch/x86/mm/pageattr_64-xen.c        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr_64-xen.c        2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,542 +0,0 @@
 -/* 
@@ -18026,8 +18026,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -
 -EXPORT_SYMBOL(change_page_attr);
 -EXPORT_SYMBOL(global_flush_tlb);
---- sle11-2009-06-29.orig/arch/x86/mm/pgtable_32-xen.c 2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pgtable_32-xen.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-03-16 16:33:40.000000000 +0100
 @@ -29,8 +29,6 @@
  #include <xen/features.h>
  #include <asm/hypervisor.h>
@@ -18818,8 +18818,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -          !mm->context.has_foreign_mappings)
 -              mm_unpin(mm);
 -}
---- sle11-2009-06-29.orig/arch/x86/pci/irq-xen.c       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/pci/irq-xen.c    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-03-16 16:33:40.000000000 +0100
 @@ -204,6 +204,7 @@ static int pirq_ali_get(struct pci_dev *
  {
        static const unsigned char irqmap[16] = { 0, 9, 3, 10, 4, 5, 7, 6, 1, 11, 0, 12, 0, 14, 0, 15 };
@@ -18917,8 +18917,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                        r->name = "PIIX/ICH";
                        r->get = pirq_piix_get;
                        r->set = pirq_piix_set;
---- sle11-2009-06-29.orig/arch/x86/vdso/Makefile       2008-11-25 12:35:54.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/vdso/Makefile    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/Makefile       2008-11-25 12:35:54.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/Makefile    2009-03-16 16:33:40.000000000 +0100
 @@ -66,6 +66,7 @@ vdso32.so-$(VDSO32-y)                += int80
  vdso32.so-$(CONFIG_COMPAT)    += syscall
  vdso32.so-$(VDSO32-y)         += sysenter
@@ -18927,8 +18927,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  vdso32.so-$(CONFIG_XEN)               += $(xen-vdso32-y)
  
  vdso32-images                 = $(vdso32.so-y:%=vdso32-%.so)
---- sle11-2009-06-29.orig/arch/x86/vdso/vdso32/syscall.S       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32/syscall.S    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32/syscall.S       2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32/syscall.S    2009-03-16 16:33:40.000000000 +0100
 @@ -19,8 +19,10 @@ __kernel_vsyscall:
  .Lpush_ebp:
        movl    %ecx, %ebp
@@ -18940,8 +18940,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        movl    %ebp, %ecx
        popl    %ebp
  .Lpop_ebp:
---- sle11-2009-06-29.orig/arch/x86/vdso/vdso32.S       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32.S    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32.S       2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32.S    2009-03-16 16:33:40.000000000 +0100
 @@ -19,4 +19,16 @@ vdso32_sysenter_start:
        .incbin "arch/x86/vdso/vdso32-sysenter.so"
  vdso32_sysenter_end:
@@ -18959,8 +18959,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif
 +
  __FINIT
---- sle11-2009-06-29.orig/arch/x86/vdso/vdso32-setup.c 2008-11-25 12:35:53.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32-setup.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32-setup.c 2008-11-25 12:35:53.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32-setup.c      2009-03-16 16:33:40.000000000 +0100
 @@ -26,10 +26,6 @@
  #include <asm/vdso.h>
  #include <asm/proto.h>
@@ -19017,7 +19017,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  static struct vm_area_struct gate_vma;
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32-setup-xen.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32-setup-xen.c  2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,506 @@
 +/*
 + * (C) Copyright 2002 Linus Torvalds
@@ -19525,8 +19525,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +}
 +
 +#endif        /* CONFIG_X86_64 */
---- sle11-2009-06-29.orig/drivers/pci/msi-xen.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/drivers/pci/msi-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-03-16 16:33:40.000000000 +0100
 @@ -43,6 +43,53 @@ struct msi_pirq_entry {
        int entry_nr;
  };
@@ -19650,8 +19650,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -      }
 -}
 -#endif
---- sle11-2009-06-29.orig/drivers/pci/pci.c    2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/pci/pci.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/pci.c    2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/pci.c 2009-03-16 16:33:40.000000000 +0100
 @@ -353,7 +353,12 @@ pci_find_parent_resource(const struct pc
   * Restore the BAR values for a given device, so as to make it
   * accessible by its driver.
@@ -19665,8 +19665,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  pci_restore_bars(struct pci_dev *dev)
  {
        int i, numres;
---- sle11-2009-06-29.orig/drivers/xen/balloon/sysfs.c  2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/balloon/sysfs.c       2009-06-29 15:29:24.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/balloon/sysfs.c  2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/balloon/sysfs.c       2009-06-29 15:29:24.000000000 +0200
 @@ -104,7 +104,7 @@ static struct attribute_group balloon_in
  };
  
@@ -19676,8 +19676,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  };
  
  static struct sys_device balloon_sysdev;
---- sle11-2009-06-29.orig/drivers/xen/blkback/blkback.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkback/blkback.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkback/blkback.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkback/blkback.c     2009-03-16 16:33:40.000000000 +0100
 @@ -148,7 +148,7 @@ static void unplug_queue(blkif_t *blkif)
                return;
        if (blkif->plug->unplug_fn)
@@ -19697,8 +19697,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        blkif->plug = q;
  }
  
---- sle11-2009-06-29.orig/drivers/xen/blkfront/blkfront.c      2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/blkfront/blkfront.c   2009-03-24 10:12:53.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-03-24 10:12:53.000000000 +0100
 @@ -713,7 +713,6 @@ static irqreturn_t blkif_int(int irq, vo
        RING_IDX i, rp;
        unsigned long flags;
@@ -19735,8 +19735,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                        break;
                default:
                        BUG();
---- sle11-2009-06-29.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:37:50.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/blktap/blktap.c       2009-04-20 11:38:54.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:37:50.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/blktap/blktap.c       2009-04-20 11:38:54.000000000 +0200
 @@ -331,8 +331,8 @@ static pte_t blktap_clear_pte(struct vm_
         * if vm_file is NULL (meaning mmap failed and we have nothing to do)
         */
@@ -19759,8 +19759,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  
        if (count) {
---- sle11-2009-06-29.orig/drivers/xen/core/Makefile    2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/core/Makefile 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/Makefile    2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/Makefile 2009-03-16 16:33:40.000000000 +0100
 @@ -10,5 +10,6 @@ obj-$(CONFIG_SYS_HYPERVISOR) += hypervis
  obj-$(CONFIG_HOTPLUG_CPU)     += cpu_hotplug.o
  obj-$(CONFIG_XEN_SYSFS)               += xen_sysfs.o
@@ -19768,8 +19768,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +obj-$(CONFIG_X86_SMP)         += spinlock.o
  obj-$(CONFIG_KEXEC)           += machine_kexec.o
  obj-$(CONFIG_XEN_XENCOMM)     += xencomm.o
---- sle11-2009-06-29.orig/drivers/xen/core/evtchn.c    2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/evtchn.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-03-16 16:33:40.000000000 +0100
 @@ -194,7 +194,7 @@ static inline unsigned int cpu_from_evtc
  
  /* Upcall to generic IRQ layer. */
@@ -19864,8 +19864,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  }
  
---- sle11-2009-06-29.orig/drivers/xen/core/hypervisor_sysfs.c  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/hypervisor_sysfs.c       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/hypervisor_sysfs.c  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/hypervisor_sysfs.c       2009-03-16 16:33:40.000000000 +0100
 @@ -50,7 +50,7 @@ static int __init hypervisor_subsys_init
        if (!is_running_on_xen())
                return -ENODEV;
@@ -19875,8 +19875,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        return 0;
  }
  
---- sle11-2009-06-29.orig/drivers/xen/core/smpboot.c   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/smpboot.c        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-03-16 16:33:40.000000000 +0100
 @@ -135,6 +135,10 @@ static int __cpuinit xen_smp_intr_init(u
                goto fail;
        per_cpu(callfunc_irq, cpu) = rc;
@@ -19948,7 +19948,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
        ctxt.ctrlreg[3] = xen_pfn_to_cr3(virt_to_mfn(init_level4_pgt));
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/drivers/xen/core/spinlock.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/spinlock.c       2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,161 @@
 +/*
 + *    Xen spinlock functions
@@ -20017,7 +20017,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      struct spinning spinning;
 +
 +      /* If kicker interrupt not initialized yet, just spin. */
-+      if (unlikely(irq < 0) || unlikely(!cpu_online(smp_processor_id())))
++      if (unlikely(irq < 0) || unlikely(!cpu_online(raw_smp_processor_id())))
 +              return 0;
 +
 +      token >>= TICKET_SHIFT;
@@ -20111,8 +20111,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +      }
 +}
 +EXPORT_SYMBOL(xen_spin_kick);
---- sle11-2009-06-29.orig/drivers/xen/core/xen_sysfs.c 2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/xen_sysfs.c      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/xen_sysfs.c 2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/xen_sysfs.c      2009-03-16 16:33:40.000000000 +0100
 @@ -29,12 +29,12 @@ HYPERVISOR_ATTR_RO(type);
  
  static int __init xen_sysfs_type_init(void)
@@ -20209,8 +20209,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  }
  
  #endif
---- sle11-2009-06-29.orig/drivers/xen/gntdev/gntdev.c  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/gntdev/gntdev.c       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/gntdev/gntdev.c  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/gntdev/gntdev.c       2009-03-16 16:33:40.000000000 +0100
 @@ -782,7 +782,7 @@ static pte_t gntdev_clear_pte(struct vm_
                                       op.status);
                } else {
@@ -20229,8 +20229,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  
        return copy;
---- sle11-2009-06-29.orig/drivers/xen/scsifront/scsifront.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/scsifront/scsifront.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/scsifront/scsifront.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/scsifront/scsifront.c 2009-03-16 16:33:40.000000000 +0100
 @@ -260,19 +260,19 @@ static int map_data_for_request(struct v
                return -ENOMEM;
        }
@@ -20302,8 +20302,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        }
  
  big_to_sg:
---- sle11-2009-06-29.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-11 15:39:38.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenoprof/xenoprofile.c        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenoprof/xenoprofile.c   2009-03-11 15:39:38.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenoprof/xenoprofile.c        2009-03-16 16:33:40.000000000 +0100
 @@ -78,7 +78,7 @@ static int xenoprof_resume(struct sys_de
  
  
@@ -20313,8 +20313,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        .resume         = xenoprof_resume,
        .suspend        = xenoprof_suspend
  };
---- sle11-2009-06-29.orig/include/asm-x86/e820.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/e820.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/e820.h       2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/e820.h    2009-03-16 16:33:40.000000000 +0100
 @@ -127,7 +127,11 @@ extern char *memory_setup(void);
  #endif /* __KERNEL__ */
  #endif /* __ASSEMBLY__ */
@@ -20327,8 +20327,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #define ISA_END_ADDRESS               0x100000
  #define is_ISA_range(s, e) ((s) >= ISA_START_ADDRESS && (e) < ISA_END_ADDRESS)
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/agp.h   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/agp.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/agp.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/agp.h        2009-03-16 16:33:40.000000000 +0100
 @@ -13,18 +13,13 @@
   * page. This avoids data corruption on some CPUs.
   */
@@ -20350,8 +20350,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /*
   * Could use CLFLUSH here if the cpu supports it. But then it would
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc.h  2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc.h       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc.h  2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc.h       2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,404 @@
 +#ifndef _ASM_DESC_H_
 +#define _ASM_DESC_H_
@@ -20759,7 +20759,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif /* __ASSEMBLY__ */
 +
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc_32.h       2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_32.h       2008-12-15 11:27:22.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,262 +0,0 @@
 -#ifndef __ARCH_DESC_H
@@ -21024,7 +21024,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#endif /* !__ASSEMBLY__ */
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc_64.h       2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc_64.h       2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,228 +0,0 @@
 -/* Written 2000 by Andi Kleen */ 
@@ -21255,8 +21255,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#endif /* !__ASSEMBLY__ */
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping_32.h     2009-03-16 16:33:40.000000000 +0100
 @@ -84,23 +84,13 @@ dma_sync_single_range_for_device(struct 
        dma_sync_single_for_device(dev, dma_handle+offset, size, direction);
  }
@@ -21285,8 +21285,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  extern int
  dma_mapping_error(dma_addr_t dma_addr);
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-16 16:33:40.000000000 +0100
 @@ -64,7 +64,7 @@ enum fixed_addresses {
  #endif
  #ifdef CONFIG_X86_VISWS_APIC
@@ -21333,8 +21333,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        __end_of_fixed_addresses
  };
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-16 16:33:40.000000000 +0100
 @@ -15,6 +15,7 @@
  #include <asm/apicdef.h>
  #include <asm/page.h>
@@ -21381,8 +21381,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        __end_of_fixed_addresses
  };
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/highmem.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2009-03-16 16:33:40.000000000 +0100
 @@ -37,11 +37,6 @@ extern pte_t *pkmap_page_table;
   * easily, subsequent pte tables have to be allocated in one physical
   * chunk of RAM.
@@ -21411,8 +21411,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  void *kmap(struct page *page);
  void kunmap(struct page *page);
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-16 16:33:40.000000000 +0100
 @@ -264,6 +264,25 @@ HYPERVISOR_poll(
        return rc;
  }
@@ -21439,8 +21439,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #ifdef CONFIG_XEN
  
  static inline void
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags.h   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags.h   2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,247 @@
 -#ifdef CONFIG_X86_32
 -# include "irqflags_32.h"
@@ -21692,7 +21692,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +
 +#endif /* __ASSEMBLY__ */
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_32.h   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,212 +0,0 @@
 -/*
@@ -21907,7 +21907,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#endif
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags_64.h   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,178 +0,0 @@
 -/*
@@ -22088,8 +22088,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#endif
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/maddr_32.h      2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/maddr_32.h   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/maddr_32.h      2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/maddr_32.h   2009-03-16 16:33:40.000000000 +0100
 @@ -1,6 +1,7 @@
  #ifndef _I386_MADDR_H
  #define _I386_MADDR_H
@@ -22126,8 +22126,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #endif
  
  #else /* !CONFIG_XEN */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/maddr_64.h      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/maddr_64.h   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/maddr_64.h      2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/maddr_64.h   2009-03-16 16:33:40.000000000 +0100
 @@ -1,6 +1,7 @@
  #ifndef _X86_64_MADDR_H
  #define _X86_64_MADDR_H
@@ -22210,8 +22210,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #else /* !CONFIG_XEN */
  
  #define pfn_to_mfn(pfn) (pfn)
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-16 16:33:40.000000000 +0100
 @@ -51,8 +51,6 @@ static inline void __prepare_arch_switch
                : : "r" (0) );
  }
@@ -22221,8 +22221,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  static inline void switch_mm(struct mm_struct *prev,
                             struct mm_struct *next,
                             struct task_struct *tsk)
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-03-16 16:33:40.000000000 +0100
 @@ -62,12 +62,6 @@ extern void mm_pin(struct mm_struct *mm)
  extern void mm_unpin(struct mm_struct *mm);
  void mm_pin_all(void);
@@ -22263,8 +22263,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
                }
        }
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/page.h  2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page.h       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page.h  2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page.h       2009-03-16 16:33:40.000000000 +0100
 @@ -1,13 +1,231 @@
 +#ifndef _ASM_X86_PAGE_H
 +#define _ASM_X86_PAGE_H
@@ -22507,8 +22507,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +
 +#endif        /* __KERNEL__ */
 +#endif        /* _ASM_X86_PAGE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page_64.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2009-03-16 16:33:40.000000000 +0100
 @@ -1,37 +1,9 @@
  #ifndef _X86_64_PAGE_H
  #define _X86_64_PAGE_H
@@ -22746,8 +22746,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#endif /* __KERNEL__ */
  
  #endif /* _X86_64_PAGE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pci.h   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pci.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci.h        2009-03-16 16:33:40.000000000 +0100
 @@ -71,6 +71,7 @@ extern int pci_mmap_page_range(struct pc
  
  
@@ -22788,8 +22788,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif
  
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_32.h 2009-03-16 16:33:40.000000000 +0100
 @@ -3,69 +3,109 @@
  
  #include <linux/threads.h>
@@ -22938,8 +22938,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif        /* CONFIG_X86_PAE */
  
  #endif /* _I386_PGALLOC_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc_64.h 2009-03-16 16:33:40.000000000 +0100
 @@ -6,30 +6,13 @@
  #include <linux/mm.h>
  #include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
@@ -23095,8 +23095,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #define __pmd_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
  #define __pud_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable.h    2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,467 @@
 +#ifndef _ASM_X86_PGTABLE_H
 +#define _ASM_X86_PGTABLE_H
@@ -23565,8 +23565,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif        /* __ASSEMBLY__ */
 +
 +#endif        /* _ASM_X86_PGTABLE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:33:40.000000000 +0100
 @@ -18,16 +18,18 @@
        printk("%s:%d: bad pgd %p(%016Lx pfn %08Lx).\n", __FILE__, __LINE__, \
               &(e), __pgd_val(e), (pgd_val(e) & PTE_MASK) >> PAGE_SHIFT)
@@ -23731,8 +23731,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#define __swp_entry_to_pte(x)         ((pte_t){ { .pte_high = (x).val } })
  
  #endif /* _I386_PGTABLE_3LEVEL_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-16 16:33:40.000000000 +0100
 @@ -1,8 +1,6 @@
  #ifndef _I386_PGTABLE_H
  #define _I386_PGTABLE_H
@@ -24196,8 +24196,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#include <asm-generic/pgtable.h>
 -
  #endif /* _I386_PGTABLE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:33:40.000000000 +0100
 @@ -13,49 +13,26 @@
  #include <linux/threads.h>
  #include <linux/sched.h>
@@ -24742,8 +24742,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #endif /* !__ASSEMBLY__ */
  
  #endif /* _X86_64_PGTABLE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor.h     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor.h  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor.h  2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,793 @@
 +#ifndef __ASM_X86_PROCESSOR_H
 +#define __ASM_X86_PROCESSOR_H
@@ -25540,7 +25540,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#define KSTK_EIP(task) (task_pt_regs(task)->ip)
 +
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_32.h  2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,751 +0,0 @@
 -/*
@@ -26294,7 +26294,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -extern int force_mwait;
 -
 -#endif /* __ASM_I386_PROCESSOR_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor_64.h  2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,461 +0,0 @@
 -/*
@@ -26758,8 +26758,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#define HAVE_ARCH_PICK_MMAP_LAYOUT 1
 -
 -#endif /* __ASM_X86_64_PROCESSOR_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/segment.h       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/segment.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment.h    2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,204 @@
 +#ifndef _ASM_X86_SEGMENT_H_
 +#define _ASM_X86_SEGMENT_H_
@@ -26967,7 +26967,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif
 +
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/segment_32.h    2008-12-15 11:27:22.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment_32.h    2008-12-15 11:27:22.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,150 +0,0 @@
 -#ifndef _ASM_SEGMENT_H
@@ -27120,8 +27120,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -#define SEGMENT_IS_PNP_CODE(x)   (((x) & ~0x0b) == GDT_ENTRY_PNPBIOS_BASE * 8)
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_32.h     2009-03-16 16:33:40.000000000 +0100
 @@ -1,56 +1,51 @@
  #ifndef __ASM_SMP_H
  #define __ASM_SMP_H
@@ -27319,8 +27319,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -
 +#endif /* !ASSEMBLY */
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp_64.h     2009-03-16 16:33:40.000000000 +0100
 @@ -1,139 +1,103 @@
  #ifndef __ASM_SMP_H
  #define __ASM_SMP_H
@@ -27513,7 +27513,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #endif
  
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/spinlock.h   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/spinlock.h   2009-03-16 16:33:40.000000000 +0100
 @@ -0,0 +1,333 @@
 +#ifndef _X86_SPINLOCK_H_
 +#define _X86_SPINLOCK_H_
@@ -27848,8 +27848,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#define _raw_write_relax(lock)        cpu_relax()
 +
 +#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system.h     2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,393 @@
 +#ifndef _ASM_X86_SYSTEM_H_
 +#define _ASM_X86_SYSTEM_H_
@@ -28246,7 +28246,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +}
 +
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_32.h     2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,312 +0,0 @@
 -#ifndef __ASM_SYSTEM_H
@@ -28561,8 +28561,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -void __show_registers(struct pt_regs *, int all);
 -
 -#endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system_64.h  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system_64.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system_64.h  2009-03-16 16:33:40.000000000 +0100
 @@ -1,122 +1,9 @@
  #ifndef __ASM_SYSTEM_H
  #define __ASM_SYSTEM_H
@@ -28739,8 +28739,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -extern void free_init_pages(char *what, unsigned long begin, unsigned long end);
 -
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/tlbflush.h      2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/tlbflush.h   2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush.h      2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush.h   2009-03-16 16:33:40.000000000 +0100
 @@ -1,5 +1,106 @@
 +#ifndef _ASM_X86_TLBFLUSH_H
 +#define _ASM_X86_TLBFLUSH_H
@@ -28850,7 +28850,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +}
 +
 +#endif /* _ASM_X86_TLBFLUSH_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_32.h   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,99 +0,0 @@
 -#ifndef _I386_TLBFLUSH_H
@@ -28952,7 +28952,7 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -}
 -
 -#endif /* _I386_TLBFLUSH_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush_64.h   2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,97 +0,0 @@
 -#ifndef _X8664_TLBFLUSH_H
@@ -29052,8 +29052,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 -}
 -
 -#endif /* _X8664_TLBFLUSH_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/irq_vectors.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/irq_vectors.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/irq_vectors.h       2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/irq_vectors.h    2009-03-16 16:33:40.000000000 +0100
 @@ -82,7 +82,8 @@
  
  #define RESCHEDULE_VECTOR     0
@@ -29064,8 +29064,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /*
   * The maximum number of vectors supported by i386 processors
---- sle11-2009-06-29.orig/include/asm-x86/mmu.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mmu.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mmu.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mmu.h     2009-03-16 16:33:40.000000000 +0100
 @@ -23,7 +23,7 @@ typedef struct {
        void *vdso;
  } mm_context_t;
@@ -29075,8 +29075,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  void leave_mm(int cpu);
  #else
  static inline void leave_mm(int cpu)
---- sle11-2009-06-29.orig/include/asm-x86/ptrace.h     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/ptrace.h  2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/ptrace.h     2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/ptrace.h  2009-03-16 16:33:40.000000000 +0100
 @@ -249,7 +249,9 @@ extern void user_enable_single_step(stru
  extern void user_disable_single_step(struct task_struct *);
  
@@ -29088,8 +29088,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #define arch_has_block_step() (1)
  #else
  #define arch_has_block_step() (boot_cpu_data.x86 >= 6)
---- sle11-2009-06-29.orig/include/asm-x86/thread_info.h        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/thread_info.h     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/thread_info.h        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/thread_info.h     2009-03-16 16:33:40.000000000 +0100
 @@ -94,6 +94,9 @@ struct thread_info {
  #define TIF_DS_AREA_MSR               26      /* uses thread_struct.ds_area_msr */
  #define TIF_BTS_TRACE_TS      27      /* record scheduling event timestamps */
@@ -29125,8 +29125,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  #define PREEMPT_ACTIVE                0x10000000
  
---- sle11-2009-06-29.orig/include/asm-x86/time.h       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/time.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/time.h       2009-10-28 14:55:04.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/time.h    2009-03-16 16:33:40.000000000 +0100
 @@ -58,4 +58,10 @@ static inline int native_set_wallclock(u
  
  extern unsigned long __init calibrate_cpu(void);
@@ -29138,8 +29138,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
 +#endif
 +
  #endif
---- sle11-2009-06-29.orig/include/linux/page-flags.h   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/include/linux/page-flags.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/page-flags.h   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/linux/page-flags.h        2009-03-16 16:33:40.000000000 +0100
 @@ -102,8 +102,8 @@ enum pageflags {
        PG_foreign,             /* Page is owned by foreign allocator. */
        PG_pinned,              /* Cannot alias with PG_owner_priv_1 since
@@ -29151,8 +29151,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  #endif
        __NR_PAGEFLAGS,
  
---- sle11-2009-06-29.orig/include/linux/pci.h  2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-06-29/include/linux/pci.h       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/pci.h  2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/include/linux/pci.h       2009-03-16 16:33:40.000000000 +0100
 @@ -644,6 +644,9 @@ int pcie_set_readrq(struct pci_dev *dev,
  void pci_update_resource(struct pci_dev *dev, struct resource *res, int resno);
  int __must_check pci_assign_resource(struct pci_dev *dev, int i);
@@ -29163,8 +29163,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  
  /* ROM control related routines */
  void __iomem __must_check *pci_map_rom(struct pci_dev *pdev, size_t *size);
---- sle11-2009-06-29.orig/include/xen/evtchn.h 2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/xen/evtchn.h      2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/evtchn.h 2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/xen/evtchn.h      2009-03-16 16:33:40.000000000 +0100
 @@ -130,12 +130,37 @@ static inline void clear_evtchn(int port
        synch_clear_bit(port, s->evtchn_pending);
  }
@@ -29203,8 +29203,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
  /*
   * Use these to access the event channel underlying the IRQ handle returned
   * by bind_*_to_irqhandler().
---- sle11-2009-06-29.orig/kernel/sysctl_check.c        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/kernel/sysctl_check.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/kernel/sysctl_check.c        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/kernel/sysctl_check.c     2009-03-16 16:33:40.000000000 +0100
 @@ -899,7 +899,7 @@ static const struct trans_ctl_table tran
  };
  
@@ -29214,8 +29214,8 @@ Automatically created from "patches.kernel.org/patch-2.6.25" by xen-port-patches
        { CTL_XEN_INDEPENDENT_WALLCLOCK,        "independent_wallclock" },
        { CTL_XEN_PERMITTED_CLOCK_JITTER,       "permitted_clock_jitter" },
        {}
---- sle11-2009-06-29.orig/lib/swiotlb-xen.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/lib/swiotlb-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-03-16 16:33:40.000000000 +0100
 @@ -30,7 +30,6 @@
  #include <asm/gnttab_dma.h>
  
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.26
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.26
index 0f2c30f2fcd64d83a4e6b15211a602db03b9134b..2a000e6cbfeb0b41ced4d969487d76756d52f289 100644 (file)
@@ -5,8 +5,8 @@ Patch-mainline: 2.6.26
 Acked-by: Jeff Mahoney <jeffm@suse.com>
 Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches.py
 
---- sle11-2009-05-14.orig/arch/x86/Kconfig     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/Kconfig  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-03-16 16:38:05.000000000 +0100
 @@ -28,7 +28,7 @@ config X86
        select HAVE_DYNAMIC_FTRACE
        select HAVE_FTRACE
@@ -50,8 +50,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -source "drivers/xen/Kconfig"
 -
  source "lib/Kconfig"
---- sle11-2009-05-14.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/ia32/ia32entry-xen.S     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-03-16 16:38:05.000000000 +0100
 @@ -129,12 +129,14 @@ sysenter_tracesys:
        SAVE_REST
        CLEAR_RREGS
@@ -112,8 +112,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        .quad sys_alarm
        .quad sys_fstat /* (old)fstat */
        .quad sys_pause
---- sle11-2009-05-14.orig/arch/x86/kernel/Makefile     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/Makefile  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-03-16 16:38:05.000000000 +0100
 @@ -122,8 +122,7 @@ ifeq ($(CONFIG_X86_64),y)
  
        obj-$(CONFIG_XEN)               += nmi_64.o
@@ -125,33 +125,25 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -      smpboot_$(BITS).o tsc_$(BITS).o tsc_sync.o
 +disabled-obj-$(CONFIG_XEN) := crash.o early-quirks.o hpet.o i8253.o i8259_$(BITS).o \
 +      pci-swiotlb_64.o reboot.o smpboot.o tlb_$(BITS).o tsc_$(BITS).o tsc_sync.o vsmp_64.o
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/Makefile        2008-12-01 11:11:08.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/Makefile     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/Makefile        2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/Makefile     2009-03-16 16:38:05.000000000 +0100
 @@ -15,4 +15,4 @@ $(obj)/wakeup_rm.o:    $(obj)/realmode/w
  $(obj)/realmode/wakeup.bin: FORCE
        $(Q)$(MAKE) $(build)=$(obj)/realmode
  
 -disabled-obj-$(CONFIG_XEN)    := cstate.o wakeup_$(BITS).o
 +disabled-obj-$(CONFIG_XEN)    := cstate.o wakeup_%.o
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/boot.c  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/boot.c       2009-03-16 16:38:05.000000000 +0100
-@@ -251,19 +251,23 @@ static int __init acpi_parse_madt(struct
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/boot.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/boot.c       2009-08-26 11:55:26.000000000 +0200
+@@ -251,6 +251,7 @@ static int __init acpi_parse_madt(struct
  
  static void __cpuinit acpi_register_lapic(int id, u8 enabled)
  {
 +#ifndef CONFIG_XEN
        unsigned int ver = 0;
-+#endif
  
        if (!enabled) {
-               ++disabled_cpus;
-               return;
-       }
-+#ifndef CONFIG_XEN
- #ifdef CONFIG_X86_32
-       if (boot_cpu_physical_apicid != -1U)
-               ver = apic_version[boot_cpu_physical_apicid];
+@@ -264,6 +265,7 @@ static void __cpuinit acpi_register_lapi
  #endif
  
        generic_processor_info(id, ver);
@@ -159,7 +151,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  }
  
  static int __init
-@@ -774,6 +778,7 @@ static int __init acpi_parse_fadt(struct
+@@ -774,6 +776,7 @@ static int __init acpi_parse_fadt(struct
   * returns 0 on success, < 0 on error
   */
  
@@ -167,7 +159,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  static void __init acpi_register_lapic_address(unsigned long address)
  {
        mp_lapic_addr = address;
-@@ -787,6 +792,9 @@ static void __init acpi_register_lapic_a
+@@ -787,6 +790,9 @@ static void __init acpi_register_lapic_a
  #endif
        }
  }
@@ -177,8 +169,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  static int __init early_acpi_parse_madt_lapic_addr_ovr(void)
  {
---- sle11-2009-05-14.orig/arch/x86/kernel/acpi/sleep-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/acpi/sleep-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -10,15 +10,19 @@
  #include <linux/dmi.h>
  #include <linux/cpumask.h>
@@ -303,8 +295,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #endif
  }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/common-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -5,7 +5,6 @@
  #include <linux/module.h>
  #include <linux/percpu.h>
@@ -697,8 +689,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  void __cpuinit cpu_uninit(void)
  {
        int cpu = raw_smp_processor_id();
---- sle11-2009-05-14.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/mtrr/main-xen.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/mtrr/main-xen.c       2009-03-16 16:38:05.000000000 +0100
 @@ -35,6 +35,8 @@ struct mtrr_ops *mtrr_if = &generic_mtrr
  unsigned int num_var_ranges;
  unsigned int mtrr_usage_table[MAX_VAR_RANGES];
@@ -853,8 +845,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  }
  
  void mtrr_ap_init(void)
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_32-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_32-xen.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_32-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -469,7 +469,7 @@ int __init sanitize_e820_map(struct e820
   * thinkpad 560x, for example, does not cooperate with the memory
   * detection code.)
@@ -921,8 +913,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                saved_max_pfn = max_pfn;
  #endif
                e820.nr_map = 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/e820_64-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/e820_64-xen.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/e820_64-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -40,11 +40,11 @@ struct e820map machine_e820;
  unsigned long end_pfn;
  
@@ -1238,11 +1230,11 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                e820.nr_map = 0;
                userdef = 1;
                return 0;
---- sle11-2009-05-14.orig/arch/x86/kernel/early_printk-xen.c   2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/early_printk-xen.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-09-24 10:29:16.000000000 +0200
 @@ -13,7 +13,7 @@
+ #define VGABASE               (__ISA_IO_base + 0xb8000)
  
- #ifndef CONFIG_XEN
  static int max_ypos = 25, max_xpos = 80;
 -static int current_ypos = 25, current_xpos = 0; 
 +static int current_ypos = 25, current_xpos;
@@ -1308,8 +1300,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #ifdef CONFIG_XEN
        } else if (!strncmp(buf, "xen", 3)) {
                early_console = &xenboot_console;
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:18:32.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:18:32.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,4 @@
  /*
 - *  linux/arch/i386/entry.S
@@ -1477,8 +1469,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        GET_THREAD_INFO(%ebp)
        movl $-EFAULT,PT_EAX(%esp)
        jmp resume_userspace
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-03-16 16:38:05.000000000 +0100
 @@ -338,19 +338,17 @@ badsys:
        /* Do syscall tracing */
  tracesys:                      
@@ -1502,8 +1494,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        /* Use IRET because user could have changed frame */
                
  /* 
---- sle11-2009-05-14.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/genapic_64-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -15,6 +15,7 @@
  #include <linux/kernel.h>
  #include <linux/ctype.h>
@@ -1594,8 +1586,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      return uv_system_type != UV_NONE;
 +}
 +#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/genapic_xen_64.c     2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/genapic_xen_64.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_xen_64.c     2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_xen_64.c  2009-03-16 16:38:05.000000000 +0100
 @@ -72,9 +72,7 @@ static cpumask_t xen_target_cpus(void)
  
  static cpumask_t xen_vector_allocation_domain(int cpu)
@@ -1607,8 +1599,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  }
  
  /*
---- sle11-2009-05-14.orig/arch/x86/kernel/head64-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head64-xen.c      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-03-16 16:38:05.000000000 +0100
 @@ -17,6 +17,7 @@
  #include <linux/string.h>
  #include <linux/percpu.h>
@@ -1760,8 +1752,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
        /*
         * At this point everything still needed from the boot loader
---- sle11-2009-05-14.orig/arch/x86/kernel/head_32-xen.S        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/head_32-xen.S     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_32-xen.S        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_32-xen.S     2009-03-16 16:38:05.000000000 +0100
 @@ -69,7 +69,7 @@ ENTRY(startup_32)
        cld                     # gcc2 wants the direction flag cleared at all times
  
@@ -1771,8 +1763,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  #define HYPERCALL_PAGE_OFFSET 0x1000
  .org HYPERCALL_PAGE_OFFSET
---- sle11-2009-05-14.orig/arch/x86/kernel/init_task-xen.c      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/init_task-xen.c   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/init_task-xen.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/init_task-xen.c   2009-03-16 16:38:05.000000000 +0100
 @@ -11,7 +11,6 @@
  #include <asm/desc.h>
  
@@ -1781,8 +1773,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
  static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
  #ifdef CONFIG_X86_XEN
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_32-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -88,6 +88,16 @@ int sis_apic_bug = -1;
   */
  int nr_ioapic_registers[MAX_IO_APICS];
@@ -2111,8 +2103,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
        return 0;
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/io_apic_64-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -43,13 +43,15 @@
  #include <asm/smp.h>
  #include <asm/desc.h>
@@ -2311,7 +2303,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
                for (i = 0; i < nr_ioapics; i++) {
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/ipi-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ipi-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,232 @@
 +#include <linux/cpumask.h>
 +#include <linux/interrupt.h>
@@ -2545,8 +2537,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +}
 +#endif
 +#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/irq_32-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/irq_32-xen.c      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-03-16 16:38:05.000000000 +0100
 @@ -79,7 +79,7 @@ unsigned int do_IRQ(struct pt_regs *regs
  
        if (unlikely((unsigned)irq >= NR_IRQS)) {
@@ -2574,8 +2566,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  asmlinkage void do_softirq(void)
  {
        unsigned long flags;
---- sle11-2009-05-14.orig/arch/x86/kernel/machine_kexec_64.c   2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/machine_kexec_64.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/machine_kexec_64.c   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/machine_kexec_64.c        2009-03-16 16:38:05.000000000 +0100
 @@ -120,8 +120,6 @@ int __init machine_kexec_setup_resources
        return 0;
  }
@@ -2585,8 +2577,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #else /* CONFIG_XEN */
  
  #define x__pmd(x) __pmd(x)
---- sle11-2009-05-14.orig/arch/x86/kernel/microcode-xen.c      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/microcode-xen.c   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-03-16 16:38:05.000000000 +0100
 @@ -162,7 +162,7 @@ static int request_microcode(void)
                c->x86, c->x86_model, c->x86_mask);
        error = request_firmware(&firmware, name, &microcode_pdev->dev);
@@ -2596,8 +2588,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                return error;
        }
  
---- sle11-2009-05-14.orig/arch/x86/kernel/mmconf-fam10h_64.c   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/mmconf-fam10h_64.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mmconf-fam10h_64.c   2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mmconf-fam10h_64.c        2009-03-16 16:38:05.000000000 +0100
 @@ -219,6 +219,16 @@ void __cpuinit fam10h_check_enable_mmcfg
        val |= fam10h_pci_mmconf_base | (8 << FAM10H_MMIO_CONF_BUSRANGE_SHIFT) |
               FAM10H_MMIO_CONF_ENABLE;
@@ -2616,7 +2608,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  static int __devinit set_check_enable_amd_mmconf(const struct dmi_system_id *d)
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/mpparse-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,1101 @@
 +/*
 + *    Intel Multiprocessor Specification 1.1 and 1.4
@@ -3719,7 +3711,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +
 +#endif /* CONFIG_X86_IO_APIC */
 +#endif /* CONFIG_ACPI */
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_32-xen.c     2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1161 +0,0 @@
 -/*
@@ -4883,7 +4875,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -
 -#endif /* CONFIG_X86_IO_APIC */
 -#endif /* CONFIG_ACPI */
---- sle11-2009-05-14.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse_64-xen.c     2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,879 +0,0 @@
 -/*
@@ -5765,8 +5757,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -      return gsi;
 -}
 -#endif /*CONFIG_ACPI*/
---- sle11-2009-05-14.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/pci-dma-xen.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-10-22 11:31:59.000000000 +0200
 @@ -1,283 +1,251 @@
 -/*
 - * Dynamic DMA mapping support.
@@ -6437,13 +6429,13 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      if (dev->dma_mask == NULL)
 +              return NULL;
 +
++#ifdef CONFIG_XEN
++      gfp &= ~(__GFP_DMA | __GFP_DMA32);
++#else
 +      /* Don't invoke OOM killer or retry in lower 16MB DMA zone */
 +      if (gfp & __GFP_DMA)
 +              noretry = 1;
 +
-+#ifdef CONFIG_XEN
-+      gfp &= ~(__GFP_DMA | __GFP_DMA32);
-+#else
 +#ifdef CONFIG_X86_64
 +      /* Why <=? Even when the mask is smaller than 4GB it is often
 +         larger than 16MB and in this case we have a chance of
@@ -6610,7 +6602,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_VIA, PCI_ANY_ID, via_no_dac);
 +#endif
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/pci-nommu-xen.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-nommu-xen.c   2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,103 @@
 +#include <linux/dma-mapping.h>
 +#include <linux/dmar.h>
@@ -6716,7 +6708,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      dma_ops = &nommu_dma_ops;
 +}
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/process-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,188 @@
 +#include <linux/errno.h>
 +#include <linux/kernel.h>
@@ -6906,8 +6898,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +}
 +early_param("idle", idle_setup);
 +
---- sle11-2009-05-14.orig/arch/x86/kernel/process_32-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_32-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -36,6 +36,7 @@
  #include <linux/personality.h>
  #include <linux/tick.h>
@@ -7187,8 +7179,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                math_state_restore();
  
        /*
---- sle11-2009-05-14.orig/arch/x86/kernel/process_64-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/process_64-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -39,6 +39,7 @@
  #include <linux/kprobes.h>
  #include <linux/kdebug.h>
@@ -7431,7 +7423,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        return prev_p;
  }
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/setup-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup-xen.c       2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,141 @@
 +#include <linux/kernel.h>
 +#include <linux/module.h>
@@ -7574,8 +7566,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +}
 +
 +#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/setup64-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup64-xen.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup64-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -15,6 +15,7 @@
  #include <linux/bootmem.h>
  #include <linux/bitops.h>
@@ -7725,8 +7717,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      if (is_uv_system())
 +              uv_cpu_init();
  }
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_32-xen.c       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_32-xen.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_32-xen.c    2009-03-16 16:38:05.000000000 +0100
 @@ -39,6 +39,7 @@
  #include <linux/efi.h>
  #include <linux/init.h>
@@ -7993,8 +7985,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #ifdef CONFIG_X86_GENERICARCH
        generic_apic_probe();
  #endif
---- sle11-2009-05-14.orig/arch/x86/kernel/setup_64-xen.c       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/setup_64-xen.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup_64-xen.c    2009-03-16 16:38:05.000000000 +0100
 @@ -29,18 +29,22 @@
  #include <linux/crash_dump.h>
  #include <linux/root_dev.h>
@@ -8552,7 +8544,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -      .show = show_cpuinfo,
 -};
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/kernel/smp-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,329 @@
 +/*
 + *    Intel SMP support routines.
@@ -8883,7 +8875,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +
 +      return IRQ_HANDLED;
 +}
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_32-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_32-xen.c 2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,647 +0,0 @@
 -/*
@@ -9533,7 +9525,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -
 -      return IRQ_HANDLED;
 -}
---- sle11-2009-05-14.orig/arch/x86/kernel/smp_64-xen.c 2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp_64-xen.c 2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,554 +0,0 @@
 -/*
@@ -10090,9 +10082,9 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -      return IRQ_HANDLED;
 -#endif
 -}
---- sle11-2009-05-14.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:12:48.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/time_32-xen.c     2009-03-24 10:13:09.000000000 +0100
-@@ -699,8 +699,6 @@ int xen_update_persistent_clock(void)
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:58:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:58:12.000000000 +0100
+@@ -700,8 +700,6 @@ int xen_update_persistent_clock(void)
        return 0;
  }
  
@@ -10101,8 +10093,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  /* Dynamically-mapped IRQ. */
  DEFINE_PER_CPU(int, timer_irq);
  
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-03-16 16:38:05.000000000 +0100
 @@ -9,26 +9,28 @@
   * 'Traps.c' handles hardware traps and faults after we have saved some
   * state in 'asm.s'.
@@ -11187,8 +11179,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        return 1;
  }
  __setup("kstack=", kstack_setup);
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_64-xen.c       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_64-xen.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-03-16 16:38:05.000000000 +0100
 @@ -33,6 +33,8 @@
  #include <linux/kdebug.h>
  #include <linux/utsname.h>
@@ -11297,8 +11289,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
         * Should be a barrier for any external CPU state.
         */
        cpu_init();
---- sle11-2009-05-14.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/vsyscall_64-xen.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -216,7 +216,7 @@ vgetcpu(unsigned *cpu, unsigned *node, s
        return 0;
  }
@@ -11308,8 +11300,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  {
        return -ENOSYS;
  }
---- sle11-2009-05-14.orig/arch/x86/mm/fault-xen.c      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/fault-xen.c   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/fault-xen.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault-xen.c   2009-03-16 16:38:05.000000000 +0100
 @@ -510,6 +510,11 @@ static int vmalloc_fault(unsigned long a
        unsigned long pgd_paddr;
        pmd_t *pmd_k;
@@ -11341,8 +11333,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -                              (__START_KERNEL & PGDIR_MASK)));
  #endif
  }
---- sle11-2009-05-14.orig/arch/x86/mm/highmem_32-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/highmem_32-xen.c      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/highmem_32-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/highmem_32-xen.c      2009-03-16 16:38:05.000000000 +0100
 @@ -200,6 +200,8 @@ EXPORT_SYMBOL(kmap);
  EXPORT_SYMBOL(kunmap);
  EXPORT_SYMBOL(kmap_atomic);
@@ -11352,8 +11344,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +#endif
  EXPORT_SYMBOL(clear_highpage);
  EXPORT_SYMBOL(copy_highpage);
---- sle11-2009-05-14.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_32-xen.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,4 @@
  /*
 - *  linux/arch/i386/mm/init.c
@@ -11598,8 +11590,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #endif
        start += size;
        size = (unsigned long)__end_rodata - start;
---- sle11-2009-05-14.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/init_64-xen.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -52,9 +52,6 @@
  
  #include <xen/features.h>
@@ -12090,8 +12082,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      }
 +}
  #endif
---- sle11-2009-05-14.orig/arch/x86/mm/ioremap-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/ioremap-xen.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -20,14 +20,11 @@
  #include <asm/pgtable.h>
  #include <asm/tlbflush.h>
@@ -12528,8 +12520,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
        if (early_ioremap_debug) {
                printk(KERN_INFO "early_iounmap(%p, %08lx) [%d]\n", addr,
---- sle11-2009-05-14.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:37:14.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pageattr-xen.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:37:14.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr-xen.c        2009-03-16 16:38:05.000000000 +0100
 @@ -9,6 +9,8 @@
  #include <linux/slab.h>
  #include <linux/mm.h>
@@ -13110,7 +13102,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  bool kernel_page_present(struct page *page)
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/mm/pat-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pat-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,602 @@
 +/*
 + * Handle caching attributes in page tables (PAT)
@@ -13715,7 +13707,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +}
 +
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-05-14/arch/x86/mm/pgtable-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -0,0 +1,709 @@
 +#include <linux/mm.h>
 +#include <linux/module.h>
@@ -14426,8 +14418,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +
 +      return young;
 +}
---- sle11-2009-05-14.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/mm/pgtable_32-xen.c      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-03-16 16:38:05.000000000 +0100
 @@ -1,7 +1,3 @@
 -/*
 - *  linux/arch/i386/mm/pgtable.c
@@ -14688,9 +14680,9 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  void make_lowmem_page_readonly(void *va, unsigned int feature)
  {
        pte_t *pte;
---- sle11-2009-05-14.orig/arch/x86/pci/i386.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/pci/i386.c       2009-05-14 11:20:29.000000000 +0200
-@@ -331,10 +331,14 @@ int pci_mmap_page_range(struct pci_dev *
+--- sle11-2009-10-16.orig/arch/x86/pci/i386.c  2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/i386.c       2009-10-08 12:08:34.000000000 +0200
+@@ -338,10 +338,14 @@ int pci_mmap_page_range(struct pci_dev *
                        flags);
        }
  
@@ -14705,8 +14697,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                free_memtype(addr, addr + len);
                return -EINVAL;
        }
---- sle11-2009-05-14.orig/arch/x86/pci/irq-xen.c       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/pci/irq-xen.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-03-16 16:38:05.000000000 +0100
 @@ -140,9 +140,11 @@ static void __init pirq_peer_trick(void)
                busmap[e->bus] = 1;
        }
@@ -14788,8 +14780,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                }
        }
  
---- sle11-2009-05-14.orig/arch/x86/vdso/vdso32-setup-xen.c     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/vdso/vdso32-setup-xen.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32-setup-xen.c     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32-setup-xen.c  2009-03-16 16:38:05.000000000 +0100
 @@ -164,7 +164,7 @@ static __init void relocate_vdso(Elf32_E
        Elf32_Shdr *shdr;
        int i;
@@ -14833,9 +14825,9 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        down_write(&mm->mmap_sem);
  
        /* Test compat mode once here, in case someone
---- sle11-2009-05-14.orig/drivers/acpi/processor_core.c        2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-05-14/drivers/acpi/processor_core.c     2009-03-16 16:38:05.000000000 +0100
-@@ -657,7 +657,7 @@ static int acpi_processor_get_info(struc
+--- sle11-2009-10-16.orig/drivers/acpi/processor_core.c        2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/acpi/processor_core.c     2009-08-26 11:54:44.000000000 +0200
+@@ -666,7 +666,7 @@ static int acpi_processor_get_info(struc
         * of /proc/cpuinfo
         */
        status = acpi_evaluate_object(pr->handle, "_SUN", NULL, &buffer);
@@ -14844,8 +14836,43 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                arch_fix_phys_package_id(pr->id, object.integer.value);
  
        return 0;
---- sle11-2009-05-14.orig/drivers/input/xen-kbdfront.c 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/input/xen-kbdfront.c      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/firmware/iscsi_ibft.c        2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/drivers/firmware/iscsi_ibft.c     2009-09-24 09:54:51.000000000 +0200
+@@ -943,7 +943,7 @@ static int __init ibft_init(void)
+       if (ibft_addr) {
+               printk(KERN_INFO "iBFT detected at 0x%lx.\n",
+-                     virt_to_phys((void *)ibft_addr));
++                     isa_virt_to_bus(ibft_addr));
+               rc = ibft_check_device();
+               if (rc)
+--- sle11-2009-10-16.orig/drivers/firmware/iscsi_ibft_find.c   2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/drivers/firmware/iscsi_ibft_find.c        2009-09-24 09:52:18.000000000 +0200
+@@ -65,10 +65,10 @@ void __init reserve_ibft_region(void)
+                * so skip that area */
+               if (pos == VGA_MEM)
+                       pos += VGA_SIZE;
+-              virt = phys_to_virt(pos);
++              virt = isa_bus_to_virt(pos);
+               if (memcmp(virt, IBFT_SIGN, IBFT_SIGN_LEN) == 0) {
+                       unsigned long *addr =
+-                          (unsigned long *)phys_to_virt(pos + 4);
++                          (unsigned long *)isa_bus_to_virt(pos + 4);
+                       len = *addr;
+                       /* if the length of the table extends past 1M,
+                        * the table cannot be valid. */
+@@ -78,6 +78,8 @@ void __init reserve_ibft_region(void)
+                       }
+               }
+       }
++#ifndef CONFIG_XEN
+       if (ibft_addr)
+               reserve_bootmem(pos, PAGE_ALIGN(len), BOOTMEM_DEFAULT);
++#endif
+ }
+--- sle11-2009-10-16.orig/drivers/input/xen-kbdfront.c 2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/drivers/input/xen-kbdfront.c      2009-03-16 16:38:05.000000000 +0100
 @@ -325,7 +325,6 @@ static struct xenbus_device_id xenkbd_id
  
  static struct xenbus_driver xenkbd = {
@@ -14854,8 +14881,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        .ids = xenkbd_ids,
        .probe = xenkbd_probe,
        .remove = xenkbd_remove,
---- sle11-2009-05-14.orig/drivers/oprofile/cpu_buffer.c        2009-03-12 16:15:32.000000000 +0100
-+++ sle11-2009-05-14/drivers/oprofile/cpu_buffer.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/oprofile/cpu_buffer.c        2009-03-12 16:15:32.000000000 +0100
++++ sle11-2009-10-16/drivers/oprofile/cpu_buffer.c     2009-03-16 16:38:05.000000000 +0100
 @@ -341,7 +341,7 @@ void oprofile_add_mode(int cpu_mode)
  
  int oprofile_add_domain_switch(int32_t domain_id)
@@ -14865,8 +14892,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
        /* should have space for switching into and out of domain 
           (2 slots each) plus one sample and one cpu mode switch */
---- sle11-2009-05-14.orig/drivers/pci/msi-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/drivers/pci/msi-xen.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-03-16 16:38:05.000000000 +0100
 @@ -583,7 +583,7 @@ int pci_enable_msi(struct pci_dev* dev)
  EXPORT_SYMBOL(pci_enable_msi);
  
@@ -14907,8 +14934,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  EXPORT_SYMBOL(pci_disable_msix);
  
  /**
---- sle11-2009-05-14.orig/drivers/video/Kconfig        2009-02-16 15:58:02.000000000 +0100
-+++ sle11-2009-05-14/drivers/video/Kconfig     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/video/Kconfig        2009-06-04 10:18:21.000000000 +0200
++++ sle11-2009-10-16/drivers/video/Kconfig     2009-03-16 16:38:05.000000000 +0100
 @@ -2029,7 +2029,7 @@ config FB_VIRTUAL
  
  config XEN_FBDEV_FRONTEND
@@ -14918,8 +14945,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        select FB_SYS_FILLRECT
        select FB_SYS_COPYAREA
        select FB_SYS_IMAGEBLIT
---- sle11-2009-05-14.orig/drivers/video/xen-fbfront.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/video/xen-fbfront.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/video/xen-fbfront.c  2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/drivers/video/xen-fbfront.c       2009-03-16 16:38:05.000000000 +0100
 @@ -670,7 +670,6 @@ static struct xenbus_device_id xenfb_ids
  
  static struct xenbus_driver xenfb = {
@@ -14928,8 +14955,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        .ids = xenfb_ids,
        .probe = xenfb_probe,
        .remove = xenfb_remove,
---- sle11-2009-05-14.orig/drivers/xen/Kconfig  2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/Kconfig       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/Kconfig  2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/Kconfig       2009-03-16 16:38:05.000000000 +0100
 @@ -2,8 +2,6 @@
  # This Kconfig describe xen options
  #
@@ -14939,8 +14966,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  config XEN
        bool
  
---- sle11-2009-05-14.orig/drivers/xen/Makefile 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/Makefile      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/Makefile 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/Makefile      2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,8 @@
 -obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o
 +obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o features.o events.o
@@ -14961,8 +14988,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  obj-$(CONFIG_XEN_BLKDEV_BACKEND)      += blkback/
  obj-$(CONFIG_XEN_BLKDEV_TAP)          += blktap/
  obj-$(CONFIG_XEN_NETDEV_BACKEND)      += netback/
---- sle11-2009-05-14.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:12:53.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/blkfront.c   2009-05-19 10:38:53.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/blkfront.c      2009-03-24 10:12:53.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/blkfront.c   2009-05-19 10:38:53.000000000 +0200
 @@ -285,7 +285,11 @@ static void backend_changed(struct xenbu
                break;
  
@@ -14976,8 +15003,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                if (bd == NULL)
                        xenbus_dev_fatal(dev, -ENODEV, "bdget failed");
  
---- sle11-2009-05-14.orig/drivers/xen/blkfront/block.h 2009-03-24 10:11:58.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/block.h      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/block.h 2009-03-24 10:11:58.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/block.h      2009-03-16 16:38:05.000000000 +0100
 @@ -96,7 +96,6 @@ struct blk_shadow {
  struct blkfront_info
  {
@@ -14986,8 +15013,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        struct gendisk *gd;
        int vdevice;
        blkif_vdev_t handle;
---- sle11-2009-05-14.orig/drivers/xen/blkfront/vbd.c   2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/blkfront/vbd.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/blkfront/vbd.c   2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/blkfront/vbd.c        2009-03-16 16:38:05.000000000 +0100
 @@ -246,17 +246,32 @@ xlvbd_init_blk_queue(struct gendisk *gd,
        return 0;
  }
@@ -15067,8 +15094,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  void
  xlvbd_del(struct blkfront_info *info)
  {
---- sle11-2009-05-14.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:38:54.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/blktap/blktap.c       2009-04-20 11:40:14.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:38:54.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/blktap/blktap.c       2009-04-20 11:40:14.000000000 +0200
 @@ -111,6 +111,7 @@ typedef struct tap_blkif {
        unsigned long mode;           /*current switching mode               */
        int minor;                    /*Minor number for tapdisk device      */
@@ -15150,8 +15177,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        } else {
                /* this is bad, but not fatal */
                WPRINTK("blktap: sysfs xen_class not created\n");
---- sle11-2009-05-14.orig/drivers/xen/char/mem.c       2008-12-15 11:27:22.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/char/mem.c    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/char/mem.c       2008-12-15 11:27:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/char/mem.c    2009-03-16 16:38:05.000000000 +0100
 @@ -33,6 +33,27 @@ static inline int uncached_access(struct
        return 0;
  }
@@ -15240,8 +15267,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        /* We want to return the real error code, not EAGAIN. */
        return direct_remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff,
                                      size, vma->vm_page_prot, DOMID_IO);
---- sle11-2009-05-14.orig/drivers/xen/console/console.c        2008-12-15 11:26:44.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/console/console.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/console/console.c        2008-12-15 11:26:44.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/console/console.c     2009-03-16 16:38:05.000000000 +0100
 @@ -552,16 +552,18 @@ static int xencons_write(
        return i;
  }
@@ -15283,8 +15310,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        if (tty->ldisc.flush_buffer != NULL)
                tty->ldisc.flush_buffer(tty);
        tty->closing = 0;
---- sle11-2009-05-14.orig/drivers/xen/core/machine_kexec.c     2009-02-17 11:46:41.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/machine_kexec.c  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/machine_kexec.c     2009-02-17 11:46:41.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/machine_kexec.c  2009-03-16 16:38:05.000000000 +0100
 @@ -5,6 +5,7 @@
  
  #include <linux/kexec.h>
@@ -15339,8 +15366,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  /*
   * Local variables:
---- sle11-2009-05-14.orig/drivers/xen/core/smpboot.c   2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/core/smpboot.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-03-16 16:38:05.000000000 +0100
 @@ -53,17 +53,16 @@ static DEFINE_PER_CPU(int, callfunc_irq)
  static char resched_name[NR_CPUS][15];
  static char callfunc_name[NR_CPUS][15];
@@ -15411,8 +15438,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  {
        while (HYPERVISOR_vcpu_op(VCPUOP_is_up, cpu, NULL)) {
                current->state = TASK_UNINTERRUPTIBLE;
---- sle11-2009-05-14.orig/drivers/xen/core/xen_proc.c  2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/core/xen_proc.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/core/xen_proc.c  2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/xen_proc.c       2009-03-16 16:38:05.000000000 +0100
 @@ -8,7 +8,7 @@ static struct proc_dir_entry *xen_base;
  struct proc_dir_entry *create_xen_proc_entry(const char *name, mode_t mode)
  {
@@ -15422,8 +15449,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
                        panic("Couldn't create /proc/xen");
        return create_proc_entry(name, mode, xen_base);
  }
---- sle11-2009-05-14.orig/drivers/xen/fbfront/xenfb.c  2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/fbfront/xenfb.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenfb.c  2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenfb.c       2009-03-16 16:38:05.000000000 +0100
 @@ -93,7 +93,7 @@ struct xenfb_info
   *    only mappings.  The former creates unfaulted pages.  Preserves
   *    invariant.  The latter removes pages.  Preserves invariant.
@@ -15493,8 +15520,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  };
  
  static int xenfb_mmap(struct fb_info *fb_info, struct vm_area_struct *vma)
---- sle11-2009-05-14.orig/drivers/xen/gntdev/gntdev.c  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/gntdev/gntdev.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/gntdev/gntdev.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/gntdev/gntdev.c       2009-03-16 16:38:05.000000000 +0100
 @@ -392,7 +392,7 @@ nomem_out:
  static int __init gntdev_init(void)
  {
@@ -15524,8 +15551,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        unregister_chrdev(gntdev_major, GNTDEV_NAME);
  }
  
---- sle11-2009-05-14.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:39:44.000000000 +0200
-+++ sle11-2009-05-14/drivers/xen/netfront/netfront.c   2009-03-30 16:40:17.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:39:44.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-03-30 16:40:17.000000000 +0200
 @@ -1464,8 +1464,7 @@ err:     
                }
        }
@@ -15546,8 +15573,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
        spin_unlock_bh(&np->rx_lock);
  }
---- sle11-2009-05-14.orig/drivers/xen/privcmd/privcmd.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/privcmd/privcmd.c     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/privcmd/privcmd.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/privcmd/privcmd.c     2009-03-16 16:38:05.000000000 +0100
 @@ -261,15 +261,13 @@ static long privcmd_ioctl(struct file *f
  }
  
@@ -15567,8 +15594,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  };
  
  static int privcmd_mmap(struct file * file, struct vm_area_struct * vma)
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-24 10:12:22.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_client.c        2009-03-24 10:13:17.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-24 10:12:22.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_client.c        2009-03-24 10:13:17.000000000 +0100
 @@ -442,7 +442,7 @@ int xenbus_map_ring_valloc(struct xenbus
  
        *vaddr = NULL;
@@ -15596,8 +15623,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        else
                xenbus_dev_error(dev, op.status,
                                 "unmapping page at handle %d error %d",
---- sle11-2009-05-14.orig/drivers/xen/xenbus/xenbus_probe.c    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/drivers/xen/xenbus/xenbus_probe.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2009-03-16 16:38:05.000000000 +0100
 @@ -173,7 +173,7 @@ static int read_backend_details(struct x
        return read_otherend_details(xendev, "backend-id", "backend");
  }
@@ -15664,8 +15691,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        device_remove_file(&xendev->dev, &dev_attr_nodename);
  fail_unregister:
        device_unregister(&xendev->dev);
---- sle11-2009-05-14.orig/fs/aio.c     2009-03-24 10:11:37.000000000 +0100
-+++ sle11-2009-05-14/fs/aio.c  2009-03-24 10:13:25.000000000 +0100
+--- sle11-2009-10-16.orig/fs/aio.c     2009-03-24 10:11:37.000000000 +0100
++++ sle11-2009-10-16/fs/aio.c  2009-03-24 10:13:25.000000000 +0100
 @@ -1271,6 +1271,7 @@ static void io_destroy(struct kioctx *io
  #ifdef CONFIG_EPOLL
        /* forget the poll file, but it's up to the user to close it */
@@ -15706,8 +15733,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        file->private_data = ioctx;
        ioctx->file = file;
        init_waitqueue_head(&ioctx->poll_wait);
---- sle11-2009-05-14.orig/include/asm-x86/dma-mapping.h        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/dma-mapping.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/dma-mapping.h        2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/dma-mapping.h     2009-03-16 16:38:05.000000000 +0100
 @@ -223,8 +223,13 @@ static inline dma_addr_t dma_map_page(st
        struct dma_mapping_ops *ops = get_dma_ops(dev);
  
@@ -15722,8 +15749,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  }
  
  static inline void dma_unmap_page(struct device *dev, dma_addr_t addr,
---- sle11-2009-05-14.orig/include/asm-x86/genapic_64.h 2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/genapic_64.h      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/genapic_64.h 2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/genapic_64.h      2009-03-16 16:38:05.000000000 +0100
 @@ -46,6 +46,7 @@ extern struct genapic apic_x2apic_phys;
  extern int acpi_madt_oem_check(char *, char *);
  
@@ -15743,8 +15770,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  extern void setup_apic_routing(void);
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/desc.h  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/desc.h       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc.h  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc.h       2009-03-16 16:38:05.000000000 +0100
 @@ -64,8 +64,8 @@ static inline struct desc_struct *get_cp
  }
  
@@ -15887,8 +15914,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  
  #endif /* __ASSEMBLY__ */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping.h   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/dma-mapping.h        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/dma-mapping.h        2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,17 @@
 -#ifdef CONFIG_X86_32
 -# include "dma-mapping_32.h"
@@ -15912,7 +15939,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +extern int range_straddles_page_boundary(paddr_t p, size_t size);
 +
 +#endif /* _ASM_DMA_MAPPING_H_ */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_32.h        2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,141 +0,0 @@
 -#ifndef _ASM_I386_DMA_MAPPING_H
@@ -16056,7 +16083,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -                                dma_addr_t device_addr, size_t size);
 -
 -#endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-02-16 16:18:36.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/dma-mapping_64.h        2009-02-16 16:18:36.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,205 +0,0 @@
 -#ifndef _X8664_DMA_MAPPING_H
@@ -16264,8 +16291,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -#endif /* _X8664_DMA_MAPPING_H */
 -
 -#include "dma-mapping_32.h"
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap.h     2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,13 @@
 +#ifndef _ASM_FIXMAP_H
 +#define _ASM_FIXMAP_H
@@ -16280,8 +16307,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      __set_fixmap(idx, 0, __pgprot(0))
 +
 +#endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-03-16 16:38:05.000000000 +0100
 @@ -10,8 +10,8 @@
   * Support of BIGMEM added by Gerhard Wichert, Siemens AG, July 1999
   */
@@ -16337,8 +16364,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  }
  
  static inline unsigned long virt_to_fix(const unsigned long vaddr)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-03-16 16:38:05.000000000 +0100
 @@ -8,8 +8,8 @@
   * Copyright (C) 1998 Ingo Molnar
   */
@@ -16401,8 +16428,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  #define FIXADDR_TOP   (VSYSCALL_END-PAGE_SIZE)
  #define FIXADDR_SIZE  (__end_of_fixed_addresses << PAGE_SHIFT)
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/highmem.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2009-03-16 16:38:05.000000000 +0100
 @@ -8,7 +8,7 @@
   *                  Gerhard.Wichert@pdb.siemens.de
   *
@@ -16412,8 +16439,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
   * up to 16 Terabyte physical memory. With current x86 CPUs
   * we now support up to 64 Gigabytes physical RAM.
   *
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/io.h    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/io.h 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/io.h    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/io.h 2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,22 @@
 +#ifndef _ASM_X86_IO_H
 +#define _ASM_X86_IO_H
@@ -16437,8 +16464,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +extern void __iomem *ioremap_wc(unsigned long offset, unsigned long size);
 +
 +#endif /* _ASM_X86_IO_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/irqflags.h   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags.h   2009-03-16 16:38:05.000000000 +0100
 @@ -137,11 +137,11 @@ sysexit_ecrit:   /**** END OF SYSEXIT CRIT
  #endif /* __ASSEMBLY__ */
  
@@ -16455,8 +16482,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  static inline int raw_irqs_disabled_flags(unsigned long flags)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-03-16 16:38:05.000000000 +0100
 @@ -94,7 +94,7 @@ static inline void switch_mm(struct mm_s
                BUG_ON(per_cpu(cpu_tlbstate, cpu).active_mm != next);
  
@@ -16482,8 +16509,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +} while (0)
  
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-03-16 16:38:05.000000000 +0100
 @@ -21,7 +21,7 @@ void destroy_context(struct mm_struct *m
  static inline void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk)
  {
@@ -16527,8 +16554,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  static inline void activate_mm(struct mm_struct *prev, struct mm_struct *next)
  {
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/page.h  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/page.h       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page.h  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page.h       2009-03-16 16:38:05.000000000 +0100
 @@ -20,8 +20,16 @@
  #define _PAGE_BIT_IO          9
  #define _PAGE_IO              (_AC(1, L)<<_PAGE_BIT_IO)
@@ -16578,8 +16605,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  struct page;
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/page_64.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2009-03-16 16:38:05.000000000 +0100
 @@ -5,7 +5,7 @@
  
  #define THREAD_ORDER  1
@@ -16620,8 +16647,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #endif        /* !__ASSEMBLY__ */
  
  #ifdef CONFIG_FLATMEM
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pci.h   2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pci.h        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci.h   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci.h        2009-03-16 16:38:05.000000000 +0100
 @@ -8,14 +8,13 @@
  #include <asm/scatterlist.h>
  #include <asm/io.h>
@@ -16674,8 +16701,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  
  #ifdef CONFIG_PCI
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgalloc.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc.h    2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,149 @@
 -#ifdef CONFIG_X86_32
 -# include "pgalloc_32.h"
@@ -16830,7 +16857,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +#endif        /* PAGETABLE_LEVELS > 2 */
 +
 +#endif        /* _ASM_X86_PGALLOC_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_32.h    2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,111 +0,0 @@
 -#ifndef _I386_PGALLOC_H
@@ -16944,7 +16971,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -#endif        /* CONFIG_X86_PAE */
 -
 -#endif /* _I386_PGALLOC_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc_64.h    2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,179 +0,0 @@
 -#ifndef _X86_64_PGALLOC_H
@@ -17126,8 +17153,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -#define __pud_free_tlb(tlb,x)   tlb_remove_page((tlb),virt_to_page(x))
 -
 -#endif /* _X86_64_PGALLOC_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable.h    2009-03-16 16:38:05.000000000 +0100
 @@ -1,17 +1,15 @@
  #ifndef _ASM_X86_PGTABLE_H
  #define _ASM_X86_PGTABLE_H
@@ -17535,8 +17562,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #define arch_change_pte_range(mm, pmd, addr, end, newprot, dirty_accountable) \
        xen_change_pte_range(mm, pmd, addr, end, newprot, dirty_accountable)
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-03-16 16:38:05.000000000 +0100
 @@ -8,25 +8,28 @@
   * Copyright (C) 1999 Ingo Molnar <mingo@redhat.com>
   */
@@ -17629,8 +17656,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #define PTE_FILE_MAX_BITS       32
  
  /* Encode and de-code a swap entry */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-03-16 16:38:05.000000000 +0100
 @@ -38,16 +38,13 @@ void paging_init(void);
  #ifdef CONFIG_X86_PAE
  # include <asm/pgtable-3level-defs.h>
@@ -17841,8 +17868,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +      direct_remap_pfn_range(vma, from, pfn, size, prot, DOMID_IO)
  
  #endif /* _I386_PGTABLE_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-03-16 16:38:05.000000000 +0100
 @@ -31,7 +31,7 @@ extern void paging_init(void);
  
  #endif /* !__ASSEMBLY__ */
@@ -18114,8 +18141,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  #define __HAVE_ARCH_PTE_SAME
  #endif /* !__ASSEMBLY__ */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/processor.h     2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/processor.h  2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor.h     2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor.h  2009-03-16 16:38:05.000000000 +0100
 @@ -3,10 +3,6 @@
  
  #include <asm/processor-flags.h>
@@ -19148,8 +19175,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +extern int set_tsc_mode(unsigned int val);
  
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/segment.h       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/segment.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment.h       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment.h    2009-03-16 16:38:05.000000000 +0100
 @@ -191,13 +191,14 @@
  #define SEGMENT_TI_MASK               0x4
  
@@ -19166,8 +19193,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #endif
  #endif
  
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp.h   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/smp.h        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp.h        2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,227 @@
 -#ifdef CONFIG_X86_32
 -# include "smp_32.h"
@@ -19399,7 +19426,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +extern void unlock_ipi_call_lock(void);
 +#endif /* __ASSEMBLY__ */
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_32.h        2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,178 +0,0 @@
 -#ifndef __ASM_SMP_H
@@ -19580,7 +19607,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -
 -#endif /* !ASSEMBLY */
 -#endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp_64.h        2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,103 +0,0 @@
 -#ifndef __ASM_SMP_H
@@ -19686,8 +19713,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -
 -#endif
 -
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/spinlock.h      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/spinlock.h   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/spinlock.h      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/spinlock.h   2009-03-16 16:38:05.000000000 +0100
 @@ -88,7 +88,7 @@ extern void xen_spin_kick(raw_spinlock_t
            : "memory", "cc")
  
@@ -19758,8 +19785,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  {
        unsigned int token, count;
        bool free;
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/swiotlb.h       2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/swiotlb.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/swiotlb.h       2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/swiotlb.h    2009-03-16 16:38:05.000000000 +0100
 @@ -1,5 +1,8 @@
 -#ifdef CONFIG_X86_32
 -# include "swiotlb_32.h"
@@ -19774,7 +19801,7 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +                                 int dir);
 +
 +#endif /* _ASM_SWIOTLB_H */
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/swiotlb_32.h    2009-05-14 10:56:29.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/swiotlb_32.h    2009-10-28 14:55:03.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,43 +0,0 @@
 -#ifndef _ASM_SWIOTLB_H
@@ -19820,8 +19847,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 -#endif
 -
 -#endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/system.h        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/system.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system.h        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system.h     2009-03-16 16:38:05.000000000 +0100
 @@ -28,22 +28,44 @@ struct task_struct *__switch_to(struct t
   * Saving eflags is important. It switches not only IOPL between tasks,
   * it also protects other tasks from NT leaking through sysenter etc.
@@ -20020,8 +20047,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  #else
  #define smp_mb()      barrier()
  #define smp_rmb()     barrier()
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/tlbflush.h      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/tlbflush.h   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/tlbflush.h      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/tlbflush.h   2009-03-16 16:38:05.000000000 +0100
 @@ -86,8 +86,7 @@ static inline void flush_tlb_range(struc
  #define TLBSTATE_LAZY 2
  
@@ -20032,8 +20059,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
        struct mm_struct *active_mm;
        int state;
        char __cacheline_padding[L1_CACHE_BYTES-8];
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/vga.h   2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/vga.h        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/vga.h   2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/vga.h        2009-03-16 16:38:05.000000000 +0100
 @@ -12,9 +12,9 @@
   *    access the videoram directly without any black magic.
   */
@@ -20046,8 +20073,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
 +#define vga_writeb(x, y) (*(y) = (x))
  
  #endif
---- sle11-2009-05-14.orig/include/asm-x86/mach-xen/asm/xor_64.h        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/mach-xen/asm/xor_64.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/xor_64.h        2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/xor_64.h     2009-03-16 16:38:05.000000000 +0100
 @@ -1,20 +1,23 @@
  /*
 - * x86-64 changes / gcc fixes from Andi Kleen. 
@@ -20510,8 +20537,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  /* We force the use of the SSE xor block because it can write around L2.
     We may also be able to load into the L1 only depending on how the cpu
---- sle11-2009-05-14.orig/include/asm-x86/scatterlist.h        2009-05-14 10:56:29.000000000 +0200
-+++ sle11-2009-05-14/include/asm-x86/scatterlist.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/scatterlist.h        2009-10-28 14:55:03.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/scatterlist.h     2009-03-16 16:38:05.000000000 +0100
 @@ -24,7 +24,7 @@ struct scatterlist {
   * returns.
   */
@@ -20521,8 +20548,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  # define sg_dma_len(sg)               ((sg)->length)
  #else
  # define sg_dma_len(sg)               ((sg)->dma_length)
---- sle11-2009-05-14.orig/include/linux/page-flags.h   2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/include/linux/page-flags.h        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/linux/page-flags.h   2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/linux/page-flags.h        2009-03-16 16:38:05.000000000 +0100
 @@ -278,18 +278,25 @@ static inline void SetPageUptodate(struc
  
  CLEARPAGEFLAG(Uptodate, uptodate)
@@ -20561,8 +20588,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
  extern void cancel_dirty_page(struct page *page, unsigned int account_size);
  
---- sle11-2009-05-14.orig/include/xen/balloon.h        2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/balloon.h     2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/balloon.h        2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/balloon.h     2009-03-16 16:38:05.000000000 +0100
 @@ -31,9 +31,12 @@
   * IN THE SOFTWARE.
   */
@@ -20586,8 +20613,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  
 -#endif /* __ASM_BALLOON_H__ */
 +#endif /* __XEN_BALLOON_H__ */
---- sle11-2009-05-14.orig/include/xen/interface/grant_table.h  2008-11-25 12:22:34.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/grant_table.h       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/grant_table.h  2008-11-25 12:22:34.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/grant_table.h       2009-03-16 16:38:05.000000000 +0100
 @@ -193,6 +193,7 @@ struct gnttab_map_grant_ref {
      grant_handle_t handle;
      uint64_t dev_bus_addr;
@@ -20644,8 +20671,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  typedef struct gnttab_query_size gnttab_query_size_t;
  DEFINE_XEN_GUEST_HANDLE(gnttab_query_size_t);
  
---- sle11-2009-05-14.orig/include/xen/interface/io/fbif.h      2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/io/fbif.h   2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/io/fbif.h      2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/io/fbif.h   2009-03-16 16:38:05.000000000 +0100
 @@ -150,7 +150,12 @@ struct xenfb_page
       * framebuffer with a max resolution of 12,800x10,240.  Should
       * be enough for a while with room leftover for expansion.
@@ -20659,8 +20686,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  };
  
  /*
---- sle11-2009-05-14.orig/include/xen/interface/memory.h       2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/memory.h    2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/memory.h       2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/memory.h    2009-03-16 16:38:05.000000000 +0100
 @@ -62,7 +62,7 @@ struct xen_memory_reservation {
       *   OUT: GMFN bases of extents that were allocated
       *   (NB. This command also updates the mach_to_phys translation table)
@@ -20728,8 +20755,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  };
  DEFINE_XEN_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list);
  typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t;
---- sle11-2009-05-14.orig/include/xen/interface/vcpu.h 2008-11-25 12:35:56.000000000 +0100
-+++ sle11-2009-05-14/include/xen/interface/vcpu.h      2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/include/xen/interface/vcpu.h 2008-11-25 12:35:56.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/vcpu.h      2009-03-16 16:38:05.000000000 +0100
 @@ -85,6 +85,7 @@ struct vcpu_runstate_info {
       */
      uint64_t time[4];
@@ -20762,8 +20789,8 @@ Automatically created from "patches.kernel.org/patch-2.6.26" by xen-port-patches
  typedef struct vcpu_register_vcpu_info vcpu_register_vcpu_info_t;
  DEFINE_XEN_GUEST_HANDLE(vcpu_register_vcpu_info_t);
  
---- sle11-2009-05-14.orig/lib/swiotlb-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-05-14/lib/swiotlb-xen.c 2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-03-16 16:38:05.000000000 +0100
 @@ -20,6 +20,7 @@
  #include <linux/ctype.h>
  #include <linux/init.h>
similarity index 97%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27
index 3cc47e9a7923f94c6906edf7095830b0c1c22364..2a2457eca84945ce9dcab0aae57d60800ade6b34 100644 (file)
@@ -7,8 +7,8 @@ Patch-mainline: 2.6.27
 Acked-by: Jeff Mahoney <jeffm@suse.com>
 Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches.py
 
---- sle11-2009-06-29.orig/arch/x86/Kconfig     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/Kconfig     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig  2009-06-04 10:21:39.000000000 +0200
 @@ -594,7 +594,7 @@ config CALGARY_IOMMU_ENABLED_BY_DEFAULT
  config AMD_IOMMU
        bool "AMD IOMMU support"
@@ -38,8 +38,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        help
          Convert MTRR layout from continuous to discrete, so X drivers can
          add writeback entries.
---- sle11-2009-06-29.orig/arch/x86/Kconfig.debug       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Kconfig.debug    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/Kconfig.debug       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Kconfig.debug    2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@ config STRICT_DEVMEM
  config X86_VERBOSE_BOOTUP
        bool "Enable verbose x86 bootup info messages"
@@ -57,8 +57,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        select TRACING
        select MMIOTRACE_HOOKS
        help
---- sle11-2009-06-29.orig/arch/x86/Makefile    2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/Makefile 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/Makefile    2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/arch/x86/Makefile 2009-06-04 10:21:39.000000000 +0200
 @@ -116,8 +116,8 @@ mflags-$(CONFIG_X86_VOYAGER)       := -Iinclud
  mcore-$(CONFIG_X86_VOYAGER)   := arch/x86/mach-voyager/
  
@@ -81,8 +81,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  KBUILD_CFLAGS += $(mflags-y)
  KBUILD_AFLAGS += $(mflags-y)
---- sle11-2009-06-29.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/ia32/ia32entry-xen.S     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-10-16 14:51:56.000000000 +0200
 @@ -15,6 +15,16 @@
  #include <asm/irqflags.h>
  #include <linux/linkage.h>
@@ -149,7 +149,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        movl    $__USER32_DS,40(%rsp)
        movq    %rbp,32(%rsp)
        movl    $__USER32_CS,16(%rsp)
-@@ -113,19 +140,79 @@ ENTRY(ia32_sysenter_target)
+@@ -113,19 +140,75 @@ ENTRY(ia32_sysenter_target)
        .quad 1b,ia32_badarg
        .previous       
        GET_THREAD_INFO(%r10)
@@ -171,8 +171,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      TRACE_IRQS_OFF
 +      testl   $_TIF_ALLWORK_MASK,TI_flags(%r10)
 +      jnz     sysexit_audit
-+      jmp int_ret_from_sys_call
-+
+       jmp int_ret_from_sys_call
 +#ifdef CONFIG_AUDITSYSCALL
 +      .macro auditsys_entry_common
 +      movl %esi,%r9d                  /* 6th arg: 4th syscall arg */
@@ -203,15 +203,11 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      movzbl %al,%edi         /* zero-extend that into %edi */
 +      inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */
 +      call audit_syscall_exit
-+      GET_THREAD_INFO(%r10)
-+      movl RAX-ARGOFFSET(%rsp),%eax   /* reload syscall return value */
 +      movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */
 +      movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
 +      DISABLE_INTERRUPTS(CLBR_NONE)
 +      TRACE_IRQS_OFF
-+      testl %edi,TI_flags(%r10)
-+      jnz int_with_check
-       jmp int_ret_from_sys_call
++      jmp int_with_check
 +      .endm
 +
 +sysenter_auditsys:
@@ -222,7 +218,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +sysexit_audit:
 +      auditsys_exit sysexit_from_sys_call
 +#endif
++
  sysenter_tracesys:
        xchgl   %r9d,%ebp
 +#ifdef CONFIG_AUDITSYSCALL
@@ -232,7 +228,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        SAVE_REST
        CLEAR_RREGS
        movq    %r9,R9(%rsp)
-@@ -186,18 +273,38 @@ ENTRY(ia32_cstar_target)
+@@ -186,18 +269,38 @@ ENTRY(ia32_cstar_target)
        .quad 1b,ia32_badarg
        .previous       
        GET_THREAD_INFO(%r10)
@@ -274,7 +270,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        xchgl %r9d,%ebp
        SAVE_REST
        CLEAR_RREGS
-@@ -263,8 +370,8 @@ ENTRY(ia32_syscall)
+@@ -263,8 +366,8 @@ ENTRY(ia32_syscall)
           this could be a problem. */
        SAVE_ARGS 0,0,1
        GET_THREAD_INFO(%r10)
@@ -285,7 +281,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        jnz ia32_tracesys
  ia32_do_syscall:      
        cmpl $(IA32_NR_syscalls-1),%eax
-@@ -309,13 +416,11 @@ quiet_ni_syscall:
+@@ -309,13 +412,11 @@ quiet_ni_syscall:
        PTREGSCALL stub32_rt_sigreturn, sys32_rt_sigreturn, %rdi
        PTREGSCALL stub32_sigreturn, sys32_sigreturn, %rdi
        PTREGSCALL stub32_sigaltstack, sys32_sigaltstack, %rdx
@@ -299,7 +295,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  ENTRY(ia32_ptregs_common)
        popq %r11
-@@ -415,7 +520,7 @@ ia32_sys_call_table:
+@@ -415,7 +516,7 @@ ia32_sys_call_table:
        .quad sys_ssetmask
        .quad sys_setreuid16    /* 70 */
        .quad sys_setregid16
@@ -308,7 +304,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        .quad compat_sys_sigpending
        .quad sys_sethostname
        .quad compat_sys_setrlimit      /* 75 */
-@@ -522,7 +627,7 @@ ia32_sys_call_table:
+@@ -522,7 +623,7 @@ ia32_sys_call_table:
        .quad sys32_rt_sigpending
        .quad compat_sys_rt_sigtimedwait
        .quad sys32_rt_sigqueueinfo
@@ -317,7 +313,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        .quad sys32_pread               /* 180 */
        .quad sys32_pwrite
        .quad sys_chown16
-@@ -670,4 +775,10 @@ ia32_sys_call_table:
+@@ -670,4 +771,10 @@ ia32_sys_call_table:
        .quad sys32_fallocate
        .quad compat_sys_timerfd_settime        /* 325 */
        .quad compat_sys_timerfd_gettime
@@ -328,8 +324,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      .quad sys_pipe2
 +      .quad sys_inotify_init1
  ia32_syscall_end:
---- sle11-2009-06-29.orig/arch/x86/kernel/Makefile     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/Makefile  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/Makefile     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/Makefile  2009-06-04 10:21:39.000000000 +0200
 @@ -120,9 +120,10 @@ ifeq ($(CONFIG_X86_64),y)
  
          obj-$(CONFIG_PCI_MMCONFIG)    += mmconf-fam10h_64.o
@@ -344,9 +340,9 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +disabled-obj-$(CONFIG_XEN) := %_uv.o crash.o early-quirks.o hpet.o i8253.o \
 +      i8259.o irqinit_$(BITS).o pci-swiotlb_64.o reboot.o smpboot.o \
 +      tlb_$(BITS).o tsc.o tsc_sync.o vsmp_64.o
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/boot.c  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/boot.c       2009-06-04 10:21:39.000000000 +0200
-@@ -951,7 +951,9 @@ void __init mp_register_ioapic(int id, u
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/boot.c  2009-08-26 11:55:26.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/acpi/boot.c       2009-08-26 12:03:49.000000000 +0200
+@@ -949,7 +949,9 @@ void __init mp_register_ioapic(int id, u
        mp_ioapics[idx].mp_flags = MPC_APIC_USABLE;
        mp_ioapics[idx].mp_apicaddr = address;
  
@@ -356,7 +352,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        mp_ioapics[idx].mp_apicid = uniq_ioapic_id(id);
  #ifdef CONFIG_X86_32
        mp_ioapics[idx].mp_apicver = io_apic_get_version(idx);
-@@ -1108,7 +1110,7 @@ int mp_register_gsi(u32 gsi, int trigger
+@@ -1106,7 +1108,7 @@ int mp_register_gsi(u32 gsi, int trigger
  {
        int ioapic;
        int ioapic_pin;
@@ -365,7 +361,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #define MAX_GSI_NUM   4096
  #define IRQ_COMPRESSION_START 64
  
-@@ -1156,7 +1158,7 @@ int mp_register_gsi(u32 gsi, int trigger
+@@ -1154,7 +1156,7 @@ int mp_register_gsi(u32 gsi, int trigger
        if (test_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed)) {
                pr_debug(KERN_DEBUG "Pin %d-%d already programmed\n",
                         mp_ioapic_routing[ioapic].apic_id, ioapic_pin);
@@ -374,7 +370,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                return (gsi < IRQ_COMPRESSION_START ? gsi : gsi_to_irq[gsi]);
  #else
                return gsi;
-@@ -1164,7 +1166,7 @@ int mp_register_gsi(u32 gsi, int trigger
+@@ -1162,7 +1164,7 @@ int mp_register_gsi(u32 gsi, int trigger
        }
  
        set_bit(ioapic_pin, mp_ioapic_routing[ioapic].pin_programmed);
@@ -383,8 +379,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        /*
         * For GSI >= 64, use IRQ compression
         */
---- sle11-2009-06-29.orig/arch/x86/kernel/acpi/sleep-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/acpi/sleep-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/acpi/sleep-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/acpi/sleep-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -9,6 +9,7 @@
  #include <linux/bootmem.h>
  #include <linux/dmi.h>
@@ -469,8 +465,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                str = strchr(str, ',');
                if (str != NULL)
                        str += strspn(str, ", \t");
---- sle11-2009-06-29.orig/arch/x86/kernel/apic_32-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/apic_32-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_32-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_32-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -59,7 +59,10 @@ static cpumask_t timer_bcast_ipi;
  /*
   * Debug level, exported for io_apic.c
@@ -483,8 +479,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #ifndef CONFIG_XEN
  static int modern_apic(void)
---- sle11-2009-06-29.orig/arch/x86/kernel/apic_64-xen.c        2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/apic_64-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/apic_64-xen.c        2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/apic_64-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -39,7 +39,10 @@ int disable_apic;
  /*
   * Debug level, exported for io_apic.c
@@ -497,8 +493,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  /*
   * The guts of the apic timer interrupt
---- sle11-2009-06-29.orig/arch/x86/kernel/asm-offsets_64.c     2008-11-25 12:35:54.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/asm-offsets_64.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/asm-offsets_64.c     2008-11-25 12:35:54.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/asm-offsets_64.c  2009-06-04 10:21:39.000000000 +0200
 @@ -138,7 +138,7 @@ int main(void)
  
        BLANK();
@@ -508,8 +504,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        BLANK();
        OFFSET(XEN_vcpu_info_mask, vcpu_info, evtchn_upcall_mask);
        OFFSET(XEN_vcpu_info_pending, vcpu_info, evtchn_upcall_pending);
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/amd_64.c 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/amd_64.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/amd_64.c 2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/amd_64.c      2009-06-04 10:21:39.000000000 +0200
 @@ -193,6 +193,7 @@ static void __cpuinit init_amd(struct cp
                fam10h_check_enable_mmcfg();
        }
@@ -526,8 +522,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  }
  
  static struct cpu_dev amd_cpu_dev __cpuinitdata = {
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/bugs_64.c        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/bugs_64.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/bugs_64.c        2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/bugs_64.c     2009-06-04 10:21:39.000000000 +0200
 @@ -20,6 +20,7 @@ void __init check_bugs(void)
  #endif
        alternative_instructions();
@@ -542,8 +538,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                set_memory_4k((unsigned long)__va(0), 1);
 +#endif
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/common-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -13,6 +13,7 @@
  #include <asm/mtrr.h>
  #include <asm/mce.h>
@@ -607,7 +603,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        if (!have_cpuid_p()) {
                /*
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/cpu/common_64-xen.c       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common_64-xen.c       2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,771 @@
 +#include <linux/init.h>
 +#include <linux/kernel.h>
@@ -1381,7 +1377,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +              uv_cpu_init();
 +}
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/e820-xen.c        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/e820-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,1545 @@
 +/*
 + * Handle the memory map.
@@ -2752,6 +2748,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      return *p == '\0' ? 0 : -EINVAL;
 +}
 +early_param("memmap", parse_memmap_opt);
++#endif
 +
 +void __init finish_e820_parsing(void)
 +{
@@ -2766,7 +2763,6 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +              e820_print_map("user");
 +      }
 +}
-+#endif
 +
 +static inline const char *e820_type_to_string(int e820_type)
 +{
@@ -2928,7 +2924,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      printk(KERN_INFO "Xen-provided physical RAM map:\n");
 +      e820_print_map(who);
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_32-xen.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_32-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,873 +0,0 @@
 -#include <linux/kernel.h>
@@ -3804,7 +3800,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -      print_memory_map("modified");
 -}
 -#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/e820_64-xen.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/e820_64-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1045 +0,0 @@
 -/*
@@ -4852,8 +4848,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -              max_pfn << PAGE_SHIFT) - *addr;
 -      return i + 1;
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/early_printk-xen.c   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/early_printk-xen.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/early_printk-xen.c   2009-09-24 10:29:16.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/early_printk-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -225,7 +225,7 @@ static struct console simnow_console = {
  static struct console *early_console = &early_vga_console;
  static int early_console_initialized;
@@ -4863,8 +4859,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  {
        char buf[512];
        int n;
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_32-xen.S       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_32-xen.S    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_32-xen.S       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_32-xen.S    2009-06-04 10:21:39.000000000 +0200
 @@ -51,15 +51,26 @@
  #include <asm/percpu.h>
  #include <asm/dwarf2.h>
@@ -5162,8 +5158,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        cmpl $nr_syscalls,%eax
        jb syscall_call
        jmp syscall_exit
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_64.S   2009-06-29 15:15:41.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/entry_64.S        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64.S   2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64.S        2009-06-04 10:21:39.000000000 +0200
 @@ -1409,7 +1409,7 @@ ENTRY(arch_unwind_init_running)
  ENDPROC(arch_unwind_init_running)
  #endif
@@ -5182,8 +5178,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #ifdef        CONFIG_KDB
  
---- sle11-2009-06-29.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/entry_64-xen.S    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/entry_64-xen.S    2009-06-04 10:21:39.000000000 +0200
 @@ -53,19 +53,130 @@
  #include <asm/hw_irq.h>
  #include <asm/page.h>
@@ -5637,8 +5633,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        pushq $0
        CFI_ADJUST_CFA_OFFSET 8 
        paranoidentry do_machine_check
---- sle11-2009-06-29.orig/arch/x86/kernel/fixup.c      2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/fixup.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/fixup.c      2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/fixup.c   2009-06-04 10:21:39.000000000 +0200
 @@ -33,6 +33,7 @@
  #include <linux/kernel.h>
  #include <linux/delay.h>
@@ -5647,8 +5643,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #define DP(_f, _args...) printk(KERN_ALERT "  " _f "\n" , ## _args )
  
---- sle11-2009-06-29.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/genapic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -58,7 +58,7 @@ void __init setup_apic_routing(void)
        else
  #endif
@@ -5664,8 +5660,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  }
 +EXPORT_SYMBOL_GPL(is_uv_system);
  #endif
---- sle11-2009-06-29.orig/arch/x86/kernel/genapic_xen_64.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/genapic_xen_64.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/genapic_xen_64.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/genapic_xen_64.c  2009-06-04 10:21:39.000000000 +0200
 @@ -43,7 +43,7 @@ void xen_send_IPI_shortcut(unsigned int 
                __send_IPI_one(smp_processor_id(), vector);
                break;
@@ -5745,7 +5741,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        return ((ebx >> 24) & 0xFF) >> index_msb;
  }
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/head-xen.c        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/head-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,57 @@
 +#include <linux/kernel.h>
 +#include <linux/init.h>
@@ -5805,7 +5801,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +#endif
 +}
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/head32-xen.c      2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/head32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,57 @@
 +/*
 + *  linux/arch/i386/kernel/head32.c -- prepare to run common code
@@ -5864,8 +5860,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +
 +      start_kernel();
 +}
---- sle11-2009-06-29.orig/arch/x86/kernel/head64-xen.c 2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head64-xen.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/head64-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head64-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -32,7 +32,26 @@
  #include <asm/e820.h>
  #include <asm/bios_ebda.h>
@@ -6026,8 +6022,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        /*
         * At this point everything still needed from the boot loader
---- sle11-2009-06-29.orig/arch/x86/kernel/head_64-xen.S        2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/head_64-xen.S     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/head_64-xen.S        2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/head_64-xen.S     2009-06-04 10:21:39.000000000 +0200
 @@ -95,53 +95,6 @@ NEXT_PAGE(hypercall_page)
  
  #undef NEXT_PAGE
@@ -6082,8 +6078,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        .section .bss.page_aligned, "aw", @nobits
        .align PAGE_SIZE
  ENTRY(empty_zero_page)
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_32-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_32-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_32-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@
  #include <linux/init.h>
  #include <linux/delay.h>
@@ -7707,8 +7703,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      }
 +}
 +#endif
---- sle11-2009-06-29.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/io_apic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -45,6 +45,7 @@
  #include <asm/proto.h>
  #include <asm/acpi.h>
@@ -8472,8 +8468,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                } else {
                        ioapic_phys = (unsigned long)
                                alloc_bootmem_pages(PAGE_SIZE);
---- sle11-2009-06-29.orig/arch/x86/kernel/ipi-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ipi-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/ipi-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ipi-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -8,7 +8,6 @@
  #include <linux/kernel_stat.h>
  #include <linux/mc146818rtc.h>
@@ -8509,8 +8505,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  }
  #endif
  
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_32-xen.c 2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_32-xen.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_32-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -48,6 +48,29 @@ void ack_bad_irq(unsigned int irq)
  #endif
  }
@@ -8832,8 +8828,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #ifdef CONFIG_HOTPLUG_CPU
  
  void fixup_irqs(cpumask_t map)
---- sle11-2009-06-29.orig/arch/x86/kernel/irq_64-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/irq_64-xen.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/irq_64-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/irq_64-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -163,6 +163,34 @@ skip:
  }
  
@@ -8869,8 +8865,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
   * do_IRQ handles all normal device IRQ's (the special
   * SMP cross-CPU interrupts have their own specific
   * handlers).
---- sle11-2009-06-29.orig/arch/x86/kernel/ldt-xen.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/ldt-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/ldt-xen.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/ldt-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -20,9 +20,9 @@
  #include <asm/mmu_context.h>
  
@@ -8905,8 +8901,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                preempt_enable();
  #endif
        }
---- sle11-2009-06-29.orig/arch/x86/kernel/machine_kexec_32.c   2008-11-25 12:35:53.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/machine_kexec_32.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/machine_kexec_32.c   2008-11-25 12:35:53.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/machine_kexec_32.c        2009-06-04 10:21:39.000000000 +0200
 @@ -68,6 +68,8 @@ void machine_kexec_setup_load_arg(xen_ke
        xki->page_list[PA_PTE_0] = __ma(kexec_pte0);
        xki->page_list[PA_PTE_1] = __ma(kexec_pte1);
@@ -8916,8 +8912,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  }
  
  int __init machine_kexec_setup_resources(struct resource *hypervisor,
---- sle11-2009-06-29.orig/arch/x86/kernel/microcode-xen.c      2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/microcode-xen.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/microcode-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/microcode-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -5,13 +5,14 @@
   *                  2006      Shaohua Li <shaohua.li@intel.com>
   *
@@ -8982,8 +8978,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        return 0;
  }
  
---- sle11-2009-06-29.orig/arch/x86/kernel/mpparse-xen.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/mpparse-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/mpparse-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/mpparse-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,9 @@
  #include <asm/proto.h>
  #include <asm/acpi.h>
@@ -10180,8 +10176,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -#endif /* CONFIG_X86_IO_APIC */
 -#endif /* CONFIG_ACPI */
 +late_initcall(update_mp_table);
---- sle11-2009-06-29.orig/arch/x86/kernel/nmi.c        2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/nmi.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/nmi.c        2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/nmi.c     2009-06-04 10:21:39.000000000 +0200
 @@ -27,7 +27,9 @@
  #include <linux/kdebug.h>
  #include <linux/smp.h>
@@ -10203,8 +10199,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #ifdef CONFIG_X86_32
        timer_ack = 0;
  #endif
---- sle11-2009-06-29.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/pci-dma-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-10-22 11:31:59.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -5,13 +5,13 @@
  
  #include <asm/proto.h>
@@ -10560,8 +10556,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        no_iommu_init();
        return 0;
---- sle11-2009-06-29.orig/arch/x86/kernel/pci-nommu-xen.c      2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/pci-nommu-xen.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-nommu-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-nommu-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -79,18 +79,12 @@ gnttab_unmap_single(struct device *dev, 
        gnttab_dma_unmap_page(dma_addr);
  }
@@ -10582,8 +10578,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  };
  
  void __init no_iommu_init(void)
---- sle11-2009-06-29.orig/arch/x86/kernel/probe_roms_32.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/kernel/probe_roms_32.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/probe_roms_32.c      2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/probe_roms_32.c   2009-06-04 10:21:39.000000000 +0200
 @@ -99,6 +99,11 @@ void __init probe_roms(void)
        unsigned char c;
        int i;
@@ -10605,8 +10601,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        if (romsignature(rom)) {
                length = extension_rom_resource.end - extension_rom_resource.start + 1;
                if (romchecksum(rom, length)) {
---- sle11-2009-06-29.orig/arch/x86/kernel/process-xen.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/process-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -6,6 +6,13 @@
  #include <linux/sched.h>
  #include <linux/module.h>
@@ -10897,8 +10893,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                return -1;
  
        boot_option_idle_override = 1;
---- sle11-2009-06-29.orig/arch/x86/kernel/process_32-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_32-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_32-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_32-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -59,15 +59,11 @@
  #include <asm/tlbflush.h>
  #include <asm/cpu.h>
@@ -11002,8 +10998,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                }
                tick_nohz_restart_sched_tick();
                preempt_enable_no_resched();
---- sle11-2009-06-29.orig/arch/x86/kernel/process_64-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/process_64-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/process_64-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/process_64-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -65,15 +65,6 @@ asmlinkage extern void ret_from_fork(voi
  
  unsigned long kernel_thread_flags = CLONE_VM | CLONE_UNTRACED;
@@ -11186,8 +11182,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                        if (gsindex)
                                rdmsrl(MSR_KERNEL_GS_BASE, base);
                        else
---- sle11-2009-06-29.orig/arch/x86/kernel/quirks-xen.c 2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/quirks-xen.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/quirks-xen.c 2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/quirks-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -63,6 +63,7 @@ static enum {
        ICH_FORCE_HPET_RESUME,
        VT8237_FORCE_HPET_RESUME,
@@ -11309,9 +11305,9 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        default:
                break;
        }
---- sle11-2009-06-29.orig/arch/x86/kernel/setup-xen.c  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/setup-xen.c       2009-06-04 10:21:39.000000000 +0200
-@@ -1,141 +1,1131 @@
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup-xen.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/setup-xen.c       2009-06-04 10:21:39.000000000 +0200
+@@ -1,141 +1,1132 @@
 -#include <linux/kernel.h>
 +/*
 + *  Copyright (C) 1995  Linus Torvalds
@@ -12490,7 +12486,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +#endif
 +
 +#ifdef CONFIG_X86_32
-+      request_resource(&iomem_resource, &video_ram_resource);
++      if (is_initial_xendomain())
++              request_resource(&iomem_resource, &video_ram_resource);
 +#endif
 +      reserve_standard_io_resources();
 +
@@ -12533,7 +12530,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      return NOTIFY_DONE;
 +}
 +#endif /* !CONFIG_XEN */
---- sle11-2009-06-29.orig/arch/x86/kernel/setup64-xen.c        2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup64-xen.c        2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,370 +0,0 @@
 -/* 
@@ -12906,7 +12903,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -      if (is_uv_system())
 -              uv_cpu_init();
 -}
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_32-xen.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_32-xen.c       2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1151 +0,0 @@
 -/*
@@ -14060,7 +14057,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -}
 -
 -subsys_initcall(request_standard_resources);
---- sle11-2009-06-29.orig/arch/x86/kernel/setup_64-xen.c       2009-03-16 16:38:05.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup_64-xen.c       2009-03-16 16:38:05.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,1433 +0,0 @@
 -/*
@@ -15497,7 +15494,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -}
 -__setup("clearcpuid=", setup_disablecpuid);
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/arch/x86/kernel/setup_percpu-xen.c        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/setup_percpu-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,385 @@
 +#include <linux/kernel.h>
 +#include <linux/module.h>
@@ -15884,8 +15881,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +
 +#endif /* X86_64_NUMA */
 +
---- sle11-2009-06-29.orig/arch/x86/kernel/smp-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/smp-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/smp-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/smp-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -121,132 +121,14 @@ void xen_smp_send_reschedule(int cpu)
        send_IPI_mask(cpumask_of_cpu(cpu), RESCHEDULE_VECTOR);
  }
@@ -16087,8 +16084,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        return IRQ_HANDLED;
  }
---- sle11-2009-06-29.orig/arch/x86/kernel/time_32-xen.c        2009-03-24 10:13:09.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/time_32-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/time_32-xen.c        2009-10-28 14:58:12.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/time_32-xen.c     2009-10-28 14:58:19.000000000 +0100
 @@ -468,7 +468,7 @@ irqreturn_t timer_interrupt(int irq, voi
  
        /* Keep nmi watchdog up to date */
@@ -16098,7 +16095,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #else
        add_pda(irq0_irqs, 1);
  #endif
-@@ -746,9 +746,7 @@ void __init time_init(void)
+@@ -747,9 +747,7 @@ void __init time_init(void)
  
        update_wallclock();
  
@@ -16108,7 +16105,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        /* Cannot request_irq() until kmem is initialised. */
        late_time_init = setup_cpu0_timer_irq;
-@@ -805,7 +803,8 @@ static void stop_hz_timer(void)
+@@ -806,7 +804,8 @@ static void stop_hz_timer(void)
  
        /* Leave ourselves in tick mode if rcu or softirq or timer pending. */
        if (rcu_needs_cpu(cpu) || local_softirq_pending() ||
@@ -16118,8 +16115,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                cpu_clear(cpu, nohz_cpu_mask);
                j = jiffies + 1;
        }
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_32-xen.c       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_32-xen.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_32-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_32-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -1,5 +1,6 @@
  /*
   *  Copyright (C) 1991, 1992  Linus Torvalds
@@ -16696,8 +16693,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        unsigned long base = (kesp - uesp) & -THREAD_SIZE;
        unsigned long new_kesp = kesp - base;
        unsigned long lim_pages = (new_kesp | (THREAD_SIZE - 1)) >> PAGE_SHIFT;
---- sle11-2009-06-29.orig/arch/x86/kernel/traps_64-xen.c       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/traps_64-xen.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/traps_64-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/traps_64-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -10,73 +10,56 @@
   * 'Traps.c' handles hardware traps and faults after we have saved some
   * state in 'entry.S'.
@@ -17658,8 +17655,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  static int __init code_bytes_setup(char *s)
  {
        code_bytes = simple_strtoul(s, NULL, 0);
---- sle11-2009-06-29.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/kernel/vsyscall_64-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/vsyscall_64-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/vsyscall_64-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -42,7 +42,8 @@
  #include <asm/topology.h>
  #include <asm/vgtod.h>
@@ -17700,8 +17697,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        hotcpu_notifier(cpu_vsyscall_notifier, 0);
        return 0;
  }
---- sle11-2009-06-29.orig/arch/x86/mach-xen/setup.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mach-xen/setup.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mach-xen/setup.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mach-xen/setup.c 2009-06-04 10:21:39.000000000 +0200
 @@ -17,6 +17,8 @@
  #include <xen/interface/callback.h>
  #include <xen/interface/memory.h>
@@ -17877,8 +17874,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        }
 +#endif
  }
---- sle11-2009-06-29.orig/arch/x86/mm/fault-xen.c      2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/fault-xen.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/fault-xen.c      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/fault-xen.c   2009-06-04 10:21:39.000000000 +0200
 @@ -10,6 +10,7 @@
  #include <linux/string.h>
  #include <linux/types.h>
@@ -18064,8 +18061,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        }
  #endif
  }
---- sle11-2009-06-29.orig/arch/x86/mm/hypervisor.c     2009-05-14 11:18:39.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/mm/hypervisor.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/hypervisor.c     2009-05-14 11:18:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/mm/hypervisor.c  2009-06-04 10:21:39.000000000 +0200
 @@ -709,6 +709,72 @@ void xen_destroy_contiguous_region(unsig
  }
  EXPORT_SYMBOL_GPL(xen_destroy_contiguous_region);
@@ -18186,8 +18183,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      maddr_t mach_gp = virt_to_machine(gdt + entry);
 +      return HYPERVISOR_update_descriptor(mach_gp, *(const u64*)desc);
  }
---- sle11-2009-06-29.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_32-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_32-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -54,6 +54,7 @@
  
  unsigned int __VMALLOC_RESERVE = 128 << 20;
@@ -19014,8 +19011,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +{
 +      return reserve_bootmem(phys, len, flags);
 +}
---- sle11-2009-06-29.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/init_64-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/init_64-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/init_64-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -21,6 +21,7 @@
  #include <linux/swap.h>
  #include <linux/smp.h>
@@ -20352,8 +20349,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        }
        return 0;
  }
---- sle11-2009-06-29.orig/arch/x86/mm/ioremap-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/ioremap-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/ioremap-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/ioremap-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -13,6 +13,7 @@
  #include <linux/pfn.h>
  #include <linux/slab.h>
@@ -20526,8 +20523,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        return 1;
  }
---- sle11-2009-06-29.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pageattr-xen.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/pageattr-xen.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pageattr-xen.c        2009-06-04 10:21:39.000000000 +0200
 @@ -34,6 +34,47 @@ struct cpa_data {
        unsigned        force_split : 1;
  };
@@ -20742,8 +20739,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        return _set_memory_wb(addr, numpages);
  }
---- sle11-2009-06-29.orig/arch/x86/mm/pat-xen.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pat-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/pat-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pat-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -12,6 +12,8 @@
  #include <linux/gfp.h>
  #include <linux/fs.h>
@@ -21453,8 +21450,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +late_initcall(pat_memtype_list_init);
 +
 +#endif /* CONFIG_DEBUG_FS */
---- sle11-2009-06-29.orig/arch/x86/mm/pgtable-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pgtable-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -4,6 +4,7 @@
  #include <asm/pgalloc.h>
  #include <asm/pgtable.h>
@@ -21816,8 +21813,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      set_pte_vaddr(address, pte);
 +      fixmaps_set++;
 +}
---- sle11-2009-06-29.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/mm/pgtable_32-xen.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/mm/pgtable_32-xen.c 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/mm/pgtable_32-xen.c      2009-06-04 10:21:39.000000000 +0200
 @@ -25,51 +25,49 @@
  #include <xen/features.h>
  #include <asm/hypervisor.h>
@@ -21998,8 +21995,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  void make_lowmem_page_readonly(void *va, unsigned int feature)
  {
        pte_t *pte;
---- sle11-2009-06-29.orig/arch/x86/pci/amd_bus.c       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/arch/x86/pci/amd_bus.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/pci/amd_bus.c       2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/amd_bus.c    2009-06-04 10:21:39.000000000 +0200
 @@ -607,6 +607,14 @@ static int __init pci_io_ecs_init(void)
        for_each_online_cpu(cpu)
                amd_cpu_notify(&amd_cpu_notifier, (unsigned long)CPU_ONLINE,
@@ -22026,8 +22023,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
                return 0;
  
---- sle11-2009-06-29.orig/arch/x86/pci/irq-xen.c       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/pci/irq-xen.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/pci/irq-xen.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/pci/irq-xen.c    2009-06-04 10:21:39.000000000 +0200
 @@ -11,8 +11,8 @@
  #include <linux/slab.h>
  #include <linux/interrupt.h>
@@ -22902,8 +22899,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        }
        return 0;
  }
---- sle11-2009-06-29.orig/arch/x86/vdso/Makefile       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/vdso/Makefile    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/vdso/Makefile       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/Makefile    2009-06-04 10:21:39.000000000 +0200
 @@ -65,9 +65,7 @@ obj-$(VDSO32-y)                      += vdso32-syms.lds
  vdso32.so-$(VDSO32-y)         += int80
  vdso32.so-$(CONFIG_COMPAT)    += syscall
@@ -22915,8 +22912,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  vdso32-images                 = $(vdso32.so-y:%=vdso32-%.so)
  
---- sle11-2009-06-29.orig/arch/x86/vdso/vdso32.S       2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32.S    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32.S       2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32.S    2009-06-04 10:21:39.000000000 +0200
 @@ -9,7 +9,7 @@ vdso32_int80_end:
  
        .globl vdso32_syscall_start, vdso32_syscall_end
@@ -22943,8 +22940,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -#endif
 -
  __FINIT
---- sle11-2009-06-29.orig/arch/x86/vdso/vdso32-setup-xen.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/vdso/vdso32-setup-xen.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/vdso/vdso32-setup-xen.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/arch/x86/vdso/vdso32-setup-xen.c  2009-06-04 10:21:39.000000000 +0200
 @@ -195,50 +195,28 @@ static __init void relocate_vdso(Elf32_E
        }
  }
@@ -23078,8 +23075,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        }
  
        memcpy(syscall_page, vsyscall, vsyscall_len);
---- sle11-2009-06-29.orig/arch/x86/xen/Kconfig 2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/arch/x86/xen/Kconfig      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/xen/Kconfig 2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/arch/x86/xen/Kconfig      2009-06-04 10:21:39.000000000 +0200
 @@ -17,7 +17,7 @@ config XEN_MAX_DOMAIN_MEMORY
         int "Maximum allowed size of a domain in gigabytes"
         default 8 if X86_32
@@ -23097,9 +23094,9 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +       depends on PARAVIRT_XEN && PM
         default y
 \ No newline at end of file
---- sle11-2009-06-29.orig/drivers/acpi/processor_core.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/acpi/processor_core.c     2009-06-04 10:21:39.000000000 +0200
-@@ -721,9 +721,11 @@ static int __cpuinit acpi_processor_star
+--- sle11-2009-10-16.orig/drivers/acpi/processor_core.c        2009-08-26 11:54:44.000000000 +0200
++++ sle11-2009-10-16/drivers/acpi/processor_core.c     2009-08-26 12:04:00.000000000 +0200
+@@ -730,9 +730,11 @@ static int __cpuinit acpi_processor_star
        if (result)
                goto end;
  
@@ -23114,7 +23111,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        status = acpi_install_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
                                             acpi_processor_notify, pr);
-@@ -895,7 +897,8 @@ static int acpi_processor_remove(struct 
+@@ -904,7 +906,8 @@ static int acpi_processor_remove(struct 
        status = acpi_remove_notify_handler(pr->handle, ACPI_DEVICE_NOTIFY,
                                            acpi_processor_notify);
  
@@ -23124,8 +23121,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        acpi_processor_remove_fs(device);
  
---- sle11-2009-06-29.orig/drivers/char/tpm/tpm_vtpm.c  2009-02-16 15:58:14.000000000 +0100
-+++ sle11-2009-06-29/drivers/char/tpm/tpm_vtpm.c       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/char/tpm/tpm_vtpm.c  2009-08-26 11:52:33.000000000 +0200
++++ sle11-2009-10-16/drivers/char/tpm/tpm_vtpm.c       2009-06-04 10:21:39.000000000 +0200
 @@ -347,7 +347,7 @@ static int _vtpm_send_queued(struct tpm_
  {
        int rc;
@@ -23135,9 +23132,9 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        unsigned char buffer[1];
        struct vtpm_state *vtpms;
        vtpms = (struct vtpm_state *)chip_get_private(chip);
---- sle11-2009-06-29.orig/drivers/misc/Kconfig 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/misc/Kconfig      2009-06-04 10:21:39.000000000 +0200
-@@ -438,7 +438,7 @@ config ENCLOSURE_SERVICES
+--- sle11-2009-10-16.orig/drivers/misc/Kconfig 2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/drivers/misc/Kconfig      2009-08-26 12:04:11.000000000 +0200
+@@ -440,7 +440,7 @@ config ENCLOSURE_SERVICES
  config SGI_XP
        tristate "Support communication between SGI SSIs"
        depends on NET
@@ -23146,7 +23143,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        select IA64_UNCACHED_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
        select GENERIC_ALLOCATOR if IA64_GENERIC || IA64_SGI_SN2
        select SGI_GRU if (IA64_GENERIC || IA64_SGI_UV || X86_64) && SMP
-@@ -465,7 +465,7 @@ config HP_ILO
+@@ -467,7 +467,7 @@ config HP_ILO
  
  config SGI_GRU
        tristate "SGI GRU driver"
@@ -23155,8 +23152,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        default n
        select MMU_NOTIFIER
        ---help---
---- sle11-2009-06-29.orig/drivers/pci/msi-xen.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/pci/msi-xen.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/pci/msi-xen.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/msi-xen.c     2009-06-04 10:21:39.000000000 +0200
 @@ -90,12 +90,10 @@ arch_teardown_msi_irqs(struct pci_dev *d
  }
  #endif
@@ -23207,8 +23204,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                return -EINVAL;
        }
  
---- sle11-2009-06-29.orig/drivers/pci/quirks.c 2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/pci/quirks.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/pci/quirks.c 2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/quirks.c      2009-06-04 10:21:39.000000000 +0200
 @@ -44,9 +44,8 @@ static void __devinit quirk_release_reso
                        /* PCI Host Bridge isn't a target device */
                        return;
@@ -23221,8 +23218,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                pci_read_config_word(dev, PCI_COMMAND, &command);
                command &= ~PCI_COMMAND_MEMORY;
                pci_write_config_word(dev, PCI_COMMAND, command);
---- sle11-2009-06-29.orig/drivers/pci/setup-res.c      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/pci/setup-res.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/pci/setup-res.c      2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/drivers/pci/setup-res.c   2009-06-04 10:21:39.000000000 +0200
 @@ -129,7 +129,7 @@ int pci_claim_resource(struct pci_dev *d
  #ifdef CONFIG_PCI_REASSIGN
  void pci_disable_bridge_window(struct pci_dev *dev)
@@ -23254,16 +23251,16 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
                        (unsigned long long)res->start,
                        (unsigned long long)res->end);
  #endif
---- sle11-2009-06-29.orig/drivers/xen/Makefile 2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/Makefile      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/Makefile 2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/Makefile      2009-06-04 10:21:39.000000000 +0200
 @@ -1,4 +1,4 @@
 -obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o features.o events.o
 +obj-$(CONFIG_PARAVIRT_XEN)    += grant-table.o features.o events.o manage.o
  xen-xencomm-$(CONFIG_PARAVIRT_XEN) := xencomm.o
  xen-balloon-$(CONFIG_PARAVIRT_XEN) := balloon.o
  
---- sle11-2009-06-29.orig/drivers/xen/balloon/balloon.c        2009-06-29 15:28:36.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/balloon/balloon.c     2009-06-29 15:30:29.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/balloon/balloon.c        2009-06-29 15:28:36.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/balloon/balloon.c     2009-06-29 15:30:29.000000000 +0200
 @@ -84,7 +84,7 @@ static unsigned long frame_list[PAGE_SIZ
  /* VM /proc information for memory */
  extern unsigned long totalram_pages;
@@ -23273,8 +23270,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  extern unsigned long totalhigh_pages;
  #define inc_totalhigh_pages() (totalhigh_pages++)
  #define dec_totalhigh_pages() (totalhigh_pages--)
---- sle11-2009-06-29.orig/drivers/xen/balloon/sysfs.c  2009-06-29 15:29:24.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/balloon/sysfs.c       2009-06-29 15:31:06.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/balloon/sysfs.c  2009-06-29 15:29:24.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/balloon/sysfs.c       2009-06-29 15:31:06.000000000 +0200
 @@ -45,6 +45,7 @@
  
  #define BALLOON_SHOW(name, format, args...)                   \
@@ -23302,8 +23299,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  {
        char memstring[64], *endchar;
        unsigned long long target_bytes;
---- sle11-2009-06-29.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:40:14.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/blktap/blktap.c       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/blktap/blktap.c  2009-04-20 11:40:14.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/blktap/blktap.c       2009-06-04 10:21:39.000000000 +0200
 @@ -54,6 +54,7 @@
  #include <linux/gfp.h>
  #include <linux/poll.h>
@@ -23331,8 +23328,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        } else {
                /* this is bad, but not fatal */
                WPRINTK("blktap: sysfs xen_class not created\n");
---- sle11-2009-06-29.orig/drivers/xen/char/mem.c       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/char/mem.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/char/mem.c       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/char/mem.c    2009-06-04 10:21:39.000000000 +0200
 @@ -35,7 +35,7 @@ static inline int uncached_access(struct
  
  static inline int range_is_allowed(unsigned long pfn, unsigned long size)
@@ -23354,8 +23351,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  };
  
  static int xen_mmap_mem(struct file * file, struct vm_area_struct * vma)
---- sle11-2009-06-29.orig/drivers/xen/console/console.c        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/console/console.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/console/console.c        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/console/console.c     2009-06-04 10:21:39.000000000 +0200
 @@ -432,9 +432,7 @@ static void __xencons_tx_flush(void)
  
        if (work_done && (xencons_tty != NULL)) {
@@ -23378,8 +23375,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        tty->closing = 0;
        spin_lock_irqsave(&xencons_lock, flags);
        xencons_tty = NULL;
---- sle11-2009-06-29.orig/drivers/xen/core/evtchn.c    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/evtchn.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/evtchn.c    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/evtchn.c 2009-06-04 10:21:39.000000000 +0200
 @@ -746,8 +746,9 @@ static struct irq_chip dynirq_chip = {
  };
  
@@ -23464,8 +23461,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        /* No event channels are 'live' right now. */
        for (i = 0; i < NR_EVENT_CHANNELS; i++)
---- sle11-2009-06-29.orig/drivers/xen/core/gnttab.c    2008-12-01 11:25:57.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/gnttab.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/gnttab.c    2008-12-01 11:25:57.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/gnttab.c 2009-06-04 10:21:39.000000000 +0200
 @@ -449,6 +449,7 @@ static int map_pte_fn(pte_t *pte, struct
        return 0;
  }
@@ -23593,8 +23590,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        return 0;
  
   ini_nomem:
---- sle11-2009-06-29.orig/drivers/xen/core/machine_kexec.c     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/machine_kexec.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/machine_kexec.c     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/machine_kexec.c  2009-06-04 10:21:39.000000000 +0200
 @@ -91,7 +91,7 @@ void __init xen_machine_kexec_setup_reso
        xen_hypervisor_res.start = range.start;
        xen_hypervisor_res.end = range.start + range.size - 1;
@@ -23622,8 +23619,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  void __init xen_machine_kexec_register_resources(struct resource *res)
  {
        request_resource(res, &xen_hypervisor_res);
---- sle11-2009-06-29.orig/drivers/xen/core/machine_reboot.c    2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/core/machine_reboot.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/machine_reboot.c    2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/machine_reboot.c 2009-06-04 10:21:39.000000000 +0200
 @@ -57,6 +57,7 @@ EXPORT_SYMBOL(machine_restart);
  EXPORT_SYMBOL(machine_halt);
  EXPORT_SYMBOL(machine_power_off);
@@ -23663,8 +23660,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        return 0;
  }
 +#endif
---- sle11-2009-06-29.orig/drivers/xen/core/reboot.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/reboot.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/reboot.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/reboot.c 2009-06-04 10:21:39.000000000 +0200
 @@ -29,17 +29,12 @@ MODULE_LICENSE("Dual BSD/GPL");
  /* Ignore multiple shutdown requests. */
  static int shutting_down = SHUTDOWN_INVALID;
@@ -23737,8 +23734,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  static int setup_shutdown_watcher(void)
  {
---- sle11-2009-06-29.orig/drivers/xen/core/smpboot.c   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/smpboot.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/smpboot.c   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/smpboot.c        2009-06-04 10:21:39.000000000 +0200
 @@ -27,6 +27,7 @@
  
  extern irqreturn_t smp_reschedule_interrupt(int, void *);
@@ -23887,8 +23884,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        prefill_possible_map();
  }
  
---- sle11-2009-06-29.orig/drivers/xen/core/spinlock.c  2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/core/spinlock.c       2009-06-04 10:36:24.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/core/spinlock.c  2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/core/spinlock.c       2009-06-04 10:36:24.000000000 +0200
 @@ -5,6 +5,8 @@
   *    portions of this file.
   */
@@ -23925,8 +23922,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  EXPORT_SYMBOL(xen_spin_kick);
 +
 +#endif /* CONFIG_XEN_COMPAT >= 0x030200 */
---- sle11-2009-06-29.orig/drivers/xen/fbfront/xenfb.c  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/fbfront/xenfb.c       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenfb.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenfb.c       2009-06-04 10:21:39.000000000 +0200
 @@ -18,6 +18,7 @@
   * frame buffer.
   */
@@ -23978,16 +23975,16 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
 +MODULE_DESCRIPTION("Xen virtual framebuffer device frontend");
  MODULE_LICENSE("GPL");
---- sle11-2009-06-29.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:25:55.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/fbfront/xenkbd.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/fbfront/xenkbd.c 2009-03-04 11:25:55.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/fbfront/xenkbd.c      2009-06-04 10:21:39.000000000 +0200
 @@ -350,4 +350,5 @@ static void __exit xenkbd_cleanup(void)
  module_init(xenkbd_init);
  module_exit(xenkbd_cleanup);
  
 +MODULE_DESCRIPTION("Xen virtual keyboard/pointer device frontend");
  MODULE_LICENSE("GPL");
---- sle11-2009-06-29.orig/drivers/xen/gntdev/gntdev.c  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/gntdev/gntdev.c       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/gntdev/gntdev.c  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/gntdev/gntdev.c       2009-06-04 10:21:39.000000000 +0200
 @@ -418,7 +418,7 @@ static int __init gntdev_init(void)
        }
  
@@ -23997,8 +23994,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        if (IS_ERR(device)) {
                printk(KERN_ERR "Error creating gntdev device in xen_class\n");
                printk(KERN_ERR "gntdev created with major number = %d\n",
---- sle11-2009-06-29.orig/drivers/xen/netfront/accel.c 2009-03-30 16:39:19.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/netfront/accel.c      2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/accel.c 2009-03-30 16:39:19.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/accel.c      2009-06-04 10:21:39.000000000 +0200
 @@ -28,6 +28,7 @@
   * IN THE SOFTWARE.
   */
@@ -24007,8 +24004,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #include <linux/netdevice.h>
  #include <linux/skbuff.h>
  #include <linux/list.h>
---- sle11-2009-06-29.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:40:17.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/netfront/netfront.c   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/netfront/netfront.c      2009-03-30 16:40:17.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/netfront/netfront.c   2009-06-04 10:21:39.000000000 +0200
 @@ -640,7 +640,7 @@ static int network_open(struct net_devic
        }
        spin_unlock_bh(&np->rx_lock);
@@ -24018,8 +24015,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        return 0;
  }
---- sle11-2009-06-29.orig/drivers/xen/sfc_netback/accel.h      2009-03-30 16:00:09.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netback/accel.h   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netback/accel.h      2009-03-30 16:00:09.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netback/accel.h   2009-06-04 10:21:39.000000000 +0200
 @@ -25,6 +25,7 @@
  #ifndef NETBACK_ACCEL_H
  #define NETBACK_ACCEL_H
@@ -24028,8 +24025,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #include <linux/slab.h>
  #include <linux/ip.h>
  #include <linux/tcp.h>
---- sle11-2009-06-29.orig/drivers/xen/sfc_netfront/accel.h     2009-03-30 16:34:56.000000000 +0200
-+++ sle11-2009-06-29/drivers/xen/sfc_netfront/accel.h  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/sfc_netfront/accel.h     2009-03-30 16:34:56.000000000 +0200
++++ sle11-2009-10-16/drivers/xen/sfc_netfront/accel.h  2009-06-04 10:21:39.000000000 +0200
 @@ -35,6 +35,7 @@
  #include <xen/evtchn.h>
  
@@ -24038,8 +24035,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #include <linux/list.h>
  
  enum netfront_accel_post_status {
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-24 10:13:17.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_client.c        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_client.c   2009-03-24 10:13:17.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_client.c        2009-06-04 10:21:39.000000000 +0200
 @@ -150,7 +150,7 @@ int xenbus_watch_pathfmt(struct xenbus_d
        char *path;
  
@@ -24049,8 +24046,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        va_end(ap);
  
        if (!path) {
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_comms.c    2009-02-16 16:17:21.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_comms.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_comms.c    2009-02-16 16:17:21.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_comms.c 2009-06-04 10:21:39.000000000 +0200
 @@ -228,14 +228,11 @@ int xb_init_comms(void)
                intf->rsp_cons = intf->rsp_prod;
        }
@@ -24088,8 +24085,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
        return 0;
  }
---- sle11-2009-06-29.orig/drivers/xen/xenbus/xenbus_probe.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/drivers/xen/xenbus/xenbus_probe.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/drivers/xen/xenbus/xenbus_probe.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/drivers/xen/xenbus/xenbus_probe.c 2009-06-04 10:21:39.000000000 +0200
 @@ -36,6 +36,7 @@
                 __FUNCTION__, __LINE__, ##args)
  
@@ -24098,8 +24095,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #include <linux/err.h>
  #include <linux/string.h>
  #include <linux/ctype.h>
---- sle11-2009-06-29.orig/fs/aio.c     2009-03-24 10:13:25.000000000 +0100
-+++ sle11-2009-06-29/fs/aio.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/fs/aio.c     2009-03-24 10:13:25.000000000 +0100
++++ sle11-2009-10-16/fs/aio.c  2009-06-04 10:21:39.000000000 +0200
 @@ -1335,7 +1335,7 @@ static int make_aio_fd(struct kioctx *io
        int fd;
        struct file *file;
@@ -24109,8 +24106,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        if (fd < 0)
                return fd;
  
---- sle11-2009-06-29.orig/include/asm-generic/pgtable.h        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/include/asm-generic/pgtable.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-generic/pgtable.h        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/include/asm-generic/pgtable.h     2009-06-04 10:21:39.000000000 +0200
 @@ -99,10 +99,6 @@ static inline void ptep_set_wrprotect(st
  }
  #endif
@@ -24122,8 +24119,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #ifndef __HAVE_ARCH_PTE_SAME
  #define pte_same(A,B) (pte_val(A) == pte_val(B))
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/dma-mapping.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/dma-mapping.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/dma-mapping.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/dma-mapping.h     2009-06-04 10:21:39.000000000 +0200
 @@ -74,7 +74,7 @@ static inline struct dma_mapping_ops *ge
  /* Make sure we keep the same behaviour */
  static inline int dma_mapping_error(struct device *dev, dma_addr_t dma_addr)
@@ -24133,8 +24130,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
        return 0;
  #else
        struct dma_mapping_ops *ops = get_dma_ops(dev);
---- sle11-2009-06-29.orig/include/asm-x86/kexec.h      2008-12-01 11:11:08.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/kexec.h   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/kexec.h      2008-12-01 11:11:08.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/kexec.h   2009-06-04 10:21:39.000000000 +0200
 @@ -10,6 +10,7 @@
  # define VA_PTE_0             5
  # define PA_PTE_1             6
@@ -24162,8 +24159,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #else
  # define PA_CONTROL_PAGE      0
  # define VA_CONTROL_PAGE      1
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/desc.h  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/desc.h       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/desc.h  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/desc.h       2009-06-04 10:21:39.000000000 +0200
 @@ -31,11 +31,17 @@ extern struct desc_ptr idt_descr;
  extern gate_desc idt_table[];
  #endif
@@ -24232,8 +24229,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  /*
   * This routine sets up an interrupt gate at directory privilege level 3.
   */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap.h     2009-06-04 10:21:39.000000000 +0200
 @@ -7,7 +7,58 @@
  # include "fixmap_64.h"
  #endif
@@ -24293,8 +24290,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +      return __virt_to_fix(vaddr);
 +}
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_32.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_32.h  2009-06-04 10:21:39.000000000 +0200
 @@ -58,10 +58,17 @@ enum fixed_addresses {
  #ifdef CONFIG_X86_LOCAL_APIC
        FIX_APIC_BASE,  /* local (CPU) APIC) -- required for SMP or not */
@@ -24412,8 +24409,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -
  #endif /* !__ASSEMBLY__ */
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/fixmap_64.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/fixmap_64.h  2009-06-04 10:21:39.000000000 +0200
 @@ -12,6 +12,7 @@
  #define _ASM_FIXMAP_64_H
  
@@ -24513,8 +24510,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -}
 -
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/highmem.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/highmem.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/highmem.h    2009-06-04 10:21:39.000000000 +0200
 @@ -74,6 +74,9 @@ struct page *kmap_atomic_to_page(void *p
  
  #define flush_cache_kmaps()   do { } while (0)
@@ -24525,8 +24522,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  void clear_highpage(struct page *);
  static inline void clear_user_highpage(struct page *page, unsigned long vaddr)
  {
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypercall.h     2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypercall.h  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypercall.h     2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypercall.h  2009-06-04 10:21:39.000000000 +0200
 @@ -323,9 +323,19 @@ static inline int __must_check
  HYPERVISOR_grant_table_op(
        unsigned int cmd, void *uop, unsigned int count)
@@ -24548,8 +24545,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  }
  
  static inline int __must_check
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-16 16:33:40.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/hypervisor.h 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-16 16:33:40.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-06-04 10:21:39.000000000 +0200
 @@ -35,7 +35,6 @@
  
  #include <linux/types.h>
@@ -24597,9 +24594,9 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #if defined(CONFIG_X86_64)
  #define MULTI_UVMFLAGS_INDEX 2
  #define MULTI_UVMDOMID_INDEX 3
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/io.h    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/io.h 2009-06-04 10:21:39.000000000 +0200
-@@ -3,20 +3,139 @@
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/io.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/io.h 2009-09-24 11:02:00.000000000 +0200
+@@ -3,20 +3,140 @@
  
  #define ARCH_HAS_IOREMAP_WC
  
@@ -24708,15 +24705,16 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +
 +#include <asm/fixmap.h>
 +
++#undef __ISA_IO_base
 +#undef isa_virt_to_bus
 +#undef isa_page_to_bus
 +#undef isa_bus_to_virt
-+#define isa_virt_to_bus(_x) ({ BUG(); virt_to_bus(_x); })
-+#define isa_page_to_bus(_x) isa_page_to_bus_is_UNSUPPORTED->_x
-+#define isa_bus_to_virt(_x) ((void *)__fix_to_virt(FIX_ISAMAP_BEGIN) + (_x))
-+
-+#undef __ISA_IO_base
-+#define __ISA_IO_base ((char __iomem *)fix_to_virt(FIX_ISAMAP_BEGIN))
++#define isa_virt_to_bus(_x) ({ \
++      unsigned long _va_ = (unsigned long)(_x); \
++      _va_ - fix_to_virt(FIX_ISAMAP_BEGIN) < (NR_FIX_ISAMAPS << PAGE_SHIFT) \
++      ? _va_ - fix_to_virt(FIX_ISAMAP_BEGIN) \
++      : ({ BUG(); (unsigned long)virt_to_bus(_va_); }); })
++#define isa_bus_to_virt(_x) ((void *)fix_to_virt(FIX_ISAMAP_BEGIN) + (_x))
 +
  #endif
  
@@ -24745,7 +24743,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +
  #endif /* _ASM_X86_IO_H */
 --- /dev/null  1970-01-01 00:00:00.000000000 +0000
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irq_vectors.h        2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irq_vectors.h        2009-06-04 10:21:39.000000000 +0200
 @@ -0,0 +1,52 @@
 +#ifndef _ASM_IRQ_VECTORS_H
 +#define _ASM_IRQ_VECTORS_H
@@ -24799,8 +24797,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +#define NR_IRQ_VECTORS                NR_IRQS
 +
 +#endif /* _ASM_IRQ_VECTORS_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/irqflags.h   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/irqflags.h      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/irqflags.h   2009-06-04 10:21:39.000000000 +0200
 @@ -118,7 +118,7 @@ static inline void halt(void)
  
  #ifndef CONFIG_X86_64
@@ -24865,8 +24863,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #else
  #  define TRACE_IRQS_ON
  #  define TRACE_IRQS_OFF
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context.h   2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context.h        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context.h   2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context.h        2009-06-04 10:21:39.000000000 +0200
 @@ -1,5 +1,42 @@
 +#ifndef __ASM_X86_MMU_CONTEXT_H
 +#define __ASM_X86_MMU_CONTEXT_H
@@ -24910,8 +24908,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 +
 +
 +#endif /* __ASM_X86_MMU_CONTEXT_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_32.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_32.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,32 +1,6 @@
  #ifndef __I386_SCHED_H
  #define __I386_SCHED_H
@@ -24956,8 +24954,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -} while (0)
 -
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/mmu_context_64.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/mmu_context_64.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,23 +1,6 @@
  #ifndef __X86_64_MMU_CONTEXT_H
  #define __X86_64_MMU_CONTEXT_H
@@ -25005,8 +25003,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -}
 -
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/page.h  2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page.h       2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page.h  2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page.h       2009-06-04 10:21:39.000000000 +0200
 @@ -16,9 +16,9 @@
   * below. The preprocessor will warn if the two definitions aren't identical.
   */
@@ -25098,8 +25096,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #define __pte(x)      xen_make_pte(x)
  
  #define __pa(x)               __phys_addr((unsigned long)(x))
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/page_64.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/page_64.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/page_64.h    2009-06-04 10:21:39.000000000 +0200
 @@ -26,6 +26,12 @@
  #define PUD_PAGE_SIZE         (_AC(1, UL) << PUD_SHIFT)
  #define PUD_PAGE_MASK         (~(PUD_PAGE_SIZE-1))
@@ -25135,8 +25133,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #endif        /* !__ASSEMBLY__ */
  
  #ifdef CONFIG_FLATMEM
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pci.h   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pci.h        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci.h        2009-06-04 10:21:39.000000000 +0200
 @@ -21,6 +21,8 @@ struct pci_sysdata {
  #endif
  };
@@ -25146,8 +25144,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  /* scan a bus after allocating a pci_sysdata for it */
  extern struct pci_bus *pci_scan_bus_on_node(int busno, struct pci_ops *ops,
                                            int node);
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-02-16 16:18:36.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pci_32.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pci_32.h        2009-02-16 16:18:36.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pci_32.h     2009-06-04 10:21:39.000000000 +0200
 @@ -38,12 +38,14 @@ struct pci_dev;
  #define PCI_DMA_BUS_IS_PHYS   (1)
  
@@ -25169,8 +25167,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #endif
  
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgalloc.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgalloc.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgalloc.h    2009-06-04 10:21:39.000000000 +0200
 @@ -7,6 +7,9 @@
  
  #include <asm/io.h>           /* for phys_to_virt and page_to_pseudophys */
@@ -25181,8 +25179,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  static inline void paravirt_alloc_pte(struct mm_struct *mm, unsigned long pfn)        {}
  static inline void paravirt_alloc_pmd(struct mm_struct *mm, unsigned long pfn)        {}
  static inline void paravirt_alloc_pmd_clone(unsigned long pfn, unsigned long clonepfn,
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable.h    2009-06-04 10:21:39.000000000 +0200
 @@ -13,11 +13,12 @@
  #define _PAGE_BIT_PSE         7       /* 4 MB (or 2MB) page */
  #define _PAGE_BIT_PAT         7       /* on 4KB pages */
@@ -25606,8 +25604,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #endif        /* __ASSEMBLY__ */
  
  #endif        /* _ASM_X86_PGTABLE_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable-3level.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable-3level.h     2009-06-04 10:21:39.000000000 +0200
 @@ -14,11 +14,11 @@
  #define pmd_ERROR(e)                                                  \
        printk("%s:%d: bad pmd %p(%016Lx pfn %08Lx).\n",                \
@@ -25643,8 +25641,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  
  /* Find an entry in the second-level page table.. */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_32.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_32.h 2009-06-04 10:21:39.000000000 +0200
 @@ -89,10 +89,10 @@ extern unsigned long pg0[];
  /* pmd_present doesn't just test the _PAGE_PRESENT bit since wr.p.t.
     can temporarily clear it. */
@@ -25694,8 +25692,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #if defined(CONFIG_HIGHPTE)
  #define pte_offset_map(dir, address)                                  \
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/pgtable_64.h    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/pgtable_64.h 2009-06-04 10:21:39.000000000 +0200
 @@ -23,6 +23,8 @@ extern void xen_init_pt(void);
  extern pud_t level3_kernel_pgt[512];
  extern pud_t level3_ident_pgt[512];
@@ -25781,8 +25779,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #define pmd_page(pmd)         (pfn_to_page(pmd_val((pmd)) >> PAGE_SHIFT))
  
  #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD - 1))
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/processor.h     2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/processor.h  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor.h     2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor.h  2009-06-04 10:21:39.000000000 +0200
 @@ -134,7 +134,7 @@ extern __u32                       cleared_cpu_caps[NCAPINTS
  #ifdef CONFIG_SMP
  DECLARE_PER_CPU(struct cpuinfo_x86, cpu_info);
@@ -25857,8 +25855,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  extern void enable_sep_cpu(void);
  extern int sysenter_setup(void);
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/segment.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/segment.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/segment.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/segment.h    2009-06-04 10:21:39.000000000 +0200
 @@ -1,6 +1,15 @@
  #ifndef _ASM_X86_SEGMENT_H_
  #define _ASM_X86_SEGMENT_H_
@@ -25936,8 +25934,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  /* User mode is privilege level 3 */
  #define USER_RPL              0x3
  /* LDT segment has TI set, GDT has it cleared */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/smp.h   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/smp.h        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/smp.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/smp.h        2009-06-04 10:21:39.000000000 +0200
 @@ -25,23 +25,16 @@ extern cpumask_t cpu_initialized;
  extern void (*mtrr_hook)(void);
  extern void zap_low_mappings(void);
@@ -26053,8 +26051,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -extern void unlock_ipi_call_lock(void);
  #endif /* __ASSEMBLY__ */
  #endif
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/spinlock.h      2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/spinlock.h   2009-06-04 11:09:05.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/spinlock.h      2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/spinlock.h   2009-06-04 11:09:05.000000000 +0200
 @@ -38,6 +38,11 @@
  # define UNLOCK_LOCK_PREFIX
  #endif
@@ -26309,8 +26307,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  static inline void __raw_spin_unlock_wait(raw_spinlock_t *lock)
  {
        while (__raw_spin_is_locked(lock))
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/system.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/system.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/system.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/system.h     2009-06-04 10:21:39.000000000 +0200
 @@ -137,7 +137,7 @@ __asm__ __volatile__ ("movw %%dx,%1\n\t"
  #define set_base(ldt, base) _set_base(((char *)&(ldt)) , (base))
  #define set_limit(ldt, limit) _set_limit(((char *)&(ldt)) , ((limit)-1))
@@ -26360,8 +26358,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  /*
   * Force strict CPU ordering.
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/asm/xor_64.h        2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/asm-x86/mach-xen/asm/xor_64.h     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/xor_64.h        2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/xor_64.h     2009-06-04 10:21:39.000000000 +0200
 @@ -1,3 +1,6 @@
 +#ifndef ASM_X86__XOR_64_H
 +#define ASM_X86__XOR_64_H
@@ -26375,7 +26373,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #define XOR_SELECT_TEMPLATE(FASTEST) (&xor_block_sse)
 +
 +#endif /* ASM_X86__XOR_64_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/irq_vectors.h       2009-03-16 16:33:40.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/irq_vectors.h       2009-03-16 16:33:40.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,126 +0,0 @@
 -/*
@@ -26504,7 +26502,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -#define NR_IRQ_VECTORS                NR_IRQS
 -
 -#endif /* _ASM_IRQ_VECTORS_H */
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/setup_arch_post.h   2009-06-29 15:14:52.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/setup_arch_post.h   2009-10-28 14:55:02.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,63 +0,0 @@
 -/**
@@ -26570,7 +26568,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -#endif
 -#endif
 -}
---- sle11-2009-06-29.orig/include/asm-x86/mach-xen/setup_arch_pre.h    2009-06-29 15:14:52.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/setup_arch_pre.h    2009-10-28 14:55:02.000000000 +0100
 +++ /dev/null  1970-01-01 00:00:00.000000000 +0000
 @@ -1,5 +0,0 @@
 -/* Hook to call BIOS initialisation function */
@@ -26578,8 +26576,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
 -#define ARCH_SETUP machine_specific_arch_setup();
 -
 -static void __init machine_specific_arch_setup(void);
---- sle11-2009-06-29.orig/include/asm-x86/traps.h      2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/traps.h   2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/traps.h      2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/traps.h   2009-06-04 10:21:39.000000000 +0200
 @@ -23,6 +23,9 @@ asmlinkage void spurious_interrupt_bug(v
  #ifdef CONFIG_X86_MCE
  asmlinkage void machine_check(void);
@@ -26600,8 +26598,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  unsigned long patch_espfix_desc(unsigned long, unsigned long);
  asmlinkage void math_emulate(long);
  
---- sle11-2009-06-29.orig/include/asm-x86/xen/interface_64.h   2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/include/asm-x86/xen/interface_64.h        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/asm-x86/xen/interface_64.h   2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/xen/interface_64.h        2009-06-04 10:21:39.000000000 +0200
 @@ -136,7 +136,7 @@ struct cpu_user_regs {
      uint16_t fs, _pad5[3]; /* Non-zero => takes precedence over fs_base.     */
      uint16_t gs, _pad6[3]; /* Non-zero => takes precedence over gs_base_usr. */
@@ -26611,8 +26609,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  
  #undef __DECL_REG
  
---- sle11-2009-06-29.orig/include/linux/page-flags.h   2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/linux/page-flags.h        2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/linux/page-flags.h   2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/linux/page-flags.h        2009-06-04 10:21:39.000000000 +0200
 @@ -110,9 +110,11 @@ enum pageflags {
        /* Filesystems */
        PG_checked = PG_owner_priv_1,
@@ -26638,8 +26636,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  PAGEFLAG(Reserved, reserved) __CLEARPAGEFLAG(Reserved, reserved)
  PAGEFLAG(Private, private) __CLEARPAGEFLAG(Private, private)
        __SETPAGEFLAG(Private, private)
---- sle11-2009-06-29.orig/include/xen/interface/memory.h       2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/include/xen/interface/memory.h    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/include/xen/interface/memory.h       2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/include/xen/interface/memory.h    2009-06-04 10:21:39.000000000 +0200
 @@ -82,6 +82,7 @@ struct xen_memory_reservation {
      domid_t        domid;
  
@@ -26698,8 +26696,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  };
  DEFINE_XEN_GUEST_HANDLE_STRUCT(xen_translate_gpfn_list);
  typedef struct xen_translate_gpfn_list xen_translate_gpfn_list_t;
---- sle11-2009-06-29.orig/kernel/hrtimer.c     2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/kernel/hrtimer.c  2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/kernel/hrtimer.c     2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/kernel/hrtimer.c  2009-06-04 10:21:39.000000000 +0200
 @@ -1084,7 +1084,7 @@ ktime_t hrtimer_get_remaining(const stru
  }
  EXPORT_SYMBOL_GPL(hrtimer_get_remaining);
@@ -26709,8 +26707,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  /**
   * hrtimer_get_next_event - get the time until next expiry event
   *
---- sle11-2009-06-29.orig/kernel/kexec.c       2009-02-17 12:38:20.000000000 +0100
-+++ sle11-2009-06-29/kernel/kexec.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/kernel/kexec.c       2009-02-17 12:38:20.000000000 +0100
++++ sle11-2009-10-16/kernel/kexec.c    2009-06-04 10:21:39.000000000 +0200
 @@ -54,7 +54,7 @@ int dump_after_notifier;
  unsigned char vmcoreinfo_data[VMCOREINFO_BYTES];
  u32
@@ -26720,8 +26718,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  #endif
  vmcoreinfo_note[VMCOREINFO_NOTE_SIZE/4];
  size_t vmcoreinfo_size;
---- sle11-2009-06-29.orig/kernel/timer.c       2009-06-29 15:14:52.000000000 +0200
-+++ sle11-2009-06-29/kernel/timer.c    2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/kernel/timer.c       2009-10-28 14:55:02.000000000 +0100
++++ sle11-2009-10-16/kernel/timer.c    2009-06-04 10:21:39.000000000 +0200
 @@ -884,7 +884,7 @@ static inline void __run_timers(struct t
        spin_unlock_irq(&base->lock);
  }
@@ -26731,8 +26729,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  /*
   * Find out when the next timer event is due to happen. This
   * is used on S/390 to stop all activity when a cpus is idle.
---- sle11-2009-06-29.orig/lib/swiotlb-xen.c    2009-03-16 16:38:05.000000000 +0100
-+++ sle11-2009-06-29/lib/swiotlb-xen.c 2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/lib/swiotlb-xen.c    2009-03-16 16:38:05.000000000 +0100
++++ sle11-2009-10-16/lib/swiotlb-xen.c 2009-06-04 10:21:39.000000000 +0200
 @@ -750,7 +750,7 @@ swiotlb_sync_sg_for_device(struct device
  }
  
@@ -26742,8 +26740,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27" by xen-port-patches
  {
        return (dma_addr == virt_to_bus(io_tlb_overflow_buffer));
  }
---- sle11-2009-06-29.orig/mm/mprotect.c        2009-03-04 11:28:34.000000000 +0100
-+++ sle11-2009-06-29/mm/mprotect.c     2009-06-04 10:21:39.000000000 +0200
+--- sle11-2009-10-16.orig/mm/mprotect.c        2009-03-04 11:28:34.000000000 +0100
++++ sle11-2009-10-16/mm/mprotect.c     2009-06-04 10:21:39.000000000 +0200
 @@ -92,8 +92,6 @@ static inline void change_pmd_range(stru
                next = pmd_addr_end(addr, end);
                if (pmd_none_or_clear_bad(pmd))
similarity index 74%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-patch-2.6.27.19-20
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.19-20
index d57bee0503abf74fd9e32228d1fb6235124a60ec..b46983e906bf04bdbd5a1b6f5b69662dca50303a 100644 (file)
@@ -7,9 +7,9 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 
 Automatically created from "patches.kernel.org/patch-2.6.27.19-20" by xen-port-patches.py
 
---- sle11-2009-03-24.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-24 10:19:55.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/ia32/ia32entry-xen.S     2009-03-24 10:19:57.000000000 +0100
-@@ -373,9 +373,9 @@ ENTRY(ia32_syscall)
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-10-16 14:51:56.000000000 +0200
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-10-16 14:52:16.000000000 +0200
+@@ -369,9 +369,9 @@ ENTRY(ia32_syscall)
        orl   $TS_COMPAT,TI_status(%r10)
        testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
        jnz ia32_tracesys
@@ -21,7 +21,7 @@ Automatically created from "patches.kernel.org/patch-2.6.27.19-20" by xen-port-p
        IA32_ARG_FIXUP
        call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
  ia32_sysret:
-@@ -390,7 +390,9 @@ ia32_tracesys:                      
+@@ -386,7 +386,9 @@ ia32_tracesys:                      
        call syscall_trace_enter
        LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
        RESTORE_REST
@@ -32,8 +32,8 @@ Automatically created from "patches.kernel.org/patch-2.6.27.19-20" by xen-port-p
  END(ia32_syscall)
  
  ia32_badsys:
---- sle11-2009-03-24.orig/arch/x86/kernel/io_apic_64-xen.c     2009-03-24 10:19:55.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/kernel/io_apic_64-xen.c  2009-03-24 10:19:57.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/io_apic_64-xen.c     2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/io_apic_64-xen.c  2009-03-24 10:19:57.000000000 +0100
 @@ -1737,7 +1737,7 @@ static inline void __init check_timer(vo
                        setup_timer_IRQ0_pin(apic1, pin1, cfg->vector);
                }
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.36-37 b/src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.36-37
new file mode 100644 (file)
index 0000000..a9ee41d
--- /dev/null
@@ -0,0 +1,176 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.37
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+Automatically created from "patches.kernel.org/patch-2.6.27.36-37" by xen-port-patches.py
+
+--- sle11-2009-10-16.orig/arch/x86/ia32/ia32entry-xen.S        2009-10-16 14:52:16.000000000 +0200
++++ sle11-2009-10-16/arch/x86/ia32/ia32entry-xen.S     2009-10-19 09:53:48.000000000 +0200
+@@ -21,8 +21,8 @@
+ #define __AUDIT_ARCH_LE          0x40000000
+ #ifndef CONFIG_AUDITSYSCALL
+-#define sysexit_audit int_ret_from_sys_call
+-#define sysretl_audit int_ret_from_sys_call
++#define sysexit_audit ia32_ret_from_sys_call
++#define sysretl_audit ia32_ret_from_sys_call
+ #endif
+ #define IA32_NR_syscalls ((ia32_syscall_end - ia32_sys_call_table)/8)
+@@ -39,12 +39,12 @@
+       .endm 
+       /* clobbers %eax */     
+-      .macro  CLEAR_RREGS
++      .macro  CLEAR_RREGS offset=0, _r9=rax
+       xorl    %eax,%eax
+-      movq    %rax,R11(%rsp)
+-      movq    %rax,R10(%rsp)
+-      movq    %rax,R9(%rsp)
+-      movq    %rax,R8(%rsp)
++      movq    %rax,\offset+R11(%rsp)
++      movq    %rax,\offset+R10(%rsp)
++      movq    %\_r9,\offset+R9(%rsp)
++      movq    %rax,\offset+R8(%rsp)
+       .endm
+       /*
+@@ -52,11 +52,10 @@
+        * We don't reload %eax because syscall_trace_enter() returned
+        * the value it wants us to use in the table lookup.
+        */
+-      .macro LOAD_ARGS32 offset
+-      movl \offset(%rsp),%r11d
+-      movl \offset+8(%rsp),%r10d
++      .macro LOAD_ARGS32 offset, _r9=0
++      .if \_r9
+       movl \offset+16(%rsp),%r9d
+-      movl \offset+24(%rsp),%r8d
++      .endif
+       movl \offset+40(%rsp),%ecx
+       movl \offset+48(%rsp),%edx
+       movl \offset+56(%rsp),%esi
+@@ -135,7 +134,7 @@ ENTRY(ia32_sysenter_target)
+       SAVE_ARGS 0,0,1
+       /* no need to do an access_ok check here because rbp has been
+          32bit zero extended */ 
+-1:    movl    (%rbp),%r9d
++1:    movl    (%rbp),%ebp
+       .section __ex_table,"a"
+       .quad 1b,ia32_badarg
+       .previous       
+@@ -146,7 +145,7 @@ ENTRY(ia32_sysenter_target)
+       cmpl    $(IA32_NR_syscalls-1),%eax
+       ja      ia32_badsys
+ sysenter_do_call:
+-      IA32_ARG_FIXUP 1
++      IA32_ARG_FIXUP
+ sysenter_dispatch:
+       call    *ia32_sys_call_table(,%rax,8)
+       movq    %rax,RAX-ARGOFFSET(%rsp)
+@@ -155,7 +154,7 @@ sysenter_dispatch:
+       TRACE_IRQS_OFF
+       testl   $_TIF_ALLWORK_MASK,TI_flags(%r10)
+       jnz     sysexit_audit
+-      jmp int_ret_from_sys_call
++      jmp     ia32_ret_from_sys_call
+ #ifdef CONFIG_AUDITSYSCALL
+       .macro auditsys_entry_common
+@@ -178,7 +177,7 @@ sysenter_dispatch:
+       .macro auditsys_exit exit,ebpsave=RBP
+       testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+-      jnz int_ret_from_sys_call
++      jnz ia32_ret_from_sys_call
+       TRACE_IRQS_ON
+       ENABLE_INTERRUPTS(CLBR_NONE)
+       movl %eax,%esi          /* second arg, syscall return value */
+@@ -189,6 +188,7 @@ sysenter_dispatch:
+       call audit_syscall_exit
+       movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */
+       movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
++      CLEAR_RREGS -ARGOFFSET
+       DISABLE_INTERRUPTS(CLBR_NONE)
+       TRACE_IRQS_OFF
+       jmp int_with_check
+@@ -204,20 +204,17 @@ sysexit_audit:
+ #endif
+ sysenter_tracesys:
+-      xchgl   %r9d,%ebp
+ #ifdef CONFIG_AUDITSYSCALL
+       testl   $(_TIF_WORK_SYSCALL_ENTRY & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+       jz      sysenter_auditsys
+ #endif
+       SAVE_REST
+       CLEAR_RREGS
+-      movq    %r9,R9(%rsp)
+       movq    $-ENOSYS,RAX(%rsp)/* ptrace can change this for a bad syscall */
+       movq    %rsp,%rdi        /* &pt_regs -> arg1 */
+       call    syscall_trace_enter
+       LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
+       RESTORE_REST
+-      xchgl   %ebp,%r9d
+       cmpl    $(IA32_NR_syscalls-1),%eax
+       ja      int_ret_from_sys_call /* sysenter_tracesys has set RAX(%rsp) */
+       jmp     sysenter_do_call
+@@ -272,9 +269,9 @@ ENTRY(ia32_cstar_target)
+       orl   $TS_COMPAT,TI_status(%r10)
+       testl $_TIF_WORK_SYSCALL_ENTRY,TI_flags(%r10)
+       jnz   cstar_tracesys
+-cstar_do_call:        
+       cmpl $IA32_NR_syscalls-1,%eax
+       ja  ia32_badsys
++cstar_do_call:
+       IA32_ARG_FIXUP 1
+ cstar_dispatch:
+       call *ia32_sys_call_table(,%rax,8)
+@@ -283,7 +280,7 @@ cstar_dispatch:
+       DISABLE_INTERRUPTS(CLBR_NONE)
+       testl $_TIF_ALLWORK_MASK,TI_flags(%r10)
+       jnz sysretl_audit
+-      jmp int_ret_from_sys_call
++      jmp ia32_ret_from_sys_call
+       
+ #ifdef CONFIG_AUDITSYSCALL
+ cstar_auditsys:
+@@ -303,15 +300,13 @@ cstar_tracesys:
+ #endif
+       xchgl %r9d,%ebp
+       SAVE_REST
+-      CLEAR_RREGS
+-      movq %r9,R9(%rsp)
++      CLEAR_RREGS 0, r9
+       movq $-ENOSYS,RAX(%rsp) /* ptrace can change this for a bad syscall */
+       movq %rsp,%rdi        /* &pt_regs -> arg1 */
+       call syscall_trace_enter
+-      LOAD_ARGS32 ARGOFFSET  /* reload args from stack in case ptrace changed it */
++      LOAD_ARGS32 ARGOFFSET, 1  /* reload args from stack in case ptrace changed it */
+       RESTORE_REST
+       xchgl %ebp,%r9d
+-      movl RSP-ARGOFFSET(%rsp), %r8d
+       cmpl $(IA32_NR_syscalls-1),%eax
+       ja int_ret_from_sys_call /* cstar_tracesys has set RAX(%rsp) */
+       jmp cstar_do_call
+@@ -376,6 +371,8 @@ ia32_do_call:
+       call *ia32_sys_call_table(,%rax,8) # xxx: rip relative
+ ia32_sysret:
+       movq %rax,RAX-ARGOFFSET(%rsp)
++ia32_ret_from_sys_call:
++      CLEAR_RREGS -ARGOFFSET
+       jmp int_ret_from_sys_call 
+ ia32_tracesys:                         
+@@ -393,8 +390,8 @@ END(ia32_syscall)
+ ia32_badsys:
+       movq $0,ORIG_RAX-ARGOFFSET(%rsp)
+-      movq $-ENOSYS,RAX-ARGOFFSET(%rsp)
+-      jmp int_ret_from_sys_call
++      movq $-ENOSYS,%rax
++      jmp ia32_sysret
+ quiet_ni_syscall:
+       movq $-ENOSYS,%rax
diff --git a/src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.38-39 b/src/patches/suse-2.6.27.39/patches.xen/xen3-patch-2.6.27.38-39
new file mode 100644 (file)
index 0000000..72cf43f
--- /dev/null
@@ -0,0 +1,35 @@
+From: Greg Kroah-Hartman <gregkh@suse.de>
+Subject: Linux 2.6.27.39
+
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+Automatically created from "patches.kernel.org/patch-2.6.27.38-39" by xen-port-patches.py
+
+--- sle11-2009-11-13.orig/arch/x86/ia32/ia32entry-xen.S        2009-10-19 09:53:48.000000000 +0200
++++ sle11-2009-11-13/arch/x86/ia32/ia32entry-xen.S     2009-11-13 10:50:10.000000000 +0100
+@@ -175,7 +175,7 @@ sysenter_dispatch:
+       movl RDI-ARGOFFSET(%rsp),%r8d   /* reload 5th syscall arg */
+       .endm
+-      .macro auditsys_exit exit,ebpsave=RBP
++      .macro auditsys_exit exit
+       testl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),TI_flags(%r10)
+       jnz ia32_ret_from_sys_call
+       TRACE_IRQS_ON
+@@ -186,7 +186,6 @@ sysenter_dispatch:
+       movzbl %al,%edi         /* zero-extend that into %edi */
+       inc %edi /* first arg, 0->1(AUDITSC_SUCCESS), 1->2(AUDITSC_FAILURE) */
+       call audit_syscall_exit
+-      movl \ebpsave-ARGOFFSET(%rsp),%ebp /* reload user register value */
+       movl $(_TIF_ALLWORK_MASK & ~_TIF_SYSCALL_AUDIT),%edi
+       CLEAR_RREGS -ARGOFFSET
+       DISABLE_INTERRUPTS(CLBR_NONE)
+@@ -290,7 +289,7 @@ cstar_auditsys:
+       jmp cstar_dispatch
+ sysretl_audit:
+-      auditsys_exit sysretl_from_sys_call, RCX /* user %ebp in RCX slot */
++      auditsys_exit sysretl_from_sys_call
+ #endif
+ cstar_tracesys:
similarity index 79%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-perfmon2-remove_syscalls.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-perfmon2-remove_syscalls.patch
index 57499ad5f1f9ea537bc210e9cfcb9d14cb4ffd21..3f1fc55ea8b10ba6a3a7bc47ea8559daaae3cafc 100644 (file)
@@ -11,9 +11,9 @@ Signed-off-by: Tony Jones <tonyj@suse.de>
 
 Automatically created from "patches.suse/perfmon2-remove_syscalls.patch" by xen-port-patches.py
 
---- sle11-2009-03-24.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-24 10:20:46.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/ia32/ia32entry-xen.S     2009-03-24 10:20:51.000000000 +0100
-@@ -783,16 +783,4 @@ ia32_sys_call_table:
+--- sle11-2009-11-13.orig/arch/x86/ia32/ia32entry-xen.S        2009-11-13 10:51:39.000000000 +0100
++++ sle11-2009-11-13/arch/x86/ia32/ia32entry-xen.S     2009-11-13 10:51:47.000000000 +0100
+@@ -775,16 +775,4 @@ ia32_sys_call_table:
        .quad sys_dup3                  /* 330 */
        .quad sys_pipe2
        .quad sys_inotify_init1
similarity index 77%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-perfmon2.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-perfmon2.patch
index 7f78d863243587002363946e3dcf101a5f8fcdd5..46316f91707fd436d8cea3a5e46772c5b027f6f8 100644 (file)
@@ -16,8 +16,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 
 Automatically created from "patches.suse/perfmon2.patch" by xen-port-patches.py
 
---- sle11-2009-03-24.orig/arch/x86/Kconfig     2009-02-05 10:41:12.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/Kconfig  2009-02-05 10:41:57.000000000 +0100
+--- sle11-2009-11-13.orig/arch/x86/Kconfig     2009-02-05 10:41:12.000000000 +0100
++++ sle11-2009-11-13/arch/x86/Kconfig  2009-02-05 10:41:57.000000000 +0100
 @@ -1499,7 +1499,9 @@ config COMPAT_VDSO
  
          If unsure, say Y.
@@ -28,9 +28,9 @@ Automatically created from "patches.suse/perfmon2.patch" by xen-port-patches.py
  
  endmenu
  
---- sle11-2009-03-24.orig/arch/x86/ia32/ia32entry-xen.S        2009-03-24 10:19:57.000000000 +0100
-+++ sle11-2009-03-24/arch/x86/ia32/ia32entry-xen.S     2009-03-24 10:20:46.000000000 +0100
-@@ -783,4 +783,16 @@ ia32_sys_call_table:
+--- sle11-2009-11-13.orig/arch/x86/ia32/ia32entry-xen.S        2009-11-13 10:50:10.000000000 +0100
++++ sle11-2009-11-13/arch/x86/ia32/ia32entry-xen.S     2009-11-13 10:51:39.000000000 +0100
+@@ -775,4 +775,16 @@ ia32_sys_call_table:
        .quad sys_dup3                  /* 330 */
        .quad sys_pipe2
        .quad sys_inotify_init1
similarity index 87%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-stack-unwind
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-stack-unwind
index 8a85f690f1c30383315543734bed80732c687cb0..19d0e8a699f3ccad0833579c25caa78d10081227 100644 (file)
@@ -4,8 +4,8 @@ Patch-mainline: no
 
 Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
 
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_32-xen.S       2009-05-14 11:20:49.000000000 +0200
-+++ sle11-2009-05-14/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:29:34.000000000 +0200
+--- sle11-2009-08-26.orig/arch/x86/kernel/entry_32-xen.S       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/entry_32-xen.S    2009-05-14 11:29:34.000000000 +0200
 @@ -1290,6 +1290,38 @@ ENTRY(fixup_4gb_segment)
        CFI_ENDPROC
  END(spurious_interrupt_bug)
@@ -45,8 +45,8 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
  ENTRY(kernel_thread_helper)
        pushl $0                # fake return address for unwinder
        CFI_STARTPROC
---- sle11-2009-05-14.orig/arch/x86/kernel/entry_64-xen.S       2009-03-16 16:38:16.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/entry_64-xen.S    2008-11-25 13:17:09.000000000 +0100
+--- sle11-2009-08-26.orig/arch/x86/kernel/entry_64-xen.S       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/entry_64-xen.S    2008-11-25 13:17:09.000000000 +0100
 @@ -1419,3 +1419,36 @@ KPROBE_ENTRY(ignore_sysret)
        HYPERVISOR_IRET 0
        CFI_ENDPROC
@@ -84,10 +84,10 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
 +      CFI_ENDPROC
 +ENDPROC(arch_unwind_init_running)
 +#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_32-xen.c       2008-11-25 13:17:06.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_32-xen.c    2008-11-25 13:17:09.000000000 +0100
-@@ -86,6 +86,11 @@ int panic_on_unrecovered_nmi;
- int panic_on_io_nmi;
+--- sle11-2009-08-26.orig/arch/x86/kernel/traps_32-xen.c       2008-11-25 13:17:06.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/traps_32-xen.c    2008-11-25 13:17:09.000000000 +0100
+@@ -85,6 +85,11 @@ gate_desc idt_table[256]
+ int panic_on_unrecovered_nmi;
  int kstack_depth_to_print = 24;
  static unsigned int code_bytes = 64;
 +#ifdef CONFIG_STACK_UNWIND
@@ -98,7 +98,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
  static int ignore_nmis;
  static int die_counter;
  
-@@ -156,6 +161,33 @@ print_context_stack(struct thread_info *
+@@ -155,6 +160,33 @@ print_context_stack(struct thread_info *
        return bp;
  }
  
@@ -132,7 +132,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
  void dump_trace(struct task_struct *task, struct pt_regs *regs,
                unsigned long *stack, unsigned long bp,
                const struct stacktrace_ops *ops, void *data)
-@@ -163,6 +195,40 @@ void dump_trace(struct task_struct *task
+@@ -162,6 +194,40 @@ void dump_trace(struct task_struct *task
        if (!task)
                task = current;
  
@@ -173,7 +173,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
        if (!stack) {
                unsigned long dummy;
                stack = &dummy;
-@@ -1226,3 +1292,19 @@ static int __init code_bytes_setup(char 
+@@ -1222,3 +1288,19 @@ static int __init code_bytes_setup(char 
        return 1;
  }
  __setup("code_bytes=", code_bytes_setup);
@@ -193,10 +193,10 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
 +}
 +__setup("call_trace=", call_trace_setup);
 +#endif
---- sle11-2009-05-14.orig/arch/x86/kernel/traps_64-xen.c       2008-11-25 13:17:06.000000000 +0100
-+++ sle11-2009-05-14/arch/x86/kernel/traps_64-xen.c    2008-11-25 13:17:09.000000000 +0100
-@@ -59,6 +59,11 @@ int panic_on_unrecovered_nmi;
- int panic_on_io_nmi;
+--- sle11-2009-08-26.orig/arch/x86/kernel/traps_64-xen.c       2008-11-25 13:17:06.000000000 +0100
++++ sle11-2009-08-26/arch/x86/kernel/traps_64-xen.c    2008-11-25 13:17:09.000000000 +0100
+@@ -58,6 +58,11 @@
+ int panic_on_unrecovered_nmi;
  int kstack_depth_to_print = 12;
  static unsigned int code_bytes = 64;
 +#ifdef CONFIG_STACK_UNWIND
@@ -207,7 +207,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
  static int ignore_nmis;
  static int die_counter;
  
-@@ -165,6 +170,32 @@ static unsigned long *in_exception_stack
+@@ -164,6 +169,32 @@ static unsigned long *in_exception_stack
        return NULL;
  }
  
@@ -240,7 +240,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
  /*
   * x86-64 can have up to three kernel stacks:
   * process stack
-@@ -229,6 +260,42 @@ void dump_trace(struct task_struct *task
+@@ -228,6 +259,42 @@ void dump_trace(struct task_struct *task
        if (!task)
                task = current;
  
@@ -283,7 +283,7 @@ Automatically created from "patches.suse/stack-unwind" by xen-port-patches.py
        if (!stack) {
                unsigned long dummy;
                stack = &dummy;
-@@ -1242,3 +1309,21 @@ static int __init code_bytes_setup(char 
+@@ -1238,3 +1305,21 @@ static int __init code_bytes_setup(char 
        return 1;
  }
  __setup("code_bytes=", code_bytes_setup);
similarity index 58%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-sysfs-crash-debugging.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-sysfs-crash-debugging.patch
index 4819853b8aef30d8f29c9c04cba7172d71d81872..a0cb8bf9fd829da69ae6d22afc304a72baf2c84b 100644 (file)
@@ -19,11 +19,9 @@ Signed-off-by: Andrew Morton <akpm@osdl.org>
 Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 Automatically created from "patches.drivers/sysfs-crash-debugging.patch" by xen-port-patches.py
 
-Index: head-2008-11-25/arch/x86/kernel/traps_32-xen.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/traps_32-xen.c        2008-11-25 13:13:12.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/traps_32-xen.c     2008-11-25 13:17:06.000000000 +0100
-@@ -433,6 +433,8 @@ int __kprobes __die(const char *str, str
+--- sle11-2009-08-26.orig/arch/x86/kernel/traps_32-xen.c       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/traps_32-xen.c    2008-11-25 13:17:06.000000000 +0100
+@@ -432,6 +432,8 @@ int __kprobes __die(const char *str, str
        printk("DEBUG_PAGEALLOC");
  #endif
        printk("\n");
@@ -32,11 +30,9 @@ Index: head-2008-11-25/arch/x86/kernel/traps_32-xen.c
        if (notify_die(DIE_OOPS, str, regs, err,
                        current->thread.trap_no, SIGSEGV) == NOTIFY_STOP)
                return 1;
-Index: head-2008-11-25/arch/x86/kernel/traps_64-xen.c
-===================================================================
---- head-2008-11-25.orig/arch/x86/kernel/traps_64-xen.c        2008-11-25 13:13:12.000000000 +0100
-+++ head-2008-11-25/arch/x86/kernel/traps_64-xen.c     2008-11-25 13:17:06.000000000 +0100
-@@ -540,6 +540,8 @@ int __kprobes __die(const char *str, str
+--- sle11-2009-08-26.orig/arch/x86/kernel/traps_64-xen.c       2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-08-26/arch/x86/kernel/traps_64-xen.c    2008-11-25 13:17:06.000000000 +0100
+@@ -539,6 +539,8 @@ int __kprobes __die(const char *str, str
        printk("DEBUG_PAGEALLOC");
  #endif
        printk("\n");
similarity index 92%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-fix-kmap-contig.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-x86-fix-kmap-contig.patch
index 2efc9eedd729ce89483455033aad68addd015f9c..3291da57b21d862bdf937ada1267680531ef797a 100644 (file)
@@ -36,8 +36,8 @@ Signed-off-by: Jan Beulich <jbeulich@novell.com>
 
 Automatically created from "patches.arch/x86-fix-kmap-contig.patch" by xen-port-patches.py
 
---- sle11-2009-04-20.orig/arch/x86/mm/init_32-xen.c    2009-04-24 13:36:23.000000000 +0200
-+++ sle11-2009-04-20/arch/x86/mm/init_32-xen.c 2009-02-17 18:06:20.000000000 +0100
+--- sle11-2009-09-18.orig/arch/x86/mm/init_32-xen.c    2009-03-16 16:39:50.000000000 +0100
++++ sle11-2009-09-18/arch/x86/mm/init_32-xen.c 2009-02-17 18:06:20.000000000 +0100
 @@ -148,6 +148,52 @@ static pte_t * __init one_page_table_ini
        return pte_offset_kernel(pmd, 0);
  }
@@ -131,8 +131,8 @@ Automatically created from "patches.arch/x86-fix-kmap-contig.patch" by xen-port-
  
        table_start = extend_init_mapping(tables);
  
---- sle11-2009-04-20.orig/arch/x86/mm/ioremap-xen.c    2009-04-24 13:36:23.000000000 +0200
-+++ sle11-2009-04-20/arch/x86/mm/ioremap-xen.c 2009-01-16 10:45:51.000000000 +0100
+--- sle11-2009-09-18.orig/arch/x86/mm/ioremap-xen.c    2009-01-07 10:51:24.000000000 +0100
++++ sle11-2009-09-18/arch/x86/mm/ioremap-xen.c 2009-01-16 10:45:51.000000000 +0100
 @@ -669,35 +669,9 @@ void __init early_ioremap_init(void)
  }
  
@@ -169,8 +169,8 @@ Automatically created from "patches.arch/x86-fix-kmap-contig.patch" by xen-port-
  }
  #endif /* CONFIG_X86_32 */
  
---- sle11-2009-04-20.orig/include/asm-x86/mach-xen/asm/io.h    2009-04-24 13:36:23.000000000 +0200
-+++ sle11-2009-04-20/include/asm-x86/mach-xen/asm/io.h 2009-04-24 13:36:29.000000000 +0200
+--- sle11-2009-09-18.orig/include/asm-x86/mach-xen/asm/io.h    2009-09-24 11:02:00.000000000 +0200
++++ sle11-2009-09-18/include/asm-x86/mach-xen/asm/io.h 2009-09-24 11:02:57.000000000 +0200
 @@ -12,7 +12,6 @@
   */
  #ifndef __ASSEMBLY__
@@ -179,7 +179,7 @@ Automatically created from "patches.arch/x86-fix-kmap-contig.patch" by xen-port-
  extern void early_ioremap_reset(void);
  extern void *early_ioremap(unsigned long offset, unsigned long size);
  extern void early_iounmap(void *addr, unsigned long size);
-@@ -131,7 +130,6 @@ extern void __iomem *ioremap_wc(unsigned
+@@ -132,7 +131,6 @@ extern void __iomem *ioremap_wc(unsigned
   * A boot-time mapping is currently limited to at most 16 pages.
   */
  extern void early_ioremap_init(void);
similarity index 96%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-mark_rodata_rw-2.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-x86-mark_rodata_rw-2.patch
index 8ec3cb03223717bf150538e3383a43f4ed36967d..2a2a8467edf956a191b641286f46f93fa496d10d 100644 (file)
@@ -21,5 +21,5 @@ Automatically created from "patches.suse/x86-mark_rodata_rw-2.patch" by xen-port
 +       */
 +      set_memory_x_force(rodata_start, (end - rodata_start) >> PAGE_SHIFT);
  }
- EXPORT_SYMBOL(mark_rodata_rw);
+ EXPORT_SYMBOL_GPL(mark_rodata_rw);
  #endif
similarity index 86%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-mcp51-no-dac
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-x86-mcp51-no-dac
index df918c2212b16d00369e479281d69dd64e3770d7..2b40ddb8f107efd2ce916bd0d9cafbc2ca7ac20e 100644 (file)
@@ -12,8 +12,8 @@ Reported-by: pgnet <pgnet.trash@gmail.com>
 Signed-off-by: Tejun Heo <teheo@suse.de>
 Automatically created from "patches.arch/x86-mcp51-no-dac" by xen-port-patches.py
 
---- sle11-2009-03-04.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:37:52.000000000 +0100
-+++ sle11-2009-03-04/arch/x86/kernel/pci-dma-xen.c     2009-03-04 11:37:58.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/pci-dma-xen.c        2009-03-04 11:37:52.000000000 +0100
++++ sle11-2009-10-16/arch/x86/kernel/pci-dma-xen.c     2009-10-22 11:32:58.000000000 +0200
 @@ -482,4 +482,18 @@ static __devinit void via_no_dac(struct 
        }
  }
similarity index 98%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-usb-debug-port-early-console-v4.patch
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-x86-usb-debug-port-early-console-v4.patch
index 76bf7b60f3e56975ae841f7cb819268d8d9d8009..726b7454b16c15b6a794dc1912f9c6ba6b570530 100644 (file)
@@ -29,8 +29,8 @@ Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
 
 Automatically created from "patches.suse/x86-usb-debug-port-early-console-v4.patch" by xen-port-patches.py
 
---- head-2009-02-02.orig/arch/x86/kernel/early_printk-xen.c    2008-12-15 11:28:15.000000000 +0100
-+++ head-2009-02-02/arch/x86/kernel/early_printk-xen.c 2009-02-02 10:17:33.000000000 +0100
+--- sle11-2009-09-18.orig/arch/x86/kernel/early_printk-xen.c   2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-09-18/arch/x86/kernel/early_printk-xen.c        2009-09-24 10:30:18.000000000 +0200
 @@ -3,10 +3,18 @@
  #include <linux/init.h>
  #include <linux/string.h>
@@ -48,8 +48,8 @@ Automatically created from "patches.suse/x86-usb-debug-port-early-console-v4.pat
 +#include <asm/fixmap.h>
 +#include <linux/usb/ehci_def.h>
  
+ #ifndef CONFIG_XEN
  /* Simple VGA output */
- #define VGABASE               (__ISA_IO_base + 0xb8000)
 @@ -78,6 +86,7 @@ static int early_serial_base = 0x3f8;  /
  static int early_serial_putc(unsigned char ch)
  {
similarity index 80%
rename from src/patches/suse-2.6.27.31/patches.xen/xen3-x86-vmware-tsc-03-detect-from-hypervisor
rename to src/patches/suse-2.6.27.39/patches.xen/xen3-x86-vmware-tsc-03-detect-from-hypervisor
index dcd8549830c1ca42436a3bba3271ad6b571f1001..85e3b184de227819d42c6f06a7cc7b7ff3d19881 100644 (file)
@@ -37,16 +37,16 @@ Signed-off-by: Takashi Iwai <tiwai@suse.de>
 
 Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hypervisor" by xen-port-patches.py
 
---- sle11-2009-07-31.orig/arch/x86/kernel/cpu/Makefile 2009-07-31 14:49:20.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/cpu/Makefile      2009-02-16 17:03:24.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/Makefile 2009-10-16 14:48:15.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/cpu/Makefile      2009-02-16 17:03:24.000000000 +0100
 @@ -23,3 +23,5 @@ obj-$(CONFIG_MTRR)   += mtrr/
  obj-$(CONFIG_CPU_FREQ)        += cpufreq/
  
  obj-$(CONFIG_X86_LOCAL_APIC) += perfctr-watchdog.o
 +
 +disabled-obj-$(CONFIG_XEN) := hypervisor.o vmware.o
---- sle11-2009-07-31.orig/arch/x86/kernel/cpu/common-xen.c     2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/cpu/common-xen.c  2009-02-16 17:03:24.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common-xen.c     2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common-xen.c  2009-02-16 17:03:24.000000000 +0100
 @@ -14,6 +14,7 @@
  #include <asm/mce.h>
  #include <asm/pat.h>
@@ -63,8 +63,8 @@ Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hyperviso
        /*
         * On SMP, boot_cpu_data holds the common feature set between
         * all CPUs; so make sure that we indicate which features are
---- sle11-2009-07-31.orig/arch/x86/kernel/cpu/common_64-xen.c  2009-06-04 10:21:39.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/cpu/common_64-xen.c       2009-02-16 17:03:24.000000000 +0100
+--- sle11-2009-10-16.orig/arch/x86/kernel/cpu/common_64-xen.c  2009-06-04 10:21:39.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/cpu/common_64-xen.c       2009-02-16 17:03:24.000000000 +0100
 @@ -36,6 +36,7 @@
  #include <asm/sections.h>
  #include <asm/setup.h>
@@ -81,8 +81,8 @@ Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hyperviso
        /*
         * On SMP, boot_cpu_data holds the common feature set between
         * all CPUs; so make sure that we indicate which features are
---- sle11-2009-07-31.orig/arch/x86/kernel/setup-xen.c  2009-07-31 15:08:11.000000000 +0200
-+++ sle11-2009-07-31/arch/x86/kernel/setup-xen.c       2009-07-31 15:13:15.000000000 +0200
+--- sle11-2009-10-16.orig/arch/x86/kernel/setup-xen.c  2009-07-31 15:08:11.000000000 +0200
++++ sle11-2009-10-16/arch/x86/kernel/setup-xen.c       2009-10-16 14:59:35.000000000 +0200
 @@ -98,6 +98,7 @@
  
  #include <mach_apic.h>
@@ -102,10 +102,10 @@ Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hyperviso
 +      init_hypervisor(&boot_cpu_data);
 +
  #ifdef CONFIG_X86_32
-       request_resource(&iomem_resource, &video_ram_resource);
- #endif
---- sle11-2009-07-31.orig/include/asm-x86/hypervisor.h 2009-07-31 14:49:20.000000000 +0200
-+++ sle11-2009-07-31/include/asm-x86/hypervisor.h      2009-02-16 17:03:24.000000000 +0100
+       if (is_initial_xendomain())
+               request_resource(&iomem_resource, &video_ram_resource);
+--- sle11-2009-10-16.orig/include/asm-x86/hypervisor.h 2009-10-16 14:48:15.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/hypervisor.h      2009-02-16 17:03:24.000000000 +0100
 @@ -24,3 +24,7 @@ extern unsigned long get_hypervisor_tsc_
  extern void init_hypervisor(struct cpuinfo_x86 *c);
  
@@ -114,8 +114,8 @@ Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hyperviso
 +#ifdef HAVE_XEN_PLATFORM_COMPAT_H
 +#include_next <asm/hypervisor.h>
 +#endif
---- sle11-2009-07-31.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-16 16:17:45.000000000 +0100
-+++ sle11-2009-07-31/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-12 16:42:09.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/hypervisor.h    2009-03-16 16:17:45.000000000 +0100
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/hypervisor.h 2009-03-12 16:42:09.000000000 +0100
 @@ -67,6 +67,8 @@ extern start_info_t *xen_start_info;
  #define is_initial_xendomain() 0
  #endif
@@ -125,8 +125,8 @@ Automatically created from "patches.arch/x86-vmware-tsc-03-detect-from-hyperviso
  /* arch/xen/kernel/evtchn.c */
  /* Force a proper event-channel callback from Xen. */
  void force_evtchn_callback(void);
---- sle11-2009-07-31.orig/include/asm-x86/mach-xen/asm/processor.h     2009-07-31 00:00:00.000000000 +0200
-+++ sle11-2009-07-31/include/asm-x86/mach-xen/asm/processor.h  2009-02-16 17:03:24.000000000 +0100
+--- sle11-2009-10-16.orig/include/asm-x86/mach-xen/asm/processor.h     2009-10-16 00:00:00.000000000 +0200
++++ sle11-2009-10-16/include/asm-x86/mach-xen/asm/processor.h  2009-02-16 17:03:24.000000000 +0100
 @@ -110,6 +110,7 @@ struct cpuinfo_x86 {
        /* Index into per_cpu list: */
        u16                     cpu_index;
similarity index 91%
rename from src/patches/suse-2.6.27.31/series.conf
rename to src/patches/suse-2.6.27.39/series.conf
index 7392d2a9a99eae340b894105dbd2bb136f5f5e90..f90c52d048e78903be2a1b6dad21164b63ebec6a 100644 (file)
 #      patches.kernel.org/patch-2.6.27.28-29
 #      patches.kernel.org/patch-2.6.27.29-30
 #      patches.kernel.org/patch-2.6.27.30-31
+#      patches.kernel.org/patch-2.6.27.31-32
+#      patches.kernel.org/patch-2.6.27.32-33
+#      patches.kernel.org/patch-2.6.27.33-34
+#      patches.kernel.org/patch-2.6.27.34-35
+#      patches.kernel.org/patch-2.6.27.35-36
+#      patches.kernel.org/patch-2.6.27.36-37
+#      patches.kernel.org/patch-2.6.27.37-38
+#      patches.kernel.org/patch-2.6.27.38-39
 
         ########################################################
         # Build fixes that apply to the vanilla kernel too.
        patches.kabi/mm-page_mkwrite-compat.patch
        patches.kabi/splice-kabi-fix.patch
        patches.kabi/ftrace-dummy-export
+       patches.kabi/kabi-fix-struct-parport-abi-change.patch
+       patches.kabi/move-aarp_send_ddp-export-back
 
        ########################################################
        #
        patches.suse/coredump_filter-add-elfhdr-default.patch
        patches.fixes/round-jiffies-up
        patches.kabi/sched-kabi-compat-hack.patch
-       patches.fixes/altstack-avoid-copying-stack_t-as-a-structure-to-userspace
 
         ########################################################
         # Architecture-specific patches. These used to be all
        patches.arch/ia64-page-migration.fix
        patches.arch/ia64-sn-BTE_MAX_XFER
        patches.arch/ia64-cpu_disable-fix
-       patches.fixes/taskstats-alignment
+       patches.fixes/taskstats-align
        patches.arch/ia64-smp_flush_tlb_mm-IPI-fix
+       patches.arch/ia64-fix-csum_ipv6_magic.patch
 
         ########################################################
        # i386
        patches.suse/x86-usb-debug-port-early-console-v4.patch
        patches.fixes/video-vesa-bad-mode
        patches.fixes/hpet-fix-for-LS21-boot-hang
-       patches.fixes/kvm-vmx-dont-allow-uninhibited-access-to-EFER-on-i386
        patches.fixes/sparsemem-maxmem-fix
        patches.arch/x86-mce-switch-machine-check-polling-to-per-cpu-timer
        patches.arch/x86-mce-use-round_jiffies-instead-round_jiffies_relative
        patches.arch/x86-mce-make-polling-timer-interval-per-cpu
+       patches.arch/x86_64_make_calibrate_APIC_clock_SMI-safe.diff
+       patches.fixes/hpet-correct-periodic-intr.patch
 
         ########################################################
        # x86_64/i386 biarch - x2APIC next generation x86 CPU support
        patches.arch/x2APIC_fix_section_mismatch.patch
 
        patches.fixes/bug-502026_fix_apicid_panic.patch
+       patches.arch/bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch
 
        ########################################################
        # x86_64/4096CPUS - from SGI
        patches.arch/x86_fix_llc_shared_map__cpu_llc_id_anomolies.patch
        patches.arch/x86_intel_cacheinfo_fix.patch
 
+        # Magny Cours (AMD 12 core) fixes
+       patches.arch/amd_magny_cour_topology_fix.patch
+       patches.arch/amd_magny_cour_topology_fix_1.patch
+
         ########################################################
        # powerpc/generic
         ########################################################
        patches.arch/s390-16-01-zfcp-link-test.patch
 
        patches.arch/s390-symmetrix-ioctl.patch
+       patches.fixes/zfcp-make-queue_depth-adjustable
+
+       # s390-17-perf-01 needs to be after the debugging patch no-frame-pointer-select
+       # s390-17-perf-02 needs to be after s390-utrace-enablement
+       patches.arch/s390-17-perf-03-qdio_inline_qdio_perf_stat_inc.patch
+       patches.arch/s390-17-perf-04-qdio_move_adapter_interrupt_tasklet_code.patch
+       patches.arch/s390-17-perf-05-qdio_extract_all_primed_SBALs_at_once.patch
+       patches.arch/s390-17-perf-07-qdio_sanitize_do_QDIO_sanity_checks.patch
+       patches.arch/s390-17-perf-08-qdio_merge_AI_tasklet_into_interrupt_handler.patch
+       patches.arch/s390-17-perf-09-module-plt.patch
+       patches.arch/s390-17-perf-10-cio-scsw-helper.patch
+       patches.arch/s390-17-perf-11-csum-fold.patch
+       patches.arch/s390-17-perf-12-get_clock_monotonic.patch
+       patches.arch/s390-17-perf-13-dasd-goodcase-perf.patch
+       patches.arch/s390-17-perf-14-zfcp-optimize-qdio_account.patch
+       patches.arch/s390-17-perf-15-zfcp-move-debug-data.patch
+       patches.arch/s390-17-perf-16-zfcp-scsi-trace-only-matching-debug-data.patch
+       patches.arch/s390-17-perf-17-zfcp-fsfhba-trace-only-matching-debug-data.patch
+
+       patches.arch/s390-18-01-cio-retries.patch
+       patches.arch/s390-18-02-cio-race.patch
+       patches.arch/s390-18-03-iucv-query-maxconn.patch
+
        patches.arch/s390-personality-mask.patch
        patches.arch/s390-zfcp-synchronize-scsi-register
        patches.suse/s390-Kerntypes.diff
        patches.arch/s390-disable-etr-stp
-       patches.fixes/zfcp-make-queue_depth-adjustable
+       patches.arch/s390-dasd-eckd_write_r0.patch
 
         ########################################################
         # VM/FS patches
        patches.fixes/ds1682-build-fix
        patches.suse/rlimit-memlock-64k.patch
        patches.fixes/sched-fix-__load_balance_iterator-for-cfs-with-on.patch
+       patches.fixes/use-totalram_pages
 
        ########################################################
        #
        patches.arch/acpi_srat-pxm-rev-ia64.patch
        patches.arch/acpi_srat-pxm-rev-x86-64.patch
 
+       patches.suse/bug-504646-acpi-enable-root-bridge-to-wakeup.patch
+       patches.arch/bug-535380-x86-change-some-messages-to-debug.patch
+
        ########################################################
        # CPUFREQ
        ########################################################
        patches.fixes/x86_cpufreq_powernow-k8_acpi_latency_values.patch
        patches.fixes/cpufreq_ondemand_performance_optimise_default_settings.patch
        patches.suse/hp_backlight_blacklist_6530b.patch
+       patches.arch/x86_cpufreq_intel_blacklist.patch
 
        ########################################################
        # AGP, graphics related stuff
        patches.fixes/vlan-gso-size-fix
        patches.fixes/pkt_sched_multiq_support
        patches.fixes/pkt_action-skbedit
+       patches.fixes/bonding-net-move-last_rx-update-into-bonding-recv-logic
+       patches.fixes/fix-balance-alb-bonding-receive
+       patches.fixes/tc-fix-unitialized-kernel-memory-leak
 
        ########################################################
        # NFS
        patches.fixes/NFSv4-Fix-an-Oops-in-nfs4_free_lock_state.patch
 
        patches.fixes/sunrpc-tcp-reconnect
+       patches.fixes/nfs-slot-table-alloc
+       patches.fixes/nfs-honour-server-preferred-io-size
 
        ########################################################
        # NFSd
        patches.fixes/nfsd-07-nfsd-idmap-drop-special-request-deferal-in-favour-of.patch
        patches.fixes/nfsd-08-sunrpc-fix-memory-leak-in-unix_gid-cache.patch
        patches.fixes/nfsd-09-fix-kabi
+       patches.fixes/nfsd4-posix-acl-to-nfs4-acl-conversion-isues.diff
+       patches.fixes/nfsd-exclusive-create-fix
+       patches.fixes/nfsd-acl.patch
 
        ########################################################
        # lockd + statd
        ########################################################
        # cifs patches
        ########################################################
+       patches.fixes/cifs-fix-ssh-tunneled-mounts
 
        ########################################################
        # ext2/ext3
         patches.fixes/reiserfs-error-buffer-locking
        patches.fixes/reiserfs-debug-1036
        patches.suse/reiserfs-barrier-default
+       patches.fixes/reiserfs-truncate-failed-write
 
        ########################################################
        # ocfs2
 #      patches.fixes/ocfs2-tweak-to-get-the-maximum-inline-data-size-wit.patch
 #      patches.fixes/ocfs2-fix-a-bug-found-by-sparse-check.patch
 #      patches.fixes/ocfs2-use-xs-bucket-to-set-xattr-value-outside.patch
-#
-#      # Quota fixes from 2.6.31
+
+       # Quota fixes from 2.6.31
 #      patches.fixes/ocfs2-1.4-git-65bac575e35915801ea518b9d8d8824367d125c8
 #      patches.fixes/ocfs2-1.4-git-80d73f15d12f087f3fe074f8a4d6e5c5624f2b47
 #      patches.fixes/ocfs2-1.4-git-4e8a301929bfa017e6ffe11e3cf78ccaf8492801
 #      patches.fixes/dlm-Fix-uninitialised-variable-warning-in-lock.c.patch
 #      patches.fixes/dlm-fix-plock-use-after-free.patch
 #      patches.fixes/dlm-free-socket-in-error-exit-path.patch
-#
-#      # bnc 501563
-#      patches.fixes/ocfs2-initialize-the-cluster-we-re-writing-to.patch
-#
-#      # Userspace clustering will be implemented in a completely
-#      # different manner starting with openSUSE 11.1
+
+       # bnc #524222
+#      patches.fixes/dlm-close-connection-2.patch
+       # bnc #531716
+#      patches.fixes/bug-531716_ocfs2-SLE11-dentry_lock_drop_flush.diff
+       # bnc #524683
+#      patches.fixes/ocfs2-dlm-wait-on-lockres-instead-of-err-during-cancel.patch
+       # Assorted btree fixes in support of bnc 528427
+#      patches.fixes/ocfs2-adjust-rightmost-path-in-ocfs2_add_branch.patch
+#      patches.fixes/ocfs2-add-extra-credits-and-access-the-modified-bh.patch
+#      patches.fixes/ocfs2-use-ocfs2_rec_clusters-in-ocfs2_adjust_adjace.patch
+#      patches.fixes/ocfs2-release-the-buffer-head-in-ocfs2_do_truncate.patch
+       # bnc #552602
+#      patches.fixes/ocfs2-fix-check-for-osb-in-kill_sb.patch
+
+#      patches.fixes/dlm-enable-debug.patch
+
+       # Userspace clustering will be implemented in a completely
+       # different manner starting with openSUSE 11.1
 
        ########################################################
        # xfs
        patches.suse/xfs-wait-for-all-IO-on-truncate-to-zero
        patches.fixes/xfs-redirty-ENOSPC.patch
        patches.fixes/xfs-kern_32215a_Clean-up-dquot-pincount-code.patch
+       patches.kabi/xfs-dquot-pincount-kabi.patch
        patches.fixes/xfs_file_last_byte-needs-to-acquire-ilock.patch
        patches.fixes/xfs-fix-overflow-in-xfs_growfs_data_private
        patches.fixes/xfs-more-sb-checks
        patches.suse/nfs4acl-ai.diff
 
        patches.fixes/udf-faster_anchor_detection.patch
-       patches.fixes/udf-last_block_fix.patch
+       patches.fixes/hfs-corrupt-extent-tree-mount-oops-fix
+       patches.fixes/zisofs-large-pagesize-read.patch
 
        ########################################################
        # These patches are from the netfilter team, and
        patches.drivers/e1000e_add_LOM_devices.patch
        patches.drivers/e1000e_add_ECC
        patches.drivers/e1000e-Fixes-possible-phy-corrupton-on-82571-design.patch
+       patches.drivers/e1000e-io_error_detected-callback-should-return-PCI_.patch
 
        patches.suse/e1000e_Export_set_memory_ro-rw
 
+       patches.drivers/e1000-return-pci_ers_result_disconnect-on-permanent-error.patch
+
        patches.drivers/tg3-Add-57780-ASIC-revision.patch
        patches.drivers/broadcom-Add-support-for-the-57780-integrated-PHY.patch
        patches.drivers/bnx2x-eeh.patch
 
        patches.drivers/sgi-ioc4-request-submodules
 
+       patches.drivers/sky2-no-link-at-probe.patch
+
        # This one is more related to x2APIC patches, but adjusted by SGI to cleanly
        # patch on-top of sgi-uv-led -> I don't do the extra work and keep it here
        patches.arch/x86_uv_early_detect.patch
        patches.drivers/libata-6gbps-message
        patches.drivers/libata-ahci-sb600-srst-workaround-soften-msg
        patches.drivers/libata-ocz-vertex-no-hpa
+       patches.drivers/libata-ahci-aspire-3810t-noncq
 +sp1   patches.drivers/libata-ahci-Withdraw-IGN_SERR_INTERNAL-for-SB800
 
        # Block layer fixes
        patches.drivers/qla4xxx-5.01.00-k8_sles11-03-update
        patches.drivers/qla4xxx-5.01.00-k8_sles11-04-update
        patches.drivers/qla4xxx-correct-extended-sense-data-errors
+       patches.drivers/qla4xxx-correct-extended-sense-data-errors-update
        patches.fixes/scsi-skip-nonscsi-device-for-dma
        patches.fixes/scsi-dh-rdac-set-default-ownership
        patches.fixes/scsi-dh-rdac-retry-mode-select
        patches.fixes/scsi-remove-scmd-timeout
        patches.fixes/scsi-check-host-lookup-failure
        patches.fixes/scsi_dh-add-lsi-ids-to-rdac
+       patches.fixes/scsi_dh-add-del-ids-to-rdac
        patches.suse/scsi-check-removed-device-for-offline
        patches.fixes/fc_transport-devloss-callback-restore
        patches.fixes/scsi_dh-retry-on-UNIT_ATTENTION
        patches.fixes/scsi-lib-string_get_size-don-t-hang-on-zero-no-decimals-on-exact.patch
        patches.fixes/scsi-dh-rdac-add-stk
        patches.fixes/scsi-initialize-max_targets_blocked
+       patches.fixes/scsi-fixup-recovered-error
+       patches.fixes/scsi-reservation-conflict-after-timeout
+       patches.fixes/scsi-dh-rdac-sles10sp3-fixes
+       patches.fixes/scsi-retry-ADD_TO_MLQUEUE-return-values
+       patches.drivers/aacraid-24701-update
+       patches.fixes/scsi-dont-call-blk_plug_device-from-scsi_target_queue_ready
+       patches.fixes/scsi-ses-hotplug-fix
 
        patches.drivers/ibmvfc-async-events-oops
        patches.drivers/ibmvfc-add_sync.patch
        ########################################################
        patches.drivers/via-unichrome-drm-bugfixes.patch
        patches.drivers/add-via-chrome9-drm-support.patch
+       patches.drivers/intel-hp-newchips-nokms
+       patches.fixes/drm-r128-add-test-for-initialisation-to-all-ioctls-that-require-it
 
        ########################################################
        # Network
        patches.drivers/netxen-revert-jumbo-ringsize.patch
        patches.drivers/netxen-fix-memory-leak-in-drivers-net-netxen_nic_in.patch
 
-       patches.drivers/e100-adapt-to-the-reworked-PCI-PM.patch
+#      patches.drivers/e100-adapt-to-the-reworked-PCI-PM.patch
 
        ########################################################
        # Wireless Networking
 #      patches.fixes/rt2x00-fix-led_device_naming.diff
 #      patches.fixes/ath5k-5211-protected-fix.patch
 #      patches.fixes/iwlwifi-fix-updating-key-flags.patch
+#      patches.fixes/iwlagn-debug-build-fix
 
        ########################################################
        # iSCSI
        patches.fixes/libiscsi-fix-null-pointer-in-fail-all-commands
        patches.fixes/libiscsi-fix-locking-in-eh_device_reset
        patches.fixes/libiscsi-don-t-let-io-sit-in-queue-when-session-has-failed
+       patches.fixes/iscsi_tcp-Evaluate-socket-state-in-data_ready
+       patches.fixes/libiscsi-don-t-increment-cmdsn-if-cmd-is-not-sent
+       patches.fixes/libiscsi-handle-immediate-command-rejections
+       patches.fixes/iscsi_tcp-return-a-descriptive-error-value
+       patches.fixes/libiscsi-handle-param-allocation-failure
+       patches.fixes/iscsi_tcp-propogate-EAGAIN-from-sendpage-to-libiscsi
+       patches.fixes/libiscsi-fix-data-corruption
+       patches.fixes/libiscsi-have-iscsi_data_in_rsp-call-iscsi_update_cmdsn
+       patches.fixes/libiscsi-check-suspend-bit-before-each-call-to-xmit
+       patches.fixes/libiscsi-fix-iscsi-transport-checks
+       patches.fixes/iscsi_tcp-Use-1-second-send-timeout
+       patches.fixes/libiscsi-Update-queuecommand-return-codes-for-multipath
+       patches.fixes/iscsi_tcp-Use-last_recv-to-track-xmits
 
        ########################################################
        # PCI and PCI hotplug
        patches.fixes/input-add-nomux-dell-vostro-1510.patch
        patches.fixes/hid-rdesc-quirk-for-sony-vaio-VGX-TP1E.patch
        patches.drivers/input-usbtouchscreen-hw-calibration.patch
+       patches.fixes/usb-hid-ncr-no-init-reports.patch
 
        ##########################################################
        # Sound
        patches.drivers/alsa-post-ga-hda-stac-automic
        patches.drivers/alsa-post-ga-hda-stac-lo-detect-fix
        patches.drivers/alsa-post-ga-hp-piaget-quirk
-       patches.drivers/alsa-post-ga-alc269-fix-vmaster
        patches.drivers/alsa-post-ga-hda-idt92hd8x-fix
+       patches.drivers/alsa-post-ga-hda-stac9872-inputsrc-fix
+       patches.drivers/alsa-post-ga-hda-analog-updates
+       patches.drivers/alsa-post-ga-hda-stac-92hd73-fixes
+       patches.drivers/alsa-post-ga-hda-stac-92hd-hp-fixes
+       patches.drivers/alsa-post-ga-hda-stac-automic-fix
+       patches.drivers/alsa-post-ga-hda-stac-shutup-at-free
+       patches.drivers/alsa-post-ga-hda-stac927x-fsc-fix
+       patches.drivers/alsa-post-ga-hda-stac927x-dell-volknob-fix
+       patches.drivers/alsa-post-ga-hda-hp-bseries-mute-led-fix
+       patches.drivers/alsa-post-ga-hda-reboot-notify
 
        ########################################################
        # Other driver fixes
        patches.suse/stack-unwind
        patches.suse/no-frame-pointer-select
        patches.arch/x86_64-unwind-annotations
+       patches.arch/s390-17-perf-01-framepointer.patch
 
         ########################################################
        # Perfmon
        # Fix for #475149
        patches.fixes/block-get-rid-of-the-manual-directory-counting-in-blktrace.patch
 
+       patches.arch/s390-17-perf-02-schedframepointer.patch
+
         ########################################################
        # Swap over NFS
         ########################################################
        # Staging tree patches
        # new drivers that are going upstream
         ########################################################
-#      patches.drivers/0001-Staging-add-TAINT_CRAP-for-all-drivers-staging-code.patch
-#      patches.drivers/0002-Staging-add-TAINT_CRAP-flag-to-drivers-staging-modu.patch
-#      patches.drivers/0003-Staging-add-Kconfig-entries-and-Makefile-infrastruc.patch
-#      patches.drivers/0004-Staging-add-MAINTAINERS-entry.patch
-#      patches.drivers/0005-Staging-add-et131x-network-driver.patch
-#      patches.drivers/0006-Staging-add-Alacritech-slicoss-network-driver.patch
-#      patches.drivers/0007-Staging-add-sxg-network-driver.patch
-#      patches.drivers/0008-Staging-add-me4000-firmware-files.patch
-#      patches.drivers/0009-Staging-add-me4000-pci-data-collection-driver.patch
-#      patches.drivers/0010-Staging-add-the-go7007-video-driver.patch
-#      patches.drivers/0011-Staging-USB-IP-add-common-functions-needed.patch
-#      patches.drivers/0012-Staging-USB-IP-add-client-driver.patch
-#      patches.drivers/0013-Staging-USB-IP-add-host-driver.patch
-#      patches.drivers/0014-Staging-add-w35und-wifi-driver.patch
-#      patches.drivers/0015-Staging-add-wlan-ng-prism2-usb-driver.patch
-#      patches.drivers/0016-Staging-add-echo-cancelation-module.patch
-#      patches.drivers/0017-Staging-Fix-gcc-warnings-in-sxg.patch
-#      patches.drivers/0018-Staging-go7007-v4l-fixes.patch
-#      patches.drivers/0019-Staging-SLICOSS-lots-of-checkpatch-fixes.patch
-#      patches.drivers/0020-Staging-SLICOSS-Fix-warnings-due-to-static-usage.patch
-#      patches.drivers/0021-Staging-SLICOSS-Fix-remaining-type-names.patch
-#      patches.drivers/0022-Staging-SLICOSS-Call-pci_release_regions-at-driver.patch
-#      patches.drivers/0023-Staging-Lindent-sxg.c.patch
-#      patches.drivers/staging-workaround-build-system-bug.patch
-#      patches.drivers/staging-at76_usb-wireless-driver.patch
-#      patches.drivers/staging-add-agnx-wireless-driver.patch
-#      patches.drivers/staging-add-otus-atheros-wireless-network-driver.patch
-#      patches.drivers/staging-add-rt2860-wireless-driver.patch
-#      patches.drivers/staging-rt2860-enable-wpa_supplicant-support.patch
-#      patches.drivers/staging-rt2860-sync-driver-up-with-2.6.30-version.patch
-#      patches.drivers/staging-add-serverengines-benet-10gb-ethernet-driver.patch
-#      patches.drivers/staging-add-rtl8187se-driver.patch
-#      patches.drivers/staging-add-rt2870-wireless-driver.patch
-#      patches.drivers/staging-add-rt3070-wireless-driver.patch
-
-#      patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-driver-header-files.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-bus.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-storage-driver.patch
-#      patches.drivers/staging-hv-add-a-todo-file.patch
-#      patches.drivers/staging-hv-make-the-hyper-v-virtual-bus-code-build.patch
-#      patches.drivers/staging-hv-use-the-correct-ifdef-for-x86-64.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-bus-to-the-build.patch
-#      patches.drivers/staging-hv-make-the-hyper-v-virtual-storage-driver-build.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-scsi-driver-to-the-build.patch
-#      patches.drivers/staging-hv-storvsc-fix-up-driver_data-usage.patch
-#      patches.drivers/staging-hv-make-the-hyper-v-virtual-block-driver-build.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver-to-the-build.patch
-#      patches.drivers/staging-hv-blkvsc-fix-up-driver_data-usage.patch
-#      patches.drivers/staging-hv-make-the-hyper-v-virtual-network-driver-build.patch
-#      patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver-to-the-build.patch
-
-#      patches.drivers/staging-add-realtek-8192-pci-wireless-driver.patch
-#      patches.drivers/staging-rtl8192e-backport-net_device_ops-conversion.patch
+       patches.drivers/0001-Staging-add-TAINT_CRAP-for-all-drivers-staging-code.patch
+       patches.drivers/0002-Staging-add-TAINT_CRAP-flag-to-drivers-staging-modu.patch
+       patches.drivers/0003-Staging-add-Kconfig-entries-and-Makefile-infrastruc.patch
+       patches.drivers/0004-Staging-add-MAINTAINERS-entry.patch
+       patches.drivers/0005-Staging-add-et131x-network-driver.patch
+       patches.drivers/0006-Staging-add-Alacritech-slicoss-network-driver.patch
+       patches.drivers/0007-Staging-add-sxg-network-driver.patch
+       patches.drivers/0008-Staging-add-me4000-firmware-files.patch
+       patches.drivers/0009-Staging-add-me4000-pci-data-collection-driver.patch
+       patches.drivers/0010-Staging-add-the-go7007-video-driver.patch
+       patches.drivers/0011-Staging-USB-IP-add-common-functions-needed.patch
+       patches.drivers/0012-Staging-USB-IP-add-client-driver.patch
+       patches.drivers/0013-Staging-USB-IP-add-host-driver.patch
+       patches.drivers/0014-Staging-add-w35und-wifi-driver.patch
+       patches.drivers/0015-Staging-add-wlan-ng-prism2-usb-driver.patch
+       patches.drivers/0016-Staging-add-echo-cancelation-module.patch
+       patches.drivers/0017-Staging-Fix-gcc-warnings-in-sxg.patch
+       patches.drivers/0018-Staging-go7007-v4l-fixes.patch
+       patches.drivers/0019-Staging-SLICOSS-lots-of-checkpatch-fixes.patch
+       patches.drivers/0020-Staging-SLICOSS-Fix-warnings-due-to-static-usage.patch
+       patches.drivers/0021-Staging-SLICOSS-Fix-remaining-type-names.patch
+       patches.drivers/0022-Staging-SLICOSS-Call-pci_release_regions-at-driver.patch
+       patches.drivers/0023-Staging-Lindent-sxg.c.patch
+       patches.drivers/staging-workaround-build-system-bug.patch
+       patches.drivers/staging-at76_usb-wireless-driver.patch
+       patches.drivers/staging-add-agnx-wireless-driver.patch
+       patches.drivers/staging-add-otus-atheros-wireless-network-driver.patch
+       patches.drivers/staging-add-rt2860-wireless-driver.patch
+       patches.drivers/staging-rt2860-enable-wpa_supplicant-support.patch
+       patches.drivers/staging-rt2860-sync-driver-up-with-2.6.30-version.patch
+       patches.drivers/staging-add-serverengines-benet-10gb-ethernet-driver.patch
+       patches.drivers/staging-add-rtl8187se-driver.patch
+       patches.drivers/staging-add-rt2870-wireless-driver.patch
+       patches.drivers/staging-add-rt3070-wireless-driver.patch
+
+       patches.drivers/staging-hv-add-the-hyper-v-api-header-files.patch
+       patches.drivers/staging-hv-add-the-hyper-v-driver-header-files.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-bus.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-storage-driver.patch
+       patches.drivers/staging-hv-add-a-todo-file.patch
+       patches.drivers/staging-hv-make-the-hyper-v-virtual-bus-code-build.patch
+       patches.drivers/staging-hv-use-the-correct-ifdef-for-x86-64.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-bus-to-the-build.patch
+       patches.drivers/staging-hv-make-the-hyper-v-virtual-storage-driver-build.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-scsi-driver-to-the-build.patch
+       patches.drivers/staging-hv-storvsc-fix-up-driver_data-usage.patch
+       patches.drivers/staging-hv-make-the-hyper-v-virtual-block-driver-build.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-block-driver-to-the-build.patch
+       patches.drivers/staging-hv-blkvsc-fix-up-driver_data-usage.patch
+       patches.drivers/staging-hv-make-the-hyper-v-virtual-network-driver-build.patch
+       patches.drivers/staging-hv-add-the-hyper-v-virtual-network-driver-to-the-build.patch
+
+       patches.drivers/staging-add-realtek-8192-pci-wireless-driver.patch
+       patches.drivers/staging-rtl8192e-backport-net_device_ops-conversion.patch
 
        ########################################################
        # kernel-wide security fixes
        patches.xen/897-balloon-keep-trying.patch
        patches.xen/899-kbuild-extmod.patch
        patches.xen/914-dynamic-Cx-change.patch
+       patches.xen/932-edac.patch
+       patches.xen/933-usb-mon-dma.patch
 
        # changes outside arch/{i386,x86_64}/xen
        patches.xen/xen3-fixup-kconfig
        patches.xen/xen3-patch-2.6.27.19-20
        patches.xen/xen3-patch-2.6.27.24-25
        patches.xen/xen3-patch-2.6.27.25-26
+       patches.xen/xen3-patch-2.6.27.36-37
+       patches.xen/xen3-patch-2.6.27.38-39
        patches.xen/xen3-seccomp-disable-tsc-option
        patches.xen/xen3-rwlocks-enable-interrupts
-       patches.xen/xen3-remove_kernel_physical_mapping_init_from_init
        patches.xen/xen3-x86-fix-nodac
        patches.xen/xen3-x86-mcp51-no-dac
+       patches.xen/xen3-remove_kernel_physical_mapping_init_from_init
        patches.xen/xen3-x86-mark_rodata_rw.patch
 +npiggin patches.xen/xen3-x86-mark_rodata_rw-2.patch
        patches.xen/xen3-x86-pageattr-pmd-permission-fix.patch
        patches.xen/xen3-x2APIC_PATCH_20_of_41_cff73a6ffaed726780b001937d2a42efde553922
        patches.xen/xen3-x2APIC_PATCH_27_of_41_9fa8c481b55e80edd8c637573f87853bb6b600f5
        patches.xen/xen3-x2APIC_PATCH_40_of_41_bbb65d2d365efe9951290e61678dcf81ec60add4
+       patches.xen/xen3-bug-531260-x86-pci-insert-ioapic-resource-before-assigning-unassigned-resources.patch
        patches.xen/xen3-x86_sgi_cpus4096-02-fix-send_call_func_ip.patch
        patches.xen/xen3-x86_sgi_cpus4096-05-update-send_IPI_mask.patch
        patches.xen/xen3-uv_setup_irq.diff
        patches.xen/xen3-x86-vmware-tsc-03-detect-from-hypervisor
        patches.xen/xen3-x86-fix-kmap-contig.patch
 +andrea        patches.xen/xen3-silent-stack-overflow
+       patches.xen/xen3-acpi_assure_unique_processor_proc_creation.patch
        patches.kabi/xen3-e1000e_Export_set_memory_ro-rw
        patches.xen/xen3-x86_sgi_uv_early_detect_oem.patch
-       patches.xen/xen3-panic-on-io-nmi.diff
        patches.xen/xen3-intel-ibex-peak-device-ids.patch
+       patches.xen/xen3-add-via-chrome9-drm-support.patch
        patches.xen/xen3-acpi-pci-pci-msi-_osc-support-capabilities-called-when-root-bridge-added.patch
        patches.xen/xen3-sysfs-crash-debugging.patch
        patches.xen/xen3-kdb-x86
        patches.xen/xen3-x86_64-unwind-annotations
        patches.xen/xen3-perfmon2.patch
        patches.xen/xen3-perfmon2-remove_syscalls.patch
+       patches.xen/xen3-panic-on-io-nmi.diff
 
        # bugfixes and enhancements
        patches.xen/xen-balloon-max-target
+       patches.xen/xen-balloon-accounting
        patches.xen/xen-modular-blktap
        patches.xen/xen-blkback-bimodal-suse
        patches.xen/xen-blkif-protocol-fallback-hack